From 65ef9ff7deadc63a873328b7ca4b827053f5f6d6 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 9 May 2014 19:51:26 -0700 Subject: [PATCH 0001/2053] specify NetParameters directly in the SolverParameter --- src/caffe/proto/caffe.proto | 12 ++++++++++-- src/caffe/solver.cpp | 26 ++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index ab3c2fecc5c..eb086a15443 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -57,8 +57,16 @@ message NetParameter { } message SolverParameter { - optional string train_net = 1; // The proto file for the training net. - optional string test_net = 2; // The proto file for the testing net. + // {train,test}_net specify a path to a file containing the {train,test} net + // parameters; {train,test}_net_param specify the net parameters directly + // inside the SolverParameter. + // + // If {train,test}_net is specified, {train,test}_net_param should not be, + // and vice versa. + optional string train_net = 1; // The proto filename for the train net. + optional string test_net = 2; // The proto filename for the test net. + optional NetParameter train_net_param = 21; // Full params for the train net. + optional NetParameter test_net_param = 22; // Full params for the test net. // The number of iterations for each testing phase. optional int32 test_iter = 3 [default = 0]; // The number of iterations between two testing phases. diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 4932968d0b6..77782ac69fb 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -38,11 +38,29 @@ void Solver::Init(const SolverParameter& param) { Caffe::set_random_seed(param_.random_seed()); } // Scaffolding code - LOG(INFO) << "Creating training net."; - net_.reset(new Net(param_.train_net())); - if (param_.has_test_net()) { - LOG(INFO) << "Creating testing net."; + if (param_.has_train_net_param()) { + CHECK(!param_.has_train_net()) << "Either train_net_param or train_net may " + << "be specified, but not both."; + LOG(INFO) << "Creating training net specified in SolverParameter."; + net_.reset(new Net(param_.train_net_param())); + } else { + LOG(INFO) << "Creating training net from file: " << param_.train_net(); + net_.reset(new Net(param_.train_net())); + } + bool has_test_net = false; + NetParameter test_net_param; + if (param_.has_test_net_param()) { + CHECK(!param_.has_test_net()) << "Either test_net_param or test_net may be " + << "specified, but not both."; + LOG(INFO) << "Creating testing net specified in SolverParameter."; + test_net_.reset(new Net(param_.test_net_param())); + has_test_net = true; + } else if (param_.has_test_net()) { + LOG(INFO) << "Creating testing net from file: " << param_.test_net(); test_net_.reset(new Net(param_.test_net())); + has_test_net = true; + } + if (has_test_net) { CHECK_GT(param_.test_iter(), 0); CHECK_GT(param_.test_interval(), 0); } From bf66ac27539c63377d432006589bc43ea6203933 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 9 May 2014 19:51:59 -0700 Subject: [PATCH 0002/2053] log {Net,Solver}Parameters on Init --- src/caffe/net.cpp | 2 ++ src/caffe/solver.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 6f57d8d09ad..8eeff57efc0 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -33,6 +33,8 @@ Net::Net(const string& param_file) { template void Net::Init(const NetParameter& in_param) { + LOG(INFO) << "Initializing net from parameters: " << std::endl + << in_param.DebugString(); // Create a copy of in_param with splits added where necessary. NetParameter param; InsertSplits(in_param, ¶m); diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 77782ac69fb..9420ca3c9e1 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -33,6 +33,8 @@ Solver::Solver(const string& param_file) template void Solver::Init(const SolverParameter& param) { + LOG(INFO) << "Initializing solver from parameters: " << std::endl + << param.DebugString(); param_ = param; if (param_.random_seed() >= 0) { Caffe::set_random_seed(param_.random_seed()); From c97fff670299c8600ddd8b0ba54bbd7c325ee2f5 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 9 May 2014 20:28:55 -0700 Subject: [PATCH 0003/2053] allow multiple test nets --- include/caffe/solver.hpp | 5 ++-- src/caffe/proto/caffe.proto | 4 +-- src/caffe/solver.cpp | 55 ++++++++++++++++++++++--------------- 3 files changed, 38 insertions(+), 26 deletions(-) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index aef9b22c44d..3112c59e0fc 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -33,7 +33,8 @@ class Solver { // written to disk together with the learned net. void Snapshot(); // The test routine - void Test(); + void TestAll(); + void Test(const int test_net_id = 0); virtual void SnapshotSolverState(SolverState* state) = 0; // The Restore function implements how one should restore the solver to a // previously snapshotted state. You should implement the RestoreSolverState() @@ -44,7 +45,7 @@ class Solver { SolverParameter param_; int iter_; shared_ptr > net_; - shared_ptr > test_net_; + vector > > test_nets_; DISABLE_COPY_AND_ASSIGN(Solver); }; diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index eb086a15443..cf3a9b76c54 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -64,9 +64,9 @@ message SolverParameter { // If {train,test}_net is specified, {train,test}_net_param should not be, // and vice versa. optional string train_net = 1; // The proto filename for the train net. - optional string test_net = 2; // The proto filename for the test net. + repeated string test_net = 2; // The proto filenames for the test nets. optional NetParameter train_net_param = 21; // Full params for the train net. - optional NetParameter test_net_param = 22; // Full params for the test net. + repeated NetParameter test_net_param = 22; // Full params for the test nets. // The number of iterations for each testing phase. optional int32 test_iter = 3 [default = 0]; // The number of iterations between two testing phases. diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 9420ca3c9e1..e3dc70546a0 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -19,13 +19,13 @@ namespace caffe { template Solver::Solver(const SolverParameter& param) - : net_(), test_net_() { + : net_() { Init(param); } template Solver::Solver(const string& param_file) - : net_(), test_net_() { + : net_() { SolverParameter param; ReadProtoFromTextFile(param_file, ¶m); Init(param); @@ -49,23 +49,25 @@ void Solver::Init(const SolverParameter& param) { LOG(INFO) << "Creating training net from file: " << param_.train_net(); net_.reset(new Net(param_.train_net())); } - bool has_test_net = false; - NetParameter test_net_param; - if (param_.has_test_net_param()) { - CHECK(!param_.has_test_net()) << "Either test_net_param or test_net may be " - << "specified, but not both."; - LOG(INFO) << "Creating testing net specified in SolverParameter."; - test_net_.reset(new Net(param_.test_net_param())); - has_test_net = true; - } else if (param_.has_test_net()) { - LOG(INFO) << "Creating testing net from file: " << param_.test_net(); - test_net_.reset(new Net(param_.test_net())); - has_test_net = true; - } - if (has_test_net) { + const int num_test_net_params = param_.test_net_param_size(); + const int num_test_net_files = param_.test_net_size(); + const int num_test_nets = num_test_net_params + num_test_net_files; + if (num_test_nets) { CHECK_GT(param_.test_iter(), 0); CHECK_GT(param_.test_interval(), 0); } + test_nets_.resize(num_test_nets); + for (int i = 0; i < num_test_net_params; ++i) { + LOG(INFO) << "Creating testing net (#" << i + << ") specified in SolverParameter."; + test_nets_[i].reset(new Net(param_.test_net_param(i))); + } + for (int i = 0, test_net_id = num_test_net_params; + i < num_test_net_files; ++i, ++test_net_id) { + LOG(INFO) << "Creating testing net (#" << test_net_id + << ") from file: " << param.test_net(i); + test_nets_[test_net_id].reset(new Net(param_.test_net(i))); + } LOG(INFO) << "Solver scaffolding done."; } @@ -92,7 +94,7 @@ void Solver::Solve(const char* resume_file) { // there's not enough memory to run the test net and crash, etc.; and to gauge // the effect of the first training iterations. if (param_.test_interval()) { - Test(); + TestAll(); } // For a network that is trained by the solver, no bottom or top vecs @@ -107,7 +109,7 @@ void Solver::Solve(const char* resume_file) { LOG(INFO) << "Iteration " << iter_ << ", loss = " << loss; } if (param_.test_interval() && iter_ % param_.test_interval() == 0) { - Test(); + TestAll(); } // Check if we need to do snapshot if (param_.snapshot() && iter_ % param_.snapshot() == 0) { @@ -122,18 +124,27 @@ void Solver::Solve(const char* resume_file) { template -void Solver::Test() { - LOG(INFO) << "Iteration " << iter_ << ", Testing net"; +void Solver::TestAll() { + for (int test_net_id = 0; test_net_id < test_nets_.size(); ++test_net_id) { + Test(test_net_id); + } +} + + +template +void Solver::Test(const int test_net_id) { + LOG(INFO) << "Iteration " << iter_ << ", Testing net (#" << test_net_id << ")"; // We need to set phase to test before running. Caffe::set_phase(Caffe::TEST); - CHECK_NOTNULL(test_net_.get())->ShareTrainedLayersWith(net_.get()); + CHECK_NOTNULL(test_nets_[test_net_id].get())-> + ShareTrainedLayersWith(net_.get()); vector test_score; vector*> bottom_vec; Dtype loss = 0; for (int i = 0; i < param_.test_iter(); ++i) { Dtype iter_loss; const vector*>& result = - test_net_->Forward(bottom_vec, &iter_loss); + test_nets_[test_net_id]->Forward(bottom_vec, &iter_loss); if (param_.test_compute_loss()) { loss += iter_loss; } From b64c597357c85ef1cd882831006a5d3227c613c9 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 9 May 2014 20:47:06 -0700 Subject: [PATCH 0004/2053] add a lenet example of specifying train/test net directly in solver; multiple test nets --- .../mnist/lenet_consolidated_solver.prototxt | 396 ++++++++++++++++++ 1 file changed, 396 insertions(+) create mode 100644 examples/mnist/lenet_consolidated_solver.prototxt diff --git a/examples/mnist/lenet_consolidated_solver.prototxt b/examples/mnist/lenet_consolidated_solver.prototxt new file mode 100644 index 00000000000..14a048a3664 --- /dev/null +++ b/examples/mnist/lenet_consolidated_solver.prototxt @@ -0,0 +1,396 @@ +# lenet_consolidated_solver.prototxt consolidates the lenet_solver, lenet_train, +# and lenet_test prototxts into a single file. It also adds an additional test +# net which runs on the training set, e.g., for the purpose of comparing +# train/test accuracy (accuracy is computed only on the test set in the included +# LeNet example. This is mainly included as an example of using these features +# (specify NetParameters directly in the solver, specify multiple test nets) +# if desired. +# +# test_iter specifies how many forward passes the test should carry out. +# In the case of MNIST, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 500 training iterations. +test_interval: 500 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.01 +momentum: 0.9 +weight_decay: 0.0005 +# The learning rate policy +lr_policy: "inv" +gamma: 0.0001 +power: 0.75 +# Display every 100 iterations +display: 100 +# The maximum number of iterations +max_iter: 10000 +# snapshot intermediate results +snapshot: 5000 +snapshot_prefix: "lenet" +# Set a random_seed for repeatable results. +# (For results that vary due to random initialization, comment out the below +# line, or set to a negative integer -- e.g. "random_seed: -1") +random_seed: 1701 +# solver mode: CPU or GPU +solver_mode: GPU +# The training protocol buffer definition +train_net_param { + name: "LeNet" + layers { + name: "mnist" + type: DATA + top: "data" + top: "label" + data_param { + source: "mnist-train-leveldb" + scale: 0.00390625 + batch_size: 64 + } + } + layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + blobs_lr: 1 + blobs_lr: 2 + convolution_param { + num_output: 20 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } + } + layers { + name: "conv2" + type: CONVOLUTION + bottom: "pool1" + top: "conv2" + blobs_lr: 1 + blobs_lr: 2 + convolution_param { + num_output: 50 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "pool2" + type: POOLING + bottom: "conv2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } + } + layers { + name: "ip1" + type: INNER_PRODUCT + bottom: "pool2" + top: "ip1" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 500 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "relu1" + type: RELU + bottom: "ip1" + top: "ip1" + } + layers { + name: "ip2" + type: INNER_PRODUCT + bottom: "ip1" + top: "ip2" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 10 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "ip2" + bottom: "label" + } +} +# The testing protocol buffer definition +test_net_param { + name: "LeNet-test" + layers { + name: "mnist" + type: DATA + top: "data" + top: "label" + data_param { + source: "mnist-test-leveldb" + scale: 0.00390625 + batch_size: 100 + } + } + layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + convolution_param { + num_output: 20 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } + } + layers { + name: "conv2" + type: CONVOLUTION + bottom: "pool1" + top: "conv2" + convolution_param { + num_output: 50 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "pool2" + type: POOLING + bottom: "conv2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } + } + layers { + name: "ip1" + type: INNER_PRODUCT + bottom: "pool2" + top: "ip1" + inner_product_param { + num_output: 500 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "relu1" + type: RELU + bottom: "ip1" + top: "ip1" + } + layers { + name: "ip2" + type: INNER_PRODUCT + bottom: "ip1" + top: "ip2" + inner_product_param { + num_output: 10 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "prob" + type: SOFTMAX + bottom: "ip2" + top: "prob" + } + layers { + name: "accuracy" + type: ACCURACY + bottom: "prob" + bottom: "label" + top: "accuracy" + } +} +# The protocol buffer definition to test on the train set +test_net_param { + name: "LeNet-test-on-train" + layers { + name: "mnist" + type: DATA + top: "data" + top: "label" + data_param { + source: "mnist-train-leveldb" + scale: 0.00390625 + batch_size: 100 + } + } + layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + convolution_param { + num_output: 20 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } + } + layers { + name: "conv2" + type: CONVOLUTION + bottom: "pool1" + top: "conv2" + convolution_param { + num_output: 50 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "pool2" + type: POOLING + bottom: "conv2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } + } + layers { + name: "ip1" + type: INNER_PRODUCT + bottom: "pool2" + top: "ip1" + inner_product_param { + num_output: 500 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "relu1" + type: RELU + bottom: "ip1" + top: "ip1" + } + layers { + name: "ip2" + type: INNER_PRODUCT + bottom: "ip1" + top: "ip2" + inner_product_param { + num_output: 10 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + } + layers { + name: "prob" + type: SOFTMAX + bottom: "ip2" + top: "prob" + } + layers { + name: "accuracy" + type: ACCURACY + bottom: "prob" + bottom: "label" + top: "accuracy" + } +} From 2cd46db70d7625968cbf232d70723825d74d5040 Mon Sep 17 00:00:00 2001 From: Tobias Domhan Date: Sat, 10 May 2014 18:41:05 +0200 Subject: [PATCH 0005/2053] multiple test_iter --- src/caffe/proto/caffe.proto | 2 +- src/caffe/solver.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index cf3a9b76c54..12c4dc6a8fb 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -68,7 +68,7 @@ message SolverParameter { optional NetParameter train_net_param = 21; // Full params for the train net. repeated NetParameter test_net_param = 22; // Full params for the test nets. // The number of iterations for each testing phase. - optional int32 test_iter = 3 [default = 0]; + repeated int32 test_iter = 3; // The number of iterations between two testing phases. optional int32 test_interval = 4 [default = 0]; optional bool test_compute_loss = 19 [default = false]; diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index e3dc70546a0..e68f7194a90 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -53,7 +53,7 @@ void Solver::Init(const SolverParameter& param) { const int num_test_net_files = param_.test_net_size(); const int num_test_nets = num_test_net_params + num_test_net_files; if (num_test_nets) { - CHECK_GT(param_.test_iter(), 0); + CHECK_EQ(param_.test_iter().size(), num_test_nets) << "you need to specify test_iter for each test network."; CHECK_GT(param_.test_interval(), 0); } test_nets_.resize(num_test_nets); @@ -141,7 +141,7 @@ void Solver::Test(const int test_net_id) { vector test_score; vector*> bottom_vec; Dtype loss = 0; - for (int i = 0; i < param_.test_iter(); ++i) { + for (int i = 0; i < param_.test_iter().Get(test_net_id); ++i) { Dtype iter_loss; const vector*>& result = test_nets_[test_net_id]->Forward(bottom_vec, &iter_loss); @@ -166,12 +166,12 @@ void Solver::Test(const int test_net_id) { } } if (param_.test_compute_loss()) { - loss /= param_.test_iter(); + loss /= param_.test_iter().Get(test_net_id); LOG(INFO) << "Test loss: " << loss; } for (int i = 0; i < test_score.size(); ++i) { LOG(INFO) << "Test score #" << i << ": " - << test_score[i] / param_.test_iter(); + << test_score[i] / param_.test_iter().Get(test_net_id); } Caffe::set_phase(Caffe::TRAIN); } From 0ec86f22d7689a7db98f799a910a7d1b03dab890 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 10 May 2014 11:46:19 -0700 Subject: [PATCH 0006/2053] lint and two test_iters in lenet_consolidated_solver --- examples/mnist/lenet_consolidated_solver.prototxt | 13 +++++++++---- src/caffe/solver.cpp | 12 +++++++----- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/examples/mnist/lenet_consolidated_solver.prototxt b/examples/mnist/lenet_consolidated_solver.prototxt index 14a048a3664..76ccbfcccb9 100644 --- a/examples/mnist/lenet_consolidated_solver.prototxt +++ b/examples/mnist/lenet_consolidated_solver.prototxt @@ -6,10 +6,6 @@ # (specify NetParameters directly in the solver, specify multiple test nets) # if desired. # -# test_iter specifies how many forward passes the test should carry out. -# In the case of MNIST, we have test batch size 100 and 100 test iterations, -# covering the full 10,000 testing images. -test_iter: 100 # Carry out testing every 500 training iterations. test_interval: 500 # The base learning rate, momentum and the weight decay of the network. @@ -33,6 +29,7 @@ snapshot_prefix: "lenet" random_seed: 1701 # solver mode: CPU or GPU solver_mode: GPU + # The training protocol buffer definition train_net_param { name: "LeNet" @@ -154,6 +151,11 @@ train_net_param { bottom: "label" } } + +# test_iter specifies how many forward passes the test should carry out. +# In the case of MNIST, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 # The testing protocol buffer definition test_net_param { name: "LeNet-test" @@ -274,6 +276,9 @@ test_net_param { top: "accuracy" } } + +# The train set has 60K images, so we run 600 test iters (600 * 100 = 60K). +test_iter: 600 # The protocol buffer definition to test on the train set test_net_param { name: "LeNet-test-on-train" diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index e68f7194a90..48434f4bc32 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -53,7 +53,8 @@ void Solver::Init(const SolverParameter& param) { const int num_test_net_files = param_.test_net_size(); const int num_test_nets = num_test_net_params + num_test_net_files; if (num_test_nets) { - CHECK_EQ(param_.test_iter().size(), num_test_nets) << "you need to specify test_iter for each test network."; + CHECK_EQ(param_.test_iter_size(), num_test_nets) + << "test_iter must be specified for each test network."; CHECK_GT(param_.test_interval(), 0); } test_nets_.resize(num_test_nets); @@ -133,7 +134,8 @@ void Solver::TestAll() { template void Solver::Test(const int test_net_id) { - LOG(INFO) << "Iteration " << iter_ << ", Testing net (#" << test_net_id << ")"; + LOG(INFO) << "Iteration " << iter_ + << ", Testing net (#" << test_net_id << ")"; // We need to set phase to test before running. Caffe::set_phase(Caffe::TEST); CHECK_NOTNULL(test_nets_[test_net_id].get())-> @@ -141,7 +143,7 @@ void Solver::Test(const int test_net_id) { vector test_score; vector*> bottom_vec; Dtype loss = 0; - for (int i = 0; i < param_.test_iter().Get(test_net_id); ++i) { + for (int i = 0; i < param_.test_iter(test_net_id); ++i) { Dtype iter_loss; const vector*>& result = test_nets_[test_net_id]->Forward(bottom_vec, &iter_loss); @@ -166,12 +168,12 @@ void Solver::Test(const int test_net_id) { } } if (param_.test_compute_loss()) { - loss /= param_.test_iter().Get(test_net_id); + loss /= param_.test_iter(test_net_id); LOG(INFO) << "Test loss: " << loss; } for (int i = 0; i < test_score.size(); ++i) { LOG(INFO) << "Test score #" << i << ": " - << test_score[i] / param_.test_iter().Get(test_net_id); + << test_score[i] / param_.test_iter(test_net_id); } Caffe::set_phase(Caffe::TRAIN); } From 511665931f9b31995987a67a1503a2fff81d5750 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 10 May 2014 12:12:28 -0700 Subject: [PATCH 0007/2053] add script to run lenet_consolidated_solver and add comment with results for first/last 500 iterations --- .../mnist/lenet_consolidated_solver.prototxt | 55 ++++++++++++++++++- examples/mnist/train_lenet_consolidated.sh | 5 ++ 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100755 examples/mnist/train_lenet_consolidated.sh diff --git a/examples/mnist/lenet_consolidated_solver.prototxt b/examples/mnist/lenet_consolidated_solver.prototxt index 76ccbfcccb9..07cbc211414 100644 --- a/examples/mnist/lenet_consolidated_solver.prototxt +++ b/examples/mnist/lenet_consolidated_solver.prototxt @@ -2,10 +2,10 @@ # and lenet_test prototxts into a single file. It also adds an additional test # net which runs on the training set, e.g., for the purpose of comparing # train/test accuracy (accuracy is computed only on the test set in the included -# LeNet example. This is mainly included as an example of using these features +# LeNet example). This is mainly included as an example of using these features # (specify NetParameters directly in the solver, specify multiple test nets) # if desired. -# +# # Carry out testing every 500 training iterations. test_interval: 500 # The base learning rate, momentum and the weight decay of the network. @@ -399,3 +399,54 @@ test_net_param { top: "accuracy" } } + +# Expected results for first and last 500 iterations: +# (with portions of log omitted for brevity) +# +# Iteration 0, Testing net (#0) +# Test score #0: 0.067 +# Test score #1: 2.30256 +# Iteration 0, Testing net (#1) +# Test score #0: 0.0670334 +# Test score #1: 2.30258 +# Iteration 100, lr = 0.00992565 +# Iteration 100, loss = 0.280585 +# Iteration 200, lr = 0.00985258 +# Iteration 200, loss = 0.345601 +# Iteration 300, lr = 0.00978075 +# Iteration 300, loss = 0.172217 +# Iteration 400, lr = 0.00971013 +# Iteration 400, loss = 0.261836 +# Iteration 500, lr = 0.00964069 +# Iteration 500, loss = 0.157803 +# Iteration 500, Testing net (#0) +# Test score #0: 0.968 +# Test score #1: 0.0993772 +# Iteration 500, Testing net (#1) +# Test score #0: 0.965883 +# Test score #1: 0.109374 +# +# [...] +# +# Iteration 9500, Testing net (#0) +# Test score #0: 0.9899 +# Test score #1: 0.0308299 +# Iteration 9500, Testing net (#1) +# Test score #0: 0.996816 +# Test score #1: 0.0118238 +# Iteration 9600, lr = 0.00603682 +# Iteration 9600, loss = 0.0126215 +# Iteration 9700, lr = 0.00601382 +# Iteration 9700, loss = 0.00579304 +# Iteration 9800, lr = 0.00599102 +# Iteration 9800, loss = 0.00500633 +# Iteration 9900, lr = 0.00596843 +# Iteration 9900, loss = 0.00796607 +# Iteration 10000, lr = 0.00594604 +# Iteration 10000, loss = 0.00271736 +# Iteration 10000, Testing net (#0) +# Test score #0: 0.9914 +# Test score #1: 0.0276671 +# Iteration 10000, Testing net (#1) +# Test score #0: 0.997782 +# Test score #1: 0.00908085 diff --git a/examples/mnist/train_lenet_consolidated.sh b/examples/mnist/train_lenet_consolidated.sh new file mode 100755 index 00000000000..ff6897e263d --- /dev/null +++ b/examples/mnist/train_lenet_consolidated.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env sh + +TOOLS=../../build/tools + +GLOG_logtostderr=1 $TOOLS/train_net.bin lenet_consolidated_solver.prototxt From 41da421e613f161174cd046205583f148998dfa5 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 10 May 2014 13:57:52 -0700 Subject: [PATCH 0008/2053] fix proto comment for multiple test nets --- src/caffe/proto/caffe.proto | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 12c4dc6a8fb..ce2f25b8db5 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -61,8 +61,11 @@ message SolverParameter { // parameters; {train,test}_net_param specify the net parameters directly // inside the SolverParameter. // - // If {train,test}_net is specified, {train,test}_net_param should not be, - // and vice versa. + // Only either train_net or train_net_param (not both) should be specified. + // You may specify 0 or more test_net and/or test_net_param. All + // nets specified using test_net_param will be tested first, followed by all + // nets specified using test_net (each processed in the order specified in + // the prototxt). optional string train_net = 1; // The proto filename for the train net. repeated string test_net = 2; // The proto filenames for the test nets. optional NetParameter train_net_param = 21; // Full params for the train net. From ba2875ba9416a5789cc8e6d18758ce87177495a8 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 10 May 2014 14:09:31 -0700 Subject: [PATCH 0009/2053] require either train_net or train_net_param to be specified --- src/caffe/solver.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 48434f4bc32..6a8f18f1331 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -46,6 +46,8 @@ void Solver::Init(const SolverParameter& param) { LOG(INFO) << "Creating training net specified in SolverParameter."; net_.reset(new Net(param_.train_net_param())); } else { + CHECK(param_.has_train_net()) + << "Neither train_net nor train_net_param were specified."; LOG(INFO) << "Creating training net from file: " << param_.train_net(); net_.reset(new Net(param_.train_net())); } From 20b447fe3a5e0f80aa598b712fd94d5097ef9e89 Mon Sep 17 00:00:00 2001 From: James Thewlis Date: Mon, 19 May 2014 19:33:42 +0100 Subject: [PATCH 0010/2053] Don't modify index in im2col kernel loop --- src/caffe/util/im2col.cu | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/caffe/util/im2col.cu b/src/caffe/util/im2col.cu index 6aecb0e5722..8f5c6b04820 100644 --- a/src/caffe/util/im2col.cu +++ b/src/caffe/util/im2col.cu @@ -17,9 +17,9 @@ __global__ void im2col_gpu_kernel(const int n, const Dtype* data_im, Dtype* data_col) { CUDA_KERNEL_LOOP(index, n) { int w_out = index % width_col; - index /= width_col; - int h_out = index % height_col; - int channel_in = index / height_col; + int h_index = index / width_col; + int h_out = h_index % height_col; + int channel_in = h_index / height_col; int channel_out = channel_in * ksize * ksize; int h_in = h_out * stride - pad; int w_in = w_out * stride - pad; From b6da40a57cbfa82829d5f520092257935291c0b3 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 20 May 2014 14:42:37 -0700 Subject: [PATCH 0011/2053] fix detection notebook link --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index bc1969f6329..2a23af04033 100644 --- a/docs/index.md +++ b/docs/index.md @@ -39,7 +39,7 @@ Even in CPU mode, computing predictions on an image takes only 20 ms when images * [Feature extraction with C++](/feature_extraction.html): feature extraction using pre-trained model. [imagenet_classification]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/imagenet_classification.ipynb -[detection]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/detection_search_demo.ipynb +[detection]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/detection.ipynb [visualizing_filters]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/filter_visualization.ipynb ## Citing Caffe From 5c982ee9c8bd6bedb70994fd267ed44c03a0aa2a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 20 May 2014 14:44:47 -0700 Subject: [PATCH 0012/2053] link canonical bvlc site --- docs/_layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index bec2d83c1ce..29c7a081046 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -34,7 +34,7 @@

Caffe

  • Download TAR
  • -->
  • View On GitHub
  • -

    Maintained by
    BVLC

    +

    Maintained by
    BVLC

    Created by
    Yangqing Jia

    From 84788c61d79964b5508fba6022ee6f6a5926ccec Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 17:38:03 -0700 Subject: [PATCH 0013/2053] Added ArgMax Layer Conflicts: src/caffe/proto/caffe.proto --- include/caffe/vision_layers.hpp | 19 ++++++++++ src/caffe/layer_factory.cpp | 2 ++ src/caffe/layers/argmax_layer.cpp | 59 +++++++++++++++++++++++++++++++ src/caffe/proto/caffe.proto | 7 ++++ 4 files changed, 87 insertions(+) create mode 100644 src/caffe/layers/argmax_layer.cpp diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index de99bc3033f..21e3fd0126c 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -22,6 +22,25 @@ ConcatLayer Takes at least two blobs and concatenates them along either num or channel dim, outputting the result. */ +template +class ArgMaxLayer : public Layer { + public: + explicit ArgMaxLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + // For now ArgMax layer should not be used to compute backward operations. + virtual void Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + NOT_IMPLEMENTED; + } + bool out_max_val_; +}; + template class ConcatLayer : public Layer { public: diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 2991c81f559..ae15ba5bb44 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -24,6 +24,8 @@ Layer* GetLayer(const LayerParameter& param) { switch (type) { case LayerParameter_LayerType_ACCURACY: return new AccuracyLayer(param); + case LayerParameter_LayerType_ARGMAX: + return new ArgMaxLayer(param); case LayerParameter_LayerType_BNLL: return new BNLLLayer(param); case LayerParameter_LayerType_CONCAT: diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp new file mode 100644 index 00000000000..b09fd7883e2 --- /dev/null +++ b/src/caffe/layers/argmax_layer.cpp @@ -0,0 +1,59 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +using std::max; + +namespace caffe { + +template +void ArgMaxLayer::SetUp(const vector*>& bottom, + vector*>* top) { + CHECK_EQ(bottom.size(), 1) << "ArgMaxLayer Layer takes 1 input."; + CHECK_EQ(top->size(), 1) << "ArgMaxLayer Layer takes 1 output."; + out_max_val_ = this->layer_param_.argmax_param().out_max_val(); + // Produces max_ind and max_val + if (out_max_val_) { + (*top)[0]->Reshape(bottom[0]->num(), 2, 1, 1); + } // Produces only max_ind + else { + (*top)[0]->Reshape(bottom[0]->num(), 1, 1, 1); + } +} + +template +Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + int num = bottom[0]->num(); + int dim = bottom[0]->count() / bottom[0]->num(); + for (int i = 0; i < num; ++i) { + // Accuracy + Dtype max_val = -FLT_MAX; + int max_ind = 0; + for (int j = 0; j < dim; ++j) { + if (bottom_data[i * dim + j] > max_val) { + max_val = bottom_data[i * dim + j]; + max_ind = j; + } + } + if (out_max_val_) { + top_data[i * 2] = max_ind; + top_data[i * 2 + 1] = max_val; + } + else { + top_data[i] = max_ind; + } + } + return Dtype(0); +} + +INSTANTIATE_CLASS(ArgMaxLayer); + + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index ce2f25b8db5..8d8b2144e96 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -160,6 +160,7 @@ message LayerParameter { SPLIT = 22; TANH = 23; WINDOW_DATA = 24; + ARGMAX = 30; } optional LayerType type = 5; // the layer type from the enum above @@ -186,6 +187,7 @@ message LayerParameter { optional PoolingParameter pooling_param = 19; optional PowerParameter power_param = 21; optional WindowDataParameter window_data_param = 20; + optional ArgMaxLayer argmax_param = 23; // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new @@ -193,6 +195,11 @@ message LayerParameter { optional V0LayerParameter layer = 1; } +// Message that stores parameters used by ArgMaxLayer +message ArgMaxLayer { + // If true produce pairs (argmax, maxval) + optional bool out_max_val = 1 [default = false]; + // Message that stores parameters used by ConcatLayer message ConcatParameter { // Concat Layer needs to specify the dimension along the concat will happen, From cdebe7a617c83501ebeffc42239f8d89c0d71d7e Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 15 May 2014 09:49:36 -0700 Subject: [PATCH 0014/2053] Added Test for ArgMax Layer --- src/caffe/test/test_argmax_layer.cpp | 113 +++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 src/caffe/test/test_argmax_layer.cpp diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp new file mode 100644 index 00000000000..c99dc23021f --- /dev/null +++ b/src/caffe/test/test_argmax_layer.cpp @@ -0,0 +1,113 @@ +// Copyright 2014 BVLC and contributors. + +#include + +#include "cuda_runtime.h" +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; + +template +class ArgMaxLayerTest : public ::testing::Test { + protected: + ArgMaxLayerTest() + : blob_bottom_(new Blob(20, 10, 1, 1)), + blob_top_(new Blob()) { + Caffe::set_random_seed(1701); + // fill the values + FillerParameter filler_param; + GaussianFiller filler(filler_param); + filler.Fill(this->blob_bottom_); + blob_bottom_vec_.push_back(blob_bottom_); + blob_top_vec_.push_back(blob_top_); + } + virtual ~ArgMaxLayerTest() { delete blob_bottom_; delete blob_top_; } + Blob* const blob_bottom_; + Blob* const blob_top_; + vector*> blob_bottom_vec_; + vector*> blob_top_vec_; +}; + +typedef ::testing::Types Dtypes; +TYPED_TEST_CASE(ArgMaxLayerTest, Dtypes); + + +TYPED_TEST(ArgMaxLayerTest, TestSetup) { + LayerParameter layer_param; + ThresholdLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), this->bottom_top_->num()); + EXPECT_EQ(this->blob_top_->channels(), 1); +} + +TYPED_TEST(ArgMaxLayerTest, TestSetupMaxVal) { + LayerParameter layer_param; + ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); + argmax_param->set_out_max_val(true) + ThresholdLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), this->bottom_top_->num()); + EXPECT_EQ(this->blob_top_->channels(), 2); +} + +TYPED_TEST(ArgMaxLayerTest, TestCPU) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::CPU); + ArgMaxLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + int max_ind; + TypeParam max_val; + int num = this->blob_bottom_->num(); + int dim = this->blob_bottom_->count() / num; + for (int i = 0; i < num; ++i) { + EXPECT_GE(top_data[i], 0); + EXPECT_LE(top_data[i], dim); + max_ind = top_data[i]; + max_val = bottom_data[i * dim + max_ind]; + for (int j = 0; j < dim; ++j) { + EXPECT_LE(bottom_data[i * dim + j], max_val); + } + } +} + +TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::CPU); + ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); + argmax_param->set_out_max_val(true) + ArgMaxLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + int max_ind; + TypeParam max_val; + int num = this->blob_bottom_->num(); + int dim = this->blob_bottom_->count() / num; + for (int i = 0; i < num; ++i) { + EXPECT_GE(top_data[i], 0); + EXPECT_LE(top_data[i], dim); + max_ind = top_data[i * 2]; + max_val = top_data[i * 2 + 1]; + EXPECT_EQ(bottom_data[i * dim + max_ind],max_val); + for (int j = 0; j < dim; ++j) { + EXPECT_LE(bottom_data[i * dim + j], max_val); + } + } +} + +} // namespace caffe From 69dbbc2c045dcec996157875ea644c200b9d98c4 Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 17:39:52 -0700 Subject: [PATCH 0015/2053] Fixed numbers in proto and name of ArgMaxParameter Conflicts: src/caffe/proto/caffe.proto --- src/caffe/proto/caffe.proto | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 8d8b2144e96..b5bc26bb744 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -187,7 +187,8 @@ message LayerParameter { optional PoolingParameter pooling_param = 19; optional PowerParameter power_param = 21; optional WindowDataParameter window_data_param = 20; - optional ArgMaxLayer argmax_param = 23; + optional ArgMaxParameter argmax_param = 23; + // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new @@ -196,9 +197,10 @@ message LayerParameter { } // Message that stores parameters used by ArgMaxLayer -message ArgMaxLayer { +message ArgMaxParameter { // If true produce pairs (argmax, maxval) optional bool out_max_val = 1 [default = false]; +} // Message that stores parameters used by ConcatLayer message ConcatParameter { From bdcd75e48746be0aab0d4c8b606eeb2aac6c9ae8 Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 17:42:38 -0700 Subject: [PATCH 0016/2053] Fix types of ArgMax Layers params Conflicts: include/caffe/vision_layers.hpp src/caffe/proto/caffe.proto --- src/caffe/proto/caffe.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index b5bc26bb744..d73357cb944 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -189,7 +189,6 @@ message LayerParameter { optional WindowDataParameter window_data_param = 20; optional ArgMaxParameter argmax_param = 23; - // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new // LayerParameter specification. @@ -197,6 +196,7 @@ message LayerParameter { } // Message that stores parameters used by ArgMaxLayer + message ArgMaxParameter { // If true produce pairs (argmax, maxval) optional bool out_max_val = 1 [default = false]; From d19c18060134b7b409291cf7c9ffe815b1a9b0df Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 16:09:07 -0700 Subject: [PATCH 0017/2053] Added FLT_MAX to argmax layer --- src/caffe/layers/argmax_layer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index b09fd7883e2..33ec1d34089 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -1,12 +1,11 @@ // Copyright 2014 BVLC and contributors. -#include #include +#include #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -using std::max; namespace caffe { From aa57dfb84c763d20d46f449290b3d00a7870dc9d Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 16:43:01 -0700 Subject: [PATCH 0018/2053] Added missing ; --- src/caffe/test/test_argmax_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index c99dc23021f..bc3a8ecd1e0 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -52,7 +52,7 @@ TYPED_TEST(ArgMaxLayerTest, TestSetup) { TYPED_TEST(ArgMaxLayerTest, TestSetupMaxVal) { LayerParameter layer_param; ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); - argmax_param->set_out_max_val(true) + argmax_param->set_out_max_val(true); ThresholdLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->bottom_top_->num()); @@ -87,7 +87,7 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); - argmax_param->set_out_max_val(true) + argmax_param->set_out_max_val(true); ArgMaxLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); From d6748cb994e6e2fa082569cc10299f77e29aa60c Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 16:54:21 -0700 Subject: [PATCH 0019/2053] Fixed name of ArgMaxLayerParameter --- src/caffe/test/test_argmax_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index bc3a8ecd1e0..b30e7edbf66 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -51,7 +51,7 @@ TYPED_TEST(ArgMaxLayerTest, TestSetup) { TYPED_TEST(ArgMaxLayerTest, TestSetupMaxVal) { LayerParameter layer_param; - ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); + ArgMaxLayerParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_out_max_val(true); ThresholdLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -86,7 +86,7 @@ TYPED_TEST(ArgMaxLayerTest, TestCPU) { TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); - ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); + ArgMaxLayerParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_out_max_val(true); ArgMaxLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); From 91ab1f684c8ea03cb1bd0ffe223937dc9e5381cd Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 16:55:45 -0700 Subject: [PATCH 0020/2053] Fixed name of blob_bottom_ --- src/caffe/test/test_argmax_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index b30e7edbf66..0174e8988e1 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -45,7 +45,7 @@ TYPED_TEST(ArgMaxLayerTest, TestSetup) { LayerParameter layer_param; ThresholdLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - EXPECT_EQ(this->blob_top_->num(), this->bottom_top_->num()); + EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), 1); } @@ -55,7 +55,7 @@ TYPED_TEST(ArgMaxLayerTest, TestSetupMaxVal) { argmax_param->set_out_max_val(true); ThresholdLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - EXPECT_EQ(this->blob_top_->num(), this->bottom_top_->num()); + EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), 2); } From 766dd362db857171de45299fa75ecb8799f98289 Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 18:01:04 -0700 Subject: [PATCH 0021/2053] Change ThresholdLayer to ArgMaxLayer in test_argmax --- src/caffe/test/test_argmax_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index 0174e8988e1..f0754f0c1d2 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -43,7 +43,7 @@ TYPED_TEST_CASE(ArgMaxLayerTest, Dtypes); TYPED_TEST(ArgMaxLayerTest, TestSetup) { LayerParameter layer_param; - ThresholdLayer layer(layer_param); + ArgMaxLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), 1); @@ -53,7 +53,7 @@ TYPED_TEST(ArgMaxLayerTest, TestSetupMaxVal) { LayerParameter layer_param; ArgMaxLayerParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_out_max_val(true); - ThresholdLayer layer(layer_param); + ArgMaxLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), 2); From f6c2d933c7c281379fd5bab5131a65856a54dec0 Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 18:02:08 -0700 Subject: [PATCH 0022/2053] Change ArgMaxLayerParam to ArgMaxParam for consitency --- src/caffe/test/test_argmax_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index f0754f0c1d2..627dd575904 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -51,7 +51,7 @@ TYPED_TEST(ArgMaxLayerTest, TestSetup) { TYPED_TEST(ArgMaxLayerTest, TestSetupMaxVal) { LayerParameter layer_param; - ArgMaxLayerParameter* argmax_param = layer_param.mutable_argmax_param(); + ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_out_max_val(true); ArgMaxLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -86,7 +86,7 @@ TYPED_TEST(ArgMaxLayerTest, TestCPU) { TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); - ArgMaxLayerParameter* argmax_param = layer_param.mutable_argmax_param(); + ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_out_max_val(true); ArgMaxLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); From a3fbe2d6669756c727a17bb082d3319d00b451f5 Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Tue, 20 May 2014 21:24:03 -0700 Subject: [PATCH 0023/2053] corrected the caffe.proto ids --- src/caffe/proto/caffe.proto | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index d73357cb944..2d9a1aa8519 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -112,26 +112,29 @@ message SolverState { repeated BlobProto history = 3; // The history for sgd solvers } +// NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 23 (last added: memory_data_param) +// LayerParameter next available ID: 24 (last added: argmax_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs optional string name = 4; // the layer name + // NOTE // Add new LayerTypes to the enum below in lexicographical order (other than // starting with NONE), starting with the next available ID in the comment // line above the enum. Update the next available ID when you add a new // LayerType. // - // LayerType next available ID: 30 (last added: MEMORY_DATA) + // LayerType next available ID: 31 (last added: ARGMAX) enum LayerType { // "NONE" layer type is 0th enum element so that we don't cause confusion // by defaulting to an existent LayerType (instead, should usually error if // the type is unspecified). NONE = 0; ACCURACY = 1; + ARGMAX = 30; BNLL = 2; CONCAT = 3; CONVOLUTION = 4; @@ -160,7 +163,6 @@ message LayerParameter { SPLIT = 22; TANH = 23; WINDOW_DATA = 24; - ARGMAX = 30; } optional LayerType type = 5; // the layer type from the enum above @@ -173,6 +175,7 @@ message LayerParameter { repeated float weight_decay = 8; // Parameters for particular layer types. + optional ArgMaxParameter argmax_param = 23; optional ConcatParameter concat_param = 9; optional ConvolutionParameter convolution_param = 10; optional DataParameter data_param = 11; @@ -187,7 +190,6 @@ message LayerParameter { optional PoolingParameter pooling_param = 19; optional PowerParameter power_param = 21; optional WindowDataParameter window_data_param = 20; - optional ArgMaxParameter argmax_param = 23; // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new @@ -196,10 +198,9 @@ message LayerParameter { } // Message that stores parameters used by ArgMaxLayer - message ArgMaxParameter { - // If true produce pairs (argmax, maxval) - optional bool out_max_val = 1 [default = false]; + // If true produce pairs (argmax, maxval) + optional bool out_max_val = 1 [default = false]; } // Message that stores parameters used by ConcatLayer From a31dc6537e79f51ff6ad6f9d863af0d8ece8ee7a Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Tue, 20 May 2014 21:32:07 -0700 Subject: [PATCH 0024/2053] Documented ArgMax layer in vision_layers.hpp --- include/caffe/vision_layers.hpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 21e3fd0126c..29daf09f656 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -17,10 +17,14 @@ namespace caffe { -/* -ConcatLayer - Takes at least two blobs and concatenates them along either num or - channel dim, outputting the result. +/* ArgmaxLayer + Compute the index of the max value across all (channels x height x width). + [In the future, can take specific dimension.] + Intended for use after a classification layer to produce prediction. + If parameter out_max_val is set to true, then output is a vector of pairs + (max_ind, max_val) for each image. + + NOTE: does not implement Backwards operation. */ template class ArgMaxLayer : public Layer { @@ -33,7 +37,6 @@ class ArgMaxLayer : public Layer { protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); - // For now ArgMax layer should not be used to compute backward operations. virtual void Backward_cpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { NOT_IMPLEMENTED; @@ -41,6 +44,10 @@ class ArgMaxLayer : public Layer { bool out_max_val_; }; +/* ConcatLayer + Takes at least two blobs and concatenates them along either num or + channel dim, outputting the result. +*/ template class ConcatLayer : public Layer { public: @@ -126,6 +133,8 @@ class EltwiseProductLayer : public Layer { const bool propagate_down, vector*>* bottom); }; +/* FlattenLayer +*/ template class FlattenLayer : public Layer { public: @@ -308,6 +317,8 @@ class MemoryDataLayer : public Layer { int pos_; }; +/* PoolingLayer +*/ template class PoolingLayer : public Layer { public: From 0033f9c607f7f5079f38e569b7949e3073d2fc01 Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Tue, 20 May 2014 21:32:19 -0700 Subject: [PATCH 0025/2053] Fixed lint errors due to ArgmaxLayer --- src/caffe/layers/argmax_layer.cpp | 11 +++++------ src/caffe/test/test_argmax_layer.cpp | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index 33ec1d34089..e04588d4baa 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -15,11 +15,11 @@ void ArgMaxLayer::SetUp(const vector*>& bottom, CHECK_EQ(bottom.size(), 1) << "ArgMaxLayer Layer takes 1 input."; CHECK_EQ(top->size(), 1) << "ArgMaxLayer Layer takes 1 output."; out_max_val_ = this->layer_param_.argmax_param().out_max_val(); - // Produces max_ind and max_val - if (out_max_val_) { + if (out_max_val_) { + // Produces max_ind and max_val (*top)[0]->Reshape(bottom[0]->num(), 2, 1, 1); - } // Produces only max_ind - else { + } else { + // Produces only max_ind (*top)[0]->Reshape(bottom[0]->num(), 1, 1, 1); } } @@ -44,8 +44,7 @@ Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, if (out_max_val_) { top_data[i * 2] = max_ind; top_data[i * 2 + 1] = max_val; - } - else { + } else { top_data[i] = max_ind; } } diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index 627dd575904..c4150e5abe0 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -103,7 +103,7 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { EXPECT_LE(top_data[i], dim); max_ind = top_data[i * 2]; max_val = top_data[i * 2 + 1]; - EXPECT_EQ(bottom_data[i * dim + max_ind],max_val); + EXPECT_EQ(bottom_data[i * dim + max_ind], max_val); for (int j = 0; j < dim; ++j) { EXPECT_LE(bottom_data[i * dim + j], max_val); } From 4d52ca7df5283bea4ee0abf95039538387d007c0 Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Tue, 20 May 2014 21:48:23 -0700 Subject: [PATCH 0026/2053] setting canonical random seed --- src/caffe/test/test_argmax_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index c4150e5abe0..ab2d75b322c 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -22,7 +22,7 @@ class ArgMaxLayerTest : public ::testing::Test { ArgMaxLayerTest() : blob_bottom_(new Blob(20, 10, 1, 1)), blob_top_(new Blob()) { - Caffe::set_random_seed(1701); + Caffe::set_random_seed(this->seed_); // fill the values FillerParameter filler_param; GaussianFiller filler(filler_param); From a13e7ee43a4efaac058aaecd40d93d5e2b018a90 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 20 May 2014 22:33:29 -0700 Subject: [PATCH 0027/2053] Revert "setting canonical random seed" 1701 is the canonical random seed, and as this test makes only one call for seeding there's no need for a member var. --- src/caffe/test/test_argmax_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index ab2d75b322c..c4150e5abe0 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -22,7 +22,7 @@ class ArgMaxLayerTest : public ::testing::Test { ArgMaxLayerTest() : blob_bottom_(new Blob(20, 10, 1, 1)), blob_top_(new Blob()) { - Caffe::set_random_seed(this->seed_); + Caffe::set_random_seed(1701); // fill the values FillerParameter filler_param; GaussianFiller filler(filler_param); From ffedfa6bd92ed982cfbfbb7335c79c3eee4bcd3f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 21 May 2014 18:38:19 -0700 Subject: [PATCH 0028/2053] EltwiseProductLayer -> EltwiseLayer for generality Reproduce elementwise product layer in more generality. Add elementwise operation parameter. Prepare for elementwise sum operation choice. --- include/caffe/vision_layers.hpp | 10 +++-- src/caffe/layer_factory.cpp | 4 +- ...se_product_layer.cpp => eltwise_layer.cpp} | 31 +++++++++---- ...wise_product_layer.cu => eltwise_layer.cu} | 28 ++++++++---- src/caffe/layers/lrn_layer.cpp | 4 +- src/caffe/proto/caffe.proto | 13 +++++- ...oduct_layer.cpp => test_eltwise_layer.cpp} | 44 ++++++++++++------- 7 files changed, 91 insertions(+), 43 deletions(-) rename src/caffe/layers/{eltwise_product_layer.cpp => eltwise_layer.cpp} (63%) rename src/caffe/layers/{eltwise_product_layer.cu => eltwise_layer.cu} (52%) rename src/caffe/test/{test_eltwise_product_layer.cpp => test_eltwise_layer.cpp} (69%) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 29daf09f656..1b5da11eea1 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -112,12 +112,12 @@ class ConvolutionLayer : public Layer { int N_; }; -/* EltwiseProductLayer +/* EltwiseLayer */ template -class EltwiseProductLayer : public Layer { +class EltwiseLayer : public Layer { public: - explicit EltwiseProductLayer(const LayerParameter& param) + explicit EltwiseLayer(const LayerParameter& param) : Layer(param) {} virtual void SetUp(const vector*>& bottom, vector*>* top); @@ -131,6 +131,8 @@ class EltwiseProductLayer : public Layer { const bool propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, const bool propagate_down, vector*>* bottom); + + EltwiseParameter_EltwiseOp op_; }; /* FlattenLayer @@ -276,7 +278,7 @@ class LRNLayer : public Layer { shared_ptr > power_layer_; Blob power_output_; vector*> power_top_vec_; - shared_ptr > product_layer_; + shared_ptr > product_layer_; Blob product_data_input_; vector*> product_bottom_vec_; }; diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index ae15ba5bb44..58c20b1f430 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -38,8 +38,8 @@ Layer* GetLayer(const LayerParameter& param) { return new DropoutLayer(param); case LayerParameter_LayerType_EUCLIDEAN_LOSS: return new EuclideanLossLayer(param); - case LayerParameter_LayerType_ELTWISE_PRODUCT: - return new EltwiseProductLayer(param); + case LayerParameter_LayerType_ELTWISE: + return new EltwiseLayer(param); case LayerParameter_LayerType_FLATTEN: return new FlattenLayer(param); case LayerParameter_LayerType_HDF5_DATA: diff --git a/src/caffe/layers/eltwise_product_layer.cpp b/src/caffe/layers/eltwise_layer.cpp similarity index 63% rename from src/caffe/layers/eltwise_product_layer.cpp rename to src/caffe/layers/eltwise_layer.cpp index b394450d6ae..dd466182877 100644 --- a/src/caffe/layers/eltwise_product_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -9,7 +9,7 @@ namespace caffe { template -void EltwiseProductLayer::SetUp(const vector*>& bottom, +void EltwiseLayer::SetUp(const vector*>& bottom, vector*>* top) { CHECK_GE(bottom.size(), 2) << "Eltwise Product Layer takes at least 2 blobs as input."; @@ -26,22 +26,29 @@ void EltwiseProductLayer::SetUp(const vector*>& bottom, CHECK_EQ(width, bottom[i]->width()); } (*top)[0]->Reshape(num, channels, height, width); + op_ = this->layer_param_.eltwise_param().operation(); } template -Dtype EltwiseProductLayer::Forward_cpu( +Dtype EltwiseLayer::Forward_cpu( const vector*>& bottom, vector*>* top) { const int count = (*top)[0]->count(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); - caffe_mul(count, bottom[0]->cpu_data(), bottom[1]->cpu_data(), top_data); - for (int i = 2; i < bottom.size(); ++i) { - caffe_mul(count, top_data, bottom[i]->cpu_data(), top_data); + switch (op_) { + case EltwiseParameter_EltwiseOp_PROD: + caffe_mul(count, bottom[0]->cpu_data(), bottom[1]->cpu_data(), top_data); + for (int i = 2; i < bottom.size(); ++i) { + caffe_mul(count, top_data, bottom[i]->cpu_data(), top_data); + } + break; + default: + LOG(FATAL) << "Unknown elementwise operation."; } return Dtype(0.); } template -void EltwiseProductLayer::Backward_cpu(const vector*>& top, +void EltwiseLayer::Backward_cpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { if (propagate_down) { const int count = top[0]->count(); @@ -50,13 +57,19 @@ void EltwiseProductLayer::Backward_cpu(const vector*>& top, for (int i = 0; i < bottom->size(); ++i) { const Dtype* bottom_data = (*bottom)[i]->cpu_data(); Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); - caffe_div(count, top_data, bottom_data, bottom_diff); - caffe_mul(count, bottom_diff, top_diff, bottom_diff); + switch (op_) { + case EltwiseParameter_EltwiseOp_PROD: + caffe_div(count, top_data, bottom_data, bottom_diff); + caffe_mul(count, bottom_diff, top_diff, bottom_diff); + break; + default: + LOG(FATAL) << "Unknown elementwise operation."; + } } } } -INSTANTIATE_CLASS(EltwiseProductLayer); +INSTANTIATE_CLASS(EltwiseLayer); } // namespace caffe diff --git a/src/caffe/layers/eltwise_product_layer.cu b/src/caffe/layers/eltwise_layer.cu similarity index 52% rename from src/caffe/layers/eltwise_product_layer.cu rename to src/caffe/layers/eltwise_layer.cu index 9c66033c20f..9072f884b30 100644 --- a/src/caffe/layers/eltwise_product_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -9,19 +9,25 @@ namespace caffe { template -Dtype EltwiseProductLayer::Forward_gpu( +Dtype EltwiseLayer::Forward_gpu( const vector*>& bottom, vector*>* top) { const int count = (*top)[0]->count(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); - caffe_gpu_mul(count, bottom[0]->gpu_data(), bottom[1]->gpu_data(), top_data); - for (int i = 2; i < bottom.size(); ++i) { - caffe_gpu_mul(count, top_data, bottom[i]->gpu_data(), top_data); + switch (op_) { + case EltwiseParameter_EltwiseOp_PROD: + caffe_gpu_mul(count, bottom[0]->gpu_data(), bottom[1]->gpu_data(), top_data); + for (int i = 2; i < bottom.size(); ++i) { + caffe_gpu_mul(count, top_data, bottom[i]->gpu_data(), top_data); + } + break; + default: + LOG(FATAL) << "Unknown elementwise operation."; } return Dtype(0.); } template -void EltwiseProductLayer::Backward_gpu(const vector*>& top, +void EltwiseLayer::Backward_gpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { if (propagate_down) { const int count = top[0]->count(); @@ -30,13 +36,19 @@ void EltwiseProductLayer::Backward_gpu(const vector*>& top, for (int i = 0; i < bottom->size(); ++i) { const Dtype* bottom_data = (*bottom)[i]->gpu_data(); Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); - caffe_gpu_div(count, top_data, bottom_data, bottom_diff); - caffe_gpu_mul(count, bottom_diff, top_diff, bottom_diff); + switch (op_) { + case EltwiseParameter_EltwiseOp_PROD: + caffe_gpu_div(count, top_data, bottom_data, bottom_diff); + caffe_gpu_mul(count, bottom_diff, top_diff, bottom_diff); + break; + default: + LOG(FATAL) << "Unknown elementwise operation."; + } } } } -INSTANTIATE_CLASS(EltwiseProductLayer); +INSTANTIATE_CLASS(EltwiseLayer); } // namespace caffe diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index cfcc59c9feb..6f7af75957a 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -85,7 +85,9 @@ void LRNLayer::SetUp(const vector*>& bottom, product_bottom_vec_.push_back(bottom[0]); product_bottom_vec_.push_back(&power_output_); LayerParameter product_param; - product_layer_.reset(new EltwiseProductLayer(product_param)); + EltwiseParameter* eltwise_param = product_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); + product_layer_.reset(new EltwiseLayer(product_param)); product_layer_->SetUp(product_bottom_vec_, top); CHECK_EQ((*top)[0]->num(), num_); CHECK_EQ((*top)[0]->channels(), channels_); diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 2d9a1aa8519..a0a855e7e14 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -115,7 +115,7 @@ message SolverState { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 24 (last added: argmax_param) +// LayerParameter next available ID: 25 (last added: eltwise_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs @@ -141,7 +141,7 @@ message LayerParameter { DATA = 5; DROPOUT = 6; EUCLIDEAN_LOSS = 7; - ELTWISE_PRODUCT = 25; + ELTWISE = 25; FLATTEN = 8; HDF5_DATA = 9; HDF5_OUTPUT = 10; @@ -180,6 +180,7 @@ message LayerParameter { optional ConvolutionParameter convolution_param = 10; optional DataParameter data_param = 11; optional DropoutParameter dropout_param = 12; + optional EltwiseParameter eltwise_param = 24; optional HDF5DataParameter hdf5_data_param = 13; optional HDF5OutputParameter hdf5_output_param = 14; optional ImageDataParameter image_data_param = 15; @@ -250,6 +251,14 @@ message DropoutParameter { optional float dropout_ratio = 1 [default = 0.5]; // dropout ratio } +// Message that stores parameters used by EltwiseLayer +message EltwiseParameter { + enum EltwiseOp { + PROD = 0; + } + optional EltwiseOp operation = 1; // element-wise operation to compute +} + // Message that stores parameters used by HDF5DataLayer message HDF5DataParameter { // Specify the data source. diff --git a/src/caffe/test/test_eltwise_product_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp similarity index 69% rename from src/caffe/test/test_eltwise_product_layer.cpp rename to src/caffe/test/test_eltwise_layer.cpp index 86d6fdc5334..86e47516ca7 100644 --- a/src/caffe/test/test_eltwise_product_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -17,9 +17,9 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; template -class EltwiseProductLayerTest : public ::testing::Test { +class EltwiseLayerTest : public ::testing::Test { protected: - EltwiseProductLayerTest() + EltwiseLayerTest() : blob_bottom_a_(new Blob(2, 3, 4, 5)), blob_bottom_b_(new Blob(2, 3, 4, 5)), blob_bottom_c_(new Blob(2, 3, 4, 5)), @@ -35,7 +35,7 @@ class EltwiseProductLayerTest : public ::testing::Test { blob_bottom_vec_.push_back(blob_bottom_c_); blob_top_vec_.push_back(blob_top_); } - virtual ~EltwiseProductLayerTest() { + virtual ~EltwiseLayerTest() { delete blob_bottom_a_; delete blob_bottom_b_; delete blob_bottom_c_; @@ -50,12 +50,14 @@ class EltwiseProductLayerTest : public ::testing::Test { }; typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(EltwiseProductLayerTest, Dtypes); +TYPED_TEST_CASE(EltwiseLayerTest, Dtypes); -TYPED_TEST(EltwiseProductLayerTest, TestSetUp) { +TYPED_TEST(EltwiseLayerTest, TestSetUp) { LayerParameter layer_param; - shared_ptr > layer( - new EltwiseProductLayer(layer_param)); + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); + shared_ptr > layer( + new EltwiseLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 3); @@ -63,11 +65,13 @@ TYPED_TEST(EltwiseProductLayerTest, TestSetUp) { EXPECT_EQ(this->blob_top_->width(), 5); } -TYPED_TEST(EltwiseProductLayerTest, TestCPU) { +TYPED_TEST(EltwiseLayerTest, TestCPU) { Caffe::set_mode(Caffe::CPU); LayerParameter layer_param; - shared_ptr > layer( - new EltwiseProductLayer(layer_param)); + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); + shared_ptr > layer( + new EltwiseLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); const TypeParam* data = this->blob_top_->cpu_data(); @@ -80,11 +84,13 @@ TYPED_TEST(EltwiseProductLayerTest, TestCPU) { } } -TYPED_TEST(EltwiseProductLayerTest, TestGPU) { +TYPED_TEST(EltwiseLayerTest, TestGPU) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; - shared_ptr > layer( - new EltwiseProductLayer(layer_param)); + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); + shared_ptr > layer( + new EltwiseLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); const TypeParam* data = this->blob_top_->cpu_data(); @@ -97,19 +103,23 @@ TYPED_TEST(EltwiseProductLayerTest, TestGPU) { } } -TYPED_TEST(EltwiseProductLayerTest, TestCPUGradient) { +TYPED_TEST(EltwiseLayerTest, TestCPUGradient) { Caffe::set_mode(Caffe::CPU); LayerParameter layer_param; - EltwiseProductLayer layer(layer_param); + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); + EltwiseLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } -TYPED_TEST(EltwiseProductLayerTest, TestGPUGradient) { +TYPED_TEST(EltwiseLayerTest, TestGPUGradient) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; - EltwiseProductLayer layer(layer_param); + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); + EltwiseLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); From b23b2ee70cea10f5b0386cb3ea6be55b5effc95c Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 21 May 2014 18:57:33 -0700 Subject: [PATCH 0029/2053] add caffe_gpu_add() and caffe_gpu_sub() --- include/caffe/util/math_functions.hpp | 6 ++++ src/caffe/util/math_functions.cu | 48 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index d9c78355b6f..25ed4705961 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -86,9 +86,15 @@ void caffe_sqr(const int N, const Dtype* a, Dtype* y); template void caffe_add(const int N, const Dtype* a, const Dtype* b, Dtype* y); +template +void caffe_gpu_add(const int N, const Dtype* a, const Dtype* b, Dtype* y); + template void caffe_sub(const int N, const Dtype* a, const Dtype* b, Dtype* y); +template +void caffe_gpu_sub(const int N, const Dtype* a, const Dtype* b, Dtype* y); + template void caffe_mul(const int N, const Dtype* a, const Dtype* b, Dtype* y); diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index 184613c0a84..63c8fac69c5 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -63,6 +63,54 @@ void caffe_gpu_add_scalar(const int N, const double alpha, double* Y) { N, alpha, Y); } +template +__global__ void add_kernel(const int n, const Dtype* a, + const Dtype* b, Dtype* y) { + CUDA_KERNEL_LOOP(index, n) { + y[index] = a[index] + b[index]; + } +} + +template <> +void caffe_gpu_add(const int N, const float* a, const float* b, + float* y) { + // NOLINT_NEXT_LINE(whitespace/operators) + add_kernel<<>>( + N, a, b, y); +} + +template <> +void caffe_gpu_add(const int N, const double* a, const double* b, + double* y) { + // NOLINT_NEXT_LINE(whitespace/operators) + add_kernel<<>>( + N, a, b, y); +} + +template +__global__ void sub_kernel(const int n, const Dtype* a, + const Dtype* b, Dtype* y) { + CUDA_KERNEL_LOOP(index, n) { + y[index] = a[index] - b[index]; + } +} + +template <> +void caffe_gpu_sub(const int N, const float* a, const float* b, + float* y) { + // NOLINT_NEXT_LINE(whitespace/operators) + sub_kernel<<>>( + N, a, b, y); +} + +template <> +void caffe_gpu_sub(const int N, const double* a, const double* b, + double* y) { + // NOLINT_NEXT_LINE(whitespace/operators) + sub_kernel<<>>( + N, a, b, y); +} + template __global__ void mul_kernel(const int n, const Dtype* a, const Dtype* b, Dtype* y) { From 9c539dcf1d31f5d2e4a06698377b5a8618591b97 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 21 May 2014 19:31:47 -0700 Subject: [PATCH 0030/2053] Elementwise layer learns summation --- src/caffe/layers/eltwise_layer.cpp | 9 ++++ src/caffe/layers/eltwise_layer.cu | 9 ++++ src/caffe/proto/caffe.proto | 1 + src/caffe/test/test_eltwise_layer.cpp | 59 ++++++++++++++++++++++++--- 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index dd466182877..769d0157d44 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -41,6 +41,12 @@ Dtype EltwiseLayer::Forward_cpu( caffe_mul(count, top_data, bottom[i]->cpu_data(), top_data); } break; + case EltwiseParameter_EltwiseOp_SUM: + caffe_add(count, bottom[0]->cpu_data(), bottom[1]->cpu_data(), top_data); + for (int i = 2; i < bottom.size(); ++i) { + caffe_add(count, top_data, bottom[i]->cpu_data(), top_data); + } + break; default: LOG(FATAL) << "Unknown elementwise operation."; } @@ -62,6 +68,9 @@ void EltwiseLayer::Backward_cpu(const vector*>& top, caffe_div(count, top_data, bottom_data, bottom_diff); caffe_mul(count, bottom_diff, top_diff, bottom_diff); break; + case EltwiseParameter_EltwiseOp_SUM: + caffe_copy(count, top_diff, bottom_diff); + break; default: LOG(FATAL) << "Unknown elementwise operation."; } diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index 9072f884b30..8bdb6a3ca37 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -20,6 +20,12 @@ Dtype EltwiseLayer::Forward_gpu( caffe_gpu_mul(count, top_data, bottom[i]->gpu_data(), top_data); } break; + case EltwiseParameter_EltwiseOp_SUM: + caffe_gpu_add(count, bottom[0]->gpu_data(), bottom[1]->gpu_data(), top_data); + for (int i = 2; i < bottom.size(); ++i) { + caffe_gpu_add(count, top_data, bottom[i]->gpu_data(), top_data); + } + break; default: LOG(FATAL) << "Unknown elementwise operation."; } @@ -41,6 +47,9 @@ void EltwiseLayer::Backward_gpu(const vector*>& top, caffe_gpu_div(count, top_data, bottom_data, bottom_diff); caffe_gpu_mul(count, bottom_diff, top_diff, bottom_diff); break; + case EltwiseParameter_EltwiseOp_SUM: + caffe_gpu_copy(count, top_diff, bottom_diff); + break; default: LOG(FATAL) << "Unknown elementwise operation."; } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index a0a855e7e14..a7fb37bb76b 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -255,6 +255,7 @@ message DropoutParameter { message EltwiseParameter { enum EltwiseOp { PROD = 0; + SUM = 1; } optional EltwiseOp operation = 1; // element-wise operation to compute } diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index 86e47516ca7..dbb77fcee2c 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -65,7 +65,7 @@ TYPED_TEST(EltwiseLayerTest, TestSetUp) { EXPECT_EQ(this->blob_top_->width(), 5); } -TYPED_TEST(EltwiseLayerTest, TestCPU) { +TYPED_TEST(EltwiseLayerTest, TestProdCPU) { Caffe::set_mode(Caffe::CPU); LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); @@ -84,7 +84,26 @@ TYPED_TEST(EltwiseLayerTest, TestCPU) { } } -TYPED_TEST(EltwiseLayerTest, TestGPU) { +TYPED_TEST(EltwiseLayerTest, TestSumCPU) { + Caffe::set_mode(Caffe::CPU); + LayerParameter layer_param; + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); + shared_ptr > layer( + new EltwiseLayer(layer_param)); + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + const TypeParam* data = this->blob_top_->cpu_data(); + const int count = this->blob_top_->count(); + const TypeParam* in_data_a = this->blob_bottom_a_->cpu_data(); + const TypeParam* in_data_b = this->blob_bottom_b_->cpu_data(); + const TypeParam* in_data_c = this->blob_bottom_c_->cpu_data(); + for (int i = 0; i < count; ++i) { + EXPECT_EQ(data[i], in_data_a[i] + in_data_b[i] + in_data_c[i]); + } +} + +TYPED_TEST(EltwiseLayerTest, TestProdGPU) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); @@ -103,7 +122,26 @@ TYPED_TEST(EltwiseLayerTest, TestGPU) { } } -TYPED_TEST(EltwiseLayerTest, TestCPUGradient) { +TYPED_TEST(EltwiseLayerTest, TestSumGPU) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); + shared_ptr > layer( + new EltwiseLayer(layer_param)); + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + const TypeParam* data = this->blob_top_->cpu_data(); + const int count = this->blob_top_->count(); + const TypeParam* in_data_a = this->blob_bottom_a_->cpu_data(); + const TypeParam* in_data_b = this->blob_bottom_b_->cpu_data(); + const TypeParam* in_data_c = this->blob_bottom_c_->cpu_data(); + for (int i = 0; i < count; ++i) { + EXPECT_EQ(data[i], in_data_a[i] + in_data_b[i] + in_data_c[i]); + } +} + +TYPED_TEST(EltwiseLayerTest, TestProdCPUGradient) { Caffe::set_mode(Caffe::CPU); LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); @@ -114,11 +152,22 @@ TYPED_TEST(EltwiseLayerTest, TestCPUGradient) { &(this->blob_top_vec_)); } -TYPED_TEST(EltwiseLayerTest, TestGPUGradient) { +TYPED_TEST(EltwiseLayerTest, TestSumCPUGradient) { + Caffe::set_mode(Caffe::CPU); + LayerParameter layer_param; + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); + EltwiseLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +TYPED_TEST(EltwiseLayerTest, TestSumGPUGradient) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); - eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); EltwiseLayer layer(layer_param); GradientChecker checker(1e-2, 1e-2); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), From a26094e356f2d089f8f402fbd71dedaee6b953b4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 21 May 2014 19:47:15 -0700 Subject: [PATCH 0031/2053] add EltwiseLayer docstring --- include/caffe/vision_layers.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 1b5da11eea1..3acb8df6c27 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -113,6 +113,7 @@ class ConvolutionLayer : public Layer { }; /* EltwiseLayer + Compute elementwise operations like product or sum. */ template class EltwiseLayer : public Layer { From 2b0087194a46ce2f34626bdbfc781d289f24e9be Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 22 May 2014 00:30:12 -0700 Subject: [PATCH 0032/2053] reduce example image size --- examples/images/cat.jpg | Bin 642416 -> 140391 bytes src/caffe/test/test_image_data_layer.cpp | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/images/cat.jpg b/examples/images/cat.jpg index 5303803b1c12213f986fb30e0b91e9d0b82fce85..b4efc6c98b7e7bed698b10f4b7f06031267d52dd 100644 GIT binary patch literal 140391 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�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 literal 642416 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 Oi_lFgifCR1hNXC3%*ySq0D?!8yMwl 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 d3uJ>3>BgE69W=&cP z(Mi`mi+>Vql`Q`hpT3$3|8VAem)wo2;iG$sLs5-+UOF9|;NeM9hNNKT6;)~Ae9A#? z7=02FsY|6`?;+G>L;*=iW??W-8TxE~q_DK=FzTq8R+`nLLCU;7QWL&3d~`P7sEYjw zak)n&s}u@3is`svhy@}uYot|_y$A%W6y?_1@FPBfdI6FX%EZ|`sp(;%gzX%q^jQzf zO)R>f{T3-f{?OJ~@%Yo8cwBtFaw=)@&3hzd_k-}u)6JYSdVn@o0`Z@8|9gl~TO1Ss zq#QjYXenPgDJ&i&n$5jJ?E;Kpt9bP<6!!1w!_rRcyeEQ>B z4W1`5v}iL+!|Hy1^M5B!eXdtSo#MU)7jn(p85vi?6zDA9cak`RyFD$Bw;KvOx(XF7 zWPIUPf-vieOJ!Myk9i){E&Wb7KkLREi%-Y;F-8w>8z}_vnoYKG0tMFL1faQv9(vMK zrwf4wL>(6W?}SUwZ)Q6(QVZh$!=NJE>^b3YXFkr|f@;+TWp+%eU#*MC)bA9ObrHNE znWYgr^N{KWc`)q!j;>a{wOr?subf{)R$fqpGB=LjOLU+Qcm5bKh=Kjbm*x(McdJr< ziHGui1s_qOY6S{-S|$L$9AP@Si3hT!oe3iF$4vQSqH&Hb)>^0)_xi^D%BlCCNdgqZ z@aYY7E(m?#up{n10;bVvwX?(F+}&4>;>&~`FAH&rWkg(G_6hNpRYuvE$W!21aD+y1 zq_9+4-E`(_pI3brK4QZTEa}00Df!QN#PaOU>$iad;o=wcy8XSyGz>1<@<+YiZccIa zJY5XLrmhYPEZ;|p`_}uUO0U#H3lrs=GQ09Ri>(W}@{zsTF8N~Rb?`FN-B-?B4WBQU zEvoZh#znDj-_<#~O8W4=!m6V;;q?OiOyuilb)3>70cpX)_5$pxqv?XH1^uY-IPK_@ zvto~_-P~EK^HcxH8gaY4X*jwSL(Aby=Yea)y`hNk>kz&hd(Kjl_|>f*NV7e8a$%`* zLBqe>X4}42Rac};G3p}+JlRabsA{{~sqZKYpHxFcNZ6iJR8>5F0^zpoeR4rNhif(b z2nP6Knm9Y;{Tk@)wN8A13IR>n;dJs0J|}GZtlQDqN=kLf>y2C-psc09`O%Xd)u@fE zDVo_MDw$txz1Vy(+E*nGm(`{|aTBqT_U@E?ZTND!7mKRi_x4IeUOKw`5_fwejTS6G zw&fI+;>$`=%H!kiQRBaNkbTmqX5gBJiB2RoowA@(7R+K!4p>QklwYM8ZOh?QhiR^f z$Rei5DD8LISD^c0r8j1hgX(+6n8E-v;&*(g!t7zfnOVP$eEN8XE|UpLDZP_k{qKaIbAPzv65JQNH~t5Z&~K*)!(8Lz z;6KWC<)dE~jMU`5R5tAQ@q@Hj*Fbt?W@3s$3z-vk^|tZ%NQ4xJ441kk-4>6!DTB_^ zxyTJC zmi=Ao(81Hu&CU~Z3`*7ND0*lak9OpA84&Sj4TJpU=GKkSgp8Qt9AE;IsnJKXxuk= zzNS3+pyV5nkD?i_Db@J(J{O;~ca`zv#CNimO|PGhliFZHs{p$7ulj;y(63~%LsgM- zx&1VN)pDT2ypYx%Dl}jztCkj_fuwC&*>bO_4H0Q9@%gEWG7pqQI{O50HZVyj#~FS> zmbzCz;Rn8`{^09B^M+p#K&ufMolYPB-{E$mW{3^HV8!DZU4C~^l%7}#~X zVURM3?8el5yllwq`r)a`G-d6m`tS@HJnS`s%Q0*d16jwY)W*LsS#o1(w)D$Ty2c`# ztn22SNRpJ*)8U=N?;m|Hp}JLD>4aZcT>8DR96K8?9%c~X2 zt`%*H*+D^u#1{q?9osXwaC_s!e_wK9?^My(5loQy3m_P&kkPD6mh-P*P8F90DC97T zqu!V4xWiUyCDkZ|=6;-e#?{x^`*Zl;00*G)39~PL(f-d8b=^xom5%==8MLQbvY?x~ z3+stkaT;#5MFN_DBcP8u01CiuzLZ~!d_Y#=M&(i|WG^TYrbN>*m=i%6wjkOgrdEav z50&9^|4!T&L|}J0>Xc!AgTeW;$5}=4HvMXAEOv;|Yz>X+s8oB9v5o!(h{Y@|qV6lB zzp6Q4Z39x1%=`)gjr|eV?b@{v=}Fz+DGA<~Gl0s^2KMWS^9|1qT$Y>iQl!9Ix$NLH zpNre#p%@I~yD=DVlvVrKb$-$@S$9s*fWS@MXTo2(;|o}RdfNP(9k zPh`!`+?{{W!o`kv_f|oPr|7eK37j9ASq{AK=`3u0);1|$v$md2HC9g2SM5ecKd5@Z zXMUWfZ0aCnVLA=gg~kd9Uwr28&|3Re&eo&Pl&5g;MiYL<R2SH_i_jj%m? zYrX5RqF9Ck4GqHa;(>h9V|T+q(Uf9~1{?WWAH}2ERI9QYhj*~lErSG|N6&j%>oViR z%#U6Vv85H<548rUpH!g)&EI+z`u=aOpeakX8Udd-CLlII)yPkYb8_}s8@T!!=a5u< z5GK;2Y6S9gb5KstVNpxRyc!|6R9s+zJHjx&M>XbLj z;^Tdu7~UhDL3m*(^6$h;fDAFRq`s4Hew|O#!D`CkP5(kq!-{;Z-H=NyzC^||w^{HF z<)HMD<=uCYnI4kVpk{Rn1>e>5ALNVsHGR~fJ;OG6Y+cI$g7jpB;1+broWQKvPuD~* zmCkl}bC+kL27hGrH>)EQM4vF*a5@@Powci^N8ZN=@mi4lp0&_mO*td3LpHCZ782_F z#2><{-Q3hyhEYOAA~na@B~}#d8@gRf-=Y%Orfy7KMf9MwFh61QF~X=hRY&=COX+6d z!I@s&97Ep&W^+LIbjWioV_%Lu@M46uJX{Red;w8AHaLzIL8cuRlr6*{;gfPh^#`0+ zXp65RsNu>qj?kLpn#3yjI$UVq{-X=iNIXwYT)CorZiB3f*~p*VinnQn`{$^CbUCuULf1>ns{c4T8@uSSF%8&5&ThM z4W-A^8c=QC@_f=~ys|$_5p>jGU{PfFYudW}g#uugpu1}^q|2x-s+SHw`ZEG>q(SOhu$R=tnOxN8~IWUu*i~;_@K|pHzG9RjH*y-st#^8ZJGRm@M?@vgNE+8BV#pw z^~ibq7GUe2!+Fcw*ikB~L-Q0+ZVjc|Z+is;u=+yZ192;yiAPsj-Y?Qo9<8`l0bmQB zq#<(~*deyM=dpIAvdL-*%T52*TCzqs1pM5sVu~(JaykM7?!^3Z344(L4{KrRZ1+$F zjO6SdbD{T#dLAwwEt<2j&qn!6*u7??dalFsP*!rkzR*>O+40jmR{zpTL*m^H=qwHT zjSL{V+BD-|#g*{2=Fh9FH;|y#W3V3ZGE$4y(?zC6#YKe_HaGyP{GfB&p`ac2j2Q!- zU35rIA#9QRWT-xZ5(2E6N*Bf9E%n6D_%@^stfsI5j#F6Lf5XfHUOTs#n@B@OWh9gE z?*vfIwIALU!kbRV{>~NFgj4IsWzN1K&>r zz!J#wY`#vR`%b%Q#zc6f(hqf9{ehSm{L>)Ex<4w3iNBlIHCC?qDLkE|+4~P!);earn=YYVWDP2hMBzH)On;e) zvzvYtXY+Y1y|S0}^2&D5d^TNF~ z?hj{|9cUJ^V_Il|O5&0}tq!Q<`-Su%>e*X>AI_v>9$ataKbMU!m_GnB1VA2-0;ewf$MQRR05385O);fwS8GB@Uf{A zd&5Km{5T+&-+0a0!i00<;Es^qD2L~cSRF<_!^+sgFk~BTi^8;VN;!5MQo}Vks@nHo zCQG;q$|uCd8^#5;j|dfqY|p_n@V(;;IBN>EbZ8{(Yo)9aC9`fD$i`_yb)fo|`_kq* zPfIv{uI3S z^xq0$zbojh+{neEuh(|ElRh?Gn=g8v7t<2*ZL^JiE~tiqcP;sMVqKljUddIVw5Esx ztTq>_UFfb?oQ5dQ@I9qo!2{Q}NDRPT6M zxl8;Ug>Pgaze>*34;yYGs}C1nl$rtcjOODuI+DJs*xw%>Bd!ZN1_TNkUk{0Nd&)D! z{{>i1QaoKwO`zf3alKn5L8s9;_!JlXrCq&fc;iBkC74V8@2{!m3xa^!Xoz^dLx;>Y zAm=Ld{Hd?zT!ucrrnxtw1r+UeMNIz*EdM13^C#TYuYNnQ! z{7N9lES3+>Utu~r{LVHp8OrU~^{F_(wQgjlp6~`zXh#f#qCY0{r&#mb8Xb zP{fRG?`gR!U!6D4{J1(<;es9TkG674hyV)YC?7ZT10(;QgjB^LfWM|{#OwY5-U6e; z3rm8yZJj6(*T*2I_hB2EL51bg4f1LkP&be0lgf3l15tB)X5JN1#T`CAd#1I0HDq?k z)2Sb0BE~75G^lPNmsBn7y0Ph3`uAbl{YU#P>yOAX32hZI@eeHx0GfSqKetT-KZn4l z@yT-ng9<&Sl2v@USkFNjt4B{1g`e22Yd#jg=!L|{D*NpJ-H6_G(KBuvt-K4TZtRWd ziVc32j4GFTK~{+v5k!dBI}-AS6jzQ4M zA<0dDoEFzNhWz3e_LVUHXI4x9aUEF&aaI>>)6Vc-#m&^gdgmnX^OP{hMiz>64>ds9j0f#bu7 zMl`0sV0C?irXs95{A4o*=}PdK9X_1D;he{;qP^bPwG0>fye(i+p+)K&_Z+q&coNHZ`f-Q zhP}gZ4%y~w0*zAsHim{JX3MynJ*uX7qLiNy*`vMe6x`GgaNnztTuuZ;{WLeOR@HP- zvGdVPHg2|6TjQc_pFX&QDVGzDVTabUEg5Ns(c*dz|tlS~Km3genGg{K+V zN#Xp{2U>Z^RWj?q^M;J7$?5&y?W$JY4xOt5YB|#*0-q1aLYdnBYYIP<;>zv&A;GAc z?U}K##E{dVe)vlfL-9DLv3fXxIFCHLoo6icQ!`jFLjG6i8L3-Qo#l?45*lP~C2=$k zWBh9ue_*Npm_{oH5vh6FW`!IHW_Qa*^qkrofg`w23Xm%l?AN@UP^=6v$!bh=sBmO~ za3&oHDP363dX!{^kCk-nZH&mkdGkXN@-Ok;A=|t&Hb!TRT1gP>LhAw7frZ0%wC1EZ zc*?op_|1E--`?s?LTWHvzfYZRshYa3IJaYgea)8`a>jur%#*OvC1<;_kFR46)=Y;O zczO2p5IQsf8OZ_;(;v2ww=I7C`uK-zK4=SiXlZPjvbJMDn44%jiu1UD(*9h%{kebn zmhEt=LsS=ZBR8$0Bj=AGi(cd$p$33CKsUW~04X%*3O;uzER)BvX?Ok89jN470+v$J zCb=v3_jQf%Z(qjnZc5A#H3qS;pYIhCI--OJ#6b{Cxw3^$GY87?&L+4GD*BbVAfKAM z+4^Trrur1lsP0D)V!P1)t#~HPO=Mft>HsP^31C}lMT4G1DYjyJF4b$?rW5TN%Pp>V zikH`M-JkP^&%{OH1ibjo3ajm|hMv07Ti96p_CosA3ud^?7D#+h9CY34QIgJ_r(mSc zcNA=s@15cgsReK|HU43dxn7;l$8B(%LVz{peWjRsv<_b6@Gs}qZ zc}VVyh|M!~TB0OH`zS2b&lQCz-F@O{UU?ad@UR=F&xmzNI$z9EG_Gyfb?NY1i~1@G zm9D_}icqh#FW=|v9d<*sB(M1RCq-N_Q@pC@o2awjw(>5^u+3BkP4ne1L$Borv4A-t zTyD*$Z25Thhi{Cn=)G1fpmJVqG~)Nx`TaSM{Z6t+hx@zJrE1A?3O}>n``_x9CpaYG z95u7O2kGXuTu*(?>*f_7jX0fEBf4E$9dbNZw%lQ>&Mh_DUt~{A_oN*e*N@3Vz1;|k zI4Hnpu~mMA7ati_S2ZcD8L636@aR#lZHV#|?p8d>4^|V(YRldyD0qCL92k_ z#omb9-phIIND2_aagKsA+6Rsz*hUfU5Hb!3If*c~$;};lye4t_DD2BqFR<;&xYp{g z)YB>zqybx}{&tjAVLK`erdsONFKFCmw9T6;l!!|6y0+Hnt~A%|BMTlbENr@mV7HBn z6*TdCG6<==>rJjV2SE3NhSxX!anV;rHS;?HcI^{x2$P&_S`t3RdBl@ODrObTcpBnI zvXq~UlU4YnN(dZ2x)*n@ak!QX7LFL4>QTiS5tIjwC>9$f=8_T>ZZ8Fkcn`N5mh6G! zt5eQy$SbB*jR(CE--?A|5nMhrHTuM(rf!#G#&PNCn}ZXEq&U!Rrro;LuROnV`-kBU z8gNCza)w)EpsZcJlBShO%6lmRa_LKMu(}DBE@4v#7k6`#nO1{KO75X27XuW;DrXm) zjYVTxs-yH^Ms?-H0#C~GW)*KmEd+lT5q#n^nl`kRL)?*lN1uNBtH z%vl(IO7_wmw7!>-D#gMov88Fk#cKy%Fm}|k-^g?%i=gmG@b=;o^;nq(Z$xn?$fe21z z9=*gYZvC9l6DftohL}t#f~87rdaujTK%=td$N-`9deSX@&p4{yMe{tcopR*5hy^!TXCD{x`Q2sHv-xH7R!gF{T$05`HhMGs*Z9Lm zNkINP3@z#KzMUaf19E)=e?8JZAdNr~tw9*FsEWT;+rss9G=8A!i$b8!e?oB;*x^vA z{a<9Hri)gp`Q#4bmU@!5cQRZZ@ z8!Jw@o6Az#OS6==-H|Vp>0Wz{Sc>Rp@oI7W{Iy!9v{|Nj!sb;R{yy1RV(LISBJ(wn zzjsQJ_D9_Oc+A76UcCT3-3$Q}NZa|E!d-sp(_4$LbAQEvs1p?Myb(|8$K&`<>hqQ` zXg_@GnCkuqjU)Ym6Cz=U7o=8bP~tRmbi@5lIGzf+HRLAY%Z23gdNAngLa*Dzm5f-R0XY~g0k#Q zZEo+HLdA}Hs;&sWqG4bxemIubS_#Uazjt@b+;O^a1-F^qT>oWLkgbr?ky&19znOR2 znyW~FvOh`=s?|7nmix-Hdi89VkjvABkfdfk;(nLhmY(((2kkjSWupI6Q~Y+F{)i;{ z5(=Ix1zjnJs8j@TL*-nl-u--4dukXfe3T<0n+WiZJ!@2HDN5(Akv6_zLr-rBv*XVY zt;c9mK4Hb7>QUdiwXfQR4;`0{ix6=Om^(hg1Q$=eWINUrpT{Sh6~%h}e2wZvf>RWR-~YhV>?wuG?}-0S-52dl#O)raQHAwyEob2BRPS*E@h zZk73boJkaEDS8dJua7ghi#f~5rG6mE{aQYw9zvG_FLKZYmI0c*LQvVkKVaSlK1=92qb|48^}gE(6#^>VUC&wK19drYNCc230U-W-^uIu(fK zjmW5&m6sLVLCQ|4z_*i(f0avDOvkjRClTUKEsoe!n}_TA*hJ`pXkJ5CtfoR=AG>D| zzA}v7uIlFgHK-t<`d64`ctc_=gQ#HC5Z*Jjq~vdcqsc(NiTyyk`1hw7He@M@T!FUn_WF35aKt9-DL%aeeOF{v563h7YL!!vAXFZ zcWj=b3S?=|?zf`udg5=|Q{nr&y7xVFRtPY;UcymUOVR-pTvLOoZjc;CarsKyX8iCn zmVH3y>EPZ~tqrYU+U(N2*D6fkrNTdNd!2zln{&I9@W|;2VY@)eaF(Cb){O$hpazH= z^su*3_7q!}OD5P~Q_^`!X3U*stDD@TbOz=!sNPKA!GosP!3 z$qf@DM5p!jin;xr?{B_n`pC83c+R6q+2i9UOpSp1QF0q6D*TTpT}d6lDcDKN&nc(7j-h;*v(KXjH|Fi16xK+ zvevoEw#LAq03PNKYGJkJ8LONG(t4UnosG2QZBhUgjPXY6(7;f9o3QDfT zr5%-H&(MozqQ;fb?JIC9&cVv=VREW#9&hS;<%m#r@KF2K`f9YV`M87lvA*MoG#qQ(y86S4LVKLV4maz?~kC zsP|IJ{fQ*&PRw9*Bh;wY)ye*qyMKQ9OTyF|82GtGnB+0yuyXTMgeB5XrE`wUWPkOL ztu`zp>fedh&Og5W$5yIeFuzMYnDz&q;vUDg%iBW1bjlLpM}1h_m5Lb+hugfL>B#}p z%ms!A^Za7geBy>PH+Ipfhmc!2*Jm~5s3}EwR)4|Hv(C-%vF@I+f%Fs~makL+ zdc?U?Sj11&-MVA#C5l8mS1WwxVf&G-DyUv4J|WO4olZXbc=K+TXZ855Var?U-bRMk z7)hYj&BLZZ18&cMUy8JYMezrE%R|_=TP&1Bd8N1`HjV--K@xWL7339n16}{5%5R)k zLOaq>atqpLcVwC^i_Gt>0iNZO^0fWT=^o{fhmD5b&Pz&pKD?3gZgF*PIkNsanF=pI z-da)Z5Sz-m8I!54*&@Q0|CZ;%^5x(eV=XVm|CW?)m*&>e8`V(NR2ER;k9Z4jJJsD*O8++DW4f)n02f#iXQCX_WX{(R%m6yx5DjXF0{eRI)Y&1skPIRa(DR*d}4I_GH(a?Gmm8|;mD zd13YDoyy6lFsTIES!7xie#{)hVp}RKVNnQgKIu>vdwM!sA>sPyi216P)HWts!(TVg zd??&v7{%eJW(D?;c9he^GWA|HJM+3nN5js-l!fin-Fm)0ZkCnx!umU(-G=)qm&978zq)6SAbgpvpo_gDXorSrp4 zt!Ia9O}pqe9lYBsbEE})6ZF~({EZ?k^)p-anKJ!xaHfWquBI?>6r zaccR?v<3xe@cj~pwIrsYG^JS*1Q-Wzbg=UK^aak+UDx+6a$bk8 ze^ZCm@r)b%;Q8d>qzgYspHy*$qIkW4o1A86pU+ru@VuHpqa7x4 zV_|9QEWz(qk#&JnNfybu)#qbHW{-!(De>xqahE#yXTk6tlQh@stAaZpub1k-($Z!Z z46nV#nU?~$dX#(-^8HRw7L@Yku@{Tc;9R8>;%VX+R9=qi;9`JAjv(<|6~b&Z>l`P5 zT^Q`1d2-rcE^Sb1L}<{Q{N80CuvF|e*dbIi=i^zsVeU~$uh-VWbtp0UBFJE$@k>oE z{n;B2k)V)wKMk)eNw{;E?m%K1>vx7E!js`N=>sm;VW~MOBMvL|Rh{~eZ=N^RR0>K6 znLn?TA5uFw0aDz@XAoeTlWH;}r)+8=vp)ruB!uo7s#AfHtM~_Y2sNaAeR$X<(GoW; z4($(Ceyd(zyZp2+6R;^w9_0;4X_%|J0RBMAt!1TLIY?o#nGpjo@5J$e6<$bSE&U3i39aZBIUgyg~v#VF-7<)+x=J4 z_SBVqwz9zb8jWZ+`;6Xw%zoa4)K>*ZwPD2mNFB*j`GdI}K7eUGp*GaNpro**cyQUL zE+E~hWyCteZno=2eVj;jT(LEM?{{&96@H5OYD2!%FFtgZV-CE3h*Yp{1>0+OvAJK& zVU222I)(&P+OQ!Q*J}FKcME#%nj)JMrhXsr)*Y#Bm%0LD8Dz7h|0Hjt6*PksRn^Y^A%8Z00@*jJ}=m+j3DE#UP2q$P6L92|XfZ9AT4cCpkY zT(UUkN(MMP2qdZ@#19aY@##ZT&kTxXAY^ zt})(oR!iGF9-hJwq1m2^Ydw#T`-22tqu;vG@>aungm~B-W$oeYmbQ*)%}QnJW=r+g z%0&jw4Ay9~ie02xS*gA*auT~5RoymHt+6tC6rXUOvugh z=lQi!=S_RyFOJ-?`?7WVB6H1oc|q=ucm9B4_8-%bxPl? z>GQgqG}Oz_$1_-zegO`Zoe0j)_ zQdBSpz?FH{Z5KRu?R-m|rf0K@i-`|S1lEV8fjMsP|iN3}TZO+P6cb!~um5Ybu@y;qr z9_U<~F1@=K=d5EkC4TGiVOO&a_6#tUg#Wa8Zy_S)EB@Zy_MC#vI3SO5^47g?NsQ|a z%UHyMgK}pm@lSVCy(mbgHgj;pX?S-DaD4+j(U~g1)X>xwmhlhBL$LvNUN9;)Y-4E} zwdBqReB{H-VXT!jQEMyXWR(~@fPRA_d92cJg|{BLdmARYpeq;H*LJ^bR|@=xad_pM zF55ipv{W{8==*&rK&A!6-p9z_Jrx0(%G`|8}zjeL#%GIA3c_%_Xpp)v(ZN9>o z`%QdFgi?-M4@xQZe=tG`s9jb{q((d%lyLQolHuVs))yCz}!m*J1DpFS#9)LmTdz_{AH%22#E# zQ!5)Q)mfvhk+=x+H)HWrXu_4OKct;2+eKI3H^yIO-iQP?dEC*iEe+wQc(;C*TTwLj zNDa>e(Z)2RR#oUli(zHTX-(tKGn$u7bDNy2 zc^;6IuD^A*`bq$i#nYi78AJkyfABr7r0K%Ov>^=3syKg9gx=lk1AjN7prNe(K)0}s zVTjKe2qGP^-%{yN{*pIU;Q>3`;b(}_J|TNB;U-tI*S`}&nPpB!{Y$Neo_~r`t!7t; zkZ5Vb`A)l|`R#4Dn!sD$7oX!Y(!Iv?o-(h5YC?_10D=!U@yo(up= zx{zE|=~@`HF4uuUu4WJ8OdpUAGpO$hn!BQYT>1-Ne|t`MDe~|X*)nR=X}`P%CgI;= z(-nXb`XksR6EKsa?05l$`VC~S+%L6Ya8V`O6?U_7j!hZ&eGOXib8!S+U`zQCUCn%P zsP_Bi+>$Av;Wel;ngA3RY=?We3?t1#w-A{dD^IRG>Mc&h&M{3D1CEGbuy_kbDDrKGwxjFHyrv~-R zg{!_bE6ge4Zl*iBiDL7C{+=n)OpB7}K=Ms?&OOfT4UcK(D%>4(kvyUXYepw}xNkY# zvu-+8`P<_^h}bydRs3NDO6zN4Gx~Oq&}n`ohF3q z4NZJfv6V35!JG$@7%)$kE@8vWT^AB_8KE?{E*PWSvWd*? z`+NWXh3)-%zhBSuJm+z)1nf2r=$Pamv?s)#IW4tHiYbq&eB4)j-bx_b|6}KpzqAK0 zq(9|vP?us^m6FBonH|qM0iD-UvY%#q-F5Q4(qif|YIOS>Z&+Tewn-Kb&meY&i6u6l z&rDHX(dZDfmFhRKkSuttcCcLh+iI=fzHqMkZYw%TG!n<(ZMEXJGrIK;$rhq=%eK!ZyAR@D>l3r)`<~uRG6j(fJ|yE}VGM0~04dUk zf#6rnN4%A8p7>MwZ#!Ydt=J^V0BJD4N5sS2e<)P82&%!^;Q3WGKmT26#-KNdqCQBj z^(!mj%?H%(>7BK1QyS0v)4-bDAzS9ibPTTMdYOzGZ9rj6TmQc*1K`6b7%S~B2GN&M zpkY(&ih3%))~@ks{jM;qdW3rFZnV*dL(8tXXW`NqQ2jJrA{tM>3)n3FcdEhI8@TnyJen<=xequX%YWQI__NDvcA&FvODr2l1;&uZTTzE7 zttUOGw|>T$p1rG1*ATiu5T1vYLZa>fk%r08lI%Y=?oRE1i{MRj^7?W7bXdjS;B?%) zXkNoqJ(iM9_%pxMMJ6<=Um9xP1?H4^aH$U|gRXwnFPTVdhWLyX4`D3<|UwqbsjY3d9k< zwGceI)@|($Egpi05Nve8#xUrHSksgXx4Wj*$b+_CA^bG~O5F^%y83K@ESQn3r0?fr zUSm6f_A0r_;b%@lmg;0Z@O&^YF*Dn=V{vQ*A-u0PnLX{Yaf<6ard9q4c}{RQ{`076 z=`AQn?nvu7)rA?+VD{(9s9f&+yTd-A73gshBW3D7V~86neF?~E*q@OIO%%Ma8TIkX ziJ|2KzMvZ#11%;CDZ9UJRjPx`F78%!ZY`X;M*E%VtA4eM3+9Js$4)H>a1pq#!rwb& zMVPDgo_UweG4-g~)TF&Cw|@G(`=^q!%ZCnf8q24H3p$xafAvB{mrae}EhoMW0;EQH zq#{$Z$kSEygRra6uP}7`?wG?&IXpXc7~7D6MGprzD)xl$lB28ta3%+8||Q(1cm{=Kck7v*kQ0n*h_ z0Vvju$&WSctk|&Q2$jIm5IOm{Q8r_|CCQUZF|ISVjtklS->IqnEz(}izwtxa z9|m{h_ctXcH-fJ^(jEih!`{h1Q4xDJKX>E1NxMdWe!PtgYrCU@__*3EN-u-M)n1ml zqw`L>;qRZmj>8wNUAy;wPIG!VX9K7%<|&$C6xq&Gc4h#l`)nZ5sAq6VO}%4k-OrN3 z@P)7ey#QfH)quB%DrG{H;bdhmeuySGT5C7(jkpNfTP zl{~UG2hUVX@q*wY%6`@iO}88fo~D*Y+3Yvf@ad2>A^pzjay*sOENdZHaiO21Ffo;r zl-Qg7b&-ksl!(yM8(d%SokljDr{UyT`8?Nug*ECnC`n! zqRn1Nev`7&;+b-v<9S%-|4x0fVMKeWV|+h?Ywm&R9w)|4-U9>VB^k)5J<+*Gb;=(; z*<5$ua&SIBB9&}$9Ju&^tU8fAol){(U{TFRP0n^AhWq}Mc<|g*31MKcxH2kCfYhz@ zT?bQmxXd>OQH#+Xm5Z?1IU0p^+pmA!8S`RVegknxlZ2!&Lagu4&e)Eot6WR;m-$G#>S~)4ZFW+wZb&WfRrDKZ2S&M5 z3r^Yv!pCIC5=43O%)x+0v-4Krn?~-`nd?=rpN|I|9O~PwXk4E-GJp@vaP=^>IjqX!MFMQ&1`M($4US}|e zcLHqqvVMPi^DSsqo`t$o9p>?t?S-0CyU3RUe*>a{c$T#u>^Tf==XEt?K<8~vogDTk zTJ1YGI&7bG%Izn20(!{uE2hi&dRV7tm`5fYtM3L(sai9!NVV7jjhn{+(2n@en3^XX zM0aUcBn0=U`2^;lD=4EqsCRdUFEu}vIXJPgshbxR`9X}0eRj;R7B)kKg2T%5iJ>?P zzF=sx`|T57Oc-aklMY$mcgOe@tF7UaXz-|JT1!dDC!eT`v1O#r8XKf|J$to_7X7N@ zbRjcZzX-MLR4MmWfwe;B&-3!_=mIz7b+W#fFpin=acPvJf0_#@)I8Upq6?aHnK*tYJ( z*GG`XNc1wvp93X}DZO+WJwAPSt}`;bVsT-V!#GsUZm&Nv z>PYMUUt{VfcyOA`CDOE)Jd9C#Fw5;m7brvZ&0jTEdORN7@J)Zk?jlNSHx52JbJUBy zUqR_6MjL%f{^+&C{FyiX`&f%|m}Pu=H|{24O&SI!-aq&C>20^QR#$OuAyCyhj@jz@ zgH``t??bkprU!o;{;7U?n?&XUwOk^@iKZB922i?!O|y!6WYz|$^Tgo53|u;_hp8=M z1rC>iSB(_VcxWv7k(_KDu1y{|ipE2{>vI~^7Y-2Nk|0X+N)->^*$3zBH_J)Zx>R_* zqcfD`*rC^6v^PB-=UBS@SM_tt>E}s!jjwQis{~@Il(KCA5ofuJRe?9@}UJC0&HK~L@c|S*3U>yDnmp3 zm2C9zxy3Ca<2}zwt}cRREHSU5J)13GdNV9A^x2|oziE%s&MwDXg@p-I>y}d^nrRmY zdOrz#Bg%+jGB>w^d~<1}M@Cvj*h)ZjD0(i*w-_H} zC9RUzKxuXr(i`zYO-yHKic_?O-& zsPNIJ%<31?aHsVsB4^3tH{8DQ)@*U=?5~LrkPOwYD&I+Ib=_?6uUyar`qR21wW?_{ znD1@K%KNzk)Gg_dmKpVxc+#gY6`7=I<_u9#+P+7+ZlYq|;H(A_yyf<^WhGpXJNw}% zE&kbWl*4ZD)w4YoBrc_#(Th5Jx;`6{uYaNxvt`U}iW1>nz)ny>^|h2YuZl@cYNH1A zAlllrVMY{yH`vJ6^FVqYmdo)EB30*d@3DvSnZel>hZj#jzkj5Jsq(U$ZlM^s+|obZ5%t%8tFE!& zqtujCQFMgqcf@(Zi0~zXsZxOVda`l~Yo!^9&ePAvQ019ABC%i!fWGmC{oxr6A?tU@ z);(S*4N8va6-p#w>kKqN)<7-VbK1Xs=F3=C$zMPDeZ?(>c9}QbABJH0^Wb8VaK5(Q z3s-}_lJ8VVypL-=WaCcJQ3~kM5%$cA`<~M?2+>27Jg|yR44*38`1(^WD>Ff~&P(9w zEjG>l)|k8)y%>tz!u$U&IzrTYKTPXR-|Jsy*SRu8WG)R^44Dk+G`$?ZY?2wx#q9vC z)>H1=-&=qAT)6ym86)vj?dsf4#$MC2U+it8YfQ7XjgLAPKK#5g5M`rKOhKD3^P}Xo z(^36P#1rde!Gbj^dlM;@4(LuQkH~DoMng{QZJh2v_>TC%F#Uh0KpQce^ibOhv$|!j z!R#U7kt}kc{;b_#*hI$7Ik|e1%KWwsHj$6W{a1anN~!KlR@G#{$uV;+1Aj=rfE5Cq zc5U9WnN*oI;f*Wq^6ms#-W1WnA#iB6qVt=`3vaH-VW9dsNs4Pi%5xC?&I|)FM-E>t zWVXa|g*P66QUaxCcYT#PCl1>+QiRwYM5XUSlmY%?A-{=Dg8APQV`pNpLB;ezV*^h*y7%w*e<6d%38e3D6=&J{VzYW* zv|&1!=7{1-$=Dj15#T3s-tKpM&J6HY6>{V9 z2DvDL*Qh$w#{o%(C`VGR6KSH&yUv?rs`QkEURqEN<$0(KZV7v`$(^s7_2VqQ5U{!` z>F;)Tm>jeHJb5dI2YNT6YM!oL3E@T|(k^}4H3}|?Wlu7ydkFI*xaLR}a24k=;+8tU zw0&bd9qp6;=VwKV-~1l50%*TFkgxs$1BK)ZxY8Kk`z#-1r zI9KVA*SNW7Y2@#o>W=Ru8oC%J!f58V(?QqE=_Ncr^hNMLm`*hunKx$OvlXa;PbKTm zp^@Xl&%Y-<;;1dowAy=p24Y}%Vjt<&1$usB+n;gqvjFh;%wC*KP@T(n)yNGK$T9X+ z3UM%2`C&xMyJYJk61ZA_D$%okQquC8pWJ!8e|;OIsx}QsBpj4tD4vfa5MI^w)FFtm@0m*3a&!~^BzOm|4!{6 zBehkotk3NjFs8|Z>1W3`*8h>Z%gvm%&ihN)A&S=8Zo4Wu*P7#p8A%S``O;dFMUFls zIgDikcbjS4$yh}YHJb-sWX1gM(Mm=qyNY2s_W>a>??|F@vX#Q`=`T+57gD52lb2H$ z#Yq4yYVbWcRjlERxU-Fw*Tkd1Ow%W1mE^v(+9-87Z+b+$9rAa_;eC%osH|!Gsu3Ge zDC%P&Mk^v(A4yt!$j~Lr528Reu%1$~^>xz~k1hbd^KIP*hW@GPhSVwDkbV$p=yo!k zDqNboi*&@Pzf2wFqGrq9Ea>IKI$>TVyD2SMxmpr$;H7Vv5YeKHl1YyE#*3nuR(N4| z={-bTIHV${A1)ZlgEfMSNobjS$O+e@pcNzTx$(-1BIlamVzs3tJ}j-mVx6r^#_Hph zxA}KWX3J+YL&n}ZvyA)o`bb{yUeM7>9MLsvC2PP_&T&4U11zN*Rc;DyhrCdpMss+Bk^rn%Q=t9h1T z`|YKru1v995J&Fg9_1mA!1PE%SB|&loITRA7{(BssoCVfhNw5794aD?;-1$95E)pN zqMg1=jvI2zq-A8DbWT%Gu6TZM=fj~NVm`5{LieO>gTl2imSWkF zRVO^+yisf&f4Wp!i@nXdq6I4Y;L=@dtNfNTexEhkhOw z@Fm|jy@}Ledhw#k^`OM)=bBkJ?pX{uXJ$#uc}G87 zkQ-nZf5mXhKh;b!ta9z~TG6;o?T2@q+pkHbHLE7yvD{`=Il~Lu-f#XPne}FL<}l>z z!S%Yw!Jcy9^s7X=+^(NSKbsCH(vq`SbTQBbju3 z|8I}C`h`-BGl956!TsjQ(cS>CwHm z{^`K83s>5VHxap-L8D3Z_XSsM z&z9gyTr_?@ya-yopLlFU%iVf!avZ+|X>{s#sG^S-;RA|W`AFo{0F&h4>IO^4AH*fP zg#baHh2ZtclUMrjk4pY$cOQJ?BdeH0tl)UXzy!)JHcgx zXg|l=0-rT%oA-N9n$@UwGAGu2NCNyTfV*`6rJm0{)pY^I(E-xqtLY&ph9#(hz@#Ai$#oY0U=xk8leP~{3U^=|`QQ@A0!0L*8 zf{;9EZ)N}Qq1dLZugf4ta1H{(M21Fr!X?KV<*Js{zzRln{94E?5;C)nE)=cBg^7rE zVsG`&64kEx_$w9xVIv`Rh8a3kT5uf8gb~+KFn?@pHFTeuApuc>?q*xQD* zgyQl<Gc`Y^_+2!FM#$AT8mU$vVQrlJU%nV=K={P?frLk58 zjnv1UbnX5$7Ex|vu&6t&#l`_w>fJKaZdF~M^}ou0$GURb$myewF#NVkUMB2BR(YQ& zgau6K1Ti4(hh%hIFD#>A2X@3;RWEnN|T3=rT}Qy z=yC4XT92?;uvvE;0|+xS#m3XbzmUPc-ZH*-Mjd&@Xt1Ljn`oPtzm^L>T!}SBFRe6QR_7&^3>CIM~)3G z8AHrEPV-c`*hhiP(i zFTtvrD-%seh0Rl!w@zJ>S>k-&a33rF)@qTt9{XBttjnI2ya3$8H@$4cu%tpGtC10Y zEyi^+QqE=LVKu+Ym7CM#{Dpr@a&zwiTf{$6$!C6n3*I08quuMaJmp||DQj6iL$L^^ z{-t+PbMR|(af`IHBnu;J;UBNY&7y|1%FAmw5a!y)-bO4- zKOgxxk^iiu{eFhwlME|HEBw_^0R!4b%Q?bJB)Q9{Y3Lwuic*fL!x}zS{T1MdwJOgZ zDpV|}8MUR#U_9KYhyWbM^5MpkyS{Jzm_7G5I0jZBr9+Nkfgp$US5qo#G;!^0fk; z2Z?Hp!R030xVwQiW#<;dS7ZJSoL$u! z@Sef1Esqnlp``EnjnXZ&(4wnq+(V>vS>RS+V<6o=R!wN4w}njqj(*X~wx@_3ocOS^ zeI@kKxgtEKcczbP87j(tqQ>AAMT1h&qDmIZRnDptzIM+)tIVBeMSRFCG;h<{4a@fl zjR=4a@x3bZ6{PQRyRkGbqN{GiRVhO1wTrCH-3(e|>*Gze)$Xq(I!5O346Ay~Et00K zt|q$*FKEuLUVoH#-D1{)wU#13uuwhvqP~i2>XLBIr8n2n{8(Lmi)w2vvi7XF?DHh~ zOG{&>;ClEp$gz0MdElEoUtTEgo3JIF7bI{Nri2Ufnw`c! zE)H({`JR7Z75LM+1&IfH*PaGT`Lx}qGD7Zk^9;8Q@io|rm^rKju=~`wxbQK2{$=hrSM4E}c`nAdM{5!u-tgB-?KR=9YfTy>}slNL}HCxvIZ!*CUV|? z*zw9oRzLVdeby*pvG~z)<;tLF>&xrD_<)A^6nk)sFKF0(A`>oO?mSI5DP@P%164vb zGAhWhhetJZl-o3o3~Px$-aGgsqER%X%$OnEfW0j-7Lm>!K>^*1g@h+f`wmG@@r=4< zP%OgTtA+$Scvq+&8LvFZm{XAY{9sxs&E@5>hM_C$gixx+U4AIdud>1wU)Vwk@i?@I zs@y8H?Z0Uv{v!F)9?Q>}NBW8&xw!9HPO}9(Nvzin%`nR$F z%9{bZ76-g*({6qDjVIN4%r-{SRqg1EuR0Iko(nk-&LL4x{CIU3gEPtn%drU0b6yE% z`ZSH}VRNv9E)$#=C|_Sazt=-0S0`mS+m&J-xK{a8lFb$X6x{W;8`dHCU5|Ek>s#w@Lzg&oRg)?*c67 zQWMC0eOyu8R+R2=jR89+He-QT(()B&khb@-1$GlMtLxceT;BU6zYfElhq{oO>~yfI z^AbP&o^4yHhBQ(kJKWK!TOiH5Rb^DaTHp+CwsC?m09Xk|s3QR%Vm4r(5shE*=42Q3s{3$o|gpIELEehrS|4b$@>_ew>NxbeuXs-XHb!(9;t8{pM7xa3Qy}*WOlAPDJ-pl0%NNsXde^o$m&0gvBP5!(va-Mi*J4i@fheU!o_9XegQH`)Zl&@8e#T>oZLz6pU(s zrseED&V%*c5PK<})c>85(SPTX;nfB`|5WXu^Q1RL4KDe_yyxd*cg-GSanl8l!^R7* zornwlwm?e4vn%Bp8ad=WT)HTqHTF&0g7mLDFZ^UM!7XS0tk@VcNMm=}dVHA?LHZu- zBBf)TzUAiO!bc6C_lO9MjI~61+7kG6o7c*N zrZ0(b9o2aTw|*1aF8=LYEEX~2M=*1GQv3ATQ%x)-^zIAI0sCb&tH?0yt-Y;xzFg9> z9%~oCbe)LAR(p%+7xU6rUf?#po4&rhzQ67yPyg9|OT_LniDHjwloP(aNp>Gf4w^t!)}jG9He-@TIzl zDjSyQ>B+bt`;9+8#zdy&v~b0;G8RYH%|m0b%B}*vbBo~S;=Y=GS9zSG^aS(8tj!f| zIxn^k`bdK`w3{_dHe%cqDYZ{jp-pIP&q(eC@M=34`wj`EF`>&fsQiex5SJ5&oUUYV z$skPY0AE_Zb*#^a2|)CqxqL5AMHF!%qR)7S@T>-ef*jrl4ycI8Y8in~@4mb0cw*YN zV2#--)E83TB_CBQB0m(Yz=RR70d-d~U7%6UgSHQpY*9{BA8wDMw2ok%L>h>=f5ba3 z6@H$PKdK4Dg9xTHKYa?1oaezRNph^y-RdE$3Tq!1$Uy9VLP|x7hS)FB{qFGu{urnO zo*tvXMLmigj%U@5h5r88y?1M#k8*hCGkF@gi)9Zzyx)x5<@pp@q(6mfS;Tp*KUC_V zNRqR3#6O!_>pb0f80yygq-XDrq4Df{B;mNpHOhVU=rxzYc4%C-@XUeyNu#YbNrt#< zZAYaDI*Ia~fWcvPA*#A+j`m(TQ3vnL8XYsD7BR2HS><4(Q~WxT9osOCQQ?Ctw+#O{ z;&bAeyI@!A?l`2gb!)`@VtV8!WcGthXG4!n9OtilEDev6McAF$)r@Wx`IHjZ+=wuK zarT>Yd09^FrQcs%O>^XxbJVK8)tsYn%L)^9J5%hH4VZZC=Y9sUn!`Gi;QoQb);q}d z*16WHFIUGLun;-1!f}4@Cr9eJsmErPPo9af1pMkS?Uwld&c=nO>_mX9O zTUx2JUg{%4=g^H8MfVaif(L{=FcOOja%UxvyszA%-oJKEc|c*Q0iQu?*1Um z1WwOu@X-re{KEx5GIy(dk|8^%=E~B&mzqZYe`qRP+PjatiR?W*bVJDctdxAJ257*9 z{+-{#YOm*_&o%o^&WVMaLXnzt&sQ!`pu_;#u588SJ`5sSdfV5W+?0I1P0 zQSaRF%fI3fQ_W&0os_$KoYH5c(WLDe(n1J(QXjZyh8ImG*qs@f)!ZktM;&QPBbYGb z#Rk;5$<7A5eNT~6o&-1hUa*q7I}@rIYrY{*724UgJ~B&>HB0drO)pVn`L^ZE3GnwD zkP0^twUYBKOK-+hu4A^`?rlMmiBK}n_??iAuRhJ)1fb*k^Z^8TI8Ju*yoIz7L>)Is1;U4F6F99E3qL}Rh8WpVjp_&ysFjv1hq+b-n8uR$Etw z#rc!acruyPXR6_a6V837&dneE!$Cmro&BIhW`$c*WeWjOzEo-~q>xEZO5@dId2Mo} zI({XBCilXOT~2AFVKN2A>-b8^bE{N`r@^|N?s!>kcs1|!)TQ`W7Vu{uZBSlZXT(ch zQbf#JivJXtxW;+&xM1`-bBb#dB2qL+Wk_;;yp6eted26MynJ>yykD|P>?t|6VnyS` zBt6Yq>^=B&C)PklQ9iadBmHhheJJEkTnS3XK~S`zD67sIxnFsd^?BkXA`sjx=8Gn$ z)grMXfvL-p2zIQ8InL@I^X{^m96OF^q`K_|^PtPILz3q}v98w+4?yz*y|ims6&=Vv zqoAMv2RWd*sDjU1S7t!&jo2tS8z6`C3p?>H5wbn)s+TvB{Vr{c)OihTgJGH1*FyCJ z2cSSRtWP@jm6TDs{V%!zO?t=%sfHF4p8AD0@yt-7rmr~iX{*UcO`ya4& zY&9pBUVNM9veYp!=H09Pc4q&#N9X~pS;d4zT}yMjR~O)CFmR!flV(`WebrQSTFqBm zY^%`~yu*UO344zrE&g5z5s^gU3zl{beeI|Fz!ihVS6tnmo|^_FRu;KzX*6vtF5w0& zaQ{dvWJZd$&9#mKG}C?6@@>0S*t5S$=~wMsgSQ@=UfYlaQWDher zD4+6Z@@wGV_LM^o@q5!D4by~dL0)NegnK%auV34}UiK$&egBR#SRVfS*;O=rE#wBu zBNjLE&X15*WYc>qfgX~_F5>0=W_i<8k}~FOOc?Nplzv6fY$8G_?q0(w-6O6WKzm8Z%Q|zaZ&*gO5`3DVkHnm@k> zI!H)BgFasG%-0r`NAFigeic`a*>D%kxY_B6%`(d=;U4{@IUf{S^M1*Sl{1*j%>&#z zJmhXcjU>&3(i6L7RrF2^#U*(u4{_HMnJG(BJ~s6<7MCZN+YE#wkV4g_@8Ipm7|kuO z9l2Ip4UAzm%h$&d-S+f(da&mRF1VZ!IkRjU|b>DNC zJTgn=cTmOy)&`T>2I%0kWZ(TxMhaifCdV+ECPsHDF2{HHh!qz(&Pr%y`VT!!oC7LI z7D6MD_}yTHcHzaN=uCIVA-dcB1ykN>7O_Y!poQ$-52#Ykh-ph8 zPe&Mllf$WLRW&9JI3_o&K~QVbJa8~@0C~a_*|KZ*^$_dhmRJxnx*O&bV;)>|FD^S- z;E#BH%(1Cq>Q3hol3Z>b<%O2b#QQ}2^4b>P>PQ_e5cO8VsGpJbdJ^+K{u4aCrKq%P zX04CyJMq!h#rBL7fpNr@pd#C@(!THIh;ecKg=XwI=eA%3Fo4)8-B8&Ntdz zpFp=NO5gru;??JI^KQh?Ck8~_uYM&q1z-33Cbj^Oq1P!J0<>d#{!-@4Y@+uIt@A}& zt!KEWmD~tno4SRY4ju(;v8_^mc=-zsg}o_CmO=Psqg%c{E}VP+N$BX*TNSNd15&y# z6ORir)gadsy&llGyu?57BLggcI))K)-Z*8kDS>BTk2hN#h>taeT_fexi)K?V^l!>t zQ1tY7Bx8>&OU;86awk(1UGzUv-)Dz>R!LvX1-%rV6`#6v*?@oW%SG!84yU2`@~tV5 zl?na23U#?}#Tty#HZ|F7#_aHA7$$Mb8`cHlqMy$VMcfSgP=YXbdwR<1%!bH_i{}n+ zKt2$zSwHe=1QwCb!%x(>&ZB8yvW;75O;H0zN#td-tcOa9zerFmXo)b7kc3e1@UBDmWNMhQAMQMdH!- zaR-t|d*0H{R^7%7l!$A;Gy&KZAU{Y7;8KDsn9r8@;AAbrj_FF`PDvqI$kiMRQg!VKyT~9qnN^smX47ksc^0M znyEcfU~;SF8;K(||4tE!!5i4cT>b<3rph+0f41~&3ho3Qf-7wdekP|X#x zb3I%1re`-)GHb*2-?_pzldhea$6`OLQbzaY^4F-_lr2iR>@+Fuy8DV>qgb31i`=(f zaGNP1n>wM0T<&g~Aq$SBfRinIkpey>dcsT95Ft3utpaGc$G z&~|j^LZYOX^y&NO^}lB}&Eic6-Y0K^aP}2NS0ZDt`t!Q7W&V-8uV+GW2jI>D{A|;I zd=2i5BE$G^quZu*luM0uCKy;^)LiQ@6sRR8lji&88=Nl>0V)(lTZEAAJrethGzXd& zr*m<;K?Hf80-eFEV4%asYN3<#0EvB*{NkhJTWYKNkX%~Hqzc)%ljG*}?4y1G1UWPh zzo)C5j{6jMWzW^VZI}09{aqjyUHAOzZ*O(TA$qM>3>gy_qyML@crfs@cXa{LOZTpX z6PH2d6P?`9gp%mp!TQ@@t^j^~Ysts2;8rgOAj&iRsV{3)?1}cfH5Nn52$Z<6s&jE0 zhzq-As4h|M$rBCWXZmRV!839eOw=>rim0mgf;`6Akh`k?urRU0uc*Qif3|xO+NskY zaRQZR8OEjMVhEv~&GMS_(m9a|4kfGBke1U7mVD@g&n0UL1A7x9?_=)JcY0pv*}7Yw zzso(9a`Pv6Q&(&Qc#lEn8BU@f-tHd5+k3x)xR&-#I^`x0bsB}PZa6DhXY+^dt@)7R zJX_S|vxf96i}^B5GJU0e1lEt|rp^xVZVKe`c4M9n(b!_6EvRZ}k`h<8x{dE|jyLP< zk3g*8Lp%2LIaaVMM%U==hB=7_V!c_DN^Nf0_lz|pIc8t-K$w*{V(h7We|qwp=cY)N zz`K2)j8b1K~K%fQ>W z%|Cl>s${Bw)rEXpY;Gqx@SOI_ltd&em{z4>m3BwKx1WBPTUIC}P7eaC++3=bzwqHCDpOKkD7p0YCQ6|A&Hwa3aauC!K5Nt;+L4 z;KOqPv{BDP@xYnh0%|4Ks*l!RHMoL4Vf)%U$^V^NdHges;<~5*kB=eQ)T3NxN9LS@ zwt~g5MgVVC_J|9{@Kpm7vs+b`j#|$~otuA_ttMSSke>Lid>EDOuw;u#c6D99)^ z|9_{tXa*ri|2uV;ka9kEnJd0grP)jUuOFlF zwo2j9m`K1Wky}^2-H%^2@W5X5j1VI0X-4m7q?+XO!|Ee`-#PpCn@Bi8fOWrxL+czU zbqarU@R=lNgJEa)%~*25+skbC%Z@;{weDwboM{St&0(?dvPm<4%T)Js%0_(qwi0oN zpZ9$AAXps9o66Sq(6jMk7lIvl6P5&^%ELM=l## zMXYDwF=q#H2A&8kmSkGYmj`LApK?Iyuov`W(K*&Pr8eN(-m;Dqjdp#SW7{ZFTwB7# z`B1DDK`aENQw;RbNWi*E@aPea{6b6*eyybcgFykBO5LxH<|E#%I3H{teJbtPt$2!* z{c@ppN6ZtV=pmEL^Eq3shWwS*WYpD=8LyF929Gp=5Tgt$LVdc5xS+#nkaVxwWRD1x zozq<*^P%mp(iTNCqwvtn=w^L z^1S|C;xg$aT6S_r&U0ck?Q*G)x#Wj$ZIMM$sR+X~*!ZxWr~@yHj-6uP4UDpVgEx=r z6??ZoK%Zgvw;2YSzjVVl@E8zROnX;ijAQ@k@w}fhxCuSJ)%H4uO8SxoVD!C4=T1N! zjH0~bxLvvxv9tMW-)f69n|H+`8rACAt$|R44vCyN@%q!C4WN<==oi|J+tJtU znnj+x`5}OP^45)o@)pv7NY1KAk$;^6nMltbXTPNGB$&~iHUFkro}RounikWx)RqU%)?{+j>9;oL zB9I2&0=KoC-}wP0hYE^*Z=fjXv}YXj&hvxsscY5RFC)be;jcdi{UghJUytn@%J>X@ zC|r@f`Ba30Y7Ibr+WL=c_%_;+Cea$q3cYcgbMwX7lefo<9$0-{UwpoZ@l{vNKPC5E z;PY{D)_$#FQRpbu8u!YJeO+J1DBABIfASk+84}vuN(*Y84>d#Eh$t@;t8m;3R{eGv zjWPq65tcr26}F*W4g>1r#k2dtp@B}Bl`@eq9*>OEdig02ClBJdfcKO%Hn}9 z7&ep0R9=a__zZ7)L4`|g^1{fTQLEKpCkM0*jqk>)$WXXSau&IhKlfv)1IVIhj*6Lq z_b0_-a!Nw)B|rH@)vwmmKk>&tB+E^=&*6nxz=eQu%%dHUIuB&$j=V-Q&7@)xkztjB z4{g6A+{0`37UoINt;?XpxJ6&3y#%fTy}L=xMJ8=oJ*6~QCey^W1LNnGn5t$p{P@_} zg6T5|`C91DAGEC8nVv?PBl{S292^P-M%mRD;ydH+Y%9g(W&`qk@NmKMOb6MfQ4F#H z9T2+}bq{PZO^2MDIRQs*vZ+P+MaUl7%R>%aOj92V$#JVF^R3m%m^u?8D>f$G`mvn}JVzr~# zc>lE6%2q>T@+xU!S&SZQI;2_T4-(C8Sj1rm94SDG0EHOU`SJk?dl~DqDLLL8Y4}=N zCB9Dk{b2jz`tEx4`kp?GvsGoT&Dm`0IMbzAce;e9fjd&;JXARQ6C7_!mP;%`|qXg0$FdxGEe6+k;Rh|ymZ?>&3j@op}^`rDu&MO5Zc;QCDpmrih%S zjob-{iirwZ=bvdQ@hMOP_jvW1$@%PDi8uCab=@;YD+NMGG*&H&hJsWAtT2=7wo~nr zx;mDBhNT+^3j`0^5h>$j|T4z_v-%H3<89v zmlgv5Ef@HY`se8eqj$NdQ99Z?Ojv&EhRVDP$di_8zV?HoWVzo8vtXg?-#t0#aGq2hGO(FboSSeLTExl?Ilfm z#5l6`@Aj37o#q2}y~OnTNF&Fk9fjqC?2Y^TsJ-jp zu?Z)qjiQ@jkrzL*Z(z(lu@m(X9uzV!?+7?GpC9`8LsA=^3aZJjT!9_12`hdAPT}5Xw0Ew*Z@l5j1ZOM@di|k86&_Xw zGM_(x&vo?bI-LWy*gDfh7kF>gG5CD#qrg?rN43B+LZ^L9oHx)}?|B@JSSIkxTCpL! z@jlVE9VRm$j}x~UV)0*)=m%cHZTTOxH%fTwZrjnkww5+yYhn0))i}U05o;b#a5ney z>f7GIsHQzKAF4yXQ{LSX!Sj?pp6oa#<2FhdO$Eo<*Jm~&;;ZRFG zH{J-HqqNKx@7mU(@kc#Q6@j0%05gYVPIb@I{mQD;PI%!(;SrRQ_qrkc;G`~ECt0(l zEX-c`u*|Mt!A~cdMl8gCLW#O0KztAt8#~uU&*F zmoCVC!(7JZmP>M{Tq5@g z^Ljm>XH>??xcOS>b}UE{8CwXe zPqiCtZ$Q>vX4klw+@y&d)k(>%NuSseih_7kPGOvor0`~*A=l*c>sFg4OZ%q7ZNTu2 z%I$jtT!w9@A@_P9;>*%|N7M#k^C=`fMA&_F$;4$`^>ycf z2&DYGc8}iez;MO(yAR4=fB07LpD-2Zvw9x4eLND{-BYCy!y28$k)idxogw=>lDD?` zZn!lrlJctLKy7}@ADj=W4-vHeE`+U$3h}CL`J>(mivozkr=s7WiR*I@>2ZU-t*-G| zK^|Ax^rX3zF6r6Guul%r&J)e2PYOI{uwhTSfEo^!u>AdCO-?Lktny0 zM-`b5TkY#>pReZ*fU9y;8Nu~NF}t0+twa!avQpXOZI zmN<&Z@U^dSJK$I5lFCt)bZ>zp)eQ2wKgj!K3Oxd3Olnm5RC;>6TxyOg&`X9fqg~p_ zSma8MvQjcc+1eF*jXT+PO`4c3xs#zX!P_4Fa*H&lQPln{H^v+w1)Kh0_uVV!%W1sE z$>eEJyfo^Hfv3XjOwdrddhYsqnEC@G@V?lQU=82oxg5wzF%=XY(!OA_>Q)~s55pAP z4^5ECAyQgY8=94qhBL+!Qlp%r`wSM+J8m`9_To@H$jIO%IpQj=a=&XivA*02SdQVvsN)>n{2rn`bl-N<@k zybOQX6`0Ct`_VWg@YKyQ*gUyHW)XCg%u1W0Joeg#Zy2^%y$)d1jrGLUet&utHw(>77Sly*Zn`jN!U^TcK-s+evj+Q z#D<5;nI)bE)w4Mx2%?=-u%u7z01!w-Y~lSC=jA3OCae!8@tXmQtUjODilK?9ofYWf z$6XzJ-xI6topv0)dk1_Sz^Xo7SeEx}%xB`ZB7o~GP)Y<_C$`$toy*FCUOFiMXYd`O z5t}}x0eL(;03~N2HObfh@sb_Cj}g zRkYq1`6xPP-*?^3sV-slMHiIyj6v1=CqCUzmW93s5M(g3CFV5|M6(xT3vL3hUtB|m zidM-D^0!>irV1=`VbgFabZaeKp}nqgG+E3+`fG-bhJ#gS{w1WG>RT~;XO8V~^BB$T zGZz9vKk(>31)tHfpYJm6VJV&Kj1`o@^Q)bX_@Du|IZE@qUC=9s$O(&H7#Y z2e}@8%!*9pzZX`UjtdPHPd_p2D4eOHbQIHw;XO;1y=7exnU-NkMlv$WI@CS*eH}j_ zv#WNHwnj=o_>Vatw=%wT#RjF&-6jL_m};#1GYYx{H~%>=CrNm z)iZX=$dih%`xBDX%GAKUsXalpW|;XTDZ&Y37|TqzCVMgpiWZH{6FIEATSq$$T|7ie z1tdHnSeG9I7R3)Oq`9C>sYf8{VS21T(|&VDe|YlaW}c?povi$RyWt!Incl;S`HgEq zFG!)i6u+bkkd?`6gpRD9-A{rMdi!Dq%_Z=RR+~2imZg^w?1}IW6FD1n389xbzrUoa zK684Z*ZpG>ao3D;SPdt-rbP$W3AcDDK>wXUf8O^z_L8%}{^n{48%g#TYUul>W6aau z$%Y^}mbwUbENs&q0W%KVujv1{%nx^`iqFaSc ztG8s@sl;wfk;T*7ajyYBgda*p|KL_V$X)c6&Z4H)f#z@mI8Xmp77Bn3$&sbe!i=y6 zJ1HM*wvC)lJGs0gybf9(R7zxum5g4xG!XRmW?{+>AZXc&=~y%m2%CJ+y#cdb~`b>LEVx6J*f|O z#o1DaOfSJ2L!=y%eO6j)g{AI~UqjIf=?lZIci~@f>MWFWr?XB4H}&xMhPV?ksG&jQ zH(fqg`g2-u>s}lSSkZk_+ox>i6!|9#5&h-Ov0>x3hM@vQ{ct|fQ6R%8&%H66OYID= zEIG?CX7T~SBsU^yfMuiCKi6C-rq|gI}&)gA=MK0`c zb~mfXZrWV4PQMTZcamDDF>0+r?v-AM=ZCT73OQa~-|TuO1EhsK*=W|lRV~%9g%gt| zUiP1Jto$JE2qs@xQ>5a1`X2o+XYw@b5U{jFrB3!+^InvuR`WYt+!zR%gde8YIH4cK zp7p7hUjV)@kyk{Pr$k7R?VFeR!AO0<(vjbFJM+LAfxyq(BqpbGUJ$>YSKFN}5B7D! z=DJDk#0bT6w!YpD1=D^b;ARu(RN*q9r42fGa zs6q!jiWC&|FK+Gc!Hus>?f*zYKZ0(it6_isfgebmAJAzXCkv<}?c@UW3{%?Vr_r_^ zD+L#})109cR;t=Wu67k)KlAj$b%1!HRLgEGUSvZM!Hshzzt*CB13;n13fK z2uJ8FR-T>njINnMZ`uL>1C?Hz#GaU`x!`p1reag+khpB_iWU+-JH?D+t<-&7ID2Vb-E&Y-|=Mm9NL`~nV<`yzhzE~Kc;K!r4Qi> z&19eA_aH-@HbWV*xg4)s7U1`iY?D04t~C|03B73v`1mn{Eco%M$4d>qsQi(A+mUv5 z=5Ni&utOcKbmuFnHLXA!Ee25KZqkJPOMg8bcOvF?GGu|1}Vng1&8(o@u!!C;zbj# zzgK8|njfTm=%OnBC_Lz9;L!&sJB>4k#ev7BM*);!?_$Y1t{3m34U<+|ju-bkrM_qg zD3>c1YP=#%D^YMS=xB!4rs-VR^&Y$pLjyO~(n0!HXUWKVS>GrGNK_Ihhj za&<&o|Lxb42c96z@==X&0E>C|+|qM(%d$0R?H_GRgPI_0E3K3XGEuI6K8|G+g2+<((xj}_%pbVZ`-tMIj@4)-XTv> zEIduLldrEC zgea8(Tp3ccqvlH~);Tr&s=JPt>C3myN*0ia@f`5Vt>g>eEgwe3KMS3<8W}I5#TX9& zq`ORC{(n2a3DT_D5laY@We*d%-$K6S_4-VNAbdw=s)MK{edydO%P-aH`9i`_;0EsPM)=2#;VV90S@RaM8ln2y7 z2>{wi)=W_{%5Sp%qq}ZFzAO2Lc+<4p{@rJLht;aOR@Wip_0)q)!c2{LH6%q-A4J-o zxn+3E5&KE#}&aY^0Z?o!T&!*beh2Xt^HgFV`Zy12YM0DdB^uEK6$R4ZM^ zkE%GBW@HU0a7&v71Q~iaVUZl8_9Ql1k-W#oir9OhMr9(Jo<&AVZ zOdxa>7pE9+ycev);XG+KD5qGp6I8#!Olu=eo|dMr=SE73NRM}X?YB`y4;$?Fb)C=C z%-;kB9%TwYeh!>s*AY^mHniTcwiOU`bv#XT$cSYMF}(|>S*XIrn?~eqcjqb`4XrN> z48JmC- z+-xur!2`=RZ4{;<4qUN0qG*6T&X6#@$hSCT+fh>A%zM#MhNQ=k^rr2Z~+$($5FUEf-M(hLMhs}jW@;`|E`t8-q@H- zIJ0y?dSsHgt5nVTJwP!XpV<+6s!&27w{5zcI>BCr+0%4x%Y;e1K|3v-G45Jva6G73Hjg zq+2;vd2#^T(1|IV>1X-)d|nY`0at={VY$v_D!Mo7K^yNfm%qSi545fu=-B=_@3E5W zel0P3<6Et@!3qdmFH+rYJ;)5urDsX&z7=>|^k|#6(bSws&rw2Z_INb>xb!HI@({YJ zeVXODKXp><4cq z$}x7y_TeV~;VsmWTZN|3U!P$f`Isf`*cq*;UD%b$9J`rFlMa(z^#yzo%@fspRU}Vs z{;)V^>aLlDx8cQ3ku*&ji&a)il(GGLb^miEO6|j^SBlW9k{C{z$s(_{tfL2aDH+&d#+X5}bIn$(p4Y8|5qyJ`HZP&KjRHLa*3~&g+uBg$+v(P6q~Y@D z*o!I#E{0_at@6jwrK?d4~@&-S7gQhc$}^8-w9p>b6Ipba>SVvPfDTz9q>)y z7eaKW!`wq&1!iDSLZbqwUtov`UeDTJUxs5BLszKn13Pz3eo281a945i=Xn+4tdbF&20B--@ zsp!&AW7h&ubLhuywi$Oq=4zYbGW4rQo9d{eH_(~QDfts~?i3k6m#3|ty_R)V!n)JH z;cA^EtcSFk6Xn5g8jF-I-;#c`2s?-%xMe&WE0I9fKX)KKu#K7^f3D!q8NsP4Xx)ju zPRrW<)=#p+@9fdgQQI35SswzCLbji)CQx~p_h3z)b%&-+vgU-Z=OW_6d%HfZ0_F2m z(>}F{jDc3h!U$FHV`ksxxoS3_GxF0KL}5?fH<)x0`^uh$1fa`B!JCV|2E?a2ck%lZ zwymk~y@KfY@#6j5`NMZrhheKR|4y`MB;pIIZG=KsV1mU!o2~9E2Ly4-Mpl<}pKrpj zu310|DdRT32}%G;Ipx#m9>cP99jCFB+8ceu1<|?2pG7SPDyJ*1xG&S>7)-Njky7WQ zxt!h(y}z&S>$mvR?n-mFa`a|Wjve!B-(b?1T=w{6deLCVTQJfP*f~UMq{5m00&F>a z`7V1McQSc_<^X)a2j&+YY*la1;Zv!Hl#o@N->A2mugwS53L2~2njKCsND4lT&U!fH zQcE_A=DDmZm!c!WU;dX`VHz)YFIdy_#T*&*RXr-HGf6lPi#1)9`7k>W7U#j1s}6{Y zr)&!bSw8vL{XWv8ph|bspW~wAlgS;F{Utf@ez-UB|15hi08N<}j25)N00Xw4FxXf$ za`stPtw0^+-0#0~K#O)2x?cRb$23hsx9V8s*WPir@Yty9@L_eZJisIx;i5Tp+_s~- zpuKOX(fFE5J>kQf>v0S-zT$%R!D*)=y`O4-vXSdx zJ=SPU)hTFX9Nv+J_dlS@dykI$&~U(98QMF6o92q;HcJXat=(8g$1`s{y>)&o?~*Vl zHm{F;`{3URa{*-Q-w&_XL-$dg!*xdijGDw{!Rh9ZH(1f_553_@!Y^yzN`_ZOzqZsp zs9jp0VNQP!CAl!m7C+jZGQ7lpr>6hzTTNm1`#cdBT2{!}0cT8V&2$r8=|dBj6mrM| zdtYAP3N}W4k#_r7dH2tX{zoL?#%0c?+WUeUXk}6ZD9?*)#L8O4rm^llV?Ns*xRfX^ zN;y|XWqIF1@xnJuSNouT6{F@-pQ&3RqJO!U3{n$&kF4xnayq*vT#wRy>2R;*$OC!u8|%8lBh(RUMx zj<(0!febu@r_5X|Ta8}`xm114_g!_*|Y-7*Q^za@wO`LkNEw> z!6Sq%r1Oly(LvwuXp`jo`@lf~0IL*X!i=YLu6(91_Gb;s5#{q_m#HUs9Bp_mxz=$A_rB3#Z#_$lPw86D~7@`-F_<` z^@I=Tr>WYXoWAb&5U#y{;05p4JSEzBku|$&PR)$PrQcv2#+F{JI^t2PIfD^^w|!8}$1r|+Iy2}2H1nnEL%0n2d=QmCH20>WxLYUWaJ zW>8~Gam=4bMOV~4%IsiRppRPBd8K9?7oF{&RZ(jOc)WoV#eo}r>0Wh{FaOKdc^ zvbeN4@GM8qa!aJyvLlnwi=`e&e$dmGlg?vB`y^S9$6Meom}#@n2HkK`M*Uz_ejl!A z?TWpKP6&#owiEdXc-J$e7rP{ab4Ok$=@Iwe3u_YT?!S+CY4&TyBuUB&&=(yk9uaD& z+8*4`zgA(3_Mz|~lZ5U5#KK$y3oejc4^CI&wxa>zFEe9YBU2qf348@u81McbtDG-> zW*~g85BRY#OPGxF!7`%b%Lw4N(tLG0K9a(x4WXFtI$Hj2&pd9X^6jUqxkR4z)?B>Pe}zP3d2; zKYO7nO2#66LL{977pb-&)Dm^my8^!H&Jt&O8IsUse#ZrWz1c?@ zZde=)xu!MwvZNDk+V)fRD&v=?=HfjT$xC9V={8O0UMNwP#Lo7CTl`Ert{~-%E+qCC zFt;uVF1!({F98*#bM7&())SNy{QXEfy`()!0eD)_LcVj*?bO`h<2CYEdl$ zfJi8VNt5&z;b3%~W`P@*W=c2XkpPYzF}9O-dJwL28q?!NisS>eQl}8=`27x8y&}sm!E!dg)HtR?^N(E zFDd4YhRUbU{(&=nP|{?fnb7mqsyc2-e@(l#Ng`=hnUkU`e#&uheq;7ht(0GrI7Bt| zTy4U;Zhy4FfZ|nf0L@)$@?|DU1HS6M7P{Q-$8&RwdVE2RI7U-mGPO+@Nozn<&ab)? zA$u5_8uLxNAMESy*0(Lf>=vLX&{d+d257|q=p|M$ySQWJ0EHnUa`mDxhX~jhvfT|otbjupYtKHl= zGT$qJT3fBBdtmw<6VIQRPz0sgq^7BCDOSaX}zl_|W%|?;dx7N>nGjBu_ z5mIjtC+{{syLIJ?M$a0LbTN*#(;@N3P`G#Z{*&5R`(}yZq`k0*rfFeDEan82i!w#g`8>IOF{OynCnO#@xd@0b9lbRyytdx$B8_Q-du^Y)$D2&kkXsQ$7Ft2$ZOx~8028Z`#o&eL&c3aU|cL_S>DWeU_StRJ5A}$1j6(*LY(FR%Iofao zP7L2WO~k?s&@9)qf{S_Wpw}DEAW1 z$AQ)Iv-zzlR@*vD*G3DoX}+SHJe_kHE+NZ#@mO!T-tE=`k8YR0O0K@_$)cj}+QwXe z54^0qp37R`a@>zS>mGX%)A5Ll#J%X2Fk;b&@e8HULF@Eq5i2bD@HjD}o=F%`F-PbEn`Xc7%`THXBn~3$z`l_l)W#LTz5_#XPYyau;Drt0u zl#-6>;_!^kq!zJwa&BnMx=$j|KTt0JLXRTNmgMKA1sKfhxmN$H{N(=_fjh(zp9U_8~uT_!9=B|huA z=%WGZf^)Wlm52JaagwBA9Wb-6;F!q=v3w%E3UG% zYMwNCSzoP4H>m;{$}@3$$I_Y1vh64$86WVvMAtbhkJCy0v=mGxs%BGgg?3d|Reo=c z6SE(tpM!pq$XsYJ$Rlu$D&=khE~!XUFvf1g5@3J7-SaIl+jg`hyZV57{Gok3q9%oR zULT=aHAMJ5w&x z7xLdwcQE|(Z93e~DvT$viqMZYo{CZ=)i_=`3pc@mGF z?BA(yu-k%=cm^DKVYtb`_@VmgOKmF8MSsap4DyGh{~=w_cNMJC-FR+3^om!{;Ddd2 zxb(Y^<}%;!*i~C5BsR>G%>B>5Zw%z?BnZj|G>C)@e^QUodH6|NoV#8n+V6bGfy_B8 zw&_WU%G}32$txlLtryL7M3`4G;Nn5}KGK6Nyv)vH`@790iVp1Vz$d~t&@QoZN5<<` zK<5Van!F0QnLD|#;VSqoma}U3HasK5TnzHuSRwFI+Vks()xhhP6>?i52ar6y)O)TG z6)DkTXE*DX7;wSkkq;Dn@>q;wHkv8l1`Gvh9xo3oBrm=N1u#V~c#UCStt8HOBJnoz zpE^Z>*SQ=>U8|Bo$F%kpa!pJk>Iz+iAsWj)rxbCn3#d6<;|NPN0<<@8y3(q=Fj)v2 z`g*TZ=;o#yJu$1Bc1jf~R};W3joLP~CI&r0O~lGVY6CK9AY72gQsA-m_RK@ug5yuN z_eIlM6QSenTSb>8?qWsd$JKqmz`;gk=h6%C1;TQh@qDSzFE$C`<}ZHQ9N+`o(oqOW zZ(&(g9HmKnw;!CW3t9{nNrn(Q!X}!+rjr$qZh|``pc9qBqsEA|2nAQLUeWudzi*NNU_F} z)|~T#Yd#uV2(nR}XqN6q5MUDSk(}`$eKlzNNRsX=a;RQSK74zVYaU$?Kx517ivshK z4ZzA^FK$J^f}N7PnH!M#1AI=BNaoJvtlKfGmMgS~E0jQ-1xQ5diFn2U{O5$e=I!?3 zyjl;oqUBqeXAv~e-cX^6@(m#d1L_U#{^?+jagax(v3ie zRVU5DZrwBL73q6agQ?VuRgVRAvQ2*Ub~sjq9FLFjuTaOLR>Z3@j`n~8*%t}A@GESx zaq4Z`!>_C7iOvJXeza$jr>=h#Q#(<;cNlQVkgHNp!q6{9dz@SNX*I4C*|9n1X*Be@ zpWO?U{xQs+e5ONJ((vPA-RFIG25{ioig1n@-@4bCBm}=Joz5tJZr>aIY-iQyx?bnO zyDpiegP0^J)_?Tpn)QL+k>w0|@#aIPPhkltbLYn;Y7<^Bebn1eCfr2#*9Gi%>_!B+ ztw7{&T{wD^fZc_tVA7%qcvqUCx)7h58_h92QmOjC#vo{p#^tQ#sm6$ABR6c}AwmwL zr}rGgR~%HAtfVS5hQ&p_Slv5EY2GnDR*FHeNS7>~AJ1p3pmPjt$z z4r-_*3+6s39gO;q<&W<5R`k!0eK0k3&}mG$3RfzxoC0UZRa@oQA+lRyRJej8N*!<& zFu@~rKGfyn!E&umt#$M`_T7IUfx?Ic zLf!{65@u^GAQ9GRAw`{_!6K3zSttuIfYV36&Wn zKm~pJT_esXQ!=85^kry5`RP=VeV#c5^`b9abt&*~nw32+`9s)rWV$~5&*`df-3!T@ zN!>10PDj=}l$DY+sNy{o1xf2GgJer()V~vB9;eNcRFVfr=gF5Qj}gM~ zlCZ&=^pQ;%NjWImvlQfNjH{g z$D)x**S=}OvR3$tlNK|xNt#pl7_+INDq9VDsPE4oFZBuh4Eyfwp`BrUbt^*QqsggO z_Ev|Ar{CU+S2bFe>}v%X40?BtRm z7u&1|+ZBCtc=@>_k95=pU}?@O=A4H=-?!=j4NWelC#P1;Acv_s*MJm@W4M@u(qq-u zB}OA%9}$*KUHdlEGTEK68Y#ZV{iD9RRl>X#A%xKWx{lDi8uy^n%zH4_ap&zfftKjt zUA4Z9wp}rsn2)nR3o}Fep|aM*V7ugxNBQ%<=Z4%?nlsOy#U!8haLM%<7m4$pPzbcZ zE)H$_&h4R@ueA1QjJd&Ruk9f-{YE{kJnQZ+>+Zx6hh>_QhWPyo2}9og$)GI(ZWzh@ zlaa}tpv1;2LSK{iyG-@tI}C8=3)P{jqHe|m%7Msco;K6Uh)7zxkfVekZsz($ zMl`qq5B9(GTJ~z~;h%i-Mx=iE3mP`haBZqF^W?d5+Nwq<4Z5%(Jamp){4SBPK*v`g zfJc;_Ol)Jv&!f2Q?IN{l=L(`6Dfx8{234G)hdvnwh75YhK5;+S&xUZm zJu1cz|Ac8a`P=UI-j=X1wa+qiZH`~XUG+?2Y@?2U18G;LCm3-mN8IVcmb4(lL&cMp zR?(eYZ3SCClGFfDh$ZeYiQ@e{-1d4JlbyOeSsqe_O&{EpCFWrcow>k%yoyYYfJN%+ zH*KnfEcHXlxg)1CI+(EV??lra5nE{RNd?B&5KhKMMF-HIf$y7rh8%2~xCU*2d^pe;b=#jD&o0g#b*OcfeV3CAd9Qn_@Rp5FsYK15!bI(kydd zem;0k|M~C4Dz+&)-3$9<9v6d=;>T?hudqt-NMBY&imPT(7*dyDD}8UnGUD&anDHBj zbHpXu{rT$4fWaC#FK|RzQ2mC+*{TH`KV+G8a;4pw(K*Pb1lke(#@oHOz*UGAcvk9D-UY{x!++LzuFT2 z1M8Hurc&5->u&dD$h)baJo|7~LvV7rx8ZsYCwfkWP5tY^ee9P$kJFH`AI8xD6Jf8( zZj5v2gp`n0g7K8L_p06#<9f3n1aMT6NEME@3q+?{w(tUKMt~zaz{qDEP)Dq)OBRKv+NJg zq9N+>A5w|~INxPm|ax9hOOJG>@&GZJ>j*_X24*)UjdoYV!YG#>g@{Wx4_+SW0`NA#r zyiwIgH)YF}h$xFiW>{>F+@R9Sr-@9F9l2N9E1aYah|lY;3QCgd#a@W=0$Gu%k={;N zGXb&dVM-v4S|hCaEz(~)Ci|tntctj$N2fa&-3C};BT?2_Rm$LhC;YoNwk{Y;=pmHT zopqn*D#h3=x+OBzkDTt7I<7?d*1IOCQ-u(Q9GQE=JO-SJf!DI!8yno8tEt&namlXYMM!9=K<-7;?b4vc{emFlzAQXM>-bk~fLGJlby?^g992hr zxC$V^mKx_&*&cna{=F9aY3N_TzHoa{Y!}PLYrA%zYkE zl^?d?mV(-8zw+m83Jr2|0TJZYiqj25npr{*pJVJh(%iTW79DtGoJKU@%?1j8@=#0n zsJ|g+1Ddtc*f385mN%{Sfo zg+w;TAAm3wh|K`+kbaq&r{df@`h@NDF?$?L5!@uM4^mvfQb-KF!9Gx(W+LA`-I~LU zjuIK`Ba6A4fqUyX)B+4pC{U*DBdi=Ey_BIiKGhn3J( zam5DVmatL$Z3nX?iALl%^=-_KK3?7u_`;xmz{LxhV^abJ?VcX7=cGQdj6ab3#hE@$4Rto2bGVJ>{ zt;x1)#piFTN3T&oYxcLQ-OK43toLG9sj-H@9f6eAG zY&!)lE`zK>$tejSvn+JlAlYd7ThhniZD2;j%w7nFoK<3!^y~2ZaSFVb7ZZy_N!Euu zUNsD+pG=QD{!Hzec<74yrWUUWnu58G{Do4GB4)NcO8REL0)2~eFs#d@iCNW2!C-;( zSZb$}bImegl=5`<$(oU0?5?J+@JYw)1RVp5JmE*8dFgjmE(Nqe#*QO9QJtxUKyO;Wk?u1sHHnRfU^h)z< zA*wAv+BqFNmZ;~VxAnEwQ~oG*d%)&Y)_$hkCEg3O?f*`+YoRh*Vf?0u@aOv0 z{q5KsHsyK;9(6#j(7GgRb6P#S?uVK5Pe#}ampD_#%Cusa?@t9H0H5SOdTT`b9%Zke zJs7wESQerIWD!JLoXdGwowEKD@O*%kwIeldV>KEJ}SeY&d#+D zm|$H~p#zeqd|iJ-QRq3EI0J^Nhn7F$`DUG!vm%xJ!=Z0VRaOb_M)c86v9Q@cLoqbsS=CF|84&AEYy5<>{cRifs8MvMZkM|Gt z%@=Mztf+lU9JW73QYxdy00BH6cHeQHE-u+|$Svu+nutdp_Xf?ats;Ml_oSPYo=b9X zQAD-`WsKTv!c{XqsqYlhxhoci8|J8-9u)Gn>h`30gn^acY zaDZ9yg+#gLD6Eiz%uEe6i(^BqbZ!R~bhf`s#O_k>FJa-Sk-+9$3zOCip?lcBFH6&@ zVj>zP!~{4z(k+^|K|B{LjvuO>kO*fALUWWFx|a zeK1bd)@@{2cxqxMX3>7FbGbeAhoM{bkS+UcYpq)oVsQlptx_Wv6T4@Uz?A zxXw~|ILS}^SW#$wx=bf;dAiXl(!^xXr#0CnPThyZmvjfLq_H$F{=N#FLx7^$cFwY7 z9+Sw8%rzP6fk>LJY{b*;&Uq;XOLUICpMxSVpT$tdJm1pDeXrk~gKDA~H;2BwO6yEI z#k33;+uiR%7FST}W54D97K(M-&=Lz{jT_HheuqN}RXLvAlobDZkB!Z|BCJ1TIq|u6 z%tfm%%9F+Bd*zlvu>F~8_vG+pz*JsZ@AGQZLE?v33a#e##VaqnJ%`;YA-^A5UJ!rx z?MYvY$1g77txt{Y9wIL%RLK46UwubI0ykdOTP{R-?+pdfTp>eKiKNxfw6kUAJ$+Vn zPW_029(2YJ+f8Xq_$AKDl!L220vt1bzSK@f{`y~6&KK%pFBi=sqn{V7Asia-^2^Ol zUU(e2+<2g90D7kP3+)0a#mrYM_St4Fm<)w<5bbleh^W4id{=DR=l$pUha|_51pD_r zT!*nwmJL=#M`|9n-F6s}_vPtiD6+<87-Si>6$s%et0G1{3w=>WWl$8&#rSawzWa-j zl^cDgtT7CkBQ#=J6t;Yrb&uO@TNFr0$#TdPG*d%*9_wy^hjBO_ zKTPXp>>n%Ht=SE*8;*u5h?+!i)qALYi|?ugUnVO)bQ@%HiuAyujJd$~CJt!z>hinf zHoy#s5m+WPD2?7z|C(qgd6Ymz3Q-PZ%AvBB#%7KNxNWZ>wLDc_Y4q;!fZl+Wy$XWH z(})3eTa4t`h#z}o5iapcdK<}TzsIk%9j3>n^$iMw0kPoIHrUF}a8lwhZDIdiqEn6g zfnkd<{qa=R+Rx=ZZP3e&jU-t^d8(!dhYs-h{@J*rnwJ<;O))JXrc~7gy+k{hy#R=o zeB;>Qi|0joYBJ}64T&(Zh-`V7iBz1eK`Jw5`;mJa>;@9rsq9KsC$B|0$0)@ZlqIO$ zZBPY0Guw-8ILNJ8kHdSla7Q|VpKPzs(Tnvl(<+{L>5VU)h9-ZBkO^H6#jMhU*c|BT zJ)kuGDasZ&{f!^NR6OI<-HAI=j4)l@jiZe5JjoWokHU!5?%K?X)*BN_cd?ZAbMT&) z@);Tt%+hTh(#0Q`n_<>^lc|TeO%!SQ2u10?%*Kzx&}6z zD`UyF-t4+}R)GfbHG1;Gxq&c7`p0RRHt{L+I9JFvmxfo5EXFy+{1W&TXU)k#L-8`(i z4cpYHkoTP;AD;ZNb>Hu|;AY#(p>6G{?47Y1R?j3vJ*?0De-xd2 zJd^+b#yjZbEa!?vA32{>PEkV#e4KZ19Ojf`XUQAW@eZuSz^Wrr8$?( zDTYFXvG4ExJs$gW|J-}L?|b*_dR^D^(!QeVQe)ksysL!N0lBkMRKub!z2@#!e^;nv z%+fQp-36!9j@sz4(%COriHgDQAr%o%Je!j~6h~x8g7K$XLwxR_nPAcst?hLx}4!DN~ zJ45TT68vBXTa9SziupYNKuM3)tvwsZ4}>9YP&7vO&Tc@ImPC1>A}Z~TfgBH5Dy(p! ztJj6v#eEb8!IAdflq+Z2vVYzwtA({cqykCKh}=&OCrpcB*tp?mg^`)3?9 ze^LF~p7cS8HGdFchl|sNK>45I3hRESMFWwEIc}z)D#wU26LSh%4$1C6384ZC5=@r&5L+wmw{Zxc^Z=3Z%=kDA+n+Oj>(s@>S0_P)?PurDBmH6S1ndeJ^^gb7J9fX(x%V%-*9=yHi=6^-_FQWqY-t_IY z#j2Ft;(K><Iafc*$aINO`qpSV(i9|7uB% zkY?0An$ZkCUza}zn_d*qL$`PeBJwm%Yz%y$Q>m9E}O0KL?%8Y8D4c;d!GRBP8tzT2-cZc!_gHbR_%KHTI zVcJ6I#tx_NV;VG`@(7ABTPl6JT~bz1vzw$CppE57v;v(RFnoW=tFw54FRJ2-2>kgJ zBaWiiH%iXOi_8TLkGli8rrSZ>EVn$JDmUF%5C0QW%G*1X*6h5Qu!4}uJS^~gmCKlVGQe_l1!R6Gn>+Q>$!C zThyNcn%=SaeefoT?$LZb#FOn~R0ght_NozZuc$x#r=;TFTHSW9pWj`T!QH57cs*s<_X1>p9^N&L}14~dH`t5kgP~5X(RhJ+_I22v-*vn)%~joH$;fu4ZSIaMv?>Q&%254TpW_5~ZXC zNIu=SxE$*C(YwdPbJ2A~H(tO)AyJwtB;;Co=5bMbZtq2&&Gos^Q7$g3sJ+N1!@jh~ zk2Fo2ulJo{IW_|KWvi5Ds9;QM+JeF9;7IJ29M_P){oa(L_O}6$b9?he!s)JuJgX88-dTl?rP?E@LpHQD`vXf$%GY*@xM3^XQY_VgeP}^UL}_@ci?l z>GxXEku{6xOaZ!Q1icd8`JaPdQD^~W;wbEs|B-;=WAt$CHdXKd9v^44Ii@sK^H<(v zZ(I}Z--;Q3$lx-3FOGZXDh=&+KcNhA#LUC4+KtOk#yxb*^-;>>3o8??)j-p}Zbn$> zF<0{=4K-3R@-D5;1)AQ1zvEseN`qR@s<`~_GXm;zp2G?82@m)Ap!_=xhS3?&w=ljZ zFW;R>*&h(d|KNTXklTlrLl05vr)NL>*qq~Bpn>b{3OjdmcQdJPtJh-gQW+brZ%zZ~ zzjevm=F4}rv5~6T3sA~~HPKFp)foy|iK?-Iuc0H9m!~+kb4`h4 z?imzqhPfYUa69PgFgGK!%!D}*K@uG^79VgyGOwyx2$Y1Le+MNa@EHlB+(2N{6<0+> zEXJk*#ITzJpWtS=;Ig;@XT?VewreIA2=T3!u1!_;^3&}v#OmU@094|)_B^3NcN&8Z z|0Q+Lup|$kb}!o7(ledso|)9)t$E%tg+GJ-nO7LZCisP>2We(R?kLU`qo7wK9ou5z zDH20kABvu6CC#lhpN$dhb1fK3>K8dxazK^pIIYvK)HbPYOYjWuGJo{n&d@#U+LtYl zzS(c?b~q>N@=k_MzKmUXBC+%zrV&Z^=nK}p3D3c5YLpttGcqh3GdQ+vs$AnhIBOu32Nrbir4|oHJ5^H7;&2COkq~-v9OCJrugTe#yjQunACu~7=Q~rFR$-p+h$drAe-{_9k z(E+a1pS<})WmA2ThlW*ls>xoRYcc8{HN6};XzQN`npV$R(ryt=wqR-{VXtIqI3Mg= z^r!sqnAC8vrP)|l5Colxu58G)%UF^fr}r%w1oOPw87AskJi0QgJ}d7=J{%6L^W_+i zMJVOls{{7p>3D_Ik<}3~=@MIUnTKRk%XqKK8XyTR68$Kx?d=9)L3wP^5sd0{&mhFc z6qz=xy^|~3Tkd>!oaaGY+U;|ZO=(_~VllPCu}HwAzg}$hd8=7BvGC@^L4FPH&R{G) zsYNw3jxJl1G?=74wk<{bF|+L7KUdJ^SR-_x2kI63ILD zo7Bu${Ylc6fIz8e-Lfi!%-^30y8PRCb3V(XFMJsYM$$5D2X{W}HtmI;j?U?NmXwrr z-C}P$(#-AOpzqhVt~^`_O8Gri7euzyG_txbmLNIpfgw#SNWI8=7x>AoA4Q#;h}3WcG^p-eZ~Al%oFc!53f)5;>T_+ zoxS4o`3?UJRrZ8^$b3Ud6M7#i<9AzR>%>Sw24r-#U~l^-P$mTmV3p;a0rHSWGJ=u* z)6!sk0mZ$7o?;I%p`T0BVkqr-FjX~`cDQ9dSJOQk5eiZI@~Vb3*T;C7aV}pHqvbBE zEO*xRYoR6-mz!VukA)Q^bFk>TQ4MuuEylW>(?U%{IUn8rNO7xSK>I9Nn#778-9PND z0;qh!-t5a5gv^tLaaL5XA?@>D90PQBUB}c4;Ltg+Zya-mAHEZp!~$dp8+VSHO)~4` zkG_a5$f?kC>24F9#_mz`za&Uba>4DjHQ1a;LT^5CWjd5D!pHku1K2u7b4))n* z#2edny7V0sq3?<(DR%l=zk$u|bW}S#S}s=3(t)>a<~$4gueF9aj) zzwK(93+S?!qW>=UrB^knpbsRt&)&|U znto(EOwc@)E|=Y8S0AsG5EyZAsi)VIqeUzURZ&L@mno;>u?>v$j6laUKl3WRhu6KX zG_!xQxpr(uIU2 zY@J-y#gzZ_k8}OujC993F$eKCK0@5d@IuWUZo>&QEl0@IoY`XgL2lt-xOIxvK3i_I zLOnDla1K{Jsk_8>{h<6JHtJ*!@#QaxR>$mj|2vl12b`ehlsfB9RIsK;&Fw+qr$6H za$E#3KzR&Os|<~7tVoe)D)ublWaGS2Q(wf8vna_MM}kJe4{lj~`}#iw2QNB`FSUC&A!6uF>c-Vh^Oy|A zBQb*qen{4m8MMr+ACucwru}lzX-{PHuth0?jSvDnt;qim>1U@ZZ@IK6aWC0a(q=k6 zzqNC$_KW9Tzc6gG*8=<1Cwvxf&h!VVJS9MSA`%Nyt`G|gHIrMMT~Vwj*D)pp!M29( z>_~C<0R~W^J5TZ!J>kuRfgANWaRt^E7%Kxha;Z`cz)+D#v??!j1I~TyChAyGB-4=> z9=*cAHA+%#@gj40YfrfB_@Yf?*WMRtoL zjtAs{K-e?43j4FW(+lqM9ikL$mD+x3Td#@W_ zx;ugShU`eydDiFilCYa~hq9^nz3t*_Qqm92hbc{4-RAEt3(jr`e@Q!@Ip~De0`fuE zwv4Yf*j-9~twXczfebJgap_^=jxSXCf^p3d5WxJrQBJ0W4LqA&S{MC(>TYXL3EopFx?VY`X=mV+` z9sfPsz}wKc6C;n{m&M-TTchs?h}^JHgQsv z@y(CoZji}M2+R|3sf4qW=C7(iX-KhPqpp+%2+4aMDE_YZ_CxGTJ*@Wsx~fxM+ST}JPN&CaMlx;63?kf`*4sl38% zG_B~chR1!Yptx4=p5ce&`9Yxea<9kyZ_h&a0@Z)%F6j~c(~?=L^f43iWLL3ZAZ&PQ zuwm}ox|96)euI{m0hPy`7Nz*4I(|fUfo&XgSmFk3HYN^v&vK3R7kCZ6}`gJ?)7PTdBpFOH#7SLh`w`MlT(e;S_j5^LcYN2A0oKxk{xFC8I z$fo}K$(&z3GUio!qvme5r4d`*p53Cv=Q9HQ>H3eU^%{4aEmU4i^~-Pexc~~o$t4X# zI(gk7AFT=}c}aiic1QxBfR;g!D@E>!Nq|Isl?H2CXxQoLkBN8SCY9%?XJyj>>y%NI z!5RL0mGWoAy9U3K8B??OMKfwb(wHyO7d@3k5<*s;d3`$B=@%^pdbnm)?JQsD%1YIaSc_GD zswI57rd!0j_}G>BpRXq^GuOdwQftthADS7&t7^6F!Ja)%`=7Z9`rhORaj5Z2p6hWp z#EU@_`9Tqw+)uF;i>C)bQ>ydRXLi*uH%Yz0##sJU^u;ns)>@Fmn!_i%8L9Do^>GnX zs+yrkGhQ__>IFw&h!hkb`$+5ROZ0G!PV$jM9;lWsi9tFxM6%WlznV_R%tnQaMQlg zZYiwfH{lT7>4w5>qE3o2)d$|7_AT`^QPk0uHK#WH2y-nsP}EHQ{ki{Zf8i49SL(E1 z82R9oRAx+27?R+usGc#Bo;HlYy`81Y=$FwwcIx9Q1;dT^)i2BHd3JoQs)kOK2cfA2<`SbMUP*p&5Z0r5 zK#h{(6RV~HN!wRU?|KX=X+E8oC$IUU>zsSgy;e~diGN&zrGc&ydC{yl#W)DibG!c1 z>O!}p~=k4^7u{fzy9#e-i|IZd$&A}GS{@ceXT<5VuASBa1zAn!6R@K49J%xtu(u!5daje+b>c65dCT|e%z2Qn)|1 zg$|9aILF#_lGOO9z?L7srj`FY4x#w9sYF0~`-6EzSOgnnwU^xB3YozJeKa4RKv>N6 zbDMw8b=E-nUL9F7Z1q=CUP8Et%zfCV*;!UvhXZcPF{2P{y(tXxGb}M_E+7om%_?0; z@l}K##qTrL7uAF-rm8}!=FoQJ+h@sZ48qnKOP2!05my%oWZ(}M;7`ow#>-43p{`_g z+6gP1$4XTl#w9g~^(#ckk~F@#R06L5IqK4dI>h@t?9P^tR91pN;l~__36$x@8$>s4 zd21XJin}2~7bSsbHl}5@RHafv37F535(rG{ii3`{iMId$j(K%2@SqxzR^909Lk{iVW)Usc(r2S3f|_Ja&OR-&|)l~G>n z6*N+jL!8nNpz_!_S-)Ac8$zUXUEVMvpc7w<4Qb23g>kv*mmfgL63E@Y2 z`M+b|y;RdIfL!L_4A7AZc>s?j7_q)_RJ4l!bHqzzlAboY<~$eWP1-`!JWU;A4CkkU zG^X{`r*mH2ek~N~d{U1TUDWS+u;+1Mua~#UE>kM)>ib)^3O_YH{T(%*k;FfmGu8zn zFH@CHE0Ld1ue`V}FOKb+X0_k;+T6sS6xIRHp0)=mNcTE10#JV~<6cN+76lio!gte= z;%6Sr`6vt1ihK!a%@5mEJj~n{AKfvn@Jp&nyK-H+JW;>(jP9LJ(V4q^-gxfrtO9A@ z=sDdVp^&-@%R+sDwLcmFR#b$_Uh)mVf3hwKE+`q;KQ7Gr-?7%@y?13HJl2icvxDCH zQ=+i>b%~0Ahn9+;adw5oIqC!VgPeS|2AOQlQUCYB{bM~W&2gg>HBf?cTrj(hIIA|e zSRqn$a6)4nE1|NMCd@^CYx5jfcT9MztCyrz!vL@0oVMx>=u&ze!U(uxc$yXgQULaJNB&81iD z$Sy7Wp`Lt`xD z!MI11yc+Dk)~s=A*I$cjHCW9o;ARe~p52eh)YA+0QjM*zac@zoZUz?W0@>=+?yUVF zUxVsRo2y3SK!G<>l{ZB|3$lCqG2!LwC@p0O`<$us34vd)?WUw&`ife$+Pc5}Zm%Gi zblicWZA`cKY`(_le6Cb*E%tVOob7Cld2O3$6y3B{9xllCzIhRDIclikc=fXR z_0T0I{EY`M|2w%0+xdH;MXxUQjU-_%N$c*cItNTp&YaqQHs{n{?@Wbi6#t0fk;-FMW0xl;7D|y$i41jX*E^Vb>RcpxhvQ2v)6RAiR%Fy*)rCaaW ztLx+p74)mHZN(p2d6^I2-0?dz*VveI6JO-?ur5U0dBHM##dr%D+N}^t0(<3!7e|gO||`1Z;~XfRP~2+%Z`guPG)&OF@RtrrlF= zg*3>5XzYF6{~cScY|)QyV#p(CjEK?SvXA%PnNjl^eTkdmP0kBcXEj^T(;i^a6tjeS z)xE8K?@KEDzlx}iG}Hra<8C+`x#qdZvn$6f)<0q9Uw&ZxFQt?ozNS$N+usQdXa5S? z-!4~kF6I~F@4C{BT|9nJdh1~p&sF*Si(!|yKJax#z6`{xeN^09ytR}9Z{}K=EH2~X z50Ln!`91IbK>a2>_MwlZnUCayFVA`(&mY?g7V4IJk^c|>q<6&35%%akzFU4*66_K( zLpT{eOe*_lPi?vnkB#vw!+jvLjcpUCQLMuhZ+A*VVG~q?!e~1oN@)<2Z30>FNEp7k z{Xz8CQPkKZ+xPa+SZvysM3YNj>0$=lVq4Dg67Cl4yYEfTJ7}afLlSk`b4i)bEg0B;9b$?Fesk*|3Ah}-H(Dr=wLHjAgIA;sx1pfA8(^64` zg}LZbXF*7`c9`t_+R4>pY_tXrE(%x8B& z8!X4?fBB~@2?P6>>kR(aZoO8-QL|fFAG={}fi+tO0nyI?S!2J{SuE_7&LhK~dh~*2 zV9l*Im0#$$h-lc#YB;0%Y>5VYVv9!Ky^wiQ=3xGbH_7Ma$1AC+j0y>h9AU3y^*Ac#_8s}J5O`jt1FpCV2KZVER<$&mCX(XlaxJX5c!dy>5I zR>MH)Ujz8PRkh!%n$KzTZ@vOAcRU4Eoqo>xsL9B;*&dt@l(+w+D`M@^X_Vw{g`ZRE zt~Su|ls{|KNyd=ep?Kjcz#)u~R~obtt&OxUg!T$3dRYie>``B~NE#CrLe5 zU#86Ga;m7aiuY5PU*3O)JZaC9^;Tjy@)8a|4UtDpWzw!EH(xV?XhE6q;6~?rMI?w+ z2U6ppKqdMRu~^@H;)a-^%U!w~$5$_Pkh{S|bJ~a>bYt2AbFdbd2?>qiA8|IJEqAJM z_j^)9kh3C2*rX|{k(qGRLbluE{HTa042}Aa)JGVe3*(|P zYXPGfM*7`S1TK4xw?9ZQ=H=7+h$qmTK}725Wt-|ASaM(Nzh;UJAC z5(9ybQ;U*a=k7aq-P!78e*E~x;dcYG==L*Q47g~Iex5qG6#W$3T=?d$;0QKUbny~7 z8Z0@_tFoV<)5%=>SoT@ZUs8G25&qcq%}Qp+e{cVH z%$2QEA7s5k^Tc)?UFkPGb#&ooFBKr+hPh|SAGqcd&i?P1t(u`0YV>8oKSq7QM%`FN z=t)vr{>u>n2IR>UWT*97-tdz=gZacWzYr$MYfyY!Q{|>-%Zy7Tx0*rGX8jTfo8JeF zgJZC?aBU`2j^lACB-teKQTe1gkUOom7E^}&`b@r+q!^uwRo00uA5$CIW6eJ9k=le@ ziRzMwe5BuL1C}#lIar4@F%;_I6hARd?ieju>sU)^Zj;{PA$FELCIo!O#n zeso*}0cZfCiQ{GJQ{${5>q3%9D8pku} zu#FN6rkBPZP#|mdTFq(Vfa<$0b)9^$$7ysD@6Qwk`#jvmxL|o`$YU}}KFtm>CnsC9 zochx})+ZOKPBx0>*F878`Ji7;A%>sgWQ;;?LTl$7z(f~>5zU$PvT6_o$|NB{!AG%@ z{J;oau!KD2SJmepk`}pHcD~eD3jrX8g`D*!IB`Q=-`2%7O-P58z6NC5*-A$z1>9z-YlDzl!R5ZaxADvp1|MJtI4Qf<2`=AV22NO>M z08CUP<*xvo>$1{R=($hXBo{M_^)&0#2(Xp?qxu(Xf-)+N#$5AbgxSLIjLXfeh+EK-Nu zAD=+4sy`{n2+*soY?Sy>c+34c3IWP8x_Gese)?ccvwnOh90~%)Lz~h`prOYCm%DM} z0C7tT*reL7obyECT2q8jj;j2pIIYtW*$1ab5JG=qs>BY|BD+xsHOgBzc0?RN;ztjg zGYg#${x*76kN!@M$XZG2>m47p^z$;x1xo6DS8B&I#yH5&t_@KT!f)6QQU`!ut<>W~UMpZ?i3`Dhdw(Uq!YcDkrlWgWeLS zW9~m)PmZwejK9I=@`kegg0y$9Sy5qGaapw)Ml|U3H-#YGgSkN5ggu{402n^^NZ2lg zOAg=x2|2;7>cM#+2EAuZN+;7mN`Ev@4?~8aE;|ipughHkw24suGT$fnieJ~>*w=lkM4foc6CW&FEhWgPp(@pJ>1J0k%5W(;+&2e zU0PLlx+F@1_aD}L1SAmebK9&@R%_6%F$*>Rk7|6^P7!X0(xD++X#h%J189B9QqrSh zOB$^|WkY=e0IAB(SK$$FrC|N}^1$)6qIYo89EUzQ7aWJ$oge~94(J{`+Xat(B614a zYcv3XH(?a*x6)lc@Y7>$f@FWB(sF1F5iJQ11We<4a=o5ueQdB5q8~u{zAOM8@_pR+Hbr+ zhrF*mrFb{C1Al2YyLv}+#n&R<^|5VM60n`gup$dMa}wLjK9P}G*Kc@#&xRT6UWE3Mf3 zD5BwEB#5OrY0n`q+}RUgC7Y|<*eQ*u1XVv^2pZMUp50x2;e{@%(d^Aa{G7^(rF>!B zF{j+0{|nq06(pg8D=WONk;Y$u4KLbv1@}xQ&g>SSJ*xxm4Ep@AJB`ypodTEx_MWAt z2mkSilXeO&XvIHEZNM@1(yoV?hS97Rct*2*+*kPJX@BU>#~GwYPgg|IAMWG0-@Lan(e6kQRSePe{!ajo%s`FOCs+kBoVPTeagKDG}kjf{> zk*(K=wP7W0oxTcAe5nAG=J&n@1d1%!HyaJXf~Zq?{kTeeD@aQ=yPEk^xC!OPIpuV; z-2%a&aUy4-U;yLZqYMsT(kI~;b?nE2K>3_-*v~Vc`EuOZ3>54{%F z+Ju}^p%mc`y;D8YdQt4Iu(mmfhrXT8`4uAla7Vr*HVQ;ptE6w4Uw4~MWlfE5) zAGaN%U_e`{XR3=rLte(n+xSb?KAkGW$WDn4B=GXl_i4`5_HXG6Rf7;%i&mtSt#Ug! zWf`#+sASV$DDz0MMDc!N2lR5ET`tu=3`{CQ9jkx)T|7VHZDp^0*~B%a`XP5%9gmo^ z1#$N5wp2H0t6>mz{1{ktMyevGs8iX5qXJFM>rO*nRcUy;EP5#=ssVyW;+dT>`UpDC zs?_<9^7-*0wOjfA*|JX6(l^o~A5%nedxyS4ngw9}qoy6Z&+JsOiwo-|VdH)4Wv&jw z;|I7;)eH(zwsV0~3#eAcW8CC>#;mH%Wn-e4QpJ%#E*w>D;eh-Zatp~y#3N5kd~Q|0 zIj)@XI^t&@1f+Sa>@iTp zahv(vf*dRVPb(tD=DCLdS`?9Q_v-KdtMQcdj|cTl6@uYTO!o=OG#zFydluzXy8F#T=21Vi}fhr)T?8BnSWe21i&6n0lQ$AVadI9V}#KaLOgEHJ91l`d6b( zLwyNh?(7Hth397cv7Wz9EDZcrYQ;0PWhqwFzX&fbifpG>N71_>Fa63Uqb`i9=j1tf zl1|0>(%U_x;^(oc6o+R|@lfEoPy=}HF$%z&SRL*waDaS`+Nq4{zx)zyfxSj!=o*e1 z!4z6ASk3d-0vs5l4T;g8MJkK42Kxx`gYHglG^)ku=R(EN)Ahpb$xI`!1`aZphz2#-pi4>OknkhH_eMqfW?Q_N* zYQ{)^f~cLB>*{#Tv@xcA^w$q>c0KfRg{Bb}se|JjSX#t0r?_Cr;XpeWQ zDb}$lVuM=@UI{@4UA2|sOk-~E42lb~;{M$X`eRJshFBcm^!M^#`Y10N?7Q!(d!m1Vb=6XN2C0BG0m^r@alA2g42OnQ9`Cti5-{GQzf0)By+RTmnhwb9O-)9)c@g#9^X$sC&Zj6n z7pjE`msDO2SkoLI?yxv)xi|V&nY+9P&Ny4X*qa!n0)dqs#b3GIeeq$aaME3|sc_4> zOFO?pO)k6LLF(Z4KZ}^k=!w!#sHWm%lp+FvPw1emL~732dpwI@B5{rEGY_a=U8~mZ z_)xn>b`1JaW-HKNd{2KYqroSL%WK#P&Y{IZHI9ae{}`Bfol9F=&ulbgICrn<#M=$J zW8ftrR!-r19+MjDzc(NngdA%^*W>~*=W=?=@VVIvY`bO6pKR7Ij9s)p!ygsE_Dc%+ zWqFo3`u{5!XBYhIvo3`i3=4r~jq8N3q|ry0_8yD>zbfzs3ZU}5_~L&}q2`y>b2;|R z>m`9;xlA({?k~5kz&;BBQk)pn*+EP&_a;!S_|V;247#rg2Iq z(9P(ROT1mlb8-BVC6nk+>|-8AhdQ|irw2`}gmYhIwfN;kQkdDAIRav))ynoAEil%0?NZ-v1Eg6q|n_d9>3=9xePmDUVrkoRO^^T+21FNAm_D63{qf< zOD4M$BBT+Q&F5Ew+H?N1Rq}|}Y0|1XMJa@!|9)>*peB@ySbUJIV`2SjsN&*D2fjl? zt{q@1qD^)kRXgF-CnJM(URLE0@-NLjPsp+eZ#tQ0+o_?A@JwBR`A)~07z9yq28|C3GBt89si1oCIrOwgw52-`WzqWce^|L8VhIR2T}#KN6<;;yNA3lY z{waMP;k%xTcm+WU=MdqBp#G{fN(7%1T0lb{pQ#DZ`X%v3P-B(c* z`X2KiMlK`Q$oafzKqE5X27;ARZjMw`vKPcS{}7Si*g#~()9O61qSfxumu2*uc1X6F zhvMIToOfdZ zN6iN{zZD{k8=w4WoItJ1PkQ!6SxpvI6;YSW{8Q}tN`(UB9{9n=ltq+HHl(EM>fo!) zb1D%YTzegkQS%cmii=8z6_^vw7K$l*t(s9B)j`MhyPo5!0qcP#9A!-}*AV=!CWzqC zJR<^RYsI82(!5v+CackGzqs>+=Xn)vw)!5)=$-z+tmW~KIK%9FGWV@nEJmO^evwNT zm8Xanr;#w%4_!^fUK>|s9e}=Gi#fM5q=om^U%XH?2+2uL1f6g9nTFAM(qedP&UcG* z%urbWxcH}dxMUim&%&{Ec=RV`c}dSA2gt~Xm09&c)zr1I3iy%!t?Sll7+u){N-Q29 zRqv*DFlfV3qh@|Kx75S*j{x8sH81iVs|7pUJ`)=WCBAk0g}H??Ap{r+~CU(`ICPJ^(Enz7h+) zj{(R9+TuX&ksI;cdNR9H%|a?`1lXP`$3?KA$#2Uhpg(1f2!2(h?^B-@B6lxZx9U`v z4cdr2a>acD+pjORSws@xVqwqz$~_UgtAYs8{iybH3oSkLM7|O!TJ3a(OEZ%1Qj}e> zFMlo6dfeJ-$w2fZt_ar?z);YCGSXnZfIh8`oK~UuipzZ;6TFZeF5+&~XAse_>vk>v zTh;7ZtK7*b_-Xjip6Z_4;8-cfGVvxb)eT}UDj)5Z+|Bl>$o1#q%h+Rv(n0UN2pVYj z!<<^7mr0_D);iDMXFKw5t2`QG=e!+bhkv?g>^1xH{;Ya#q{c^K=FhNET0~+xVUDuk ztDi%#XJ4s9P$#I1yq;kNBikaX5--s>bnFz2F7k>M5f7)``bff3{ocvLbT)x?^oiKx z_ChMnW&DT&J9qynkQb{Ur4FKy+VjsXjhsP}JBA;kSMPqq>lZ0|7p41?ne-gt;rQn>r=S5m>kUR6iV88eR?ZE4P`TO)koh zf6HkLC`0T{^#G+P7V{gyYEFN&Bu_C8Ivx5C$bVm1JjgJ@Op>SdB%k};0Zfnvkg}NQN5z2|Irsw0syzF zY^iR28G+a583+4DpKpz677l@e zj;e|&;9iq8_RhJajq6QG#EJE@uLcnX_inMy!g0Q^}k<<1)ZSR9B@RIg17!r zg<$krU7&ko`-zNdf$V=bXO^#@zkVg}V2hDHcJO`iBDzZ)bY-XF8!`9bXrVrQx~Wu~ z#okfD)VO(!OJ!*EE=4vk$xF@~)E`To-ZMe9-Xp@=z6C@WJR7|zZtz!hqY6t>$vUYo z`@ds6h5xy&?w{`rko3s}Df*E7B2#ix{NJOkyrr_b!rJDh*fJ(a;%+YXNc_61#`~J& zo7wNahDHVd%KK;g=DS90o65$W?j4hvXOFM*R6h~BaK6s-^Oekmnr9!=ylx%`Q$ibt zCWEVT-(L>5hZX66P0*jv>^Fwj--fRtmBSCK-OOX|%=dYp8gMJe@c-}F&bmvr(dM{n zL}2NaYs$YbC*P5``BSiarNrrXQ$DAa?tN|=g;$@_ z{PVwKRk{_tsLxJZ2*81`!_|lyeJi38PGNltwCf4CfOnvxS0rDSb9xSV4DA5MD?utd zm$H+m>0g1WHPZx;{EQl$QOzGTj+^pjEJF*0;C=vni>T9U_5P3dalkuvk1_w|4{(}U zXS|Utr%JPfrEF=FSBIW3mZ+)S4>KAP)MFmm4-t?H$m))*bpL(3rT!uaO!1@Nkm0tl z5QiylKlJGT)y1*Rq+~ZD_G;tGt4#sh(p6--m%+adhULVG*9X~pTgm#sV>Y*h4VJIRs4yTj-$0@&c zISLs~DWX7d?xyea9+%hFvg&gWcGln+w`v~Ps^@P}KhI5_=%)5eIOi@*cu{$R<}A1+ zq<+;{4keDj?>?@UGViGBiao&dLF+8Otd6J#o|dE=99cu#cl_>iAMqx_IaoEDh)`}( z1#Y~HZjbRB6@~(P*-FfF=@H8=qgS2CBbK(fFR{5*A8jr(?oST*Lbt`CQG8S@j%59q z`!r0$`hh*GYG3Ck&-_diU%)23RBh4jbc_FU;(RErS%W$0+>F6pIbB~Sn%MhYN;=)C z+xM*v-bC(m5L}K^?BAiS`wqVMZB5e9E8wWg-HtG`K7Cd9Zrj@>c?IfE?D4(}x^?4y ze+Cr+=gIwE&9I{|baYf^kek}4ub2LhqAQPQ`v2oyQiz;O#Zq6n3EwWqR*qDB$+3+& z=8PQ4ea^lrCX=b0^+ib7FvFa=(u`55%v}m2wh@|Rv-SJ@{^{|MKa9uw@qWKv&vU&Z znSMUQLr+u1sXo4pGjYGCJt_EY>jU=Ll%nQIPQcgIzYh5sU#&6g@pzx{kJxCg+RFs9aORJm>N+@mM%9R!g_e zxxN~T*hQaUu@LM?50PAL9k>qk~ai zm0E={$5r!tGs-@oy-zT~qvsD01sJ@=PawHiiu-;a9>h)6t&yTh0EcF!|d?PY?o+;YZosa+QT{jO#XsKMM=iB3`#oSv>oWwwYY`v-vh<|OJmsKp9t_gJ1Q57M&J#i>V&21P0kf37v(rtGuHI}5 zR@`$rtvP;Oh7Bp^=%WWKX7%l7om|9rKm>!R`1@tyA2r}-)U~#Zwo@FXJW(Hg>SpEL z%7^|X0l1&8cJ?-@S09#M#n_GdRjRohD-N&v@oO{1rv~uy2!c|#8~(*ziK>-bf30w} zTG~2DBkm%Bf5u4LFKK7OxPZ%IZeG0WG#NO}`?JTim;w~ejnU3JuIHVdjyN%SttITm!9CC6THnrlP@nY=dkZpyT``-< zp-}7oyo)}SUiVdCXOHfE@2Bq-Zh8XSKdUdB8dN@VDj{?%g`y$25xrc_J$Sw89Lk-k z*?ER|2~^^m&*fIil` zUPs$dZj5rCZBLY)&`2t@5)ljY&ku`RtkH2^(QR9^z;Zl z5(fv!&dtHB4&@zr2)0Ng41>Ha_BCNyqU1(8PgE$@N)}jl4HqyR&%bm zck4c6PWQ5O@}VL%MC~8ixLGxI^7|CjN|s(j^$eNblXK0kpZ80}bFs_3QVY~&Kw0Ej1Db4zc@PAUL( zGKH{;O0%vH&q9~gDhTeQ@05S&8m6B{u(H*qR0`xzTb;x^kT%EMPJ(W z?1!~JyS3*Y*5qB?bTuQ??>vPe44PJbH9j%jrKAFd=1SP@OFVhAos*Bn8ns2Q$^r@7 zbW(E%CMkvg*Vd_5_+(3p*> z0=j8cB3Keah2{xH#M{4&l^rFn3Z{|bpe;^mZr3+IY2fjXhv|d~Xz(4aErN&=&RJ`o zwwVFZZ3dj4!#Z>Uevu%^@K#LNFZ0B({=x5|Z^s{THovv6)i=Dm9W2W_p1T;j6y~UB zzTEfLvYs2p<*OysQ`N#6yq!-r+I$*#OmrO#!F{c`?M$P}|933l3OQ%LovCPWpR@1d zgahflGbdr}A(rbZ z@^9TJAr;O@q&_bP$M!xN4Ic=6+~-i6vz{V>7@#}04s$$E0vk)z63$XJ^yU4O-%2pM zpW4Wh-gi)e9H=2)#_P;;2$$eBF#q0+VpM;l9WMt zXS8!Q44^6hHYtH+^gp~Q$ben59abIP_@UYDLJWw7W>hCCi_0CfpEp{hlOSb*mF%ec zwdr0tb7tdd&wdZ1%@Dn(9>#gw)w1XBII@e^gC+^~&orE@^@~8Xj|-%<;;q4(MYkD% zyU-O0Y-JRPKcX)Y7EvofVMp~GLMIQv09hPpZs&U3)kBedrP`b5XE_6FH4w8Jd)YHt z)U*e5?LObD%4Q5A-01ajlAbjy>LwX|&s^DzBtu93fbHCDKX@z3DxZ$h&|6GDJGiNj zOt{}1ki+{CGF`=>!lL$i{~Fe*bvOW&mKWzKK&&@dY)ydZ4VzuvCFV(}wf=XgDcTH+ zXCL3E-frbA9n6Ka0tID;MZyDq{KQ`OP|nK*P(b(aM_{><7cWGaI+4P6BHr~fbVQJ! zLVV+gQ&OrjdI3MwbyTmv@m}kIymO9Uz0LyMPco40S#(f*$+&w1-Z4$mFW>W<; zuAtie!%oIRs$&gPXKER3tpW2h`pWCA(=K;a@?Z$96=xZuf;n|9Mak9i7T(PG!Pmv~O=`ykw_XY^!PeuhZ0ui(I$}2T909iad ziE-~v10#GY_M%}{K?2z0M_Pgq{KGCD>m;=#mLg{i)-YP!EoZDhhHWVQr<&B0t(*@f zKfaQm^vPA-q(%}pV>DL~mGtE94$o?&{1C5stW>6axVH~lqoBw7MVLW3%{6?{pEYOY zm|cmYPy6;H8Rvgc#mU#&cDkCG_d}J)C zKN&=izQ7b%_DbXd;=JY*0-{N}rK%d=wYDLmUhSq4f*432QxkYp-S~Av0WvW84-Du9 zV<}&SDe^55%I1x*bL&k)>o4jLtC4z23GmiSHS!4g-`1Nc-kq_fF1EuCnG3$3wyDIu-fKHokriV?Eob2YSooP<+Y15}$DE1}FOKdgnnO30 zFNz~+U-Lh?Pz41D6|Z*K3y~(b$HeTgiGz>Jm|BDT$3y?kNf6n%S@Ye+GA;O8Sk|1G zFr?()_tP^EhGg_p?@D9%*B=u7_n6z~oDe^CGOi3$o7$5+mh!jF$$hfkoD_wkp!>;& zzrPjx_V2s3vb9Z{4!>~HrRwCq59zv)?oa9sPfwznE)DbV-JWBsJlBmyPQScDh$ULO z>tg42d|uiB!^1NlwX8;UUv1no)-Jci?VYRwGEVvFN%|5Bb`F7Bq6A!t(5*4ZpvPIT5z5zm9%4y7nwXaip75PDntwpBMc&M zT8jYOii%{9B`uo{Bh(jWxW!p-wyY~UWGS#mP*UHZ8#oS z);bxez_j6_@L3#&1!Q1+IXjvP5LNFCleoPHRlOB%wCUH0fZ zW=@V!_)D?{mj5$`jvWqNmtrMYDmcE*B@~LI^p@WoAv!J}>w0AW76KWyKMK<%X9QnbwxoKZ8%k#8hcM$0>{cXKal~;WU3l^h?pM)f zROO)(&_h&z(LG_07cS=~x> zHDeMtiN-}_|X~!HA<_3Y*%IxYEBrFNqQ>IsQAr&)Q9=Ug#eJ&H7aI)OW;fH z?Ms1+sWH4I`}b0>S>MY?J1aVpE*EaG;iv1(gdk`3h!O( z+$`2rA%~vbF2p@J5Ps{0PsEew-f6>$v48(an^-?1H_4E>OdP2{OW7lX&e)@rM0I-_ zoC3<(pY}NEQ{UUcsnZG$+ke>zPD`o$TY1`b_T_Iw6Ek6~<$vobJGslbj0kR@PG&Rq zJnYl5Ja**Q+jBgjdX!cc#Zn?=O0l>{*d(QTCV9^KYl!qd5f@Z960 z2?}kr2zHRv^u}ozf5CAM-^tX`L~j^$t>%4|YGmr@_7te+K&XhULOck##Kk7bMHHv} zgxy!?bTfOtb3=z5zax~jm`i9++L_46Ja)9&$*JpEH z@cXBqCVrc530t$2QL%Q4-F?}zo+5oMoH5t)>yhNBb{UEBi|TSyPF)IuEO&;G;DXFN zMx{6HpJ{8u35fbSFf|oRB(mS+FO5gw4vvTkZvM<_Rp_(7?5H>AJ zH|ewkJfD&uWS*%^n-BOj7=ROXoS%0gLcX_L7sn<`oXpKuGbS+JXoHUjPxG3rC5uGs_4piViS0z@-KX?lU@S(uRRQBHvt}q{B zG@ATl5_ZeSIV|oIvm`%ovB&+$lbQ3ACq6nY}MmtY)oT!uU&ts|&8Y^Lz-nf@~cBX-7&4O6AUkiqHEkVuz z?TFYnA>k4rNhN!a+8rsNe_8&0soL|Mwg;rhDF+c8EyF_4HFw(fHJ}=X&tazyAYZMd zs?)#8HnnDTqCu~Mxw)bIK+G?aLPoNcB}QgoNy+XbTqbJmHuM*TUeoBgrb z8NW|eA`z#y-(bHfUBD(Tk0)V^dHfE6@#N)uGj5wYPY<86H%|KSQza}av;Txe^t$l7 zr}Zu-hK?-BE)FT7Iv&9dWmX`(j;8AD|1KQTJysw^3Azm^?snH@iNo@cPxtAdIssx# zM;z=ZJn(#N=*B$hUH&flhLI`l`}t6E>K#uV$3ZKNvHO<$J5TL+yc_-gU8z)=`#kv1 zo*+MhH8CdK@0!LB=L`BB7Tk8d>&qASPIZG^YnO~q9kCtu zItg0-_yX+m{nQWE^wD#3ua2IN>y8b5>~=ck-Z;+e!u&yXaN12;K=4TYS<{QnMQb7mXv!BJ;$`oh7&!zg~l#gMg* zvGdO$;FbmV^}>vb+A%_Q{&zrbg%1a^8%v!Nm_(nw<@Hg^e~s1P(jw_F9CKcVwx${V zP)*Uo9>1I4CZcgp;8uPXTq~YQwLg#fE{;ZY=U^ig>}6WgRU>j7r9)&d;?%1$vC;e1xQ+tk`z0)i1s5$TigZxu~!QDffRow5f0-7B~qTbV@yi zjk9OXt6)T2tJ&CkVSHM;ks!PZAqcOzI)6ars2`#JSaYMvdsk;)$fUhCHUy|R;$MLU zbxk&kwX2O^YSz_bx0Sa>nBuxnm-ou$o(qQArj#_>b|T9w3iSHV`UAfQyLH8Wfgb{- zdqYG1?3vq8YIH*vH&E82+A`V%UT`&sLp6wMeVD4r2Y-CYCTq48*O5w>V%xoLTZrRV zaNBmg{_Gi^Wo2=Weas1`xcR#&>ygt1bYGq7J}Y%C*e`EpZFp||%0X!@beiUyIC_o$ zsibm5X7P0ba?8l}#Jt<`$T9bb*9@Hxd5oQ4KZE;3lqeAVkLdwgWL>#d*}V&uK1;J4 zAANM_D>v%zUDTKYfQAafo(Lg}7LBL9^<9=9E=M)MiQGgv2-HG-^)pYHa%)TxdON(y zQ|&z^^IOu7FaKa&#Q*Hse`HfFK)!bCb7voM?8MR#*JD`QU-)%5FXqo4KGbz+re;F@ z#QcbG!bi*3NH2a#Atj%VhMBA2S-AAD6I`>On1s%-|;>H8rMxLZ57W6dz^9dPUPgp$wkI|Ii^x#JlwqQ{PSHIib|C1 z*HpV&S#j}#TMF;)oe#AZzb>y8v$FA&U<^%+KAsAiRLaxV#X7gX{mg5kya5U*QiQ5XK z1bZe7rzaG|HCFRflF(Ck+lP(jKuVwDe}BV|HEM(EejALs*pZ%>(mqj~ya(2ZG50MWP~h(~ zYn-gb^dJ@L(>iGy?+*d(uhL%{5Yt zB7YM53-a8_Mn8}=OLuStd_Ox^4v*bACIOd!yTJv z-#ywa6f0XP4uExD-Gt_NQ`eC0_jfFe3yaC=?-RFtC>{k7r_}&4Rtp=n?x?9p{ajcJ zgkUK@Onmu|UERzsdeuNv(Fo%M4>sR=J5#SUt6@}>px_X-rVZme9Ufa=2!FUNxVdA6 zs3q)Jjp z&E4pLi>R~WY<_kF#(FCqX!D?TPnAun?#Yh3mhH6ER(-^Wxs(jHVu@Nmll`E;xtIR8-cf1qas5!hj<04>cKKbbIsPJiujQMiJRXA_(vWK%r3A$Xf zIqZAN0tasKHZw!Kz}+H_octw|br z_?OZ7z>>6^g(ABb=SZoPfd|w{&3;d78cM?6xmM*+BpsD?ZoRrB_ED;itA*;3gHS>L zGC*XP?>!wR)}xtLrn)z5^W;Y=7Wu|?Q}pr6TT<1t!fTEIFtH%2ajP)F1o?`EUVngq zCid3xX)y#CH|aoY4ypuz5--`S;y;8nG$<6J- zvL&ELs1<*9*&GLcK%qW4>o0N2nH?MYG=(BDc<>A(qbwS1%LM7 zBBUn|jPO4O$lIg4rn}}ng@fVv!&5h1TY_tdESBx7lgUOE2nF3@hhBK6Es62A>UXlM zQsR-TTF2@cKoBKo_hq})KV55UZ<`;te&M$Uc0%j*!?pr$b=)en77y%hled?Ge$hHq z*emr*JK7EV4m=)r^*~{>#yeZ`bR|qRm`h}-OzHp!J@HMf_TkXZ6R&r@xWcT{5W}(` zAzyeOmse^4lA`5}hn`9Sb#`eE2ySI$zE(k!9=ul3eixXXzX0y1asw4|Af#(w+;|Q0 zCX~)rczW-ss>9yAm`-k(AiU{tHO7bh+h{Qua8~iUehYt0S-66&CKVj((U${YLEjBe zU%1FN`MJ!U?sH)9!T(HlYBWFP?}@6<<_m9=-1?abQLfj$cg)X1LAyy>AT!2?Puz0x z-@>mv#4J<$PI57V?WYTs2b8DzZ{E9V>Hao1c^w@6qIxTK_-=cV!o3TX%qwFNm+d>P z>lZX1NN?skP+A2;(z@@rjwnLR*~^ztn98a+o=PIl=sWj(U zWebW&${jcUOnubJyipA1&mL$de}AV}x;DbA@bmR@MXc@Y}f8Ua76rJuBc zjxj#+Sor2!rwZC@DxP^f&p68L``&`O6H3u5W}sP#OF{D$+3x; zaf>C%(7GFJ=Wt{R&pI^mQi_1XH#n9*FHekdi5*nAmgD_}`Y8hm`}azd!Ej}IWzqM* zEG3D=!6R8ra0nHr;@T2vmeWvpm!yX1POmb8Iy3~M^;omnh0xNY<}~iV8L`5qvx-KG zbHKTlckZ4fqCjS2XTkd%o)%x1_B7f@t4@XH$Y7;K&9hO|T_~IZGD{6iHCMJr zlClY^cLf9>NzHRNS7*Ig!TzwHL5Y^%Ih3jQ+DU5=W8<>erheQ_B59VRDEoSrqg}yZ zJNQCKY$wri@tj^+Wk+P|h_Srek-Jsns|$}lFYgir50=P&hqGy22xrJnhI=o0c0F=k zaRwJbBG<@tUsGAoV-O6YjmppZ7-(65*Zh>t*T?(4IpLnG=|EROW=eTD_M=k95m7b4 zJ$Rb!Q@tk%RgwT_dvO*I8h&TL2x$R^#r!4EPiGeT!lxT)CGb=z!0x&#_V`}bV$csg zr2F4D!G?6fTaA_dHNv}m28L0d=nQ)VAIg@N$80K!{C~6ba?!z8@i`Ku!VWI9*tSE$ zeJ{7&Nwc=O2&9HsG1KDix(C4x@&iSbLqX;$F-_$8re>}gfO@O1`D)yQ1e8#?u!hW`lZ5>i}JYue3{9BKCZvJQ8%43RbSaT94_Qi& zw&w`anUek4fw{r@j|zPW85GDc#Vnn_-_YDNX4PYA4QsMB#|t$ux@=b=q!GHQ0tzw( zN`|a7!cgsr>s~_oM^CFSUF5Cs{0}{wf+w;qzB5e=x{)7_Z?}oaaQ1)nBBR030^zN~ zmV&EWndOf9C=Qg+S~2=dl>l5$NHB`GcuETtk9J{@e~(9)H~iMUT_O#wF1WT=lTzeuuQUC6x$!5~mdZ1~CdG|8wm{>t5CBbs=&mP-pN&zKxscRQA zZt8F97Hu?YJAt=-wSUSe7i!?(z&>W^R5nqs`VMP|KN;%wa81$sQQKBPvn;oCVhAK8 z+E$;N?KS-m?DKXuS^Hgrgn`oO{i@f!HGJ=OO3lt2Eu0owfw)4=_GudE1O~LOt?=3k zuFnd`a`B{8+9S@v20@)LfN;e+7YBq!!gM?YI=>yS9^Ik`4U-WY%1YV(0A?B=n1&l z`%-*egxmv=Osm1Afjk{IEUN9~;4JR~G?V5-9d^ddZCG&fd%VaP_etR`fgS64ZYtzS zYA3W2N;*bdrg6WG9ut(+%uqqRtsptgx$SC$Xk4T|COBr$#aiA#@qT7&cnR1m;VK!= zHxTOf8Jh;3GkKZrwV;C}W>o;jmX>#Zb|3^^A3lut*&oO-F1%Oz+ITZ(NZ+E`nc`Hu zdBVHsgoYWAD8FVI42a8dr2G|Fh*U=FQ}16xfKSTds5e3L&mQC2!){%O%!S)k2)cX) z*&GBz5D^BDC9ZwL%T+LgxMMjEB~DC=gMMEOCPpj?iGW3@ALC(cN_55)xx#@eko1m> z_a*r9Xxyxtw;uPx+{26dD!E*-g17!#5W+g1>TTNcCA9v zvXmm$quoTm^Up}Am~$Xn*6g>)nenczW6vobeLx9)<*zuKlJH{G3(zjcyllNXN=V)q zuwzN=DFM2+8;wLGO9G4TZr9^#(#pYtdtG4CF0vWQ%89rnEFOdG)$rAP`!yUNnwNa} zZ+sa~zM01F!LY&AYFk!Q?qwSJU6VJyKt+&y3;bVJy0NagEDk5CO58DnnQ-a@-Vqm|)!v?X7+4mV!yIv^`pP;b6S}=I$1tp7v7}n)b)h-@Al+8OE7$_ zZjtX7^qrlnJ6?B}IBozxQNm;mDsgLVr`MpjWQKvG@2-}mYsG67%eDLMeyg}jaMApP zD-iZ_)?n0Caf~!Zk9>1IM>o&ApVw)U-@3Ij$oj{ubHoesS%QZ%Gkui_r^_L1DQq~r6vY)el;gNOIZ|@O?uD^+8?3# zm1@@M!#-YK5)P0|`n#}j1!E=Hl)?SR>RSZOZOD|vzXM-)?)n+zcu+G}-;sBID0HEQ z(ul?dFHd`JP&>6NbY7VpLFO9Dhxt)6QyiXYBm)P?7+*O{($=XYk(uTMrK`^U(Z;BLS<@?Jn{f6aTS^qS`qgAC$PC*A3MJb5m{m zg(RN2#??p&$t=aBB7ib>7{6jhm%0$x`X9t+`Q!!v%ebG#+{s9wd)Bt6h$9a-=TyHw zrkFWpPR{J`coC$60*#5IKqEEb&P$z|NH099xHZq1vlnP$W!GLOKjL7 z?>3itZfAW>;`z=r5nN6uku^@f-DY~G+w`w9g|;;|W~SRe9{7{z4GAe`xeKD;)bAZ* zXVo~c1owngHu}Yhm@@R6-~jQ>+%sCr+;4Yge{SJhH{#fNBLdm;*NXbApYfg{}bc4VbBruslC9TkRa@+ahhw`}8+A?^I< zqp`(E|98%4%*-{_^p&dvpA{|Ia-_0tl8(7y_L!-@O(%eNS?2-6rlMwgO-8H*%=0`@ zAOcXF8)kEAewC_OoU3#6nB>E5{6js6gp~H{(Gmb%Ag2BG_*-|(zSGY@!^>;jUCDzr zLny(`T5wx*eAgM36iU%4BTKdil;nwvUqmf`y_;%+@$=>_dUBKo4YR3Z9H6wPwMf@D zzpL^9()}5556e)AZm}lirPY16%wC(kFOewBxL&Yaero-`CcBksrvT*afXo$K6(zBV zIi}H-^ja^{r?W=2u{S&Q3AjJluJcm9*uwS^rQ$sdVM(#A^rCi*em z6%76(ctq2TwAPmDgfSB-2M9@H6yg^&YedF%(t!u5PO8%rLhB7r%kaObH~~|0Yl31|7I_>8 zr)CI$1g{HK`_hAD6{NCxBiH7kx2H#On zGlDPH{=DlR3oe$}?BwmdyzMsc^@Y4WGJf)}?}B};hruKs2RR~aSx(6nFXf7@QzK8x z=MPro-zs_722eBdPN#Jp@`I!QOJVt*7gDcP2&N-fKyMryj3#VUGwy_=Z~hk?t(j66 zN|xOBjsLQd5}Ib;hGwev95`=Sn^5c*E94oSqj`p79IZS$3yh;=E9;fWy=wh(Qxij71Yl@TP9*s-K&ipc z^)}kPtiMlPDx!F|Mliw^Gig-2ngv2yHa}O}$+*WlNdE!oow0na6=`9cW@g?L|oyl5& zEOeZI)m}f2wIj9jXHV~#4(|YXz2NHjQej4}F4{kd5sr>XkO+^4^d>v;J9fGJV!B)h zMnMHZk4`^B{e3;yh3p8K;WN`M~3@$lryPLm6_%%q{3{4;s#HWzfO>d@<>2~{yRV4t1sH?JMn zV>0pwQJln&a>6B`Zw1=GNvx)(@6*B0QU~lLU2l;P8s^~N*s%)@6J0Mw%#Yxd11<$y zdGfC@Bo>49^sIRJTIBL}*kXN3#g}D936=xC?WZY72K+m8B8szHj#L8k7^(Eo?(p^A zZ&oAz)ee3oB}Y5t1kk49P~`Fj{%r(kH{~st-W;|atb41lyOc&^(R6M`3DvP#>Lf&~ zlXGCydVx)O=D>(YjS1HNBl9q}FWTtUAmbcy0n*k82#(9;O_Fp|kNFTzzR!R%;PtuM zk(r;In$L+Sn3sP?sn?rYzvd=Y%!EWOD@sJY>9j=%YuT5PJGRB&;y?J5eU^0R6*F83 z3!QlbGMOfpnWhy->=NNB53uxJyQq`juXf7FV)>L0Bwb z4EY9wPt5yiqdNJ!lTdAvX~=6gGpqX44!)5Z)EdKnFsIMNeHXT^v>I>n@_gGJ>!Su+ z?)$fue;AH09<8=#=&_1D4lD`WAr#rDFO!9Kq~Nq$R6hb-YV5LhR-iyU=lmPQ$o=xH ze(#?@Dn{#$WfXb~uDF$FfWP?3khwL|fLHePjuNUCbgVAU(A4qHCnrV&2�VKtT7FS;~ zx4#-MHIjl;1#VDn6m^mm0fO_?9P3?kc%eSZ<|1PNqfnT)f9f7EtJQ8?ez9YnfA>{G zVa2}FxubgIx%zB_Y(wy-u^AcP1q9Z6!h*QFwDnwFubh4TWgi)7IiQUf1DvoT|&eX)$;K13W2o0RBxyGM83LVDV^|fosAZ19Z zjX7;AiDtPZ$kl?agS~$QIMW1qW(<>_kZAoe-hH5v*POKsKA989ed{J2aoH$R{ZL`( z>)~zR?qLnB-`3H@X&#~H##acb&A|`S*_EsSVeGy(2Ym_6?MQlJmaGk<4p-P2;wat= z+AcZcMgc9X-_sv*csbl(207P^6mOO-3o^HBenaa5cN4o3s{(1G1!TYRjYTJv!tuT|ZtbLQ3*^&`2rL>?|5FYVi!Omz z3YYj!mtPd@7P@X~4HNH3NvPsW^^ZnbxGKqv>ec#mW`VkUrU#G;P*zgO?(2v*jHD;>?K;N#$ zpH6@_36!zpN+7lrdBZde?N3ca->p57*>|D}r1D_dNjyShw?bJm)whh3TQfUgrxDN$ zO=(Vyg;1hi+z0b{|toR_MUd~SYYew+oH@Ckh zHvYys?`Xn*j2n-hsX1|Ra^2;#x7wuS#58{LNk6xAYs&t;;Ldo0(;9TF=NedW(+K$A zp^k{(kVhHq=?&&Bvj&KSXO4ZM#^c6!ol)-aUg((0-sP=I`)=2=r@W2xTJM(f7wB6O zF6(OTnfF&FbbB(BT3-yf9TA_1$ZZsLi(#qx7_5aFF{S=?yhu!T-b1QZQr4{;^*h_%|;4i?wup2&2FhaZNgrB~4Ogm!0 zt<|RFT&&ExBv$%TVxL!9s5#TQclhWFsYFZF`@8md4aBn+=8V@FRaJQ@RDUJJHD;M2Za zrr|rg6EuYA7Ju1~kS4BA!J@2A%wtE;gJ2n|HxGK2#L!igWJFUKc1v%)VFpF$T^vlBeZeq{~5D^_&}6C`}u zmCTnF#rL9ET%BkmxuuS$V--P-PP93`-8c+kN8h}ET6Bl$nRAb^0S$oB#+Om!!Op}n zzBy>>1`w_zpUxHW#a6A|z_MC`xkJ#Aj(dYm=!;`wTp+;Tj z7g5x2?|s4*KhO}TPA({*KW9RhR>?-bYgB$jWIdYxcrE(AQ=cp+qtMj=a)u01*>HBT zV!Oq$zOc!M4GN^^`{I2c^bG~g8)E2w1Z1wqgV6!sJF?K}1jEb5{$cH?!`~95<%c?6 z=m4)cdpK;Iu$O}G_Fm9ZGM99^`z-BvJC_<#7+UR-LNtw$a=NJRd~~WOI{1jz(E-Py z5q9C-s}(UE&0`szp(}e|fYXKJ$hRQ29yy81KW&ORvAKvE{NCXH?tHt{-3GG?r`3W% zmlF>MZ=)I}2e^}eCqVC=T5|!S&+bCQx4!Li+qR~=qUSV!lUh4R+k#1(@G(2$2!Hb6ecN1fxXQ)K0T50i4tiI)d<`MYE*cPa(PkxtbMM zngK%Ff$5%lu^2SQYlCbH zx>SAGG)vKy%bL|e4teonTeZIPs7OH>^zloRBq@y|81LXgEUMA%h}c6NaSIaurB)1k zwx$|8noD{ne39M#?4X;6w$DfJ^#|11_1s$EN-uh8;I;lHS3m!azOe}3x@yzpeRZF? zsafrrMVO}Qn)kqeY%iV6C0t2?GE}3edtUo?z#^8hJQ?o8<21iEF%<*+J;rhN3y?;- zkG7;L<@VyO(t4#sqa_p2>NtsY{(fF@5p`T`tjnLPi9W-YoV!oL3Ex4^6$64Ce_#Sv zl3HD+SfN(Q^0Is=BCB{(5(aEe6f+IT7vX@D4h|E88X}R^CJcPlU=%cFq}9r9>CKuI zo@b>#`)AKmyGge2r8$pRbHGGAy$i(#eDRZvBtRI-9h)+vZ z9{Smejk`xH7d#2xUl)0Ih3Rg`?xN+dIEet!v3MuvUDWt)LhFi zHq7^#6O1|v-1OJTxi}loPFt%{j67d zAZ$%0p*U`bgEs9bVSdIi{%{>P~CUGG@s#}itUSR`k6=VT3ABL4A*_GdNY@fa5kuTejj5_seDj(>*G*5m~o>Q~IL0t5qWPijqI;q}l3EWa+ z7=;iblZt*`-oxO121}`OC+bEGJ4(Nq7#THzInCz za&Zf{R= zBx*eCbg&gV9?52RvtEw|R+k}>q+ENYqk_mFI>m`K ziUApv=ITjB$YZ`X9to|^72KDV2%vO;a8UKbi_u^2)W$BId@tGE%gW)*tpce5yhRP1 zb6dyFWFr7lq7IX>{DTz005i3{eiCS=r2{EmH=CF7_2|bFm5#ibPTviNQSq25z7^3c zxR^l&zG3auv|em+iw+20aDVn7-DsolL13&fwsEb{t*IJC47|^e9=$yZ=JChhE%%9n z3P^ZXN{x?!!!RjrInwy}5E?dOX?OWI5Xd_g*rPL3SrVm9H}-X2VV(f3+(vET_1JPzFwS5|HYuA63s8sOj6Z&Qgeke-$8;6>-9 zi~M@t%qujJA?ya=x%N#hrxmXaDjCO)S^h$vu7UN-w#;;SGue{yg+l{6Qebm6v~#yY zGBh33Usc4)3ECVgcioYAeapH10P*YEPUk>6|Da%|0n)=iPFNB&XcP{ipSn7?cyE}_ z=-b@y{jvHx(T=-iP_Jaw#C;oM*A^)7fL023ySKsw1tWDAS0Yc+CJf#vQ)5-J)24^S zOlQh(hdB4|$!_nOL4%364KSfxTxqx9@wBS)>NxhRfpp21za_kJJjZ3l6veiVD=Pe)^zLsS_ll-KHRjEt_+wWiBdY3rTwly^lnYw~5 zBSuZy-4oz0hVj18mFCKJZ7xp6YFlPb2wq4Q0zC?CfFp?$PWf^0u zrl^o5hU~({5b^n)KEL~Z-2e4>NS$-u=e*8yJLe3n4b{YmOoe<8{ClT%oNy7~I>#$Z zgxlPir}_rZDo3sPeid2{6FG{ZmJ>g0w+CMZx1P(e zWfDFBdXYP#G|_2Qe&i<8Q@iu-vb@-DatZ%@Fllo7Ydib7yOjGs+4Odv2FQPYxwT)) zD170Y)^&Bh|J+{>kd^$WKJoZ-qOSzF0=r}u90X^4tkaYFhk9!C$yb1;(AUrsYDxE3 zj{b7Wj(AJ#J=Zxl6nz(0h%6ga-ubu4lPA^lRPNKr_SD+ASMHaBA(WTnFG$Edki zF+bcT-jolc-7TKree~MTlv5jz^B)6VkG~T)`xn}1p2hP3d4>0Trd!pMI*qaVPirF9 z?f_G6KjC(J0Ea{B12eiwJ;v>?CwxzLgFjU!v38jmPyIgx#HuNd^X!YlYTi_vT1O1~ z*yS9TJAVyJt#x{*uP~BDX2dzqsD_++z?{uOm;dLNI@h^t_YItXb2U^uJGRQTrHuL_ zCH)gz6+Xo@Au@WnxW#0boVjd;tv{KyQ+ioqjM;-Jm$^>cY7pY$qLFENGCQUBq zfRX>tFMWk4#(#<1=MH~?Bpg4Ed2)I5KfjdSoo)$c?arl9LRMEMW89a~9>Eg0<*tlJ zK}%8JGeI7@R>JCxwE`%KRAKJfs~29~B?<9CGa9I$PHz9Y`x?B3Y4Ree+31|AXcJ?U8#mUtM@d!uVF`Vf>pa z$xla(2g{s$308-~;zmznw|l)JRZ>TABHYT6h?_anokxzVcLUU%SFZ(5`+roE*lpF` zb1w5r7&ZKSklpIJawHwUrZYTaye@I$*Ytl1+kSs{n1wz%{3gGA_xSI$;f3Y-j?t4> z7yH?)Q!D5{cw4TA7~DYo&&#AMVki8*NX7*SRTsUOB)NIdy!`)GpHH%GeS zYIJ#MYW2IgnP%x-#!6!bS!tjd4gZC>B+Q;=4gZgf;&ag&GSF>K- z@L+P(VF#DiF89u@PBU^=LaU+mF`*tgMmX<7gKc5ctJT-~gwM|)x;xT~;}mEIaVu?) z{dNt>dM~$*P)+}{+0Bj!ee)zQU~r;+e+U z$)35bh?1~3@BU@ItJ9I9CJZP3t!n@M%9+_$X$c>{vAr(AjuK;r7O9IFmp5ZBe#E!@ z+1+P5fWh4$5Mja)WOL_NrpB%f%MV6nraA+DZc>MeC&eFDj-x?87 z@t~x=_^u(M2g7DCQ>V~ju}3RA;PTkCxa%`2DED>Y4dgP_24^n+=A)r0G`#CR51Cro2I+Ku zROYR#j87WlxCM=P;Iw=F>!^N5ul&qKue)#mj%Q?S5ZXKpUkrw;exoW_bpFsaeDzP( zBc%)eFAsh2@vhhYhRsBPGmRhXj(S!%SofrE_w0#Xi!0u-+GiYvV?L_Y{Z@0K?A0Y6 zuPPS~YiHugSl!g^JL_?ZsLKd!$k{x(ND0yspT5&4d3}+~Z^u;x%NZYfuZEvcdRlk= z)^4}Mn)mSRq1lD<%bUBm$9}kn56=*SKO7tBAkSVsa*KEW0&?zR3w+-{FED_LR7QxF zx;F5Ybi@bF_1~9A^(S}=Ke#ejI-jt0$J`y^6d&vI-Rc4W15svPk6aGkD|7#h`!uOo zbEmUPFZ0sm!D0jNE5dR+_4knHM~~81j@;}2^NY`t{l+7y#_T4-$|K^3ck_SlM{2!| z#_$7D^{G%ileDw);NI&FpT7}v-)1h?bvLw{<6dSm)aN!&^niSRY_4JLa=A3*fl73Q z@8#NwSmv@y4(n^&-+ctRnwHxaq}HbK%#MV;JJzg^60(g)mqA@whqW#Y8-4h0`wqA2 zzN+SVa9DrTWA(K6O3}*kDTBm=Z>y?@yJ4~l+|J+?k5glJt%$ADPs7hhI*aaO?x=QB z2DkyN%gZ?dH}7x-1FtiT^jDP)gds@@+-!ss{BUGdbuX!9;y_YS%KylD7u=QY(mKxc zc~u$5yxg<1!P-rk?og$^*ZZB*S$`DSX9S_GWaag#8T~yFUf4?SpL-IMKds>$`T84U z?Zfc(*8HiiBhRU*^}?xLtn&MVA>~njA3YkU$b69cMZH2|Q ztn7(B-tD0CeB6|9fCUbWziLySk8N*qGV8Hw^jbNheAX+xDU!V!cV})(%HDG;>{-k$ zqxy$xwa4$5Ljbla_g1^ndh*=Iy;9GHU2$g8{_*5g(J5|At0A;~hV`NH(;pu9tB=v( zp6&c!+3R7GZ+G7=i;mrtkgb_pnSJ`>>dUno@vI*ek?&N)^nYZw`k5Gm7c1@@s~p4x zG(MR}hN<&3gIBYJ}+cPiuA=&_+k-4e8 z@~L+8xzEk?l^?I|cVly7KP1M;)E1~n%alQt)^|)+9FoIh&6j0 zq>)>Vy$yXrgr>I101E!^+>*zZ1m71zwsU8I=W1?V^P!+dcdcy={-9;#mS9dt?dJJS zt=LQIb3*z#{;;P-`~2r#ubstz>b%EUdsOllgR>5M(c9u*UQ?8`!L1^^3H$8&NU|o1 zu>diyaV*m}2>xr}<^tatW7H~lhY-0z!Pk3xR; z2WN0$EUSfj_X65D(|UJbw~Z}#6{m# z!jNupSjUj%jN2iv#@Ip7?zfd!8p6AQ*9X8;>CcONxw^au)!D1&2RBy=AANvu)vhkJ z=s@d2(MImAMa%EIWA1)De#u&V0r-GZX}%V1rh7;HTX^?;Y#RJ+;lbzH>j9@$-!yTp zI320I_SG&c$2pSid(=-SR{v*NM6E$CwghZR$Z> zHSsC&5X|X+7S!7veog9%2^#Mh?76n=?z#Iz9$InqD6M7Guy8%|R_NO@zu{cI+5irZ zE%oz@{f?H8dS8F}V=3ozF?fAuXIr=JGTK7FP)e!@Ifs<;{m;ZNr+@wJw?B-2IpBq; zl|7K24Q3|6K1T_`xi{jI0w$Xi5}8RNC}xT!vr)cJ{WQZP$tR#1eZG!ftsPA8R;&EJ z6dTFUPR+4STSkZq$a5>WhOUTV2hu!ZW1+tw(!+*%J3^Xs(HSC>V>7pziz+8wVPC6J z3j0Cjk4O^T=<2Ux=b|gnb&ZOqw`)}IZ+M0q-J%G|O(^t8rB6FA)mA-_&QeK9y49X2 z(6_Kzcu}SPzb%3x{Vr8A)$_ZOF=~>goPHuAnTE=Vd}uO|0q;mj66n_BXSdxIrpo9E z1fuJzC9te&tydbTRM~E3-6v52Dn<`VwMnF&K>PUP&fYFmOXd5AX33XoK)r+56AY54 ztf)yms4KR-USBnj-m*FomYlEX0?V+=#Xl?#e&r#pb+xEbH%4g3NrWT)Rr=^ky)B~$ z!Xb8#$5{qJRC2?KLojBijHYOy{XdnRIDu=7p>rR4#_U^pJ?;B3NEZl$8n{2;0gsyX z-Byt_sr=akhp3}{p2*1C@H)~4UYAxZB4hcP#LgqlD@fjRa!lfBv4pF5$?V(ZcU$gb zp%FOI%nG$cd0kWUUSnbZDK&drCAE~*6*=|jYH44FCsWdM%oSULS5CshR1z)96Vtm8 zLh^$#ay#cK#pTJN@|?7ehIev=FOFFkkt*3cUKaFjW~1_bRo9kaEQ==Us~bq2WmA_0 zn+B2cJ6i&gQIJJ0jJb*F3*1*f5>cL&i^m0T&AXwKSTtuzOo8)X1$%0?C*ECjKFv>GDKc!sYbdBh|8&qkOTH=)wIe&3?ly=04VtHLJpAWS7?Xx3FklhdD0~Edmu&tsN`mc>!eZF>XtlvKC zbbfb0%|)cab9MT7L7;re7@&yA5yWgm*{h{PC;utFD$yyy^NE7_zUs4b(l`oQu+x`<`>EexcVZ_;#GY3VbHjU|sb){cAWpWQLu zxAT#Nyzv%HKq`4gGTO#Sls0HU#_T|F)f|FISBg?T)vctR{9xsr|LNVWmcF6@nX-?>w=~`k{n9 z;t`a8fab6Lk^zX4K zZ3GChdi3Sd&_vPL)9jH=thqGXVM>v4STO4=zux-V7vZNS_c(u~Z$fx#1Vi)0ENsPI zxUGogEYxqUZ3+gRCmZU>HhT@GhU$CQs79#?BClMu$WMgYV^9-ORw6MXCBfB|??-d` z)S)STMSr)iu4%oBQFmYzZ`=1@!6O~>WQ%dd)i$~O#iG~iyVm@15NSg<_hD?UYjb_@ zlfyWaf>Mpq$7pxxf~mS@4G+}o2`2eEsTI4Jkw@UxQG#96vli@>6ZPD*igI3ud3#n` zXVcLN@<;u;(fqfK_FFUHS-mlw;;|}cZqLkAmL?kD?(b{NFWHPS%&)dP0@K!{w0$Fwl^KSAEJOzMGqqg&ZdT&Wd;UuC zv#M8lu~EJVJgvDP5^Ov{rGQM_!3gV3ZiQ34T!IRqv_`pQwiStCTV46d7`nJ;`J%a4eNBlAd{QPY4Zezx^)c{j@Qk6Tk(oF zGMmapfi>{C@sme zX0wfEIXFS=T)eWK)g6NqAKix5ES_7i^IK$6nXY%GwwmY7ce1HFREpN6@}dqceodtf zuAFob0^fis)G$u_sN9R`TGP$$l6Uo+-%Lv%uHxLDB;*#u9iQ{G5gO&UsxM;QG-Zpe z`pBWO#S%YzY9*4y!$L)sx(2#0Tc?)Yksk;;UsnUY5~?C;sw~d)d8^oPi9uLM(WsR+ z+c9e%$W(RBL&RGwfeGB|$u4-Am}|A>Lugdtj+^;jdyyEYc6%|by632L|2^Z!m7>%H zPO-Ied=l|zrzt6B>o#$s=_#MBq`fa`dA)*4@;~OtyeB)vN+Dqa5z;C=*Y(3j#kuo~9ENr|yxK5H9Qgq>?%89FB~p zq5;`Kh;whcdd-4{hOZ~*n&bWBhqgrvcUSA`T$TLtE za~smussHC|p($lnOXxuNlgYk#BreqVrsz*BIN1U14weO{+1j1L$?k7_Oy^~@fC8f0B1xP90Q<9g59`Rlm z3b3RAK|R1GWftvYGjleq5-AlLNlzL392z+K%t27&o{6u`TI^s$X~f~xRASdG5ol*5?T zMV%%*)BM5zxKu_{-m&E;xQB0k63te{P8LE!E^M0Al@Um3i>+&#B@=?Frk=En+d@Ge zYgVVI{R99|T|0Vcij#(G9Mrq7SJ49-bdYq^{*}9sc!49+jPO)FcpBvuKUrF+2H|Mk z>)AW~{dy9tPfsBHza{G@JgoDK3>EjX)fTw0i6eR)lR2cw<3IBh5iedEyq|xk@_tEm zda3GB`3S}TSPKFBB!bS;SXZcPCelO%jL$blwPr2EUu?w>hYknJTcitfw-MOB8{wf( z6@&#jxr)2;b$Q}-E%I0aMFIok%OEanG2lA=DUheJr$?6BreY~ng z!D}A+7_sa0I?V$zH=1-No&Rz)zON^%GPqlh+Vn@RbY&33Qf6Vm6Yn)pj$x)?IYj2r zEPreO?s3T#1I=Ti<+3W?_`7%F`S|;r=Le(}N_N=ShN9bF-sOE6SZ2rY z$kggG7=4_zLhQxytXY2qRa@due2WC6)$E=v(v0k@Gue2)4r`9mOD7$3I4Ma0H3>|V zcPy>D8j$y+cw)tqpfmdlVlPEAW$`X$lzNlQKM9QMWO?fvqU&xN>26Znz@r+>_YJscPKvBs>O&&8_j^fFb2ArT()13^fh(*GjI^8Jj z8l*nB7;Jb`T=@;`X9zUn8JzJfShhk_zAjf3R{O<8!xGJ$Tonhd+X; zDj$D8SCp4}$s6aPRmm_gpb=T5xp0p!7IdX590WyfP3WyE12xWK9&xy1AY&TDz?kGB zgoNKDW8ZVWyAfQmjttM%cDz?ch@t(8nQ_XDd2dO@>z|Yx6lN6JEXO7W(w-;a^%16W zZ#++l5}1NDueRzdd&F~{>}z#$32f`B-m1<%ab}Hu{$uXhlbveKb?Hj73-`o1?6MF^ zSXFZm7N=d=%MMo7dweF_6|vNBDj^%bVSYyS-2& z1cRpZ(yR{v_QWo);cVlF9x*la>o(=kMt2}00`LLZc|t}csPXYZpwgEGLvu-vpCCzh zjhp6TCtT@eeY!%`#9o^HvrSTS9LBmFHU-!Y_WF+#7S+g~tmpiuN!IXY;p^KN@hIA8 zt_=8uV*sK&uOq9Ji?K_C74e6m@(hA>HdWfm&&<>@u6oJd`ijFRigu*wro*JAS1u+3 zoBfk3WGIuTHmecq0~z)h=81COAxJBoFu-@3onn&Zi@OY_MS%Q(ItjDM1wCpyK0TW9 zM+p?uys`USvwB|j5lHDEOQ)g@ttJ23f!oe**Kpd*&E8gJznkVkcsus4zME| zWd7_59I-aWxHjLv0vel6wLjx;U<2V!knbpTXu;wF(b$q~0wQy)2{rjz7O%(ACNuH? z*njFFDv&a_W@xGMqjzeHP4Ai&<*%N2DfljUfBD{AJRlkCI1e!8Zo83vwcB@k=DAL4 zscNZ1cll2A$@p3cY8h-bmj}T#$^vD<%+qz#G$5LMpk_(6MsOv0A(TBKw?p3I60lD@ij^yb=7N}2~rU$HKbdMl44$!UXAoF&%|<&$FUhMVss zT1MXahV@;Aw8o@WKHfLuw5Bp|<5D$Dd8FjGlTtD3k#kvIiJANpTN|6It|WE(TM^z9 zh8OIz{g6t?EgZ&WDLT9lz=wr_lAN(dMPvTpeRd60wm4$D+w#!C9b>sanm;xIK+75s z2ZS|cF9l#Z7GK@aLs{oH)0N4U;p}pA@__Oh(pxg#lV&b>jA!&e3)VSm7|&x^!-qmt z-hxYE)t7A2BVLaIZA)_6u>ap3Ro4n|!bA=R<9T^V536KM%=NEFEw3r{rsYpM=|Wuu zE2eM>ce0!Q);M-t7s*ytN;hFQUC*0J%=+Ok*KColsD3@+pFpGyr&{`=qYVX)uN=C? z=LcA!oY=#WQ#;=Akmng_Hv#VlXn;Pt^@Nr1W3~qB>77$N_SXC^pCI-2tuR!eF5UjE z-$QRK`qf$gBm17Ui`Il85|PoLJ|%L_zCSgd(|>uP_E%>$(_%Odh8i2lgwM$((=b-v zYg`i7Jm_4GU%aY~=fau-Sj*Fe-ETCF0$eZ*q7C#evG6<8QK6MbAmS4rr5KMpH_Hn{ z+EMZ{+E@nNG&nXn;^ThBz;IfA?U!q>pr4H=;xNpI?36#fhd9CeZ_i@0)e2tQ3wPZE@t)tOUO zZ>!jU3rRuh7Z&!FH9|koH}qW^*5~9c@(>4i&E`J*;N{JhWDY%y0MI#mjKI!=o$)+h zmoFztra9l&NImiK^p&r2o$5HXAcjR*Gq3QEk^$stQF@O2+<`l*XfEA>zmW-YT&zF*FIrtALX4oTyTBQQHP?X1;7bc6* z)F4}Gd&rRoWIhnz6jl}SnaF7Nu!>PpD4_k0cz8Jan31#2s+aSln2jPA?EpC3j2JCO z(1{k$As2D6dTXv7XBfA#IqN_-P(#brwHY)zdXpEMTcRBz=`;82muwAq&C{j>k|{z6 zdkz{Jl|z;>VXOzw#Pg&Gibd$oF&@RYRqz=#LJ#jgj~> zuluIhh)5sDy-QS-?!xP;(DOksk-u8>I!CP-qeuJXaXMet*u6_TUZ!_?LHlUU-z>NphUEXMDk(+BU#6$5i!&OmCxGi zTIyWq$e?76$v*ZUwN&t#sdA;mX<2wKd~?pOSgUz|fy=fsh4n4;1DpZGjIDWh5l@tJ z{GKKPc7egTl}C?w2E+sbBq2(`$wk@Ybj0)b*~Q8NP6~}}1`#|4jar5Vy}5X=2aT;b zzGyt=5m3Z>`;ek=hBd>3$jzEEynog)J9BcT4-`TS}dcrGr}X&qXs*z3qel^ULKVNY&yCq>gZ+ zXPLiQ9uQwc;G9Az^-@@qmMDJ(Vv{SJz;N}ZiF)EA>~a=^qxM$)cmEyE>-N?@Qefx` zoag#jdf$#f!zMp$653>CH2ZGNie4{`6bv-+SDfrfNFD56^#6jW$^j28J#$eCd+GO( z$ZEXn@oX^S%TwaQ0H3$n)~)@c%M8#K%O~hTfV4r&NG)-t#2y%w^wzJxR7H?wF`5ww zT4od)BGY@ryP^ucs?#Nd6Iy94ATL2I8+gAWjH}$9d z8G)sQvEZufdj2+<@)Suvk25(*Sv{#5GluadGPXVbD&#R%(pVPMAN~5`5+PSjCUD=S zXspSI5j=-T9w4Sq;?x>T%kE~_f3;!0lrQN%-<*_iDG(MHfV^1J+br0E7|ko^%@$`| z`*w%N97P+puy4LLKtjZyd{Fu8T!m}LNTKqn9-kbnhvC|-g8_OsW4IWnl9a9L?)`<8 zOxcsMeiov952g;(H@{+0-~YC_X0c^w)CwB~g;UUI$!-y2SGoG;!)NCyqRx;r5$zPT zqOHNjc?(wt-H17~5to!b*%BO2Dwa#Mf?I0)p z-bPCT-aLh$wbjUlP}8BjIkE*^LGfP|$*ACNGR?^*Ls6%H?WWdR*zGR*MmO-BtR*i} zHRf34f#;kE0z-oD!lYR|aja}lfXQEsX?_N$JWriAoExstRCH3I zX4n0ksf5ODQ7Rs%GmV{vduh71Xv%1a2c6#}AQAD9TK={Rl(kPn^yZsI#QxxvMwTa z&8w~u*%C5$6}?4I5{Oz{voWP0J*zol1JFKlRHlW~hj9HLz<|^DtY8fAB)TTGG>!4!6sd;PJfpf14}#=C>>XxH@DQj3+a( z+jJ68+{1l=jqZ5m9rsa2z^#|WF&oz!Wr+HjmS}h*JbrS0PvDJPyk(47 zw!AaxYB#)}?U2N)_D^$YUqHH&-Lqi1&*F@f)1yt5##RHR5uJLVa_w2P%SbdL1Tuov}3*QkGbM+|GNj zBj99DJG{;CP-q4-7?ldY1K*;>l^mA?40oulik%Vp!Z22KrH|43Oa{{B7I)l=h%_Rp zIbGh)YAEZT?SFnr;T`^B4NTQB2H+s>vE=d?cjF)EM&xaw=347Z%0D} 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%0DLjKJZ+%R4zPA%FuEP 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%0AF9QRL-lIFUFZH+5v7C- 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%0A$wgV=A#pkr&iTV6kqg5KQ7xd5#V%ZF?AZ3VT0T3 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

    IJOMp5=uRAT>*#l@95iGBl;D+BE1@L%h*h%#S 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 Qkxax@yGH{}hX$zs*{<1Q!Tblob_bottom_vec_, &this->blob_top_vec_); EXPECT_EQ(this->blob_top_data_->num(), 5); EXPECT_EQ(this->blob_top_data_->channels(), 3); - EXPECT_EQ(this->blob_top_data_->height(), 1200); - EXPECT_EQ(this->blob_top_data_->width(), 1600); + EXPECT_EQ(this->blob_top_data_->height(), 360); + EXPECT_EQ(this->blob_top_data_->width(), 480); EXPECT_EQ(this->blob_top_label_->num(), 5); EXPECT_EQ(this->blob_top_label_->channels(), 1); EXPECT_EQ(this->blob_top_label_->height(), 1); @@ -122,8 +122,8 @@ TYPED_TEST(ImageDataLayerTest, TestShuffle) { layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); EXPECT_EQ(this->blob_top_data_->num(), 5); EXPECT_EQ(this->blob_top_data_->channels(), 3); - EXPECT_EQ(this->blob_top_data_->height(), 1200); - EXPECT_EQ(this->blob_top_data_->width(), 1600); + EXPECT_EQ(this->blob_top_data_->height(), 360); + EXPECT_EQ(this->blob_top_data_->width(), 480); EXPECT_EQ(this->blob_top_label_->num(), 5); EXPECT_EQ(this->blob_top_label_->channels(), 1); EXPECT_EQ(this->blob_top_label_->height(), 1); From 334b92474ccc1853fa92ba280bfff81312428ea5 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 22 May 2014 02:13:04 -0700 Subject: [PATCH 0033/2053] fix layer name in logging --- src/caffe/layers/eltwise_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 769d0157d44..13cd34d0602 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -12,9 +12,9 @@ template void EltwiseLayer::SetUp(const vector*>& bottom, vector*>* top) { CHECK_GE(bottom.size(), 2) << - "Eltwise Product Layer takes at least 2 blobs as input."; + "Eltwise Layer takes at least 2 blobs as input."; CHECK_EQ(top->size(), 1) << - "Eltwise Product Layer takes a single blob as output."; + "Eltwise Layer takes a single blob as output."; const int num = bottom[0]->num(); const int channels = bottom[0]->channels(); const int height = bottom[0]->height(); From 385fc6c5a4be831f22675f0d84242ed57ee36010 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 22 May 2014 17:41:24 -0700 Subject: [PATCH 0034/2053] make sum the default eltwise operation --- src/caffe/proto/caffe.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index a7fb37bb76b..da07af08920 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -257,7 +257,7 @@ message EltwiseParameter { PROD = 0; SUM = 1; } - optional EltwiseOp operation = 1; // element-wise operation to compute + optional EltwiseOp operation = 1 [default = SUM]; // element-wise operation } // Message that stores parameters used by HDF5DataLayer From 2dd9b43a954a8b5be2a48f7b449e301800bcf728 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 22 May 2014 20:12:11 -0700 Subject: [PATCH 0035/2053] weight elementwise sum with per-blob coefficients --- include/caffe/vision_layers.hpp | 1 + src/caffe/layers/eltwise_layer.cpp | 29 +++++++++-- src/caffe/layers/eltwise_layer.cu | 13 +++-- src/caffe/proto/caffe.proto | 1 + src/caffe/test/test_eltwise_layer.cpp | 74 +++++++++++++++++++++++++++ 5 files changed, 110 insertions(+), 8 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 3acb8df6c27..07ab5779b66 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -134,6 +134,7 @@ class EltwiseLayer : public Layer { const bool propagate_down, vector*>* bottom); EltwiseParameter_EltwiseOp op_; + vector coeffs_; }; /* FlattenLayer diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 13cd34d0602..77eae3042c3 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -6,6 +6,8 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +using std::fill; + namespace caffe { template @@ -15,6 +17,13 @@ void EltwiseLayer::SetUp(const vector*>& bottom, "Eltwise Layer takes at least 2 blobs as input."; CHECK_EQ(top->size(), 1) << "Eltwise Layer takes a single blob as output."; + CHECK(this->layer_param().eltwise_param().coeff_size() == 0 + || this->layer_param().eltwise_param().coeff_size() == bottom.size()) << + "Eltwise Layer takes one coefficient per bottom blob."; + CHECK(!(this->layer_param().eltwise_param().operation() + == EltwiseParameter_EltwiseOp_PROD + && this->layer_param().eltwise_param().coeff_size())) << + "Eltwise layer only takes coefficients for summation."; const int num = bottom[0]->num(); const int channels = bottom[0]->channels(); const int height = bottom[0]->height(); @@ -27,6 +36,13 @@ void EltwiseLayer::SetUp(const vector*>& bottom, } (*top)[0]->Reshape(num, channels, height, width); op_ = this->layer_param_.eltwise_param().operation(); + // Blob-wise coefficients for the elementwise operation. + coeffs_ = vector(bottom.size(), 1); + if (this->layer_param().eltwise_param().coeff_size()) { + for (int i = 0; i < bottom.size(); ++i) { + coeffs_[i] = this->layer_param().eltwise_param().coeff(i); + } + } } template @@ -42,9 +58,10 @@ Dtype EltwiseLayer::Forward_cpu( } break; case EltwiseParameter_EltwiseOp_SUM: - caffe_add(count, bottom[0]->cpu_data(), bottom[1]->cpu_data(), top_data); - for (int i = 2; i < bottom.size(); ++i) { - caffe_add(count, top_data, bottom[i]->cpu_data(), top_data); + caffe_set(count, Dtype(0), top_data); + // TODO(shelhamer) does BLAS optimize to sum for coeff = 1? + for (int i = 0; i < bottom.size(); ++i) { + caffe_axpy(count, coeffs_[i], bottom[i]->cpu_data(), top_data); } break; default: @@ -69,7 +86,11 @@ void EltwiseLayer::Backward_cpu(const vector*>& top, caffe_mul(count, bottom_diff, top_diff, bottom_diff); break; case EltwiseParameter_EltwiseOp_SUM: - caffe_copy(count, top_diff, bottom_diff); + if (coeffs_[i] == Dtype(1)) { + caffe_copy(count, top_diff, bottom_diff); + } else { + caffe_cpu_scale(count, coeffs_[i], top_diff, bottom_diff); + } break; default: LOG(FATAL) << "Unknown elementwise operation."; diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index 8bdb6a3ca37..e1b63b11177 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -21,9 +21,10 @@ Dtype EltwiseLayer::Forward_gpu( } break; case EltwiseParameter_EltwiseOp_SUM: - caffe_gpu_add(count, bottom[0]->gpu_data(), bottom[1]->gpu_data(), top_data); - for (int i = 2; i < bottom.size(); ++i) { - caffe_gpu_add(count, top_data, bottom[i]->gpu_data(), top_data); + caffe_gpu_set(count, Dtype(0.), top_data); + // TODO(shelhamer) does cuBLAS optimize to sum for coeff = 1? + for (int i = 0; i < bottom.size(); ++i) { + caffe_gpu_axpy(count, coeffs_[i], bottom[i]->gpu_data(), top_data); } break; default: @@ -48,7 +49,11 @@ void EltwiseLayer::Backward_gpu(const vector*>& top, caffe_gpu_mul(count, bottom_diff, top_diff, bottom_diff); break; case EltwiseParameter_EltwiseOp_SUM: - caffe_gpu_copy(count, top_diff, bottom_diff); + if (coeffs_[i] == Dtype(1.)) { + caffe_gpu_copy(count, top_diff, bottom_diff); + } else { + caffe_gpu_scale(count, coeffs_[i], top_diff, bottom_diff); + } break; default: LOG(FATAL) << "Unknown elementwise operation."; diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index da07af08920..b792972fc62 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -258,6 +258,7 @@ message EltwiseParameter { SUM = 1; } optional EltwiseOp operation = 1 [default = SUM]; // element-wise operation + repeated float coeff = 2; // blob-wise coefficient } // Message that stores parameters used by HDF5DataLayer diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index dbb77fcee2c..5f72f625da4 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -103,6 +103,29 @@ TYPED_TEST(EltwiseLayerTest, TestSumCPU) { } } +TYPED_TEST(EltwiseLayerTest, TestSumCoeffCPU) { + Caffe::set_mode(Caffe::CPU); + LayerParameter layer_param; + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); + eltwise_param->add_coeff(1); + eltwise_param->add_coeff(-0.5); + eltwise_param->add_coeff(2); + shared_ptr > layer( + new EltwiseLayer(layer_param)); + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + const TypeParam* data = this->blob_top_->cpu_data(); + const int count = this->blob_top_->count(); + const TypeParam* in_data_a = this->blob_bottom_a_->cpu_data(); + const TypeParam* in_data_b = this->blob_bottom_b_->cpu_data(); + const TypeParam* in_data_c = this->blob_bottom_c_->cpu_data(); + for (int i = 0; i < count; ++i) { + EXPECT_NEAR(data[i], in_data_a[i] - 0.5*in_data_b[i] + 2*in_data_c[i], + 1e-4); + } +} + TYPED_TEST(EltwiseLayerTest, TestProdGPU) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; @@ -141,6 +164,29 @@ TYPED_TEST(EltwiseLayerTest, TestSumGPU) { } } +TYPED_TEST(EltwiseLayerTest, TestSumCoeffGPU) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); + eltwise_param->add_coeff(1); + eltwise_param->add_coeff(-0.5); + eltwise_param->add_coeff(2); + shared_ptr > layer( + new EltwiseLayer(layer_param)); + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + const TypeParam* data = this->blob_top_->cpu_data(); + const int count = this->blob_top_->count(); + const TypeParam* in_data_a = this->blob_bottom_a_->cpu_data(); + const TypeParam* in_data_b = this->blob_bottom_b_->cpu_data(); + const TypeParam* in_data_c = this->blob_bottom_c_->cpu_data(); + for (int i = 0; i < count; ++i) { + EXPECT_NEAR(data[i], in_data_a[i] - 0.5*in_data_b[i] + 2*in_data_c[i], + 1e-4); + } +} + TYPED_TEST(EltwiseLayerTest, TestProdCPUGradient) { Caffe::set_mode(Caffe::CPU); LayerParameter layer_param; @@ -163,6 +209,20 @@ TYPED_TEST(EltwiseLayerTest, TestSumCPUGradient) { &(this->blob_top_vec_)); } +TYPED_TEST(EltwiseLayerTest, TestSumCoeffCPUGradient) { + Caffe::set_mode(Caffe::CPU); + LayerParameter layer_param; + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); + eltwise_param->add_coeff(1); + eltwise_param->add_coeff(-0.5); + eltwise_param->add_coeff(2); + EltwiseLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + TYPED_TEST(EltwiseLayerTest, TestSumGPUGradient) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; @@ -174,4 +234,18 @@ TYPED_TEST(EltwiseLayerTest, TestSumGPUGradient) { &(this->blob_top_vec_)); } +TYPED_TEST(EltwiseLayerTest, TestSumCoeffGPUGradient) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); + eltwise_param->add_coeff(1); + eltwise_param->add_coeff(-0.5); + eltwise_param->add_coeff(2); + EltwiseLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + } // namespace caffe From b57d8f2eb740a8ceada56742c8125fd86476cf2d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 22 May 2014 21:24:16 -0700 Subject: [PATCH 0036/2053] commment, lint --- src/caffe/layers/eltwise_layer.cpp | 2 -- src/caffe/layers/eltwise_layer.cu | 3 ++- src/caffe/proto/caffe.proto | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 77eae3042c3..5d05124c4c8 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -6,8 +6,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::fill; - namespace caffe { template diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index e1b63b11177..75827badb80 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -15,7 +15,8 @@ Dtype EltwiseLayer::Forward_gpu( Dtype* top_data = (*top)[0]->mutable_gpu_data(); switch (op_) { case EltwiseParameter_EltwiseOp_PROD: - caffe_gpu_mul(count, bottom[0]->gpu_data(), bottom[1]->gpu_data(), top_data); + caffe_gpu_mul(count, bottom[0]->gpu_data(), + bottom[1]->gpu_data(), top_data); for (int i = 2; i < bottom.size(); ++i) { caffe_gpu_mul(count, top_data, bottom[i]->gpu_data(), top_data); } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index b792972fc62..5e230a11482 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -258,7 +258,7 @@ message EltwiseParameter { SUM = 1; } optional EltwiseOp operation = 1 [default = SUM]; // element-wise operation - repeated float coeff = 2; // blob-wise coefficient + repeated float coeff = 2; // blob-wise coefficient for SUM operation } // Message that stores parameters used by HDF5DataLayer From f1a85a3a495b41f0c8ce9ee7e96cfb61cf44c908 Mon Sep 17 00:00:00 2001 From: James Thewlis Date: Fri, 23 May 2014 15:59:52 +0100 Subject: [PATCH 0037/2053] Correctly invert the swapping of colour channels In the 'deprocess' method, get back the image with the original channel order by inverting the original transform, rather than reversing the tuple which is incorrect. --- python/caffe/pycaffe.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 537e737b5c0..4827300708c 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -284,7 +284,8 @@ def _Net_deprocess(self, input_name, input_): decaf_in += mean decaf_in = decaf_in.transpose((1,2,0)) if channel_order: - decaf_in = decaf_in[:, :, channel_order[::-1]] + channel_order_inverse = tuple([channel_order.index(i) for i in (0,1,2)]) + decaf_in = decaf_in[:, :, channel_order_inverse] if input_scale: decaf_in /= input_scale return decaf_in From f56f86a38bc990119f511a460f1c87bc39146f4c Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 23 May 2014 09:13:44 -0700 Subject: [PATCH 0038/2053] follow-up on #443 to invert k channels (instead of 3) --- python/caffe/pycaffe.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 4827300708c..8bed7046cc8 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -284,7 +284,8 @@ def _Net_deprocess(self, input_name, input_): decaf_in += mean decaf_in = decaf_in.transpose((1,2,0)) if channel_order: - channel_order_inverse = tuple([channel_order.index(i) for i in (0,1,2)]) + channel_order_inverse = [channel_order.index(i) + for i in range(decaf_in.shape[2])] decaf_in = decaf_in[:, :, channel_order_inverse] if input_scale: decaf_in /= input_scale From 2e292c44a7a21d301210bcb724cd91e2108d649e Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 23 May 2014 14:57:02 -0700 Subject: [PATCH 0039/2053] add convert_imageset option to resize images; use in convert_imageset.cpp and document --- docs/imagenet_training.md | 4 +-- examples/imagenet/create_imagenet.sh | 42 ++++++++++++++++++++++++---- tools/convert_imageset.cpp | 19 +++++++++---- 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/docs/imagenet_training.md b/docs/imagenet_training.md index 9e0076cf65f..f628f795652 100644 --- a/docs/imagenet_training.md +++ b/docs/imagenet_training.md @@ -30,7 +30,7 @@ You will first need to prepare some auxiliary data for training. This data can b The training and validation input are described in `train.txt` and `val.txt` as text listing all the files and their labels. Note that we use a different indexing for labels than the ILSVRC devkit: we sort the synset names in their ASCII order, and then label them from 0 to 999. See `synset_words.txt` for the synset/name mapping. -You will also need to resize the images to 256x256: we do not explicitly do this because in a cluster environment, one may benefit from resizing images in a parallel fashion, using mapreduce. For example, Yangqing used his lightedweighted [mincepie](https://github.com/Yangqing/mincepie) package to do mapreduce on the Berkeley cluster. If you would things to be rather simple and straightforward, you can also use shell commands, something like: +You may want to resize the images to 256x256 in advance. By default, we do not explicitly do this because in a cluster environment, one may benefit from resizing images in a parallel fashion, using mapreduce. For example, Yangqing used his lightedweighted [mincepie](https://github.com/Yangqing/mincepie) package to do mapreduce on the Berkeley cluster. If you would things to be rather simple and straightforward, you can also use shell commands, something like: for name in /path/to/imagenet/val/*.JPEG; do convert -resize 256x256\! $name $name @@ -38,7 +38,7 @@ You will also need to resize the images to 256x256: we do not explicitly do this Go to `$CAFFE_ROOT/examples/imagenet/` for the rest of this guide. -Take a look at `create_imagenet.sh`. Set the paths to the train and val dirs as needed. Now simply create the leveldbs with `./create_imagenet.sh`. Note that `imagenet_train_leveldb` and `imagenet_val_leveldb` should not exist before this execution. It will be created by the script. `GLOG_logtostderr=1` simply dumps more information for you to inspect, and you can safely ignore it. +Take a look at `create_imagenet.sh`. Set the paths to the train and val dirs as needed, and set "RESIZE=true" to resize all images to 256x256 if you haven't resized the images in advance. Now simply create the leveldbs with `./create_imagenet.sh`. Note that `imagenet_train_leveldb` and `imagenet_val_leveldb` should not exist before this execution. It will be created by the script. `GLOG_logtostderr=1` simply dumps more information for you to inspect, and you can safely ignore it. Compute Image Mean ------------------ diff --git a/examples/imagenet/create_imagenet.sh b/examples/imagenet/create_imagenet.sh index a1bcb7bfc5a..8767f120a83 100755 --- a/examples/imagenet/create_imagenet.sh +++ b/examples/imagenet/create_imagenet.sh @@ -5,16 +5,48 @@ TOOLS=../../build/tools DATA=../../data/ilsvrc12 -echo "Creating leveldb..." +TRAIN_DATA_ROOT=/path/to/imagenet/train/ +VAL_DATA_ROOT=/path/to/imagenet/val/ + +# Set RESIZE=true to resize the images to 256x256. Leave as false if images have +# already been resized using another tool. +RESIZE=false +if $RESIZE; then + RESIZE_HEIGHT=256 + RESIZE_WIDTH=256 +else + RESIZE_HEIGHT=0 + RESIZE_WIDTH=0 +fi + +if [ ! -d "$TRAIN_DATA_ROOT" ]; then + echo "Error: TRAIN_DATA_ROOT is not a path to a directory: $TRAIN_DATA_ROOT" + echo "Set the TRAIN_DATA_ROOT variable in create_imagenet.sh to the path" \ + "where the ImageNet training data is stored." + exit 1 +fi + +if [ ! -d "$VAL_DATA_ROOT" ]; then + echo "Error: VAL_DATA_ROOT is not a path to a directory: $VAL_DATA_ROOT" + echo "Set the VAL_DATA_ROOT variable in create_imagenet.sh to the path" \ + "where the ImageNet validation data is stored." + exit 1 +fi + +echo "Creating train leveldb..." GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \ - /path/to/imagenet/train/ \ + $TRAIN_DATA_ROOT \ $DATA/train.txt \ - imagenet_train_leveldb 1 + imagenet_train_leveldb 1 \ + $RESIZE_HEIGHT $RESIZE_WIDTH + +echo "Creating val leveldb..." GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \ - /path/to/imagenet/val/ \ + $VAL_DATA_ROOT \ $DATA/val.txt \ - imagenet_val_leveldb 1 + imagenet_val_leveldb 1 \ + $RESIZE_HEIGHT $RESIZE_WIDTH echo "Done." diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 2d4d4c77b52..900183a649b 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -2,7 +2,8 @@ // This program converts a set of images to a leveldb by storing them as Datum // proto buffers. // Usage: -// convert_imageset ROOTFOLDER/ LISTFILE DB_NAME [0/1] +// convert_imageset ROOTFOLDER/ LISTFILE DB_NAME [0/1] \ +// [resize_height] [resize_width] // where ROOTFOLDER is the root folder that holds all the images, and LISTFILE // should be a list of files as well as their labels, in the format as // subfolder1/file1.JPEG 7 @@ -29,12 +30,12 @@ using std::string; int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); - if (argc < 4 || argc > 5) { + if (argc < 4 || argc > 7) { printf("Convert a set of images to the leveldb format used\n" "as input for Caffe.\n" "Usage:\n" " convert_imageset ROOTFOLDER/ LISTFILE DB_NAME" - " RANDOM_SHUFFLE_DATA[0 or 1]\n" + " RANDOM_SHUFFLE_DATA[0 or 1] [resize_height] [resize_width]\n" "The ImageNet dataset for the training demo is at\n" " http://www.image-net.org/download-images\n"); return 1; @@ -46,12 +47,20 @@ int main(int argc, char** argv) { while (infile >> filename >> label) { lines.push_back(std::make_pair(filename, label)); } - if (argc == 5 && argv[4][0] == '1') { + if (argc >= 5 && argv[4][0] == '1') { // randomly shuffle data LOG(INFO) << "Shuffling data"; std::random_shuffle(lines.begin(), lines.end()); } LOG(INFO) << "A total of " << lines.size() << " images."; + int resize_height = 0; + int resize_width = 0; + if (argc >= 6) { + resize_height = atoi(argv[5]); + } + if (argc >= 7) { + resize_width = atoi(argv[6]); + } leveldb::DB* db; leveldb::Options options; @@ -73,7 +82,7 @@ int main(int argc, char** argv) { bool data_size_initialized = false; for (int line_id = 0; line_id < lines.size(); ++line_id) { if (!ReadImageToDatum(root_folder + lines[line_id].first, - lines[line_id].second, &datum)) { + lines[line_id].second, resize_height, resize_width, &datum)) { continue; } if (!data_size_initialized) { From 75aa8df452894de1107e9321cbd292e00ac2ce89 Mon Sep 17 00:00:00 2001 From: James Thewlis Date: Sat, 24 May 2014 17:53:13 +0100 Subject: [PATCH 0040/2053] Don't modify data pointers in im2col loop --- src/caffe/util/im2col.cu | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/caffe/util/im2col.cu b/src/caffe/util/im2col.cu index 8f5c6b04820..ec4465eff66 100644 --- a/src/caffe/util/im2col.cu +++ b/src/caffe/util/im2col.cu @@ -23,15 +23,17 @@ __global__ void im2col_gpu_kernel(const int n, const Dtype* data_im, int channel_out = channel_in * ksize * ksize; int h_in = h_out * stride - pad; int w_in = w_out * stride - pad; - data_col += (channel_out * height_col + h_out) * width_col + w_out; - data_im += (channel_in * height + h_in) * width + w_in; + Dtype* data_col_ptr = data_col; + data_col_ptr += (channel_out * height_col + h_out) * width_col + w_out; + const Dtype* data_im_ptr = data_im; + data_im_ptr += (channel_in * height + h_in) * width + w_in; for (int i = 0; i < ksize; ++i) { for (int j = 0; j < ksize; ++j) { int h = h_in + i; int w = w_in + j; - *data_col = (h >= 0 && w >= 0 && h < height && w < width) ? - data_im[i * width + j] : 0; - data_col += height_col * width_col; + *data_col_ptr = (h >= 0 && w >= 0 && h < height && w < width) ? + data_im_ptr[i * width + j] : 0; + data_col_ptr += height_col * width_col; } } } From 6b91c0aeab041cc84817ec37019bdad12b4e0bcf Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 19:49:02 -0700 Subject: [PATCH 0041/2053] Added max_idx to Pooling layer CPU --- include/caffe/vision_layers.hpp | 1 + src/caffe/layers/pooling_layer.cpp | 35 +++++++++++++++------------ src/caffe/test/test_pooling_layer.cpp | 27 +++++++++++++++++++++ 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 07ab5779b66..c0bbd370fce 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -350,6 +350,7 @@ class PoolingLayer : public Layer { int pooled_height_; int pooled_width_; Blob rand_idx_; + shared_ptr max_idx_; }; /* SoftmaxLayer diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 7e880a27b69..63ea12d9abc 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -4,8 +4,10 @@ #include #include +#include "caffe/common.hpp" #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" +#include "caffe/syncedmem.hpp" #include "caffe/util/math_functions.hpp" using std::max; @@ -35,6 +37,10 @@ void PoolingLayer::SetUp(const vector*>& bottom, width_ + 2 * pad_ - kernel_size_) / stride_)) + 1; (*top)[0]->Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); + // If max pooling, we will initialize the vector index part. + if (this->layer_param_.pool() == LayerParameter_PoolMethod_MAX) { + max_idx_.reset(new SyncedMemory((*top)[0]->count() * sizeof(int))); + } // If stochastic pooling, we will initialize the random index part. if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_STOCHASTIC) { @@ -53,11 +59,14 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, // Different pooling methods. We explicitly do the switch outside the for // loop to save time, although this results in more codes. int top_count = (*top)[0]->count(); + int* mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: - // Initialize + // Initialize + mask = (int*)max_idx_->mutable_cpu_data(); for (int i = 0; i < top_count; ++i) { top_data[i] = -FLT_MAX; + mask[i] = 0; } // The main loop for (int n = 0; n < bottom[0]->num(); ++n) { @@ -70,9 +79,10 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, int wend = min(wstart + kernel_size_, width_); for (int h = hstart; h < hend; ++h) { for (int w = wstart; w < wend; ++w) { - top_data[ph * pooled_width_ + pw] = - max(top_data[ph * pooled_width_ + pw], - bottom_data[h * width_ + w]); + if (bottom_data[h * width_ + w] > top_data[ph * pooled_width_ + pw]) { + top_data[ph * pooled_width_ + pw] = bottom_data[h * width_ + w]; + mask[ph * pooled_width_ + pw] = h * width_ + w; + } } } } @@ -80,6 +90,7 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, // compute offset bottom_data += bottom[0]->offset(0, 1); top_data += (*top)[0]->offset(0, 1); + mask += (*top)[0]->offset(0, 1); } } break; @@ -138,25 +149,16 @@ void PoolingLayer::Backward_cpu(const vector*>& top, // Different pooling methods. We explicitly do the switch outside the for // loop to save time, although this results in more codes. memset(bottom_diff, 0, (*bottom)[0]->count() * sizeof(Dtype)); + int* mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: // The main loop + mask = (int*)max_idx_->cpu_data(); for (int n = 0; n < top[0]->num(); ++n) { for (int c = 0; c < channels_; ++c) { for (int ph = 0; ph < pooled_height_; ++ph) { for (int pw = 0; pw < pooled_width_; ++pw) { - int hstart = ph * stride_; - int wstart = pw * stride_; - int hend = min(hstart + kernel_size_, height_); - int wend = min(wstart + kernel_size_, width_); - for (int h = hstart; h < hend; ++h) { - for (int w = wstart; w < wend; ++w) { - bottom_diff[h * width_ + w] += - top_diff[ph * pooled_width_ + pw] * - (bottom_data[h * width_ + w] == - top_data[ph * pooled_width_ + pw]); - } - } + bottom_diff[mask[ph * pooled_width_ + pw]]+=top_diff[ph * pooled_width_ + pw]; } } // offset @@ -164,6 +166,7 @@ void PoolingLayer::Backward_cpu(const vector*>& top, top_data += top[0]->offset(0, 1); bottom_diff += (*bottom)[0]->offset(0, 1); top_diff += top[0]->offset(0, 1); + mask += top[0]->offset(0, 1); } } break; diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index 41d4841f444..11bbd14a5c4 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -99,6 +99,33 @@ TYPED_TEST(PoolingLayerTest, PrintGPUBackward) { } */ +/* +TYPED_TEST(PoolingLayerTest, PrintCPUBackward) { + LayerParameter layer_param; + layer_param.set_kernelsize(3); + layer_param.set_stride(2); + layer_param.set_pool(LayerParameter_PoolMethod_MAX); + Caffe::set_mode(Caffe::CPU); + PoolingLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + cout << "bottom data " << i << " " << this->blob_bottom_->cpu_data()[i] << endl; + } + for (int i = 0; i < this->blob_top_->count(); ++i) { + cout << "top data " << i << " " << this->blob_top_->cpu_data()[i] << endl; + } + + for (int i = 0; i < this->blob_top_->count(); ++i) { + this->blob_top_->mutable_cpu_diff()[i] = i; + } + layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + cout << "bottom diff " << i << " " << this->blob_bottom_->cpu_diff()[i] << endl; + } +} +*/ + TYPED_TEST(PoolingLayerTest, TestCPUGradientMax) { LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); From 134922c54f817ebe92e8499c91650b2671fafdad Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Mon, 24 Feb 2014 17:36:17 -0800 Subject: [PATCH 0042/2053] Default mask idx is -1 --- src/caffe/layers/pooling_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 63ea12d9abc..014f47bbd41 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -66,7 +66,7 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, mask = (int*)max_idx_->mutable_cpu_data(); for (int i = 0; i < top_count; ++i) { top_data[i] = -FLT_MAX; - mask[i] = 0; + mask[i] = -1; } // The main loop for (int n = 0; n < bottom[0]->num(); ++n) { From 22639018dcd23dc3d85297dd0dc1d2d3c0d486f8 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 19:58:05 -0700 Subject: [PATCH 0043/2053] Added max_idx to Pooling layer GPU --- src/caffe/layers/pooling_layer.cu | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 95bfaefc951..ff46109210c 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -17,7 +17,7 @@ template __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, Dtype* top_data) { + const int kernel_size, const int stride, Dtype* top_data, int* mask) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; @@ -28,13 +28,19 @@ __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, int wstart = pw * stride; int wend = min(wstart + kernel_size, width); Dtype maxval = -FLT_MAX; + int maxidx = -1; bottom_data += (n * channels + c) * height * width; for (int h = hstart; h < hend; ++h) { for (int w = wstart; w < wend; ++w) { - maxval = max(maxval, bottom_data[h * width + w]); + if (bottom_data[h * width + w] > maxval) { + maxidx = h * width + w; + maxval = bottom_data[maxidx]; + } + } } top_data[index] = maxval; + mask[index] = maxidx; } } @@ -145,13 +151,15 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); int count = (*top)[0]->count(); + int* mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: // NOLINT_NEXT_LINE(whitespace/operators) + mask = (int*)max_idx_->mutable_gpu_data(); MaxPoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, kernel_size_, stride_, - top_data); + top_data, mask); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) @@ -192,7 +200,7 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* bottom_data, const Dtype* top_data, const Dtype* top_diff, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, Dtype* bottom_diff) { + const int kernel_size, const int stride, Dtype* bottom_diff, int* mask) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset @@ -209,6 +217,7 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* bottom_data, bottom_data[((n * channels + c) * height + h) * width + w]; top_data += (n * channels + c) * pooled_height * pooled_width; top_diff += (n * channels + c) * pooled_height * pooled_width; + //bottom_diff[index] += top_diff[mask[index]]; for (int ph = phstart; ph < phend; ++ph) { for (int pw = pwstart; pw < pwend; ++pw) { gradient += top_diff[ph * pooled_width + pw] * @@ -295,13 +304,14 @@ void PoolingLayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); int count = (*bottom)[0]->count(); + int* mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<<>>( count, (*bottom)[0]->gpu_data(), top[0]->gpu_data(), top_diff, top[0]->num(), channels_, height_, width_, pooled_height_, - pooled_width_, kernel_size_, stride_, bottom_diff); + pooled_width_, kernel_size_, stride_, bottom_diff, mask); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) From 75e11f5d2ef73d1e83ab93f4858dd314db51251f Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 20:02:34 -0700 Subject: [PATCH 0044/2053] Added test for Pooling layer GPU --- src/caffe/test/test_pooling_layer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index 11bbd14a5c4..d21fc8bc5e0 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -25,7 +25,7 @@ class PoolingLayerTest : public ::testing::Test { blob_top_(new Blob()) {} virtual void SetUp() { Caffe::set_random_seed(1701); - blob_bottom_->Reshape(2, 3, 6, 5); + blob_bottom_->Reshape(1, 1, 6, 5); // fill the values FillerParameter filler_param; GaussianFiller filler(filler_param); @@ -82,6 +82,7 @@ TYPED_TEST(PoolingLayerTest, PrintGPUBackward) { PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { cout << "bottom data " << i << " " << this->blob_bottom_->cpu_data()[i] << endl; } From 842af5e8659e64c8cd1c1a7210bfda81fc1c6c09 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 20:06:38 -0700 Subject: [PATCH 0045/2053] Use mask_idx to compute backward Max Pooling --- src/caffe/layers/pooling_layer.cpp | 7 ---- src/caffe/layers/pooling_layer.cu | 65 ++++++++++++++++++------------ 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 014f47bbd41..e052f78f8ca 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -143,8 +143,6 @@ void PoolingLayer::Backward_cpu(const vector*>& top, return; } const Dtype* top_diff = top[0]->cpu_diff(); - const Dtype* top_data = top[0]->cpu_data(); - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); // Different pooling methods. We explicitly do the switch outside the for // loop to save time, although this results in more codes. @@ -161,9 +159,6 @@ void PoolingLayer::Backward_cpu(const vector*>& top, bottom_diff[mask[ph * pooled_width_ + pw]]+=top_diff[ph * pooled_width_ + pw]; } } - // offset - bottom_data += (*bottom)[0]->offset(0, 1); - top_data += top[0]->offset(0, 1); bottom_diff += (*bottom)[0]->offset(0, 1); top_diff += top[0]->offset(0, 1); mask += top[0]->offset(0, 1); @@ -194,8 +189,6 @@ void PoolingLayer::Backward_cpu(const vector*>& top, } } // offset - bottom_data += (*bottom)[0]->offset(0, 1); - top_data += top[0]->offset(0, 1); bottom_diff += (*bottom)[0]->offset(0, 1); top_diff += top[0]->offset(0, 1); } diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index ff46109210c..b88b09721f1 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -195,40 +195,55 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, return Dtype(0.); } +// template +// __global__ void MaxPoolBackward(const int nthreads, const Dtype* bottom_data, +// const Dtype* top_data, const Dtype* top_diff, +// const int num, const int channels, const int height, +// const int width, const int pooled_height, const int pooled_width, +// const int ksize, const int stride, Dtype* bottom_diff, int* mask) { +// int index = threadIdx.x + blockIdx.x * blockDim.x; +// if (index < nthreads) { +// // find out the local index +// // find out the local offset +// int w = index % width; +// int h = (index / width) % height; +// int c = (index / width / height) % channels; +// int n = index / width / height / channels; +// int phstart = (h < ksize) ? 0 : (h - ksize) / stride + 1; +// int phend = min(h / stride + 1, pooled_height); +// int pwstart = (w < ksize) ? 0 : (w - ksize) / stride + 1; +// int pwend = min(w / stride + 1, pooled_width); +// Dtype gradient = 0; +// Dtype bottom_datum = +// bottom_data[((n * channels + c) * height + h) * width + w]; +// top_data += (n * channels + c) * pooled_height * pooled_width; +// top_diff += (n * channels + c) * pooled_height * pooled_width; +// //bottom_diff[index] += top_diff[mask[index]]; +// for (int ph = phstart; ph < phend; ++ph) { +// for (int pw = pwstart; pw < pwend; ++pw) { +// gradient += top_diff[ph * pooled_width + pw] * +// (bottom_datum == top_data[ph * pooled_width + pw]); +// } +// } +// bottom_diff[index] = gradient; +// } // (if index < nthreads) +// } + template -__global__ void MaxPoolBackward(const int nthreads, const Dtype* bottom_data, - const Dtype* top_data, const Dtype* top_diff, +__global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int kernel_size, const int stride, Dtype* bottom_diff, int* mask) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset - int w = index % width; - int h = (index / width) % height; - int c = (index / width / height) % channels; - int n = index / width / height / channels; - int phstart = (h < kernel_size) ? 0 : (h - kernel_size) / stride + 1; - int phend = min(h / stride + 1, pooled_height); - int pwstart = (w < kernel_size) ? 0 : (w - kernel_size) / stride + 1; - int pwend = min(w / stride + 1, pooled_width); - Dtype gradient = 0; - Dtype bottom_datum = - bottom_data[((n * channels + c) * height + h) * width + w]; - top_data += (n * channels + c) * pooled_height * pooled_width; - top_diff += (n * channels + c) * pooled_height * pooled_width; - //bottom_diff[index] += top_diff[mask[index]]; - for (int ph = phstart; ph < phend; ++ph) { - for (int pw = pwstart; pw < pwend; ++pw) { - gradient += top_diff[ph * pooled_width + pw] * - (bottom_datum == top_data[ph * pooled_width + pw]); - } - } - bottom_diff[index] = gradient; - } + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + bottom_diff += (n * channels + c) * height * width; + bottom_diff[mask[index]] += top_diff[index]; + } } - template __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, From c77737735ebced62f7d4d0d23996e14613d70ee1 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 20:10:10 -0700 Subject: [PATCH 0046/2053] Remove top_data from backward Max Pooling --- src/caffe/layers/pooling_layer.cu | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index b88b09721f1..95a754f4a17 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -320,13 +320,17 @@ void PoolingLayer::Backward_gpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); int count = (*bottom)[0]->count(); int* mask; + switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: + mask = (int*)max_idx_->gpu_data(); + // Since we have the mask we only need count top_diff + count = top[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<<>>( - count, (*bottom)[0]->gpu_data(), top[0]->gpu_data(), top_diff, - top[0]->num(), channels_, height_, width_, pooled_height_, - pooled_width_, kernel_size_, stride_, bottom_diff, mask); + count, top_diff, top[0]->num(), channels_, + height_, width_, pooled_height_, pooled_width_, + kernel_size_, stride_, bottom_diff, mask); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) From a2b1785ac6df619ae7b6e47e31b988853729baa3 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 20:11:49 -0700 Subject: [PATCH 0047/2053] Set bottom_diff to 0 and remove Async memcopy --- src/caffe/layers/pooling_layer.cu | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 95a754f4a17..77126e6b120 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -327,6 +327,7 @@ void PoolingLayer::Backward_gpu(const vector*>& top, // Since we have the mask we only need count top_diff count = top[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) + caffe_gpu_memset(count,Dtype(0.),bottom_diff); MaxPoolBackward<<>>( count, top_diff, top[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, From 46b79e1cd71a3ce55ac58ef75ecd52421342a08e Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 20:13:05 -0700 Subject: [PATCH 0048/2053] Cleaned prints from test_pooling_layer.cpp --- src/caffe/test/test_pooling_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index d21fc8bc5e0..a26078ee5a2 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -25,7 +25,7 @@ class PoolingLayerTest : public ::testing::Test { blob_top_(new Blob()) {} virtual void SetUp() { Caffe::set_random_seed(1701); - blob_bottom_->Reshape(1, 1, 6, 5); + blob_bottom_->Reshape(2, 3, 6, 5); // fill the values FillerParameter filler_param; GaussianFiller filler(filler_param); From e08651da2c73be3a3803e86b812f545c17105b52 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 20:14:43 -0700 Subject: [PATCH 0049/2053] Fixed parameter order --- src/caffe/layers/pooling_layer.cu | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 77126e6b120..8be15211e54 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -319,6 +319,7 @@ void PoolingLayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); int count = (*bottom)[0]->count(); + CUDA_CHECK(cudaMemset(bottom_diff, 0, sizeof(Dtype) * count)); int* mask; switch (this->layer_param_.pooling_param().pool()) { From 8f5448be12ae4df1a9bf4250183a4756733abfa9 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 20:21:15 -0700 Subject: [PATCH 0050/2053] Use loops in GPU again to avoid over-writting of bottom_diff --- src/caffe/layers/pooling_layer.cu | 74 +++++++++++++++---------------- 1 file changed, 35 insertions(+), 39 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 8be15211e54..e3d7546feb5 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -12,7 +12,7 @@ using std::max; using std::min; namespace caffe { - + template __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, @@ -195,40 +195,6 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, return Dtype(0.); } -// template -// __global__ void MaxPoolBackward(const int nthreads, const Dtype* bottom_data, -// const Dtype* top_data, const Dtype* top_diff, -// const int num, const int channels, const int height, -// const int width, const int pooled_height, const int pooled_width, -// const int ksize, const int stride, Dtype* bottom_diff, int* mask) { -// int index = threadIdx.x + blockIdx.x * blockDim.x; -// if (index < nthreads) { -// // find out the local index -// // find out the local offset -// int w = index % width; -// int h = (index / width) % height; -// int c = (index / width / height) % channels; -// int n = index / width / height / channels; -// int phstart = (h < ksize) ? 0 : (h - ksize) / stride + 1; -// int phend = min(h / stride + 1, pooled_height); -// int pwstart = (w < ksize) ? 0 : (w - ksize) / stride + 1; -// int pwend = min(w / stride + 1, pooled_width); -// Dtype gradient = 0; -// Dtype bottom_datum = -// bottom_data[((n * channels + c) * height + h) * width + w]; -// top_data += (n * channels + c) * pooled_height * pooled_width; -// top_diff += (n * channels + c) * pooled_height * pooled_width; -// //bottom_diff[index] += top_diff[mask[index]]; -// for (int ph = phstart; ph < phend; ++ph) { -// for (int pw = pwstart; pw < pwend; ++pw) { -// gradient += top_diff[ph * pooled_width + pw] * -// (bottom_datum == top_data[ph * pooled_width + pw]); -// } -// } -// bottom_diff[index] = gradient; -// } // (if index < nthreads) -// } - template __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, @@ -237,13 +203,43 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset - int c = (index / pooled_width / pooled_height) % channels; - int n = index / pooled_width / pooled_height / channels; - bottom_diff += (n * channels + c) * height * width; - bottom_diff[mask[index]] += top_diff[index]; + int w = index % width; + int h = (index / width) % height; + int c = (index / width / height) % channels; + int n = index / width / height / channels; + int phstart = (h < ksize) ? 0 : (h - ksize) / stride + 1; + int phend = min(h / stride + 1, pooled_height); + int pwstart = (w < ksize) ? 0 : (w - ksize) / stride + 1; + int pwend = min(w / stride + 1, pooled_width); + Dtype gradient = 0; + top_diff += (n * channels + c) * pooled_height * pooled_width; + mask += (n * channels + c) * pooled_height * pooled_width; + //bottom_diff[index] += top_diff[mask[index]]; + for (int ph = phstart; ph < phend; ++ph) { + for (int pw = pwstart; pw < pwend; ++pw) { + if (mask[ph * pooled_width + pw] == h * width + w) + gradient += top_diff[ph * pooled_width + pw]; + } + } + bottom_diff[index] = gradient; } } +// template +// __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, +// const int num, const int channels, const int height, +// const int width, const int pooled_height, const int pooled_width, +// const int ksize, const int stride, Dtype* bottom_diff, int* mask) { +// CUDA_KERNEL_LOOP(index, nthreads) { +// // find out the local index +// // find out the local offset +// int c = (index / pooled_width / pooled_height) % channels; +// int n = index / pooled_width / pooled_height / channels; +// bottom_diff += (n * channels + c) * height * width; +// bottom_diff[mask[index]] += top_diff[index]; +// } +// } + template __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, From 868677bcd7b3c73d1e061058f203d88b6507ffa4 Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 25 Feb 2014 17:29:43 -0800 Subject: [PATCH 0051/2053] Added test for maxpool layer followed by dropout --- .../test/test_maxpool_dropout_layers.cpp | 181 ++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 src/caffe/test/test_maxpool_dropout_layers.cpp diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp new file mode 100644 index 00000000000..7468d8e40ba --- /dev/null +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -0,0 +1,181 @@ +// Copyright 2014 Sergio Guadarrama + +#include +#include + +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +template +class MaxPoolingDropoutTest : public ::testing::Test { + protected: + MaxPoolingDropoutTest() + : blob_bottom_(new Blob()), + blob_top_(new Blob()) {}; + virtual void SetUp() { + Caffe::set_random_seed(1703); + blob_bottom_->Reshape(2, 3, 6, 5); + // fill the values + FillerParameter filler_param; + filler_param.set_value(1.); + ConstantFiller filler(filler_param); + filler.Fill(this->blob_bottom_); + blob_bottom_vec_.push_back(blob_bottom_); + blob_top_vec_.push_back(blob_top_); + }; + virtual ~MaxPoolingDropoutTest() { delete blob_bottom_; delete blob_top_; } + Blob* const blob_bottom_; + Blob* const blob_top_; + vector*> blob_bottom_vec_; + vector*> blob_top_vec_; +}; + +typedef ::testing::Types Dtypes; +TYPED_TEST_CASE(MaxPoolingDropoutTest, Dtypes); + +TYPED_TEST(MaxPoolingDropoutTest, TestSetup) { + LayerParameter layer_param; + layer_param.set_kernelsize(3); + layer_param.set_stride(2); + PoolingLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + DropoutLayer dropout_layer(layer_param); + dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); + EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); + EXPECT_EQ(this->blob_top_->height(), 3); + EXPECT_EQ(this->blob_top_->width(), 2); +} + + +TYPED_TEST(MaxPoolingDropoutTest, CPUForward) { + LayerParameter layer_param; + layer_param.set_kernelsize(3); + layer_param.set_stride(2); + Caffe::set_mode(Caffe::CPU); + PoolingLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + const TypeParam* top_data = this->blob_top_->cpu_data(); + TypeParam sum = 0.; + for (int i = 0; i < this->blob_top_->count(); ++i) { + sum += top_data[i]; + } + EXPECT_EQ(sum, this->blob_top_->count()); + // Dropout in-place + DropoutLayer dropout_layer(layer_param); + dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); + dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); + sum = 0.; + TypeParam scale = 1. / (1. - layer_param.dropout_ratio()); + top_data = this->blob_top_->cpu_data(); + for (int i = 0; i < this->blob_top_->count(); ++i) { + sum += top_data[i]; + } + EXPECT_GE(sum, 0); + EXPECT_LE(sum, this->blob_top_->count()*scale); +} + +TYPED_TEST(MaxPoolingDropoutTest, GPUForward) { + LayerParameter layer_param; + layer_param.set_kernelsize(3); + layer_param.set_stride(2); + Caffe::set_mode(Caffe::GPU); + PoolingLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + const TypeParam* top_data = this->blob_top_->cpu_data(); + TypeParam sum = 0.; + for (int i = 0; i < this->blob_top_->count(); ++i) { + sum += top_data[i]; + } + EXPECT_EQ(sum, this->blob_top_->count()); + + DropoutLayer dropout_layer(layer_param); + dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); + dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); + sum = 0.; + TypeParam scale = 1. / (1. - layer_param.dropout_ratio()); + top_data = this->blob_top_->cpu_data(); + for (int i = 0; i < this->blob_top_->count(); ++i) { + sum += top_data[i]; + } + EXPECT_GE(sum, 0); + EXPECT_LE(sum, this->blob_top_->count()*scale); +} + +TYPED_TEST(MaxPoolingDropoutTest, CPUBackward) { + LayerParameter layer_param; + layer_param.set_kernelsize(3); + layer_param.set_stride(2); + Caffe::set_mode(Caffe::CPU); + Caffe::set_phase(Caffe::TRAIN); + PoolingLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + for (int i = 0; i < this->blob_top_->count(); ++i) { + this->blob_top_->mutable_cpu_diff()[i] = 1.; + } + layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + const TypeParam* bottom_diff = this->blob_bottom_->cpu_diff(); + TypeParam sum = 0.; + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + sum += bottom_diff[i]; + } + EXPECT_EQ(sum, this->blob_top_->count()); + // Dropout in-place + DropoutLayer dropout_layer(layer_param); + dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); + dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); + dropout_layer.Backward(this->blob_top_vec_, true, &(this->blob_top_vec_)); + layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + TypeParam sum_with_dropout = 0.; + bottom_diff = this->blob_bottom_->cpu_diff(); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + sum_with_dropout += bottom_diff[i]; + } + EXPECT_GE(sum_with_dropout, sum); +} + +TYPED_TEST(MaxPoolingDropoutTest, GPUBackward) { + LayerParameter layer_param; + layer_param.set_kernelsize(3); + layer_param.set_stride(2); + Caffe::set_mode(Caffe::GPU); + Caffe::set_phase(Caffe::TRAIN); + PoolingLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + for (int i = 0; i < this->blob_top_->count(); ++i) { + this->blob_top_->mutable_cpu_diff()[i] = 1.; + } + layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + const TypeParam* bottom_diff = this->blob_bottom_->cpu_diff(); + TypeParam sum = 0.; + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + sum += bottom_diff[i]; + } + EXPECT_EQ(sum, this->blob_top_->count()); + // Dropout in-place + DropoutLayer dropout_layer(layer_param); + dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); + dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); + dropout_layer.Backward(this->blob_top_vec_, true, &(this->blob_top_vec_)); + layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + TypeParam sum_with_dropout = 0.; + bottom_diff = this->blob_bottom_->cpu_diff(); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + sum_with_dropout += bottom_diff[i]; + } + EXPECT_GE(sum_with_dropout, sum); +} + +} \ No newline at end of file From 418e459a263f49b77df22b885ec6c6056382fed0 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 20:27:16 -0700 Subject: [PATCH 0052/2053] Attempt to use AtomicAdd but it seems slower --- src/caffe/layers/pooling_layer.cu | 64 ++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index e3d7546feb5..cfcee5281a9 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -195,6 +195,7 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, return Dtype(0.); } +/* template __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, @@ -224,21 +225,56 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, bottom_diff[index] = gradient; } } +*/ -// template -// __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, -// const int num, const int channels, const int height, -// const int width, const int pooled_height, const int pooled_width, -// const int ksize, const int stride, Dtype* bottom_diff, int* mask) { -// CUDA_KERNEL_LOOP(index, nthreads) { -// // find out the local index -// // find out the local offset -// int c = (index / pooled_width / pooled_height) % channels; -// int n = index / pooled_width / pooled_height / channels; -// bottom_diff += (n * channels + c) * height * width; -// bottom_diff[mask[index]] += top_diff[index]; -// } -// } +__device__ double atomicAdd(double* address, double val) +{ + unsigned long long int* address_as_ull = + (unsigned long long int*)address; + unsigned long long int old = *address_as_ull, assumed; + do { + assumed = old; + old = atomicCAS(address_as_ull, assumed, + __double_as_longlong(val + + __longlong_as_double(assumed))); + } while (assumed != old); + return __longlong_as_double(old); +} + +__device__ float atomicAdd(float* address, float val) +{ + unsigned int* address_as_ull = (unsigned int*)address; + unsigned int old = *address_as_ull, assumed; + do { + assumed = old; + old = atomicCAS(address_as_ull, assumed, + __float_as_int(val + + __int_as_float(assumed))); + } while (assumed != old); + return __int_as_float(old); +} + +template +__global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, + const int num, const int channels, const int height, + const int width, const int pooled_height, const int pooled_width, + const int ksize, const int stride, Dtype* bottom_diff, int* mask) { + // __shared__ Dtype cache[CAFFE_CUDA_NUM_THREADS]; + // cache[threadIdx.x] = Dtype(0.); + CUDA_KERNEL_LOOP(index, nthreads) { + // find out the local index + // find out the local offset + int c = (index / pooled_width / pooled_height) % channels; + int n = index / pooled_width / pooled_height / channels; + bottom_diff += (n * channels + c) * height * width; + // read from global bottom_diff into cache + // atomicAdd(cache + mask[index],bottom_diff[mask[index]]); + atomicAdd(bottom_diff + mask[index],top_diff[index]); + // __syncthreads(); + // write from cache to global bottom_diff + // bottom_diff[mask[index]] = cache[mask[index]]; + } // (if index < nthreads) +} template __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, From 8764b296ab5bd5dec293a9dba0f3f3081b572f5a Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 20:29:26 -0700 Subject: [PATCH 0053/2053] Commented Atomic Add, back to loop in GPU MaxPoolBackward --- src/caffe/layers/pooling_layer.cu | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index cfcee5281a9..3b5b8ee31d8 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -195,7 +195,7 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, return Dtype(0.); } -/* + template __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, @@ -225,8 +225,8 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, bottom_diff[index] = gradient; } } -*/ +/* __device__ double atomicAdd(double* address, double val) { unsigned long long int* address_as_ull = @@ -275,6 +275,7 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, // bottom_diff[mask[index]] = cache[mask[index]]; } // (if index < nthreads) } +*/ template __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, From 4ef555eb5133d196651893bcb5d46c671d8d4562 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 13 Apr 2014 21:03:06 -0700 Subject: [PATCH 0054/2053] Adapted to V1 proto definition, test don't pass --- src/caffe/layers/pooling_layer.cpp | 2 +- src/caffe/layers/pooling_layer.cu | 6 +-- .../test/test_maxpool_dropout_layers.cpp | 41 +++++++++++-------- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index e052f78f8ca..97506cc6eb7 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -38,7 +38,7 @@ void PoolingLayer::SetUp(const vector*>& bottom, (*top)[0]->Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); // If max pooling, we will initialize the vector index part. - if (this->layer_param_.pool() == LayerParameter_PoolMethod_MAX) { + if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX) { max_idx_.reset(new SyncedMemory((*top)[0]->count() * sizeof(int))); } // If stochastic pooling, we will initialize the random index part. diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 3b5b8ee31d8..3bdb562867f 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -208,9 +208,9 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, int h = (index / width) % height; int c = (index / width / height) % channels; int n = index / width / height / channels; - int phstart = (h < ksize) ? 0 : (h - ksize) / stride + 1; + int phstart = (h < kernel_size) ? 0 : (h - kernel_size) / stride + 1; int phend = min(h / stride + 1, pooled_height); - int pwstart = (w < ksize) ? 0 : (w - ksize) / stride + 1; + int pwstart = (w < kernel_size) ? 0 : (w - kernel_size) / stride + 1; int pwend = min(w / stride + 1, pooled_width); Dtype gradient = 0; top_diff += (n * channels + c) * pooled_height * pooled_width; @@ -361,7 +361,7 @@ void PoolingLayer::Backward_gpu(const vector*>& top, // Since we have the mask we only need count top_diff count = top[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) - caffe_gpu_memset(count,Dtype(0.),bottom_diff); + caffe_gpu_set(count,Dtype(0.),bottom_diff); MaxPoolBackward<<>>( count, top_diff, top[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp index 7468d8e40ba..9d302633fef 100644 --- a/src/caffe/test/test_maxpool_dropout_layers.cpp +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -43,10 +43,11 @@ TYPED_TEST_CASE(MaxPoolingDropoutTest, Dtypes); TYPED_TEST(MaxPoolingDropoutTest, TestSetup) { LayerParameter layer_param; - layer_param.set_kernelsize(3); - layer_param.set_stride(2); - PoolingLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); + PoolingLayer max_layer(layer_param); + max_layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); DropoutLayer dropout_layer(layer_param); dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); @@ -57,10 +58,11 @@ TYPED_TEST(MaxPoolingDropoutTest, TestSetup) { TYPED_TEST(MaxPoolingDropoutTest, CPUForward) { - LayerParameter layer_param; - layer_param.set_kernelsize(3); - layer_param.set_stride(2); Caffe::set_mode(Caffe::CPU); + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -75,7 +77,7 @@ TYPED_TEST(MaxPoolingDropoutTest, CPUForward) { dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); sum = 0.; - TypeParam scale = 1. / (1. - layer_param.dropout_ratio()); + TypeParam scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_top_->count(); ++i) { sum += top_data[i]; @@ -85,10 +87,11 @@ TYPED_TEST(MaxPoolingDropoutTest, CPUForward) { } TYPED_TEST(MaxPoolingDropoutTest, GPUForward) { - LayerParameter layer_param; - layer_param.set_kernelsize(3); - layer_param.set_stride(2); Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -103,7 +106,7 @@ TYPED_TEST(MaxPoolingDropoutTest, GPUForward) { dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); sum = 0.; - TypeParam scale = 1. / (1. - layer_param.dropout_ratio()); + TypeParam scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_top_->count(); ++i) { sum += top_data[i]; @@ -113,11 +116,12 @@ TYPED_TEST(MaxPoolingDropoutTest, GPUForward) { } TYPED_TEST(MaxPoolingDropoutTest, CPUBackward) { - LayerParameter layer_param; - layer_param.set_kernelsize(3); - layer_param.set_stride(2); Caffe::set_mode(Caffe::CPU); Caffe::set_phase(Caffe::TRAIN); + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -146,11 +150,12 @@ TYPED_TEST(MaxPoolingDropoutTest, CPUBackward) { } TYPED_TEST(MaxPoolingDropoutTest, GPUBackward) { - LayerParameter layer_param; - layer_param.set_kernelsize(3); - layer_param.set_stride(2); Caffe::set_mode(Caffe::GPU); Caffe::set_phase(Caffe::TRAIN); + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); From a1d97e0d6de696108762e46eb3719d2f69f688d5 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 24 May 2014 15:29:35 -0700 Subject: [PATCH 0055/2053] lint and make compilable (using static_cast's found a couple bugs at compile time) --- src/caffe/layers/pooling_layer.cpp | 20 +++++++----- src/caffe/layers/pooling_layer.cu | 15 ++++----- .../test/test_maxpool_dropout_layers.cpp | 32 ++++++++++--------- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 97506cc6eb7..5c740de4752 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -38,7 +38,8 @@ void PoolingLayer::SetUp(const vector*>& bottom, (*top)[0]->Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); // If max pooling, we will initialize the vector index part. - if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX) { + if (this->layer_param_.pooling_param().pool() == + PoolingParameter_PoolMethod_MAX) { max_idx_.reset(new SyncedMemory((*top)[0]->count() * sizeof(int))); } // If stochastic pooling, we will initialize the random index part. @@ -63,7 +64,7 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: // Initialize - mask = (int*)max_idx_->mutable_cpu_data(); + mask = static_cast(max_idx_->mutable_cpu_data()); for (int i = 0; i < top_count; ++i) { top_data[i] = -FLT_MAX; mask[i] = -1; @@ -77,11 +78,13 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, int wstart = pw * stride_; int hend = min(hstart + kernel_size_, height_); int wend = min(wstart + kernel_size_, width_); + const int pool_index = ph * pooled_width_ + pw; for (int h = hstart; h < hend; ++h) { for (int w = wstart; w < wend; ++w) { - if (bottom_data[h * width_ + w] > top_data[ph * pooled_width_ + pw]) { - top_data[ph * pooled_width_ + pw] = bottom_data[h * width_ + w]; - mask[ph * pooled_width_ + pw] = h * width_ + w; + const int index = h * width_ + w; + if (bottom_data[index] > top_data[pool_index]) { + top_data[pool_index] = bottom_data[index]; + mask[pool_index] = index; } } } @@ -147,16 +150,17 @@ void PoolingLayer::Backward_cpu(const vector*>& top, // Different pooling methods. We explicitly do the switch outside the for // loop to save time, although this results in more codes. memset(bottom_diff, 0, (*bottom)[0]->count() * sizeof(Dtype)); - int* mask; + const int* mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: // The main loop - mask = (int*)max_idx_->cpu_data(); + mask = static_cast(max_idx_->cpu_data()); for (int n = 0; n < top[0]->num(); ++n) { for (int c = 0; c < channels_; ++c) { for (int ph = 0; ph < pooled_height_; ++ph) { for (int pw = 0; pw < pooled_width_; ++pw) { - bottom_diff[mask[ph * pooled_width_ + pw]]+=top_diff[ph * pooled_width_ + pw]; + const int index = ph * pooled_width_ + pw; + bottom_diff[mask[index]] += top_diff[index]; } } bottom_diff += (*bottom)[0]->offset(0, 1); diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 3bdb562867f..60c52e32b00 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -12,7 +12,7 @@ using std::max; using std::min; namespace caffe { - + template __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, @@ -36,7 +36,6 @@ __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, maxidx = h * width + w; maxval = bottom_data[maxidx]; } - } } top_data[index] = maxval; @@ -154,8 +153,8 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, int* mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: + mask = static_cast(max_idx_->mutable_gpu_data()); // NOLINT_NEXT_LINE(whitespace/operators) - mask = (int*)max_idx_->mutable_gpu_data(); MaxPoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, kernel_size_, stride_, @@ -215,7 +214,6 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, Dtype gradient = 0; top_diff += (n * channels + c) * pooled_height * pooled_width; mask += (n * channels + c) * pooled_height * pooled_width; - //bottom_diff[index] += top_diff[mask[index]]; for (int ph = phstart; ph < phend; ++ph) { for (int pw = pwstart; pw < pwend; ++pw) { if (mask[ph * pooled_width + pw] == h * width + w) @@ -223,7 +221,7 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, } } bottom_diff[index] = gradient; - } + } } /* @@ -354,14 +352,13 @@ void PoolingLayer::Backward_gpu(const vector*>& top, int count = (*bottom)[0]->count(); CUDA_CHECK(cudaMemset(bottom_diff, 0, sizeof(Dtype) * count)); int* mask; - switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: - mask = (int*)max_idx_->gpu_data(); + mask = static_cast(max_idx_->mutable_gpu_data()); // Since we have the mask we only need count top_diff - count = top[0]->count(); + count = top[0]->count(); + caffe_gpu_set(count, Dtype(0.), bottom_diff); // NOLINT_NEXT_LINE(whitespace/operators) - caffe_gpu_set(count,Dtype(0.),bottom_diff); MaxPoolBackward<<>>( count, top_diff, top[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp index 9d302633fef..3862e12697b 100644 --- a/src/caffe/test/test_maxpool_dropout_layers.cpp +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -1,7 +1,9 @@ -// Copyright 2014 Sergio Guadarrama +// Copyright 2014 BVLC and contributors. #include -#include +#include + +#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" @@ -19,7 +21,7 @@ class MaxPoolingDropoutTest : public ::testing::Test { protected: MaxPoolingDropoutTest() : blob_bottom_(new Blob()), - blob_top_(new Blob()) {}; + blob_top_(new Blob()) {} virtual void SetUp() { Caffe::set_random_seed(1703); blob_bottom_->Reshape(2, 3, 6, 5); @@ -30,7 +32,7 @@ class MaxPoolingDropoutTest : public ::testing::Test { filler.Fill(this->blob_bottom_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); - }; + } virtual ~MaxPoolingDropoutTest() { delete blob_bottom_; delete blob_top_; } Blob* const blob_bottom_; Blob* const blob_top_; @@ -69,7 +71,7 @@ TYPED_TEST(MaxPoolingDropoutTest, CPUForward) { const TypeParam* top_data = this->blob_top_->cpu_data(); TypeParam sum = 0.; for (int i = 0; i < this->blob_top_->count(); ++i) { - sum += top_data[i]; + sum += top_data[i]; } EXPECT_EQ(sum, this->blob_top_->count()); // Dropout in-place @@ -80,7 +82,7 @@ TYPED_TEST(MaxPoolingDropoutTest, CPUForward) { TypeParam scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_top_->count(); ++i) { - sum += top_data[i]; + sum += top_data[i]; } EXPECT_GE(sum, 0); EXPECT_LE(sum, this->blob_top_->count()*scale); @@ -98,7 +100,7 @@ TYPED_TEST(MaxPoolingDropoutTest, GPUForward) { const TypeParam* top_data = this->blob_top_->cpu_data(); TypeParam sum = 0.; for (int i = 0; i < this->blob_top_->count(); ++i) { - sum += top_data[i]; + sum += top_data[i]; } EXPECT_EQ(sum, this->blob_top_->count()); @@ -109,7 +111,7 @@ TYPED_TEST(MaxPoolingDropoutTest, GPUForward) { TypeParam scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_top_->count(); ++i) { - sum += top_data[i]; + sum += top_data[i]; } EXPECT_GE(sum, 0); EXPECT_LE(sum, this->blob_top_->count()*scale); @@ -127,12 +129,12 @@ TYPED_TEST(MaxPoolingDropoutTest, CPUBackward) { layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; - } + } layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); const TypeParam* bottom_diff = this->blob_bottom_->cpu_diff(); TypeParam sum = 0.; for (int i = 0; i < this->blob_bottom_->count(); ++i) { - sum += bottom_diff[i]; + sum += bottom_diff[i]; } EXPECT_EQ(sum, this->blob_top_->count()); // Dropout in-place @@ -144,7 +146,7 @@ TYPED_TEST(MaxPoolingDropoutTest, CPUBackward) { TypeParam sum_with_dropout = 0.; bottom_diff = this->blob_bottom_->cpu_diff(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { - sum_with_dropout += bottom_diff[i]; + sum_with_dropout += bottom_diff[i]; } EXPECT_GE(sum_with_dropout, sum); } @@ -161,12 +163,12 @@ TYPED_TEST(MaxPoolingDropoutTest, GPUBackward) { layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; - } + } layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); const TypeParam* bottom_diff = this->blob_bottom_->cpu_diff(); TypeParam sum = 0.; for (int i = 0; i < this->blob_bottom_->count(); ++i) { - sum += bottom_diff[i]; + sum += bottom_diff[i]; } EXPECT_EQ(sum, this->blob_top_->count()); // Dropout in-place @@ -178,9 +180,9 @@ TYPED_TEST(MaxPoolingDropoutTest, GPUBackward) { TypeParam sum_with_dropout = 0.; bottom_diff = this->blob_bottom_->cpu_diff(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { - sum_with_dropout += bottom_diff[i]; + sum_with_dropout += bottom_diff[i]; } EXPECT_GE(sum_with_dropout, sum); } -} \ No newline at end of file +} // namespace caffe From 67f6034a8d87d5dad9925221ed71c49e0a03b597 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 24 May 2014 16:10:23 -0700 Subject: [PATCH 0056/2053] remove commented out code --- src/caffe/layers/pooling_layer.cu | 51 ------------------------------- 1 file changed, 51 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 60c52e32b00..00c78466357 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -224,57 +224,6 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, } } -/* -__device__ double atomicAdd(double* address, double val) -{ - unsigned long long int* address_as_ull = - (unsigned long long int*)address; - unsigned long long int old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed, - __double_as_longlong(val + - __longlong_as_double(assumed))); - } while (assumed != old); - return __longlong_as_double(old); -} - -__device__ float atomicAdd(float* address, float val) -{ - unsigned int* address_as_ull = (unsigned int*)address; - unsigned int old = *address_as_ull, assumed; - do { - assumed = old; - old = atomicCAS(address_as_ull, assumed, - __float_as_int(val + - __int_as_float(assumed))); - } while (assumed != old); - return __int_as_float(old); -} - -template -__global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, - const int num, const int channels, const int height, - const int width, const int pooled_height, const int pooled_width, - const int ksize, const int stride, Dtype* bottom_diff, int* mask) { - // __shared__ Dtype cache[CAFFE_CUDA_NUM_THREADS]; - // cache[threadIdx.x] = Dtype(0.); - CUDA_KERNEL_LOOP(index, nthreads) { - // find out the local index - // find out the local offset - int c = (index / pooled_width / pooled_height) % channels; - int n = index / pooled_width / pooled_height / channels; - bottom_diff += (n * channels + c) * height * width; - // read from global bottom_diff into cache - // atomicAdd(cache + mask[index],bottom_diff[mask[index]]); - atomicAdd(bottom_diff + mask[index],top_diff[index]); - // __syncthreads(); - // write from cache to global bottom_diff - // bottom_diff[mask[index]] = cache[mask[index]]; - } // (if index < nthreads) -} -*/ - template __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, From c85f9d2ed32be3c576f22a12961d8f648623dd54 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 24 May 2014 16:14:04 -0700 Subject: [PATCH 0057/2053] mask should be const in backward pass --- src/caffe/layers/pooling_layer.cu | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 00c78466357..a91b1378cde 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -197,9 +197,9 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, template __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, - const int num, const int channels, const int height, + const int* mask, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, Dtype* bottom_diff, int* mask) { + const int kernel_size, const int stride, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset @@ -300,18 +300,18 @@ void PoolingLayer::Backward_gpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); int count = (*bottom)[0]->count(); CUDA_CHECK(cudaMemset(bottom_diff, 0, sizeof(Dtype) * count)); - int* mask; + const int* mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: - mask = static_cast(max_idx_->mutable_gpu_data()); + mask = static_cast(max_idx_->gpu_data()); // Since we have the mask we only need count top_diff count = top[0]->count(); caffe_gpu_set(count, Dtype(0.), bottom_diff); // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<<>>( - count, top_diff, top[0]->num(), channels_, + count, top_diff, mask, top[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, - kernel_size_, stride_, bottom_diff, mask); + kernel_size_, stride_, bottom_diff); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) From cda3c3192646c8153bf4de8d2d712751d5fa98c7 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 24 May 2014 16:14:44 -0700 Subject: [PATCH 0058/2053] bugfix: setting count to the top count in backward doesn't process all of the bottom (assuming the bottom is larger, which happens for nontrivial poolsize>1) --- src/caffe/layers/pooling_layer.cu | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index a91b1378cde..cb3bfabe4d4 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -304,8 +304,6 @@ void PoolingLayer::Backward_gpu(const vector*>& top, switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: mask = static_cast(max_idx_->gpu_data()); - // Since we have the mask we only need count top_diff - count = top[0]->count(); caffe_gpu_set(count, Dtype(0.), bottom_diff); // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<<>>( From 96d47af12882b3a43f9268f32fe3242634cf7d3a Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 24 May 2014 16:27:38 -0700 Subject: [PATCH 0059/2053] use a Blob instead of a SyncedMemory to store max_idx_ --- include/caffe/vision_layers.hpp | 2 +- src/caffe/blob.cpp | 9 +++++++++ src/caffe/layers/pooling_layer.cpp | 7 ++++--- src/caffe/layers/pooling_layer.cu | 4 ++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index c0bbd370fce..a43f7f98c09 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -350,7 +350,7 @@ class PoolingLayer : public Layer { int pooled_height_; int pooled_width_; Blob rand_idx_; - shared_ptr max_idx_; + shared_ptr > max_idx_; }; /* SoftmaxLayer diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index 444e9cf4009..597e848c685 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -108,6 +108,14 @@ void Blob::ShareDiff(const Blob& other) { diff_ = other.diff(); } +template <> +void Blob::Update() { + // The "update" method is used for parameter blobs in a Net, which are stored + // as Blobs or Blobs -- hence we do not define it for + // Blobs. + NOT_IMPLEMENTED; +} + template void Blob::Update() { // We will perform update based on where the data is located. @@ -201,6 +209,7 @@ void Blob::ToProto(BlobProto* proto, bool write_diff) const { } INSTANTIATE_CLASS(Blob); +template class Blob; } // namespace caffe diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 5c740de4752..3d216de6ec5 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -40,7 +40,8 @@ void PoolingLayer::SetUp(const vector*>& bottom, // If max pooling, we will initialize the vector index part. if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX) { - max_idx_.reset(new SyncedMemory((*top)[0]->count() * sizeof(int))); + max_idx_.reset(new Blob(bottom[0]->num(), channels_, + pooled_height_, pooled_width_)); } // If stochastic pooling, we will initialize the random index part. if (this->layer_param_.pooling_param().pool() == @@ -64,7 +65,7 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: // Initialize - mask = static_cast(max_idx_->mutable_cpu_data()); + mask = max_idx_->mutable_cpu_data(); for (int i = 0; i < top_count; ++i) { top_data[i] = -FLT_MAX; mask[i] = -1; @@ -154,7 +155,7 @@ void PoolingLayer::Backward_cpu(const vector*>& top, switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: // The main loop - mask = static_cast(max_idx_->cpu_data()); + mask = max_idx_->cpu_data(); for (int n = 0; n < top[0]->num(); ++n) { for (int c = 0; c < channels_; ++c) { for (int ph = 0; ph < pooled_height_; ++ph) { diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index cb3bfabe4d4..49e5d7780ab 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -153,7 +153,7 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, int* mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: - mask = static_cast(max_idx_->mutable_gpu_data()); + mask = max_idx_->mutable_gpu_data(); // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, @@ -303,7 +303,7 @@ void PoolingLayer::Backward_gpu(const vector*>& top, const int* mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: - mask = static_cast(max_idx_->gpu_data()); + mask = max_idx_->gpu_data(); caffe_gpu_set(count, Dtype(0.), bottom_diff); // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<<>>( From dcd5743b4b3b8133d54228418a47a9bc72a4031f Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 24 May 2014 16:59:15 -0700 Subject: [PATCH 0060/2053] make a Blob and use in dropout layer --- include/caffe/neuron_layers.hpp | 2 +- include/caffe/util/math_functions.hpp | 3 +++ src/caffe/blob.cpp | 13 ++++++------- src/caffe/layers/dropout_layer.cpp | 7 ++++--- src/caffe/util/math_functions.cpp | 20 ++++++++++++++++++++ 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index fb2347da436..4e67a29ace3 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -87,7 +87,7 @@ class DropoutLayer : public NeuronLayer { virtual void Backward_gpu(const vector*>& top, const bool propagate_down, vector*>* bottom); - shared_ptr rand_vec_; + shared_ptr > rand_vec_; Dtype threshold_; Dtype scale_; unsigned int uint_thres_; diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 25ed4705961..99519974243 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -144,6 +144,9 @@ void caffe_gpu_rng_gaussian(const int n, const Dtype mu, const Dtype sigma, template void caffe_rng_bernoulli(const int n, const Dtype p, int* r); +template +void caffe_rng_bernoulli(const int n, const Dtype p, unsigned int* r); + template void caffe_gpu_rng_bernoulli(const int n, const Dtype p, int* r); diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index 597e848c685..e603712fd82 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -108,13 +108,11 @@ void Blob::ShareDiff(const Blob& other) { diff_ = other.diff(); } -template <> -void Blob::Update() { - // The "update" method is used for parameter blobs in a Net, which are stored - // as Blobs or Blobs -- hence we do not define it for - // Blobs. - NOT_IMPLEMENTED; -} +// The "update" method is used for parameter blobs in a Net, which are stored +// as Blob or Blob -- hence we do not define it for +// Blob or Blob. +template <> void Blob::Update() { NOT_IMPLEMENTED; } +template <> void Blob::Update() { NOT_IMPLEMENTED; } template void Blob::Update() { @@ -210,6 +208,7 @@ void Blob::ToProto(BlobProto* proto, bool write_diff) const { INSTANTIATE_CLASS(Blob); template class Blob; +template class Blob; } // namespace caffe diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index e1b69f363b4..f1e54112986 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -17,7 +17,8 @@ void DropoutLayer::SetUp(const vector*>& bottom, vector*>* top) { NeuronLayer::SetUp(bottom, top); // Set up the cache for random number generation - rand_vec_.reset(new SyncedMemory(bottom[0]->count() * sizeof(int))); + rand_vec_.reset(new Blob(bottom[0]->num(), + bottom[0]->channels(), bottom[0]->height(), bottom[0]->width())); threshold_ = this->layer_param_.dropout_param().dropout_ratio(); DCHECK(threshold_ > 0.); DCHECK(threshold_ < 1.); @@ -30,7 +31,7 @@ Dtype DropoutLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); - int* mask = reinterpret_cast(rand_vec_->mutable_cpu_data()); + unsigned int* mask = rand_vec_->mutable_cpu_data(); const int count = bottom[0]->count(); if (Caffe::phase() == Caffe::TRAIN) { // Create random numbers @@ -52,7 +53,7 @@ void DropoutLayer::Backward_cpu(const vector*>& top, if (propagate_down) { const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int* mask = reinterpret_cast(rand_vec_->cpu_data()); + const unsigned int* mask = rand_vec_->cpu_data(); const int count = (*bottom)[0]->count(); for (int i = 0; i < count; ++i) { bottom_diff[i] = top_diff[i] * mask[i] * scale_; diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index ba2492aa635..2196b44bf24 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -381,6 +381,26 @@ void caffe_rng_bernoulli(const int n, const double p, int* r); template void caffe_rng_bernoulli(const int n, const float p, int* r); +template +void caffe_rng_bernoulli(const int n, const Dtype p, unsigned int* r) { + CHECK_GE(n, 0); + CHECK(r); + CHECK_GE(p, 0); + CHECK_LE(p, 1); + boost::bernoulli_distribution random_distribution(p); + boost::variate_generator > + variate_generator(caffe_rng(), random_distribution); + for (int i = 0; i < n; ++i) { + r[i] = static_cast(variate_generator()); + } +} + +template +void caffe_rng_bernoulli(const int n, const double p, unsigned int* r); + +template +void caffe_rng_bernoulli(const int n, const float p, unsigned int* r); + template <> float caffe_cpu_dot(const int n, const float* x, const float* y) { return cblas_sdot(n, x, 1, y, 1); From 42a2a3fc09a8268cc9e5fac43472b38b7aaf1336 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 24 May 2014 18:09:05 -0700 Subject: [PATCH 0061/2053] optionally output the mask to a top blob instead of storing internally --- src/caffe/layers/pooling_layer.cpp | 66 +++++++++++++++++++++++------ src/caffe/layers/pooling_layer.cu | 67 ++++++++++++++++++++++-------- 2 files changed, 103 insertions(+), 30 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 3d216de6ec5..928c8c7f42f 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -19,7 +19,15 @@ template void PoolingLayer::SetUp(const vector*>& bottom, vector*>* top) { CHECK_EQ(bottom.size(), 1) << "PoolingLayer takes a single blob as input."; - CHECK_EQ(top->size(), 1) << "PoolingLayer takes a single blob as output."; + if (this->layer_param_.pooling_param().pool() == + PoolingParameter_PoolMethod_MAX) { + CHECK_GE(top->size(), 1) + << "MaxPoolingLayer takes at least one blob as output."; + CHECK_LE(top->size(), 2) + << "MaxPoolingLayer takes at most two blobs as output."; + } else { + CHECK_EQ(top->size(), 1) << "PoolingLayer takes a single blob as output."; + } kernel_size_ = this->layer_param_.pooling_param().kernel_size(); stride_ = this->layer_param_.pooling_param().stride(); pad_ = this->layer_param_.pooling_param().pad(); @@ -37,9 +45,12 @@ void PoolingLayer::SetUp(const vector*>& bottom, width_ + 2 * pad_ - kernel_size_) / stride_)) + 1; (*top)[0]->Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); + if (top->size() > 1) { + (*top)[1]->ReshapeLike(*(*top)[0]); + } // If max pooling, we will initialize the vector index part. if (this->layer_param_.pooling_param().pool() == - PoolingParameter_PoolMethod_MAX) { + PoolingParameter_PoolMethod_MAX && top->size() == 1) { max_idx_.reset(new Blob(bottom[0]->num(), channels_, pooled_height_, pooled_width_)); } @@ -61,15 +72,23 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, // Different pooling methods. We explicitly do the switch outside the for // loop to save time, although this results in more codes. int top_count = (*top)[0]->count(); + // We'll output the mask to top[1] if it's of size >1. + const bool use_top_mask = top->size() > 1; int* mask; + Dtype* top_mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: - // Initialize - mask = max_idx_->mutable_cpu_data(); - for (int i = 0; i < top_count; ++i) { - top_data[i] = -FLT_MAX; - mask[i] = -1; + // Initialize + if (use_top_mask) { + top_mask = (*top)[1]->mutable_cpu_data(); + caffe_set(top_count, Dtype(-1), top_mask); + } else { + mask = max_idx_->mutable_cpu_data(); + for (int i = 0; i < top_count; ++i) { + mask[i] = -1; + } } + caffe_set(top_count, Dtype(-FLT_MAX), top_data); // The main loop for (int n = 0; n < bottom[0]->num(); ++n) { for (int c = 0; c < channels_; ++c) { @@ -85,7 +104,11 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, const int index = h * width_ + w; if (bottom_data[index] > top_data[pool_index]) { top_data[pool_index] = bottom_data[index]; - mask[pool_index] = index; + if (use_top_mask) { + top_mask[pool_index] = static_cast(index); + } else { + mask[pool_index] = index; + } } } } @@ -94,7 +117,11 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, // compute offset bottom_data += bottom[0]->offset(0, 1); top_data += (*top)[0]->offset(0, 1); - mask += (*top)[0]->offset(0, 1); + if (use_top_mask) { + top_mask += (*top)[0]->offset(0, 1); + } else { + mask += (*top)[0]->offset(0, 1); + } } } break; @@ -150,23 +177,36 @@ void PoolingLayer::Backward_cpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); // Different pooling methods. We explicitly do the switch outside the for // loop to save time, although this results in more codes. - memset(bottom_diff, 0, (*bottom)[0]->count() * sizeof(Dtype)); + caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); + // We'll output the mask to top[1] if it's of size >1. + const bool use_top_mask = top.size() > 1; const int* mask; + const Dtype* top_mask; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: // The main loop - mask = max_idx_->cpu_data(); + if (use_top_mask) { + top_mask = top[1]->cpu_data(); + } else { + mask = max_idx_->cpu_data(); + } for (int n = 0; n < top[0]->num(); ++n) { for (int c = 0; c < channels_; ++c) { for (int ph = 0; ph < pooled_height_; ++ph) { for (int pw = 0; pw < pooled_width_; ++pw) { const int index = ph * pooled_width_ + pw; - bottom_diff[mask[index]] += top_diff[index]; + const int bottom_index = + use_top_mask ? top_mask[index] : mask[index]; + bottom_diff[bottom_index] += top_diff[index]; } } bottom_diff += (*bottom)[0]->offset(0, 1); top_diff += top[0]->offset(0, 1); - mask += top[0]->offset(0, 1); + if (use_top_mask) { + top_mask += top[0]->offset(0, 1); + } else { + mask += top[0]->offset(0, 1); + } } } break; diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 49e5d7780ab..31be47efc0c 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -17,7 +17,8 @@ template __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, Dtype* top_data, int* mask) { + const int kernel_size, const int stride, Dtype* top_data, + int* mask, Dtype* top_mask) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; @@ -39,7 +40,11 @@ __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, } } top_data[index] = maxval; - mask[index] = maxidx; + if (mask) { + mask[index] = maxidx; + } else { + top_mask[index] = maxidx; + } } } @@ -150,15 +155,22 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); int count = (*top)[0]->count(); - int* mask; + // We'll output the mask to top[1] if it's of size >1. + const bool use_top_mask = top->size() > 1; + int* mask = NULL; + Dtype* top_mask = NULL; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: - mask = max_idx_->mutable_gpu_data(); + if (use_top_mask) { + top_mask = (*top)[1]->mutable_gpu_data(); + } else { + mask = max_idx_->mutable_gpu_data(); + } // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, kernel_size_, stride_, - top_data, mask); + top_data, mask, top_mask); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) @@ -197,9 +209,10 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, template __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, - const int* mask, const int num, const int channels, const int height, - const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, Dtype* bottom_diff) { + const int* mask, const Dtype* top_mask, const int num, const int channels, + const int height, const int width, const int pooled_height, + const int pooled_width, const int kernel_size, const int stride, + Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset @@ -212,12 +225,25 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, int pwstart = (w < kernel_size) ? 0 : (w - kernel_size) / stride + 1; int pwend = min(w / stride + 1, pooled_width); Dtype gradient = 0; - top_diff += (n * channels + c) * pooled_height * pooled_width; - mask += (n * channels + c) * pooled_height * pooled_width; - for (int ph = phstart; ph < phend; ++ph) { - for (int pw = pwstart; pw < pwend; ++pw) { - if (mask[ph * pooled_width + pw] == h * width + w) - gradient += top_diff[ph * pooled_width + pw]; + int offset = (n * channels + c) * pooled_height * pooled_width; + top_diff += offset; + if (mask) { + mask += offset; + for (int ph = phstart; ph < phend; ++ph) { + for (int pw = pwstart; pw < pwend; ++pw) { + if (mask[ph * pooled_width + pw] == h * width + w) { + gradient += top_diff[ph * pooled_width + pw]; + } + } + } + } else { + top_mask += offset; + for (int ph = phstart; ph < phend; ++ph) { + for (int pw = pwstart; pw < pwend; ++pw) { + if (top_mask[ph * pooled_width + pw] == h * width + w) { + gradient += top_diff[ph * pooled_width + pw]; + } + } } } bottom_diff[index] = gradient; @@ -300,14 +326,21 @@ void PoolingLayer::Backward_gpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); int count = (*bottom)[0]->count(); CUDA_CHECK(cudaMemset(bottom_diff, 0, sizeof(Dtype) * count)); - const int* mask; + // We'll output the mask to top[1] if it's of size >1. + const bool use_top_mask = top.size() > 1; + const int* mask = NULL; + const Dtype* top_mask = NULL; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: - mask = max_idx_->gpu_data(); + if (use_top_mask) { + top_mask = top[1]->gpu_data(); + } else { + mask = max_idx_->gpu_data(); + } caffe_gpu_set(count, Dtype(0.), bottom_diff); // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<<>>( - count, top_diff, mask, top[0]->num(), channels_, + count, top_diff, mask, top_mask, top[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, kernel_size_, stride_, bottom_diff); break; From 48534870710ae828ed5388827f277ed5882f764b Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 24 May 2014 18:40:03 -0700 Subject: [PATCH 0062/2053] add tests for maxpooling layer forward, and for maxpooling with top mask --- src/caffe/test/test_pooling_layer.cpp | 132 +++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index a26078ee5a2..6628fc5dfc6 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -22,7 +22,8 @@ class PoolingLayerTest : public ::testing::Test { protected: PoolingLayerTest() : blob_bottom_(new Blob()), - blob_top_(new Blob()) {} + blob_top_(new Blob()), + blob_top_mask_(new Blob()) {} virtual void SetUp() { Caffe::set_random_seed(1701); blob_bottom_->Reshape(2, 3, 6, 5); @@ -33,11 +34,88 @@ class PoolingLayerTest : public ::testing::Test { blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); } - virtual ~PoolingLayerTest() { delete blob_bottom_; delete blob_top_; } + virtual ~PoolingLayerTest() { + delete blob_bottom_; + delete blob_top_; + delete blob_top_mask_; + } Blob* const blob_bottom_; Blob* const blob_top_; + Blob* const blob_top_mask_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; + + void TestForward() { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + const int num = 2; + const int channels = 2; + blob_bottom_->Reshape(num, channels, 3, 5); + // Input: 2x 2 channels of: + // [1 2 5 2 3] + // [9 4 1 4 8] + // [1 2 5 2 3] + for (int i = 0; i < 15 * num * channels; i += 15) { + blob_bottom_->mutable_cpu_data()[i + 0] = 1; + blob_bottom_->mutable_cpu_data()[i + 1] = 2; + blob_bottom_->mutable_cpu_data()[i + 2] = 5; + blob_bottom_->mutable_cpu_data()[i + 3] = 2; + blob_bottom_->mutable_cpu_data()[i + 4] = 3; + blob_bottom_->mutable_cpu_data()[i + 5] = 9; + blob_bottom_->mutable_cpu_data()[i + 6] = 4; + blob_bottom_->mutable_cpu_data()[i + 7] = 1; + blob_bottom_->mutable_cpu_data()[i + 8] = 4; + blob_bottom_->mutable_cpu_data()[i + 9] = 8; + blob_bottom_->mutable_cpu_data()[i + 10] = 1; + blob_bottom_->mutable_cpu_data()[i + 11] = 2; + blob_bottom_->mutable_cpu_data()[i + 12] = 5; + blob_bottom_->mutable_cpu_data()[i + 13] = 2; + blob_bottom_->mutable_cpu_data()[i + 14] = 3; + } + PoolingLayer layer(layer_param); + layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + EXPECT_EQ(blob_top_->num(), num); + EXPECT_EQ(blob_top_->channels(), channels); + EXPECT_EQ(blob_top_->height(), 2); + EXPECT_EQ(blob_top_->width(), 4); + if (blob_top_vec_.size() > 1) { + EXPECT_EQ(blob_top_mask_->num(), num); + EXPECT_EQ(blob_top_mask_->channels(), channels); + EXPECT_EQ(blob_top_mask_->height(), 2); + EXPECT_EQ(blob_top_mask_->width(), 4); + } + layer.Forward(blob_bottom_vec_, &blob_top_vec_); + // Expected output: 2x 2 channels of: + // [9 5 5 8] + // [9 5 5 8] + for (int i = 0; i < 8 * num * channels; i += 8) { + EXPECT_EQ(blob_top_->cpu_data()[i + 0], 9); + EXPECT_EQ(blob_top_->cpu_data()[i + 1], 5); + EXPECT_EQ(blob_top_->cpu_data()[i + 2], 5); + EXPECT_EQ(blob_top_->cpu_data()[i + 3], 8); + EXPECT_EQ(blob_top_->cpu_data()[i + 4], 9); + EXPECT_EQ(blob_top_->cpu_data()[i + 5], 5); + EXPECT_EQ(blob_top_->cpu_data()[i + 6], 5); + EXPECT_EQ(blob_top_->cpu_data()[i + 7], 8); + } + if (blob_top_vec_.size() > 1) { + // Expected mask output: 2x 2 channels of: + // [5 2 2 9] + // [5 12 12 9] + for (int i = 0; i < 8 * num * channels; i += 8) { + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 0], 5); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 1], 2); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 2], 2); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 3], 9); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 4], 5); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 5], 12); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 6], 12); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 7], 9); + } + } + } }; typedef ::testing::Types Dtypes; @@ -127,6 +205,28 @@ TYPED_TEST(PoolingLayerTest, PrintCPUBackward) { } */ +TYPED_TEST(PoolingLayerTest, TestCPUForwardMax) { + Caffe::set_mode(Caffe::CPU); + this->TestForward(); +} + +TYPED_TEST(PoolingLayerTest, TestGPUForwardMax) { + Caffe::set_mode(Caffe::GPU); + this->TestForward(); +} + +TYPED_TEST(PoolingLayerTest, TestCPUForwardMaxTopMask) { + Caffe::set_mode(Caffe::CPU); + this->blob_top_vec_.push_back(this->blob_top_mask_); + this->TestForward(); +} + +TYPED_TEST(PoolingLayerTest, TestGPUForwardMaxTopMask) { + Caffe::set_mode(Caffe::GPU); + this->blob_top_vec_.push_back(this->blob_top_mask_); + this->TestForward(); +} + TYPED_TEST(PoolingLayerTest, TestCPUGradientMax) { LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); @@ -153,6 +253,34 @@ TYPED_TEST(PoolingLayerTest, TestGPUGradientMax) { &(this->blob_top_vec_)); } +TYPED_TEST(PoolingLayerTest, TestCPUGradientMaxTopMask) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + this->blob_top_vec_.push_back(this->blob_top_mask_); + Caffe::set_mode(Caffe::CPU); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-4, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +TYPED_TEST(PoolingLayerTest, TestGPUGradientMaxTopMask) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + this->blob_top_vec_.push_back(this->blob_top_mask_); + Caffe::set_mode(Caffe::GPU); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-4, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + TYPED_TEST(PoolingLayerTest, TestCPUForwardAve) { LayerParameter layer_param; From 0a0f9be2fe60a66472c36838f38940e05827d259 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 24 May 2014 19:02:51 -0700 Subject: [PATCH 0063/2053] merge caffe_set definitions; define for int as well --- src/caffe/layers/pooling_layer.cpp | 4 +--- src/caffe/util/math_functions.cpp | 19 ++++++------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 928c8c7f42f..5d6921f1da8 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -84,9 +84,7 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, caffe_set(top_count, Dtype(-1), top_mask); } else { mask = max_idx_->mutable_cpu_data(); - for (int i = 0; i < top_count; ++i) { - mask[i] = -1; - } + caffe_set(top_count, -1, mask); } caffe_set(top_count, Dtype(-FLT_MAX), top_data); // The main loop diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index 2196b44bf24..67274ef73cc 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -120,10 +120,10 @@ void caffe_gpu_axpy(const int N, const double alpha, const double* X, CUBLAS_CHECK(cublasDaxpy(Caffe::cublas_handle(), N, &alpha, X, 1, Y, 1)); } -template <> -void caffe_set(const int N, const float alpha, float* Y) { +template +void caffe_set(const int N, const Dtype alpha, Dtype* Y) { if (alpha == 0) { - memset(Y, 0, sizeof(float) * N); + memset(Y, 0, sizeof(Dtype) * N); return; } for (int i = 0; i < N; ++i) { @@ -131,16 +131,9 @@ void caffe_set(const int N, const float alpha, float* Y) { } } -template <> -void caffe_set(const int N, const double alpha, double* Y) { - if (alpha == 0) { - memset(Y, 0, sizeof(double) * N); - return; - } - for (int i = 0; i < N; ++i) { - Y[i] = alpha; - } -} +template void caffe_set(const int N, const int alpha, int* Y); +template void caffe_set(const int N, const float alpha, float* Y); +template void caffe_set(const int N, const double alpha, double* Y); template <> void caffe_add_scalar(const int N, const float alpha, float* Y) { From 07ba3fd9cfabf39dcbae460ade9aee7c2874d9e8 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 25 May 2014 16:19:14 -0700 Subject: [PATCH 0064/2053] 10.9 install doc formatting --- docs/installation.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 5ad6c6cb8cb..1210bfc615e 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -124,16 +124,14 @@ The prerequisite homebrew formulae are For each of these formulas, `brew edit FORMULA`, and add the ENV definitions as shown: -``` - def install - # ADD THE FOLLOWING: - ENV.append "CXXFLAGS", "-stdlib=libstdc++" - ENV.append "CFLAGS", "-stdlib=libstdc++" - ENV.append "LDFLAGS", "-stdlib=libstdc++ -lstdc++" - # The following is necessary because libtool likes to strip LDFLAGS: - ENV["CXX"] = "/usr/bin/clang -stdlib=libstdc++" - ... -``` + def install + # ADD THE FOLLOWING: + ENV.append "CXXFLAGS", "-stdlib=libstdc++" + ENV.append "CFLAGS", "-stdlib=libstdc++" + ENV.append "LDFLAGS", "-stdlib=libstdc++ -lstdc++" + # The following is necessary because libtool likes to strip LDFLAGS: + ENV["CXX"] = "/usr/bin/clang -stdlib=libstdc++" + ... To edit the formulae in turn, run From 608abe267ff8f5628ef3e097526fec8e3db30faa Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Mon, 26 May 2014 01:34:32 -0700 Subject: [PATCH 0065/2053] don't pass LDFLAGS when only compiling --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 3863fbfdcfb..a092ac890fc 100644 --- a/Makefile +++ b/Makefile @@ -341,12 +341,12 @@ $(UTIL_BUILD_DIR)/%.cuo: src/$(PROJECT)/util/%.cu | $(UTIL_BUILD_DIR) @ echo $(TOOL_BUILD_DIR)/%.o: tools/%.cpp $(PROTO_GEN_HEADER) | $(TOOL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ $(LDFLAGS) + $(CXX) $< $(CXXFLAGS) -c -o $@ @ echo $(EXAMPLE_BUILD_DIR)/%.o: examples/%.cpp $(PROTO_GEN_HEADER) \ | $(EXAMPLE_BUILD_DIRS) - $(CXX) $< $(CXXFLAGS) -c -o $@ $(LDFLAGS) + $(CXX) $< $(CXXFLAGS) -c -o $@ @ echo $(BUILD_DIR)/src/$(PROJECT)/%.o: src/$(PROJECT)/%.cpp $(HXX_SRCS) From a53978d2b045dbab198b28fe38fd75e1ce5ddec0 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 26 May 2014 10:50:00 -0700 Subject: [PATCH 0066/2053] convert imageset comment fixup --- tools/convert_imageset.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 900183a649b..2420f9538fb 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -2,13 +2,13 @@ // This program converts a set of images to a leveldb by storing them as Datum // proto buffers. // Usage: -// convert_imageset ROOTFOLDER/ LISTFILE DB_NAME [0/1] \ +// convert_imageset ROOTFOLDER/ LISTFILE DB_NAME RANDOM_SHUFFLE[0 or 1] \ // [resize_height] [resize_width] // where ROOTFOLDER is the root folder that holds all the images, and LISTFILE // should be a list of files as well as their labels, in the format as // subfolder1/file1.JPEG 7 // .... -// if the last argument is 1, a random shuffle will be carried out before we +// if RANDOM_SHUFFLE is 1, a random shuffle will be carried out before we // process the file lines. #include From 8c609da73666bba762a50ba39e23ca82724fbad4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 26 May 2014 21:50:39 -0700 Subject: [PATCH 0067/2053] caffe.Net preprocessing members belong to object, not class --- python/caffe/pycaffe.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 8bed7046cc8..5c1512cd8b9 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -14,11 +14,6 @@ # inheritance) so that nets created by caffe (e.g., by SGDSolver) will # automatically have the improved interface. -# Input preprocessing -Net.mean = {} # input mean (ndarray, input dimensional or broadcastable) -Net.input_scale = {} # for a model that expects data = input * input_scale -Net.channel_swap = {} # for RGB -> BGR and the like - @property def _Net_blobs(self): @@ -187,10 +182,12 @@ def _Net_set_mean(self, input_, mean_f, mode='elementwise'): Take input_: which input to assign this mean. - mean_f: path to mean .npy + mean_f: path to mean .npy with ndarray (input dimensional or broadcastable) mode: elementwise = use the whole mean (and check dimensions) channel = channel constant (e.g. mean pixel instead of mean image) """ + if not hasattr(self, 'mean'): + self.mean = {} if input_ not in self.inputs: raise Exception('Input not in {}'.format(self.inputs)) in_shape = self.blobs[input_].data.shape @@ -218,6 +215,8 @@ def _Net_set_input_scale(self, input_, scale): input_: which input to assign this scale factor scale: scale coefficient """ + if not hasattr(self, 'input_scale'): + self.input_scale = {} if input_ not in self.inputs: raise Exception('Input not in {}'.format(self.inputs)) self.input_scale[input_] = scale @@ -233,6 +232,8 @@ def _Net_set_channel_swap(self, input_, order): order: the order to take the channels. (2,1,0) maps RGB to BGR for example. """ + if not hasattr(self, 'channel_swap'): + self.channel_swap = {} if input_ not in self.inputs: raise Exception('Input not in {}'.format(self.inputs)) self.channel_swap[input_] = order From 2fb868cbd32b542f4f77912e92bf105421fb9c0c Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 15 May 2014 09:30:07 -0700 Subject: [PATCH 0068/2053] Test for Threshold layer --- src/caffe/test/test_threshold_layer.cpp | 71 +++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/caffe/test/test_threshold_layer.cpp diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp new file mode 100644 index 00000000000..c475f669445 --- /dev/null +++ b/src/caffe/test/test_threshold_layer.cpp @@ -0,0 +1,71 @@ +// Copyright 2014 BVLC and contributors. + +#include + +#include "cuda_runtime.h" +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; + +template +class ThresholdLayerTest : public ::testing::Test { + protected: + ThresholdLayerTest() + : blob_bottom_(new Blob(2, 3, 6, 5)), + blob_top_(new Blob()) { + Caffe::set_random_seed(1701); + // fill the values + FillerParameter filler_param; + GaussianFiller filler(filler_param); + filler.Fill(this->blob_bottom_); + blob_bottom_vec_.push_back(blob_bottom_); + blob_top_vec_.push_back(blob_top_); + } + virtual ~ThresholdLayerTest() { delete blob_bottom_; delete blob_top_; } + Blob* const blob_bottom_; + Blob* const blob_top_; + vector*> blob_bottom_vec_; + vector*> blob_top_vec_; +}; + +typedef ::testing::Types Dtypes; +TYPED_TEST_CASE(ThresholdLayerTest, Dtypes); + + +TYPED_TEST(ThresholdLayerTest, TestSetup) { + LayerParameter layer_param; + ThresholdLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), this->bottom_top_->num()); + EXPECT_EQ(this->blob_top_->channels(), this->bottom_top_->channels()); + EXPECT_EQ(this->blob_top_->height(), this->bottom_top_->height()); + EXPECT_EQ(this->blob_top_->width(), this->bottom_top_->width()); +} +TYPED_TEST(ThresholdLayerTest, TestCPU) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::CPU); + ThresholdLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + const TypeParam threshold_ = layer.theshold_; + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + EXPECT_GE(top_data[i], 0.); + EXPECT_LE(top_data[i], 1.); + EXPECT_TRUE(top_data[i] == 0 && bottom_data[i] <= threshold_); + EXPECT_TRUE(top_data[i] == 1 && bottom_data[i] > threshold_); + } +} + +} // namespace caffe From 07c764488e6ec2dd1cc56fd8545f6cf2baa79597 Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 27 May 2014 10:32:11 -0700 Subject: [PATCH 0069/2053] Fixed ThresholdParam Conflicts: src/caffe/proto/caffe.proto Conflicts: src/caffe/proto/caffe.proto Conflicts: src/caffe/proto/caffe.proto --- src/caffe/proto/caffe.proto | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 5e230a11482..7d44085b118 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -127,7 +127,7 @@ message LayerParameter { // line above the enum. Update the next available ID when you add a new // LayerType. // - // LayerType next available ID: 31 (last added: ARGMAX) + // LayerType next available ID: 32 (last added: THRESHOLD) enum LayerType { // "NONE" layer type is 0th enum element so that we don't cause confusion // by defaulting to an existent LayerType (instead, should usually error if @@ -163,6 +163,7 @@ message LayerParameter { SPLIT = 22; TANH = 23; WINDOW_DATA = 24; + THRESHOLD = 31; } optional LayerType type = 5; // the layer type from the enum above @@ -175,6 +176,7 @@ message LayerParameter { repeated float weight_decay = 8; // Parameters for particular layer types. + // Parameters next available ID: 26 (last added: ThresholdParameter) optional ArgMaxParameter argmax_param = 23; optional ConcatParameter concat_param = 9; optional ConvolutionParameter convolution_param = 10; @@ -191,6 +193,7 @@ message LayerParameter { optional PoolingParameter pooling_param = 19; optional PowerParameter power_param = 21; optional WindowDataParameter window_data_param = 20; + optional ThresholdParameter threshold_param = 25; // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new @@ -261,6 +264,11 @@ message EltwiseParameter { repeated float coeff = 2; // blob-wise coefficient for SUM operation } +// Message that stores parameters used by ThresholdLayer +message ThresholdParameter { + optional float threshold = 1 [default = 0]; // Strictly Positive values +} + // Message that stores parameters used by HDF5DataLayer message HDF5DataParameter { // Specify the data source. From 59096b9471ab8e4eb59103449d98b2abc150a115 Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 16:57:50 -0700 Subject: [PATCH 0070/2053] Fixed name of threshold_ var --- src/caffe/test/test_threshold_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index c475f669445..454b3cb7550 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -59,7 +59,7 @@ TYPED_TEST(ThresholdLayerTest, TestCPU) { // Now, check values const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); - const TypeParam threshold_ = layer.theshold_; + const TypeParam threshold_ = layer.threshold_; for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); From 3e13081b7b622a0da7666359c84539f55703379b Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 16:58:27 -0700 Subject: [PATCH 0071/2053] Fixed name of blob_bottom_ --- src/caffe/test/test_threshold_layer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 454b3cb7550..628500eb986 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -45,10 +45,10 @@ TYPED_TEST(ThresholdLayerTest, TestSetup) { LayerParameter layer_param; ThresholdLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - EXPECT_EQ(this->blob_top_->num(), this->bottom_top_->num()); - EXPECT_EQ(this->blob_top_->channels(), this->bottom_top_->channels()); - EXPECT_EQ(this->blob_top_->height(), this->bottom_top_->height()); - EXPECT_EQ(this->blob_top_->width(), this->bottom_top_->width()); + EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); + EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); + EXPECT_EQ(this->blob_top_->height(), this->blob_bottom_->height()); + EXPECT_EQ(this->blob_top_->width(), this->blob_bottom_->width()); } TYPED_TEST(ThresholdLayerTest, TestCPU) { LayerParameter layer_param; From 37d5113d9f3cff1f9bf34da750a49fdfcdeaea5c Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 17:01:50 -0700 Subject: [PATCH 0072/2053] Added threshold setting test --- src/caffe/test/test_threshold_layer.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 628500eb986..7191bb29513 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -50,6 +50,7 @@ TYPED_TEST(ThresholdLayerTest, TestSetup) { EXPECT_EQ(this->blob_top_->height(), this->blob_bottom_->height()); EXPECT_EQ(this->blob_top_->width(), this->blob_bottom_->width()); } + TYPED_TEST(ThresholdLayerTest, TestCPU) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); @@ -59,7 +60,7 @@ TYPED_TEST(ThresholdLayerTest, TestCPU) { // Now, check values const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); - const TypeParam threshold_ = layer.threshold_; + const TypeParam threshold_ = layer_param.threshold_param().threshold(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); @@ -68,4 +69,24 @@ TYPED_TEST(ThresholdLayerTest, TestCPU) { } } +TYPED_TEST(ThresholdLayerTest, TestCPU2) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::CPU); + ThresholdLayerParameter* threshold_param = + layer_param.mutable_threshold_param(); + threshold_param->set_threshold(0.5); + ThresholdLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + const TypeParam threshold_ = layer_param.threshold_param().threshold(); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + EXPECT_GE(top_data[i], 0.); + EXPECT_LE(top_data[i], 1.); + EXPECT_TRUE(top_data[i] == 0 && bottom_data[i] <= threshold_); + EXPECT_TRUE(top_data[i] == 1 && bottom_data[i] > threshold_); + } +} } // namespace caffe From 0c8f32e51d8e89afe4d09c6ce1001bcc8639b33f Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 17:14:00 -0700 Subject: [PATCH 0073/2053] Added NeuronLayer::SetUp(bottom, top) to ThresholdLayer --- src/caffe/test/test_threshold_layer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 7191bb29513..6232d0c2c6d 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -89,4 +89,5 @@ TYPED_TEST(ThresholdLayerTest, TestCPU2) { EXPECT_TRUE(top_data[i] == 1 && bottom_data[i] > threshold_); } } + } // namespace caffe From 876766bce609acaa4a668c6d4eab2bfba7d03a5f Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 18:42:50 -0700 Subject: [PATCH 0074/2053] Added the code for threshold_layer to the repo --- src/caffe/layers/threshold_layer.cpp | 32 ++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/caffe/layers/threshold_layer.cpp diff --git a/src/caffe/layers/threshold_layer.cpp b/src/caffe/layers/threshold_layer.cpp new file mode 100644 index 00000000000..bec89cde63a --- /dev/null +++ b/src/caffe/layers/threshold_layer.cpp @@ -0,0 +1,32 @@ +// Copyright 2014 BVLC and contributors. + +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + + +namespace caffe { + +template +void ThresholdLayer::SetUp(const vector*>& bottom, + vector*>* top) { + NeuronLayer::SetUp(bottom, top); + threshold_ = this->layer_param_.threshold_param().threshold(); +} + +template +Dtype ThresholdLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const int count = bottom[0]->count(); + for (int i = 0; i < count; ++i) { + top_data[i] = ( bottom_data[i] > threshold_) ? Dtype(1) : Dtype(0); + } + return Dtype(0); +} + +INSTANTIATE_CLASS(ThresholdLayer); + +} // namespace caffe From 01d582b6d11f7965cd54fe3c0d32f7b12ac7c56f Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 18:47:57 -0700 Subject: [PATCH 0075/2053] Fix typo in test_threshold ThresholdParameter --- src/caffe/test/test_threshold_layer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 6232d0c2c6d..25e9f0222cb 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -72,7 +72,7 @@ TYPED_TEST(ThresholdLayerTest, TestCPU) { TYPED_TEST(ThresholdLayerTest, TestCPU2) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); - ThresholdLayerParameter* threshold_param = + ThresholdParameter* threshold_param = layer_param.mutable_threshold_param(); threshold_param->set_threshold(0.5); ThresholdLayer layer(layer_param); @@ -82,6 +82,7 @@ TYPED_TEST(ThresholdLayerTest, TestCPU2) { const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); const TypeParam threshold_ = layer_param.threshold_param().threshold(); + EXPECT_FLOAT_EQ(threshold_,0.5); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); From c5c41884323dab271547457dcefd36caa18b523f Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama Date: Thu, 15 May 2014 18:58:04 -0700 Subject: [PATCH 0076/2053] Corrected conditions in test_threshold --- src/caffe/test/test_threshold_layer.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 25e9f0222cb..4f87d0d03dd 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -64,8 +64,12 @@ TYPED_TEST(ThresholdLayerTest, TestCPU) { for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); - EXPECT_TRUE(top_data[i] == 0 && bottom_data[i] <= threshold_); - EXPECT_TRUE(top_data[i] == 1 && bottom_data[i] > threshold_); + if (top_data[i] == 0) { + EXPECT_LE(bottom_data[i],threshold_); + } + if (top_data[i] == 1) { + EXPECT_GT(bottom_data[i],threshold_); + } } } @@ -86,8 +90,12 @@ TYPED_TEST(ThresholdLayerTest, TestCPU2) { for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); - EXPECT_TRUE(top_data[i] == 0 && bottom_data[i] <= threshold_); - EXPECT_TRUE(top_data[i] == 1 && bottom_data[i] > threshold_); + if (top_data[i] == 0) { + EXPECT_LE(bottom_data[i],threshold_); + } + if (top_data[i] == 1) { + EXPECT_TRUE(bottom_data[i] > threshold_); + } } } From 27d53249d1479c62548ba95d0ed3929ed0cfb57e Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 27 May 2014 10:54:21 -0700 Subject: [PATCH 0077/2053] Added Threshold layer to neuron_layers.hpp --- include/caffe/neuron_layers.hpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 4e67a29ace3..85d5a1607fd 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -202,6 +202,34 @@ class TanHLayer : public NeuronLayer { const bool propagate_down, vector*>* bottom); }; +/* ThresholdLayer + Outputs 1 if value in input is above threshold, 0 otherwise. + The defult threshold = 0, which means positive values would become 1 and + negative or 0, would become 0 + + y = 1 if x > threshold + y = 0 if x <= threshold + y' = don't have +*/ +template +class ThresholdLayer : public NeuronLayer { + public: + explicit DropoutLayer(const LayerParameter& param) + : NeuronLayer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + NOT_IMPLEMENTED; + } + + Dtype threshold_; +}; + } // namespace caffe #endif // CAFFE_NEURON_LAYERS_HPP_ From 868dd61449a85dfed2f2807b9178584098473166 Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 27 May 2014 10:57:26 -0700 Subject: [PATCH 0078/2053] Added ForwardGPU to ThresholdLayer and to the tests --- include/caffe/neuron_layers.hpp | 7 ++-- src/caffe/layers/threshold_layer.cu | 38 ++++++++++++++++++++ src/caffe/test/test_threshold_layer.cpp | 48 +++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/caffe/layers/threshold_layer.cu diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 85d5a1607fd..180ce7a2b97 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -209,7 +209,8 @@ class TanHLayer : public NeuronLayer { y = 1 if x > threshold y = 0 if x <= threshold - y' = don't have + + y' = don't differenciable */ template class ThresholdLayer : public NeuronLayer { @@ -222,11 +223,13 @@ class ThresholdLayer : public NeuronLayer { protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); virtual void Backward_cpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { NOT_IMPLEMENTED; } - + Dtype threshold_; }; diff --git a/src/caffe/layers/threshold_layer.cu b/src/caffe/layers/threshold_layer.cu new file mode 100644 index 00000000000..0497507655b --- /dev/null +++ b/src/caffe/layers/threshold_layer.cu @@ -0,0 +1,38 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +using std::max; + +namespace caffe { + +template +__global__ void ThresholdForward(const int n, const, threshold, const Dtype* in, Dtype* out) { + CUDA_KERNEL_LOOP(index, n) { + out[index] = in[index] > threshold ? 1 : 0; + } +} + +template +Dtype ThresholdLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + const int count = bottom[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) + ReLUForward<<>>( + count, threshold_, bottom_data, top_data); + CUDA_POST_KERNEL_CHECK; + + return Dtype(0); +} + + +INSTANTIATE_CLASS(ReLULayer); + + +} // namespace caffe diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 4f87d0d03dd..b8f9d9697ec 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -99,4 +99,52 @@ TYPED_TEST(ThresholdLayerTest, TestCPU2) { } } +TYPED_TEST(ThresholdLayerTest, TestGPU) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::GPU); + ThresholdLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + const TypeParam threshold_ = layer_param.threshold_param().threshold(); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + EXPECT_GE(top_data[i], 0.); + EXPECT_LE(top_data[i], 1.); + if (top_data[i] == 0) { + EXPECT_LE(bottom_data[i],threshold_); + } + if (top_data[i] == 1) { + EXPECT_GT(bottom_data[i],threshold_); + } + } +} + +TYPED_TEST(ThresholdLayerTest, TestGPU2) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::GPU); + ThresholdParameter* threshold_param = + layer_param.mutable_threshold_param(); + threshold_param->set_threshold(0.5); + ThresholdLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + const TypeParam threshold_ = layer_param.threshold_param().threshold(); + EXPECT_FLOAT_EQ(threshold_,0.5); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + EXPECT_GE(top_data[i], 0.); + EXPECT_LE(top_data[i], 1.); + if (top_data[i] == 0) { + EXPECT_LE(bottom_data[i],threshold_); + } + if (top_data[i] == 1) { + EXPECT_TRUE(bottom_data[i] > threshold_); + } + } +} + } // namespace caffe From 1e87c20e2e7ca22f8848ea27f23959f6f6dc28a3 Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 27 May 2014 10:59:36 -0700 Subject: [PATCH 0079/2053] Fixed typo in Threshold Layer definition --- include/caffe/neuron_layers.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 180ce7a2b97..5118e8a5225 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -215,7 +215,7 @@ class TanHLayer : public NeuronLayer { template class ThresholdLayer : public NeuronLayer { public: - explicit DropoutLayer(const LayerParameter& param) + explicit ThresholdLayer(const LayerParameter& param) : NeuronLayer(param) {} virtual void SetUp(const vector*>& bottom, vector*>* top); From 6f9de3e7c5a0979c7d26db2056fff5741c2b374d Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 27 May 2014 11:01:19 -0700 Subject: [PATCH 0080/2053] Fixed type in ThresholdLayer.cu --- src/caffe/layers/threshold_layer.cu | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/caffe/layers/threshold_layer.cu b/src/caffe/layers/threshold_layer.cu index 0497507655b..624a8221486 100644 --- a/src/caffe/layers/threshold_layer.cu +++ b/src/caffe/layers/threshold_layer.cu @@ -11,7 +11,8 @@ using std::max; namespace caffe { template -__global__ void ThresholdForward(const int n, const, threshold, const Dtype* in, Dtype* out) { +__global__ void ThresholdForward(const int n, const Dtype threshold, + const Dtype* in, Dtype* out) { CUDA_KERNEL_LOOP(index, n) { out[index] = in[index] > threshold ? 1 : 0; } From 8cb4e45fb7301b02e36df40827f8fc56eaf8e2f6 Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 27 May 2014 11:02:20 -0700 Subject: [PATCH 0081/2053] Fixed call to ThresholdForward in ThresholdLayer.cu --- src/caffe/layers/threshold_layer.cu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/threshold_layer.cu b/src/caffe/layers/threshold_layer.cu index 624a8221486..61b1eca81d3 100644 --- a/src/caffe/layers/threshold_layer.cu +++ b/src/caffe/layers/threshold_layer.cu @@ -25,7 +25,7 @@ Dtype ThresholdLayer::Forward_gpu(const vector*>& bottom, Dtype* top_data = (*top)[0]->mutable_gpu_data(); const int count = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) - ReLUForward<<>>( + ThresholdForward<<>>( count, threshold_, bottom_data, top_data); CUDA_POST_KERNEL_CHECK; From 8c405388f4f028f5f802c3622fd5b6bdfd0591b7 Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 27 May 2014 11:06:56 -0700 Subject: [PATCH 0082/2053] Make lint happy --- src/caffe/layers/threshold_layer.cpp | 2 +- src/caffe/test/test_threshold_layer.cpp | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/caffe/layers/threshold_layer.cpp b/src/caffe/layers/threshold_layer.cpp index bec89cde63a..e6ed8a6b40e 100644 --- a/src/caffe/layers/threshold_layer.cpp +++ b/src/caffe/layers/threshold_layer.cpp @@ -22,7 +22,7 @@ Dtype ThresholdLayer::Forward_cpu(const vector*>& bottom, Dtype* top_data = (*top)[0]->mutable_cpu_data(); const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { - top_data[i] = ( bottom_data[i] > threshold_) ? Dtype(1) : Dtype(0); + top_data[i] = (bottom_data[i] > threshold_) ? Dtype(1) : Dtype(0); } return Dtype(0); } diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index b8f9d9697ec..8303e442007 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -65,10 +65,10 @@ TYPED_TEST(ThresholdLayerTest, TestCPU) { EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); if (top_data[i] == 0) { - EXPECT_LE(bottom_data[i],threshold_); + EXPECT_LE(bottom_data[i], threshold_); } if (top_data[i] == 1) { - EXPECT_GT(bottom_data[i],threshold_); + EXPECT_GT(bottom_data[i], threshold_); } } } @@ -86,15 +86,15 @@ TYPED_TEST(ThresholdLayerTest, TestCPU2) { const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); const TypeParam threshold_ = layer_param.threshold_param().threshold(); - EXPECT_FLOAT_EQ(threshold_,0.5); + EXPECT_FLOAT_EQ(threshold_, 0.5); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); if (top_data[i] == 0) { - EXPECT_LE(bottom_data[i],threshold_); + EXPECT_LE(bottom_data[i], threshold_); } if (top_data[i] == 1) { - EXPECT_TRUE(bottom_data[i] > threshold_); + EXPECT_GT(bottom_data[i], threshold_); } } } @@ -113,10 +113,10 @@ TYPED_TEST(ThresholdLayerTest, TestGPU) { EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); if (top_data[i] == 0) { - EXPECT_LE(bottom_data[i],threshold_); + EXPECT_LE(bottom_data[i], threshold_); } if (top_data[i] == 1) { - EXPECT_GT(bottom_data[i],threshold_); + EXPECT_GT(bottom_data[i], threshold_); } } } @@ -134,15 +134,15 @@ TYPED_TEST(ThresholdLayerTest, TestGPU2) { const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); const TypeParam threshold_ = layer_param.threshold_param().threshold(); - EXPECT_FLOAT_EQ(threshold_,0.5); + EXPECT_FLOAT_EQ(threshold_, 0.5); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); if (top_data[i] == 0) { - EXPECT_LE(bottom_data[i],threshold_); + EXPECT_LE(bottom_data[i], threshold_); } if (top_data[i] == 1) { - EXPECT_TRUE(bottom_data[i] > threshold_); + EXPECT_GT(bottom_data[i], threshold_); } } } From c4e4ca82e47c37ed1ef09cf94a43153bd5a0c374 Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 27 May 2014 11:44:17 -0700 Subject: [PATCH 0083/2053] Comment Test GPUs cases --- src/caffe/test/test_threshold_layer.cpp | 92 ++++++++++++------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 8303e442007..a34972ef575 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -99,52 +99,52 @@ TYPED_TEST(ThresholdLayerTest, TestCPU2) { } } -TYPED_TEST(ThresholdLayerTest, TestGPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - ThresholdLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - const TypeParam threshold_ = layer_param.threshold_param().threshold(); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_GE(top_data[i], 0.); - EXPECT_LE(top_data[i], 1.); - if (top_data[i] == 0) { - EXPECT_LE(bottom_data[i], threshold_); - } - if (top_data[i] == 1) { - EXPECT_GT(bottom_data[i], threshold_); - } - } -} +// TYPED_TEST(ThresholdLayerTest, TestGPU) { +// LayerParameter layer_param; +// Caffe::set_mode(Caffe::GPU); +// ThresholdLayer layer(layer_param); +// layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); +// layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); +// // Now, check values +// const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); +// const TypeParam* top_data = this->blob_top_->cpu_data(); +// const TypeParam threshold_ = layer_param.threshold_param().threshold(); +// for (int i = 0; i < this->blob_bottom_->count(); ++i) { +// EXPECT_GE(top_data[i], 0.); +// EXPECT_LE(top_data[i], 1.); +// if (top_data[i] == 0) { +// EXPECT_LE(bottom_data[i], threshold_); +// } +// if (top_data[i] == 1) { +// EXPECT_GT(bottom_data[i], threshold_); +// } +// } +// } -TYPED_TEST(ThresholdLayerTest, TestGPU2) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - ThresholdParameter* threshold_param = - layer_param.mutable_threshold_param(); - threshold_param->set_threshold(0.5); - ThresholdLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - const TypeParam threshold_ = layer_param.threshold_param().threshold(); - EXPECT_FLOAT_EQ(threshold_, 0.5); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_GE(top_data[i], 0.); - EXPECT_LE(top_data[i], 1.); - if (top_data[i] == 0) { - EXPECT_LE(bottom_data[i], threshold_); - } - if (top_data[i] == 1) { - EXPECT_GT(bottom_data[i], threshold_); - } - } -} +// TYPED_TEST(ThresholdLayerTest, TestGPU2) { +// LayerParameter layer_param; +// Caffe::set_mode(Caffe::GPU); +// ThresholdParameter* threshold_param = +// layer_param.mutable_threshold_param(); +// threshold_param->set_threshold(0.5); +// ThresholdLayer layer(layer_param); +// layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); +// layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); +// // Now, check values +// const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); +// const TypeParam* top_data = this->blob_top_->cpu_data(); +// const TypeParam threshold_ = layer_param.threshold_param().threshold(); +// EXPECT_FLOAT_EQ(threshold_, 0.5); +// for (int i = 0; i < this->blob_bottom_->count(); ++i) { +// EXPECT_GE(top_data[i], 0.); +// EXPECT_LE(top_data[i], 1.); +// if (top_data[i] == 0) { +// EXPECT_LE(bottom_data[i], threshold_); +// } +// if (top_data[i] == 1) { +// EXPECT_GT(bottom_data[i], threshold_); +// } +// } +// } } // namespace caffe From 5a4c9bcdfc4f08faa34bda22ce6a364b7095821a Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 27 May 2014 11:54:53 -0700 Subject: [PATCH 0084/2053] Un comment Test GPUs cases, fixed ThresholdLayer.cu --- src/caffe/layers/threshold_layer.cu | 2 +- src/caffe/test/test_threshold_layer.cpp | 92 ++++++++++++------------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/src/caffe/layers/threshold_layer.cu b/src/caffe/layers/threshold_layer.cu index 61b1eca81d3..03eb3f32d49 100644 --- a/src/caffe/layers/threshold_layer.cu +++ b/src/caffe/layers/threshold_layer.cu @@ -33,7 +33,7 @@ Dtype ThresholdLayer::Forward_gpu(const vector*>& bottom, } -INSTANTIATE_CLASS(ReLULayer); +INSTANTIATE_CLASS(ThresholdLayer); } // namespace caffe diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index a34972ef575..8303e442007 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -99,52 +99,52 @@ TYPED_TEST(ThresholdLayerTest, TestCPU2) { } } -// TYPED_TEST(ThresholdLayerTest, TestGPU) { -// LayerParameter layer_param; -// Caffe::set_mode(Caffe::GPU); -// ThresholdLayer layer(layer_param); -// layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); -// layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); -// // Now, check values -// const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); -// const TypeParam* top_data = this->blob_top_->cpu_data(); -// const TypeParam threshold_ = layer_param.threshold_param().threshold(); -// for (int i = 0; i < this->blob_bottom_->count(); ++i) { -// EXPECT_GE(top_data[i], 0.); -// EXPECT_LE(top_data[i], 1.); -// if (top_data[i] == 0) { -// EXPECT_LE(bottom_data[i], threshold_); -// } -// if (top_data[i] == 1) { -// EXPECT_GT(bottom_data[i], threshold_); -// } -// } -// } +TYPED_TEST(ThresholdLayerTest, TestGPU) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::GPU); + ThresholdLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + const TypeParam threshold_ = layer_param.threshold_param().threshold(); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + EXPECT_GE(top_data[i], 0.); + EXPECT_LE(top_data[i], 1.); + if (top_data[i] == 0) { + EXPECT_LE(bottom_data[i], threshold_); + } + if (top_data[i] == 1) { + EXPECT_GT(bottom_data[i], threshold_); + } + } +} -// TYPED_TEST(ThresholdLayerTest, TestGPU2) { -// LayerParameter layer_param; -// Caffe::set_mode(Caffe::GPU); -// ThresholdParameter* threshold_param = -// layer_param.mutable_threshold_param(); -// threshold_param->set_threshold(0.5); -// ThresholdLayer layer(layer_param); -// layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); -// layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); -// // Now, check values -// const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); -// const TypeParam* top_data = this->blob_top_->cpu_data(); -// const TypeParam threshold_ = layer_param.threshold_param().threshold(); -// EXPECT_FLOAT_EQ(threshold_, 0.5); -// for (int i = 0; i < this->blob_bottom_->count(); ++i) { -// EXPECT_GE(top_data[i], 0.); -// EXPECT_LE(top_data[i], 1.); -// if (top_data[i] == 0) { -// EXPECT_LE(bottom_data[i], threshold_); -// } -// if (top_data[i] == 1) { -// EXPECT_GT(bottom_data[i], threshold_); -// } -// } -// } +TYPED_TEST(ThresholdLayerTest, TestGPU2) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::GPU); + ThresholdParameter* threshold_param = + layer_param.mutable_threshold_param(); + threshold_param->set_threshold(0.5); + ThresholdLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + const TypeParam threshold_ = layer_param.threshold_param().threshold(); + EXPECT_FLOAT_EQ(threshold_, 0.5); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + EXPECT_GE(top_data[i], 0.); + EXPECT_LE(top_data[i], 1.); + if (top_data[i] == 0) { + EXPECT_LE(bottom_data[i], threshold_); + } + if (top_data[i] == 1) { + EXPECT_GT(bottom_data[i], threshold_); + } + } +} } // namespace caffe From ec84febd9c69b5c1f6cda58cba73d48c1064e89b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 28 May 2014 17:18:22 -0700 Subject: [PATCH 0085/2053] fix OSX 10.9 homebrew CXX doc clang++ and not clang as accidentally committed in 2dcbcd9. --- docs/installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 1210bfc615e..a6f9f137027 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -111,7 +111,7 @@ If you're not using Anaconda, include `hdf5` in the list above. #### 10.9-specific Instructions -In OS X 10.9, clang is the default compiler and uses `libc++` as the standard library. +In OS X 10.9, clang++ is the default C++ compiler and uses `libc++` as the standard library. However, NVIDIA CUDA (even version 6.0) currently links only with `libstdc++`. This makes it necessary to change the compilation settings for each of the dependencies. @@ -130,7 +130,7 @@ For each of these formulas, `brew edit FORMULA`, and add the ENV definitions as ENV.append "CFLAGS", "-stdlib=libstdc++" ENV.append "LDFLAGS", "-stdlib=libstdc++ -lstdc++" # The following is necessary because libtool likes to strip LDFLAGS: - ENV["CXX"] = "/usr/bin/clang -stdlib=libstdc++" + ENV["CXX"] = "/usr/bin/clang++ -stdlib=libstdc++" ... To edit the formulae in turn, run From cc30340f0150f5c58c410b981a4fbd7eed0bd932 Mon Sep 17 00:00:00 2001 From: Rob Currie Date: Thu, 29 May 2014 14:46:29 -0700 Subject: [PATCH 0086/2053] Update docs on building boost on OSX for the python wrappers --- docs/installation.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/installation.md b/docs/installation.md index a6f9f137027..b84ae3b83e4 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -144,6 +144,10 @@ After this, run **Note** that the HDF5 dependency is provided by Anaconda Python in this case. If you're not using Anaconda, include `hdf5` in the list above. +**Note** that in order to build the caffe python wrappers you must install boost using the --with-python option: + + brew install --build-from-source --with-python --fresh -vd boost + #### Windows There is an unofficial Windows port of Caffe at [niuzhiheng/caffe:windows](https://github.com/niuzhiheng/caffe). Thanks [@niuzhiheng](https://github.com/niuzhiheng). From d21da02474a0f5be28ce62517de017be761ac8e0 Mon Sep 17 00:00:00 2001 From: Jerod Weinman Date: Mon, 2 Jun 2014 15:54:25 -0500 Subject: [PATCH 0087/2053] Added an iscolor flag to io.cpp method ReadImageToDatum to handle grayscale images and a corresponding commandline flag [-g] to convert_imageset.cpp. --- include/caffe/util/io.hpp | 8 +++++++- src/caffe/util/io.cpp | 25 ++++++++++++++++++------- tools/convert_imageset.cpp | 35 +++++++++++++++++++++-------------- 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 056b573db4c..829293ecaef 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -61,13 +61,19 @@ inline void WriteProtoToBinaryFile( } bool ReadImageToDatum(const string& filename, const int label, - const int height, const int width, Datum* datum); + const int height, const int width, const bool iscolor, Datum* datum); + +inline bool ReadImageToDatum(const string& filename, const int label, + const int height, const int width, Datum* datum) { + return ReadImageToDatum(filename, label, height, width, true, datum); +} inline bool ReadImageToDatum(const string& filename, const int label, Datum* datum) { return ReadImageToDatum(filename, label, 0, 0, datum); } + template void hdf5_load_nd_dataset_helper( hid_t file_id, const char* dataset_name_, int min_dim, int max_dim, diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 44858f48a36..f2650e9a22a 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -72,32 +72,43 @@ void WriteProtoToBinaryFile(const Message& proto, const char* filename) { } bool ReadImageToDatum(const string& filename, const int label, - const int height, const int width, Datum* datum) { + const int height, const int width, const bool iscolor, Datum* datum) { cv::Mat cv_img; + int cv_read_flag = (iscolor ? CV_LOAD_IMAGE_COLOR : CV_LOAD_IMAGE_GRAYSCALE); if (height > 0 && width > 0) { - cv::Mat cv_img_origin = cv::imread(filename, CV_LOAD_IMAGE_COLOR); + cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); cv::resize(cv_img_origin, cv_img, cv::Size(height, width)); } else { - cv_img = cv::imread(filename, CV_LOAD_IMAGE_COLOR); + cv_img = cv::imread(filename, cv_read_flag); } if (!cv_img.data) { LOG(ERROR) << "Could not open or find file " << filename; return false; } - datum->set_channels(3); + int num_channels = (iscolor ? 3 : 1); + datum->set_channels(num_channels); datum->set_height(cv_img.rows); datum->set_width(cv_img.cols); datum->set_label(label); datum->clear_data(); datum->clear_float_data(); string* datum_string = datum->mutable_data(); - for (int c = 0; c < 3; ++c) { + if (iscolor) { + for (int c = 0; c < num_channels; ++c) { + for (int h = 0; h < cv_img.rows; ++h) { + for (int w = 0; w < cv_img.cols; ++w) { + datum_string->push_back( + static_cast(cv_img.at(h, w)[c])); + } + } + } + } else { // Faster than repeatedly testing iscolor for each pixel w/i loop for (int h = 0; h < cv_img.rows; ++h) { for (int w = 0; w < cv_img.cols; ++w) { datum_string->push_back( - static_cast(cv_img.at(h, w)[c])); + static_cast(cv_img.at(h, w))); + } } - } } return true; } diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 2420f9538fb..bbf848adc8a 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -2,7 +2,7 @@ // This program converts a set of images to a leveldb by storing them as Datum // proto buffers. // Usage: -// convert_imageset ROOTFOLDER/ LISTFILE DB_NAME RANDOM_SHUFFLE[0 or 1] \ +// convert_imageset [-g] ROOTFOLDER/ LISTFILE DB_NAME RANDOM_SHUFFLE[0 or 1] \ // [resize_height] [resize_width] // where ROOTFOLDER is the root folder that holds all the images, and LISTFILE // should be a list of files as well as their labels, in the format as @@ -10,6 +10,9 @@ // .... // if RANDOM_SHUFFLE is 1, a random shuffle will be carried out before we // process the file lines. +// Optional flag -g indicates the images should be read as +// single-channel grayscale. If omitted, grayscale images will be +// converted to color. #include #include @@ -30,24 +33,28 @@ using std::string; int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); - if (argc < 4 || argc > 7) { + if (argc < 4 || argc > 8) { printf("Convert a set of images to the leveldb format used\n" "as input for Caffe.\n" "Usage:\n" - " convert_imageset ROOTFOLDER/ LISTFILE DB_NAME" + " convert_imageset [-g] ROOTFOLDER/ LISTFILE DB_NAME" " RANDOM_SHUFFLE_DATA[0 or 1] [resize_height] [resize_width]\n" "The ImageNet dataset for the training demo is at\n" " http://www.image-net.org/download-images\n"); return 1; } - std::ifstream infile(argv[2]); + + // Test whether argv[1] == "-g" + bool iscolor= !(string("-g") == string(argv[1])); + int arg_offset = (iscolor ? 0 : 1); + std::ifstream infile(argv[arg_offset+2]); std::vector > lines; string filename; int label; while (infile >> filename >> label) { lines.push_back(std::make_pair(filename, label)); } - if (argc >= 5 && argv[4][0] == '1') { + if (argc >= (arg_offset+5) && argv[arg_offset+4][0] == '1') { // randomly shuffle data LOG(INFO) << "Shuffling data"; std::random_shuffle(lines.begin(), lines.end()); @@ -55,11 +62,11 @@ int main(int argc, char** argv) { LOG(INFO) << "A total of " << lines.size() << " images."; int resize_height = 0; int resize_width = 0; - if (argc >= 6) { - resize_height = atoi(argv[5]); + if (argc >= (arg_offset+6)) { + resize_height = atoi(argv[arg_offset+5]); } - if (argc >= 7) { - resize_width = atoi(argv[6]); + if (argc >= (arg_offset+7)) { + resize_width = atoi(argv[arg_offset+6]); } leveldb::DB* db; @@ -67,12 +74,12 @@ int main(int argc, char** argv) { options.error_if_exists = true; options.create_if_missing = true; options.write_buffer_size = 268435456; - LOG(INFO) << "Opening leveldb " << argv[3]; + LOG(INFO) << "Opening leveldb " << argv[arg_offset+3]; leveldb::Status status = leveldb::DB::Open( - options, argv[3], &db); - CHECK(status.ok()) << "Failed to open leveldb " << argv[3]; + options, argv[arg_offset+3], &db); + CHECK(status.ok()) << "Failed to open leveldb " << argv[arg_offset+3]; - string root_folder(argv[1]); + string root_folder(argv[arg_offset+1]); Datum datum; int count = 0; const int kMaxKeyLength = 256; @@ -82,7 +89,7 @@ int main(int argc, char** argv) { bool data_size_initialized = false; for (int line_id = 0; line_id < lines.size(); ++line_id) { if (!ReadImageToDatum(root_folder + lines[line_id].first, - lines[line_id].second, resize_height, resize_width, &datum)) { + lines[line_id].second, resize_height, resize_width, iscolor, &datum)) { continue; } if (!data_size_initialized) { From a8dfed49e36d2d90a9be8633514a350936e2f5ee Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 2 Jun 2014 23:47:09 -0700 Subject: [PATCH 0088/2053] compile debug/release into separate directories so you don't have to rebuild the whole thing to switch back and forth --- Makefile | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index a092ac890fc..2c42516cebf 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,19 @@ PROJECT := caffe CONFIG_FILE := Makefile.config include $(CONFIG_FILE) +BUILD_DIR_LINK := $(BUILD_DIR) +RELEASE_BUILD_DIR := .$(BUILD_DIR)_release +DEBUG_BUILD_DIR := .$(BUILD_DIR)_debug + +DEBUG ?= 0 +ifeq ($(DEBUG), 1) + BUILD_DIR := $(DEBUG_BUILD_DIR) + OTHER_BUILD_DIR := $(RELEASE_BUILD_DIR) +else + BUILD_DIR := $(RELEASE_BUILD_DIR) + OTHER_BUILD_DIR := $(DEBUG_BUILD_DIR) +endif + # The target static library and shared library name LIB_BUILD_DIR := $(BUILD_DIR)/lib NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so @@ -167,7 +180,6 @@ ifeq ($(OSX), 1) endif # Debugging -DEBUG ?= 0 ifeq ($(DEBUG), 1) COMMON_FLAGS := -DDEBUG -g -O0 else @@ -277,7 +289,19 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) runtest: $(TEST_ALL_BIN) $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle -$(ALL_BUILD_DIRS): +$(BUILD_DIR_LINK): $(BUILD_DIR)/.linked + +# Create a target ".linked" in this BUILD_DIR to tell Make that the "build" link +# is currently correct, then delete the one in the OTHER_BUILD_DIR in case it +# exists and $(DEBUG) is toggled later. +$(BUILD_DIR)/.linked: + @ mkdir -p $(BUILD_DIR) + @ $(RM) $(OTHER_BUILD_DIR)/.linked + @ $(RM) $(BUILD_DIR_LINK) + @ ln -s $(BUILD_DIR) $(BUILD_DIR_LINK) + @ touch $@ + +$(ALL_BUILD_DIRS): | $(BUILD_DIR_LINK) @ mkdir -p $@ $(NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) @@ -357,7 +381,7 @@ proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER) $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_BUILD_DIR)/%.pb.h : \ $(PROTO_SRC_DIR)/%.proto | $(PROTO_BUILD_DIR) - protoc --proto_path=src --cpp_out=build/src $< + protoc --proto_path=src --cpp_out=$(BUILD_DIR)/src $< @ echo $(PY_PROTO_BUILD_DIR)/%_pb2.py : $(PROTO_SRC_DIR)/%.proto \ @@ -370,6 +394,8 @@ $(PY_PROTO_INIT): | $(PY_PROTO_BUILD_DIR) clean: @- $(RM) -rf $(ALL_BUILD_DIRS) + @- $(RM) -rf $(OTHER_BUILD_DIR) + @- $(RM) -rf $(BUILD_DIR_LINK) @- $(RM) -rf $(DISTRIBUTE_DIR) @- $(RM) $(PY$(PROJECT)_SO) @- $(RM) $(MAT$(PROJECT)_SO) From add82f97ce3eec3b8fec55457eea8f4a6dd7daad Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 2 Jun 2014 23:57:37 -0700 Subject: [PATCH 0089/2053] update .gitignore appropriately for separate debug/release build dirs --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fee9a6baac1..292716666f1 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,9 @@ *.mex* # build, distribute, and bins -build/* +build +.build_debug/* +.build_release/* distribute/* *.testbin *.bin From 713c873a0a7651a4c7ac0e91438757ab90bddc72 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 5 Jun 2014 17:20:30 -0700 Subject: [PATCH 0090/2053] Make TanH cleaner, more efficient, and possible to use in-place --- src/caffe/layers/tanh_layer.cpp | 11 +++++------ src/caffe/layers/tanh_layer.cu | 20 +++++++------------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp index 46d11d0a17a..66f530f82d5 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -18,8 +18,8 @@ Dtype TanHLayer::Forward_cpu(const vector*>& bottom, Dtype exp2x; const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { - exp2x = exp(2*bottom_data[i]); - top_data[i] = (exp2x - Dtype(1))/(exp2x + Dtype(1)); + exp2x = exp(2 * bottom_data[i]); + top_data[i] = (exp2x - Dtype(1)) / (exp2x + Dtype(1)); } return Dtype(0); } @@ -29,16 +29,15 @@ void TanHLayer::Backward_cpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { if (propagate_down) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* top_data = top[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); const int count = (*bottom)[0]->count(); Dtype exp2x; Dtype tanhx; for (int i = 0; i < count; ++i) { - exp2x = exp(2*bottom_data[i]); - tanhx = (exp2x - Dtype(1))/(exp2x + Dtype(1)); - bottom_diff[i] = top_diff[i] * (1 - tanhx*tanhx); + tanhx = top_data[i]; + bottom_diff[i] = top_diff[i] * (1 - tanhx * tanhx); } } } diff --git a/src/caffe/layers/tanh_layer.cu b/src/caffe/layers/tanh_layer.cu index 13bb001ffc0..aa822d84f38 100644 --- a/src/caffe/layers/tanh_layer.cu +++ b/src/caffe/layers/tanh_layer.cu @@ -13,8 +13,8 @@ namespace caffe { template __global__ void TanHForward(const int n, const Dtype* in, Dtype* out) { CUDA_KERNEL_LOOP(index, n) { - Dtype exp2x = exp(2*in[index]); - out[index] = (exp2x - Dtype(1))/(exp2x + Dtype(1)); + Dtype exp2x = exp(2 * in[index]); + out[index] = (exp2x - Dtype(1)) / (exp2x + Dtype(1)); } } @@ -28,21 +28,15 @@ Dtype TanHLayer::Forward_gpu(const vector*>& bottom, TanHForward<<>>( count, bottom_data, top_data); CUDA_POST_KERNEL_CHECK; - // << " count: " << count << " bottom_data: " - // << (unsigned long)bottom_data - // << " top_data: " << (unsigned long)top_data - // << " blocks: " << CAFFE_GET_BLOCKS(count) - // << " threads: " << CAFFE_CUDA_NUM_THREADS; return Dtype(0); } template __global__ void TanHBackward(const int n, const Dtype* in_diff, - const Dtype* in_data, Dtype* out_diff) { + const Dtype* out_data, Dtype* out_diff) { CUDA_KERNEL_LOOP(index, n) { - Dtype exp2x = exp(2*in_data[index]); - Dtype tanhx = (exp2x - Dtype(1))/(exp2x + Dtype(1)); - out_diff[index] = in_diff[index] * (1 - tanhx*tanhx); + Dtype tanhx = out_data[index]; + out_diff[index] = in_diff[index] * (1 - tanhx * tanhx); } } @@ -51,13 +45,13 @@ void TanHLayer::Backward_gpu(const vector*>& top, const bool propagate_down, vector*>* bottom) { if (propagate_down) { - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); const int count = (*bottom)[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) TanHBackward<<>>( - count, top_diff, bottom_data, bottom_diff); + count, top_diff, top_data, bottom_diff); CUDA_POST_KERNEL_CHECK; } } From 0d257e431404ad11df48816b85a94898bc86bf13 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 5 Jun 2014 10:53:42 -0700 Subject: [PATCH 0091/2053] padding for max pooling Max pooling pads by -inf if the padding parameter is set. Padding for pooling, like padding for convolution, can preserve the dimensions of the bottom at the top. By setting the padding to floor(kernel_size / 2) the top output is the "same" instead of the "valid" part of the bottom input. --- src/caffe/layers/pooling_layer.cpp | 14 +++++++++----- src/caffe/layers/pooling_layer.cu | 24 ++++++++++++++---------- src/caffe/proto/caffe.proto | 3 ++- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 5d6921f1da8..80ce4df6d29 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -32,9 +32,11 @@ void PoolingLayer::SetUp(const vector*>& bottom, stride_ = this->layer_param_.pooling_param().stride(); pad_ = this->layer_param_.pooling_param().pad(); if (pad_ != 0) { - CHECK_EQ(this->layer_param_.pooling_param().pool(), - PoolingParameter_PoolMethod_AVE) - << "Padding implemented only for average pooling."; + CHECK(this->layer_param_.pooling_param().pool() + == PoolingParameter_PoolMethod_AVE + || this->layer_param_.pooling_param().pool() + == PoolingParameter_PoolMethod_MAX) + << "Padding implemented only for average and max pooling."; } channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); @@ -92,10 +94,12 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, for (int c = 0; c < channels_; ++c) { for (int ph = 0; ph < pooled_height_; ++ph) { for (int pw = 0; pw < pooled_width_; ++pw) { - int hstart = ph * stride_; - int wstart = pw * stride_; + int hstart = ph * stride_ - pad_; + int wstart = pw * stride_ - pad_; int hend = min(hstart + kernel_size_, height_); int wend = min(wstart + kernel_size_, width_); + hstart = max(hstart, 0); + wstart = max(wstart, 0); const int pool_index = ph * pooled_width_ + pw; for (int h = hstart; h < hend; ++h) { for (int w = wstart; w < wend; ++w) { diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 31be47efc0c..7bb397bba47 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -17,17 +17,19 @@ template __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, Dtype* top_data, + const int kernel_size, const int stride, const int pad, Dtype* top_data, int* mask, Dtype* top_mask) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; int n = index / pooled_width / pooled_height / channels; - int hstart = ph * stride; + int hstart = ph * stride - pad; + int wstart = pw * stride - pad; int hend = min(hstart + kernel_size, height); - int wstart = pw * stride; int wend = min(wstart + kernel_size, width); + hstart = max(hstart, 0); + wstart = max(wstart, 0); Dtype maxval = -FLT_MAX; int maxidx = -1; bottom_data += (n * channels + c) * height * width; @@ -170,7 +172,7 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, MaxPoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, kernel_size_, stride_, - top_data, mask, top_mask); + pad_, top_data, mask, top_mask); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) @@ -212,7 +214,7 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, const int* mask, const Dtype* top_mask, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, const int kernel_size, const int stride, - Dtype* bottom_diff) { + const int pad, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset @@ -220,10 +222,12 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, int h = (index / width) % height; int c = (index / width / height) % channels; int n = index / width / height / channels; - int phstart = (h < kernel_size) ? 0 : (h - kernel_size) / stride + 1; - int phend = min(h / stride + 1, pooled_height); - int pwstart = (w < kernel_size) ? 0 : (w - kernel_size) / stride + 1; - int pwend = min(w / stride + 1, pooled_width); + int phstart = + (h + pad < kernel_size) ? 0 : (h + pad - kernel_size) / stride + 1; + int phend = min((h + pad) / stride + 1, pooled_height); + int pwstart = + (w + pad < kernel_size) ? 0 : (w + pad - kernel_size) / stride + 1; + int pwend = min((w + pad) / stride + 1, pooled_width); Dtype gradient = 0; int offset = (n * channels + c) * pooled_height * pooled_width; top_diff += offset; @@ -342,7 +346,7 @@ void PoolingLayer::Backward_gpu(const vector*>& top, MaxPoolBackward<<>>( count, top_diff, mask, top_mask, top[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, - kernel_size_, stride_, bottom_diff); + kernel_size_, stride_, pad_, bottom_diff); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 7d44085b118..e540a95a921 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -353,7 +353,8 @@ message PoolingParameter { optional PoolMethod pool = 1 [default = MAX]; // The pooling method optional uint32 kernel_size = 2; // The kernel size optional uint32 stride = 3 [default = 1]; // The stride - // The padding size -- currently implemented only for average pooling. + // The padding size -- currently implemented only for average and max pooling. + // average pooling zero pads. max pooling -inf pads. optional uint32 pad = 4 [default = 0]; } From 223918825e12e3e1147cc196d8527147fad8c675 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 6 Jun 2014 13:59:19 -0700 Subject: [PATCH 0092/2053] check the last pooling in padding and add padded max pooling test [Adapted from a commit by @jeffdonahue by @shelhamer.] --- src/caffe/layers/pooling_layer.cpp | 19 +++++- src/caffe/layers/pooling_layer.cu | 5 +- src/caffe/test/test_pooling_layer.cpp | 94 +++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 6 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 80ce4df6d29..929d7dfaa02 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -37,6 +37,7 @@ void PoolingLayer::SetUp(const vector*>& bottom, || this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX) << "Padding implemented only for average and max pooling."; + CHECK_LT(pad_, kernel_size_); } channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); @@ -45,6 +46,18 @@ void PoolingLayer::SetUp(const vector*>& bottom, height_ + 2 * pad_ - kernel_size_) / stride_)) + 1; pooled_width_ = static_cast(ceil(static_cast( width_ + 2 * pad_ - kernel_size_) / stride_)) + 1; + if (pad_) { + // If we have padding, ensure that the last pooling starts strictly + // inside the image (instead of at the padding); otherwise clip the last. + if ((pooled_height_ - 1) * stride_ >= height_ + pad_) { + --pooled_height_; + } + if ((pooled_width_ - 1) * stride_ >= width_ + pad_) { + --pooled_width_; + } + CHECK_LT((pooled_height_ - 1) * stride_, height_ + pad_); + CHECK_LT((pooled_width_ - 1) * stride_, width_ + pad_); + } (*top)[0]->Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); if (top->size() > 1) { @@ -71,13 +84,13 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); - // Different pooling methods. We explicitly do the switch outside the for - // loop to save time, although this results in more codes. - int top_count = (*top)[0]->count(); + const int top_count = (*top)[0]->count(); // We'll output the mask to top[1] if it's of size >1. const bool use_top_mask = top->size() > 1; int* mask; Dtype* top_mask; + // Different pooling methods. We explicitly do the switch outside the for + // loop to save time, although this results in more code. switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: // Initialize diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 7bb397bba47..abba6252cc6 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -328,8 +328,8 @@ void PoolingLayer::Backward_gpu(const vector*>& top, } const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - int count = (*bottom)[0]->count(); - CUDA_CHECK(cudaMemset(bottom_diff, 0, sizeof(Dtype) * count)); + const int count = (*bottom)[0]->count(); + caffe_gpu_set(count, Dtype(0.), bottom_diff); // We'll output the mask to top[1] if it's of size >1. const bool use_top_mask = top.size() > 1; const int* mask = NULL; @@ -341,7 +341,6 @@ void PoolingLayer::Backward_gpu(const vector*>& top, } else { mask = max_idx_->gpu_data(); } - caffe_gpu_set(count, Dtype(0.), bottom_diff); // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<<>>( count, top_diff, mask, top_mask, top[0]->num(), channels_, diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index 6628fc5dfc6..b13d11f6c6d 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -232,6 +232,7 @@ TYPED_TEST(PoolingLayerTest, TestCPUGradientMax) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); + pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); Caffe::set_mode(Caffe::CPU); PoolingLayer layer(layer_param); @@ -245,6 +246,7 @@ TYPED_TEST(PoolingLayerTest, TestGPUGradientMax) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); + pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); Caffe::set_mode(Caffe::GPU); PoolingLayer layer(layer_param); @@ -253,6 +255,98 @@ TYPED_TEST(PoolingLayerTest, TestGPUGradientMax) { &(this->blob_top_vec_)); } +TYPED_TEST(PoolingLayerTest, TestCPUForwardMaxPadded) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); + pooling_param->set_pad(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + Caffe::set_mode(Caffe::CPU); + this->blob_bottom_->Reshape(1, 1, 3, 3); + // Input: + // [ 1 2 4 ] + // [ 2 3 2 ] + // [ 4 2 1 ] + this->blob_bottom_->mutable_cpu_data()[0] = 1; + this->blob_bottom_->mutable_cpu_data()[1] = 2; + this->blob_bottom_->mutable_cpu_data()[2] = 4; + this->blob_bottom_->mutable_cpu_data()[3] = 2; + this->blob_bottom_->mutable_cpu_data()[4] = 3; + this->blob_bottom_->mutable_cpu_data()[5] = 2; + this->blob_bottom_->mutable_cpu_data()[6] = 4; + this->blob_bottom_->mutable_cpu_data()[7] = 2; + this->blob_bottom_->mutable_cpu_data()[8] = 1; + PoolingLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), 1); + EXPECT_EQ(this->blob_top_->channels(), 1); + EXPECT_EQ(this->blob_top_->height(), 3); + EXPECT_EQ(this->blob_top_->width(), 3); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + TypeParam epsilon = 1e-8; + // Output: + // [ 1 4 4 ] + // [ 4 4 4 ] + // [ 4 4 1 ] + EXPECT_NEAR(this->blob_top_->cpu_data()[0], 1, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[1], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[2], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[3], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[4], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[5], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[6], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[7], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[8], 1, epsilon); +} + + +TYPED_TEST(PoolingLayerTest, TestGPUForwardMaxPadded) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); + pooling_param->set_pad(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + Caffe::set_mode(Caffe::GPU); + this->blob_bottom_->Reshape(1, 1, 3, 3); + // Input: + // [ 1 2 4 ] + // [ 2 3 2 ] + // [ 4 2 1 ] + this->blob_bottom_->mutable_cpu_data()[0] = 1; + this->blob_bottom_->mutable_cpu_data()[1] = 2; + this->blob_bottom_->mutable_cpu_data()[2] = 4; + this->blob_bottom_->mutable_cpu_data()[3] = 2; + this->blob_bottom_->mutable_cpu_data()[4] = 3; + this->blob_bottom_->mutable_cpu_data()[5] = 2; + this->blob_bottom_->mutable_cpu_data()[6] = 4; + this->blob_bottom_->mutable_cpu_data()[7] = 2; + this->blob_bottom_->mutable_cpu_data()[8] = 1; + PoolingLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), 1); + EXPECT_EQ(this->blob_top_->channels(), 1); + EXPECT_EQ(this->blob_top_->height(), 3); + EXPECT_EQ(this->blob_top_->width(), 3); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + TypeParam epsilon = 1e-8; + // Output: + // [ 1 4 4 ] + // [ 4 4 4 ] + // [ 4 4 1 ] + EXPECT_NEAR(this->blob_top_->cpu_data()[0], 1, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[1], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[2], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[3], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[4], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[5], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[6], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[7], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[8], 1, epsilon); +} + + TYPED_TEST(PoolingLayerTest, TestCPUGradientMaxTopMask) { LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); From 781761eb74744bb00f6b9579eecbe868e180c570 Mon Sep 17 00:00:00 2001 From: Jerod Weinman Date: Sun, 8 Jun 2014 15:46:23 -0500 Subject: [PATCH 0093/2053] Changed variable name: iscolor to is_color. --- include/caffe/util/io.hpp | 2 +- src/caffe/util/io.cpp | 11 ++++++----- tools/convert_imageset.cpp | 6 +++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 829293ecaef..4458096ef78 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -61,7 +61,7 @@ inline void WriteProtoToBinaryFile( } bool ReadImageToDatum(const string& filename, const int label, - const int height, const int width, const bool iscolor, Datum* datum); + const int height, const int width, const bool is_color, Datum* datum); inline bool ReadImageToDatum(const string& filename, const int label, const int height, const int width, Datum* datum) { diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index f2650e9a22a..65f82547071 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -72,9 +72,10 @@ void WriteProtoToBinaryFile(const Message& proto, const char* filename) { } bool ReadImageToDatum(const string& filename, const int label, - const int height, const int width, const bool iscolor, Datum* datum) { + const int height, const int width, const bool is_color, Datum* datum) { cv::Mat cv_img; - int cv_read_flag = (iscolor ? CV_LOAD_IMAGE_COLOR : CV_LOAD_IMAGE_GRAYSCALE); + int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : + CV_LOAD_IMAGE_GRAYSCALE); if (height > 0 && width > 0) { cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); cv::resize(cv_img_origin, cv_img, cv::Size(height, width)); @@ -85,7 +86,7 @@ bool ReadImageToDatum(const string& filename, const int label, LOG(ERROR) << "Could not open or find file " << filename; return false; } - int num_channels = (iscolor ? 3 : 1); + int num_channels = (is_color ? 3 : 1); datum->set_channels(num_channels); datum->set_height(cv_img.rows); datum->set_width(cv_img.cols); @@ -93,7 +94,7 @@ bool ReadImageToDatum(const string& filename, const int label, datum->clear_data(); datum->clear_float_data(); string* datum_string = datum->mutable_data(); - if (iscolor) { + if (is_color) { for (int c = 0; c < num_channels; ++c) { for (int h = 0; h < cv_img.rows; ++h) { for (int w = 0; w < cv_img.cols; ++w) { @@ -102,7 +103,7 @@ bool ReadImageToDatum(const string& filename, const int label, } } } - } else { // Faster than repeatedly testing iscolor for each pixel w/i loop + } else { // Faster than repeatedly testing is_color for each pixel w/i loop for (int h = 0; h < cv_img.rows; ++h) { for (int w = 0; w < cv_img.cols; ++w) { datum_string->push_back( diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index bbf848adc8a..524d1950cb0 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -45,8 +45,8 @@ int main(int argc, char** argv) { } // Test whether argv[1] == "-g" - bool iscolor= !(string("-g") == string(argv[1])); - int arg_offset = (iscolor ? 0 : 1); + bool is_color= !(string("-g") == string(argv[1])); + int arg_offset = (is_color ? 0 : 1); std::ifstream infile(argv[arg_offset+2]); std::vector > lines; string filename; @@ -89,7 +89,7 @@ int main(int argc, char** argv) { bool data_size_initialized = false; for (int line_id = 0; line_id < lines.size(); ++line_id) { if (!ReadImageToDatum(root_folder + lines[line_id].first, - lines[line_id].second, resize_height, resize_width, iscolor, &datum)) { + lines[line_id].second, resize_height, resize_width, is_color, &datum)) { continue; } if (!data_size_initialized) { From 25aa12922c87a8a89e5b9c92d8f3d3aa261c8167 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 8 Jun 2014 18:08:24 -0700 Subject: [PATCH 0094/2053] fix Makefile build dir link upgrade bug reported by @jamt9000 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2c42516cebf..c43b30ee33a 100644 --- a/Makefile +++ b/Makefile @@ -297,7 +297,7 @@ $(BUILD_DIR_LINK): $(BUILD_DIR)/.linked $(BUILD_DIR)/.linked: @ mkdir -p $(BUILD_DIR) @ $(RM) $(OTHER_BUILD_DIR)/.linked - @ $(RM) $(BUILD_DIR_LINK) + @ $(RM) -r $(BUILD_DIR_LINK) @ ln -s $(BUILD_DIR) $(BUILD_DIR_LINK) @ touch $@ From 69af0c8955c9be0c37e37d9fab702e1167c31b08 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 6 Jun 2014 15:40:26 -0700 Subject: [PATCH 0095/2053] layers declare their names and number of input/output blobs, and don't check top/bottom blob counts explicitly in SetUp; instead call base Layer::SetUp. --- include/caffe/data_layers.hpp | 35 +++++++++- include/caffe/layer.hpp | 72 +++++++++++++++++++- include/caffe/loss_layers.hpp | 27 ++++++++ include/caffe/neuron_layers.hpp | 34 ++++++++++ include/caffe/vision_layers.hpp | 83 +++++++++++++++++++++++- src/caffe/layers/accuracy_layer.cpp | 3 +- src/caffe/layers/argmax_layer.cpp | 3 +- src/caffe/layers/concat_layer.cpp | 6 +- src/caffe/layers/conv_layer.cpp | 3 +- src/caffe/layers/data_layer.cpp | 4 +- src/caffe/layers/eltwise_layer.cpp | 5 +- src/caffe/layers/flatten_layer.cpp | 3 +- src/caffe/layers/hdf5_data_layer.cpp | 4 +- src/caffe/layers/hdf5_output_layer.cpp | 8 --- src/caffe/layers/im2col_layer.cpp | 3 +- src/caffe/layers/image_data_layer.cpp | 3 +- src/caffe/layers/inner_product_layer.cpp | 3 +- src/caffe/layers/loss_layer.cpp | 3 +- src/caffe/layers/lrn_layer.cpp | 5 +- src/caffe/layers/memory_data_layer.cpp | 3 +- src/caffe/layers/neuron_layer.cpp | 3 +- src/caffe/layers/pooling_layer.cpp | 12 ++-- src/caffe/layers/softmax_layer.cpp | 3 +- src/caffe/layers/softmax_loss_layer.cpp | 3 +- src/caffe/layers/split_layer.cpp | 3 +- src/caffe/layers/window_data_layer.cpp | 4 +- 26 files changed, 272 insertions(+), 66 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index d9865ce485b..4678b327994 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -28,7 +28,15 @@ class HDF5OutputLayer : public Layer { explicit HDF5OutputLayer(const LayerParameter& param); virtual ~HDF5OutputLayer(); virtual void SetUp(const vector*>& bottom, - vector*>* top); + vector*>* top) {} + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_HDF5_OUTPUT; + } + // TODO: no limit on the number of blobs + virtual inline int ExactNumBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 0; } + inline std::string file_name() const { return file_name_; } protected: @@ -58,6 +66,12 @@ class HDF5DataLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_HDF5_DATA; + } + virtual inline int ExactNumBottomBlobs() const { return 0; } + virtual inline int ExactNumTopBlobs() const { return 2; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -96,6 +110,13 @@ class DataLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_DATA; + } + virtual inline int ExactNumBottomBlobs() const { return 0; } + virtual inline int MinTopBlobs() const { return 1; } + virtual inline int MaxTopBlobs() const { return 2; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -141,6 +162,12 @@ class ImageDataLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_IMAGE_DATA; + } + virtual inline int ExactNumBottomBlobs() const { return 0; } + virtual inline int ExactNumTopBlobs() const { return 2; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -188,6 +215,12 @@ class WindowDataLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_WINDOW_DATA; + } + virtual inline int ExactNumBottomBlobs() const { return 0; } + virtual inline int ExactNumTopBlobs() const { return 2; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 14bba63594b..af3d5441b34 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -3,11 +3,14 @@ #ifndef CAFFE_LAYER_H_ #define CAFFE_LAYER_H_ +#include #include + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" +using std::string; using std::vector; namespace caffe { @@ -30,9 +33,12 @@ class Layer { } } virtual ~Layer() {} - // SetUp: your function should implement this. + // SetUp: your function should implement this, and call Layer::SetUp for + // common SetUp functionality. virtual void SetUp(const vector*>& bottom, - vector*>* top) = 0; + vector*>* top) { + CheckBlobCounts(bottom, *top); + } // Forward and backward wrappers. You should implement the cpu and // gpu specific implementations instead, and should not change these @@ -53,6 +59,31 @@ class Layer { // Writes the layer parameter to a protocol buffer virtual void ToProto(LayerParameter* param, bool write_diff = false); + // Returns the layer type as an enum value. + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_NONE; + } + + // Returns the layer type name. + virtual inline const string& type_name() const { + return LayerParameter_LayerType_Name(type()); + } + + // These methods can be overwritten to declare that this layer type expects + // a certain number of blobs as input and output. + // + // ExactNum{Bottom,Top}Blobs return a non-negative number to require an exact + // number of bottom/top blobs; the Min/Max versions return a non-negative + // number to require a minimum and/or maximum number of blobs. + // If Exact is specified, neither Min nor Max should be specified, and vice + // versa. These methods may not rely on SetUp having been called. + virtual inline int ExactNumBottomBlobs() const { return -1; } + virtual inline int MinBottomBlobs() const { return -1; } + virtual inline int MaxBottomBlobs() const { return -1; } + virtual inline int ExactNumTopBlobs() const { return -1; } + virtual inline int MinTopBlobs() const { return -1; } + virtual inline int MaxTopBlobs() const { return -1; } + protected: // The protobuf that stores the layer parameters LayerParameter layer_param_; @@ -82,6 +113,43 @@ class Layer { Backward_cpu(top, propagate_down, bottom); } + // CheckBlobCounts: called by the parent Layer's SetUp to check that the + // number of bottom and top Blobs provided as input match the expected + // numbers specified by the {ExactNum,Min,Max}{Bottom,Top}Blobs() functions. + virtual void CheckBlobCounts(const vector*>& bottom, + const vector*>& top) { + if (ExactNumBottomBlobs() >= 0) { + CHECK_EQ(ExactNumBottomBlobs(), bottom.size()) + << type_name() << " Layer takes " << ExactNumBottomBlobs() + << " bottom blob(s) as input."; + } + if (MinBottomBlobs() >= 0) { + CHECK_LE(MinBottomBlobs(), bottom.size()) + << type_name() << " Layer takes at least " << MinBottomBlobs() + << " bottom blob(s) as input."; + } + if (MaxBottomBlobs() >= 0) { + CHECK_GE(MaxBottomBlobs(), bottom.size()) + << type_name() << " Layer takes at most " << MaxBottomBlobs() + << " bottom blob(s) as input."; + } + if (ExactNumTopBlobs() >= 0) { + CHECK_EQ(ExactNumTopBlobs(), top.size()) + << type_name() << " Layer produces " << ExactNumTopBlobs() + << " top blob(s) as output."; + } + if (MinTopBlobs() >= 0) { + CHECK_LE(MinTopBlobs(), top.size()) + << type_name() << " Layer produces at least " << MinTopBlobs() + << " top blob(s) as output."; + } + if (MaxTopBlobs() >= 0) { + CHECK_GE(MaxTopBlobs(), top.size()) + << type_name() << " Layer produces at most " << MaxTopBlobs() + << " top blob(s) as output."; + } + } + DISABLE_COPY_AND_ASSIGN(Layer); }; // class Layer diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index cc798c499d3..381bf0f4f8f 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -35,6 +35,9 @@ class LossLayer : public Layer { const vector*>& bottom, vector*>* top); virtual void FurtherSetUp( const vector*>& bottom, vector*>* top) {} + + virtual inline int ExactNumBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 0; } }; /* SigmoidCrossEntropyLossLayer @@ -49,6 +52,10 @@ class SigmoidCrossEntropyLossLayer : public LossLayer { virtual void FurtherSetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -81,6 +88,10 @@ class EuclideanLossLayer : public LossLayer { virtual void FurtherSetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_EUCLIDEAN_LOSS; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -100,6 +111,10 @@ class InfogainLossLayer : public LossLayer { virtual void FurtherSetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_INFOGAIN_LOSS; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -117,6 +132,10 @@ class HingeLossLayer : public LossLayer { explicit HingeLossLayer(const LayerParameter& param) : LossLayer(param) {} + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_HINGE_LOSS; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -134,6 +153,10 @@ class MultinomialLogisticLossLayer : public LossLayer { virtual void FurtherSetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -153,6 +176,10 @@ class AccuracyLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_ACCURACY; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 5118e8a5225..ed664df7570 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -33,6 +33,12 @@ class NeuronLayer : public Layer { : Layer(param) {} virtual void SetUp(const vector*>& bottom, vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_NONE; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } }; /* BNLLLayer @@ -48,6 +54,10 @@ class BNLLLayer : public NeuronLayer { explicit BNLLLayer(const LayerParameter& param) : NeuronLayer(param) {} + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_BNLL; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -77,6 +87,10 @@ class DropoutLayer : public NeuronLayer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_DROPOUT; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -107,6 +121,10 @@ class PowerLayer : public NeuronLayer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_POWER; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -138,6 +156,10 @@ class ReLULayer : public NeuronLayer { explicit ReLULayer(const LayerParameter& param) : NeuronLayer(param) {} + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_RELU; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -167,6 +189,10 @@ class SigmoidLayer : public NeuronLayer { explicit SigmoidLayer(const LayerParameter& param) : NeuronLayer(param) {} + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SIGMOID; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -191,6 +217,10 @@ class TanHLayer : public NeuronLayer { explicit TanHLayer(const LayerParameter& param) : NeuronLayer(param) {} + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_TANH; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -220,6 +250,10 @@ class ThresholdLayer : public NeuronLayer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_THRESHOLD; + } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index a43f7f98c09..39779800bee 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -34,6 +34,12 @@ class ArgMaxLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_ARGMAX; + } + virtual inline int MinBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -56,6 +62,12 @@ class ConcatLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_CONCAT; + } + virtual inline int MinBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -85,6 +97,12 @@ class ConvolutionLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_CONVOLUTION; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -123,6 +141,12 @@ class EltwiseLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_ELTWISE; + } + virtual inline int MinBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -147,6 +171,12 @@ class FlattenLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_FLATTEN; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -170,6 +200,12 @@ class Im2colLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_IM2COL; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -198,6 +234,12 @@ class InnerProductLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_INNER_PRODUCT; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -230,6 +272,12 @@ class LRNLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_LRN; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -285,7 +333,7 @@ class LRNLayer : public Layer { vector*> product_bottom_vec_; }; -/* PoolingLayer +/* MemoryDataLayer */ template class MemoryDataLayer : public Layer { @@ -294,6 +342,13 @@ class MemoryDataLayer : public Layer { : Layer(param) {} virtual void SetUp(const vector*>& bottom, vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_MEMORY_DATA; + } + virtual inline int ExactNumBottomBlobs() { return 0; } + virtual inline int ExactNumTopBlobs() { return 2; } + // Reset should accept const pointers, but can't, because the memory // will be given to Blob, which is mutable void Reset(Dtype* data, Dtype* label, int n); @@ -331,6 +386,13 @@ class PoolingLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_POOLING; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int MinTopBlobs() const { return 1; } + virtual inline int MaxTopBlobs() const { return max_top_blobs_; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -341,6 +403,7 @@ class PoolingLayer : public Layer { virtual void Backward_gpu(const vector*>& top, const bool propagate_down, vector*>* bottom); + int max_top_blobs_; int kernel_size_; int stride_; int pad_; @@ -363,6 +426,12 @@ class SoftmaxLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SOFTMAX; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -395,6 +464,12 @@ class SoftmaxWithLossLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SOFTMAX_LOSS; + } + virtual inline int ExactNumBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 0; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); @@ -423,6 +498,12 @@ class SplitLayer : public Layer { virtual void SetUp(const vector*>& bottom, vector*>* top); + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SPLIT; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int MinTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 3e671704465..fbc943eaf2d 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -17,8 +17,7 @@ namespace caffe { template void AccuracyLayer::SetUp( const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 2) << "Accuracy Layer takes two blobs as input."; - CHECK_EQ(top->size(), 1) << "Accuracy Layer takes 1 output."; + Layer::SetUp(bottom, top); CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; CHECK_EQ(bottom[1]->channels(), 1); diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index e04588d4baa..70ccfff5a36 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -12,8 +12,7 @@ namespace caffe { template void ArgMaxLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 1) << "ArgMaxLayer Layer takes 1 input."; - CHECK_EQ(top->size(), 1) << "ArgMaxLayer Layer takes 1 output."; + Layer::SetUp(bottom, top); out_max_val_ = this->layer_param_.argmax_param().out_max_val(); if (out_max_val_) { // Produces max_ind and max_val diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index 8036bdab675..4541ee74215 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -11,11 +11,7 @@ namespace caffe { template void ConcatLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_GT(bottom.size(), 1) << - "ConcatLayer takes at least two blobs as input."; - CHECK_EQ(top->size(), 1) << - "ConcatLayer takes a single blob as output."; - + Layer::SetUp(bottom, top); concat_dim_ = this->layer_param_.concat_param().concat_dim(); CHECK_GE(concat_dim_, 0) << "concat_dim should be >= 0"; diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 55966b54bde..880b83afccb 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -13,8 +13,7 @@ namespace caffe { template void ConvolutionLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 1) << "Conv Layer takes a single blob as input."; - CHECK_EQ(top->size(), 1) << "Conv Layer takes a single blob as output."; + Layer::SetUp(bottom, top); kernel_size_ = this->layer_param_.convolution_param().kernel_size(); stride_ = this->layer_param_.convolution_param().stride(); group_ = this->layer_param_.convolution_param().group(); diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 6d7392a6b2a..348753e5db9 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -129,9 +129,7 @@ DataLayer::~DataLayer() { template void DataLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 0) << "Data Layer takes no input blobs."; - CHECK_GE(top->size(), 1) << "Data Layer takes at least one blob as output."; - CHECK_LE(top->size(), 2) << "Data Layer takes at most two blobs as output."; + Layer::SetUp(bottom, top); if (top->size() == 1) { output_labels_ = false; } else { diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 5d05124c4c8..5e5d760c993 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -11,10 +11,7 @@ namespace caffe { template void EltwiseLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_GE(bottom.size(), 2) << - "Eltwise Layer takes at least 2 blobs as input."; - CHECK_EQ(top->size(), 1) << - "Eltwise Layer takes a single blob as output."; + Layer::SetUp(bottom, top); CHECK(this->layer_param().eltwise_param().coeff_size() == 0 || this->layer_param().eltwise_param().coeff_size() == bottom.size()) << "Eltwise Layer takes one coefficient per bottom blob."; diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index e954030d260..95f4859f8d9 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -11,8 +11,7 @@ namespace caffe { template void FlattenLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 1) << "Flatten Layer takes a single blob as input."; - CHECK_EQ(top->size(), 1) << "Flatten Layer takes a single blob as output."; + Layer::SetUp(bottom, top); int channels_out = bottom[0]->channels() * bottom[0]->height() * bottom[0]->width(); (*top)[0]->Reshape(bottom[0]->num(), channels_out, 1, 1); diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index cff4f7c7318..d5c64f05696 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -52,9 +52,7 @@ void HDF5DataLayer::LoadHDF5FileData(const char* filename) { template void HDF5DataLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 0) << "HDF5DataLayer takes no input blobs."; - CHECK_EQ(top->size(), 2) << "HDF5DataLayer takes two blobs as output."; - + Layer::SetUp(bottom, top); // Read the source to parse the filenames. const string& source = this->layer_param_.hdf5_data_param().source(); LOG(INFO) << "Loading filename from " << source; diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index e491697e17c..0961b9b73a3 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -41,14 +41,6 @@ void HDF5OutputLayer::SaveBlobs() { LOG(INFO) << "Successfully saved " << data_blob_.num() << " rows"; } -template -void HDF5OutputLayer::SetUp(const vector*>& bottom, - vector*>* top) { - // TODO: no limit on the number of blobs - CHECK_EQ(bottom.size(), 2) << "HDF5OutputLayer takes two blobs as input."; - CHECK_EQ(top->size(), 0) << "HDF5OutputLayer takes no output blobs."; -} - template Dtype HDF5OutputLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index 749ea3c2d6a..f0c26c9a1cb 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -12,8 +12,7 @@ namespace caffe { template void Im2colLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 1) << "Im2col Layer takes a single blob as input."; - CHECK_EQ(top->size(), 1) << "Im2col Layer takes a single blob as output."; + Layer::SetUp(bottom, top); kernel_size_ = this->layer_param_.convolution_param().kernel_size(); stride_ = this->layer_param_.convolution_param().stride(); pad_ = this->layer_param_.convolution_param().pad(); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index ed064d0608d..9a79e72fedc 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -140,8 +140,7 @@ ImageDataLayer::~ImageDataLayer() { template void ImageDataLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 0) << "Input Layer takes no input blobs."; - CHECK_EQ(top->size(), 2) << "Input Layer takes two blobs as output."; + Layer::SetUp(bottom, top); const int new_height = this->layer_param_.image_data_param().new_height(); const int new_width = this->layer_param_.image_data_param().new_height(); CHECK((new_height == 0 && new_width == 0) || diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index c60261e9486..971254c9c45 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -14,8 +14,7 @@ namespace caffe { template void InnerProductLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 1) << "IP Layer takes a single blob as input."; - CHECK_EQ(top->size(), 1) << "IP Layer takes a single blob as output."; + Layer::SetUp(bottom, top); const int num_output = this->layer_param_.inner_product_param().num_output(); bias_term_ = this->layer_param_.inner_product_param().bias_term(); // Figure out the dimensions diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index 1efb6235f98..14ea975ad0d 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -17,8 +17,7 @@ namespace caffe { template void LossLayer::SetUp( const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 2) << "Loss Layer takes two blobs as input."; - CHECK_EQ(top->size(), 0) << "Loss Layer takes no output."; + Layer::SetUp(bottom, top); CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; FurtherSetUp(bottom, top); diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index 6f7af75957a..071e7198544 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -11,10 +11,7 @@ namespace caffe { template void LRNLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 1) << - "Local Response Normalization Layer takes a single blob as input."; - CHECK_EQ(top->size(), 1) << - "Local Response Normalization Layer takes a single blob as output."; + Layer::SetUp(bottom, top); num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 60bce27b8c9..15eedb317e3 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -10,8 +10,7 @@ namespace caffe { template void MemoryDataLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 0) << "Memory Data Layer takes no blobs as input."; - CHECK_EQ(top->size(), 2) << "Memory Data Layer takes two blobs as output."; + Layer::SetUp(bottom, top); batch_size_ = this->layer_param_.memory_data_param().batch_size(); datum_channels_ = this->layer_param_.memory_data_param().channels(); datum_height_ = this->layer_param_.memory_data_param().height(); diff --git a/src/caffe/layers/neuron_layer.cpp b/src/caffe/layers/neuron_layer.cpp index e9dbd0eb75c..1b8fcecd482 100644 --- a/src/caffe/layers/neuron_layer.cpp +++ b/src/caffe/layers/neuron_layer.cpp @@ -10,8 +10,7 @@ namespace caffe { template void NeuronLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 1) << "Neuron Layer takes a single blob as input."; - CHECK_EQ(top->size(), 1) << "Neuron Layer takes a single blob as output."; + Layer::SetUp(bottom, top); // NeuronLayer allows in-place computations. If the computation is not // in-place, we will need to initialize the top blob. if ((*top)[0] != bottom[0]) { diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 929d7dfaa02..8f5f82d6ff7 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -18,16 +18,16 @@ namespace caffe { template void PoolingLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 1) << "PoolingLayer takes a single blob as input."; + // Set the max number of top blobs before calling base Layer::SetUp. + // If doing MAX pooling, we can optionally output an extra top Blob + // for the mask. Otherwise, we only have one top Blob. if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX) { - CHECK_GE(top->size(), 1) - << "MaxPoolingLayer takes at least one blob as output."; - CHECK_LE(top->size(), 2) - << "MaxPoolingLayer takes at most two blobs as output."; + max_top_blobs_ = 2; } else { - CHECK_EQ(top->size(), 1) << "PoolingLayer takes a single blob as output."; + max_top_blobs_ = 1; } + Layer::SetUp(bottom, top); kernel_size_ = this->layer_param_.pooling_param().kernel_size(); stride_ = this->layer_param_.pooling_param().stride(); pad_ = this->layer_param_.pooling_param().pad(); diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index e9983608e94..dbe16da2343 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -14,8 +14,7 @@ namespace caffe { template void SoftmaxLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 1) << "Softmax Layer takes a single blob as input."; - CHECK_EQ(top->size(), 1) << "Softmax Layer takes a single blob as output."; + Layer::SetUp(bottom, top); (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); sum_multiplier_.Reshape(1, bottom[0]->channels(), diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index fecd7a520df..ef6eebabadd 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -15,8 +15,7 @@ namespace caffe { template void SoftmaxWithLossLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 2) << "SoftmaxLoss Layer takes two blobs as input."; - CHECK_EQ(top->size(), 0) << "SoftmaxLoss Layer takes no blob as output."; + Layer::SetUp(bottom, top); softmax_bottom_vec_.clear(); softmax_bottom_vec_.push_back(bottom[0]); softmax_top_vec_.push_back(&prob_); diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index aa2b6f6a308..2f99ca1842c 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -11,8 +11,7 @@ namespace caffe { template void SplitLayer::SetUp(const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 1) << "Split Layer takes a single blob as input."; - CHECK_GE(top->size(), 1) << "Split Layer takes at least one blob as output."; + Layer::SetUp(bottom, top); count_ = bottom[0]->count(); for (int i = 0; i < top->size(); ++i) { // Allow the 0th top blob to be 'in-place', but no others. diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 862c0347082..e08bed7d56f 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -258,14 +258,12 @@ WindowDataLayer::~WindowDataLayer() { template void WindowDataLayer::SetUp(const vector*>& bottom, vector*>* top) { + Layer::SetUp(bottom, top); // SetUp runs through the window_file and creates two structures // that hold windows: one for foreground (object) windows and one // for background (non-object) windows. We use an overlap threshold // to decide which is which. - CHECK_EQ(bottom.size(), 0) << "Window data Layer takes no input blobs."; - CHECK_EQ(top->size(), 2) << "Window data Layer prodcues two blobs as output."; - // window_file format // repeated: // # image_index From fe969919bf2283ebaf6946dbe2e102b88a452240 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 8 Jun 2014 12:45:17 -0700 Subject: [PATCH 0096/2053] move MemoryDataLayer decl. from vision_layers.hpp to data_layers.hpp --- include/caffe/data_layers.hpp | 42 ++++++++++++++++++++++++++++++++ include/caffe/vision_layers.hpp | 43 --------------------------------- 2 files changed, 42 insertions(+), 43 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 4678b327994..87be0f8e742 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -198,6 +198,48 @@ class ImageDataLayer : public Layer { Caffe::Phase phase_; }; +/* MemoryDataLayer +*/ +template +class MemoryDataLayer : public Layer { + public: + explicit MemoryDataLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_MEMORY_DATA; + } + virtual inline int ExactNumBottomBlobs() { return 0; } + virtual inline int ExactNumTopBlobs() { return 2; } + + // Reset should accept const pointers, but can't, because the memory + // will be given to Blob, which is mutable + void Reset(Dtype* data, Dtype* label, int n); + int datum_channels() { return datum_channels_; } + int datum_height() { return datum_height_; } + int datum_width() { return datum_width_; } + int batch_size() { return batch_size_; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { return; } + virtual void Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { return; } + + Dtype* data_; + Dtype* labels_; + int datum_channels_; + int datum_height_; + int datum_width_; + int datum_size_; + int batch_size_; + int n_; + int pos_; +}; // This function is used to create a pthread that prefetches the window data. template diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 39779800bee..eb067bb624e 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -333,49 +333,6 @@ class LRNLayer : public Layer { vector*> product_bottom_vec_; }; -/* MemoryDataLayer -*/ -template -class MemoryDataLayer : public Layer { - public: - explicit MemoryDataLayer(const LayerParameter& param) - : Layer(param) {} - virtual void SetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_MEMORY_DATA; - } - virtual inline int ExactNumBottomBlobs() { return 0; } - virtual inline int ExactNumTopBlobs() { return 2; } - - // Reset should accept const pointers, but can't, because the memory - // will be given to Blob, which is mutable - void Reset(Dtype* data, Dtype* label, int n); - int datum_channels() { return datum_channels_; } - int datum_height() { return datum_height_; } - int datum_width() { return datum_width_; } - int batch_size() { return batch_size_; } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } - virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } - - Dtype* data_; - Dtype* labels_; - int datum_channels_; - int datum_height_; - int datum_width_; - int datum_size_; - int batch_size_; - int n_; - int pos_; -}; - /* PoolingLayer */ template From 62b3537117eb0ec87dac9c403e558c72d6ab56fc Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 8 Jun 2014 20:44:36 -0700 Subject: [PATCH 0097/2053] add fish bike example image --- examples/images/fish-bike.jpg | Bin 0 -> 47638 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/images/fish-bike.jpg diff --git a/examples/images/fish-bike.jpg b/examples/images/fish-bike.jpg new file mode 100644 index 0000000000000000000000000000000000000000..39d9bd432e202c3b34d2585c946aa1192cee226d GIT binary patch literal 47638 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

    kq>Gym80CfKVbmw`SP`ca~?JRS34yS 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 Date: Sun, 8 Jun 2014 22:44:32 -0700 Subject: [PATCH 0098/2053] fix ArgMaxLayer bug in num bottom blobs decl. pointed out by @sguada --- include/caffe/vision_layers.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index eb067bb624e..fc3dbbe1938 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -37,7 +37,7 @@ class ArgMaxLayer : public Layer { virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_ARGMAX; } - virtual inline int MinBottomBlobs() const { return 1; } + virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } protected: From 6442be3994222b07192150a44367a211165dd42f Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 8 Jun 2014 14:58:53 -0700 Subject: [PATCH 0099/2053] add DummyDataLayer --- include/caffe/data_layers.hpp | 27 +++++++ src/caffe/layer_factory.cpp | 2 + src/caffe/layers/dummy_data_layer.cpp | 100 ++++++++++++++++++++++++++ src/caffe/proto/caffe.proto | 26 +++++-- 4 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 src/caffe/layers/dummy_data_layer.cpp diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 87be0f8e742..3d3ce94bc88 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -14,6 +14,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" +#include "caffe/filler.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" @@ -146,6 +147,32 @@ class DataLayer : public Layer { Caffe::Phase phase_; }; +template +class DummyDataLayer : public Layer { + public: + explicit DummyDataLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_DUMMY_DATA; + } + virtual inline int ExactNumBottomBlobs() const { return 0; } + virtual inline int MinTopBlobs() const { return 1; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { return; } + virtual void Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { return; } + + vector > > fillers_; + vector refill_; +}; + // This function is used to create a pthread that prefetches the data. template void* ImageDataLayerPrefetch(void* layer_pointer); diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 58c20b1f430..d6e506dfb9f 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -36,6 +36,8 @@ Layer* GetLayer(const LayerParameter& param) { return new DataLayer(param); case LayerParameter_LayerType_DROPOUT: return new DropoutLayer(param); + case LayerParameter_LayerType_DUMMY_DATA: + return new DummyDataLayer(param); case LayerParameter_LayerType_EUCLIDEAN_LOSS: return new EuclideanLossLayer(param); case LayerParameter_LayerType_ELTWISE: diff --git a/src/caffe/layers/dummy_data_layer.cpp b/src/caffe/layers/dummy_data_layer.cpp new file mode 100644 index 00000000000..38568580485 --- /dev/null +++ b/src/caffe/layers/dummy_data_layer.cpp @@ -0,0 +1,100 @@ +// Copyright 2014 BVLC and contributors. + +#include + +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template +void DummyDataLayer::SetUp(const vector*>& bottom, + vector*>* top) { + const int num_top = top->size(); + const DummyDataParameter& param = this->layer_param_.dummy_data_param(); + const int num_data_filler = param.data_filler_size(); + CHECK(num_data_filler == 0 || num_data_filler == 1 || + num_data_filler == num_top) + << "Number of data fillers must be 0, 1 or equal to the number of tops: " + << num_top << "; you specified " << num_data_filler << " data fillers."; + CHECK(param.num_size() == 1 || param.num_size() == num_top) + << "Must specify either a single (1) 'num' or one for each top blob (" + << num_top << "); you specified " << param.num_size() << "."; + CHECK(param.channels_size() == 1 || param.channels_size() == num_top) + << "Must specify either a single (1) 'channels' or one for each top blob (" + << num_top << "); you specified " << param.channels_size() << "."; + CHECK(param.height_size() == 1 || param.height_size() == num_top) + << "Must specify either a single (1) 'height' or one for each top blob (" + << num_top << "); you specified " << param.height_size() << "."; + CHECK(param.width_size() == 1 || param.width_size() == num_top) + << "Must specify either a single (1) 'width' or one for each top blob (" + << num_top << "); you specified " << param.width_size() << "."; + // refill_[i] tells Forward i whether or not to actually refill top Blob i. + // If refill_[i] is false, Forward does nothing for Blob i. We use this to + // avoid wastefully refilling "constant" Blobs in every forward pass. + // We first fill refill_ in with the INVERSE of its final values. + // The first time we run Forward from the SetUp method, we'll fill only the + // Blobs for which refill_ is normally false. These Blobs will never be + // filled again. + refill_.clear(); + fillers_.clear(); + if (num_data_filler <= 1) { + FillerParameter filler_param; + if (num_data_filler == 0) { + filler_param.set_type("constant"); + filler_param.set_value(0); + } else { + filler_param.CopyFrom(param.data_filler(0)); + } + // Refill on each iteration iff not using a constant filler, + // but use the inverse of this rule for the first run. + refill_.resize(1); + refill_[0] = (strcmp(filler_param.type().c_str(), "constant") == 0); + fillers_.resize(1); + fillers_[0].reset(GetFiller(filler_param)); + } else { + refill_.resize(num_top); + fillers_.resize(num_top); + for (int i = 0; i < num_top; ++i) { + fillers_[i].reset(GetFiller(param.data_filler(i))); + // Refill on each iteration iff not using a constant filler, + // but use the inverse of this rule for the first run. + refill_[i] = + (strcmp(param.data_filler(i).type().c_str(), "constant") == 0); + } + } + for (int i = 0; i < num_top; ++i) { + const int num = (param.num_size() == 1) ? param.num(0) : param.num(i); + const int channels = + (param.channels_size() == 1) ? param.channels(0) : param.channels(i); + const int height = + (param.height_size() == 1) ? param.height(0) : param.height(i); + const int width = + (param.width_size() == 1) ? param.width(0) : param.width(i); + (*top)[i]->Reshape(num, channels, height, width); + } + // Run Forward once, with refill_ inverted, to fill the constant Blobs. + Forward(bottom, top); + // Invert the inverted refill_ values to refill the desired (non-constant) + // Blobs in every usual forward pass. + for (int i = 0; i < refill_.size(); ++i) { + refill_[i] = !refill_[i]; + } +} + +template +Dtype DummyDataLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + for (int i = 0; i < top->size(); ++i) { + const int filler_id = (fillers_.size() > 1) ? i : 0; + if (refill_[filler_id]) { + fillers_[filler_id]->Fill((*top)[i]); + } + } + return Dtype(0.); +} + +INSTANTIATE_CLASS(DummyDataLayer); + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index e540a95a921..60c7daa9031 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -115,7 +115,7 @@ message SolverState { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 25 (last added: eltwise_param) +// LayerParameter next available ID: 27 (last added: dummy_data_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs @@ -127,7 +127,7 @@ message LayerParameter { // line above the enum. Update the next available ID when you add a new // LayerType. // - // LayerType next available ID: 32 (last added: THRESHOLD) + // LayerType next available ID: 33 (last added: DUMMY_DATA) enum LayerType { // "NONE" layer type is 0th enum element so that we don't cause confusion // by defaulting to an existent LayerType (instead, should usually error if @@ -140,6 +140,7 @@ message LayerParameter { CONVOLUTION = 4; DATA = 5; DROPOUT = 6; + DUMMY_DATA = 32; EUCLIDEAN_LOSS = 7; ELTWISE = 25; FLATTEN = 8; @@ -175,13 +176,12 @@ message LayerParameter { // The weight decay that is multiplied on the global weight decay. repeated float weight_decay = 8; - // Parameters for particular layer types. - // Parameters next available ID: 26 (last added: ThresholdParameter) optional ArgMaxParameter argmax_param = 23; optional ConcatParameter concat_param = 9; optional ConvolutionParameter convolution_param = 10; optional DataParameter data_param = 11; optional DropoutParameter dropout_param = 12; + optional DummyDataParameter dummy_data_param = 26; optional EltwiseParameter eltwise_param = 24; optional HDF5DataParameter hdf5_data_param = 13; optional HDF5OutputParameter hdf5_output_param = 14; @@ -254,6 +254,24 @@ message DropoutParameter { optional float dropout_ratio = 1 [default = 0.5]; // dropout ratio } +// Message that stores parameters used by DummyDataLayer. +// DummyDataLayer fills any number of arbitrarily shaped blobs with random +// (or constant) data generated by "Fillers" (see "message FillerParameter"). +message DummyDataParameter { + // This layer produces N >= 1 top blobs. DummyDataParameter must specify 1 or N + // num, N channels, N height, and N width fields, and must specify 0, 1 or N + // data_fillers. + // + // If 0 data_fillers are specified, ConstantFiller with a value of 0 is used. + // If 1 data_filler is specified, it is applied to all top blobs. If N are + // specified, the ith is applied to the ith top blob. + repeated FillerParameter data_filler = 1; + repeated uint32 num = 2; + repeated uint32 channels = 3; + repeated uint32 height = 4; + repeated uint32 width = 5; +} + // Message that stores parameters used by EltwiseLayer message EltwiseParameter { enum EltwiseOp { From a8ab6277742ee414413c562855360eca5463c064 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 8 Jun 2014 16:04:41 -0700 Subject: [PATCH 0100/2053] add DummyDataLayer tests --- src/caffe/test/test_dummy_data_layer.cpp | 202 +++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 src/caffe/test/test_dummy_data_layer.cpp diff --git a/src/caffe/test/test_dummy_data_layer.cpp b/src/caffe/test/test_dummy_data_layer.cpp new file mode 100644 index 00000000000..7d9287e86ab --- /dev/null +++ b/src/caffe/test/test_dummy_data_layer.cpp @@ -0,0 +1,202 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include + +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/test/test_caffe_main.hpp" + +using std::string; +using std::stringstream; + +namespace caffe { + +extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; + +template +class DummyDataLayerTest : public ::testing::Test { + protected: + DummyDataLayerTest() + : blob_top_a_(new Blob()), + blob_top_b_(new Blob()), + blob_top_c_(new Blob()) {} + + virtual void SetUp() { + blob_bottom_vec_.clear(); + blob_top_vec_.clear(); + blob_top_vec_.push_back(blob_top_a_); + blob_top_vec_.push_back(blob_top_b_); + blob_top_vec_.push_back(blob_top_c_); + } + + virtual ~DummyDataLayerTest() { + delete blob_top_a_; + delete blob_top_b_; + delete blob_top_c_; + } + + Blob* const blob_top_a_; + Blob* const blob_top_b_; + Blob* const blob_top_c_; + vector*> blob_bottom_vec_; + vector*> blob_top_vec_; +}; + +typedef ::testing::Types Dtypes; +TYPED_TEST_CASE(DummyDataLayerTest, Dtypes); + +TYPED_TEST(DummyDataLayerTest, TestOneTopConstant) { + Caffe::set_mode(Caffe::CPU); + LayerParameter param; + DummyDataParameter* dummy_data_param = param.mutable_dummy_data_param(); + dummy_data_param->add_num(5); + dummy_data_param->add_channels(3); + dummy_data_param->add_height(2); + dummy_data_param->add_width(4); + this->blob_top_vec_.resize(1); + DummyDataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->blob_top_a_->num(), 5); + EXPECT_EQ(this->blob_top_a_->channels(), 3); + EXPECT_EQ(this->blob_top_a_->height(), 2); + EXPECT_EQ(this->blob_top_a_->width(), 4); + EXPECT_EQ(this->blob_top_b_->count(), 0); + EXPECT_EQ(this->blob_top_c_->count(), 0); + for (int i = 0; i < this->blob_top_vec_.size(); ++i) { + for (int j = 0; j < this->blob_top_vec_[i]->count(); ++j) { + EXPECT_EQ(0, this->blob_top_vec_[i]->cpu_data()[j]); + } + } + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < this->blob_top_vec_.size(); ++i) { + for (int j = 0; j < this->blob_top_vec_[i]->count(); ++j) { + EXPECT_EQ(0, this->blob_top_vec_[i]->cpu_data()[j]); + } + } +} + +TYPED_TEST(DummyDataLayerTest, TestTwoTopConstant) { + Caffe::set_mode(Caffe::CPU); + LayerParameter param; + DummyDataParameter* dummy_data_param = param.mutable_dummy_data_param(); + dummy_data_param->add_num(5); + dummy_data_param->add_channels(3); + dummy_data_param->add_height(2); + dummy_data_param->add_width(4); + dummy_data_param->add_num(5); + // Don't explicitly set number of channels or height for 2nd top blob; should + // default to first channels and height (as we check later). + dummy_data_param->add_height(1); + FillerParameter* data_filler_param = dummy_data_param->add_data_filler(); + data_filler_param->set_value(7); + this->blob_top_vec_.resize(2); + DummyDataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->blob_top_a_->num(), 5); + EXPECT_EQ(this->blob_top_a_->channels(), 3); + EXPECT_EQ(this->blob_top_a_->height(), 2); + EXPECT_EQ(this->blob_top_a_->width(), 4); + EXPECT_EQ(this->blob_top_b_->num(), 5); + EXPECT_EQ(this->blob_top_b_->channels(), 3); + EXPECT_EQ(this->blob_top_b_->height(), 1); + EXPECT_EQ(this->blob_top_b_->width(), 4); + EXPECT_EQ(this->blob_top_c_->count(), 0); + for (int i = 0; i < this->blob_top_vec_.size(); ++i) { + for (int j = 0; j < this->blob_top_vec_[i]->count(); ++j) { + EXPECT_EQ(7, this->blob_top_vec_[i]->cpu_data()[j]); + } + } + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < this->blob_top_vec_.size(); ++i) { + for (int j = 0; j < this->blob_top_vec_[i]->count(); ++j) { + EXPECT_EQ(7, this->blob_top_vec_[i]->cpu_data()[j]); + } + } +} + +TYPED_TEST(DummyDataLayerTest, TestThreeTopConstantGaussianConstant) { + Caffe::set_mode(Caffe::CPU); + LayerParameter param; + DummyDataParameter* dummy_data_param = param.mutable_dummy_data_param(); + dummy_data_param->add_num(5); + dummy_data_param->add_channels(3); + dummy_data_param->add_height(2); + dummy_data_param->add_width(4); + FillerParameter* data_filler_param_a = dummy_data_param->add_data_filler(); + data_filler_param_a->set_value(7); + FillerParameter* data_filler_param_b = dummy_data_param->add_data_filler(); + data_filler_param_b->set_type("gaussian"); + TypeParam gaussian_mean = 3.0; + TypeParam gaussian_std = 0.01; + data_filler_param_b->set_mean(gaussian_mean); + data_filler_param_b->set_std(gaussian_std); + FillerParameter* data_filler_param_c = dummy_data_param->add_data_filler(); + data_filler_param_c->set_value(9); + DummyDataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->blob_top_a_->num(), 5); + EXPECT_EQ(this->blob_top_a_->channels(), 3); + EXPECT_EQ(this->blob_top_a_->height(), 2); + EXPECT_EQ(this->blob_top_a_->width(), 4); + EXPECT_EQ(this->blob_top_b_->num(), 5); + EXPECT_EQ(this->blob_top_b_->channels(), 3); + EXPECT_EQ(this->blob_top_b_->height(), 2); + EXPECT_EQ(this->blob_top_b_->width(), 4); + EXPECT_EQ(this->blob_top_c_->num(), 5); + EXPECT_EQ(this->blob_top_c_->channels(), 3); + EXPECT_EQ(this->blob_top_c_->height(), 2); + EXPECT_EQ(this->blob_top_c_->width(), 4); + for (int i = 0; i < this->blob_top_a_->count(); ++i) { + EXPECT_EQ(7, this->blob_top_a_->cpu_data()[i]); + } + // Blob b uses a Gaussian filler, so SetUp should not have initialized it. + // Blob b's data should therefore be the default Blob data value: 0. + for (int i = 0; i < this->blob_top_b_->count(); ++i) { + EXPECT_EQ(0, this->blob_top_b_->cpu_data()[i]); + } + for (int i = 0; i < this->blob_top_c_->count(); ++i) { + EXPECT_EQ(9, this->blob_top_c_->cpu_data()[i]); + } + + // Do a Forward pass to fill in Blob b with Gaussian data. + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < this->blob_top_a_->count(); ++i) { + EXPECT_EQ(7, this->blob_top_a_->cpu_data()[i]); + } + // Check that the Gaussian's data has been filled in with values within + // 10 standard deviations of the mean. Record the first and last sample. + // to check that they're different after the next Forward pass. + for (int i = 0; i < this->blob_top_b_->count(); ++i) { + EXPECT_NEAR(gaussian_mean, this->blob_top_b_->cpu_data()[i], + gaussian_std * 10); + } + const TypeParam first_gaussian_sample = this->blob_top_b_->cpu_data()[0]; + const TypeParam last_gaussian_sample = + this->blob_top_b_->cpu_data()[this->blob_top_b_->count() - 1]; + for (int i = 0; i < this->blob_top_c_->count(); ++i) { + EXPECT_EQ(9, this->blob_top_c_->cpu_data()[i]); + } + + // Do another Forward pass to fill in Blob b with Gaussian data again, + // checking that we get different values. + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < this->blob_top_a_->count(); ++i) { + EXPECT_EQ(7, this->blob_top_a_->cpu_data()[i]); + } + for (int i = 0; i < this->blob_top_b_->count(); ++i) { + EXPECT_NEAR(gaussian_mean, this->blob_top_b_->cpu_data()[i], + gaussian_std * 10); + } + EXPECT_NE(first_gaussian_sample, this->blob_top_b_->cpu_data()[0]); + EXPECT_NE(last_gaussian_sample, + this->blob_top_b_->cpu_data()[this->blob_top_b_->count() - 1]); + for (int i = 0; i < this->blob_top_c_->count(); ++i) { + EXPECT_EQ(9, this->blob_top_c_->cpu_data()[i]); + } +} + +} // namespace caffe From bbb8e40acbe0613370bcdf8549db82ca3a5b5adf Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 9 Jun 2014 11:52:06 -0700 Subject: [PATCH 0101/2053] lint dummy data layer --- src/caffe/layers/dummy_data_layer.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/caffe/layers/dummy_data_layer.cpp b/src/caffe/layers/dummy_data_layer.cpp index 38568580485..8925772f3a5 100644 --- a/src/caffe/layers/dummy_data_layer.cpp +++ b/src/caffe/layers/dummy_data_layer.cpp @@ -19,17 +19,17 @@ void DummyDataLayer::SetUp(const vector*>& bottom, << "Number of data fillers must be 0, 1 or equal to the number of tops: " << num_top << "; you specified " << num_data_filler << " data fillers."; CHECK(param.num_size() == 1 || param.num_size() == num_top) - << "Must specify either a single (1) 'num' or one for each top blob (" - << num_top << "); you specified " << param.num_size() << "."; + << "Must specify either a single (1) 'num' or one for each top blob " + << "(" << num_top << "); you specified " << param.num_size() << "."; CHECK(param.channels_size() == 1 || param.channels_size() == num_top) - << "Must specify either a single (1) 'channels' or one for each top blob (" - << num_top << "); you specified " << param.channels_size() << "."; + << "Must specify either a single (1) 'channels' or one for each top blob " + << "(" << num_top << "); you specified " << param.channels_size() << "."; CHECK(param.height_size() == 1 || param.height_size() == num_top) - << "Must specify either a single (1) 'height' or one for each top blob (" - << num_top << "); you specified " << param.height_size() << "."; + << "Must specify either a single (1) 'height' or one for each top blob " + << "(" << num_top << "); you specified " << param.height_size() << "."; CHECK(param.width_size() == 1 || param.width_size() == num_top) - << "Must specify either a single (1) 'width' or one for each top blob (" - << num_top << "); you specified " << param.width_size() << "."; + << "Must specify either a single (1) 'width' or one for each top blob " + << "(" << num_top << "); you specified " << param.width_size() << "."; // refill_[i] tells Forward i whether or not to actually refill top Blob i. // If refill_[i] is false, Forward does nothing for Blob i. We use this to // avoid wastefully refilling "constant" Blobs in every forward pass. From a57b8d5b4093b7bdba9f02b278b9823c290a0b7d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 9 Jun 2014 18:12:16 -0700 Subject: [PATCH 0102/2053] fix old detect.py default --- python/detect.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/detect.py b/python/detect.py index 15418bba5c2..05b524495d2 100755 --- a/python/detect.py +++ b/python/detect.py @@ -57,9 +57,9 @@ def main(argv): ) parser.add_argument( "--crop_mode", - default="center_only", + default="selective_search", choices=CROP_MODES, - help="Image crop mode" + help="How to generate windows for detection." ) parser.add_argument( "--gpu", From 4992abecec7214bce3c07497438c2e1ff963e657 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 8 Jun 2014 20:31:35 -0700 Subject: [PATCH 0103/2053] pycaffe Detector crops with surrounding context - caffe.Detector learned how to crop windows with context in the R-CNN style s.t. the bordero of the network input is a given amount of context. - add --context_pad arg to detect.py for amount of context. Default is 16, as in R-CNN. --- python/caffe/detector.py | 91 ++++++++++++++++++++++++++++++++++++---- python/detect.py | 9 +++- 2 files changed, 92 insertions(+), 8 deletions(-) diff --git a/python/caffe/detector.py b/python/caffe/detector.py index 5a30dab92f5..b4e96029e98 100644 --- a/python/caffe/detector.py +++ b/python/caffe/detector.py @@ -12,10 +12,6 @@ The selective_search_ijcv_with_python code required for the selective search proposal mode is available at https://github.com/sergeyk/selective_search_ijcv_with_python - -TODO -- R-CNN crop mode / crop with context. -- Bundle with R-CNN model for example. """ import numpy as np import os @@ -29,11 +25,14 @@ class Detector(caffe.Net): selective search proposals. """ def __init__(self, model_file, pretrained_file, gpu=False, mean_file=None, - input_scale=None, channel_swap=None): + input_scale=None, channel_swap=None, context_pad=None): """ Take gpu, mean_file, input_scale, channel_swap: convenience params for setting mode, mean, input scale, and channel order. + context_pad: amount of surrounding context to take s.t. a `context_pad` + sized border of pixels in the network input image is context, as in + R-CNN feature extraction. """ caffe.Net.__init__(self, model_file, pretrained_file) self.set_phase_test() @@ -50,6 +49,8 @@ def __init__(self, model_file, pretrained_file, gpu=False, mean_file=None, if channel_swap: self.set_channel_swap(self.inputs[0], channel_swap) + self.configure_crop(context_pad) + def detect_windows(self, images_windows): """ @@ -58,6 +59,7 @@ def detect_windows(self, images_windows): Take images_windows: (image filename, window list) iterable. + context_crop: size of context border to crop in pixels. Give detections: list of {filename: image filename, window: crop coordinates, @@ -68,8 +70,7 @@ def detect_windows(self, images_windows): for image_fname, windows in images_windows: image = caffe.io.load_image(image_fname).astype(np.float32) for window in windows: - window_inputs.append(image[window[0]:window[2], - window[1]:window[3]]) + window_inputs.append(self.crop(image, window)) # Run through the net (warping windows to input dimensions). caffe_in = np.asarray([self.preprocess(self.inputs[0], window_in) @@ -109,3 +110,79 @@ def detect_selective_search(self, image_fnames): windows_list = selective_search.get_windows(image_fnames) # Run windowed detection on the selective search list. return self.detect_windows(zip(image_fnames, windows_list)) + + + def crop(self, im, window): + """ + Crop a window from the image for detection. Include surrounding context + according to the `context_pad` configuration. + + Take + im: H x W x K image ndarray to crop. + window: bounding box coordinates as ymin, xmin, ymax, xmax. + + Give + crop: cropped window. + """ + # Crop window from the image. + crop = im[window[0]:window[2], window[1]:window[3]] + + if self.context_pad: + box = window.copy() + crop_size = self.blobs[self.inputs[0]].width # assumes square + scale = crop_size / (1. * crop_size - self.context_pad * 2) + # Crop a box + surrounding context. + half_h = (box[2] - box[0] + 1) / 2. + half_w = (box[3] - box[1] + 1) / 2. + center = (box[0] + half_h, box[1] + half_w) + scaled_dims = scale * np.array((-half_h, -half_w, half_h, half_w)) + box = np.round(np.tile(center, 2) + scaled_dims) + full_h = box[2] - box[0] + 1 + full_w = box[3] - box[1] + 1 + scale_h = crop_size / full_h + scale_w = crop_size / full_w + pad_y = round(max(0, -box[0]) * scale_h) # amount out-of-bounds + pad_x = round(max(0, -box[1]) * scale_w) + + # Clip box to image dimensions. + im_h, im_w = im.shape[:2] + box = np.clip(box, 0., [im_h, im_w, im_h, im_w]) + clip_h = box[2] - box[0] + 1 + clip_w = box[3] - box[1] + 1 + assert(clip_h > 0 and clip_w > 0) + crop_h = round(clip_h * scale_h) + crop_w = round(clip_w * scale_w) + if pad_y + crop_h > crop_size: + crop_h = crop_size - pad_y + if pad_x + crop_w > crop_size: + crop_w = crop_size - pad_x + + # collect with context padding and place in input + # with mean padding + context_crop = im[box[0]:box[2], box[1]:box[3]] + context_crop = caffe.io.resize_image(context_crop, (crop_h, crop_w)) + crop = self.crop_mean.copy() + crop[pad_y:(pad_y + crop_h), pad_x:(pad_x + crop_w)] = context_crop + + return crop + + + def configure_crop(self, context_pad): + """ + Configure amount of context for cropping. + If context is included, make the special input mean for context padding. + + Take + context_pad: amount of context for cropping. + """ + self.context_pad = context_pad + if self.context_pad: + input_scale = self.input_scale.get(self.inputs[0]) + channel_order = self.channel_swap.get(self.inputs[0]) + # Padding context crops needs the mean in unprocessed input space. + self.crop_mean = self.mean[self.inputs[0]].copy() + self.crop_mean = self.crop_mean.transpose((1,2,0)) + channel_order_inverse = [channel_order.index(i) + for i in range(self.crop_mean.shape[2])] + self.crop_mean = self.crop_mean[:,:, channel_order_inverse] + self.crop_mean /= input_scale diff --git a/python/detect.py b/python/detect.py index 05b524495d2..a3bee5c5cf8 100755 --- a/python/detect.py +++ b/python/detect.py @@ -86,6 +86,12 @@ def main(argv): "RGB -> BGR since BGR is the Caffe default by way of OpenCV." ) + parser.add_argument( + "--context_pad", + type=int, + default='16', + help="Amount of surrounding context to collect in input window." + ) args = parser.parse_args() channel_swap = [int(s) for s in args.channel_swap.split(',')] @@ -93,7 +99,8 @@ def main(argv): # Make detector. detector = caffe.Detector(args.model_def, args.pretrained_model, gpu=args.gpu, mean_file=args.mean_file, - input_scale=args.input_scale, channel_swap=channel_swap) + input_scale=args.input_scale, channel_swap=channel_swap, + context_pad=args.context_pad) if args.gpu: print 'GPU mode' From d443d4611e1a6740960a758e600de02f72e29dbc Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 8 Jun 2014 16:53:06 -0700 Subject: [PATCH 0104/2053] make R-CNN the Caffe detection example --- docs/getting_pretrained_models.md | 2 + examples/detection.ipynb | 671 +++++++++++------- .../imagenet/get_caffe_rcnn_imagenet_model.sh | 27 + .../imagenet/rcnn_imagenet_deploy.prototxt | 207 ++++++ 4 files changed, 664 insertions(+), 243 deletions(-) create mode 100755 examples/imagenet/get_caffe_rcnn_imagenet_model.sh create mode 100644 examples/imagenet/rcnn_imagenet_deploy.prototxt diff --git a/docs/getting_pretrained_models.md b/docs/getting_pretrained_models.md index bd342f70ec3..a7b5e875c0d 100644 --- a/docs/getting_pretrained_models.md +++ b/docs/getting_pretrained_models.md @@ -24,4 +24,6 @@ This page will be updated as more models become available. - The best validation performance during training was iteration 358,000 with validation accuracy 57.258% and loss 1.83948. +**R-CNN (ILSVRC13)**: The pure Caffe instantiation of the [R-CNN](https://github.com/rbgirshick/rcnn) model for ILSVRC13 detection. Download the model (230.8MB) by running `examples/imagenet/get_caffe_rcnn_imagenet_model.sh` from the Caffe root directory. This model was made by transplanting the R-CNN SVM classifiers into a `fc-rcnn` classification layer, provided here as an off-the-shelf Caffe detector. Try the [detection example](http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/detection.ipynb) to see it in action. For the full details, refer to the R-CNN site. *N.B. For research purposes, make use of the official R-CNN package and not this example.* + Additionally, you will probably eventually need some auxiliary data (mean image, synset list, etc.): run `data/ilsvrc12/get_ilsvrc_aux.sh` from the root directory to obtain it. diff --git a/examples/detection.ipynb b/examples/detection.ipynb index feb3e36fe8e..5fdfc098679 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -11,13 +11,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This approach follows ideas described in Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik. *Rich feature hierarchies for accurate object detection and semantic segmentation*. [Arxiv 2013](http://arxiv.org/abs/1311.2524).\n", + "[R-CNN](https://github.com/rbgirshick/rcnn) is a state-of-the-art detector that classifies region proposals by a finetuned Caffe model. For the full details of the R-CNN system and model, refer to its project site and the paper:\n", "\n", - "First of all, we'll need a little [Python script](https://github.com/sergeyk/selective_search_ijcv_with_python) to run the Matlab Selective Search code.\n", + "> *Rich feature hierarchies for accurate object detection and semantic segmentation*. Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik. CVPR 2014. [Arxiv 2013](http://arxiv.org/abs/1311.2524).\n", "\n", - "Let's run detection on an image of a couple of cats frolicking (one of the ImageNet detection challenge pictures), which we will download from the web.\n", + "In this example, we do detection by a pure Caffe edition of the R-CNN model for ImageNet. The R-CNN detector outputs class scores for the 200 detection classes of ILSVRC13. Keep in mind that these are raw one vs. all SVM scores, so they are not probabilistically calibrated or exactly comparable across classes. Note that this off-the-shelf model is simply for convenience, and is not the full R-CNN model.\n", "\n", - "Before you get started with this notebook, make sure to follow [instructions](http://caffe.berkeleyvision.org/getting_pretrained_models.html) for getting the pretrained ImageNet model." + "Let's run detection on an image of a bicyclist riding a fish bike in the desert (from the ImageNet challenge\u2014no joke).\n", + "\n", + "First of all, we'll need a little [Python script](https://github.com/sergeyk/selective_search_ijcv_with_python) to make the region proposals by running the Selective Search MATLAB code. If you have your own region proposals prepared, or would rather not bother with this step, [detect.py](https://github.com/BVLC/caffe/blob/master/python/detect.py) accepts a list of images and bounding boxes as CSV.\n", + "\n", + "Before you get started with this notebook, make sure to follow [instructions](http://caffe.berkeleyvision.org/getting_pretrained_models.html) for getting the Caffe R-CNN ImageNet model." ] }, { @@ -25,9 +29,8 @@ "collapsed": false, "input": [ "!mkdir _temp\n", - "!curl http://farm1.static.flickr.com/220/512450093_7717fb8ce8.jpg > _temp/cat.jpg\n", - "!echo `pwd`/_temp/cat.jpg > _temp/cat.txt\n", - "!../python/detect.py --crop_mode=selective_search --pretrained_model=imagenet/caffe_reference_imagenet_model --model_def=imagenet/imagenet_deploy.prototxt _temp/cat.txt _temp/cat.h5" + "!echo `pwd`/images/fish-bike.jpg > _temp/det_input.txt\n", + "!../python/detect.py --crop_mode=selective_search --pretrained_model=imagenet/caffe_rcnn_imagenet_model --model_def=imagenet/rcnn_imagenet_deploy.prototxt _temp/det_input.txt _temp/det_output.h5" ], "language": "python", "metadata": {}, @@ -36,18 +39,7 @@ "output_type": "stream", "stream": "stdout", "text": [ - " % Total % Received % Xferd Average Speed Time Time Time Current\r\n", - " Dload Upload Total Spent Left Speed\r\n", - "\r", - " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\r", - "100 212k 100 212k 0 0 852k 0 --:--:-- --:--:-- --:--:-- 858k\r\n" + "mkdir: cannot create directory `_temp': File exists\r\n" ] }, { @@ -55,158 +47,348 @@ "stream": "stdout", "text": [ "WARNING: Logging before InitGoogleLogging() is written to STDERR\r\n", - "I0520 12:14:46.505362 2522 net.cpp:75] Creating Layer conv1\r\n", - "I0520 12:14:46.505406 2522 net.cpp:85] conv1 <- data\r\n", - "I0520 12:14:46.505462 2522 net.cpp:111] conv1 -> conv1\r\n", - "I0520 12:14:46.505530 2522 net.cpp:126] Top shape: 10 96 55 55 (2904000)\r\n", - "I0520 12:14:46.505542 2522 net.cpp:152] conv1 needs backward computation.\r\n", - "I0520 12:14:46.505550 2522 net.cpp:75] Creating Layer relu1\r\n", - "I0520 12:14:46.505556 2522 net.cpp:85] relu1 <- conv1\r\n", - "I0520 12:14:46.505563 2522 net.cpp:99] relu1 -> conv1 (in-place)\r\n", - "I0520 12:14:46.505570 2522 net.cpp:126] Top shape: 10 96 55 55 (2904000)\r\n", - "I0520 12:14:46.505578 2522 net.cpp:152] relu1 needs backward computation.\r\n", - "I0520 12:14:46.505584 2522 net.cpp:75] Creating Layer pool1\r\n", - "I0520 12:14:46.505590 2522 net.cpp:85] pool1 <- conv1\r\n", - "I0520 12:14:46.505596 2522 net.cpp:111] pool1 -> pool1\r\n", - "I0520 12:14:46.505606 2522 net.cpp:126] Top shape: 10 96 27 27 (699840)\r\n", - "I0520 12:14:46.505612 2522 net.cpp:152] pool1 needs backward computation.\r\n", - "I0520 12:14:46.505620 2522 net.cpp:75] Creating Layer norm1\r\n", - "I0520 12:14:46.505626 2522 net.cpp:85] norm1 <- pool1\r\n", - "I0520 12:14:46.505632 2522 net.cpp:111] norm1 -> norm1\r\n", - "I0520 12:14:46.505640 2522 net.cpp:126] Top shape: 10 96 27 27 (699840)\r\n", - "I0520 12:14:46.505646 2522 net.cpp:152] norm1 needs backward computation.\r\n", - "I0520 12:14:46.505656 2522 net.cpp:75] Creating Layer conv2\r\n", - "I0520 12:14:46.505661 2522 net.cpp:85] conv2 <- norm1\r\n", - "I0520 12:14:46.505668 2522 net.cpp:111] conv2 -> conv2\r\n", - "I0520 12:14:46.506363 2522 net.cpp:126] Top shape: 10 256 27 27 (1866240)\r\n", - "I0520 12:14:46.506383 2522 net.cpp:152] conv2 needs backward computation.\r\n", - "I0520 12:14:46.506392 2522 net.cpp:75] Creating Layer relu2\r\n", - "I0520 12:14:46.506398 2522 net.cpp:85] relu2 <- conv2\r\n", - "I0520 12:14:46.506409 2522 net.cpp:99] relu2 -> conv2 (in-place)\r\n", - "I0520 12:14:46.506417 2522 net.cpp:126] Top shape: 10 256 27 27 (1866240)\r\n", - "I0520 12:14:46.506422 2522 net.cpp:152] relu2 needs backward computation.\r\n", - "I0520 12:14:46.506429 2522 net.cpp:75] Creating Layer pool2\r\n", - "I0520 12:14:46.506435 2522 net.cpp:85] pool2 <- conv2\r\n", - "I0520 12:14:46.506441 2522 net.cpp:111] pool2 -> pool2\r\n", - "I0520 12:14:46.506448 2522 net.cpp:126] Top shape: 10 256 13 13 (432640)\r\n", - "I0520 12:14:46.506454 2522 net.cpp:152] pool2 needs backward computation.\r\n", - "I0520 12:14:46.506463 2522 net.cpp:75] Creating Layer norm2\r\n", - "I0520 12:14:46.506469 2522 net.cpp:85] norm2 <- pool2\r\n", - "I0520 12:14:46.506475 2522 net.cpp:111] norm2 -> norm2\r\n", - "I0520 12:14:46.506482 2522 net.cpp:126] Top shape: 10 256 13 13 (432640)\r\n", - "I0520 12:14:46.506489 2522 net.cpp:152] norm2 needs backward computation.\r\n", - "I0520 12:14:46.506496 2522 net.cpp:75] Creating Layer conv3\r\n", - "I0520 12:14:46.506502 2522 net.cpp:85] conv3 <- norm2\r\n", - "I0520 12:14:46.506508 2522 net.cpp:111] conv3 -> conv3\r\n", - "I0520 12:14:46.508342 2522 net.cpp:126] Top shape: 10 384 13 13 (648960)\r\n", - "I0520 12:14:46.508359 2522 net.cpp:152] conv3 needs backward computation.\r\n", - "I0520 12:14:46.508369 2522 net.cpp:75] Creating Layer relu3\r\n", - "I0520 12:14:46.508375 2522 net.cpp:85] relu3 <- conv3\r\n", - "I0520 12:14:46.508383 2522 net.cpp:99] relu3 -> conv3 (in-place)\r\n", - "I0520 12:14:46.508389 2522 net.cpp:126] Top shape: 10 384 13 13 (648960)\r\n", - "I0520 12:14:46.508395 2522 net.cpp:152] relu3 needs backward computation.\r\n", - "I0520 12:14:46.508402 2522 net.cpp:75] Creating Layer conv4\r\n", - "I0520 12:14:46.508409 2522 net.cpp:85] conv4 <- conv3\r\n", - "I0520 12:14:46.508415 2522 net.cpp:111] conv4 -> conv4\r\n", - "I0520 12:14:46.509848 2522 net.cpp:126] Top shape: 10 384 13 13 (648960)\r\n", - "I0520 12:14:46.509870 2522 net.cpp:152] conv4 needs backward computation.\r\n", - "I0520 12:14:46.509877 2522 net.cpp:75] Creating Layer relu4\r\n", - "I0520 12:14:46.509884 2522 net.cpp:85] relu4 <- conv4\r\n", - "I0520 12:14:46.509891 2522 net.cpp:99] relu4 -> conv4 (in-place)\r\n", - "I0520 12:14:46.509897 2522 net.cpp:126] Top shape: 10 384 13 13 (648960)\r\n", - "I0520 12:14:46.509903 2522 net.cpp:152] relu4 needs backward computation.\r\n", - "I0520 12:14:46.509912 2522 net.cpp:75] Creating Layer conv5\r\n", - "I0520 12:14:46.509917 2522 net.cpp:85] conv5 <- conv4\r\n", - "I0520 12:14:46.509923 2522 net.cpp:111] conv5 -> conv5\r\n", - "I0520 12:14:46.510815 2522 net.cpp:126] Top shape: 10 256 13 13 (432640)\r\n", - "I0520 12:14:46.510850 2522 net.cpp:152] conv5 needs backward computation.\r\n", - "I0520 12:14:46.510860 2522 net.cpp:75] Creating Layer relu5\r\n", - "I0520 12:14:46.510867 2522 net.cpp:85] relu5 <- conv5\r\n", - "I0520 12:14:46.510875 2522 net.cpp:99] relu5 -> conv5 (in-place)\r\n", - "I0520 12:14:46.510884 2522 net.cpp:126] Top shape: 10 256 13 13 (432640)\r\n", - "I0520 12:14:46.510890 2522 net.cpp:152] relu5 needs backward computation.\r\n", - "I0520 12:14:46.510897 2522 net.cpp:75] Creating Layer pool5\r\n", - "I0520 12:14:46.510903 2522 net.cpp:85] pool5 <- conv5\r\n", - "I0520 12:14:46.510910 2522 net.cpp:111] pool5 -> pool5\r\n", - "I0520 12:14:46.510920 2522 net.cpp:126] Top shape: 10 256 6 6 (92160)\r\n", - "I0520 12:14:46.510926 2522 net.cpp:152] pool5 needs backward computation.\r\n", - "I0520 12:14:46.510936 2522 net.cpp:75] Creating Layer fc6\r\n", - "I0520 12:14:46.510942 2522 net.cpp:85] fc6 <- pool5\r\n", - "I0520 12:14:46.510949 2522 net.cpp:111] fc6 -> fc6\r\n" + "I0608 20:59:28.978440 28360 net.cpp:36] Initializing net from parameters: \r\n", + "name: \"R-CNN-ilsvrc13\"\r\n", + "layers {\r\n", + " bottom: \"data\"\r\n", + " top: \"conv1\"\r\n", + " name: \"conv1\"\r\n", + " type: CONVOLUTION\r\n", + " convolution_param {\r\n", + " num_output: 96\r\n", + " kernel_size: 11\r\n", + " stride: 4\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"conv1\"\r\n", + " top: \"conv1\"\r\n", + " name: \"relu1\"\r\n", + " type: RELU\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"conv1\"\r\n", + " top: \"pool1\"\r\n", + " name: \"pool1\"\r\n", + " type: POOLING\r\n", + " pooling_param {\r\n", + " pool: MAX\r\n", + " kernel_size: 3\r\n", + " stride: 2\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"pool1\"\r\n", + " top: \"norm1\"\r\n", + " name: \"norm1\"\r\n", + " type: LRN\r\n", + " lrn_param {\r\n", + " local_size: 5\r\n", + " alpha: 0.0001\r\n", + " beta: 0.75\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"norm1\"\r\n", + " top: \"conv2\"\r\n", + " name: \"conv2\"\r\n", + " type: CONVOLUTION\r\n", + " convolution_param {\r\n", + " num_output: 256\r\n", + " pad: 2\r\n", + " kernel_size: 5\r\n", + " group: 2\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"conv2\"\r\n", + " top: \"conv2\"\r\n", + " name: \"relu2\"\r\n", + " type: RELU\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"conv2\"\r\n", + " top: \"pool2\"\r\n", + " name: \"pool2\"\r\n", + " type: POOLING\r\n", + " pooling_param {\r\n", + " pool: MAX\r\n", + " kernel_size: 3\r\n", + " stride: 2\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"pool2\"\r\n", + " top: \"norm2\"\r\n", + " name: \"norm2\"\r\n", + " type: LRN\r\n", + " lrn_param {\r\n", + " local_size: 5\r\n", + " alpha: 0.0001\r\n", + " beta: 0.75\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"norm2\"\r\n", + " top: \"conv3\"\r\n", + " name: \"conv3\"\r\n", + " type: CONVOLUTION\r\n", + " convolution_param {\r\n", + " num_output: 384\r\n", + " pad: 1\r\n", + " kernel_size: 3\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"conv3\"\r\n", + " top: \"conv3\"\r\n", + " name: \"relu3\"\r\n", + " type: RELU\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"conv3\"\r\n", + " top: \"conv4\"\r\n", + " name: \"conv4\"\r\n", + " type: CONVOLUTION\r\n", + " convolution_param {\r\n", + " num_output: 384\r\n", + " pad: 1\r\n", + " kernel_size: 3\r\n", + " group: 2\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"conv4\"\r\n", + " top: \"conv4\"\r\n", + " name: \"relu4\"\r\n", + " type: RELU\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"conv4\"\r\n", + " top: \"conv5\"\r\n", + " name: \"conv5\"\r\n", + " type: CONVOLUTION\r\n", + " convolution_param {\r\n", + " num_output: 256\r\n", + " pad: 1\r\n", + " kernel_size: 3\r\n", + " group: 2\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"conv5\"\r\n", + " top: \"conv5\"\r\n", + " name: \"relu5\"\r\n", + " type: RELU\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"conv5\"\r\n", + " top: \"pool5\"\r\n", + " name: \"pool5\"\r\n", + " type: POOLING\r\n", + " pooling_param {\r\n", + " pool: MAX\r\n", + " kernel_size: 3\r\n", + " stride: 2\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"pool5\"\r\n", + " top: \"fc6\"\r\n", + " name: \"fc6\"\r\n", + " type: INNER_PRODUCT\r\n", + " inner_product_param {\r\n", + " num_output: 4096\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc6\"\r\n", + " top: \"fc6\"\r\n", + " name: \"relu6\"\r\n", + " type: RELU\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc6\"\r\n", + " top: \"fc6\"\r\n", + " name: \"drop6\"\r\n", + " type: DROPOUT\r\n", + " dropout_param {\r\n", + " dropout_ratio: 0.5\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc6\"\r\n", + " top: \"fc7\"\r\n", + " name: \"fc7\"\r\n", + " type: INNER_PRODUCT\r\n", + " inner_product_param {\r\n", + " num_output: 4096\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc7\"\r\n", + " top: \"fc7\"\r\n", + " name: \"relu7\"\r\n", + " type: RELU\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc7\"\r\n", + " top: \"fc7\"\r\n", + " name: \"drop7\"\r\n", + " type: DROPOUT\r\n", + " dropout_param {\r\n", + " dropout_ratio: 0.5\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc7\"\r\n", + " top: \"fc-rcnn\"\r\n", + " name: \"fc-rcnn\"\r\n", + " type: INNER_PRODUCT\r\n", + " inner_product_param {\r\n", + " num_output: 200\r\n", + " }\r\n", + "}\r\n", + "input: \"data\"\r\n", + "input_dim: 10\r\n", + "input_dim: 3\r\n", + "input_dim: 227\r\n", + "input_dim: 227\r\n", + "I0608 20:59:28.979029 28360 net.cpp:77] Creating Layer conv1\r\n", + "I0608 20:59:28.979038 28360 net.cpp:87] conv1 <- data\r\n", + "I0608 20:59:28.979045 28360 net.cpp:113] conv1 -> conv1\r\n", + "I0608 20:59:28.979110 28360 net.cpp:128] Top shape: 10 96 55 55 (2904000)\r\n", + "I0608 20:59:28.979120 28360 net.cpp:154] conv1 needs backward computation.\r\n", + "I0608 20:59:28.979128 28360 net.cpp:77] Creating Layer relu1\r\n", + "I0608 20:59:28.979135 28360 net.cpp:87] relu1 <- conv1\r\n", + "I0608 20:59:28.979141 28360 net.cpp:101] relu1 -> conv1 (in-place)\r\n", + "I0608 20:59:28.979148 28360 net.cpp:128] Top shape: 10 96 55 55 (2904000)\r\n", + "I0608 20:59:28.979154 28360 net.cpp:154] relu1 needs backward computation.\r\n", + "I0608 20:59:28.979161 28360 net.cpp:77] Creating Layer pool1\r\n", + "I0608 20:59:28.979167 28360 net.cpp:87] pool1 <- conv1\r\n", + "I0608 20:59:28.979173 28360 net.cpp:113] pool1 -> pool1\r\n", + "I0608 20:59:28.979183 28360 net.cpp:128] Top shape: 10 96 27 27 (699840)\r\n", + "I0608 20:59:28.979190 28360 net.cpp:154] pool1 needs backward computation.\r\n", + "I0608 20:59:28.979198 28360 net.cpp:77] Creating Layer norm1\r\n", + "I0608 20:59:28.979204 28360 net.cpp:87] norm1 <- pool1\r\n", + "I0608 20:59:28.979210 28360 net.cpp:113] norm1 -> norm1\r\n", + "I0608 20:59:28.979218 28360 net.cpp:128] Top shape: 10 96 27 27 (699840)\r\n", + "I0608 20:59:28.979224 28360 net.cpp:154] norm1 needs backward computation.\r\n", + "I0608 20:59:28.979233 28360 net.cpp:77] Creating Layer conv2\r\n", + "I0608 20:59:28.979241 28360 net.cpp:87] conv2 <- norm1\r\n", + "I0608 20:59:28.979248 28360 net.cpp:113] conv2 -> conv2\r\n", + "I0608 20:59:28.979744 28360 net.cpp:128] Top shape: 10 256 27 27 (1866240)\r\n", + "I0608 20:59:28.979755 28360 net.cpp:154] conv2 needs backward computation.\r\n", + "I0608 20:59:28.979764 28360 net.cpp:77] Creating Layer relu2\r\n", + "I0608 20:59:28.979771 28360 net.cpp:87] relu2 <- conv2\r\n", + "I0608 20:59:28.979779 28360 net.cpp:101] relu2 -> conv2 (in-place)\r\n", + "I0608 20:59:28.979786 28360 net.cpp:128] Top shape: 10 256 27 27 (1866240)\r\n", + "I0608 20:59:28.979794 28360 net.cpp:154] relu2 needs backward computation.\r\n", + "I0608 20:59:28.979800 28360 net.cpp:77] Creating Layer pool2\r\n", + "I0608 20:59:28.979806 28360 net.cpp:87] pool2 <- conv2\r\n", + "I0608 20:59:28.979812 28360 net.cpp:113] pool2 -> pool2\r\n", + "I0608 20:59:28.979820 28360 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0608 20:59:28.979825 28360 net.cpp:154] pool2 needs backward computation.\r\n", + "I0608 20:59:28.979832 28360 net.cpp:77] Creating Layer norm2\r\n", + "I0608 20:59:28.979837 28360 net.cpp:87] norm2 <- pool2\r\n", + "I0608 20:59:28.979843 28360 net.cpp:113] norm2 -> norm2\r\n", + "I0608 20:59:28.979851 28360 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0608 20:59:28.979857 28360 net.cpp:154] norm2 needs backward computation.\r\n", + "I0608 20:59:28.979864 28360 net.cpp:77] Creating Layer conv3\r\n", + "I0608 20:59:28.979871 28360 net.cpp:87] conv3 <- norm2\r\n", + "I0608 20:59:28.979876 28360 net.cpp:113] conv3 -> conv3\r\n", + "I0608 20:59:28.981308 28360 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0608 20:59:28.981322 28360 net.cpp:154] conv3 needs backward computation.\r\n", + "I0608 20:59:28.981328 28360 net.cpp:77] Creating Layer relu3\r\n", + "I0608 20:59:28.981334 28360 net.cpp:87] relu3 <- conv3\r\n", + "I0608 20:59:28.981341 28360 net.cpp:101] relu3 -> conv3 (in-place)\r\n", + "I0608 20:59:28.981348 28360 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0608 20:59:28.981356 28360 net.cpp:154] relu3 needs backward computation.\r\n", + "I0608 20:59:28.981364 28360 net.cpp:77] Creating Layer conv4\r\n", + "I0608 20:59:28.981369 28360 net.cpp:87] conv4 <- conv3\r\n", + "I0608 20:59:28.981375 28360 net.cpp:113] conv4 -> conv4\r\n", + "I0608 20:59:28.982429 28360 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0608 20:59:28.982441 28360 net.cpp:154] conv4 needs backward computation.\r\n", + "I0608 20:59:28.982449 28360 net.cpp:77] Creating Layer relu4\r\n", + "I0608 20:59:28.982455 28360 net.cpp:87] relu4 <- conv4\r\n", + "I0608 20:59:28.982460 28360 net.cpp:101] relu4 -> conv4 (in-place)\r\n", + "I0608 20:59:28.982467 28360 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0608 20:59:28.982472 28360 net.cpp:154] relu4 needs backward computation.\r\n", + "I0608 20:59:28.982480 28360 net.cpp:77] Creating Layer conv5\r\n", + "I0608 20:59:28.982486 28360 net.cpp:87] conv5 <- conv4\r\n", + "I0608 20:59:28.982491 28360 net.cpp:113] conv5 -> conv5\r\n", + "I0608 20:59:28.983197 28360 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0608 20:59:28.983207 28360 net.cpp:154] conv5 needs backward computation.\r\n", + "I0608 20:59:28.983214 28360 net.cpp:77] Creating Layer relu5\r\n", + "I0608 20:59:28.983221 28360 net.cpp:87] relu5 <- conv5\r\n", + "I0608 20:59:28.983227 28360 net.cpp:101] relu5 -> conv5 (in-place)\r\n", + "I0608 20:59:28.983233 28360 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0608 20:59:28.983239 28360 net.cpp:154] relu5 needs backward computation.\r\n", + "I0608 20:59:28.983247 28360 net.cpp:77] Creating Layer pool5\r\n", + "I0608 20:59:28.983253 28360 net.cpp:87] pool5 <- conv5\r\n", + "I0608 20:59:28.983258 28360 net.cpp:113] pool5 -> pool5\r\n", + "I0608 20:59:28.983265 28360 net.cpp:128] Top shape: 10 256 6 6 (92160)\r\n", + "I0608 20:59:28.983273 28360 net.cpp:154] pool5 needs backward computation.\r\n", + "I0608 20:59:28.983283 28360 net.cpp:77] Creating Layer fc6\r\n", + "I0608 20:59:28.983289 28360 net.cpp:87] fc6 <- pool5\r\n", + "I0608 20:59:28.983295 28360 net.cpp:113] fc6 -> fc6\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "I0520 12:14:46.566017 2522 net.cpp:126] Top shape: 10 4096 1 1 (40960)\r\n", - "I0520 12:14:46.566061 2522 net.cpp:152] fc6 needs backward computation.\r\n", - "I0520 12:14:46.566076 2522 net.cpp:75] Creating Layer relu6\r\n", - "I0520 12:14:46.566084 2522 net.cpp:85] relu6 <- fc6\r\n", - "I0520 12:14:46.566092 2522 net.cpp:99] relu6 -> fc6 (in-place)\r\n", - "I0520 12:14:46.566100 2522 net.cpp:126] Top shape: 10 4096 1 1 (40960)\r\n", - "I0520 12:14:46.566140 2522 net.cpp:152] relu6 needs backward computation.\r\n", - "I0520 12:14:46.566149 2522 net.cpp:75] Creating Layer drop6\r\n", - "I0520 12:14:46.566155 2522 net.cpp:85] drop6 <- fc6\r\n", - "I0520 12:14:46.566161 2522 net.cpp:99] drop6 -> fc6 (in-place)\r\n", - "I0520 12:14:46.566174 2522 net.cpp:126] Top shape: 10 4096 1 1 (40960)\r\n", - "I0520 12:14:46.566179 2522 net.cpp:152] drop6 needs backward computation.\r\n", - "I0520 12:14:46.566187 2522 net.cpp:75] Creating Layer fc7\r\n", - "I0520 12:14:46.566193 2522 net.cpp:85] fc7 <- fc6\r\n", - "I0520 12:14:46.566200 2522 net.cpp:111] fc7 -> fc7\r\n" + "I0608 20:59:29.042397 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0608 20:59:29.042438 28360 net.cpp:154] fc6 needs backward computation.\r\n", + "I0608 20:59:29.042453 28360 net.cpp:77] Creating Layer relu6\r\n", + "I0608 20:59:29.042460 28360 net.cpp:87] relu6 <- fc6\r\n", + "I0608 20:59:29.042498 28360 net.cpp:101] relu6 -> fc6 (in-place)\r\n", + "I0608 20:59:29.042506 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0608 20:59:29.042512 28360 net.cpp:154] relu6 needs backward computation.\r\n", + "I0608 20:59:29.042520 28360 net.cpp:77] Creating Layer drop6\r\n", + "I0608 20:59:29.042526 28360 net.cpp:87] drop6 <- fc6\r\n", + "I0608 20:59:29.042533 28360 net.cpp:101] drop6 -> fc6 (in-place)\r\n", + "I0608 20:59:29.042546 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0608 20:59:29.042551 28360 net.cpp:154] drop6 needs backward computation.\r\n", + "I0608 20:59:29.042559 28360 net.cpp:77] Creating Layer fc7\r\n", + "I0608 20:59:29.042565 28360 net.cpp:87] fc7 <- fc6\r\n", + "I0608 20:59:29.042572 28360 net.cpp:113] fc7 -> fc7\r\n", + "I0608 20:59:29.068634 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0608 20:59:29.068672 28360 net.cpp:154] fc7 needs backward computation.\r\n", + "I0608 20:59:29.068685 28360 net.cpp:77] Creating Layer relu7\r\n", + "I0608 20:59:29.068692 28360 net.cpp:87] relu7 <- fc7\r\n", + "I0608 20:59:29.068729 28360 net.cpp:101] relu7 -> fc7 (in-place)\r\n", + "I0608 20:59:29.068737 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0608 20:59:29.068743 28360 net.cpp:154] relu7 needs backward computation.\r\n", + "I0608 20:59:29.068752 28360 net.cpp:77] Creating Layer drop7\r\n", + "I0608 20:59:29.068758 28360 net.cpp:87] drop7 <- fc7\r\n", + "I0608 20:59:29.068766 28360 net.cpp:101] drop7 -> fc7 (in-place)\r\n", + "I0608 20:59:29.068774 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0608 20:59:29.068780 28360 net.cpp:154] drop7 needs backward computation.\r\n", + "I0608 20:59:29.068789 28360 net.cpp:77] Creating Layer fc-rcnn\r\n", + "I0608 20:59:29.068794 28360 net.cpp:87] fc-rcnn <- fc7\r\n", + "I0608 20:59:29.068800 28360 net.cpp:113] fc-rcnn -> fc-rcnn\r\n", + "I0608 20:59:29.070180 28360 net.cpp:128] Top shape: 10 200 1 1 (2000)\r\n", + "I0608 20:59:29.070194 28360 net.cpp:154] fc-rcnn needs backward computation.\r\n", + "I0608 20:59:29.070199 28360 net.cpp:165] This network produces output fc-rcnn\r\n", + "I0608 20:59:29.070217 28360 net.cpp:183] Collecting Learning Rate and Weight Decay.\r\n", + "I0608 20:59:29.070231 28360 net.cpp:176] Network initialization done.\r\n", + "I0608 20:59:29.070237 28360 net.cpp:177] Memory required for Data 41950840\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "I0520 12:14:46.600733 2522 net.cpp:126] Top shape: 10 4096 1 1 (40960)\r\n", - "I0520 12:14:46.600765 2522 net.cpp:152] fc7 needs backward computation.\r\n", - "I0520 12:14:46.600777 2522 net.cpp:75] Creating Layer relu7\r\n", - "I0520 12:14:46.600785 2522 net.cpp:85] relu7 <- fc7\r\n", - "I0520 12:14:46.600793 2522 net.cpp:99] relu7 -> fc7 (in-place)\r\n", - "I0520 12:14:46.600802 2522 net.cpp:126] Top shape: 10 4096 1 1 (40960)\r\n", - "I0520 12:14:46.600808 2522 net.cpp:152] relu7 needs backward computation.\r\n", - "I0520 12:14:46.600816 2522 net.cpp:75] Creating Layer drop7\r\n", - "I0520 12:14:46.600823 2522 net.cpp:85] drop7 <- fc7\r\n", - "I0520 12:14:46.600829 2522 net.cpp:99] drop7 -> fc7 (in-place)\r\n", - "I0520 12:14:46.600836 2522 net.cpp:126] Top shape: 10 4096 1 1 (40960)\r\n", - "I0520 12:14:46.600843 2522 net.cpp:152] drop7 needs backward computation.\r\n", - "I0520 12:14:46.600850 2522 net.cpp:75] Creating Layer fc8\r\n", - "I0520 12:14:46.600857 2522 net.cpp:85] fc8 <- fc7\r\n", - "I0520 12:14:46.600864 2522 net.cpp:111] fc8 -> fc8\r\n", - "I0520 12:14:46.615557 2522 net.cpp:126] Top shape: 10 1000 1 1 (10000)\r\n", - "I0520 12:14:46.615602 2522 net.cpp:152] fc8 needs backward computation.\r\n", - "I0520 12:14:46.615614 2522 net.cpp:75] Creating Layer prob\r\n", - "I0520 12:14:46.615623 2522 net.cpp:85] prob <- fc8\r\n", - "I0520 12:14:46.615631 2522 net.cpp:111] prob -> prob\r\n", - "I0520 12:14:46.615649 2522 net.cpp:126] Top shape: 10 1000 1 1 (10000)\r\n", - "I0520 12:14:46.615656 2522 net.cpp:152] prob needs backward computation.\r\n", - "I0520 12:14:46.615664 2522 net.cpp:163] This network produces output prob\r\n", - "I0520 12:14:46.615682 2522 net.cpp:181] Collecting Learning Rate and Weight Decay.\r\n", - "I0520 12:14:46.615696 2522 net.cpp:174] Network initialization done.\r\n", - "I0520 12:14:46.615702 2522 net.cpp:175] Memory required for Data 42022840\r\n" + "Loading input...\r\n", + "selective_search({'/home/shelhamer/caffe/examples/images/fish-bike.jpg'}, '/tmp/tmpG3fe4u.mat')\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "Loading input...\r\n" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "selective_search({'/home/shelhamer/caffe/examples/_temp/cat.jpg'}, '/tmp/tmplkH92s.mat')\r\n" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Processed 223 windows in 16.525 s.\r\n" + "Processed 190 windows in 8.631 s.\r\n" ] }, { @@ -218,7 +400,7 @@ "map directly to c-types [inferred_type->mixed,key->block1_values] [items->['prediction']]\r\n", "\r\n", " warnings.warn(ws, PerformanceWarning)\r\n", - "Saved to _temp/cat.h5 in 0.353 s.\r\n" + "Saved to _temp/det_output.h5 in 0.057 s.\r\n" ] } ], @@ -229,7 +411,9 @@ "metadata": {}, "source": [ "Running this outputs a DataFrame with the filenames, selected windows, and their ImageNet scores to an HDF5 file.\n", - "(We only ran on one image, so the filenames will all be the same.)" + "(We only ran on one image, so the filenames will all be the same.)\n", + "\n", + "This run was in CPU mode. For GPU mode detection, call `detect.py` with the `--gpu` argument." ] }, { @@ -238,7 +422,7 @@ "input": [ "import pandas as pd\n", "\n", - "df = pd.read_hdf('_temp/cat.h5', 'df')\n", + "df = pd.read_hdf('_temp/det_output.h5', 'df')\n", "print(df.shape)\n", "print(df.iloc[0])" ], @@ -249,13 +433,13 @@ "output_type": "stream", "stream": "stdout", "text": [ - "(223, 5)\n", - "prediction [6.67012e-06, 1.26349e-06, 1.86075e-06, 1.0960...\n", + "(190, 5)\n", + "prediction [-2.10395, -2.06288, -2.76946, -2.32455, -1.77...\n", "ymin 0\n", "xmin 0\n", - "ymax 500\n", - "xmax 496\n", - "Name: /home/shelhamer/caffe/examples/_temp/cat.jpg, dtype: object\n" + "ymax 323\n", + "xmax 481\n", + "Name: /home/shelhamer/caffe/examples/images/fish-bike.jpg, dtype: object\n" ] } ], @@ -268,16 +452,16 @@ "In general, `detect.py` is most efficient when running on a lot of images: it first extracts window proposals for all of them, batches the windows for efficient GPU processing, and then outputs the results.\n", "Simply list an image per line in the `images_file`, and it will process all of them.\n", "\n", - "Although this guide gives an example of ImageNet detection, `detect.py` is clever enough to adapt to different Caffe models\u2019 input dimensions, batch size, and output categories. Refer to `python detect.py --help` for the parameters to describe your data set. No need for hardcoding.\n", + "Although this guide gives an example of R-CNN ImageNet detection, `detect.py` is clever enough to adapt to different Caffe models\u2019 input dimensions, batch size, and output categories. You can switch the model definition and pretrained model as desired. Refer to `python detect.py --help` for the parameters to describe your data set. There's no need for hardcoding.\n", "\n", - "Anyway, let's now load ImageNet class names and make a DataFrame of the predictions. Note you'll need the auxiliary ilsvrc2012 data fetched by `data/ilsvrc12/get_ilsvrc12_aux.sh`." + "Anyway, let's now load the ILSVRC13 detection class names and make a DataFrame of the predictions. Note you'll need the auxiliary ilsvrc2012 data fetched by `data/ilsvrc12/get_ilsvrc12_aux.sh`." ] }, { "cell_type": "code", "collapsed": false, "input": [ - "with open('../data/ilsvrc12/synset_words.txt') as f:\n", + "with open('../data/ilsvrc12/det_synset_words.txt') as f:\n", " labels_df = pd.DataFrame([\n", " {\n", " 'synset_id': l.strip().split(' ')[0],\n", @@ -297,38 +481,38 @@ "stream": "stdout", "text": [ "name\n", - "tench 0.000007\n", - "goldfish 0.000001\n", - "great white shark 0.000002\n", - "tiger shark 0.000001\n", - "hammerhead 0.000007\n", - "electric ray 0.000004\n", - "stingray 0.000007\n", - "cock 0.000057\n", - "hen 0.002985\n", - "ostrich 0.000010\n", - "brambling 0.000004\n", - "goldfinch 0.000001\n", - "house finch 0.000004\n", - "junco 0.000002\n", - "indigo bunting 0.000001\n", + "accordion -2.103952\n", + "airplane -2.062878\n", + "ant -2.769462\n", + "antelope -2.324549\n", + "apple -1.777492\n", + "armadillo -2.152244\n", + "artichoke -2.547566\n", + "axe -1.905112\n", + "baby bed -0.836331\n", + "backpack -1.134832\n", + "bagel -2.133529\n", + "balance beam -2.338049\n", + "banana -1.584361\n", + "band aid -1.468755\n", + "banjo -1.903778\n", "...\n", - "daisy 0.000002\n", - "yellow lady's slipper 0.000002\n", - "corn 0.000019\n", - "acorn 0.000011\n", - "hip 0.000003\n", - "buckeye 0.000010\n", - "coral fungus 0.000005\n", - "agaric 0.000019\n", - "gyromitra 0.000039\n", - "stinkhorn 0.000002\n", - "earthstar 0.000025\n", - "hen-of-the-woods 0.000035\n", - "bolete 0.000036\n", - "ear 0.000008\n", - "toilet tissue 0.000019\n", - "Name: 0, Length: 1000, dtype: float32\n" + "trombone -1.880981\n", + "trumpet -2.182214\n", + "turtle -2.147969\n", + "tv or monitor -1.362767\n", + "unicycle -1.660976\n", + "vacuum -1.484495\n", + "violin -2.158709\n", + "volleyball -2.454174\n", + "waffle iron -1.827833\n", + "washer -2.017761\n", + "water bottle -1.709274\n", + "watercraft -1.742185\n", + "whale -2.385357\n", + "wine bottle -2.493835\n", + "zebra -1.921937\n", + "Name: 0, Length: 200, dtype: float32\n" ] } ], @@ -358,22 +542,22 @@ "output_type": "pyout", "prompt_number": 4, "text": [ - "" + "" ] }, { "metadata": {}, "output_type": "display_data", "text": [ - "" + "" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\n", + "png": "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\nkBxYsVjE3bt34fP5hLlQ2R8HQPrdWGgB2oZFqdypJOQqlUqIRqOSM+Rll0wmBU7BOebvEC9FZVLu\nraWlJfy0ofvTP/3TP/2p/8Uv0PizP/szRKNRWK1W4fzQ6/XSTW21WrGysoJyuSyE4hqNBk6nU24P\ng8EgnefVahWBQECkigk7J+t+uVzGW2+9hfX1dQwODsJkMiGbzaJer8PpdKKzs1OIvYmlMBgMcgPz\n8NvtdmQyGXR2dopxoReTyWTQ29srmzOZTAr+iB28JycnclvTGPb19QlNZTqdFlf7+PgYpVJJKDDK\n5TLq9ToMBoNUqBgCDQ0NCd6GlBqVSgXFYlEUJqgu2Wq1UC6X5TO8STmnlDBhAym15PmuXq9XCOo1\nGo1KrI8Hz+VyCR8RRREJ93c4HAL+M5lMIlhHwCHXjDLKnF9KBlHvOxQK4b333kN/f7+U8ck77ff7\n5UIhYM5qtSIQCKBUKuHg4ACnp6fyu8FgEHa7XSSi2VG/vb2Njo4O9PT0CHslDT4NIOfF4/HIu5Aj\niQogZIokBcvh4aFgzOjN0FOkioXSoJGXiKX4ZrOJdDqNQCAg3jq9X4ZkBoNB2AdarRYsFgsymYyo\nnHBd2RDLgga/m8b25s2b+DjT8sAlkmlw2BnLsi7/jDIqRqMRhUIBzWYTmUxGLHI8HhdZDpazuch0\nbXnDEiVKzmBKxZCke2dnR7L7c3Nz2N/fVy1+LBYT/e7Ozk4BrW1sbMhtT9Q05UBYpSAClOGhw+GA\nyWSC3W7H6empSkuLHDLsm+FcMDZnDiKXy2F2dhazs7M4Pj7G9evXYTabZdMwZCLVA3WnuBGJAmbu\n6IMPPhCpFHb6p1Ip7O7uyjOQVKpYLKKrq0tkeEnUPjAwIOqahUJBsDRU6jQYDCqZF6ptUCmDhPIG\ng0FCZ61WK/+u0+lQrVbRarXkmZk/IccyjXU6nRYpIPIfU+OMZW29Xi+0niQFq1arqFarMJlM0Ov1\ncDqdKppPyi+TLD4ajYpkjBLCQIK6/f198ZpzuZw0nHJf0Wil02nZr3a7Xf5HD4uMAPwtgg/L5TKy\n2azsbRLzd3d3i3Q014+X1yOPPKIybqenp5IP7e/vx/r6ujwrvamPGw9ceMUudKCdDCUdRblcxt7e\nnkouxWazQavVolqtSmz93nvv4fj4WDbcwcGBivM2n8/DYrFge3tbxXHLZLPNZhNYPQcxQsxxMLma\nSqUwODgIjUaDfD4vri/RnMA9bh0CuJjroWfGDba7uyulWIfDgffee09wLfQamFTnu5bLZeTzeRwf\nHwukgLE40A6/qO1FTmDgHv5pb29PRTlhNBrleZrNJkKhkMw3Dx0bFJUa8MFgEFtbW0INQuCgxWLB\nysqK8DArRQJXVlYwNzeHCxcuIJ/PS9lemQujsQDu6a8fHR3h4OAADodD5gGAtGEw96BESBuNRuTz\neeFEAiD5IPLqdHV1iZjc4OAgMpkM+vr6RKcKaHupDG8pY8TQXdkes7CwIPPT3d2NUqmESqUieT+W\n2SlNHA6HkUqlZJ8SmGm1WtFoNLC1tSVJc5fLJYyMBoNBxXe8tbUlQoXKFhsaL16+RHwDEM/ZbDbL\nxcX1zmQy8Pv92NjYUNGZKPfYR40HztN5OB6Oh+PBHg+c0UkmkxL/VioVmM1mdHZ2iktOl5G37enp\nKYLBoIQIDocDfr9fkopKt5RVLlapCDY7ODgQN5Wlca/XC6/Xi9PTUxGuY/hDNOzBwQFyuZwklhkO\nOZ1OuX0YhlHuxmg0SuxeLpfl9rFYLKJJ1Gw2MT09LfPAm5vywOTpYVjF5Hij0cDY2BjGxsZQr9fx\nzDPPyLzq9XrJH9Ez6+rqgt1ulz9niFEqlcS74zPYbDapqnk8HmSzWWSzWTSbTRQKBaGNIOGUXq+X\nkM1kMomEbywWk3BybGxMNJ0cDoeEmHt7e5InYWhDZQqz2SwKFAwrGH6RkxqAPLfZbBZ0rs/nk31y\nenqKUqkkCeTDw0NZIyqsVioV6PV6Ub20WCwSUjUaDUFJ9/T0SBsF9x3XiHNLupVKpYKhoSEMDQ3B\n6/XC5XJJXo4QAqPRCI/HI5UpqmwSAW82m6VVp1wuSyqA6p7kXGYIxcogwYTMl5JtkkBEcnszv0Yv\nrtFo4OLFi7LXCDv4uPHAhVfkCQEgMqyUkwEgmX/mPshrTHeW4nt6vV6QmCx5ejweeL1e1Ot1yY8o\nS4d0zyuViri6PMwsRXq9XglBxsfHRee8UqlIlaNYLEry8MyZMzg+PpbQQqvVCvE4DwwAcbuJPmXf\nGdBuVFWy4zFMyufz6O3tlWQrABUX8507dxCJRAQNzaZButgkP1cSwJN4y+fzYXFxUQjLDAYDHn/8\ncVy5ckW6w4G2MSOClklHhqbKfAqxP0C79LyxsSGXQygUkjCXyWJqUdGl1+l08Hg80vrBJDDQrjDy\nMPp8Pil1A+2QgzlAErFzvck/RIIzzg9zPh6PBzdu3JA2A2qHdXV1ycWiJNaPRqMSynA/1mo1CfGI\n5CZSeGJiQoQElO0jQDs05TtSoZTPTTlqzjsxYGxbYFMuB/cmw22+J+d7cHAQiURChZGjNE6j0UAw\nGBQWA56BnzYeOKNz7do11UtRT5pxLA1SMBiUpFg2mxUqg8XFRaFsNBgMWF9fl0Wm7jmxFl6vF7Oz\nswDasTJxFkdHR5IvODw8FM2lRqMhlSag3ZxI6s3h4WHJF2g0GmSzWeHdVVJr8j2Iw2BszW5fJlaJ\nuwHaoLT19XXs7u5ieHhYcl6xWAxLS0vwer2y2Vn2pf461TNZ0gXuSfQSqEiDNTs7i76+PpTLZRgM\nBuzs7Ki8OHIK7+3tyfzwBie3czabFS+PMru5XE5FHdHR0SGGfXJyEj/84Q/F8LG6ozSs/K7Ozk6k\n02m5iHgxrK2tiSLp8vKyzAXQNopKJREag3w+j/n5eVy4cEE8AyXDZCaTQXd3N9bX11VkWCwAHB8f\nC90oB7m6Wd3i2pHKlW0rNMoLCwviSQ8MDIgBOzg4QDKZhNVqVbEOAG0jQaVbYq/4TqlUCiaTSRgj\naXj0er20cqyuriIcDstamEwmMVrMKwJtY01vqFAoYGVlRUWL+tPGA2d0HA6HZMdJVu3z+RAKhXDl\nyhW5qbRaLYaHh7G9vS1KDkCbo8RsNkvzJqsrAAT4ZrVaEQ6HEY/HZTHYrEeXmxPLErrBYEAoFBL3\nG7iXeFUqHgDt5OHW1paw901PT8tntre3MTQ0JEhQ/nmr1cLIyIgkscmFC0BCJaPRiGKxKAlmg8GA\n4eFh6HQ6jI6OYn9/X1gX/X4/9Ho9Jicnkc/nUa/XBXk8OzsrlZi9vT3MzMwAaPcPHRwcIBgMolQq\n4fz583LzRSIR3LhxQ+bh5s2bANoNn9vb2wiFQsIoyFvZYDAgEonAYrGoVCrj8TjeffddceUfe+wx\nMZY3b97EhQsXhLaVZfmBgQGheujr60MikRA8D71UjUaDvb09DAwMiIc2NDQkPXomk0k8QY/Hg56e\nHqloer1eOXDR/6vbtr+/j6GhIek1YqNsV1eXeAEXLlyQZ+js7JRDT5pVJtbpXcTjcVUC3GAwwOv1\nSogIQFQ1SL9CmAZwrxm02Wyit7dXsGxA24NcXFzEyMgI9vb2xFimUik5L6z4ss+LUtlTU1NotVqC\n0P/kJz8pPD7d3d0YGBiQYovZbBYeqo8aD5zR4YQCkH/yFqR3wD+jO0hReX5G+XckXQLaYYVerxes\nDkuGyr/jP3nY2DjJ52LjHj/Dqomyc5cALHorSneWlTj+O5+beRB+NxHI/D7+Pr+Xf04MDmV3+QzK\nZ6f3wHdizoHfpXxXfjdLqXwekpT9eMWEpWCtViuf5/fxs+RpVv5OtVpFvV4XQ8K11mq1aDQaOD4+\nhkajkc+0Wi1VI7BSeZN/DtwDEXIelGtAInbl3LG0fnp6Kuv04+/Bf3Kf8fmVz0cvVaPRCNIauIcm\nL5fLkudRPivXnOvHwT3Hf/LZlHuM/58eLOeG+1Q5p/wtfqey053/vVIfXvkshFv8eCPvx40HLpH8\ncDwcD8eDPR44Twe4J+Z1dHQEr9crZNG1Wk3Ch5mZGWQyGSEb4iAyc21tDaOjo9ja2lKFKePj46hU\nKrh69arctgDkv5uZmVFVpEhQtbGxIbkiJj2TySSmp6eF/Imt/9lsVm6SRCKBM2fOyH/DHFWtVkMy\nmZSworOzU1omSM7O0Ku7uxuJRAIdHR2Sn+G7VioVnDt3DouLi1haWpLQJplMQqfTieaV0WgUEqZW\nq4VqtYpyuYyRkRFxmw8ODpBIJKTCNDc3p6IrjcfjgutgQp8SPMfHxxK+8VZm+8Pi4qLws3CeTk5O\nUK/XsbKygvn5eYyOjgKAhECdnZ0oFArCikcQXrVaxQ9/+EM888wz4jEyBAbaYZOS6N1sNmN9fR1W\nq1W0w4B7ig9TU1OSN2LBwWw2Y35+Hn19fcjlcrLnrl+/jieeeALZbBbJZBKXLl3C9evXAbTDz0gk\ngnQ6Lb1KAEQmhs2jW1tbKh6gw8NDFItFSZzzOVqtlqha+Hw+eUYAwuaXy+XgcDhU75TP55HJZGC3\n2yXHSPBjIpFAMpkUYjOgnRQ2mUxYWVkRD5Nzur29jXg8Dp1Oh9dff132D8PxjxsPnNEhbB1ob/T9\n/X3EYjFEIhHMzc3JZifvL3umOIg0PXfunIjDsUeHukOkE+3q6pI+EibTEomEVHAAqIinKGDHTUhO\nlieffFKl3Njd3Y2dnR1EIhHhjOHf3b17F5FIRNxd/o7JZBIKT51Oh9nZWUmGptNpxONxEbNnwtPr\n9cJsNiOZTCISicBqtcpGIxAuFArJYaIU8LVr16DVauWz4+PjMnd6vV4aFM+cOSMHxOfzYX5+Hi6X\nC06nU5LZo6OjWFlZkfKuMqdD1rnJyUkVb09vby+2t7fRarXQ3d2tEpPLZrPSVKqUsyF6WaPR4OLF\ni9IcC0Dc/larhe3tbRVQjy0lLDfzd7RaLS5duiRoaBJ5AW2A6PDwsBgKVq8o+9zT0yNVTeZ0eCE4\nHA4UCgVVVWtra0tyMdFoVPY35WKY82IjMStXvb29UlXjnDIUy+VyIkHDvavRaOD1euH3+5FOp1VS\n1gAECd9sNqVfK51Ow2q1SnsLZX3cbjd6e3ulf+6FF14Q7bZfOAma/z8GX6pWq8HlcmF/fx/JZBIe\nj0dF6zA3N4dUKqXqbSLxFOHaSt0rKkt2dXXh1q1b6OzslA1AqgDmg/iZYrGIixcv4vbt28LZS0PE\nTUJNLFIMEJ9CSonZ2VlJ6rVaLRSLRezu7koPEtDetGtra9JPxaoc0FaCPDw8FMQxOXbdbrfkN6rV\nqkoWlnzJ7JkyGAzScGm1WrGxsQGXy4Xh4WFVbsRms2FnZwcTExO4efOmJGQpiJdIJFAqlaTCSCwI\nNznF7QBIFWxzcxP1el1K94ODg5JHKZVKUm4H2gej2WwKDEGZWzCZTEgkElLGpuGzWq2i/EnJXXqa\nNNL1eh1+v1+lh5XJZKS6qMxnaTQabG1toaenB8ViUao2NpsNq6urAtcYGRmRNgefzyfPTh1wzls6\nnRavW9lEOzAwILQkykIE5YZIW+JyuQTaQWIxQjs2NjbEGySbAGEH9PC5NplMBuvr60JuB7ST5gsL\nC0IZS8+WpGZmsxnNZhN37tyR+VZqYH3UeOCMDm9S4F7HOGkYlcxvZPKzWCyqBBhxO5zwSqUiNyGN\njMlkgsFgkO5woL1gbBpsNBqqBDNvbDLu8fZn9zKBhkoqCr1eL02WfEa+E70Z9kEBEIL1crksEsBK\n2dxWqyXgRB5q3tJ8XrPZLM8AQPh1lGVvAILNYUmWc8q5oxEj0I3vVK/XodPpxFsAII2v7FongTrQ\nNqQGg0ESkQyv2Dip1HJXeisESLZaLTHwSvJwlq2VFJ5sYCTZPRO5BEKSI4lzwFCC716v11VtCNx3\nbA9Qzp8yOc0Lkmt8fHws6845aDabKlAif4cVt9PTU9kv/HO2+LAvkPNDTiFlX6GSf4r9isq9xf1G\nYKzSw2blV6vVyvfyM8p3ZtM0oE7cf9R44IxOo9EQq2632+HxeIS2kYhL/h2Bd81mUzb6+Pi4dNMO\nDAwgk8nI7R8MBhEIBOTm50EH7oVXWq1WeHqBtsVvtVp4/vnnkc/nYbPZVJzHdrtdKBi4KJQgYTXs\nqaeeknwPtdn9fr98NwBBRbPy9fjjj6uUGJjj8Hq9ojRAOABVIfR6veSbOjs78fTTT4tnBUAMKXu/\nyIOsBGNGIhGpVPl8PsmbUBfe4XBISATcC/2IoXniiSdkQ5MInR4Ay8j1eh0zMzMiGU3OGADCS8zP\n8Lt8Ph8SiQQGBgbgcrlwfHwsIQfDOpbtiW0BIGjpSCSC/v5+WTuGdkdHR0JfouS4fuGFF3B0dIS9\nvT0JU2iU6V3rdDoJOagjbzabYbFYVBfQ5OQk9Ho9+vr6pPcPgDRUsqmVc+33+9Hb2wun04mjoyOh\ncAHa4RV5scPhMJ544glZP+rAMyQjxzYNy/b2NmZmZlCtVoUGNhKJSJPrwMCApA7W1tbQ19cnoe5z\nzz0naQp6fh83HjijA0AW5datW+jt7YVer0cwGMRLL70kh5QdtXfu3IHFYhF3/+bNm/D5fGi1Wrhz\n546qnE56DEptGI1GCWHokvPm4DNsbGxgb29PbvH+/n65qTY3N3F8fCxtB/wdon29Xi+cTiey2ax4\nB6urq4jH41KSVZaorVYr6vU6kskk/vM//xOPPvoogDZZ1/7+PrRaLRKJhIQpAwMD0Gq16O7uhsVi\nQTKZVBGmz8/PY3h4WMViB7STm1QRPTw8FGNQqVSwtLSEcDgsfNC86Xp6evDee+8hEong9u3bkrwc\nGhrC3bt35WYkwBBoG0vqYhmNRly5cgUA8Mwzz+Cf//mf0dPTg4mJCXkf4B6XzfHxMd5++235Lr1e\nj4ODA6RSKWSzWfh8PsnHVSoVxONxlMtllEolFTaLMP9yuYzr169L0ry7u1taCEZGRmTtgbZBunnz\nppB50bitr69LN/z+/j40Go3ky9bX14U9sdFoSOhdrVaxtbUFv9+vIqcD2gyObOlRKnXW63XJAzGc\nohdE2ZlSqQSTyYQrV67IurpcLuFnptIEAMEiOZ1O5HI5YXAA2mDak5MTxONx7O/vy2XC/B/L/1eu\nXJHUhlLf/qPGw5L5w/FwPBz/o+OB83SU4LlYLIZGo4GBgQG8/fbb6O/vlxuEiVqj0Yh0Oi0VGK/X\nK5QP1KimN0FCJXpFWq1W3GO6sqR8ZP7BarUiFothe3tbuGKVCpXs6+np6VHF8RaLRRpWy+Wy3Nj7\n+/tSOnW73QJH7+3tRbFYRLPZRHd3Ny5fviwhX0dHB2w2G6rVKh599FH813/9FwAIHQJbN2KxmApM\nR9UEKpMyzGJ5nnPCfBi9JqAdyx8eHspc0eskadbly5cB3GtB6OjokIZBhhY6nU5CHzaHAm1VhQsX\nLkiegMBIAOLS7+/vY3x8XG5VhhUsLbNZEbiXB0yn0zg9PYXD4VApgFQqFWmWpVdHMN/Q0JCgpRni\nnZ6ewu12CxqeYSmZ/HZ3d9HZ2Qm73S6l57GxMYESHB4eSrK1Wq0KvzMhBETBT05OSiik0WjES43H\n4yKrQ0oPepwsrrBROBAIyG/t7e3Bbrdjc3NTeq04isWiaIUpaVuUzaE6nU4lW8P8lFarlbYM4B57\n4ceNB87oMOEGtN3m3t5eLC4uIhaLoVAoiIvq9XqlrygWi4k7HQ6Hsbm5CaPRiLNnz+Lu3bviMpII\nqtlsQqvViugeAGFb48ajq2s0GqHVahGLxbCzs6PipYlGozg4OMD29jYqlYq44VSp1Ov1WF5exnPP\nPYerV68CaMfryn4aHnKqQBKJzE0AtCsg7Kva3t6WFg2dTodyuSzsc2zXANoH5+LFi8IImMvlJMSz\nWq1YW1tDNBqFRqORUGlnZweBQADlcvknGgeHhoZwcnKCQqGA/v5+yVGxmZFNrMFgUIw8eY50Oh26\nu7sl38TOdKPRKNUjzumHH36ISCQCn8+HdDot30WSeMojF4tFybXkcjlsbGxI/mF9fV2MC0vuOp0O\nly5dkpCMLJBE/HZ0dPyE8c3lcjg8PJTqEAnP2NcHQPTWuGeImufFlMlkVM2wWq1W8jMMh1wuFxKJ\nhFxMLpdL5mFvb0+F+0mlUujv74fRaEQwGEQ2m5WSOMPLWCwGjUYjeJqFhQVUKhWk02nZszTY8Xhc\nyMTIf8R58/v9sj9/5Vd+RcUr9NPG/yujc3JygnK5rKpO/E8PZUc5PQdqaCvVEXk4Wc1QljvZ6lAq\nlVTiZuzK5mdp4QFILof/Y6zOHinqQBHUBkAIpeLxONLptBgD/h7bDEhpCUDic41GA4vFIgbRZrOJ\nGiQ3NTduZ2en0DNoNBrJKcXjcRSLRaFh/XHoOxn12BKipFc9OTmRio6SuItkU6wA0sizU75arapI\n0avVKk5PT2EymZBKpWQz810p+8wDBrQNyN7ensyPx+NRCbiRtlVZIKBCJXMv7N7mu5IsjYx8fCfi\nWlhK5gEl0VWtVlNVSQEISJPeHj1vakExWd3Z2akibWeliiT/3Lt8Tr1ej3w+L4UNgiqir11xAAAg\nAElEQVTr9fpPyC6zksn8i1IFhf9jIzS/3+v1SlmbeBw+g1arFeYF5VxT756eG3OZjBCY11pdXZX9\nqATjftS4r9H5jd/4Dfzt3/4tdDodzp8/j2KxiN/93d/FN7/5zft99Gcy1tbWJIlVLpextbUFn8+H\nvb09lWY2F5v4D96iXIhyuYzXXnsNQ0NDKhAZMQxOpxMul0saF6enp6HRaAQbwRuRTZGVSgVer1ek\nTgAIfSobRJm4I8M/5UWq1aqKyY6Ce8fHx7KQjUZD1CFNJhOSyaS41KR/KJfLmJ+fl+R3JBLBzs4O\nHn30Udy+fVt4b4D2bZTNZtHX14dqtSrfDbRDvHA4rOIuAtrhA8nH2alM3EalUsG1a9dw5swZvPfe\ne/I7er0ea2trUmlrNpsq8nBWmhhmAe3GSVZfDAYD7ty5I9WUkZER6PV6JBIJFdtguVzG+Pg4rl27\nJtzV9G4XFxcxPDyMvb09UTvg3yWTSVkjItuBdoXx/fffx4ULF6RrnF4uDz9DPqUmeCAQQL1ex+rq\nqrwbcE+qeXh4GKenp6pu7XA4LGX0QqEgMi8DAwOS9DabzbIOW1tb0pVeLpcxMDCgKlLs7OzI3slk\nMuJtabVaPPLIIygWi1hZWZHLKZ1Ow2w2C7KdHEPcC1qtVqhMaORJGk8q1ldeeUXmh4nrjxv3NToL\nCwuw2+34p3/6J3zqU5/Ciy++iOnp6Z+b0eEGAe7RhDabTczMzGBxcVEOKTWEKAyvNEZGoxHhcFhu\nGeUBYbMjb01y1hAXkkwmVaVn6ijR+1FuNHpS5NFRcr/s7e3hzJkzItlKhOzq6ir6+/vhdrtRKBQE\nNEiwHEnfFxcX8Uu/9EsAIMaEuA5uwEwmg4mJCQmVdnd3BQA4OTmJVquFQCCAVCoFnU4nyhPz8/Mq\nMnh6J0qF0UAgIHxEQDtsDYfD8js8iFNTU0IZYbVasbCwIHkyruXw8LCKR2ZsbEywTwTR0aNaXV1F\nKBTC2bNn8e6770roNzY2hlwuh66uLhQKBfT29sqN6/f7odFopOqWyWRkzS9fviycNcFgUDwg7q1M\nJoOenh7YbDapohHkSBVNerD1eh0nJydyYVEfHWiHx6Ojo6jVaoJWBoBPfOITWF5elnxhX1+f5B9J\nUMaDzn0ViUSwvr4Oo9EoITCNxJkzZ5DJZHB4eIhAICChPffJ/Pw8xsfH5TkBiHBBtVqF1+vF8fGx\nvJPdbpczQ4oSAAL5MJvNsNvtCIfDKonnnzbua3SYR3jppZfw9a9/XRXb/jwGKQUAiOCZxWIRrSHG\n0jabTbhJKpWKTFalUpFbYHd3F/39/YIv4C3Ezlz2rgAQHt2Ojg4UCgUVQRTLkAzjiAgeGBjA7u4u\n0uk09vf3JSYnoyBZDpWgRqAd5u3u7qp0mEKhEFZWVoStcHl5GZ/73OcAtA/kBx98gMHBQZXsCRn7\nSXpOLw5o3+S1Wk0kksnxA7SNC1UniEAGIAjUnZ0dBINB8YT4W8yrEaYPtI2EXq+XtQoEAuLR8HeU\nYE2gbcibzaZQdRAcB7TzbkdHR9ILxJxCLpcT+D7Js5gGYEhTr9elF4m/t7y8DIvFgnA4LElgPpvV\nahVaDHqzQPv2Z2hHKRp+plQqoVqtSkKWJXjSgTDMY/hJWo1yuQyPx4N0Oq3aj4VCAa1WC5lMRjwJ\neo3UFifoEGjn3cj/TUNB42u1WkU5pVKpyAVEg7uysoJAIKCSFSZYNZfLwWQyyXOvrq5Kcr6npwfl\ncln2qhKA+lHjviXzr371q4hGozg6OsLjjz8uN/vD8XA8HA/H/5dxX0/nG9/4Br7xjW/I/+/t7ZWS\n7M9jkB0faJf5CJpLJBIibQK0ra3f75dKlbKdYX9/H4uLixgcHITRaBQ5VMrh+v1+6HQ6hEIhaXCj\nq3x8fIx4PC7JPlaNUqkU+vr6UKlUhKXwww8/hNVqRSQSQW9vr9yU/f39mJqaEiUKAhKBdsKRqGgl\npy/fk71Mzz77rISSh4eHGBwcFHVS3uKM+0n61NvbKy4wmwJHR0clmc5bjM/DG5ml+UKhgKOjI3R1\ndaGzsxMej0fc8EKhgLW1NUxOTop+FdBOpufzeZTLZemBY9k1kUigt7cX8/Pz6O7uluoH5Yej0Sj8\nfr+IDPJdSS1KtCyf2e/3Y35+HhaLBYeHh+IFNZttiWl2fyvL9h0dHbBardBqtchkMqp1UCbeXS6X\neIKDg4MCCFXSrPLdNjc34XK5pAcLaJ+b69ev45FHHsHc3JzMaa1Ww61btzA6OioJYeZ7LBYLIpEI\nnE6nUJcC9ziKKPtDDxNoe4IdHR1IJpNC+zoxMQGg7d0yyR8Oh1UqtalUCsPDw9I9r5R+jsViopxC\nL4vhFXvzCoWCvNN/O7zq6+vDI488gsceewyPPfYYRkdH7+s+/SzH6uqqSumQOQav14ulpSVV45vf\n7xdDwg3DUuzFixel4sWEGrWfyRWrLMlSfZEyxjygR0dHQlre3d0tSU6gXS24efMmotEoVldXVWyD\ny8vL6OnpEcE1ZRmZHMTFYlGM2+npqSgtarVa5PN52TQkJKcuOY0bUdU0oKlUSlzgM2fOiOwIQ01S\nT5DugjI0bDRk4pJaWR0dHRKOxONxmbfV1VXBlExNTUm/FiWCmXxmS4sSAQu0jSXJq+r1OqrVqiRX\nV1ZWMD09DZ/Ph2QyKe9KxDVLxWtrayrM1p07d8S4rK+vi0E6f/68lIGZhwHu9YUdHBzAZDKpKonU\nMdve3obFYpGw+datWyL1Q1yXUlEzFouhXq/j4OBA8FcMHU9OTkTokPnCfD4v+1apD0/uZh50ZTjE\nsI/5Ggoh8t/Z9rG8vCy5Rmp4dXR0IBKJoKOjQyqZBoMBGxsboifP/dPf3y+tE8PDwwgEAjLfyrX8\nqHFfozM/P48PPvgA77zzDn7/938fy8vLGB8fx0svvXS/j/5MhsFgEBwDJ/3KlSviSVAz6BOf+ARq\ntZrkTRjX8rBubW1hYmICy8vLYkQ3NzcxPT2NWq2GH/zgB5iampLFpM4zb1zmdBYWFhAKhbC7u4u+\nvj7UajXZNLOzsxgbG5McBblVmPxLp9OS0+Et39HRgaOjI5HW5a3R29uLvb09lEol2fzcACQEZwc9\n54fvPz09jfX1dczPz0tpfnd3V7AzVFD48Q3eaDQwOjoqmJtarSZ0GEajEXNzc3LgqG/FvjJiZJLJ\nJAqFArRarWxUJlGJcZqbm8PU1JR4GZlMRvJXLpcLW1tbMqeUFabIH4Fv7LyvVCp4/fXX8fzzz4vH\nt76+LuocTqcTtVpNDjDL4uzappF3OBy4evUqzp49i52dHYTDYVVX9sbGhmhWLSwsAGhTghCMms1m\n8elPf1r0zMLhMIaGhkSgkQnm5eVlOJ1O3LhxQzxTejR9fX3SNEyPjHuYFx+FDpl3I1k9L02z2SzG\ngN6e1+sV9VGgfZmwYrm1tQWn0ynnxel0SgFAmXczGo24du0ahoaGsLS0hLm5OclfPfnkk/hp475G\nh1gNumU+n084a34egzy3AESWNh6PQ6PRYHR0VJC0TJqyOZMb2uPxwGazSTfvo48+KoeKOBSHw4FY\nLCbytQBEfpi4HN5gPp8PVqsVo6OjcLlc0Ov1cnjL5TI2NzcFcDU1NQXgHrUn+5QIFgQgyFzSbNBI\n2O12QZSazWYVx+3KyopU6Gw2m3yGCdRr165hZGREqhBAe127u7vF01MCB1m5CwaDknwF2qHNpUuX\nxCiyMgW0vc7Dw0OpGimF+1hZ297extTUlISFRqNRSM8oowy0k5fj4+OqMjEPKQF27Oqnp+Xz+YSu\n5LHHHpMiAd+HcsNA29AwoZ5KpWA0GuF2u8UTAiCXh9lsFikXfqbVaqGvrw92u13kpfncer0eu7u7\nmJiYwNHRkYAQR0dHcfPmTUxOTopsNNCurJ2cnCAcDsPr9aJaraq8rVwuhzNnzmBtbU3OXTgclgIJ\nk+Lc3+wzzOVyiMfjWFpakjUiMTuNCr0hVrJu3LghlSxl3paUtoFAQC6MRCIharrlchnPPPOMVPc4\nzx837mt07HY7xsfH8Xu/93v4rd/6rfvKS/ysB4Xu+e/UJPL7/cI4B7QtNGPfXC4noU2z2UQikZCS\n8NramngzJM7a2dlBrVZDMBgUfAhzQbFYDB6PR5XTabVagm9QNpdSD6lWqyEcDosxIjE743IaBwCi\n203dKlZGiI9h/KxsWiQamDK7nANWi7q7u7G/vy+sfkD7JmdRQKvVysEH2pUgs9msIhAHILkSgvpW\nVlbkwOl0OnR2dgquQ6ma2mq1sL+/j2g0irW1NTGW7GavVCqSNwDam3xhYQHhcBiDg4MqThir1arq\ntqch2N/fFyL9ZrOJvr4+ucmpk0WPRpm/olwLK170Eqk9RiBpKBSSCijlgBuNBjKZjISlBGIS8gDc\nA7Bubm4iFouhWq1KoysAUSM1mUw4ODiATqeTw8vv2t3dlXwe32dzc1OI7QuFgorBkSobW1tbYiwA\niNxPR0eHaKoBEOoK8vYwhcDPBAIBQVFzTrl25Il6++23Zd8x5/px477Vq+9973t47LHH8Dd/8zf4\n9V//dfzxH/8xXn/99ft97OF4OB6Oh+Mjx309nc9+9rP47Gc/i6WlJbzyyiv4q7/6K3zrW99SxXf/\nk4NC70A7FDGbzSLLcnBwIPH1k08+KXSmGo1GhQxltcntdmNzc1Nuy1wuJxWtVCqF27dvy63Dnp56\nvY7d3V1xdd9//3309/cLERS9IQCqbH8ikVBJ09hsNsFsKCH21GYnkpc3MknFqK2USCTEPbbZbPB4\nPDCZTKIvBbS9vUajIXmUvb09FYqZEHmDwYC1tTXxBk9OTqTXq9VqyQ1fq9UwPz8vodzGxoZw9/h8\nPsGp1Ot1FZ9vNpuVZClpJAAIb9Hm5ia6urpU2BAmVslBzfwVe8TIH6S8VXmzX79+HW63W37n8PAQ\nVqsVlUoFXV1dWF9fl78LhUKoVCrIZDLo6uqS9Q6Hw7h16xbcbjeKxSK8Xq8UCKj9TloUotOXl5eF\nqmNpaUn68QBIgrlQKPwElerh4SHW19fh8XikX5Ajm81KCwUrVERcVyoVVCoVqXYCbc/K6XSqcmfk\n3x4aGhJGTKL4gXZutFqtYnJyUpgk6XUODg5Kfo8tLkDbi19cXEQkEhHMmRJT9tPGfY3Or/7qr+Lm\nzZvo6+vD448/ju985zvC+/rzGErwHQmeWG7t7u4WYNX29jaKxaLA1+l+plIp6U25ffs2otGoTD6N\nlMlkwtTUFILBIK5duwagDdSiQTg4OJCD6PF4cObMGdy9e1fg/kxmNxoNvPrqq/jMZz4jmlpAO8Rb\nWVnB6OgozGYzlpaWpKy5tLSEYDCIzc1NaZMA7vWMsRO4WCzKJnQ6nXjvvfcQDoel4x1oJ6xv374t\nYWYoFJIqUDQaxc7ODkKhEAqFArq7uyXhqNPpkM1mkc/n4XK5pEqWyWQwPj6OQqEgCUs2xJLwnmBS\nhhWszJ2cnGB7exulUkmqJpubm+jv78fMzAzS6bRs2rGxMVX5VafTyTzwADC0vnHjBgBIPo2Qhmq1\nKgeH9KZEz5ZKJQkzd3Z2hI2xVCqJ4dvb24Pb7Uar1YLVasXOzo4gttPpNDQajYRfygZfMvkROKjk\nLk6lUohEIohGoxI2r62tobu7W/JX6XRa+LL5LAcHByqZmWg0ilarJX145BcC2safyGPuBRqB3d1d\nRKNRdHR0YGNjQ1WNYy6SXePM6bDyyKIDL8G1tTVEIhHRvnI6nQKT+G/3Xv3hH/4hpqenVdpMP89B\nOVegbVgajQaOjo5gt9uFyR64l2zLZrOCEAUgpViPxyNduPR0bDYbvF4vms2mIIKZ0zAYDMjlcgIh\nZ/y6vr6OVCoFvV4Pp9MplR0AwgJHZDNzOqOjo0JQXq/XcebMGTlwZNePRqOo1WqSM2FvjtVqxenp\nKTo7O8VQaTQaeDwexGIxaR8AIFy8VGxsNptSBbLb7RgdHRVycYPBIO/KbnCKuXGQjsNkMskB5oam\n/C5Z8VgyZzL++PgYHo8HDodDno/JYkr7KkmseFkw96Ck3GS+jngTALIHstksbDYburq6VB31pAIl\nr7Ky+Van0yEcDqNer8veMhgMWFhYEDbBrq4uwWxZLBbJsSlpUa1WqyjLulwu2Gw2VeuLz+dDo9HA\nzs6O9EMNDAxITqvVamFoaEiVJ2MOi3zSXFeTyYRmswmfzyfQD+4TXjDsBaNxMRqN6OrqkmdhtGKz\n2QTPxQIM55vCAVxbeuSUaiaDZCaTkd+5H6TmvkZncnISf/3Xf4233noLQDts+Z3f+Z2fG1bHbDbL\ni7vdbthsNlE6YEUDgFhd9szQEIRCIVUn98jIiNzKu7u7wtcbjUaFHwdoTzLZ75WueygUgkajwdjY\nmOhRE3MTiUTQbDbFpecNr9frJcms0WhESQK4h9tgMo/zzKrV4eEhgsEgBgYG5CIoFouYmJgQl5rh\nnc/nQyqVEpWBUqkkiUB6KkxaK6szjUYDLpdLtMSVRozVFovFgrGxMZXWO6tuTqdTDjXVSDUaDSqV\niqopl5xHoVBIhYMhTsdoNArxPg82y/vshmb4EgqFUK/XpaeOXMBAG1NSr9fR2dkJh8OBTCYja0SP\nSq/Xi/wy0DZin/70p8ULUOqPu1wuaeZNpVIS7pdKJWE2VHI08Z2ItVJ2fsdiMeRyOVGPdblc4j3a\nbDbBCClxOt3d3aL+SuZA7m8ade6xjY0NFc/N3bt3BdBHg83fJ90sK7VAOzLo7OyU8FBJbcsql9ls\nRiQSkRBPSZb/UeO+RudrX/sams0mvv71r6PVauE73/kOvva1r+Hv//7v7/fRn8lQqhUC7Ze/c+cO\nurq6kEgkJPQaGxtDrVbD3NwcAoGAHLaFhQXYbDYsLS1henoaN27cEHewVqsJ2vjtt9/G5OSkhErU\n1iaVKDfV6uoqRkdH8f7772NoaAgul0sO/SuvvAKfzydSrUocDMM8lpLpShuNRkHN7u/vywI2Gg3p\n/cpms7hz5454GeSIoQyusveKZOTLy8vY2tpS3VR7e3swmUxSweKmbrVauHv3LsxmMy5evCh5Dj4r\nQYfXrl2T5k16GKS4YPWDmBqdTodYLIY7d+7IQcxmsxgZGcHVq1dViO3Dw0Ncv34dPT09CIfD2N/f\nlxCYgE1SeCgpHfb397G7u4tkMompqSlZ142NDej1emQyGYRCIeEV5m9lMhlp1mXY7PV68dJLL+Hc\nuXMCvlNqrc/NzQlAkF7GW2+9hZmZGRwfH0u1kHCMZDKJeDyOSqWCbDYrhorhbrFYhFarxerqqhjY\nSqWC3d1d0bFniFkoFERn7c6dOypytp2dHSHwok4ZvVXmPUnDQlAkVUmpJuL1euVdQ6GQgEdTqZQY\nMOYXCT2Zm5uTnBcbVj9u3NfoXL16VQBOAPD000+LW//zGGTAA9oTXCgUcO7cOWxubuKJJ55QkSY5\nHA7Rd+Izezwe7O7uClHW9PS0iIQxORwKhfDcc8/BZrOJdvPExITqpqQxYhh09uxZ6ZqmQRoaGkKx\nWJTbl5vGYDDg7NmzqsSvMv8wNjaG1dVV9Pb2iqEi0bjD4YDFYhG3G2hvTnp7drtd1Un+7rvvSqji\n8XjkM5lMBh0dHejp6ZFEvBJJSi6eSqUiiWk2fJIkPBaLqYi/ZmdnEYvFkEwmZY1qtRocDgfcbjf2\n9vYwPDwshpQ5AtIkMEd1eHiIiYkJIdrv6uoSGILX6xX6BuJYgLbh7evrw97engDqCBz84IMPEI/H\nJURW8hEzgU7qEZa6m80mhoeH4XQ6pdObXlGlUsHFixfFS6QHyznZ3d0VWeJHHnlE5oHcSqVSSXIm\npVIJVqsVBoNBWBd53niJUSCAF6fH48H58+eFAIyJYT53LpeD1+sV7BN/6/j4GNPT00J9QRxTKpUS\n7BJ10en1ptNphMNhPPfcc8K9DEDyPFQZMZvNAi9RhuQfNe5bMtfr9eI9cJHu5z49HA/Hw/FwfNy4\nr/X4y7/8Szz11FNyc21ubuL//J//8zN/sJ82eBOQsd9ut0Oj0WBpaUnCr2q1iu3tbaF7VJYPC4WC\nitaBruTg4KBUCrLZrHDkAvdoJVdWVtDd3S2hzcbGBgYGBqSfKhKJqLSTKAHDRCrQvt1IHlWpVESg\nDbjHtUMgFm/kjo4OYfE7ODjA1atXhcwsHo/j2rVrCIfD8Pv9Et8vLS2JO2+322G32yUZylJnsViU\nsjirMysrK9JuoWRC3N/fR6VSkUT8wsKC/J3dbheQnd1uF6+J/VpGoxE+nw87OzviMTQaDYE9fPjh\nhxLanD17Vtog2P6hfAabzQa3260KbcjAeHh4iHw+j1AoJB4sQ1Z6BQxXAEg/W7Vahd/vlxxRMpmU\nMIONqrzldTqdUIMoL2SDwYBEIiFQicPDQ4FwsOwNtENO/s7u7i4ikQhsNhsymYyoOADt/B6Txvl8\nXuatXC7jnXfegdfrFTiBklDM7Xbjxo0bQrJFwKPD4cB//Md/4OLFizg6OpLc0eHhIbRaLe7evQuH\nw6HixiH6vVKpYG1tTbzHXC6HSqWCev3/Ye+7YiRLy7Of6uru6uqq6opdqXMOMz1hd2fDbIKFxUK2\nscUFGCwZgeUgS0j2XhjElcWFwRc2AiRf2RiuLH4JWbZZGRxYsNkwG2ZnJ3SO1aG6q7pyVVdX/i/K\nz9Pn4J0d//6NYaz5JMRqZiqd8533e8MTKggEAoKZAP8NI/MPfOADWF1dxcrKCiwWC2ZmZtRQ+1ks\nq9Uqvk8+n4fNZkMymUQ0GsXKyorKlGg0iqeeegrFYhF37txRYKG/0OHhoZrPTAspx0qjNI5XgTZB\nkkp5yWRSKSvZ2JlMRqNM43i+Wq3C5/OZBK/ojeX1euH1enHp0iV9P2rk9vX1wW63CwJA9C2bkW63\nWxsgmUzi+eeflw0OpxJ+vx8+n0/aMCMjI/o9oVAIx8fH8Hq9KBaLSKVSav5ub2/D4/Ggs7MTm5ub\nqtFPT09RKpUwMDAAu92Op59+Ws3snp4exGIxdHZ2YmRkRJrP1KGm8JXRwI7WtJubm7hy5YooDW63\nW9q8Jycn4pAB7VE2aRUUYwegIYLf78f73/9+vP3223rYNjY20Gg0MDMzg9u3b+Pxxx/Xgx0IBEwP\nOh/scDisBjZLCV47epiVSiXMzc1pInjt2jWVWvPz87BarXo/9kJIM2D5Qv4WcEYZ4XtkMhlUq1XZ\nw7DU9nq9mJychNPp1PSK+4fj+unpaYRCIbz11lt6v5OTE0xOTko/yWg3vLe3h2effVZNZX4/9upG\nR0cxNDSkqSQnejR0fPLJJ9W/4uF6t3XXoPOd73xHKnRG0S5G9o9+9KPv+cY/rWWcwBAoxzr53Llz\nwm14PB68/vrrgr8bFe7X19fV3BwaGtLN5Ci4VqvBYrEgkUgI+DU3NyfAWr1eF+Dq9PQUBwcHamxO\nTU3pAeF33N/fR6VS0cPLTIJSoTdu3NCNKpfL6O3txZ07d2C329UgnJ2dlQB9NpvF0dGRHtJ6vY6N\njQ34fD74/X5lDIVCAdvb22LPLy4u6tqxX9Pb2ys6BAmp2WxWHLORkRG9Xz6fl9AUG8nMqgYHB7Gx\nsaHxKev6WCyGdDqNk5MTHB4e4tKlS9pPR0dHcLlc0hvmRIdSo6FQSARWBhejGFu1WtV+dLlcGl//\nzd/8Dex2ux70np4eRKNRrK+vw+fz4e233xbW7OWXX0YkEtEDxKkN9wRdOg8ODnQv1tbWFIyYVQFn\nMh75fB7Xrl3DU089pUOQjVfSN5ihraysYGxsTMTfnZ0dvPLKKwCA97///ajVaiiVSvLLAtpZKn3m\n0+k0BgcHNWGkpxp5hM1mUweAz+dDpVLRPTGSddlLIlaIfUmjdnIqldL0iuoDe3t7GBkZwYsvvqhM\n7l7czLsGnb//+7/Xg/fKK6/gueeeAwC89NJLuHr16s8s6HR2dirVbrVaGBwclIj32tqaggtHwByx\n84ZlMhnY7Xa4XC7YbDaTIDmtdO12uxqs3DRk+larVQmNA+3siKUFSzVuzvn5eRwfH6NcLqOvr0/d\n/Xw+r9/Am8gG5ptvvol8Pi/sBR+cZDIpx4NGo4G5uTmTKDmzPloY88+tVqtwGMaMgZYo1BviteL3\n83g82N3d1ckJQEGKI/ZAICDwG9A+tYkt4cnL7KlWq2FiYsLkOmG32zE9PY29vT14vV5NqGg7Q6th\nZlDAmYUyG5j8fJZ2lBphoAXaQZQuoY1GwwS7oAlfsViEw+HQPjHy4/x+v2niRYIk7awZqMjDo+2z\ncW8R10TcEu/D7OysOHLUbOLhRBF8AJImAdrBmshjv98vnhw/p7OzE93d3SKFGr9ftVpVqc3rw6kW\nlQaMjWACRGlvzMUpKrFks7Oz2svGPfFu665B55vf/CYA4Pnnn8fi4qKkCuLxOD71qU+955sCwGc+\n8xm8+OKLCAaD6iOk02l8/OMfx87ODkZHR/F//s//UZD40pe+hG984xuwWq342te+hg996EPv+r6D\ng4NKCzmBIXPcOLmhBxEjMjMJo7e0kWkLnPlhkybh9XrxK7/yKwAgHWSPxyM2NQBNWCqVCkZHR00P\nz+bmJgKBAMbGxpDL5TQtoLzC8PAw3n77bTz88MM6waPRqMB8RiRuuVyWQ4Xf78ft27dN7O/5+Xl5\nYvM3RaNRPaSzs7Mm8KTb7cazzz6LWq2G4+NjnJ6eKhgw5Z+ampLkJa8ZNWdsNpt6Cnw/akczS+Br\nyP6nJxPvRTAYRDwex/z8PNLptITWcrkcgsGgSKBDQ0N6QDg9Gx8fx/Xr19WbmZ2d1SSQvSO+38jI\nCE5PTwUy3N7e1qFhsVjgcrng8XgwOjqqLKNYLGJwcFDfOxKJKFAMDg7Kx7y3t1dZC2Uy8vk8Ll68\nCIvFIppIR0eHxL1odQRAukTVahUejwcej8dE3kylUjq8+OfT09PS0DY6XfD6cJ5wtaAAACAASURB\nVP8QZc4AS/95QkiYkRDnk0gkEAwGTbbH/Lfs/fHZ44HNKeMTTzyhfc/rcbd1z+nV7u6uKfIRD3Ov\n9elPfxrf+973TH/25S9/Gc8//zxWV1fxgQ98AF/+8pcBtLEz3/72t7G4uIjvfe97+L3f+z1TVH2w\nHqwH63/Pumcj+YMf/CB+4Rd+AZ/85CfRarXw7W9/G88///w93/jpp59WE5Tr7/7u7/CjH/0IAPCp\nT30K73vf+/DlL38Zf/u3f4tPfOIT6OrqwujoKCYnJ/H6668L42BcpCfwv0OhEHp7eyWiRU5LPp+X\niPyNGzdMEbpQKKBYLMp6hVkGU3hyh3w+H1599VUAwK/92q+hUCigt7cXrVYL//Iv/wIA8q6mzAFw\nJtdIQiB9oogpoacVp1O5XM6EFKb0gN1u14SBFASn04nT01NEo1EFZovFoukWXR+B9il1fHyM+fl5\n7O/vI5PJKPWNx+M4Pj7GhQsXkEqlTFghkkQJ9ed3o+A6y5TV1VX1BcrlMo6OjkSGNJ7kpFrkcjk8\n9NBDwuNQaXBtbU2ZCtDOMhKJhO4lEc0ARKWgMLsRpMkSpFgsKgMD2v71k5OTkqPg/QcgYX+PxyN/\ncqBdasfjcczMzODw8FAi9QDkX16pVEy9EQphAe0hwuDgoKZU+Xwe5XIZ6XQa6+vruHz5MoD2NDUQ\nCOj+Au3WBgD84i/+Ivr6+pDJZExEUPZWKL8xPDxsIr6ura3BYrHg7bfflnMncGZVdHh4KEkK4Iw4\nPTIygkwmo+ktACGX/X4/ksmkKgXu++PjY1QqFfzTP/2TCQH+Xuuemc7Xv/51/O7v/i5u3LiBmzdv\n4nd+53fw9a9//V4ve9d1dHSklC4UCmksR2U2rsHBQdWvP7n8fr8eMLfbrV4KCWlEXFK5vlKpCKmb\nTqdxdHSkKczx8TF2d3ext7eHvb09OTsYNW3GxsZUHqVSKbGoFxYWsLCwgHw+L8V91vQkzdlsNtED\nCPknH2ZnZ0fumvV6Xal1Pp/H4eEh/H6/SH5Wq1W2JiQlLi4uKqBNTU2JYZ3P55X2b21tYW5uTiRE\noF3ysewj4Ky7uxs9PT0IBAIIBAJqeBJSz+/A90ilUuju7obT6dT1ZolCrRq+hrQI9lSWlpbk2uHz\n+WR9Y2y+U5+4t7dX35Nk0pOTExwcHJisgYH2Q8AHs7e3V7Kg2WxWJUJPTw9GRkYwPj6u6x2NRmG1\nWuUsQYEt7gM24jmhzGQy8Pl8iMViIjvyu1mtVqTTaaRSKZFFqXBIWxe73Y5gMKi9QE0aNu47Ojpw\n+fJlXL58GeVyGaurqzpUeH8oo0pKjs1m0x6uVCrqo7ElwnvR39+PlZUVkzMncGZUSFsbAh4JOE0m\nk9jc3FSJz5E/QZMEQZLa8/9Ng7BYLPjoRz/63944psD4e/39uy2S7YB2f2ZiYkISmnSKBNoZw9HR\nkRjoRhsOuhOyMUuiY0dHhy56MpnE2NiYIv5TTz0F4Ix/xNOfSn1UIywUCno4R0ZGNHVgzQ5AchrU\nsqX2MtDucxB3xIYu0G6a82Hq6OjAxYsXdSrzZOfYmCNzyjZQKIwnEd/P6XSiWq2qPmfTenBwEM1m\nU5vMaNBHXyTgjMwJtA8UMqvZWAcg9nQymZSgutHTnbAAEhQBSLoimUzi4sWLWF9fF15qf38f4+Pj\nCmbM9jhaZq+FfmhA+1AbHR1FT08PgsEgFhcXdS14rTlG5jUgedTpdKK3txeZTEb3gr1ASpQQk1Sv\n1xGJRIQHMqob8IBwOp3CbfEeEXtUq9V0kALtA9Zms6FarQqqwetOy2NmxGwWA2eyJRaLRcMFoH1Y\n0O6IDX/uYfq/pVIpKUYCEBnYarVKioTXh1k5JXaZOd3LAfieQec73/kOPv/5z5vGaHwg/l9XKBRS\nYzcejysiDwwMqAEMtDe3MRIb14svvqibT9W5oaEhKdMREJbL5STPsLe3JyxFtVrF3t6e1NVoKAdA\nTpOnp6dwOp1oNBoqmWgX293djaOjI43My+Wy4OE2m830vZeWluS4QBoD0AZWceLE0oudf0qOrq6u\nCvsCtPEjW1tbGBkZQSKRkCg40J7UjY6OqtHNkuzk5ASrq6vi5rRaLTWf6ewwMzODW7duwePxiNqR\ny+XEyqZKHz+nq6tLXkjb29sqW8vlssBjRlBjsVhELBaTM8Hjjz+u99vZ2YHdbkcmk1HWAJzZ6fr9\nfmVlxgkjT3n6NwHt4EaKCIO60X2U4DZq/fLvbt68KbDn9va2Dru1tTVUKhVlScaATXwTNZI4VOA0\niwDOaDSqAEIwKr3h+fnE0VDzZ2lpSXgXOqoCkOwEAGWSqVQKzWbTNHDg82Oz2XBwcCDuG9B+/jwe\nD7a3t5HNZoVPY/DioZVKpUyUGI/HI94YqxNSOpaXl9Hf34/vf//7+jujdfS7rXsGnT/8wz/Ed7/7\nXQHR/n/WRz7yEXzrW9/C5z73OXzrW9+SWdxHPvIRfPKTn8QLL7yA/f19rK2t3VWzZ3BwUI1tngDx\neBzFYhEbGxvCJFDkaX9/X4hSoF3fd3R0SJJ0dHRUD3az2cSjjz4q4zZq8QLtHggdHzhi5Xfwer24\nfv26ghwj/ebmJg4ODvDwww+j0Wjg9u3bANon/NLSElwuF4rFIjKZjLhhLPPYR2A5Su3co6MjFAoF\n2dsA7aD9gx/8AOFwGMPDw8IWcXTd19enoEmb5MceewyxWAxdXV0KujzdOjs7cXx8jEQiISAc0O7B\nWK1WTU1OT09NyFWKUPEBAyA9Hlrt3LhxQ9loIpHAuXPnJPfKh2N8fFw2KpFIBDdu3BCnrtlsYnd3\nF16vVxkU0H4wKFh+eHiI+fl5XYd0Oq1AGg6H8dJLL6kPEwwGBY3o7e1VBsvxO2UejFbA3d3duHnz\npjzfeV8ZyFma1Wo14cYcDgd6enokf8rrVi6XFVhpIshATuR6JBJRCQS0s73l5WWVrPF43OQD39XV\nhdXVVUxPT2NjY0Ok3I2NDWQyGakfsOdaLpelQ7S0tIRIJKLnhb9xcXHRpESQSqWwuLgonXKjXMjY\n2JgO/3db9ww64XD4vxRwPvGJT+BHP/oRjo+PMTQ0hC9+8Yv4/Oc/j4997GP4y7/8S43MgTae5WMf\n+5h8qv/8z//8ruXV/Py8ycje5/PJsjWTyejiU1jr0Ucfxfr6uiJ3OBwWBoTSCfy7gYEB9PX1YWxs\nDFtbW8IzAJBgUaPRQDgcVjQnHGBqakreS0Y5jMPDQyF+STMgUZGoZ5fLZfJbajabmJyclK4MAPVU\nOGp/5plnTCLr4+PjuHLlCur1ujZGoVDAww8/DKC9EZaXl5WJUT+HGs7ValU9gP39fYRCIYHeOF6m\nZAVPWqNHk8vlQiwW04Y22gQRcEkiIkfZzDiIAuem9fl8Co7RaBTZbFYP4u7urvoaRmoALXl5MOTz\neTVr2QPKZDIIBAJ44oknFMzZaG02mxgeHsbq6ioASJ+JMAEjarleryMcDstNhFlGLBbD6OioNICs\nVquyIJ/Ph46ODrG2mTl5vV40Gg0EAgGUSiVcvHhR2Rt7QL29vTg5OVGmTC814EydkgcGy1l+76Gh\nIfVYzp07h3/7t39DrVYTHIB7i7+rv78f/f39un8kfDIAG3V7CLrt6OjA008//d9Hg3jkkUfw8Y9/\nHL/6q7+qU599nvdaf/3Xf/2uf343feUvfOEL+MIXvnCvr/NgPVgP1n2+7jm9yuVysNvt+Md//Ed8\n97vfxXe/+12N9H4Wi17ZbJienJzAarUin8/LN5z9p0ajgR/+8IeaJtH76OTkRKCsfD4v0aednR2N\nBY+OjpRWU2qSo2wApqkNjepjsZjJaysWi6nxTEcEjqdnZmbUyGZmwIYum4rValVTBE6zqPW7uLiI\nWq0mQCNLzkwmg+vXr+P69et6H/4GTueazSZ8Pp9G0vw3nHpFIhGVGePj43JOdblcyGQyKBQKGBkZ\nUQYyNDSEnp4ePPvss+oLsHE6MTGh6c7ExASSySRisRhisZhKRk7dVldXsbq6Kp4Tm6Uej0f3nNM0\nlhZsZFJ5sLOzU1pAa2trGh+z0c7pn9PplNIfNYGTyaTuHZutd+7cQbPZRCQSUeY7MTGBWq2mcpAr\nGAxiY2MDxWIRkUhEEhuccIVCIRSLRRweHiISiSASiciwjgRlllHMJLLZrDIpt9stkOry8rImdUZ4\ngNPplMQG6Tr8rVarVQJxbHSzkU+UPa8NJ3Vzc3NYXV3VYIHXYGpqCtFoVLIazN4ajcY9uZn3zHSI\nTP55WdQHBtolTzAYRLValZQifzCN5/v6+tR9B87kFxuNBnp6esREB87QqcbpAR9mi8WCXC6HXC6H\ngYEBpbM2m00purF0AyAuUKVSMTUi6eLZ19eHVqtlohpws7Epyf4HX+NyuZDL5XD58mVpzHA6R6wH\n+xXG39HV1aURNL8b5TNrtRpGRkaUOpdKJTidTsEDuPh7OFKmZQqvD5viHo9HD6TT6URnZyey2azK\nS/6mQqEgy2E2wQHIJoXBIpVK6Tf19PSgq6tLGB+WdwyctVpN/RMj5ob0CPa22JNjiepwOGC1WlWa\ncozOfqDRj4qvZdnIa1AulzVBKxQKgkTw70jdsFgseg2pPOzfGdHclFnN5XIStgfaZVBvb69sj4kf\nA84a1m63W+UdfyNLNJfLZaLisGziQdFsNjU0KhaL8Pl8Uj1gW4F4N+5dI/bpXsDeuwadP/mTP8Hn\nPvc5fPazn/0Pf2exWPC1r33tPd/4p7WMfBZOO1KpFJLJpJTtAIh4R8wJpTkI9z46OtIkjQ98oVBA\nrVYTyC2dTqvZxh5Af38/NjY2TFILc3NzOq1CoZDJKWN5eRkLCwsIBoO6Gfv7+7h9+zYee+wxqfRx\nqkSRKTa32aQ0KrbVajX88z//syD2o6Oj2Nzc1AieE7eLFy/irbfegtVqlVoc348uGgQ7NhoNEUgp\nBUFgGHsCBFyenp5iZ2dH4DgAstGtVqtikwPtngBdBLa3t6WqB7T7M+zjFYtF3TtitgqFAjKZDE5O\nTgR4TKfTer/d3V1tdPa/SqUSTk9PtSf4d5zCORwOLC0t6XrW63VkMhlYLBZUKhU1eEks5u9lg5jX\nIZvNSgqWk1wGYT7ERngAPyMcDgu/A0BZ2f7+PtxuN27fvi14AF9P33TuK7fbLcJrPp83BVGSfre2\ntjA8PCxwJgA5OhweHuq+cQ+TFEuQJw8gBmsGV96Hw8NDBff19XWcnJwoKFLv+27rrkGnWq3i9ddf\nl2Ie10+yzv+n19DQkB546stYLBZ4PB4EAgE9OESQUkOWp77RlpgYHco2zs3NyeImm81K7BuAiI5s\n1DHbIuN7ZGQETqcT0WhUp87IyAjcbrf+DScwdGC0WCxyd+S0gMptnBqxecg/J0fqwoULJnpKd3c3\ngsGgpjpA+wE9f/48Ojo60NfXh52dHTUg2QT0er3o6urC4uKiAivxTUZjPV4Dqhc2m02MjY2peehy\nufDyyy/jqaeekgIdcJZxEjUeDAb1vXd3d6Vp5Pf7dX0IoKQYeDgcNgWx2dlZAeSMvu3EvJBdzUYy\ntaap7UNZCN6//v5+lSlGJcJgMGhy4zCixjmeN5J/l5aWMDMzI/2garWq7I6TSo72GSSGh4elwdzZ\n2SlDPgDKcIijYXbU398v5UCr1SoBe+4TZkB2ux19fX3K0AYHB/X7jE6wlIQlo99ms+k1R0dHCAaD\nsFqt0sDm3qLtkMvlQk9Pj549I5/x3dZdg042m8Xv//7vY2lpCQsLC3jyySdx9epVPPnkk/ecw/80\nl9Vq1UNg1AgGoF4FAMH6aSjPf9NqtWC1WpV+Gun6mUxGgufRaBThcFjSCSxPcrkchoaGlH7SeSCR\nSEhGg0GNXln9/f0mMGSz2YTD4RC5NBQKaQPwvxmYuKF7e3sxMTEhv/KZmRk9EHStJLKYG9BqtaJQ\nKKC/v18yIMxaPB4Pcrmc0K70zebfHR0dwev1qm4HoD4HxbiXlpZMejbPPPOMRNWMn8PeGXWMeC+G\nhoawsLCgiRFH3LOzs1hbW0N/fz+i0SgWFxcFKWi1WrDb7bpHnBSytCZ6mEhfoJ0djo+PK1M5PT1V\nUKQAPr8Tp3sU6qJtNTWUAQhf5Xa7UavVFEAWFhbgdDoFEmRpxOvT39+vz+PDW6vV4PV6JchvtCmm\n2wRH/fyt1CbmdKuvr89U5rrdbt0DyvICkCwqGfA8UIvFIrxeL5xOJ7a2tjAxMSGs0MjIiKAQ9Xrd\nJNlqt9t14OdyOQVLYuLutu4adP70T/8UQBu78eabb+LVV1/FX/3VX+G3f/u3TUCyB+vBerAerP+X\ndc9GMk3L2ESNRqM/U2F2ozvi22+/rXSWVH0jdoXAr1wuZzrJGP1JKeAJlkwmMTQ0JInRRqOhfk93\ndzdyuRzGx8eRTCZ1ip6cnAhRS8Mxpvxra2tKP0dGRlTr0kSPZoDGhi1PQMLYmbmRO0TsT6VSEd4l\nnU5jeHjY5PwIwGQXQ2IeS5tisaiUmXgnIzKblAVSKPjdWMuXSiW4XC7hgNbW1lQ+0dUAOCslmfXN\nzs6amurpdBrZbFb2PkC7HLLZbBgcHMTy8jLK5bKyCb/fj1wuh0qlgmKxqPva0dEh0i194In7ef31\n11Gv19WA/+EPf6jfxKlkX1+fTnOgve9TqZQwMJ2dnaZeBTV29vb28MwzzwBo99/YAO/s7JTMBvcJ\nveaLxaKydTZ0/X6/hiHM+BYWFjS9a7VaypqYwVosFg0EmPW3Wi0hvUulEsLhsH4Tm8Is59gjouYO\ny1K2G4A2YjscDmNmZgZbW1vKhjm1PTk5QalUQiaTUV/SyC54t3XXoPNbv/Vbsmt59NFHcfXqVbzw\nwgt6QH9WK51O62IVCgUhOZvNJm7fvq2/6+zsVAPQ6/Wq2Uc3xN3dXXg8HpH0AAiKf3BwIFsOIkoH\nBgZwfHwsOUfeSKvVikQiIV7SwMCAHh5qD1MzmOUVrUGuXLmiZich6UR+NhoNpNNpyUOS39Lb2wur\n1SpnSKDd1ONG4uuA9oNot9tRq9VkI8KyYmBgQHwolk3sH62trcHtdmszMd0/OTlRE5MNVrLwbTYb\n6vW69GTIrqap2/r6upjZTNFJdzg+Ppa+Ea9bNpvF6uqq/MTY00kkEjIcNLp4kjfEMTP5UgAEh7Ba\nrVhcXITb7VZ5DLQDzPHxsYwYgTOdpFKpJPIoP4vwA9pSs6ygvhN7MeFwWEMP+n4Vi0XUajWTnU08\nHkcgEMDh4SFOT09NDdl8Po9msykyKgARg40kY95zTqByuRz6+vqQTqcVmIkg5/7lNejr68PR0ZH0\nkNmC4GdR/7i7u1v3NZVKodVqoVAo6KDm0IUg07utuwadWCyGSqWCqakpDAwMYGBg4J4Nov+J1d/f\nb0JmhsNhJBIJmcyx7GMjmQ8BTwKe3pS0yOfzOv0rlQqq1SpmZmYQj8fR0dGBJ554AsCZsHY0GhUm\niMvpdErXmOhRoB342BeJRqOmk/Ly5csoFouIRqPw+Xz6u76+Pn2WxWJRNpNIJGCz2dQbevrpp3Wy\nEHXKrIjXhycumeOED/C3+nw+OUDyNAUgE71oNAq3261sjw3kUCiE7e1tTE9Pm05L4mi8Xq8JUmCx\nWDA2NoZms4mJiQm9hr+tv78fwWBQf85mOT3DjA6Wfr9ffuhdXV0acXd0dMDn80lhka6nfM3ov9so\nRyIRrK2t6UGkOuPExITE1oEzsTfCDdg74W8iqdXooElKDBvgRplVenSxv8h7xQlhrVaDz+dTbxBo\nZ6rcO9ls1uTx5XQ6JSrPng/QztzsdjtyuRwajYbIoUC7X0hSqzHbJIyA+snE9ACQ1xrQHq3zezud\nTvh8PsnTsmFu3H93W3cNOt///vfRbDZx584dvPrqq/izP/szGaU9/vjj+OIXv/ieb/zTXLwpVK7j\nKJJAP6C9CZPJpE4kpqZHR0ewWq0C35G7ArRvMoXMKcfJkwpon34rKyuSi+B3obNCPp9HKBTSRqMx\nvdfrxZtvvqnpjNVqxa1btzA0NCSJCD4g1OLldIm/xzg1s9lsiMfjOsmNZEmj0wFLjkwmA7/fj0Qi\noabtwsKCGorpdFqWssBZo7RSqQiExzU+Pi6XyFu3bql8YMaUzWbRarWUhbE84Eh1Y2ND12FlZUXN\nVeNol9o3LpcLFy5cUJkAnI3MAZjgAWzIs1FtPP2NcAOaD3KxKZ3L5eB0OpXN8NrXajXRPniPisUi\n9vf3MTk5KSkSXgNOh6grZDxMstksLl++jEQioaz38PBQVBhOnBgQQ6EQ9vf3NaE1lt6UjDV+H6B9\nOLJ0o9c5J5bk7lF+xOicQpXBzs5ODA8P69oNDQ0hGo0KnmDMUsmypy4zX3OvTOc9EckdHR1YWFjA\nhz/8YXz4wx/Gk08+ifX1dXz1q199zzf9aS5mOhz5pVIp7O7uoqOjA7FYDLu7u9jd3UWtVsPU1BS2\ntrbERmfHneNJduWpeULBdoLceAo6nU7s7u7q4cvlctIoicfjODw8RCKR0EZNJBLaWByrUtz74OBA\nZEA6KhL41Wg00NHRoQDDVJkTsKOjI+RyOTSbTQlSkaFOxwCWK5x8MSDywebv4aalCD2nckNDQ0JG\nE7FKtDRLAQLfWq2WNF7sdruyNr/fL0RrZ2cnDg8PpU18dHQkJDXHvfl8XvABnsBEXvOEJ5J6d3dX\nejWxWAxzc3OYm5uTQ6jD4VDpQAQ4keQMCsSd1Go1zM/P68+J9anVarIh3traQi6XQygUwtLSEpaW\nllTuJRIJnJ6eSkeGmJ+TkxNhiZiZnpycYGpqSkZ3DBx83fHxscl8kMhjoB1Qqc1ELtbR0RGi0Sha\nrZYE58jvMgrpJ5NJ7Tv2a4gqphsJp4ssnVOpFPL5vHBZr732Gmw2m+Q1kskkRkdH5TpLyVbev/+y\nns5Xv/pVvPLKK3j11VfR2dmpcflv/uZvym/pZ7FKpZLJWiQcDmNsbEw6JEYyYXd3t1JKnhInJycC\nBJZKJRHygHYqHYlEcHJygu7ubmUUAPDEE08gn8+jp6fH1P+YmJjAyckJBgcH5TPOU4ylHrV7mIYn\nk0m5FUQiEdjtdp06RK1SE4UlVKPRQCgUktZPIpHQfRgdHRVimT7WAJRGE3lMEBrQ7iERx0QahlGT\nxe/3C63Mk5Oj9JmZGYlFMdOYnZ3FG2+8Ib8n9ryCwSAmJyclqGbUn/H7/Wi1WrofzNCoDuj3+wXG\nZOOeOCs6htKWd3R0VBldKpUy+ZIfHh5KVzgWi5mg+t3d3WJVd3V1qaxwu90aNnD8zBLd7/dLpN6o\nB+z1eoWpobIjQals5FOzyaguSTH0np4ek0oi5SYACOnM/3Y4HNLdZkDmPSIymzQYls3ZbBYLCwtw\nOByylOZ3oG735OSkSj2gna339PTIU509Hdr9WCwWZbn8TSzH7rbuGnS2t7fxsY99DF/5ylfuyRp9\nsB6sB+vB+s+uuwadr3zlK/+T3+M/vQgLB9q1I43hUqmUYORAOwPhxCGRSCg7qlarODg4EIS7UCio\njnc4HIjH4xgdHUUoFMLW1pYalbu7u4hGo5Id5QmUy+UQiUQQi8Xw6KOPolAomIzUOP1gyQa0+wix\nWAzz8/Mqy5hlsCfg8XhQKBREhxgbG8Pu7q74NFT9B9o1PV08Kd3KP4/H4+ju7sbc3JzSeQDKlthA\n5gSJr6P7ZiAQUO+I2sc7Ozvo7+/H8fGxSVwrlUrhscce06QKaGsKxeNx9PX1qT/C3tH6+rroE3t7\ne2pGkrpBSRDgzO8qHo9L7ZCyo0B7kkkSq81mwxtvvKGJ4ODgINbW1iSpurGxYerPUDtnfHxcmc6t\nW7c0dazX64jFYiblvng8rhKM95UUHY6efT6femicOJF2YtS+JgQhGAxie3tb167Vaqm/RtEyoJ2F\n8b6wdDaipa1WK5LJJGZnZ8Wh4/PyD//wDyL+MiPp7OyUVs7e3p4JTFuv16WISZlaoD1ljUajGnyU\nSiVNr7iH77buyTL/eVxkhVOoiLiS/f19nDt3DufOnVNj1eVy6WHp6enRNKZUKmF/fx8HBweqr2u1\nmlCcS0tLQh63Wi3hNOiGQSYwewB2ux17e3soFotioO/s7EjBzWKx6N/GYjEFJI5Y2XMaGRkR34n4\nCVq+Uo9lamoKtVoNW1tb2Nraws7Ojjg1lNmkLbLT6cTc3BzK5TICgQDW19exvr6ugEIfLV4bt9st\nB0myylmr5/N5pFIpOBwOFAoFjI2N6fp0dXXB5/PhpZdeks3L9va2aDOHh4fweDxwu93qc5CnxilP\nPB5HPB4XYZITH/aRCoWCYPq9vb1IJpPS7KUdM7l1IyMj6uncuHFDfbXT01M9zPl83kQubTQa+m7j\n4+NSkKzVamKwc39QNpeHWiKRUA+LhxMnQU6nU5AA7jUGG5Y6XV1d4qyxJ2ez2XD58mXhwNhHLJVK\nuHHjBur1OoLBoAITm+SDg4Po6OhQr4g9HBJ1BwYGFGhKpZLgFCyl2I+yWq2i5CSTSR00VE4EoADq\n8XjEnDdyD99t3RMc+PO2jo+PBUhzu93CqPAhJSjtkUcekQ8Rhb6B9mlE8zD2btjn4IailarRVcDj\n8QgLYpTw5AneaDQwPDysiQ8APP7447h165Ysc3l6AJCxm9VqxdjYmE7/o6MjOJ1O5HI50xQBgOyJ\nV1ZWTPq7hLTzVOO0pre3V+8ViUSwvLysyUIwGJSUKUmuRnE0Gheenp6q9nc6ncL+8Lsy23K5XCgU\nClhYWMD+/r5+ayAQQC6Xw8TEhLhcBO2lUik8/vjjuHbtmknnlxQC8ubGx8d1Hfb397GwsIDOzk6E\nQiG9hv07q9UKn8+HeDyu60CWu8fjUXZGgGsgEMDq6qoE4LkqlQomJyfF2zKCJPkdGeTofkDf8Fgs\npr4XF91SXS4Xtra2TGNl4lwCgYBJF7tUKumBNqorOBwOzMzMoFarwWaz6JIDegAAIABJREFUmXzB\n6GXOgBaJRLRXu7q6NOI2SmIEg0GsrKzg0qVLMl80gmxzuRwWFhZQqVS0fxiQ8/m8hMvYS/wv0yB+\nXldfX58uPlPLfD6PYrGIhx9+WCJh/f392N/fx+npqVCUQLscos4Ioz7LNTomjoyMYGtrSy4OQBvz\nQjtdliEAlDEQzDY2NqZIf+vWLTidTtmisCEbDoexsrKitDgej+tBpjQBvxPT/Yceeghra2tKdfkw\nA5CKHvViuMkODg7UmCyXy7oevI7ValUAymQyaWJL86S8cOGCXsNMMJlMSlKEG5eaQ8b7BJwxjjlB\nYZAG2tNRXiM+CEC7eXnt2jUsLCxgdHQUe3t7asjm83mN+VdXVzUIoIc7HTaNTqLMEpgJjo6O6jet\nrq5qSkPJDOO9zWazys4YDE5PT3Hz5k3Mzc2ZrncqlUJHR4f0aKLRqJrmnNCNjIxIJ4h7mPgu2uMY\nveg3NjbwzDPPmMCgQ0NDAhJubm5iampKAw/KfTCrMV4HcvN44HJvLS8vw+Fw4Mc//rGyXwYdlrK0\n52Fw29vbw8zMDFwuF3Z3d1Gv18XXOnfuHN5r3XdBx+126+bztAmHw7BYLMhkMoqyNptNbN6JiQkT\nQ9fr9eqkTCQSOnWoyeJwOCREzemE1WrF/Py8fJJ48b1eL4LBILq6ujA5OYnT01NhGXK5HEqlEmZn\nZ/HjH//YpKTvcDhgt9sxOjqKiYkJnYq0IWF6z/4MiZm88UZZ1J+0euHkgaUNR+7Dw8PK+FgadnZ2\nwuFwYGpqymS1e3x8DL/fL9EsoJ3NsEwkYI1/5/V6ce7cORPIEGiflERVs89mJCBOTEzII54pO5nY\nHR0dKsGYtVCAyuv1Ynp6Wpgol8uFcrksLSDj1C0ajSKRSAj16/F4dI14OAHtqZDxmjqdTsRiMV0H\n3vOxsTGcnJzIDZP3lcRe/h2tffl3vb29AjTykKFDBIOacXpFhLnFYsH8/LwCPEm3JIp2dHSYgJCF\nQkGZ+eTkpD6LEAWyw3l9uOenpqZ04LAPFI1GBZmIx+PK6ghZcbvdsvExHmjvte67oEPJAAAyr9/d\n3cXw8DASiYRS5O3tbYG3Njc3TWN+Si0QsGYEi7lcLhwcHCCfzyMYDCqbIB+LY2jeyL6+PhQKBf0/\n/bcAaHRMAXkGMIpx8b2M0htkhRv5T8bXEONx8+ZNkxYzkbDpdFqI6NnZWSnDkf3NDOrk5AShUEjp\nNnCWFr/22msA2k3bcrmsP3e5XNjZ2YHH4xEjmquzsxPpdFqlLhv6zzzzjCgahM3z2tlsNpRKJQmP\n8eEPhULyHqPGEZvZHAoQ/2S0FjL6jg0PD6sJz2BEvymCSYEz2yGqEPKa2mw2FItFiaq53W7dv1gs\nhkgkokOFJYfL5RL0gKU934/SFBxvG/cPH/Tu7m71xwAoOyb3iw4kkUgE6XQak5OTCoYMfOxJ8SCK\nx+O6f1TLtNvtSCaTysK6urok4N7V1aUeH/cJr8/w8LAOEACqBFwul1Q0/zPrvmwkP1gP1oN1/677\nLtMx8m3q9bpsUSi5ybHm8PAwcrmcUlmm54eHhzg+Pka5XBbRkeNGn88n8SaWUEwn2YwmXcDIyCaY\nilMx9oEIYz8+Pkar1dKpR6sT2rPQ1A2A9FRIEGVKbbfbJa3a09MjKgEAWfZSR9koq2mUHq3VaupZ\nUOzLKPhEBwZmRT09PRgdHTWp6Q0PD2N3d1eQAsqIkjO0t7eHcDhsaq4SmkASIk9lSmOSAc5SkmC1\ncrmM9fV1+P1+Qfk9Ho9seoymful0Gh6PB8lkEiMjI1hdXVXDmkDPYrGIc+fOyVETaPcmOPZlJsbf\nQwBgb28vms2mycQwlUrp5GeJSVBiR0eHsgUONubm5kSwDQQCyiQ4JbXb7bLi4ec89NBDes+DgwOV\nQ3a7HeFwGMViUZkI73lvby8cDgfOnz+PjY0NuN1uAWbL5TJ2dnZUzhqFzFh6AjDJ+1L3ie4lzOo2\nNjY0WEgkEsjlctonRrfed1v3ZdBhWshNR3+mtbU1PVTUMn7ttdcwMTGhMokPLVHKKysreg2bzsTy\nkM0MtHE6Q0NDYjmzEbi7u4u+vj4cHBwI38Dan2xj0h2I5qTOMcXDaSELQJMkUhEYwLhRCoUC/H4/\nVldXtQH476lsyJtPt8ujoyMMDw9ja2tLm7NSqUhygs1ZBopsNisKiNH6pFQqSbycGB9j8KWcSFdX\nl0qbUCgkQS4Kq/GhIk1kb28PHo9H14ffdWRkRGhqNrnX19fR0dGB/f19FAoFYXt4rSwWi4K4kZtE\n6gOb7SxvaFtDAXOWa2TnU97CYrEIf+J2u9Wkp7QJAOG3jLKiPDRWV1fx6KOPiprAg5N+4CwXiVsC\n2g31UqmEUCgEt9tt6j0SZc3mNSeZlEqhikI+n8fNmzcBtPtKb731FoaGhhAKhXTvqMhAo0IjibXZ\nbKqRf3p6qtKPQZq2Pvl8XgfAvXA6913QWVlZUXc8Ho/j4OAA8/PzWFxcBHDGDj46OtL4cHl5WacE\nVfaMPCz2dMLhsDYQNXOpLXLx4kUxbo+Pj03jaqvVKqAYZQ+AdlDc3t6WrCRv2ObmprAr1Mfh99vZ\n2cHc3Bzi8bgakkB7irC/v49AIACPx4OdnR1t7p6eHuTzecRiMVElgPbDdufOHVED6EbK1zCQ2Ww2\n5PN56bhQ2JuOl2wMsvfA/6a/O9Buri4uLuJ973ufidDIU5R2vj09Pdja2gLQltAgu3x9fV2TqMPD\nQzidTvGP6JTAxb5NrVaTqRuxL5Ql3draktYwfyf5eQTvAVAjlra6XEdHR8qELRYLNjY21MNisOQ0\nzqgISclT8ul4mHR3d2NlZQVer1e9IKAdJHK5nJQpY7GYSYqiXq8jlUrJIx2A5EOvX78Om80m+APQ\nDvLValUyKJS5Bdr9meHhYcTjcfT29upZIQ2HSgTZbFZBmaqKlIY1QjvC4TAcDoea37x+P+mS8ZPL\n0jKOGn7Ol8ViwR/8wR9owwQCAVSrVTidTgGsSNmg0wAdQC9evAig/RAkEgm5MBAcBkB6vdPT01hf\nX8fQ0JC4PWSgcxQ5+u/+50tLS5idnUUymdQGZWOW0x5OFIwuETTY29nZUXkDwGTVm8/n9d9GUqjH\n4zEJLVmtVtmRuN1ubbKuri41Z8kWN57C8XhcGBHjCUttaOoOM4itrq7CbreLvFkoFBSE2BzlhI2f\nk8lkEAqFsLGxgVAoBJfLpdesrq5iYWEBm5ubptfw91arVYyOjuLmzZsKIATgAe1AwwBfLpfR39+P\nfD4vjWd+DsmezFAzmYzKh0KhgGg0inQ6jZGREWWw8XhcjV+Xy6WGP68rMS9EK/N+A8DW1pbkYN58\n800AbbkQElJpbwS0yxcShTlQYHAZHR3F4eEhhoaG0Gw2lcEODQ3h6OhI08+trS1lgm63WzinarWK\nbDar54WSopy48YClc0az2UQymcT8/LwpuEQiEWGCOJpPp9OYnp6WAwn3Bj/nm9/8Ju4WWu67TIdT\nF6D9gA4PD0tJf319Ha+88goA4Jd/+ZdF8LNYLCqh6JtFFnY6ndbN9Hg8mJyclF0ILXwByIGRD6DR\nraGnpwcrKysYHBw0ialvbGygUChgdnZWuidAO4Ddvn0bExMT2NnZEVwfgDykOPZkqup0OnWy7uzs\n4PXXX8eTTz4JACo3Zmdn1a/idyauiAJbRrtfik51dHRoWge0T9/FxUWBE40lGR9E0kH4m1hycLLF\nYBcOh7G/vy9kNnWMAeg7Wa1Wkyj66OgoXn75ZQQCAY1kjQdDf38/AoEA3nzzTQVlI/bFqC3M793T\n0yNXBWphA+1JELE2tKYGzoTUud+MPa+BgQGsr68LH0b8zCuvvILBwUGVIaQkcC+QUb67u6u+RyKR\nQDweVyDPZDJqBbjdbhwfHyMSieg3AGeOJgwcRnfUdDqNWCyGdDqN2dlZU4bmcDiwtraGmZkZ2eUA\nEBaJ/c1YLKZ+z87OjmyFjMRpZvEul0ueaJyuGQ0D3m09mF49WA/Wg/U/uu67oGOxWMSpASA3SfpO\nU0SLlAGWMQQ4sbtPmQECo9gPoNEYNY/J+TFypTjZ6enpwcLCAlwul3yt+vv75VRJCDl5P9SrqVQq\nmlYAEIeHWtR0NuB0h9+JKbnL5TLxnjKZjOQjKBzGbMdisYjDxPciOZMaOXS1JGqYWQJlW/l+POWI\nVqYMB+15yJ9qtVq6psBZb2JtbU1mc0R47+7uCuPD98pkMiJvkixL/E8gENBv6+npEc+MDV06XnDS\nSBRuMplEZ2en9Hg4dbx16xYODg7g8/n0+cRw9fX1abJEIKTVatXEaGRkRJkae3bMFozCaJVKRVO3\nRqOBgYEBfU46nYbNZlNvpFqtyqWWaOBCoYD19XVZEOVyOYTDYYRCIU1vyf+qVquSX7FYLCKZcgLn\n8XhQqVTUYqDoG7+33+836eGQ79dsNqVnnc1mkUqllPX6fD7xC42uJ3db9115lc1m1Ug+Pj7G/v6+\n0MU7Ozsaf3OsCrRHmUw/Cdhj8KLanPH96e7odrvVu2GT0OisCEAI11gshvPnz2Nvbw8PPfQQgLZw\nfDQaFVqWafPJyYmAVQ6HA9PT0yrx+Fu2trZMSnblchljY2M4ODiQHKXxu3FzcwMAkMYJ0aJGu1f2\nUBiAM5mMAJSLi4ua3G1tbZm8m8jmptiU0Yrn9ddfx+TkpITFgDONZLfbjYWFBSQSCZUjHMlvbW2p\nDAPOYBG9vb3w+Xx44403FHDJESoUCgiFQiaLF5alPEBYbm1tbamHV61WMTk5qfH8hQsX5MBqvEYO\nh0PoaTL12dOh2iF1sTmIcDgcAvMxIDBQcw8GAgFcu3ZNJQiR3bRjttlsePrpp3WfWNIYOVT04KrX\n6zh37hx8Pp9Y62xyk8DM7wWceZAZ6SsA9PrHHntMe4dthaGhIRwfH2NgYMAEL6Ec8MnJCdLpNObn\n5/Ud7iXidd9lOoRfU6yKkpucwnAxA8rn85o0AVDzkzKhRKjy5lLRj2JMzGhSqZQeICPjmD7cFHIn\nepNNtUwmA6/XK07N6emptIUtFgvq9bqJtErReKAdAMlSphUsa2g6kLJXRfKh0bebm5Qe6GQus8nI\nxjFVFJnxEPcEtKchfA0Rv5wApVIpnXyEBpAHRjU96jSTzXxwcKDfSm/tnp4eE5vdKONgnIoA7b5b\nvV5Xz4X3h9ffarWqP8NsZnh4WCP0/v5+k9d6rVbTGN/4sPD3c8pEXhdfwwDEHpExw6QFLzMX/o+O\nIhQFI4+tXq9L7N5isejf07mTciBUHDBmcJlMxuRXz6kkn4ne3l5l0XRv4KSM95UeWsyoianK5XIi\n+NJtlZUEJWEYvBi0eZC917rvMh02dAGIg7S0tCRrGI6e2SAFIIkHoC2ITk2W8+fPY2VlRdMmp9OJ\ngYEB0wSBo8hnn33WpLNsXN3d3ZLL5EYA2id5X1+fRrRG9jAf5lQqJTtXfgfiWcjy5u/hNI7NcDZk\ngTMiK5nWQLtJuru7i2q1Kk4WG8n8raenp+jp6ZGcJXCGrZmcnDQRbHd3dxX0HQ4HBgYGlOmQelCv\n13HlyhVN1+hAQSbzlStX9DlutxvpdBq7u7uYmprSPSKFgMDJcDisqSQBknRWIBGUDgbDw8NYX18X\n6xyACRfT19eHN998E+9///sBQNmIxWJBMBjUae3z+TA2NoZGoyEwKCc6xiBoNDC02+2oVCrKAsjL\n4+fy32ezWYE7CQLlvgXOFCevXr0qrJLRlYMTSk7r1tfX9Vt3dnakkuhyueQ9D7Sb1swEHQ6Hsr2V\nlRU4nU4xzCk/y9dMTU0Jl0XNnJOTE1lSkR60sLAAACbi77ut+y7oMNUD2jdwe3sblUpFtT0nIOfP\nn0e9Xsfy8jIGBwd105eXl+VyeOvWLezv76u8ohbNxYsXJdjNwLW0tIT5+Xk9nLwp9Hq6c+cOZmdn\nJVcBtE/H/f19XL161SQUPjAwgK2tLQSDQek983N2d3cxMDBg0lIGINExIlR/8IMfKOhQ85lC+gyK\nHR0dmsT19/dja2vLNBJeXl7GyMgI9vf3Ua/XVa7dvn0b2WwWt27dwtjYmCYtHKtnMhmN4zlVcjqd\nuH79Oi5duoTl5WVtvJGREaysrKBcLqNareIHP/gBPvShD+m3jo2NoaenB8ViUfeBk0in04nz58+b\nULqctBAVzNKGPDWOko2C6aVSScC1d955ByMjIybYBXtXW1tbCiC7u7uIxWLI5/M4f/68+mBAO8Bx\nxM0MC4C4Z7SkPjw81JSTlsHVahXNZlPBrVAo4Pj4WADXUqmk/b22tqYyib03fg6DLv3P+HecbFF7\n+/bt2yr3u7u7pduTTqdVQnV1dWF7exvj4+PY2toSGpz3/Nq1a5ienpYmNN8rEomI/X56eiqc13/Z\nVvjndRlrUSP7mbIIPC1pSULmLzcTR8i8kexPAGejVVqc0PuIn0HEcUdHh05OAgJZ9rAxDUDlX71e\nN0H2SQgsFovo6uoy6a6QuEhkr5HNzlKtVCqZdJVrtRoGBwfR3d0tixb+HpZiP+mE0NvbC4/HowDM\nEgVolzSRSER6PD+Jn4lEIjKTY0CqVCpwOBwKBJQ5IEua41kKi/O/ifzt6urSyevz+ZR58HN4aESj\nUVgsFukPcz8wm00kEiZdY6DdD+vq6pLrBpuqfB11onkdgDNXDQpxGQ8T3nOWedxzdrsdbrdbjWyj\nbQ0XCZdGAClLRP5W3nOjHbTX61XQI62DPTV+FvcPtXno1sDr2tXVJa1s4/NDMjEbzrQfNu4hqhgw\ni+/v75eJAEsy7kej7tC7rfuup/NgPVgP1v297rtMx6jTmkwmMTMzg4ODA7jdboRCIQG46BE1NDQk\nqQcAivRU8qPUKAAp3DGlNQp2kV/V19dnskqhwBMlLIwiVcViUdQK6rkAZ0TVgYEB7O/vayTJ7zA2\nNga73Y719XVlEsyYksmkMjD2Fo6Pj1GtVtHV1SV9FgD6Xp2dnXC73XA6nUrrFxYW0N/fr/Sf5QIA\nlSfMOHh97ty5I3Tu4OCggG1AO2OYnJyUYSF7FpT2JJKb2RAA0VH6+/vV0OT3TqfTcqvI5/N6P04L\n6czKKRAlGTgp9Pl8KjMjkQiKxaIU8N555x2TSwOhEIQo8HuXy2W43W5lNEZ7nI2NDYyPj2N7e9vk\n2EGqCc0fjeBONs4Jc+Cfk7zK+8gmOuUwaD9kFKPzeDzY3NwUJ4p7nI10KgOSoAtAFBruCWaChDhk\nMhkcHh7C7/frnvO6Gq2KgTMYhNvtRm9vL7a2ttQ++F9XXoVCIdW8JPlRd9ao8cJSiZquHPsSwu50\nOhGNRtUTAqAxLRX1jOLVnFiEQiExpwFIQNzhcGi6xaYeIensl7AJx0ZfPp+H3+8XjQM4E9AKhULo\n6urSCDMSiYiLxBvOm0wGdrFYlJYKcEadoD0LrW4BmHhb9DvnRuOIlosPSDAYxOHhIYaHh6U5xADn\ncrmwvb0tFTz2BLq6uhAMBiWcbzSto03xxsaGUMYAxDgnY5sBg+/HZVSF5B6gRbBRkGt1dRV9fX3C\nZfX29ipg01KXTVmWBmyaRiIRHBwcYHZ2VmUrMUWUcjVym6LRKHK5HAKBgCgOQBulSxxVsViUxk0m\nk4HL5ZKqoVG1z+/3S8eJnupA+4Agp417iMGSvyufz2vkz+DCA7LRaIjzB7QPtN3dXZw/f17vZbRD\nDgaDSKfTMiQE2uU+OWbxeFx4IQAm2dd3W/dd0GHTEYCaeNFoVNrARikIACZ5CuDMFbRareLk5AQe\nj0cb9/r162g0GrIq5ggdgAiIVqsV+XxeG7BQKOCRRx7Bj370I2VbPKnoJjo1NYXbt28r8LH3wvFy\no9EwOTiQFd/f32/CS9y8eRPj4+MS+uZk5OjoCLOzs1IJ5Kalm0JHRwcGBgZM70ffao7Yy+Wy/s5m\ns2FnZwcPPfSQTkAAevio8keoANDe7LTH7e7uFkyB5nYulwsbGxtYWFhQpkMYATMRgsr8fr+uczQa\nxYULFzS9Mpq6sc/G+8MROq8JJR2mpqYQCoWQTCaxuLgo1wZeo0QigXq9junpaQVyt9uNhx56CJ2d\nnVhYWNC9BNoBhKoD9Xrd5KiZTCZNI3sGJB5mkUgEzWZTwZ97iYqIxmYtTRDHx8dNms/ci8zQyC0D\n2gcxMWZ+v1/SIACU8UajUUFDgDaO6fLly1hdXZVHGw+yGzduiP4yMTGhvs3a2hoCgYCoHeVyWVmz\nUQv83dZ9F3ROTk4UuSmnsLq6iomJCdy+fVsjYZIWi8UidnZ2NCLd2tpSNO/o6MCNGzeUOXV2dqJS\nqWBzcxOrq6smwBplDwYGBoQWBtqZDlGusVgM9XpdXCqPxyN3UIfDoe5+Z2cnrl27hvHxcckKMAX2\neDxYWlrC5OQkXnrpJW3O5eVlscWpuMfyweVyycO6UqmoCej1eoWX4TSFLHPaMVNI3ngqk8u2sbEh\nB0h+t8XFRQQCAWVaDJaUdqWeD8s4BqeTkxPMzs6adHO6u7tRLBbxyiuv4JFHHjFZOBNzc3p6KnQ3\n0Ja2iEajkjTh9WFTnpnt5cuXFfyTyST29vYk5XH79m1cunQJADQ67u3txeLior5DoVDAD3/4Qzz+\n+ON4++23ceHCBd2/nZ0dZRuFQgFvv/02gPaE84Mf/CBqtZpY7Ua3zXq9jkajgb29PcmlNptN/RYO\nKfhgU+GSaHsGZZKZOagg8h04I29yemdUcTx//rzccPv6+rS3S6USXnvtNczNzWFpaUnTL97zRqOB\nRCKBfD6vwGu327GxsYFyuYyjoyOT2Pz/OmkLPihAe0O3Wi3B0ScnJ3VRiCoOh8MYHh7WgzgzM6MN\nXCqV8Pjjj+tksVqtCIfDcgolEAs482dmhsMHh5SJ6elpOXayvm42m0L63rlzRziGYDCIixcvigHv\ncrlEXCSbl2hTftfx8XH867/+q7Ktqakpnf4HBwcYGRnRSWYUw8pms8hkMhgYGDARJ4kHYlmSSCRM\nweD09FTIbz4EqVQKMzMzphOf5QgFwqibw/Lh+PhYUgzb29u4ePGiKUvs7u7GpUuX0NnZqYyzp6dH\n07Ouri6B+wBo4kb3DX6+3+9Xn4zsbJ7w/f39svcBIIF93k+O28+dO6cA0tHRgSeeeAJer1duB7w+\nzAQoiM5gTYkTi8WiKRbv0eDgIBYXFxGJRDA4OKjP57UhWPXg4EB9PCKAp6enpWIAQCNqZvykSwDQ\npNRqtWJ0dNQkXs/+Gg8SBuxyuSwGeTAYlOUw0A6k1AV65JFHdJikUimM/rs/nN1ux/j4uALVvWgQ\nD6ZXD9aD9WD9j677LtNhHQuYtVDcbresN4CzRjLJcKxROf2iDg8JcVxs3LLUYspIUWv6VfFzCB/v\n6OiQgBQzMaPafqPRMIlrEeVKMqMRdMXmH50FgHZZ6PV61TwvFAr6HBqpccLFE5HYCn4/gtr4dySC\ntlotAcf4fYn8JqGPf14ul3W9iDXi9Sb03vh7Ojs71RPyeDwiJAKQsyYbm/zenIBRZI1qdgAkbPaT\nWi2lUklgzkajoZKSi1ggNuGNvToixIvFon7r8fGx+jD0SOcJXqlUpNBHDBC/g8/nE/2CXvD8fGLG\nWq2Whgr0jCdtorOzUxlDT0+PZHIJ6gPOKD7kn9G7nK/p6upCPp/X/mCmymlttVpFqVQyDV34PLAh\nzNdSHJ9Nbe5h9kRpA0XuH2BGbL/buu+CDsmaAOR/FIvFMDQ0hOXlZWl6XL16FUtLSygWiygUCqpf\nqS9CrpLb7VYDrFKpIBqNyjCN6TTQnpQcHByoKc2Hd3V1VVoyFotFADTgjDxKOVH2BIaHhzXmrNfr\n2NvbM6nFAe0gt7q6qn4TdZapZUvtXeDM64g2r/yt/f39ODw8xMDAADY3N3FwcKCeBTd3uVzWxMko\nA5vNZrG5uYnLly+rRi+Xy0ilUioHFxcXBX7jOJYblg8IWdH1eh0PPfQQ0um0phv5fB5TU1PY3t6W\nkwXQfhC3t7elT5RKpQQ25HWNRqPY2dlRACTiu1wuY2lpCefPn9d0hoGaDXX2foB28KWSn8fjUZDv\n6+vD7du3EQqFMDo6imazqSBGg8ZWq4VcLqdSZH9/H319feKFsbwF2nADIo6LxaKJ1kHtnXQ6bbJk\nJseK15FlF+VV6bjJ4AicqTAcHBygu7vbNPSg/xnR4SQTVyoVuWVQqtdoJ0NbpNdff10B1maz6aAp\nFAo4OjpSv9BIz3m3dd+VV319fejv7xdxj8xh9jMoM+B2uzE7O6tpkJG0yJ4F8Q8k0pFgWSgUsLW1\nJQZtOp2WtSwFrPg/ehYdHR1JGoPN23Q6LcZvLpcT8pRYEgopdXd3y1YYODNmIwGUiGNmUux/GMmO\nQ0NDiEQiGpOyTxGJRODz+YQvImmRo3WHwyHSJRc3Egmc/A5EXTPoU22P3urkfZEwyh4CiYgkNhoR\nxlTeY7CmxxRlYE9PT9HX14fx8XH12WhlW6vV9JpAIKAJFrWiaXNLtDN9xqlzTSVBCvezadpoNGCz\n2YTUJXeO146QgHA4LHF7Emg5USWnjSTIn7wvRvoLXVjr9Tp8Pp8auaenpygUCibZVNoxc2hQr9cl\n8N/b26sMenBwEKlUSv72nJgxmzLeKzrd8rc4nU7t70gkIiiIx+PR/2iHTWR8qVTCzs4OdnZ27ini\ndd9lOtlsVqc/02SOCfP5vAlfQKJjLpfTeLlUKinocHLA6M33Y/ljxOPQPQKAyQSvXC6LpUxKgxFL\nYhRq53fjWNuY5nMZ2ctMk4F2NsMxMt0qeVpy86TTaem78LsxuDD7YJbB044pcaFQMGF4mL4by8JW\nqyXuF/3XmR1xItjZ2Yl8Pq8GODWCiDFig5+f09PTo+9gbEoD0L2hIDwAwRwoPWGc6JyenqLRaEiL\nht+NmjXNZhO5XM5UmlHnplAoIBgMCl/EMTC5UtwX/H7UueFv4ncsePi5AAAgAElEQVRjwGEpwnvO\n7IUBiPeZMinZbFbBnk1zoJ2FUMuIZSpLfzLjGfT47+12u1j8Rk81TskikYhpX3IfkM1eKBSUqY6M\njCgQG+kwLM/L5bLKdoInmVndbd13QccoPcqTaGZmBsFgEDabTTeXvRe6crK7PzAwoOzEbrfj8uXL\npn5KpVLB2NgYSqUSpqamlN4aT2yjrsjCwgKsViuee+45TSu40QYHB1Gv13WKGw3WTk5OMD09jY2N\nDQSDQRNpEIAE1hlYGDyMRnd8v1AopFPUyBEiKLDZbCISieCRRx6RM0AkEkG1WsXIyAiOjo6UQQKQ\nOFetVjMBBTc2NoQ16u/vx3PPPWfqWXBU7Ha7FSyHh4cRCoVQKpX0vkYH0lwuh6efflp8In63VCqF\ngYEBhMNhJJNJlRaNRgP9/f0qXXm9bDYbAoGAnDLphAG0wZgEBLKvYWR1c1JmsVj0Oaenp7hy5Yom\naHa7Xb/d6XQiGAxiaGgIrVZL3/uxxx4z+Xt3dXXh8uXLul50bjX2mugkOzg4KJsimgw0m005eWYy\nGRNokAcip2R8T9onMTve3Nw0MdzHxsY0zeL/02aG2azP5xPAlQcs+6DGvtv58+dlUHh8fIyHH34Y\nAHR/77buu6BDaDjQfhCJl+jq6sLe3p5OqoODA10katcAZyciT2UKowOQqHi1WsXKygrGxsaEheHY\ndGJiQkxmANIUoTzD3t6eQGlEjcbjcfj9fjUIjbU4VfjYf6CmCpGpLLkcDoeyNDqKEspvt9uxt7en\nVJ1re3tbYlv5fB6pVEobgkFzcXERLpcL4XDY5ONNLd/R0VFdUzarebrSaQKAGszc8HxA8vm8tHTm\n5+dN4DfaBNExkyfkysoKRkZGkMvlUK1Wsba2pgeE7gt0UmXmxhLk8PAQh4eHuHDhgjKa/f19eZNR\nC4g9HV5jNniNLg1vvfUWrly5IjcEPtj1eh2ZTAapVEp0EeCM9kLMU7VaFf6KlAFmjsTVEIzHXmU8\nHlegorokyyQjHMS4P4wlL7Mmu92OWCwmRUIAKq/5b4xaOLFYTI3lZrOp700Bepak/N4WiwWFQkGC\n+ewXAffG6dx3PZ0H68F6sO7vdd9lOrRaASBhIzYFA4GAan9qv5AiwMzE5/Mp+8hms4hEIiYSm9Vq\nRavVwvz8vES5ACgrOTg4MHllUdwoEAig1Wrh0qVLyo7q9bpS7b29PenVWCwWjI2NYWhoCNevXwdw\nxp+Kx+Pwer2STmAm4XA4pOTG78J148YNzM3NSXqUJ/LExASOj49RKBQwNDQkoCBwVqsTTr+4uCiU\nLvsLbCAagXScwLBU4GkZjUaxsrKCSCSCVqulHhqV6shl6u7u1ol6dHSEcrkskCfLFDp8eDwe9PX1\n4amnntL1uXPnjrSujY4PFFEbGBgQJ4n3nPrRJPuurq7qurZaLY35h4eH8cYbb+jeLSwsoKenR6UG\nMyev14v+/n709vaaAIp9fX0ol8s4PDyUnQ2Jqn6/H7lcDh6PRw6m3HPUdx4aGoLb7VYWyknX+973\nPuzt7ZnUHOlmS3dS3nPqLZ+enuLSpUt45513lAUx6+no6JBuONDu6QQCAX0uCb38za1WC/39/Rp6\nAO2sLhgMqg80Nzenfc+WwN3WfRd0jM05SoyWSiX4/X4cHByYHvhGo4F4PK7GHwDZsBgtaYyl1+Tk\npOx4aWUCnAUXq9WK4+NjlQibm5vo6enB3t6e1NfYkKVWDQMZU9bZ2Vlsb29LO8fIGWq1WmKkG22A\n4/E4LBaLkKhsCgKQwLfD4UC5XFbJwYeSvZN0Om3CCtEEkPo5DGSnp6dSLqQ4GFcikZDsZyqVMnl0\nBYNBkzsl0D4k1tbWFJiNUzpOSPhapuXhcFiOqSRI8v1OT0/VO6rVagoItLChsPng4KD2AoMFfdE4\nFeL3KxQKwiTxu4XDYbHFib/hdchkMsjn89jf35dAGq+BUX6VY33ev2g0imKxKJF44Kz53Gg0kEwm\nUSqVVMJEIhF0d3fj6OhIpGLeAxpI0oiQBzHxMtVqVYGWDV4Sb9mA5nUpl8soFosYHBwUAZqvoc0N\n+51G+g/7aiQms0VgLPHfbd13QcfhcCiSEoczNTWFk5MTjI2NqYFJDdjBwUG5QwBnkwcawzGoAFB/\nh+/T3d2th2p0dFQBbmJiQheWI11OVWjlCrQDH6UmXC6XmpcUZSLDOxQKaYLT1dWF+fl57O3twe12\nK2Po6OjAzs6OhMCNvSOS+mw2mwlrQk1eEiONoK1wOIxKpSLKAF0jgDNhKbvdbvIZa7VaOHfuHPb3\n9yW/ys1OGQ0AgibwvZ566ikFFJ/Pp+ljKpVCZ2enxtPMBLu7uzE5OSli6/j4uK4dgyGVAnj/BgYG\n4HK54PF4EAwGsbOzo8Zvq9WC3W5HMpmE3+/H4OCgAgVZ3mSFGw+TcDgMu90uUXQjdaFarWJ4eFjy\nF8AZCI8mhc1mU72oSCQi9jnvOdDuf3R3dyMcDotDxftKDywCXxmoAoEAzp8/L5AiOYbc99wDXq9X\n1Aruobm5OfVF+X59fX0YGBjA3t4ehoaGUKvV9IwdHR1hZGREGSGb0sxEg8GgDi1m7awC7rbuu6DT\naDR0ElAg/dq1a3IGIECJpxe5MQTMEYi3urqKmZkZgbyAM9Lg5uYmrl+/josXLwrQx/Hg4OAgms2m\nODrpdBoLCwtYW1uDzWZDNpvVpqFNC5uXBCGSzUwFuc3NTY3Ze3p6cOvWLYHdmFLT67tSqSCdTiOZ\nTAogaLPZsL29DZ/Ph52dHdOYn+UBbYCZQm9sbMiq1u/3w+v1mkbWbCxevXrVRBJdX19XFriysqLT\nt1Qqwel0qmFqVALY39+HxWLB9PQ0Njc3TV7vfr8fm5ubmJqaEq+HEpnj4+MolUoqUQEooBP0xjKJ\nbPY7d+4gn8+Lmc290NPTg6OjI2QyGQEPeY8ODw/lyc3McnBwENeuXcOlS5dkbMfPdrlcstNZX1/X\n/X755ZcxOzuLUqmE5eVlfOADH9AkKhaLYXR0FNlsVoRaoB14q9Wq0N1Gu+hLly5JkN9Yah8eHuKd\nd96By+USRov7hzYxnZ2dyoJ47WhNzXKTmXe1WkUymZRGz/DwsO7F4OAgSqUSDg4O0Gg0NMmkhAhV\nCm7duqXJ6C/90i/9h+fWuH5qQeczn/kMXnzxRQSDQdy6dQsA8Ed/9Ef4i7/4C50yf/zHf4wPf/jD\nAIAvfelL+MY3vgGr1Yqvfe1r0tH9yRUMBvV6BokLFy7A6/WayG3hcFhSmYzIQPsC+3w+XL16VVa0\nLCv4UI+Pj6NSqcDpdOKxxx4DcHaCUEidNXkqlYLD4cDzzz+ParWKiYkJlQL0EDLqyQBnaf7AwAB2\nd3dx7tw5BYN8Po9HHnkEiURCdAT+bpaTY2NjqNVqOsm3t7cxOzsrQBxf02q1kM1mUS6XYbfb5XIB\ntL3ZNzY24Ha7kUqlNHLn4nfa29vTqZfNZtVL4HsYWd7RaBSrq6umYODz+TA8PCzxsfn5ed2Lw8ND\nnb6NRkNo70KhgKeffhrBYPA/CK0xA4tGo7h165ZputhoNPD0008jkUhIfxmA7HyDwaCgFfy7YrEo\n8qtRevTGjRt47rnn0Gg09D2YrblcLly+fNkk6Qq0xfvr9Tq6urpw7tw5FItFqRsQ19Pf329SAvB4\nPBqJDw0Noa+vT8HSarUqe6PmDtCefl65ckWyI5y8Ae1+j8fjQTwex8DAAPx+v/ajsTdzeHioa8De\n3vr6OmZnZ9HZ2amgvLq6iunpaZOmNAAJ4LOC+PVf/3XdP97fu62fWtD59Kc/jc9+9rP4jd/4Df2Z\nxWLBCy+8gBdeeMH0bxcXF/Htb38bi4uL2N/fxwc/+EFt3p9cp6enuvgc/Rn7PCwt2JegsRpvSqlU\ngtfrxZtvvqnGK3sjRiYxa14+YMFgUChQI8z/6OhINIjx8XHpjADtgGS32/9ve18W21Z6nv1Q3ERS\n1MJFoihRlKzNli3ZM/Y4nkxnyQQJmgYN0hQdNBdF03RQoEVbtCjQixQNEDRFb1p0A7qgyEVTFA3a\nokHbi1ykyGTBTGzHu2RrpTZSEvdFpCRSFMn/gn0eHWbsCZD/7zTKzw8YBLEt6vCc77zfuzwLAoEA\n9vf3dRpRPMzoX82Nm8lkJDBvNptbmNexWAwWi0VIVp689E/v6+tDpVJRkO/r68PIyIiwM8fHxzrJ\nt7e3tcmKxSLi8bhY5TRSo2MFSz/2jvh5vB6g+SLevXsXtVoNVqtVDUea7FmtVmxsbEinF2hu6Fde\neUV6MEbh+rfffhvZbBYjIyMagQOnAlp2ux1ms1mbnoJa9+/fl8YvAznlIcgAJx8POGXis+Tg6d/f\n349oNCoGuN/v117w+XzY2NjA6OgoCoWCroF7o1QqIZ/PY3h4GDdv3gTQDIoMXMwcgGZgyWQy4oUR\n4sD9mM1mMTo6qqYxAKGB2XskP4ufF4lE0NXV1WKKBzQxQevr6zCbzS0ibYlEAgcHB6LGeL1ebGxs\nAADGxsZE1Wg0Gi2UGD5fs9mMR48e4fHjx7rf77X+x0bmL7/88lNru6eZqv/7v/87Pv3pT8NqtWJ0\ndBQTExO4ffv2/9SltVd7tdf/4nrfezp/+Zd/iS9/+cu4du0a/uRP/kS9ihs3bujfDA8PP9M7J5vN\nKpMgTH5xcRFjY2PY2tpSasrJTzQaxcDAgH6GExvW4vF4XCcsU8jl5WUsLS1hfHwcd+/eBdD0y+KE\nihQAoKmg9tJLL0nAi2UY0My6qCLH+hpolhwUYqrX61hcXGyRepyfnxfMnycyx7cdHR3Y3t5GJBJR\nOUTDPwL8eAr5fD5sbW1hcHAQsVhMnC4AmgrFYjFxj5g5NRoNrKysIJ1O48aNGzrdtre3YbFYZOJW\nKpVUJtAIkGNe4yQjkUigq6sLDocD0WhU5RplMSORiFjeXIuLiwiHw/pOLBEIBGV2wP4QAYiVSgXp\ndFquGUAzc+vt7UUikUCxWEQqlZItCw0ACdjjNfT19WF+fh4vvvgi8vm8fLUAqDe0vb2NRCKhvttb\nb70lvaBoNCq0N9DMgiYnJ1GtVrG+vi54Au2CaTe9t7en5zAzMyMPNhrmAc3G78OHDzExMaH+Jhcp\nDZxQra2tqaezu7uLarWKQqEg0CwATXOHh4cRi8UwNDSkTJ7WzkdHRy1DhVQqJd+xUqmEjY0N/YzR\nMfdp630NOr/6q7+Kz3/+8wCA3//938fv/M7v4Etf+tJT/+2zhIDu3LmjmrG/v18QcnqAs8eQyWQ0\ntqSvNNCcIrAhfHR0JHwNcCrMRbKo2WzGhQsXADSxHpubmwoqTGeplDc0NCTBJ2MZVa/XRa7jGNJi\nsSAUCsFms6Gnp6fFmTSZTOLSpUtq7PHFoXg2x8v37t1TkGQPqlgs4o033sDXvvY1AKfIUIprs5YH\ngBdeeAEPHjzAxMQE8vl8i9cRjfT4/5nWM0iTV+T1evXCUfbC4/Hg6OhI/aajoyNx3Vj+GSVlC4WC\npkYsXzo7O3HhwgVMTU1hZGQEtVpN1xAKhURhWV9f1707PDwUZYIZNu8PcVXkXZG7BTSDLw8JozC7\nyWQSDoki51wsmYlhYp/sueeeg8/nQ6lUEvaIe8Hn88lJ0+iM+dxzz2Fzc1PwAY/Ho5I1GAxKgteI\no+no6IDf75eaJXBKPaAR3+LiIq5cudIyTqd3Fg0Mjc1s0nwY/PgzLOfdbjfy+byeA22QaLOTTqd1\nMLAJ/az1vgYdY4PpzTffxE//9E8DgBqqXIy2T1sXL14U4IpZAGkNxGoAkLl7IpEQIAtoPrDDw0Ps\n7+8jHA7LIwk4zY5cLte7iHfUOwGapwlfSJJDKQGws7PTIlNBi9Zisahr4MtB33GXy9UyTSERlCxz\nAPJLZ4N7aGiopdnHAHfv3j39DK2RCSik2wXQ3BherxfxeBwnJyfIZDJqBFJ0nXo+DJaUuiR2h5AA\n3ldmmcYew+HhoUbVd+/e1cvK+8iARBIiAOE+6O1NBj9wagvt9XqRz+cFaaC2jcfjQTQaleIA0HwR\nCfS0Wq1IJBItJFP28th743UbiatGYBynSQy8/DflclmynqRrsKFOjFR/fz+q1aqyAjLv8/k8AoGA\nrJqB5otNDE8mk1EWxoDDrJKHL6+7Wq0iEAggnU6jo6NDv4u208TvGFUkKdhuJEIDzQZ4KpWS1xif\nMaVhiNMJh8PqE/G9fNZ6X2kQvGAA+OpXvyr5zk984hP4yle+guPjY2xsbGB1dRXXr19/6mdYrVZs\nb29je3tbTS82FwnEApov6cTEBKxWK6rVKg4ODnBwcCARL2qYcIycz+eRSCTkrrm2tgan06nNRdYx\npxNkdnOq8s4770jQibat1WoVQ0NDAhPyGtjgI5fJ6/UikUgo/aeFSC6Xk4xHLpcTvqhYLGJvb0+u\npn19fZL34EtJMSun0ykMTz6fRyQSQSQS0WTv8PAQlUoFw8PDKBaLKBaLksKg3i4dNAgkpEHdwcGB\nNIlLpRJmZmYEJtvY2MDGxgaOjo5gNpsRi8Vw8eLFFr9yim7xwOBzID+JMg2xWAx9fX3SW3a73ZLN\nIGK2p6dHTq+ZTEbIaIItc7mcPp9WvtQ/Iguf95j/EQhKQzvKRzDjBJra1WR589/ysGDATaVSImDS\n2peL2JeBgQE1w/n8CoWCmPMdHR2YnZ3F7OysgITEgJXLZUmlcPGavF5vy2TS4/FIwoPPm3gfWhwZ\nPeqPjo40tc1msyrzaG5Im6bNzU289dZbeOutt/73LGg+/elP41vf+hbS6TRCoRC+8IUv4Jvf/CYe\nPHggGsDf/u3fAmjWrm+88QZmZmZgsVjwV3/1V88srw4PD3Ht2jUAzdOaKTnxIUY07t7enhwambWQ\n0Gm327GzswO32y38DC1PyNqmbAVwSr/4fho/iXpjY2Nwu9069YBT1bzZ2VmBwPhZRmZ4JpPR96V7\naCQSaWFRs6xjtpFOp1UqPffcc8jlcqjVapiamsJ3vvMdAJAsAykhzE6AZpn5+PFjjIyMqGb/fpIm\n0b9cLFEODg5ENCR8gb0Hm82GRqOhTPXo6Ej6yyQcsiRimUQHUp7ItHQeHByE1+vF+Pi4roMlXV9f\nn3R3gGZpxBLAiGnitRGI6ff7W4YZvEc8AHhKB4NBOXlSEZFqfxQX47M3+oXR5bVQKIipD0ATM/6s\n0SomlUqpCuAEi9fADMko8s4gSckN0hr4jCqVCh4/fowXX3wRjx8/Fo4IgEwMBgYGFKTo8RUIBNDf\n34++vj59Hg/PQCDQkv0vLy+jVCqho6MDdru9pbVhLEWftv7Hgs4//dM/vevPPvvZzz7z33/uc5/D\n5z73uf+py2mv9mqvH5F15hDJTKOB5skyNjYmydDR0VGd5PS8Jt2BGUhXVxfq9TrS6TQGBwcFqwea\nUZ26IdSf5anDlJnNX07XmOXQAoayC/wZumVWKhU1OOk+SWBZX1+fTsSenh7E43H4fD74fL4WEl0s\nFkM4HEY0GsXP/uzP6vMo4TE+Po75+XmdohaLBX6/X1rDRkU36vkYyzD+HKUbaIBnlDMIBoNIpVIY\nHR3F2tqaan+32w2bzSYZBt43ImZ5mrJcA06bq0NDQ+jo6FCP6ty5c1heXlavg77yvD8Oh0PcNZ68\n5JxRh8jtdqtXR1Aky2zKmgCnglPszfAe1Wo1qe0xy2QvsaenB+vr67h+/TrK5bKyumg0it7eXlFj\nzGazrs/n88Hj8UiVjwTW/f19+P1+8c1GR0exuLgI4FTnm0qTnPqVy2WMjo7KCcVI0aDTxcWLF+XY\nwPuay+XwwQ9+UNY1fA7MAIvFonSJeH88Ho+Q8Szz+B51dXWJCcDeDwBVIs9aZ07awliWuN1ubG1t\nie9ULpcRCAQ0ZiUYjs022mtQ7pJIXf7X0dGBYrEot05jPUyUpt1ub+noB4NBWRT39fVJsZCEO6ad\nw8PDAo9x2kXWOksfNr75b0n89Pl8SKfTyGaz2N3dRV9fH9bX17G5uYnNzU0Ui0VpJweDQfWgurq6\n1FM4OjqSWBjHw5FIRJuMWs4kFzIQEpTGvgO1Z7a2ttDd3S3Lm2KxiCdPnsDj8ajkAqDPYdPY2CNi\ns5jsa/bCstksent7EQqFJOTFng6DczAYlNcW/baCwSAymYyoF7zuk5MTdHZ2IhQKYWJiAn6/X/rD\nyWRSpFyWLBRro5gby9n19XWsr6+jUChgYmJCAmmxWExwCpaebCRTRXBwcBAbGxuSQi2VSiiVSvD5\nfNje3pZwvLEvQ6F9t9utXlkul0Oj0dBUcH5+XlZHuVwO/f39sj0eGBhAOp3WdyJ/j2p/3Fv1eh1b\nW1sIh8Oa+rKvRG1q7l32yR48eCDhNjqHvvjii3jxxRcV7J+1zlymk0wmderV63UZxdGWlR1+MoY5\nWWJ3n1KRbMjabDZt5O7ubuRyOU0+WEsDEDbEKGQEQL+Ppz9wKrdZKpXkngmcnqqlUgl7e3uSRwBO\nIQLValWwdo7BgWYfiEGETVCOfRuNBhYWFjA7O6ugAjSnUBaLRWx5bnQALYxw46QJaJ581WpV0qjG\naYrD4dDEji83ALHZeZ94bXt7e+rpxONxuN1ufVfKOlgsFiwtLel0ZfDN5/MywmNvjdK0FosF3d3d\nLZACjoTZI+Jz4IQqn89LMIzZstlslhyo2+1W34QEVjbWGTS5mH1xmsfrdjgc8i0z+oXT3YIMbmaV\nxkEAr4d9KmZb1Wq1BWpAzFC5XNZBynE1G/dGdQD+r8ViUfOdjW/j3uPzZhOfv4syIkYBeEICqORp\nJBTz3zxrnbmgY7QfsdvtIgwSHMgXhFOl3t5eeL1evVBsCJtMJlmCRCIRAM2x68zMjB58MpnU5/Ch\nc/xsHB3+1E/9lGQ1hoaGVK6dO3dOan23b9/WSNpqtWoSMj4+joODA72k4+Pj7yrT+D0olUEWMDeh\nyWTCyMgI/H4/1tbWlDaHQiFpLZNpznvn8XgwPT0tgB8nEUAzOD558gTj4+NqTALQKUtTwmq1qgao\nxWLB1NQU1tbW0N3drSBB0fBCoYC5uTnMz8/rpaJ0LDMc/szo6KhsfKmWyEDPkoOKdvw+9Xodu7u7\ncntwu91K97u6ukQvePXVV1sa9+fPn8fGxoaavGxyU7Sf0z8+N94fmvT19vbqsKGGNfWijbpCHKhQ\nAN0INaAofDabFZOff0c/ejaogVNnVJ/Pp+yIJRQD8eTkpDJ5BgNy2GhlZNRtdjqdcDgcGBoaQigU\nEoTlwoULas4by7jr169Lg5tlOLMi47592jpzQWdnZ+ddFhfValViVQwghUIB8XgcOzs7cv8EIOdH\nlg20/QCadTcnMDs7OwiHw4raHNvG43GEQiFlIBTvZoCiKDh/JpPJCODGrGB0dBS7u7twOBwtJRTQ\nHMFyYmK0cR0YGMDGxobsYdbW1oQOdbvdwiOdnJy0YJVOTk40XTBCFshG7urqkmC7sQ9TqVSwubkp\noinQzIQ4UfN6vS2oaAIt6S7AIEEkcKPRQCQSQTQaFZBte3sbExMTkg/li0gtm0ajgRs3brTYAFNi\n4eDgQBkPAHG+jo6O5PvNl5Tfs1wuC4nN66bbBTWHOEGjw4fdbkcmk0GtVms5/ZmhUGgdgGx2CR40\nZhOdnZ1y5kwkEpo8UlYXgOyluRfMZjP29vbgdDqV9QGntsI9PT3IZrMIBAItoEY+T2bG7Asye/X7\n/Tg+Pta+L5VKcLvdsmqilAbQDGJ0Mkmn0+pRsffJjHJ9fV3f6cdOI5kPFQAePXqEa9euKaXc29vT\ni2M2mxVo6CsNNB8sNxHBhDypaNIWj8exvr6OUCikU7m7uxvb29u4ceMGTk5OBEo7OTnB/Pw80uk0\nxsbG5BPN3zU5OYlkMgm/3y+JiFGDj1I8Hkd/fz8ePnwI4JRoagQOAtBLTNmC3d1dMeCpAc363ei7\n1dvbi4GBAUSjUVEIAKixzP4J+zW8x4ODg2Iws4ShJQ+btY1GQ9mJy+XCxsYGhoaGWvye2KNxuVxw\nOp2YmJhQCeP3+3FycoK1tTW8+uqrOjD29vY0vs1kMtjb25M/PEWzaIJnfMZHR0cir37yk58UqZLy\nJMViUWJqbArz9Pf7/bBarXphLBYLotEoXnjhBZTLZYyMjODtt9/WXiDI1OjskM/nMT09LVwWey/A\nqWc5cIqh4T7lC2+321te+EAggIGBAVkO8flUKhUh6ev1unzYAWByclJAvv39fUxPT+uwYdO5UqkI\nPMu9kEqlJNa/u7ur30X3j42NDblQANB3pGZ2MpnUc2XgftY6c43k9mqv9jrb68xlOoODgzr9yTli\nE3ByclJ1pdvtxsLCgvguXJSrpDGex+NRWnh4eIj19XXMzc2pycqsiiPpvb09OTIAzebbjRs3sLa2\nphG5Uduko6MDoVAIDx48aJHWDIVC8Pv9WF9fR6VSET2B05R0Oo2enh7V6uRNORwOlTKUEpidnVVm\nQMQx0ASxeTwebG5uore3F+FwWPdndHQUS0tLmJubE4DPeMpvbm7KgocnObVa8vm8poHMNAqFAkZG\nRhCLxWC1WvV9aIJI+MLq6qr4bBTCoiYyS5Fr164JXe71emUFA0DDAioHMhPt7OzUZPLw8BArKys6\nlXn6u1wu9PX1SXmQ+2RzcxO7u7vSkQaa/aa5uTmsrq7ixo0bKJfLyiCDwSDi8biUGgn/p4sCpT3s\ndrsmeSMjI2rEGvsstVoN6+vruHTpElZXVwHgqTAN8qKAZiZhtC6iAiQATQZpvPftb38bL774IoBm\nr6VQKKBWq7UAADc2NtRv6urqwuTkpO5/OBzG7du3EQgEBMDkfWPp7nA4cOHChZb2wXutMxd0Njc3\n1SAEIO9oblq+cAsLC0gmkxL/NnqZUzt5YWEB586dazGTczqdiEQiahZSYuO1116T1jFdFwFoIlQo\nFLC6uoqhoSEFnUgkgp2dHbzxxhvwer36me3tbTx8+BDXrycrxM0AACAASURBVF+HxWJBJBLRhl5f\nX4fL5ZLuCV94blibzYZsNos7d+7gJ37iJwA0sRn37t2T6DxfRL/fj5s3b2Jqakq+U2wQBgIBCccf\nHBwgHA5r07PPE41G8fLLL6u5GolE4PF4kEql5OZoVHFMp9MtxoPAqf1stVpFNBrF4eGh0v3t7W2N\nZ5PJpDRcRv/b9oapPVUZgWZwYwmayWS00ck/Yq/HqCG9vr4On8+nadTy8nKL3g9pBJzMAU3MTaFQ\nQCAQkK4Nn+uTJ0/Uh2KfBIBE+4lE55gdOJW1JWGVKPiVlRV0d3fj3r17cDqdEtkHTrlXa2trKJVK\n2gsejwf5fF4e6KSRcA9brVbtbe554PRAo3ohF59ZvV6XnTQP1c3NzRZta5aF29vb8Hq96ivt7Oyo\nLDQSmJ+2zlzQoRgS0LyZbJKNjIwgnU6rsTg6Oir+ktfrVW1NK92TkxNNmfjiWK1WyY8+fvwY1WoV\nL730EoBThXx6V7N+LRQK0q8dGxtTtgM0XwRavK6uruq6Z2dnkcvlhFGZm5trgbFzMuN2u3XCd3V1\n4fj4GOVyGQMDA/jgBz+oU+fg4ACjo6MSD+dJub+/j6mpKTGrOZECILvcQCCAeDyO3d1dqS5y5B0M\nBmXABjSzzGKxCIfDoV4IJy12ux2PHz/WCcpxNfWce3t7USwWYTablXkuLS0J59TX16esqa+vT0aK\nHo9HjXCg2ZehS4TL5dJ9A5pZUDweh8fjweHhoQ6aeDyO3t5e+WiNjY0pg6xWq7q+YDD4LiAkyZ0O\nh0MvL7FNbE5PTU0BgNQRSY+gCwZ/ZmxsTMJzzAYuXbqEfD4vcun09HTLOJ3gSuDUAZXAvo6ODjHQ\njeL5zEg4JTOKf21ubsJqtbYYPFKcnvK9Pp9PfTz26iYmJtQ3BJoHGntbbrcbMzMzuHPnjp7De60z\nF3Ti8bgessPhQH9/v5CSRsM4h8MBp9OJ8+fPv4vHZbPZ0N3dLR1ZvqT8DDKsXS5XC2M8Go3C4XCg\np6dHE4a9vT243W6RKvv6+hR06vU6RkdH8fjxYzX8gFO8CxvgxE0Ap/YdVIszImcJWqMeMFN3NiA7\nOztRKBRUxtEbmwp7XV1dKiXNZjPm5uaEZzJOqWw2GwYGBkRYNZrwcfTOkogvotPp1D0dGhpSI9Jq\ntSIUCqkk3N3dVRk3MTEhVjaJiLw2q9WKQCCgyQknN16vV4z+WCym50DcFUm8Xq9XmQGlTGnnbDSD\nI/OaAYRBjNw7s9ks0CdfbIfDgVu3buHy5ct48uSJMirKQ5CrZNRWIiCRTWBOgQhpmJmZkW0Os6Op\nqSmNs/f39xXg2TKo1+safzO7dblcqNVqAp8anyulUQmsNRoL+v1+PHz4UCBNo9xsMpls0V3i+0A3\njnK53MJ1M9pqP22duaDj8XiUGnq9Xuzt7WFychIrKys4ODhQ/bq6uqpehtGJcHR0FJFIRFMQo2g7\nwXVut1vEPKODA6UfjRgQlkDPP/88dnd3Ra0AmplBPp+Hx+NBpVLRg2R/gMjmaDQqSoPX65VjKJGo\n/BlufkpRMJvweDxYXV1FT08Prly5ou/T1dWF7e1tjIyMIJFIYHBwUKVNR0dHy4iTOj0AJANhtFQG\n0IJQpkOksedFn2yj4BV1kKlJMzY21gJCZEaTz+cVDAjOJOWE6FvgNEgEAoEWbWDaHzMbZE8DgK7Z\nbrfLSogZDYF0dC3lIUNKAomw1BDi/WHAjEaj6ukYJ3Mmk6mFYlMul5HNZiWAbwSVzszMoKurC6VS\nSe6uAKTZbLQnApqBKh6Po1aryXaI+zuXy8FqtQqp39HR0WI1c3R0JEoKr4GZF62COAUEmmUUD9Xl\n5WXtYeKrCoWCbJe5h3+Ql3l7etVe7dVe7+s6c0HHbDZjeHgYw8PDOp1v3boFv98Ps9mMb3/72/j2\nt7+NsbExjI2NIR6PY3Z2FplMBplMBru7u6pFrVYr0um0OEff+MY31Kzd3d3F6uoqVlZWsLKyIjAe\nT3SjVovZbMbXvvY1NfaINo5GozrJl5eXsbOzg52dHaF8A4GAaAChUAihUAhbW1solUoiJ5K709nZ\niWQyiXg8LhHt1dVVrK6uYnd3F1evXsWlS5dw7949LCwsYGFhAel0GuFwGCaTCX19fbIRoZYNzfjo\nP0WtlGq1iq2tLQmJcSJCZwv6Wnd0dCAYDCIYDMLlcuHq1asqU9hgJ7k1Ho/DYrHg7t274uzs7u4K\nVcz+jNlsxtDQEPb29uRBTqzQwcEBUqkUjo+PUSgUsLm5KW4cT/X9/X2USiVJwbIkslqtKBaLwhGR\nsEiC5+rqqjLYVCqFyclJNBoNrK6uIp1Ow+12Szuoq6sL0WhUBnXMlJ48eYKlpSUkEgns7++rIU/t\npNH/9k5LpVKiq4yOjuLOnTu4f/8+9vb2EI/HdW37+/tYW1sTT4z3h3iZgYEB2ddwD1OOdHBwEP39\n/Xj8+LGeucPhwMbGhloHnECyyf/CCy8I+8NmfH9/P5aXl1UW87MoPkZpC6PuFKuDZy1T42lK6T+i\ny2Qy4fOf/7zSzVqtpubp9va2PHiAUx4VJR0vXboEAJqeEBRoVLivVCoIBoMIBAIyE/vGN74BoKlZ\nw4a0ERXNHsr6+jpu3LghvRKgWVrs7e2hv79frotAM02uVqvw+XxYXFzE3NycGuI0q+e/YclD1wsj\nKM0IBeju7pZQFB9poVAQs5ubxChdubOzgwsXLghhbGTOkyNlLLNo6sfeBzcc0CzBiIS1WCwqRTgx\n6unpEWKY17C0tITXX38d9+7dw7lz5wTmA5ql6eHhIQYHB7G0tKQ+VS6XE4O7XC6rhCqXy5iZmUE6\nnVaZx/udy+XUczo6OkIsFpOcajabRXd3tzSW2MQlYjyfz8Pv98Nut8vrjP+f35llBSdrOzs7GB8f\nF4QBaMI7NjY21LthicnyhwHKCF2gTrbX65VtMwBpEDkcDgFiOTm6cOGCgiQAodu5h1KpFEZGRiQ2\nBjSR8zabDTMzMwr0/Dvey4997GN4++23VZ4fHx+j0WjIM213d1cB/uTkBF/84hefasIAnMGeTiqV\nagk6NpsN8Xgco6Oj+PrXv65a9Jd/+ZflbrixsaFGZCwWg9vt1ggyGo3qZ8hSn5+fx927d/HRj35U\nvRua5bFByJdqY2MDJycn+M53voN0Ot1iVXLr1i0Eg0Fsb2+3nLoUwDaZTIjH4xgfH9fGuHv3Lqam\npmAymZDL5bCwsACguWkp0clmKKcEsVgM169fR6VSwdbWloIEbX9pP7O6uqqfISu9s7NTLy6b2LFY\nTPW9kYxYq9Va+k9LS0uaOJEEyqkgm6smkwlHR0coFApiYTNQ0Qqalrts/NpsNnzpS1+Scd3jx49b\nvLdsNhtcLhcePHgg7yZufLLxjZIcFNJnQ7RcLmt65XA4sLW1pV4T8SlUogyHw6IJ8N7VajU8efJE\nLykbtQsLCxgbG0Oj0UAsFoPf75fwVzKZxOTkJO7fvy+fMu7niYkJPH78WH0wWgiRw8VMj3/PvcgA\nb1Tqo0GAyWSSMSP7TBcvXlSvyW63a88Rofzw4UNkMhnJgAAQpukv/uIvWtxjyQsjSn19fV0Yp8uX\nL+O91pkrr9jkpD7r/v4+jo+PEYlE4Ha7lf7FYjG89dZbuH37tkqBjo4OVKtVFItFCVR3dHRIIiKb\nzWJzc1PjYtIAGBzcbjcikQhMJhNu376N27dvI5/PY2BgQLo5xHRks1l0dHRgfn5eHlFG2QQ2pPv6\n+rC4uNgicUrWeCqVQjgcRjgcRm9vL+7evSu/a4IAI5EIAoGAcB4mkwl37tzBnTt3YLfbsbi4qClT\nIBBAMplEMplUiUOpUb6QsVgMZrMZxWIR6XQaDodDdslM75PJJLq7uyXGzuyv0WiorGJJ5vV6pcl7\nfHyssqRUKmnEPjQ0hHv37mFpaQlLS0vwer2a6FGHmKWf1WpFPp+XjAO/B/V0Dg8PUSqV5Ou1trYm\nysbx8TFCoZD0aY6OjlQKPnjwAPl8HvF4HPF4XCLu3/ve9yQdwZKa6pP5fF4um41GA319fXjy5AlK\npRIsFosOjlwuh6OjI+TzeZXWxv1469YtOJ1OJJNJPHnyRKUkYQ2UMuE9LJfLWF1dFb6JbhWUq2g0\nGiLMPnr0SO0I4pqoFBmNRhGNRhGLxXB0dASXy4WOjg5x6MxmM7q7u6WnzYOOTXli1np6egRt4J+/\n1zpzmU5/f3/L6Pn4+Fg+5uvr6+rIu1wuzMzM4NatW+ju7m6RrqSOMXlYRvmBSqUikaNKpaLJBC1e\nSOXnSfm9731PtsHT09Mt8pW8Dk4seEoA0KlVKBQwPT2tk4W2KjSMM2KIenp6JNNgxPAUi0UMDg7K\nhI2ZDrFF1WoVvb29ePToUYscRjabxdWrVxGNRiVrCkB2NRxNcxrByRl7K0ZhMk5f+vv7kU6nhYvq\n7OzEzs4ObDabsCPEA/EEJmmRmzWXy8Fms8krvaurS5+XSqWUdXC6BUB6M4QmUDcZgDSAjo+P4XK5\nWiZEoVBIgdY46aEEKEmzPKR4X3mPKX3B/UhfdhKBOT6msyx7Usx66fiZSCTk8mAsj0kQ7evr0/5h\nT5KlL5nrwCn4lb+TmSYA2UsTFW3E06RSKakE1Ot1jdNZjo6Pj7eI6lPt4Pj4WEoFPwifw3Xmgs7q\n6qqAVdlsVubudNM0+jCVSiWNranuRkwPSyqKdwGQPAT9pjo7O1XH/+RP/iSePHmiG2/UGqZ2LAF2\nTLep5L+4uIjh4WFtmo2NDezu7kp8jCRFoPnypNNpsbO5mfb29lo2a6FQ0Et1cnIix1DqzADN0TPl\nNsiCNzKlvV4v7t27p9ORm5V+RkQxc5GB7PV6RWtgGcXR8tHRkbI93l/2ZwqFgpj9QDN1X1lZUZ+G\n4/d0Oo1AICAh/KWlJfmiOZ1OlYt8IfnnzByMchkAWigrTqdTjXSgiS4mgO7o6Ei9I6vViocPH+Ly\n5ctCK3OfsJFKzWreo0QigdnZWfU9iP/h/Xny5IlsZXhNuVxOhNJsNotkMqngNj09LW8wj8ejvg3t\noxn4SaUAII3j5eVlQTL4XTOZDMLhMFwuF1KplA40orVv3rwpIKXxmTNYmc1mldrxeFwCbgcHB9jc\n3BTK+gfhdM5cedVe7dVeZ3uduUwHOAWrGSUfS6VSi64IR3/f72E1MjKCg4MDaaKMj4+rJGMd7vP5\nlE7yROru7sbU1BQGBweRTCZ1slC3pb+/Hz6fDz09PS1Ats7OTkxNTYnDwt9Dh0mCAfkz9XodIyMj\n0s5hGUDaAacs58+fFwjRbrcjFAqJ50SUMDWLr127hu3t7RZeGMe4586dU9+KJzS/E5XweE9HRkbU\nEC6VStKf5jUsLCxgeHgYZrNZvJ9qtSpAHpupLMmi0SjGx8cF12eZUq1WUSqVZPzm8/n0zPlMs9ks\narWaTuVSqYTJyUlsbm6qB8PstlqtCtCYTCY1eQGaDV63242BgYEWCyPKgNA7jJKqQDOzDAQCyOfz\ncLlcLXIhlLo1NtUByKvc2P8Bmpl7OByWC4hR5+bixYsYHBzUNJX3h30X6kcPDQ0pw8/n8ygUCmrM\nE2TJ/cB+lFFjioOW4eFh8bj4zOPxOJ5//nnY7XZsbW3puqlayOxvc3NTf2ekpjxtnbmgw2kFcFoO\nkdC3s7PTIh5FLAd1WwC0WLNSGMsIi6exWbFYRCgUwgsvvKCfOzg4EP6CfJjV1VXMzMzge9/7nhCy\nfEGAZvAjVYLllc/nw/z8vEpDCocDzdKC0Hgia4HTDUMTuP7+fpVXW1tbqNVqGB8fb3HdjMfjGBgY\nkJTqwsKCfobseiJajfY5h4eHSCQSsklm2UWpz93dXYyMjOD+/ft6EUwmE8LhsJDHHL97PB4EAgHB\nG7a2tgQ3YHOatAmWKeFwGHfu3MHR0RHOnTuHaDTagpY+Pj5GV1dXC/LZ4/FI/Y5cKSP/iw18v98v\nGx8AEkQn4psHEPlv2WwWwWBQ3mMA1Bim4h8Pk1AohMPDQ+RyOUxNTQlLBTRL3cHBQU0E2WeZmJhQ\nYDCbzQiHwyozKVdKETLj9IwiXvV6XUEdaAY+7lW/39/CRyROh0GK7wo1cXg/BwYGNHWbmJgQgdUo\n2drV1aUmekdHB1577TWRibmXn7XOXNDZ3t4WC3d9fR3ZbFYukMFgUA0wNlQJTedp5Pf7Bdii6BJP\nPYfDIWtXSgaQxDY1NQW73Y6hoSF5iQPNh7y2tga73S7AIYMLT4yRkRHVu8CpLCpJe1SCA1qbv98v\n3MR6mgJTRlJeb2+vzOb4WR/60Ifwzjvv4NKlS1hYWMCowS2D0w2+xEZtXpII2Z/hC9rT04N0Oo3+\n/n7s7e21NA45Th8ZGdHYFWg2M+luUSqVMDU11aLoR0VFo/MGT3WOwUnK5Hd3Op2IxWIolUoKyrlc\nTnwiKu0xIBYKBTVoE4lEC1eJv8tms2maCZxmaBcuXFATmQGOWsN0xGQ/jpgaytkODQ2JdGqxWHRf\n9vf3NaAg6ZXiWltbWxqZf+ITnxD3y+jwSW5cIpFQsOQ+SafTCr4EehpH4+QWZrNZXQOF4UhSNTqq\nUsqFz4/LeEhYLBZ897vf1bMwCvM/bZ25no7f79dI0eVyYWxsDJlMBuPj40in0yppqCPL1Jluhjs7\nOyLCUbaUSvdms1k/T9FwuipySvbw4UN4vV79F4/H4ff7pXdDGYdqtapGZywWE5dndHQUJpMJ9+/f\n17ifY2Gv16vrJMiMiGQSLUulkux2WZbZ7XbE43FNfDweDzweDyKRiEo7TpVu3ryJmzdvyo/d6XQK\nQEbHhUQioUkQr4UvDU9/ZlR8FsZpHPViWJp4vV5JW25sbOi6XS6XODscGSeTSQwNDeHg4ACrq6sI\nhUIa0xLwabSy4RiZbpxs0hLTxDE1Sw029+kAwsY/m9cs2cPhMEKhkJrnAFqmWalUSmqDHH9nMpkW\nAXlCEkjQ7evr0zSTgW94eFgutQyi09PTmJ6eFhCUGSm/K3llnNIRBEoJF8pXkATL72qxWGTtY7Va\ndb97e3ths9mQy+WU3RJdbLVaMTAwIPtpPu/j42OVwUdHR5JZAaAy61nrzGU6lUpFUZi4GgLIjo+P\n8eDBAwAQInVxcRFut1vpeTabhcViwfr6uk5qgppYAvBh86EBzROEVACWQACUTq+trcHj8bRoyaTT\naU1tqtWqTkSn0ymsUDabhdvtVknGkTA3qhEZygDEiQ5LPDpilstlHB8fa6JDKU2XyyUtHWOWwX/f\naDSwsbGhcoSnmNlsbtFGYSCgtkqpVGrJjngq85nws+iHTowVr299fR2zs7MtDgYApIHkdDpxdHQk\nbRqgiRSmwDzRs0CzVOvp6VGpeXR0pBN3bW0NExMTmsCQLgBAdA9maNwLHHkTFUyMEQD1oDhp4mft\n7OxgeHgYGxsbkiJhZklQK8f/LF8I0djf31fWzH3J7GZiYgLLy8t6mRlE4/G4oByceBWLRR2AExMT\nKr+A5sicmSvLMH4fytAS4mB8NzY2NpBKpVCr1XR/tra2YLFYWlQYjFo777XOXNCheh3QHA9aLBax\nmOkKAUClxNLSUguOIRgMoqOjA6Ojo2I382GyMVetVtXA42ZnVpXL5WA2m3UNdH8IhUJShzPqKrvd\nbly+fBnf/OY39cA8Hg+uXbuGWq0Gn88n5C3Q7FP5fD49dKbNk5OTuHnzJhwOB0ZGRoTuBZoP3Ofz\nIRgMIpFICOLP7Iii5ZOTk7oG6j/Tm7terwv129HRIV5QqVTSdx0fH0elUkG5XEYoFFJfCmhuXNrM\nXrp0ScHayPYmPooNXpZavb296O/v14sTCoWwvb2t8T+N6vj8GGA9Ho8CL+2MqbdErhMAyZH09PRg\nb28PFy9e1GDh3LlzysaMDf14PK7MlxkgA4jdbm/xGmOZ8pGPfET+4ZOTk5JXAZpBcWRkRDbADIiU\n2yCw78aNG9I7pjaR3W7X7+C+SqfTmJqaUrBgwD45OYHNZsOVK1dgsVgwPj6u50fvtnq9ju7ubu2T\nfD4vGZF8Pt8y9g8EArDb7fIeYy+qVCrp9/p8PnmycQ+/1zpz5VV7tVd7ne115jKd5eVlna4ETblc\nLk1UWMIQsAQ0SypGdZZM5OhQjAqA9GvYtygUCvi3f/s3AMBv/MZvyLmBbG+gWecXCgUUCgXZBzNL\n6ejo0J8Hg0GVXVSw48SIRoFc9NziJAhoylqSHpBKpZDJZPR5JO/F4/EWLRSn04nHjx/jpZdewtbW\nlvpVQBN1zHq+XC6jq6tLWR1H748ePcL58+f1eZVKRRlWNBpFrVbT6dbb26sa/+DgQBOqTCaDQqEg\ntG9vb68yNBrgJRKJFscOsprn5ubw6NEjnJycqISh55XNZlOJBzRP6/Pnz0u3hn0uAIILRCIR2Gy2\nFp0bnuh0w+SEir0dqv1ls1lNlU5OTuByuUQL4HPY3d2V+V0ymZSSJNDMWCkhenh4KEjBO++8g5GR\nEQSDQaF/Kds6NzcnagEhCtz3/F60NWYWRnEtm82GRCKBVCrVct1E2/P58RnZbDaV/caSMZ1OY2Rk\nBFarFRsbGxoQ2Gw2IbtTqRS+/vWvq4XB+/6sdeaCjlGAiTeRCnvcwAAkAcEXkmUFGeL1er1lGgFA\nY1aLxYJEIoFKpSJxpGw2q56KEWJPsS2TyaQpCTcFiXeUtGDp5/P5JMdB6xSWeIeHh0ilUuqFsAzo\n7e1FJBJRSUbqAABp4l64cKFFrY4EVNoNLy0tqYTxer1wuVwqT7e2tlTC7O/viwd2cHCg77q9vS1e\nVm9vr+Q2gGb5uby8jOeee+5drpdOp1MTKFox81lw7Gs2m1VC7O3t4fnnn9f0KJ1OKzhsbm5idHRU\n4l5kXl++fBmpVEq8J2KMeL8ZCDmCZjB3u92oVCrY29trwSr19fWpQcwSlwHJarUil8shEAhIsxpo\nBkun0ymogzFY+v1+WQdT9gRoltqkKvBA4D6Jx+NSTuDeA5r9SmOzNxaLKZCz/Lx3754E7dnHc7lc\nePToUQtlBmi2IjY3N3F4eCj7IKObKW2bgVP3zp2dHSkMVioVfOADH9ABxO/8rHXmgg5wigOgfOLh\n4aF8m9gvCIfD8vKpVCr6GWZDo6OjkmJgE5fTCer1Eg8CNHs3HNuGw2E1yzweD4LBoBrMxIsApz5L\nFLbmZqrX6y1TtaGhIW0MSkAcHx+31PE+n0/C4QQKctMMDg5iYmICg4ODSKfTCiyUtCSfy+/362c8\nHk9L8O7v7xefbHl5GQ6HQ70lNpO7uro0sRseHsba2hrm5ub0naanpyUvyntgDFLBYLDFCcHtdmNo\naAiFQgHZbFYvvM/nw3/+53/i4sWL8oFipmoymTA2NoZkMikyKQAFbjqAJhIJBX+r1QqfzyclSb7c\nQDMw+3w+OJ1OWK1W3XM2l0mrMHKVqIk0PT2NWCyma7h8+bICN/lzxv9/fHwsLW/+HurlEFMTCoWw\nuLgIAOKjEY5hpL1ks1llwl1dXbrf1WoVHo8H4+PjAhzynahUKvB4PGpok66zsrKCkZERSabQHBJo\nZss0P9jd3dXhODExgYGBAXEUjT5aBB0+a525oGNswhHEd3BwgK2tLdTrdaFxqR1DkXGevAw077zz\nDmZnZyV5ADQ3O43HCoUC3G53C3mSAWRvb09ZEkWTFhcXZVBnJPnxxLVYLML8PP/883J3YBrP71Qs\nFmXMl8lklLUQk1EqlRQkmL0RMMiXiacRN+cHPvABRCIRbVQA8kTf29sT94b3gZKrmUwGw8PDSt27\nuroQi8U0CaMgPXDqvEm+D3+GesecBiUSCWVolHGlbQtfahIs2agtFovKNjgNtFqtiMfjklGg5Aed\nJ6vVakspScxRb2+vyiCg+VLF43EMDQ0pI+Nz2NrawgsvvCCsC8tPt9vdwkZnsF5fX1dDm1kVS41G\no4ELFy5IqItN7oODAxweHorEevPmTb3wnFSOjIxgaWmpBfvEMqpWq8Fut2sSRSQ1uWJbW1t65mz8\ncsrGz+vq6kIkEsHMzAxyuRx2dnZ0DbyPhG3wuRaLRQmJ9fb2YmFhocUf/r3WmQs6TCOB5oMkGe3c\nuXN45513lJkQWUn/KD6UarWK6elpOBwOAbyYFprNZkxNTSGZTGJ+fh7nz59vcVagBIQxZeU0hycC\nUcPAqRZyNptVag2cWgdzImJMnUmyvHLlikCHXCz9nE4nHj16hNnZWQCnou0ul6vFMrevr09uC/V6\nXbgLoJmGEzbAXg1PxI2NDVitVuFJGHjNZjNMJhPOnTsnLRVusO7ubrkwUGaCf05KyvT0dEuq7vV6\nhUpmZglAUxfSJg4PD3UNlLc4ODiAz+cTSHNwcFATp46ODly5ckUvAbMYZlp8TgCkKnlwcACTyaTM\nhN5PJAgbhdlZ2hndIoBmEO3u7lamaXRyoPwGcTrM6qampnRQlkoljP635TRwio7PZDItVknMcDo7\nO1GtVmUhDDTLOJPJhK2tLbhcLng8HgWX/f19NBoNTExMwGaz6fN6enpQLpext7eHVCqFS5cutfi+\nsZwkChxoklGJFTo5OUE4HBao0SjG9rTVnl61V3u11/u6zlymY4y2JK+ZzWYp1bOp19HRgfX1ddWt\nxtR9dXVV6XY6ndaJSCW9QCCAGzdutIADC4WCCIVut1ulCDVkaJKWyWRa6mtq7ySTSTWl+/v7cfv2\n7RZhLJZRKysraDQaEhZj6k6ENaH3nDIAUI3OdJwnjcvlwsHBAfr6+iSvSaIqDduozWK8DxTjYmnK\nk5KeUisrK7h69WqLdo/FYsH29rb6CDx5SZZkoz2bzeLatWsAmhnV5cuXEQgEEI1G9axmZ2elgEi3\nDK7+/n5JXlQqFfU5CoUC7HY7Dg4OkEwmcXJy0qJFxN5DrVZTOQVAsiI9PT3yiAcgPNbm5qa8qfhd\n6Vyxt7fXQvClM2sikZCkKsmbJK3SWZbZ8O7uLnp6uV5lfAAADbFJREFUerCzs4POzk7EYjGVfgSb\n0jmUWVixWEStVhMyuLe3V2Xc7OwsUqkU7Ha7pol8J/r7+/XvBgYGWiZ/LG89Hg96enpUurPdQP8y\n8szYSCbQkFgo4LS8f9Y6c0GH4CSg+cAItXe5XBgcHNSYvFQqIRgMit/DEa7JZILX69XIub+/v8XX\nicZuOzs7CIfDAmp9+MMflsUMWctAM/0kWnlzcxPBYFAvaT6f1wO8dOmS0lkGMApkVSqVFj2UXC6n\nhivLQnJs2Ed57bXXWnRigFMOllHwqr+/H6Ojo3j06BGKxaL0myuVCg4PDyVmNjY2pvvAl5QkSWMw\nYoM1Eom02PNms1mYTCb1SFjiUXCddimTk5PanP39/YhGoyKmMuisrq7KrZRseL4E7JkA7y61SVUh\nb4ylzZMnT6RHw2DDz4jH46jX6wKC8oUvl8uYn5/H1atXAUBkVQA6mMxmM3Z2dtSPy+fzmJqaQq1W\nU+ljtGpmADaKlzN4UiAukUjg4cOHAJq63IRV9PT0tLQOOBzg33N/c5JLSVIjiPTk5AShUAhWq7VF\ngI2BmFraGxsbKpsXFxcxMzMj2IGxNGaTm9AHY0n9XuvMBR3KZQLQ6c4Xja6ZAESCI0OXLw7Z2fRS\n4mkPQDwS+o9Xq1XhKei1RO8k3nyTyQSz2SzJRuA0MPb09ChAdXZ2inE8ODiIjo4OeDwecan4wEgG\nLJVK4iQBUN+HL3a5XNbLy/qc8HgjloLTrkajgUAgoMYvnU+NlrS8d06nU6NnozC7zWZDR0eHOFBG\naQuKpHd3d2NkZETPiJlZb2+vgtj3I7ZJUOQJOTAwIFyTyWSSGh9w6u8NnEpJ8No49aNIF19STrl6\nenoUmI1eUkQOk9kPNDPloaEhcdvy+XzLFI8ZiHFyRJMAwg2cTqfuN/cGbX95T3nIMYBUq1U9V4vF\nArPZjEAgoCDPz6AEC/cPYQjEjDmdTrjdbuzu7ur6CAFgk5n9StI9AoGAekR8X/x+PxKJhKbBxh4V\ncV+EPPDzfuzkSqvVaouvNac49XpdHtNA8wRLp9MSteZGX1tbUzrvcDjg9XqVAnPjlstlrK+vIxQK\nKXOiouDIyAgqlUpLlkGyHV8svjxMPXd3d5XuAs0TZ319HXNzc9jb2xMJEYCul9wslgh8GahoePfu\nXcluUGT++PhYhFgAAkzSwubmzZuampCVTo4XrWV5746Pj1EsFnH58mVtJtq6kJhIkiDQDPLcsIlE\nQtdAoCEb8EZ8ESVJqPDITGd3d1eKerQK5qnMF7G7u1vaObynLBmpP82/y+Vyytiy2az0joHmyLyv\nr09mhcxGDw4OsLOzg66uLuFkiAGjfbDD4RCDHmiWPYVCoUXpgN+J+JjBwUGUy2VNwmw2G4rFIsLh\nsAiXDIiVSkXGeg6HQ5moz+eTlQ1pKmxMM8BwRN/R0aGAzbKO1BjuU4q1U7Whu7tbpVe9Xsf58+fF\nWVxaWgJwqp5Iu+HOzk7tEzbGn7XOXNDx+/3KPtg1j0ajErViajo8PCyLF6OWjd/vR39/v6QwqtWq\nNjTtVXmaGmtTo0BRZ2enei1bW1tKSyn1aHRV4AlCgWwAsnGhmr9RH5i9idHR0Rbb3vPnz+uldjgc\nLfKnbrcbFy9e1PdicJuZmUGj0YDNZoPX60UgEFBm4vF4sLa2hlAohEKhgEQioZ5TPB4Xh8tYrrGM\nIPZnfX0dL7/8MgCofMrlcqjVaipTOBljRkFwJXDa5zg4OFDWCTSxVPPz87recDissmhlZQXBYFDA\nUN7r7u5u7OzsYGhoCJlMRv+Gz4zlAhUFmCF9+MMfxvb2tvpeDLxEnjMbNNorBwIBrKys4Ny5c4Jl\nAM2Dgex//l6jPvHk5CT29/dRq9V03bT1oYQHS2gAssDhnuP94cFIorBxlE2+HXE4RuiA0dCANtQA\npLnd29uLXC4nbBvQDIp0gGWmCJxCF9hbikajCsq0e3rWOnNBJ5VKaQPW63WNdyuVSotfOFX0HQ6H\nGl0ABLSiwh0xDwBEJRgYGBC2h8GGxnGZTEYoUgDyfqpWq0JnMhh4PJ6WPglPAjKQGXisVquyt2Kx\niIGBASSTSWSzWb28HR0dEv7mtfDvisUicrkc/H6/MhGguZkoru5yuaTeD0CgN2oxGzVZCLmn7jDL\nFJ62FEs3rkqlov4Z9YgAaCNTxZAjY6DZSKbbxObmpu4BRbh6e3ul0se/o8MCyb5GSAFxP9VqVVAE\noBnkSUglsZQvFUsnPlO+iIeHh5icnMTR0RGGh4eV7fBZDgwMSK+ZtJxKpaJs2el0wm63t7CwDw8P\nRSXgM+rq6pKeDqEVvD80EAROtYe4F1hCU0LFaEVMZLHZbJaSIdDMgqhHTfEt7nuSOqvVagsUwufz\nIZlMwm63o16vq0wkho0HCLWSgda+69PWmRuZ/yDa/I/TMk5tftwXy9gf90VU+//P68xlOrFYTBuU\ntqdsrOVyOWUW5XIZW1tbyOVy2N/fV+RmyswxIHBag3Z2dmJ0dBTlclkWLEwZZ2ZmsLq6qhTcOBbf\n3d2VIwP7CkATRcyT1Gw263RLJpNIp9MIBoPvcsRMJpPw+/2o1WooFos6XWlVy99569YtvPrqqwAg\n6UoSQfkz7C/RJvno6EifQQVEZl2RSASvv/46AGiSFovFcHh4qLLw6OgIh4eH6O7uxvb2Ntxut8iJ\n3d3d0lshShuAqBfkELGfxfuez+dFxDRmYTs7O5K02N7eVjkSj8cxMjKie0zuFYW/qtWq5Fz5XWOx\nmIiWt27d0oABaJ7kpNLE4/GW50oaDcmeLLcPDg5QKpUQjUaF7AaaU7JwOCxNGwIlAcgCh/Yu3Fcm\nkwm3bt0S5YKeVvw9+XweV65cUT8MaGY99K9iycPvanQmdblcmJ+fV0bDvUZEtzGzzWQyMJvNePLk\nCS5cuKBMkHveZDLpO/O58nlRaoQQDpaHz1pnLuh4PB65I5JsSbtdqroBUHpbq9UQCARUDjD154tZ\nrVbVkS8Wi/o8m82G7u5uTQzsdrvQneS7AM0eAxvIk5OTyGQymoYxBQ4Gg4hEIppk+P1+dHd3w2Kx\nyLeaqSnFqGjXwusMh8OwWq0iYZ47d04PnahZ/num2uR8mc1mjVT5XTs7O9Hf349gMIhkMtkyueF0\nhhMQo9iTxWJRsF9YWBANgeqBPp9PHkoAREmgRo/Rq4rlCfsw/HPq71LfhoEBOG3Ou1wurK6u4vr1\n6wBOp1o2mw1HR0eSFAUgagSpBg8fPmz5XY1GQ/7zfA7sf9DPiWU6fyaZTKokNcp00u+b01EGJN4f\n7gH2JVdXVzE9Pd2CYmaQHxwcFHamVCopSNjtdlFXrFYrPB6PyhyW67QOHhsbUx+P7wT7TixNOXki\nd4/3E4Cayk6nE319ffo91E4ymUyCffBQ/bHyMn/ttdfwrW9963/7MtqrvdrrB6xXX30V3/zmN5/6\nd2cq6LRXe7XX2V9nrpHcXu3VXmd7tYNOe7VXe72vqx102qu92ut9Xe2g017/Vysej+Pnf/7nMTEx\ngWvXruHjH/84VldXpfXTXu31/evMjczb60dnNRoN/MzP/Ax+6Zd+CV/5ylcAAPPz88KgtFd7PW21\nM532+qHXW2+9BZvNhl/5lV/Rn83OzgpnAjSRxq+88gquXr2Kq1ev4rvf/S6Apvj6K6+8gueeew6z\ns7N4++23Ua/X8ZnPfAazs7OYm5vDn/3ZnwEAIpEIPvaxj+HatWt45ZVXBAj8l3/5F8zOzuLKlSsC\nSrbXGViN9mqvH3L9+Z//eeO3f/u33/XnGxsbjUuXLjUajUbj8PCwUS6XG41Go7GystK4du1ao9Fo\nNP74j/+48Yd/+IeNRqPRqNfrjWKx2Lhz507jIx/5iD6nUCg0Go1G4/XXX2+srq42Go1G4+bNm43X\nX3+90Wg0GrOzs43d3d2Wf9teP/qrXV611w+9iLZ9r3V8fIxf//Vfx8OHD2E2mwXxv379Oj772c+i\nWq3ik5/8JC5fvozx8XGsr6/jN3/zN/Hxj38cH/3oR1EqlfDd734XP/dzP9fymQDw0ksv4Rd/8Rfx\nxhtv4FOf+tT/zJdsr//nq11etdcPvS5evIi7d+++57/50z/9UwwODuLRo0e4c+eOOD0vv/wyvvOd\n72BoaAif+cxn8A//8A/o7e3Fw4cP8dprr+Fv/uZv8Oabb8qg7/79+/rv8ePHAIC//uu/xhe/+EVE\no1FcvXq1RQGyvX50VzvotNcPvV5//XVUKhX83d/9nf7s0aNHLez4/f19iXZ9+ctfljzD9vY2/H4/\n3nzzTbz55pu4d+8eMpkMarUaPvWpT+EP/uAPcP/+fbjdboyNjeFf//VfATSb148ePQLQ7PVcv34d\nX/jCF2Tb014/+qsddNrr/2p99atfxX/9139hYmICly5dwu/93u+1qAD+2q/9Gv7+7/8eV65cwfLy\nsoibb731Fq5cuYLnn38e//zP/4zf+q3fws7ODj70oQ/hueeewy/8wi/gj/7ojwAA//iP/4gvfelL\nuHLlCi5duoT/+I//AAD87u/+Lubm5jA7O4uXXnpJxn/t9aO92tyr9mqv9npfVzvTaa/2aq/3dbWD\nTnu1V3u9r6sddNqrvdrrfV3toNNe7dVe7+tqB532aq/2el9XO+i0V3u11/u62kGnvdqrvd7X1Q46\n7dVe7fW+rv8DcmMMZpJu4MQAAAAASUVORK5CYII=\n", "text": [ - "" + "" ] } ], @@ -402,28 +586,28 @@ "stream": "stdout", "text": [ "name\n", - "proboscis monkey 0.920136\n", - "tiger cat 0.916973\n", - "milk can 0.791307\n", - "American black bear 0.625850\n", - "broccoli 0.609467\n", - "dhole 0.513998\n", - "platypus 0.507829\n", - "tiger 0.497029\n", - "lion 0.481180\n", - "dingo 0.474689\n", + "bicycle 0.773379\n", + "person 0.545096\n", + "unicycle -0.210110\n", + "motorcycle -0.503959\n", + "table -0.591293\n", + "cart -0.628063\n", + "electric fan -0.664937\n", + "purse -0.674998\n", + "baby bed -0.677444\n", + "plastic bag -0.717950\n", "dtype: float32\n" ] } ], - "prompt_number": 5 + "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Okay, there are indeed cats in there (and some nonsense).\n", - "Picking good localizations is work in progress; manually, we see that the third and thirteenth top detections correspond to the two cats." + "The positive detections are in fact a bicycle and person.\n", + "Picking good localizations is work in progress; manually, we see that the top and second-best scoring detections correspond to the bicycle and person." ] }, { @@ -433,8 +617,8 @@ "# Find, print, and display max detection.\n", "window_order = pd.Series(predictions_df.values.max(1)).order(ascending=False)\n", "\n", - "i = window_order.index[3]\n", - "j = window_order.index[13]\n", + "i = window_order.index[0]\n", + "j = window_order.index[1]\n", "\n", "# Show top predictions for top detection.\n", "f = pd.Series(df['prediction'].iloc[i], index=labels_df['name'])\n", @@ -442,13 +626,13 @@ "print(f.order(ascending=False)[:5])\n", "print('')\n", "\n", - "# Show top predictions for 10th top detection.\n", + "# Show top predictions for second-best detection.\n", "f = pd.Series(df['prediction'].iloc[j], index=labels_df['name'])\n", - "print('10th detection:')\n", + "print('Second-best detection:')\n", "print(f.order(ascending=False)[:5])\n", "\n", - "# Show top detection in red, 10th top detection in blue.\n", - "im = imread('_temp/cat.jpg')\n", + "# Show top detection in red, second-best top detection in blue.\n", + "im = imread('images/fish-bike.jpg')\n", "imshow(im)\n", "currentAxis = plt.gca()\n", "\n", @@ -469,47 +653,47 @@ "text": [ "Top detection:\n", "name\n", - "tiger cat 0.882972\n", - "tiger 0.073158\n", - "tabby 0.025290\n", - "lynx 0.012881\n", - "Egyptian cat 0.004481\n", + "bicycle 0.773379\n", + "unicycle -0.519379\n", + "scorpion -0.902484\n", + "soccer ball -1.148745\n", + "cart -1.167148\n", "dtype: float32\n", "\n", - "10th detection:\n", + "Second-best detection:\n", "name\n", - "tiger cat 0.677493\n", - "Pembroke 0.064214\n", - "dingo 0.050635\n", - "golden retriever 0.028331\n", - "tabby 0.021945\n", + "person 0.545096\n", + "swimming trunks -1.098802\n", + "plastic bag -1.130418\n", + "rubber eraser -1.185333\n", + "tie -1.195762\n", "dtype: float32\n" ] }, { "metadata": {}, "output_type": "pyout", - "prompt_number": 6, + "prompt_number": 7, "text": [ - "" + "" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\nAAAAAElFTkSuQmCC\n", + "png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEACAYAAACqOy3+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvVmMbll25/Xbwxm+KeaIO2fenPPWZHeZKrfdIGhDyyqr\nBViA5EeEJZAQ/YD6BR54RGDBo9U8NQ/94gcElnE3WLYL0Y27LZftUs2ZlXlzvPO9Mcc3nGEPPKx9\nzvdF5M2yhdJKF45ddfPeiPjiDPvsvdZ//dd/raNijJHLcTkux+W4HD91Q3/eF3A5LsfluByX4//b\nuDTgl+NyXI7L8VM6Lg345bgcl+Ny/JSOSwN+OS7H5bgcP6Xj0oBfjstxOS7HT+m4NOCX43Jcjsvx\nUzr+Sgz47/3e7/Hmm2/y2muv8Ru/8Rt/Fae4HJfjclyOv/FDfdY6cO89b7zxBn/4h3/IjRs3+NrX\nvsZv/dZvcefOnc/yNJfjclyOy/E3fnzmCPxb3/oWr776Krdv3ybLMn7t136N3/md3/msT3M5Lsfl\nuBx/48dnbsAfPHjArVu3+q9v3rzJgwcPPuvTXI7LcTkux9/48ZkbcKXUZ33Iy3E5LsfluBzPGfaz\nPuCNGze4d+9e//W9e/e4efPmuc+sr61xenb2WZ/6clyOy3E5/n83tnavcfD04XN/9pknMZ1zvPHG\nG3zzm9/k+vXrfP3rX/9EElMpxf/0P/73oMFkGfOq4sGjR1RNizGGPM8ZDAZApKoXxAjVosb7QFGU\naG1YLBa0bYsxmjzP0EaT5wPOzs4YjUbkeU5VVRhrcN7TNA02y8isZdHU4B1aa4wxGGMgRmKMDIqS\nuq5RIaKUwnuPMpoQIyjwzmNt3t+HUooYoxwDyI0meAeAtRnd5GqtCSGQZRlKK2IIEq0oOc43/69/\nzr/zS38XpcA5j9YKpXQf0SgURhnQCuc9IQa0tTR1TWYsWmsIER0hKk2LAiKZ0Vhr0UoTiTjXEIiE\nGFFaUZYD8izDKo01GSpqXNPSti0xzYmLDlkmEVByL0QCkGUZeZ4TIxACxIhKc+MDZFkOKJxztK4F\npUmXJteMwseQkITca0zz+s/+z3/Kr/zKv0tI86sUhBDRShFCIMaI1jJHWmu01v01A8QYCWmeQwj4\ndH0XP9c9yxDo1wRA8AGIKKXPnQcgRNefo1sH3Vg9tlKK1jlCCOmaQevl9XbX112Tj5bWR4zWGKsI\n3qNQxBhARf7g936Xv//3fxXvHIGAMnKctvXL4wRZtyGE/jxGQwwO5xxRQUTWg1K6n3mDPI9IJKoo\njxuNtgatDVVVYU2OtoaIxjmHdw6NXK82pn/2Si3noLtP7z1Rq26Szs29VgrFhehd+eWchkAIqt8X\n/bzLAfjff/e3+eVv/PugYrqbkJ4/hPR3DHJLPgY5fIQYA9HHfu5C2rFKK7TRsqblLuS5p6+NsaiV\n+1JK0bhWfjsqolyB7J8QiRGZ15U1svr3cg2GT3z/H/23/yWfZqY/cwRureU3f/M3+eVf/mW89/z6\nr//6cxUoW6MhVVtjcst4tMHu7jatc5zNZuwfHnB2dsx0OiXUbTLaYmCsAmIktwZrNCHKQ/beM59P\n8cFxdnbCxuYm5bBkOp3ivU8bJNC0DSpGWt9iosEYjVZprUZo24YQPFZrtFZEFI1vCDGQ5yU2z1Aq\n0raOLMtwLmCMoXWyOXSZo9JkO9eidHoYyqI0+NCIYVBAVJAcRQge7xtZ1yrig+oNg1IKjSEGBUH1\nm02FyKgcEIInhohSYhwCkBlDZowYDe+JOiTjEzFWy8+iJ4QWVzvaIE5CBYV3AWssSmlCDOIYjMZY\ni7UZxsqyiUphrOkNVnCe4H0/lyF4zs5OiTGS5wV5lsm9RiAZMe89wcV+k4cQQCkwBojE6CCmDYxs\noIgYCq3TBo4B7wJBiV0QvyiGyIVk2JTGmKXzCD6IkWL5WRQ439K0db9OO4MeuucRxcjo5LhX/6iV\n7/WOVylQBm0M2sCqjQoh4gNEAiqkOVQmbXhHjIYQPEYrrFZkmQUibbNAK4W1Bh8dwUOeWUDhvSMv\nSkLQBB+Tw9Co6EFrsrIUwxsCSht8iKRpIEaffLQiqs7JhWTwHNZaQnD4xoFSGK3JigwdBLgRI9rI\nNTsnDg4F0SWnZUxvwHsnlx6YSg5y1VDp4PvnI4teHHIMjg7WkByQUWBN+rSCgIKoCCYCGqLC+86g\nIuAoRkJQoFeeXQjpWhAgFkICUvIZa7UY4+DScUGnfZcZQ6QDDjFtcXFOAXHeIcg9e6WTD5PPypqR\n60pGAHi+0V4dn7kBB/jGN77BN77xjZ/4mbqay+Z3jqPTE8rhAG0Mu9sb3Lx+hbpuOTs7Y60YopSi\namqOj084Pj5hXi2wKuCChxgxycgFNLNZRZbnnJ4e471nMBigVSTPDHVd472nKErywVCMh/e4CJm1\nCWlohmVJlmXJKcwZFAmBR0XTNIB4SucUZVlS5ANijMxmMyKQ5RnOOeqmwVqDC44sZRu0Ap1Qk1aW\nPg2hNAFFCI7npREMlqBXvLQSBBGi79GWScYmoghNIOhk8HxAKciKLC1SQVgxRtrQUvuIBrQysilt\nJutHJVNpsh7JVXUNdU0bfI88iqLAWitoPCvIbYa1lkU1Y319HWstbdsym82YzeY45zAmk2jESgTU\nNvV5VOxaYvRoFQkxEHzsEU0M4jTFqfkejXd/BK3LPA3Gw35+YoyCQGPEWisbsd84iuAFgHRoTD4T\naZrmEyj7LFGAXQTXnVOM3BL1a62pXdrQKw4ZJEJTOpy7b6W02KToUSqSWYNWoILj2bOnPHx4n3/1\nL/8F169fY3t3h8naGkVRoLWirhtGwxFVVaOVEWcedO8ztDGCHJVFBQ9aUVhLDAGCIjgvUUAXrSRj\n2Bmltm37dSDRqcN7B0EiLOVk7rvn1EU9Sonx1tpTtw6jdL9etEkoNoDRYrz6yDbMIUUK3Xl1t11S\ntLBErAHn2jSPy6hGzKAmIlEBiBHWKv0sKDTLZ+JD6K/fR7DRLKOnEAlRJcMr4CudXPYCuje7yqgE\nM0gRb3efgsKjkkPEqNApsowxolVM34/n98OnjL8SA/6XGXZQ0DjH+vqEcjLCWEPbOFzV0DSepq6g\nqjmbzyiKEmMtN6/u8sKNKzgfOJtOmS0W+OCpqoqqblg0DVd3tvBpU+f5kDKhd+cd4yLDB09mM0yW\np9+r8N7JBHrwQLMIicopGAwKdK7Ji5w8L2QhN57FoqJtXQqlIpPRhM3NDUHvNqNtao5PTsjzjLqp\n+4Uao4S9LgSCa/E+opXmhRdfoA1BPHZHJcSINYYQIz54lANj0wqOYFBUrhWjQcBkmtotr0mlTayM\nRSlomgaTWdqmJSZH4pwTI2GshH0x0ioP0aOVJZIWrPcozNLfRIS6SsjZuTZFL0ITiaH1GDNfIquo\nKAflyobw4ISmCNGlTZcWfQi8fPs2TVP1m6tbzNZkQMT7FqKEu6anNkJP9ygVmU7PeqrFWosxS2R5\nPoxVeNnmgvhdpHb1kiLTQqt0FMra+roE6t29pHXdNA0+BPSKsQ8rxiamcyilaNvmE6izDQ60FpQZ\nI029oK0rmnrB2dkpa+MB0+kBH75/wv37JUVZEmJkPB4TY2RnZ4+9K1fIshJrcnxosKYQ9KkMrvWE\nCDFRcq3rqJKI1hYFWBMxHdVB7NkO5wS8dA7PaKEIfQhkxqZIM5kwedxoq9Fp7lwIKYqQ51TXVT+n\nSim89lilUVqLUbX50pApI39WUHuMMa3PyOtvfCFFIZ2jF3BBVCnSCYJ+AaV1D3I78KdVoia9o01R\nmzEGhRKg0dFw3qdIaUmfSeTjJZpJX+sV56eiUEwBMFZ+z6N7xyhrUPdOr6OxSMf6iXb0J/70r3B8\n8PAeWZZxNDsFYFgMGA6GECJeBXI0aIPJjCCS0BK9IWKwWjEoLBsbexJ+KYPzTvirCIvFgtlsJgZ6\nsWAxXVA3DcPBAB0jw9EAm+dU8xk6Jp6zI8iITCZjtNbMZvOEAGE2OyPPckGhlRiqum4pigFZljPn\njPl8QUSRZbmEqd6TlwXOBwxCN9S1QxtL6wOj4YTxeJ0YPdtXriQ+UXF6egyIMZ1VC2KICbEIR+d8\nK06ibWnalrwoaJqaUg9k02jQUeGDYzFfMEibPALBOWyR47zn+PSU2WLG2mTExvo6WmnqpsWkcM+k\nzauMkcXvHNGLc1MJhchmjr0hq+uaQMC1jqKwPbVDFO6yo7NsbnvDGVE972yMOB1P4M4X30R3/PNK\n6I1bcuAhRqKPxA4ZxiCIUik5t6G/Ru9bmdcQ8D5gjE78tjip4HzihAVRka7LGC3OttvAyRCYhGiN\nFmpGoTBWs8S8Mj8a0xuxtm3TZve9QRiNRiwWC8bjMaXOePToIW+//SNm0yl1PafILE29YD6d4kOL\nMZ7TtmFRtbz8yusYo3n65BE+eN57/x1euHWb6zduMRpNWF/fom0XNG3AxkL2SKKucKF3wDGmaKtz\nbmqJhE2in3RHqwSJikAAR9AarIJkhEAMvEXWq1LCCeugMGmeO6dqjJH58J7gIXQGNaHtpb2O6BjS\nNYlDVCi5HxV59dU3kgOhz6+oZCS7aLLPX4RAiH6F4hDj2h1LazHIzrUUtujvqTPe4nTFVSxzL/TO\nJASfnJIW+qSjAL0jhpQvUymqZ5lLA6GiJH+kEh351xSB6yyjDZHjg0NGgyGPHz2FENjd3sEqS3SO\nIsvJB5K4K4qcum2wKiMzgqTrpklcqMXHQFkWhODZWF9jY22Cax0dglBKURYFR0dHKKUYTjbYWt+g\nrmsOj46oq4osy1FKkRe5ILsQmZ5NsWWG1cI5e9fim1rolPkcV9eURUm2ts787JSgNNs7u8SgefLk\nEY8eP6AsCq5eu8agHBJjZDKesLY24fh0xgcffYgxhtFQuOzRcMhkskbT1ITgybOMuq4ZjUdkuWU4\nGPLs6TNC9GijscpKAncwkMVoDC54qkWFMZZyWOJ8CtMBpS2nZzNm1YKmbZnNKpqmoWk9o2FJdL43\nSkqZhFQ0yliCC1gtNI+1luAcdRN62sAYgzKJ0zXQetcjZHrjQG+Uu7DUGNPTFcF7wasJYbngUKFD\n5mIQfecUlKApEq6NOoX7kDYtkrniXM4MBeSZGFXvPW0jDlmbHFbCdZDNXlVViuhySbZZne55eR0Q\ncd6jgnDT3e/K5nb46IWHT3wrsZvfjBhaBmXGbHbKd777Z7z14x+ymM0ZDktc0xCjJ88s1miMgaoW\nYDE9PeWH3/suk7U18jLHe6GHnj17jA+OQTnmtddzimJIXlhciNR1jc2yxIFHvBPeW6XEJt06ST5I\njLsXTj3RIR2NFaJEFMGaZRKwzwEkY69WpMWJO7CZJNUhEnwQfhwtlEzKGSqlMFl2jiLp6BNYRkKd\ngdd4lk8/xTkqCJpBLY05CpPplMCMqHS9oaNutCZlX3De9Y68cw59EjU54C4a0cYkeiX0997NV3c/\n1miw9JGBCitrNd2M6ZPliqBUcpSfPj43A373nfcoBgOapmEyGWNNxvRsjtYnlEXJ9uYm2lju7z8S\n1KYUeZmzvr6WjqCwNkcroSPm85rtjTHT2axPWsUQsJlNWfwonJtSlHlOW9dMRiPKPMc1DaO9Pba2\ntgAwRnN6eprCpsh0MWM6m1FVC4qiYHL9BjbL+kTNs6f7zOZzRmWOMpZ2MaMocl69/ULP/c5PT5ie\nHDGfLzjKcra2tnABnjx4wHgyZnNySwyQb6ldS2YtjRM1zNbahJOzE+pacXZyhHeixmmalhAjT54d\nEGLExchkfZ3xcECeW4wx1E3DoBwkFY1hOl9weHzGk/1nmMyyNlkjxgpiTBFQoF5UosRJ0YSPDhOD\nRBUJ4pSqIPqUdEyINUSDD4mHQlQqkoAVVBrSAo0EnPd4H9BKk9lcONeUoA4+nk/hKEm0maTK6RNk\n3fF7TnZJafQbfCWrL4qF/j9iqK0mtyXWWqpGUHYMgnx8SvYRI651GKP6BFO3QSViyBKadnQJ6e6a\n2tb11+JiSuYpJbSP0dR1TZ4XWGs4OT7k7jtvU83OiD5werwQes97sswKrQisrY25dvUqeVHjGkdT\nV1ir2dne5GR6Sl0vWCxmnJ2eUtc1t27dZnt7D2sKyC3GatpW6DyxSp2vc5DQdUyKHFGwiIPt7kND\nos0cPgacET44xgi+i4A6/lady8cpqwkuJMOuZT2kpLZR2ZIyYckDL/MX9JHMKtJXStF4L7FcyhMp\nLUBBBUVMRrQzsJxToURUSCAjiiJKnk1GObDEZpWuCfjEU3cRow+exklUldlRSniKwwnJyItNMb2g\nwTmHNlqIkhT5r9JoPnkxpSQx+pPG52bADZrxYIzLhU/e2BzTxFOmdcPRdM7jwyP29vY4nlUiF7Qa\nvag4WVTM53OMtnjnWd/YxDtJsBwfHeKDJC4HgwFGy6RleUZwjsWiScipJc7maKWoqorTszMW0ylH\n+/uMx2OGwyE6szRNQ1mWXNndY1CcorWmLEtc25LnOeVgQAiBteGI2XwulEmec3Z6ymKx4ODgKePx\nGnsb62Kwgiff3aGuGlGooNjb2cQYw/H+M5RWuKZmd3eHjY0x+/tTvGs4PTwjKwqeHRywu7NLaTOC\nD2Ra8ezZIXXdkGUZbd0w01MyrVCFpvWKxaKmamq8h42tLZSxlOMRGyHStA7nA+M8Z200JjcZLjQU\neUZuJfEzGU+YzuUZEAJYg1FmSQG0bUKhIht03qGMwiXE6ryjTqqOLMvwTuGdF/pBC/UVq7nwr3op\nJZMNmELLKIjIEwRLaZM2hyz6Hul0DiBGSMBFd5RsojhUisuD91SuTVJBSfDl5UDUJVoMRZaiAkl6\ntr1qxnuP0sJh17XcZ57nWLvMc3TGKwQPURCV0QatSSoNT1MLWvMuErziB9//Dof7+0n9FGibRuYw\nShI0y0qs1WRZIWgZRV21siabhgcPHmCtphgGFvMz8mJICC0//OF3ef31O1y7coM8y3BtjQZslhKu\nWmEQflkjKqYmeKGVQsB7kZUKipR50VqTZRkmBrSKaCMJuc6iiDFPz6JHuSnvIU84GbokO+05dwlp\nYgigFUFp4Zu7JF9yot4nSSaC/qPuUG8kxETRmI7eUMQgACIGUCb0XLpK0bmNohRSnZQwIe6YELec\nNp0j+t5Z28ySa5EVt25FVhgBNNau0DZJliqKLQeIM19KI1c49hATV//XFIF/5Qtf4eDokJPplPX1\nTdCGazdvsbm5ybODfd544w22Nrd478OPOD4+whhN01SJVhmniYrM65YfvfU2V69cZXdjIgevWurG\np4cuiKDjr4OXDZchsqeiKCiyvEfq1WIhyb4kwZuenBKVJGo6VJVlGZPJhMVi0aOtIs8wpmRYFJjo\nGRYZJ4f7DAtLUeaMRiOszQA4ODgkyzKK8Zh8OGI0GvL2Wz/i+PiY7d0tTo4OCc2C4WDABx894OmT\nJwStcDFS2IxmUbFY1Ghtmc4W3HrxRSbrm0xncxrnGA4GFKViMV8AEjY7D64NnJ5NOZstqOoanWVk\neY5VjsVsgasarBFWushzoXHKIb4RVcNkNKKOnkEhvGD0gVbrpCrpAk9B0m3bJL2w6G6XaFXjY0BH\nURf44Gldy2RSnkNbhi5EjksQlwzBKgIHMcyxl2MmxJ02tInn0ZqOwrtmuZXwONEdoilWiccMQuXo\nJYdZZLkYurIk+ICyhsFgsJKEij2/vwzvJXcRfItzAWh7CqK7zhACs1nLyckJ3/vedyXh7gQgtM2c\npp6JMkYnPXUbiPMKOMa1np2dHaFHXMPa2oi8yDg6OREFzlCMQV057r7zY6y2XLt2DaOT+Y8eo0g0\nQtovStPVH3RIUhmNVkI3ke4zJm0zCrRZKiZ01KAUVmmiBpJTiEguKdjQo2aQCGl1vpRAbzBa/nT0\nRex4HnnGwZjeSSoFWpUsZY9L/bicQxENqCh/GxtER58MKmmNimI20HZKpTxDe9uxMHQ6bmMybGaT\nuikKdUUkeFFvGbOU1gIpxxJ7dC51J8t8AURCcHSKKJsoKSBROJ8+PjcDXqxl3Fy/zuj0lDt3vsBs\nUaO05eTsjHfeucvh4Qm7u9e4Pil5cesFlNEsFgvZwDFyfHRK2wYGVyY8+vgRhSp45ZWbeO9FLti2\nvWHx3rNYLGhaIQDmixnaZGhtmC+WErNOBtaF5b1ErFNVJL2yci2niyOqRUXTthRZic2yhB1arJJk\nxOb2VTJrMSpDB0N1Omd9bY2dyQaEyKAcsbm1gzGK/Y/u88U377C3u8ufP/sTbo23Wczn5NOW//kf\n/WP+8//01/E64g73xan4yO72Lqf7j6mNYdy0bBUlH99/yGRrjawI1Gc19dEpXmf4rKDcucF6OWFx\nVjF7dsTO5haHj58xHVvsxoAGD3XLKzdfxOmcAxxPQsXR4oirwyGbRJTNaWczhtawtrFG3FmjDg7t\noJ412GyTuYIf3nvI1uaI8XhEPszR3uOioyxKhoMSqw1BaXwl+vGZ1pj6CYoGpyfYYo8iOurFAygV\nc5OjQknuDCaDtq7xrROarMgxeSHFNYluyaLIuCoyohc5ok2FGeJ8SIUYmqptsCaj1XPmruDZYsZZ\n8xQbPBsMuLlWsDVQVAtLNtrl1M8IbpjoVim6MhaUjri2SZyyRSuL1pZ8mCMaa1EVWSUCs+l0mmSp\n8Iff/AOOTg5RWU5QmnpWYVQuRsOL8dBG5JkqRqrTBW10TOs5RZERmorhtGRtPCQ3mvnJMSeHR2SD\nAfuHx7z80is8fPQRV6/uiqRPZaLpNwYUSe3UCrLEUPiOAmolcgqB1tXITXtEn58KVNpOSRPBiBTV\nB4m6lF4mJk1KLIeeepNCL+99X1yjtcYkOW9wbbIWqifllZICJx0NxKWCx8Y2fUxEDUHRo+GQkuwd\n1xy9SI+jWRbLdYVUrSc5DqGKlE21Em6ZwPTIZztA1wGIqJqeDwd6u+IkVJBzI47KpFtaggu5PElw\nL+sP1F/Q7eRzM+AxRhb1nLZt8N5z/97H3HrhdkJagQ/ee49rV68AkbwsaNuW8XgsKEuBc4Fv/uH/\nzfbOLi/dfpGf//rPEzhbaoK9hOld1r9tJVyO6aH60CVAYv+ZDkV1PKpLxTnUFdYarLG4NuCc/Nza\nnGGekWWinDBJyO9cS9RQLRao4RCrMo5Oj4VLPU5FRSFyXM356NEDtjY32bt+jY8e3Ge0NsITufvR\nB9y+9QKVa/iH/+C/4KWXX+ad99/l7t0P2NrcYHtrm/3DA9oQuPfoPuV4zHS24KOPP+LkZMTayHB4\neEyRD8mHEzyBGBoWizOODvfJckPVVFy5coWd3XVMrrl3/x63b7/KydEpIY8USjF7eoo/PGU2rNm7\nOaJ1LVpBU7d89PE99KgEY1EuYKPB+ylHdU1oG9rjgPegygFWyxq2scVmFmtStWDryVBQ1YyzHN96\n5q1CJAmOoTMsqgXDgcXGgG08lYECBdpiMlHI+LpBG8l7mKiwRHSIhEwTtE+yPp8Qo5EEFxGvPEWZ\noZTm6cET9o8jCxTOeBpXkxGo8obJlW3GccTBmUhCdarg89ELb+zAp+reGCMEL3K24PELUEa2YnQe\nB30hTp6P+ONv/ivu37/PeDJO68fjfZtAZ1JaRIlA2ybK/WmNyS1FlpNpw2Btk+gbjDais9aWtq1p\nFjXDouTpoycM8xHP9vfZ3NyhLHPm83mPtCWJG6XYCU0MNiFB6AisLMv6vdsNyS+tRhUSMdmefgrn\n9rxBSZ0B3XEV2giF0SsuRLYBflWBkSIdgvBhK+fvj6TOf7/n7GPEK9UnaE16Rl1Ss0s6gjgy0yU+\nRT6FZ4XOozPMKSJMNJ5GaENUPHfZqyi7o6RIXP1FewjJQRnV26XVe3re+Px04CmL/86P3+HDDz/E\nuUDT1PzZn30b7z1lOeQ7f/an/OLX/xZlWXJycsL6xlpKVgVCaHn46B737n3M1772dR49vs8HH77F\nq6++yosvvkhTVRKGtm0f0iT3J2GJWmaxQ/B9OORSQiL40GuKfVP3/FTTNHgrD8M5hzUKYkNwChUN\ntsxpowJl8ERskaNyy/HhPvPZnMFgwHA4pMhy5k3Fs4N9Dk6OUMDutT0Ozk54fLiPVprR8QGH01Os\n0nx4/x5HpycYFNPZnLZ1zGcLNjY2yfKC73zve7xx50tkZcnZfEbdtHzhzTt4H9jZu8bhySm4OR/c\nfQuTl7x25w73Pr5PVc0IixJ3tGC9gfWYsfPCbWaNo8hKYt1ST7bw0bGYLgjaMz+bM8yHwhkXA4Ix\nNO2CUlmshcK3bI4HmNphXUC71LZAJfWC9zjdpgWo0MYyKQtK4zGjEUd1SbRbxNkZ7cxQTSsmWxNy\nIvFsRm0Dk9GI6AIxOuF18aIrjpEsLyiUFKg41aKU6LSdd9Q+kOdZQn6RqhYZZl237B88JJodgiup\n60CmLSbX+DhHmSGZKWn2K/K1MToqsEoKjIJwojF4rJakmVQIi8IjBo0PEdehBpbJ16qq+OEPfsCg\nLKnmC/I88cqJfvDB47wjL4u0c1Sq9A3UVc3O3i7VbMbpfM7G2hjfenav7rBrM+4/fIwPkY8fPOLv\n/Ov/Bm/c+TLD0TgVtC110VmiA1SQRKFrHUotjbW1Vqpv1ZLG6gz/km5RCTkv0efyMytGyIdUIdpJ\nMUV/DSRlypIyKVLLitXhPyGtS3kQtaRhehotbXAFZEqjrE6qpeV99EdJKhtjzhtMjcKnkv5eC56e\nQ3ef3fG0zpd1ASvXsayDiH2VtjLLNhyrI0R17tq6Y3za+NwMeNfv5Jd+6d/COc9sPqNa1Pytr3yJ\n+WIOSJa+ahvu333Aw4cPefPNN2nblvfv3uVb3/pTvvyFN3j77Xd48/VXuH37JlVzyGx+xocfvc8g\nL9jb2yPLuiyuKFPEk+YyUXTc5zK00Ul50ieilMLGlpCSVyC5vO4zgshd/8Cq4PFzj/dQjAp0bvDK\nM1wfU4wHfPjhB1wrrmFKS9XWTDbXqeYLYgyczE7JtMEUOXu7u2Atw/UJxhjWJms8Pdhnsr7OoCg5\nPTtla3cPPnZ5AAAgAElEQVSXtnUE5zBFzu61K0Rr+OCDd9nY2uHd99+jzDLu37+HB17/0pfZXBvw\n8htf4Ft/9m3ybCgGfnOdkyfPeOHKVTJl8REmG5u00xoTFKPhBqf1KU+PnnH79lWytS1JvNmMafQ4\nFzG2QKPQIbA9mTAcFVhToIgE7/Cupk0IRaUEmdEanVmUijyeHVCYlirAadwkGwVC60VSOtok39mj\nVJqFb9iaDCnyDFc3BO9J1dDk1qKVYlCUFMYSneesOhPe0ZoeuDnfMK9mKG1wPqKsovYVs8UJPuTE\nPENi8IgZGI5PD9nceYmDgwXlaMB0sWCQG7RSolTxUrxljVT7oqSPhkn69Zh4dGWtoM8QaOoGkN40\n0+kpKEWIDh0VBmijo/WeqBR5maE1yeiK4fVKURQDPvjgI157+TbRlxijmc1m5FnJ9s4OW1t7fPDh\nx4yGa7z2yhv8zM/8LEZbvv/97zMeZ2gtih7npUinR+MpTwRioEPw4C4YpPT3kraAtu39U08xSG6k\nkx5Gyk7vn3TSwi4s+fD0y3Kc+En0KdXyS8MnSFoSlt0+79BxR3HELiqPAeWlhUDszoHovxVSvNQl\nu3uEHSVJL4lGsUnGLCtGI5JgDSHg6HIvkjCVJ7mcj3OKmhXDfy6i0baf505q+5PG56dCsZbgPePR\nCO89w0FJURT41ovmu64x1tIGz40bN9ja2mI8HhOio8zf5JVXXmJjY5Mv3LmDdxWnJwfs7e3x5MkT\n5vM548Gw1+/a1LtDJ3mhUl11YvdQzDJJhoBzo+1SpO8T6kmWPqRkhyRFk5Y1ofygu5L4pZzNBeHg\nnXPkhSQ0A7C5s83pyQluPOKdd96hLAra2HDl+hV865jVC3au7PHg/gMWVcVLL78ixSdAMSiJwNbu\nLlXbcjyf8+4H77Ozt8dgMmHn6g20Mnz5zhucHB3x9OAZTx/d4/DZM/auXaNtGtom4mPk/Uf30Ys5\na80CU82YbK/x9PiQ6dGUq5NNrNV85Utfhbcz1gaRQuW0jSKWA5rFgtxmZD5Sek+oFmDA5hnRFBLF\nOIW3EKOnaWqikhC0CY7YOnGWxYAqeMJojbuPpzTzfcrgKNuG8aAkes1GYfFrJU01RVeRzFhyK6Xb\nQQHaEDQ4G4nKE/BkmemLMtq2FZRlLVmRi/48yqbMleX2i69Suw3uPzkjBk9WZpycnbJZwrRpeevd\nuxSDF1BF2evPte6kbWnT9moIT+sbIhGjBc1mxkhRVJRWYMZYdnd3+Dt/5xe5e/c9mqamOj1F61SL\nELxUByaEL8Ah9GqaZjZjNB7z+MlTSWKOBqyvrXHj5k0Oj445PDrh1s0X+PHdu9y580WuXL3O9OyM\njY2NBFbopWyyF0QeZ6yot+qq7oHMYDBI1bJp/3TJ4ZTI7A16MsZGJ3WID+cM16xaSJ2BtaIy8R5U\n12JAqja1NbJPP2HAY68zR8UlEo+fTPYpwHfJ7hR5i8NR5xqRdX8rJUn4vodXBJSAD6O1JN2DTwZc\nSSK7M9Baesfo1Mek2/sXG1NFhKIBUCEQOI+2Y4qsViuP/9pSKFmeyyJvG5SCsshQSG8OosZqiKEl\nKwopILEGHxy5MYzHYzY3N3FNy+uvv8J8Phd+LpuwsbEhN53QSp7ny14WcSXEiks04f2y619Ht0gx\nX1dmuyz3RUk5e240zkVspnquMkYp5ug0oqBwwZMFw2Q4pPWejfV1jDUJtVnRbGc5t2/doigKDg8O\npLDEB9qmpWka6kq0wq++/ApPnjzhvbvvcuPmTaqqIhuUqMyyubPJ1ZvXuXL1GoPhgLPDAzA5/88f\n/TE/++UvsDZeo/KS9JuenrG1ucl01qCMZmdvl+8//DbXX32RrReu8YO3fszZvOb1N+5QR3jy9CFn\nbsrjR/fJr42Zt4q8mND6wLODA67euMWoLBl6D5lB5xJ2+kYcYzAZ3jdSpowmyzPQXcZf5JUnLlAO\n1zn1Od4r6qjwjce3gFJUT6e0WwPGWcFaaVjM58QQWLQtjWvReZaMuKYOXmRxrQPvE9KSTWpsvuRy\nURitcG2bGjNtcjbzBN+iVE2IniLLCXrEw6cLZo3G25Ysg4OjGQqNzTLyrMT5mtl8nlo3SCLLJmWO\nCoHgQs9tGyMyTBc8ddvw1a9+lbIsefjwIWFzmxA8dfB4pMWAyDcS0ovQhkDjPUVecPPaNSbjIdvb\nW+AdpyfHfP/ttzk9m7KxvsnTwwNee/1N8rKkrh2D4SgBC0GVKNFPl3mG64pTtCLisbk0gXKtI0aH\n1qysbcRYeU/Epz2wRMHCq3dFMKTEroJM03onHTeNRmT2YjXFCYBKfWVMMk/Cb8u/TOKoewY7nTJT\nF/ThcVkTQAJfyX73FZDdupD/+/Q9ldaK2AurOimqUH8hpsghdP04l3bCJMeqknomTRJd5W+nC49R\nDHkX9XfAMUah+YxeVhr/ReNzM+Ah+tRZdCmXMUZhraJp6v5BNSkTbaxMWpu8Wls3RDyz+VSqlmKL\nb5dtIXX6u1OiSEHJ0rOhn+/ZzvFiaXIdCnzXqY2OdpOeDWrZSU3qveSzWmupkLQiPwsxkmWGmBpK\nBUS+Ndrd6zXVSinGg2HP09dVjdaaa1evEoHxeMJ4bcLG1gaTyYSP793DWosLgS2lOD07weTSJ8TY\ngqPjh2T5gA8+vMfW9jYvvvQKuzdv872334Wo+ZmvfJk8K9g/fEIxLDmYnfLxvY8Zao0P8OTBfarQ\nEl3DvffeYrMs+N6jdxjlY/72L/yb/ODuB7RK8ezpE668+jqP332Xg8f3uXLjCvNmzgbrbG9vURYl\n+XDEYjFjsLHFZG2CtlJOf3R4zOl0yq63lKMx//y7P8adKCgMGZ7Xb77I1vYeP/7oHtMTx+6NTbJ6\nn0Xd8OjhI27dvCEhtQvEhOi0Lmhrj289Bs1wNGRjYyM1T5J19fHHHzGfzSFGyrLk9OiEJ4c1tbME\nvyArGmazE3auvIJfRB49qcjKHUkI6xnlYJj06JF5WxODRxlYNHOapiHLsz6JPspzovdkeY7WlkVV\nUbcN3gfKYiAy1KIQh2wyAiSZnvSj6crIQxBKBWNxwGR9jbPpKafTE4pBzqAsePDkkfS60YrR+hpP\nHj/j3/sP/iNmVY05m7K5sSYgA+GGNT41VvJovUSp4HqqAFJbZQVE0fELxWmIPWKMSePe0Y+qT9p1\nfLtWCm2V9PUxGkMmHSE7dUiEoBVEDwF8Eu6JlFNUJKGtEw0qe1ErhQ8Bq7IVTjlK8ZjWyZkuFSzS\nbmGVzkh7WZGoGeh5eEgUmBh5lSSwKkaMTa0lO68TIXoPStoLrJgJQFpyKa2xRqi3BpIuPSy18jKr\ncv409+EvMOKfmwFfWsP0VfT40HXpWyYMtOo8+/lucBClP/ZSYXQu9Fi9776kOfFbSqm+dLb7ve7f\nXeZ6eZyIMdm5h3HOyKcF3wdJwUNIrU9XPm9SEx+lVF9eLJy88OxS5KHpojLnDOPRWOSIm5uS6NGa\nnd0dXuM1QvC88torLBYVOlECP/zR2xSDIU3V8KC+z50vfoHZ8ZEUEVtDEyLrmxtsb28xW9ScHh1Q\nZjlbRUmoGsZFTh4jxnk2NjeotKKxhpdefJ23/viM6ZOnuKJmdnDKxx+8R6Y10bUc7z/lfm556/vf\nYWNU8tbbB9x/cp+/+3P/NuPQSvtRM6B2LWERmFXS92Nje4vhZI1iNGJoJuwfHvPe996mWb9BtpmT\nx5a90ZgXrr/It7/7LlNTs7kx4JXNDcys4os//4uUZcGTZ0+ZNg2zusaWQ/YPjhmWI6zKOJyeMd7Y\nYWfvJmdnZyileOHFF9jdvcrJ0QF3332X06NDjFJc3d1hNmux5YhoTxkOrjPMdtFhm8XiGKMz8myE\nNy3VXNamsZpoIq2vyQpLZgy6ET48MzlZptEBwEivm8JQt1J4ZaxQYWdnZ/z+H/4BANOTOSaXJlRK\nQa41unWsFwOaRUU+HjNXkWxtwpMnj1gbDIkx8OH777O1sylGTsFgNJQqyej44pe+yNNnR9ROcXh4\nSIzS7jXimEwmeO+o2xaTGpo5J+AqxBZF4nzTugzep26JstatVkIVxYgiSx0xbZLvBunw2O0pBdFq\nlO+098lRqa63SFeBK0U/LkixS1HkuEYcSGdQO8omKKHKhWJayoE7A9BHzr2hPm9HdNp3goCXvb+7\nX+lBWrJHfSTU8+qpJXCqc+gjjZW9v5qsVEoK5IxKfXuSvDUkGqjITA9qw0oi9NPG52bAe2OrSD3Y\nlw1hktVOiLbLACP4diXbLGWznTENfZi16hz63g2xS1XIiBd+3o14wbDL90J/Xq2UhHgsPezq57Wi\n5+46RlCuKPbH6qhDnzzvck6kAY9OfatDlN7Ei7amLMs+xIpRuroN7YDxZExVV0RleOON13j2bJ/d\nrU1Kq8mN5dmjUhJ7owHDjTVGkwm/sLuDiuI0mlnFez9+jyvrG7z54m1yNHY4Ic8HHC/mmEGGPzmi\nnZ4wKAzja9eoTxY8e/yI7eu32BmPcUoTXM3NG1cZDUr2Tw742su/QJtZ9ts5hbKcLRoigVIr2qbh\nbOY5cBVN02KyjK1BoI4BpyKz6oT1WFDmirtvf5vDk6l0WRzkPJ1N0aMB68WA2cEx1197lb03dpm3\nLQfTKT/48V18A6rIKQdDhspg8yFns4qqET7z9OSMB/c+5PWXX+Js8wA/mzIsc0IGcVEzGY6x5QSl\nMhazGYeHB3z44bt4ZylHE/JBS91IBd1kUrK+MWQ2P4bYkNuM0WjMxvoWo+GIk5OaxbxmOBxJr+mu\n74tSGGu59+A+v/97vy/USNMwXpvQuhYTM/AO0zZsZAV3br5Akee8e+8jTqen1KEiBkV1eESWW6bH\nmoNnjzHWMBqN8b7l448+oiwGHO4fSN1DgEXd0LhGWiS3jqPjp1JMkxWYkKGNZTAosLnp0bNrWkBj\nlKIN0g62SzAaY4gq6xOsAltEzSX0wVKxEgJEp3tNte721GrhS+KRxSDaRGmmVlMxoqIkCbvWsVmW\n0fW5lyiga61Ar7KJ6X+S+1L4tsP2oLzr4PdyL6eoGkSu3PHzss1T4lardP1aGnSlFgxL2931YIqs\nAkuhleRnXctem2Xo9DNhC1JBVaCfo08bnx8HvqIOkcCha7dJn1BUWqNSm9GOougMaegnpnu4y4ZH\nggZWOOyUUOmOK6d9fo+BDq2fQ/shAtKfWVyz6vkrkKXTe3FFCgvVOcNuLnjl7vtxxcOGGJcJsRDw\neKpWFC71dIqxRtBMDGivllrz1Nu4LArWJmP29/fZ29vilZdf5nD/kKZppXmVd6jMcOvaFaGEvMdo\ny2BtjcnmmJ/54hdo2ob1zU2OTk65geL4YJ+H9z4gH1h+9is/S7SG+3c/pFnU3Lqxx2Fds3X1Cvc+\n/Ig8l859Gztb7N68zmzaUDtpaHV8OkMRybOcGAKF87TpZRtFUXA6X3C4f4wvIne+9DLZsODgvbd4\n+eZtjg+e4l3k5q0X2dq1NKcPeXZwgAJGT56wtrkBRcF3f/gjPnj4lMFwnbk7ZTp9wsNn93n55ZdE\nummlKVk1PWNva4O2XvDq7RfJfMUX77zJ//a7/4SB3WJnsIXKNR99+IitzVscu4p6foix68yPNfc/\nfozXhr29TbLMw8mUk5MnWBOoqwWuDXz1K/8av/L3/h6ZKXny+JCnz/apqorpouJsNifPchZ1zb/4\no3/JyXQKUQp1FvVckL1WqNCwN5nw5Vsv4k9nbI+HjF97BX3vfT48PmA8mOBrT2ktg2GJ846drW0+\n+vgeW9u7NFVLrjPee/fH3H7tC3gUWW4JwUsXSwsZIg8sypJ57ajrBT56wrzty9BdI90vy7zsFvAK\nEIm9DHC1MrKTH3bgqdPHh6jREjgnPb6mqupl0yaVeocAVkU0gbZtsd3+T9RIluk+oRt7WWJXEYoA\nwtR7ZPXtRFZbfBCH1O1BAXEh6e2XaF2ib3Nuv3ZfC6VkekOulEL5riXysiEVK3r0pcSQpLdPksxU\n5KViVx36SXnhp43PrxvhClWhVDKwIT0ipXvP3ZEXkiXWveHtetCBZIBXs7daa/TK/a+GTR3/Jcc6\nj7RXP7uK3I1KTf87GifRNjEuP0OQCCAonZrnxHPGubvfzpHo7tViekWSFYTHlUhB4YG8LFauL0oy\nJUjpbdM4rDGpL4MBAltbm4xHA4pMc3D4TDaeLTGDnCZ46cRmItE7jImgPLsv3uDW9SuopiVamJvI\n2s1d/Kxib2uNq9sTXnz5GpWrubKxi6o9m2vrrO/tsldkqDxnZ20N3Qbm1YLD2RmDzTWubBWyWJGE\nbHAtKnZOx0ivbpNhsMxCy3h9zBe/+CZtrqmrY65vj9geZKyPdjmj4uDRU4pizJOTQ56cHDIZDHl4\n8IzDZkHMctRoCEXBUVMzm50xm84xKJ4+22c2PWMyHjM/m7K7PuFvf+2rXNt+mWePHvDn3/oTDp48\nZHZyn1/4+pc5Pq55eP8B9z98wMaX98DN0VQM8g3a2hJroIgMBiUER72oGA0s169vs7u9xcGzI6Kv\n2H/8gNFwna2tbdbW1tm7do1HT57ywx/9iHff/4B33nmXx48fS5I9qB5NWqMY5IbtnXVujNdQbcOt\nnW2ePH7C5s2rFCowKgzKe0pjWRsMyUup2sy1YXMy4ez4iMFgzGI+45/97j/lP/sHr9F6RVvNKcuc\ntppStTVE6R3kXAtJcdI0FZ0V65KWMUgNBClo7HTNEYUtZI065/qaColkU9Mr78gyecMTPgXYKKL3\n0h5XK3JdSFTqXTJwBmu1tLVQKr3FKr2qrH+RAklh5MgHeU9zOOeIemlIuzfsoKQoSl4BmPqpIGX0\nHaWpOjonSMQeEp3TSyh9p8RJr0709EbbpBecXIzquxwcLMFblxiVaGMJAuUzYUnhrNDMzxuf+Tsx\n/zJDKcXv/C//uP83LDufdd87Z3ShTxTCeZrjoo5y9fe78bxbXD3X876/emytltRLZ4D79pMXHszF\nB7gsWFiGied0n51D4Dxi/0nXvnr/xmi8X7Z07WSTXQjZoYX+fljJGdA10jGsvuCgT8oqRbbSWgAi\n1ojPb+pa5iRdf7eZutLwcjCQrH1Xztxl1VOI1UVUh0c5/93/8HN8+zu7tO1P7rx2Of76DGtbXnr5\nA/7DX/1t1rcXKCVvBBoORjR1Q/AxCRMMxUCahLXe4W1Ae43FYrRIKrWBqIL0CfegvEZHRcjFOEsn\nREte5GiT4aJUKdaNw2iTlGaniXaymGiJBjCeKswJCky01FXAkkOUZmTynlFpmmW1IHeNkp4pUajQ\nrBA9vLRNkci6X88hRf7JPviBSslOeX2bd77fh8YYoUaj2I5SOnSBSlSSSn1cgkQBURJlGGP4r/+r\nf/ipiPxzQ+Dd67hgaZD0iuHoy2A7w71ihC4mH1d/7+Jnus+tjose8nnj3O+opR9cLc89nww5z1U9\n75zPO7fQPec/u6xiUyte+ZOa0GXIev6PHGPpULr+Lhedzer5Lhy4N/o+NZhfHdbavnFT99aS7vvd\n9eZZhtf6E+fqjtsd8zf+m5/jT/50j8vx0zWcy3j3ndf5X3/7V/mP/5N/IklZo2jaikhAW+njH6NU\nWOtUJONdK4VD3qTXvoHyYsAlMyUvbNEo0PLWJ6UFiTvfSl967+W9llre2bqoWpyryJW8yESoyYiL\nLR4nyVOlKPOC3BR416a39iSu24Dt9oaXFgkgUb4Ly3fuguThhKs/n+CMUd6TG8JSjijvYbXSbsFL\nN8JuT3cvZNdKWtJ2DIIkOZdv9vlrm8Tsims6OU9nDLqvuzCslwCuIOaLxmy1cul5ipJVg9j97OL5\nV5Fyd57u589D+N3PLqL9i9ey7FXtPxFhrJ73eaj7k3TOJ6+j+95qVny1kfzqMVcr6VYdypKr/GQU\ncS6zf+FYXbj6vLnoOjpenLOLzubPv73N5fjpHe+//xIxRhaLOUppskx6gjjX9tGZVJguOxwqDcG3\nBO+wifrr6zLweGUJ0RJ9mxJ9MjJT0DRVnytyTS095q0lyy3RBZqmQiuLMYo21ngt7+2MviHXnjY0\noELqLgo29c0PMdDnKE3qNYOhTvLJrhLWB3lJjNY2JTslDxdjJIsKpaUjobTiiGjv5eXJiadXWt5K\nZDKbkHtn61LuTXfOYtmu4yeNz7WZVY/gLlAHFymGT6LL0BvET/t5jLF/PdGqIekMzWoEcNEIfxry\nvWgUVx1DZwCfZ6gunvuisbx47OcZ39XrWT3+xX4LqwnYv0yUsUzIXJRpnr+W8zkL1Zdar55ndT66\nZ3TxM6vHUkrRNJe0yU/zcC7VHaT2y3Utzb5Su/L0ujkpaAtOeodLsyxpLxC8vPszpFeFpHfzoHBo\nSC9zEQ57Uc2WhUZR8l7WaKwJzOYLrM7QShBvXTuC8mSFRALee6Jv8K4hLwsCQeovWgcOIKITHaKU\n6l8ZGJRU6mZZJgoW35XZJ/vRJ9sCubZp7Ue8lmiAhNalQVVHCYe+PW/rmj5fsNS1dcDKfCKyvzg+\ndwR+kSqA85t9FRFfROvdZ1eN2MVjrhqo1Z+tGptVJ9J9/6J+szvW6terv9ddy/OQNEDR9dB+Dg/+\nk8ZFLv0iiv4059Jd4/OOd9HgXlTdrDqG7jjdz1eN/cX5WXUi8Pxo5nlzczl+ukcMUSIua7BZRusd\nTdPKS7NXCua06qqhAbN8d6iPrYgLFP0fpaSra/QBF7w4Ag3WaFzrcL5OyFmzaCpsmRN9wIda9PqF\nofW+7xBpEvLNMy3V3kD3LtcuJyMCghR1Bmk8FbQiBCm/D0He0iQ9wIXfF+pIbJlIDnWqTk1l8+lN\nP0p3+0WSlDazaKNSJeny3ZqNawlRXgQiPZZ+8tx/joU858Pu7k0nnWHsbugiB/STDNdFI/a8r1cR\n5V/WsKzSEqsG9SIFsmrkP82wfpqjuni+5329ahy78byG751T+ouSu58WJTwvh3ARiV+8j1UHeDFC\n+rRzf9r44z/6P+QcStFUNcZkmP6NJQGvAzp2SScwxqLiUk3QVdlqa1A+piIu6S/StG3PMeaZvFrP\ndO8wtNLbppnXwufHSOvmzM9OUToSPOT5gBg0xbAhKk1LRsuQ00Xg8Kzl/2XuvYNsS+77vk/3STdO\nDm/m5d23ebG7wO4SgQABEliAFEmI8B9kSZRNVVkSLVKyLJdLdLnKYpVsSVCxrJJkyZatUAYlB5EU\nKSaJBEkAJLgIi+Vic3ppX5yZN/HmE7v9R59zp++Zc+ctTLmWvTU7807o0/Hbv/z7Z//85xkMQnSi\niUchKEXGAMd1CIcps61FugcDnn7yaXQakyYhkpD9/Tt0e7vM+oJZ38UXGY6OCVwnj93SIFGKYZjg\nex5hNMSRKfMzDXzhESgPT7i0ak2E5+HWfTJf8NR3f4heMkK4DlHm8vo7d+ipAOkFnF1f4uxqnai3\ny62NLV586yYD3cYXku966BTB/Cw39/fZ73ZZW5hnwQ/4yz/1Xx6Zr3Nn76XX63HQ7ZCkCVqbsBeO\n6+XKbeOQ43huHo9doh1jlSKExhcOIqfAMyHQwjWJl9MI3zfWJZkqXNk1jufkZnjkJoUuce4HooUi\nzSJUqkwAMQe0ckykxSzFc3PLKMdB5Z6UJr6KIo5T4ymiD+MmpdokInaFETNmucNOIX+PswShcjFi\nlI4z2ANkSo6TegspDx10MkDIHNRVnnaPsfGBdA7j64g/qXbgwBiowTS+LOqokr+WRQnFNZsCtO9X\ngUZZ7GI/UyU/tov9TvnZcvAam7OwM1rbdVVRydNEGVXX7QPuiHK0QhRT9Z27Af3d2jaOgQ0T82nP\nRXlejitC5IpdbUK/ki99iTnclSxSVnGo/lV6/K/CaUqpFJE5Y4eJJBlRcLVaa5IwNW7aInfJFhkC\nSb1RBzRSKfygycJcO6eIVJ4tXEIWkWnQXo1LNzb5nT/8Fq9feodhmNKsNen193BShS8c3LCB60ja\nQjHa26Xtujz/td9hcWkZ6TosLC/STxQzS6cYbF3FUTHNwKXue2SOYJjE4xRdqc7QqSKoBfjCRWpB\n4Ad42qXu1EFLFmfmac3NMX9ymYPdDpGj0I5DP4G3L1+hl/pEacbt6w3aH3+Spufx+utvs7kzQtcF\n8XDEpSBj5sQJOmlMtz/kgXvu4+lHH6mcr6/+wddYWVlheXUFLQQ7e/tcuXyJmZkZGo0G87NzJHFM\nnCgaNZ84yc1epYMUCpkp0BlhFCE8n0ykBPUGaRYSxVFOiSoC34RrDYIAL3CNojJN8D0XmaYIoU2W\nKc8zoSjSFOG66EyzsrDAbKNFd2+PdDjAcYSxYnGdPG6KxnMc49qeHsYzEkoZ71Jh4tuM0hFe7stg\n0rod5g91Am9swWWwKwMJaaaoebU8JpORc4fRgMJ8K8uz8RDlRlrCJLz+E63ELAPXtI1dNvezQdq+\nX1ZUVlHpNvgUygH7QCiUplXlOPnwtPbblPvYnd8S6RTZgqr6XEW5VgFuub1VB1e5z+V7VVzOtPmw\n21MWM9nPTCvvjgMBYSUCGNeXyyU1Mk/QkJt9idx5RORjnjtIKPQ4m9LEN8UkV5NphcqpfRBjWagU\noHVKpzuiVqvheQFI3wTxb59CZZrf/eLv8s1vvsDefod4v0cWxWyOjK11GIcsnzvLauMMN965Rph0\n8dsBvajD3MkZOsMOp07dQ2cU0lpcYTQKUZ6HdjQxGkdr4iQhSTIcBCYdQh6/RJt8i0JLojih3myY\n0dCSpaUV6u0mOoMkUQxUSCLAb8/x1JMfQASzDKOYmaY5HFOlGUaxEWloxb3nz/DQw/fw8ltvc2t7\nm1ES8c1BSHfjNvBdR+ar3xtx//2LHOz3eOOtN9k76LK2tsbJtTPs7+7z+itvMRqOqAU+e3t38GoN\nPvrJT3Lx8hV2d7ZoeR7nTq9zYmWFQRRyc3ubmXnBXLtOp9Oh0WgSDkfU8lSKQgj2DkzURsdxkJ5r\nZAhYybkAACAASURBVNmYGCuDYY80VbhBjeFgRDRKaNWanFlb5+ypk/zBc98ENLWab8hdIRj0Rziu\ni3aMA6GTU75Ovr7SNCVTGYHnkSVxbt7oHzoJeR6pMBYsIqfepWOsshzf2JNrBzKVmqTkjmuJfw/F\nwK7vEeXr0BAdf0KVmNPEG2UlXfk+lJxiprDl5mwzpQpgbCXcce2aRslPE79MKvvGdyauT1pnTH6/\noA6rwLH8b/t75UOrChw9r5juowBbls2/G/GOrSso1wN5tDurX+baIac09dC2Lk/ULSx9SWHjnkeb\nE+QmYYKxvFEIQFUc4EVfx6MhQEBg0kuAlrmsNgPhUPeaCOEwijOEyNg/GPD1b11i48ZtXv3mH5Ht\ndXFHCU+dPE273SDUESOZEroZXjugMX+SDzx2P1/9xu9ybesyzVmfg/4dak6Nq1evcO/Je6hpSTto\n0guabN55h/WVBZAOaRTjeh5Ka1xXmmiG0kM6Ru7s1+rGjtoYReA7HleuXeLE+ilko06wOIenPJNF\nyPNJOgd0dveQUrI6d5r9nR1Goz7LK8ukuotCsbd1g1fpsbi4QrNV52C/w8LcDIHvUVVmZ9usrKzw\nH37rt4gTY5u9eXsLV/hsb97BlZJTK+uoNMNzHbrDEVeuXmMYjtDaHJyX3nybC2fP8e2XXub2zg5n\n7wMV11lYWCCKImr1NqMoY2dnh1qtju8HxGnCwtw8ozBkJmjS7x+QZUnezows00jhcfv2dRbas3z9\n699kfXWJZrPO7u4eCEkYJXh+jUwptMhjvQDKUThC4siMKEpwHSMacT0Plcu/DV/o5sSEQDqMAV04\nEoRCU5gXHu5pPzCx7AtHPxPqyZgZpqmJcliYIDpONU4V5Y8F4OfOnWNmZmYszH/uuefY29vjx37s\nx7h27Rrnzp3jF37hF5ibmzvybhV1bLPiVWz83cDVVmzmfxwBueJ3oTWvMq0r13/EtZ7pwdan1WOL\nXCYVotXUahngplHFVSKc8vWiZJmuvF91MB4H4McdYLZSebKdk208TpQikbldsPVdKUCbcAWuzONF\naM04pKdmLPsuWZ7nh4ceH47jQ6DUBlnIPp08k7nOWVrXIU4yaq0Z/ubf/DucOXMvQznDa99+kaWg\nwf2Pn8cbhkQHHR47d45MZFy6fZ29UZc0DZlrabp3tvnoI4/ypb1bdPc7zLZnULFAZpK9jS2efvz9\nXL98mVMn1+n275Bm2gSXEg4qSpG+hyclUrt4jsluJKWR+QpHgJMhPY9Mxdy6cZv9Xgddr/Pdn/kM\nC6vLZFIjHMnJ9XUThnc0IoxC/LkmSbuO67qcXDtFNIjQjoBAghK4SrByco31U+tEaVg5X61Wg42N\nWwihybIEgSYMRwx6PcLhkOWFJWabs3Q6B4SjIXt7+zitJimaRr3GTOAz53usr67QOzhgYW6W2zdv\n4J48xeLCCmdOrzMYhQyGQxYWHW7eus36+kkEHqlyeN/jT3HP0iI72xtsbt3gzs4dAsfFb8zw2huX\n2N45oPHkDOfPnGJvZwukyfVZqzcQMiWKIvxaQK1Wp9frotIM6UCtVjPZiTBmhGEYEUVRrrg0oYID\nz0NriKKIwPNNzK/cuEEIo431g9rY5DaKojyWkkY4thNPvkck+L5DlmmSNMJY20wvfywAF0Lwla98\nhYWFhfG1z3/+8zzzzDP8jb/xN/h7f+/v8fnPf57Pf/7zU9+vEm/8f2mHEOKIk0ixUasOi4mNTLVs\nvYrqtgHsONCv6k/5gLEPrKo+2b/L9U777jSxhn2v3E9bll8+DI8r5f4XAF622KlqR7kNk/UW0eDy\nvogivnL+PRP/lDJUm01g60FAiiLI2bj2XIyVHB1TTD5DpXI7X2MUzHA4ojUzR6okf+m/+Cn+8Nnn\n+Nq/+XVOnVjjzMo8Sg1RNfjEZz9FNggJcPhTn/wMO5vb3Lp2g+HNEVoGDAdDHnry0zx38RVevHoZ\n3WjRjSO8IODff/NLfPjD38X+7ibraycZdfZwhYsb1In1KA9TrGjWAkyqNmWSPqBxfMkwGhJHQ+pO\njZOnV3n40Se4fmePRrsJjiRVKTqOkSolEJpmyydr+YRaI/2AEydO4EuHQAj2ex0OsoSW12DUHeIK\nl9Ggx35vv3K+pCPoD3qcO3+Wnd09+v0h9VqNWi1gptU2QdW27tDpHKDclMWleYTQNOp10uGAoFlj\npt0iCUPOnznFZrfLfH2ObrfPSy+9wqnTZwjjiOXlVVZPnGT/oM+3X3qFMDSROLv9kMbj76PZrLG8\nuMzFyxeJkox6W/Pqq6+DFly9+g519zxRFPLg/Y+QKU1/MKBeaxDFCQcHHXq9Po1GnfZM2zgLZQmO\nzq1JtGZxcTFXeirqtTppmpLEKXGSUKvViKNhngjdRHUUBQUgTdTGoFY3Cbcdl8RXgINS6Xj/ua5L\nkiUIaXLsKiUMF3hM+WOLUMqb8Nd+7df4/d//fQB+4id+gk984hNTAbwMolBBmedEqsj/sx40rIsw\nV7XSY2L2OGXeNKq+TPlPAsEkqNsUaxWlXNXPqj5W/bvKguU4irhcR/FsWcF6nHy/6nqVbN7+Vnkc\nqtpcJQKy2zMVwB0B2iTUNa+IQvydhzGw2iZBa5XHVj6MZ23kkMb5ogD+4sdErLPbYCigKOihEwc3\nDfAyDxcfJRS1mkeYZLz21hv8o//5n7K92+UHHv0Y995zL/V2gxtbGyytnWC4tERH7vG+cxf42qsv\n4+13aGWK+083aM7NsD8Y4OPxoNtEDVO+Otggm/VhFDGvfF58+XUkCU8/9BDxYESz3iAe7BPGA0Tg\nk2ioOS5kxsrHr9fxpAt4xCpj5fx59rpdPvaZH2DpxBqnpQuOazIV6VyppjVaFSEOTHRIpTSqpsjS\nDImg7czhRREoqC/MIAS0VI3l1aOcNMBTTzzMcDgiUxnnTy2zv7dvYo5LhyReIByFdLtdZOBwazPk\n1OoZFleWuXjpEr7nst/t4AU+L1x8G9Wosz47w8LiYh5bRSEcl5XGMmmm2djaYDgcmWiaeBDB1Teu\ncPut51lYWOT8hXuJlMv2XodwYx9UhhSavYM77HZmuH7tKk8//D5mtMvu/pD9UcilG7cZJglzi8vM\nNFNa9YzlxUVOrJ7FaXVYXVln4/omw25EMkqYm5nlkYce5tSpdTKt+KMXXuSlF19C6qGJ+e+6RtGJ\nQCvB4uIas3MrZKlk+06H+fklZJARRiMcR7B957bRmYR99KCL1BmuJ8GDJE6m7kP4j0CBf+pTn8Jx\nHH7yJ3+Sv/gX/yJbW1usrq4CsLq6ytbWVuW7jsVmFBu7ygKkikqvAgwwZmRVpYpqtgGqSpZbrrt8\nrYqar7pXfP+4DBvTuI/jqOnjSnGaH3cQlb9T/vs4DsAGXyHEOCfotP4XxRY7HcdxFT4CVW3UWuPK\ncq5BAc5k24rckQV4256x5foK0YorAxMEyZGITJGRoJWJ93xrY5N//A//CeFQ8fiDj3HqzGk63Q6j\nZEQWx9RrNW7dus3pU6dZP3cONwxxdneh1+NOf5dsNMJvNFiqN3ho7X18oql56Yu/SieM0KmL6wZ4\nSqCEZBTFtNptBoMBMk1ptZtoKUiFYDQa4QhB4HokqSJouEjHI4oi7n3gQT794EMM4phBmhgPyDw1\noDHlOySYTMIUp9pbNieVikBRhQVVklSDSavZoNVsjMf49Ml1kiSZmIswDImimNHA2Hv7gU+z7jMY\nDjnodmm1m2QqY2tzk8FgwPzCPKury6yunshjZcc0ggZRGHKwu81cq4E36+MIlzAMcWSDNJNsb3Xp\nd1OuXds2IWmpMRr02Lq1y1x7nnZrie3NLbY2N3n1lZcZKoGoN3Gky6g/YHlxiZnZWR586CHm2228\nxT4ic7iRZbzx1lvMNWbp7HdYWlzE8z1q9RqNRouV1TVGyT69Xo96u83c7BxJYqKJZr5HL4m5dWOL\nc+fu4+rVG9zYuM4HnvwA0XDE0to5hFC0VILnCdApW1u3mWk36fa6U/cJ/DEB/Nlnn2VtbY3t7W2e\neeYZHnzwwYn7VSKGonzhX//i+N4Tjz3CE48/UhlgSlpUdxkkbWWfobiq5UVlqlAIcVRezlH5rn3d\n/mb5dxnQqvpemNWVAaxKCfidlGkUv231crdDYFq8FbsP5bG2AbAsCjru7/IBUFVsi6JyO6r6bh/8\nZTFO1bhM46JUWMNBG/mymwEpSgjqtRaf/7s/h5N5PPPdHwXlMBj1GA373LmyyfLiEldefoWTZ8+x\n9c47/NJrbzAf+Ny7usy9959n5J3ioN8lSzPi5hzN1hw/9tjneGfzJr/73DcYOoqBjBGJg+cZ8ZHr\nuohMEAQ1NKlxfMljgjiua4KXIQjTjHpd4tcbzM7PIxyHWr1mFKCpprAjdnIF7+HhpnJRUjYxFnBo\nA12McWHbXK/XK+dreXkZpZSJV5JbOhWmfMV6D4LAmN3NAEIQxTEzF+5BOCYFmQbiNOHC+dMmhZvA\nuMU70ljnKM0oCkn6Q86sLeE6Lr1ul4X5WZ54zCT2CGp1Xn7ldbZu7xIORggEw9GQdrPNsDdi6/Y2\n9917D8trq/TjiPuHQ1LHozeKSBDc2d5je+MWd25dJ+p32NnZ5txDs8zNLLC71SFwHXzPZX52nm99\n6zmeffarnD5zhlqtwZUrV5hbm2dmaZXuYMCd67cYDkecPXuOUGd0e3voOtQWPJbVPH09wG/VEb7D\nr/yHf4/Wmo9/z/fw0ovfRqiUrdu3mJ2dZTQaTt0n8McE8LW1tfEEfu5zn+O5555jdXWVzc1NTpw4\nwcbGBisr1YGK/vM//2emUnlFEcJ4bt2NsivK3dxOqwBp8n51NMKCmp1Wx7sBXXvTFCBmR2Ast3Ea\nCFb1qepaWWxzXJk2rmUwL3tnlgGxav6K9n8nB1PVgWgf7seBcPlZm5ovx4spfytIZxEyRssRSoxI\ndEKmPdI45mf/5v/Ib//q71BXdRpewObeO2xt3KLheoQHO7Tb8zhhiJAOjzzyIJffeouBI3jh2mWS\nhuShB+/nfQ8/yutvvsHlzU3WDxr8xIc+zvNf/l3CekDi+yw22ty6fYuNmRqPXzhLb2tIksQmfrV2\nCNMU1wsQjo8GEjRJHOHoJn/lr/9XjOKEKE2Qrgta4DhGVyCRxq2xJGIsrzF7LDJrrIoShtVKzCRJ\nEMJYdtXr9QkCyV4zSiniYUimMhOxUCmiJM4VfIZjaNc8arMtvNyBJ8lSosjYa2tdtME4xahUGwuk\nbIDKYjZu3+KdK68Qhl1WFhu5YtFDqSFrJ2bpdTZot+5le3+PNy++xSiMmVtcIajXOH36HJt37nD+\n3nvo93s4juRgdY5Y3UEnMTP1OkMGPP/cN/jA4+9nZ3ubwbBPkiY8/MhjtNttWm6LL/7G7/CDP/RD\nzK7P0mg0DMfkSDZ6G8zUfP7oG1/hkUce5tzZVW7fvsLFty/yoQ9+gHq9iZQes3ML+H7A+QuP0my2\nEFLym7/yb6fulf/PAD4cDsmyjHbO6n3xi1/kZ3/2Z/nsZz/LF77wBX7mZ36GL3zhC/zIj/xI5ftV\nJ39R7I1fZLcu3ys/X8g+q0qV8q5KrFJ+dpr4wK63XI99r1zKruU2hWLXbR8YR/pY0beqUuVp+m5A\ndNo7NkiXnabK7TturO/Wn+L5MqdTeHbah8a0ftnfTyuiKdp9sdvh4iGEQjkSpEBKF6VreM4cb73x\nOnW3TbzXod+9zSDboenCbMMnGYbEgw4bt64hmy1efus1mq0Wd/bu0Kr5hP0em69d4Z2XLvKJ7/9e\ndDiCWx0anT5/+8//Vf7Sv/z7xG6doRdQbxhRzHzg0HYVs602o7CPUwuIBkO0I0nzlF71Ro1as05z\nfp79Xo+g0QSVmZCkGO/HcQYrDi127HG216Q9TmVPXq31VNNbmzBJkmTM/ZXnW0qJ64EnPFqt+lgk\nU0S3VNoGe41Spr7YizH5RzPa9Rqj0Qjf9wnDkGajSa/XJ073mZvz+OT3PU2WaXq9Pv3BgN3dXcLR\nkDAc4vkLzM26aBfO3nuOJE4ZDiO2t3f50m//JidOnmTjxhVSnXHvhXuoNeqcP3mBYT/iIO1z/sxp\nzq6dJkliBoMevX6H1ZUVk4Q4y7j59iXOrazz1ouvksQpc3PzeJ7L3v4O84uzzM61eOT8OVZnmjiq\nw/qFdR6//wz93pCZ2XkyBRdf7TE316bX3eXWO1f+/3Pk2dra4nOf+xxgHER+/Md/nE9/+tM89dRT\n/OiP/ij/4l/8C86dM2aEVcW2GJkmuoBqasw+4e13FNPBrKirKFWKu/K37I0+DfzKQFYs3PLA28BX\nppDLwF/JiUwZn2kTfDermnL95ftVh1fV+1UOWeX5svUd7+YQsUU/dr1lE8Rp4qty36oOoyruxHE0\n2tVooUi0INEe0mnx9a+9itZ1ArfO9v4V0t4OTpBS81xkGuOQESdDzqzdz1C4bL5zhQ8/cB8zjQan\nT5zg6//3r7J4z7380a9/kZef/yYf/MhTPDa/zguvv8pTH/owf+rpj/DrV15llEW0ZmfYvHGNURix\nvr6Myob8N//tz7CyfpIbGxtcfec6Vy9eMtYt0RCnXufxp55ibmmZg24H6bgmWYIuxEuZ8UiVzji5\nrz0HxjtwulVVMV5CiKmR8YIgyL91dM2P7aLzesNczFKvGdM613VJ43i8Hwr9hpB6TCAW7wdBkMvz\nM4ajPlLOEScJ9YZPphp0DnoIRxDHCc1aDbKUpNHgnjOnCQIf13XxA5dEu7RnZ0HDuufzwIV7Uepp\nuv0ubs0niiP2ux1m23VWFxYRCx7PXvs6ly5eY2lxhXvuuQfECWp1D0dAt3Ng9AA1lxOra8zOztPr\nj5idW2BnZ5fl3jKuBy+99AIXL71JnEY4acJwMCIIAmqNJp3ugHZ7Dsfzudk/oNsb8N3f/TGCIOD/\nqBz1fG70dyp0/Y9QhBD83n/4N5ULpvxvV3oTFBkcBcnxhpRHKe1CTHEckFWBtv1sFaVp13k3ECl/\no1xXGaiqxmTaIfJuxCtlDqLc3iows8US5QO2LK642+FW5mrs5x9/+vuOvPfic79X2Y/i21UWNtNK\nGbyLtlT2OXXIZELQcBmlCV5tnq/+4SvceGef5fYK119/mf3rbyLTLjOByWIT+C79aERreZmF02eo\nr5zArTURWrC+uMzVN9/iUXeGG2+9xaNPPsYr197ixvYNHjl3gfev38Pvf/FLZItz/OabL/N6b4f2\nzDw7tzY4szrPo/ee5sH7zvFDP/yDxCiUdBDCwZcuvuMQpREJCikFaWbs3Z08sUeRLQqMwCG3tTky\nXndbr/YzSik+9D0/eOTZbz37W3etg/z7We4li9ZjL1pjRpab3FlrS5GHkkbkzlnkylF1GKkvl+t7\nwh87dTmOR5qmxFFsFLBoEw0QE98+cTVZkhoX+iTLbb1NaNfhaEiGwvFcBqMBgSfwnACBSxobhfnM\nTIvz954HIdjdO+DVV9+gPwhJ3RG9wZC5mUVc10drh0a9RW/QJ4pGtGeaNFt1onBEPTaOQnsH++wf\nmBgyg1HEtRs3aM/O0uv3TeKHWoNf/sVfnrrG31NXepsVn8pS68lFZrNmVYGdyuZ6BRVQ/LvM/lex\njkeaMAU4bSCpcvYpPz+NurHban+vDMD2O3f7lv1+cc12XprmhFSuo+qgsr9/t9gx5Xqr/l0uZQWz\nTb0rpfC8SY9AW7RSVcrxYorAaeWSihDXceh0R0hZ49f+3W/gyDlc5fLOpUuk4YDFpVn2tnYZDiS1\nmscwjKi3miydWOHyrWs8ceY0mYCtjS3cFLa3tvmjg8usLi3y6rW3WT93ijOP3MtzLzzP09/3cf7s\n43+Nf/hz/4DTc4v0Asn2IGJt/RQqHbK8usanv/8HcHwPoTK0MNnLoyw1QaOERkuMyEQUYyYAE/hr\n3P8iQYA+HK+7lSpuadq8VVHmlabBCEz6xHxuRZ5OMP+fwW/jEYnWCNcEKTOHDwhlov0JYWKO6zy4\nlUaTFnnJBHhKAybIVREgitxsFN9ntlUzEQOVQqeKLDUBq5RWzGZt4jQmzVKaDZOaME0UjlMjS82+\nqddrdDp7KCAchSwuzNFuZ8R0OLV+Aik90lQTRQntdh2hMyJHkCWKVq1FI2jSFAHb29vMLq5z+p6H\nGEYjur0+kTA25G6zTa1R56DTOXae3lNX+jJ4VbFyOjte7j0BcvqoqMKm1G1ZXZXlhc0m2nVMe3aa\nS38V4Fct6LKs137/bhuouHecKKgKOIt+lUPo2vULcdTM0h6770QcYven3Ifjni//uyr2ermP0+ou\nLIAKvUv5ABgfUI4mTTKW50/wwrdepUmNetDktbffpH9wQNPXBA2PheUVNm/u40jj4n723Hn2+n1c\nJDtbd7jv4ce5s3GHerNBfWaG3d3bDDsRKydOMExjTrZX+As/9dNsHuxzZ/s2P/jn/gyyXuPH//pP\nQ3sev16j3zvgpZdf5a/89E/SG3SMd5+UJsaG0kgFSJFLtY8qvMtezWUO7ti5E4baFbnzlHW5stxN\nHHl4gJrAYTqP+Df275DiMDiZPIxzo/N2oPPwClLmSmkTQkFh7P8BHJKckNdkWUwxLEIIcIz5qjYX\nGHSTcQ5KRxoFr3QFrgbp1GkKE0HRcRwQiiwDrU2kysKePk5iMpWiVMrsTIM4TiEznpVJklFvNRnJ\nEEcr5pcW6HS7+H4dkUK/P0LNNfFrLQ46B+z3NtACwiRkYWkFx3XItMbzfU6eOsMvTp+p9w7AyxYZ\nMAm+VQGdbCrLjmRYvOu7fiU4umO28ugCLoNilRVKleigfP07Bajy4VAFTMcdCkc3R/V37DIt9Gy5\nzYUSyu6PfRB+J32tevbdvGc/Vz54y9YkVUqzohScR7m/VSIC4bi0vDZf+u0v8+ZLFyFxaDb2qGUD\n3Dok8YgsqSFFC3fR4WA05OELF+j2RmRJSlvWUP2Idq3O8sIiYZZSm51hh4RkNKR3tcfm9Rvs3rzD\nyupJ7n/4Yb609YecWJyj6df583/2P+X//PdfZDAcEdTqaA1fffZZHnn8YVKFET+IzGR0yRRaCfKA\n0nn/D+PPTM69Jo8WUylCKxel9WFoXg7XYjrFuWtaRE37W+N9K4pDQY9PBJ0nF9ZajwEZyEOwKsz/\ni8bJ/HDRSDTjWN6qMA82wD+uXgijAM0FSEJInCQPKqdMgCpDxYNWCpGYUA5ZnIIG5So8LyDLNK7r\n4bguaWaCWknpITS4To0kySCM8TyPKApNQubAhK4VjkvNnSXLNOEoIRACHXeZaUhqXpswinA8D+ku\n0OsPaLVbSNej1+uZ1HTHlPcUwGESQMqyVTikwMfOBxWUY1FPVaS7MhtepsrLAHOcKKO4djfqcxqQ\nvNtnj7PKsUU2UA3gx1HvVe2Y1udy28pU3XF9sMtxYFFVqsbbnvPjFMVVdRUHV9ncsDz3WkjeuXKD\nZ3//65xdPsP83CyXL11kMOyyuDSP6wpGo5ia38BfaLDUOEmYxogkpeEGxKki7Y+IuwNu3riJDHyG\nUUi3s4saDGj4DeJQM7q5x+Y7G/yFv/Xf892f+hQ3tzZ5+7U3efzRx/ji115gPxogwoyz5+/loNPF\n8wLCZESmcxjWIPMkvBTrMQ+Zi4BMZ1Y/jZhFCokjjjrtVIIvmKBe7+LZaeNuvysLylmbYFH5jcP3\nHctSxj5ghCoiaBtzYgCVocBEnszfz4RGUCfJlIlFovVEhCElpfGKzJsfSBMdUEiJEuYgSJUy0QOR\nuEIgvACJYKQipHDGsUyyLEXphDQ1CZF1qpAiBC1xnYY55DyPzAHHD8i0CVHcnp0lS2FOuqSZRiY9\nI/cHiqBaozBiubVAFCf4NY85f45UHc/lvocp1QpTJRu4c9ZNHCbllfnEp1qRJYeZK8YsnqkARwoy\nEYwHpYinITAJTgsliBzH1CB/rgwqtmim2OBFtXniVWHXIZiswvbqzCkNive19YypN8sm0ykVz0l5\n2I4y4EzTA5Q5jGlANW7pGNQP+1i0xXzX/G1+mx0jy8MF5SAHh0VOerged4hMtssEClLqcLzyXqH1\nUZHP8cWFPPt4QbkZNtgopAyoSxCSmmjz7G/9Imszq9TqDWhIlOrSZICMJLIxw0GYMIfPmQceYHm2\nycXnv0Hbk+hoSDoM6e/ucOX552mEMfFBl4XAo5cJ5uptGo5He3WWpB8Sd3b53/7u3+E/++/+a5pB\nwHBrg61wyMraIvPpPLduXuLRJx7l/U++j0xl+DgmNkbeBzOu+XzllKsugEscjrHWoDONFppMVFPQ\n0zi98XVdOEdVj/e0EA1VFLhdQyHrHhNrTK718d92Wylk4kUwM22Se+Rmkkob8Yy0RDFm6ZpQr0pr\n4jzcpS7UugIcTa7qzchU/h0h8PJsO47njL8nRJDvF2UQVAgEkjhJxq2L4xRyeb6UJuSv1uZgFELg\nYUIaOLlIyPUdZuszaA1NCz/upq94TwE8yw7teYsFacrhhk8n0qGZW0rnJ5+UiPw9pSUqtyu12W0h\njIwNbQAhK9IhuS5CivGinGzHIWCAOUxsQC8GtsqbcxpYVkXhO/zm0fHJrAzW5qBTFBmvy84RVcBs\n/9jfmpyD4tAsxCWT9w4PLosz4ii3xNi+YbLYsH5cLJjqcnhAlq8JUX0AVB0MaoxZJk1VkfnF8Ryk\ndEBL0jTDcz1+4V//G7Y3dji9fo7+cMilq28yF7g4mUBHQ0StbtzYW03Oraxx+Y1X2Lt1C+Vk+Co2\n0R6VYwI0eT5pmhK4Pko69Do9Gu02ge/y+JOPIzoJ1w/2+Mov/Ts+/MlPUTvo4wSCduDRzULW11b5\n+X/1Bf70Z/8vdnbu4Hs+Wos8jpdG6UPxhhGQWKNUFhMdc15WOWKNRYkTe+H4eorvFmWaldbEHOUU\ngyieLXF/43esb1i7J/+/6b/rGG/TI6KjAgu0RkuTJm28aov6lT66JoWh0qUldgLjpWrk7LZObEJQ\n1AAAIABJREFUyMT5FhzG+fc9d9yHwpTS3i+pwkSczBMiJ0lyJAnKuynvqRLTPm3LMu1xGQMH48GQ\nUuYnl2HJdKYgUyYADMXUGkpLIpDisG4t9WHcaGvSyunRbJa97Oxgs/A2QBbXqgB92oRUUdNlSto4\noxw12TtO9l4+jKpEIuZ6ZbOmtsURR/syrW+2PPPdWKscfvvwAKkqVZ+b1j8j+JQY7smE7kRptNIm\njKhfJ4kybl6/xvatHRbXT9KJRngK3EHCMO0zP1cnTRLigy4feuKjNFZOcfPVV9h8+zWcQR+cFMdz\nqPkBSkEv7LKyeo69OwMWFmeYWV00azdO2b29yaVBxPvPPMjJ+gyp8Nh+/Q0W3IBf+X9+iYP5Oa73\nDrjvvjM89eT7CaMRzWadNM3FQMJBCxPnRQo5dnmfBpLla+XnpoVBqJqvafNcFivaYiv7vWlizuKe\n/XtaqRINFt8u6i9wwr5flslXrZcqjqG4Xs4FW4UdVaJdu72TfiDGc7W47+fZhsptuVt5zwC8rFg6\nBCox4fghpRyDdzGwRc7F8WDmMrRoHM7RQwpp0h5pE/je9dxxHF+TXdpM8HGy3/I34dBrLMsyarXa\nxKTDdIVO+e+q7xRBoWx5/+F9VRAsE2UamBZU6t1OdDPGRzdNlfhFCAFaHVnEUxeannRXL9c5rfxx\n79vFcSUGxfN5EeZPrWCm3aZz0GN1ZY3f+PXfot2c48x995MqzbO/+ps0owTfdTjodWnW6vhJRtw9\nIFhcote7Q5L0SdIhsVa0a02yLMF3POJBD09rwl6PcDQiqNdYPn2W8NYGm9sb6DDma7f38VsznFx9\niqc+873IfsQv/eIvQpKQxSG3b17nCz//z9i+cxvPN1YJhh8XuZDa5giPEh1Va66qlD1Vy+vFFldN\nU5jfDejL9ZfvF/UWe6cInnVcSOO79a9w+CmDdXG4lNfwIaerj6zXMUdS6sNR8Wb1XrPNXIu+Ztnh\n4WkTf3a73k1I5/dQhHJUrluZaV7psR3rxI+UOXGVxxPR4DqHmnal0jFIe54PiMPIaoBWtjy92qGm\naFfxu7xQCi8223KmClCnnfbFyW2b9oFZ0EmSTPWSKy+8ohiJgyUlLG2WqoVuONejAFxFwQNIDhfu\n3YB02qK/O5VlA8X0w+XdFHOQFT+ANnE0XNdlOIiYbc/z4vMvsXdnn8cf+SAhmr39fRaXFpE7eyg1\nIIkyBtmIbJRx8e23qI8GzC21COM59rIuSmWMVEqr3iSNNSLJiLoDatJjuNuj1pzl0qtv8NSZ8zz1\nkQ+h0LijDL/eZHu+xuu9HZJuj49/7rNc3Nrk9d/+DWo1RRyN8HyHOImQefwTrXMOohAlqmoALc9P\n1YEM1eu66tAXQlRGiSzuvVuurOqevQfv9n65rccdHlURT4vvlTkSO1ZRUW9h8WT7jpTHcXJdTzq/\nFc+WiUUhhJUd67Dd09IjHlfeUwC3wasoNiACONI17sC6yC2Zx3iQ0ighhCDDMMiuzihciB0h8X0/\nB+lcWSpyRlqIPNHt4TfthV1euIXLr53D0mZ57EVQBtmq07z4uxAb2ffG/c6pgWmLutzG4lArs3F3\nA0whGI/ZtFLFYdj9mmbCl1qUTrm+48tRPcRkm4+POmkXMw4WgOclihKa9TZZonnhWy+yNL/Mte0t\nZmZnufnOdWSWsbi8SBa5OLHD9u4OQrrUWz6tZg1PQKtRZzNKEDrDVeA4Kdrx2e91aScxtblFau0Z\n5s6u4Kaa7e0DxNYu9z98P3NekyhM0AttLjzwIKODLjtfe4OdzU2SOOSv/dWfYdA7wPEdpOMYl/OM\nfN3mQJAbU5fXSVn8Vda/HEe9TuO8qkDarqMMcNMOBrut9rovg+e7LeXv2e08bt+ViRtbLFq0sQqb\n7HVffr4gPMp4Mo71kksOiut2fJ9iH90t9km5vKcy8HIWenvgimeKZKJaFxRzrivOMmMXK0G6HnGa\ngpAoleH7PkmU4OrCmiVXluYAXnxbcJS9K7ex+Cl77xWDb7e3qpQVnVXAa5/+WusxpVNFPZQ3SnFo\n2NRC/uT4+SIfHxwNHWs4n+nhYItyuMGK+ovNVsikqzadyaRTWJMYyyBZORYTb8lDBVCVxYnx5nt3\njkRlhafWGoSDIyFJUp7/xgvs7uzy6EOPsR+49O/skXY6NDyXXhYyPzMLfcHqqQZDCc3lE+zs7jLr\nSU4sLbFdn2VwsE8vinG8Bm7gsXT6NKcefgDRnuP2wQHu0jLO4i7D3S7bnQ4bX/sGJ+eWefqRD1B3\nWsj9mOVglodP3su//fV/x6ef+SRPPfkU3f4uYIgFjcAVEqEdk9BCaGNOSDUYl8dYiKMhJcw6OtQp\nmPcLcD2qdH83410+4I/OR7W4o+qd7/TbZeq3CoDhMDKo/V7Zi1trI9IsQukWpdgHNnAXlL6NvYfj\nb4iFYmydPLdm0T673qqxuFu/3zMALzSux512xXMiEyidIUTuqCBAKdPZt69c5cL9D+LVG4SDA+pB\nDcf1EDhkcUyjVieOImN+JQROwQ5lmVFmwoTsvfz98nW7FDK24rdNQZQHvlgI0xawTRWUqe9ism3b\n72IB2WytvbDK41ochnYkv+LwqKK2yvMx3vxqkooq7lX1q7AlLo/L3cD3OFnrdFCvHltHOHmQMwNW\nQhhbai0kDpJvP/8COlF09g5oXzjJ9u42S406qU4ZKcVOr0OgBanrcu8T7+Pk+XO8/IffYrS3zUF/\nSHN+iSjRuCj8Zpu5xQUi12EUhjTnXUZxyiCMSV2HoVY4mSZDcbOzy+LGTZ48fZqFoEU/GjKzusL3\nPfMpnvjeD5IWabqyhCzLCGoNwylp8ozpGTIPq1oFXGXq04zNJItfHtvDMdRjMLLX0vQDdzL4WBUX\nWzWHRd12ZFJ7HqsIo+O4gPI6K/fVBvAqYrFqDdl12dFDq9o2qbOapO6Pa7td7L00LeSFXd5zR55p\nE12UNDXAXSQRlVIgHcfkrEPwzW99i//ln/9LPvY9H+eZ7/s4OsnItIRUUfNrRHFiBkXmMmpRmKK5\nYxGGDZ5VziFlQLOB1m63vYjsBVrup/3v4oCwF1uVxjuOTWAeRzoUFjQFKIvcgcMA09FgTUW/iuvl\nNpU9NMubYQy8gJvbxZZBvGpxSmfS2ciu6ziuxfOCyrErKMbyPJQ3o12Uym13x4yJAG0i27392kWG\n/QHrq6c52N3n8uYVOBiw6NdxfQfXbXAQHRBnmvbCMu3FE/SGCetnzrH0wSfYuH2btYfu59Xnv42M\nU9JhD89xEZki3NlleeUkQZhSSzWR79PzXHwpUL4mdgVv791i9tol5JVFFh48h7hvlTPdB5mfX0RK\nTZJCrd7A8z36AxOLW5iOAxohNVXipPJ6PKSsj8qZ7bE8vGf2WXl8p5VpoFe+VxYr2M9OzvHRvXK3\ndpTB1z50ykSNbf1xlCOZxKMycVbgQJVXcxUxZH9jGhbYxT7MqvCoXN5TEUpZblUeACgUEYAwhu9a\nmw2ZKoVXb+AFNR57/AncIOBffuFfc/LkOt//yWeYn2mT5YHmRQ7aWmsUxrvL4TDeseM4Y+q0igq3\n3bXhcGCLmBpVE1Q+3W3Kt8yCFb/t75UB3DjR5LbLWGDI5EYprhUgWbSjCGRlt8delEW7j+OKiraV\nqa1p+TNFSSs/zROyXJTK+XpRWJLnYyAKEcjdKZmiaKWgGHcMByFQqCzjy1/+Covzi+zt7LIwt8jg\n0nV8DQeOS71RR7sezXqTgRKsnL+HKDSprlr1Ok2dkbqSE2fPcvnSO+zfvImnFINuhyDwUaMBbddh\nbX6Guucj6jW6voThkP5oSMfVDDOXb355HxzB/W0POdsgc+HE2jr7nW0yYQItZSrB9wOjxBE6dyyX\nKKVR+ih4Ve2jKvGVfZCW574MrMfNVxXo2vfsUtRrA6O9PmxMuJu3drne8u9poD/tIKgiDMrttnGp\nvJarwPY4orCq2Jm7bK57WnnPALzI4lGAyzQW2MjuyDetseGO0oS5uTm6oxGtVptRcsDC0jKLS0tc\nvXKFv/+P/hE/9OnP8KEnn8KVLjpLQRsqrEomWgYY811x5Lo9EVLKcUB6e+GV2Sj7kKgCePs5myMo\nStmuvDhoig1gp7kaL14pcBw58Xxx4FRRBWVuoADl8qFlGnR0w03bVFplRzaUfXhMjR6YFdePyjP1\neB6PstpV60cbH7yxl57SGle4vPzKK9y+eYv7zt2H03Lpd7osZoKQFBxBb3sHjYSFRbz1k3gzM+hY\nkA4zFs6tsXf7Kq98+0VmnTqnVtcYbd3BUSm93gGtmVW8hkukQ/rpiN7tHlE0YGf7NvW9DioQhHVo\n06I1zIhfuYi65wzy7Cof/q4P8uKLL3Lq9JrJdl4P6A37eF6Q62KNV6kkA+ki5FEusIrq1bmeogoY\ny4BiONTJcTyOArfXfPFclR24DUyu6x7haot1WvxUzfE0QLP3a/m79top2maLI8vAbY/LtG9VHXBl\nfZc9zu/mICy34d2U9wzAPa/QzBoF5dHgVOa3KxSJ0mRZikgzhCtwfZ+408fzHBbOrHJtd4tlxyPW\nmg/c/xCP3/cAr772GhcvX+IHPvMZ5udmcKVEZBme66KzDJkmJta4UodxEBw3H7zcdrgE5rb8yxa9\n2MUOrWlT0PZklvNjliesSrxU/Lv4tk392z82uygdB8fJqXAhJ0QzBTgWm7roYzkaYxnodaZzz1bG\nmeDz3ub9s9t7lMqfRtnbpbhluAkT50PkUgCtFOjJdtntLY+bFCapQTEHrhMwGim+9Htf58SJs/Q7\nfebqdfb2NmjW6oTDDkInOG5KqgSd7janzp9i0D0g7I44c2oVEY/YffsywTDkhd//Cj/4gz/E7nyb\nbCBIXAjDlE64jQ7eohsnRN2QwPNwMol2fOquRxKP0DokQrC7s8VwZx8536DRmGPr5m1OnD+JTCXE\nKV49IBXgZ+AqJ4/tYSyrCo/dQqlcXk+iGLixDuDooVc1bnBUz3AcO19eq3cjZGwipLwWCkLCrtO2\n3qgqNvc6DQDL+6S4VvX94vdxgF4G8GnOb8W+tQ+wKiq/qj1/YkUoWZaWgGOSmi1+sjghdg07Hjgu\nSEOhuTEIx+Hk+TP8zh98hSBKqDfqHHS7ZI7D6okTtOfn+Gf/6uf5yIc/zPc/8ymGnS4eEtdxkDrD\nlZDqIk6byONJmG9plRkvT+tEdHJzroJ6KOy0oVoJUjWRBZAUYFrWRNuy6sKZxzglKNIknagLDCdT\njFXRLntj2xxHmiWkaZqDtMZxCmr/cLyLb9sUyuGCF+NvVAWV0rqwasgpEH3UhvbdmEllOeAe2vQf\nUmNKK6Se5JSKNlSJDrzAIRnFLC4u0OkMSOKMra19sswDGdBqBAz27hD19ki0pF6rgYoYqJh+HDO7\nukZdK25dvkivP6Tpw/bmbZKNO6zOzdCPQ1575QVarRqbuzv0D/pkyT6u51ELGswtzLIZjnB8n6DZ\nIk2hOddi1oU0HjLsR6R1Sb3ZJPPr+G4NN1FI6eBLD7II7UGCiULoKgeNIMstsgperdzv8ho0439U\nbFctjoCyvNzmLsulyj78KFV/KDqpKjbxUZQq7q5sulvutw2Y06j18mFQRR3bB45tNGB/r1y/vSbt\nPlel9SsTcXbbbFz8EytCsSnuspIBTEfSNEVmkhRwHSeXZSoylZEpQZZJFhcWSKOYURLRdudZXZ8l\naDRYzzIGUcj3fuJTvP7aq/zdP/o5/pMf/mHuv3CB4aBPzXGJ8kwcwpEkWWI0/K6JSCYcB0qsYdG2\nOE8BZS/owsyw6Fd5got8gjaYlQG+PJkT7CRiLP+2ix3b+nAcx7WOAbVYDPV63aKCCjHJJFWklMkw\nXpRDqpmxt2gBllWp7cp9KNdj962q2Cyo/S37XhWAF9ftw7Tb7dNo1Lh+/RaNepug1uSFb3+FR9/3\nOFvXbyHSmJsbt3EReAAKkjSj0ZxFNhQnT59nrz9k2BmwurjIzo0bXL98kWaWkqoEt1Hj1s2bLMzP\n0+t1QWXEoxApJf3OAUurSzjtGnKmRiOdp5fGaAGrq0sM9/cRmUvS6/PS177J+9d+CJVmbN+4xfUX\nXuXCo/czUgIv0QjPQbkmsp6jJTo3/RSl/pbHxv5dreQ9Ogdmbo66ok8rVXWUudbjRANF/QVhUAZA\ne87t9WO/W5TikCh+V32vKuZI1QFoEx0F6Fcla67mYA7vFd+zOYvyT/FslYf6ceU9VWLCpIy3LA/X\nWuPi4eV9EkZjgys8hNY4UuIjmZ+Z5frmbR5eOsPewQDZGzGKYxqtJp4T8PSTH0JrxS/88q/w4Q9+\nkI9/z8eIkxgZ+AitAYWUJhSlUuaAAAHSKA2zLEWKw3gtBWimaTqmyoHxaVuAU3HyFtS6raCxKd7j\nxqdYQCpTY2AuL7KysrK4bi9u0690ggqS0sFxJmOlF+/YVNWEKCiblN/bbSxvdpt6see0LFap6nsV\n1VNci6LoyMJ3XfeIWAkgqNfpdnssLK6QJpo//IOvs7O9S319hnPnz7F59QqtmQXC7j5ZNCRSKQpN\nrztgZnkFz2/gRiPmWpJAaTZu3cCPYxwp8KSkHgTEKjMu84GPyjSyXiMIfKJRaMR1SpFGIa4jiePI\nJCAWGrKY0d4BepRxK0nZ/L2Aj3z4o3z/pz7N3/4f/hY/96/+Vw7u9GkKByeFoQex0PiZMj4QaNBH\nD8/yXFbdK6+z0gxUWiu9G+6p/B17zUN1TPry83a7qsCx3IcC+Iu/bTFNeR/YbbDXls2R2D82QVZF\nNJSv2WtvgnMscaw24VPmAL6TcX7PAdzuOBxlZ6R0wMkXj8RkqdcCITWxynBSyUc/+GGuvPganX4P\nE5fXZaYR0Kg1SLVi/2CPOI342Ec/zgsvPs+trQ0++8N/mprvI1SKJ4yThIpDvDz5A8JFOC4ImQeh\nL8mCtR4rBQvqO8uyscemTaG6rjuWLduUyDQWztZAH3prYtI+qcPsQnYp/l1QyGX2FQ7juBTPFOBv\ns4vFIiu4jHIbpRVTumrR299Ns0kRSqH0vVuxZaM2yNuK4jLlVJY/FpsrTELqjSajYUQcZnzzG89z\n5swFVKaI4piNO3eot1oErqSe1Nnb32cYK0StSWvxBFt7fXqDIWfW15FxiIhCAp0hlGDY79GPh8jA\nQyvNqdUTDNQBKToPg5jRPzhAxhlpqo1ZZarQGWzevsMzn/kk1y5ehkwSNgKClUVudnY5e9/7uP+e\n+2jUGtQaDWSS4klJ4mhSYZTUXm466jAd4Mpc3nFUtF3Mc0c5nnImo+PqnWqZdAwFXnynCrzL67lc\nj71O7DVRRVlXcXPl8St+bPGHjVNl6x37Wll5WUVF2wRK1f27Ud5FeU/twG0xSplVKn6nOiPLA/Ta\n4SId10GiqCE5u36Kr3/lqzxzYo1Ot0vdN1mydZKQhCFNz6cR+IQq5IknnmBza5PP/0//gB/57Gd5\n+gOPM+zs4qiUVj0giSMDEm6RycNsGGHF5q1igQoqsGyIb3twVrFEtiih4D4KO9Ux9a1y6lsfXWxl\nJ4iqNoJZXMVi9Dxvom4bxIs2FfUVbRoDY6YmKJgqr9Fx//XkZrPZz+OojMJKwKZYbN1A1caYxp46\nvkOWKHynxsV3rjE3u8DSwiIqg+tXrjAcDhBSMNNs4aYw67swiqnPLeA0Z9i9vcFsu43WGVcvX0Sq\nhCBwieIUlWUc7HdJhMb3fZbnF2g0m/SihCiMcOsBg26P2vwyW70uC+snmDmxhtsPaTgOJ06e4+yZ\ne3Glz2s3b/DA+5/kxsZtYl/yvqefRAQNRmFErd0m7fURCpQPIZKaEggNWQUml6nY7xTEzdgdffZu\n1LNdijV2WN9RAu247x8nPiiv8/IaLt6dxn1UKRurTP1sQmuCC833dZUIuPi+/btcirVtU/BlLufd\niE/gPaXAHUxbbfHJpOy4ACcXmefSyzuqNbHWuIGPSDVri8vomovQMWQxaayRgO/5LJ1YpdPvIX2J\nFyzQCwesLC1x4aEn+M3f+HUO9nf55Mc+gi80o2HfeLkpk7XayRWbJti7IENNgEMQBHlvLEBNM3PY\n5JS3TQ0cBeVqrXYYhmN5OkxmoSlTpW6FXLygoLIsy1lsMK7XxnOvCA3iyJxb0FmliWFxwE4uUIXj\nehNadRvkJxayOuo5WQCt53lTRSh2xEe7PeUNWPxdcEGJZfc/bovS6FTgSbh68SonV9YI+wMWFhbo\ndfaQOmM0DPGFxnMyIiGpLyxw4dHHGcQp86nC04pO94A4HqHjGM938TyfURrnB2NMzfNIVAYZ+EGA\n67p0+z32dhVPf9eH6G7dZu3hh9C1Br3Lt1BRyksvv87ZkydZml3gkQsPsNxaZPmpk1y9dpUHPvI0\nV958Cz/w2NjfY9ZxkQloAbGbUUtNhh3tHlWk2RzW3cCkSjFpkokcigXfbbGfLSc6LotSymBbpoCr\nFNLFveMo1uIbVUrCKsrbrvM4Lqa85qq8LgvO8bhxKUpi5S6wf99NaVku7xmAw9FY2OVFJoRJguog\njDmYAKEFEkEqjJemLxxileG1Gmzf2aTdapNEEUGtwXA4oNPpENRrtLwWnYMO/WEfpCBxanzfxz/B\n22+9wT/+x/+UP/dnfpQTK0s4AkaDPkGtRhiFBmxcL5dBT56wVeZ+QghjZsck9ZkkyQQVab9nUxy2\n6GWalrt4pgDPKorZfqeoP1PZkXo1k2EubZCtmhN7Ixb3is1aRa3YgGq3uxiPqmIfCnC4McobxaaQ\n7PmwRVeJiqnX60jlcuXty5w/dx+j4ZDe3g5SxywvtNGhz6jXp68jYiSnT5+nMb9Ab3eP+x9+kLoj\neOlrX0XpDL8eEMUJdV+iEo1bC3BiTWtuhihL6XcHtLyAWhAw6zp4QYAUkvX1U0RA5gccDEOU0ly9\neYtOt8tTjz9BzZUkV69y6v2PkHouG719Hj5zD7t7d4iCusnKkypUkpIIyFJlUoExuUZsGWoVIJXn\nrjpPah6ygqMAU1UKavs4ita+Po0jKLftOxEtTIs/XqZky9+zDzlj7TWpvC33o+rAqQLdaW23gbpq\nbKf9Pa285wkdigm1nULsZ3AlKLOgtCNwlUBqkefBEwRKkrkOS6fW2dzcZOWxFaI4ZudgnyiMabZa\nZGi2d/cJo4hmq0WrVWd/NGRnv8MDF+7DlffzT/7p/85P/9Rfpua5rK2t0DvYZ3Z2jjgcGRdy60Q/\nbpAzpdDZUU9KG2SqgNoGy4KSLLNwxfiUqfqi3mms42GbRWXMcXsD2iBZ9pYrt6fof0FNV4GD3W97\nro+LdVwkobbl+fY4FYri8lqxlaZRFJnN5yhUpPnal7/M/Ow8r7/0CmdOn+Lty2/gORqnUWOhOUN7\nYZ4b/T1Wl05w4cGH2ekP6Q5HrCwv0t26SRKHLK8s0d/vEMYZ2SgEx2UYjWjMzbG4eoKDOzt4QUC9\n0WZuZhbP89g92GfzjcssP3iBnf0edccjCHycNCMlZUjMtZ3brNfPsLLQZGFhjrlBB6KE7eu3aLSb\n7PW7eE0f7UgcIQmkRLqQpUej+JVBpwoEptnMT66Zo9enUfFlatt+doJY0LpyH02jfqu+951wEkVd\nZdCuGp+iTTZxVei0qtplHwz2mi8/O+1aFRdwt/erynsK4FUiARsopJSkGoQ2XH+RPVpphXBdPCER\nI2MGd+qes7z6C7/HmXPniLOM5twc80Ed6bg4jkuWKuZzu2LpCE4uN1ldmGdnZ48oTfnAkx/kl3/1\nN3ny/U/QbLfxghpRFJLEITWvbnLvWTLZKgoQjJIVi6otmx8VlGUVpVzWmpcnvEzp2mM5qWAqFtak\nK78JzTuZ0d1kGp9cuAUol+eqPH9FKeKsl6/bm6Vo4zTzL7uUlZVFm4v+FwdGFXgV62Ysm3cz/l/m\n3jzYsuSu7/xknv2u796319ZVXVW9d3W3epHQCkYCmUUgPJYsOUAj7AFjmwjb4zHM2EGEPTNIzEx4\nHIQt2zEGI8AGBAJJtiSwWLQhuVtqSb1Wd9de9fb17mc/OX+cd97Ne96tluyYiXZGvHjvnXtunjyZ\nv/zl9/f9/fKXIrb4oz/8Qx594AnmZloMO/sYaYw/7GGGNqOdbepeldT1WFg6hutV2b2+Qq1eIQp8\nbl67ShaHmJaNV6kRRRmB30WZKcI0WDy2TJDEZIbEcR229/dJ4oTl5WUypeivbXDm/FlCx6RZmSFZ\nmCXY3SUjxY9HXL7xMs9d/BZ3rV3hR+bnqBs2mYDVW1dpV6o0ZxtEmWRIhBBghSlBQTFk3x79lZWY\njlanj0EeMz4NfEwrkxvE8joLf4tOhZTrKMZKV5y3sw6+XRum8drF98oLfRkoFt8vK+Uysp72jGn0\nS7no0SjldpXb9+0W33L5tgr8J3/yJ/n0pz/NwsICzz33HAB7e3u8973v5caNG5w+fZqPfexjzMzM\nAPChD32IX/3VX8UwDH75l3+Z7/u+75tab5FPu0BakxEXYwUupYGVKhKRkXDgPMggEUl+QGgKwpTc\nedd5Pn3z1+j7Pl6ljrRdjEoF07RZvbXOsD9ACkHNqzDTaNKs2QjLYPHee9jrjZhfOs7isZN8/kt/\nhldxOHfHCUhCXFsSJzn5qFsNWZYdxnaD7jgCcaBA9MEpPi8OatAVWfF52ZNeCLbOT+s8W7nvxgKi\nyP/M0PNfhGE4gZTTND8n1PXsIyhfz7ymT0z9OTo/eDukUz4PUI/cuT36y448s+ifAoHrwq+btXpI\npRCCKBmxtrZGvVLFMkxMz+PypRtImWCoBNu0icKQUS8mwkJKg9XVNTzXZX52jp3V6/T29iCOCLOM\nVmsWr9KkYxrs9Do0Z2YQRp4vvFGpUak1uHnpGsPBkGqjAULieJJUpBiOTUzCbneH4dY6hlRkmY+V\nJBgZvPDFL3Dlyio//Tf/Dotzs9TP3cXn/uBT/OCP/jAdM2FfhVQUGEHMQKYYlomZqqkYrcbRAAAg\nAElEQVSKRQcBZcvsOzHThZgEU7oMTxsvXU70estoWufni88cx5nq45lW7+1Cb2/nYC2+r79HOa2F\nfk/ZSpzGoRffK/u19HG4XV+XF6JyO/SQ5O+kfFsF/sEPfpCf/dmf5Sd+4icOr334wx/mHe94B//g\nH/wDfumXfokPf/jDfPjDH+bFF1/kd37nd3jxxRdZXV3l7W9/O6+88srUgdeVSdlZp5csS8kOIkBc\nw8Q0FWTkCAHIrPxA0WWnxswdS+z3u1i2w9Afsra+QcWqkEqDmYV5jCTFFZJOd5/dvR5CSuI0w7Bc\nKvU6KlO86U1v5av/+eskScJ9955HGQI1CiHLSCXEB7sLDdNAZSrfCSdyLlkZAlSGfvi3PjCFAirQ\nrT7I0xBuofx0h0dZOKYJhJTFJMg36xT32I59cIArCGlgWgKUyrOFlCaVbm3oSEwPBdSVrGDsyi1T\nLjq60q2MVxPSaZzm4bMO+dmDawqkyDca5dkqBWkak2UK267w4jMvEgcJtWaDZy4+hZVG2Iai1qhD\nFGFmMEoT6o6Tnyq/ts7xM6eJhza9vW0cKbG9OiLN8Ech0rRoHTuGbNZpzM/RC0Y4VoWKU2FzfQPL\nNVEk7HV2OHbiOFEc8cLqJUbbJhXDI9rdp5pKVJogpYWDASKjn4bs+H0++tFf455Tp/ieH/x+Ljz+\nCFaQUHFsLGWRkpFJMA3GWV7SFJWCYZgkCgzbJBN5NnYDMA6SXiVMWoy3Q4GFKOaX1CGdotR0JZkr\nxPLVQjEW8pDLZwF6dEvz1aKS9LaWLXW9yAPL9+Bb2jtMp2OmWbh5PZM7o/X79Pt1mR4/Ywzi0A4C\nHy8Y6vD37SwG/dp3osS/rcvzLW95C61Wa+Lapz71KT7wgQ8A8IEPfIBPfOITAHzyk5/kfe97H5Zl\ncfr0ac6dO8dTTz01/cEHq1eSJERRRBzn27z132EYIpUiEwe7ocKIOEmJsxQDMKXENxXCFLR7MW/9\nsXdwdeUKrUYdSUa7UmPOqWJlis29TYajLjYpS8ttzt73AKfuvJtzd93H/PwCg96A/e1ddnf2mF8+\nwdpen3/5Gx8j9JqYlk3FdbDcHLVbVRfLsfOBSnPHUhgGDH2fOD2KMKTME18Vys+yrPH5nGK8AadQ\nmnEco/OFurDrSFSPdNEVozzYgJRnoBOHXHeWpUhD5CGYMp+QaTbuc93JWq6/QOVFKdD/IR/NUSeN\n/m5FfLyeHuB2iE7fSVf86NRPnCUkKldKmRKoTACSNM4PuI6CgDDwkSIDVeGV569y97n72e928Qd9\nKkphRhFEYY5ghYlZqTFXqxL3O5jpiHiww8VnnuTit54mGvmYykSlkiiMGQ6G7KUxc2fPcuaeBzHN\nGjWvRTSMGXR7qCxGGCl+2KPb26G3tcXelWuwtYc7Cmg1asSWQWBaRJmBoRyczMZTFtgWD7/+MW6s\n3KCX+Sw8eJ71QY/hvk+DBn6kiGwLW0msOMYwwRC5Y9+2Xer1GZQwyZB58q40RSUxKpscO90nUVak\nSuVRYrn85Ju98g1f03VEHKckyeRPlimSJCWOk4P/Qc9H/l9SCoRbyIXe/rFPSZGmxU9GkmSk6eQ9\nMAkiiv91EKSDjvI8LlueRz+X2s/YainSb+SyLw4A1qR/rDwfvlMl/l/FgW9ubrK4uAjA4uIim5ub\nAKytrfGGN7zh8L4TJ06wuro6tQ6dN9PN8jIdUOxgLDqqUAZlHitJEh5/6CGe/PQfs93ZIonBERVU\ntcJCa57FqotnGnQ3Ngn6fda2tskOTiefnZ3jjpOnkYZEGJJBMMSPAnZ2dvjNX/tN3vdD72Cm6iER\nWCqFIEEYEtO1QeWdaKs8X3aUJlPNI908K66VY5qLdy7CE/W45rLwFKWoQ49B11d+vR7d2VQoRiHE\n4eHMuoO1zGvq71MUvU06gip4zWmlHFc+rZQ5cP0nyzIOVh8OkmNTcK6WbRNFAWmSUK1USdOM//jJ\nz7J05znMVBLudTCUIlAJrlCYSYoyDHAMTi4vM3vsBK9cvUyrNQtZxu76OoQhoepi12rY0iJMU/pB\niDIl9XaLXjDC8DzmF+e5/NxzJEmCqQQiVSSjkP2NHdqpzYJp4qb5uZbZXJ3twS5OJnHTDGHa1BKL\nc7U5bvRSXvj613jwzW+g1miB7dIxwY18gjiF2Qqj3V1O1GYIQ59YKUIDDNciVCmZ38dS4vDs0tSQ\nBEYeBmtyFDXq0VFlOup2Cqxcpn2ug4Fi3PK8PUctyUJ2y3WUUbEOIsqypyPuMWrP5aP8Hnp477T2\n61TLNGqkjMpvJ8u3m7MHn1LIrn5/2Rf1/4sCLzfydgNbfP5q14tBKedGKT7TFbuOFAoFoyseM5W4\nNZdYJMy35zGFw9CPGKx3MCwLJDRqVSp2haXjJ9nc3KbfH9Dt9tja2MZ2HWr1KtVaDQyb1z3wMHud\nfX7j93+Pn/rgB3BSsJC4psUoCglRKCkwEJhKYKUZjmmi7Mn0s/oKPy0PcvF+eoB/FEWHglYgUB2l\nF3UW/VAg22KnZVFn8dxiwVBKHSJ8XUnq7SiKLqS64I7vV2Mao9SmyYk0HsNpIW7lMi2iYLLPxMHm\nqrwNQgik4uCoMYFle4yClFs3V9jbGVKZneHkwjGev/JnnFo+Rn+4A34PFcb0RERWqXDMdNj3E2Jh\nsLC4xNbmKqP9faqGgSMyuttb1JstTMfBIaN1fBm7VuHGjRUqjSqGbWE4Jm6lQtzrwsGCHqcx2w0T\nz1C0fJ8F2rQqDZrNGH9tG0s6LNyxTJREzC+fQD17hQfe8jacN13gysYuZ4/XaS8vInc72LbB577y\nBd722Bu4cn2dxflZ/DQgMSVKRJjSwDLAjFMMJUiEIhGKQOZUn6mO9q+eC79syRVjp8faTyvlcS6P\n77iO8Xjpn+kye3Ssx4u+viiUlaNp3i4/91HZLs89/TtloFNG6NPQ8vR3ZmI+HNwx0Z5punHawvlq\n5b9KgS8uLrKxscHS0hLr6+ssLCwAcPz4cW7dunV438rKCsePH59ax7/99d8+bOTDF+7n4YcemDBf\n9GgNXZHozq9CwR0qqpHPufPnuHz9Ku4pB5SJ057j5MI8MhHgmgxDn0FvQG+wgh8E2LZDqzGD47hU\nq1W63Q6dTpdev4tpGcS+z+te/3p+83c/xv/wvh8nGoaEWYxj20Qyp3dSpTCy3GyMwmSCayyvqrqy\n1d9Ld/gJIQ5ReOEs1YVWFyrP8w6jQApzsai/+L7+bB0ZFxNHR7rlsEZdeU/jTgvKp6zgpy1gr2ZJ\n6KUY4zJaP5y8Wc4ZI4poiQIlSYRwCEYJzeYcz3zjc5w4fp7doMdXv/qfmTmwVNoLc8T7BkGvR5CE\neM05ZKXJ5c1NPKfC2voW27du0bBs6pZJGgQE/oggClGOw/zJOzh/190MRiOElFQbNXbW1onThFqj\njjBNVBgR+iEqShDzBpblEGcpMlHULZulU6fpKpfL168hLIuH3/AYtoIaJk9++Qucbrrcde8jkBm0\nz5zm4q0/obkbcqFv8me//1ke/YF3siYUjrBAJRhRnie83+9R8zwiBAkQZ5JMCkxpkHF085ht2xNz\nboxopx9LNq2Uzf3yvfq8NYxxlj3dAtfvLb5fjsiY1paxbIxpt7Gsjfn88iKjy3R54dEBzzRZvX0I\npE7LHKVovtPy9aef4WtPf+s7uve/SoG/613v4qMf/Sg/93M/x0c/+lF+9Ed/9PD6+9//fv7e3/t7\nrK6ucunSJZ544ompdfz1D/7Vicmp0yQwfvFpJzeXV+BCCKw049TJ0zz11W/w2PnX4YcpPX+EPwgx\nA0Uvi0gsSUMZuJ6J6zokSUoQBcRxyH5nF8e2mZ9t0W41SJOY4WhALwo4f/d9/Oqv/wYfeO/7CQZD\nPCFQaYo6OOFHocgMgW3aONpEKN5NTz2rhxcWbdc5Y8hRRxzHh/xZeVKVOUydLilKuS91Z1F5QSja\nVQ7Z00tB1eh1l79f1F120ujjrI/dtFK8U3khOKxXHTiySclEAuqAt8XCNDzqtSrf+sYLVKstlJQQ\nxvR39nCFwFQRIlNIr0aqbOqeS2PpBGujmG4Q4noee50dRv0hVRJQKYbKkI5NPw6IVUYjCuhs79Af\njjhz/AQoxXrgc+BbpVKvkzoRKflu43m7iUhSRmHApt9h30oBSf1YjUHXZqvfJXryaVR3xPHjc5gq\nY/viFWrVBfzugMVjs9i2RfziVV7vtdgSQ/7lb/0W9z54L9/zyCPMuw2MwRAzibEqVVKREYuMlPzc\nT0dJSCHO4iOKKY7jQ1qy6O//UqUzjTIsh3mOUXRy6D8pPivvI9B9QbpcFjJQPENvq17fWI4yzQFb\ndnpO7lsoK+hC1nRQpYOiaYtIcQzdQS2Hn5cpnfx5t3faPvH4Izzx+COH1/7V//PrU++F70CBv+99\n7+MLX/gCOzs7nDx5kn/yT/4JP//zP8973vMefuVXfoXTB2GEAPfddx/vec97uO+++zBNk4985CO3\nFYRiRdbD4HQEriMB27YPlVhRyomRlFK4tsvd5+5mbX2LkR/g1doI14VRQhgM2NzdwWhWyZRJ23Jw\nXId2s4VhmPR7fYaDPjtBQBrHVKou83OzHFtcZM5SrGys8cDDj/LP/+2v8rM//VNEfoBr2sgszQfF\nkoRpTJZEEI1Nw0LplU3AMkItb7vX83zrikz/XtEPhWCVN84Uwp6m463yegSMPjblmFu9nsJZmVNd\n4rC+Iq67HLo3NjPHucOL+nX663bF1LaH53JSZG/LiKIYmVookYHIFbgQCqREqAwhDCpOjf/4qc/w\n6CNP4Dgmyf4+LcvEH/XxTEHU8xG1OnuGy4mT93DP/Q/z5HMvcqbVIOx12FrfoIbANS1sUyAci54f\nkKKYabeo1mu89K1nMUyLY+151tbX8TtdXCEgjsEyELaN27KQlodbcVnbWsepeNza2eIN5+5k/tgy\nF69cxlxqsbPdwTig9oMk4B1vejN/8OzznLQF0V6X0foODz96N1/e/TL1eZcLp84xnF/kP33tKVYu\nX+Nn3v8+bASW5eBVPILEJ8syLCGRqUREKXGaksp0qhwWaQh057UQ48iRsSy8eqheMb7FvC42iely\nVCBTnTLUZVtPtlbImM6P63RPMe/z7+X3x3E8EapaOAv1re9xPFbKuvLWZVNKie+H2LZ9KLumOcnb\nj999PN8K4FP0VSH/xWfFSVlKTYa+Fm0rz9/bOfoPn62+E6Ll/+MihOBP//D3jqAynTrRV91y7HCZ\nCy4GIYxSVK3KJz79GYK9EfdeeIRQWHjKpCZcrEYdb7ZJ0h0SRrskaUwY5hEYhjTwXJeK6yKlIIkj\nAn9ImqRI00I6FqFIiVSMP+jzvW9+M2IwQsYRQigimRKJDAsDQx0951IXWN2ymJ6LQh6+q45Gsiyb\ncPhM4+509Frco9MnZUWro/OyBaSPV/G7QFBF3WXP/WTdxpG26kUpxb0PvfHI9YvPfFl7XjaxSGRZ\nBokBUqFEiiIFmU+Iqtug3/V56ivPcOml65jSoT5bp3/1Okm/By4QxMjM5Kbvw9Ixzt95P0ks6IqM\nh0/WufLiC2xfu4Lq76GGPWquSSYyIgWRYXLnXfcRI9je2qJWr2MaFttbW7iWgWuKPB94HJJJkyCB\nuy88xLHlBV64dJFYJXiJ4v47zpHZkr0s5IUXXqSRmniZSaxSjHTIY3c9wK31DkZ7kbvvvY+wu8fS\niTanTi7z3B99mcXmMrdMg0vVhJe3b9Hb3ea9f+lHaVc9bDKMLEOmKSpReW4fpRCmQZjFRxbOXElP\nykuBFHX5K9D6429655Hxeu7pL35bqqV4bppO5gAp5F2/T7fSdLksg5fJNufzSM/6mYfQTobE5j8c\n0ozlhaAc0ug4DlEUHW5MKmS9sFh0+daVdXmhKlC3lAWwm4zE0uedbv0ahsEjr3/Hbfv1NduJOU4E\ndTSKQTe7YJJzLV64WOH1aJRGrckoTfiBt38f//xf/GvuMcBFsLW+SejW6K7cpDk3h+u61JsGpmlQ\nb87iOi5BGNLr9dje6yCAasWh1ZqnWq2wt71PTJ6adLffZ36uzf/48z/Pv/qn/5Te5iZZHCFsA8M0\nJmLAi3cp2j+NW9M5/WlORz0/+rRE9dOyERb3wqTH/fbCP5nlr7iut0/nFPV26simGJfif8Owjpin\nOq/9X8oNHo6/IUAKVK6+EQIMw2LQHxGHGTeu3iCNYizbZLCzxvatq4gopDbXIIszUDa1VpvGqTsY\nhQG7m3ucefhBrrz0TdZXb1K3TYxGg1ES46uEMM0I0oyF44s02m1W1zaoVirYUrKztUl3c4vYMqkt\ntLFMSbVWY+GOMwwzyXe97W0szra5/7HX0Zpv82ef/A9srG9w18MP0OvvYtU80l6INCSGgo3A5+Of\n+wx/8eTr2P7mUyTHFqhfOE03DuhbBsfPnKX79BXOPfoQUS1meXmR1f1t/tH//iE+9KH/lZZTwd/r\nsFCtkWYBfuBTbTUIovDIIdy5/EyLsZ50/hVjVWzWK5derzcBwAzDwHGcQ9StRzTpgEYfV1156uke\ndNpUV+x62/I6cgd+gZjzOg2KU4gKKyPXG9YRnVOuu0zN6NZJUR9Myrtu8SqVTgAdyI+RNAx5uIjo\np1sVwBTyyDvP8yau3a68hkeqpRPKRik1YZYUglDepj1t8hd/+/4Qy7SYazawqzajYAjBgPnZJrX6\nDI2ZBt39LgMVMRxlB523hxICISTVSgWv2qLquQihGAUhvcEeaRCTZBmGY3L22GliFfND73o3/+xf\n/2v+yl96NxW3QhZHyExiSomhKTgYm1uFgBZRN2XlVrxL8b0iGqXMN+sKe9ohBsVnOn+n93eZPtGd\nkHqbpJQTC0B+PZsYs+K+4nu6c7act1tHOd9uJ+btFLwQAiXzEEIlZH56kjQRStBut/ncZ/+EOIo4\ntrRIGqXcvHIJw8xoeC5Bv0uUZkTSo76wyEKtxvbuPm94wwWG/pDrazcQSUgmBLZpYddq7Pc7jFKF\n6VWwag1urKyhkpRmu8ao32fY71JzbRyl6G1usrS0yB0nTjKzuIQxM0ut3uDZa1c5eXyZzuYuNgZJ\nGLF+7SbVmSpve/z1PPmFP2d7b4/uXgfbEsxUm8iKyX6wzerNS5y5s4VrV+gOfJitsVUTqK01ZOiy\nvx1iexZ/44M/xWc+8zmOLy3xpkcfZmvk46gMp+oRJxFRHGJbzhHkqy/Gen/rC3lRBoPB1PEq9okU\nii3LMobD4YRsjJXb0WiT8r4AHeyUI1But+iXZTGXP4vyQpS3QU0o4eKzwsotMwH6YqMHC+gyqlu6\nev8Wv/PvFT/ZQbx6/vyCviqYhiJ0etpRbOXymh/oANPPnSs6pNhyr5tz+sqpD6rlmmR+xGB/j3sv\n3MvK+i0eufM+dve6+HGIDFPuPX8PfZlgiipRlLCxscHO3h6GNBgOIizLYrbVIk2jnOd2LEwEaZKQ\nRTHhyCc2ElJg9sRx/o9/9S/40C/8AoxGqKE/sTOqzCUXpheMU6bqJlsxYPpJPjpPWNSpm5Q6P1hG\n4sX3Cg5QjzbRkXW5jqINZXSfj9VknHmZXyybvHq7pyn+aUWXA32CFGgnTVOUAKUkHIQTWqbDxvoW\nf/6lP+f8HXexvbnBXHsONeiTEuHHioZl4kvJIEuoVRxWXnqRzLUI/BmC9S1U7OMaJpHvYzkuwnHx\njFmS2KfaaBArwaDbpeFV6A37hOGIfBNlhi0lFiYiitm+tYKfKN5w74PYhgnSIOwHfPPPv8p8q8F3\nvfWtfOITv893fdfrCfc7CCkIooCKMjD6EbVGlee2r/H4e9/Ol7/yVe44f4aZk2fZX+uweP952t/v\n0OrFOJGis7uDlA79bsjDdz1IJxzykd/89/zE+9+DtCRGEmPFMVXHJc4m06Lq1JqugPK/J9FjIa/T\nShG+qjsaXdc9Ytnl83nsBNdlfxIkTMaq67JQjt4aLwxqYtPZGGFPi5CRU+vWaRHdKii3rRwAULQh\nCAKNRhnz38UJUrmTs/DrOYfzoRgDPSIsiqKJYw1vV14zBa6bDgXS0xVO8VLlmOLyyqd3cBz4VC2H\nKEu48847uH7ti8zPtXFdj0QYyDDl5ZcvEroW/jDFMm28SoUHH7gfIQ2yTLG/t0sQ+vR6fUhThKyR\nSkml4mFKCUIRpAGeW2X59AmEKfk3H/0o7/3hd9G0bUhS4ihBSUCAISTZwSHCGAZKAJkiifJVVxiT\nyKO8aOnKHMYmm86flxVlGRnoSrlw6lhWIezTHZjlFKFjBRwfmXj6GOhtLRw1t/Nt3K7k+Vv0I+R0\n5KNwDIuIfPdnGiUgJUEU8vGP/QGkFjt7PfqDAQYSf+BTm2uigj5pmhGlMfVWC9eW7KzvYjarvPCN\nrxFubeE5JrYtsDwXE5MoCJGWw+zCHCfuOM3myirKGGG4NQajbXZWVmk7HvWKh8xSKtIlCxMsZdDd\n3eflly5iNJrMLy5x/fkXaXoVXrr0MsfvO82PfeB9fO4zn2G23ca2DLIgpCUtbM9DJSkDYtb6uwS9\nPs9/5Slq75xj6cQd7O3sc+aRB1h/5iKDzX2qtkU/8Kl6Ht29PkqkPPrQo/zf/+Ij/NX3/mXOzs/h\nOlXikY/l2KRKIQyR88OZgiw7SAdh5LTUwTjLAyemnoyt2CpeLkVajLK5r4OF8Vw/unDf7v9yPp4s\nyw73MOjPyBW7hZSCLCunZj5K0eT3ygngMinj41z0jUaTLEtJ4tyRn6Tj+ZdlGagic6OiWq0CHDha\ni8RzeT6n/H2Sw1z/lhVN0KPF+xUWd2EN3O4UpKK8ZgpcVwxFmcbR6v/rJkV5EKWUWCIlkjGYkvla\nHSNJubW2gkwMTGEzO7eIeaKCcBziZMhoOCQIfK5ffR7HcWjUZ6i6Jq16g/nZOr1un+FoiJ+k+FmA\nYzvM1Bo0KlVAIfqKR88/wrPRN3j6pZd46HUP0UhSbNNipGIsN08baguJNAxCCaMkRgqBS35MWlkZ\n6gpYNyF1ISuHVZX5vKJPdMHI68vD1yb7UGAY5pH+1tujj1Mh+GWUrKP68f1jpFPmMF/NNCzSAJSf\nV6CVSmKjzJRUZRiJxHBr/KcvPMWVV3aY9ZrUmsus7nXYuXqVbCQIt4coGbFvZAihOF6vQejjmIoZ\ny2Rnb49edxdbGKjZFl6jCcMMJ7MYxgqj0sSYmcPrx1hWkxExo/Wb1ENBNQowaylzZ46jwoxoo4eJ\ny/GTp+n6A6J+h6Czw8rqTYIo4OrKNT545q8TxSHHTx9nb3OLdqNCp24yCCNakUGSpAjH5uWLlzkz\nd5L+1TXWdzcxHjuP8B3Cq7uYM0ukQYQdDnAqktQFO8loKBN/L+QdD76ZF5+5zFcGT/Oed72bdqVC\nEg0RtiTKIhAZpsgwUBhIUIIUgwQjP2szi1Eq55ZzWSlnvByX8uEJ5bEdK0t1SKHo1nSZ+ivKtANF\nyk78cWRWQppO+sly9D0ptwUC1wFi8VxdqR+2L03JVIY0JI7hYCv78CzS9CDSRGWKJC0OCJ/cSW4Y\nIGV6yDKYpn3Ax0cT1FGapoeIu7BodCvkduU1PdChvOGkvBKWzb2y0tcRvJQSS7qESYpTdZlpOJw6\ncYzt7Q0ef/gxNlY3eeXS81ieR6hS2s0ZHNth/tgylUqFke9jmSbdbo+1lRtkSlGtVJht1ak0ZnKU\nN/KJgoi97R36gz6t2SbuyOGNr38T//LffISZmRnuP3UHvu9Tq1QYjUZIQxBLgzgMEVJgc2AGHuzW\nlHBEIMucv24W6lRI2Qmj943eP4WiLSaPXq8QkuwgPljv3/I2/kLYdDNzvDAcjR3Or4sjil5fVG4n\nnDoCK1M9UkrCNMURBqlQ2K0GUSz488/9CaZTxVcR7Zk6VhRjODapYyNNRZhCEsXUWzOMwpRh0OHM\n6dOEwYidjRVcmZEoxWjQJ0oSGpUWuCZVz+HM6TvY2toiCnwu3H8fcRrTIcFcHqL8AXu9HeJ+wFxt\nhrBtklQsxGyN7sYmM1h8/ZnnOHXuDF/88y/ywb/+k/h+gDTgTW9+Mx//nY/hVqrcc999XHr5EiEx\n0pIEfgBSYBxbpGKa2ELQwCKt2Kxvdbjz/D24WchACK6vr2HZAmemiWdVSMKIlswwenvceeY0/8v/\n9HP8zN/4a9x57iRWFFGTkiyMMaUCU5IIgUKgsixH5YDSNqLoSmZa0aOExjzzUccl5IuA7pvRqYzy\n/J6M4BinTNDv0xWuTqnom9vK/HRhXep6RA+IKMJm9TmnMwQ6eDrMZ3QQDl3UV8i4YRh4nnd4fezc\njRHiKN9f0EA6rfxq5TXPB66/QNmUKj7TQ37KyFNXAlJYQEgcxiRCsby0yHPPPE+nu8vsfIP55Tam\n4xKmMaM9nyiMWL1xnWqthiEllm1hCkm7UcHzPEzTpNvtsrPhY9o2UhhU3QrtEycxDMFgNGQY9Nlc\n2+Inf+In+dJXvkyzUmGh2SD0I1qVGv1ghK8SpCmxs/ww2lRBKBRSgJFNps0sp6EtkG1RyjHUt4vf\nLvqoqAM4PGuzPA7lJEP6gqHzifmEyb9XVsBlmiR3mpq3NavHzz5aynlY9O8opQisjGqSIbOMzMr4\nnd/8bY41mmROlVQIrl2+yIxhILwaZtVBmIKeP6DaalBrzNDpDDCR9EYjtlauUbUkJCHCdEnjkDhO\n8IMYu9Hg9B1ncUwDooCHHnkQVxrs39jAs0wac7M0vWWcWzZpEtPd76Asl3sevp/r3V1sabD54mXu\nuPMEL196BbdS4U1vfhNBEpJJMCybd/7QD/GlP/08MYr548e4ce0aRprhOjaNRgPZrHH3hXNce/ky\n7TvuIGjPMFIwevZZ3nThAZ5fWWEGi/39Pn1LMrBGyDgjU4pmxWPQ7fOP/+Ev8Mk/+hS76ZDHzt2N\nbVcYdYfYVY8oy8gMRSrzkEOZHsRE32ZMppVpi3ihXMtjKMTRVAllC65QpvrBHRM+/qUAACAASURB\nVLouKAMAIQRhGB4+U9/UVj6QQf8p5ltRt76pqVDY46gRnbotFpKcY8+57ZQkyY48J4qiHMhpUSxS\nShzHnlgoLMs6jMwrz8NXK6+ZAtcHUV/ZyhNXP50FJtH3JN+q2O908GrVvEMMyT1338XF559jr7tD\nf2jR7/exbBfLc5lx5zh16tRh/cNhn16vR6e7j2EYhFFGtdbm/OIZotQgCCI6ex12tzbx/XyjxOxc\nm/ZsE2EZbK1v8+bXv5Evfu1LvOdHfgQ5ihgMRxi2RaRibMfCjjOMDFKVEacZjmVhaZE2umDpk0Vf\n3MoDWjZfdYWum4R6FMrtiv7cgq4qx8oaxlEKpGh3wU8WzykmRBmZ6wvEtFIoC/3gBr0oS0CSEQx9\nRoMh11+5zIXzD2IvLBCbkhtPfYuFRo3UUmzvbpGkArfZ4p5HHqc3DNjoXqZZrYGRR0vEwwEzFZPU\nMSBUZBls9TtYjmQpC6j4I2Y8l7nZJh4GV7++w9bmCr7n4c4v5NZWFHJldZWlM2f5xosvYHkO3ZVN\n7lta5Nr+Pt945pv84i99iFSAYZkkKsFyHRaPH+cNb30LX3/ya/hhjNGqofyAiuFiWyZbvT3OVAxU\nFDG8sYHXahJVPAzf5+IzzxIOfawgZtatYNYtAkOQDSOWZucYqJTFqkN3d5cfe9e7+bXf/y3WXrnO\nj7z97SwtLJGEQ7IkxlDk574KhTIOxiQdj1dRypvndDkrFHCZIpumNPUIrElwMM7Vk6bphLU3DY3r\nMuW67uEcKhSuDvZ0sFhspik+09tb5sClnGQE9EiR8vvWavUJGlEHpsXv4t19fzhh6ephvzrdM21H\ntF5e01PpywhbVzBjFCcnXlAXjLKJZllWHk+bZSRxgiklc3NzRFHM8WMnWV4+iZQmA98n9RUrq2v5\nM4TAq7iYpkV7dvZAoBRhGLG2vk4cZ1iWQ71eoV7zECqnHvxgxP7uHsIE0zLYXt/gztNn+dD/+X/x\n93/mbyIzhZXEmKYkDiKyJMOSkkxKDCnIkpQwSyaoiXKETfFbF6JCqRUKUhcSvX/LSGVqqNiYJjws\nuqBNKvw8RaiODKZZUuOJak4o6mnc+bRSIJEidresFBIjJVQZjUadP/nEf0AFIb1+B6ESrIpLlviY\nrgFhRGpIogxmWouEymGz12PpzN2YKuXKM19n6Ic0vQqCGCkMJPkmC9dzcBo1dre32L1+i4cfeQQ7\nTXn+W09zx2ybZKFJuL/PoN/H8RyGSUDrnrM4rVm6K1sQxNQdl6xq8/TT3+Rv/uzf5uz5c0RxlOfP\nyTKwBJlKabTbRKmi1p7l3uU5NldXEJ0hIhXEUciffeHzvPPRt+IlGb1ba1wKeswEJjVD8sYnHufG\nU8/ihxGdqEfgmjjKYPXWCrEJsSmRWR4C+ANveQf7gw4f++xn+Uvv/mGarosZCiyVIVVGojISkQJ5\nSuKyT+p2McnTwFd5nMcAJD0c2/I9hczpqSPCMDxUqMWu7UJP6M/TwUPZQalbbzk1MZ5fOl2jz69x\njHZ84JPhgKceI/3xZpw83lw/51WfE3oo9Lgd42CBYu6W53J5oZpWXnMFXjSwHG0CB+byQWiOPijF\nfcUqe2g62QIpMkzHxhECpOSx1z3BZz77R5h2FSkc6pU6jUYTb97DNHOnTJIk+KMRYRSSxgmu51Cr\n1XAch16vR9rv0OvtsbOzgSlNGo0mjUaT+fk2y8cWGfkDdvZ22d/fRbkWP/7j/z1/8NnP8u4f/AEs\n04YgQCqZH8Rs5890ZJ5BT4kxeoWxZVK8mx6ZAxxmKdSR9TTztein4rMcOUzmUBlzdhx+Txe8YlKN\nS767Mr9XN5Nz9CYPInmKUuYrCyHV2zetFJsghJBYVhGiVuSOjwELw/PodwKuv3iJmu3RHXTxsoS1\nK9v4/T6VmYy6MFGWQ6PepLVwjKsrm+x2R9x/30k6W+ukwsB0PcJRiOs5qDTn7SFHU9WZFmYGS4vL\nVDK4/vzzeCik7xNkEV7Fozvssz8IiKs291x4gBvXbhKFEdHQx7QkH/vjp/g7//PPcf9DD5FRTG6V\nJ0pLEsI0xXY82osL7O3scub4CWzL5ObFSwT7IzzTxKlY7O3vEKQ9up1tVnY3iWuzpHMtdrp7tBbm\nUd19GiYYjoFIFVXPRVkWyjYI/ZCaU2E48jk+v4xZ8fjf/tkv83f/9s8wazuAwDMsiH0MQEhBmk3O\nxXLWSr0UcqMj34IKLM/nPE93Ia/yIHIkQylxEJ9dbCE3D55ZIG6wrKMKbawwJx2chYzr2TrL0VHl\nuVKmZ4UQJEmMUtHhvUVe7zHSz3d85gpa314/aSHoCenyeZlOffbkO4kJCmhaeU0plKKTyqZ9mfMs\nfk9z7hUHIwAkaR6Co9IYECjDxLZtRn5Aq71AHCrWVrdYX9nDqlg5520YWLaNYUhM08BxPTBMOv0h\nYjAiSRJsx6I9e4yKVwNg0B/gj0b0eh2KDEa2ZXLy5ClGYciw20cZFi9du87DZ89TEQaGFEhLEBuQ\nxQlWlOUozJz0ehce6HLR+0rvn2lOQh3xTpqOk/Hhep3FxCtHkuh1l/nrslJWKk9UXxT99JXiO7eL\nVCi/68FfhwtCPj5O7oCSCj9JGfQGNKszOF6F9f4eye4Oo/UNIgNWwpC2sNmveDxy9/3EqSLyI9qt\nFqu3brF2/RJmEtGYaRGLlN5wQKpGuIZFGMcsnz6FV2uwdu063/PdjxH0+1y8+BLNagXHrtKaaTBI\nI7YSHz+JuGvhbq48/zLDUUStXmd3NOKVG5f52z/3d3ngkYeI0zQ/PydfH/Iic7noD4b0hz5Lx0+y\ntb5DpVbDbTZI+gFV2yM1BBcvvcxbHniM7s4u6coGw/kMu2IyCH1OzrUwqy42Mc/evEIqJYkMyYQk\nVQIlIBiMqNWqBN0B0XDIz/703+JPP/8F3vaW76LleSgJUgnqlkMUx3nIq0ZxvBoXq/PJOgIvj31B\nQejyU65D/06RAG5sDR6N2CorZX0+lCNdxpFMkzu8y++mt83zqkfeNf/J8+6M75UH8i8nQJhOx+jP\niuOcQy+3tdwn/007MYtSNLI8ufVB1RWU/qN7h23LQWSAhgKb9Rrt2TYvXHyRk8fPcPLkCdrNOYaJ\nT7fXYXd3l7SX4jgO1WoVhaDhOCRhRBCMiKKYLBmy3+kipUGlUsFxHOyKS31mBtu28X2f4XBE4Ec4\nlsMg8Hn4oYf57d/+d8y+9/2cmZvHtgziNCHlYOOJgFiQx+Vq76t76MtOoKIfivt06kW/p4ywdbRQ\nFpL83rH5W85qWKZAytd066E8ZrpTuly/Pt7losf/FkWndcxUYNZq/Nk3P88gSpiZb2L0O/jdHvO1\nOr6ZMQgjuv0B7lyL/b099js+C8dOUavXuX7tEpYKUWlECri1JonhMuh32R6OaC8sYLoVdjd3mKk2\nac202BuOcDPobWySWBb2jkfPgZEL7YVlLj13EQuLfhhx/+Ov4+rqDf7W3/+7PPzEQ4RxenDcHnnW\nyiz/HccxzeYMl16+wtD3aaYZOzt7yH3BXXfdw0qQ0VndYDAagoJnLj7LW1/3Xezt7PDy1cu4s3Wu\n37zBprHGhfP3cKa9xNbWBpvBkFhCs1onGAUkUmA5DkESYWYms1aVrUs3eOd3fx+/+fF/zw/84Pfj\nLC3hAcPeCMeyEOYkGHg1ZaIrwjKyLcbukP7Stp4Xv3VQMV0+Jzfb6Eq5XI8QYoJu0YFKGRXr8qlb\nvJPPn3SolxeI4vm5bI757PK8KfeNaRpk2dF9EmVl/2oLJ7zGceDlBpZRWSEYOidVXC+UgW7uq0yi\n0hTSPFc0KLAs7rnvHP/xs3/M448/yubNTbY2V1GmSaPZ5OzZM1QqFYIgxPd9+v0Bo9GI0WiI47g0\nGg0cs4EAgigkDDP2dnfwfT9X5LaNNCSe61Kt1rBti4qQ9Ht9fuHn/xF/+B8+xfzb3kpFCYQh8p1+\ngU8KGKZ5iOCLPin/XR7AsiVSToRf9KEeFjVeBBXFBplJJH10g0Z5gugLqd7nR2mW6WM8jTZ5NZO8\nfGqKziW6wsbfH/CtZ16AAGYzxd7aNrU0JSWCSOE4NqEHS7NtVBzgd3YZGgYbl19iOOxQ8ySGZxD4\nIxJhI+0abl0iGjMknksvjEljhV11uLW2ys7NG4goxkYwCAakQQh2nWajxcbl68wJj0FnwMLpEwjL\nJDPgsScepeN3kaabv6+ALM1IVRGeZjIa+dy8eZNGo0maKJZPnmL1xg3C/girWmEvHGIbINKMje11\nttfXuO/kKVZ7Ozz7zW8ws7zEyYcukJkS2Rkwqyz6hsHANIijCCNVCCGJkyinB2t1TGGi0pTN6yv8\n0F/4izzz9LeoPGEx41jMz9QZjnxkyedUyNTtxrk8N3Uwplt2OuCYJm/6olG2/HIKZpywrQzkdJ+J\nfhgKTJ5cVaxDOs2it0N/tmFMymFxcIT+bgXdVw4g0Ntf9m2laXwYzligdN3iNQwD27b/282FUubA\n1aFQG+gOtGJVLHfINGWfqdyUMaRACkjJSNOQs+dPk3xmRBD3WDrWRGYtusOYMI7ZWF/Fsm0c28G2\nHRbmZzENk+FoRBAEdDv7CGFhWTbVSoVq1aNSayKFxA98up0Oo/4A301IUxNh+dimRPoJX/njL9Jq\nt3n+6iUefvB+ZBgi/AhHGAhLEKuMfMvmGBHovF1xvXyEnD6oZTQy1VFJEZFSnEQ/mU5TR8w60ija\nVO77Iib4dqilKNPoHj1M8tshunIUwWGiJOHy5Oe/Qr3a5MSF81x6+hk8YeLZBmQRca9Hrz/AWpzD\nJKPX2aVuG5jRiHB3jWC4j1l3aDabuNUKQQRpamLXmiydOUFjcZ6VK1dJ+wGVSp2Xr1xm/+Yt5iwT\nfzQgdiW1EwvsD/v0Lt/A3B+Rypi3v/P7OfnEI1ROLPKnn/00xCmZmfs5JCJnwKXEFIXfJ+P5Z5/D\ncTxs08F1XAbBiDOnz/DcV59k+fRx7HaTcG8PM01p1mpcfOUFHrr3QZYXZjlz4iTveMc7SKs2W89f\n5qWvPsfJU6doVFy6qY8hbSxp4iuFa9lgSob+CNO0EEISdYckA5+3PfR6nvzKk9zz0D2IqotXd6iG\nt08dWy7TULEuP2XeuIyGy1FohdwWCr+QnXIOIV2R6/lEivt1PaEj2yLJmt7+sZU6ibCPREBNsUb1\nNutBBsViU86hP01/FXJflv3/ZimU8g6o26V3LJP4QuTbU/OXLPjag/whhosUEsMAA4UQCalQVF2X\nxx9/hKe//iR3nb6TJIhpNI8xU69RWahiGCbD0ZDRKGBjd/dAaVq0Wi2OLy5he3WGwxH9wYCdnV0G\nwwGObVNv1LnvvgdwbIdOp8P+/h4Dv08/CKhZFo40ufOuu/itT/0uXs3jkTPnsEVKGscIKcnSLD8U\nooRKHccZ0ymaOQiTu9PK5mUR4qQjlTxGddznBac8yblNj7cuC1PxdzFWr+bYmjZZ9R1mOldYLvmE\nzhPk55bVQdTGQTL8IAy5df0Gc602Xr1GEIY0TQeRhcQAwqBeq2HOzhP4PqQZy/OL3Lp6BeX3WWh6\nKGK2N2/Rnj+OZVdxhMP88jEaxxfpxiOOnzjO/Nl7uHX5MqsrqzAc4Fomo9EIpzZDXymQBnacseTW\n+e43fjdbieLmxjp31us0nQbD/QFxM8U0Dszqgks+6I9+f8De3h793oj2zCxhOKA+36Jzc4UHH3yY\nL339y9x13znWopCkO6A77JP4ip39XZxKhb/w9u9ldm6Oq3sbrG+s05AmchTSnm3RywTxKKZhN1BS\nkZBhGCZ4BgkCz/ZwDAvPMNh45Rr/3Q/9KJ/84h8S1W1OzM9TEflBJWLcXIQ8qnSK8cp/i0MH5Rhp\nF+h5fG8ZPY9BC4eHo4A6kka6zC/rIKeM3MfAo9gBqjv7x/NHd7qapnk0YiQb6xwO86pAlqoDeQTI\n55jeNr1fxu3isB909K6DpEM2oWQZ3K68pjsxi47WUZ8ezpMromji3jxKYDI8KO84gRAJiDyENQVU\nJpDCQvnw9jd8N7/26x+l/fgcSZrS28wY9od0TB/LyfNAGIbErVZIkhRTmgSjiH5nHdNex7Jyk+b0\nyTmUmkUpxXDQZ3fj2mEbPEvRrreI45ggTjCpcP3mOt/3th9g5dY1TswfZ7ZRQZoZWZZgynwjc/E+\nh2ghO4jBPjgKC6HIVIZSr36m5PizjGIrhmnaBxx1HkFiGEfpEF1pFz9l/l2/PnYGHY180dtWVuC6\neVimfyblIg/byrIsP4kmizHlmEK7GnYxFuZox5Lg0gp3zS4iREJn2KHvG+zGgmb7BCQNNoabuJbH\nK9dXMP0eC1VFlvTZCyJCDAJSjLhDNOizO+jA17/AYPsmWcVmaFhIPGYtlzuW59gPujDTwKnMYI1a\nNGfqGG7KUmRx5YWXuKYEK1cvsfobv8cZ9xi2UUfYHZI4wsJCkVNYWZor8s7OLrdurjK/cIwwkbhe\nlfWtHnPLp0i7He5eOk223uXEqVNcvXWd4a1dDDy+cusW7//Ff4hcWuLG1gY3r1wjGUS02m2sKMXZ\nHbJspmxlCftGyOYopt2egWhEnMUYBgyiIZ5h4AeKRsPjhWee5/zJe3j26StEZ1OM422ahoXlh8g0\nyU8/sqfnQomiYGJOj8MQx0qzAFwFoJhArUIiEAihEIyVfJKNQUBhheo+Il32pHQmnK3jaJRCvosz\nOSeBig4Q9YiVQ3mVB3OK4pkwzn/Cwbw6nIHFDJiYn/rcGLdhcp+GPj+K9utU1O3KaxqFUuZTixM4\n9JwLURQdDkySTIbAjZV6cW3yYAHDMFBCYNoW8TClUqlw9epVmjNN7r77dVTcKnGS0Ol16PQ6JGlM\nmibUalVajRaWYdLr9dnv7NLt5pSKYRjUajUqFZfWTItqpYJSCt/3GQwG7Hc6+a4q12N2pkmUxOx3\nO5xYPsGXvvRl/sqPvZtREiMQec5qSx5yYGmakKnsIClOlsMRIZEIIDs4vC0vxTsmpS28yUHiLNMc\nO0XK5m2ZYyyjomL1150rZVRRfB+K5D1HF99J/n1SkZfr0ksxUU3TZH19nePHj7O5uUm73UalGXbz\nFEbtFoaf0h12GOx2WFhoYgmJbQgeufAAljfDjZub1E5WCNc6DLdXmJ+12BntEw8VaWSRmZIgVFQr\nDZq1RYzzDW5+bRevMsdgtMfsksd2b4e4tszVzoBaq4XrZLz00pPY5hJeTWIbI0Zek6gv2UlN1ndH\nPHfxG7zpr/04fmWfUQSuMkizDEMKDC28zvVcarUqe/v7LC/XkVLS8irUDZNICa6+/BILtQqzssX5\nheNsxJIbF6/znh/+ce6qz9LtDPj4v/ttzi4c4+zySaJOl9XePgt+xsnFebY3VxEVj7vuupPtW6vM\ne1ViEjJLYFomlikRaYbjePhJSmIZnD1zmpcuPs+xmdeRKMGMY2MfnGIXh+Ft5nI+X3PEmFuvejTT\neLwN0oM4e4OxE3GsByA7mOeFjphGtZVlSd+kVt4PURTdUi1z9tOsxUJ+i1OndGoop4WOHl2oh9CW\nI8CmlTJtWli34341bmulFuU1U+DlLeOQd0QYhoQHgjLNJHq1rdnF/xOOPSFQgY9Xq3L3XXdz/eYN\n7r33XjbXrpGkKQqJ63nUKi6WbZOmGaPRiE5nF4EijiNqtQqLiwtIKej3+4RhQJIkrK+t5ZysY2M7\nNkE4wvUqKARhFBDvpQRBgGXb2KaJ51T4/Je+yOsevoBhWhjShExhmBJpCCxMlMqIovCQPpCGgTqg\nFHQ0M40nE6I4DLkIcxITvGFBPd0eHYyFd1ry/7KJV14MivvL3LU+Nnp7X80pViD0Y8eOEYYhCwuL\n+KMRhmliDDYx/T08WSGOBri1Crv9PsqUODNNTt9zjtWNHR5+4kH8ZJ+b68/TnlmkH+4xiFIarosh\nHazmDLWzp+l3+3iRYOvWy3T9faqOR5o1CXZjztaWWWgsk9ab3Oz0SfoGJ+0LDFlnf7tDo91my7aJ\nnIRRMKS/ucK9dx7j0bc8iqrZmKHEzAwMebD8qvH725ZNp9Ol3V7Acx3SNMZwTPajPv2ww9nHH+La\nt75J71Yfp1WDxQbnz76RO994gd72JpdfukQ7gmo3IKl0GYqQfTWkc3WD5e4eJ04scT32uXXzMg3L\nIw58YqGIY0V2gCTDIMBzXaRpEGQJZsXl0QsP8Xsf/yQ/+M7vx3ZtBnFExTIO902Uy2g4PJijBzn8\nSRACTMMCAVmaH4uHEJhGns4hzTLiJE+YZUgtZlyIgzitvLNul3GzkMGy0tblteyQ1Hnuyc06k8cP\n6pZiOaKkTG+8Gkgpg5iyjOttLOaLDn5uR0/q5TVT4LqS1Z1UMF5VkyTBdd2J1bWsKHSTo7hefHa4\nYpoGO5tbXLhwgd/9+O/x+OOP056tUKvUiZOM/f0ewWiIIQ0s02R+dhbXtYmTkG63y95ej36/T5bl\nKH5hYYFmvUGchAR+wMbmBoNhP1d6Eiqei+N4WKZDv9fLkXm/z1x7jv6oy8rmDidPHYcswpRFlsBi\nwBSWdeD0kLlAZ4e00aTDRx/gMeWU96tpSg2Rc0TQ9b4qR7IopQ7zphz1yk/G0MIkVTJtIhX36PW8\nWikQleM4DAYDpDRI4tFBGk6ba1//PEavx+Z+gFQjnGoNMslWd4f52Xn2hnskaojjRnQGHjVPsWSa\nrI1czLm7MWLwkhSzNUPr5BleDK5hOTbnFz0qsUW6F+FUTT744+/j6vPfxDQl3/uX383Lm7vcurqG\nuR/T9uD3PvkZ9mMF3hy3br2MmQ45PjPLP/7FD5E16/S6GTXHAsZ0kzz0Nwhcx6VarTLbbqGyBMf2\nyESGY9mMTIPWsSU2b8z8v+y9aZBlV3mm+6y1533GnIeaVKVSSSpJpdKA0MUSYCxE08aAgcYNjrYb\nPETYHTg6cFzfe922L0Tfxh3hoY0d0Ya2kdtuOowbzGRjsAEjwBYYoQGVJDTVXJWV85nPnte6P9bZ\nmSezUsbhcNv88PqT0859ztl77Xd96/3e7/0QvQFRq0djdhJvusHc/gVO/9lfs/nCea48f5rb7ns1\n6Jy8SEllTj/apB67uGvg1nwOHT1MazCgsF0KpUFIhBL4rkvNq6DyHDfwCFQGjmTY6/GGH3wz/+13\nPshP/fRPUgl94jzHfZFI0veMymacGhtGgx3crpQSIQVa5UhhYUuJsC2UECM+eZsf3qJe9Lb3STmn\nxneD43Nsr4KXMl+0uzgOdppdjePK7uYrZk3ZGYSYWoerzeOEuNoKe/cx5dit8irxKxnb5XxXA/ju\nJgDlwz9usWjbNlm63YtufEUrL/S4VE5aO1dCKQSWEMRpysTEBLnWvPQld/HYo49xYH4K1/HxvSqe\nV6VWqeB5AYNhTJ4N6XTaKJ3heQ4L83N4XoBSBXEU09pcZ211Gdd1CQKf2dkZAj8gSWPiLCdTBd21\nVYqsIPBCAtenWqkQZzFRmvD4k08xMTeLW+RkeYYlwRqpRMzkMIqFclupKZAYb/Hx6GCcQxuPLspk\ny/h1hr1NomDbna0cux+Y8Sii1HyPHz9Oh42P8Ydj/H6P36O954YJD5Uy7m2249IfDKg2mnz963/D\nmTMbeMLmzAsXqPsBRAmF1Ex4LieOXc9ae9MAhBQsX7mMpfp0dB+rUsXVVRxboaM2QeDhK485v8nR\n6RovdM/jFwELEzNce2Ceb3zlcwgnI5ic4uzaCmfX1zhxzw20L7zA3OUmv/qe/8zD55/n6Y0lNjtr\nNOxJ/vWb3khYmSQRAfNVj6i9jPatrftZ7qQY2QmnsWnlV6s38YMQlWYMen36620mDy5w9PhNfPGP\nPk7ddYn1OV56zXV8+vc/wt31A1jdiMC1WRps4skKV1aWaHXWiNIO8cqAO6duZQLN6vmzePMzrPVb\neE5A6FQo0gKJwNImr5QPYxzfIk9TLK1pt/q86jX/ks996UG+/7WvoR56yGhvCiXJTMENeUbZdUaj\nKYoMlZk+kI7jYAsboTRaajQSpQVKK7I0Qwsj2dui1fTVoLx7ju2Odsfn1PjudC/A36vgZjxI3I7I\n9/Z/Kc837r8y3ox7fI7vBcS7d75btNqoEUb5vr4TiP+TFvKMc6DjnFHJUW0rHcBEqOX/7lJRbBVI\njEUIyqTPNZowCEzlk4Q3/eAP8oEPfpCX332nUZZ0I3q9der1aSQ+1bAyEmUocpXS7bWJVIrnJbiO\ng+PaTE+bJGan06bdbiGUMXP3fZ+gEiAdh9D16XX6qDwjKzLiWGP5DpOT04SNGn/00Y/x4z/8Nqws\n2Zr0Qhj/YSkFAoneusc79dDlGOfOyhu97SlztVf4XlKuvSiU8Z//Nk5w/L2MR9jlsaZYwfCiJZ2j\n9U672BebG0mSIGSB43oUStFoTPDQQ1/nzz7zWW679mW0V5fxlYsdpcT9NZQlqM8vUAw1uaoQTs3Q\nVT7B5a+QRDnrokKhLCi6aDthWCT49QbnO5tsti9xcLJGMJREhWI9WmftyYtMVD2uO3CIpAVNq8k3\n//rP+O1f/3W+7+StvGr+OIQZdii4++jNfOFzH+N1P/BWbrj9DjIPsmIDJ/PwpUUiLcTIFAllqktV\nYcz7o2jIpYsXmZ3L8D2P1IKNqEtkwalLlyiyBP/oNayfuUR8donwm09w5023krk2rXhIn5xvLZ1F\nSBiurVMUCYmI6QceV/rrHJk8QpFmPPHEE2xKcJ2AIKhhWx71+gSBF6J0QaNeZdBrURQ5GYLa5AyJ\n0ATVJp/9/Bf4odf9AEnxIhz4OE8sBLbrYtsWaZZstRdEmMja0ubZTFPjcYIY2WQIC0sopGB0fQoy\nXUbIZSRt5rUpSCufi+3GDdvRukaI7Z24mZvjc3lnIn/867hu3LzmdjXxdiBjErHj1Iv5nquei3E8\nG6dexivRx19/fFH4ro7Ad37w7e/HwaH823jJ6fgW5cWiOKG3Y1CJ0e4UronK9QAAIABJREFUeY4f\nBtiuw+233cY3HnmExYUDTDSnmZwKQVu0Wi16vR4FpvVTvVHBdhwq1WBEKZiHLh1tv+r1GjOTk4SV\nEKUU7XabtbU1BlGE1JJGrcbUpOkXaDsuvWjAIEkIwwqe6/H0s89x/eFDWMLCD32iYR9ny0SodM6Q\nIEDsWuDKa+S67hg4loBeSp92Lojj13739YTt48ttcPm78f8pf7f7f/eOjNSOKGeb31M7HqLdI8sy\nNCY3AEYvbdk2H3rg92jUmzQ9QSJSXCsHVeBWQrpJRjdVPPLUc3RyxcyBnHavz0y0wsGwgacKUqm4\nohzORSGx47HYmCIUbbxrJskP3srSk5+l4goOHV5kdn6G7nqbc6cvM2O7rD38Zd73jjeT/ZvX8ev/\n6VdYa6xy+rFnEbN3MKttLFfw6h+8n/PrbWQAOhuQqYhCTFJoUCo3c1GZQEQgCP2Afr9Ha7PD8vIy\nT546hTs7Qb/fZ7JSQ1YCMqFZPHEzi1P76Fy4TG+pzcbEBh8//QgHDu1npjJDnxzhCLqrK6g4QjoF\nvbTgS6f+hlxojs0d4nhY59nWOlWvil8JoFLh/NoVLq6uUa1WyeKEiuNwZN9+pOVx5vR5lK2xsKgG\nDc6evcRCvbHn/RokRqXi2A7CdigkaCQZAqRNqc7IVYGPNLtJ2zZ69FGXdq0K0jgxhThSmpxSlI7s\nGEwuKs+3k/Gl5rvUmBu8KEYBw/Y8L8HfAOe2jLCcs7sLbMajZiMsyHbM8/Kc5fwdpybLY/fabe6V\nq9uL694rN/i3je+KlmrjvOn4z+bv4w53Ro+5G3TKiLO8F5JdWy0pcWwbiSCJYq4/doz/9bFvccdL\nXsaVS1fw3JRapcnERJ3ZuWniKCHJEgpV0O8NiKMhlUqIbdvEcUyaJuR5Qb/XxRpxtb7vE4YB+2tV\nNIIszej3+vQHfaQlIYmNukQKBknEXbfdyV9+8fMcO3KUXBUM4xQpbWzHpshztFKgjdE+CFShUGMl\n71tSqz1Kk02UuztquNqqoLz+4/Kp8ty7cwrjC8GLAffu+1gU29TYXjz5i1MoRj2UZRnStZGWpN8f\n8spXvopTT5yinbdYilt0fIfuUNCLc7qDnMWqYiLrkHcvkRdPU4lbnJF1dLRJvbPKRhbxaDHJqcEh\n6l5IrXiM6yZXuLye8sxZj2YlY3W1TW1dsrFyDiEHTM5PIsJZHt0ALqeI/vP8u5/4PoKFF1jrnuAv\nH6rz2CMb/Owv/DLn2ysUToAqJIIQZQkKv4LSA6QwUg6zYzSf+/nnn0doOHHiBEJaVCtVukmf2uFr\n2T+7wNTCAsFEg4oX0sDlKx/7NF/81KfJ2kMaU1Pc8Zr7mDiwAFKS6JTnn3+Gz/6vP8QvMoLQZUjG\nX5/6Jr2Ly9x87Q2cnJqhnSQknRaHrzvMyZfeRldotOWiC42daWqWjxA2Aw2Zyim06RRTDX0CuXcS\nU0vf8O+xceRL0giAWq2CF4aj4EIhHRtdKNRWEFZQ5IWREUqJ69u4vm+AuFD4vr/VYmzcQ2U8dzMe\nMY/Psx3U6lhisMSdcfzYa85v8/c757d5fWPItYUvW3N676K28aT+buuL3c/Cbinjdxr/pCoUYAf3\ntJsS0NqsvNvbpe1Ibpy3LY93HGNDaomd+soizfB8D6VNaD49OcWJ227noa99nZe85C7yNCdKBqwt\nn6VareP7Ps3mJPXmxGib2yPNUvr9HlmWEYYhjYZPvVodccKKfr/P6dOXSXOF53rUGw2azSae55mK\nzm6HdneTKIqwbBfH93jlK1/Fz//ie/jP7/uPuFKAyojjCMcyulhLSNOjEIESCq22qxHLiVIa2Y/f\ncDPB8h38n9kO7qxAK6/xePedcdlhObnHndzGee1x7nBvblvsuL/l8d+JQtEmRDX2nXlmdhTY3P2y\nl3H67HkeaWc8s5ay3ovJZUCufNwgJOpGHHcV109pmvEZXL3Cp5+b5xkxw4nrX0EiYzrrSyzaEjHs\n8PQLZwhvkBybcXGjb9AKcs7kPQbuPPvqU0wmCQcXZ/nk04qH2M+vfmSNu60r/Po9Lkn9MhPBUQIl\n8ex5vvQ3z/GTP/0mrrzwHE5ekFsVOlmM7SkcrdAjLbtlWQjLtDB79LFHsW2b8+fOMT07w9raCvuv\n3U9Qc4l1BHmOTjLaSYeNvOClr7+fi+tLdNOM//s9v0jqO2y22yzOLNDNhswdOYgtNZ//wz8k6Q9J\ndIZj2Ty7dA6lcg4dOcT1x67n4vo63/7aV9nXvpHG4cM4jSZxrrCkT4EFClzLNs0dtMQWClvbDJO9\nm+zabh1Xmnli26Ylm+NYbG6u8+xzF+h2u8zOzjIx2SC0ffIiRwqNlDau52NJ4/qX5hlaF9jCxnYF\naZoTjhaAsuHveJKxbIiwW8I6DsblceXPpm3Z1UHgbvDfrXobj9bL319NZ+7dpHk8yCnfc1mktDsg\n2/1630kHLvTfNVb/BxxCCP76S3+yo2R+HADGs9d5Hu/QI4+D/G7e3HECQ3BtZbPNBXAchyRLkZaF\ntCyElBS+ywMfeoBjR4+yMDeHN0qyJHFqqskQhGGVOMsJQx/X3da6aq3Rhelrp7WhMUpuWGCZji5R\nRJylOK6DtCx838fzPIpRxDwYDFnZbNOcmWX1ymVe9fLvQecJOomwhBjJCEfbNQwoq7GsfHm9dndK\nMdeT0Y5kt3vb3i5s4xOzjDJ229TunvC76ZzyXDt14nrLm2J8kRjfAdx8+yuumh+nHnkQJYwH+zBK\nqFbq9AYplUqND33oAT5xamB4UgSOGzKMUrLBEDvpMWX3OTapOTyRMeHEbExdz7llxcV+jVYKbtHi\noJtSsSyeWdmkORVyz9SQuzjHeRwiJohoovKcBU9RwWFYOcqZ8DCbUcRNxQpvCDrU71ij2pxgWOzj\n86drPLxc5+6Td/DShZymvUZUDVkVPtoJsHWK1BqJRGgxKlyRbG62eObbzzI/v0CeG7dCJRMykREN\nEkQMvgy41GuzWaRkWcqh5hSTfojlWRTKJnArFAKqzSp+aFP1JJ//6EfYeOE5Gq5HJxowlBpsTSP0\nuPHQtRw7cISoGxHl4E/P0jx4mOriQbRXoTtIkLaN69oUcYZU4LguCZrCsbjtuoNX3a+/efws0ir1\n1SV4KaQlEKPEvAC63Q5FHjMcRszPzRD4Lpcvnsd1bALfxZKgihw1mtOBvb3o7+VtMj7n96pzGAf7\nEiuMrNbZcezuYKU8zrzWTqrWnMckoMfxyszrvaF0/BndHcS8WAQ+/qzdcsf3viil8k+axHyx6G2c\n7E+S6CoQKbcisFNymGUGeG3LMvyYtMCyEVJQq1SJ08SAtypIs4x7XvFyPvunf8pb3vhG3BE9MjFZ\np1ppkOeKaJiw0b7CxYvncF2XMAypVCo06nXCSoDvTxDHMe12m83NTWzbpl5r4Hs+9VoNbZmmD5ut\nFhcurJgiJcumUasxOz1DY2qOtV6P9c0WS0tXmJtqEgYhRZYihXnQFaALRa6LLToJxmVOe2WzDeCP\nc9rlJC9HeR7LMj37tnc8xhjf9/0xHrDYES2Plzbv1uZvbzM1lrVLRjYWlZis/d7Tz3VdkjzBti2m\npqbIc8Xi4gLDYcKRI0dwHnsBVEatEkJRULddItemm3p09DSnuoonW0OqFYvGhS9gA3GrYGBfT9fb\nR9bPuefEYRa8BU49c4n+cx3q1zV5yWuvZ+O5FZ5/7AXyxjyDa49wafM0Uxf/iDfOw6SbcfjYLbR6\nNsnmNDP+Ck7lDNdffw/Zvvt46htXuPF4wuLiZdaHisVbXs6VzR6+G5JnObrQhkaRNrZlMzMzw9zs\nPFEU4boeSmmkGiClxrJd6OZU8MmqIWu+Jnct7EGCM4zpD3rEg5yzl1Y4vXyJT3zy46hkiOdqjl+7\nn1kFlcIC26fr51xON6nEPdrP9OitrjPv1JmsTjFdm2F4cQXtNakcmKSouHhhyPmzL3DtvoP0W118\n2yOOIzpRf8/7NRikOK6LpmzqC2ElRAhBlsWkaUGtVqPecMnyIUE1x/I8sC2uvf44oe+zdPk8ly6c\nRwrFzMwM1WpIPujvKOwr6cLxuVRiQSm/Gw8AsyzbUk2NB4GDwWDX83J1FFzmlixre6eZZdko4t9u\nbDK+kNj2zsbd43x9CfLj0fteu9aSYvm7JjK/YwT+zne+k8985jPMzs5y6tQpAN7znvfwu7/7u8zM\nzADwvve9j9e+9rUA/PIv/zIPPPAAlmXxm7/5m9x///1Xv6gQPPTgp7cedsdxtsxoxlce2Nszpbw4\n41WC5QUZN5LfTl5cLVsLlctAKH7nY3+IV6tyw8Ej1JVHxQ9waxV6aYpt2VRsD8u1sV1ni3NrtVpb\n4GnbNpVKBSklaZqS5+nWexi/aUEQjBoSpMRxbN63tugN+gS+y1/91Zd4+79+C7VKiC00RZbjeT5F\nZppaeJ4PRnCzHTmMQNp2zHtjtI1VeY5EYVg5PZKwgWObyEMCQpnkrtKQFxKtc4wjQYEQymh2tSbP\nQUgHy3LRhUJmPYR00bZLYTtkSlCoHNvSWDrFtVIoEiwUWrloMBW0WiMcF8f2yJUELKR0ueGW266a\nH//9gf/K8so6nV5CXEjOXrhIrdZASFMNeOqyRa4KHN8FKekM+kaKlmtEprCVoBHW6W62SYKIvFBg\nuTiOR5GnWMWQuZpksabRnYscmnSZqFgspS0Yptx+8Ci1zhC1uokKHFa9kGFtkqBS4ZpJj0NN2NfY\npDbXp+pY2P0Gwp9kqStxmabmwyOXVljzb+LY7fdh2QP8VGFZGb1wSCx8QkLIOwiZ4ykbraBtu0jl\nUJUuWilUUWCPStJLeajCFOFYloUjQhwpQfU4/cJz/N7vfJjzp5eZmmxyy4nDdLpLOK7HU0+dJZU+\nIvQ40Kwz69g48ZBG6HPzrSepzizyxOnL2I1Z8GocOHwNN5+8njTL6HQHTM7M02l3yYqCl95+01X3\n64sPPUYYVBFCkCYpQtijkniLvMioVo1CK80zVGy6XQVBQJpl5CrD80yn92q9itYFrVab9fU16tWC\nJIlRuqBaDZBSYKFBZdiAUDkohSUlKnUQUpLnGa7vEsURnueYyk492i1jJLO+cChKNZCQ5nttFlel\nCiwBcuRmqpE7sKVMmpZe4OOjbNIwTsmMR/jl193WsSWm7XYkLMdNt73iRYH8OwL4V7/6VarVKj/y\nIz+yBeDvfe97qdVqvPvd795x7NNPP83b3/52Hn74YS5fvsx9993Hc889t2OVgpJC+dToQ+urdMjj\nJL/rurtogJ18+XiiIs/zHVnc8hjH2Qbf8tiGVyMRmr5Q/Or7f4M3v+6N+EoS2D4Zmla/R5pkpku3\nJfF9U3RR0iWe5xFFEZ1OhyzL8H2fRqNBs9lACOh0OgwGAwaDwdZiU6lUmJqa2krADKMUy7JZWV1C\nCM0z336SH3rrWxAU1MOqSWYWijRJCSsVFJq8yA3XNuKJbMs2wD7O0Qmjf9di2xpdCyjyAgFYjCIF\njdHh6gTUtkG9FIIsM4kk27KxbVOhWiiF9BxqlYDWxhqB71JkKbbropBkwkJbHjgeYbVBHJkuPYXO\nSNOEJI3IiwwhFbkqGPQ6fP89Vy/w97/p7aSZxvUr2H4dYdnEUUy/16bfa4N3iFwpbM9HC8kgjlEq\nB10Q9TqErmTfzBQL87O4ls/axiYvnLlIqiRKSNAZgVUQWikya+PlA2YmKqykNfrdgiMzNe4/pqj1\nH6PT7tGTC8zt38+kvcyRekJdeNTDeZyDbQovgaSKP1VjJU2ZFAHVYY/Lg+M8vHwTjWtDjh47jrAU\nw3iNWt2jn8UI9mPnHrZ9jsTOKLIDuAVgDdACY3ylCuxdO5xCKwqdG44MhySKCX2Ja1k89a1v8yvv\n+zWKLOfotfuYm2+wsbHB+lqHrrYYoLn7+I1kGys0bEEt8Ljp1ls5dusdNPZdwy//5gf45qlnueGG\nG9m3MM3Jk7fzsnvuJUoyXNdnMIw4ft01V92vR049y+LCPlZWVlGFNk1RtKbsuBNFA2NGpsGyXBzH\nVByHYYW1zXVsS6K0wvWMKqXc/U01PSxLMoyGPP/8s6RpwuzUhDk+TciThEatQqfdoV6rE0cxeZHi\n+t4W721ZFhpBUUa7UmAXikJptBYoUQoFSuxRIwAHUAi57VRYRuEg8P1gC6NKXErTbbp3ZwegnW3S\ngKuwa/dOepwDP3Hnq/7+FMq9997LuXPnrvr9Xif81Kc+xdve9jYcx+Gaa67h6NGjfOMb3+Duu+++\n6thya1Ru2cuVbfz845nj8nfjq+FupcS44U2Z6ByPlMuLI4QgzQsKrbFQ3Pfyl/Pss9/m3rvvYX15\nlTzO2L9vH7broKVEKU2/36ff77O+vobjuLiuOwJ108G+TCieP38eKKPukOnpcCu5E8cxFy9eoihM\ndG07Lq4DszNzrG+sMTk9x3NnznPs6BG6UYzKUvxRx6H+sI8YVWgKKXGscfmU4fnLSWFJC12okRbe\nROFaaWzH2ZEjMDGGQsjcKAPQSGEjsAiDCllqNOqCAtcRYNm0lI3IMlzfxtEJgaMYDNustGLWY5tn\nlzqcXurQGeZEUX+bX2QUgWiFkMa5zpICuBrAa/tuI4pTcm2RaPO/hRfhihC7MNWZrhfgOh65sgh9\njziJSZM+1VqNPG0xvb9BrnrYcYaKB1DECG2jhEOSQYRk6AZYwmFi4hDRVJNjQZe1QcEL588zvepz\nz+w+DnotltYiVq5s0gkaRK0Wh50N8tok0okIqlCLE1AJXkOBs4Q10ac7OEFt3xv5xtMfZ27qaeza\nfsLKtVj9NSatnK4YYktJmNfwVUqsU7wiJxUFiTXajgsXlB4FJxmMKv2sMi8iFZVGaGhGJDfcfDPf\n84qX8cW/+DyDKAbmSBNJmuZEWYxTq9Pp9bhmYZHuyiWqroPfrPO1b32TJz7+xzz6zAu0koSnXnia\nK5erHDhwiG63S7XeRAjBwsLcnhhxeP8Cg36PxdlJsjRDSuPN3et1sYVDLXDwA980P8nyrcTi+sYS\nExMTdHsdmhMNhsMI1/FI04ip6Sm6nZ6REQqbG46dIC8yLpw/B0WKY1l4bp1+pAgqMwzTFq7vYOnA\nBG0jSkpro1xzSpVKrsAydtNKG6EAQkKpXNNiKxJHY3ZsI0B2HGckJzbnHN/5w84OVOO0o6GSsi3A\nLp/bErTLBuLjVAtcbXa11/h7c+C/9Vu/xR/8wR9w55138mu/9ms0m02WlpZ2gPX+/fu5fPnynv9f\n8llldFry2OUY30aMJzVLEC+TY+M8bJmsGL8Iu6P38hy26yJzRcVyuevWkzzwxB/w7NnnuPbgYUSS\nUcQRQsKVzTUmmpOEYUC9XkMp08m83+8zHPbp9435VBiGAFiWPVKuRMRxuvVZms0mQRAwNze/9VmH\n/QHCdhkMhkzPzOP4AX/+hS9QazZZmJ2lUasy7LTxXRuVWzCWoU7TFKU1crQ1y7ekh5pCWqiRhA+r\nLJQw+lstTKHD6Cqb66QkYkRrIC2UhiiLcGyJbQuUzhC2RtoOrvIZRn1mmg2eeuwRpBQcOXojdc/l\n4x/9HBuRTawr1CcXsYM1kxDWNhIbrSR5qtDqby8THqQuw1TguD6W65oGGEVOkUU4lksYxHT76xRF\nihdM4Fg+UV5gSweJ4siR6zh37jxS5lR0yNpmi0E6MLsDy6fSqFAoje24WI7FehyzsbyBtJfZt1Dn\n4A1TLJ25zDldZXJCc2Qx5pFOxEPtAyS9SV460WbfWowb5xyen+CYFZJlXdKsiVd1cPc5DHD58pPL\nXE5sqsPHKYYtTm0sc9uJm7Fzm1qoGOgWMQ0snYO1Tk+HCOkiREaRF6iRpWuhjEGZVtrUAyBQaOJk\ngOO52LZPkhQErs07fvLfMjFV57N/8he8bPEoa+s9KvWUuNsl6Q/JOj1E3TR1mJudRynodvt8+9ln\nqFaaOGGDPFXccMONzC8sUqvWkZbFxsYm5y9cAO686n6dPf0sa2vrHD9+E0FYwfc9er0+i4uzqEKN\nFhhNlkQ4novnhsRpwszMtbTabQ7uX2QYRdSrIQhB6PhkaUIlqDIYRFSqFbI0JS9g3+JhwiCgyFIs\nBJeXLtMbpoQ1jxzTMANpfFtkoSnhT46uGcKAs5Ejm2dAaVMeb3alFloXW+ovVLYF1Nv0idgy3BoH\n2DzPtrBm/G/jNRXls7tbgDHOOuwuzPvbxt8LwH/qp36KX/qlXwLgF3/xF/nZn/1ZPvShD+157G6e\nqBzGW2Rk6jPy3RgH43GeaFzuttsbAXbqmXevbmX0XR4jhGkw2ssTXCTpIMa2Hd74xjfwmx/8AG9+\n/RvJNnscnF/EEh5Hj11LZ9O811artZVQmZyc3JI4KWVkhK1WC9f1qFSqNJtNqtUqcRwzHA5JkoSN\njY0trn9hYQHXcUiTmJnpGS4tXaE6Ocn9r30dH/noH/MT73wH0bBHxbNJs9TQIblCCqNOsSywtBhZ\n0o6igdLESgu80ozKyMgBTTKMQJj+kmaLZyIQq6iMKn9AWJJcFyAgk4okjRBC4VoOeRSDEixdusK3\nnx1y8vaX8eiTz/Bf/uNvE6Vw+NrjpEnBRNNj/eJpgskatuVgSRdL2IAE37xOmsbEecxew5Y2Fd8x\n7ee0xrMk0nMQwmOYDfBck6hN0h7RIGFiYp56ICmURbsd8eg3Hmd+fpr+oI9TsciFh9cMEFKS5QWW\nDRaCoohJowLLslFKc6p/jOTCJq84EtDcV9BJ11lCMlvELFa7XCk2+UanyccvLVBNE6wNn+vO9njT\nYs51CxpBHTms0N54kuaE5qtf/zBH7zqMlyXY6kmK4ii/8kd93vbW1zOdPod2UlqOQlsaS9sUloWT\na5xyk1QoLNsiz3Is2zYcq9KMxER4roNtCeJhTqM2RRx1KHTGG//Vm+kPNH5tGmVXCJpw0+ICeS9m\nbqJB0e2zf2aeIs4Z9iLOn7mAJwIKZXHwwBHe+kM/zB0nb+fS0hWWllapNZoIYTM7u3cELoTmtttu\nNfcXTRRHI5pEkyTRSHmlmJqdod3rs7GxyuzsLGkSMTk5QRInNJumSUq318N3PUOp4OFPhcRxbBK8\nwsZxHIbDxOCE63Hd9TehlObxU3+J75kydFtK0lwjRgGNRIM2EbWUAmlbxkgOUztiMbKdVQohjcRT\n6BKL1I7d/rbXkLsDdM3vtrXoJeUyjoG7o+ndODUO3rsD0Bcbfy8An52d3fr+x3/8x/mBH/gBAPbt\n28fFixe3/nbp0iX27du35zk+8tFPb4HfbSdv5uSJm3YoHsazsqWYv/yge203ygtWVmeVzY7HL2h5\nI+I4RvgWtnCwCgNyi3NzvOGNb+DZZ5/lda+4j6TbJ8tSNpcu4VshnuMjtAalyfOMIsuJhxFBEOB5\nLo1anUatRpxkDAdDeklClpiV1paSxuQUs9MzdDodoigiS1LyJCHPc1qbmzQaDdqjKtAbbryJZ557\njhM33UCSJ7iBh8oKPMsxyS1lnvCtRUtKUOBYDshRkUOWmgKirUmgqYQBWZ6iioKiMP7iKImjA6Nw\nsQuEhSmnthTCttlopfT7EROTs4R+HStNWNx/Hd/6ytf5zH/9CPWZfSzcfC8SSTboY9GhIgbUZmw2\nkFvGXEIq8rygQGG5DtKViGzvxd2xjDc7crvoIc9TLJFTDR36qUXgWORJxHDQplUMENLBdQKqnqCx\nbz+vefVr+NKXHmRDu0iZkSYxlgZHgixA5RlSCxzLQ2egsdishZxOh9QuLnP3URfdyXnykuD41E3s\ntzZ5pbeErvb4mnMbT2WLuM4+is4Z1hp99vWGSNFimBU4NZvnnn2QRnUStdEgyersO7DBiabiyf71\n/MFXz/OON8xTT0/j6RZ5JqnaNoW6RJT6CG+aaq1BkiRoraAAjUBYpuBFa8Pa2lJRJBm+DEmjlCLX\nKCEohOQn3/UzfOmLX6edpORqSJ4NmPMCkmGXqme8Zabm52l1h2xuDvi+V72Wky+9h6A6AUJy5sxF\nojihUqsSxyYB+CJmhCwu7idJcvwwJFMK4/Oi6Q07eI4LlkUSZRQ5eK7PxIRNnpucy7A/NAn+kdVF\nrVLFsR2yPIdc41gCr1ZBVwKGcbJFkeZ5Tn84pD8cgoDDR25BCuj3e7Q3N1FFSrNWo8gTUMa2WakC\nKTRxprBtwyYWuUIr0+xCCNNkZZtGUQjr6u5QIHYEhCUWlZWYZbBZ5vZ2q0nGi3l2A7ZlWTz8zcd5\n+JHH/04qlL8XgF+5coWFhQUAPvGJT3DLLbcA8PrXv563v/3tvPvd7+by5cs8//zz3HXXXXue4yfe\n+cNbIvxxW8fdssISvMeTBWVknmUZruti2zbr6+vMzMwwGAwo5XAbGxtIKXFdl6Iotnhr27Y5d/o0\n0/UJpoI6QRiQ5AW3HL+RtSvLPPzoNzm0sI96o8HM5BSdzQHGIcLc2GpY2WpuPBgM6Ha6pGk6aoxc\noz43ZzTfRcFg0CeOEy5euECtVsVxXGZnZkz0nqVcWb5CkWcMkphCaYJahUpY4clTT7I4N8P+xTmG\naYxKUuq+TRIno8SumSRZlmG5FrZlb634JtFqqKnBYLCVCDYPvsR1HbSALM/xXA+RCbQFgyTGciy6\nyYBnXjiLEj6FChgO4OzlTfq9S9SciHaccXG1z/zBm8ENIc1JBx1cz8NKLFaXLzBVr9CYDFFk5LnG\nsUOUdEgLQZxotOUhqew5N2qNOoWCtDBUGdLBESFkGuFYNNwqi/MBjYk6QmRsttbY2Nyg3enR2uxD\n4fPM00+AKnC0IIpzfGlT5BlaFWSFSXarQpNnGsvxEBr8fJ3USTkV9XHOR9w2N0lYd7i00sUlZX/Q\n5c5QkTUvcTw6T3PqGEVrinOxxfKShxqm3H7UZ7pX48KZs0yzQaN/AEtOYA/Xud6NeP3hOT6z8VLe\n/8cv8NNvuYbZaIUZO0DpIZGs88WHvsmDX/461WqFEydu4fjx4xxpNxd0AAAgAElEQVQ8eAilCrI8\n37F7SvpDZqan2dyIAJPUrTaafOWv/ppPfuo3+P7vfwu5lGjL5+LyWbLAY7LeYJDaVCpVvvbkUxy+\n4SZ+9Kd/hrvu/V7OXlghzQAN7XaLW07czMrqBvV6nbxI2NjY3BsQpEVzaoJ2t0cQhihl/PFdP6Tf\n79Oo16l7Ia1WF68SEIY1Xnj+Ba677ghrK+vYwsb3fdMIJUpQTkFYqZCqIb4nSZKMOI6xhY3nuwS+\nyyCKTWTOqCIzk0jHYWqixqF9R7h48Rznz5+mWQupVF2UTk3wYEtsvK2dcBAEZGlqKEfMomL66Y50\n7SOKcrzXJugdlZglVgmxkyUYx63duvVS3lhy4uUioJTijttPcNvJm7ew7r996MMvisXfUYXytre9\njS9/+cusr68zNzfHe9/7Xh588EEef/xxhBAcPnyYD37wg8zNme3V+973Ph544AFs2+b9738/r3nN\na65+USH46hc/sWP1Gv+A46vR7t+XQFSC/9YcGq3MJRVT/t1xnK2ou5QBFUVBogvqQQU5ahKRS8ht\nwcraOn/+Z5/jFffcy0SjwWA4xHWqqIId9E0Z/Y83Jh0X6Zf6VM/zEEJsVWSWyQwA27JQWuF4Hpbt\nMExikiyj0+sgpeDJJ0/x6vteZWRYhjPAdV3S1HzNixzbdsiLHCHl1muVn911TTcex3FI01ESxZJb\njSEKrcjTnEEvIqgFxHlKJjSV5iTCDvnkJ/+CXg+SoU2aWLhegHa6JHnBvgOHWdvoUKnVSZIUoXNC\nF1TaJ416JFEPlQ1J4oxqtW4iZK+C7dbADshwiVPJh/7jW66aH2/9vx4gjlMsNyBXxscmT2OKZECR\nx9ixxzDqURQDlBqQ5V2SpIfnuawsr+J7VYSwsS2PNJWmmcJoe2uoIgHCJleghYV0PLJMESqbxFXY\ndsREtsFtswGHmjDhDqkNlpHtZbTrMZya57q0S5c5Loj9PN2r8tBSRlRJubY+4Ia8YJ/bQeVnmAjn\nedP33UowlTOoRgj3GP/zayf4kyvHYKLNZPItDlltAseiOXGczupprlx6CiEFU9PTZrenCpIkMSqn\nRpMw8AmDgGbVo1GtcvjwMf7m4Ue4cPkip556go12m9XVNidO3MbS0mWUTnFlTMVVxIOIyeYkhYLa\nxDTv/Kl/R1CfJKxNobEI/IDNtRZVPyQvFK7nkSQJ0pY0G1XmpqtX3a/BMGZ9s0290WCz3aFab5jn\nQGiiQYTvulgjIHRHQU8YBCiVkWXm+Qt8j8FgyPz8DCvL67TbG2T5kLASMjU5Y6S6QmBZDkmWIaVA\nC0maZUhpkcQFcRRhSUmeZdQbIaoo6LTX6HTXSJMBQeiQ5wkqN1WQrmMbya0QFCMFm9wq0imfkTE1\ny9ZuvrSr2K5INrm8qxUlu6mQEqfGaeDxgHV3ZC/E317I809YifmpqwC4jKx3C9/HNdzlBy7BCaBS\nqXDq1CluvfVW4jjeKrtVSpmGCiM6Zfz/4yxFCkmRmXJj27axfR/hu6y1NvmfH/4w7/zhH6G/2SYr\nDOhNThjjKjA35NKlS1srqIm+KzQaZvKurq7S6XRI05QkSajVaqNOPqGJllWx9f6zLDNbLt/B932Q\nkpXVVTr9Pi+cPs2b3/qv8AERR2ZRsm3SosD1XKQl6Q0GNJpNkhElYzsuaVqYqCZNcUZt1WzbRdoW\nly4v0e6ZDL/SMLN4AJAsb6yz0e7z9LefY6PVp9OOmJ87QJFAGFRRSFqqhxSSWlij4lcY9vsErkea\nphQ6Q0lFksZE8RCvdYn+oIdlKYbDPtISpHlGc2qWiZl53LDBf/mFf3/V/PjR//d/oAuN41dQ0iUf\nReJpGpOlKVk7B50hdMpwuEEStdA6YjDo4I6q92q1Ov1hhO530UJiOw694RAtLWbmFrG9gM12lzjJ\niOOMQoN2lFGtDBMsKXCsgn1Bxu1TihsmUlzRYThM6XRy2s4kDb+B7dRpWwe4qOY4E/V47sK3qccW\n9x+yuY5HuHmfi7f/di4t3MTG1DH8zOLYgZP82kfPst64iTh5Bnv1G8ilS9w4XaXfPw9WQV4U1Bp1\n0JrecGi6RDWMmVS/2yNNEjxbIChIsoSsUFQqDdY3WsRxjO952LYgzzIsYZOrIV4oGPT6xFHCz//8\nf2BpdZ3Pf/nL/J//z39gZbXF0SPH0LnClZrAD7iyvEatVmN1fY1ms0E1rHFgceKq+9XrDRlECVoI\nXM8jKxT9/sBUH9sWvU6HwPOphAFpnhMEAcPhkPX1NQ7s3z9SKBV8/BN/zJ//+Z/TbDRobbbAylhe\nXqbIco4cuZbXv/4NvPrVr6ZSraKUYrPdodmcIM1zHGmkrloZEIyTGCk1jiMR0jQ3f+TRh1lYmMWz\nXXRREEVDGtUK3U4bxx5Rq6Mq2S09trXbZ99GStPCcRxPjIBib6zLsmyLaSiVcbstKUosHC+xL1/3\nuxLAv/6VP92RuCw/SFk2W0bR4zx3OcZlg+X5yhWy1GSD0Vr6vr8FbKWGO0kSyBXKkhRa4douKslM\nFO3ZDKTi81/4PIGS3LB4iKAxieVuNxouvQw8z9vaIZQ3Ic8zPM/HsuRIVmT4XFPkkzMYDLY+l5AW\ntuOY1lZoitwcgxBkQD9KubC0RLvb575X3Mu+ySa2Y5NluXFx05oCZfS2loUSRnvb7nRJE0WeZkxM\nTrK2sk4QVBBCUqnVaHf7SMfG8wOGSc7Sesr5C5fZbPfJC9BK4NgWybBLNGhRZH1mp+pESURWmcGW\nDhWvhmcF5ImmyBXSdhC2oD3o4QSOKZoYtEiTPmtrl7FECmRkWWyUjNKhMTnHh3/jP101P971//0+\nWZqRZJpU2+TaIi00WT6SZgnFsN9Hao2lc4o0QegMSYHnWjSaNeJ4QJLG2GlOlCQkWYYb+ITVGlpr\nBsMIhMR3XVRuLHw3ig51LQiQDAvNem/IhLRpDNvMhQW57oHUdDe7fLlf5ea5kJMzVVrtmCvrA1ba\nPfpugKw43FTTHLEHTDUDujOHeHQpZC2/ESU0jeoKr/y+7+ehx1OoBiw2Mpa/+TmayeMoLJRs0O31\njLEZJliJ4wjbspACLGlhjSqK+8MOw7jDkSPXEHgN0gjyNEMXAyqBxMKiSCRBrUI7avP+9/8GT37r\nCY7ffDOpKnArAb/zwAPceP2N3HzjTcxPzdDp9ehFA4IgJI4T/CAwBWqWzTX7F666X6319qiwyifX\nxpd/MDSePnmS41oWqjDPTKYUzWadTqeD5/nkWcrTTz/FU089hevYVMIQ0LieQ5RExMOI1dVVLl+4\nyObmJiCZmJjgdW94Pfe/5jVko2dRFcYyViuBZVtEkdmFDuMIz3fRwhQQXb58kWzYQeUZQeCh8wzf\nsRkMe8ZNUZjyf2MkZ2jGcXwqwVUpdkTL5ncG5McLc4AtLBtvSF5SOLtL6seZhPL470oAf/Trf3FV\ncmB3tna8gmlcDjhuIVmCYbmilUBedmUHtgyoisJsRS3LwtEWhSXIJfiOi5UWCASRUAxc2Gi3+Njv\n/Q/e9Mr7mZjfj1epbC0u7XabOI5JkgTHcbZK7MMwRGtFHEdsbGxsUS5ltWbZXcgkp0yFZBQleJ6N\nZxs7xaLISfOCtXYLy6uiLYezFy6zduUib3ndv6Db7TI5PTUqXQbpWPQGA+I05fyF87TaLVZW1ul1\nE6SQvOb+f8HMzBxFoanXGrQ6XYZRghMEnDl3jjMXlunl0xQFeG6VNFUmMaIifCdDZatE0RJCdYjj\nAZv5DNOTcwgdMDd5gDQRuF6F/jAmzhP8qk+UDul0u7iOy+zMBJYsCD1BGg3QqqBem6QoHDQBv/Dj\n/8c/8uz75/EPPbobLbywwjCOsRyXKDHJRjR4to3QkMYRvuehHZulpcssLMyT5wWPP/YIL7zwPNdc\nc4hatYIQgnrdqLcsx0EXim6nw9nTZ7h4/pIxhut1OXvuHPe8/F5+5Ed/lNm5WYRWoyplmyLXSMsC\nAXkBaaZwPcjygjjJqNgJly5fZGN1mUa1Aio3ctmiQAiTMNaY/pxK7bR4Nc+zQ5nI3OnNst0Ba7cM\ncFwiPS4T3M2T27a9RYGWC8PJu+777gPwshJzvLQUtm1mhRBb/PK41Kb8fhzQt4t37B0fdPycJUdd\n/uxjo4BCQi41uSrIsgTXcigKhVcJ+eNPfAKkzT13vRxdKPq9Np5r4djQqFcBjZaCKM6Ik4zBMEbl\nCYHvYdsOjusRRTGN5iRxktHt9bFt1yQ6bAdVFKgiR6NNtOg6ZCOje601aRYTegF+EHBlZYO/+NJX\n+DdvfzvdToc777wDlRWkWU6Wa+Ik4/NffJDG5DR33vlSqvVpfvt3PoAX2tx+8mZeeuJmVs9dZH56\nnn4qyStNHnzsaTYGEUWeoFSOQOG5NlmaYgtJkWmEkqSJxpYu3fYmRXqWrMiYXzyAHzbICheVBxSF\nxLYkUdzCshKybMAtR28ky3Pj86EVrXYXaTnkSpGmOcM44f0//7Z/jCn3z+N/41hdXqVarzGMEuI4\nxQ8rpGlq+pdueYlk1MIKnU6bMAiRQrB8ZYmvfvUr3HTzcYMDtm2cGpFYjgOp4aXLPE673ebMmTOs\nrKzQ7XZ57LHHeO1rX8uP/diP4freVrC3vWs3GtpxmgNgmGb4vstgMGBzfYVo2DM7BKkN7ZQaCs14\nuG8nJIdxTBhWKEZywy3wlUY+KbXaEVWP+xWVu/ftaHzbMGs8yan11dz47Xff/6IA/k9mZlUmF8uL\nWq5m42BueFt7C3zHk55lZDteBWWkSdsJhPGSe9ipSU/SFKREOMYhzpYWtucjtUBK0xHke7/3e/nd\n//773HnLHXi2Sxj4RNGALFVcubKM7dh4QUC12kBj4fsh6NDcIOnRag8IKlXa3ciU60qPVqdPnBiT\nnSTOsKULAsJKQBT3Udps5x3Lot+PiKNNmo0GJ26/jZd8z6v45Cc+TjIc4vkhgedz4sQJNJK1tQ3u\nvfderrv+GGvrLWzHwvN8htGALz34FS6fPksoJC//ngZ20ODyyjJZGmGhyApo1CdIkog0jakENZIk\nxXJACguFKat3Qg9XNghkwfLyFe64Y4HBMCeOhyRDhe+ESC2p1yZoNPaTpbGhnKRJ+qgiJQg84t4Q\nKSX7Fmex7YI8/7t5H//z+O4bnqeRts1wGDGMUgqlafoejLx0ev0evufhuh6DOCIIKihVoAV84Qtf\n4PhNx7eBUG33oNTK1DyMg16j0eDEiRMsLy+zsbGBUorHHnuMD3zgA/zMv38XWu9s+GAM3eSIm5Zb\nLc+EbZEXBYHncc2hQ8TxgNWVFQaDDkWaEXgBg34Px3WwLGOU5fkePtvvpxQjKD1WKV5kVzVK3q04\n2V5g1JZiBbblicmYZe84Fr7Y+CcD8PHVp/T5HY+Uy5+T0XZsnNQfB3vYplxc13DfuzO746532zJE\no9zQmK7ZpvxdYEubLDM0y/TsLKkqUKkx1LFtm1qthuO6zB88TJpmtNod1ja7lA5lth1QKM2ly+fx\nfB/YxPWMMb3tetiOgxQuUV7gh9NoZVHkBcNUkmsL17WRQjAYDqg39jM763L9saOstTfZd3iaYzec\n4OL58zz45YeYmpjkkUdP8Y53/FvW1zep1uusLq/ieiFFoTh58iSnnn4SUW9wfmkFNRgShk0OHDnK\npZV1hr0+fm2C0J9kY2MDz3eYnd5Hu72BEDaO61IUOXExNABsaxqNOfJigCLj1Le+zuFrDjPTbKKr\nhp913cmthdUOHYR0ieIE23EIQ5s8H1Kv+kjbpt1a5eB1K5z59uI/5tT75/EPOO5+aURrs0uSZdQb\nTebmJ1nf7GA7DkkcmboMx8b3PaJIsbnRYqLR5OlvP8nJkyeND3iajjxLQCq5VaiENoqqeqPBoN/f\n2o0fPHiQiVEh3TPPPMPq6irvete7+Lmf+zkOHDhAkiQmmDInGalKxlsySjzHppCm5iHwKxw8dIhT\nTzwxWgBSvLBizOeyDA0Mh5GhLUcLhO+NkpHFqOkMwIhqGad8yyCyrDgvy+a13pnrK/HMtp0d+PW/\nRQf+DzHGtzolX12CbXkRSqJ/fJQ8Eewsty+N0mGbVhnP5o4DupSm36QS2yJ7C7CUKYcNfZ9BluLY\nDjNz/z97b/pj23rfeX2eNY97qrnOqTPd0fa1EzvBnSidxIljkk7UWCIMUpQWaTG0aBDiBf8BEuEV\nvIBIiEbdDa10WtA0NCAgTQTE7fgm7vg2iXPtO557xhr3vObhWQ8vnrV31T2xnRcI3SCxpKtTZ1fd\nOlV7r/17fr/v7zvsk6Qrju+/zDJJUcqgqGCaLGiloqo7Uk3DRUrIqlxjbuEetuOQ5TnTacruZJe0\nqpB51UNDJmVd00lD+6RkGbdv38Z1baLAJ/A8XRAti+Fkh9qweXI6Y7EqGU4OOe4M2roiz1P+u3/4\nP/HDn/shQt/HcV3SrKBRknv37jFfp1zOrhhOLFI15Q//+Nt0jsd0tWZ/74CsruiUiSM6XNOiLkrq\nSofSNrKiKDK9BFIdKIMia1GdSRDE2GbF1flHFKsA34n41Gs/hFQWdSkxLAvDBtlJrarsOnzHxPUD\n0jQD1fHy/RP+2r/7Pn/rPzX54J1d2ub/78T/v3LZdseP/XjJv//rV3hhTGw7XE1nTFdrqqrC9z2O\nj4/IsoR0Nif3PfI852BHW8XatsN6ucC0tF/4JgpNKbVN1DJtBwxBkiYf8wMvqhLLtji+fYs0z3j4\n8CFy1fLWP/0WR0eH/ftL3qgd4mN/qq6vNabV148O2Sg++7nPkSRrzs/PWSzmeL6PZwHtNQ5u9HBJ\n3XfK2r5Cq5s7wcd2b99LRXldu6478pswyvcLOfl+1ydWwOHjy8qbf79J2blp2HRT1XSzSG+Wl/Dx\n7wd/OhFjexo69vZjIcDoOoRUuLZLnhcoy2K6mOOFIZeXlxRJhhvEGG7E1TKlUSZ5UWHYNiYC13FZ\nLddUjcn+wTHzxYJQmISDfU7uvc58tcTsOoqiIE1TzQ33TPzYZzgcYhiGDklOGpaeTZGk2Jbg5PiY\nR08/ZP/wmOHuIeusJl2vmIxHTJNzFDaz2YrHT59y59YtVssFh8cnxMOIi0dPqKoG1ZnklaTqDF56\n7XUuZlfs7h/y9PljgiBCUrA3HrNapbiOReTaNJ3C9VyKImMQx6ySJVVV43kRdV6S5g2u4WCqlmSx\nRPmSIl2glE0YjxHCohMKpMR2LJI0RzY1rTDwbIu26zh9/gTf9/k3/70/YLqcowTs792iayXzi0tO\nDnawDMlkNGC5XpIUOfFwRJkucGwXIQyOjo6J4wFvv/0dHMflg/c/xHFcxuMJo9GQ4c5wa5y2Ws9Z\nzBacnZ0CguFwRKe0eq8sKnBjLTqJIrI0QQgos4zLyysO949ompY0TSnyir1b2lVyMBjRSYmJyWQy\noaq1P/x0MeXOyW2enz7DNofITrvsJXmO57vUTa3tgA3wPA/HsXBcB6RgvVxx9vwpgo7jg33i2Gc8\nHjKdTWlly2R3l2fPn3Gwu4/nOgyjkNCzEUpSFikffvAhn/3cZzk7vyQajtk7OgQs3n33Qy1IQZEk\nCWWe8fnPf457d+7y+PFHuI5DJ1uEsCirrg9paDk9PeVv/5d/i7/+b/11mqblJ37iLzK9muGHEb7v\nc3Y2ZZWsObp1TL7K2T/Yo1Md7773Hm3b0NQ1O+MRL7/8gNnFjO9+97vEYUhiroANBU8zO1TXYeoE\nZNpaN3BhGNI0miW2sWW2bZskSdjf32e5XNK0Bd/85h8wGg35mS/9DEmaEIWDzbu+L9TXjoRStpim\nhWmYgAmWIEnXxIMxUTyiKEreffcdOlOHNLuuS5kXGJZFW9e926LG2IXQQRamZX8M1oWbE7/c7rY2\nWZsbVtzGC0oz666DY3TGQfMDa+gntsT8+v/+329pMpvRYvP3zS/7vTCgm9vZm74neumpFYqbF+om\n9PIij1z18ImSHaZQWH3YqmwVhuOQdy1GHPA3/qu/w77lEvsBlhuRlBLhhGR1R92CZbv4ro9pClQn\nEcKnaTT2tlguiKJo+3M6rtMbE4Hb83SFJbbcdddxicKA5WKO6lpsA24dHXBy+xaGHbBYV7z33nvE\ncYTneSznVxR5ilCSQRhwsDvhjTc+zTpNKaXgm9/6Y9Z5jTJsnQKjWibDEN93qKsCqVTvkWzw7Nk5\nUTRh/+A2j56eUbeKSnaEcQgm2l/Z82kaUG1JYCocVdPmK8yuosgS3vjMG3h+SKu0UdRG7FAUJaIP\na7YchywraGXLYDBivV5RlhWmp2g7QVk2WIbNOIoJbJNR5CJoyfMU1/fJ64oyX2MIk/F4zHy+IElS\nhoMRZVkTx7pgLxZLPM8jrxe4rkNRZIyGQ4IwpGlrlBKUZUWaZAReQF4UJKU2MNJ+ORa2ZfUjsiJP\nC/KsYDyZ4FguwqzJspRWdliGXliXZYXr6l1J3ZYURUbbNpjCJctKgijEtG3qVqKE2dPdKhzHpa5q\n6rrRghPfZWc8xnNsZKO/Z7eZLg1Bsk6xHFsLsdqaYeRT5gm2ANc1CXp3TMN2ePL8nHg05uJiTlE1\n7Iwn+IFHHEW4jkNTlfi+y2Q0vo4vVIKmAdu2SLOE3/7t/xWpJL/6q7/Kk6fPCCMNIyZJyng0xlCC\npm017VFJ6qZmNBoyGg2gUwgkZVEyn8/xHZ9Pvf4Kb7/9J+TZGsc26bp2W/iEcc2zNi0TKTveeee7\nZFmOlJIHDx7w4MF9LR7rbZQvLy/51lvf5OrqildffZVf+ZVfYW93T99/4uMTvEZT+lqwSbTvG0eB\n0L7ghu6Mq6pidvGY9XqN73o0Tak1GGWJZRjYpqF9xjvNNy+a9k81pRsMfFOjrqMkP258tbnq+lo4\ntKld/4/sZP/fujY/5KZQ39wSb37RzTLgpiXsJilj89iLtJ1Np775XhuRzTVfs8eleu9rSXOjSxc4\nnguGSWA7NKbN2dkpRy+9juH6NEogTC1+UQrG4zFKaJvYqpF0UmKbBkEQYZkGYXBI1IsO1qnO1Szy\nlMFgSLJeMp6MQUHgBWRZTicV56eXOI6Fa7kYQrG3e4BsIUkWXM5WjEdDhqMxeZ5j2j7Ht3aYTS+4\nuJiyWiz57Gc+S1lWJEWJKeAnf+InePz0jOl8ThSFZMmc86tzdsZjmrrEEB3YLbGn2Bt71Pmc0AHa\nljAMyPKcyd4unuUwm00JRgMG413W0znrtWQU7DC7eAbKAmHTdBLZtXS0yMYiSRKCICDL11rNapla\nGWlapKsVjuNgGiZSpdiWgWFrmffB7g5tnlKVJbPpKY5j06mOIA65ffQKs9mMuq77N4fB+cU5lqlx\nyf39Q27dOiYMQsoq1rJuw2Q2nXP6/GwbwBFHQ+6e3GW5WOG7AsMyWMz16LxezvF9H3qRieM4tI3B\n/PKcyWTC4eGIg50hYRRTly1SKR4/fkyerSjzNXWZEYQerik4ub3P1XTKYrkkTSTKMAijGNE5DCOf\ntmxZrtYcHx2D8DFNRVNnLJIS17JBujiWToQyTRvfCnFdH+FALXPWiwW+71OmCWm6ZqamdApmizX3\nXnqZt99+m1u37+E4Pq1saBqTq6spR4cHBH6AZRm8/fbb3Lt3Fyk7sjRHKYMg9Knrmm9/+4/5F//l\nf4nT01OiOMYwTJK1tu5N05y6rAmjgIvpJVVdcXJyC8uyePbsGbs7uzx/9oyjgwNeeukVnj15xkeP\nnnL3zm0eP35EkSf9crFvrDrtmWPbDsvViq9//etMp1OEEMznc976p2/x+uuv89WvfpW2bbXdbRyz\ns7NDVVX8/u//Pj/5F3+SKIrw3ACpbriR8vFiKeiteW88bKBTsAzDxPcDjo5PiOKEJ0+eYAiFaeim\nzaCjVR0KgeNqHvpNseCmYAshtolXm45aK7OdGzs92TeeYmvs96JV7fe7PrEO/Jtf/58Btlvd79VR\n32SowMdjkTbQyWYbvPEFuUnJ2fxbN8VAAu2nLVupKUsCEAJbmNqKtenwwpCsaagNwX/4H/9H/MJP\n/SyOZeM4PnnZMl2scL2YVgnCaIBC4PsBUilEJ0jXST8q9QrE3nPB9/1e3m9RlAWGsFgnGZ4bkOYF\ngR/oF61TdG3F3Tsn7O2MWa3m7O7v00hJ3Ui8IODZ2QVV3ZAmCaLTUnPXNmnKnMnOiAevvcR77z9i\nMDygbiArS4QBbVsxHsXM5jNMBIPIp0jPSdOC1Spjscq5dfs+QTxhvlzjuD4Ii1WSsrM7YV3NSVcZ\nA3dE5ITIquRgd4hjddhOR56vCWJfm261lqZcCcF6vWZ3d4/1eo1hmHqM7XRYhR6JayzHw/MjfUC2\nksizaaqCySiilZJaSh3ukGd9d9IRhhFNoy0FBAadlLSNJMsy6qZhEIa0ssX13O2bWat4W/K8RGCQ\n5wWWaWPYgla2TGdX7O3v8eTJY/b29ljM5+zvawXfZLJLVZSk6xmy0wHWSZ5hWTbj8bjHXzsc26Ku\nSm2utFxQViV7h4eMdnYpywbDdFgu1ygJ06s54+GY8WCE5UmE0WGZxjbJvm072rrTfOpakqUFRVER\njgOCgUvXtlimANUhmwbZNtSNNnvqOs24enZ6xk/+1JeYzWf4rsf+/h6mYVJkGZ7nMhoOWa9XPZxh\nYtsOoHjrrbd4++0/4ctf+TKDgT6wiqLEsnUHHkcRg3jI1XSKH/h0SNbrFb7v4tq62To5vsV8Pqdt\nWqRUXF6ecffkmPVqhm1B110TEqTUQQvCMPmDf/JNLi8vt51okiQIISiKgq985Su8/vrrW0ji2bPH\nPHz4IY8fP8F1PX79P/h1BoMNhLLpuHVxNV/oyjef+16X7Om16/Wa+WxKXZXaCE30oj3HputtZDXy\nc82CeZERt4l905/7+JLymnknP1bfDMPg0z/8U3/+OvCPm8Po68VffMMBvZnCDn/6Sbop7tlcNyGT\nzeYX2LJORKdxK4RWNLY6eAzT0eo3EHzrD7/F/s4+whBUZSoDgLoAACAASURBVIkA7t66xe3DPYQw\nmC9WZEVKUdVk9ZpOKXzHYxy7uI6jfUramCRZk6QpZZpub0jf8wijEXePD7Fsj/U6o6wq6roFoSia\ninff/mPSW0d4rk3mmlzNpihhMhjt0tQlaVZgmBbCMDGVwjQE0WSPh4/ep1YFYTjG6BqKdUbdtARx\nSIvi7OKCKIyQjeT09IrABt8f4PlDOi7puprZ7IzRWBcbz3exrBjL6IithqOTQ0Tn4lk+lhhQVwlN\n19AUDU1TU5caeqibUpt8eS6mZbBaL7bUUFNZvV+LhWObjKMQw3axXR/X98jShNnVOYMw4NnZc8Iw\nwnQChIAgiFktV6Rpgup0Zxb4PoZhEoUhnusS+hMMQ5BnDXWVcnp6yWRnTBTHOkFIVdw+OaAuW9I0\n5/GjRwSBSVGWvP7qq7z/wfv4nkuRJyjVMoxDsjTj4vw5cRhy6/iEoiypmppWdRRVyTpdkWcZtq0z\nL3dGEwI/Yp3kKEPy7Pk5Hzx8wmK1oq4bgiBkZ7zDOB7Rlmsax2C9TjAsgR8EeK67XXJNJntkaY5r\nGARBQFGUOL7NKl0AglJAmmTUdYXv+xzu7+EFNYYBH330kFtHh7RVTuS7CAFNVWIHAfEgwnVcsrzA\nNG0mkyGr1ZI8T2nbmvfe+y6DQcQgjvFcm6rMEQgc02R3PCbPC54+eYIX+iwWU+I4xLZMBFBVFTvj\nMY8+eqy9khzBfLEgjgdUtWZ6tV0NSmIoXby1bazN5cVFf5+GlFVFkWUc37rFk6dPMUyTd957j1de\nfVVP4VLieX6fYq93Vk3bUjebhK4/XShfvATfm/EhMJEdjEa7uK6H6louLy+oygLXsvTh47rUZYUp\nrhvGm3GPW6JEz7bTj10n8lzv4sQWLXixef1+1ycaarz5cwODbIr1i8Yv13aN19RDz/O2H2+cCTde\n3ZsnZXN9r4gj0UgwDKTQ2ZJ9RKRms1QVfjDgza//Hp//4l9gdzJB0JGt1jT5gjgIUVJyshvQSB/T\n88GwqWVLkVfUVUXbZghpYwGTgcv92/uYlkVd39suZharBZeXU/JU+3F4XsjR3kQ/D2LAzu6Ipioo\ny5yuWRM6BrYfIJWGYqJoQNv0eL8Q2JbBcrXE9wPmiynJKmV3fIxtWBiuhSkUw2HMgAHL5YpklXN0\ncAfXVDowQUlu34lo2pbXbt/i0aPHFFWG5Zgkac4gCoktsGXBcBThuTpjsgu1BLkqO/Ym++RZje+H\nTLMp8UDDPZ7nYZgGWSZRStLRIbuWpjfGX80U8WhElmbkVUk8CDg83CfP1ty9e5eyalmlJXXR4IkO\nyzAZDoYM4yG3jo5QXUddFTpMI1tvXSl3dg7Y2x+zdzQhyzOE1XF+8RzDNHj6/AlN1dDWkqPjY4ah\nj+XoEOwv/jM/Qlak1E3DsydPODjYY2GbjOIh0+mUxTpjNp+jVMd4d4QbBjiuxWR/V1s3lC1PT8/R\nuYsWSviE8ZB4YjKc7NO0Fc+fPcMwOwYDl5Oj++Rpih1MNLbdNDRSBzlYps06WVDXLW3TC9aArmo4\nOjjk+fkFvh+xWKZ86Wd/njfffBNMlyDQ8WWvvfQKp+en5GlC22rzJ9W2ZGmC63lEoeb9x3HMOklo\npcSyDepaYtkmn/uhNxBCK4x9L0AIgzxLMAy9Jzg8PKAoM1wnZp2sesWxLsht22JbNukqJc0ylCGI\n4wGoqsefxceskbtOIRFcnF/QNA15UWjo1NUU3M2k/fz5c8w+iByhPfIHgwHrdcp8vuSP/uiP+dJP\nfwmBQCltDwF6h8D3quFK/SmABfTPYhgWdd3i+xFSNhweHfP40UOSrMTzNHwiLAslrxeOLxbeDY3w\nuuG8jpG8LvLXUWt/1oGzuT5RHvjmBLqZZfmiv4Druh8LMn6RYeI4znYJejMHb1PYN6fZzS4cwFF6\nadkJpTvuPvjAtC2iOOad9z5kuVwSByFtW6HaFtuE2cUZwdEhlqEIvQG1kBTlCmnYYFiEvknoBZi9\n82GapGg1WEW6XhH4PkVWIKQOAH7tlQPSLEehi2RdLfFdlzRdUFUdpqGYzR+zuFrhOEPisXYKjMOQ\nVZ7jOAFZVmCZgjQr8PwQ05ass5TBcITqWoq8wA9jDKFI04TpYsW9ey8RhRLLsOg6g7LJNPXKtJFN\nzcOPPmTvYJ8gCjXH1wgxBRwMY5KkxGgriqYkHHhUVY7r2TS1HimLpKHMa2zbpKxyglDnidZ1heeN\n0f4w18ncQRDQLRNsz6UVAitdkecZebZkOIhJshTZmUSDIVWjIFtrFkfXUBUleapx1L3dHUwheltQ\niWVaLJbneIGPadsIA9bJimjokaQZXmBwcucOJgZ13bBerzEtk7IqcTyLIPSxLJOTk1ucnj5jEMec\nnj7n7p07FJWN6wUUVU5SJCglMWuBYzs0dcv+3iG25VMWFacXc+bLBNd38QIP0xbsHRxxdHzIzmhA\nMptxefUc2zCpOkmHgWlpLx1lsLU0tVypxWpK85ersubp06fYjs/rn/o0puPz5Pk5+4e3qOoaJWtE\nnpEsFriOw+XFGcPhiGgc4dgOrutpM6imZTQaURQFUnbUdYltQ1mVhGHAwYH2/xdCYDvai2cyHpGs\nU1TXcXV1wd7eHqtkie1YGGaP5Rpd70boYZomgygmKQvOzs54/bUHVMWG2w11U4PqPUakFrpt7Jo3\nLK2yLLc7paOjI4qi2BY6wzBZLFbbOvLtb3+bu3fvsbuzRxgGN/ZsCsO8URQV2j5W9Iutm4/TC9mU\nwrIt2lb29cXm3r0HPH32iOnsCte1MYWBdUN1uUEINv/upqZt0nhuki0+3mxaHyveL9KoX7w+sQIe\nhtoLeuPpvemQm6b52GJy418CuiPfBDZsRpKN5N4wDAydha4LvVIYlrNdhKoen9pspaUptFS3U0jD\noLT0KW01LUWe8Tu/9w2O7t1HlQ1Z55FmNbapKJIamHH7+ICr+Zx4NCAMfDAMiromzzO6TrBerWnq\nluFQCw4EsL+zSy0bTNtiOpsiOsXV2VwzUmyTncEAfy8ABPbtE5aLNUmSEbr7DO7uY5gdy1XCzjBg\nub5gYjsIo8GwalqpkAZ4vsPY22d3MmQ4HJJlGaZrsFhe4istca6Wc4p5hOP6TC9neuHj++R5zTIp\n8B2HOB7QpTUj1wEDWqOgqiqyOuDWvfsIQ6vviryhkw6rrGF2tcA5dPA8ge8bLHOfhgZDmWTrfHsA\nSykpy4o8L/RrISW3Dod0RYdSsLe3y8HuDrZta8dHG6ZX5ziOLjrCNfADF9cO6WSD1UFd5ZyeZUjV\nITAJBwOCIOTw7h3KskIqwdV0zuXVnCAQRMEQL3JIlkvKImUYRewe7WwtgIs8Z71esZitaOua1157\njeViQRh4fPjh+4CB5/vs7+1xx5vgOA7L5RLHdfnwo4csrs5YrlasViviOOLucdRPggZt3ZBdPEfK\nDrs95uDwWLM6Mu0V09QNRZGRZbpYCyEYDmKassYUgjAIMQ2Dyir58OyMye3bTJ9+QGS2dLJCdTVx\n5NI1iqoqURFIYfDZH/kCCIHnBdoDHRNhWoSBSVkU2LZLVaZYpkNRVExnC8LQx7F0jODuZI9ONqwX\nc4p0jefr3MnxKGI+u8CyLDzLpS5rbM+iUQ1NUxGGAWWtmVa2Y/Dqqy8zm8+oJJiYCMOkrhtsx6Rt\nS2TXYlgNk50Bs/kFdqFtZNP1kjiOCX2fO7dvo6SkrhodFNI3gefnV9huwHj3kLySnE/nhEVFHMU4\njolrbZrBG8y0btMwboqlLuhaH6JT6gGMHqE1LBtlWty7+yphMNYhNrZNJzQMa5sGqm0xlA5b6Vot\nFGzrBoGhpwFxbRuyqd+a0CG3DSn82R34J04j3EjlNQfy+vS5eWrBx2XxN0+mmza0Xcc2CUNsMPMb\ncMqmCzdNE1d2GJ7LIksI/QADg6KV4Dr87td+j7e+8Qd85ee+ghV4uFaEbFrqKidbz6mKlIO9Cbt7\nE53dF8d0StF0kjCM9YukoKklQmlcs+06LNvSKTmmQHYS13aRzUaaW5OmeuHZNi1+FDGface2/f1D\nmqbSA51h0rZ6mVnVkuU6wfUC8lIbdkVRzGq1xHdtfZOYBgqFaWpl5WKxwrQdhLBxHRcpFYZlkGYZ\nUTQgz4reP7wi8j0MWnzXRrYVbdNg+S5FUSGEgR9EGEI7LTqWRZWnDEKfNF2Rpiui8bHurNAOeoah\n8xwV3KBW6UNZqBIpu60QQnciEIZ6ZN/4qa9WKyzPQSmJ59ggJcNhiJKa9mWYpg4AqBvqpsYwFF7v\nxIhh8+Tpc27fPkEgsO3+yO8kSnXU7TXFUws9tIteVRQ4joMhRP8aCeqmRQiDLMu2X+95Xt+lOkzn\nc1arNePxGN/Xjzu2rYOmlW4myrLsXSTBD8IeArxhGYGmoNmWRV1VW1vStmmoyooyy/A9j5defYWL\nyytsVwcVSBSyqQFJ6Hso1TFdLNg/PsF1feqmxbQcDEM7c1qmhWxbqrLUPx96wXz6/BHzxQU/9he+\nQF1WBF6AECam5VDXFYiu/1pz+zOXZaVho0770fu+31s662ZKKslqseDWrWOatqHKU8qq0IZStkGR\nZQA8ffqEspUsl0vmizl1WW8L7Gc+81k+9alP9WZyDijBxcUZHz36iLfe+r/YOzjkX/m1v8rx8S3S\nNOXk5IS61OlGo8GAoN8D6Hus24pzbu7NNoy177XefFFXkmUZp6enrJILwsDX/kZtS9c2OLaFkhuo\nqK9hHQhD29JvsO9Np76BjG8+/pnP//T3XWJ+YgX8W2/+NgB1XW+XkDd/lJuhCE3TbAntm079xSRn\n0M5+N5eZN6mEGyhlU/BDw2TRFFjDGA8LVwpKFP/4j97iN/6T3+Df+Sv/OnEQwcAnWRVUWc7h0QEm\nHVHkc3V5SV1m3Ll7m6IoODjY0/mXZamxvg5MDG7dOsG2He2p0DSUdcVitSRJUxzLxnd8EBDFIb7v\n94ENraYxBSHvvPseVVlrYUIccXp6ymSyy87uPpbjUlUNtuOyXCZEUYxhaVzStkyapqYoc5IsoygK\nlsslQRBzdHxMUdTXrB3LwO4FTKZhafxYdgjRIZsKy4CmLmiais99/vN4nkdZNqySXBfcVmoXxapg\nZzzAMk3iOKBsTeI4ZjabMZvNtodsWZb4vo9t2xRFwWAwwHM1i2Pj2rhxc3z69CllUeN5Hr7vE8cx\nru9SFDnTqwvyLMUyDW4fH7NcLrXa7+iQyWTSd3Uwm86ZrxKaRjIe72092kUPt0RRQBSHRPGA9XpN\nkiSkabLFRQdRiOo6oihkNtOUtv39faIoIooiHYu3XPLue+/qbkoJrq6uODo62lobV5W+N8v+MHBd\nF5SibluOjo9Zrlf6vq618GUDDxqGwXA41JTVvqmR/UGzXixI1iuCKML1A/b29nBcnyxLqKqKpinJ\nM73YXK0Txrv7THZ3adqOVipa2TEcTpBty7Onz/A9n6aqkB3IDt7/4DuMhwEP7t9mMhqhlGI+W9G2\nkigKdcKUYzGbJ/owMoxenOIQhtGW5reJRTQMAy/wMVC99zYMooA8T8nSNYqOtqkRwOnpKUme981E\n3R+UPgcHB+zt7WP1mZab9/97H7zPt/7wLbKy4td+7a8iDJOXXnqJ3d1dPnr4kPFozM7OSMNPbcNo\nNKIsS4ZDvQ8aj4fb2vPxWvGDC/gGtm2ahj/6k3+CYRgM4hC6jsB1KLMM1bU9RbI34xPXjJibUPLN\n+rj5N0zT/IEslE/UjfBaQXl9Et00qwI+tsR8cZy4iZXrb9xHE/VPQL+2QKluOzJZlh5PGqPTyw9l\n0HQSwzT52u9+na9/7ev87M9+mTgecXR4SJHl2LajaVlZhmEa1FWFaRoURYZlwu5kBKrjcH8XYWkx\ngGM5pEmGbDWvVgihE99RuH0xqqoK23JIk4SyKrBsbfjueQFdB6enZ/h+iO04vSy/YDQa0bYdj588\n6TvAgjv37lGVdU//slDozXzbtszncw4PD5jPZ9RNSxiE3L/3gPliSdv2Jl+OQVXWmIapDfnrhkEU\nMZtd4TsWV1fnHB3so1SH7KRWQZoWhmFh2S6WadO2DaprSNMUx7Eo8oxG6UnEtq0tTFaWFbdv3yFN\nU80R930eP3nC3Vu3t5hm1ScP6YNXB0i3bUuaavpgq7ptB+2YJqvVgjiO8H2Ptm01L7+uEYaBZbaA\noU2WRjtUdYswbQT6XivKTCf+tA2ih+RcVyfImJaJbFuaqqQoC8LQZzwc0XUdy+UU2elsUdvWFEbT\ntLZdcppmuI6rD+RG2yfI3pPed70eb9amTmEcat8cAzzbo+ihJdu2KfKy9+LIbyiTFU3bUuYJh3s7\n0D9mWDZVWVNWFV0nCYKAtqlxXYer6ZSTu3cpCl2gx5Nd8qKibiR1XUMfjC0UtFJRN5I33/wab3zm\nVQ72d7AEDOKhPhRthyRZUdcVlmPhuOF2qlBKbZstfT/aemmqFK3UkXBNXeO4DkKAY5nItmG+mKH6\nzyMUs9mMPM+338u2bQaxDgrXEYnXYr22bfnGm7/P5dUVeweH/PIv/wuMJzu6sVMS23Z1DWhaXNdl\nMhqxWGg4xrIsDBM810cYG6qy2MIa3w/BeNHrREpJ3mZcnJ+xmk+xLBPZVISeRycbDG6G0vTe5era\nJXGDLOgMgeviLoTgjS986c8fjdB13f5NmW5x7ZtqTLheUm5uipsF/+Yvv10Y2AZKSiQglNJEfdPE\nsa+fFCEEpmOSmi1G0TCwTBo6/sZv/R0evv0+//Zf+VdxXY95W3G+mOKUEhEE+EEAhLSdIs1LTp8+\nZW9vl2gQ8+TZKXdvHfMn3/4OQezihz6hH2JbNmEQMhwMNNbvepRVpVM+AHCwTIvBMOI4OqSuK6qq\n5uLygjTNOD6+xWqVYJkuvu/hByFKKZ4/f85oOODq6kpDG1VO4HnYtsV6neL7IXXTcH76jOFwSOi5\nHL3+KQxDL4yvrs4J/BBlGwhD4EcBWZaRpTlmZ2BacHn6mKLI2b9/h5cf/ChS1pqbbOgYq+VizeXV\njKIo8b0Ax/NwHJvDwz2yNCUMdklLbY27Xq+Zz6dkWUZZlPzO//aPaJqG1UozFj7/+c/THOximIo7\nd+5om8/ZkiRJyPOc+XzKvXv3sG29BAr9SD9XWcGyzDg6OtBGZJbFYBCTFxlN09I0NVW2JMlyLMtl\nenkBmJo22nbs7O0yiAfYtkXT1DSyY7lccnUxRSnJYBgT+D5BEHL37h3KquD87IzdnR1u3z6ibmqW\nyxVSKp49e0bTtIRBRNvfq4HrYAnoDGibksl4DB2YpiDanWA7JsvVijAKSLOMqq44W6y1x7wfIOK4\nLyYdt28d0krVH3AVVV1Tl2vqpsCztbWx55pYlkMQuBRFoe1QDf0eOD4+Ik/0lLZKElbLOYZp0bWS\npqpJsowoiinLCstysGxNgx2PxpRlReC5rFbrvhjD3t4+eZ6xSpZkWbrdR3mutoZYrVb9FKCNqnw/\nxLE19BUEARcX59y9d5c0STi5dcxiOcewHco868NSfMIw3FpK27ZLWehIwqLQCVe6exUYhsl8vuDg\n6IgvfvHHqPtQF8dxeOeddxgPRxzfOsI2BA8fPqIuax48uMvl5ZSyLDk+PmY2m/dCKQM/8G40i9+/\nv92QLraqccPi5M5doijm0cMPsS2TvKxAdVim6MPHZa8FcYFr+5BNI3qTHr1pan/Q9Yl14F/7nX+w\ndR3cFta+ON/sqjeFewOz3OSN32SsGIZB1ePJpiZ+YggthhDoUaTuCfemZVJ7+vs0Vc1v/ubfJVkn\n/HO/+Jcps0JnOApBFMbQdZT9G0YJgyQrCAcjHNclWa8osgQlK2hrjg728EIbyzawDIu2aSmLAtle\nG8G7vo9la3Mn27KxTYuy1uO87OR2IWvbtjbHynPAYJWktJ3quzPFZLKD1UfBtc311r6VUnfmRU2R\nF3ievlE62VEUeprwXP0YCqI4olENZVGilC4WRZbjBz67kwld19I0FQJFnmuZt8AkDGOUMDANGyUM\nlsslfuDz9OnTHvaqyWud4tI0NVJ2jMfj/ma38X2foijwPO3UmKcJe3t7nJ6eMhqNsB2HwA8ZjYZ0\nneL09JQgCDRFr+6I46hf9GgMUqE9py3LYG9vV1PQ8pxxHPb0rE5b/voRRVlqe18EZV1RlCWmaeiJ\nwrJ6BWZHXdeUZU5TlRo2qgpsWwfwCqU57n4QbdWgYRhR5iVvv/1t3vjUp/E8l7ZuQAg6lA6T7rrt\nwq1pGqSSWLaFME1G4zGmMmkb7bhZ1zVZnlE1unNHaDFI13X4foBtKYoswXFdXM+jqpptgbUdR09G\nUgJ6WqzrgjTLGY92uH1ywnKVIjtF1WzYWnpnVNWaqvj3/5vf4pf/+b/Majlnf3cX1Wmihp6kShzX\nwnFtDMPW3h2N9rav60aHZffdqblZ1kHf7cNwNCTvi3Wepdw+Pma9XnF5ddlrBUy6puohBwPHcbfP\n84Zy10oNc7z1rbcQtsWrr77KG298FsvW4eWr1Zq7d+9smUqB77Ez2aGqmh5Cg729HS4urtjd3d3C\nskHos8HEHefafKqnrGy78o162zD0A7WS/XutYT6f8fTRQzzf0S53qtXL0F6vsaEs3yzcG0bezb2e\nED840OET68A3L+RGpXiTfrMp2hscaiOrV0ptMfONCUxd10gpt138VkovO5RQfQ5ji2PovL6iLBCY\nkNecJnN+47/4z/nM3Zf5Sz/1M0Suhz8cMLuc4jdwenqFszNkNBzgeS5lo9NylosFjudhmQbD4QjX\nMkiWCz569JTxTkwYaXx3FA/Z2Y0QSmxl31Jq+8y6bbEMU8c4GUIXWkPQNBWtlBR5qacHx0UIE6F6\n68pe1k0vWa/L3sVNSoq2oigKhDBYJhl3797FcfSk41g2rntEXVWIHmaq64o0S8iqksvzC9IsZWc4\n5vbJbfb39qmqgqbr8Gxt9Tk8Ouxj3ySmoXTMlydQHeyMBzw/P+Pdd7/Lj/7oj+I4Fn7oUVU1e7sj\nLEtPUmEQYpiaRnWwP6GTCtt2aNqCsqy4/+CEKIpZLOYIQzKdXfQHU4XjxjRNh2UpsnyNAOJBTNOa\nDEc7SNlwdXXJhx9+gOs6vPTyS9iIPn9xyuHRMdPpJWEYQe974Tg2dVN/bGQtihzLMgnDkCgKyJJU\nvy6N7HMXwTSbnuJq0Ckby7LplG4O7t+/T1HkmChUJ+mMnikFGJaJ7zpYpokSge6om7q3111gGxqO\nsSy9ixhPJqje5a6uGxzX6guZYr1eIZQkCHxc29buegjKqsYyDKpKi3P0/aVH+SgIeP+97/LNb/4B\nu7v7PHjwEhgWQRSxWKxwXR/ftWjqlrYpMYQijnzKIsexPIajMaZl0inJOl3RrSSBp/cWnuvp914r\nSdZ6urJtB9fztjzozfN8dXWJ2y9dh6MxZ5eXxEHI8dEtHj9+jGwVTa3Nq6SUpGmG47hUVU0QhpRl\nBRicn1/yJ29/h3/tr/0bOhkriqjrhq4D23Z49OgRx4eHtG1LFEVMZ1ccHd5id3fE1dWc8/NLjo4O\nyPOSoig4Ojogy3PyPOuhO8lqtWYymSAEVFXTwxyqX6rq1J6u6xBm76VjOuzu7NFJydXluebLmzZt\nXWqramFgveDztOm4b0rpX9SzfK/rE+vA3/zd/7EvUBre2GBKL4L6G3bKTehkYzX7YueuTAtTGNiW\npSXIdQNKc0wN06BqGrxIwxCz2Yy//Xd/k/svv8TnP/0GkROQpimW7xHHQ3xDqwnztiZZrSmrCsO0\nGY5G2I5PuWEFyJbnz56yN9mhqStaVSFEx3g8gg5C36EsSkzDwPHc/sAKcX2ftm6wTIs0TTAtc3va\n69xH7Zdxfn7Ot771FkoJbp/cYTQaMRyO+udJYpkmda1HyjzLUUpxNZ2CMHT6j6EPgaIot0HQUra9\nqKjqw4gVk/GYncmE0WjEerlkMBiQZVnv2mYiu4Y0y+ikpCgKLs4vyfOCJMnwPJ/zywv29g/4/Be+\nQDQY4Hs+ZVlgbqaEtqWqqp6RoBklruuyWq10Jx5oTLSum971UOPZm2Wk02eSep5H4PiUdc1sNsOy\nbVzX42p6hRCCyWTEZDJisViAUvyj3/5f+OpXv0ontV97HA1YrdYgBHleUdYVhm3psGlD7yBk15Em\niQ79UB2ObRPFsabuVQWWbVNXa6qqpihL5vMlda27w6PDA0LfxbVMRoOIPEnAtjQeb5gkSQL9G7WV\nUu9hTINGSlzPpSpqLes3DBqpM1QvLy+J4xjHcTi+fQsp9RIx9FyauqRtexZN3WIaBn4QUBYNYRyz\nWid6KSlbqipjuVhSFAWTyYT9/UOKsqRt9V6maTvqRr++XdvyjW/8Y37pl34BxzKxHRcpIVlnFFWF\nMGEwjDAtg7bUVN+6rnEcb+saaNv2dieh/U1sbM/BcZwex5akabrt6Hd3d5nNZoRhyHw2R8iaTqH9\n8ouCwXBA22pHz+lsznffeYf9/QN+6Zd+EdlJhsMhaZZh2w5lWfHgwQOmV1NC3yXPUsbDoebX2x5J\nknD79q0tBJJlGcORvuctSy/fQbBerxiNRlvKaxxHWzuMDY697ci5gXH3DJbp9IKPHn7IMA6RbY1l\n6Hpk3oBmbhbym1355vpzmYn5e//HP9ymNF+zSPSTFPb5kzcDHW7CK5uufOMYtsmqpN9Mm/3XKKlf\nHM/3dAq771HWFWcX5/xnf/Nv8kOvvM5PffHHMVwbdzSgzSrMssXzAy7LBMfzGNoeeVljWCZpkjCb\nz3EdF9OyGI/GOtm9gzTL9ZtTSJRqqcqCTjbcv3sH09CLMcsyaWWL7NBLLtvBdzw838PoqYVt21CW\npd74L1YMRyN8P9hCQnVd4/s+aZqhE0eub5rT0+d88P4HFGXBz/3cV3RKuONpz4uiIQhDLFsvHBeL\nOb7vEceD7Q1jWxZ5mhKF4ZY14bqu5ierjg7FYjHHmOc/2AAAIABJREFUtm0cxyEKYk2XbBryvECq\nDtPWnahOM9GvmWXZW6Optm23lEB954l+2mpZrdasE81o2DAXkiThwf2XuLy6IooiZNty6+hY+84I\n/Ta4ms44Oj7Gtm1msyuyVPOpz8/PePPNr3H37l1+4Z/9+Z7R0NA2UgfqdhtaZosyBHlSEAQa8zZN\no+96a80eKkvqpsH3fAxDYNDw9OlTZoslYTRACEN37gYgGz792quMIh/bMpAClNBWSrbtYAoTJRVK\nCFbrBC/w+6WryWqV0CnF+++/rz1KRkP29nbpGbGadulYBIFP18qtqCfwfFzX3T5njuvRth1uEFDV\nDVdXU5bLOWEYcOfkBNF7WINACYHsNIQiO4VCsbi65IP33+WHfvgNAj9AKYFlBzRth1SKsinp0BRH\nz9LhCZv3Yp4XN6bHa8W1ZVksk7WGKYJAW8M2ukFYr9eA2AqKDMPAs0xGoxGPHj/h6bOnfPjhQy6v\npty7f5/bJyfcv/8Ay9JUSM+3ieOYOB7gOC5XV1c0TcPuZIciTzGFFkTdvXvC2dk5YRSyXK64d+8e\nT548JopCgiAkikLKsiDPc81UKfTrEgQeZaHhK8/3cWwbwzQwRO/dIvS9DAphit6fR08qi/kVDz98\nnyjwdJAMXV/AN9ay18E2Nwv3BpH4QW6En2gHDtfJPJvxYdOtbYr6hte9Kdibz20cvjZbf8uyMCxH\nwxOlhh+8/gaar5Z4YYDteyR5xm/+vd/izq0TfvJHvki1zmhQPJ9NcYSJhyZoTu7eBtMgvZpTNRLH\ndfE9j2EU0lQVeZ5zdnZO20HbKTw/Ynf/AKUkZZlzdvqU1WKG45jcvXNCkaWYpoHjuzi2y3A0YhiN\nKPqkkbqpcBwbwzJu2OpqutX52QV7u7vEscZbi0rTn1Qv8pBSMp/P+c53vsOXv/xlbNsky7I+rVtw\nOZ0xGk84P7tAmBZJmjAcD6lrHVpB1zGdTrXVqOv2Ewxa9OF72K7LxdUl8/mc+y+/pCciBEJBmqbb\nLiYeDHF9PZ2YtoXqoFNaBLKBHwS6y1gnCb7nIQyD1SphsVghhOD4+JjJZEcXScMkS/XB2HUdOzs7\nhGHI+dkpk8kOZ+cXeGHI02dnLFfrbdE9PjpGiI77d+8xX58yiGIuzs959eVXWC2XuK5LnhV09M2C\n6rAdh0E0ZLVac3U1Je8pbGEU4wcBw+GQpmkpy4qrqyuuLp8zGk2IBgM8P9A0yrpmdnmB71o4ouPk\naB8pa2qlO1zZtuRZ2R+Y2iXTMEzqpmO5WvPs+XM6BLdu38Z2LEajIaHv0SnZW+Lm7O3skBcZUmod\nQV3VyFbS1BV5pg/fKI41E6lTPD895/fefJOf/umfZmdnB8syQXV0TYNCL8zSNKOqa8JoQNNqR82H\n779DGPr4gcve3j5VJUmSAtPx8IIQ07FoZU3dVGTLYhtEEEURo9GIJEl6wVa9bRAc18W09TS96djr\nHpIYDAYYhqGl87ZNkqQElqWft67jwYP7PH76HN/3eX56jud5ZGUJKA4Pj2mqBN/XjUeSJHz6059m\nMhnRtYrT50/Zm0yQUov0iqrkzp07LBYLpJQkScKdO7cpy5L1es3e3h6j0Yirq0tsy9eZrr0IbTgc\nbskGG6w6jiOU6rAsA9m0mJbZW9Jqoy7DUKzWC95/7x18x0YIhW1ci9o2UPGGUfNirfxzWcC/8X/+\nD9uPgW0R3kisXwTyb/6/NyX3N6PYNhaxQilsy8Z1dN5k3baUbcNsveS//gf/LTt7u/zcF36csm0w\nPYfI8vANh9lqgRF4NG2DrfQyqLEFYCKbFtXUuI4FbYNtWvhBSCNhuljTYlJWDa5rI+homoo0WWIi\nEaJjtVpqRkjfBUdxRF3U5OuMvb0dmrbGMASNbLbYl+9ruAcl8D0Xx9Ey4fl8rrvRrqOqa54+fYZS\nildeeUXj3Y5FJ2s8PyDPKzwvxLJdVok+LCzX6TNEtTF+13QIoXBMS0dG9ZOLHwTUTU1WFDx5+oT9\ngwMMx9Y+2a3E69k9Ukpc16VTirysdPQUCtVdv756anK2N+yGA962LafPz4kHE+2LXVcEQdjz4WsG\ng4H2AGm11N33fYTqMG2HppWcX03xA+1gKIQWvziuXg4DOL7etTimXmb7nk+eZTRNQ900WjzUdZq1\nYHvbyc+ybIqipG5a2t6joyjK7TJ6b09TG6VSGIZJVTeorsVQnfYrlzWmahgOY9woQPbp5qbQUnSl\nQLYdeVnxwYcfsbO7RxwPkEIQD2IMITQn2gDbNEB02qjKc/odkIlslPYi7w2b2qbCENqtz7QdLqdT\nkrTgtU/pcOmyrLWIhQ7LELrY9PsI2XUI0yLNcjzH4u//vd/kL/3izwNKq3KVAcKmbCDNc7DADxya\ntsW3fNpGbqcx0CwzzSDRC+SqqnRkmmVucW0hBHXVbP1NwijCMPXklec5rqkDO87PL7FdRyfVWw6L\n5RLD0kKv0ViHLwxCnV85Go0pypKun8oNBHEUsF4sGI9HCBR+GDCdTjk5OWE2u9JTZpKwu7tLkiQM\nh0OqqtB+87M14/EOlmVQlvWN+iSQsttCfQCR72yZPaLfG2nKoP5vNrvko4cfEHgulvi4DfbNOnjT\nRvbPKuCfqB/4i8HGcG36Ar20VAmEYdChaHve7Hbkt22U/L/Ze9NgS87yzvOX+3L2c+65S20qlSRA\nAiRWgc1izGrc7bansWHwhM3MtMcRdvT4w3SEPRHzvdGXDgJHu3sm3M2EPeHxeGl6oMcGbPCMDcaY\nRSAQEpKqpNpu3XvrLmfNPd/M+fC8mVWoBHR0xwx8UEYAURJ1lzyZ7/u8z/P///6S3CET4xorV5i+\ny3EW0a8VdVSw7ljMuxb/9nf/gNdt3cNPvPbHyH0LQ1f/yzgmtlPsrofvu3hejyiKODo6olhlOE6H\n8WhCb3NDL6DHYsbJMzzPY3tnhB94zGYnLGYRx8dLHMflvrsfYB0nrFZrvPA0cbLixtEK3y/pKYu3\n/Mt/xejRb2L+gNSNF68Xr/+/r58A+N3f/2H/GN/zqlyX/Ze/km//j/8Towv3kKcJnuext3tdyIe6\n/XLx4kXqWnHXPfdQFAVPPvkkW9Mp9z/wAHGcoSqTGpvReMrVa9eZbk4xbYvj/TnLdcRwMOZkfsx8\nNuPcubvo9ztcuXKdfr/PYNBjtliCZdHtdNk7OGAwGEgxk5eauVJj2xZFoZhOd6gqkytXrhD4mkhY\nVbi2UB6LPNezHlBVhWn+4OX5+1bg165d45d/+ZdbBOqv/uqv8hu/8RucnJzwgQ98gCtXrnD+/Hn+\n+I//mOFwCMCHP/xhPvaxj2FZFr/927/Nu9/97ju/qa7Am75Ys+vcnqDTAmG0lrvW7iXMW3xv27La\nPqBlmuRpiuHaGAocy6I0TRILjpZz/vSP/4SzO2d43StfRX6yJLdMLNtmOBziakCPTMlLGZj0+9RV\nRRCGJHFGkqTtBN11XbrdUBgbqmz79ACe16FSUJYVWVayWEWYpoXruRRlDqZivV7yD3/nX3P3k0/9\nJz28L14vXi9ech0+/Ea+9si/oBd4bUHYtA/7/T51XXN0dMRoNOLo6IgzZ86QRhG9niAnzp49QxTF\nAuEyDJJUTlm+72p1m6fnQY628xuMx4LRNW0Ly3bIikJOx2WNZZktHsSyDILQb3nnSpXUdcXVq1dZ\nL/eo6wrTEGdo4HlUt9noi7LENO0faKX/vqgrx3H4yEc+wre//W2+9KUv8Tu/8zs8+eSTPPLII7zr\nXe/i6aef5h3veAePPPIIAE888QR/9Ed/xBNPPMGnP/1pfv3Xf/378mybo9PtAcfNYt4cI/JSsJoN\nkOr21ooqS1Spe+iqwg0C4iLHdhzqtGQerTmsUv7gD/+QHafPmx58LcONCePT20wmU2zb5dKl57h0\n6TJlKUfF4XDCaDihyCssy2M+k0SZ6XSDbreL4zikacrR0QmWZRMEHYbDMWHYpSwrjg4PmS9mFGWO\n5VhsbU3xA5/ZbMZyuSRNM4Ig5Owzl/4zHtsXrxevFy+A8de/xmQ6bQ1Ow6EotHzfZ29vj/39fe6/\n/2W6tehy8+ZNTm1vc3J0BFXNarHi1PYm+7v7zE8WjAZDzpw6w8GNQyzDwXI9VutY5LCbG2xsTNjf\nP8ALAjBMjk9OGA67ZHlOlmciB10uUZWEjxwdHwvvpq6lzWdanDpzhrzUFbZh0e+NUKrGdpxWPthQ\nFZ/fE3/+9X1r9O3tbba3twEZTtx///3s7u7yyU9+kr/+678G4EMf+hBve9vbeOSRR/jEJz7BBz/4\nQRzH4fz589x77718+ctf5o1vfOMdX7uJF2p637cPKeG2gGMl5oDaMKC4xT5AVdIH03AgVUOkSqzK\nZL2O8Qc9ilTxuU/+OaOwz1t/8ifJo5QwVMzimL7XYTIas7251boFv/PEUziOy2DQFxNHLDbk/f19\nXNfB8zy63Q6DwQDDMFgslrrHJ1X5cDhmNBa5QJ5LUECSKlzP5tz5s8J0KTPyPMX+AR/Mi9eL14vX\nD76souDGjV3Ob29RliWL2QwTWC+XTEYjTk5OePbiJZbLJadPn9Z8natsbGzQH/R4+qlnpLduWfT7\nfZ5+6hl6vT6TyQQDg4sXL3LvvRc4OZqxe2OPfr/P1s62zBlsh/F4zI29m4SdED9wWCwWIslUFely\nQb/fZ7GM8Dxhs1e1wvV87r//QQ7298iSmHWUCMKgzDAN7cTUgK0fhJP9/v/2tuvy5ct8/etf5w1v\neAMHBwfSZwK2trY4ODgABEBz5syZ9u+cOXOG3d3dF/x6jW0+DMM73JiNTM3zPGzXxdKp4o06wzRM\nTMsSl+VtskLPdhkEXYLxgEOz4P/8sz/DPI55++t/nNyAje1tfAS4s4oWLJcLlJIUmcGgz7333sto\nJJwEzxMrru+LNbiqKvb393n66ae4fPkyBwcHmKbFcDCi1+2RxCnXr93gxt4N9g/2yLKEre0pfiCB\nuuv1kqpW2kXX+Y+97S9eL14vXj/g2p7K8FHcy6I3j+P4lpKoI0XX/v6+2PtVwTpesX9wwEteei/d\nXo9CA8mmm1scn5xgmhZlWXHXXXdx9ep1egPpeV+9eg1TG7PSLENVFZONMasoIk5zwm6XOElAEyb3\nDvbBNFnHMWmWUxsW6yjGsgImky2yXOG4PkpV2LaEsjfwPilw1ff93f+jhpjr9Zr3ve99fPSjH9UC\n91vX80Xnz7++178Lw7BN0mm+RnN0aP6eZVmYt+XltbCr+hbX5HbQ1QCXVV2yNGu+/NVH2du9wc+/\n9d0Mgw6WF3C8WtAJQjqOh78ZimwpjinKglIJzrTX7dPpnMKypFWyWi3BLAmCUEh4nkeaiolkdnLC\n7vVdLMtmMtngzJmz5CpBVQVpmvPkd57Etl0GgyGO7aEqhe/3WK+WL3hP/s2/+VcURcLhwQGVKrhw\n/rz0+k2Ti88+QxD6bGxscHBwwFe/+lWGwyFnzpzSrImA9XrN9vY2Tz/1NN2gy8/+o38kZMS6apkS\nvu8LFS+NcV2XOI6ZLebs7u4SRQnn7zrPdDrV91VSwUUxIHru9XpNp9Ph8PAYgL29PQb9IYOB8Mfh\n1hzjZLmSzXK1IIrXGAbMZzNWyyWPPvp1fu3Xfp08LzANkyAcCLnPMFjHkqazXK6oqhrLtiVF3ffp\ndrss5jNs2+Hk5IQsz1mtIqbTKZZl0esNKMpS9ziXHJ6sqakxjFqQAIaBYVTMTo4xTcHZ7u7ewLYd\nBqHN0dExRZrxute9jvFYdP6GSatNXusk9k5/gO1IpFaepMRxzHK54vDwiLvvuY+8ELu75TiUeYQp\nFGGODg9ZRys2Nsa4tiwu67WEN3fDLmWZgyHKFsO2xLFnGriODwZcvHgRz/c5ffo0ZVnc1l+VMOBe\nr8fu9V3GkzG25WhL+YJuL8Q0KpowAduW9KokTXEch6KQQJQ4TjBMk09+4hO8733vEzOYJSHGYU/a\nhNSmDmAQLXleptR1Rb83lOcwiuXrFSVJklJVFf3BgOFwSKUKVquVuCW1gicMw1YS7AcBy+WSJEk5\nNRkRdjrEcUwFJGnGe//hT9/x3rgWGK6jnZKp/DP958Ggz2q11KRPhziO6HQDvCDg8nPPcTKfM+gP\nuOe+e7h06TmyomBzZ5tclUTrhK7Z0Uk/SyzgZS97KQcHh+R5zmgy4WR2ItiNQR+jrJjNZnS0UzTL\nck6fPsV6HQMG6yjGznKhOJoGruPheSFZGuH6PlSlLkxFTVdqkcX3u37gAl4UBe973/v4pV/6JX7u\n534OkKp7f3+f7e1t9vb22NyUxI7Tp08L3Fxf169f5/Tp0y+8WP2v/3s7qHz9a1/Fw69/dZuX6Hle\nG+IgWlmRCdIGMtR4nt8u/nVdUxk1Va4oOzZ/+/d/x+Nf+goPP/hqclccbV6UMRp2KXwHY5WS5ymV\ndkz1+iFZmlOWOeto2bZ0pG3SJS8y6lqxmK/EGuz6bE03SZKUydggimLR4QKWKz+PgHFslKq1/Vz4\nEFSKQmMEnn8NhgNWy0pMP5bHer3m8PAmJ0dH3HvfPZi22ZqWTp06xXA45CUveRmO47BarTg6OuKx\nxx5j0B/iej67e/tsTCb4nkeWp9oF6bBaLSnLgr29PeIkZrKxwdmzZ/WJQ1xqtuW0UXTNJhxFK4JA\neCSj0QDDENRpkqRQIzyUoMONGzckKcbviY5czwIWiwVnz5yn2+nwxje+RX7nvhQEJ7OFIGfrmrAT\nYhgGw6For/O8aA0qSZLge24r91KVMFZWq0g7PTMx6Win7mg0wTBM0jQms2xu3LiO57mYhkuv12Nr\nc4t77nkpYRBQJGsAjo8OsS2Ly5evEYYhL3/5A5jYOI5FR2uNZzNxgQbaJt4UNkEQas63TU3FarnE\nc01ZXMqS6dYmw3yAYdT4rouqSnrdLo4Oe6hpcBCgCkWlAVZJkmijW8XW1hTTBIMa13FaZG1dSUHT\n7XQwaqhUyXKxYDIeEUVCiawq4YhUVYWl37W6roUtUxR4muEdhmEbRJ2mKZ1uSJokeL6P7bg4riYg\nGgahJWydsixZrQR45XsOhu/R64kUtiwqsiSmqhW2ZWKH8jNXdU1RSPFkWTZxtML3XDphgGNBlafU\nKqemJnBfuGGQx0uCzlCCI9LkFrM9z7BtC9s2ieMIw5DoQMuzOVmcMJpuCFlyPWf59JqtrW2uXL6C\n43v4YYDX9VmtliKJ1CHTR0dHTKdjkiQVP0Wvz2K1JFqt2J5utclgYRiSZimHh8ftJj0ej8gyLZG0\nXYy6ZjTe4Knv7OkAjgxQPProY3ztG4+3zJfvd31fFUpd13zoQx9iMpnwkY98pP3nv/mbv8lkMuG3\nfuu3eOSRR5jP5zzyyCM88cQT/OIv/iJf/vKX2d3d5Z3vfCcXL168owo3DIPPf+7ffxfEpe15695w\nk0phOpr7qyE6lm6bNI4+yQ2U3niUlczTNb//e7/Pmx/+cXbOnMbphpSzFcXhgihP8aZDRuMxG6Oe\ngJuSlMV8TtgJ6feG7e+d57nmrEgFOhwO6XS6KFVxfHxMnt2KcNvePqXTQPapDEWSJZiGRdjpaKSo\nT5Zl7O7eaCPiPvDBX7rjfv/BH3yMm4d7BL7LYnbC8dEhm9MpZ3ZOsVgtyIuUMOy284I4jnn22WcJ\nww51XTEej7l69Sp3nTtPrSAvCs6fP49tifNtPB4Tx2vs29KPJpMRRVniBwF1XbXDoG63y5UrV+Q+\nu4F+2YTH4nkS6rBcLrl48VkuXryIZdocHx9z/vwFXvva1/Lggw9i2CE3bx5g2RbResVnP/dZfvzH\n3ojv+ShVc3h4yHA4YnNzE8uTRJvVaoXnuZycnGAYpjCuXRfLkjba/t5NkixuTQ/33HOPJrjZLaFu\nuVwKUuDwkDQXXkmpcvIsBaPmla94OTWgypLZbMZa89IHoZzKRuMhnusS+gGmKe7TbhhycnKC5zuc\nPn2aXJWs1mtWiyWZdo6enJwwnW4Kl91xtUFLkSYxeZ6QZWJ4UUXG9evXeOtb3iRa+CynLEv6/QFg\ntIN/47YsV8e1ODw85Pj4mOnmpiyyfqirabvVrzfDukwjZS3bxjItDGpUWVAbBqWS+ROG0bI3onXE\neDQBpIr9dx//U97y1rcRBAHdbhfbdjSxryMse+8WTe/5uOdGrfX8q/Ee3O4NEJe1TVEK/lgEDArH\ncem6JqqsyIsCQxdxb3v3nRX4F//6r4gK1fLZDw8PNa45Jc/lHTg8PKSqxFT2kgfu5/DwkDiKwDB5\n+HWv5xvffIy7777A0dERlX42x+MJoe+SJSlZlnHh7rvJsoyjo2O2d04RhiE3jw4JwhDX89i9do3N\nzS3CTsjVq1cZDYd0OoGcEDenHB0di2HJgDDwyFJJt/+bv/4sp7bGCH9fNOxVVYk237B4+M0//Z9m\n5PnCF77AW9/6VnkZ9U3/8Ic/zMMPP8z73/9+rl69eoeM8J//83/Oxz72MWzb5qMf/Sjvec977vym\nhiTyAO0H3chnbo9Wa8wcliUp14ZhYFv2LeeSY1Oosu2BR4OQP/nt3+VUf8TLXv0QlWPimhaWbdMP\nO5hRznq14nJ8gpGXjAZDAeVzi3rYUMgaU5FhGBSl8FniOMZ1PRzH1Q+aLHYGBoYpVnTHFUNLnuft\nA6lUJQYeW9gQSZzwc7/wwTvuy7/+n/8FhlFjUFGrksvPPYfrOIz6fWzXBlM2vNVqJcEptUGaJBwe\nHvPAy1/OfDYjimM5TutEbss06fX6dDshVaW458LdVJViuVxw17lzMiXXL35ZFm1KUpqmDIZ9Db0f\nEMcxnbCD5wVEUcSVK1cYjSZUVc1kssHejX08z+PoSLCcw+GQqrbYmApHvChykiRmMBxQ1QZ1Jcfn\nKEpYrJY4rs18PsdxHC5cuPtW8kyWUdeQRCmTyUS+fyZVVjNHadpCaOa754tD0TJNohRtDFkTdkKC\nwNOIVbv1ItS1PH9FlrfO4CxLMA2pYl3HYjweEa1XwrMuCmzfwwBsy8IybZIk4dLFi9x7330YhjDm\nDUsjIGrRAzu2TZJEeK7NajnHMk02RiMpSIqSuqooSiV2dvmhbpE4Han+Oh1hh5umSV2BaZjtItyg\nJ2zbpFQlQRAQxzFQSwBCbWBqdUNW5G2bUikliUZpigG4nsvn/u/P8fa3v535YkEYdlqYlqmZ8bbj\ntioy07RucxUqiThrApltYcGrSmGZBq7tUhQ5juvhB37b+pHWlolpmVoDbZIlSTv7auiMP/mOn7rj\nvfl/PvcXuIFY8/M8Z71e0ev1tFHNJQwDFoulZqR3cDy/Tb9q1prRaNRuLrW2yy+XS7Y2pywXKyzT\n1FwhlzAMmS8WQn5skn0MA892KDR2YTqdavRtTLcrp7O6rls2kGXbVKqAumR/7yqL2U08z6LIYqiE\nF24gz+ir3viuHz0n5mf//P9oj+jNQzSfz+l2u4zHY53YYVCrW/3bSlXC1NULWZKlGI48kKZj8799\n5s8orh3yT37hF0nReMuiYH9xQmFDr7bZ7o5wp0OKXHHz4ICbNwVfubm5ydbWFo4j/fbG6mvbtryI\nt7V2lsulQJVuG8DWdc18Pme5Suj1evieh2XKYrher5nNZmJddxyGwyHv/dlfuOO+/N7v/Utc1+Lo\n6CaPfeMbvPc97+END7+BeLXmU5/5FDePD+l0OhiGQRQl0os/Oqbb7SNhtDndTh+lgVOdTodON+Tk\n5JhBv8/21ha7u9e59OxF/umv/TqOI/xsiaZy2miw5mVUSuG4NlG01nFf8MS3n+DatV1t2RfS4d7e\nAUVesr29jefJoiEbvmBmszxF1VpOqtGgruuTl0KZ63S6rNdLzpw5w+XLl4njiFpXIQ8++CDj0Ril\n4OLFS1y69CxnLpxvTxS+K+zrLI2ZTqeSZTlftPfd8oTxfOrUDkq7XNfrdfu8FYXSG7ZLrz/E9z15\naZdLTGriZM3hwT51rdjZ2WE8FAXSKklZrVYsZjPSNKWvWdpnzp5htV6haundz+YzXMcnSVM6gQ/U\nDPodTO2cdG2HThiSZ5JE47ghStVUdUnFLXhbliekqfSTB8MhGBWuE6CKxrFXt8/jar3Qz8iKblfw\nC7UyyJKCoiwpK0VFrWcGXSzToMgLhv2+uGzrio9/4t/xtre9jSiKWUcxk8mEbrfLcrliNBoD4i+M\n4hjfC9vKWSlFVSscxybXOZgg5MqyLCmz8haZs6pQNcJucV0GgwGTyYReryeeDMtjNp+3J7PA9fhv\n/5tfueO9+cynP43nC5qgoTg2oDTbdggCn36/z/HxsTaT2Lpt1MNxHObzE8bjcVsMyHNvSehGKUVa\nT0uIbdumrgym0ylxmrCOIiYbE46Oj/EdCe+OtNN3a2tLZkSDQYsI8X05jWM7IqBI1tRVzqWLTxD4\nFkatdKfBwjIdwOD+V/8IJvI0FXjz52bhaKrf5seyDLMFUzUtF1VVZIXkH8Z6Ef/a1x/ly1/6Km9/\n73s4u71DkNcEhoXhu5QWFCYoE1Sa4y8zMtvH1v2+PM9I00RzO9bUdaWtwLI5VMhxplHHNNyW1Wql\nrbK3wDOm4VLXpp6Ey8InH7xUK+jF8Wc/8Mt33Jc//qPf5dKzT9PtdXnola+g3+tRZDmdIKAC5ss5\nTz75HfI8ZzZbaLiOWLsXiyWdsCv9zbrGD32p6PKcMPCp6oo8k1xLw4R+v8d0sgHUhMEtO3BThXie\n1y7ipeYbr9drhsMhr3/9G/SAKqPfH+D7AVma6zQev61qhoO+VGe1krT3PEdVwouO05w4TomimCRN\nWS5k0RV7fUFVypygKBS+5xMEXS5cuMCFC/dydW+PJInpD/osF0s818WyDJSOd6uqkueee47hYMCp\nc+ek520apGlCEARSQTuCgHUct834XEcS81XVCmqZRRjUBL6HUQseYblc0AlD3KCLbdn4nqcxvxXL\n5ZJur0upFI7nYDs2RVliW4JnME0oskyjFhLWpGnUAAAgAElEQVQcy6bIUgI/EDs8BlleUVWGZCZa\nt4JNmkBdQcwOKVWJgU2tbqW4ZFlClqX4gUeWye+yXq/Z2dkmjXNMHPTBTbM6hOznOi6e65InCaYh\nEXv/16c+yfvf/36yLJN2puaKG4YhTHad5uSHHZRCiw80BtWUobG0R2s5gWkWfxZlGKYWLFgOjusS\np4luiyr9e+TESULt9zBNkzAIKYuCwPd5z0++44735i/+8q8oiyVhGOL7knbUBMY0z7Rt222Q+vxw\n2drnu92OHvI33HqlTwiuwN2KQmphyybLMjZGY1mH9IkhzXLCboeamkJTNEPdilutVmxubpGmma6+\nBVFcFAVFVVOWGXG0wDJKDm/u0g1dbG1UNGoDapkzPPSGd/zoWekbjkmzSMCtfLmyLEmShDAMScjo\nB11soEpLbNelpKZ2HPBk6Ha4f8C1567zM+94D+PBBnZR4Xg+RVVRlSXRIsL1XFzfo+d3qUwPVUaU\nKmEdrwj8gNGkQ5qmhJ0R69WahpIXBD6mZePYDovlnKObh7iOI4CjXh/HsdqqXPglmstsW3S6Y1ar\niNn8uO0LjoZDnCZQ4XnXlWcv8fa3/iS9Xk+m/FWN64aUlXA+Bv0Jb3zDm1Gq5LHHvsnly5cpy5JX\nv/pBrly5Spqm7O7u4rg2VimLpeM5YCluHtyUB9F2MWuLvYMj4rTkrrvOcc/9L0NevhJqYXYnccz+\n7j6PPvoob/rxH+e+e17C7vVdBv0uHc/D7feZzWYk0YKD/esEYZcw7FBUOatFRJqmrNN1q/UPw4Aa\nQxbQXDGfr5hOt8jyAh8D0/JxbJsdP8D1XCbjDUHsOi4HBze5ePEis1XKVx97nI2tHbrDDrbjsrEp\n9Lrj42PSLObo6JDFYk6aJpidPsmlizz00EN0OqFwx4uCOE4pS9mofV96vGHgM93YJIljVFVTliXz\n+Yw4ipmxAgPG4yGT6WlsxyYr1li+Q0mJQjYoNwxIs5w4SlivIwb9IVmWYoYeRVnSDQV6FPodHCfA\nd21sM8cwJDSkriuC7gDbdclTGbJXlWz60VpyIx3Hpi49HFPCoVXzwmPQ7XjYprzoHb9DBcSJ4uLF\n65w9dw7H98iLnCLLMWsT23Hpe76ojUpFdxhgGiY1CgyL+XJBFK3ZnG7iej5GZeE4HoFbo+qCLE1I\n4oRCSVtQVDE1tm3ok7VJ4AfYji2bne/jmzJPsSwLDPm+/VCCSGq7FpiWGeBaAZXhSUuxBBuDWgsb\nnn8ZKFwvwDAd8qLC7wzkRKnbp5ZpEWcJpiOttpHtokrFeGfKar2S9CPToOMHXL++y/a5u3QqUoBj\ndTAtaZEmyZrZ7ITBoE8URximiZVKEZOmGZubG0LZVDWOY7GxMUYpCZfe2NggjRPh+Bc5uUooi5xu\nx+XK5V06fohjmkL9VJVspOYPrq1/qBW4o51HLyQlbBQTpV2h0pyuG2CqGjDJjRoj8MmU5CR+8W++\ngGfbvOblD7aVYzOIvJWwQgvQybIMzFKrHUzSNEWGRzW+L/9f23I0O1tpdCtA1R6z2mBlHcbQyB9z\n3S9PU6lSfN9vd98miVwpxT/+wH99x3352t//Rdt3vz1zr1EMGIaklDeyKzn+zXn22WeZTqccHh5y\n9epVVFWCKQkopmFysH+TPBeAUq2hT2WpcB2HycaE2fyQLE2558LdLeDKNm06YYftrS3yrKDf6+sw\nYmG+LBdzDGA0GjHemAhwSgm+1LJkg2t+b2pYR2s9IM31Ai6QIMty6Pb6KE1WzPOc5XKl+6hKu+vG\n9LpdqromTVKcTperV67qoIYTPYOAU6d2GI0G+L6HaZkURUY8P2oDQ5oqrBkkN6emhlOuSrk3TUul\nwR3XBvozjSlLrdGtUkk4smym0ynL5YrlfMHmdJON8QTLssnTDNMySVVOqRRZmmPbHlmSthJa2xSF\njGkaVLq1oaoKg5o8y4CK8WhIELgMez38wCPPJGmpxgHTxjQNyjxH6c/ONG3SvCCKk5bvfe3GLr1+\nj+l0E89x9DNQ6p5thmlaWGgHoAlBYFHV0kePojV1ZZIlJZbpUFU1jmvh+xIW4er72TzjdV1BfSsf\nsyiK9nsVRUmlKmzb0aHNNoY+XjiOq01xQv8rK1HvyHBdUVPxjnfd2QP/1J//OZZjCnLZsjAtG/Tn\nWHEL12EYNqVSuHbVPpuSZWphNhmpSYKBBG+PxmMcUyr57e0tLMfU0LlbA9i8EEhYUSpCzyKO4nYN\nai7btkV54vrSGgacwOLk+IjJZMiN3esMOiGG9omYxq2s36r+EU3keb55p/mFn08lTKKEUMcppXGK\nH4aYvkdZKQpV8sxTT3PtyhXe+673UFODaeBYAuWvspQokSN6v98XyLzr4GYuWZEgwagS8eW6Ilec\nz+as1xG+L/2sMBT9d5Ik7XGyGX5ZlmBb57O5TgoC15eJdL/fbxO1RV61Igx9ZrNjnQjzwlfbOtIL\n+e33Rk6+huzyeqjjex73XLggi1MYcmpnh3W0JstT9vf3JfNv5xSVqrWVX9Q13X6PMAxZzGeURU6l\nFM8++xxFUfDyB17OaDxhvVrz9MVnJQDYkCPhK1/xAGByz30vxbZMqkpxeCjZglvbO9imxWKxlAGu\nkk3I931MDGKdRn908zo726cBg6JQ7O1ex9agf9k0JqRZimXKi/fcc89x86Ck1+8zGg4p05TjwwOm\n0016586QZsKp8R1bpKZ1jVEpCcz1vDbRPo5jjvXQ1vO89sjdsKkNQxKe5rMleRG1w0TPDeh0AyxL\nwiMKVXB0WGAZHa5eucp3vvMcjmUyHA64efPbvPXNbwJVUVQprmUTOCalUbOxPSWKEnqdgDQtwLTI\n0hxsj7IsKPOc3evP4fuunkm4bEw2iVYLqrpmMV9y6tQOlSpRlShTgtCV5B1bwqxV3XC5awzTYv/g\nBoZpszGZ4ngSehytYi0ZFZztaDQWhUiWayicTZpF+j3wGA6HGFhYhkddGcJUVzlKycJccyuIxdVt\nScO45QG53RbeFmpI4HVZKipoM0wB4nhNWSo8L5DAC0Mkk9X3sJuYhgygHdclTRIRGrgeRZ7jeAG5\nlpcOhgMoFJUS2mRdSau0rmo8Vxbdfm/EcrkkDHqooibNVxhGzWI5J04izpw+RVlJWHhVVXhegO8H\nFHlEEgtitnnnmwI1TVM6YagDTuT32d+/QRLHuK5FqJG5jmngug621WBFfrDT8oca6FAURbtzw62E\n52bxtiwLwzKodS+rUmC6DiWAbXHl2lU+/Wef4qH7X0Fou5w+e0Yqm1KSbhzHwQ8CbMsiThIODg4k\nEMH36XRlcQ5DgcoL4rNuByFND0um+LTM4kYn3VQVkpTiae6vZFcWRcl8MacsS86cOaN/L8WNGzfa\n08DPf/DOYcw3v/K5tg/cDG6bB9+ybWzHRimpcAxdmed5TqfTIYkTTOtWQnbze8RxzOXLl3VluxRm\n9fGxgOl9X6DzlBiGxWw249y5c+zvHXJyMmv57EEQatOFiW0YvPrVr+bG7nWOjw4ZDsTcNJ1OGY7G\n8tKZpih1lMS+VbU8xKZhslgs6Xb7UIPnilY+7HRIipjlUhb+1XqN5/qYlkW/36Pf61PVFUmccenS\nJQaj7VZ2ahjiyO0PBhgGxHFEFC2J4xhVlVgac7C5uUmn02GxkISV2xOCmjaP5Tp4vkTYhaEkslQV\nROuY2WxGVuRte4bKZXt7i243xDQNovWSui7xfBvbBN93GI9H5EWKynLyLCfN5KhfVlDVJobtcnwy\nJ4pj1lHEdHOLYd/Fc0x8z2+VVwOdAlOWBdFqjaoUnuuxjsXAlOeZbqMIelhViuUq4urVa3T7A3r9\nAYPBSJ82EspCWh2qFEyFbUsiURo1C7tLqTL29na59767Wa1WmKaDUVlYlgRxW7aBBC7XGJbZ6smz\nTGL98iz5LsZRs7jfrjqzLVGyeL5HqW7hUytVoyoFdSNJLFF6QPrOn/qZO96bv/z0Z3BcGY4LctbG\n9TxUJSEoVS2ZpHVVYWpVUFmUdDud9h1qEMcGEK1lCCqpSakuqmo8T7wDURTheh6O6xJFMWki72CR\nx5obX7Q+kuOjwxahbFmisnEdF8yaaL0GKiyjxjIMXNskSxNs22pbTKZpft9U+h/aAv6Vv/1U+2He\nOuIY7YcOmoeiFFmeE3Q6ZEVOZRk4fsizVy7zja89yuZ4g2HYZWtjk7V+aJob1kgDgyAgCCTluhly\nFGmhlS7QJGkAmvlc0+/3W6ZxUYiRgNpojTQNBzjLRCve4G1dL0BVMgyVdPQCCQYu6PW63Dy8yTe+\n8XX+l3/7J3fclye/8TckSdJuJI0+vjmVPJ8TDPKAN8aB5u8qJS2XpmXkeSJfzPKcLM2IojWPP/4t\nah1qXBsVx8cndHt9Vss188WKvCjw/IC61hWUaTAcjojXaw4ODji9vcV4OKTXDXFdh/VqTZwkFEVB\nvz9ge+cUm9NJKweVnEkbCaUFA6nUO52eqIXsWrcRKsJAUtrzTAajk8mk3ZROZjMqw8exXU5mMzzX\nw3NlSDgajQBRQ3i+S1nkpFFMqVttG5MJvX5Ph+6KtK2u5NhdVxWpylvut2lYgIXr+iwXa5brVauJ\n9jwPo3K1A9YnL1LyNMZxLdbRnCRe47kWo9GQbjekUoo8y/GCDqtlRG2YrOOM5TLiyrXr3HPfS8Rl\n2utRlxGWUbWLnWWYWJZDXVfkWS4c+ELS5g3L0FphaaepIidNZVN65uKznD5zhiDsYloWnhcINwip\nWCsNiBOZrBjNXC3RhZqqLtjdvcpDr3oFeZ5jmjau5aMU7fsFlYRJ3yb/dRxHnlstx5Ow6Vvveavs\n0u96VdXUGPpZF+WHZcnp3Lrd5a3/541vuXOI+dlPfwaQAkwCw+UztUyR69V1o+Q0bjsVOIRhKIux\nphgaiKomCKRqV6UCI/+uTagGPM+n5dtXItk1TItuRxKRan1f0zRuW3W+7xBHsbgwbQvDtjk8PJC0\nLsemyIT1rlQB2sBT68i21/7Ye370WiiLxeK7ZGu3W/K/K+TBsAQobxnUlcLQsUxZlvGtb36T/+oD\nH2RzMKbI8tYoYJomvrZdu64YRBaLBc8++yx1XdPpdDi9c5Z+f4jruiyXc+JYFpjNzU1tVImYzWYS\nBquddmEoLruGs1BVkujS6/UBOboeHB7guB6dToDtWCwWc+I4xbYtLl26xNPPfIff+Kf/PbzAAl4U\nhe45Ri2RETQX/fagC2S7adosjXHDNAwc18W0LNI0x/GcViNvGQWuLcG6vufw3p/6KWlPXH6Oo5Mj\nJuMJeSHtpCiK2Tl1hmu71/E8D88wWM1XkoDj+QSdDrPFAtMyyfOMo8Obbaup3++ztbWF6zg8+eST\njMdjtrY28TxRSuRZTqVq+v0hOy95CavVmqqqiXIJHq6qirqqsU2Lyc52u1FGUcTu7q4YP4yKTmBz\n792vIsukZ960s46PD7XKRJg6Ozs7OI5Dtysp9uv1GqgpSkmtL4qidfuONkSjPplMMAyL/b2bHB8f\nkaVFu6GfOXNGhuyRVO5Hx3OKIqcTBoDF9tYp+oMu68UCqDk4uEnY62G7Icqw6Y6GHB2eSPweFa96\n8OWcPXuO5WpFJ+xQlBamKaed5XKJ6/vkWUGR53S7fXZ3b7TvS15mFGVGraRgsCyLC3ffTdjpMp6M\nOXf+vM7tlI0w12nsZV7oKs9sq8uN6YSqEJmb6zqUZY7juBwcHGIY4nyOVILj+DKM9D1xg8p/kWUp\ncRy1bllVSLukVAWWZbYnyuZU1+RierpSlkLBIgyDW2sCOqC8qqUqVy9MNu12AkTUeCtbt0KgcuJB\nEL9ArmPrAt8jSyMWczHWVFXNSmOfO0EAdY5pKmpL6ValPCPrdcS5c+d0de6zXK0Ak0IHrcdRpDci\nQyvZZBMOfI+6UoSBS5bGeJolfvnys0xGQ4mAdEWi6Hsye6tqiWr7fjRX+CEPMRuNa9NGaVoGzT+3\nbc329n3SqqSkoqRmd3eXj//Jn/Lut7+T7Y0pvp4qG+6tnMyWWoj0YJtqttFIy3C/YZAD1G0Aa7Ox\nNDJCQ/ed8zwnDEM2NjZaY0OzYbS5nZZFURbMZjNMy6AqpV/2zDNPc+Geu3nPO99JFK143Zv+wR33\n5Wtf/PR3DdeaHlqj2LF0JmbTG2+uxlDR/CyG5J9roHzze6JZEx7QtKkUWZ6BNrXM52tOZjPiJOPa\n9V3my4VYjRcLFss5YSjO0vl8zng0wKgrPNvmrnNn6ff6hEFAVuQcHByyWq4oNXskTRO63U77wr7p\nx95MHCeiBc9yXMfDdOxW+tUMepuTRaOfbU5XSS5DQVVWeJ5Pnhd0wo7+rMB2bJ3gs2C+EC10mwCj\nP8NeT/TvhmHQ74t23nSk+k6SlCwrieOU8XgKyLCrpsYwxTjjOnqIXTfOXZHJ5XmG63rEcUwYBERR\njOG7rKKI+ewE17ZJkjWnt0VT7rqODmzRieS2HPcl2UaeWct0SOJEjDu68lssFhRlRlYkuI6NaZgs\nlwuuX7vGYDjkoYdeRVbkOI5HjYFju9SV/lnTDMexybJUvysGtmOBqto/u65DFC/pDzr6BKdQRYVt\neYBJWRby3hhQ6VOaZVkMhwPKssA2rVbvbZgGWZqK9NG45XRWSuG5PpZe3G9vnQJablng+5L4AwY/\n8a47nZhf/bu/pSxEoVIjLUdVST5rY9GXLFhpc5pWTaUUgR/ofnVT/Ck8z4FaWnGO41DqU7zrygLu\nuK6cELSiqhmOSxu1wHEckXL6PtF6RZ4l+tRh4nouviepUzunz/CdJ59k0O+RpQmh71Hp+yPzBNpB\n7I9kIk+zSBaFwG0ajeTtTPC6rsEwmS3nBIM+RZ7jhQFf+Pznef1rXstLLtxDpd2OlmOxjmXQ2Gh9\nm+ozaxLkq4ogCBiNRlhIxSbWbRloCchdWizL5RLP89uFdHt7B8Mw2Nvb4/HHv02WZZw6dYqzZ89S\n1zXHx4dkWc58tcC05QGcTqd887HHePRrX+NX/rtf4Z67z7NerfA8/wXvSXP8lIcgaxfyxnwSBAEV\nNZ7rthuLUqJccDyXWn/4jmNRlZUoCyyLKFqjlKAHKlWJsUYPnSzLwrEcoihhOBzguB625XL+7gu4\nrssXvvh5DKMiLxLquqRQBkHoEUVrtjY3OLW1zf7+HteuX0WVNZZtsb29g+f7PPjQQ3zt0a/wkpe9\njLOnz7C5ucHx0YmEzW5sSGVkmJycnFDWZvtc9Ps9ul237UsuFgvm83lrThpPx20rRpUSbnzz5s3W\ndej70pM/tbPN3RcuyKB5PqcoCrIsYbVacHQkp4bNTTFv1bUiXi8lG9LvkqdLet0uRZ6wuXmKbqeL\nZVmsY/laN2dHokjyhBuyMRjiedJuieMUy3KYL9YkSUK8WBIlMVSK+WLBoBty7q4z2IaJUSmqskAV\nJRQJSVZi6BABy7LI01y/D/KM3Njd5/HHH+c1r3kNpmUShD5hEGq/gU2lRF3kea6w9MtC2nyloq7Q\nTHtZvB3HYTQaUZQZ6/Uaz/fbYqCuDcJQuC++7zIejzFqE9MQc4koSqRdk2Q5aZoym804OTkhzzMc\n28IyLY1g7uL7Qfs+3t6SME0TVSlynUp1u6S4OYmnSUaWF6jqhRextMjo+n7rgHb1+1HWFY7joiu0\ndmOoVYGBDEsty8L1xBVpUlOVla7+FUVe4to6mLmG6XQDy7Rb9ZfKMwpV6vhYgziO8D2PVLdOHcch\nDAOgxnEkMNy1bW4e3KTT7dLvdbFME9e2pHevJ5a+L9Jlpaof3Qr885/79wDtBwq3JtmNQkV2Un28\nCDziPOUzn/4Mzz71NP/FP/gZpuMJSpXcPDoi6HXpamZHI19qXFGNHAxoZU2S9dfD9wNWK5GtNT3t\npscteYw5IEyGZjDW7XYwTUMHqC5ae22WpWSqRNWi233sscfY2d7h59/3j8GoKfNCBimmyQOv/ok7\n7ss3v/xZbQ+3da/davvhq9WKUJsAGkdoc6JoTi2e5+mhTIHvinmnsfPLIgVKFbqf7Or+Z4nUOgaS\nAGJjWkLJ+8vPfZZPffrPGU2GTDfH7O3tUWEzGg4wkRSkXicQzfRszmSywWg0Jgg1j8LzmW5sEIYB\ns/kJWZLS7/XY3tqm1+3roGOF57jYvigX5CRRtL+XUCtLvehkpFlG2O3KHKMoydKCyWRD3IuVGDLK\nssD3PZarBVUFeV7Q1X9nHa2lmq2lml+t11DLO+56cPPmETs7p5hOt3BsDz/oUFXNhKQWO7Xn4vqi\nwMnzUoeL1Bq6VbB7fY8g7GAaJpPJlAwlcDPToK4KalUyGvQo0hQqyae0tZQuo8LWn6OpVSqe53H1\n6lWefvoiL3vZ/WxsTEniRKpZamzblDQXA46Ojuj3+4zGY1GHaEeoUrVOsNdBKKp53rN2ztLxA30P\npc2xu3uZsOuxtSUnzsALUaUkrgdBILLHSmFrBRfQ9rjrSlHqU+F3L0IGWZbKac6ToaPt2BimKdLI\nWu6zCBwk2Ftc2NIrf9NPvP2O9+bP/sPHQSmMBjtg22IgA8morG6d9GsMbFPCtStV4bqy8SmN5GgN\nSEBVlRg4+p0SIikgfXal0F0a/fcVpgnLpQzQTVPCjjudDkkS4+uNbL0Wb4RlS4uPusYyhFPj+57e\nPGv9vAk2++Wv+t5OzB9aBd5cTQhqMwQB2qmwbdvYnkttmZzMZhyeHPOlL/4d733Hu6jykjSKsR2H\nM2fPktYlfmWxXCxFl2pKQnQnCEmzjEopqQg0pGixnrN7Y5fFYsFkPKHb7dHrdYnjA05OTrTuN+X8\n+bvp90YMh2M6nS5HR4fkeUEQeIRhQBj6zBczru9ek+o39IjTlMe+/nX+yw98gNOnz7BaL/E9DxOD\nSqYTL3jZlo2nj9+2JSaWuq5xHZcgCL+rLdS0UZphV9N+kDQS4X24tk+eZ22lLj1yp7U9V3WN60qF\nYdg2eaaYTCacnMz5+Mc/zjMXn+L8XWdYR0tmhzfpBh7zKOXo+ICqrFBlzqseepA0jQnCANt1ODo5\nwYsTzp47i8pL9m/eJNMyqtFYQp2f/M5TZGnGm37sTTLfUDVlXcgR1zIZdHtQQ5qlJMmKJE306cQk\nDAPN2xAlRakKLl26pPurPpPJSLdqfLp1het4LTflsW98g5e+9KV0NR+60fK3dvM64d4L95BmOYZh\nMR4Npf+pNe1JmpAkMWkaYURGOxdpipAkznj66afZmA7pdgWnoKqKwHJxHBnqdfpd1oulKE2cDnkm\nJ8NC1ai8pKA5kZq4XkCaply78hx7B4e89a1vpigKut2AJImwHbt1KdfUdLtdMYrU8tlESdZCp5oq\n0fUcnE5AEifYdgeoUUoWTJUXLdHRsmx8P8B17VbpFPoBlTIwjCZ8JUdV0l5sTozS8vBxLBvbNlvP\nRNMekXmQqDcWi2UL1cKgtZvfDrnzPA/LcfWC/8In17DbwTHQYgKTUilMy8KoalQtYCwwqA2p7ANX\nrP+1VWOaUFeCH7ktOh3LsaGWeZNp2Zi+jePY+muBraWShcpRqiSKlywWM+oaBoOBlv8WROsVk8mk\nFVWsVivm8zlnz57Fc13KIqMsSipVEseqhZJZtgPUmkD5va8f2gLeHNWaH/j2D635j2VZpJWwFbZO\n7fCHf/xHPPzww7zi/geos4LZ0RGVCdFujtMN6eMyHA6/S54olu5B23NTpSJXOYPBgPF4pAFABUmS\ncHh0iGVZ3HXXXYzHgoxcryP29va5cuUqdV3T7XYYj0fapltxfHyEZZucPXua5XLJ1x77BlgGv/Ir\n/0QcjUmM63m6KnYxDBPHdr/vvWnA9M2CnCQJjudS1hWVAbkqyVVJoVnQjuOwipsBikleFhiaMdFs\nhEDbnmnaVHKEtajqiiJJ8NyQw8ND/v7vv8IzTz/NaDRktZ4T+i6lKrEdi05HhoqOZbG9tUWpFLbr\n0PVCDNOiKGPObd/N7o0b1MqgUgUPPPAApmlydPMmT+89y3g4ZHtrm6eeeoowlCrl1NktXM8jy3JW\nqwUgJ6kg9Oj1Q6HR6WouWqeMRmOqqhYjVtIcmy0x78QxzzzzDMLmEHpkmqa85jWvadt0ZVm2ksuG\nUVMpEzcMsEyLPCtYrRZYlku2mLWQr42xMK+zUlGUJYv5ilKVpKlIDXd2dphMxnohEjWEUdS4rkg6\n48WMLI0xjT7rtWjNTdPBNF0Mz6HrBgQqb5ENnuvw+Le+xQP330+aRriuz+7uNcEXZBlGVRMEPpbr\nspjNKApB706nU/xOKBjXIm/nKXG8lsGc3jgc3RtO04zNyYY+xYHv+cTJglV0QhiOOT4+5qQ+oa5N\nXCfQJ2U5jXiep3nbblt85ZlouhtXdeO49v0OpmnhOAaO49Lr2eIW1s/n7Yor03b0MHdNHCfMTl6Y\no59lCZbrUdcVpao0JsEmL0psw9TYaLOVFqNMfepQrSJGDD0mDZHTwMIwaqqywDTE6JNnRctNb8Bv\nqi4wjJooXuP7nn6uFFVVMx6O8DyRHQdBwHw+J88ymaiYhsYYWJiGgR+G7XNYlqVGXlj432PTaq4f\nYgUuU9rKkPNrQ/Wr8hLPcVFlQVLk5EGI73p88fNfIF1GTC4MJbuuP+Ts+XupTZNclcRZSpkkVIZF\nbcJinRDHJ2RZgeseMxj0GY/HOJZUDIfHc+m39nqUFXS6A4JwwHq9xrBsdvf2sW2H4WBAfzgiiiOK\nXHrpRZ1zcnKs2cYWWZnz2OPf4rHHHuOnf/qnefCVrwRA5QWubVEppRdvA99z21PH869SV0+WLRD/\nqpLetqtph5aWYRmGgemiqYj6eGhY7cOoMKnKCsfx9AvZ7Oy3DYgtYZRAjSqUfvgLvvzVr/KNb3+T\n0VQY0o7vQq1w6pqqUKh1zNbmlO3tHZ3AHTCabPCXn/0rLMfFCzp868nvUNc1vbDPdGPClWu7FLoK\nf+m9L8H1XC5ffo4rV66QZ5nWr0vlcnKMPmIAACAASURBVPbsac6dO6fVAXKsTdOUspBWgmmZ9Ac9\nkVthkiSxqHRsaZVYlkW3G7K9s8VqteLrX/4yd911js3plCzLcM1aq3ogjhN8x6YuM6JkjWkpDFNm\nI8PBENNyKDXhUFWl5BgWBoUqME1xErr9PnUNSeyRrhPMGqK5LDSmaeD5Pr7jkkYp/U6XxLJxLFNa\nKVWBUckCZFg2eV4S+j4GNVkskthcFQz6HUZD+T6GabGztU2eF2RppBdhg7xQOK4r4DXH5ujoiO3t\nTVCKVGV4vocbhKSWTaUqKq9qNy/LNgj6LsvljLqqRd+crAlDn6vXbnD3hXsZDmh7wUqJUiiOEyql\nKOu4nRU17UfbFhu7Y9uEnS41tfZo5ORFgWO51MhpW+WKVLefHNvFcVzyUjHqi0+g0/ExDAsGL7yS\n9DtjVJZgmxaeK1V8kaa4npxglXZxGnWFgQGWaNYNu6KiBFWhqgLDMIVVVCvqSoiZhilKGtMQF2ae\n52AYVErpxV7aMJ5tUCILse8HuLZLlpcURYzvB6iyYDE/Js8yzpzeoROKK1OkjzZVDaWqQEkL2bR0\n7q/6z8jE/P/ysm0bpV1K2rEgQyG3Q55mgEknDLECl93r1/kPn/wkP/mWt/Gy+14KqmZ3b488KzEs\ni26vS9jtim4ZgywvcD2P0XjS2lqXyyXPXb5CHK+ZTqds72zS2OqXyxVFXmLrhBQwdF9VsX9wQNgV\nCE5v0CMIAr7z1JOEYUCSxNQG/N2X/g7btvkf/tk/w3dclFaD2NpGbun+ZlP1NWEVz7+aPldd11S1\nDAQFHFS20iugtZjXlQzwGhZGlsrgS76fge8FFKUMmMS0JANaQa9WlHmO57qCGrVMHn/iO3zl0a8w\nnmyQFTmqrrANE1UoLMNguVxx/q7z7OzscO7cXdx330u4eu06g9GY9//C+/n6t77FweEhvh+wWCxw\nRi7HJzPyNMazHTzX5bnLlzWZruCuu+7i7rvPa5lfj/Vahn77+/8vc28eZNl113l+7n7v21++3Cuz\nVpWkkkqlkmxZsi0vwpa8DGKxaYwxYTOMgwgmeogJEzM9MwQEgQ10BG2M2bqZMTTtNjYMDGAMEosF\n8iJLlixr32rfMqtye5lvf3c7Z/4459x8pQ1iIjo811EhRy2ZL9+793d+v+/vu1zh0UcfpdlscP11\n15JlGYuLC4zHI8ajMYnQ74nj43seQkC/31MThWUxGI5YW1+j1+tx49Ejiu87HBL4Pv1BjzAMSdIE\nx7WJol0bBGllCAFRFGnKYY/heIzvqyW354cT01FaUEpFnrO6ssrevUtMN6cUfKc7Tsd2SNMMy7YZ\nxWM2NzexLPXQ1nTCTcliN/3cdsnSlDxX8NhgNGR5WcUUWhZ0dzqKKmo7yvPGVs9NlmZY+uAPAsVH\nbrfbTLWaOGMVxjHsD7X6URUFz1PqXYX/OpSiUHHxgVTkBL7PqVOnuP22N+okpoqGGSSlUrmANRIt\nk1f3akqv11X8br2DieNEd+Y5YeiDrRK5gjDEdSwsx2W6VgNpMRorLr4fOrTbmwXnXP1XcvurPDf9\nQZ+SF5AmsbamVc+DhaLzeY6L5RjDObAciaWUHUiRY9sS33GRUuH2Uqs+kzghCH3G4yFC5AXpwhx8\nBlcPggblUoT0FHnCHFCu62FbMB6PaG9u4Do2c8t7qJQjxnoqgd38311bXlGgEZNss1eto6/7p/+N\nrygMVSeol0NxrHma2jJVau+OUydOcfOx41TKVYIwZNTrs3//ftI0oz8YMI5j4nhcMBKSWAka1tbW\nCt8LRf9rMRpFSAQnTpwovDGazSZhGJHEaQFZDIfDYoOOpZRhGxsbejRWnYNipDzLe997D8eOHSvw\nSPOBGGtLM35PQiOvdhnGDFB4PE9K6ifplSaFxXW9gg4ZahaBhY5jElkhbU6SRIskHN2xuoR2iVwo\nz5QsTnn424/QaDSKJUwpjBj2OyAEaZ5y5PojtFrTHD9+nDCM6PcHzE7PcO7CRQ4dvo6j1x/h4sWL\nJMMhS4sLyv40FywtLVGvVBgNB/Q6MXv2LBbK1pWVVbBtylHE3Nyc9u4ec8stt1Cv1bAsBXecOnWa\nVmuKSqVCZLk4js3GRpsXTp7URVFNVmimxWg05OjRm3BDj+5QQUnxMKZSrjBOFY3Otm2kpTq0PMsR\nMsW2FZ3RfB6+p6K5hBC6QBjaqEOtVqJeK7OyskIQeNTrdbqdTkEvA83V10v5PFfhAqPxkMFwQD6U\nSNSuxXV9giBirL+HZVu4QC5yLct2sG2Haq2M74VKgi5TQJDnmbJwtRwc19POfwLbcjlz6hSNZoNS\nVFZhII5TBFggc7I8xrZs4mSoMma1SZbjOiBTFhdmOXf+LIcOHVTdvusjtcVAngvSbEAuUn3/eThO\nUBSiSVEdAFIyGqgFcpIkdIfbSJR7ZhSW8AMFzTi2h+86tFqt4tmY1Im88pIMBir/Mh7Fyn3SVXXA\nuBxalg6EcV3STCX1ICDPUhKRgRAKipfGy1/BkINhD0D7JanD3dhoTE4clmUr50nXVR7xjo0feMhc\nsLMzIEkSZmentTAwRcpdBbpp3CbFepMw8utd37MCrpgfGbZZxnmhMv4ZjghKEbkUCCTjoeBbDz3M\n+9/7XvbML9Dv9UjHMeOxwgnrjRozfoCQgpWVi4o7HFXYt2+uoJqtra2xsbGmKIalgD179rB//z52\ndna4fPkyJ0+exLLUUurQoUM4roUtHLrdLuvr6ywv71GQRp4roxkJ//B3f8/S0h4+9cufZKu9QaKX\nOI1aTTm6adEC7CaRmA/dFN+XX5Zl0Wg0ivxFI8k1S0gj2jGjlxGgmK7A8JyN4ZUJdzU3glHsKWVY\nqBdzY4Ig5Nc//WmmZ2cYjcc4jpoeut0dGtUqO1ubHNq/n1JYolZrMDe3oIQhSQaOzc03HeM73/0u\n199wAx/64Af5gz/6z5QCnyQZ0+12uXw54+x4jGc73HLzcdI0ZbvT5fTZc0xNTVEOI2zL4Zmnn6E/\n6HPs2DGazRbPP/sML774ItMzU7zlLW/RrIWYXr+jZfcJt9xyM6PRiEatTpqk9Po9Uo2/9no9/DBg\na7tdHFyhyBiOh7v+59LCwUEgKEcRWZYzGAx0dyQol0qUdCKNKUjKbG1Er6s8roPAZzDoMtNqsrW1\nXXxeBlZItH2tZdts7WwTBMriYThUS/jW9CxJomie8Xis1YTGKC0ki2PSCUtSREbou2C5xOlYf7Z2\nQc8T0iKKqog8ZXFxgeeee47vfvcJut0+1113HXv37lVUWsfRZmGNwuLB0uKXPE8Z9vocveF6/vZv\n7+Pg/n3KZ6SmQsaFsLAclLGTY5aaGSPt+20us98yC/haWSVKZUL5hBu/oOFoSK/XUSZwaU4uchVo\nrpufyWi/l1/NegnbUhhyY6pJksQMen2iKMBxTSwgGlvO8ANHH9iZWp7aFmkuiEdjskwFyIg8ZzgY\nYrvqmRqP1d7FWNIatgsopaxt27hS0Nd7p1qthmNbamLUOwnfV5myahkaFlRKuLqImwYQeE24tagZ\n3zMvlAf/ChtwbUcB9ji4gU+SZ+S2Bb6L7Tj81m/8LjOtaY4cOcJUrU4UBnj2rvNZHMcMxgoWaDTq\n5LlayIhckGohiOM4WuWW6A9jpOXX5s9tBlpF1e12C0aMKY5K8KHe7JdeegnP87j11ls4evSo7p4c\nxrHiKOdpWhTwSUdBg12D4jpfd+zOV7wvLz71DYDiYZgMizBLKNOJm269gFD0AkhKJTYxKUaT4igV\n7KucH4WU9IcDwijiiaee5rFHH6PebLC9rTxQsjTBtW221te4/vBhrr3mELe/6Xb6ccqlCxfZv38/\nuYm1SzPSXPGNy7UKa+vrvPjSS5y5dEGxfxyHzk6XRrXGnsU9+J5PngvNZ1cUtmG/j+e6zM3NkWYp\nL7zwPFEYsrS0h+lWi3Z7i52dHcIooFZvYewO8iwj0F40rn5QXUd5SO9sb3Nu4wpLS0tq+slyRnqy\n8nRRkBKEhrbAjNmW/rlSdUhZxiXTK6A+17VJE9V5pknK6uoqlXKVer2O5/nF5+L7PtIoC23lrCdE\nju3aysGw09VRajYSS+e+WloAoz6zLM0UbVNPksqpUWC7tqYRKodAldKjlJVC5Mg8Y219jRdeeI4b\nj97Evn0HtKgp0/eOrambmYYIbEMIIc9jyhWVxPPzP/8L/PKnPsmgPyIIInIBavq38FwP28kKponj\nuEXBNJRAE0sohECMJZYtNb0w07seAyU4+nNQfHFhOdjaLlcdTII77nyllP6hr92PFLsLVM9zCx8Z\nIXIsnbLl2CrXMpG7zI48yxiPR+Qix9M8dctSnTmAICcIQmXopqFJKdE/p6Ioepq26IReAdOkifK/\nkVIQBQHNZl0HpyjK4iSzctIWwzz/xevLc265/bUTeb6nLBTXtnEtG5kI/CBQIpUgIrWgMx7w7ccf\nY2Ntgw/84A9TKpVIhiO2t7cZdHtMTU3RbDap12v4gUcuBb1eV1OPIhqNRoFRbm+36XYVX3tuboZy\nOSJLJeOdDlcur1EqhwX1p16vMxgMWF9f18KREr6v8g7vu+8+PvCBD/DWt75FLdayTOOlaRFcGmqP\nDUNRU3xZUQiXTAf3aleeq+6vWq0WXG/zwRn83Bwu5gAzogXzy3zfwXCIr/1QpBD4nk+SqeSdXCrY\npFQuk6QpJ06eJCqX6PZ6+n0b4ToOm2trHL/pJiwJN990nPZWG+H6XHv9EV58/nluPX6cK1euUCqV\nQLqsbKzQaFSZmZpi37vfxdOnXuSJx7/L6dNnFQ2tUqE7GFCJJGARhiUNs+SKceC5rFy5TLvdZnZ2\njr17l7ly5QqPPPoo2+02b37zHSwtLbGyukqjoQ6baqWCH7hkqVLX2Ta0N9vs6MO3UorYaW8RxzF7\nFhcRWUK5WVfB0rnCzLNcFeIgLGFiycbjMbZtUyqFDIcjbNslHitVXblSIY0zpqaaCAGpa7OwMI9l\nKSZDkoyJY62MxSIValFfqZYoVypKSDVSqTX1eoNev0+9OYXIIcliXEf597ieTZomBS3v8uoqvZ7y\nUS+XKyRZgpCKL27bmoqL2rnkeUp/0OPMmdO86U1vYnFxUQmD4qFmWQgcW9+PDuSA4xh/EiUGy9OE\nIAyolEO2NzdptKbx3ADL9shzSa/XZzDok8S7hmC2bSt6o2UXE6fnK49827bxfA8std/JMc1IiMgV\nq2c8UiEf6nWFWmjj66711Z+bwHfp9kY4ro0lJEGglKJpkipPFilBCnLLRliQW5k+SFV0WbVcKlgp\nRgmJVFBlLrXvjKUwdVW7DJ3Q0hi6+jlH2ibYGI/lubLgqFbKxUSuYFS3gGRMs2aKtplIjH3Ga8NG\n6vqedeDf+tqXsYSEXGBJhb2NkhSvHJEg6Ccx//H//H3efPQ2FhYWiIIA17GZmWoV3a0KLY01v9XH\n8YJCXJAkiaKhRdFV3fRoNEIIiWP7xZ/lIi3oTkmSEIZB8XXTNOX82bPkecY999zD7Ows/X6/kGfv\nCmnyq7tgS0l6DR3MvAbz5zfe+s5XvC+nn3+kGD9fbrE7KaE3BVx9uMrDuFCfZRmOqyABqbtcKSRp\nkuC6iqWApeTatuvw0MOP8J3HH1eJ3qMRtm2RxjEiy2jWayzMzXHz0ZsQWc6+vfvoas+ZzvYOrm1R\nr9eL12y7FqdOn2JpaQkhJUOZK4P8+Xkef/wJkDAajtmzuKiMwTLlka08kCFNk8IHvlSO2NzcZGtz\nk/m5Webn5xkM+jqwNmT//n3Mzy8Ujm6dTgfPdXAdm/n5eba3d2g0avTHY2Uha1kEfsDMtDLddx2V\noel5mrJmWSRaFq9EX1qSnSsB187ODuPxmM5Oh36/R6YNoK677jparWl2djosL+1FSotqtcZoOMRx\nPCzHxnIcHcqbkqQJUUlJ7FWHn9Lt9mlv79Dt9hFZTqNR174gIcPBAN/3GA4HmBzPMCpR1TzzcsVY\nCKj7K0szkIpxNBj02Nra5NZbbyHT0+fkNGfUypMHvxrfdcHTTo5//TdfYX5ugcPXHdGCKbBsxZP2\nPF/pCyayKycpmoZyp6LWtMsgUgvKMmUTK4U+gFxdHBW27Fle0X2DeobedvcPveK5+Yev/DGJkFSr\nFaU4lQJXTyPmZ1NTRUaeZ7haqGTgIlPMheGPT9Qpwa5QzraMtYajf+n33Xiri6yYkNM0IQg8KqXy\nVXXP1IRJQ6+C++04ReNgpm3btjly89v+/9eBo7tAbNQyQUqiSplY84pfeOJJZloz3PaGW5FCRT9d\nvnyZ1UsrBL7P9PQ01WqFZrNVFN9MxAX5X0pFgu/1ekVG3tRUi1ZrhjzP2dnuajzKw3EVG0WNlWBM\n+++//35mZ2d533vfw/LSEr1eryjYJsfP3KimA/Y856rT09zMBrow8uFXu0zBVurPXW90U7jN15w8\nKEyEmTkkzIcupcTxNafUjPppShbnCsO0JOQ2//zgP3Pw4CHa7ba2sh0gs4ww8KnXatxx++3Mz80z\nHgx56umnufGWW7Ftm3q9xvmzZ5meni4mCsWYWGYwHHLo0CHWul263Ze4664baW91+I3f+A1mZ+eI\n45SFhUXSJFWCD9sFW2ID1TCiUi3T21E+LKVKme1ulysb6+R5zsGDB2k2agxGI+77u/tZXJinVIoK\nmEQC51dXyLOcje0tLZyStKamiKJI+7KXcCybTGaMhzo41/cJJpZItm2xurrCs88+R7/fI9QOdEeO\nHOHaw4eYmWmRak+WSEvZhczp9/oEga8i1BxbL8VSrdqzCHyVcg5SR+Ntc3l1jdnZOVpTU/S6fWq1\nepH05PkqxxLbYRgrmGr77MUCpphpTREEIbOzs6rLdl3CoEyvt0MUKd8eUwx8zymaEiwLz1UBwmmy\ne29anldQBcFiPE44fOhazp0/z42uQyJzyqUSO9sdSpUqyBxLekryr3F/QOkDHIfA8wk9lbgjRI5b\n9kiTWNH6LAUcYSnIR7kF2vpwyXAAKQzvRUXNvdoV+C4ijXHsHMfVoeSOo50awdM7AiFs8txBSmWF\nq54x5Z9iOY7K22U3HjHPc2zXQgqU82Cuum2z08pzgeuqMBFQ05zQ0FC1XNbTd4Zt7yaPOY5Dlgmy\nbFy85wYSnWzQTJP6WrXCXN+zAp6LDJEpvNbV2Nk4SRR9px/z0Ne/wfe96266nW0ybUm6ODerTY2U\nZPXcufPk2pSmVIqwvQDHMd12XjAwZmZmVM7ecMSlS6tIQeH3qzDuMViqsG5ubrC2toYQOR/60I9y\nww03gMhJk4SZ6ZbOtxPUqlWGmtVhWxautqRMk7h44yc7ccNCmbSEffllFhZG9m8+WCOZN5f5ukBx\nepsOKkkSbMfGdlXX4Tm77JcgCHCkKorDeMz9f//3NBpN2ltt8ixFCltxljVvff++fczNz9Pr9gg8\nnwOHDrG+foXZ2VlAsrxvLydPnmR5eZlcKlGIwGW0vcOLJ08xt2eZXrfPpz75Kzz1zDM0mi3iJOWJ\np56mUqkRhWWEtHBsizhLiwXtaLNNmsT4UYnm9DSbmxtsttuILOP8+QucP5/Rbm/TaDRI8owjBw9y\n9uxZur1usdyt1Wq0pmdoNuv0ez0unL9AHMfsXVoiiCJc18ZhNzgkThIG/b4yIRoMuHjxIltbWyws\nzLN3+TYajQblcrnwgh/0+2okdl18z6VZr5FLSRi2gJww8nBsiyzTqe1SYdNZpsyihr0eJ186Qa3e\n4Prrr2XQHzLoD7As2NhYK+A0oUf6JElIM23M5IekqaK/rW+1abd3EPkzHDxwgIMHDuA4FtvtTU6c\neJED+/dRq9cIAw/HpgiwNgtyWy/jzMSXJglhqAp0uVwmSWJmZuZ4+OFHWFtbY2FhD6Hv02o1QKqk\ndmUSqLBjc3+qe1xn2OYZMsvIsoT1lSukWUrgugShj5LNa/qrZZPlyqccoOQrNpAQAiHzwg73FbUk\nyymHIYFe0NsaylKvQP15livYBEvZ6e529upF25by+Ex1w2XbVoFxZ1lGuRxoCqbmzjsOjmNpmuRY\nF1r1tcrlsm7ujEhRYpwfHcfTz216FRRq0uwNlPJ6jd7k9T0r4CLLcfRIn0sYjkdU63XiOOWbD34d\nB4el+XnKrqMXjzFZrjpTw9Yol8sgIUsV11Qp8yRJkunuu4sQuZY8V3Acl0q5SprmpGlcJGekaUqv\n36HT6TA9PcXtt9/O8vJSweLwHRsp1IbZdV1kntPTmLolQQgVaCqEQKCM281oZIypzGhl1JWvdU0u\nJM2DOzlimeI/GWFlLuVPHWE5FtgSx3LJtbeCmRbSNKXb7THOEi5cvEgYRQy6fTzPR4qc8XhEo1ZF\nap+Ira0tKuUKUlpKkOHYnD59mhuP3KBCW+fnyLSizXaVqdTeffu4cPEiv/s7v8eV9XXAZmF+D+3t\nbWr1BjOtGa6srXP4msM4uuOybJtMCIXPK9s9xvGYjQsX6Pe6jJOY6dY0UalE6MNUq0m31+PsuXN0\n+wNGsdr2K2VoQKPe5+kXX6JS8pidnWVhfoEszWj3Omx1tpmdniHUHh7JOCaKQmZmZtje3i7e78OH\nD+sFlc1wOGQ8HlGv1UAI4tEImeV4vsfm5qbiNQcq+3J7Z5tGo4mQamHnuVrebSv73SzPOXPqBMvL\nSzSnWuxsd8nzlCj0GceKv91ut7Fch4uXLiGEpNGcYn1jCwlEpSr1eoOtjStYMi9cHl986QTnL1yg\nFEXceMP13PsDP4jIUy5cXOH6aw+RasaK8SuZ9NExFrW+7/PAA/9MqdQkCDzVEDkQjxNGgzFrV1ax\nbUXRK5cqCCHBdrAdu7gnjV+M8jBRRdMPFPRTqoZkIsW1jBlbiuvUieMEKSRRVEHkOf1ej2otRJ97\natn8GsZO5VIJicDWHtraXFRPBMZGQDl0SiQyFwipuu9MTw2T74Ft2yCVkE6FVYSMx6r2VCoV5YmU\nG49zBacIIcgzQbNZx3YUXCbE7nOsnlUQIsGdMKoy39Nc5nNRcXP2v8hC+Z4V8FJUIs0FmZQICVGl\nzCiOaW9t8/xzz3HXO+7CFrC1uYEfBFSrVS13ltowRtG1wiCiXK7QbPrEuRIGjUbKwGrfvv34vsvl\ny1e4dOkS8Tghiiq6w1Wn3okTJ9jZ2eHoTTfw9rffycGDBwFZOBgGocqH7OuQ5clCqjjbdlF0zQiU\n59mrjkfA69IIYbe7Npg27BL9DV1wEhuf/P+2raPePKeIvLKxyKVgZ2eHcrmqxj8p1JShBUOe52Mj\niFNlJl+KSrzxjbdw9IajbG5ucfrMaZaX9pGLnCgKOHbsKC889zyLi3vwPI/Tp09z8JpDjEcjpmfn\n+Po3H+ILX/witWqLSrWmFkNS8s673l2oQLc2NnnsscdoNRW0UWrU9Gv3la2mbVNyLJIkRkhJKjK6\nvS7VWpXhsIeQkjve/GYOHDxEEIZ85jd/E9tx2Wy3cT2PnV6XwXAIMuX0hYtUymUc26FSKjHVaDKO\nM2ZmZqhWKmTATn/IysoVPYVtsn//fjY3N5lqNtUS0XMYDgacPHFC6QNKZUpaPu55Pu2dbSV2qZZ1\nVzYqph4VWqBYFqVyyMaGop0u71lkOBwzPa0yNB9//HFAqSiPHj1KfarJBxYXkbajgpiFxPUCVlbX\ncFwPmY0pBS79fp/Lq5c5c+Y06xubBL7HxQvnefLJGW6++Sbm52Y5f+EC+5YXi/vJdJHGI304HLK2\ntsaZM2d4z3u+H8eukGax5jM7LM4v8NxzzzI3f4RKqazzUSOCMAQN4WVZridMFTKhbIt3vXssCywB\nvu2DJZDCmI/lVEslbMshHiU4lsXc9AzjbFA8D6aovtplMHOgwNqzTEFAlu1gWyCloXYKZAbY6pmR\nuaIrm+fKPEOm847KZYTIabWmCjjWWBAY1ot6DQ6B5ynhVpIgZIbjOWAJhc3ngjTNGY1iRvmYINiN\nlFROkt5VwTamOfuX3Ai/ZwV8PBiQAZbrgusyHA6Ik4ynn36K1tQUiwtzZGlKqVTBti362vg/iiKd\nV+kW6qxuv4NtWcS5RbVWxcuV3ePWVlvR/4CoFBGEAWCxvb3BudOnqVYrHD68n1uOH1f/znNJxiPl\nFOY6OJriFKdjqtUqsMv/NGwEIRX7Qam6VNea53bRKU9i8q8l4DGXgVfMh2ZYK0acY2lBidDLGctW\nSjLHcXFd9TD2ukPVDbkOMhdYEjzXo1ark+oFk+N7nDxxkrIf0h8OVM9iW8TjEVONGtVymeXFJfr9\nvgppqNfpD0YIKdlY32Q8HLOwuMBWe4ul5WWuu/F6rqxvYNkuf/THf8KJk6eIyg3cqE5zZp7WVIsg\n9EnimKgUgZDs27uf6669Vo/ggl7cYbu9xZW1deIkplavUYpKBJHP5uoFer0dLAT1Vpnvv+se5ubm\n8AzjR+S8+Y238tDDjzBdr9If9BnsbCvDqzxn1OnxW//lN7h4/jzDwYB/euCfePjpZ5CWRalSYX5h\nnlKlTMP1WdyzBO02Zy9cYO++fdiOw4XLq2RZTOQHzC3OKa/sJGa1u0EaZziWRa1SZXZmBte2GQ2G\ndC5vMugqL3K7HFFrNrCkJE1Stta3uO0NtzEcKLl8v79Nngua9RpX1td511130pyaYjiKIU1J0hGe\npVlbtsXBpXmwbSxLYCNIkjr7lvfw1rfcDkiuXLlCZ2eby5dX+dYjj3Dl8mUOHNjHtdcc4uabjzE/\nP0e7vanojI6F67usn1/Hdmze9/73aSiwr8QuZKQJhJFSsTbqDRW44flEpbLSLLhKWOW6DkLoJai+\nXw010TQztlZdm0MNlEVElgsgxwkUTp+IpIgIRCpxEdarQyhK7q4DgTWESm6BpTpuoamVoNWOrpLW\nY6l+3ZZg2Z4KQwZsRy2x8xwsHTC8s9NBShVDGMdxcQAaxkkQKAX2YDjAcWw1UWaqGI9GsW60LM2m\noZjSDVQyOQFMduQGTn2t63tWJNZbOwAAIABJREFUwFtTLeIsJbdt0lyClVFvTPHkE09yz913g9QJ\n5YM+zWZTc2WVIkqlmahOItJ4ZhRFEAteeOF5fN9THbuvMLFxPEJIBQ889NBDBEHAhz74QZaW9hSn\nXRKPkEIn0Y/y4g2VUmojm6sXi47jIJL4FTl/L6cHGY9vg4ObheOrXeaDmxTfFB8sisdqqITmawW+\n+tpI5RMeBgFYaEGOiy0kCHUTKyZERrVU5tlnnqVZrxO4Hpbn0O10qNVr9Lpdlm+7TfuGD3GcRPmb\n2yoIdnZmll6vx6kzpzh27Bgnz5xiaXkvqZD8/P/xv3Pd9TcSVupcd+0RLLdErVaj29shckNCx8O2\nbNzABQvSTJLrLX8Uhrizs+zdv59nn3uebq/H2sYG1VLIlfXL/NiP/ghHrjtMkoyZL0+rCWg4xPdd\n5Qi5uYlngUhjkqES4vieh3Rczp6/wPrKKtUgYqbW4MVnnwPbptKo0e336fYHbHR2+PaJk9i2Q73Z\n5OZbbuXE6dOsXrnMVLPB7MwMtVYTy3W4sHIRe5BSKZUJbYfZ+Xk6nS5jEbPT6/KNbzxEqVqh0+sq\nGG6nQzwaUalUeetb7yQMQ2ZmZ+j1ekpcFjbVPZMlTE/X2dq8QhIPWVxcZqfdpjU9p5bycUzcH+GH\nAZbrMBwOMD7vZsHtui6tVpNms86Bgwcole7m1KlTfO3Bf+ab33qEf/jqA+xdXuIjH/kxHNsmSxMe\ne+wxwjDkzXfcARIGg6EKNkCwC+lJ3vGOtzMcDfVzpywnDM5tONxB4BaL+8l72uDNlj1hWjexJ7K9\n3eJsSrvM1VLTLIBfi1InESrEWLNqhBDkenkoi++tcWVLwYtSyiJJ0cICqYK7VaOkBICO6+l/q5as\nSsA1Lhox47xYrzeu2m+ZeuC5u8++oRoaeNS81izLGA5V9JpJn5qkBP9LOPj3jEb4yAN/wTCJCUsl\nhnFCVKnyZ3/+5+xs7/B9d72L0Av0QsXXKdt5sQg045L5/W5XRay5blB4n0ip6F+rl1cZDHpIKdi3\nbx/XH7megwcOkOjgYIMJGrP5STK967pqrNEuhuZmBq2u1CZRZnFmUnEM3jz5/w2WZaCVo2+46xXv\ny/NPfA3YDXeeVGAKIYoGxGyqDUY+SStUMmx109vKUw2wyAFhWwgLuv0BX/j85ynpRBI7UFi5LQVH\nrj2sTKcOX6O6iFxx9Cv1uhJtSH3zOQ6XVlaJs5yTp8/y5b/+G8rVJo2pGeYXlgjCEjiaqiUEtm3h\ne57y28BC5EJFSdlqWkhFgqKXZYyTseZSD9hpb1KrlPnQv/kgg36HSrnMqN3B0y54vV4PL1Cy/M98\n9rOsra8VQqZev088VnjvLTcfZ++eJZCS7zz+uJrGbQfLU8vzZqvF0lyLF55/iTTLqFTrSAsWFxdp\ntVp6DM/pd3aUl05Yo1wqkQnBeruNQDJIxgyTmOb0NLg2YalEr98nynPWVlaZm5sjCEK2Nje55ZZb\n1XJPKuGQSQe6dHmF0WBIvT7F9PQsnuPjub4y1bJtJX20JLlU76kRqRhYxNy7k4ttcy9tb29z/txZ\nOp0dLl06x/59e2lNNZluTXPNwYNkmvbnOq6OI9u1ckjTDMuy2d7eZmpqCinVcrBWrxdBCkb3MKlL\nAK5qhgzX3PyeEEIX7Fc2NY61ywox/739HT/8ir/3nW/+NZa1KznfXfIrls1kw6Rw5bH+e+bvG3hF\ni4m0VYBl29i2LOrNJCvETNaTkKqBpK6yw56Adsy/MxDMpOpS0S2zYm9miAeWZb1uqPHrduAXL17k\nox/9KOvr61iWxU//9E/zsz/7s/zSL/0Sn/vc55iZmQHgV3/1V3nf+94HwK/92q/xh3/4hziOw2/9\n1m9xzz33vOrXHozHOL5HmgukpRZjTz75FPfcfQ+uq1JY1A+jfEpc12M8HtNu7zAYKDjFRKWp5V2J\nvt7iC5Fx9uxZLl26xN69y/zERz5CqaxGn0qlQhzH1OtKGWUK7CTTY/IUjeMYkeXFIrDY1qcptqs6\nYcMvh10PE/OBxnFcfJjmw3ktfwNTuI1UvviQXKMs2z2RjWDASOPNiS7VtgeBxHX94vsmcYLtueS2\nxcOPPKz9PiRhFJIhiLOMwHPZ2dnh7ne9CwupFjwohs1me5vzF85TjQKuvfZ6sGz2H7yGr/zt/Tzw\n4DewvQpLy4exvYjp2b2srK4yNVOl0+0wNzvHoNcjiKrEaYbIcq1I00ubFNygTprGjMZd6tUmZzde\nYna6yekXnmffws18458e5OabbmJ2zyzR7AL9QZ9nnn2WXOQ8+LWv4WjfmUTbCGBZNKaabG3sUK/V\nuHRplXvufg+OhHd9391E5RL33X8fjz/xBPFoTL/T4YHnnuItb30bp0+f5sUTL9FsNhnGCSdOniLw\nPRzbZmamxbmLT7Lv+FGs0TYzrSmysksljDg0dZCVcxdYaE6zsXIZq59SilPacYfW3DT1qTpZkjIz\nO83ltRUWF/YwHo31wat4/nNzs3zzoW9h2w4LCwuEvhKMWAI1QSF0NJmN77pI7UYpshwbq/i8FbY9\nKPQK3W6PRqNOdN11ZHnKdYcP8sjDD9GoVtm3d6/a5+SCRr3OZrtNVN7lL6t72UYICsGO67o6FER1\nmlJKHb6Rv2axMV9r8jJc7Fe7JiGFyebp5Zf5fdPwFM+xVk1OTsjq2Vb4+O5LMYegzrO0FTFByhzP\nC67iz5vn37JUpNrkpGHwcyPeM3XA2GiYZ7egKOqao/J1RVHQkyQpfv1L1+sWcM/z+MxnPsPx48fp\n9/u84Q1v4O6778ayLD7xiU/wiU984qq///zzz/Onf/qnPP/886ysrPDud7+bEydOvOoYUCpVsFyH\nTr9Pc3qahx/5NseOHUMiWb28ihSSWrlSjBdpmjIcjcizDM/zC/yp0+2qpeZgQDwcEEUhfhBw/bWH\n+ciHP0StVlNS2TynFITILMWzVUSZbSsRjFkkTNJ4DEziOA5OqFLLJ+ELKSVpnhUJGpNGVUYQMfmh\nmQ7fsqwCZnn5ZYqyyYE0N4Hrusq7YQIbN4eOucnN6wX1oEtLIjOh+efK6EraFp7vcv78eRxLKQ6D\nMCRJY5I0Yd/SHvqdHSxLZRgKIZGWwhdrtRrHjh3DypXb2sWVizz0yKN8/Zvfpj41zw1Hj9CcnsX3\ny2x3RszN7aefdClVGvSGMWFUpTdM8V0X2/XAcpCuJJNqd5D0Bbbj4TohaZoxNzPL5vol4tEA8pTt\njR3+7Et/yvZWm/3X7GUwGBBFEeVqhT179rCwuMgbHIe//puvMByOkLZaYFWqVcbjmBfPvsjq6iq3\nveGN+K6HJeHNt9/BmTNnGY/HTFVqOHv38vRTT3HTsWMkSUZ7exvHUaPxoDdA5DmdTpcj119Pv90l\nSVJeevo5RJYzPz3LysWL1CsVrjl4EMe2VGSatNh76ACOq8Jvu8M+aZKRp+rzrZSrOLZTdHRXNta5\n5pqDXLpwiVKpxNLiElkuqNebjOOx9oj2yfKceDTGQiUjWZaatjLNhrJti1IQ4ujnuDI/R3t7m1Kp\nxHDYV/uFIOS6a6/FElIrGEP6nR6Nap2hzjOdHOmjKKRcLhXQQRyrKLZavaFpiWqBb3jSu0VSFr+E\n7m6LX5oPPhmnUFwT7JDXY26p6XZXKDdJxTO5kpPPjecFE99id+JWIkAzHSi7AlN8Jz31q9VqsQcz\nXbaZdCYni5fDPpMajkmxTrlcLv6NORwmodfXu163gM/PzzM/Pw8o+syRI0dYWVm56gefvL785S/z\n4Q9/GM/z2L9/P9dccw2PPvood9xxxyu/uG0RJ4lyIfN9zp07x9GbbiLPhfISsSVDrYw0p5jrumR5\nzuUrVzhz5gx5njM9Pc3S0hI33HADSwvTBIH2InZcpBS021v4vodtK8BLCFlk/pmCPGkcZX7PcGWF\nECq1FYo31+DeeXJ1UTXdx+TYZJYQpnC/HgY+qdo0hwfoLtVWUVimcJuxzXzY5jOJ45hc5Mo/3FYA\nitA3pOV6RaScG4TKmS1JVOjscIzn+7zlLW8p1HWG3pcLQS6V/3icpkSVCpcur/GtRx5ndmEfy/sO\nU65N4XhV4kwSlhtsbncIqq76nklCjouU4AUVsiQlxyJPUlzXBunguj4ij4miEiLvkaVjLJnxif/5\n35LHMc1aAwcl+gnrYcHIyUTOzk6XK+trnD1/nuFwRJrlDIZDms0mtuMjrZRGY4rPf/4LvPXNd5Kn\nCU8//TTHjx/nIz/2YV548UUe+85jOFhM1Ws8/cQT3HDDjbwYJ/S3t9UCW6iF15VLl/n+976frD/m\nq488wJtuv50//pMv8qaP/w8MOj2eeeFZvvrQNzh4zUH2HthHnMSEp59DJimubTPVapElqiicOX2W\nd77znVTKEaPRmEFvCFi61Ek63R1mZ2Z0R5cAufbZUcrVMFA01tFoVEyIeZZSq9XI8txAvCSJ8lyv\nVCokyRjPsbECnyltYiXynCgIiccxnuMSj8c4vl7oTSzY4jimVFJiqHJZpfWYAuy6tmafwG7BRj93\nppBbVxU5LFFQBK++do2drir2r9HZ7xY6NSUUDDCUL47UVF8wXb1xARQT3b/Ur9Uk+whcFzwdXmG6\n70kHQQMXGfjLdNTFwnaiiStqia4LkyLASXh1su4U7JvXuf7VS8xz587xxBNPcMcdd/DQQw/x27/9\n23z+85/njW98I5/+9KdpNBqsrq5eVayXlpaKgv/yazgc4vgevu/hWjbtrS1kLsjTlEzEVCpV0iQl\nHseY7L5eT3k+T01N8UM/eC+tVoupqaldrC9VIgXbVvQz13OoVpTfRpxkV8EYWE5hsWpufkPdK3Lp\ndDEWmTr9jc2osWUtlpkTXM9JSbH5UK7CsScK7ssvc9qaD9/ciGmaFnLll/NGzag1KRCyXR3HlktE\nmml7UBdsm3igJg7X8xiOx3iuS3/Yp1qtsNNuc+Kll/Bdj/m5WcIwKPwfpFDmYNL1SIXFX/zVVzh0\n7VGiSpOw0iTDg1QiLRdbWNSmpknzPlkmCMIyWS6oVOra30XdeFGlQjoeIxFImSGl6kxHww7nzpzg\nv//YjxO6Fp0kpr25Qa/TJ88ETsmjVCoTRiWazSat1jRzC4vc8Za38tyzLxBVyqyvb9DpdIhKZbWU\nK0XsbG3zqV/5FQ7sO0gUekxPT/OlL32JT33qU+RZxv1fvQ+R57TqDS6dP8edd9zOE088QafTVUwf\nx2F5cZG11ct87duPsL29jXjmCd73Qz/An//VX/Kxj36UyysXGXV6/E8f+zg3HT0KUrK+tY6Qklql\nSqPRZNhXobdPP/EE337kOxzcf5CZmVk21rdp97a4vL6KzAWlSHnOGy8O13GxbFQCu+2QJGNsqXy9\npZAgc+UxnsYq/CNOcF3FXhn0+8qmWarotW5nh+uuvY4sTYnKAYPBgFJUUpCOYyO0OjOHojs05lyB\np9SklUoF9AFtWWrJjlSsLCbwc1NMi44eiW0p0yqp/6eej92gbWMfYZ6F11voKbqmr5+5XSsLV38d\nNf3apKlaJlqGjmg5mhFjnh1JHCtzOqPKNIrYLJNUKo0CDVDKzmxCYQ1xnF3lQPpyGNTUg0l4xVwG\nQjHF3FhnGMLGa13/qgLe7/f5kR/5ET772c9SqVT4mZ/5GX7xF38RgF/4hV/g537u5/iDP/iDV/23\nr4Vb1Wo1xmlClib83u/8LvFoxNNPPUmlopKawzBkdnaOxcUFLV9VhbFSqaobR0uRk0QVBCkFIovB\nBs9SNzqWct2zHQcHtfwTuiBatiqEJo0+yzLG43ERDGxed5IklKNS0YGYwj1ZMCdvVLVM1QEB+gAw\nnYTJB3ytDnyyOzGneXEwuB7S2r2ZXz4WmtcshCATOeM4VpiorR7gDHWQmG4h11zrXB8+YamMyAUf\n/ehH2VzfIE8T4tGYNBdstreYnpmlVK7guBG//Ml/j+tXqNanCSoNLCfAdkJsV3GehZT4jkMmLMql\nimISqAwJjEui0OHKaJWaSIdEkcew32dz8wo/9VMfw7MFrmMxNz+La7mMhjG+6yMcW3WLgY/juORI\n4jgDK6bRbJHmOdPTs1y4cImt9g5CCGqVKv3hkAsXL/H+7/8BLl+8wK//+n9gZeUSv/qrv8rb3vY2\n2hsbHDxwgPPnLzAz3eLC2dPcecftnD13ltOnzhD5AdISOAhuOn6Mr3/jG5y/eIFKRUXn7WxtcfOR\no1w8eZZPf+rfc+ymm/jwh36U6uw0aZ4jcli7so5t2YR+wO23v4UbjxyjXC5z/vx5Fm5ZJMlH/Ncv\n/lf2Li1RrVbZ2tqk1ZpCyryAc/JcOedFfqDyFLO8MEoy918yVruXVP/9cinCcW0yRyl0K5UyYeAz\nHPTxHA/f9VQIsOvhBz75xFJxkl0RJ8oGYHNrA9uxtK4hYjDoI6XHZDiwMYcqGCiWKqSG/ns1fmwh\nX8bznlwevh6ubl1VhAG0FD7b7Xh3n1MlLrJt8zwoAyrbQScJuXqSsIpibeLihFCWHuOxohWbztw0\nXkmyyzozcOjk824gFENBnFxsAgVrbfJnrtVqr/lzw7+igKdpygc/+EF+4id+gh/6IWUko6TU6vr4\nxz/OvffeC8CePXu4ePFi8WeXLl1iz549r/p1P/s7/5d6A3yfW289xk/+5Ec1o8ItsvUApGaUOI5b\ndMbodIzA84oRTUEKu1BCLiSjfp/BYEgUhVdBEzkWJgvQfAjlchnjRGeYHYamOOwPXkH/yfMcy7GL\nJaIxwqrX63pUTej1egWubvy5X28sMiewCSh2Xbcw3HJsR8W3aac8c2KbE9/cREEQ4Nk+qcy1URhY\njoPvOHQGfXb0cthgrmY/EJVKuI5V4HqerRLrXd9m7969JGnGCy+8yFMvnGUwyth/zRFqU7MIy8cJ\nynQ6PapBRK+3w/T0FJdXV7jm8D7aW9uEQUie5viu9lAWOY7lIvMY17FwPRvPd1lfW6G9eZkPfuBe\nWo0W3c4mSZLjBGr5KiwbXE8VrED5x49GMba287Qsh2azxYNf+zoAluUq9ovv4nkB1VqN02fP8J/+\n4+9y0403Um3UuW3PIs8995xawkUREkmajdm/f5lz587y3DPf5ebjx6lVS5w5c47NrS3OnDnB3j0H\nODK3h+dfeIGzzz7HB9/33/Hlv/wL3vGOd3D98Zs4cfIEX3viUR569rv8bz/3v3Dj9UdUgR0McTwP\nz3EZDoaEocpMXF5eViyOSovVlVUW5xc4ceIE+5b3MhwOqWi3S8tSLo4Si1zklMphsQjLhRq9h70+\n5XIZB2cChlDq58DzSTN1f/uez9hx6OjJ1nVVIWc0VNS8iYW7elZdSmGFwWDAzMwMOzs7zM3Nc/bs\nGfbv31+kPeV5VhRCA12YLtV0x6aAqWWehRBWcUgYGMLS+PVkI/Naz83kVeyILBvLsotiagqpbTlX\nTd6OaxW1zgSWF3CmtcvmMa9BBYaMrpqkTQNlOufJQjxZyE1dMaQHM8Wb73HixAlWr2zw0okzV73m\n17pel0YopeRjH/sYrVaLz3zmM8XvX758mYWFBQA+85nP8Nhjj/HFL36R559/nh//8R/n0UcfLZaY\np06dekUXblkW33jg/1HFzFL4kB8EhRRZ7R4UhiuyXBeasUpq1+yJwrDJUTdMkiR4vnELU4kpZqlo\nbhZTQM1Y1u12ixPWnLaGU2uKOUCeZldhYAZmidOkcBYzOH0cx4RhWMAtZhQcDoeFAlNKyfHb737F\n+/3Ck1/HyLYnX6uUUpMBX3ljTC48zJ+N4xhcZdVLLhBSIm2HTApOnj3D395/P+UwQqRKeDAaj5mf\nnaVRrfDxn/pJxoMhMs9IsxxpqYRuFRYb8Jv/6Ytc2Wxz081vIBUuXlghySReGBHHY0qhCnJoNhr0\ne13AwkYFygZaZek6NkLExPGQIHABwcnnvsvm5jppMubWm48ic+XmlqeZVvPZhWo01lxkCwvbVZmL\nYGE7Ls+/9CKdjlowrq2vE4Qenc4OS0tLdHc6LC8tcurUKTzXoVlvsDg/xw03HEEKyTe+9QCVaoXO\ndpuZmSm+/cjDHDp0iKmpKa655jCO63Lh0gqrq5dplmdo1BskaYq0YO+B/Tiuy1PPPMvWTptz586D\nrYqsk6S8/c47+fCHP0ytWsPzfKUr0N7byg5Ww3uRx1/+1V/S3tqgFEWUo4hbjh8vCq4KA7PIc7UA\nG42GV+1sDNXW0PpMM2BhkSY5tmuodMq4Te2fzjMYDLh0aQXX9XjX930fyIlFoL6M7S6ofzcaDen1\n+kzp+MGyTtIyUJ/pIl/etLwc0zbLQ1MbzPMp5a4rp2lY3njnD7ziuXn063911ZKz+NqWRZYZCMUt\n3h+RCdIsLRTTwFVwqCq26ueRWAU12RRwU3tMbTHNHexOzeY9MM3eJDxioFxz8ExSPc10D+pA8X2f\nN7z5Pa85gbxuB/7QQw/xhS98gWPHjnHLLbcAijL4pS99iSeffBLLsjhw4AC///u/D8ANN9zAj/6o\nMoByXZff+73fe00IJcsyxqMRLW3W33AajAwvtvhQJVEY0ukMKJVKpFnMYNi7ymM7jkcF37o3HO12\nx/rNMMZWQggyacYsi2pJObXB1RxNs0AwHW0URXgVt1j+mTGnXC5TtitF95NlGdWqysw0BwfsepsE\nQVAU2td6T3q9XsEBNRSlArZxVL7m5MMgpSz+TbfbVWG8jQZRuUSSK1c0tNE/lpbZF+9JSjwcARZo\nhVm/3+dzn/sce+YXKIUBjuNSb04RVUrUG00yYfHIo4/zgz/8b5COh+V4JJmgMT3LuXNnmZubJR4P\nKZVCVlYvUC/VKJfLDIcjvCBkOBwQeC6WqxRuUeSzdnmFx7/7GKGTsLG2jsgyHmxvsX5ltZjEwjDE\nspVfN7bF8ux0wYFPspxOt6uVfBZ+FNHvDfACM5mkINVh3B/0eenESbIsZThI6Ha7PPPs0/zZX/w5\n1VKZsObyzne+HUGVJE24461v5sK5c1RqS3z3qcc5fO217D24TKkWMehkXFi7xNR0i4WFBXpDlST0\n5FNPEY9jIm2KVSlXKFcsHvv2wzz+2Lf5d//rv+PYsZvZ3u5SrVb1ZymIk4GGIoYcPHiQ5559hqU9\ni/iuiv3L85xeT+0ASpWKgpMClzD0Nfd4jOu6DId9QGVOSqlShWwbujtd6rUmQmZ0uh2mppp0Ojts\nbGwQRCEPf/sRPDfg3nvvRUiJO6EtUIs21ayY+3E4VCrdPM/Z3Nxk37599Pt9oigqDLMmL1OAzPJ5\nVzK+292+nC5oQqqvWny+yiWEKCZRc3CoBbzigpsmynwfZeDlaHLDpLEVRQRis9lURdXe9TU3r99A\noyZFfmtri1arRZYJtre3sW2bPXuUSLDf79PpdJQidwLHn2zAzOFhJhAD5UwuOF/r+p4JeR6474v4\nvs9wOGR6erpIwjHbXdA/ZC4LBzGzncZSQhDb0V2JOdFtiyAMiu45z3IwS0SU3zD6v3mmIBrXUYsM\nCwvb2eVYgzLDcT2PNEmLRQmaV+oHvjIrQi0IRa79jicOA/PBKCqWXXQTtm1zwy3veMX78tzj/zTB\niFHwkDA/m9C/MEZWtu5UnGLkDMMIkIzjMbajOl/Pc8Gyle+MyDm/ssrf3ncfjqU7AiEY9LvMz80S\n+S4/+2//R7o7HRwLRcFyHPrDEQKbP/m//5wXL/Y4dPh6qvVZLK/EYJjiBT7j8QjPsymHqkOuVspk\nuXKFS5ME33VwHQvHksg8od1eZ+3KJc6dP8M4HtLevKIWtY7FqD+kWa/R7/eKhWsuhToERiO8dKQO\n+TzHdjwl5XY9sjwrPM8t22E0HhOPh0RhxGg8UP7orstoNKIUBTiuS1SOOHDwgO5SU1pTDS0Zr3Hp\n4kUcz2H/vn1kecbG1hb1RgPbdujvxCwvLfPoY49RqVR40x138JW//gp3v+c9/OM//mORj1guVwgs\nga+L4dbWFm+9807uuftuWq0WcayCpU23mqI0DZ/65CdpTTWYmWnxpjfdRp6mVCrVgsMcx2pCSfME\np0iysVR3nySkWUa5VGY0HjEwfPAsx7IkfuDT7/cplSKSOOHpZ57h/IXz3P3ue6jWqgoGkFq1KCW+\nq6ZP47o5HA0ISxGD0ZA4Tuj1VdGbm5tTdN1SWXezu0tJQ/Yw5rC7NMJddoickODbtoPMNIvFknrR\nLbntba8U8jz8wF8i2GWTFJg4quib59dxVdCE6++qJo0t73Cg7qlGrUa1Wit89Q2dd/LwMAeQoUua\niaFarSGl2s2Z6X0SDk1TFSO329w5KL8Y5yps3NQMc1Dc9tb3/3/rwP9bXuYNqdVq9Hq9onibUdC4\n8GXprvrJ05athpsKQGnXDCbJYuLRbhdueJa2NqtxbB1VpSPDarXaLg7nOAz6vWKJab4fUuB5jl4i\n2QXEEgQB/X5fK9dU0ofrusQTwQugsUPPxbZ38e3X+jBMN5Kmib6JPZ2aonwbHN8rfu5dibNOMxKy\n+N6BHyCl2pDnIkNYeoHoupSiSDmtSQCXONFBx1mO9By6vT55niIti8FoTBBGCCykZbO6tka1sUBY\nriAtl2E/ISxVGY2GTDWm6He3sYQkdHx8y6cz6lOplKlUyviORTzqEXgO//z1B0GmbGxeYaezQ6/X\noVSJFNc9SUnSmMtXVnWXHrG+tU6tUWOzs8VwNKaUpeRCEJUihqNY/fx6Wd2anqZaqel7RKiOs9Om\nUavR73SUFDpN6ScxmcyIxhVwbOYXFqgFPlFQ4qUXTrDwxj2kCRw4dJg4SXGcgLk55Qlv24Jqvc4L\nJ04QRBHSsjh79izLe5fZXFvDtSxK5TJBoBLvHVRghO/7VGs1HnzwQZ584gnuuusu3v/+9yvHQyw6\nnQ5+FLK2tkEYRlSrdcbjmCRNlR2CVGn2rqPUgu12m16/SxRFzM8vIKVkOBwRhhFBUObK2hWq1Srj\nOCUIMkql4Krp1BweNvAk2K0/AAAgAElEQVTjP/ZjBUTg2Ba249Db2UEkGVHVY9hRaVdpllGuVojH\nCb4fUq01aDRS4iRhS5uADQZDct1tqpBfF2lra+UkvQrrFlKl80ipgh1UuIONJQRWYpNayiNFkOsw\niFdenhUQyxGO7YBFAYcKIXBsGyfc9R2xLItMmCQtVUfOnTvH1NQ0B/buU3sxLHIhGXT7OI5V7M52\nn+ddptkkoWF1dQXf93UH7Wjnz45u3NyrDgy1jBZ62t8lTCiBVICUhhP++nX0e5pKPwnwm1HNLOhM\nkYxC9ypOpaHtGHjEdNsq0CEtIIrJYg+THsWqO67VakV4rRHhmDHJdMrmJDSnsBnDJuER83MY7M4s\nJyYFPEoklFz1877aZZYqBoYxr9d1Xe1mp/xIsmwXojGLVWVopQOQRY40Fq+2SuDJpMR2XALfZzwc\nKUaJTudJUmW/G/ieWt7YFpcuXWJmRtm+Jplkef8B2u1tlmYO6oKf4bge/f6OpqVtUSmHuI7iMeci\npl6ycO2YbNRjbXOdzY01zp5+CSkydna2lCcFGVOtOmHg49oW1VKZozdcxxtvvYXA90jTjJ1Oh1Kt\nQr3RwA9D3DglLEVEUcRoPCYXUCqXiJOE//xH/4XReMxgMMD1fQLPJc8ydtrbfOgTn+Cdb3s74/GY\nSq3CYNhXTnpScv8//D1f++r9NMUU8wsLxEnCgWsOKQrqOFaxZ406UtrkQnJxbYXNzU2iMOTee+/l\nvvvu413vehdf/cd/LKAGE4sX+R5YFMrf5eVlNjc2+Lu/+zu+/OUvE4YhH/zAB3j7295OnGVUKxXm\n52a4cmWVqBQq2bVtWAsWg8GIZJyQZYJGY1rDFhmO7eI6Af8vc+8ebNl113d+1trvfd732X1vt25f\nqfVAliwZWVh+YeMYYxuCAzNAkkoIyWRIpYrKpDLMVJIaMo9KxsUkAwUppmoyU0xgUoE4ZMYTUpAA\nBsYQbGxjSS2ppW71+/btx32e537vveaPtdc+5wq1Mv+kxK5Sud197j3n7L3Wb/1+39/3+/1NpzGu\nVxEELZQSLC+vajpclmgjrmiGQMOYx8fHICXT6QzH0QmIqRJd38cOJFlVEfR0Zt71umR5SprEeGjv\nDse2KLKMsih48/JlVlZWNPsIQVWUVIhm/3i2o/npcj4JqCx1r8XEgUbwAtgCEFXtnPn2EEpexHih\n9vbXk+h1tS7EnKFi/Ehs2wah1c7mEHn++Q9o1XScoOoRda7r1qrtuDkMFjUeRtNhEiqlFGtrayeY\nXoseNYsxwuDoi3i3lLLpmxmYxkC273S9qzMxFxsWi14kJnjatk2apPXJLKiUhVLV3GtYFVQlIASu\n5+DUX2eRP7qIOS8G6ThJGq7mYnm0mO0v/v2ir8EiZmZKH3NgmAzbvL+pDiBrmksPUpUZ/G0RC2zw\n+PrQmi9wq+lmmxM7SWIsy64HCWg6l6q/d6EUnh/Q7XT0JPLBEsPhpF5MgqwoaLVa/MIv/AIf/tCH\nWF9bJYpjlpaXUUJj8INel6rMsWRFls4olU2/0yds28yExBIZ7TDUXG0J+/fu8I2vfwPHFkTTCcPh\nMUWearjFs6GssFwHyCmSjFkc8xf+7F/nycceZ3R8hOvanHtog+lsxnA8oswiDkZHbCytk8TabiCp\nR8Xdv3ef3qDPeDxGSInreWR5hufqJncYBLRaLXZ2dnBdh9HoGC8MSLKUoNXii1/8Io4smSUxpzY3\nmM0iLGlRlBVXr99ASos4SllaWqLT6bC8YuP52kP8xq1bPPvss+zu7lLWgWppeQm7VljaoiJNY+I4\nqWdwOpzaWEeVmnsshCSKZ5SqoCgqjo6HjXWxyZh10uIwnc5wXQ9FTlVJbMvHdUKKsiDNdBO92+1q\n1Wbd0I9mMUHgEtfDv0EyjSYcHx0RxTGzKCLNMsJWC1kWDfd4Op0ipGRtfY3ptO7PWJAkOoOdzWZk\nWYrnOnVfKOD+/f1mupPeExZFqedDVmUJjlPbtxaoipPwhLTqoGugUg2xVDX89yBChm3BZDJq7pNm\ntcxVn9ooKmwC5+17u7pXFASEYYt79+5pX5sacy+KuYCw3Q6beJBlWTP83KgvTWA3e9HoSQzteJHR\nZiiHi722Rb2J+fzGC/ydKMfNd3/Hf/2PeBnOtfnQpjloPrx5jZQS39HsDfPFtdLSasysRK3+MrL4\nE5Sh+nctGqWXpR70G6Up4/F44bTVi3+R92oWovmM5ncZEyzf9xsKYZpqAQXMmzZmIXQ6PaIoemD2\nDTRNIQPjLCo7FznselFKFrnlxkRHKe3h7LlzoxwhBI60mM5m9PpLSAmz2RQhNI3TEm2yVDfBkjjj\n7EMPkSZxQ+OqKq1ofezRRzmY5tgqpxt6KBxQEXd3dji7uc50OuLu7V2uXblKPIto+xXPPf0wf/pP\nfw9xnPB3/+7foSoyuh2PNE8JWqFmzOCwstTnL//I36TTCkjjKe12wGw64fr1a2xtbdFqh9qEXylu\nXLnOxsYZkiSh2+vh+h7tdpvXXr9IKww5ODqi1WrR7/eJZzMc22Hv7n0e3t6uM1m9edIkQVqSvfv3\n+cDzz/PKxZfIq4qj0YhWEHJ0eEQYtjh//jEEkl6n26zbAm1g9tRTT7G7u0vo+3zzm9/k9OnTDIdD\nptNpwxdueVou3ev1TlRxju3geS5JkvIvf+Vf8tprr/G3/85PYDsO3/3dn+En/t5/w+OPP34iybBt\nh2gW4zgey8sdXM8nSRJmswmu69Dr9ZjOJnM4LsuwHZvj0ZBZPOW1N17XlWee0et1mU612ydSsHv3\nDq0wxA8CkjjGsm2mScQ0iZlG2gc7SCICzyPJ0pp1orWjYavF4cEBm2c2GB4fs3tnl0F/wGAwoCj0\nIdTutslyPbihUooKPQ/Xsi0tqqlphvMxanpIS6kUAk2lfbsrTsa4gR7+UFWKoiwoixLfD+pqet7Y\nVErx1FPvrQeWt5jNZmyf22Z4dETg6d9hrCcMSWI2mzV7v9PpNEjAWwVGBlJZdBE1f2/ixmLCanjl\nuoK2Gvzc7GnTC3yn690b6FDzok1n2HxJrXqaW6/qIcRVwzoxp575wjCXkBtOtuFOL9o+mizcnHxu\n/dp+vw/Ms/O4Htxggrfu7Ecn1JXmPc1pukgBktZ8kvRcBTb3TTiB37/lMg/TvI9ZBA19qYZ0zL/p\n3+0298Nw2ZWqtNpNzg26pIBep4NA8PTTT3Pp0hWKqiKwAvJUv3Yyi6DMUQrCVpskSYiiiOPhmFar\nzbc9/xy/8Ev/gtHRPpNJQhh0GE0n+L5DPOyzNOgyHY/5U9/+HC+9+BJ/4Qe/j3a7TZEXDKfH/JUf\n/vNcvXadSlX47RazKEIBl6+8iUpTfvEXf5E0mfHM009RFgVSCF555RW+5ckn9SSeIKTX7+PbLnv7\n+zz22OPs7e/z0NZD9AYdLl++zOHhgcYvoxlZkSOrQrtdhh5h6Guc2XawHQfPtrh95w6/8Vu/qWdl\nttocHR0B4J7yWD91mqpQ/MAP/CBXr1ylLEqOj4eMRiMOhodsb2+ztrbGyy+/zP1793jyySe5cuWK\nnkTe6Wir0Nms7kkonnnmGYqiYGdnh6OjI6QlSesAe/78o/SXBhwdHxGEIUJIfvzHf5xf/dVfratN\nxXg8wXV8Op0uR0fHlCoi8EMcx8b13BoeGWFZkqOjfcbjCXmWsbGxQbfbZnl1ia2trSYAjUcjXrnw\nkpb1X7tGURTs7e3R7/dxLIugFTLLUu4fH2I7Dt1ul1yVRHFE2w843D/Ati3iVAd4z/OYxRFYkrLI\n2Ts8IMl0UiMAL/LIq5xF50AprBryqIU8ddWgLV6n5HlVZ94S23Lfdt94nk1SmBFlNrYtoPZLAlEP\n5NDulZ7nE2VJ432EUrXVb7sRGOmJQyllUVCUeROvYO5ptLg3F3taRki12JQ0MWLRV8bAVIvc8Kqq\nGuHOWyGaB13vWgA3mZ1pCJjM23w5A0Us+g0YiMIEUxPETICWQuNkZZGBZSHq5qVjSywJbqD55FmW\n6QnmC9myof4t8q+zLGNazz4EmveKoqj5OfPADG69eLiYByaFgAq9yWo/kre7wjBscLEsyxoanTYg\nirQXSlXVHuh202HXOLemzJnOflFkNZ6nqVQa+7MQdsEzTz/Nq6+9TlHVVQuG1xvz8PY2V6/f4OHt\nbW7fvs3Zs2dZXlnD8zyiaMbP/OTfB+mQZxXTWYzjOtg2XH7zdSxLcXR4hFDwX/2Nv0aRp5SF0iPp\nioynnvgWfNflgx/5KHGaYDku/93/8N+DgqDV5v7dO4RBwGSW8Oij5zm1vspnv+d7GI6mXH7zTW7c\nuMHNW3e4ceUylm0zGAy4e38PBayvn+LoeEi702kMjGazGWUS4bouS0tLXL16teHjX758ma9+9avk\nZYFjyt563Y2GY27v3Gbr7Dk8z+MrX/kqn/muTwOCjY0NXn/9df7Fv/oljo6O+Of/7J+xsrLC5773\ne+l2u/R6PS5cuEC/26MVhHTbHUSln9v5Rx7jiSeeAPThfvnyZe7cucOtW7dQKN7//ufptDsUhR5k\nvLaySjtsMRmNGSwv4VsBR0dDpLRotdt4foDjuhqaqjKKKCaKp9y+vcNopEU2jz76CLbtcHpzE9v1\nmr1k2zacOcN7n34PFy9epCgK2u02Z8+exZIWURyxf3DAN195mevXbvAdf+oT/PZv/zbRLOL93/qt\nHFWKXruDVUqEY4Ft8dqlN8jznJs3b7Kzs0tVVTzxxBM8//zz9Ho9yjylpMJ17Zrj7BGnqbbLLSps\n20FVSv99nNCyjYWFT57N4c+3Xnfv36OzvKLxdSnrylHierp/4Ng6lqRZTl5UCFsHdlEJqPTgZgOL\nautj6uCvfVM8z2lihMa3syZWaajX0C3zJi5owZXfxIFFFbbh5y8GcNNvM1h5q9VqYNB3ut69ocZ1\nsFtUWJlguSgJNl+qMZA6wSGdn+T6VJyLdcxrjL+JCcq+79cc63mWfIJ1Ao2dq8GzFo2jzPxBE6jz\nPG/e02BsBvcyNCP90Komu34QrmXUYQbuMYeZ/vzUilIa2b9t21h2jfuJBcc0CULM6ZVlUaCQOK5H\npQTnz5+nLAt8P6RSFY6UVGgBUJwkXL12HRSsr69TKRiPjonihG6nzfgoZTSNaAVd7ty5RxD6RPGE\ns5unuLVznV7boyoUVZGQ58ZH3dLsDWGzcXqDyWiEsCw8z2dlaYnDo2PiKGKwvEpZFtzevcutnR2k\nlPS6XWzLxvV8slwfiGfPnsX1tH/H9vY5irLCcfWEmOFoSK/fI88Lsjyn29G2qAf37/OP//HP1o3y\nlCAIWFmpB0MkCUuDASudZaSQTJdmqKpiY2MDKQRvXrrE3r37tXdOQhonSFcxGo/44AsvsLl5hmef\nfYYkSXjqyfeg/tyfZ39vj51bOziOw3QyoshzlpdXaqgrBxTr66dYP3WKD7zwgoZ0spRZFOF7PqCD\n1/b29hx7RdLtdpDSRghJmqWkeUaepxwc3ufGzWtMxyPc2ojqve99ilPr6xR5RZKm7B0c0WqFmq0y\nndGtK4WHzm6RZglJknD3zl36/R6249Dpdul1e/R7+jB64vEnuHrlCkv9AdPxmLDVoiwLnMDl3MMP\nM1heBgXf+7nvw/d99vb2uHbtGkvLK0RRhCckOBZ5WZAVRSNIyrMY254LX4oi5/r1a0wPb1GWijQr\n6nVf8fG32Tfd3gDHCQCB63pIqdeWxqJVMwzZrQ8wpZT2PLc4CXcoQxioFoKwdwIhAGOva52wyVh0\nI1wkXZhmppm9ay7jhgo0PPOiKJoYYGLbf8hS9l0N4CajNgHWlA8GXzIqSZN9L2bI5iRzHKexX81q\nvudiI6GR30MTdHVZYv7jxA035U8URY1cdpGTuWgza9RVBsMyVcQim6VRYKm8aZo+6KG0Wq1aXRef\n6G6b9zDSZMdxT/QK0jQlz5LmPmrD/1yPU7M0Lcl1PUaTCWGry/HREe979lkuXrpMmZe02hrHn0Yz\n9vb32dra4sxDW6ws9fVCq7v5aZowHU4IgjaXX7/I1tY5bM/mzJlVXn31Ar6nJ/ZkaU6RFZRKIGrs\nfjQZ8/gTT5IkCcPjId1+jzSOeez8eb72ta/juy5nzmzyYz/2YxwdHVCWJWfPnGE0GqGUYjKeMRgs\nEYYh16+8zvLKSjNUA2Hx9W98g1/7tV+j3daj7xzXoSVCOo5mb/y3P/H3mjK40+lqLvd0yng8buTs\nB8cHKKX9J37v936fbreHZVnN0OKdnR2GR0e8//3vZ2mlz/f/J9/P3t6efsZZTjqLSS0Nw3Vabd7z\n5JP1xtc0wtlsxt7efuNjj9SHflrj4lJKirwko0ChJ5hvbW3x4osv0hv0qSoQQjfsHEcPebh+8yZv\nXLrIaHjI6uoSrVaIUDr4d9ptoijGkjahHyKFowU5jkNnbQ0hBPfu3ePevXs8vL3Fo4+cB2D3zh0m\nkRafvPryBU5tnEYVJbKsOHt6g9lkSp7l7Ne0wbzM+eL//f/wLd/yLaysrHD16jWiKOLw8JDz5/Xv\nHAwGBGGI63uEYYjv+zoBynQvQApBls7ZVKoouXB8GwmM4hFC2kRR/PbBRHpYloPnebWASe9VKWwQ\nFXmVU1XaMVEHybSp/M3INGreu1KKsh7UUhQFKsmagGpU1yYYL0Iieq+WJwQ5JkE1SdiiirPXm08Y\nM/YYeZ6zurp6Yh7ugwgP5nrXArj5IovBzPCkDXRgWRaTyai+KcaUHfK8FuHUWXdZ6q72ouTVHBAm\nmzWwiwnsRqFlLnOKms9mSh7TODVB3mBepuQx1B+Yn5YGGjI4mG3bWNJpyP0PglAmk0mD/y/KenVn\n3UPPHNRCDgMhmdcEoY0Ulm7kqFIzR6TVCI8mkykoHeyFFJzeOM2rF19vGqN5nuOHLfb39+l2u+zs\n7FDkqcYuXbse31Xq0ra7zEPbD9PqdNjfu8/de3dQCNZPbzIaTXFtn7RQpEpDB1mS1NBGxZWrb/L0\nU09TAXE85WPf/hGKImX77DZ5kZHGU1SRY0u4eOEl3aR0fBwB6WzK9PiYpaUBu7u7DAYDzW1vt3n1\n1Vf1IWxr0Y9bswaUqnjiiccbvUFVVezvHzReOK7rMhrpNba1eZbZLEJKi8986tPN5vngt30AqE2H\n6uagqEqODw5xpIXveqRJwmAwIEtTbEsPtgXt1Y0QWK5DrzdoEg8hNNdac5UdHKeWnCszBT1iOp2y\ntLTM9vY2165dQ0pJt9NjOByRZBmW5fLShVeoqqL+XYo0zXCtWkCWK2xbMotTiiJC1glFluYUdZLk\nOg7ntrY4Phpy9+49ppMJfugjHIeLFy/yXZ/6FK+8fIFLr7xGGAQkRclSX/t/X795gziOefT8eZ57\n5n088+yzDI+HrC3p0X0bH9vUqtgmWAriNGY2i4jHGhI0iVpVVVhCYlt6/uvR/Xt4lkdO7V4oK5y3\nh8DxWx363R6Oo/d2WZWgLPLcZMVzIykhRGNEpavhkrIs9PQfoRXginkGrG2pdQJoqmkTA0yWbl6b\npsmJuQBvHe5i1MMnYCxoqnzDXJlOp028MXDtg653LYAbXxATzEzmqpRqmCF68rXX3AiD+5ovK4Ro\nrF1N5mrwYcPzNBmscR00AdlxvCaDXXwYJuiaU9BwOs2JuNhUMJzvtzZUzSFhsK95aagD/oO6y2EY\nNgfDIra/2CQ190xXH24DLelDZt7IkZZFVVaoSuHYNp5rkRcleanVo1tbW9i2pQc2LHg6ZEXF4eEh\nX/7yl/mr/9lf4WB/j2tXd3jk4W3arRazpAvSplKKP3rxZbrdDuPxkIcf3mY0ibh3/5CHtx9l/+AY\nuy1phy3SacaZrTNcv3mNjTOnEJbSfiZCkkQJH//oh6mykrAV8JUv/7987OMfYzIZszToURYVs/Ex\nK0ur5EWBI/WQ3EceeZibN29xc+cWr128qFkMaGtVCyjqQ7ssM85tbzEcHqGU8azQU1lMRuS6LpaU\nxNMYW1qMRmNWVldQZUWWZxRFVo9vm1FS0Wq1KbOMVhie6FeYoR+e4zbrxrZsFII4Sus1otWGYbtV\nB3IL27HJy1wPKqnqfonj6wELsxFPP/00W9vnODg4IIoizj28zWBpmYPDEV/5+jdpBR5VVlKWILBo\nd/tE0ymzWUwrdPC9Fm7boVIlw+Gw3iNW7QRpaeaJ63HhwgWWlgacPrNBWhVsnj5NGsdsnjrNGxdf\np7fZYqndw5EWx9NjvvGNP8L3PM6unyYMQ770b3+Lj3zkI5p+1xtwcHcPz/OJ4xw/8BkNR/hhgINN\nKwhIkpiqKul2WwiF9iZBz8pc7vY5uHuTPE1qpkvJg+Dgbne5Pmz1pCfLMtCragJ4WRZNAmXbc98V\nneRZCLWg0VgI9lleNE1Gk4XPg/88iTJ71uDaxmjOZN+LPHLLshgOhydMuMzPmfcwCah2Xn3w9S4q\nMdFSeM/XEl8pyPNMz0q09UPodvVDzrIcUZvBg6ZSadmwp6XTQhInCbYtNIxSVSjTTBR1VlYpyqrC\nqhRKSE0hM9M6pPYyFnLRzGaeKemDQDsiav8EPYXbsuQJdomsuboGAw98n6LUiyqrD5QMRZq8vRKz\nLAuSJK4DtpyzT+pqJY61lefiQWQMeszCMjxYbT9gNfhfVZTYtoNlSz2w27ZZW1vl+o2bWJ5HUZYg\nJIPBEnv7h7zniSf45V/+Ah/6wLfx6CPnSeIZM6WwwpA8LTg8PKobcor19RXC0Of+3gGnN85QlIqV\nlTVKS8uTx6MRWw9t8dLODmfOnGHn1i02z2zqA83SPY+bt3Y5+9BZth46x/XrNxgMBoRBWHtLw62d\nW7RabXq9HrPpjNksYXV1jTQvuHzlGvv7h3qauNB2qY4lcCwHlRQ8+cSTjCcTAj9ACllL181askji\nhLzSJXSWZ3Q6beI4IopjlpcHWgkJ9Ps9ytpPx3JckjhBWpbGVtEVVKfdqRlT+uB2XIeyqAhCLWCp\nKu3REUVRAw9W1IZGFVR5gS1tKlUxHo8YLPU5Ph7ieh6rK2u6Z+G6aNtW3ag31aNt2w0P3XFclgZL\nCCwsadXce4eVlWUsy2Y0GpIXOY5lc+XNq2xsbvLss+/D831GkxGdTpvR8RDP83n+276NMAi4cuUK\npzc2cD2XwWDAyvIyp9bX6Xa6ZFnOo+fPc+mNN1hdXUFVFe2wRZIkCCGZTScMBj3ipGZ3CG1WF3ge\nQgqkcZ5XUFYF0+mYrKxI8gJp2UhLYD2AkZGlOe2WT5LoAG0qZUM+gPmQcdu2tcDIJG3UPuW5bvjb\njo0x1xJCTyHSDJmqZszNYZO5upNaQT4fwmASL8OOMwGZ+lmbZG0xeXwQu+6drnctgCslEaq2u6wy\njT9ZLq7vkBdaUWVbOhMpy1LjhGWG73tkRYFtOVRJor+CqMgyhefp7MyxjI+wJvPbjou0bWwptFRW\n1HLzSuH7HooaWrAEFvObWtRQjG1ZDfVJ+xnMoRIBKEsi68nVWnBU1mNGLKqyICtrq1fX1pnPAy4p\nRWNMr098HzNwdU5XEix6KevPlC8E75ovWy9Opy6nK9BqUBRIbebzmU9/kp/+6Z/RJaCQCMshijOk\n5fPaxTd57n3PsLKyhu/a2AIc22J37x6+79PpeEir5M7uXU6tr5NnBUkU0+/0qYoCR9pUecntnR02\n1tdxLYvA8wl9LQAp8nmHXQpJq9vHDzssrVg1nVIxU5oT2+75OIHm7F69dYvTa6ugoCgUL770Cn7Y\nYzTdpdVq6+ctNV6fpQnf/7nP4vuBnjLUHIRxnalZlEWO48y9KPzQa9Znz+005kdFnlMuYJ4CiZTa\nWyNLdYB3HI9Kgaj5ypa0KEs9ls54TEvbTG+f+85bQiAsW7MWvDksFrZDnd17YR0sJK6j161Q0Ap8\nLCmAOnu0LGxHNwGLLCMvEgLXw7EEMnCohGDn9i3N5w4Cet0+SsFjjz9RBxib8VgLhSwEge9rle14\nTNBt88nPfBfXr18nzTLSJOGhM2fY39/neDrife97H1JK+qsDptMpN3dv4S4ELg0ZODi2SxAGtGRL\nM0SCeWNRSMiSlE63y7WbN6lsj1K6FFRIJZAP4IH7rvbiMVa2RaGa/fJWPUiWZbiOVhKbAGxZFnmR\n1/tgvrfKsmQ6mzXj40yvzcAhep1oSFOLheYupHmeN8F70RPJJIWLUMwi+87M0AVOKDUfdL1rAdyr\nqUTTSdQsaJT2/PB9F9vW5Uie6ZM0CL1axZhTlFrMU5QFqBwp7Tr7znAcu87K9Wiksiwosowiq6eT\n2A6u61FmBaWqSPKsaTj4jk1WT1xXCqRlUaLIS4UlBZalyztVaa51EIb1mLOSsg6ueVGhhIWQOvt3\nPQ0VlXUHKs50o+btLsN+0ZREzVxZZNSYhW6yciFEc7qbQ0cfKhpfLfKctMixS23PPxgMmEURlVCk\nRc6p1TUeO3+evaMRo9EEx9EyfpQgyXMuX7oMZc5nP/2d5GnGbJY3eN3S0hK7t3dZWR7UGKBiaamP\n7Uika2NZgiLR1DTLsrh+/Tpra2vkec65c+e0xLymXkZRpIdOZzGe77B/sM9DZx/i/v37eL7XwEDd\nTpe1tTUuv3GZlbU1buzscDgccvGNS/T7A8JQOx7GcYoQClTFCy+8wOHh4QkozLwv0GwoU7oa2Gze\n7D45KQlqipmSWNZc1LXIRoA51Kabytre4K1MBUMlaxpmdYm96M5nNvqib7Sxm3Bcv/bgbjf8/7IE\n6Vm02i0tk+8NyMg4Go1od7ucOXOm+d1ZlmNb85F/WaaHflu2ICs0N3oymfDGG2/wwQ9/mN/6jd8g\njmO2t7eJooj3vOc9fOhDH+Ib3/gGOzs7BEHA6uoqUkrOnjlDnue02+2GUqd7MbOmaiyKgjt37gBz\nVkZaDyKZzma4rZCqUnUmPXcIfeuV5zmVOtkobOAQ87yguc/mdSYQ53lOq/auSdO0sYTWlNz5szSK\na7N29HQp1RAKqlmEuvcAACAASURBVKpiNBo1ZIfFNWHWnuM4DStlcT2ZxifMmXFv9Tl/u+tdzMBV\no7xcbBJmWXqiBAlaeiRalucgIGiFqDrz1U0HVS/4iqBeJHE0BUEdrHUDJYpiiqLCjEHyvBYISZoW\nSEsiLYdZnNbGOjrgSjR1SUpLGzopgazq6dVCK7wUAiEdhNIbiDoDLquKooZ+dFNFU5cc22sc2N56\nCWE24UkjfJiLghZVX6bEWlRcmsBTVtpJUVcFepGMx2M9aV7U0MFsxvd97s/wc//bz9dDKHIElv58\nQjJNYg6HQ37ny7/H1tkznD//MCUFs+mUe3fukmdZEwz39vZYXz9FWRbYnqdNtKqKtbU1wjBsGrRm\nuokRR4WhzjJnkxl5liJQnDq1yuHRPqdOr3H37l1832cwWGI0GpGkMWunN/jKH36V+wcHDMcTbRzl\ne8RJjOa+Q5nnfPdnP82dO3ea9zT3z1AwFzHL2WzWbBrzOc21mMUZ6ErDEgnVwiYsi1LrFqQAhbaA\nKEuUmPdazO8xSt7FHofO0PKFZylx6s6dPpy1m2AQ6ODit9rN67UyOaPTaVEWJa0g5I3X3+CFD7wA\nlsWp9VPkVXlCXOL7HpacByTHsSnLHGnZzaH35ptv8sgjj3Cwt8cnPvEJdnd32draYn9fS+Z3d3fZ\n2NjQlNOqYjgcNqrmPMuZTCZMJhMef/zxpv8z50/PB5JsbGwQx3FzsH/1a3+IUhV5nmE7WmL/IE60\n53uk6eIgiHkvyxAZTAPStm1ttyDEH2N7GFM98/rFPWX6c7M6Izf3zKwt48e02JMy99lUxmatmSzb\n/Nsi/9sw2P7/DjV+Z5b4f8TLtl3KUjGLErK8REipXdTcAN8Lcd0AgUWea5qY9jJwSNOMJEkpypKq\nbshZUuI6dlOuOY6jLTariiROGA1Hekyb5xH4AUuDpUat2WprybXv+7TCoM6OqmaDW5YeZ2ZZ2hKz\nKAqKXM9uTJKUNM3IsryGPzxarTZhGBKGAUEY4gU+nq//U0qR5VnT/Pzjl9D85Xoe4WL33jTLTMfe\nlFswpysuZuWu55GXhcb6aiMlRUng+6RJgiorVFERej5PP/00+3v7gPZjKcqSsNNGSJs33rzK/vEQ\nL2yTFhW+53H69GmEEKytrZHUnjKTyYQsS4GK2WxCUeQMh8OGhre8vKzNp+KY8XjcdOHNnNOyKhoG\nB6ri9u1bJEncBIbxZIzrubRaIdM042A05vaduxwfH+vhIqrCcSRxNMVzLVqBz/Pv/9ameW2M0sxl\nGAGLFU2r1SIIgobmZyheJlM2jWTHccjyDMu2aLVCgsAnCHzCVqCZNGlClqdUVYlla68Zy7JqJaDX\n0NGMAMyvoQqTBQaBTxgG9SY23vhl09ieTiekqZ5IrxXNWumrasViWmsTJrMZ7U6XSkGxkMlXVdXQ\n1o6Hh/pzWlYTsI+OjnjPe97Dq6++yjPPPMNjjz2GX/ubG1rsH/3RH/Hkk082wfAP/uAPTpAGHFtD\nBxsbGzz//PNcvHiRCxcucOPGjWbN6jhgN5+p29X+8Xfu3MEPAixrnkFb1oNViVk2Hyq86CVk9o/5\n3oZc0O/36XQ6jd+MCfaG+FBVFVEUMR6PAZoDPwzDE1Rh3/cbQ7Dj4+Pmu5jfYXyQDGXSfL63KiwX\nq7I0TU/M5P0TC6H861//d0gp6HV79HrdpvyyHRtVNyItKbFKSV5k5Lk+hX2vjRCKvMia5iLoMkbV\nVpI2hqmh/cD9wEcgTmxYIQ3VKm3M8B3Hoe91tPXnQjlVlUYI4NRd6roxWFagSk1TUnr8Wzybkhfa\nS9ix9YxAM9HH8xxQCs99+9uuG7deA6UY46vFjAXm2bf5zIuNENCHjLbe1Ph/01Cps69OS5e10pHk\nSvHpT30XL7/4MlVVUpQ5jmM3HHi/1eLNqzeI4pSnnvwWPvD801x+9bV6rJ7OYu7evcuZM5vo8WUa\nYtnf32dlZaVZjJPJpLEl6Ha77O7uNoeoUop2u8XB/kHtNWHz1FNPNdaorXab6XTGaDRmMp3y+1+/\nQJZnTKZRoyAtqoJ0HGFLwcH+Hv/Fj/0YaRqR52Vj6+r7fsPsMaXwoh7B4JuLm98cnuZzNhTAOpta\nLHtNoFjsR0gp9Vg7Mfean+On82nvZuM7jl3Df/MBB6aZnSRJA/UAjMdjPv7xj/Pv//3v1xhrqQc+\nhC0UmoGTF1pp6nkuQgYnKjeD606m41pA53Lq9DpRNGsGmK+urjasMNMIvHTpEt/+7d/OdDplfX1d\nD65ot6mqqvHzoVKEYagx8uNj3vve93JwcABCUwwPDnS267kuRQ1teJ7HYGmJg6NjoiTB87Un/nzd\nv33lqp9d1nw+pVSTJS8mQuZ+NxBUbV1tMmHDIVdKNXYab332i41H85yD2ijNvGaxwjL/fzFgL2b5\npipY9D0y+pV3st0w17sWwN+4fJWiqEcPqdrwPMuQlsXm5ibvf/9zbG5sYksXx/FptULG4zHjSYKQ\nCikFjnSwbUsT7yuJsBWW7aIAVSos18YWsskK7DorKPIcgcaK88LI8HUwT+KieVC2rX2a55svo8g1\nW0HTzzQbpqoqzbkGPNchyTReVmFO0YLZJG4aGg8qBeMoqfnnmu2yuMjMgzWByGSVhnu+GDyKMkda\nkqosSdIIKXSg73Q6lEWhy/tKQQW+45AIwY//l3+Lf/A/fp7QD8nLQjfLUHhBQBonvPHmVTq9Pjdu\nXOajH/4I7U5fy9ItmyzXNqdmgkpVVdy5c4d+f5nZLF6AeUyWkdPvL1GW+jnmeUnoe4zHE85tbxPF\nMa7jU5Qz4iTTPhyDAQdHI37nd38Pgi7Xb9yiN+jiuQ6TqfY3EQKSOObP/dkfZHl5QFzb5poNUVVV\nQ+s0uKyZEGPKbeOJYzajyYBMub34s9PplOl0eiKrhpMZlXm9qvRm9FwbpTTTwby2cixUVeJ785mp\nUsw9MxwT3OsDu8mkkXznJ7+T3/3d38WynIY6N5lMCcMWjuNxdDhk++Et3QB+882mB9HpdBqRmsl8\nL9dWsHEM09GEjVOnGR4f64EYMz11au/efXq9Ho5VfybL5u7duzz77LNcvXqVRx55RN+net7s0tIS\ncawNoZZXllHA3d07tNttwrBFmZc4tsLteaRZzh/+4de5eOkNkiynokDUzppmQtXbXaKmQ5psWynV\nVFsm01+0ZlVV0UBpJgibQ9RAuia7jpOEMAwbE7OjoyP6/X6TiZvKLs9zjo+P6+o7PHEwmPcwAV0I\nPanHfObBYNDEBkM9NqrM/xAO/q4F8IfPP4qZLL+/v6+DpqM9C27v7rK3v0+WZawva8XYxsYGnXYH\nw62VlkQKsF0X39fy9rxMUCjarXY9jAEc28b3PJxa8VkpheU4FHncYN9VWRHNUvI8Q88n1AuwzOvm\nah1vLWEh7LlCMk1105QKClViSavJOD3P0wNRhcQO282DLItCU+Pe5lpeXtEZe33yL57ei9TBRbvc\nRZ65+TtHulRqHoiqSh9gozzXWLzU01UkgqIsEJ6PZ0u+85Of4Atf+BV6S4NmsVeVxvla7Q6vXnyd\nM6dX+NqLF/igG9DptBmOZ7heCFh4nst4PCHLcp6omQ39fp+bN2/qmZTjMUmS0O/3qaqKS5cu8d73\nvheAo+GQVqdDkhREcYbCYTqN8YIOw/GMS5cu841vfhOA+7d3aXe6UOkBAa7tkMQzHCl49JFtHn/s\nMaqy1DxtZexE/RM9BC1KmkNZJoMyFqAm+zYH0mI2ZDIlA3+YjWwUxIu6AZPxmj+bctxsWPP7siw7\n8b5RFDXPWZsxOY0PkLmyLMV2HdrtFuPxBMvyyTId7LIsp93vc/X6NcaTMadOrfP44483FYDJUIfD\nY0BwdHTEysoyUTSl3++xurpSC4e6DbxhDrnNzc1mvTmOwwsvvMCXvvQltre3uXz5Mtvb25rGVx82\nYRhydHTEcDikN+jT6ujpQFmimSnGfsKSNtvnH+HVN16n1W4TR8MT1hoPmtBuDuFFGNEE7EU7V3MZ\n7r/RZiw2IpsKfQGSMQZ7QJNZL45WM8ne6dOnm6C8CIMsvq9ZB61W64S9dJZlDVRnDPzM93in610L\n4M8/91zt5SE1hac+EY+Pj9nZ2WFv7x7RbMLu7i1c12M4PAKhh786ji67AD26yrL0EGS3Ht/l1adj\nrjMSt+Z+IiAMQpaXliiyGWVZ0Ov3ePyxx1lfX0c6PoEfaApe3SDN85w8yeuy2q754po3XuQ5aaZl\n0pYpnaUDSlJWFUJKSgVlqiENy9LT0xFvn4GXZYVSorEXyPLkhCuZWQwmEyyKorHUNRl6WWpOvTLQ\njjTBXyJYPAw0X1ooyJOENMv44AeeJ0kifv3f/iZ+2EJaNqWqCFohcZRg2w73D4cU2PzGb3+ZJx5/\nlH6vy8b6muY7ZynLS+scHOzR6w6I02RB+TpXnBmO7srKSnNIfeEL/4of+ZEf4er1m5zb3ibLC5bX\nTvPFL36RySzSPifjGXleELTalEWOqqcQSVGhipLB2jI//Bf/Ikkc4bs1FCVkY4+wWI6a0to0ikzw\nNRCK2dymGjOf29zrKIr+WGPZbG6zqU0QMNm/mXVqsrbFrHLRRM2U5YbbbzJlo9Iz5X5ZlkynU7a3\nz3H9+k3tpCiMkjMlywqOj4d89rOf5ejo8MR9uH37NrZt0+12mga3ELC6usq1a9dYXl6m09GcduM5\n//Wvf53t7e0mYAqhRxiOx2O2traQUvKhD32IV199lV6n2+D+cRzT7/eb2bFSSlzfochyptMZ3W6X\noirpD3p85etfIy8Kep0208lhAxd5nkcYtN523yhVNhN2TAVl7q0JgOZZCCEo8npY+YLM3WTIi9au\npgFqDnID8yzClkDzvg0tVs5tZhehUMPzNuvDHDLmfUzlkOd5Yz38J1ZKH3oWvq/nSgaO9gRuBw6n\nVvs8/eRjhKFmAUhLcnh4xEsvvcK9vQOGxxPSPNdB0LL0rExLW61mVYF0Q9KiBFWhJ30XlErh1pnL\ncBxxPJqR5hFSCspbd/jKNy4gavxcVQrfdWm32oStEKeetWh8FnxfwzlBGBDUD1P7Luh5hEJqQY42\nx6kZCkLWZZg2yn+QEjOOEyxLEsezRoprFpBZUIsLxQRsEyDnv1edyORV3cEX6EnfRVlSFhmqLBEK\npOPiWpIqz/juz3yG+/f3ePHCK1i2g+MGDIfaeyPPcoQl2bmzx9rKEl/+va+wublB56MfxrZdOt0B\ne/fv49g+Warvwa1btzh9+nSTZRg/krIsWVpaavyop7NYD0nOSoTlsH93n1cvXuTevlZQvnH5mpbV\newGiMmrHiDLPERJ63Q5/7a/+5xR5jmPbKKVd7NRCJrwozAKaDNhsprfijwauWsStzc8EgddAJCYI\n2LZECEPLM8MatAmZpoUWJ+iMi/z9+QGtapGYg23PHS6NZ4fnOU0W7kmXvKh45OFHuHHjloaLlPbP\nLgr9eSeziK997euc2zrL/mRMVWml7dbWVtO4MzCclJI7d+5w9uwZynI+QcbzPA4ODvjoRz/KpUuX\nmM1mPPLIIxpHT7Sv+2w2IwgCLl26xMrKCkcHh83PDwYDhsMhnU6H/eMDAi8g8Hw8x6XX63P79i7d\nfp/bd3Z56eWX8VstbtzcYanrEoah9pbpdGi13j6A69ekzVCVxX6E4dsvNgNNU9EEVPPdzfM2r61q\n6q9JOBZ9ksxrTMZukq7F9zJrZhFuWazkFpu+Zk+biiOKoubzv9P17vHALbCVLjttx6LKc4SqEOiB\nw5NEZ8h4mtZ2anMVL/RI0msko1RPmC80zl0BaZZSVALX1Zu3LIpmQ6V5QZrWDoG2jSUtpCcpyoKi\nKrGDALd++GVRIKTFJK0YJ5P6QRfNZjUll5CKKteDjvWDU4RhgJSiOQzyTBvSe56rTewr7WnebrX5\n4NvcE01XsusST2d3s2hygoK0qM40i2+xKaWUtsS06669sCSi7uZneYrAoirLZhgzSqHKnDjNsByH\nozLn+77vc4TtNr/5pd+h07NQlSCOE3r9PrnSwpGD4zGOJbhz5x7/5t/8Ot12i6V+F99x+OhHPgzo\njGdvb4+NjY2GW2v8brIso91uMxwOKYqCh7YeJs0Kbu7c5psvv4ISkrv37jEcjShLGCytkGSa4qaq\ngiRLqMoCoRR5lvPX/+bfwPc8omiK7/rkuT4A81o5ZzYf0GRQc3EUDbvCZNuLsIfZfIuCjMWgZzbf\nIpd3kdJZFGWzyU0pbjjHpmE6L5dPsg8WS3zznibwF5XWKGxsbGg/87DFLNaZd6fV5v7eHivLy7x0\n4RU816Hf72LbNg899BCaRucwm+nA1+/3OTw8rIVkquFlmwqw1Wpx6dIlOp0O9+7da1hQBu9VShs0\nHR8fNwZzZsKUYa8kScKgPyBNEibjCe1Wi6IoOXv2LEma8/tf+Qq9Xo+kKLEcrXZuoIhKsbm5+bax\nZDKZoP2QTg5AMfdv8aqqikLNxVLN370lsC5CbSaoR1HUBGyTiJg+yaIr6SL8Yn7HYmPbuJSaZ28E\nP4vN8W5XD9v4E5uBl1lMlQkUCqms2iFCK5vyotCOaa0W43xGVVYM+l02Tm+wuXmGyTThjUtvcm9v\nj6zQUIHjWmSzjDxT2LaDEvrmeq6HZ2s83JJ1BlpVFErg+C18KTEzJkUlQTiARNoSgfYQltIGqUCC\n6/q13LfEdpRugqKZKdMkx7W1vFkI/bnyvGAWZU05nOaKyezt5bE/9dM/AwLW19ewbMny0jJB6NPv\n92iFLcJWiO/52LagKnNULat3bKfBem3HRgKW1FlYWVaNaVBVViD0wSelRNpaZKJpZFLP0swrbCTf\n92e+lzTN+P0/+Crd3hIKyXgyxXICet0us9kEpSR7+wfs3a9YW1lmPJoQz6YaBtnaYvv8GcbTmPv7\nR1SVNhI72N9ndXWVoiiYRYfsHxwzHE2ZzCJ+7n/5J9iOQ7vT5ZsvvshgaQkpbfqDPpN6snqSpogy\n0ZYDVclSv8M/+Ps/ydHhAVGc0Gq1iSONsydJQpmVczZInREuBkjP8+bUzIZhIrAsLX3XEJ2N6+hN\nVxYVtmUjpF1nxnN+txCyKd0X36NpRCmtTTA/YzjDOpjoz1apuVWywYel1DMrlVI4NRPKkpIs0o3x\nzTObnDu3xa2dXWzHJoojwsCnKssmGO8fHvLIw9tMZ7rpWpUlk+mUqu5TJHFMlqY8tKUbnpubG2Sp\nXrfXr19nY2ODra0t4jhiMOgjhGB1dZX9/T36S0u6Qex5TMZjut0u/V6vqTikZeH7Hq12izTLCPyA\naTZhOp0ShCF7+3vMopjbt28TJSluEDDo9XFkymw6pdPtEgQh29vbb7tv9B7Q2gsjgwcNPVWVroLM\nvcyL+bxJoDmwG/2EgVQW8O9Fdol5ttoiYC4AMz8H84PcPDtTwZkEzLCJ8loYJKRo2EgmgBtr7T+x\nGLh0jemLQ1aXr7MoJghCSiGoLItZmmHXrnq+ZUFZsNTyWG4HPHHuY8xmM+I0YTqNKcuSqFQMj48Z\njibsHxxweHBEWkQ4rq/HNDkuuSl3XUGlMoq89jOwRL2xQNhCfybLxg19VFnWBjdGJaUQdu1MaAuk\nNT/xqyJHVFqujxII6WpLSyVQCCosg6z8sSt1NW64O9JNk9vHaR1cSu3UJmyoxSFSaO675zr0+n08\n39NWAJZEUuHJkm63S7errVNPnzqNQuHW+KDhbu/t79Ppt2iHAe1a9DSZTJgc7PPpT3wHj51/jH/6\nf/4SSmrRlVVOmeSxvjduiBV2KBXsj2LuHU3x/JDjPOLa3mv0L9/E8zxeubLXQE1VWWKJKw2kkmUZ\nURQxiSa6QVtEuJMZa2fPYFkC3/MZjY5ohyFxdESWJgSOTZXHPP/883zyk5/k8PBYQxR5QV5o+Kk4\nHlIWBa3QPxFMTbA1G8zg3FVV1QwRVVco2qvDFjZCScqsAiWRSqIyRWUpSqWZTIbrrTeuav6sMNWY\nTVXqUV/SMmpB7f0jhCLPs1rAUREGIUVZl/AKFLrR3u31m0rL4PGOY1GUGWWZ8p/+wPfz+Z/8n3BF\ngO0ExFlGt93h3v4BTzz+KFeuXue59z2H74V4jsu9/V26nQ7hYBmAe6Mpy8vrRLMc2/aZjrUyd29/\nj82NDdI0AeViW5Yev2dJppMRYRBQ5gW21JTAQX+gm5bHRywvL+M4Dvf39nCUo71w4xKv5ZM7LmmR\nEWcxq5tr/PYvf4EonrK0tMrweERgu5RFTuD5tPyA8w9vP1C0YktHy+PLEmn7TcarKb/GwKxCSYHt\n2siiQkltKWEEPWmW6WEQSmnbhKpE5RmiOrl2FrNk06Be/F/zWtOUNPMDFqFOpRSoEksa/yKIoylJ\nmuJ5QRP4zbN+p+tdC+B6hmTWgPztdudEl12fchGe5+A4LrNZhOO6tFotsiyfD/MV2qi9qmDVdTlz\neg2lwPcCHMdjPJ3y8ssXuH7tBqPJBBT4QYiioigrRFVb21Zapek6LpQ5ga0tbIs0w7J19iqkxJE2\nSZnrRes4OJZTmxHVxlIYebWZ8KEDr6o3dVGWjTnSWy8T5N4q9JHSwqrpepYCy3YRVMRpRprljGYa\nbrIdG9txoCrIE52xSUuSxAm+5xJFMa7n1lzwHlJKjo4PEbL2aZGS0+urPPbYY5ze2KDd6fLUe57g\nb//Xf4uf+pmfpapSSiGxHYu8SDk4ThqGhO87KGWTZIlu7ErJzu6RxgbVfOq2yUbKotCmRkVBFMe0\n2m1832d9ua9njOYJKEkuMhxpcXf3Dv1+B9uyGR7u88M//MN84AMfIIoiRsMjwtAn8DT+XOYpkgph\nCcbjYQOZLPJxTWOwKLJGEayEVnDalk2lSrI0r7FP2VRwRaGVu47jUpa2bqYrqMo5T7kUxvpY1syk\n2jJZGJ/oHLkwm9PQEtNUD3SQcq7gM6X7Yv9gXsa3UKokzXJ6vS4f/MALvPjSBcbjMVJajMoxvu+x\ne/surm3xz3/pl/iRv/SXuH7jJqsrS7iuZoloiMMiDHws22E8GrO8vMLrr7/O5uYm7bbmc8eRtsxt\ntbukWY5d90WkEriuT5aVbG1tc3h4SJLo4Rf37t3n9OnT3L17F3fVZWllmdFohBcEqFQSJTH/9P/4\nBQ4OjllZXebgYI9Op0dRZthSVzRLS0sPzL6ButEsamX23GVSCNGYe5VlCZkgK3JaNUVWWnOLV2uh\nwSvrQG77LpRzCf8ivdQ0v01QN3HLsqxGiWrYK4sEBKO+DXz3RHbuOA6WbVNVNPvkreyZt7vetQCu\nOdnOgpcHtQJRNrQi00DK89p3W4iaYqPtQM0NcGuhhmtbCKG9R6pSUVUZ/ZbLR194ju/4yAtUpeLg\n8ICDoyPSrKgbPYqq0grE8Xjc/FdUGt6xpKWphQKEsFBVgSsUwtf87IoC0KwUN/Q0xlwPbVUCsBQV\nGnKR0kLaNtYDUvAKpUt210Hgkudpw25BSmzXpswLzXBRCqSl30MoFDaZEmSZ9mZxXF3Kl0oR9ELi\nKMLyW0jboVSKw/FEBzPhgBJEiebjvn7pGju7d3ho6yHiJOJ4NEbYNv2uz729fRJsZmmE72u8P8sT\nympuY+s6VmPt6vudRm4uhCCKZ6g6mCsU0rFohwG9QR+lKhRK22w6FralvVxmSaQVh4HHZDjm/d/6\nrXzPZ36U5aVl0niKBDZPrzGZTBC1U2An9GtGj2qEJWbjAE1QNLx6Q9ejPnQzQ98EkiyGDBzbJU+y\nevycR5qeHFZr2doPhvpZV2UFlc6itTukdpic08p0EA6CoGF6VFVVrzep7xl6Mzu2TbvV0hmemk9s\nUqX2sm6FIdMo4YMvfJDXX7+MEDZpkoInsG2X4WTGUr+PEg7/1xf/NR//9o9i2XoghFIVkyhifX0N\nUMxmYzzP4eaNHdbXTuN7AffvH+A6HofHI5ZX11hZWSOOo5q3XKKUjW25WNKhyCuytODMxlmGwyGn\n1zfJ4oxBd5nR0ZjE097wWZ7T6gx47dIVZlFOt9dnOBpToRCiotPtUKQaajhz5kytwJ4raRcvDXmA\nUvPh6JZlkdVsGQORAPieR1YrmIVa4OvneYPZQz0jd4GaaP5uEc82Ad18BqNWNRxvY35VvuX3OI7T\ncNHN7wVNeXa9oOmHGMjmHePoO/7rf8Rrkfam8VGfIAgbb2VDnjdcSXNC6ZLEZzQa1115H4Vif3+f\n5U67LktFjTVqCW4YBLie9gURqs3KoEVR6uzI4F7G78DcON8PG+bAJJkxmU25du06b1y6xCSagSVp\nhW2UEFQVlPUszkpYOK7XNLvKOiNwkAuUpbe/J3Kh8SKlJM0zfMvXcz5LzchRlp7aUuQ5klo9JgVC\nzf0UhLDJK4WQ+rtNZwm249PyfJI00SPXXBsUCCR5USGpmMYRIJnFOS++/Ar9QY+nn3kvvX6f848+\nyu3dO/y73/19Lly4gB3NWF1aJq0ba02XvlYd2raFLhdEzYcXtX1C3W+Qom7gJEwmE3zfo9vtYluC\naKoPF1WViKoiiSNmkwk/9Y/+EYPBgDQ6RtWe3gLF0eGhpqIZgyAFEl0up8XJaUpvxSlNcO/1etpm\nV2hRB3UAzfMMy7JJs9q7uqP9R4q8ag4J7UeimmZWU2rX1a/taOqpOeR0RqY9do6PjxumhP6ccxWo\n+YzGrsBxHIosI0pTLSyyNG1W9zoUK8vL9Hs9rt24hev6pOTYdkGv12M0mdJrd7i/f8SV67d4+skn\ncGxJWVZsbp7B9/Vgi1YYMhlP6dfinqwomE0jNh8/w5Vr11BK0e31yIuioTJmSd40gQHN167Ad3x2\nb+1y6tQpzeLyQ+4f3CfsdEE4XLl6nd/4jd8hCH263Q5VCa1WgOUK9vfvsr6yztraOltb594xG9Vx\nRB+mea6rc8Mi8hYYJ2afL7I+3irpXwyYtm0zm82aCV863niNhuCtbBJDUlhUWZr3XKT8ep5HniVN\nzFn06jk8CKvRTQAAIABJREFU0kOz+/0+q6urDzy0zCXUO4T4JEn42Mc+1ogbPve5z/H5z3+eo6Mj\nfuiHfoibN29y7tw5vvCFLzTT3T//+c/z8z//81iWxc/+7M/yqU996o+/qRD86q/8E0A2XWzjGTCZ\nTAiCoPnS5mQry7L21naQUk/bsCwLYckmw3OqEtuxSZIU7Zc8n8pu3hd0RmQ7QXPjDRujKLQni23V\nQ09FfdDoH6ZES2zzouTWzm1u7dxmGsVEs4gkzcjynCwv6z/rssy2HZQyDnaqweT+95/7X//YffnL\nP/qjGN8LszBt29Z+HEFIgcC1NUygKoU5ByqlqYKV0hlahaAsdEBwbT3STJnMQf9A496mBxs4mgmU\npYiqoCwzUOUJeXJelriuR2FpS9zJeMJoNNRZoqMnojuOgy3nLn7CncvRy1ILnajm8wYNRADarxwM\nzlirGcsCCawtL/OZT38XVVHgux7IElXpGYaO4yAsDW/YtSXr8tJAjxKzJVii3jAZAlErdys9bs4w\nj8waETqL1uwlHWTnpW/cMAjSJEbg68dZs22o7YTrpVLDIJrbnxYR2phKVztFYaiBsqGvpWmGXT/b\nt0r8TbJjGmomiNhSWxfbtoO0nHqEncM//If/M5MoJklyev0+QaA9Pxzb1qrOIud9zzzN+UfOkSUR\ny0sDPNemKHParRb37t2n39HTjo7rARCOZ/PaxYs89fRTFEXB7u4uq6urgMB3fQ6Pjuh2OvXsTsGg\n3wdEzRAp57NpXYtbt3a5e3+PL33pd1heXSMIAyaTIYHvMBi0mM0mtFsBp9fO8Nxz/197XxZr13We\n96219njOuffyXg6Xk2w5HCxrMElbFp3WrodEURHFrFEjhiRDJZIYBYy+xAEcwy8N+hBFSpoHpwma\nh1QO64faLZBYhCsrUWNJlmMgSjS6ZmJJDilxFsk7nnP2tIY+/Otfe1+Koh4SkWZ5foDA5R3O2Wft\nvf71D9/3/R/0kSiQJil23vKRN+2bv3/uKRjbrIm0rbVwQMiuGE9urQ2IMz7wWVgtuahW3UVMcfDV\nxenzAcslFOYB8Gt3kTB8OHCgI0VLGiOfRPX6pmkZ1fz+ez5051tG4peNwLMswxNPPBFSgY985CP4\n/ve/j8OHD+POO+/Eb/7mb+Khhx7Cgw8+iAcffBBHjhzBN7/5TRw5cgQnT57Ez//8z+Pll1++5MmZ\n5/2wGPwheeQVp7dJkgBO4sL500jSBFEcQakGU1MDVFVBteE4IvU3AMIpCCUQpylSmYMnr0QRde3D\nEjgalCqVJ7R40o5UhB6pm9qnQDnKklPtGA4C5VBDxQm2zm/A9q1bUDcNHGSov2lfK29qotaeOXMG\nb5w7h3NvnKPxUklC7M1LWJoICEkpc5ZlgeqLqT6KqoE1FmU5RhwEgAjvDQDSb07np9BbJ+B8dBnH\nMWScEHFHUnTKEYJ1DkVdwVGPjh46RXrQKukDghQZM4bdgWjz0zOzmJlZR0gHbdDUJDJW6DHgHaUu\nWhheEAfzBKKLG0KRZ7HSBqCp3P3BAMI51HWDw4e/jaYqESsFo1RQdJSsf+MPSCkE8l4GbbSH7kVI\n0wxbNs8jTVLMzs1ix8/sQJZlWFyi521qauAjxAEaXcEaahRrYwgWCsAZII4T1GUFow0cKghBQz1I\nG1NARlRKo4jPBwcCmM6oJqqbBpFKkPgIuxiXqMsKLnGII2oQ8iQhPlzYSTCblCN12uAaSUqT3GtT\nA0IigsDnPncfDh36OupaU6O/KDE3N4faa1Svm5nB3/zdszh95jTuveeXUZUFnNFIIoXjx09gdnYW\nTlgI5RDFEr0+CaNpXdGhzrLPOUEOrW2QZTHKaoT1G9bh3LnzGI0JRdEf5Dh37hysI1hnGvXw8quv\n4oUXX8K69RuQZhmWlhbR7+fIezGGwxH6/QzT09O4YfsN1DgWkZ9TeWlhp16vh1pXa6C+xngF0DiG\n8s8YZWcOpafNU5akqKRT0aCJLt6bHeyg36eyhtaAvx+Wa9T+GXbWwnoyEJN1uO/CJCOOwIUQEGh1\ndLgGrrVBFLfzAJgEdjl72xIKN074FJqdncXhw4fx1FNPAQAOHjyIj3/843jwwQfxyCOP4N5770Uc\nx7jxxhuxc+dOPPPMM/jwhz/8ptcVUARp8yk3N/0uZrHpxgZIWBTFWFlZoSjKn5QWDlXt9ZudhCwk\nrDXI8pw2hCZmHMnP0gYDaG6kkJI2qITHX3vYjof1FFXpYV0IG9IhhmlqoqD7UkeA4jkgiQlSmMoI\n/c0b8O6tm4IGi7UW58+fx9GjRy+51lO9NDRJRqtLaDqU+TgmIfyyoEabawhqaUEDBLTVNFVE0aAB\n21DpJo0krGkguJttgMprnicJkZRyv+a2oYiSkTlKxnTAKUcbSQIGBTk46yV9I0BmXJYg8hJ34ytb\nBWfjfHlBiVY/IojbGwvlgDhNfDoZh+zAGoMGNErNOkA6gcbJEPFIKWABNI61uB2KlRKssFdfuAAV\nRThz9hzquoHlLE4IzM7OYstmUlYcDlfRS3JMT0+j16MMsN/PMT0zhV4vRz/voWkspEwIcgnGHQNJ\nFMNojXJctfMNDYtRCRQF9XaylCamW2ugG8IX93p9CCFbJqhPq7rRHZdmulEkQDh+o61v3EXQRqOu\namyYW4f3vncXnn/pJTR+jZuGsqk872F5dQVJnODVo6/hvz18CP/6rjsxN7sO5y+cR39qBlGSwjQ1\nxkUBJywqz1zcvHkzlJLo532sri6jKEaIohhWW8SxQtOQaNmGDetx9uxZrEvmEMcR1s3NEp6/rvHt\nP/8zvPzyK1i/YSOElBgOlwFYzMxMwTQlpgdTSLMIG+bm8J737Ai9iy5m/2JbWLiAJEsCoihIIDhH\nk7dk+7zwfuryAEIvzUN9WcitmzmEA8HLIPAhwdfUNA1qH3hy9NxtXDIDNzB6Nc00YGPn3uiW59El\nkL2Vva0Dt9biAx/4AH7yk5/gC1/4Am655RacPXsW8/PzAID5+XmcPXsWAHDq1Kk1znr79u04efLk\nJV+XTyUAfrqJCNMwGODOjUzANyqUxPbt20E6wdTIGRXjgIFWfmFVHGF1NITRNFAAmvWcBegQdqga\nwqdG3rEJKWiklh8KwWUVGUUQhlDqggq89IAIL85kDYyhzUGNPetPeAUVKdRVAZgGCimsNlg36OGO\nD+y95Jr8yr+7D4uLS2uIIuNxgWJcoKgqLA9Xsbi4iGI0RlFQh7upyUlGSYwszWCchbUNIkUHEzd3\nlBLQ1vhIm5QeI0G4cAFHqI1E0STvhKafVFUDZyl11cZ4XLCCjMmxO+tCTZvukSJVRu+0I6Hacknn\neaLySFtKcc4hZh0Z0Jrz7Mg4Sqg04UhPHRBQSeYjLe/IJPEIjLFUb5eAdRLGAHFKCnOrRY0sTpFl\n5LzhiJW7vPwqNckTGs3Hg5DjKKIyjbCYmppGnqeYnp7CunUz2LZ1K7a9ayvyXo7Y136NBeIko/KM\nIAafgwAElVIiFcFoh0rzoWaRJAJVtZY8pJsGopOxEpbZhvF5TEoqyxLSz9O0FWUtMJoa30ri7l+8\nC0Uxxt899zzm1m8kyF+fRsXleY5xQUqPy6MC/+vPHsHNN+3G5vlNeO/OnajrEkJKLC4uYuPGDRS8\nWIc87yFSMZq6AZxAL6fGqvCDngGNOE5RljVG4wqzcxGMA4RK8OxzL+H111/H8uoQGzduRNWQUuJg\n0EOWpdA14fp7+TTefcMN2PP+90MbIE3zMCy4K4XQtV4/p0i74/i01iHT473EwVHq9Ws40FBK+X5H\ngzzPkef5GmZu21tqxxiyNAL7pn6/j0EH5cQIlK4MAqsdCiEghQtQQd4vaZqi0e1YNc7CLmdv68Cl\nlHjhhRewvLyMu+66C0888cSan1+sMXGxvdXP/st/fRgApb97338z9u65JdCEx+NxeFhXS5IhXVxc\nxPS6meBgm4ZwllNT04H80DQGgwGVZgaDPqw2WFrkIa40/grWQQoJpRKoSPmhsz5qdBZxnHpH4kka\n1sAZhJqo8hNCOFXm9KmsSlTjEWREI62UTKHimDrLcRoYarGKUTaXnjS9tPAGpgZTqGuB2ekBSB+8\n8fU0iayXQ0mFNE6gtUGjNdI8w9Fjr+Efjx7DwtIiVoerKMcFnNUAaM5lkqYYj0qYhupzWU4OuWlK\nJJGCEkRmEkJCyIZ0Go1BHgtIFcM5i0g59PMMVTkCaLwFlauiCPANYt1YNMbQkAMBZEkengFnW2q2\n8A7UWkOTihzgtEGSKGJzybbRS+vrAEuaM9ZalJp6A2nczhiEA6RKiIQjBTi2kT6zSyOqWVe1CRmB\nkl6jO8owHI4QZwlUkgIOKI2GkrQ9zi0NoYYjnLmwDK2PQUX/F1aXEHDYum0b9u3dh83z854Bq5DE\nhFyiRqhArBS01F79gRqZVDOnCI3XxPq1oDjBZzU+C4lkW2PVNWUyhLqwlDHCkeZ9lkLrChEcfvmX\n/y2sM3juhZeQZTlWVxr0BwNUlUOW9TEcjxEphempKTz1/R9g6/wWCBlh29YtEADGZYPRqIYQFEVm\naYqioKwwT/sYLo99aSeHtQLORnBWIs0zbNy4GSdPv4HRaIzHHv8LwNEYw7m5DTh/4Q30p/voJTGi\n2EGgRpzEmO4TAWjXzt3QtUVRM3t3LRTvYjPG+IOzZUAGyJ93xOynEi9fCx+l82tG/ve5hs39p240\nza9PGuxxCDS11lheXvaTvFoSl7U2lDB5NF3bc7FIfWM6sICjCFIBf/t3L+Bvn33xnxeFMjMzg7vv\nvhvPPvss5ufncebMGWzevBmnT5/22tDAtm3bcPz48fA3J06ceEv668HPfRYkUu9TxLpBWRagJlIU\nqMNKptDakvCRNeHDpimJFfUGA88KdMjSDE1dIIljPw0HmJ2d7jT8bKhrRiIBDGCd89EL9RiTNIZw\nxOiJoxhOWtTO024daVxYSxCkshzRYSBBBBVJkauLBSAk6kp7gXaLgVdSVJJ0Uy5leaIwXl2iiT6w\nMP407ucJITJMBVM7DEdDPysxwbAaY+O6aczfvg9QAsY66KaGsDWSmBA6ZdXg9RMncPLUWdRNg7Kq\nMRqO4QQwNzOHres3oDHUaLESAASsAFZWV/w0pBrLq8sYj1cBQxGigAQclS+coJG0SaoQgTr+1lCE\nkcQtVBSgKAeeHCF8wzKKIyLACgQtD/6aSFbUXxRwUA7oxa2sALHwIkA4wupftLRFTY3QVmiIJIKd\nIELWaFT6jZhBS4HGNxeV11HRVY046wHCoW40oiT37MwMcBanTp3H6VP/x0+kNzQ0JPUDGXy6Pehl\ngCOphZmZdRgMeuj3+9g0vwk0BUeHuieANQp63ak9XUq/1ppmu2YpAI4mqe6f5HTtZVXg3xz4JUgp\n8eJLLwFCYnmpwfS6OdhyDKViNFpjZXWE9Rvmce7CIr71rf+NNI0xP78eO37mZ7Bx4xYSuHr1VWyY\nncFoNAKcQ9M4pAlxAJSMEQmBhdVVqKjBqR//BEePvYZjrx+naVBxLwxwHo0oA8izBI0uESugrseY\nm9mMbVu34IP7bgdsBGcs8jwK0q5AWzq6lMVZSgemzwCbpglZHztCq6luHXlpCwmEtTW61YK31iJP\nszXyr/x9Jp9xJtQVqWJnzqVgjvj5AOAIvK5rSNHiydlJW2NgLHDbrTfh/be9L2DZ/+Rr/+MtP/dl\nHfj58+cRRRHWrSNyxeOPP47f+q3fwoEDB3Do0CF8+ctfxqFDh/DpT38aAHDgwAHcd999+I3f+A2c\nPHkSr7zyCu64445LvjZFIr6G6euVUmVQqu0O53mGOOp5AaBW84MkPBnmM6TFsg6RErBWoywbOEN1\nQaUUYhX5pihN5ImlQuMUGv8+tPjWY1pFODwCxV5FpMHh0Rx1XcM0GklKzsAYDRhL+O2oneRjjEMu\nW/2MXpp5iNOlH8QkijDVHxCxQlGpAgCapqIRbwaoywZpHCOLFbIkQaU1at3ACYs4zghfCgslHHRd\nQKkIvTTGjne/C7t37UKa5nAQaAwNsZUOsMOCso+UBjxbYeEkUNYVZCQQpzGp/0EgjnIcO3YMr7zy\nKs6cOYuyqjAqSjgoCEFaM0IIOADFqICf+OVTzgixUlB+iDBtNO+giHYIJ4BYSkCuZbxxc0pJhcRP\nbfcVrSDuaK2Fs4y48ZF2mkFKWn/p+PccpFBQkYBKFeqqgnUCRaW94wR0bQDpYPxBYQzpxxQliVEl\nloYvxHHk0Sg09BnWoTHAcFjCelRTMUixurKMcTEmPXYAU1M0s5IEkxymp6eQ5zkRqAYDzG/ahK3b\ntmFudhZzc3NYWVmBUhGKYgxraW6qdcQ3MNrAWg3rD+HxeAwVRVhaWUEUJ/jcvZ+FtRbPvfgiBCQW\nF8+jP5hBkuRIkgzWOiwuLFNNVgBKxThy5Md47fWT+O53n4KzDhvWz+Fn77gDmzZtwlR/gGI0gtXA\nyJY4cfIkfvzjH+Poa68hTjMqaSYJAIVeP0fdGJw9t0DT6oVD3uthNFrGurk+jKnxrhu2I1IKu3ft\nQtM0KFfH2LRxE95YPh8mKvH9v5SlaYqSx6eJVnHTGILbclORH5TGl1gUGJXmfZFo5YOFIxDHIJla\n8wzy73KJpK7rUE4piiIctNwbYx0ZLruw44cza2ZvEpy18fBnEVQ8L3doAW8DI/zhD3+IgwcPhhe6\n//778aUvfQkLCwv47Gc/i9dff/1NMMIHHngADz/8MKIowle/+lXcddddb35TIfDon38tLB7gJ5DI\nVo+3e+Fd3WSOvBjZwDXVLq6T60l8ArJD7goMdUsgl6ozdXURjG0HjbL2QRdbytfGTuli8D/feOFr\n7ACw/1/90pve85mnvr3mGvnB5dflBghDCwkqZdYMVaUmS+Lhajr0EpIkQe29KXe9hRAYjUdIsqQt\nU/A6+vSQzRkv2JOla66L118IgdpQtLGwsICyLDGuqcyjmwbD4RDaGCwvLWE4GoVxcGVZ0mBomfl1\n4/KChZBR2ARc37bOwVSenCFpmAf/Ds+n5Osy1sJCh/tmbNt0UkqFGYb0AQFn2t+9+P7yuvPfJ0qF\nEVxCKY/zJlEzgh8i9EsiQdEVbVxAG41e3kNVlXDOQ1UdP9eANY2XNKZykHTAhvXrsXXzFmyYm0O/\n36fMJZJEhJqZwfrZGbp2n7k0TYU4iQEBNLqBFRGe/uu/wVPf/2uMygIqSaDiFElGjOU4ph4AnAMs\nad9zCUL68YSXwlM7ZxHFBJt0TqCpDbK8jziJUdclIAzqusT0dB9NU2JmQJDOLMtgjcXWLVuwa+dO\n3LB9OwU6dSuxStLR7dBuIQTet+8Tb9o3R577LgB6DrOMgiTG3FvLmijtAZDmSfi6ZX6Doge05Ssh\nRNAr4fvf7fnwPucDvnHt7FRGefFrdXVNpJSh58Pvw/LCzPBkBIpzDrf/i198y1LKZR34O2VCCHzn\nW3+6ZsqJtRZJh9DAD8vCwgKmpqaCE+eF4YXvCqcnSRKYbezkOZ0C4LvwhDCIoyjAFhlrS0L4bcOD\nyzXC10IZyM/NjEC7Fa2m9Hg8DkQkTquEEEELmannt37wzQ/ik9/5n0Hqkp0138yAPPCHTtM0xDK0\nLWOL5+lJISnS9g80O3bW5+bPQF3vBk442EaHtXDOYTQcBmREkiRI4oQadobISWzsiIuigIwUpqan\nw/2RIglrMBoRtX/KY4UZFseqd8dOnkZVljh79g2cOHkCyyvL0I3zSm2UAUlJTWdyki44dmuN/zmN\n66IMjkbgNdYiz7OAGmh8c4sp8HEcIUlSrKwsBwZpt97Jzw1/nwOCWBJTlO+JsRbattrS/EwqpeC0\nWcMIJIdEGaExGkLw2DQJpbzAm+chwFo4YxApheHqEFkSe2nf2uuq+IlQSqLf62HD+jmSJNi8EfOb\n5zE3N4ckTyCgMBjM4B9fex1/+Ed/hFprqCTFaFyiP5jCYEAyBUpIsHQDP/NCEJ57dnYWsO0oMQpw\nAGMrGONIXkDz9CvKFtIsRhQJ9KdyCOEwWj6PPM+xbmYGGzdsxAf27cPc7CypKWbUPJwaDFCVFVSc\nrNnfAHDzBz75pn3zo2f/Ckq1LFsWi7LWQakoEPTYZ6Q5DdXm2jSzvZVsCTjhs3fWgAMrfu67IlhS\nSjRaByE+43tBsZfG4H4bACRp4rMmgkyzdQ8IXl9rLT70L+/+6XPgf3H4v69x1kopGoDQgU4BbRee\nf483UHeSfVfVLcDWOr/Pi9xNYbR3wPwa3Ojoji7jnxMdeq3M6MWSpPw3PLVaSonRaBRSLiYs8UG0\nd/+db1qX5/76sXD4dEkm/PqsDdyiPgQg2oeNHY6zDlqvPcSMMUiy9vAB4GdStiUshqppTUMyunRe\nVkrjBzmOY0QdZADfDwtK68uyRJ7kVNLwa5ymiW9aUu2jruqw3rIj55okMZpGUz1fU819PB5jaXEJ\nWls0zmBxYZFYaoJmk9ZNAyfoICmKAkoprK6sYGVYopfnKIrSN7B02ChpkgZNHSklCg+97MLWGAHS\n/X4cx4B24bP55kj7d/5rKbzao9HUZ2H0ukNw3PzcEEOPtEW0ITgk9VeovxBJio6lJHy/9WstfCkR\nhkb3Sd8whgTqpoZQEnNzs+jnfQjrsHX7Ddi4aRMe/YvHcPaNc4iShC5fSsSKyHRx4pu5QNg/sWpZ\nrKwJQ44NcNB+oLIAbFuGaJoSSaIwLlZhrUaeZ1g/08f09DR279qFm2+5BcLR52zqGkkcY7g6DAg1\nGanOQU2Z0K23v5kY+PfP/1X4PQ4oUg/ZZF30bvnFgdiQxtLQc4AEx4Rfb+va/g1/To7Cqy6GXLZq\ng0wc6jp62alvy85+ssag8llIlxXKhEb+rOzP9u2/6y0d+FWj0o/HYxhjwhCC0pcEODJjCimnI8Ph\nMEyRHo1GYfJJF6vJs+S4+cMHQxeWw86L6ctd5861sqIoAsW53+9DylYvI3StfTrN//iGdgWbmK1V\nVVUQzucs4VLGh1Eg2XQOEq11qLF15+QlaTtENxx8PlNgcpRSinSWa3q42SGRkFGBLEtDZM+HITt0\nfpi4scwHK0ezfECVfnag1RoCgiKbokaWJuHwabQm1Sc+tCUQK4myqSCEQSKBqipRrNJouzhJAGMA\nK5BIh00b1qHf63vyloQ2JmiIMFt3dbgK7d8vzzKcPnUeaZpiXIyhG42qruAc9XdWV1fwxtk3sLq6\nQo55ag4C1ICFc4iUImSKGlDNHSD0T9NAKuoNwLMtiU8ggwMmPL6H1ymJKG4zSCklkiwNh0S3KSmT\nBAlSAuP4/oo1GrUhFI5raP1o2pOD1Q6V1oB1VI83JElrGoMoyQABnLmwDNssYJBlOPXGBS+aJLBu\n3RyWlpbaEqR0KMcFLACVZWtILfBNOCkEtJSt9K4QkJKb0lRCKsoxlAAaXaGuLSJFxK5YAR/ctw97\n9+6loMkHRaPRCL2MmpyMGFNCIs65NOhQlsVbYqK5ZMV7sy1DOJRlFbJODjKylPafNtofioQkc6B7\nDmuhmwbOtho1XS14Dg672YEQIlw/1925Ls6OOY5jypxkO6WJR+x193k343u7GvjVm8jjCULd08x0\nmlXskFhEfTAYIIoirKyshLFGXINip7O0tAQpJQaDwRqHxpukixM9d+5ccGyqczryoAGOorXWJCgF\nBNgQvybQ1ka7Trbf74M1NngAMX+moijeUt+AHxYuY/A/vsEAwoHDN7ebBbAz5ZQ8iiKsX78eStHI\nLOWHRXCtjVNHniY/HA4D+7PxB1SASrp2WEELBWwhViw+H8g51iKNCF7Ia9F1VnEco64qUJXAIoko\nrcyTlCaVaw0hgCyh+2ysgdYGRTEExhTxRnEE6RysaVCMaGOsm+pDeChqXY7xrm1b6bCIlNdDh4eR\nUsMuS4m1KaXE8dMXAFCfYmlpEefOncPy8jJWVlbaDCNSKJxFYxtIQcSpNCb9eWMM4n4C51phf60V\nTZCSRJKy1sHZBlCAEISakZIa8HQdhGlXUkFJCWkFnCZtGWu0VxD0sFltUTc07JhRUEVZIFIxkjRD\nrRvUmiJ9lUZYLQjfnSYO4/EIcRKj3++jLEtiHbqahimrCLouMC6GIaCKoxgXLozWBA9A27wlkpYK\nEaYQVI+PIoGpwRT2vP9WfPjDdyCRCqvLK8jzHKtVBWcd0iQJQ5Bto2H8cOxipQzB1+XgykTAaf/P\ngZ2UCkniQtbZ1u9FKIEMBgNPUqSSFhsHfuxLOCjjzJj3CUfhUkqkcQLhKCNstIGum4CYs9aiHBdh\nOHLsVUG5n8Y9Os50L9ef69pVc+Bck+RaFGkqt8wkdpT9fj+kIlJKDPr9llIMoPbRrZKSBI2aBql3\n6JFS4RSN/YNXNzVWVlYJ7pXnob7MN5RPQK01xuMxRQox1R37/b5HAbRTzpMkRl0TRrzf72N6asqX\nICKPfnHo9/ooS0KEpEkC4NIPolSSBlEYHTIG6ywa3SCO1uqKhOaJLwXxA0eZAeBsq9bI2sSQ7UHC\npYt+v0cRXlUhS1NEcUwpXlWh5zd3HNNwA2NJR4Kjbaq3k8PjcVecDa2srADWhPUtK5LvdCXVkQeD\nAVZHq1CxwtTMFJYXlqj+H0VoyhIy4syJBnBY65BmObI8h+hGJkKQ84pb0oXWBpIPWF1hdWWEfr/v\ndWkcGn+/jdFgof80TTCdR6jrCr1+hNnBPHa+eytJAmiDpqkDIaNpNIqy9nNPiUZvrEFZlKjqCsvL\ny1heoYEFJIZl/fANiX4eha8BwdUkIBYQIoFxAs7x8+EAbeGUhYOFcUQYMkxsihLqC0iBcdMgTjKI\nNEYUMiWHOJKQilisAJBnOeq6Qn96GsZoYuSmVFrSTUMDM6SEdsS+NU2DheEwSD1LSfRxnjEL51CB\nSgzaNtBNDWs0tm3dig9+cA/ec+O7sW5mgH4/R1PVkFGESCmMhyQSpRIVGu0Mr+VMOckSf4tF6D9c\nyiieGcWRAAAMTUlEQVTbjsK+aFEjrYNlZAcFRW1D8uLgh/tGbWmw8hkWzeMlIk8NpXhKFiGetDaw\n2kLrbr2cyINVVSJJiE+hFM2r1U2FsjBBBqSua+pBRDTW0cD6g+CndKAD16oAluOMgvZAmqYhAi69\nslg3VedoiBuEcdROCF9ZWSFn7NMUrTXWz821aSKADes3AKBIcjweh4hxZWUlNDm7tVEHIp2MRsMw\nqw5AOL05Qjhz5gwG/SkItA8cl1X44WnFj95s+z/2qXd20Sc2sStpl8Ev/3MaOXYeqGFCNi2EClk6\nz/8kB00HA0e9lCm1PQ+gRZ3FcQsaoAxSIU0TVFWFJIkBxIGdyYxRysgRHDiLlEURqaMKIXyA0h4g\nJPvRIMva3oP2DdHL2dWbyONPxrIssbCwgMiL6rNTZrlG49NtLvhzQ4FPS75BUkpcuHAhoFD41E7T\nNETSnKp0m5bUPEoxOzsb6uZcv27hZy08iCK5dtk48g2lHG2RJml4mC6GBAIISJeJTWxi/3RrJXrX\nDohmhM7FZUiSG2iHGdNrrJ2hyfua/QWXT3h+pXMuDF5Rihi9kVyrtcJ+iJ10t4QrXItX5/4SHwRA\nK7fdRalcyq6aA+eFnfPz9KqqImRCXXdSHaIHp2mKc+fOwTmacM2pTyi/+NLH3NxcqOdt3rwZ4/EY\nRVGEUgnXsLnuZIwJjc8oaieQ93q9sPhN04QBDJwacddZCBHYVU3ToNfrYTxsBW345nTRJ1zftkkM\nWV8+PZrYxCZ2ebNJHEqqVVUF4AH1Y7jH02oraa0hHFAVNNOyqhvP01Coyzr0yqw2aEyNKFGhZMpN\n3W4zH+iIi8UeVOEHVpdFGV7PaAOjWyIQ+zAORJ1zQfCKD43AUbiMXdUIXCmF4XAY6k0OLbqD0SVc\nj123bl34UDwpuytww6gLLoGsrq4S+9E7YwCh/svNRgB+RFu9ZuFYKS8sLtZigNfW0+hfr9fDeDxG\nlueAa6PswALzxjDJ0e37MPWDZ8L3nwTw8Xd60a8xexKTNbnYnsRkTbo2+tA+jEYF/vbZ57H/Q/tQ\n1zXR/QGwFj9AAAFjDPr9PqyvK/MeBoA0zVBVrWxBwPALGyLusixD4Mb+oUvU45Ir/x6zSLvQQ6BF\ny7BxuYR9Q5ccFL9NCeXyLc530Lh0wXVtTju4S9vv99801JMRHEKQoPpgMMBgMECv10PWgT3NzMxg\namoKvV4vlGUYUcKHA0MS2XnzQjGSghsibNwx7jY4uhBEdv61l4XMsizABbts0bquURQF/vErX8TK\nz94Bm9D7PnmF1v1asiev9gX8FNqTV/sCfkrMJglGH/0wLjz4HzE1NYWXfvgPGAwG6Pf7QVGQ/QJn\n3UCrM9NFk10M9W1r2lU4ELocEkZjdcsvSZLg1KlTa5REWa+p6+C5NMLlYHbaURQFnZUuQ/Ptyq1X\nLQIXQmA0GiFNU8zMzFCZQSmkgwFqX2eKFOmVBBxmFAXFr8XFRUxPT4domEswZVXRhGmPhZZSoiip\nMZpmvSAV6UDDgZ1zyHJKwWZmZkn4qoP0kMLQuDRDgwyKovKnows1Mobs9Xo9yJj0WGpdhZueJAlG\nY2qKpjlh3OvZGbz8n/9TkJk88cdfw7P//qCnyRdt09PXyWieYju+iev7VVUEmBLDKZtGe3XBlkjQ\npRh32Z1aN0jTlhErpQx6yFya6kI9m8YEaBRHH93+BONtOYPi6AMApCQMer/fh0M7yYSauy3dmSOe\nN/74a/iH//D5EA21mRQ91LwBu1IF3Q3Bn5M/W/c6+ZnqYvgvJncJITxVv61nBqyxI3VL/vtuxtZd\nSyklnKTZq/z3oSEm4zUoCa7VMk6/yzvga3rjD/8ER77wK2s4ArQm2jfd2kAkELt89tiVAuBr7qbp\nXOMFWufDrFka1NuOEYuiCMPhkO4lR6sdaK1zLmTLPHqtG3l2vyYafusXLuZXdAMgmnrUciG01oir\nAnVdhx4Yv07TjMLfE75cwlqNqjFrXl9KCTiDNE/WRMlOWNBYRhXWm4KwivT3rYEFCWHVusGWLVvC\n2nGWz+UWjsx5OHWXT8GfjZFdXRLZW0En2a5qCWUNa8mXVHjTM1658rjsoE6oSHSGJ2Jw6YMdeLfh\nyUIzXeo1f59PYL4GgEo4fD3dZkLkZ0sCrUYK/w1vgICNBj2QUdTSsPnz8aw+fhj4JvKm4dOeR3ox\nPp02WgrnEDITxrQyCob/3zo1Wmd2wow9X1hYwNzcHKQkduP09Ay0bpE0URSFOv0amrC/DufEmnvH\n4kncfa+qKjReLnZoxthAqVeRCCUxbu7weiulwmfskpr4HvT7eahnssPma18LI7NhPS6ebMK9li7W\nlgkXnAkKISD82DL+POG9ZPte3Wvvptb8N5WuPYRMhYaXlBKmsSHF7ipsVlUVnnm2bpZ6KUfYddb8\nbHX31cVsZH5W2dFzGs+/z4fI9PR0eF8mpl2My+bnj9eCs2p2Yl02K/McOCum/UREHP4M/Fq83/ia\n+fuJ5wbwnjbGQHHtuuPsOYNntBln4N3SazfI4nvBQUSWZahrvUb7CCDpWYUW0gvQ4WeaVtGwy5vo\nsiv5evmz8z3gNezuGX6dy9lVodLv3bsXL7744pV+24lNbGITu+bsYx/7GJ588slL/uyqOPCJTWxi\nE5vYP92uWhNzYhOb2MQm9k+ziQOf2MQmNrFr1K64A3/sscdw0003YdeuXXjooYeu9NtfNfvVX/1V\nzM/P47bbbgvfW1hYwJ133ondu3fjF37hF7C0tBR+9ju/8zvYtWsXbrrpJvzlX/7l1bjkd9yOHz+O\nT3ziE7jllltw66234g/+4A8AXN/rUpYl9u/fj7179+Lmm2/GV77yFQDX95qwGWOwb98+fOpTJDkx\nWRMA7gqa1trt2LHDHT161NV17fbs2eOOHDlyJS/hqtn3vvc999xzz7lbb701fO9LX/qSe+ihh5xz\nzj344IPuy1/+snPOuR/96Eduz549rq5rd/ToUbdjxw5njLkq1/1O2unTp93zzz/vnHNudXXV7d69\n2x05cuS6X5fRaOScc65pGrd//3739NNPX/dr4pxzv//7v+/uu+8+96lPfco5N9k/zjl3RSPwZ555\nBjt37sSNN96IOI5xzz334JFHHrmSl3DV7KMf/ShNNOnY4cOHcfDgQQDAwYMH8a1vfQsA8Mgjj+De\ne+9FHMe48cYbsXPnTjzzzDNves1r3TZv3oy9e/cCIGGw973vfTh58uR1vy4stcwcg9nZ2et+TU6c\nOIFHH30Un//85wO07npfE+AKl1BOnjyJG264Ifx/+/btOHny5JW8hJ8qO3v2LObn5wEA8/PzOHv2\nLADg1KlT2L59e/i962Gdjh07hueffx779++/7tfFWou9e/difn4+lJiu9zX54he/iN/7vd9bw46+\n3tcEuMIO/O1YRdezXU6wnn/+/6sNh0N85jOfwVe/+lVMTU2t+dn1uC5SSrzwwgs4ceIEvve97+GJ\nJ55Y8/PrbU2+/e1vY9OmTdi3b99bEluutzVhu6IOfNu2bTh+/Hj4//Hjx9eclNebzc/P48yZMwCA\n06dPY9OmTQDevE4nTpzAtm3brso1vtPWNA0+85nP4P7778enP/1pAJN1YZuZmcHdd9+NZ5999rpe\nkx/84Ac4fPgw3vOe9+Dee+/Fd7/7Xdx///3X9ZqwXVEHfvvtt+OVV17BsWPHUNc1vvnNb+LAgQNX\n8hJ+quzAgQM4dOgQAODQoUPBgR04cADf+MY3UNc1jh49ildeeQV33HHH1bzUd8Scc/i1X/s13Hzz\nzfj1X//18P3reV3Onz8f0BRFUeDxxx/Hvn37rus1eeCBB3D8+HEcPXoU3/jGN/DJT34SX//616/r\nNQl2pbumjz76qNu9e7fbsWOHe+CBB6702181u+eee9yWLVtcHMdu+/bt7uGHH3YXLlxwP/dzP+d2\n7drl7rzzTre4uBh+/7d/+7fdjh073Hvf+1732GOPXcUrf+fs6aefdkIIt2fPHrd37163d+9e953v\nfOe6XpeXXnrJ7du3z+3Zs8fddttt7nd/93edc+66XpOuPfnkkwGFMlkT5yZU+olNbGITu0ZtwsSc\n2MQmNrFr1CYOfGITm9jErlGbOPCJTWxiE7tGbeLAJzaxiU3sGrWJA5/YxCY2sWvUJg58YhOb2MSu\nUZs48IlNbGITu0Zt4sAnNrGJTewatf8Hq9sL34bnPZ4AAAAASUVORK5CYII=\n", "text": [ - "" + "" ] } ], - "prompt_number": 6 + "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "That's cool. Both of these detections are tiger cats. Let's take all 'tiger cat' detections and NMS them to get rid of overlapping windows." + "That's cool. Let's take all 'bicycle' detections and NMS them to get rid of overlapping windows." ] }, { @@ -579,13 +763,14 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 7 + "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ - "scores = predictions_df['tiger cat']\n", + "scores = predictions_df['bicycle']\n", + "scores += scores.min()\n", "windows = df[['xmin', 'ymin', 'xmax', 'ymax']].values\n", "dets = np.hstack((windows, scores[:, np.newaxis]))\n", "nms_dets = nms_detections(dets)" @@ -593,13 +778,13 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 8 + "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Show top 3 NMS'd detections for 'tiger cat' in the image." + "Show top 3 NMS'd detections for 'bicycle' in the image." ] }, { @@ -621,13 +806,13 @@ { "metadata": {}, "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAAQEAAAEACAYAAACzsMNYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3GeMbOl54Pf/yaFy7Oqcbw6TE2eGQaQokSJFaqVdSYsV\n7JW8a2HhBWzDgLGAYeqDYQjwh7VXwGKxNmxoLVMJEklJFsUlOQzDIWeGM3du7tv3du7qrhxPjv5A\nQ7DBobEGhhoJ7B9QH06hcN4XVc/z1FPveU8JaZqmnDlz5ieW+H5P4MyZM++vsyJw5sxPuLMicObM\nT7izInDmzE+4syJw5sxPuLMicObMT7gfSxH48pe/zIULF9jc3OS3f/u3fxxDnDlz5j0ivNf7BOI4\n5vz583z1q19lfn6ep59+ms9//vNcvHjxvRzmzJkz75H3vBN444032NjYYGVlBUVR+OVf/mW++MUv\nvtfDnDlz5j3ynheBZrPJ4uLiXx8vLCzQbDbf62HOnDnzHnnPi4AgCO/1Kc+cOfNjJL/XJ5yfn+fo\n6Oivj4+OjlhYWPh/vWZDENh5rwc+c+bM/6dcRWXS83/o+fd8YTCKIs6fP8/XvvY15ubmeOaZZ35o\nYVAQBP6u3bX0uf/78XfJ5/i7NefP8eOd72f+xZNMnC6uH7P92gjXD5i5kmf1yRzbNw/RHZ3nn76M\n56Xs7D1grurw3HMf5Q/+8FWq9Tz3bvbQS3k2Lq+w9fYOvhuQdAVq1/IUpDK9kxHj4Rg5Vug3R0gC\naDkdtWRQXswQmmNiMSAVJLJijJgKxKqGbuiYiYbtpyyXDXrTLr2pizWJ6b6R8NI/epq+u4fr2uiC\nztziMkdHUzRhhJzGVMozfO+722gVicWlPPVCBUHWKRcabD14hOBPacwofOlfHvFu6f6edwKyLPM7\nv/M7fPzjHyeOY37913/97MrAmb8VDo9vUaosMBpGvPipD1I04dvf+zZH7wzQXXj55Q/g4LP/8DYV\nWaffivn+wyGNjQW6O0MmWwLqgsyt3X30nEk2m6ETdIhtEStxcSwPIdWIoghZFdEUg9hPcY4chgdj\n1j9aI1OQGPQdAl3hwrllDnZ28UYRuZrGQqaGbXcY2DYrGxtUpRydpT4Hu1v0xyOMgsnsxjIj18YO\njohNj+vnn+bLv38DJcrxa//kF3nz1td5tH1K6IXoWYvP/NovIEcZToa3gaN3fV/e807gP8T/sxO4\n+OkK9ihi3PXIZQ1CEgp1idiB08MJsmyiZgWSxEFKZOI4wnUiDFlBFGU02aTXnCCkCUreIPZjhCRm\n8eIMvhMy7VsEno+mmViug6AJFOoq056NFEvouokV2MxsVvATF1GISbwAVTKZBD6qpCNMXfqPIsys\nSeBECECUxIiqhCAIhH6MpookSUptpoIjTrHaLiZZRFFgNJkgaBLl+SJx4hMGKqliU58tkqoB7jgk\ndXQm/T7z12vkshqtoxFJGiBLYBRNes6IxnqD/qiPmCjMzJawxqfogkqlWuHCxQukAvQH+4hqQhA5\nvP3FMcaChiLHVOZynBwPkROJn//EZ/nC57+Ea0uc7FisLy9hLhhMnA7uwKUyXyGIQhzLYhKMqS0V\nef7JjzA+PSEIXAr5LEe9JkeTFoNTn4IuI9kZBntjhFTGMGRKZQOzqNHuDHCTkLX1efSoxKR3wvLV\nJdrWKd2tHoOBTylTxR3bxFHC7EIB1w0QUxAkKKwXKc0VuPH6XeYqy5w0u8yt1ZBLIp/87M9yuP+I\n17/9Ko89eZXj3iOW1q6gmXX+l9/4vR+Ku6v/sELgJIyaMVEocOWli+SKIq39h5i6ztL6Cl/+87c4\nt1FAEz1EzUAoljnY7jG4N8ZtxsRAaaaEuaIjOHB8s4mYEZEimdALUXMGQhqTBCFpoiKIApKSIioC\nC883kAsuw6FHNpuwulJhb+eIYqGM78dokkLvoM/S2kWMiokadImTCC+WCOMUQdFJxITJZMzBA4sg\ndvn4x5/GnVoYWgl0uPnmFjNGgftv7mNPBaKsTNqQQfMJvuq8ayfwvheBtU+qTA5lvK7A8pU60kyI\nFCWMu2PiSMK2YlRDxLcSlFRA1Q3a7T6mrKOICpGbENoCaRQhZGQkNUESEzwpwtR0pCRm7bFVvv/W\nXXJRFkGMSeQIUZVRBQUlKxMTM7Utqo0idjRAU1WmnYA4FCiUDFRFRI1yPLh1wkc++hLf+qvvIooS\noR+gKSpCnJImECYpV64uECoDNh6/wF/+/lsYCoQkmGIOOwgR4hjjnIaTOswsmmTzMsOeT+uNiJXH\nTIS8j9tNsEegSSL4KSIJQlFiKNjUKxqKKBMEAsVslo1zi5SrOdqnp8wvlphOjrFCB1mucHzfx6yb\nrC+s8Z1XXuP65U1mimX+7Euv0Fg0ufH1KUIkI4QytfN5li/PcO/OA1JPJnAtinoWYx3Cusi58uN0\nJw+pFKu0DlsoUsooHZPaMeVajq1vDcn2SgiZGMEU0EsKLhb5bI5ey0bFQAhiVmYrxLrG/f0tKlqF\nfnuEIakUCwZRnGBNLUqlGsNRn0xBZuPpc6SJR9fpcfd7PWrFKnPrVQZBi/VzG0yGe6Qdh8Gpz2Mf\nXmWYgqjk+Kv/4fs/FHcXP9UgQmS0HZARMgydNsaVLD/94afonjRRs0UUQee1b36bmVlQcrM83Dsk\nmWZIWwHFUo7hYIyQFRFiiciLkT0RQQFv4iMgIWkqMgJxkBAlEbOLOXqdIWuX69xv9Vi4niNXdnEm\ncP3SdWx/wqOdI5aXF7BHNqptokh5RmHIhU2ZOB5x3BmjaBqaXmRsDxFSgUzGQNN0HC/Cdh3yhTKS\npnK632T7tTZJL0UMNATdRtcMJn5A2InetQi879uG/aGBosVoFZfhYMKjb51y92sdjh4FdNshhWIR\nRSkhZyMa5xSWz1eolHWCwCd0Qkhi0jREUFNkWUASE0ggIxgEfoSqRdSWZFQzxRcsFDUijRJiL8Lu\nRUx6fcYjh9RR6O5PKJkN+gcCqSeRM2QUU0IoJXhVkbWPlZFrEVEYYSg6mmYQOB5pGhOGCZoYcuud\nPZ76uRd4GDxCWpbQKya19RlK8z/oFmRJY3xiYQxh0JmQeBpm0WDjp3L0vCmTBwFON0AXRSI7JfIT\nYl/AaTo8PneZ0S2Dgxs2oRUymrbo9Hpsb22xee48+ewKvmUyHVlEkcX5K+coGHUkQeSxyzrlbIAj\nWFz76cc4ak+p5jSEyAfJYmm9gKwlpElIvZLF1CVkQ+T4pk3nFYeu3aQ/dPj+mzt4XpZxMyAcGfT9\nhO4jB7uX0I0nTKYBsp4wmIzQjQJKIYfnRszOZanWa3j47Gzdx4wVJmOb+VoDx/JpnYyxeyM2FhYw\ndBHdVInjiNe+8X3ObWwyl13m8qyJGrncefMRYpSnVC8zt7ZJUlT4wGefZZxAsZBBlYN3jbWykSVx\nQcmIDIY9JFlnflLiz/71NygYWcKkh6x5fPjjz3A8DmiPuyiYCLhoFTBMhVw9g+9FxFaKpIkIGQlR\nlIgFiVSSMDImtmvhJh6VtZSZDZNnP7ZIbPY5d1XliceeoJpdpJ6rEvkWsdCnsaijaqBLBnu7R3ha\nSHFO5KDVoe80ETI+ku7iTU5R4hAhhvt393n1lS103aSRqfHN//Vtbv3RNve+dIrsaghSSuO8xNWn\nL2KnDtdfvPQjc/A9XxP4/8ua+JiKjipqeFOXNJSQxQRhKCM5IsedPvXzAv405f7pCNNwUVUTWRXw\nph6GpoMeIsYyRioReh6CJOI7NkJGZGa9jJx4mJHI6tUG7d6AaCAQ2CFaJDJbrHH/YIjghaxeNBDj\nEYaWkk4NJlOPsizjhDZidoAswKP+XZ7/hVXK+UW+8cevk9EUbF8mm5HIVDJ88KPzjCb7aLLKiy+V\nufuVDoPTKc6xgCIZZPUU/AKON2T5apWRN2LihuRNWJuv0x6NEaSIpOsTRiAoKmoqECYGumiyuFSC\nnIkd+CzMXiCNfApzFUZTG98bMttYYrA9QorKvPrmq1x/okh/rFKpB4iSDkmB/GmW5ttvUKnoPPnc\nCqN0Qqw6REHApJUwm9dZu/YkgqEgtw7ISiLCYIqhBeRnK0SuD/kUa2IjozC/ukIyaSFNHcJEQFFE\ncpqOa3eJ9Annnqhjdz0IYlJSCBVUWaOQzxJ5AQigZxQWaiWanROUjIEuxbhewtLGPH0zorha4e27\nKYU5kw9+5Cr3j3f41uvf4EMfep61xzYZWkfkihkKlSJGIr1rrLnTBC2j0D0dkCsaGFKB/Xv7+KlI\nMo3QanksN8YdOGiTIk4rYXo6obxaIinGNLf6ZOs5DF1FzMUIUkpVrdA96qPIICKRhDG5YpEwdHnh\nZz9AkHaY+hGKpDMexrSOmuw+3OPSpXWyxQr3b+2Qy+hYox6KaLB8dYVJapMr1MjX5hGjeRbyMoP2\nKbFh4/dEBDVDQSzQWMtiOyP8aUBjpk77aIgu6SSRQH0jj63aTLQ+6x+YIzHHPzIH3/dOQPQkvHFC\n6gmIkYySqBCIgIDneciKxLSVstRokBM0tJyBkoFcTULQEhQdJFVFLkBY8HGVmM/85sucf3EBsmBJ\nDietXT7+qy+wcPUqIwvGY59UEnGEmCc+ssHGtTql5RyJqqAVi4RySpiJqJ0vEMkuOln8/RS5IyCH\nBh17xP6wy9K5BZB01FyMHcXYXsRE9vFkAVXx8YWIdEZHK0qsXK4SiC4jzyNEAEtj+kAk2ZOYMUoU\nApXDRwP6LZfEFvGCHGpB4Df/xS+RFDU2n1phd3JCWEuYXVpizqzz3d+/T9KVKKQao36f6bjNaNoj\na5YRQonnn7lKaqmE4xJb93W+8pUH3HjzHn/0h3/CzGyR2nwBqapSWa8iFw0mzpT1K0Vi3UfLg6In\n9PtDpmmfvU6fkpGhkFPZ2FjD9UycQUIWgXvfOaRzanHxxSsoBYFBJ8LuBti9FHvsEoohY9enedKh\n35wihDK+nSLEIVHsMztXYmFunn4q8I/+i9/gxU8/xVOfuYRYMplZLTOxuiiGjt0PmF1tsL2zhz9y\nWJ9dRAhypImImRcRzYi9k1OGfftdYy0WRIbWiEqjgJRRSMUUNxZ47KMztEoPcNM+UepTnSlQMxp4\nhxaSoKJ6CtNmQByLZIw8SZqi5gzMXJHj/T6uG6BpBoqhEIQRQeCSJiL3bm7TH9sMfRu1VoAstA4O\nmK/WOD3p8e3vfJdMpsrxkUcuU2I46NPvd7EmPfYfbnGwtY012GP3wW2mww6CnWHQtsjlVKpLeULR\nZzhssvuoj1r0WHrcRJ1P8cwp9cUK3W2fk4dTdDmPmc3+6Bz8MeX2fzBJUUEA1w2QBYWEFEEUSbQE\ns2RQa5hEfkzrsANBgtV2GB9PwU0pZ8vUZos4oYsXpORrIpV5AWSdwmrK/JMms/UKlYUL3D9s8+//\n/XdIvYRy3cSsp3z0s3PY3hEv/9yLPPmhJ7EJ2Wm2MEsKWiniqNlnaoXYUxdR1HA8CWfiYsg6FTnL\n/qMW1bIJScT1JxdZOLfI9reP6J7s82jHQYqLPP/iU4ymAuPAZXa5TiomeMMhiQTpMMQ0y6SnMv0j\nFfthjJrIxEGCN3HwhyIDZ8zzf/8ChydHuK0xvb1ThoPbbG7G1GsJi6sprhWyUJkl9BxOm31quTl2\nHpyAq7GweY1nr3ya3RsnfPgDz3DjL/ZQUcmaMOoc8+DGAd/4vZu8/vvbxO2QjCmyv3uCZ59A0qRc\nEYjxeOLSCrVSg6EXYzkTXnruEh/+qessLjTwWyE4GifxKVKmSDCKyeUqLF6ZQ1I17CBEznnU11Wk\njIgkq/iBRxiAns8wmnrc2nrE4aMe/9O//F3kWoG0mueZ/+hJJnEfUVCYdvtIdsKrf3yHk7csxH7A\n3a8c8JU//Db9kcPhUY/Twx6joY2sGO8aayvLJZ5+4hI/9wsvMxUmPPfZC/ziP/sIpwch00OD1/7y\nEFlQCeUER2uTn1MpzVYYDCyifoqUiDQfNgmtkCQU8ByXWEvQCyZ6LiUMfVIEjLyGnJU4aY540Byw\n2+4ynDgYGQM9D6opo8g6wcRkcuyT2gI791qY5DCNkI3lKo9dOYcphaQJuGHI/MJVDnsjjJUZbp82\n6XkeqSEwdkUuXZ7liReu0PenRCacf2YFtaCjaRpSICE4EQ9v/OidOdLnPve5z/2Y8vtH+q3f+q2/\nvh78PwoFwqmPKMg4XkhKgiIp6HmdOAwYTSaYeR3f8iGJkewEOdSJ7YipPeXlT12FzATSlMpsCdsL\n2Lx8npE7wu52kRSd/V6TB9/togUgAZeuLJEYKR23g1yrMRxH3L13hzQNyFY1tEyImc2QkYuMTixE\nQSWJU8xcymBio2cU8hWTxEsZ9Hye/rklwrLF/EaVfhKC7DFrlokGFV795ttcvbrI8U0HZ+wgSwpZ\n3SQMA/K5LMfbLeyRSzwOqdXnsL0JXhDxi7/50/zUxzbpnrxBeb7Gzp0+omvxoQ9fJi7YdBOLgZiw\neT5LJiyyffsBdmDTPhhhtUcksURr2qe8vMTdR3/Bkx/N851XekxPXHQ5JZzEeKMUdxpyYXORhcca\nDJyAvcMetdkaRi6L5U0wix7lehlZM+n2RwwHA7p2C7mm05lO8BWJpY0F9rYPkcwYuaKwuDiH4wwY\nBxaapNPqDklTAVkQMFTwJnDp/DmcccjQbQMis7UGV6/MIxkhd+9uU57NUKoWEIQhmYU8X/yfX0UO\nTfKyTCaXYf0xk6MDD9fxqV+YQ9AUKtUZZFPhtNXjn35/8ENx973/+EWyBRnL7tLsjti620SZlSlc\nKJMRfOZWFjAUFSf0yTdyaJkMxwc9dN3E9xMiz8XQTCRFJrIDgqGPLOsYqoIfBLiRC2JEIVdgY6HB\noNOmtjyHkdHRRA28FAWT3qiHomiMuxM6dx2Wl2bIlxTMnEw+XyRMfe49uEdWEdh6y0IXSmy/c8K0\nBaqUZ+/eMeFYpTKTZW+3j6REdLotKosLoAjIOQkn9PBSF82ETE7G64tMTlzeLd3f9zWBzYsqN3d8\nEkFGig2iwMOLAwQvRZRkNGTssUcukyMMPERVwnECTNNASgXkjEp2KQ/ZKflCDqWocOP+d3DDKWpa\n4q0/abJxeY5cOgIHfMtFims8/vgltk7eYRy4lDI+Uexjewmm56B5BfrbY9ZXTXphgpKKSIpHGEg8\n8fg1bt68Q6HUYOOZOqOCw3Ds0zd9vJMmojwBRFwFtHLME5+8iuSqXH+pyIOt22R1Ab/rEXkhCDFa\nRkMQBQRZotVqMjtfRJU83tm7QWcsMbdZZO/oEf/gH/80ncExo3aH1qnC5sV5Fp81sUcn9Ntjyovz\ntKw2s+t1DAz2Dx4Q+z7DzjtUFjXGXZ/73+xiJCBJKkEcE0gSzz77OK+98ybrawtIRQXJ00ALmUZj\nUiVh5HhoiUX/voM0sIjCFL0mceeNe5hKhcGpQ2L5bD69hD0+JFZVTvsHRJGAlGYZDnvIigJ6SnWu\nTNB1KVwUuL13F8GTCNwYSU7ZH53SbLdYujbHwrk8W9s3eOe+wkxhnoXBCcKxgtGQOf/UIl5qo2QF\n4qiPisydP7pHZtNAv2Kwe7BNsVx811g7me7yzhuPuPrkBulU4vHNCs37OyxsPIZoqghRDsfrMvUi\nOrsThg8jGrky/U4XPRB/cM0ydcllJXwSQtkgCm36U5GaXqD+wgyXLy9z740dFs9J2PkK+0dtzGLK\nac9FVgSMjEiQxuQzMqYgI9YicmLIg1e7PPGJFWQEgtCjkC1hJHB1IcdomDLcG+AkCX17il5WKcwa\n3L2zj66CE3gYqs5PPfcUX/rLP2UyiJAxmJ3NUMhXEUOR/kHrR+bg+14ELn58gZ2vTwjDFFUxab4x\nRhYkXCtGzXoYVYOZfJ7pkUvkJZRKRZ68togxY3DU63La7eD6KcVag363Q+zblAt11FwZsiJqVmL3\nbhsjK1Eq5xFnsmztvoU+d51qtsxBf5e9rTu4nZi19Rk8zYFQRZUEPvPLn+CtOzfoHe+w80BgYbWM\noWa4cvlx7p3cxsxtItVztN026cQiNAw251bZOdqlvJIhjj26vQhr0uKZKy8RmbMUzBQhTLhzw0Pz\nf7CQpOcMAsGj1igTpB5ziw3mN89RqhuMvBZ5Ig72b7O89gS33nrIyUGPDBnqZZ/Ai5EBy41IE4PM\nbIm52hJqLWZiHWHqJlZX5LU/7yClCUIsk6YiYeRSq5eglvD0h65xaB8QRAFGTqE2X2biTLAtm1ym\nAEHCyqzE0a5GXtKYmZ9hPOrguxIFMUOcNckpJn1BI+2FlPNVwiRkYFuomSJoNlceXyMOx1QLWSai\nTrlRYbgzZuf2kMXlAv12n5XNBVQ15fTWEQubM0SpzME3Bix/cIlyEYZjB21JpVZtsL9/iqQKqGGE\n40dcMWbpb7X5e5/8B8Q68L/97g/F2ubyC3TbNoEfcOGqhhePGbd1Tjq3ePYjG4wn+/iRQHV2nsxC\nnbR1zIc/tcpX/3jKwAtA1LnybJl4pss7fxGRqQiIDRl9X6OymmXntVOqmxkufXCdV7/zbTYW1rha\nLyCkItkNlUk8YOiHTKcBUydk6ASsbBQZTEZsnqtiRzpCYjG2ulRLywzeHpDicXwSkZYUGnkNQ0sZ\njWP6e2P0okq9DkkqMF8tIUoChlFAShKuX7rGK1/4PhP6TIYBgfejc/B9LwJtRcbLpFxZ2GTr5gNE\nSaBS1RB1gcVLi9SXiuw8atM7ifFlhVZvhCCEvPDMS3BO56Szw8jqMppO6XWmNBp5XNGmoGfxHREp\nVtEwCIcezeGI4qKM2YDx9IA49KnmZbRFFaFY5uhRl9ULNYzZGq3tEVZkIWVcNl9c4dTZpr0zYuuN\n15BCiZnLZU6PjulOAlLfQTUEPAFcL8WdxLT3WwzHIdNhzLUnF9g/ustk1EcX81jRlP7AplAuMbuS\n5bTdR9dy6FWBwBPZ3Wny+s0dait1Js6ISl6nWs/hy/dYv3qRfKPDTGOOybCNEKqkAgRewOryPG/e\nfYcg8AliCz9VEQAl9Pj0Zy/RfhTw9T+8BYmApIl4RYOBOMQJOySRQ9bQ6U9d+idDIi9FlzQMKUdz\nv49Q0hA0CcvzSB/28KIQU5KZti3UWOCoN2R+uY7FBN+OaHU6ZLIaghShZ1QyCPQCh4HbR1Kz6KlK\ndU1FqWRwY5twlNAe9EhSn3pjDl3IcPGDT3Lpgw5iGPEz1TJf/dPvcfKgxf6DCUYkMleqIuagNx7x\nws98lGlk8c033uDClWvvGmv/x7/+Y4qbAoIWka9qZMIy/bUT1momSnxCURqRmhmWZmSabpc0ZxML\nA9aedTn8PJSKAitLVZKyjn2ty9y5Bokg8k74kKc+ucjYHdB5sEf+ssr6UoWMGGBNQmaXNhhNpwiS\nRqfbYWl2nWmvzbVn6siixIk7BTOhu3/ItQtXiUY+d7/eoZ4vc+IPWX28wMANiAKXyVBGSFLcoQNq\nyoc+8St4nbuMBx32Tt/BqEhcXd9g984RqiJgyCbO0EcVJFzid31f3vc1gf9uZsTq6gX8YMzC1Tky\nmsy151bZa3bYfGqBfmzz4O0WwkhBSUViQUCKBG69sc3RvWNGXYdsJmV05KGmIpevbHLS60GakJdN\nklhEL4IVOKxfqpMaAakakMllcBOXsRcysCOEWCGvCKxvzjGZtimsShi6hhPZ7Nw9oncsUV2vEAU+\nWqpgWxYQYKgmfjdkeXkBwxBp9h0IoVQ0SNyENIRhp8fUm2D3U9qHDr1ugGgraLUcfsHm/FOrtEct\nZhbyxEmCOw7JuDHYMakNXlvhtNmhaGjMrTYYTyw6zTahH7I0v0r/dMzGhRV2jh6xtrGEkNjYwx5L\nc3PsPmwzDFNKjVUWLi4w8Rw6vTGaBG53RCbrMB1PMU0JURTw7YSikWO865OXRNKsiqFnSBwNd+Ih\naSKSJ9HaHxOOfHAi8oU6SpoSSALjjoc1nNJoZMg3KiAnVOazBLLMeDxicWENd+ohKgJGRkNQE8Ik\n5KWnn+boUZNh32N+bpaHW8e8/tYtHt5pcrDfY/1ag8ULC8CY5Y0N8oUGmSoI2YRIsSktzPG1r3+D\naxeuoigKn/n63R+Kuy/8/DlypSyHvSayVCCfmaFUazA3O0fkTbHdCZX5eZwkZXXzGhtXSjSPbjIa\n5vnN33oC37KRFIdA8BCTED+NmF1aZH2jzsjaRxg6rMyvMgwPMWSVg3d6lEsVxn341tdvsLY8Q1nL\nYk8tFpZLFOomDw4OMXImkgC7p2M+/feeIWs4SJmEpBzzoZ+/xmDYJSRBFWWyiUzOqKHJEnHsYYUt\n8jN58APa/SaziwvkzArv3LyJJpp09sdMOw74EnEcv+uawPteBP7tM7Okic/B7j5xmLK4MUd/esrU\ndsmWsjinMYNbY0QEPMtHSRMsT6JUzuFYNqolkAQpmYqKIsUkoUMSidhjj9Ads3F5hZULq8xs1gnk\nLtmihCjLWLaHWSoxHI7JKDJ5TUYuTPGiCY6bUinMktNVvvC/v4M/FJgp5ihVVLqjAVdffIJcXqF/\n0mfa93EmCVM7xBpJTKcuTs9lcuwQdkUyOYOZtSKFmXn8UUTiJlRXZGw/RNE08rUKre6A9bU6O90W\n0RikkYBRqdHtjVANBXMu5sM/9ywZI0en2yZwbR7dO+aJpx6j1T7FcobYvs/C4hLD6QjTELD6bVR3\nSs0t0dzpc/utHYatANGU0fMqsxfmOffUKlpFRzAkqvU8mpmSy+eYOBGd4zG+H5Opqth2QGW2QmbB\npHMyIR5FaImMIEjMrjcYjUeY5RyVahXXCph4Lh//1Y+xNdiisrhAJIaM+z5xkmJNh3S7DrbrMbFs\nUEQM06A77KHNZEGIkdwYezwlq+Xpnvb55//Vf0kQhhyfHlKdmaU3OOHu3htoZY1Crcj5C5u89d07\njPeHWMMeZlHiV777w/vk/9U1DVkxMIwSCgWMTIFmd5+Dox00M0MtO4PbnnLcTPg/v/wG559tMGqO\nmdss8/aNLo9ff54kApeQfEliajsUCnkshvT8Q1JV4u2bfRbWV1CiCM122Xtgc7htETou+UxE4Fns\n7k4xaz3Ifj3HAAAgAElEQVS2tvqEYxU8jdbJhLXr80g42PJ99FKEUa2QrWjEU5ejR30mvocbuZQL\nBjs3Bvyn/82nsYWQ+ztHzC0tETgpFWWGe3f3OX47oXPPJnRjYj/G0EwCP/jbuTDou6c4ozwr85e5\n/50Ttl/7PgtrGUQBPHtKvViklS0wu1Zn5bklvvnvvkPcDmlkSvijIaksE4wE+gcBRkFicWUBJelT\nUEuMRxaCJtIcDtl+9YD1izmUYgqig57J4XseMin5jELRzPD690Y89UQdpTJlaa7OH/y7r1MqyMQT\nidZOn15Hotgo8HD7JqtrM8xsaGhSEc9OEE2Zie2hWhKWl5LJqMgSTPoBMRpXPryKsqrRTI8ZOxa1\nCzmscMIg8skUNR50WuREjcqshFZPeHBviFlQibyE8Rhu3d5HyQ25vLTK994+ZX02jzXoEcUuQeJh\nZlL29x8gmylCOmJlxaQzSpByKp19n5d/9hm+8rs3CPshjfUi1tiivxuw8tgKpqownfikhLhpiFYs\nIfgpQirTPx5AVmQYpKgYFJbyDKcdMhkNQVNwPPsHOwSdAUdbJ2TyJrWVAn4ypqBLTAYnREHEqOui\nKjKlqoyYaKiCSOAGeFKCmTHZ2z0mI+po4wQkASXUWJytYCxI/Pf/9X/LSz/zGEZVZOB0MYoytbCI\naoCfDDhsnpLTRS4/fZn79+4iOe++MUYUIPYDpqMpvf4esqQhKj65nEGv28eTFPQwYLk6x+3vHbL3\n1g7r5TqjoU1e0+nbTSbRCV1nQJzWWLt8HS8IufG9Y1aWCsxUlpiWpnh9gwfbj2hIBcaTCZIekc0V\nCaUizWaLzceyxEmIIAWYpR/8nj8QLLZfP+a59RV6fok4VDAqKgIS46MQ3ZfRZ2VSTWYSWTz/D2fx\npw9ovXmfJ5+8zt7th+RKOaaJx2PXrnLzS3+OFkpEAqiGQSKFPzIH3/d7B17+jVXiWKVcbfDKv/kW\n159bYfnaDHd3H+EKFhdmL9A5sRENyDdKVDMN/ur3vsm8ZtLr9nHNmKXzdSYDj0QO0CoK1VWFmdk8\nqS9z594+mpJl2PYoVAUaSwsQg+9GTCZ9Zhs12v02tWqdznaPYX/C7GaWTKaKn8ocP+zgDVLcsU1p\nzsSTQgIpplCQqFayqLFBrzfEyBj0pmPUsUiYpiCKqEaR8aGD3XcghpnNPKnscnrqoZsgqyJz60Wy\nhQrff22LlfUcZtFHlA0OvgBSIcW3XLLFDIVZGX02JCMaFLIqxXyWvWGPcmWG+zfvsbS8Qq0xw9Qe\nUC6nHB8dI8vLvPPGA5559jrf+sJN5LHEB55/mmbzgOXlMje2djj30nkSPaXZ20dII3KlAqqlc/Nr\nx6w9WyPwxwwtj0plg/Y7/4rJ6QukifY3HTJn3hPC384biF7+TzbJGAWa7T02F0oEeRUp9Yk8lf29\nQ+YKZeYbC/Qsi0kYkSlncNshN7+2xc/+zCZeLkHVYyb2hKkv8uBbXX7q788zcC36bYtGbRUEjaNm\ni1ROCKKANJFR1RyH24eUszKiGJOrFijqGfyxh6wo7PcC4iChc2fMUx+5RCy3CQV4uN2hOmuSkpKV\ndNrNKVk9y2DgMjsn0TqxWFufQ1GhY3mcbo9Q2zqSIuGFIStXqgwGfQanPpqgoeQDHE/nZ37+MW6f\nvEOIRyxILAyX2N07IfVkktgl9BLkisqn/vFzeNGARPQZWAHVSoUHdx8RuSlrq6tMA4sk8clmTQRZ\nYHDg8v0/bbJQqXP16TWO99o0D5pIKuh5mWHoUVgxEc2A8dhFEGC6m1CQMzSeq5JMBQbNHr2Hf0Bs\nf+JvOlTOvKf+lhaBF//JPKomoukqml7m1s13eOHZxxkN+vj+hGZrxAeee4ne2OLB9kOMcoTv+6hK\nHslN2XximeOjG5iZMmM/IhMaCEmKHbpoapnbd/YpV0soYojjBSSJwGTqI0oC1WIBOYpBEglkF3ea\n0KgaLCysMJ7G3HllFzyR2FCYW80i6S6O72I5LghQyhSp1+t862vbaLJBJpOSrRn4SYTneqRAKWdg\ntS3cU4Fzly/QHh4gRzDueUSugG4YRInEpD+itKJj5iAOVcb7Htl8Bk1S6fRG5LQM8+erXHiuRqwG\nhOmA/qiHKpjIiYYqGLRHfWzfYW19lYltIcYSqgiGm8VDJ4hjvvEHbyJIAo3lEjlTYxwM8FOPTNGk\nXJ4hCnyO7nYpZfJMGCMFJkpWpnW7Can+Nx0qZ95Tf0uLwOYvKSiqwEx1ma7lcWmuQeu0Sb5kEsYR\nERK7OwcsLq5wetIFGZJIoD+csL4xQyiOmckaWCOXkR/RqFdI04g4lQk8CN2EKHDodT00I0USNEAm\nDAJ0TUbPKCALDMZDlufLkHgcHIN1HCCPU9wA0kjALGmEZY+Zeg5r4uBNQoyCSrFWwPcTYsdjPHDJ\nVytMrTFppGAfBZSrEmLNB1vEyNapzpc5PdoisjSmoxgiE2cyQUxicppJEtlEsUQiyqiSDPiEsYDo\nKCRSwK/850/S6oX0xy0qCzrTicfRbovF+SUEKSESRCRBwh5bIMBobLO5sUiqSezvdxnuWpTyOYIo\nwus55Ip5poMJ1thBkzNEQYhmKFh2wEyjRrffxosT/Fb0Nx0mZ95z714E3vd7B2qVBvl8nXavTxgN\n2D2+Q37G5NFJj7funXLQH5GdK9KcdDHqWbS8gJqJyBUlDENFp8TW20OEWKVuFhm3xhBJECWosoak\niJRqVUQlwbZkAl8kGnv47QgpUBmPfUajBNcCaxJjOSKzizWqtQLjgYgq6SiSjBiILBWW2VhaZtqN\nCT0ZxxbonyZEUxP31GDSTAmGPqGTIIUpmazCuA/dnRg/SJkMRozaNiubF0iLElE5IclMWLvSoLqa\nI5ZSIllD03RUFVLJR8mqKKZGVLT5+X/2BK1pi+29Lbwo5fBwSILKysYSreEhTuqRm6ngpQmWn7Df\n7FGolTkaTTltjyhXClx6apVmZ8BzL1wHMaVz1McdBazOr1A2ixSNHL4dkctm6LT7BD6Uq/n3O0zO\n/Bi971cHiH1qMw2aJ10W5kpMpyP2D9rUMyvkVYmbt++RW0zJajm23zpFrcooRsylyw2EBFzXob6Y\nwxMVCjMVtEoJ3/PRFJXI84gSm4OWRSCCqKWokoodCEiSDKGEKOmc7PTJGwV2dtIf/EeBf0xpTuXK\nMw0e3msjI2FPPLbe2idjbEIgY1RUMGRiO+bozhGio5IxdYJeTGG+iDV0SMSA0oKJJOioioCeF3GC\nIVYQkCkFaIUM02OP7rRHUdfRr+hM9hzCXoqsSqAqmLJMdkEn0jJMQpkHd8c0Kg1KtTzDUYdJe0K+\nrJIvichqTK9/AILE0kaRmdU845ZNIqmkaYo7irn/6CH5vMLYOcEoRxTqFS5sXODP/ugVrl89z8O7\np9TKFSzHh1RB0VKuPVPn9M4Pf3RzHzMpFfL4HkwnPVRVwYoVJCclGAeUGgW6233MSo7YE3C9AEPT\nUQWJyXTK4vUcgpRyetvCn6aYCkiyjuN7ZDIZ0lhhanX51K89z3b/EamU4AwtivoMd755jGRKVDey\nP9iyPB3Qa/fIZbKkAdz4/fYPzXftn+qQilyoncMQDQ56dynlDCQ9D3KOYd+j2xqzMJvj9HCXfitF\nMOH8lQKCoKDIKiQxjuuTVUysaYCIzHBqMTyeEpJSqpoImkcUG8yWCkSyQGWxAGFKp9lmvr5ENlfn\nuP2QbqvL3GIZQdS59eo+q8V1bt3YonxOZfn8Kt2dPkkEly6vUZnL0RzeZzDsIEsykZCyNL9JQanw\n1uv3CIYhWilELqX4jsbJrTFSoIAU4IURSk1m8ua7p+D73glcurKM608RxRTfD6nWZigWF9HVEqXK\nEhcvX0BxipzeH2GYCnPzFYr5LId7A75/44jVjXOU5+qUKzrDyR62M8Ge+AxPxvTHPtNJRL2UoaBp\nYCccbQ0QEomBP8BSXDRDIlcu4rpj9JxHJgcr5+bIlgvYUY9sVidNBcRQQQoEtt88Qoo1jJwJYoJa\nzjG7sIgiivhBhD/2cFouOSFDOIV+06W1M2bvZh9nomIUDU4GbWRFoKRliUKYW6zSH9q0TwdERkKS\nD/jV/+wTrDy/Rrs3otlyON2b8u0/vknQFth+65DJ8RTGFtHAJqdnqVRqIPjYls/BYYvdvUO27pwQ\nOiGJbxHaLouNGQpGkc1ra7Qnh1x+bpH1Z5d49f6r/Mo//yBD9rn40jz1ayXa9gTbdzl/vUaqvPt3\nhRhqDA4dJk0LyVOoZedQfYlGrUC+CIHtIYUy3thFCmNyqog/nSDKEasX5vDCEF0PCEcpkRdRzhfB\nCzCNDJOhRb/XIVvSwRRJpZDICcipGvdePyG2EzKJRP/BlFf+7U2so4SSOUN/YDOzPPeu813IzVMz\nZ9neP2KUxhTKBq44IBVl3EmAdThmut/GetQjpxf52V98ho3NJQ4eTvCGAp4dEQYSleICnZMJRwc9\ndvfaxHJCdbaGF8QEaQCRgt0OOGz3iDyJV/7kNoGv8tQLL2NHIyTNI5/PYzkR3baALpVwOyHVXJaq\nbBA3Re68sk/QcfFHHt997R2+/GffIRRLPPX8h/nYx34BScihGhmmYY/FJY0Lz9R5/IUrfOz5n+Zk\nt4dqCBSXsiTFhBc/+Rgr5ws/Mgff907gu2/dJQoEFhbm6Zz2ae42cboJxZkivfYUXZKIRwKiIFK6\nXGC2nOPWnk1GhmpB4WtffZ35dZ3ED2nMFhiPbZJUZnl9k2988Q0ylkZSDHnq5cvck7awXJ+59QbV\nUELTDCJVQrEEwkEZRZcxqxGJZhPZkBNzjIZdxFQjk8kRuR6uG6AmIrGbolQyjB51UG0NdCBMiIOE\n0IbB2KJcyuPbE/xIIRFVWkenzOTzOAE4tsdCbUpjM0N/64SV1SyTUOa5D1zh9s0t+s4+XfEYydCx\nTyxERUaUU3wzoTyX4cbtR/zSJz/A9tEjHLePZVloukpkhcwW8uSLJS6dW8R3RTrTJmKS8M0/fwP7\nKOLppzcZjX22j054/OISjz11jePePoop4isBvVEftQgfefkDqIWUg9b+u3523kmElIdMUWDa1bn/\n9i7ZYpnD9hhVNpkGPkbeIHY9kmyIZQc01or0hyPciQ9iimCV0PMRwjAiFX0URcJOfZ776DlW5i/y\n+d/7Ao92HzFwHJRQo33gUshoGDMlNFMk7g6JQoHhSUTs6Sglk9aw+67zrWZnGY9djict7ty4Q/X/\nYu69YjTNzju/35vTl2N9laurezrN9PQkzgxnSGooBq24QbLW4NIyQEhrGLBgQAYM+0Y3BnwhwjCw\ngC4Mw14LC6zXWHElW+QqjChRpEjOkJNDp+qurq6uXPXl73tzPL5oA8ZierTwXph6L9+Lgwf4n+c5\n5zzh/+/JWCUDU1JxLJsPD3YpyzJRGrBYW+CHr7/HYqdNr9bCHQfEo4yFlWWG44hKa5HuikM4D3j7\np7fQhMfy+S7j6ZzmYhW5HaFYMoEfY+c27/7Vx7z7/Zt0eiqnpwOWOh2CQUDVKLj94TZV2+bo4BSt\npuBPI3RZUGv3OPaPSaIEZWLw9h/exP3SGENKCLyE/f0dGpUSx4MZmhNSWWzzlz94E4SCJ3Kef/oJ\nPv4wYv9wm27H+VQf/LknBtd/zSTPJGRJwnUzskDi2oULGCWHcCax/e5tZKESuhGkQKmg9nJGd6GD\nFVvsDffJ0xzDVhCJRsmqMBrOWFyqs39rTr4nEwQhSZ7y4q9cZv9gwvSuRzgP0CUVZ0FDaDJpHiNy\nCXSJ7prDbBqh5DGEDuNDH0OUScQMTbchL3BaJVwpwEYnCgNSr0BFQc4EmZZTFLB5vYs7mOLOU0ot\nHbkMRhvcIMOfJiipxlpnHUIfx9GIQ4lB2ufaq20kOeX9jwZIO3WCyQjdsVEsgWZEvPLV6ySZx3Jj\ng9vbHxEJnwgX26lgSAsEQYYfT8kLmzizmEcnVEo2HOQQSGi1lHIjxqq1MewyUZ7SajYJ5xHvvPkR\nRa6xcqHL3tGY1z7/Goae8y9/55NScquXqohShtWSmU8yKk6FoEiQJRVDMpmNQxQ5Q9MLVjfq3Phw\ngF0z0DSBpFiEbkA0iFAiiapZxtRkQlFw/Zevcue9exxuu0hJhlopaF+o4XsxUlggkGk3WwyGfaqd\nEoZj0GgvMfTPwEiICp97//voE/Y+9Y0ek+mMkm0jqTKLK3WiaEyaPbrZnRyMyU8CjIrGysoCx5MR\naa6CFBPFPiARxgVhmrG61EKXVcJ5zHiY4I0jUq2guWJRshWiQICiEroKVWz8swBD0WheS8AEWZik\nXszYc+l1O7j3cx68d8qlFy9QX2gxODnltH9G74kymukgzRVe+vI1TibbpNMBfuwjqRYry+cpORX2\nj/aZBRH3bx5ybmODzBG8+Pzz9HfPaLZ1BsNjvv077///Qzn+//Uz1QZZkYIiU2+AZ/lEVsrWzXsE\nRxGFl2DJFqmfoqUagZ/R85rc/N4phCr15wpajQqapLB/7HF6NKBRN0isEL2AcRQCKoYs8/4f30dI\nUCQSdqlEmoaIFPQiQ1U06ktt9o8OGWx7bF5aZ/9sD9kKcCoG+SxGTmREnqIoMkE/QEgFkeUjlwWO\nrlIkYJdMOqtVgtRFrWZEo4RSTyXPQgzZwMgryGWf4CClGCY8OD2g1tPpn+Y0GyVe+9J1duc7zHEp\njjMy3yfyMxa6ZY4GAxbXNI76hzR7XW7s3SDT0//n/Q6qXHo0154mhFlGmke0G0tM9vrYehln0yBK\nYzS5wKkKDk9PWSgZeBMfVa9xfLBLb61DmkUYJZnWos6N7bdZ6jUfi93RwOPa+gprV5qcDA85HU7w\nJhK2bjMfD3EHKdVFlbBI8BK4/FyXK9fP8ef/11t4wxGqrKKUJJrdEu5ghN2s8/TL57n57kec7YSP\nyEnljMwVTM+mFJpAMnNqdhVv5jKbxxRlGbuSIPIzTEdFliUk8fhKhq4ZmKZBmmdUqjUGUw9F0xn0\nz9CnJjomsmoQezLvf3BMksaEUYpd0qnXTWIRI6QCw5QYT8a0qxW63SoH23t0l0oEqkCIjPlpgpJA\ndXGRSsMiOcwZ3jmktFTmhYsvcOP+exzfHiLpCe3FEkKTaS/WmO1mjKcebjOgKHssLZUJAh8vcbEr\nFf7iz35MYYdcv9TFMTWccovj41PCcJtao85ir8dTTzzL2ckZO0dHfHjnHdaXljiZnqCXtE/1wZ97\nTmBwNMaLfOyyQaXZQFNUbt95QOiHqJJCSauRRwUICckAw8w5eHeCPtH4/GdWWW2uMO8b7PzUI+sb\nyEIiCjOK0KJabpCIDEVkZFEBiYBIQdc1irLP1VfXmE0T3InEbOBD6rO00kKEcP/9PZIZOCWTOIkQ\nuU6WyaiKTppnFHkIZMRJjCZpaIaMWs2Q6wmBmOHnLv2Jj+snlFsyIjM42wnYeXPE4N2Qml1GaRlE\nRcZ8NgMrZu/I5a//cof3v9fn7g9dWmqLJzcvoiky5VqN0E8p11uM+jEPHmyTqR6uF+JIddJQp65X\nqeo6S502cRKRKQm5cNFkQRD5GHWDTJ6itSXoqJxGCe5oziRReP/9O4xHKX4YMJzOuXP7ARuLC3RK\nFZLs8XRdRk1Q6ZRYWK3y0quXOdxJUROJbJjhGCaNCybdCz2uvnQepVqmtbDI0cEhdVuDSGFtuUFj\nUSU2XIyeROtilR/99CbziUfJsmit68Rqhp9nNM/X0StQshtMjgv2t4e0W3Vs2eGZKy/Rri6iaiqm\nqSDix8/NziZzRC5TJDmnx2fsH/c5Op5g23VWeis8ef4a+UzCOw2IJgGtpQrNjRJOW2fqR8S+wDSh\nXrJJIxl/muC5OS+9ehG9lKCogqeeuIoUyki+yWDnjN039ji+d4hdMUimOe/+6B3yaM6l6ws8cfUc\nJ7cjJocZfuIRZQGD2ZjYDAmdOZP8jGbb4cryJUZHI5LEpWobaFS5+caM2z+bU+2co9RZYDyYkvsx\nN268SxbHXD2/yObiBuOzKctLK7izT58l/rkHAd3I6ToSDVWwUtZZqdW4urrMqy9tgpUizJg0T5EK\nyHOBjIWUPSLhOBymVJwLHH40JJgWhJ6PSDIcSWfv4z57W8cYlkFGgaYVSKoMWkJOjFaxGYsJq8+W\nMZogJSb3P5py8JGLpjksdbt4JwknHxdoOWRJgO1oaJqOIjR028apWHTaHXw3wi9CKu0SvpbycDYD\nR6XIMhqVKtNBRDTNadUWKRk27knGZMelGBUYZBiq4MLqefQ8IDoYocxA2Tc4Gc+4ufcxv/yNL9Be\nE3zlHzyB7Vic3g+oqxXK2ATjFK0iU66aHB7sE0UBdx/skGmCaObTdeoMd+c8/OAIbxag1xrMJz63\nf/KQq8stHK1MWzMIpx5SkuKNXJYXelTKJvsPBxwfDxiduo/F7td+/auMwxmTYMr2rQP+3hefJ55D\n2awQSj6tnoVSzHGEjloIXHfED/50h4MbLk5WZf+DPg/fCajbbeorLW7fP4YoRhRQGILSpkTnSp2X\n/uNnCF2Be1/gHwfUNAtLtzh7OMYfRHz3n7/OD//oJ1SqKoU6p1rWH2tvGPqILMXUDUxFp+RrZCcx\n/lnCna0H/NWP/hr0HEM3aTdaaCWHdqOJPFaphFXCWcJib4nFZhsplzEUk8loxumwT4FJFsg8vHXG\n5etX8fSYZ760iVWXKaNTqth0VkssX2hQL5exTYGjOyhFhmpMqdVNpqHPxnKX+Ttz/A9MvHsmpwcR\nYz/k6tULGBXB8y89zVE4ovtEhYPTB2zfvUddAkuT2Ts7BlPj3/7Zz3hwOMCdZ4zHI3bu7LO99fBT\nffDnHgRMdHS9zNbHI268c4/B6RmFmjN2J4h6jFKWUCUZ0zJQVBlJkrAtB10z2Ls34J3vvIsICkxF\no6KZWKqBG0SYjoJuqFimhqrIkGsoqoypmbQ2GuRaQLlaxmgXNK4avPjrC3z+Vy4g4oS5O+fouI+u\n6uhCJQ5UhCwTJwlxGJGRo9omdqVMmKSYlk7NKZOEgjIlWlKNFksEJzKltkU0BOEJ/KkPioRl22i6\nTVFAo1wmONH56KdbLLV75EJBlUsohoYs2fh5wiw+5NK1VWQ7olqDq1cXiZKEo7MRbhgx6WdsfTRn\nazci1jS+8NLLSInCykIXy1SpdmxkU6IoIowiY340piIpTIczjkenhL5HZ6GKbgqa3SpTb0zgSZwc\nzuh111Ckx5NU5obJ0uYSb761g+flHO/tkPkZp/0hl66sYUkJ99+f8OGfH5JMUrJwwj/5ja+TuTK6\nImFqFeyizO7WKVImEfgZWqBRtZrYnRQ3daEyYjTbYrw9pNWuYtYy2k/qlJcVmut1CiejVi3zla++\nxHQyR6QyYfj4vWaZNrZjkBcxkReRuAIlMZgfuViFTalhklclEpEzmcxRopB6uU4a5cwnUwxURCjz\n7pu7ZGOZwjfQbJOT6ZgkDxFBTLNZsHdwj9ayyd139ojmObldIKkKwWzEe3+8x/Jih8mwjx8ccfF6\ng3qnxtib8cQXOoT+gKIP5bSGcmTgJFXyIiBXC1Y3V3nzrQ84ORlw3D9FKjQmEfzl4V08NcSyZLbv\n7PO1f/gaux+eoQoVXVfxYo8n1q9+qg/+3HMC/kmKLquUO23c4YgkTsn0Pt36AsVUJYwK0DQKIM9z\n8qIgHscomoIiK8STANuwIBPIhoZuyMRyQkaKLGkEMx9ZqMi6gmwp5EFBq9GmWXUY7Z9Sq1QI3YKt\n0xmjh/sYik0hpZy7sMrO/T1kkVKydfxZiCIEuZqhqBLubEYQGSAEAkEkMsIoRfYViiLF1RLiIkZf\nXSRy+xiKBkmOV+REYUBZLaOlGnpqIqc5um4y8QpUxcL1PKoLJZB1iFVu3TpG0gWXntjgrbe3COQQ\nVRGEnqBeq9O/GxOdaGxcXmLnwZjDvbewSxpnkxGGYXLl2nlODsYcPjzjxefXKV+tsLK6yk/euUuc\nasS+iyggz2F+OqVklQjGEYtrXe5t76BWHk/hvbt3g4PDUywbbnywz3/5m/+E0cHrTIKIJJURac7q\nio0cm4hIZvdeyFt/8m/QJQnDtkjmEYGf8tRn6oxPfJRQx5tniNjFPy5YtSq0FxtMplNe+HyThwOf\nznKFqTvCXtOQNODMRJfgve/fZfnZFr4YkX6SXhCAIJ6jWg5JERFEGbppYtkKaqowGM5oLqlIRg61\nnGcurhKlIXIWMI58euccVCTG/QCVMpai403nxKQUuYI7ljBUjTDxMaUqJVPjJJ1SWnDQU5liFNJt\nLFAcD/jr/+WIME8pNwuqyxIaPpNB/Gg0e3UBdzpBJeS5V9rcPTrk7s2MjSeqJImMbupM+hmRJ8gH\nMZevWaSlVUTi4819ijjm3vtvooQK27fvE4oxumlitMqf6oM/9yBgGw6TvQCjLjB0B6WIWO8sc7J3\nQjbNUdOcQlLJ80dCI4okQwEiLsBQkFRACAzFJE1TQhGjWRK2WSJJUio1iyQtELlGIIfIWsHx0UPW\nFxrUaiY770+QYwnDstFzm0KHaquOm/kIXSeaxDQMg0RRKYRKfUklkQJEqJCnIAsVbxIRRAW6ppEV\nj66TummQzSJObpxhKxXyIifwQ9SSRb1iUO3ZeIMZrjchznLkREKkAlSJQkqxLJnxzKXRMWivyQRZ\nxPd/8AHt5R5HJzPamkN30WF8mrK0vsjg9GOm/owoC5BqNsk0oVJrsLO9x8rCKo5lMjoDPwhw04B7\nP7rB6Z5ANiMkLaWim8wnKb1OHUfTUXopczHm/PUlpsM+h4/BTilkLp3bpH9wwEuvrPHmR29z/jMt\n3nz7PiPvAXkiqC6omJJC6gpG/Qg7V0klgaLICClDWAlUSgwOfdZaPQIzIfIL6lrOYCskDcbU12Hk\n+ThViUwpuHTlAj976zaGZNM0Wmy9/5DmhQbtRQv/rMLUnzx2r1VaFvVWDc9T0W2VxPWwbZVSo4rt\nuUTKmcEAACAASURBVLSai5QdhyzxOTzcw5QV7nx8RLtngFEgJB137KIAVGIMW0LTTQw7Qys7+COX\ncq+HoWsIWePKWpf77xxw8tYIVcqRJQMvyEEI7EqFeBSx8OwlpuyxubbCx9/d4ab3ECWVKBYMutcW\nmdoThjfHUOQU8oQke0R1WGQC+5LE3A4oKxYnbkGSxCxvlHDsgouX6uxsTZCUKmejKdni9FN98Of+\nHMAHr+8y25tztjdiuhMx21Nol8+hxAqRGz8qawgJWVHIi0cUSaqmoOoSQsmRlYJUJGhlg0IuMC2D\nIAyIopAwDBHkCDHDtFW+/I9f5cUvP0ukzTBrBr/w2jOPsv5SRqliojcEbjJjwhQ/8ciNgtZGjdKy\nztr1RxyEUkslUyHNUrI4Q81llByS4JGQhh8ETCcu7XaLKE1R5IQkjLn08jpZnqJaOd3zJqUNDaWn\nYy9AqWVQ6hoo9ZjKosRTnzvHtc+d49rn2jSW6rhBgaqU+OjdPdYrKyjCZDp00Uwbu6Ox+vwK5RUb\nraQjkbOyvEqRFXzhC6+xuNKh2bZpdxwcZ5nlxRcxWMaxbOS0wMgVKg2Hbk/BqqTIWsKLL1+hUhaE\nyYiNxcc33zz3zC9QCAnJcPibv9jGNFTK3RqvvPYCtWqVWq2MO5UZHvls3x/QXDHorrUolSDPPHQV\nuqsK47Ocum5RJAVxPEUrRchOTGelTq95gf0tgwob6KJOEjn8zfdvstRZpLfQodwtU12q0btW4+OH\nd1A1qFYf3xijYPBg+wB/ljA7CXHnCZZT4c6NYwpf4HohR4MhqSQo1cosbp7jH379NSJy3DDAjX0k\nySCdx5g1nUwumD7wKJub2FYZx65w684+9+4f8tHWDY4ODsGLyZIE3TARRUbJ1JBMSIhRHBvdWCB1\nK7z9r7chMFAzQQ5cfHaN02jO5QsvYPs1vGGB5bRYbaxiqjatTp2ljVWMUs48nLKw2sSpmWSSzMm4\n4PhBid2fzhlux7z88kuI+O8wn4BR1ZAK6VEdW8mhyEllmVT4qBikqUwapkgiQxISsqQgSwqGqaMb\nKnN/hq4r5LJMqVNGKUvMhnNMR0fkCUphMD/wePK5pzj0HhBnCSLPWHvKpiSXmD3IuH93hKZKJIpC\nqQlCFtiOgW7ryKpFHibIusLx5IxKy0EkJuG2h5RKaHKJdJYQJwkSgjSLKDs2kg5qWaFQoNY2yPKE\n89cX2Pr4iPFRRO+igaTHyEKh2lhkcuJRXtAx9YIkC1HsEs1WlzgckcUxezs+m5vnUSODN779Dl/7\ntQs8mPSZpAF+LOMOEtqrdaqdFqE7p12xsEwVSSkoV5rMZi4Td4oVGXhTj8w0GY0m1FsazbZOngkq\ndon+2YD19U10xWQe94myiCxR+PH/vPsJHO1Ni6u/0GXz/DJlqcZ3/uB7qIqFP08QcsrnfuESWZrw\nzpsPKHcq2FqF8UmfIpYwVDAUFbMqc+f2nKpto2sCTImFSyb9kYcUS0xPChy7TBRGRHlEpeaglmSK\nckG1K1Fz2mRFjI6KJiTkouB4Z8L9H3/y5LMuafQWFWqtCq5fcHo6xdBkRK4gFTKhnFJZLdPpVDjb\nG7HYrmO3qyhyzv7xA8zC5uDtCRtLbaqrXUzD5r0f3kHoMnN/RrVqI+sFyAKzK0gDFds3GR36VMsG\n/jigXHFICpVQpGQEVFccFjagWykRj01+8ucP+Mo/epnDyW3WzjcZ35rz/vcmLH5mmVyP6J/2WVho\nMknnfO4rTyJrHm7g4nsehm5x65aHZWnIkwRxJBgFKc989SpmSecv/9lbfzcHiAxh4WgGru8RhCG2\nZVAoIYbmkGYKRZZiGyaqYiMkBd0wUBWJoihQZYlSyUIr66QkGE0FrSphOCbTqU9WSERphmwK1LJL\nqRWxvmmz3DNJR4JoJLGyvE69VSeXJFRdwZ/l+DMoYkG/PyNTEoRZICk564tNmBUM7owp5o8aPooM\n/NCjICMnwzAskBUyM+PKK5tItQzqIbULNr40pbSU88xrHXrLCwhhkwqZ/dOHmCWZYd9lNBpjtSxk\nS0EqQkI35PSoz/rmMhIykZrw1NdazOUx5ZqM6ZhYpsJCq4wjVESQE4YR1VadVERsbC5iOwqOZUAh\neP6VOuefkilVBStrVdqdMu1WlyyTieOQc5trJFnB6fiQckMgDJi7wWOxu/hED6OQ2N/e5Y2/foPE\nlZCCgmvn1/js8xeIRUgihTz50mXOX14kKlzMiolmyui2jF01kBSwTZ1SQyNIUtafWGIez9BMnSxR\nabdbpNGcesem2aoiSRG+51OtG6Tzgt2bO5w+HBB7j5LBRq3KpVefeqy9vc06lV4TrVGhublAYhYo\nZRO7XmE2CdnoXcAdurQrPYoTiQdvHnNy7wHe/gRppOMfQ69XZzj1ufHRLT586yaSyMmCmIZTJvdT\nxMzEO0gphgZK7hPaE+pXE3JLQqvLjGYeg9EQQYGsKsR+jpzLuNmcRJ/wzC8ukugetbpGPPK5cWvI\n819foWzKTO/6WLHD5OGUumxz+2f7WEUHzS4xm2VEgccTF8tkuU9gpFz84mXaqzalqsHQ/Tv8HDDa\nGoEIuPLSGs2VJqnk86u//hIiT0mSGCmXiAufXE6QZJ00T0iLkCRNsCydIAkJpBSrY0MpQ3ESZCMm\njwRFLoizkEvPthDWEN1WGY1mmGWFLNI4uOXzw+98xJNXL1HvVZESmbJWoVtrY6h15FDi8IMR0Txl\n3J9xsjXBQtBplkDOKESMaSs4jgmioFovo1gSel1i/YUeR9E+nfUaaRGxezhj5s2JREEipdzfP6BU\n0oiznOXVFiXFxomrhIcKFb2N45Tw/YCcFEnVmcQub/3wFu+9fofb7w2wnAonszmLay167TrEKZqs\nMhn0SYKQg8Njcl3FizK27t5gMj9lsd1gNMsxG0tEqYesRnjunCxVWFhawSpVcf0UIWVIukyeGtQr\nbV584bXHYhelc3RZQ8kVFhZrXHyhg71QoLcVlGqGbmn4eUD3Uo1ML3D9OcNDFynJScKcVORMooSN\n621yM8YqgTucMdjOyV2BZpgojsDtZ7ijOSVLx26ZqJbAm6aEg4SqVaUmWzy5uUrFKHO6v8POg48f\na2+5ZHFy5lKq9hiPXRrtJrVOm06rjRTCYOuU4ljijT94j9mxRxEIri28xMGtGadbLqpk0VpbxAsS\n8lgQzSKKNIe4YPPCBlZTwmrGLK10mQ4CBg9kJkcw6Muo5Qi1AeeuL3H91SvYJY2ybCOnEpWyiZ9l\n7PantM83qK3ZlHol6r0lLr/WpnFVxtlwSQuPYp6xsLLEpSfPUzfKfPzTe9z68SF1p0qrvkIcZsRR\nRqNbZpSMkKoK+/sH7N5/8Kk++HMPAlGac+6pJaQ2vPLy8zz1wiI52/yDf/oceQpFplFbsjj3fJuY\nAEsxqFRMnLKgkBJKVY1qV0U4GX40I/YDllebvPDaOST9kd79LJwS+YJolrDQqeNNQxYX64wOXaRc\n4wd/8lNSVyKcRmRRzuRsxujMBVennFrERwVKotBZbSKbBUZdYJU1/Dhk/eI61V4VWVdIooh6vYli\nStz6eI9oGjA6dSnpbdaXW5wdJszHOSdjH8nIyURAs62RZjHvvb1L2J+SuCFxf87g+IT+7JggEZQb\nZXb3DkmzGD3PCfdlZn3BQruFkkYsdhyuv3KZ3mabqT9n/dwSXugxGLlsP3jA5uXzmFUD3dT56Q/2\n+cN/9S4P9sZ4hU+aJ+zuPeTO9hbIClGS4McFp2djtm73ef8nD/jf/oc/eix297amxIVNpkqkRs7q\nlSpyJ2f9+fPcOZ6zvvkMlWaDOJszP+qjZgbNuow3T8nyArtpUGlYjOcjclSCKGc88CnmCtFAJpyG\nzMZjNlZWyaeCfJ4iTyVyryA4CpDljERknL96jvsPz3jvjY/oaDqV5PHb2rFKZEHA1s+2iAYeNVGm\n7TRwjDJlx8CQZLJhQjbP+J3/8bdpXarwo7/6G8JZiKLIuN6YiXvG+qUGSfRIKUvkArWQ2d66i91w\nqF8oMWXExc+s0VxXWD1X5sKlDqMgRFF0cjkhDgMi30eInEJK0ZyAIvVpGYvc3dpjEoyhXOHuw9ss\nr/Z4/2f7TBKXr/3nzzGJAxafdJjEZ3z2Ky9w+doGzz91haX2BlEkEUU53XYd/7jg/s19IENWFIxP\nbxj8+bMN/3d5wvnPLmDaCjvv9ymVawij4Gc3dihbLcw6VCpQP+dw7fkn6T+cMk8jKAwKWSWREtwo\nwbQsmuUKRVJwcjZHokDOZeJ5jJzLFFrC0pqFSki16iCbPkERYhlNwsAjDDIsUyUXgjR+1JykyhJJ\nGINQ8cKI1mqNQkgsdFdQNI1MpCi6xHg4InRlikSQ5QEz12fzQo9qvQZqzGQ+xrYFIksxNInlhQ1M\nzeDoeI4iCyTZpNGqE2tz2ldNQgJKSgNig7P9KVJe4Kg1apZNMks5f+UKl7+4zO7xGaatMY99+v0J\niprR69WxDJXYd1ntNWnXS3z4YJeT4wF1W+LF6z0WzzU4i+YkWY5AxZ+DZcPO1imIFF0XyBgYhkVv\n4SJB6OEd/jefwPGXfuOv6I9PqLcsLCGzezpisV7ibHBGe2mR/nAfW1cY7R1z/w0fPVOZuQrdWo1Y\nZEhGRjQTnN6LkLOccqmGP40oaTWSOEaRNXorHQ6396nVakRpgu8HNFfq9C60EMB4EiBpCffvnHBl\ns0uRCipLbf7Tt4efsPdfvXiO49sjinHKfOgyOnTZPPcED24/YHQ4J81yDCQ0W+d4NOLlLz7P1od3\nKTVbhHmCaueoakYqfBrlJq4bY5U0LFshVnMqPQc0mVkUUakG6PUKD29OqDotsmHC8CjDG4RkfkaR\n5ORJxoWvLrGy2MQ/M7j1w1MWFyqE2RGnhxPsdoVWfZGV7iof3nrA/smAhSsKZinnwx9O2Xu4S/t8\nBVSd/YO7iCxBFzrLnR56YTKfB1x87gkajSrRfMpwK/67STn+4X/xEnv9u2iKCg2PWrdMIhWYcpez\n/TM2rq4RCx/bUVFKEUU25fJrHRRTYj6e02x3cN2AKEiJvBhF0kj9FEvOqegKluIgCZ29hy7NtoVl\n5wglwBMRme4QTWViNwUhkJEoOQ6SJgMFOQWKrpFF0K42GZ6OaJc63HpnF6cr40U+iTxDlk0Qj4hM\nsjCh2iozGfvMRgHhOCabF5ixjRRIXFm8wtvfu0seJHS6LQb7LtEwJ00zWssVPC9g6CYkoxQ8DW0q\noQJTz6du1fFmPt7YxY9cFtfXORsfk6NRb/Q4PTlCkFGrmATehI2NFpE7YzCaYSoKJV2m3bCQSlW6\nrasMDgaMJgExOUUioUoqi4s94ihBVS2azRX8wEfRUvq3/6tP4KjU/nvCaIJ3FFHVakxGLkItyEPB\nwc4RndUFsiBDy+Hicz1cyeeVX/wsH33/Do22SmMhRc8aZFGCLBfIKkxGBVEQI+U5oZ9QZApSIgiT\nANlUWF5dIZBHBHHIeD9ieaVKpsUYTkIWarRWzjErJP7pu5+U3fpvlRkluYxWaFh1nUobdrd2kURO\nY8kkllM+//dfZe/kkFa5RqJNeeWXqrzwxXNkmsR04oJUoKkl/FGAVnJYPNdEacnMs5BKW6fIYzQV\nHEuiZEgsbZTRI4loFJP6UNYt0jhGRiaOE0ylxLt/s89oEmKYGq0FlSfWbA4eQG+hhmbpqIoEOjSb\nBgfbHl4CvVWNZ1+9xHg2Y+YPsE2DPM4xDIf790/Z3TkhTjOCZE7kxVRKJkcfzh8bBH7u1YHP/CcN\n9k5diplBoafoUg2tAO8sRpISJCejetGhbisYhkrdKjOea+xuneAoCkIRiEImy2A8HKHogla9hT+d\nUS3rnBwGGFqFcBaRqTn1FZknn+2ydzTkaDtGzCQ0VEQiUSggyxKFkqHrGpZt4PkhkZujSTqaqhBF\nAZWFJq3LZcbjfZbWV3lwYx9mDsF4RhZJPPP5Ve7eP0AKNPIooVp1SKMcJJlCEgRewrkriyhlhYc3\n92k2q9grKtZiQeLD3E+QUbAyiWIWMws8nFoZMglZ0+hVOuzuHdN6okquBeSFTJHnXL1ymXc//hlf\n/OJr7N5/SJq6xHHINAxp1Gto8aMbx71bJxxtxyxdrKC1YTILsVWTaBghJzAczdg8t8rWnQMqtoJa\nkTh645Otw1rZotVzmJzNqLWqVKo2qy91OdvapshytK6DY1qMvRmyIbi0+QJv/Mkd3N0J116ps/l0\niq5NUGULw6ySJx3++T97H7Mok2UBsqLhVCrEwaNTeqHbpj/oo1V0jIbEdBbw9JcWcIMp3kRivdxh\nOk85Hnn03/lkr0Dlikqt0SYYuFQ7BqWKwmgyQXMs2isljo6HvPrF54kCD4sat3Zvst5rcnIYcHh3\nTLlVIc0KsjwgOUspLdRRHYOB20e3ZSoNHVEIlFzl8OYYJ7TxkhC9qmMIgTfJ0GUTioLAjTFUlSxT\nEbqgtmHx6pefIjX7dIyQ030b3UxJJI2HexOEk6NlBnkcopoqlaUOmmrgjUaUjCr7wwPUkoyt5ojE\nJpurnJ2d4jQNBmdz2l2H+3/k/t3kGHz1Nzc4HQ+Y7OYkwwRZ0qh1asymE4RQuf7iBQ5mu0iKj6Tq\ndOtdDu/PUQqZRErwfB9ZytFVg3mYUnFKaKrAsU10SUZ4Bndv7KNrJkJKQUhkiqDcMEn8EE01yCNI\n5xmqpZLnBZV2GU1Rmc6nlGyH2dxDEgrLy8scT/ZZXKyxvz3m+i+tk1dl3vkXW+iRgmbpGGYZqxaS\nZAbEGfPxnIVmi0JPSZKMMEmZz1OMigRGjpZqGC2T1cs2aAFbN0OWuzX6Ox7dRZN/9PWn+cG79wln\nLv68QHgBVbnOva0xeksBXZArBWubFTJSkiLG0A1s0ySMQlwvIvZlpEAm3IPUULDbFvE0wilJ2B0D\nNwyRyGmIKvE4ZuzGSOajeYRaBbx0xsOffnIy75lfvsTJ0S5BX8K0dRqdKoNxn7qjY3cs7t0bc2Fl\nAWwXq27gjlKO34+wVJW8lfDZr9o0lQ6drkYQeujyGC1f5yffO+XmTRdJT6g4FQzNQTV0Huwcojiw\ntN5kwJiv/MJldkZHHO+EzE5kXry0wunREaECOz/7pPbA019bZ3l9hTDwcZMpKR5WzSJOPWRZUKu3\nkCVIZwFFmqFIDkkyo9Vt8+N/eUwuIvSSRqFKkKV0nyvzcDpkY2EFS61x462PaXRlPEVQqzTw7yRk\n85hCytA0k1KphigEaRQTz0KKREbOBKok8M0ULJXP/0dP01mXObh/H8mNmPg5K09c5C+//yFf+9qX\n0WXY3d2i0qpxerBPo7tBXsR4SUZYDFhpLTxSnA4EqOCNXLxhyOrqAj/6F3f/w0aJf/M3f5M//dM/\npdPpcOPGDQDG4zFf//rX2dvbY319nW9/+9vUao+UYH/3d3+X3//930dRFH7v936Pr3zlK3/r+kM3\nptZtYSoS1XMO9z5+gOJKVHUH7Aq3P7qJUpMptwxO5yEbGwt01yrcu30XTWRoioShVxACOo6NU3M4\n2hvj9yPmYw9TVzHKBppW4FgNkkgg0oxkGKCZJpFbQCaQZJnQi5AVmfHxFEkWyGj0hxNMWyeXU8bT\nEY4jo8gpSVyQZwlZoSDLMueebbK9O6RdMRlMXYLMY6FZZbHSon86wIkshCpT5BlqVcLpKPy9X72G\nF2Y063WOh9vMvBK9sk7eh3Sasj0JOTw4ZHNzAaQVvPkQaZxzvD3Asgo0qcnVq+dI9ENyeUit3mLm\nZiSFTBTHWGaFcrmFWqjMzzzmTPnsly4yDGe894FL5gqKwMCMDdRCRjNMhG1QzPs0Sw1Ojwf4Zzbe\n47U8yKyQ2kqF5U2dyXAKukexr6EZBmqs4eQKWiFj1iucTs947pWnmY5u067KUK/w8Y0xr31GIS4q\nnI4Ed2/p9OdbDE5TFjeqJJ6C2dBI+hL7+w/RNANZKjBWNJZLVXYne/QHLqVyCy2XkHMBSUyuPl5z\nb9SfsLTaoTDnRMWEwWyOFghMQ8VQSnz4YIeNjR74EY5pMxmO2duO+c/+62f4gX9EkSgkSY5paJRW\n6hhKRqdss39wQNeYcXFjkWnq0i1ZdLoNOuc7/On/+mMMRSItMmbxFHKFKIhQhYKcCxKRUlJ17MRE\nMTR+8oc3qD/X4snn1hlNbmOboOUq0lTmxz98h6de6NFdbpOFPhtPnEMkMjt3Y8qGxul2Rj/YRtEV\nEAq5kZLmOZurm6ia9ak++O+tDvzGb/wGr7/++r/z71vf+hZf/vKXuXfvHr/4i7/It771LQBu377N\nH/zBH3D79m1ef/11fuu3fouiKP7W9UtymclezOTA48a9+ySJxCScM/ZcRof7PPPkU5iqQxrmNJwK\n77/1ESdHR1g2aLaKKqmEowT3MOJsa4YTV9B8k+QsR5mrKLGMyCXshkVQeKTFnM5aizjLyIqCPMkg\nKRBCYKgmhqqjKgoFCoqioCgykijQZY3YjdlYW8daKHP9719g9/Qhk6NjNr5YgxWPK7+6wPFowvUX\n1ll5UkNp5WSlmM4Fi0rXIMoLnnzyGleebaNpMm9+/z5mEwbJMWE2obvSYOPlJQLJQy50pEzjz/+P\nQ053x3ijPuF8TJBNGKU5zcsVyhsJu7MbWA2bct0mzkIkITHve1TUNtNRTKVUI1M8zLWMJ35pBa+k\ncjidY3UtnGWbSATEboGqWfhpTK5mVJsOY69PvaUQeR7N2uOn8qJ5xNmBx8FwiOyYDH0XWcmRNMH+\nwZzmkkBpxhzP+0Rpziw+4nNfX0BZE2RqzPmVZfYGPv/2/5zxV/96yvYPAuY3JF578iVqVhm76uDO\nEg6PDlEVm0ykyIrOQnsFNXdYrF+i015DtVW8rI8k+yR5Rhw/PhUexiGSIeET4sYJdbPOhc55vL2C\nZChoSQ3cw4jcqmC2lvFik2CY8cH3x5h6RiylBGnGaB7z9Oc2Waus4b2TIo5lRCVFaibYpoXia9z5\n3h5/8T+9Qc2wMS0H1Qe7sInGIZpiopdNhCphOyXiOEW3bcIsIpslJH2Pn/zFB4SBydLSU/zkzz8m\nGQievLjJ6fGIhweHDCdzdvYPefdHO+y9ecKDvzkgup+SPZSx+iWqkUnHKtOoGwTZhKH76dLk/94g\n8LnPfY56vf7v/Pvud7/LN7/5TQC++c1v8sd//McAfOc73+Eb3/gGmqaxvr7O+fPnefvtt//W9Q8+\nPMU7yx9pvJ3m5L6EjIwiaWiWxnDUx+tn5HONjtom6sdEwwjhCtIE3LlEyaiiUKZI4f6dI+ajGVJe\nUK2XyBOBJArceYKmaeQFRFpCacng/AuLoEIqCnRNRVZVNE1DUTXMqkOpooNekFBQqVdortkMkglz\n4TMc7WNqJbJIxi4XdFvLuNsuUqzx4dv7zEcqEzfAT31ai1VOZnNyDbZPbnPvzQHiVCfycl7/9j0k\nUcLQLfzpKVExplq28f0AqchwyibRVBAkKY16HU3VEYrM0oU6SxccqOaga+yfeEzmOcP+lE6jS+Dn\nNBot/DAgA9JE5nh3zodvbpP4Eo6scHbfJRgUaIXE7MxFEuD7PpPRjN6mg9HVWP+sw/WvXXgsdoM7\nAWWh40gNVnrLLKw0qV1VKK04OKWMTEBYJCys1rlwvs1kOCZJMirNOp21NqEpI7VWuXJ9iXPPqShl\nied+5TxhzeXw4ZyDm2Omx8mjQSEkZEvlH//2a1ilhEKknAyHTE5miFhmeiawVJNwltNbWX6svQvL\nbd7+yU1SPyMNFPxpwJ2PHkImE8xyptOEyXHE0daEH/zZW5wenKHEBW//yY+RFRldEZxbWme91yQx\nPPQ2TAc5pmtTzroM7gmmDzP6d6aomYaOQhKAqdUQuYbn+WiqhGXaWA0N2cqRVJCQSKKIeA56YREe\nhzBSyFKJ7//1+1x+/gLf+O1fwW5XUIRJHMUMhi7hmUIyyKlVVJY3WiRySiAyBrM5IRF6XaXQJWJC\nWq32p/rgf1CfwNnZGd1uF4But8vZ2SNm1+PjY5aX/18AlpeXOTo6+lvXUjUJ1VK4eu1pllbbhFlI\nGGQUsUSpUmYauYhIMNoLON0d02yUUWSB7wmKqKC3aLNyscWTL7UwewqWU9BttlEtFdkAFAmRqxQz\nQbvawWnpzCcnUP6/2XvTGMvS877vd/bl7mvdW3tXVe/T3TPTs3NIDhdxsSSCMSlCpOJEkZ1PQZRA\n+SB9SgQhyccECGLBsCMYBASZlBXLpijLFEmR4yFn75npnt6rqmuvuvty7tnXfGjFgTE9ShAHIQHN\nHzi4wD3AuQ/O/7zPee/7Ps//n3D9nW0QRGRVJkp8oswjiAJWz8xhlAUs30PSBcqNEqkeU18rItU0\nqmYeTTfIfJH+PtAxsAcZoS8iSiBFJrNDmM/XkRKJd98aoOkS567MUa0ZFPICsuSxulHjkx+7RL/j\n0N2xmYyG5G0BOVaRJJFqtcBk4nPj+gG2l3D91g55o8rzL5yjVJExTAlNl+mcdDC1CrNpSKFc5Pbm\nHsVqCcubMfUc8sUKiihTMqvMugGzfY/hlkXJyFEqaqBkKDmJ9cdOUW3lWblQRjN12htV7KLPg0Hv\nkdxJMTSq8/S2xrzy7ffZ+l4f0zeZHU/BTZlfWkUtSUy9Mbm5kOaiSXc6JUkjXGvGZDLGOo64++CA\nrOqhnU7IihH7R32sXoAmqhAqJLHEwnqFjU8s8PbW69w+uIU9G2AoOpfOX6Ag6pxpF5lZfTJZZO3U\nyiPjVUspF56ssDBXoWbEKEpCa32R+vwCkizh+x6VUhWrZzFXK7E030AryhSaZTJZRFN0chWJM1fb\neK6F4/t86eufYtK32f7JCcJAxRvYSKnIpO8QawlBIDA5GhDGPoIACAK2P6LSLuLIAbboUJ43sV2P\n2AnwxYCwF2GIMoqQcfrcEnpT5drmq8i6yHgwRpU8Nk630IYpsWsT6zEux1z5xWVe+LuXuPDxT//Y\n3QAAIABJREFURRYfq5MICqGQImsKt96786Fj8D+4WEgQBARB+BvPPwq/+9fHdGhhH1i8+2fXmV+E\nF798GgwBORGZ9CeUmwYzwUbKKUgGTD0LI2dQbBvEAgiKz9C/T3PZ4st/7xxjy8H1pjiRhxt5CGKG\nIgqomc7muztEg4SgJyB5Ok21heSCLAhkCTTaFQoNkac+M8fAGaLqCWYuh6oJxG7Endd26N/vMDyw\ncQcBqmiy0Chx86cjbr/6gE++8DSuG5MEIboSc7Q3II58KhWNVIxBmeK5CeMgQZYavPqdfe688z7R\neEw1V2brmsTNNzuYYg49LzGzLVJC8hWNXn9GoVhi68Eem9ubeJ5NHECz1qLdWKNcbrPcWsb3bb7y\n9c9gxxMkM6VS1+j09zDViDDo8LGXruA5EbVKg8JckfpGk8LpKpGpYAtDausKpXmR+fkct18+RLMM\nskc35WE7Pu+9fo9o/HBFXI9UBm/YpF0oVDRefW2TgWXTbOsIWoSRl7HGEY49xZBl5InPne/vE04y\n9g4C8msCneMDjl8boqoimaCQhC7zq4ts7hyxde+AMEr+ut+iBrrCNA7oTrskiLiSwbO/9Awz4YP6\nggBKQybNCbhCgpTTqbfKHHf32dnZZzqZIWUiU39GsVF4uOgcjZm6PtOhzXTi4PoeN24/4NrhTV79\n3h6brx/ywz96nUSEQlHFrARYowjVlLn02WVaczWKBRWEDFlQifyI+dYStfkyu519im2D2mKBMBQR\nkfjKP/gFGmdFrnxqgWq1QHc4Zv2x08xmHZYaNW6/+zaT3gwSidf//AH9cZ/2+TxXn1vnl/7ulyi2\nDdqP6STFAY3lOswUhq+HxPcEvJ0PN4/5f9VKPDc3R6fTodVqcXJyQrPZBGBhYYGDg//LEvrw8JCF\nhYVHXuN3//rz7S+/wBs/ucX4ZMjGxjk2D1waC0VK+QJ9r4dcVsCQyMYZkmXiHk1QcwmldYG4lOHH\nIaW8ymyWoBs+z3x6noObMz729NO88/b7+P2INE2x7RmSKOFZMamSYngSalWgnm+SV3JsPdhi/eoK\n27v36fjbnH7WZEVe5c2X7zKNZZI4I29KqJmMm8zAzrG/N0TMIkQ0wrHAP/tf/grJyIiBZruAIMSE\nEXR2pyxcUbh7PKVRbFC0BKxkglHT6dySGG45IEKlWcKeegRCRKmqUyw3scIeThgjoDDfXsI2Jsx8\nD1krISgymR8zHu9zuD9EcBJOrbfZ3d/EMFVq+SrTUR8tEzC1PBsbj3FyYuHaAZOhhUuAX9MoVMvU\n1hSMoszxbocnnzjFtbfvkBBTKuYo1RbZ/PEHOZQyAU03CcKACFBUBUFXiEQf2VB4+rkWU7GPnELJ\nqOKNpxSEEnZosTPoURcrLJwT0Co+ZlZGNgMOOw7P/9pZwqOMO68eEooJ84+ZLF95mv0be0jjEhED\n9o9GFGsJohAz6Dqs1su4rsODwx3k8qNFUGQJptMQWUnIFxcJ7DHPPHGJt169x+rpOpZlUa1VuL+1\nR17OUyzk0M/nGWx6ZInBl//+p5mpE4bWEUnk8eC9IWuPL6OtjBDzMbad5+PPNLj1wwOWLhdATti/\n38PMaURTF62gsb93wKnL82RhTOzG+LHDdJAyv1hit39McSHPrBhy+vlFZBZQcFAFSIUZkW/zxV9c\nYW/PoX2uSCWnEgYWgTrk/sl1CrqMGibMzy/x9g+2GN8LUBSVJIi4/OIyP/n2/qPvy/+zYf/v40tf\n+hLf/OY3+e3f/m2++c1v8uUvf/nfff+Nb3yD3/qt3+Lo6IjNzU2eeeaZv/Faw8hh7nQV58AiVBJW\nLtfQiwGzmUdDKhAlKZefPMWDlw/o7HaplPNIQOILbDzRpjcaEgkZB30Xz/WRxITLX1hFy4eouxKj\ngylZLKIoEmkKsqySihlpluGFHqVaiSCbsvz4HJnqsHZxiYP+XVqtBSbjLqVTBvVahaWFU6hmRrsp\n8dM3t1CqVSadGc5QwjRSzIKBZbmIkkEseKRmgD10EDKZ5bNNskKEOgmZBQ6ZFqOKebIw+es3eoap\nqWSZTCGXJ4x8ojACKaTRrKN5EaVM5s5b91i+2KaYy5NkKlvbh5R0E102KMpFhqMZh0KX8ABKZoEd\nK6Z+qkCm6Bz3LYaT+0iCxIWLp5h1pxR1jclwioqPUEw5GNtI5ZTdkw6nTj/OxkaN1155mcZK8Eju\nMkEgJSSNU2RRRBQyUjFFUGREReeB41Nc1BlZOolo8ub3OuTOGAi2TLtcIJdzKOQUyvkC770xYqWt\nUL1aIoh28asClTWZhlJlFE9ZrRfJ1IzxrEttzkBqijieRxYl1EslCmaOcfcEvWCSxo9+602nAwyt\nzmg0JQokimqe/uiYuRUI5Cl25lHPF1g+VYQ4w5l6NJcq9Hc9Esdja3SfuCAQuVNEMYBiSv2CyMBK\n8ffyHLw/5sqv6Ky+UGTsDtm9ZiFLCuHExairD6XqVTi830U2JaIsIotSlEykNxyiexlTz0a0NF7r\n36RVq3JqIY9MwrA/oKgb3HhnwnQaIVVTCvk6zXqD4+MtTi1XcAKTvf0RnaMxg8OUxdMNfvnXLvPG\ntZ9QbH24xuD/bRL4+te/zssvv8xgMGBpaYnf+73f43d+53f42te+xh/8wR/8uy1CgAsXLvC1r32N\nCxcuIMsyv//7v/83/lUASFMbIx/z+Bfn2N6cEuonuGOdw1tDqosalhxQbhjMn2+w/84ASYHA8bE7\nYL3pUF82sD2PnCESRgaKbFCcm+egM6Y/sYmkDCWTyBAeTjFJyFfyyLrILHYYO0MCAlbWaiCrCJmH\n7OVoF9rsTW5TqGgUWyXUsoJj7eFGGleeXKHTOWbNnsMdSpiViJ27Q0RDIqcr+HFGEiYopkS1WWL3\n9pCKUMLrRJQqeQJZYGmxjKzk2A3vQyYRBAHObMa5M6eYDCziYYisZTgzi0KpTEM32dvpohwfo5cM\nJu4xfiATzxLioYttBaiZxGiQ0FzSkCKF+VqVufkNdo9uUSqJCJmN6Glce3cfRRRREg3PllHciOr5\nPLKc4bowSULuv3+PcAiSAuvrTe49irsoQRYVVD3l3JUL3Nm6TSkHsZDi2iFRf4LV1Tg+miFlFnKa\nZ7w/pVCQcYoy+tkURZpBWeDpl1aJvD5ZmJFJGrMFh2JOw4pkkjjk+r13ME4pLM23iZIAQYuwvARR\nAt+foVeKlHIFTnpDFufXH/msrVYWUJUC7UKVo+NjTqwTNMnEzOWoFvIkTo+clAPNIowlBrsiw9Qn\ny4l84uPPEhQnBFnA0ApIsxhZlhmPHCRBp79nk4th740J1XmBg/0ZxYbI2a+aiNMW9759QiiFVKsl\nZE1m6s8wiwVmRwGSEDN/qoEbDkinAqmfkuUy1tYb2KMRXhgRjfOcPneOn/7wJrKXkS+X6Vseaysb\nSKJEKNgMJymO7XP4IOapLy5RmZd5b3SPdCHl+G/wkvyZFwtd/tUqoHJ3s0u0n9G4aKIIIvYoZKmx\nwDTokWoZ3RsB9YKBpEiMxja1Vo5UDlg4u4ozHSMnPlbs8viz57l/9wHnTp8hDX2KZoV//oevEVkZ\nc9UKIgKdyZhSucxwNMGoiSyt1YjFKZo6z9KphM37Bzz53FWGwx5irBLHGbVinSAYomoyaRZxcDjm\nYDcgjiH1UrA0IichjUBWQ7I0IhJSlLpAPMxoNJpMHQu1FjO3WMUe2iSBStyLscY2hqmRphlrGzU8\nz6dWbGPJM0LfZvfemBc/cZ5be/eQ5AYvvHSGmzu3uXtjhDYTeeLJS2zu3aFslPElD1kQUDSDsxeu\nsLV/n0Id4mSAohtEscJ8rUGWWdz4/hApMYnEgKzsIhUFCqUimZBScg3e+ItDnv/8Otp8wI//0d4H\neHzxN64y6B+TE3LYPY2NKxELV0x27nbYfn/A5StrvLd9iCGatOfmiBKRqRXSvb+LGJqEYsTZT0c0\nmzV0I8T2ZgQe1CtN9g9HDKcGOaHK3r0tQhtcHx7/1DIZCZt3++gmZH5My8izVCyydbeH0arQ3pjn\nL/7Xdz4Q7+N/v02r3aA3GHJ43EOMMoolA9dzKSgyT119nuPuEQdH2xQqbSrVBnbf5/aNPa5cXGKY\nDBCJscchURZTUxt09kYsrJa4e2NCIZVx/RCXhMapHCtnKkxSF3E7z/GtQ4RIRFAkzKJKKMZEUUyk\npshZQmOuQM/2KEsFUmWGeabAJ596gZs330c2RNYWT/GX33qLNBRQoxRPjGg+V6bRKLJUbXPS2ae6\nPIeqFTi6vcto5iLWwCwaEJ/w5h97pA+yn8+KwSu/2kDXC/QGE8KDCMdOSKWEXEXHt0OaKyaxpjC4\nPUIOVYRcgCxL5NQS7szFVKE79Dj9ZIFiU8fIF5lMx3SPhiwsmIRhQq5QZaGywV/+6VskQYqYPtyV\nQM+BPCOVI7LUYOnMPFrhmHK+jGSUOen3CB2XtaVVshTGjo3jeKgirC6cJxVK/Ku/+C4LRo292xOU\nSIRQBsFHFDWaSzmcMMa1ppiNAoKekCvDs1eq/OTtDsfvRBiCTEiGrkjkcjKylrC8uMSt944xF3QM\nU2C5WEJfN7Ezjze+84DMf2ihJYoSc4UGXX/E5avrTHpjBvaMMAjIELEd0CsZ9aWUOI4wKgVEWaRW\nNvA8j3uvjpkrNJkFAYkbUW7lkKoANkkArXyTyJ8g6DKv/OHJB3h86T+tki9GWJbIK//cZfWJjNLV\nHBkh6ihFjmAkp0iCylyphR8nHHb76EkOb3+MkAg89ZWM228rHNwJOXu1wPxyHdMwOLzhcP3lYxQE\nBENi/kKFgTvi9GNrbN3fIp/XcV2LLFAwFZWNVoF33uzSPt9EMiXe/d8PPhDvJ37zIicHR4x9F12V\nSaKUYBzQri0iazAJJ6imjKEpqEaZwdAhXxCYHgx48vwlbl6/SXG+wsyx0E0wTRFn5iMmJrIkMx56\n1OtVZoLFrBdQnjMYH2eM37eR0UkSHzOXQzcEZFVkaFmsPt8mTiNET+feX+2hKiL5BQ1xVcUdOJgF\nkc9+8Vlyps5r33qL3tYUO9O4/Nxp+tIe7ZZGIVdAsCPuWyOOeh5L803yhQpiGjJ1bAr5iHha5sY/\n2/75NB/xj0WCzIMgRshACiJK81VS06JcVvBUlzSUSNHIlBSzWCf0p3SOx0i+glgKufrSKvpcRuIE\n+L7D7e0hzaUcthSTqTG1msjLb75GICgYkoxhilgjGzUVaZ9u09zIU5sv8Z1//AZnrqyi1yu4gYWW\npZw/u8bNrQf4AaQh+HGKKKTs3H0dAoFyDK2LCYMDnaAbkuGQFzRCEfqHEwRRZWGxhlLxGExitEQF\nEayxhpaJREKEqeQIMw/biTlVL7N/2CElJYxcEgvEWgFVS/H8AfNLGsNuSBzl8JwR08E+S6crHB7u\nMB0HKKaJqpmM+1PyNagtGQ+Vbp2AVr7B+7c2yeZFSsUaz750gcBOifZGTI4SxolLMvMplAwmzoRE\nEJEzGSV8dAVe61yCP034+IWrvPudV1E6ZZKdmMVLDbZv9ShKItXFFlN/hhP7JHbEUqlGGtm4zZSc\nUuK1fxEhewaNNCbZzfGTVw4xDY1Rz6ZQyOOkAeLMZzxw8DOJO28csXZ2nu29fVbaTR7c7bN2ZYlQ\nmXH1k+tMs5Dh6NE+CTd+tIUhK4iSyiyKSdKIYlLieG9IIqYIVRm9GiBUUrZ//AAlUzEvaVSLeU72\nZ5zcTulsDZm/WCFwBMJUodsZIhUjMKdcWF9nOu2BkDE3V2b3/oB6tU0/sRFkB1E3CdMId+JjFDQk\nVeNoc4BcFUhPZlSKBYQ0QybG2fLIG0XIuchyhC97PP+VS/yT/+4VKvU8T7x4iZ9c28dQVQ7uHbN+\neoWnGsvkkh1E0eTua9s8/tJZlisakuAQ6x/eS/wzTwL9owGuBUIKggx6zsDuTymJCpZgU9R1FEUh\nf7pA77CPEw9QEoM09FHVFKWU497tEW2rwngyw6z7tNsmYRwTzDSW5k3ygslS+zR3ultU63U6vT56\nRSP1Qh6/eoq3O9dwD3JsfKyCLHvc3xpRKhXondjISo9aq01o6XS3dynn80iKyJnzNeIopFRwoL2A\n76Vs/uV1Ll45zf7dXTJ0MlFCNUQm8Yxnnm1THsHBzX2igkWxqPKZ/+Iid+9OePsv9vmv/8cv8A//\n+++RUwz64YjP/uLHuHt0yKh7Qn86IXYljEIerexx4ew8135wgJaKPP3pSxxOT7DsiIuX19gfHVIu\nV4nGCYQJcj6HJgbMNZtsHu3TrFcZHLkokcLNnfsYisr8UoFxyUYrS2gNhdl4SiZLBFlGGmfUtblH\ncnf/zYzF+VV+cu2EpeeXsU/64Od49QdHGOiUCyKappHTUnzPelizEdtU8y3G+wH9+2MSX0Kv6jhh\nRDDropcUJEkjyWxKVRUtkTHPGIwGY4QwYX69yXB8QqVW5PjYJVNkGitlDrtDdrs7lMtlWu0G8MHa\nBl0SKZQLjIYjKpUyvuej+jJhHKKKOoWcgZc45OspSkugbijMHBtNqHD7jU1UVwM/Y+/lPqKkkACF\nhkbjNNhTmRvf3SdxBOSKgFpxyFdlfGXI1S9eADvj8LDLuDOiUMyj6DKKIuAFEW7XoySViGuAK+BH\nHpWaTCDYaPmM8XSK4oUoBZNf+q+eJq8VmARdrl4+x87ePdYutqgtLLN974DBpAuuztqzNdRcxiwM\nmE0miOGjFaPh50BUZPV8A72sEaQSmqxTUArkcwWGRxm6WGTU94lDAUH00LQYXcqhmALLj80zd65I\ntVmkUJTYvHmCN/Ax9DKTSUBwGKHHGXubM6JUxXH3+MyXL6IsQlbLWLraIJZjCkWBwM5IDDi1Oke+\nJBKlU44Pu4SZwvs3BwyOfV79/m3sUcxgMKJYVlEKCl13RmDUGE5CSnMOX/gH58mvj/nsf/YLvPTL\nn0Qpyii1DLEic3AyxKg66HmBnS5c/tQG7w/2ee+NQy6e32Cnu41Uk1FaEc3zJp45Qqn0OHOxxMSZ\nIKgaophiLIiMjQmnLq/gRymv/OAGB2+PGNyecfvNMZ1rAQ/eOMILA+Y2GswmFo4bMPVSnr/8NHtv\nTsj6BbwDiWcvnWVtvU5nMKZ+uklnmDKeREh5CbOsoBoieAI//dePLjQ5d6WNobu88cc7TN494OoL\nq3iWTdzP8GwFU8nRu/6A6VaXbj9gZnlEscmN1/bwehlplEPTNcq5KqQiCibTfkTspdSXSyw/vkLr\nXBtRG4EccebSIqcvl2ktVDh3ocnVjzep1HM8uH3A0twCRT1HrlalMK8/Mt76Qo2OP0QoiYzcAQXD\nwLIsZBFiL8Q6cQmOIDgpk8tUPE/AUBUSaUS5ZRAnEYKQIcsSsiAiJBkvvXAVryMRjgTyqoIgBRTN\nDDHzCTwR2dd498Zt5EWX+pUqT37uAo5kI5dTFjbmSMSItt4kdGYP1xNiC2NeRmoG/MJXn+SrX/si\nmSgTpwonBz329u/hBn369hF2ENFYaDL1LG7dvM6D3n1ay1VOna3SrJS5vbXJrbs7nAxDPD58gf5n\nngQ2bw2IhiBEKfbApXPUZTq0aVRLKGhktsngvsPkwYTF0ikCy0aQBGRTwM1cutNDmg2JSiFmZWkR\nSVBJfIGcLJJ4M1rzDXbub1Nv5zk+3kcQfZ56agFRcdHLAn/2Z69Tq1QR0iLbBz18N+TvfO6XSZME\nz3JomnkOrh/TyBkYpkGWqQyGNpY9ZWVlkWu3bjMaHyEZ0HFsjPppdgYj/uV3/pzJyRSv68JM5PCd\nhJSQrCkQCBrvvrdNQRB48cuL3Nndwk16rD9h4go9pHrI2zfuMZ26hHFGfk5jYg95+60TKg2Ns2tt\nju50ySkyVbNKFgrkdZ14NkJXUrIoob1apzM8wJnOmDkhD+5a/Mn/9grVfIXxSR8/sLmxdY+j2S5a\nK2ZhTuXF504TTWLUyGR6EIAjoud8qjXt0eTlPLTFmPXP6FCD7ZMuU8+mahTR5AR7NGNOn+f4DhR9\nk6PrEfQlzizX8ayIOPbxhYCJPSTKXDwLVFEhjj28zGdrf5dJMEEwNJBkwkyiVqzTKLdwvABRgsGW\nTV2e4/5rD7BGDmHksLX/6KSlViVUGdY35skZKscnXQwth5tGJPkE3VDIsphgEGOaIkKQ4ezpHP00\nxT6K0A2dJMmQZJEo9lBk+O6/+rcoA5VZL8MxAsyagVw00HNFvKOE8b2Mml6k5x3jiB264TbPf+kK\ny0+3uTO+S+OcQs8aMLJjsiyktlii3DIIy/Da5vv8wz/+czqTEXfv7iArImeXH8OZeezf3efH33+P\nO+8foqslzq1fQpgpLM+3eGL1CucXztIScuRTnYV6ndUPqdeBn4MkUGqViQKQBQlREBFSgcTJONrp\nUcxqMElQI5V4pnDnvQdcWj+D3XEZ96ZU5vIkicrgOCJyFR48OODo/TFXVlcQqilSrcDYsUn0iMnU\nwjCKqGqCjMyZtWcotZo889knKOomcuKjpB6nV5e5++67PH5+g3QCw32LotZAUSGOMwy9wMjy2Tru\ncH9/m+WlRRJfZTCy6UzG3Nvd4/W/eJOCoiJogKpSmxPRcyIVdYPlpVV23ouZ3sh4760pgT7i2f+4\nSH8YPXSarclIeYNzZ+a5cuo8eGCPM5JpyPKczva9hOGuhCyqhLGI7zsPBVFEBVlSWD+1xqnTSyRi\nwOQ4pqwVkZHQhQwNidjzWFhoUDQLqJZMw1um+4OEzTdcbl/bo1wo0WqVefzsAqM9jyDSWHyi/kju\nFNkiDadceFZg+TmJzBzQXDDp7Dv4hwknhx6D4QAJmdleyuWVFRbqLYZ9jywBraby5FcfJ8vFiIGO\nqUoQSdiziKJRIpeZCNMI90TDkAxmA5tv/+Of4I1dJClib/eISjNP4E1ZnpsnmOZIZ6B9yGOtF0pU\nm3myzKbdLoAvENsuuXIeSZUI0whJVHDCiJGV4gcikgLVuEguE5FEAZGMwA8BiShMMGWDJE1RwoS1\nx1ZJlmLcUsJoEJIGGZHmoJ6FyxfXOFUtUK2ZqIWU1dUlNEPjYMcmCFKKeYksglRUGPdmzO7LuPsg\naVDM1bhw4Tx2kLLf73LUHVGtlzh/oUUcpOztdpjNBjx/9Qo//O5dfvjWW3zrT7+HNYVL508jpSEb\na2sfOgZ/5kng1JUmspkAGYoqoygygiggZiKbr20hpTLkUoymyeKFNvcO77H+RBG1YYNu8cQLq5Rb\neXJNiSefOU80Tbnx5h7FYp3B0CEKBNJEIZY0RD1HmD7Uiz/obNFYKXF76xZOMMKfnZDGDrudDnEq\ns7JxFlkXwNdwxg6GVMQQckzHPqZeZXlpDkGysawBcWDjjmcQCJT0lPnTAh//Sp4zn8lTfyLm3Cea\n1M+JxFmI64xoKjmMgsLG5Ry9gU2cpjgzj1xZQy+WCMQJc+dEdoZ3qC9UWVlbxNQLiJlBSS1x9/tb\niJaDIsr4XoBp6gR+xmgUEIYumhahSQnlfI400MkElTBKEeQEI5dh5EETIxTV4OaNA66eXeSxU22c\nachsluIHCtff7TE/t0zgRUz9R/t6iXKJUJQYdn2MnEohn2e0H6EAcRyCZiLrOaorCm7kcPfdY3rT\nY0qnlzE3DNrP5zi2t5n5PpIqESQpoiogRNDfHtC9N8DvJww3h4zvWxy91yHoh7z8LzfJR/O4JyrT\n7oyiWufkOCLxUsy0Ql1uPTLe/miTYknHcUKCMGXxbANfi4kCHwEBLwhQFQUpA9lIyUwPL7YIlBA3\nBTexSZMYFRVJ0BANMBdEJrGNHwrc+sEe+aiB6YlU04D2hRLNS3km4wmb94foUozrWsSRi+uMWV2b\nI1eWkasJavlh++/weMj4xCc8SejdcvjUuefobB+yv3XAbOximgZnH7uA7SfYgcP6uTOUKlUwEnY7\nt7n4fIFiLeNTn7vCC586gx8OqZUMbl2//qFj8Ge+MJiKHlpJIxMEpCxBFGSiOMYXfGQUQiFAkwUi\nwac/snB8gU8/dhZteIA1HXFwuMvayhr5kogTzKhdKHHhzAXevvMmYZQxDmxyxYxqe543rm1x7vQS\nnW4XVTMQwoRSvkgaOywub3DQGzJ2fdZqbf7qxy/zuV9+moXGKf7wn/6AVFbJFTIYRvS7Q07NFai3\nTY6HLpKikysXEAUVKZ+nvtxkNL5LubqM43c56fexY4v379+ktahx5rkctfIcb2/eZ729jJipOMM9\nhDQi9aGaK7G33aHRqLHZ36ZSbqGpKugmh1sTbDdBdE1EMcQw9YeeB5mCKAgMx2OaRgHfi0gSj90d\ni4WzNUIvZW6uhmdNiVKPme9TOldi7qUqxcRl0LN49uvrvHN3l67dpbJUwk8GRL2AkffoarNXrh8+\nVGByZTLRZXAEplsgPxfTOB9iBzATbJwsg4sC8bUQu+eiLQ0x1xKm+JTSmGJFZf5sgdD32b5lUQhV\nfCkiTkKSSIVEIBESNFXBi0KESOEH373OxsUG8tkYzzgiLDssLOQZeDvUzEfPXOIkYTIZUM2XKZhF\nps0ML5Po3e4hZglmvkh/METRZdrnqyhFgZO3B4RpzNxTLQQr4XC3R+bGFBoV1q826Dk7jG8mZHGG\nKoK75yHlBJwoZUNtMHXH+Hs+/czF6kVoVZnRdEbP8ugNOuRWcnzyS1d450d3mOzPKJRkNi5coeee\nMOgPYSoST0PMYpVCfo69/gF7nSPKRgFBkBlbAyJ8JGmNLAqpNetMsiMSXAaWz9Fxh3pNwvMeXUoN\nPwd1Amd+dREl9ji46SD7IguLNYLIZ393jBDCZ77xBPtHA2bdMW4vASFlOnVZ/1iZTPYwNIPuYEqr\n1cKezVBMBV2tMu77TAfH1BoKIRkby2cIA43hcELCkPX1FWadEZeuPsWf/Ju/ZGnRREoF7t3pcfrM\nBnbgYRgqUdJl+2Wfp569zPuHD9CygCCOqeZ1YjVlcb3FrDOld5AgN0OWFk0SOSIRZYJZ4cXSAAAg\nAElEQVQZNOtVwiiBLEJTDWxnTL4kIBAQDCJy5XnubfcJxzaPP7nB1HfpbnXJmQZKphLrGrfudFFD\nidmDiIKqEXkxqSQgiDKSmFKtlemcdDFUBcWIOf/YKlPfQjIKbG4O8VybSs2gWC4yt1gkVSy6/ZTp\nicUzX1whzh3QNFrMLIFrrx/RLpRozi3xw3/zDmdXWwx6Fr0t6wM8Xvp6hUzMOL7pETsip1frZGJI\nkg/xJBddFnEdgSDNiM2Q0miBUhJxxxqjNwMUQ6VdrkASkUkTGnMF5isb/Iv/+Tqpo9KoVrGcGYHn\n48sRtVqFMAHRjpn6Uy6/tIaoxJQNCQyFvucxdfuEacjBdz6oY/G5//Ii/UEH3/VZW1/m+vX7GGoL\nWUiw7ZAsSPFGAVY/JF9ROH9+gze+fwtFV1l4vkkYdpifW+G9f7vH8rM61iwmOTRwTmbokook6viJ\njaKLKLqM4/moiDhRwq/85gscjfeZRVPMrIgkgFko0R2csH8SkGwLCG7I6RfOo84XCWIH3x9T0GVm\njke9XKUz7DIcT/GdACKFvKTy9LPL7O7sYshVBsMRajFDyotIUkq11EQXNY4G+/TGHsd/mv581gnY\n/QmKllJsKfgnBjvbAx7/xXmSYsjC8iITjjm8blM2qsyGXeIopNEs4lk2SQ5s12JxaZ79o2NKpQKj\nyRhBsJGiPGmgksxkBEHlvde3qDdqiCa4Sca9nR1KqcTtt99noVzhZGdGJsbIqs7E9dm/d4Kpa2Ry\nQPN8lb3hJgtVnSRTSBOZk90B5nyOowMLMQQxSWjn5tm9u8/iapE0kYi9mK4/ZjJyMUsa9WaIbYNZ\njhASH7NWxJpaRFHI/HyDvc09rCTFNEUONn3apsZRf0BzoY5aDKhqMkebI0qtPPligeFRHyGT6XYG\nDzUQcjlcz8axBfw0pVAVqa8lpEKJubkKM8tn6I0ILZ/YTcmLeX787W2+8B8t8sf/5AHPf2aVz378\naY62dpgMu5QKOvVVjdhM6G19kLuDnwbMNcqIE4nUCtmdjGlfEmlWDE4cG0VUEMOQuaJCrTWHRUym\nV5kb2qSChCQltOoaSSYAZXQj5fbBdRaf09l5I0bUJIKxRyaJ5PMmaRoTSxFyQSdLRNpLTR5sb6IL\nBgd3p7TP1Mm0PDPfAsIPxKtJGUEUMfRiWiLkqzKLjTJ7W12S0KJkFimoJUqGwKA/5ea1TSRFRJEE\noimMfIEgO6Z5VWYYRBTKCpWKzPZQRRQUBCJiJyWJIlRJgUgkimXydY2brw4YBzN80cXLHEp5nVOL\nAYZW5soVg+mcz7mLy3zvW69waeFxOqMthETk0vqTPDjcYRaOEWWRwA0xRZP24inuvrKJ+ngVvz/g\nzjtHLF6poBRCLl98jKk9pnPQpWMFaKaCc/IhVs38DGcCP/rR/9+/+hE+wt9ufOpT/HzakH2Ej/AR\nfrb4KAl8hI/wtxwfJYGP8BH+luOjJPARPsLfcvzMdwe++msFgjhCkVQev7TAnrDHNEuRyDBNGA0C\njEhi47EqkqoRZh5+qLL35pSiqLK0UuN4OEFWJTIhwjAVnDBhOB5TKudwLYc4zfjaf/Iltrdv4YwH\ntBfbTKyQYBLz/tsdUvfhdo4hShRlHc+NWFhYAiFm4lgESUiQheg5GUFNEXIK9cU8ztgm64hMDgNk\nScULQkgFRDnizGNNBC0mGFlIZZFh4pOrqOQklfGDEL+v4To+aiJTXSihlFP0eQVPi9h5eUhmh5xa\n3yCWHU4Oh9QaZbp7fTTRIAoTkiSlXK4ws0eIooAigZ7X6Tk2T3x+haE9QEcgL1fY2elQnEvI5YoU\nGiqD0RS7F5FGCrGTUKuUUWopqRQRIhK5UxrlBoezAUtLbbIk5O1/1P0Ad499XUYTijiRTUzCcCyg\naxm1aoVq0Wf58jm+9T+9y9Xny8iZzLvfHaNnEuQS8sUc7jTD0DK+9feeory8iFyv42+N+ZX/9pv0\nVANN1fCdhx13hWqekdWn3G6g5UQ820FKRZoLOvf3B8hoJJHDlWfPcffBAw5+ZH8g3vapElEpQK2I\nKKlOEtrEokgigKYqxF6CIauMDkMIMoRAJEtAVWV83yNLEorlAtbURtF0kiRBEAQkVSGXzxMnId50\nBpKKLmtc/cI51HbI8f42I8fi4L0IhhqKkYEZ8NTHLrCbPuDC+cdQE4Of/ugVSA1SLeHi2TWK5TyD\nWR9VVrm/uUMSCiRRiqpIlBoyrYUW9mRCPW9w8qDPUS8lsWSUKIcsJpRaKX4q8E9/90OMI/4aP/OZ\ngOdlhG5ClGa8+/42mmDQzhmkboQThrgzmSwS8GcWrtXDD2IG4xGrFyroDZ1RFBJqAq7iE+spfjDD\nkANWVnIUGwn5hkihqvLHf/Jdbl87RJ3o3PrxFpvXDrl/r4eUZWiyjBBkeMhMvJCYlMFwQJD4CIrN\n3IJBrZIjmAWohoaWE3EmU7oPfJJxET/wSWIfRYowNJGnP38Wt+4gnnJZ+ZSKUwtYX5tHkBRCQaKS\nE/AjH8UQcDIHpaaQLcxwFI+dO30uXlzm059/kc7JMfO1BsvLVVzBIhFlwiBGURTi+GF7ryCqCIJE\nqVXk/OfP8slvXMLM5UjciNHYZmYPWJ0vU9ZKjA5meFaCJAugyCimxvLSCuPhlHCmEM90vIlEY67F\n8XCEIEoMRyNqzQ/R8RcFhDmfxcdM5jcEzlwRKBU1ojiguWDy4M5NPv55EzyBoTXh7/znVwk3IhZf\nFLB8l9nMolUO0XIOqiagZW2EBfj6l58nckPsmUuUpqALREKCUpAZ+10K9RTfG1ErFHBHAc2KSaVi\ncPmp87z22i2K2ocUxigpmgyGIBNPfYywiGjp1M0GqqwiyhG1Sh0xBCEDURZIxYQoiZBkhWqtTpqI\nFItF0jghSRIkUUQ2BCISBAUyU2T1qTX6kwGv/vg98tUSBBnBPZn8xKS8LPKF/+ZzfPHXn0RdyKjI\nBY52b/Oj115DUEymdsjq+gLLGzUyNSSVfPrDDr4tEAcZjYpJq1FAFBIkwyWKPH70rzvs7KREaUJz\ntUqmJXixzWiQEc4+3HTk/8TPPAmQBBSKGnpBQkpSutddJNFEbxYwxSpPPtVGQqF7rDAcgjP2acgm\nGgKmomCgYHfHhH2PaOwhGCK+4VGo5ZBkkVxexixCwZBZmG+QmgoBCoEVkc1gvroIcUK1XqQgZygG\nnLm8jhPZjEcWk67A0f0Zdi/BVArMOhNSL8D3YWWxxNA/wlAlZE3D0CsoBY1rt+6Sb3nIcoZEFV0p\nc78zJU2qlNstzn3i08RpShilNJpLSPkpkaARuCmrZyQGyh6bhw+wvIjD4wPCJGV1cYnEiYnjFNd1\nkRUB27aQ5JQkS+h1HF799rv85I9uMQksMGUSVPxYo1Aq0+8lFCs5rKHO5G6O8fsJdcVg706PSr5E\n7+YA4TihKs+ILZcnLz5OM1/g6JaHM6o8kro1U2L8IGT7vRlyqBONDMqmyNJiDkEuMB5n7N4IGQxC\nRv2UsX3EmYsFFF3hC79+kcqCiur6SKVlRvYYRTxCp8ZvfO2zVNIEIQVNFJiOXKLAZ+IHmBd1+nFE\nMV9HlSNmk4Buf8b6EyW2+vdprZlI4qMbnsRAZXQYI4U5kiBh4o3p96Y4XY/Jzgzda3HrrT2yTCTJ\nBAq1MnJBQc6J1Fp5ksxnOpswndpkiJBJhGGKlOpMpl0m1oy0krKXbvLcbzZ55ut17m/+kMP9GUmm\nECkZk92QH/4PP2W8b+D5gCLQdVOeeXqDJ55e4td/4xsUtTp3b2/hWg6TEwt7GrMwn+PJK3MIKUiy\nTKM4x+3Xh1iTjCdfnGfpYgMzb7B554TZxEYWcqRRwrDzaLn4f+++/IeM3/8vEIYCvptgDVziTCOv\nmpyqr2B4CoP9KXdf6eAmIYmX4A9FRkcRMy+i5/fp98ecDIeYukksgFrUCeIMTRZxwhlJGGDmNJaX\nF6g1ZKRcRmhkxKJO5CokbkqxKlJoKrTP1zl9pYWsw1FnH0UTMHQNNZMgfGhzXmsp5Bd1cnKe0XYE\nhYwLz58jjVVs28fxbPJzEZcer6HLD5uKBsMu1mzIufUahp7S7Zzw7k+vIWWQ01RMI2bci8mpMm7g\nEzmgBTkGu11MCey+i5BliIaAoGdkJBRLOXRdR5QgTbOHU1IkTC3P0y+e5/hah9lmgo5Cq23Smxww\nt6hQm68yHUyZbU/RApOFWolGSyLTbPSGTnWtxOb1mJ23Ir73R9eIOiqlko4z7T+SO1mQmTOhlDfx\nLI2DLYeplWIWFnjj9QNmuxKTByLZpIyhgKoLlMslWssLTFyPUBao5wyC6YTIdwlcgSSwmE27/Nav\nPM35XML/Qd2bxMqSZGd6n5ubz+ExR9zxzS9fzmNVdZJVLJKFYrFJCmpJBNUQtVCtG9BGGy56qwWL\nKwJcC6AAQYAICGgOaFIiWWw22awxqzIr883ze3e+cWP22d3MtLhFqtD5yIIAAdl9dhGICFjYcfv9\nuNl//l9KkAZU49FuXJp7OevbM0xa027FbO4O2Njs0FQFtdbEQZez4xd7XWhH4bnnBtKOsIg6Hhdf\nC6mLCjuRLJ9N8ZuARigsFxpTEkY22sBssiRNK5SyCKM2TdNgjEZKhzRf4Hsxo8EW/+LXr/O5z/kI\nVbFY5CxqSeeq5Kv/3RWSZYm2Peoq5T/8yXfITxKytOb1S1cI/AhExs27/55V8Rx0gGO3sXSLuN3m\njVffpsxcVnXJ7dtTklQjZw6zjxQ//MtjOs4u+ZlLXPiEykOrBqFg3P/plcBnvifQ7VgUquLi5U1O\nJxOMDPj2B99nvDViM3KZriu6wy5GGaxC4wmBOQXlujQ6x3YsHNflrXfeZe94n7P5CWEXAs8i7HRZ\nZTmz1Rlhx8dqGqaTFfOTkos7I5ST4W1b54YmMuXo/hTHCyjzFcJ2qUxKe6tD02hW0zmvvvUFZs6S\nD//6CaMbNqm14NGHM0Lbxneg03f52n/xNvf3f8B6XdENYgwpOxe67C1WNGdwbeMih80EoQ2BB8N+\nxHo2QRctBu0Bh09OUccp8ahNtU4ZbYcUOqfJQnQDvmOfS1jXDatVg+GcCmrR4ErJD755H61rsAyv\nXn2b+9+9xeZGAIXL7e8dYiGQCDJRcLpeYW9owlaHzkbFUi0Yj0OO72aMLw5Yn6259voGR6cvXlRP\nHvo42x6urliegDCGuD3g9p17uJGFVoLWdYf+2Ga6HnPvzgrhSIJwxfwoQ00NF784Bqug628R+AGB\na7FK1/zGv3yPUSS5dfeUO8k+Hz6cowOP1jpgMc/Q3RrPdtB6Qa1W7N3NaCaC1mWP/ZUNfFpYM7Vy\njLFoihRhS9zYRgQNWybkSTLHODa1KfBDhXBs8mqGbmxcE6Asm1pVeK7ParUmCHyapj6fey2oCsVh\ndsgH37zAu//lZc5OnqJVw+xQIGrB4qWGL/3mDh/8mxm11+DYDnbLplkJAiXJVgvO5ktE43A2TYha\nBeXhmoaM1UTzt5Mf0qxBWYrtQYv6oGL2vKbOJK5jcef/vkulzqsnvyXRpsIRDvDTuYCfOQhcuHGV\nR/ef4A5zRlcc8Jbc2LjEKreYP0uwTMP06ZLQC88FPQNBx48xfo7s23hBjS4LHj/7hCQ3GAV17dAL\nN1mu5xzPMhqjuXp5xGKd0hv3sd+sEI1GaZisJijdcPw0w7Mk/S2PrIxQucRqDGHLZn9viaot/uxP\nvsvnfn6T629HZLqkSiR6vcJIjxvvbtG76PC//9tvsf2yYqu7w3q95PFKEjcWhVB4yuXWx4+51tlh\nX02wXZfVak1RKFRRUFkJW+MOqm+hlxWztIZA0A4DHLfi3V8c8ejBjIyUdiskbo949uzgnAVmDKVU\nuDIgKxridov7P3yAMVCFCllpAhNQZglGGlSpSVc13rZG58dIEdCsKrpbY5KsYXI2o3shpAlqPO/F\nIh3ztcL6sEIJxaXhiPuPUt77fEzUtZkVE1bzmrzQZNUUbUrWxxq78qhDQTV1qE3Btf4Gi9xBM8OO\n9nGFgyUEWC2++hu/yFdqxeJkzr//8CZ/8v3HPNhf4rYc4jimzlJOnyyRIw8/dOkNaubZhJffHcPD\nT2sMtsYhge+xmq4IlOba8FU+uPkR4VVBvNVieVzQVA12r4sXlHgq5vgwoxX5rNM1BoOhwfcdpAPa\nGJqmwLFcXA+KpKYzHvDg+ABRNtja4+KFgMPv5jz8ZEl316P3SsA7P/sW02JCmSXYVcqd54/JMsmF\nrYArl6+Rrm4S+jHzxSFZbdHvDNBLxfHpgu3LY6St2D+b0n9zzO7GmO//2U0cGeOHFp7nUpRzHDxm\n84TdzSHwaVv5n4zPHARmasmrX90mrc8QVkmvEzFZHHFwXJ+XqLtDju/OsD2HdLZga2OXZJJRpiXR\nhiLoOVy+/DIP7j3k+u42nuuxWE85OZ0Rxx6xE3L1ygV+cOcR67Vm0JN0eiPm+2ssozBWTdyxeOft\nEa3oMt/9dw+xanABXRbMkpJWR/LG+5dYuxNK64xVAkq2sHs20UWb4UbEj/ae8fbODq+9fZWD03s8\nnewhCkkUeIRNik4GnBxO2e6Mma5P6fVCcDQJCVvXB9T2EkuENEVDukjp726wHTccn60xumb7Uswq\nz7mwOeLp/WNmVPhS4Tg2lmWj6gbHltT1gk4rpq41TX3eoj2bCqb1GT/z/mX2JjXDV8YcswRnRpIZ\n7IVDE0vSpOYsm+K3BIOdMd3LIapseOW1V7n3x5/O3SpfwlrQ0h6302e8+yttluVzLNmm421ypvZp\nd13cIGS8c5Xbx49wixbHkwm+DPj8doeeKzFpgef51Os5sjPG7W7gxy2kdKlNzfbmZf7lq6/x3udu\n8b/+m7/hzp1TLg47oB1kbTHwttBlTl6kxBdcnj59sWVSk2Y8fzTn2tUNti+NSHR1Xi+EAt1LGA17\nZKkgjBySRcFyb4G0WpwdTej3hijdsFwuCeLzEjsIAtIkQzqGvNIEvsfNb/6IL//mu3z7r75NUzi8\n+6s7+JcF+aLAHZd4L614PPseyol5+/INHjwWTI4W7OyOWc9P+LvnHzDa7JJXDfnawyjN/sMpqrSw\nG0jXGkSDbhmsuOHeJ7cIPKjtHG03SEfQ7YzZv3eCJ1xOTz/d+PUfx2cOAtMHU0RXYkTFxWvXeL73\nmH6rz6jTMF2XGGdJuAXNasmlax2O9vYJpCD0NR3hInKLmx/cISsbZpN9TGWj9LlPYXcjxY48Do/P\nCJRLsdJUpSatVoRtg1aSQEgmj+asfUm7P2O4Meb+t+/Sjs7lozYvbjAtlnz44RNqu+HKpQ3ISuIt\nn7rMufzSmFRl3Hh9m06rx+29A6QFjpGUUoAyzI5cktMpb75/mSw9I0w8PGlRVitm04bGrOh0XNKW\nphN1SGcZda5plhasbcrEsDdN6PY6zMsax2ohVI20JdqAHzgIGxAa1w2xpaTWNU1VY9mKprIpM7h3\nkLB9dZdZtmLVJAyGQ6pKsWxK+m7M7sVtHnz8jBowQcn+0RnCt9CnL7b16r0kkblF0C4YFQGPni5p\nD9tUyzmGBdVMIHVBetywnyfkScpg1CExHlQ1/+JL19m50qMX+jheiyAY4Hgupq4plzNq2wZtKFnh\nOJKLOzv81r/6b/j4Wx9SKZtnpyeMvCtk0uKjo6f0oxbFoSI7ql843uvXRtyfHtH2JbWTUzYV7tCQ\nqwV1rQishrxM0E5FXUCVWHhWQxCErJMVnucThiGWJSjL4lwEx7KoS4VC04k7hMOQYnbGz/7iF3h+\nsM/x8ZzdjV32zSGLpQQtSX0LKDman2LbOd2eTTI7RgYunqNIphWr04rsTGDWhl67RVoVVI3h5MEE\nx/Fwx136VzdYqxJDRRD5pLMVSZqzLFIs46P1P+418JPxmYOAbSwi3aLyK25+8oB2vwsa+tEGU32A\nWilEadGJRhzurViWYPkWnZZPtaoglahaEoYew+0LPLt5hFca3IFhvp+zc0UyOSoAm6hdo5uGsjTn\ntlm2IHBjWp2YVktz8MkxjXt+Z/XrNjVzsrMCZAvXy4msFmdPMuQwZvV4Bh7EA8VqWTHP5pAp/G5C\nNXNYnjTgWsQXLBw3or0j0OKUsm5ImjWXL7/OgwcptqdoEdHyOqwWKa1Bn9PWitPjE65uXiVRBc8O\nDhDSZ7rIiTo+m6Meo3Gb+w+f0B3FVLVBVTWOY9M0zfmZtmUhpEU7bpM3CqtnE2xIErUmMQWWdpgc\nLpBGUxQNi6OGrElp2QYvCJmeVrSjLkGsSIsXOxBtjRzOTnMCzwa7g/Ox4fhOQm/QY/C6w0pN6OQd\nDo5yorZDK4rodhwOlxX9fsC1S2NcxyErckKlSOenSGnTidvYroclPbTt4kdtbGmhhY0TtHjvy1/C\ndQIso1gtlzx9cofRxwUf7Z1waisu/dyb8H988KnxPvrhhKYWoF0++XdPGL4q8TqKVhjSxBZZtsKL\nJKrQuHWECDWWkRRFhrAEZdUw6LUp64wAl+UyxfMjKtVgh4rXv/Q2wbhhXdwhp8FqFfR7MUWxpAwq\nzKqgLhqqCnQjUMME0hQb8AIP2dh4WFRzQfGsQdQatMXxWcLWhQ3m2QxPSFxbUGcZyb05VZHhewEU\nYCtJGERoz2AsiybNMNZPB4LPHARUqdj/TkKuJNdf32a8dYHv/vV32LposXycETg20kj21mdY2ubC\nSzFKV2gBdSNpygbhuhSrGtlzWT5f0fY8ersx9is5tgfBuqZYOXTbW8xXJ/T6MaenZwRxD1sGDAeG\ng2czpnnOq2/u0o1CpvcS2v0xi8UCL2yRlTVRJAHJxjhi1WSURU06r6hnGtdueHzrhAu/qPHHEn9z\nxPPDjGWlCVjg2R4LK6V1LaCedig6GVvv9tm/d0YcByRJChPDvtqnvduiEwsWixllZpA21FWO5wWs\nlzmLRcLR/jHv/bMvcOv2J7iWpNIaYyzCsMV8MadRCs/1idsRapVT5xXJaUU8kozaIfuzAr8VY0zO\nYBjSCgP2H0wJfMl0mtMdDqlWCVkq6PZebGs9HA3JswMs3+X+357iyw6v/8yA6WxBla/49V/7Ff7s\nD7+Nb7sou8SNHPJ6TRxJvvTWNeIwZvroIYOoxapM8UOBcD3W+YLcDbBkQION63oIKZF+TNSOafkh\ndd0g/Ta9jS1agxE3Pv8lDr7/IX/wzb/mucxeON7ZUuFaNnVT8N4XL5DYa06mmrO5ZHP7AotqTlnX\nVLWmqhR1rbAsMAbiTkzR1JytJgyGPaqsRAhN0xT0el2yKuWjv/0O/iDAClcEmwVlXbM8ruhux0zv\nFXiephPbeJbHxSs7TGfnu/wrc04ASvMV9URQHC2R2DTYoB0ix5DME1xXIqVFWVY0WnH8dIJDSFqW\nuNIGW7BKVticA5mtBZbjA58mTv1kfPYgEEC+aqDJufPdJc8mazwn4vBkgheB70ToumDUd85lqHoC\n342ZHM9wa4P0LbTJELbh4d4jtG0R9kKEK5CFzXqVYCkXUXnc/ZtntDoh1fEhm1cvskpLTqszkiwh\nOXTYuDBimZ/iBJv8s/evImObP/2Tv8NVOS3fZbnMaAcu0rWxZUC1kOTHmpeuXeDxR88IHcEOl3n8\n/AmPT6Z0uhbrR4LlUuG/5RGOXBplGF+JaCqJNCvaF0uKacZykpM1IJcOOxtbPHo6o55DvTSMhxvk\nWcZqtSCvBY5rY0uPWx/f4uq1q9y/fx9pS+q6ZrmcEQQR2DVhFHB4fAbGosoqjh/O2HvccO3qJt1W\nF60alrWiNe4yOVmRrhrCdozfUqTpHFcokqnF4SeLF+ZudlqzsR3y8G7Jm9cvIVsG7TeMtyL6pseE\nM+SOITmtiKRNyxMs84Sr2x5futFl/vQBsZQUTUovlgjXo6oabAQqzwlbElfaiDLFJsAUaxqpWCYL\nqkqjLYu4HZ/zSjyPK+9d41/fuMyf/uFfvnC81y72mJc5lh3z7b98xBtvXGR5e48ya5h6a5qm4JU3\nrnNv/xHUAkeENOUKSwRkeUqJIu55rLIl/aCN7vg0tc0yW6FVRUibxcGKC290OTidMBQd6kcOXvsC\nfadgOckxSZvp6Zzlo0fnCssdm903L3CSH+KHFqwk7U2f43tz8hxs2RBZIWVWU61rGqMY7XYp1itU\nYai9itZ2G1kp5sdzPM/jF37pZ/nk/h2O7s/pd3/6Ev/MQWD7us/1l7bQToujm2c8OzjBdiJagWQw\nCMkWKcezGh1IXnprh0dPjkgmU/qxy3hDslA53XGL1SqjnKds7Qq2rmkeP56A9jDCJmi5oCrGF0OM\nUBjXZ704w3UcaqF46eol6o2akySnXLcgTXmo7/Pu8F12rw5IVgk0FeONHjg5SgumsxTZRNSLmuVR\nwmgwJGPJ/v0Ukbe40vNZNGuu3ehQnGiGXYfMLJie5DTFPv3+kOVkydljw2tbbY6yHBxFO+rz9OEz\nBu1t5tmKNTNOFzM8x0UJG+kYpLTIshzQfPThTd55510+/tHH1FXDxuaA2XyFbhSpSlBG4UgX25a4\nAVy9PqauUmpd0++18PBI8gntTpfO9S7L2YzOMORsvqT2JLbnYj39tEAHQGESLg0cjkcNT75/TLsX\ncuVyHzdukS0XHD3eY10t0EYQGp+5MWw5Nm+7ba73A2x/iLAbdnauIq2YygJlFLouKauCpsoo04Qm\nnxPEHYTbwlgQtLoEAdjSQdeavJyjhCAIY4wR/PJ/9fPwv3z3U+M9WpxhfIm2KqKuwO6AcF3sQmG0\nwnMkD+4+xA8DEBag0I2F7Sk86eBgU9caN1Ks9Yp41Cc/y0jnJbawKJqcBsWl4VXcbMbR3ZLGy0ma\nQxZ5ThC7LNclQSPQSpJkBTubl3n8ySPcoQO6j2OnTGclWjvEsYPjSNIsx7ZsQjfEa3kkZyswNqEM\nQBgMOTqw8eKQcllx/9YzNt7y6L02YHn6YuOYn4zPHAS+/M+3yew23/z2HRxq2glqtRcAACAASURB\nVJd98rSm24swdol2LaKOoB37nBzNGV7o0e+6jI3DaMciiSoOJxNQhsHQZzYpabVsdCHQjUIIi6JK\n6A/61G7JMkmQNqRCgSmI3YhG5/zo5nP6gzbdVkgVVIy9Lk8Pjjk9OSPyAlRjsVgt8VsKKTS2yZGR\nQ2fkUpc5sRuB6xDHMKkUZ/M5sivxojZ3Hz7AyJidz/fIvTN0CKoxiKbLSFbkyxXSBWG1eHrvEGG5\nHJX3aXc7oCXaGLI6w7ZtbNsgpcT3W6zWC6SUfPLJJ7z2ykvcfXAXjaLRoBubqlb4nsSyoN2JKFTC\nwbNThBB0Bj6L2ZrOWBOPBhw9L/G9FsY1ZIVmsD0mqVaYlsE/tl6g0wOTm4L5D1OMH1GsCnyd8Tf3\nJ7z+1Yt0NnvstgYcPDoh71oULYvBZMG//m9/kc1+jC00bldiapid7mFwacVtkD6W7WFJF60V8cDD\nsIn0ArQlsIQgrxRZkSEBYzSe44CUVGWOKwOw3Bdea92NDkWdo/0Fr78/olimVConanVZr9a40iWO\nIlbpmqDlYylDdzgkqxTKAifO2bnisEptuo7H8wcrlO3ieh6OlGgjsITFN//4u1y80aZRhutf8Die\nnSF7JeOtNiK0mH9fUq9rWpbP83vPCbsBljIkBqQxdMctvF7I0bNjkiTBsiTCEecEpcygmnNhHm0b\nHGFB6mB7kjiMqKannB7NmCnN8IbAD/8z4AlkOmV6VuNZNWGskdLgRwLVLFkkDSiJ58XUpUDbcHZr\njVk3zAiYJR4ndUY0sPFFwGpesXltxNFqzsbFgLp0OXm8OjeZWCzpbLRxbRdlK2wjIdOYdU3jGCxH\nEBOg8oDl6Zqd6xHPH++h8vMNtiiMoF0hghKtFfnCQkcNNZp1kyI9B68dklcrrl4ZU9cNp+mak4ND\ntnd20KuG0/sLSrdGNRa2mBPoq1zcCjg+3UPYDdmyQleGsG1haZemNNhGYAsbLQyNUmBAqRLHtQGD\nMRrbFuwfPOW1N17h6bOnxO2Q2lTEcZt0uUIYi6JMzptkKoN0DSaXiEZQlyXK5GTLhEQqiqYm8BuQ\nBcO+S7rKaV0fstr/dO5UU7A6hfEoRoxSPNthZyfC72omxwds7Iz4/Evv81d3vkWkan79K+8SRJtk\nnoW9MizWM1wrZ3fnItOzCdPlM6LeEKe7CbZLWq7I0pJer0djGjyvjRQOlVXRCVs0xQpT5yhVkSUp\nreh8Psw/cvP7ry84TLMKGVuEFue07Y0IaJj7EiEaLDfBdDWB31A1DUqUzEvQbpvS9nCdgssXuyxm\ncy68EtPzW9z+9oIsydBYjHYHnDUzBn6H6cExd/5KUcqKN3/+OoEV8cO/uE3Y0/jtAfUqR1GRpIIv\nvHuNe81tQunhEUEh4dhC5C5aqXNmqIFinSMcG2MMTmCDAVPA/GRBHLXRAqo0ozozWC/tkhf/dPMQ\n/CcAAnt7E5baY3sUk61nvP3ymJuPUw5nK+JBh2GnzdOPUhztYQsHoSoGm33OJnOe7+XIQJCZGjeK\nGXc6nOxNGWx1eXwy55WXNvCWCcvDAlFDGBREPYeiFGzsDnjwwXPKuYtIa/SJx9OTM65d3cHLLbqt\nDab1TUabMaLxKCuFOjW4XoyKGjY3xsyXU8LQJxo51NGCPIOd1pjjbEJlGhZ1TeR3Wa9nKGPzM5d2\nmOY5BSveeaPF3/3ZM1y7z7ppEJHh8vUufn/M2cGKg0drtCrpuiOm8ynSsXEsCyEEaZ7hegGL5Roh\nbDw/AqG5+cldPv/+VVbZksPjirzJaQ06LM4StLBosGjqGtcJsYxGLANktcVHP7rDa29u4oxidGg4\nmjzDjT20VdNuhUS9gHt//enciTRCWhZnZ0e89qUNTqoUrees1wGxX9GsNYfPDnlv80s8PPw7Xt7o\n0Rp2ePLsFE96LJ8XnN55yK/9xiaWtJkvShozpx94SD9mPL7A4ZNPmD+cYXselaqx3BDhBzi+j7QU\n6+WCXm9IHPhI6SBs+WNfgE/H//Tf/w8/rgxLEJLQj9FVTlXVqEZh24LZbMb0bIkqa6TrsU4m5JVm\nf/+AmdXmiCkPZgdEdkwTKH7wnWe8dull8rLg8d4z+pshwl2zTBV5UhKGDY4JaVawrvNz4F3YlPWa\nuihpOQHGglvfv4caG6xhi8d3FpCfoUyDqg2+54JpCMIQpWsEAm00QeBR1BVaG4RxyVY5G4M+s/kp\n1167juUViP8cTgcCp4W2fYo8wQuhcCWn84TI9xBVw/QkZXW2IFM2qgThwGk6p9vpUzcFRjTUy4az\n6QR22hidszgVbLYjpJVxcXeHBwdPkA504iGzZUKxSjkpS5rG0PNDNns7iLVNUeREwmNW15TLNTvb\nI+q6YHm6whE+Aom0wXMC7pzssft2jFqmxG1QVsT6uOHsbElmGjq9Nh0nJRQ9cgou7Xrc/9YzllmD\n0objb6dYjYv/2pDZwwmD8ZjFao0TeDQCpGt47723QTl892+XONKmrHIarXAch/V6jed5KKVIkoRW\nHOL5Lp989JzXXh3hVhV1bpGuC4yqsBAI28b3faIoYr1McYQgWx3yc1+8zt2bezBJyXRB0HLIC017\nFFOamv39T7PvAOoipxN38VoD7HhNMCnob/S5f3NGL4wIdn+AjkO2bgw4OvGgKUjKiosXb3DW2Ag5\nZr6WPJiVXBoKXC9C14ZkvcSqEryWZrx1g8neQ4Jul7gV0miB7wdoIZACjPQoGsV6mWCLDMdxCTsv\n9h0AmzTJMcYQtSNqde45IOX53Gij2NzZ5NLlaziuzWoxx2l2SbKUL751g2Sx5sNHj+gsJElbkBdj\nnrnPeHDyhKs3LjF2NlmtU5JZBn6DHdvg+2zvXOTp3z3CHbq89IVd7v9oj24/wBq3Kc/WoA1GuOTP\nNKUyxAhK2ycvUlqt8JwargxpmmCUQYvzEn92OseWgiypkMIhCFxmszn94RbpJCdWIY/uH8H/+E+v\nwc8cBLT2MUZjWRB7EbVpePPly3z8gweEkY1ruQwvd1idFZiZRtoaVSrKJAHpIRxoFpJ2z6Yua1xP\noquKQnk8uD1D+ND0HcajNofzNYvDnH7cpZ5mSO2gS4NRDbPFCoOiP+hw8lwwHAz44N4nSNuj1e6z\nmq5xbQGWzXy25NqFy9TmCNECv9tntlzRjkOSxCBTzfRhQllU7FxKGIwFWdPg+R5DNyJJM3QVMIxt\nDg8PiVstlquU2itoeQ1VZtjc6pJbc7Qr8CKXdLrAFQFK15R1ff5MqBTSsbEsaKoasMnSmo8/OuPK\ntQ30PGVdNGC7OAKkEBitKIoCz7ewHcHJwRrX89na7LJY5XRaY9yOTaES6kUFhWJotfm0mgCMRjFn\nszlKtOm/0uON1zKClg9pzvGzimOl2N2JOEg/4Fd/9QtYBecViTS4vs/I7lC8C4vn32NrOKRWBYuz\nCQPXxlEORZXgB4ZovI2WDrktcIMIJRwaS2OAznAbYwS21bCYHmGbgnz+/IXXWlEr2u0uSmmUNjSq\nQdiSLFtjCYUlLIxpKIqMulK4nocWDqLVxhEO/V7ML4xHXFkveLq/4G/++iFXnZonWUPLkRC7PHu8\nh6Mdwk1J1rgM+jGH06fYGzbDK11m2QmjGyH5Kqda51iOR+gGrCcJly5tU1Yp60YRuJJ+1GG5SJEO\ntDsx89kKSwqwNJayqYsKy3GwjcQCiiJHOgJlauql4mB/ilV4wIuPTP8+PnMQaGyfOl0R+CGtIMJK\nXaKe4KXXL/L4/h5JXqOUoa4MjuNSVTkmE6RFzfD6gHl6Sk1N03h4jY/RCbZwAM0wDMFVOH1DZyzR\n0zWjYY/VYYGNjWUH1IVDmdm4LYd1VtEIh3VZc/fuQ/TacJatsPSKThxjoZHSJc8s1k+O6btdcjWB\neo2uFY3QGN+mOKuwjUUrDnGlIBENVIZ8nRGHHnVqo1TC1Tff4PbTfYbXRzw+fIIXuUwnaxwlaUqL\nZJ7jRg5GVdhCYCywLIEUNoEXUlUFjiNwHAdjYLVMEUIgpMPB4ZJrV3rUCh4+PKNoSrQbYGkLYwQW\nFtoHY1wmJxmX3r3IYrmHMQnLM4vGNmil6AibGy/vcuvTm+3gVrRaLcr5ivt/kSDe22DvoyXzA3jv\n7VfZHHX4/uEP+PzVK1yVGilj5kcHbF6LibyY1IB0FMPdbbQQzM+eU5Q1UVICFrk6oVgH9EdbrFZz\ngnYMyqK2bYS0sW1BqSyMloRRSNQdUzU5/COPA2leslwviIKAdruLbdmoGlw3oCpXOLYLyiCtH5N3\npEQ4AaCpi4YsNwStiAueoOtJLvXbfHzvMY+XM542Uzo7A+7cUmx2W+TNAju0WFUTdq9tYqRDXi1o\njAKrJt5sY480xVxQTg3jzR6z+QzXE2Ar0jRn6/pFzqZLwsglLzMqpfAiB8f1yKc5NhKjDK5j02iF\nNtDUhunxkp2tEX7oYHsV/8mDgJWlmLzhdLZGDTTpSrFODSrLaFKLetkgG4WsbMKxYrVUUNqopuH4\n8T7X3t7kiX1KbztmfjDHcwPWkwXddpv1ZEkwkOhKkjsVoXY5fbQglC6rdUldNLRDl/n0FK1qwiDA\ndUL6/TFl0+B4Pk5ZE3cjqqokDtt0Ox2yoqQte/glhHHE2TSjamracc3VV1/ib55+j4vbQ6bzOW7Q\nZz2tEJXFxtYWTZ6g7YTNrSHH2Slps2By8wQ39inLEjdyQUP7WkQ5V6wOFSo3aA1B5FHmBULYpGmK\nEFAmOb7vUxYVxoAQEmFJmrrk+CDF8zTvvX2d73zrFtKTKKvC0hLbsTEG+v0evuOyd3TIu29d5uat\nZwwGPrduT/Bsn/6mw8N7LzAdAKZHCV7g8vKXLISn0NYe770vWL+luHvrLtmzMWEz4FI9YjgasHvp\nMjd/8AHPbt+ksRxK7bBYrgm7MaEQ53sc0uLgdMKuP2Y+P2/RzYqKIAioyjXSlVhGY0tJ3hTErZgg\njJDOiBoHI6ARL3bgdaRBGQGWRVnkOLaF0jVBFICtEbbE1A2udCjKEguoVY7rOri+gxEBSlXUqiAI\nBK12l97mmwQfPeTg5scEFzaQfY23a1EuHSx9fjp1eniC8B0sR5E3FdKJECKhOtM4ZcTiJMNEPnWp\n8QOb8aDPUqTIyMIEGjvwWWcrdj43YnIyOW9u8wWmBLTGcVzKugJhYdkCKSwOj0/ZuDBA/iNz8ZPx\nmesJfPJXcw5uZ0gRczzNyOua7a0eYdBnPqu5+kZEtBvibUgav8EZeFi+hWM7eFbAg+8d8ZX33+Xo\n7ox0XZ+XSsJlMU9RpUfHHVOeRTz94ZpiXXPh5QG1X/Pmly/RviipPHVuiCkMSmmePd0nDAOaumJz\na0Rr0KG0GrQFRV6itEHVJYMowF07PP3Ogi22eGfwLstbFR/+21sEVYvlJCXwIybTBdL3KA08PzjB\nCJcL1zfwhhYnxRmXXt3FDUOsLCBII9zcOe8fOM5oyy7zyRJjKoRlSNMMpRRan7vraA2qsahKjW1L\nHMdBa02W5dQVTCcJ3ajPze/c5YvvvoSkxHY8Kn2uTpQXBfPpjHWy5vmznGcPEr7w1ksc3plyY2cL\nqzE0TpukjF+YOzeSbF128IeSKy8P+MLnX6G1+RbL2RaDdsP2hSWsDnkl9NlwNzmbFaSlYr5OyJOE\nltRc2+1hO4LZ0SHH0xPKqqDSikopojhGa4PO1mSrOXl2br7qRy3CVptee4hWsF5OeP7kQ7KzxxTT\nM3T5Yts0RwpCz0crA2iqOifLlufcg7iLxqZuNMvVCi8IsISgqiqyvCDLMjzPpa5rilyf+1vWGt/3\n+PK7r/Ov/vmv0T+Y8tXd69hpw8njCmvm46Ux9cJnZ3uT9shmuBFSqIx226NNl2pWIWrDapVRVTVS\nSmbTBU2pWCZz+ld8gguCcLeN34ow2BSmwA0knu/guA5YEPgB0rY5/2eGoBMgIwP+iynfPxk/FQT2\n9vb4yle+wuuvv84bb7zB7/3e7wEwm8342te+xo0bN/jlX/5lFov/l1X227/927z00ku88sor/Pmf\n//k/+ft1JYlbLfKzinbdpjxquPUXe2RHGqe2KKqaUmSsFwXFVBE5AV4HaqnAUrzyymW+9399jO96\nuI6LaBRRYBO2PKLIYzmfUhcFWxfG2IHN0fEZMoRFeUT/csTW60OMZwi9mF6rjyoMprFx7fgcNAYX\n2eleouX3cfyQvADLDvD9AEsJXGXz7M4x+49Oydc1dZVhhzWjaz223hpTDyG4NqSxQTg20nJZnk3p\nCBe1qmmsit52i6YxJFOFLgL2PplTHXg8/OA5ge1jGoFqzh1xhThP2TkY8A+vbdvBsmziOMYYTdPU\n1Jbg5r19brx2mR/cfEirt0UrjPEAG4PtnJuICtsCS/Nk/4DHjxK+8pWf5+Bkxs6lIeFAEL7y4tzp\n2kFEIaZ08Lwd/vT/3OcP/ucnnP51xeZgTNP2+dkvbxC4DsZzziXYQo/GOKyrmulqzQ9/+EMe37vF\n/sERu5evkCnIS0NSNGgj8IOIsL3FyTQB6aIsyLOM6fSMsizQWmNw8GTM/HTO2ekei7PDF4735PCA\nIllimYKqTEhWS4J2j0ZpiqzA9849Mb0opGoaKqWJO13CIKAoS05OjgFIs4RaC7Dlj/eUbC5ujPiN\nL/8MX7m2zZVKcqVl02u1WUxKjNFMDnIefqvk7LbFTmtErEKqLAfD+fxrkK6H7XgIYcCG3riDE2n8\nToAVNWihsbTNuNuHCrRSYAuq5pzaHLguvmUhMfi2RzYpWZ/+/3A64DgOv/u7v8s777xDkiR87nOf\n42tf+xq///u/z9e+9jV+67d+i9/5nd/hG9/4Bt/4xje4ffs2f/AHf8Dt27c5ODjgl37pl7h///4/\nXKz/cfQ2PKq8IK8l+nCNdhriTYMXL2mHLseHBVZo0XJdgp5HXsy5/GpE0dhYc4/lyYqqsAm7IXFk\niNyAMltQFRkyMDSVpt1xmZ2e4CQCr2qRZhliLTDkSNsQioisaTBaoawK4bkUTYHBQqsGozXtVoei\nLmmUhStD9p+vkTY4skNny6ZUK8JN6Gw4GF8guoq1mpGaHLsBZ2ix1Qpo1ksudi4xPZrheJKnz4/Z\n3BmynC+JbB8hHAInYL1eYAuHpm4Ag22LH/PYz8UtASzLIISN1pqqqn78noVlWSilsSwNtmC2zGnH\nEZOzExwJ1y5vs16vqMqCVZ4wGm2xWCZoXD68eZ9WJ+KLP/MeP/zoA6KugxKf9vUDGAwi6tzCy1/m\n5vfW9KwbiFZK76rB7i65uL1LeJDRFA2L9Qqlm/M7WZki3YDDkyOGg21mh/tcGI5AcP4cLh2mJyf4\nbouwHVNrjd/u4joR69kCaYMG0jTF9TyqRuEage9LQq9F3bz47jdfrQh8j/W6xLYs/MA9dxl2PIxp\nyLIM3/cxTYWUNo7rIwQ0GvzAo64ziqJAa4uyKkD42JagrHKMDNjYGNPpdCnzJdfnLf63j44xEfTH\nAyZHx1zcHZKsC4LKxlaCZtlQ5g1SCmxbYjB47rmeQtjxWC6XWE2Xxj5vDFNigeMZ1sUaJ7KwKpuq\nrKkahSNtdKmxsLBtmzRN0FpheHHufjJ+aiWwubnJO++8A0Cr1eLVV1/l4OCAP/7jP+brX/86AF//\n+tf5wz/8QwD+6I/+iN/8zd/EcRwuX77M9evX+d73vveP/n5el+iqIdCKIFBEWxbyQkPZL7DbCeFG\nw7DvUDQVUdfQ3rWo4gorzIgv1sQvN7Sugwlz1usVWtucThYYY4G2yfKCqlrRCQIG0ZjNjQv0WjtY\nVR+nGjN5kjE/yWhqRZYVJElGmhZoJYhbHYbDDRzHoSgLbNtH/nihYjTrdcp6lbB3L2F9Ah5d6rKD\ncQtKVaBzyUCGNCc1g54DFQzbbUydMj2pGW9vMhyNaUoHW7i4tk+5zDGVAm1RFAVS2ih1zn4RQmDM\n+UKXUhJFEZZ1XhXYtk2v16Msy3/4rG3blLVm/+CIV25cpdf2KYqGm588ph+1Gfc8XMej0AWjiyFB\n12H7ykW+96PbCEvzubduYFYN6cmLfey0zlmcZHz83U94eucWR8/vM5k/YbAraUUOTw6fM5QB6/WM\nsm7QSp0z69Y5iyd7dIWDTta0PIda5SzXC5qmwZUuR6cl09plogMKKZlnFc/2DplMpiSZIi8UWaaw\n7Yi43SPutimqmjxLEe6LGYOj0RhLCDw/wJaSRmka1bBO12itsW0bbTRKaVarFU1dYlnn811XNZZ1\n3mFqWxZlXlCVJWDAkaR5TmU0TuDyK1/9Od69uMO7cUQYGRbrKaPBkCopEZbGqmFvb8GiUMTdLlI6\nZFmFdBx0cy4Z50cO3ZaLThY4IkF4JUmS0el5OKFGeoIizzEogvDvwczFC3y0sPD8AMcRBP6L9RZ/\nMv4/7Qk8ffqUDz/8kPfff5+TkxM2NjYA2NjY4OTk/BDp8PCQ3d3df/jO7u4uBwcvlqcCCHVAINtY\npYP0G1q7NQQGXJtWGy7seAx7Hm/8gocKMpaZRbrQjOKQ0i5Z6ZTOhYDRtYDCs3n2/BndQZ9ZUaGM\njbQ8uk4HNxecPp1x9/ZzsnVBuiiZHMyxCSgzDdqhKCocxyXLcizLYjgYUlXnx3FSCBxgc9Qj9Bws\nXDy3Rb97AV920JkkO7Y5vblmdbuPPg1oCZ+zpynppCZu2gxaLnFkc3rccJosuHfrkOe3jklPajzh\nUeQl2mjK4vyCc12Xqmrw/RBjoCgK/t5KzrIssixBqYZWKwQgy7IfnxQotG6wLIMjBUrb3Lr9DNtq\nURUKz/c4nWfMFwVvv/YKZ3vHdL0YXZa4tstikfPh9z+h1+mz293mpfDlF+YujjtEpqBOMi74I+ra\nYXPXw+tMSbKSDX8D2GBRgJvVOEawOp3SJAlt3yO0BL7OUOtTysUhwf9D3ZvETpZdZ36/d+9983sx\nx3/MOSuzqrJYJIvFokixpJZEtdyyALYgtrVoW7YAwYCXglc01730RgastWgLtgwDba8acksmjZZo\niN0ki0MVa8isnP9TzMObh3u9iGSJtrLEBnpB6wCBACKAiIf37j33DN/5PnsX0QgpGPSOcYMDosFN\nVHRAbTRu4NHtX97l6EmOLTxWi4RkmbI4nbN8fEa2TmiL50MGXVfhugI3cHHCCD/sYlmSoijJq5JN\nmpAXJVgCYQkmF2fMphdsthuKpiYvSpq2xXJ9pBeQ1i1powFBURTUdUvZClpLcOul67x0xfDrr1zi\n+LDLKlmz2m7pxwG6hvW64OjVfYpoSffQxQ8MIQpP+bS2ITjwOV2XvPjGp6ldELaDlg3at3H3Quxj\nh5u/3MMbKyyxA5EhBKvthoqCqs0Bif0xrFA/bf/e3YEkSfjKV77CH/3RHxHH/+9C0U9C0I+zv/c7\nAYvZkl43RjiazabF8wPSTUM37uIqjfQzlvOG+qJLqJbsHfa5WK/xQ49exyVZp7RWQeey5sYv3OS9\nb32AryQ2FtqSZKuM/eM9MtbERJSVoWmqHZW0UNAY4k4Xx/NIkg37+/vs7++ztzfi0ZMnbDYJutV0\n+hH9uMdmtULIFkOF64S0rSTZWrRNidv6iFVLXihMVBCVHZJVwXuzKS/f2WfdwkW6oNN1qbIG13XY\nTDaY2lA3JY7jYGmLpmk+SqGapgEslHJ2su5mRy4qxC5FqOuaptE4joMxBq13kQKWwRZgCZtag6tr\n7ty+yfsf3scPXaTw+P4P3+Lq8RGLyRLPtUi2M7qRjwHe+sE7/Me/9Rs8fPx8otH7D0+5cfOIzliz\nnFu4eyv2b7UcHr7C/Yc5s6Th0ks3KOQ7nE1Pqcua7WJBtxvRebaG6tbCSl26gx7b7a47kGYp4egK\nVdjH6QyRbsu1vS66yGjaGq/bw5UNdVvjeQFVC07s4cX7VDoj08+nSF8vpwirJRrs4fnRR6Gy77sI\nZdO0LdqC9XZLsV0TRR6tLmm1Rd221MZQVxUGgzY79r6yrGgklG1LKCyUgJIGN4r5nV/5x/zJX36D\n+WRDUxju3LlGYRIWsyWFaCjrJZ19l9VkRe1A5uX0/ZbuwKcsCpTT8O3/+7scjke0K1DSY5O3yKBE\nOzWFpdl/4SpPFlOUbdMaTX+vh7QFRZWijKSp5cfuvZ/Yv5cTqOuar3zlK/ze7/0ev/3bvw3sTv/z\n83MODg44Oztjb28PgOPjY548+VuE2dOnTzk+Pv47v/knf7J7X15skcrCli6z9Ro7dllMapoZlFbK\nZ385Ym18ik3B5L2Cm7cOsDJJ0axpiwLR2hRbSS5ajl7sMivnxDeGiNyiWmlayyUKbYy28dyQNKnJ\n8/IZb7/ZyUi7LtPZOULsbocxhvPzC5IkQdoKz989lPHePovVkqap8TyH8d4R7733PrS7OW8hXZq6\nZrOtcQrNel4SRBHXX7jFlUHMNDnj9PwClIs0Fm4jybca0zQIY7CVoqnbHS7ctmnbFqXURyIXPzH5\nLEdUSmFZhrZtcZzdwm+a+m+/F4rWaCzTYIwiy3KkksRhQFFUOLZBWIpNskZiuHR9n8WqIs9T9o/2\n2K4K/uX//q94+daN564LbWwWizV2KKnGW26+DHnU8s1vfQ+ZS4qVprj5WU7nU0ajMZN8Q+BJXMdB\nm5q6KCmMwaBI8oplluC4PqHr4vZC3PEVShERhgFR55CqLhBWRV1kKDS+aBGWQOmWapPQWBPatETo\n5w/NBJ5H3SQopcmy9Q5c5jgo24HapW0axLP7bDuKJEnI5wuG4yMqNFlVoJSN57roukbrFlqDtnZk\nt1Vbo8IYypo0z3BHMZ/oxfw4Nry/2tC2K1QEbdTS9wLyOsMWFqPLfTp3QoKOz5PTM+K+w+Qs4crR\nAKv1SRY1geOjdYkT2GSNJl+WtEuXUzUjMznKUozvRMiuZH0vwVEKKkE6X3201z7OfmY6YIzhD/7g\nD7hz5w5/+Id/+NHnX/7yl/n6178OwNe//vWPnMOXv/xl/uzP/oyqqnjwutKrkwAAIABJREFU4AF3\n797lc5/73N/53d///d1L9uHq9X2aNsM0hqbq0E4c6jOo1xHf/esN2wtF+lSy3405ubfmR9+aozce\nZaIwFUQdi/FxTKYrtuUWY9eUJqV3aQyRy3STUGhDWZbYtkC5Do7nomyHVmuwDBYhUviM94bMFkvO\nzi9Qjo0QYHRDnqcIuVOjKauCS8eHdOIu9rPWnGVJ8qwg7IQEYQBIbOVRpAVvf+/7PDk9I/KH+E4M\nOdhGYhqD0haW1niujzF/G1FprT869ZXa/Qfs8v+ffKaUetYh2A0TSWlh24qiKLFtm6qqsIRAW5DX\nFa3WRFGIsnftMUsqhHQpCnCdLufThuky5ejKZVoMy82KdNPyzlvvPndtXPpMTKNSlts1r/5al89+\n9gXKZY8H7zbMEs31O5LTk+8QdgOMLQlsh71uF89RWBJqs8vJ7SBGiw7dwTHK8TGWJvB2I+CD4yOc\nuI92fdzeGK93BYJj3PFtvPFLiN41ZPwCiTHUCOzOmFI8X3xkneW4bkCV1bR5Ca2GVlMXNUWasV6u\n0E2LchSVsSi0Rku4WJ4BGq01um2fFTh3hVdtGlzXxfM9tNE0VUNVtqigg3A8Pvmp13l9b8R47LBJ\nU5YTQTqx2V7UuJ6L47hkq5z3fvCY733rQzpxhKcNepsT2orNZIGjQAqoq5a6KmmygsjxcRuBW1qM\nfMXVN/awDxzWizXh0KXXi2mahvhy/NFe+zj7mU7gW9/6Fn/6p3/KN7/5TV577TVee+01/vzP/5yv\nfvWr/MVf/AW3b9/mG9/4Bl/96lcBuHPnDr/7u7/LnTt3+M3f/E3++I//+O9NBzpXXJJwy8Gn9hCh\nxf6+g1Yl+7cimnCLPVDUdcnlG/t4Ry46qImdmPJ9xfaHmvTcI601RlnYQuEoRZU2VEnLBz96SNM2\nZLpmupjhuQ5llZG3GbUud0CRwKWuSzpdgR9qLKsijMB2K7o9j14/5vjSAeO9AfPlFEtptNnBT7eb\nDcYYgsCjbUt+/dd/BVpNHAa8cOsah0djpICD/TGPnpzy6OE5b/7Sl9BFQ55WNI3Z8dUVDWVZIaX8\nSD8+ikJc1/3IGfzk5P9JiiDEbrRUa43WO4xDVVU4jsNgsBMLUUoh5S4ctG2bJMu5OJ8ShRHGstBC\noAUoT6JCh8V2w3KzJE0LZssFL33iNr1hl7R+fo69TpY4ETgy4pv/04L//r95j3t/VdMvR8RVF+GE\nvPXhPTqXLyO8AMsPqCzFB/cfMl+u0cJlMd/Qtoa0SAnjDnVd4ygbUZUEGnpBiGXZzxw1GC3wAg8p\nbYxROF6I5TmMr9yhc+XTdK59nr1bX3ju9fpxD+X5FFVNq1s8x6dtWqqyQLea0XBIUeZstmuU44Cw\nsYRDlhesFgt0q2mahizNMeaZU9C7oqxlWZRFSV0W+F7ANi/xHI+9K4fEvuTagU8cKJLpBisrORgd\nUmeKqtBssxzXU4yv9phv1uR1zsFBiM4s6lzQtgKjDdLykdauexR3utRtS5Zq7H5MWS9I5md4oeDW\nJ27Svx5y9CmLa288PzX6afuZ6cCbb775ETjl/2t/+ZfPZ3D52te+xte+9rWf+ecAmyalqSDRJftX\nepTNBeOrkrpJuXnHJUkLLDukVHPcq32KdxucsMbCcO3qDTJrTSUks/M1/X0XaVUcH4358YczlJHY\nYid1pvMNEuh0O+SLGdJzCWyHvCoZDvsMxjZVlZNsVxirJozh7PwBl45v0e93yfOEs7MzhsMunudQ\nVRWu63JwcMh6vaLbi7n/4C6dbsj+/j5VVRKGQ4ajHov5Em0Es8mC//Hr/zP9bodNssFit7l9f1e8\nqeoKx1HUVUueFx91AbTWGNMihI3r7vjugWdyZM0zx6Gpa/1RvaBpdidUt9tlsVjQ1DWBF1GVUHlg\nLIklBH7PJoo8vDDAjwWd6BrrTcrq6ZYHj+4TBD6D8R4nzykLqLVNtq5ZrzdEsUt3r8vp6Zzx9QGb\n7Zbvf3vL51+6Sq0GnEzeJnB8JtNzLNvjbLpguz3DUzaz2YyXXr6B7Uq63d6uTlKVdHVJbQlcz6Oq\nSrw43DEPSZu6bTGWpDUKIRVuv4cJSrAa0o/BCVhlyXy2wHUD7MAnzVKi0Ec6NkVeslguqMoKz3co\nihSw2G4yMIpUl0i7pW1ahuMhPJt3saSkyjPcoAsmwQiYrzd4tsO6yFCi5ZPXDnnr7QnesIs9W1MX\nmixfc+mFfc4uTvGCDk7XotJzShTH/T3e+XenLO0t3W6POi9ANKyXmr2DiLre0Im6TJ+cQyPZ1gW/\n9MXbXGwmrLc5J+WHCNGiRw1r+++HDMP/D2DDo2CA3AeTFGxlTj2z8cY13Z6HqTWW51M3FXVhSIun\nXH6zw5O3tnRcl8nqHNdzoajp2APKJxVlk7HJzjkYDXh4b86loyNkM6MXRXQdSeRYnBYVVW0hpUNV\npszKhN5gj9FRn+lyzbXDARYW0+mKydl9mrYlCEPGex3yPCOKQh49evisRacRsuXVlz/BZDLl4OCA\nLMu4fv06m82ae/fuAhZxHFDmKXEc4Dg2o96I+WKBkjZNo3FdF2MMRu+iprZt8TwPpRTGGNq2fnZK\nKlx799iqqiCKIqq6pq5L6rbBMrs81bMdpCWgbnGlwkiB4yikssjKgrgTULYZla6YrUtUst0Vkipo\nq4JeJ6TRJUXRkGfPX0hjy2dea2zXxREg8oxfevNFijZlM9kQ90d8MMmYPf4/eOWoS/PgCXXe4PoK\nIW0MNY02OJ6P7XSwsOlHXSzR0j26Bp09GuUhhYWyaoqmQChB3YLWNbbjYAkLadloDMr20dkKTz0/\n8swWC8pkRiE9gv6I3tElhGtT1zW2kGTrDcvNBrNsEUrthrSenfRS2hhL4oUeVbPTILQsie/6YHKW\nyw1KCVqtCV2fslxjaYXXHWBUSmxL3j5f0siGF14+ZDOrefjjE5Kk4vCWot+1yUufoSdJyhzl7upM\nm2lKNHAIBxXrWUOWJtRWRW8Q4UgbhEOZFNy/O6ftZORWztDzsHyLBwtwzD8A2HD5tMVsbeTYxhu5\n3Ph8j9HVLtNZxXJZoqRACJfzpzW+6tBYkmE/orc3oKwMi0VOnkkmZxuSRYGjPS4fH7Je5ShhMxz1\n0JYiqzXz9RapSj7zyiU8CVmW4vsO/UFMvzck37YcjEZIIQj8kGFvQJGlxL5PHAYo2+L84gln50+Y\nzk7Jiy2GmsGwy2q9JIoipJQEQYCUEqVs9vcPOT6+xGg45PKVy3iei7Rgf2/I0dEBsCMFqaoSqQSt\nrnFciR84gKHVFXVdPAs9NZbRmLqhLkuCwCNNtzR1iUEThx5RFKCkhWVp2qbEslosYXCfLapOp7Mb\nHmo10hIkmxS0TZXVxEGHbJOwXTUUect6XRD4IZ7/MWdFXfHypX2uH/To+h7HByPSTcuDRyuCzhDH\nCjmZbHkwveD++Qwr9NHSYjHfkG5zRoMejifYPz4kryuE49Baksr2scIhlhNRF/luaMq2MRjW2xVZ\nviEtEvSOIQEpJUIJhITWlOTZ8zkRjTBYjsLtdIiHQ4RyWG1TWg1FVSGUotPvI5SNZQnyvGS7zTFG\nUj9LiZRU+F7wDK5r0bagpE9VtpR5TQUo10U4Amnt2rp+FNJ1JJVjEQ5DGlmRJWs8ZXHlypigp7Cl\nTeQbqk2GsCwU0BYWnpK0pmW4P8a0Fr4foJ2WLF/RNoamrjFtw/RsQ7auuH58yGS54WJTMfIc9Ob5\nEOqftp97JBBYFpv7GUGYcDm+xDvvP+aVFw5xTMVrn3uRJyf3efh4gwwdzp9u0brlyOlSk6K9mkFn\nQLKqMKKgTDSKgIWuKFYWXiixowzbaUmrEs/2KdOSQdcn8h1GV6+wfzggS7ZIpZg/ntPrSoyjSJIN\ni2WKsSTKscnylDTb4nqK9WqDFIrzixMCP+T111+nbQT37t0nTVM+85nPcHJyQhzHdLtdpBS71p9l\nUTcNqm3BahgOO1RNRZqlBEFAXZd4foe6athuUxzHQQiJ8BzSpMB1XcqqxBY2vV6PtEixnZ0fdxyP\nwHGwlOTWzesMun0ePnzAbLXEj31822E83GM6m+MKyZXjS5yeP+VgcESS5RyOrrJdzPFdGyFq4n6H\nsgkIfAU8v9csDgUfphfUDcQq5OmDJ3R6Y/wmJzkpOFcXHN/YQ28rzrI1vpH4oUdd13S7EcqROKrk\ndHLKtcvHrNMNkR3Qu3wVqzMkawxWkVPrFt8LyPOcNE0oipTxeJ+6brCQYBraOsMVik2ywdPPRwwa\nobDjPpYbsUgSzDbF9XxKY0g2CVIKbKXodDpst2uapsV1QvK0QUgwdYYrBLUUFHWJVArf9ynLkqa2\n6AxiElNxPiuomgWDsI/UNf3OiMtRxF6W4gYBp+/PsS2fom64eXXAQsxYrDdcGQ8pheHR2yfYbkgw\n8lidrjg4OObpgyVG7yIf17FYJQuMpRCWYN+LkFITRw4f/OgpbepTTCxGL0V4x8BzyeH+1n7uTqBx\nJJoK8i7v3zvHFgKE5IVPXub/+pvvctCL2O/HLNMEb+jRFA1NtavQSqlZbhZkWUXkhFR1gW0Ek8mU\no1tH2EGKcC1e/IUxo/gyxbpk+3SDxYisPOet77yH5yuu3hiRbErcusXf77DJKxzbp201vu9xMTvn\n6s1rNHZOVWmu3brMZHpGmbUs1yu+94N/y6uvvEG31+fS8REPHz7i6OgQ27YJgoDlconA4uXbL3J2\nfs42WdPvd9EGLMfh/qOHZEVBGNisVhuuXb3CcDhmMpnQtjsJbGXvhC6klniegxQaV0riwAMLbKko\n6wzHaLabBdPZlPVyS/mMeaatGjATqrLk9u3bPHx0H9+3wSgu7R3TVjVFWRCEIV944w3uPnjIxckF\nZeHjeM8vLnWv9pnPTsmVIDQ1bAyzbU6a1gwuK669eYSFg6yGPPybuxxGmnK9Ztjt0NQlThRQbQxF\nVbLIE46iGBFFrDLJnvHJiorABWMCGjLKYsV0dh+pXKp6x7LTtD5S1yjXoiBHFjMWD7//3OsNxwOq\nvKBqWrS2EIad7HnVEMQhljY0GDzX52Iyo65a1tsFvW4HJR2qKqGtfeq8QPnsWoTSAiEw1BgpcaWL\n7FgspnMqLXBKQSMlZTHnRiy5u90ShwPW5ZrDS4c8OT+hDaDfcZgu59SbAIFN/0hi2oQrr1zi4eNz\nQh0SD2wQmm7P5/THC2gsvKBLtt3CQwvZjuipMffevktQ+qxljbz5swuDP/d0AEtiqFifJ8RlyKhw\nyc9WkFVcHhwx+7AheSroeQFSVwSORZUbbOEw6Ha4cmmfo6MBnYFD3PUIQpd+38bvFlhey0afMimW\n3M9+yElxnw9nT/jhw7t86Uu/yNGlAb7vcv36ZdabhDTPiaOYo0uXEcomiGPifo+0ytHSwnFjSr2h\ntefUOuP6i8dMJgnC0Tx48iFa1LvW2zMAT5IkrNfrHYTXsphPp7Rti217O277uuV4f0wgLG5cOUBY\nDoN+H8sSfPjhh7iuSxAEGGMQwkIIi04vxgtc3MDBj1x8z8NxHBCCwWBE1Onw9OyM+XJJa8BWHmDR\nALUxOJ5Laxr6gy5xFBEqjyopmM/nxJ0O2ki++Vd/xWQ5Y+/SId1RF+k+/6y4ODthECuEbFH7Fa9+\necC6rGiwSTctq5MLQkvSiSVu1GPaKD73j/8JKEG63HD29JR0vsaXDro2LIoG0z0k2LtJjYcwDVW9\nRVtznjx9l21yjutJlN1S1SnbbMM2XZFnG7L1nPnjd0me3iednD33etOsIq9qDAZlW/ihj5ASqRy0\n1tRtAwi2SUaSZs9o3BTGMuRlBhZskw1gaJqWsNOhbDVpW+GFEVp5tGVDsV3j2Q6u62OpkqYqORoN\ncK0dHHyTL9m/MaA0K/IiYTQK0RXsja+RbEuK1EK3FWFP8uDkPv1RtJtraTNkKzHbGnJFN3Tp9j0s\nLyJfSc5+tOLpW0+IZIjjO6ynJSr72arEP3cn4PqgSwu3dcjmCaE9IL0wTD+Ysjxdc2O8x3q6YTgM\n2c41QiscAVWWYaqGcrtmEAmkSlBOzTZdEkYhdZkRhrvZAS+oiWND/9Di8qe7zNMlN68cc3g0QCiN\nURWd/QitXLyw/1Hrp24qpGsT9Xu0Atb5gkpn+LGF67oIy3Drlcs0CB6c3Ge2ekpazIliD98P2Gw2\n+L7/0btUajcIojVFUTGfLVgsEny/x3ye4Tg7irPNZsNgMEBr/YxZ2HuWGgiyqiToxKRFibYUlWUo\nmppVkrLYZlwsNoxGYwI3wHUdhoMe3W6XTtwhDAMsoNvpslqtmEynzJdLttuEOI6pqorldktn2Mdy\nGp6c3cONPbqj/nOfXdc+Qqw6qGWEXcQ8eFcQ2IbOoYcg5OTbLdO7G5qs5bOf+ixf/MyXeXqWEQz3\nqLXCKi28bsje1UOGh3tI18MogXZ3GH7HUWhSLuZ3acyGslkjFfheRF03tG1FUSbkdUKTb6lO71Kd\nfYAsni9DBnyEn6jqhqQqaaQEadFqjaN2p2aR59T1ruuyQwWWYKCudyjObVpgKRdL+SA9ikZjCZu8\nbBCNIV1vqfMK0ebU2wRL17i2hadqdL1TfJaegbbiytU+TVNRtRWz6Sl+18HbM4yOI1xfoRtFJ/BY\nT7coLSjLDeOjAcpT9EcxRb5LUSQCW0pcx4ZaIqTCd3w27z1/7uOn7eeeDty+eYiSLVUpWE4LLjYT\nvAEgJB3XsFo+4XP/6AqOZbN/NMJpbEpSPMdBGk3gBGznCd1en+jA4oMHc9Km4lI8QOsc17Xoh2Mk\nEmgpnYzR9R4fnD2iaRI8WeMHPo5qcEOFLSRlUeC4ardpqpr+uMuqmnC2fMqwE6PriHWS4CxyagqE\n1owPQsp6xt0nKf/Rm7/FYrXE9TzOz893oiBFznq9odsb8GQy21FcOy7rIqGWLtFoSLaac+XKbYIw\nQOuSJNkync4w2lCWFWHoEey5bIst2mjSqkYpi0Gnh+MlCAs0ElFrHKlACaomw7bdXVFtvUKiOTs7\nYZ1kjIZjDDYIi0WZUzWGIHJp0WxWGQe3ejRVznr5/OLSYlFR0/L65++wOn/C9OyMSklkYRh3R5xt\nS8TsGq/ceYV/861/Czckn3nxBS4PbvPdXLKYnnPnjWscDTu8f39CXRuePHoXdzkn6PSobWhJodTY\nbkjodZBCIRwLaSTUEoyLE/jM338bL1uxnp/ju88/25qyAFchfZ+mAVf47AYkNVgWlRG4Qcj03ffR\nuiUrK5TtU9UVbqAwbUutGmxnR4neGENrLOoCak8QOi5ZugZpdjRfTcU2S1CNIa0UZRvixYqimGNL\nyeBSgLGgTlJM1aI6NrFd4x32cYxgPl1x7aqPl2kcIzC6ocaw3WbcvrPH6YMVeV4zHg9YrFKEsajq\nAiVtqkbTt/ukyT8AJ3A+nWI5htlqRqIaer0BF+2Sqx0PF5d7J5pXgpjNQqNshYWhvzdgtTzD70Q8\neXxOr9cjyXOicZfBQcyDD+aEvsJ3HGphsU7mHI/2yJOUwbDLUlf8n9/4NwwDnxt3bjKfn2Oh6XQ6\nCNHspM1sC+QOCPTBk3sMjjqMBh1Eo2naCjcwLDZnOI5LkRd4TodaWLRtzWIxx3Z7pNsNeZ4ThiHv\nv/MuRV7AySlXX3gJKRWt1lhNSyfuE4QRwziiLHabdjAYEYQ+WVqwnM2p25p33/shg+4R5+WEsOOx\nTDOOL90gW22I/JjWVEjHJV1vieMORatJ0xKjCxptuHR0iYvTM55eTHnpzktsNgsW8wVBEAM1gpqX\nXn6Fi7Nzbt68gns54+77D1Bl57nPrjQpra546wdvESvJ3v6AST5FaKjkhv/iD/4rfvDt73P/3iN+\n5zd+hV998036g5g8nfPyKy9xcX5KNXvA4uQRPSVZTlfITsj87DFJskaHPo4rQUHXCqifYftFCcJV\nWL5N0wqUSWi2E9arKb7voeyP4do3hiTNcIMOQjo0jUa3Fk1b0poG1wtYrdY7hiZLYJldB0mxm9gb\n9EKkYyMsQZZltEjKxuB6HnGvS5akuwjFaCyp2Gy3WBqk6+ILheUIRNsSewGWFEymGzr9mEGvz7qe\nk69qenZAk+dIs09ZzJjOS64OB1RWzf7lS+TFjE4QcPF4TV62bNOcuj5FKoEtHbKsRriCbjdmOp0S\nhj87Hfi5O4E2tLAtm5Efsh+6jI9CjlqXIs+pHm75/Bd7/ODtuww7MfsHQ6zWYjat8GqHsOPQ7Q04\nvVhxeNnH2CmXbsRUMqVMKwqynYxVrUjyAmm5TM63NLng0598jXy6IVIWmWNzdO2I2cMZ62xN1Nkt\nOJTNIl8RRz5x6OP6htV0RrfjsO0LLHyWqw2Hx4cs5gmeF5CVKZY2RGHEh3cfMp1MePL4CX7QwXNd\n2qYGI3EchbAcZFGj2pbI98k2JWEYYoymrg0X5zO0hv39Q3qDDsNRj8nknE4QstgsuPPpm5w+mZKX\nmgiJZ0vqrMBzfOKwR76eo2wHz3GRSiJt8LoRkZJ0ugEXk4dcurLPYrFCGMPRlQ5FNePi9ITLL/QJ\nfMXhcYfO8REP3v67z+7K0QGlrkg3S0IZMpulHEf7vPbKJ9AmIXn6Y37/n73Ji7evEloG4bXU+Ya2\nMhRZgtBQZGsWq1O0FdENPYqmwTEtkeMioi6O9GlVixI+0jj4ToSxBJZwEDiE0uLsR9+inDzCcyVG\nQdDtPnet5U1LZ7SH7cXQGsrNmqbZ1QiEUvh+sOvzhyFnaUKlK3qhh6tspIYk2WJrF19A6HR2aYJw\nCDyfIiuoygrbVuhK4HkuTdNSNzWubeMUJTrZgNjVdxx3p4GZlQXrvKDfG3B2MmO52NL1JcnynDIX\n3L454uzxktffeI1333qH2zd7RCh+cLHhl7/wBWgs/uqvv40ldhD3MPBR9g5UZmFhfQwXxE/bz90J\n6KbCiz2mmxlh1LBZ5JRJzf5xhxdev8aD6YRf+Nxt1ouURueUqcSLWpwg4vR0it89JjY17qii9aFs\nlwz2JFoLTOmCAqvb4DoBjx5POOhfBtvie2//kNc+eZPG1khTkBYF8+WS2y9cR9o+TbFBKsO1/QM+\nuPt9QjtkPlvQGo2yLMoyR1sGXNC0tHlDLQy90RA8xePTpxRFTpIkhGFAGMUYs2OAsT2P0XBArxsy\nPhjzw+//CKM14/EeyXZLEHlYlsV4fIDneqAbFosFUij2Bwco16Z1DXmTc+nWEQ/vPcFYmiRpkUbj\ne5L9y31W1RojKizRsk1S9i4NsBsbD8N0+ohuL6CqU6TXEnUtrtwZcvf9u4xvO2i/RNeCSAQ05vl9\n9+nilKiraOqCIBwxuBZzs3uL1199mVu3b3HUGaNJWT95h7ySGNsHO8ZYLcl6Qp1o1kXKNitAuVhI\nYsehrSxU1SCMQoYxgfKojUF5Lm0rcVSANDYWLabVdFyNfTzEkjY2DVnyfAFO1/VRysMyO5Ux17PR\nuqZuWlzHRze7mYDhqMd8NgGpoG4py2Y3+xAEhEFEpTVJkjAY72OETV5WuI6LZSuKYkurK4zxP0La\nmtZgAgcncbjU7bNYpyTLNb2wzybPaE3D+GBIMi1xvJzQhgfbktG1EGHbOKplMNAcDRVuUHO6LVDG\n4MaGe/fOsD0HaXsgWjphh3S7ZbWc0On45PnPxgn83AuDra7J0xpbKs4fZyAaPvH6VdZ1xg8+eMy1\ny4ecnJ+zStasVylFm+942NEM9mOMt2B4SdIZ+QSeT1WVCAkWgrPzLb5xMbVmu0m4des2fqgIew5u\nYGMLF1MLQjXi1Rd33YJ1ukaoDL9r0ek73H38AcIVbPIttufQSgvbtRjuDQnCgM5gt6h9z0cpaGuL\nH773PdqmJt0mO7ir71I3BbotePHlF+h4DoEtCV2JKJf8yqdv89/9i/+aWy/eoNeLsCzr2VCSYbFa\nslpvqYqKum7oDUbcuH6Lvd4hZV6RpxnjSwMqq+Da9SvcvH2bT33qEzieTV0nKN9QmoorNy5heTlZ\nc0ZhpRTUOLEkr7dEkSTsWSzTCft7PeLDiJc++SLaUkgXgs7zSTp85WDXkmFvAOuSL33iNf757/wT\nvvjG6+wFPrraFciyTcJ68oQymZOsn1KWLZv5ObPlnPksZbtKmM+3uK6P6/hgakyZo+oCxzJIA57w\nsG0fy7KxlY2Fxna7BNIh9Lv0hnu4rkfZ7CTan2e98YDQDwlch7atd7wBUu5YfYxFURe0TU3U69A0\nFcJoNqstVVMiLLnjZNxsMNJCCkmSpmy3GyyhqJ61cuu6QViSJNk9e601WZ6xpSQxLY8uFqzzLXHU\n4dH9U1pKgiBitpxyNl+ytTVZaBOEDrbrIajpdgXr5ILx5R61gE1Rc3wzxokErap480ufR6qGzjDE\ntg23X7zxTKa+xHP/AbQIbSlZb2dEUQcKyUsvvMZbdx9yca9AWz28/phpXbBKt9SmpdMN0KrlYjml\ntWquvdSlsRc0pkAoSafTx7Z3lfQocNC1JJI99roDJk9PqIqMTZFgbE2NZpNueeOLXyDZJKRJypVr\neztZq3TL6ewR/csd5lVB2u4GhxqrxbIVs+UabUuKusaLYgQW88WSpFiiqTk5fcxisWAwGGBZFmHk\nce36FXRb4TqaTqSIXEEoLDquxb/8X/8EP2p54aUbSGHvQDAYqjLH9z32Dw55+eWXSMsUXbX84qd+\nkRcPXwJt4UY2biCYry9INgvOz8935C5XBwzGIZ9+4w4n0weEnYgvfuk1LsoT5EiRUDA8iDg+HnB4\nuc/e/j4vvXyHk8k5WV3SCkPQCRH280PKK/GYG4NrfObSJ/lvv/Yv+E9+9TcYuRZ6c4GVLkjTM+YX\nJ/jK4d577/Odv/k27373bd57dJcPvv9DTqYXpFnBxcWSex9c8PjRBUlWYmRDa1LMfAKTc8oqBd0S\nqIie10HT0ot6CK2p8xmmyVguV8ymE+QzmPXzrK5bjN61bwM/JuopKtuMAAAgAElEQVQNcYIORuwc\ni+M4uEqhhGQ2X1A2FYPBAGF2dO/Kd/G7Ea7nEQQurmez3WyZzWaUZUlZ1tjKx3NDbOnuSGl1S5EV\nbOZriqwlacodYrMsUEpjmpCyyXj4YMIo9sB1cYcjRGuTzlNsy2BbEseWFMIQjcaUTcHw9pBcNRR6\nSu9IUugVTVlS1wmTizPiTojrCTrdfwA1AWMZ4iDGtTS2jvjX/+o7eL6mG3cok5wHT5dQGxzXxbNd\nNsmaeNzHLbe0SB6dXNDth3jKx1E2s+k5RiqyrCKMXJI6pVoX7O3v4RiBaAyubLl+e8T+1S7Z2uZ/\n+d/+By4dHnP75RvMFylVZthmJd2rffI2pz/o4voByg5YrBKSPMXrB7SWoRd0sVoYH49pzzTrZIVv\neZi24PqNqzx+9ISr165ydvqY9UqytzcmcC06gUNVpKxmCXNpsKjYuxVy/eoNPnz/AbatqKuGKtds\nrDWOo9huLQb9PlmS8uN3fswrr7zM+XdOuX79Bc6fntO2FVFvxGA05MMP7nJ0+YBH6wfIUHNwPEYp\nl/fefcgnP3Ubz4sp0pTYtbk4mRCNQoT0mKQLvvCLb/Lk0UNcx5Bnu77482zoj/ilz36eL7z6OpHv\n0NQZ9aohTzY0ZUpuVaAl999+B6kGTB4/xoskWfY+VZrRD1uqTCPsHlFUM11MqHWJHzm4nk+Rb6gW\nDaqq8PYMSepj+z5ZmtLUFUp5FPP7OPkc/Wy+o8hTpH7+1KNSgjRZ0un3cP2QomqwbMACbcwz8U8L\nzwtxbYc48GnaAj8Mka5HqyxqC5SSNK2gTWu6UUxeNWRphtaaVkqU8sjznCorqcuS0AtwXBtHa/Z8\nQcc7ZLFcY1sSv6/YpAbXbbl5c8z90w3vvvOQm1cO2VZr6iql1C1NvcRybUo0cc/FdRWNtQXb5d0P\nP+DKjTF14uCKkP29Iev1BteXBEEHeD5u4qP78h+2hf/Dbbw3YjabUVcll1/pcpGUWHVNm27xbJv0\n4YR2lXN4eEilwLJtHp89ot8fkqw3YBxW04TAMyhtE/kdpONjU5HnJa1r2B8fUCYtB6MDknSOcHzu\nfXCCwmBrjyuXb6JsQdyLWUwWSMfGLtQOoto23Lpxg0dPHlG3GiUEQgryOkV6irqqoC3YG99gdmYY\ndEf4IubVV1/jwb0nHF865uTkhNBz6cQRoe/jOBbK00ipoalRVosjwNM5dbniP/3nX+Zf/8U3yXOL\nK1cvEQQeVZVSVztq9E6vx97BIX/9rb9iMB7z4bsP8F2PF69eIZ+V7B0csr6Y8OGHH9K/HXDv6du8\n/OIbnJyeYUlFujEk6xVhR6B9i+7lLsvZBKMlg14fZUmiICJNJrhC8DEcHfyX/9l/zl4cYcqcxfkZ\nusyom5rV4ilFtqAqFOs8YTI9ZTYXvP+ju/zaP/1tpg/fIam2xFXFdpWCtPFDC8cyQM10ssJoQ14V\nBN2YanWBbTfoIiUeDJGWoikacDVow3S6ZNDvUeYZVZHjfUw6kCQbwjDCWAatNa6zGxKK4y5tXeD7\nPsp2sV2PbtwldG3yWoMSOIGPH/oo30XaO0xA0zR4rksURjiuQ/qMltx3FFmxwVUOdVqQVSWrZoMK\nJD014OTJKbZr0+v0qNGM9wLyVPLB/TlGaQ5HXWgKqiSn9mxKTzLa66E1rBYLwljhKcFilXDl1oh8\nVVK12TM6/IbFekV/2Gc2y+Fjoriftp+7E1gvJ8RxRFVKsiaDtkEJuSN+UhZFWyC0x9nTDeFY4PUC\ngm5IY1UEsUeTQZkKDDbTOsF2LLqRTZ1ndP0htu+wTFZIVbPYFNy8eczFdMO1m0f4rsvifMP5xZo4\n8An9C47HtyjXCeOrN1m5WzbJlKenT4g6Httsi+dIbM/GcQVCKcp8i+sKTs4ec+PGdebLhF4w5PzJ\nOXvjPZI0xcJwcfqY/f0Drl6+zKXjPnWRYQuX2nX4wXf/HZ99/VPMnzymKQuO93r81q99lrfff8R3\nfngP2z3AcYJd7zrLKYqcPK34wuf/ET/+8Pu4raBju3zw7tt86Re+RJbOiPs+F1tNUxsa0fBo+YB1\nvWB/PGC53O407NocZULswOf66BpVrrGNoE4KdFlidI0UAWL9/Em0y72QbDGlzFfMJxOK7YqqLljP\nlwhaSm1zev/HxKNX+fF3v8FoOOTJ9JzN7JzBfgfLrrFdQUd5aBqKekfd5bg2abEmDmMOOl16+0co\n18PtuNguJGXJIp2j65Dt8ozKqqlowZUETojjPH9ZC6Ew2qLISmzh70hYaMACqRRlUWIHkrouiLsx\n/ThkHMdkeUWSlrRJjt1osmKOEALP8+iEEUmWPmMK3mH7s21K22pcIfDiENkaFnWF8gJOH58RdrtU\ndU3YddCeZL3Z4AiFjCS1XTMOAsx6Q3C8R24SVNMyOZ/heYrIDylNxjZdEMf9XV0i3RCEEfNlRTfs\nMJlf4MQOwpVcTJ8/Vv3T9nN3Apbvcj6fEsc+gethpgalXIQtyNsG3dRkheCo54MS+IFPYGkW6wVW\nq1Ct5Hh8RJZkeJ2IR4/P+OSbb1D3W777zncYHw5os908tmNLtqsF8/MV+4cHlFnC4d4AUbsoX7LY\nnGLcglwWUFpsNjM2zRY3sOiMRohEUJYJq2RO7Htst1tsS1Kkmmbdsq5KbCLaShB4MXmxk+maz855\n+eU73Lr1IsPRGGk7REGPi/MTvvvWu7xw8zXeu/+UK0c9hDQ8uPc2VdUwGhzyq7/4Cb7/zn1mi5L9\nvQHG6GfTioosS+kFQ6RWZNKh+H+oe7Ngy7L0MOvb83j2mc+585RzdmZWVnVVt7qrSz1gyZbUbakk\nZGMhkGWHwRACOTCDCV4QRBAEATzwADwQIBuJCIwDeMDW2OpudfVQ1TVnZWbldPPevNOZz9lnzzMP\nt6UQoZT7BaKC9XbfdsR//v+u9a9/fZ+4xAvO0BsGWl3k8qcuMsfFVlOmixNW+g0cG4ajJWIm4VgG\nVZpwdrbE1TVsu0Z3pcu9B/dRc4uOcoHbl/f48iuv8rv/25+P3fzokKU7J888wuWIx+99iFFz8P2Y\n9ZVNhtMzylxk6Q7p93VWVps4lkioKVBJZEmI4dgIhUKcRCR5gaJWSLKCpuv8ws+9jlLKxIJ0Llap\nBMpSxFMK5osxSRghqApWpwdFRVWWyLL2Qwrwn1+SriDIIqJY4S5HGIggGcimhiCoiJXwpxOjnW4f\noYwJsgRBVdElhdl0Sk2VMR0HSZSQFZmoyOl2O4xGQxAEWs02SOcIN1GMyBcxz+YjFLtD5nt89as/\nwfc/eI/VRo9HD55gtxwm8wVJJXBpt0c4FXCjCRurHZ4enNK5so4VFWiywWIyocwjkjJmMci5dmsN\ny3YQwgxLVVESgciLWVvdwF1OMHSo13902+8TLwKNZg9dMxlPBwyGLhe3tylzkZPJEaaiIOoS26st\n1ttdUiFhNBvTbrQosgzfP/cU+nmIIomYksbVS9u88dZbOJZFr+lAlNBq1NEMEd+b4UcuipoQZmMQ\nRRS1oixi/CChrAQmyxGqYlBJOeFwSnurB1LFR3fuceXqFRRDJcoT1rqbRMuIsqowbZv5PGY6X9Bu\nrCBICisbm8ymU+bzCZqhEcQpD5/s8+DxM/I8YzEZkCUhlajjtAuarTVyctJMIBgvaHcaRP6Cza0+\n2dU9jo89kjBGkoUfcupFQMa2HKpSZjlccP3GbZJqxtmzU0RNpd3vkM9iRKnCUjQMUSOY+VDmNLtN\nhvMhL790nWB5QrvWR9MVloMII+6z1brA3/6lX+XKTh3S5zvu79/9ASu9FomfMjgbsRjOWYQlmqmw\nf3J0jgfb2MT3fCQh42x4jGEbiFUJeYU7n7K2e4nR8JSiLDBMG0FMuHr1Ba7sbmIIIqplU9dsBEEC\nSUIQSkzfI6PJbOhylkMUlxRpQk3XybIUVfkLOuIlRH6IoimkcUxSJGhmDa1oYZht1jstgjBCFGLM\nRh1/liJKBpKskosF3dV1DMMgikLKokQUZVRVY76YomryDyczC8qyQJFkSlkBWSEQCsaJgGrU+PjR\nE+bTOYoiYhsmLa1BY6XB6XTG/KlHv7tBb9MgjJcotsqz+6dsb61AKVPJCQIitu2wWjdRypS3vvMR\nL13dxjI03NMRJQJpFmDVRLp1jXa9C7zzz83BT7wIFEFOzahhrChUawIHByfUrAY7Kxs0WzWOTw8J\n/ICZUKG3TNp2g6LM6TZbFNmC49GIVb1Jf2WLs9Ex25c22dvpsfDm6HqNPBfxwoA0r1Bkk3q9SSWe\n4CYeG6tbTI4GbPQ3EROJNBJIcpGiCohij0a3hZgLlIgoogZCxWjksdJ3SNOMLMtx6hampBMbAkIp\ns7q6wkp/nbsfPaDf6/H04AkvvniL05MJeSEgiAqCpNPsqliGzGtf/DIfvvchb3zvDb740jVkUaZW\nr6NrCobVYjydsb6+xnAU4y9T0qzk6egASRJptdo0m00URUGU9/jw8dtU4ojNrR6SKvH05ACtZlBF\nGbZpIqLS7LcQdIVaq42uKSxPVG5sfJl2Y41Go87u5i43r7zAlUsvkMUewckbhPMHwF/587HzYo5m\n+5RixXDkMgsyNjbO3yXYhs7MndNsaYRxjtNpczoas4xC5LoJmkqtZuFFEbplUl/tsb2yyvbWRWzb\nwDt5grtcUOsKyIpKluYkaULgz/H8JZoo0VIhreksJAHdNAm9OXkaIUXPbwxGXkCZpqShiG5Z2M1V\nFNNEkWsYaoPpbIIsFlRZgigpSOb5tr2QREDCnbuEwblrwLZNPM+jAuI4oO44aJpGnuWIskgeRQiS\nRCyAJ4JQb+P6U1ZbDg3XwJ0sUHWT44MBN69fY73d4fGDp/TqbZ48uo/dstjZ2GI2P0XI5ly9dpWv\nf/cZhiUTLHzWVjWk+ZxbG11Wax1yKUPVNa5vbREXKYW4ZL1Xw1v+/2BsOIxTBElAERVESWBnZ5uq\nFEkijzCMaNhNZE2gLBIUsSQpC4ryfCJLFSt6tRprjQ5FkqKJKsvhnLj0MSQBSZeZDee0rDp+tMRu\n1QCVUpDYXF8jjlxku2AaDAkiEUWzSZIYRZPRNZXJ0MNyRCxDp9eoMz4e0LRNDE1nPvegEomTHD+c\nYesNLGMFp97m/oOHZEXBfOGyurrNdB7R7m+QFyWLhUsUxTSsGgs/4h/+o/+Ji7vbvPji9fPrR1Uh\nTQqyWMAwRBr1JkkY0e81GY8X2LZ17hNQFMIwZD6f02g02N3eopQznpy+g19kpMslvdUufhiThjnh\nLMQT5kx1nbTIKNOYn3r1V/iXvva3WWtdpBRAqAryPEdQVKqqRNJ1BqenRAcfPDd2x0dzsjLG82ak\nVYXW6rAIc6JSQRJ05EaDSZgi1xpUgoSpyeQNi1ySKAydqIhx5xN+8adeZ7PVw1REyhxCd4bneWiG\nTpGmzEYHVEBega6ZaMrquYehyIkCDc0oyYMCSZSJggVEzx8WGh4PWV1ZQTV0REkhjCuqKKPWKPD8\nI6oyIy0KRE1FUjXUqCAyVPI4JUkz8iwniRMcp0aSpMiCQJHGOE4dRdOIkxRbNymqkjgtEKqKII4Y\nRynWRg3Pm1Jk51YsoRKQ8pLL1zcZLp+hCBWvfeVL3Lu7j4JOTatRxAnbm1sspzM+fvSQnb09Dp4+\nYmO1RVUKtJwmYhYyn48RNBnDkChyj1anjmoZhPMhzebzpyf/7PrE5wR6a7uMp1NKMSEvRKIwQVZk\n7HqNNM0wNBtLa9Lt7GCqPdy4YP94yCKMqEqZm1dvnnP6NIU8TwnDiDRIqQqJZOJxY+8SJQUKGpZi\nkAQeWRURZgF2s06t0yCWQ4paglgLEa2YVqeGIFQYhoxd09FVCaGsUFFRVQ3bcphO5giCSqe5gqXZ\nqKLJjesvMRouyPOCmzc/Rei7XL54iYbTxjEsFuMJ1y7sIeQRWeGf465FmTD0UCWZKzdvoxp1vv6t\nH3B6Omc4cDGtBn4QsbbeYefCGmvrPTrdFkHoI4gVSRqxcGc8ffqEndVtDKWJoFpM4xC/zJlMffxl\nQqvZptfvMp9PmE8CrKrPv/z6v0XDaVMJFRUF0/EpR4ePEEiphJgg9FFaF9j/C26YHk8GjKIErxKJ\nJIVQUxhXOUWrTtauE7daLE2drNugXOtiX9hhpoOvZ5wWU2aFi2iqrG5egFJgMR0zHR6RBFOQBMqy\nIvJ95uMpy/mSOClIEwjTHMmwQbdoOV0aepdOu38+Euw4SJb53O/trvSZRxGVrlNqGl7moRgSglIi\nqIAkoJsadr2GWrNI85IgPpfQZmmCJFfEsY+iSKi6TkaJpEksXI+qEtB1g6XvnxuEag5lVTKPFpiO\nxcHjO4gllFlJ026ztbZJu7uKVGRokojVrnPn8fvYTYN6rUYu5oRSyfHYxU8lrl+9hjebcnVnD6ms\nWOvv4c5lskRCU0329i4giDFOXSEJXULXRxIN7n5w8CNz8BMvAt50xObmJuO5R5YnCFVFWRakWYKi\naNQbNkVSEns5QmTRslbZ6G+ThRU1pcFsskCyDQ4np0S5R7Ntslj66EpOs2szXUzod1cwHZlSSDkZ\nniGUFWVWMRqOCVwXyzTxwgVpkVBJcDw6xqhb1LoG88WAIPBw7Cb91TWcWpvxeEa73aYUC9LQxxIt\ndtdvk8Q5eVJw9dIldKXkF1//yzQdhfW1Nm++9W0uXNhiPh+jaxKmrrOYDum0W9i2zWK25MMP7nFh\n7ypru3t87ee+xu/+/j/l5OQIcjAVmcgb0ek2ybIEyzLQNJnNzQ3KqsB2DNy5yys3Pks48KjLBqWX\ns7Oxy/rmNpkgMXNddEXiwvY6hZCyWC6Zz0bMFmecnD5isRwwnx7wwfe/zkfvvcmzB+/xbO7R/vSX\nnxu7pK7jKwVp3cJYWyVxdBJL4WA55sHkmI+fPcKXU978+D3am2u8u3+fZ8s5k2VCr7fNzQsv8m//\n6q8j5RJ5UeH7IUVZUuQlpXjOUAyTCN1QSLPk/AlwGiAIJZPZlOlsTlWBbvZBrqNYOzitSyi17nO/\nd1mkiIZKkeaoJex0N0iDCe7JU5LJMSRLkjggCmM0QyepCrzZAi/wSZJzwGm93iSIfLIyx240EDXl\nHPIiSSjyOevQ0HSqMqciJRBTvGBBzdaRNZXDg0N0xcCQDGqiTl5mOI06cikSJEsKMULSC85OjtEk\nk+ks4OqnrjE8GZAvfZpmHQUVqZS5fuUGr37uK4iSxdLzaTQsur02n37hRfrNPn4osHb51o/MwU/8\nODAePaMrb3Jh7wWmw1MsxyROYuI8w9FN3GVEmWcURYmMxEqzQ2TYiGXJ4dEAy2kymBxRr9dJVZUw\n8Nna6+FFAd5wQKfToxRKoiShlErW1pucTMakboAuK7R6TUzDQpVqHB6fUnMaiCqESUBV5DgNg6qo\nuHbjGqenMyazMaZmUhQCtq6hqhaNokdNqzOZLtBVGfIcXZGIgiWKmPHBh3fYXevy7a//Dj/783+d\nGzeucv/O+1y/fJvjkyFJEjH1XSSl4hvf/QZf/dmf5jf+w/+AX/s3/g7vfvARr3zhp/nPf+M/4V/9\nN/912g2bi3ubHJ2MKMuc6WSCocmEQYiklAw+PmazcwE3HWJKIpYm0Nxb4Xsf/IBgHnFha5Wt9S6i\nKHNy9hGFm1BTbZyVNpEXMnOnyDOXw8ExaBqCY+MuvefG7oP9Aa+8eJmlF5LmMbPlAlXXcFptFssp\ndt1GkkUcp8Y7777FZ158mencxRR1rFTnJ7/801iiSVgsqaoUQRGgyFE1jcifk+YFsmKTlTK1mk2l\n6WRxRp7mZGmJLMnIqk0hiDjdTdRKp9JqxPnzz8FylpNGGUsvZZpkPI18DE1E/6GaLFRNnKaDptYQ\nVYVcOL+BESUVsSrOR5dlGduqkf0ZBLplnbMYfM+jWXMoyoxguWSyGBNIFblUksQFWTCh2+pQxgVx\nkbB7cYfFo+G5eUmVyNOY8eSUumNz68qnCAKfz125zeH9Y7I04fal2xwdHaALCrmfMvVGHMc+VZVQ\nUpGLJXNvymQ6wfcLclRGx4MfmYOfeBEQFJn9oyMiL6HTrJGW+fn5L89J0gxRFdENhSJL8bwz5DxB\n1UwajTr63h7TZcj21jZh4GHWdGaTAwTRAFUmCxMkWWI2GeEGC3Y6m7gLD6lU6a72mE5HTL0l09mC\nVmuFC1t73Ll7nxduXmd6OqTVahAnArImce/+hyBYXNzZ46N790mKkCvbNxgelUiYBO6SpmMiywa2\nrhC5C6LZhKRMyJIFmqBx/cpl3nzzO0wXLuQxG6sdTFNEVU16Kx3c+YjFfM5v/eZv8tf+1t/lztNn\n7N74MX791/99NlWJ7bVNDh4/pN9bZTbxKamgXrJcusRZSqffpm7XmAcLxFIlqka44ZSevUKv1SQ3\n6mg6tNtt3n7vLf6vr/9Dbq7d4MGdt+k02rTW94jDOYcf3WEwHoOlUwoVq1ubz43dT371S4zHY259\n5vMMR88Q9YowzFA0FdOskYYZChmqpCCoIt7c5bOXbvLmu2/zpS+8giEbZEFCmQWkaUyeJ5QVeHMf\nQbZQHZus0FBkDSSVQlTAOv+7SHMMs4Gg2MiGTVKIiLmAKOpIyvPlI0EQUKQVmm1T5hmqLOJN5uhr\nHRTdxHIaSLpNpRnIqs3q+jbPTp6hqxplkZFGMWGeoygKkqEgIVBVAqEf/OnRTiwrijRjMR8RFCnz\nMCFIz3V37U6PmtFBKBTmwZipd0p3pcPZeIIoiXSaTULXh0wgXJbUjDb5osCKHURB5fTuFLOps726\nC7mCNw/Ic4ma3UDSQkS5ore2yfHhGatbPXyv4ML2JeD58pg/WZ94EajkiiQLqJIAf1ag101MWSFX\nJCDDWwZUloq3mNOs1ZGFnI6kkByd8drnP8edpyfM0hm1noPn+/TlDY4np5imSVGISEmOLUmUhkG2\nDBDSEilP8aYzNEFEQyIrU1LPpem0+JnXXuXR/iG6qaJoGrKsI0kS7nKG77s0Gxpf/PHP8/ZbPyDx\nM+SyQZKliGICQkbdMpicDjB1WExdsrKg7bR5sn/Ej33uOuZyQn+1Q5klbG6tsivv0OuvIAkiY3fM\no48fIBYV7374MRubHdZ2L+HUTH7yX/g8i/n5f43uxjar62vsP36MLIvcvHmL4XTMvfsPiGKfZr1F\nkodMchenrzOaz+g220RyQFGGPHzwhJrjcPfoPd678x12djZx3TOOwkOm4xF2s81qs0dU5qy0+8jm\n80Gjpmbh2BnuYk6n2WN4OsE0a1RRyXpnnTv37qBKGmUGaxtrLCcuf/RH3+bHX7rJhc01kthFQWRy\ndoyhCVAVRElFVGpIRptCa4KkUeYVknk+1lwqCplioksqsqITJzniD7HaVR6hFAGFO3zu97b6ffyp\nT5Qk1O0acezRu7KLamkoRo1avUGQFhgS6IrIareNLskIaYmmKEwXEwxDp8hyZE0mWnqoqg7iD6nC\nuo4fhmRFhiLKCKLJxtounapgfWeXb/7BGySRS7vZw2m1iAqPMFkiqWBIIq1Wk8RpcHw8YnW1g+9W\nsAzZ3OxSpRpBJXMwPECVXG5duwXlgLauk0sxJ+MzTMlg/94TJM2kZtmMDh6w/95dfu4v/fNz8BMv\nArJhIC+XON0m0+MZZtPhgw/fYX13A0kvMXQVTTMpnALdqjNZLOnWW0STObVMw8kLFLONHy1Z6XZo\nd1u8+eH3iMOQk8UxWt3hbLBgdXOF6WSKREWv10Nr1Hiyv48tq1RpgWGopPMlk3nKTncNP044Oj5h\npbdCUVaEYclw4NGsz3n/zlu8ePtVJvsLVpsGeeYgixKqlLOcT1AqgfHZGKfRxFQFTFPFNFWW3pB+\ns8M3vvMGL9++xf3Hd5kOJjx59BTPC5Aclc+8/GPs7G1R5hGPHz1grbfFP/iP/11eurzLP/lnv8ve\nlRcJs5TV7irT+ZylO+fw9ITB4AxJEmjU23iRi6TYpHGFImmMRyfsbq2yzGOKoqTZsOivr/LOe+eK\nsEIET8ro1xSaQpvEdSmdJnubWyiiw70nj54bu+Uyot5q8eiD+7S7XX7tX/s1/off/B9Z7/Txco+9\n3UtQlIzHQ9IgRtJsWjWDz9x8EUKXJJfI0gJJ09HkiskoIkwLCqGGWPjIqYbWsJFqPUBA0HTysqKq\nJKpcPH+xJwFpjqyK5HJBFruUi+dvgSVDw3Ry0ghkVaLV6tBa30YUC4qsJI5C6oqKnAUki4Q8reg4\nTaazCX6UYpgG/U4XUSgp44Q8z1ARECzj3AUpVGR5jpRnnPkerhiTGCrz8ZSjZ6c0HYd+f4tSrDga\njrHbGkkQIAkCkqQzm7jn9uEyYTmZUmUi3VaXew8/RhEs5oMxr//8z3N4fEpaQimKZGVJVCa0W9sk\nWUprp0tRFZwen9JrOzQsCXh+UfyT9Yk3Bo+Ph2xstHj69ClOo8OHd+5y7doVfN9HFksEKSaMpyCm\nLOMRRl0lEyo6V67wjffeJEgjtvsrWJWCVYmEwwkvX30RWzXpd/ssFi4IJf3WCiudPqaqUcQxRilS\nr1TSuU9DNnDnC3Y3d6gEgSzOUCro1xqMBidkcYKpa1y6tI7rezhOi7ffeo+dtat4Y5+Xb11kpaEi\nFRllGTFzzwjiGWnmEfkzJqMjWo5Jv1lHI+dnvvJFNjfW0DSTze09PvXCTW699BJ//2/+La5vdzk6\nfsTZbAhCxfe++0c8vvsu//1/818ipxmOWiLMn7G6oqOZOo1mC9O0cJwG29tbzGbnODLHcrBkHVsr\nWW22cMcT+v0WNdtAkWU+fv8j9lZ2ubxxATEtKaMCf7Kgrjr81F/+Ba5ceZEn+8c4zRYXL116buxU\nVWV8NqJWtxHFkm988/d49Quvcvj0AD9cEPgumi6RlRlusESRK37u9a9hOQ28+ZzIm7BYnBHlS4I0\nIc9LQj8kTxJESQZNpRBUikIG2UCQNAyjhqJZKIaJZlnIqv3Z1J0AACAASURBVIFWqyEpdcSyIg2G\nlNXzEdtPHh/y0b2PWQYRqmlQ7/aQJIlaY43u2gVqvS3EeosgK0izFEkVuf3SLUohQ9ZkMnKiJCSK\nYqI4QZI0ikrCtg0URURSRPw4wE1ixpHHs8EJlVRg1FQ2d9dQTYGz6SGj2THdVYfpfIgfeqi6RpjE\nrG1tIIgirXYHSRZ44aVbNJo2t27f4uq1Pb7yE1/i0f5DFv6SsMwQLBmlJmPWa8RVQiGlJNWSe/ff\np9t3WN/sIzv/L2jI/r9eqy3jvPutqbSaLbphi+FggF03iOMYBRnTciiqnDRLqLVM3HjOk8FDrm5e\nJc9yxoMTNrp9kizAi0KGT4/Q0SmykLqzRkeAb3/9O/z4lz5Pu97k4PE+4jxn3e5DlRFGS37slZc5\nORnitBrMJlMURSHLQlq2Qa1m48chM/eUhlnHsroo0YiPH7zDRvMzPNgfogrQ7q9wfaXO/uMHlEnC\nZLKkomLpeWzsbOEtI5pOCz8JqVKgkrn10qeJk4Rvf+sNfvt//T/42ld/gs99+rN0V3q88Y1vIAkZ\npTdjZ7XNg7vvs2opVGXC6PQ+YhnTbLbQNI04Djk6fkat5lCUKc/2D+hfaOO5x5RpimWpJIGHTMH2\nep+6ppHGGeHMZT4aYbYarG9s0671+Pa3v0dZVMRBysP799Hrz8eLTQbP8AKPzd0dnjx+QiFVfPut\n7/GLP/U6//sf/hOiOGAWDmj22iDI/OQXXmO702M5G1EmIYm3IAxzzM0NzsYLXD9HMpsUkk2m1BAE\nAyQT8YeTd6UgIgoCIiCeS9wQEBAFhTyPEYIB5XIE1fMfzeR5QVIJ5wi2okKOc2Q5IYuWVLmDaTaR\nZBmrXp7bnksoBJWkArnMEahI05R63UGUZXTzHEQSRRFhHCPLEsskwl8ucbptRskcN/BpOQ2WkUe9\nXccqBQbDAUkCtZpJGC0pq5Jev08lCCAJRFGMrqjUmhqPPr5Lvd2k7bSJg4C4jLDqDU5HJ6yu2MyW\nZ3ixi2lpGLrGwbNH1FfqTMI5h8dP+QueUfw/1ideBLyljyZntBttvvvGt1jb7dHrdcml6nw+G5nT\n0wFr671zBNNwAFVBf7PJ0BvgGC3CxQBZBF1WuX3jJh88+oB620Cr2zx+uE+/1eL2jZs0nRaD4Rnb\n/VVGcxen2WTuTRHROD08wOj2mQ5H1ByN+cxFlkR0TUYoE8QqRxYhzzKmozllWlJmJVWlkRQybpjx\n4Mkhl/0+eari+xGC1WS+mLJz+QbrW2scH4/xogBZU1BVg/7qJh98eI/+Spdr167zs//K3+A/+wf/\nKaOnx/zC61/i4oVVDg8fUVYRlVTjwvoGR0fH/Mwv/os8PDql1VthNvHQNJN+f42qqgjDmMVigtiA\ny3tbvPHuAaLsk8YCgpRhaAp3P3yfC5sXEckx7DoNu4XU1BmPFhw+OWY8HlLkYBgmL778Mo+f7T83\ndgoici4wGAzY2FxHNhS2dzd4481vs762RafbZTw5ww8CNjY32WhfgFQkLSqgokgiAq9AzXWKoo7a\n7iLbTYpcOYe3KBaCaiBrOkgygiSd05koKfIcSRDRZJm8UvCjpyxO71KEMWn8/GePnuchazpRmiOb\nNsjn+vEySbFrJaIiIYgyuSgiIFOKIpWo0FvZxp2eYDYtkjCmKCQyAYo0RawgmM9ZBj6KojKM5iRx\nTK1TQzJ0SrFkshhTILC5scnDh0/pdLrM3BFB4p1TqEWJNE1YBiM03UArUgxV4/2771JKKVHmcTj0\n2Nu4iBlrGKbGLPAYLM5vVfx8xvGxy/rqJmGRMDl9Rr3ew67ZKFL+I3PwEz8OVEqFaGiMl2Ne+cwV\nNtd7ZElGGqQcPhwQzHP6rTakJXJW0ev36Hf7eIsIy1B59dM3ONj/mCRzyYWI+w8/4Prla+iiyacv\nXOPzL36WzbVrrDa3UCoF34+JigTDlNAUgW67wepKG7WpM3JHKJrMMlxiGSatevNcOpHEUOU4ZhNT\nM+g217DNJpK4iqAXHB88pWZZSJLI6XBBmItMvJggCljrdbl94wbHZ3NczyMDiiSj7dQIZgO8+Zjv\nf/fbLJcz/rv/4r8i8+bsbfaYjqf8L//oH7OYzLh7/4BnhyeIOSwPjzGbG8iNbcbTCYqukuYloigR\nhjEvvHAb1w1Yxi7uYEkSlrRXuqxuNBFFSIuSShS4/+AjXP+M+4/vkMUp3tkIVVaIs5xSEPjiV77C\nT3/1de4+fMKzZwfPjd3qxjqKbFJmBacnJwShx/DslJ2rWzQbTSZjl0bDYWN1iwvdNcq0YLIcIpQl\ngmyTFwJhuCDNMyq7jmJ2KQSDQlIoFBNBt1EVFQkBsarI05QkSSgLEAUZRdexah1EjXO6cl6SpAFV\n8XzkeJLEpGmIl8QoloEkgqaZ5IKMqGkgSsThgsQdUaYRuqogSSXrOxdRRZEoLUHXOXOneIuQNMlI\nkwzP94myjIk3IyxD5IZNs9vBthvUdAWjZlJkBaPJmKosEWUJ07RxTOccDWbKjPwFknr+lFrTROya\njabJpFXCs8khVktnkfksgzkVS9zFKVmRMvNmZGKG5uiMFiMUQ6bRauHYDa5c/BRp/KOLwCe+E+i2\n+4T+jHbr3A2XhzE1UaPWaNEQ61iqwmwxYnN3C0M3iIqU/YPH1K0aj+4eUq8cfunnf5m7dz7A98f0\neh2+9fvfpNdf5XB2RKO1wv7+Ed31HsPpAFnS0OTqXGQpCQgyhHlOKVVYjoaZiDTMPkWQc3J0TG9r\nDaEsMfUarj9jsXCpGSb12iZkIoZm4jgNnHoNjkWOTs4QpArL0tA0EQHodrv8wR/9IXEYc+HiHoIo\nMp7MmC58et01VNnEdX16Zo2v/eov8+ILL3L38T0wDOIs5tlsxNT3SFMdBYMfvP8xz6YuH925w97u\nLu58yQu3b7O9vUUcR+zsbPLGd77JxYt7KIicHBxi1C2SNCVPK5R6DbXWRrAkjDxifdXhe+88wTKW\nrK9tsL21xZvff4dXX/0CceyTJMFzY/fG+2/itOrULYtsHkIWsLbe5enTfRynzunJU6YLg43eVbY7\nl0jcUyhSCkTCKMOvZFRNY+kGFE6LtIC8KBBEFUU8ZwJUVfVDK3NFGIaUVAiINBoOplNDFBWEyKPK\nUkzLwhNE4vj5cwJ5lpzvcOw6VQmFWlFIIrasQpmSJz7ksJxPaLRVRMMBSUBWZMqipKwqhAIkSQap\nJAw9FssZUlkxzyNKRYGGjWpp/PHb36TbajE4OURUdTbWtphNh3S6K7jugFLICKMFUz9AVlTW1rYo\nkpKiLFEUjTDySfMYq1UjXsQsvQlXLnZ48tEZqewhWTl+POZsMMBq18myGFNVSNOMtZUdxEpkPjz9\nCwErf3Z94kWgpUlEkU5b1en06zy4P0IsZCQhpl1r0nBs8iSlSmG+XODlEaqgISYlV7YuYxgtfu93\nvsMXX3uV8eSMTmud5RJmfoCi6fzg7e+x2tmkJEDTFWqCQ5q46HUbrwjJxJxSKvAXHkIuYrdXkCoF\nzZK4dv0qh2fH6HWD2WKOYajn/YF5wFqjzdHykN0v7PLwwRMeP35Cq91iPJ3Q6XRYLicIgkZZVvz2\nb/02Vs1kdWUTTbcYLmI83+Xpk31WugtkQaTmNGht7HDv6SkfPHjK+kaHl158kdCdc3WjT71usbH7\nAonisD/z+fD9HzA/2efapS0W8wlhFFCWJWdnA6I4YXNzmzxLMfUG9W6NQovxVR1Z1UmWPhUSpyOf\nlm5x/9EBkmMzXs5QvDq2IfKpGy/wzrsf0uk2aVbPn8ArpIrRckoSLJmPx1jqJgvPZ21znVJM0GwZ\nz0149a9+hfVel9nBR/iuh2gZBHlOIdVQex0C2aCMYwRNQ5A08lKg/BPhR1pgqMY5GRSQJOnczCxr\n6JpOnKQkYUCwHBIlAUVeIBTP5x+oqkoYRQiVQFIVGKKGKEBFRrAMyeQlNavN5sYKlWQSRy6xIFAW\nGaVQEcfnQNHp7BxpT5owmY+wTQuhbeN0OszTgDALafZahHlBZeisbG3jTj16/R5Hp8fYDZs8jBFV\ngd5qB03RqaoUWVGpygJV0whCH0kRGJ+dIKgi4/mUrneGYskIUoWqKgyGUza3t4jSnM2VNRbTBbbu\nMB/OUaUQpdXGbj9fHPNn1yd+HCgMiEno9puczA7IdYFQ0Xjro/scT54yD2aopsTTZ0/prffZ295G\nrArW2l1WVs7n6F945SWmfoDT7jMaT9GMGoJ4Dom4/KnruKHLo4dPmU5mlFVEqSmM3DlxGqPJCmVZ\nkicZwcJlGXjESXTu8vM9sjJj6bvU622KUCYNRKrEgEpEUUSGowErq6vM5gvSND1/0SdAmmQ8fnLI\nYDjDcjokRc7pcMiHH90n8FI++vBDrl69hCyfm3LHwwFPDvc5Pt4njZf0O3XaDY3Z6Bm2IjM8OCYo\nIs7CGYYoUEbnjLqzk6ccHR+QJAHj8RgBESqZIofpzKfbXmEwmJClPhUZiCWNZh1BKmm1G4i6RiZm\nZElEp7PO6WlMGNlcuPAa/97f/2/59O1f4srFn3lu7HY3XmWtdpvZxMByrnI8Nlhdv4hmS5yNn2GY\na/z11/8en//s64iSgiBIaIZGlgmUmkF9bYv7ZyMquYZc61OKKlWRUWURRewxHR6Tpy5J5BIHC5aT\nAePTY8JwSbNdRxZlyiJHFDSKxMddDkiSGE17PldPFWR01SCNUyRZQUIkCz1Cb4lYRMSxy3h0wsL1\nCCOPLAlQKPHdOafDIYOzE0bjM6azEWeDAZPBmCzPCKWcwhAYRmMUWyDKQiRRIg4ims4KZaky9Xzi\nIkVt2Vy+eYtmo4NQaciigqpqFHlFJSTMpwPOzo5wF3OSKOa1Vz+HoxoYisV46CEoJaIkUhQVAipF\nAWWWkgQBa70OlBl2zeHipT0OB884W0x+ZA5+4juBRqOOaigkTYHlIkCxdYQMfuwvXUETBVQJkkXK\nhRsX+cZ3v0OZSbxw/VOMJnPKykAuMrRam+OxR3i4pNUymS4mdHtrnDx9SkMXycSMznqbxmqH8fyM\nKPZYeD6mJaLIAoYkIbUcEkWm0a7hz0vcMCfII04HC65c3SYPEyR0bl+7zVvffYSua2xtbvLs8IhO\ndwX5TOLR48fs7Oxw996HNOoWWVZg1Js8PR0gixKCWGGYCqfHH9Pv1JCqiI2NdRRNxbYtPnjnTVbX\nelx/4SoCOd9/5wf8yt/4Zf7w936fnZu3qRSTLIiZTQcouspnr72MIJqUHz/DNA3SLGQ4HPLpT7/C\n2dkRjx894uqnNtje3ES2PAaTCf16k2gR0HMcRKnkdDI/F6RoJl/+/C/z1/7q30WTTSRZAqHghWu3\noCr4j/6dPx+7//o3/mfyvCCMY7I8ZTQa8fjwEVEy4dZliVvXbrCzdZMwiVDtPdTagnm4Ty4quH5K\nHoWUZodMNinzgkoQKOKEMlpwMtxHN2uk/gRV79JoNTk5PmJ1bZe9i9epNbuEQUBZFhTkZEuXeBbg\nLX0U+flFIM0SZFU9F9cqImWREo7HGEVGpQto9RaNVhvJaiAqKnkOVSHS7a4TJyW+uyCPY8grKhGi\nOEVtGqjtDp5eMfXm+NMYSVJIAo/eRp+TswEX1vuUYsVgdIa10uHhwQHReMnG6hrPTk+IgphUKlAT\nEc1QiZIML4qZeS5VVdFw6nzx1mt845t/QF6ktGp9BsMTOv0OYZgiySpJnJHpBWGcUGY+XjhFNmSa\nnRbw/Mbun6xPvAg4RpNomRAvBSxsBFMiiZbMFjMm0zmb/S6LmYtWt7G6dVYaW7z7/l2ubG2BqnN8\ndsaO3ebeg8cIYsHUFzgbH3BJjnk23mdZTOi2HY6n94ikdSRFQ5JETNOkLCNa9TpHz/YRdRlZkhgc\nH1EVNrKi02h16W93GD07haSkKgTOjmtI0vnZq9ls8ujhuzj1Bru722RZypNHj9FVnTjKqDsdTLvO\nwYfv4RgWkizg7o+4sLVLu1OnKFIs0+TJw0dkVcT2ehvdETg6ekijYWNYGt//wVu4hYBUSNiiwmB8\nzOHjQ3LfRby4gesGpHGEZRooikSaBRimRm9lhbk7JUgLBqcLdi83cOoCb7/9Ln/nb/4K3/rDr1Nz\ndHRNplHv0nVu8Eu/+PeQK5FzN2+BgACVBOXz75qrqkSVZVTbIc8LmnadK7tXEcmgUhDkjLxSCbIZ\nvuBA5wLe1EVSBeRCwVtG5JKBn1eYYkma5uSxy/j4EUk0ZzkfY1s1WusmxycLur0VNnZ2abRbZJVA\nXgpkWYnne0xPR5RZAoLI3H2+J6GsBPI4ZWXnItHCxzs5QHF9VEtAlHXKsqAUJRRFBVlDokKQNGQ5\np8xKVEFCyEoUQSJPMvKyRBBKrr7yCr/z7jeotR1M0cBfuiAJOPU6U2/BfDnmwpUd9h8+whQFRvMJ\nO6s1Dg/uopp1NF0nTkNyTWUwnqDKFl4Uc2Frk+l8wTzw+fif/RZf/tJrvPHNPyYfniBQ4fsuplmn\nLCtUUeRsMKSkQlUMkiKgJMOdjX9kDn7iRaCixHJUfP+U1fU1jscDakYNq6ESLVKyuKBu10jzlDD3\nWEYTDFtkbaPDyelTqlJg+fABVeLx8udf5WSyj5nYnC2m3PjcZzg6fMz+5JCd1S4VMbKkIscZxQ+H\nQe7cv49uKMhJhiYoVNX5WwVRU0EsebZ/RB4HtJw6ctUgSnNqdYc4TZGShK2dTZ48fsDGxhb9XgdN\n0Xjy5AlpltDpyuzv7yOVUKs7KAJc2dkky0o0VWfhTnjrjT8iDpZs9LtEoUxWauRU51YgUeHpfIhu\ntGmvbEKhsbV1iZOjU6pYYeZm7O8fcv3CBQZnZ0iSxNraGp6/xLIsOu0uUb7EjeacjWa44ZLbn73F\n//lP/zE108EPSuIoRpYqHj+4Rxx4aKp9zsoThD9Fd1dCBfz5c7YsKlTVeSLIsoCAQikUCGhASVmq\nRFlAmpYEqU+BxY2XfxI/DAiDhKbvET+5j2HYhGGIJMDZ8JQ4CZm7IyTVJJNBjsboWg+r1mXv6k1E\nRSUMXIIwJAqWpLOnlOWcJK8oRYWien4js8hykjxDM1WSxZIqrxAlifreHlrNRDXrGEaTvJCQKM+P\niVVClp+bhckE0iKjKCIkScA2Jeymwdt33mStaRJmPsPFnMuXr7C//4R79z6g1mgwHY+oii6qWcc2\nWuRxydwL6K/vEWQRgizRVGosfZ8L29sMTuf0W23iNKESz+cbdje3uH/3Ee3OGnt727zzvTepN2zK\nPEUWLBr1FpUgo9s6Dx58zLW9bU6HJ5Tij07xT7wILObPECuVdq3N2Wh4Lg4NYjpOl5HmkVcFjXqP\n6XyG41ik6Zx2XycIhrS7FifHZzRrNq98/iX2nz4iF1I21nf5eP8Bh/sPCLMAzTq/9ms3TPxgRruz\nxTJOWeY+zU6XMAygFMglAVMzkCSZXMqpKp+syNlc32O58BAVGVmymbsBsR+wtaVQq1lUlcB0OmFz\nawvFtDk8PWHuL5HdBYJYY2/vApUgIws5UViiGwVBvKAiw2marK7WyRIfw7IoZJk8TihFEUWWCaOC\numNwcnzM+tZlTvaf0ml0MFZ6LPyQB4/2ufBXvgRS9aeddFWUMTWdvd0tjsbPKJ0aiupCKDNfjJAV\nDdOycZdL/MSjEgtarRZz9wiB86fNpmkiiQKSKCL9BT+k9E86z2WFIAiUVXHeaCsLsiInyjPCJMSP\nArJSxnZ0kjzFMFs0WiqypHLrxc+hmzppnhHHIePpCd///rf44K0/xnWHGKaMG8DLL7/Ma5/7CSpZ\nZbqcnnP+Q5fl4Yd4p3d+qPs67+Lrmvb8H5tcQpmReUuCMEFKYpyWg1I73/nJSp0MAUmSyLKMMAyR\nZYnD/UcYksSSirIoEAURQxJQVIGwilFEgyzOadQbJP83cW8SY1l6nuk9Z57uPMYckRmRlVlZVVmV\nNbEocZI4qCW2KRpuU5BgNXtjwLLhjRYSwI2WpLZayCsJotxoQPLCEOVuCSJbFCWKFGsesrKqMiMz\n5jtPZ57P8SKqBQpMkkbbBr/NBeLgnDj3/P//3vN9//u9byFxMbn0yZRi0HSJ8cLnyb1nSY6PkISM\nIgzRdBE78Yi8iCBJEGRoN+pUMNHWFMbjOakXkWcJvXqLLE2ptRq8f/o+zl2XF1/8OX7w/ddpdjRU\nQ2GyHCJqEqtgxWM3bxA5l1uvaf5ogZV/8Vh+0sEoivjkJz9JHF/2cv/qr/4qX/3qV1ksFvzar/0a\nJycn7O3t8ed//uc0Gg0AvvrVr/LHf/zHSJLEH/zBH/C5z33uJ97AfD5FRcZZugRCjIpIQ6szOrkg\nCiJOl0sev3GDVeggCAVpGrOyF3izBf/qc59iNpvhh3NOL2yqrTbjxYrzgU3FqmF7S9rrNebLCUaj\nzcp10AWN06MT1nd2WBy/x2A4p92p0q23eHD/IVK7jRs6RGmAKmms9de5+94DPvriRxkOJkiSga4J\neKsVDx4csr9/wM7OLh988AF5UXI+HLKxtYZAzng0QlMk6vUafuihqwKCISJdCtxSbdZQNQNRFNis\n7mF7AXkKomJQUWSyJKFWa5D6Maqp8d1/+Ds21zfZXFuj2rB4cHRKq9+n1WpxenzM3HapVWqsnBVF\nUWDpBi/e/ih/+f1XqFoFoiBSpjme45OnEX5Y0O11cJ2Aogj4q7/5P3js4BNEUUpnbYtKpULVMLAM\nC/hRhZrTwQWSJKDpl4QXxJw8A6GEOE3IywLH82i023T6BqQxZf6hCKgIkighiZcLjixDRKFT3+a/\n+dxv8MVf/rf4kYduKFRUC7VqksQRYeQjFpAmGZHvMj5+FcGZ4Kym6Kp5aTpTrz56sgkCpQjz6Yxm\nb5MsT9GsCpKqEqYReexiSBJ5niHIAs1WA8/3GQ9OiKKAKMnRJYm0zJArBqEZU1REbN+m1V3nwWjB\nlb0dRpMh47Mha+sdklQkLRWGk/uIhUzi+khZib0MsOoWaWpTq5ssXJdVEHAyWGGZBlVTp97rslgs\nKDJQZJnBcEKQx5QCvPLaHR472OfhyTFxMsOsaaRFjOO4yJJBHin0u7ucDY9/CgT8FBDQdZ1vf/vb\nmKZJlmV87GMf47vf/S7f+MY3+OxnP8vv/M7v8Pu///t87Wtf42tf+xp3797lz/7sz7h79y4XFxd8\n5jOf4d69e4jij9+E8N0CsyEjkeNlCe1qF+IUO7Dp7vR452LKd17/Lu21DvHERVVLCq2ENOF0PKDQ\nbOJUws9V4iLkYj5AzA3ipGTroEdRBLTbXQpAUTTSICfPI+qqRl0wadQF8jhmOltQazXIZRE/iPDD\niE61xmw65Zlnn2biLAjEgkoqUjXrnIUj1tZ6rFYrqmabfr/P97//PapVi9BQadRqjC/GzKY2kqiz\nvt1gsVgiAJ5fYFgqkqEgiiWCXLD0A5zAod/dQsJiZ3eb0/MTFLNKFCaE7oq1vkVJDOiIQskbr7+M\nKmlkqYCu18hnKwxDRxQFvMCltrnF6GKKaLcR6xmNiosfuFy5foW337hHu1NhsnCIMp9SEPhPf/un\nJKHL4Nzml3753xD6dfxqjTA6B178kbGbL5aIokhZrAABVVWoVTR8z0GUJaIkI4oDGoZKHjp4UUBZ\nXKYNcFlTEMTisk03SylySNMMAQnNMtANi0qljoFKEqVkUUIURIRxBmVBGAREzhjRTXBWU5TWGoWs\nkRePJsjkOZDK+FFKrd+nUdnAMCtQyCh5ipxHqJTIqoKk6QiqTqJXSWWRvIA0T1FlhbqsEaoi0lad\nMEnwi4irnT6vHT2kH21QAJ3+JogCbhxQCiVpErGYFHSudpknc5ICGkaVMFsgZZdFxkQAo2nRrLbI\nY5u5O2YynLG3t08QxyTxkutXdnnj5UOUVsZb77pcubrDwp8SZgWqqVNr1cnIWaY2cpLQ6XeB0/96\nEAAwzUuppiRJyPOcZrPJN77xDb7zne8A8OUvf5lPfepTfO1rX+Mv/uIv+PVf/3UURWFvb4+DgwNe\nfvllXnrppR97fcNSOT+3eezKJovTOU9/osdqPKWldTgbDvnFzzzFbLnk3v0xbVOmIYhYkk4ox7x/\n71067Q6T6YytnX2WqykvfeR5ZKHCK6/eZbX0UPSQertGpabgzGdIicp4tGS9ecr17Q73Dh9Qa1Zw\n8hhnaaMZOpVKlSCMmK/GiIKKOD7lYP867uEQzdBYTFf0um0EQWAymZA3RZarObt7u7juiuFwyHQ6\nR1d1yqL40JhSY//qDU5OjtBUleHFhMCvYZoa/X6brIRue5tmrc98sSBMU+r1Fr7nUyKhVS5/beuV\nGpPhhFdfeZXpxZD/9X/5H7GdgKIsqZhVDNNgOpsShiGT0YQ7d37AWvc2liySRK9TZDFTe4bZa7Ja\nejTWNGYLjenA5fquxF98539H1yyO/vQ9vvAr/5bkRPiwHPCjIHDv8A2yNEPXNSrVGrpWZTgIMU0T\nQRBw/QCranLv6AFJlNCsV5AkFQH50vWnyCjLD3PvLEUSRfIiv1SQ9lxURSa0lyiGjq5oJElCmIQE\nYUL2oQaBognMBgtMS8Z3VsiaQak+2nwkkUoKoSQJAsxWE3SBXEqJUwdNkcmLBMexkZIcQdEQFRMM\nEw2FNExp1ypkaUQkJRjNKsN4AYaJIGu4cYAii2RRgFiktFttTo5OWN/bhAIQDEo1RTYMwiJm58o+\nZ6MLSlll5UdomorvF8h5TEqE7bpkSU69ZpKlIUWRY6ka0+EJV6+alJlMYEes/AlhEhIJImUaoqsW\njVqV3kaX4dEFN9av/L8HgaIoePbZZ3nw4AG/9Vu/xRNPPMF4PKbf7wPQ7/cZjy9bFQeDwb9Y8Ftb\nW1xcXPzE61f1GnktY7ZcsLvV5u7b79Jq1ciTnEazjSyrbPa3kJBJbQ8ij4yS2y8+y9uvv00hylRa\ndXIESkpOTh4QeCkf//hzLDwHL7RZ+kvyQkA3VSglIvM6LgAAIABJREFUbj1zk6OHR6wV61y9dsBk\nPiMOPcqixKyauI7Ler+LUIDrBgSRz3Ayod/dQMpVFMUgS0rOLwasr20wHJ6jKpcU08uqvI3rBZAL\nlMB4PKa33iMKY6IopV41qNWq2EuH5aLAsT22dreQpIxAi+h2e4RxjqgY9LY65JnAcrYkTFLufPef\nCB0HJ/T49f/+V6HMcRyX8+EIXb/0QpiM5kRhTK1SY3v7Gqoi4tgrdG2DgXOIW5bIcpWKJiEGAd6k\nRJFE3j2dISoKe9USL3rIn/6fX0XXdXS9CvzPPzJ233nl61SsCjJVatUeilJjZ32P+eqyRhAmIddq\nt7BMgYppUeY5WZ4gCgVlyeX2Xp4Tx5dtuWWZUhQZeX4pGpqpOlHsYZgGZQlpmpAkCVlWEGchkbck\nSRNUA5xFQhR61DoKUfRo2rAsiiSyjC5o+GmGaegkro2mSbihjSibdFpNRLOKrKiIuoWXlvhhgqJr\nCGmMUdEQDAlbiLAaFqfLFWIhoPRztusNDE1BEw0cZ46s6Jw+OEe2FEShRlaMwZCotJq89uY7qIZM\nd20Dx15gaRpVSySPLl2E1tc3uTg/pdqoo+Yyy9DGqpkItIhzWK4WaFWVpNCoNCVW9opmp4fvhyzd\nJf12n/0b1y/FYX5K/FQQEEWRN998E9u2+aVf+iW+/e1v/4vjgiAgCI9maP2X4z8p0jgmzzJEVbv0\nnzckavUmZ6dnBH7Edn+N9+7epVOrI+YgICHKAsuVzcc+9Vlef/0VJFnmfPwAXQGtrLLRb3B8fI+k\nKNjc2SQTU4b2HFGCTrWKKMs88cwtbNtmOJiwub6JHxTsXDvg/aN3ECRw7BV7O7uIkkye56hCharc\noRA1ahWJNMqpVFrc/eA+rWoF33exqgbvPfwAQ6+iaNplg1FRIssyvudRtUxM3eDo8CGf+cwvEsYe\ncZrhug5JmOPmK3rdDbJcRFI18rIgy0uiIOPiYorrOsxGM7I44JnnnsaqVXCjlNF0Sr1eI00T4ii5\n7K+LI3pdE1UVeO/9+zjuCkHzWdvYZlVekOYZsp5TphpVLcX1ROqdKlHscHxi8/TjW9izMdXqOk78\naKXRRHJ5+/Au3VYbYV6iqAp3H5SUhYgo6XRq23QqfTqtFnGWUwolSRp/2OQnIgiXepJFUVDmJVlW\nkucFAgWpEODHHpIgMpvEiKJEWebkRU4ap8RJSBQsWeYwnp3TUOs4hCTLBXrVeuT9FlmCVakTeDGz\nyYi6uUO1UiMNHSRRRSgUwsDDNOpIuoWbpeSihj1fgVhgmCalViKvm0hlRhRkVLRLDUwJqFarTKcz\ntjoNJtGYVBYwaiqLZUg+HKNpIvfefwfPTWl3W4wnE2RFxwtDyHP0UmZ34wYXgwvC2TGVWp39q8/z\nnb/+S4x2nXSRUW03yMsMU1Xprrc5PZ2QoFE325CYxFFCq90lziQyx0PO/j+0IavX63z+85/ntdde\no9/vMxqNWFtbYzgc0uv1ANjc3OTs7Oyfzzk/P2dzc/OR1/uTP7n8fPu1Ba2+Rq0aYjQb+HnM0WRA\nqUhUNZPZcMRmo8VqvqChmOSSTCrk6KrGaDYgSUM2mj08e4Ism4gSSLrK4b0jGr0W9+7fRxBz+ust\nxrMxy9BGaEq893DEwd41JF0giANUxSSKMnTdICPHqJocjUdUKyo1vY4cVeg0tri4mBPHHpomIko5\nrV4DMc+YLaa8d2SjaSp2tEQSFJI4uSyYAReDc1bLObpu0mmv8d7de+zubbG21md7Z5ssyy73n9OC\npMgIlzOSJGG5WOI5PmEYMBqOqVdFXnzpWQyjgu0HTKczmo0mfhCQ5wXz+QKhzHnpIy8yGc/wwxTH\nDXh4eA+zWqO73kDJVeI4ptKp4XsRnVaXdk/j4dk5N5+5Tpwccf/4nKubTbxwSpA8uitvvhjR6TbJ\nM5skjmiYdQJviShqrHc2ef/475FUiWs7t3BXAXkucO3akyiyRpqmiKKI53mUZUmWZYiihCBDUcYE\nvkuRX6agmiRDKSLLEsvVjLxI0TUTVJCMPtXqFqIYYuVV4jgk/TEag5ATBEsoFSbzKVf298llgWpL\no8wziuLSenU1ukdFeAy50mYxXiDnEkKWk1syUQ0QEqrrTZqawZalYel1wmRFTZSI3JhCTbh+pcXR\n+QJJkrjyxA3+4Xsv89Stq/T6e3xwfMR8scDUFFqqyPrBNYo4JCokvDigUHPyVGYxdxjXDnns+tOk\nqki73SXLXEaDEUq1wXQwxZklPPf8ASI6S9+jXrPI85gsybCiCu+8fI8/Wfzktf0TQWA2myHLMo1G\ngzAM+eY3v8nv/d7v8YUvfIGvf/3r/O7v/i5f//rX+eIXvwjAF77wBX7jN36D3/7t3+bi4oL79+/z\n4os/mksC/Lt/d/k5qfeJVx5SUpKWU2qNKrO5T7+2ThKVGIJMHqfsb2yTuwF2WhDHLrP5hObaGkkZ\nc3F2gq6oRFGMgkQYhew+tsVi5dFtdyiyCN+L6FZbxElMQkytVyfOI2RdpZByUGPiyCNNA2r1BjPb\nxqzUCNMQo1ToaG1MuYZULqgaBrEiYwQSQSpwdHGCoSvIukyZl5dOsrmJIpb4ro8gQqVqEPgh3bYI\nmQCCQJYJOKsYUUwppRJ3vmTpuFhWjfFkiiAKdDtdijwiTzxu3brB/kEfTdagVDg/O8esmKRZShSF\nzJdLGtUma+s94jTEsV3my5DlYslnP/d56rU6hTbCH48oNJEw8An8CLPe43R6Qb0m4/rHmCZcu9Fg\nfOxe5vvN1iPH0Pdd8jRBkQVUxWQ8mZOLEpQ5s9MLJqsl07t/zcnqkC2ti6o1GIzAcWI0Q0dTVRQq\nFFxaf0fJkijxCBMfGemSalyUJJJAUVzuVimKBAjkRUpcxGSCTmlUCX0HPw6wqlVc59GvwGmWIkkS\nfpyQ5xmyYZImPm6aUK1YpEFMo9WjqWis3AC1dAjcAFmV2dvdwitjatdrSJbM2JuzWI5JbY9eu08c\n5XS6m5SWRf/mTf7xb/4GP8rp9DrYuU93r4agmVxMbRzXw/fjS68IMWXhuIwubPq9KrlWRVFUog9d\njs/OzzGkKm6R4WcO1za2oUyxdINWZYedNQlZ0DibDGi0KvipS6thMj+dce35PdY3JX7lI/8AwNe/\n/l8BAsPhkC9/+csUHxa3fvM3f5NPf/rT3L59my996Uv80R/90T9vEQLcvHmTL33pS9y8eRNZlvnD\nP/zDn5oOVHSwag3kUiTDYeXkdJpdlFxEUkXUQiMXBXzHI3R88jRlY38X31mwOLng5tYB89EEQZLR\n0pgiDxBSl9ApuLp/jYvxGNWSEFOJLCkRSgXPTdBUhVyWCeMcQVeoCDVGJ+foaoWFt0KxZHprVQgr\nqF6TzfUtjgZ3KFAIIpdCyHnm2cd5/d1XcRMNRS0YXOR0myapKhL5l3mvUpF4/PbjZEnOxdmA4WTC\nWrfN43vP4wYhhSSzWE7wPJvlbMrmxiaynHH9xi4AeZazu7ePaeqIokwhpIzmc9KkpLe2QRLFKLLB\nZLxAKCR2d/dQVIH5asXc8xgMBzQrNbqNDnpNpRAPiO075OIAD5FWc5ModaipJWtrJufnHq4ooXZU\nGu0mw8mSlEfbkGVZjmpAlke4RURKTqvSoRBFjkdDNEslyzPeOXwTu9NHEwzcdErdqGJ7JVmZY8om\ngqTjJymlkCHJOVkSXfYKihJQIgkymmZQiAK2H1MKBVIEQpESJwFqyyQqu1iWRRIuESuPLgyWUoFb\nJpSmyvHZAw6GR2xU6tRNHY2MUkhJipQiVzDqDdwg5mJ4SK0F/iKi0EpyMUIOZcSiQDVN/ChluHRo\ntTqcTUYYusLwZE6elHTNFs48ohQz9GqL89GI9d4OnhsRpwV+OmO3eYPlYkGtWUdIFCQ1RZNkfKmk\n3qggl5DHGfWaQbNq4K/mrLXbnAzOWVvbwNB1jgdnBHGA4lyKoUR+RLvdJc49lqHzE9cf/BQQeOqp\np3j99dd/5O+tVotvfetbjzznK1/5Cl/5yld+6j/+LyHoCXlhsrl5g4vpe/R089IjDgl75oJQUNOq\n6EqFIHdo9LskKhTIbPX6uCub9d4WiixxfnaCrHSI5iueePYp5h86+liyztxfocoa9WoFMUsIggUo\nBaIoIsoZQnbJ7W/2ujy+9wT3Dw85uXdGS2ty68rT2N6UUoQoX2A2JbzQ5WJ+B0H1kasOtpNw9Vad\n5TSk1heQXRlZNJhNbXJlxfM//wT3/rdDTM3EdW3eeOMHtNsdNtR1rl3fx9QkBDlHEiGJM5K4wDAq\nzGZzsixFlqsMh0NKQJIlTFNFliX62zucnJwhSRJXr+6jqiphGDGdLplPRgShw/O3P44o5eRxwsoP\nKWODMNKp9VWiMEUUJZqdKn6Y0G330AyNZqPHu3ffJbYL9nfWHjl2125cIY4ibGdB7IegyPhFgCHr\nPPfUde68/SaipNFfrxOlLm5kE527bDY7rKZLJEUgyzxk1WIVxGysX2E4OUdRZKxqld2dTWazAWQJ\njhugSDo7O7sEQchkMqPV7tJst8nC8NIGPIpIJAVRqsEjgEvc6CJLBUVcUMxifD+kNCtEgY+YXBYj\ndUmFUkaQlEvdwjhE1TVGmY+yVsUnpoxTkjRCb1QIZylRGCIJBuRQlCVv33mNzbZG6MRsbfSxi/iy\nO1BVKPMcU1N55pmncOwhi9ECRZCQFNjsNXnl3n12ttpEwxgRaHd6SIJCaahomo47ntPvdzFNhYU7\nI05ShDSn26igVk1c2yP1c2Qd5jMPxXh0feRfPJf/x6v1/6dYxSJqpcL57B6iGjGeHpEnPqv5mHpF\nplmvUOgCnuDQPuhQqyqsghWT83MOB+9xf3aPcTLlweQIs9fk+u1nufXzn2S0dKkrOtc2d0g/fLU0\nDIvrN25QrzSoahZCmlCXVbI4IYpSBASWkyXf+stvEw5W6GFOXarTqm+y8udIakoqeCz8MyQzZjR/\nQKlEdDeaPP70OlsHBc/9QoPN6yIYEV7qsrZvcvWpPj/4wevoqgaKTSlmvPiR5zl4bJ+SjOPTQx4e\nPWDp+JyPlpfS2qKI59ukaUCWZaxWKxRFQRA0VFVjY6uPpkocHh5irxxUVWexmPPW229wdHTKyfE5\nZkXn9rNPomoSQejw7p03OXz3PmrZ4n/4jf+JyCvY2rzKfLXAXjp4nodi5DTbFSazcyo1uPn4AfqP\nacgZTIesnBm9fh8vTWj2m9RadXzPZTka89Lt2xiiCEGGpTXY7PSRxJR5tGSaLVG7Fo6UM0gcFmXB\n8XDF9cefwKzVqDcbDKcXTOxzBrMLdq5uUmkZvHf/Dk8+fxOzohBnIVpVJcw8zFYNX4TUKPHVRxfD\n5gbYWoHWaxArMBheEEQB7e4WzbV91Po6biyAqCPmMoaqEscuBRlmXSOxEraubbO+sQFliSALVJsa\nzz55C7WUSL2ExC3pNxs0jAplAntXdhDLGMvUCcMEy9TYWu8SOyuKOMFdzXFXC5zFksV0xf7+GpWK\nxe1nn2ZzcxtN1ZHknChckSUpw8E50/kQx/FZegviNKZRt0hCl3sP7rN37YB6vUkQzskyD636Y9iT\nPxQ/cxCQcpVSiEnJcfwSQVTwfB9FkQj8CFvOmX840R6cnPODd96kLENq6zWQZSzLpFJRUS0RsSgJ\nQpvj8X3iImC8GHM2uaDRrpKJJWJVwXcdXnzicZwwolttEPkeulll5UxZOC7X9g/Y39nF1LtcufIR\nbtx8gfPJIWG+5OX3votghAh6zNn8mFIUaNTXifwlabFCqIS8enfIm3c8Vm6Jpks8fvtJnMk5hWNj\nNQOUqkFQxpyPL9hY32B7+4Bue5dKdQNnHpCFMBsuOD8/J4pjoiQhzmP8NGW6DFjYC7ww5e07h9x5\n/z6lUGJVK1TrNYpSBEEhin263RZX9q7x8U/8Al4UY3sljiezWLj83PM/T13d4V/9wpeYzufQVBkt\nS/ZvXMWqiJRETOenyGqGYoVcTN595NiZpk4qliycMVe6fXTBQkxUREkkKn3ePblHY7vL5t4mNUsE\nISXOUrr9Pjv7B0xcn1q9jlyW1FSR/madDx58QFkGzJdnJJlPp72JoKqUZYmKzNbaLn/77e+SiDm5\nlDFfTchkgbP5EbHs09jZwGo/uoaRhCG7m1coIglNqjAZZ8jmFpGUkiAhahVMVUWQRFJNZmT7LKYO\niigQmhIhJXcPH3ARXRDKKeezU5RYIvBybNfHUA1C3+MTT99iY3OLjYMO8+WCf/0L/y1r9TUOtrfR\nVImqrmIvljh+gSzU0dUWm1evsYwi/GVCUUicDcb4ocdsZTObz4iWAclqye1nn2M4HhOmIWQFVdPA\nD3KeufUiT1y7TkWWWO+28JyEMheYXpw98ln8cPzMQQAERFUkl0I0QyAHVMUiSFPiLKFRs4gFuHv3\nPa4/dQ29bmJUDNQqiFqBGyzJxZRrj1+j0e4zX3pIuopSMQizGF0XsedD1ns1ytRnMjrnvXvvkOc5\nc9clykLsYIFsyaxt97EjG1EX+egnXsKsqZws7qC1BSb+CNHMmXlDxu4FmRISiC7v3H+VHImj4xhV\n3sObKfRrHRqmCElO5C9543tjFnGJIKtEYYCpa5yfDy6ZlSdnzIYThKxEFlUCPyAMU/JMwnMT8kwG\nVARRwvEXLDybi9mI88mYyWLCYDDAcVwGgzPi1EcQC0xTYWOzS1EmvP/+XQaDIa+99hq+7/LSS89x\ncG0XRYCzd6foxRqpL3JwY4Pjszl3PxhjGBa6ol8ulOmYbv/RZh6CAJomfsjX17EXLovVgIKUIEkI\n0pz3Ts4YLxaEsYO98vj857+Eu/QJVg6PHxxg1RukpUgU59QbDZIsIo4DROGSPej5HkbVxI1C7MDD\ndhdokoBnLynymDj2mc2H3Hzixj+Tt9wf45i0ubNOt9ulotZpql0kIadhyZRpDojIioppmai6jqlq\nBIGHUBEYJDMcKSQmJ09T/KlDgUNewsXIZzFe0exvcfP551nb2+Dh4IiT6QDZkBjNBvxff/MXLF2H\nKCtIgeF0SYmElMiook6ZFJzeP2etu0YURmRZjljkhH7MbLmkvt5Dq1oUaclbb78Bqo6gqGh6hSQp\nqLUqfO+Vv0eTSh7ce5ej80O2dzaQJAmJRysv/3D8zEFAq1q4gc3cmRMkLqJU0my0US0To9lg6Qds\nXd9ha6fG5kENqjFusARRJqVk7/o1Vr7NO++/ySoZEKQTgniBn9i0OnUkSUFGoywkNL2KpFrIosVH\nX/wEcV7iRQGutyJOQ/S6jqhCs2twePZP6N0lq3DI8eg9BD2lVEsKHZaRg5/FpGJOoWeEZYGitqjV\ndzl4qk8iB8g1FX1DZZUvuPXJp4iFnDgXKQuVPIM8T3EcB9exSYMITdGQRBlBUIjClLKQGVzM8dwE\n14mZTRdkacxyOOPOy68zPjpldHKB7/tcDE6QFQFJKqlYJpqmE8cRRZEzGo156603ybKMp249yZO3\nniAIfP7TX/0li1lKRd9jt30dOTWREpGP3LrF8HzM0888jyCrFLlIWTx6mkRJwPp6nzjJWHkr9IpB\nt7NNzVhDiCtUaLBRM9FIIReRBZV2tcN6p8fm5hqmphAGEe1un9ZahyTxaTUqNFoNREmkXm+RJSlB\nGBFmCb3tDZKyoNauk5UZqqag6xqaIfLyq68iCBKiKNHt9B55v6nkcHZyDyEO0MqUdt0ijhzSKL30\nDiwzRC4JXrlYYlVMvGQFdRUaGoJ06VCtGSK2r9Bsb2CvDBodizBZ8dYH73A6n9La6WG0NBRLRtYl\nJE3CrJqkRYIfeGiVClalwdUrV1BQIBEgLZAVDd8PybMcqYQyz7j62BXSvCCRBe67M3xRQ5RENF3m\nyv4BGxvrLFZjmq02umShKTWWSxfbnfPw6JBW66crC/3MuwjFPEcQJYpCw7AsJFPE8xeUsohqaYyn\nY4xKBW1jHT/JCMuEIstpautY3R5R6IFmsZxM6bQl5ssRt59/gcOHD1jNU1SlgqSKHJ/fp7PeJw0i\nNpsNhDxifXMbyzKZTCZIoojrLakKLfb2d5g7AwbzMXacIcseTpriCjm+s8Co1RherLAqFru7e4xH\nA+J8RV7GzP0hgV+g5jI/98IuL3//iCxZUKmXaEJBakrMLwL8OKcUcvIiwTAaTKZzjk6PMYxLx6NO\nt0OSpChyzhuvvEaa5fi+Q5mX5FlBGhYgSlSrDqKUo9giaVJi6glJesnZn0ynhF6A53n83Ec/yvMv\n3ObBgwf87Te/RdUwef4jHyETSqrFM3iN+3gWnJ8MaPfa+PGCuFwgiSmq+ui8siwLVE0FRcQPI5TI\nRkgjPCfkyuYaxxf30OUKtUaLPE9prG8SLM8pSJkux2SJS+bZZILCs8+9wGw0I7d0dEukKCVm0ylr\n/Q7LKGA+XWBVajzx9JMMzy640rnGcjpCaYkYVpWNnR7z2QpFLfHcR78JHOw9x+CtUxq5gWCCpJRY\njTX0PCBLI8RSICtlFK1CnpeEjkteVVhKCVFeoKoq9somC30UUWJ//Saj2reIygRJFAhjn0rd5GI2\n5OHxEbvbm6R5gSRreJFNp9Pg4vQUSzEZjSdQptTMFn2hQ5AnHJ0d01nv8eDhEbefucnp0RGKkDNf\nOmDp7Oxv/7Nt+0ZnA891MDSDMhZRKyZv3z2k3W5QrzYxLZVKpXZ57k+JnzkIGIqGPQv46Ede4N27\nd6joGrmYkpYlXhJzcP06g8kFmVinllqIuk6n2mGyctjpdvjg/bsoQsHe7ja+F9LZ3ubNt+7Q7Wwi\nFAZpUpKIEZqiMB6NaFZrTGZH6JrHdDSmVGqomoLvBlQsgyD0yIWYXICj8yHTScFT1/Zpr1nM7JD7\nh/fp9VuYpo5l6ty794D+Wpt1U2Y6PuHJqze449+lYkCGQaNvYS8ixoOcrTUZsyojbEoIaYmX2Dyx\n/yznZ0MOH7xLq9Xi+GyALEi88uqrrK31WV8X8APvUoNA0QjyEEGTSMocTYDRaES9VSWOJhh6lZOT\nwSUjTxLwHZdrj11je2+bX/3iF/j3f/rv0SWFl158iccO9pF1DUEViZKYO9OHeNmKK09sMhzOaQsN\nTKlKs99lfW39kWMnFhLj8xWKqLG2tUmalRAndK60CGyXjZ2dy6Km7+A7Mc98+uN4oU0qZsimSkLG\nWrtGmhUc3X+XIAwxqhpBUFIi0Gw2sT0PU7fIlIDVdMFGc5PQS1nb2iJJfHTNQKgo2M6KJPTQTYtc\nefS29HLo0tYbqEGKWpEpyhJFMTAMBUEUUUWdQhBRdYVCkDEqJka9ydAfU4gqgqIiShrLxKa+1uHB\nYozRq+M6c5rdLnGW4LpLNLXJwdV9RrNLvclWq87RwyFpmHDr1tO89drbGBUDzTKI4ogySVnf3sQd\nJLRaTZqNKq4XUGm0OL4Y06zXWPouqihSKgq5qrO3f4PXvvc6610dQ29ybfdxalodRS8Iw4DpYIxp\nmtg/RmDlh+NnDgK9Zh/X8ViOHQTBIEoLotRDVS26/Q7TxQw7WFIqBXc/iChKidHcZufqVWzHxTQt\nUs9mOZpi6RVmiylP3nqKh/ePefLxfWzbpyhiDs/eo9XvsFzZrLXaDE4iarU1lqlDkoaIokCSxBiW\nyXyVcDJc0Vl7DNs9ZLV0KCOJfqNPvptyOjyHAhRJZHNjHcd1iKMYq2Lw/P41xNInLQIOD0/x3IBC\nhM2+TpFmyKpJGNlYhoHZEMjFkus3bvCxj32cJPMIw4DVaommfYJvfvNvuTgfUBQCCDmlqCJqKoIs\nUqYAGWmSokoSQRgQxzmKKkMhISKyiGZs7eywu7/Pf/gPf4YfxJRKwQcfvMdkNGBh2zS6HdrdDrla\nxdDajOYzMjKyLKPd6NPf3GTwY/o/Nje2gIxSbjG4mOO6IRudGovlDEvR8eKYRr1Bt99jPHI4On2A\npgBiSm+9w+uvvcHeWgexorKYLGi2m8ymc5588inOT87JyozN3R2KMGR7Y50Hhw/Y2O7y4PA9Tk7v\n0uv0CfOIyWAKYsnW+g4XFw8pHiGAAiB4YOYy1apGmkZUKi2KPAZVo95uIiDj2i6B5yMZFjs7e8y/\n71Bba7Jw5xyfDZFkaDbbl8Yt0opciJGlkpUzI0wyTMskyWISPyMvJcI04607b9GorlGtGty5c4dK\no44f+qQUZGlJr9uh1mxR8+fYyxWO4yAZCsenZxiaxtpal17Dwlu5GFaFbmONwXsn9NoNosJh72qP\n2XyIUJRookx/a4vZYHz5vWqP3i794fiZg4CiK7SbLWp6jawNUeSR5A69dgffcZBlEUVVSLKYx3au\n8PbbdygEBc+Z0mj1GRzfQy4ESmRWno9RaeAkERv7e7iixzsPX6ciarzwzHNkQolSiozGU2aOTUyM\nG4S4nkut2qTdaxGlEbPZDEOzODqd0Gv3ydMUL/OJVkcopoyoSYilRBIlVDWVum4xCUuKQmQ8vSCO\nYgRBRCg99nY2+eD9KYKVo6gKJ4MR1x5v02+Y2EOJ2XyEK3qMhue0mxV6nR5SvYGoGHz2s5/lH77z\nXYLAQ6kUCEpG6ieYikIcF6iWSpqBH0fUe1WSWMR1Q9qtNmvtHmbV4PEnnsSqNTh8/z8ilDnPPP04\n64/t8OJzz1CKEqJqXTa6DB7yTw8uyPQIWZVQLY3ZZAojiWuPXX3k2C1mM5rtOkEccPuFW7z99jvI\nkkycpOSSzO7mFnlW4HoO7W4LWRaJvIA8jyh8kd2NPmJ2mQp6eYEZ5rRrLebTOdVmlTyXWS5mNM0G\nb73zBoJQcDI5xmxW6coGH7x9ztVbuyjRCkPXuBgPEBSF1eLHTPowQlUsEEsUBORCZDjxkK5skAQK\nDU1iZS+xzBq6oiKLJqpkMvTnLGybUpIQFIGEkvX2NvP5BLNSYzUdoGkKZVmiaSVBEoBkkBc589kS\n0EnLiJVjU1IQ5yGyolPkEYoioxgCXmizv7/2+05jAAAgAElEQVTLyz94mb3da3wweECr06JVrXI2\nHLC9vktFb+PFNvHyjOcOnuR0dEwuFGi6wdHZBVd2rhI6NsXMoWtUyQqBKH805fuH42deGByPBogy\nxEmAlBekYYxamJQFVCot0qCgVushFhrT6ZRqRSdOHNIsxHNtfOeSuZYLEq2NDR578hZKrcrAXvLN\nf/x7LpwVk2CG59k4iznj4QWb6x0+/dlf4uD6szSbG9QaPRq9FvVOC82wKIIUIcl47voBo8UUZAnN\n0pBkiSiJadSrhFnGZO6hGnDycEK9KtDrrCFrGn4SYvsunW4P31+yvq1Qs2Sy2OX5Z6/SrXfJygKj\nl7CxY/KRl25T0TXOzs44PLzPyz94hePDD0hij9vP3aZQU3aurVPtGuzfXEc0c9Rail5TiIuIme0x\nGi+Ji5C1rTaSlhOlIb/4uV+m1ujxd9/8O1rtJr/yr3+F/+7ffJEnn3yct99+g8nFOWQxDw/f55V/\nfIf15lOEtkKSFYzHI6yKSqdbxXbmjxy7JElBFClE+Oa3/zO7V6+S5Bnra+vM53Pa7R6SKFOrtZBL\nAVPWUYWSbqVN7icUYUm10yGKM/qNLmVRgigQ+AGqprOcD3CdBc31Pu3+Gig6aVZgVUwCSrq7bZZx\nQJYGjOwR5/MhkmYRxI+e+NvdPoamI4sSeZaSGzLr+7dRWjdII4nFbEEudZA0E0FQQVGoWW0EUUNX\nTFrtFpVK89ICTRAYT8bYqwVxIRAXUK21kVQTO4goRIlGs4lpGui6RZwV+GnEzsEVbD+kFBWipCQT\nM4azU3Ix4D/+1V+jWhaT1YJ2pUUWS1iawHq7QRo5XNnps9PfwosLLhZLrEaPyWjFYrXEc21sd0GW\nRVQrBr7jEDgOivbTl/jPHATSPMY0dZIkJnA9Oo0O22tX2FjbYzFfUa83aTb61CtN0iSi39viYP9J\n8gxm8wXXH3uKutVlf3sHZ7Dg/lt3efnvvsf5yUOcRUjd1MhTgUhOkVsGZq9Obogcnj9k5S1o9pus\n72whKgrNdotcEpilMWeTCaPVBC+Iqbc7ZHnBamVjqAZCAXudPk/sXqEqquxttuj3TA6ubDCeTImL\nlCgJUBTY2lpDLH32tuscHLTZ3Wuytq4hKxKH43Mcd8r52SFb2xv0un2K8rLPIPYC2vUaoiGgWhUc\n12PnyhpLZ4FqyZeiFG0TRAVB1AmCHMcLsIM5C/+M0vAQtIgwcZgsxtTqFs/efgZRKoljl0bVIPZd\nXn/5+xy+f5dPffJZ9rf3IS0hFxAEiJMI/0OS0aMiSkNUSaYp6/z8zWeYPjhHEmQECWRFxbVDQGUw\nGOHbPo1qjcVyyeHpOW5aIJkWZ8MpK8dFFU0sw+L4+Jy1/jZlkdPo6GzsrLNyfHr9HRRVJ0tztnZ2\ncbOYqbcilVLOLxyaegurrKCQ0aw/upApF6CLMkKa0a61EKMMkZiyWBEtPmB4/x+Q8cklCTfOyMqC\ntW4fSzexKg2SOKQoIqI4Io5jBFmmFDVEWcesNFAMg8lySZIJyKqOiECeZZRkOL5Lrd3m6PwMo1In\nTgoq1TZONCUVQnI54YlnrlNpWNSadTTFpF2zKPMECQFNlbDnE44OH3B1/xpJmRJnMr3OLueDC3r9\nNknqYzsLBpMRqaWyKlIeXgx+6hr8mYNAv7+OJKp0u100VYUiI4p87MUMVRQgzdFFicB2sbQa1/dv\nEkcZ7sqlrlt0ug0EQ8MTSqjrVHt1HrtxgJKXXN3s0bFqPPP0kxiGRpbEKKrCaDnHTXyc2EVQRLSK\nhh/5LJcOQl5AElKryJRFws+98Aznp8eUJXQ6PYKVR0XT8T0bxx7jriKu39ymt1nFjicIYo6hqDTq\nbVRdQddhZ6tHnAYkZUQuOeTinHEwxFA03HLOePwBp4Mj3nrrbYajCYGXEIUBoTth66rKEy+ukSkO\nmC63X9imv52xvqeSEbK1Ay+8uI5Zcei1BbxggGRFjLxD/u71b/Bg/BZXH+/y7HPXWc3npGFJ7Bec\nnZ3xxutvoCoqN6/foNleo6L83+y9ya91WXrm9dt9f/bpzz23v1/fRB/hTJvEDjvLjayqEshCWCUG\nTJBAQmIEA/4GVEhMEAOGSAwY2MaAES6TTtuZZWdGOiIyui++7van7/bZfc/gpguj+pKQEDjKVDz/\nwF26e63nvOtdz/s8Tf6tX/sPkKomUq3h+ynbMEbSXy09jZcRwSZiPl5hYOHi0lH61FnOrdsnXIzH\n7B8dUwsVnZbL6Rcfk2ceslygyAKtVhdJklmvN8SxhyCVHJ/sMples1wsEQSDl2dX7Ox2CIIA3TBY\nztc8e/ollVRR1Dmb8YbXH75NlqnEacp8ukEUXu2OXOUZZZVjtWwqWaSqK84+/wmZN6djN9m7/Q6G\nLIOk4TR6pLXK4fHbiLXNZHWOaqhsthtUzWCxmCPKMigKTlOjrCquRnPSSuTeyWPkKGG1HEGdYRsq\n/daA6WiDKKm4LRNJySnLkiiqyMuKTz9/Qpz5CFLGZHZKXW1RFQmEBnqjyyao8IMUqUhIF9ck2y1J\nECLJNXlVo1kGoipTIHE9XSI7Lpkkcfjg3leewa+dBMbjEevNAj/wMAyZmgLH0SnKhMevPaYWClRN\nwjB1tmuPJ08+QRJz7t27w+7hHmG2ptltYjs2h/u7WJZBs2Gwu9/j3fcekhcpb75znyxPSaIYfxvQ\nbXYIwpCgypmGK7x4S3eny5fPn1ELAoKhkgk1cZVR5hFSXbG/N8Q0LcIkhapEEzXef/+3efja64TZ\nFklx8MIQoc45OtyhJiPONhT1lkZDxjZ0NEUiDAKiKMNouKiayCjdIjZ1VuGWX/0Hv8LtkwOOjw84\nvL+H1C2YexdQldS1jOu4TOZTPK/C6VhkUoDVNfCLDWZbo1YrXn/9EYaqc7x7hCZVvHz6EcH6ksV8\nzB/84R/wv/3JH5NVJZ1Bh1/77i+zWi/48Y//OX/4e7/HZx9/ymy8oNveJUtvngbzPKXV+pf9BQGG\nDZfCT7h99xZxGRIWG2zJwMxNRleX7A+6RN4Wz1uw8pZ8/uyM/TuPyRCpRIlarJEFkY7pIEsaRaWw\nnAf42xBFNgn8NWGcMF7Piasap7dDsz/k5eWKxSZh5+iIiJIXk3M0s0Gv1UOSddxW55XrVUUZUbhx\nMaqFCsfQqGWLB9/6bY7e/3fZf/23UFoHOFobd3ib4we/wXff//dJ5hoPH9xlejWjaTRZzlb0BgN0\n3SQII4o8p0ag02tyd3+f6WRMbaiIqkJaFmT1TXjavfsPMEwdzx9T41FLEc2WxWi0xbFNsizl8uqU\nRsNgsV2zjTzMhk2UpFjmzfj3t9/9N4i9gIHbRQU2mxk7+wNm6zlRGpMLIGryDfH2e6w36688g187\nCcgKKKqI61g0Wy5pGrHdrkjigLpKmcxHrBdzdneH2I7FaHJOWSd4vsfl+ALDMciEDKQSy9bo9BzS\n3KfZNhCknAevH/LnP/wev/Dee7Q7HWRJIq8KbNumYzo0RZ0yiMg9n3cfvsG7d36B1w/e4I3D9+ip\nXUgjbh3usl7MkEQJgRrXbvA7//CfsF4ETMNTRLkA2WCx8UjzhKurK5yGQ13WDPpDDMNht7ODY1go\nkk4QQVaX1EpNt9uAMuGNew9oNkxs1yYrQj57dspWDBBkbgI5RRXFkHHaDoe39pG0GsMt2b/fRXFr\n3D2NpNqQlxFFlqPKoOsFYXxFYc7R9mpW+YpPnzzBabUIw5Dx9JqjowP2Dve5c7JLu91iu4xJYwlV\n1XEcm7KsaDVfLTipTZ24zrmcjSnFmt5+m1yLmT9Z0RUG9NouL19+wf2TY0qgNxyy2UZolkGc5/h5\niqQqaFlFkSbUZYksqxwcHLJYzZA1nSyraZkt7h7eRq1l1lcj5GTNYdshXC8ZNjvsttsEvodluewP\n99huXq0TUGUdWVIQagFDUVA0icHxPRSjg2Ls0Ri+zt7rv0nv7rdpdW5hGAq2KPNP/7P/hvUTEYqC\nOIxxdYeX5y/odtuYtkFRV2y8NaEfMp0sKfOSq/GYTRDRbDW5vFyiqCJRmBHGEVdXM6oaFEWkLAoM\nWyDJcoJgjW0bZFmMqNakVYqXeGy9Ne1WF8d1GK3m3H7zDWJFo6Bk0O2AWuEVKZUs3vgMdlyMlklO\ngvDVowNfPwkEWYS33VAWOV++eMY6DFkHIdfTCVfXFwx3d/E2K6Kth66rtFtdmm6LXq+HZRqoiogg\n1eQUoEosvTWNZhPT1KmqlKJOOL59xIef/jWaKnK8u0df1JD9mJZl4YdbVEmm3bAIRmeYacavv/GP\nOe7tsNs2ubt3B01S0C2DKFnw6N5d9rr3uD5/SberIYgmhV/hyA5VKuCXGZKs0XOa3Ll1m9VySxik\nqIaIYYHdFTi600IvY3baGk1LIiOjFhOWyxFRHPLgwUN+/Te+i9tooioudS7y2mt7iIpMu+viNnUG\nwzaqKrO8vuLOQYeTTpedtsLDR7fR5Jpuu0ma1WzWAXuHHQptRSZvuP/Gbf74f/8hqE2uZzPOXjxl\nOjqnKFKOjw64dXiIIfawdIcyKdkf7mGYr74OKLrByYOHlCIgS0xmK9abGb/wmw+4evY5o4+vkHWL\nqIjZ6+9RKyaTzQq32cd1OmR+gVxrJIaGrIioisBy7bFebpBliSDN2Tvs30TD5QGGppIu1/RbA3Td\npapMZMkkjmKOTw7pDHuIgkyn+epKoMhyLNNCEkTEuqYWao5v30asQKxLJElC121Uo0ktiAgIiKJC\n39nhP/33/iv61ptYdoM4vJE1X0+uaXVa+JuIhqOQ5QlbP6LTbBJEBY3OgIXn0d8RuH/7LTbBiPV6\nydHRAW6rQ1ZJZLVAZ3eHycaj0BQyQSPJaiqlprHTxO21EUSB0/NTwjjk/OoFq+WKeTBllVxytX7K\n2fgSxTCRdBNJVzHbFl4ZIig1SvXzDFb+T3ztJHB0dITbaZMIFZWh0NofkKowvHXEk5endJo9Ii+l\n1x2gaSqaptFud2+6rhps1xNalkyWemzjGZtgwsabU3NjjhpHPvPZJUXqs10vKIucIAp45923WE6m\nOPKNDPPp5SmTaM00XPDsxfewUOibh6SbHFu1KZIMVYLNfEnLaWGYBfuDPiYmbvcW1+cjyHJ6TYM7\nd/awmwppFlLVOcvVjNlyTlHmJGlEEiUMWx0UUaLpqtj9kkvvY6b5Myoz5fs//iHj+TMkUrb+Fe//\n5q/gNFW81YRwtSIJtti6hqkb7N06IJFqEgIevX6XUgm481qf/Vt7tHs9fuvf/kdsNgFtV8A2A5ab\nF6y9C9y2xe37d7l//w6/8v532Nvvc3l9iiBU3Dm8g6GZ7DX38eYeUvrq+fzHD99ElzU6DZckCHn7\n7XcY7g65nszRGi0++egz9CjDlGU++uAjmkaDk06XbBMyG08Jwpj2oEstFnhhiqHb7A2PUUULQ+2S\nRDJJXDJdLfns80/odvtorkOj2+LyaoRiKoRFjKirfPb8CUGW0Oi0X5WTAnAzlBZFmIZBWUOOwmRy\nzXJ6TZF4pOGSF08/o/wXwSsitSggiDXfevM9fue7/zGrWUGrPUCQFCyrgYDC7sEdBFHAtUxaLZci\nD9g96HM+uqZWC0TN4NMvfogC3D45QkLm6ZdnfPLpU2yzTV1J9HbahEWBYjYwm23mmy26ZlGmNYPh\nPntHR8w3Gx6+/gbT+Zrj4R5IFZrp0Gm5tG0DU61ByTm/eklFRsnN/M1X4WsngTiIERSZQr3RA3ie\nx15/B8nQefD6WzhOi19491coC4k0jRgOd0iSlCgK8TZz8izg4vwJHdNFjTTevvMO/c4OsiBRU9Js\ntFEqE7GQ6LT6SJKCpRtcnJ7Rbro4lo0jadzt7/L41gPm8xFnmyvGi0vCeIOu6IjI3D98hFQ1+Qe/\n+susly94fv6M3A+5e3zCZDVhND2naUPH1RDkjEU4I4wDZLnGcXREoUBUbgZQsijA0DUMRSUMlrR3\nNMTmjMMHHVJlhLXnYQ8KNEHAasiczv6S06svUIWKfrfDo/t36DQbN+qyThOQSMuQ8+kVcbqmlgtU\nM+PuawMKyaPRVSnTnDffOqDVrXnvvYfIYoFtqVyNr/ns0w9ZhwsatsVkNEIqZMpMZL1cYskGHePV\nPYG83qCbFaamI1Q1f/Vnf0G4DfBCH3vYwjmySOYLOlEDw9RxJI3nf/05liDSb3fQDYur8SUPHj+i\nt9NkGwS4rsXGD7l96zGSYJLEGdPRhF6/QxgEVIrMzPNI04Qyr1A0HdtxGO4foBomk8USXXl1DVxV\nBYqskqUJuqqi5luef/CnjD/7S37yg+/xV9//IyYXL/DWy3+RwCRw47M5ny95/d5dLM0hDErcRht/\nG3N1Oabb3yXNJSxFoyxSBBHm0wX7Oxpd20YuQCJjvZgTegGKZBAGOft7+7juHpKk4m1CTFHjZHCI\nisrB7iE7OwdUgsRiveRqMub+a4+IshzFsLm+eEFNQVxkmLJK7K/wvAUbf0FOTpJmRLGHob+6Sfq3\n8bWTwM7xLoJUoQg5DUfBLCuO3TYPWgcc2A5pMCct5jeNPN8nSUO2wZo4STjYu0MSlwyHh8znY3r9\nBtdXl4iFgKZY1KmIo7bIfDjsndyIisqIuIgp6wK5BiFNMUWNKjc4HY8p1BI/8hlvJ1xvplyPzsBP\nqFcBj/cPefLJxwybLm/dfky4jRhdnXF3d4/dXh/TUEgiDx2Rys846A0gLyiKBD8LiKOEMimoq5wk\n8uj3OpRFxfnZGWWV4q0XtNo6uycdXo6ecLU6R9RBlmV2+n1u3z2hu+NitwxEcrpNG7EoQM7JxYpu\no8FOy+H2wz0uvJe8vPgMfz2hlGLm63OwEqLa4/4bQ9JqCVJJEK958WxCkVyyTT5F1XPKzOPAOeGN\nO4+xVJvNZvrKb7daLgg2HkWWM2zv8/jgDXZ6u6iujdpUuXfvDsgy69mWbx29jTdf0ur32ax9SMFU\nDcqi5mo8wo8yDLfHNi8RXYOL6wt2u31ODh/z8Pg1yFTCcMXR4TFFXEIBhqqjijVxHpEWGVdnzwij\nJRv/1VJZ7WfpUtQSiqwhCRZatuKnf/V7UES4gw61oxLFW6CirmvSNKWqwLI0/tmf/D63j3dpuR2S\nOKfddFHqgsvz50RRwbPrKbUmEJYpLVvFFmXi9ZaqkMhzieH+XTZexMtnz7n/4BEHt/YJcp9Wq8Ph\n8JAyKSnLgjRPMVWbLMrYbNYc7u0hknE9PmMVzDFcHa/KkHWTME4pJYUakaQu2GQRpZKTBj6y7JCW\nfw9IYDVdQVFTpSmuaaFaMpsoIM19gnTLcrVmvnxBWYc4TgdKkU6jRZHEvDw9wzJd0ljCMJs8/elz\nNnMfb+uxmp2hibBdrXEbDmWZEydrVtsLRDlANXIyIhodl1opySSP7q7JOl4QlD6hELAJ57gNFVMH\nt6Gz3C6p1BIvWhHGHmfXp2ziOQPb4rDXoYwzXOdGuuw4NmHsoegKOSKNdoem20aXdaglqrpiuRqh\naBBGKQ1ziKaL7O13KauQu3d2aXZtijLC2yxx3QabzZLZcszLs2fkeYQkZIhihaYJBOuIYLNgOOiy\nHF0zsBwO94bsNdroqcDaC7l6MeP9X/4Oy805We3z8upTbj845Fd+431O4yum/IRcnHP68qeEc4G6\n2GETSiTFqzfSsHvE9HqB23AQxJJHb7/GfL1guVjQNBuMn19hmy3iKObpxx/xi+99C8fqsHtwRJyF\neOsJrqFhSRqOqFBtY37x9fd4sHeXOi+QqcmThPViTBpHLGYbPv/sOfcfPUK1TARFJMy3FEKOKtTs\nuC2WVxPSOHnleqMoulFyiiKCoNBwG1i6TcOWefrsT3n25eeYmoNlKYSRxw9++H1EqeL3/+B/IKti\nAkI+evkEZ2dASsVq69EdDliFAbkoU+o6dSGSJjWKalGqHbBaLMKYshRIkgoklVKu6XU7zEZT0ixA\nMxSqIsO1bdbrJZ1OGyEv+fzjj2hYBm7DpqpqNtsNZZUznY9w201kVUaQRdKqJM9r6lLg0cERZqng\n2DayVGMYX60Y/Nplw2JZYmsalqMzmo7YHQxJkpptviSJKhTbJN54VEWFKIeUhUCwySnTnPs7++zu\nHOHaO4zX19x6bQfJ6vD9D/+Y/mAfWdJuHHlUgSwtabkdPH/ObLbCajRII5+6hvViy/6tEz59/smN\nzVaUECQBRZky0NoEwYyG2EJSJdIoIxcK8jLl8HCHz2af8PnppyyCFXqjxWozxtEbaA2VvMiw9Qay\n2kBVZUoxoRRLhLxA1SUm0zEnxyccHYpcvHxBQ+9yMXpKkufYtURW5ciqiNPQefLkKb/0S9/m5fkT\nbh0fE/s3o9KT5Qar3eLuGw846rT5wcc/oVZBjZccSg0W1yMkV+Ct198lmgmMrs6phQw/CqHKSOsu\n8XbKYpkiy13EakG3s8/V6TmiFPPGnXdQtFfn2clCRr/p4s+ntFs7/OWHP0JVNdpuizxL0YYG1+sp\nakcjT2r+6C++x3tvfotNMGVn2OVsdsnBYMDTz55gWhb+ckIyv2B1esnubo+oTDEEEVmxfpY9KOAq\nCvnap2+5pP6WMvDp7vaItjGjmYdRS/Tc5ivX2+12EYuKoqwoyow0KkERsXSVoiypizVZMuHsoibw\nYzRN4+Of/oiNN+Hs/AsWi0sO93awRBmrlshygWC+Zs/ocjodYfYdBEmhFgrqvOLR43f50V/9CEtx\nsGSDIq6wW102UcDe7gGj8wsMW2O7Xf8sl9Li8PAO280aVRVRxIrH9+6wWnnEaYpkCEzH1+iKhb9d\nIqo1qmMT5RGZJJJmKeJiTcNtkWx94ihBtPWvPINfOwkYik0Ub9ikIZkfsxaWqJb1sxDMFCgQBYUk\nXeOYLSTJJcrGiIrI2egcU60xhJqz86d8/OH30Q0Lw1H5+PNTBGQaTZdG0yZOFsiSgCjIPH7wFpdX\nZ+i6ynhyxZ07D/jy+XPWnofdVBl2m2RFznqxwS9XhKnP82sBQQRdM5h7M+qqQGgWJNsARdMwzAaq\nYiLMHbrDXUS5xt/6+NWCk5MHnI+uELOKpupgyTKa5dK1moR1zmKxoNvpsFyvUVSThtPAsBwkJUEQ\nYB0vuXfvgMVsgmPYKJLB2fJz3JbGYNhmHSY4ZsUmnEFxE9pSZzCOM5SDIXU0ZXl1we7B68xnGyRT\nodXYYXb2klIJ6R62ecd5jevxgltv3iGNEgaDx7QaTQRRIAheXV5vow05KYqiUYlQlNHNG3VVcv/4\nAWerp2hGTZnXyHKbKMjYVksqtWK1WGNoDsvNmlwomC6nDNo91psNKDVlkiILNXkVkpAhVzISNUVe\nkIQhjUaDl6dTbMMmmm2xDAer3UOkpi5/zrauarIkwtb0nxm0quRFQRwlWKpCnqz56E9/n1Qw2Ln9\nDq3WHlcXnzIP1/zhD74gqDfYVpPxeky2LRAUhZblEBY5x4fH5EVGlt3YoadJxp/+yff4xW9/m8nV\nObqosgkCbKfNw7snbFZrlrM1stkiinK2ns+D1iFplJPECePRiE6nzbBzwEcffsZOb4Bpyiw31+Ql\nXM23DNsdDKC322ccTUjqgt7wFrOzL7l75wEffvopim4Ar34y/Rt87deBpmMg1jmupXPv+JiW7ZD5\nIdk2ZKfdQUVE0zQ0TWS9mVBXMZahoKs1umtRChKnl2f0By12j/dwmgZUcOtgwO3DXfqtJv5yiaFr\niGKNYahMp1fIooytuuzu7DMbz7Ekha5lolLScFUQU2S5RKRib6eHIkl0213SOEaURJqWw7DRIfcj\num6H7SZAEUSkuqRIEpIgwDBk+u0hsqBS+DdXBVHMWE2vmJ6/pN9wCaMVTkMjzbYMd3fYGeyjaxaL\nxYL1ek2aZlRVia6LbLwpRZkQRSGW6eL7HuvNAsOQSXwPf7lAKwSISwQkZtsJlV5TyhJ6p0FazlnN\nvuRWt4Mg1JiDJmthwSg4I6k9un2bovJZ+hds0nOevPiAFy8/JIhebeEdhsnP4sRqHMehKFJ6zTaa\nXjJenLJaeEiolHlJlsYoioQXe2y2W0IvRCnBVDSkQuC4P6SjNZDjiqHdpIlMMl+giwKhH1JkGWKW\nYmsKIiVlHNKyHIbdHcKNT7QN8JYr0iSh5TReuV5/s0KWJKgrbNuiEgUkVcF2GsiKjljlHHQt8nzC\n1epDfvL0f+aTq+8zLr/gk8t/DppPmSxpmtCzdmh3dpmsQu7du48pa+z1hrh2k15niG24HO7scvX8\nJW2jhSTJNLtNTF0ni3Om0zlvvvmQfqdDv91DEWRs22E0viYIfXq9Hhvf48O//gChSmm3NSaTEXmp\nIMoCpqKyXoeIsoQlK1ShT9OA88vPSYqYL89f0Om2qKqv/p0X6r8Jof87hCAI/E2Q0a/+2t/1X/8G\n/09w47fzf0X9897i/hXFf/df/i79VpM4CBAFCdW0ECURSgFVkkjzgKoouIw8PlpcIlgycRaSIVLr\nUJUVg/Y+0dIjE0SSPKbVd/npR59w+/YtgiBCsUyqsiIvC/L6JjilSFN6uwPyPGe1WiNrClKtstPR\nCBMft9lh661J8hJBgCT1kSqFqowR85qdXg8vzjmdLRFUsPQbafvptU+zbfLa4Vt88uMPUDoClVKg\naDKVINGzXOpS5D/55RufwV/7NXjVcf/aK4Fv8A3+ruDYGkme3Qz3iDJlXlEVJYqikFUViupg2j1c\nxaJraQTBgiDJaDdtlELEEAzCzZr2bpc4zhkOhmxmU+7cvodQCRiqgaU7P5uE3CIkETIZjqVDWZEl\nCR3Hpak6CLlPUZV4eUZMTi3JrDYhqqJgWzalWGCaLZzmkFu338QQNUzF4LX3voOgDgkxGY9r0rTk\n4voUyRG5f2cXWzAYncZEsUCUhCRR+pX/l29I4Bv8a4FSFolKBVEzqUUZSVEoypueS02JrmlURY4k\ni7TaHapKICkKMiouZ2OKIifcrimLjHejc4oAACAASURBVPMXX2KZFUGwQCgF/PUCUaxRVBHH1Cij\nkKalE8c+iiQy2Olw+vxTdroWdkOmFkKclsPW8zA0nTxKiQOfp1+cgyCwWi9Js4o3336LZrvJky+e\n4xouwfyCwrvm6U9/ihho/JPf+mXef/2XOHxwj4P7D9mkOlrX4PBOl8zLqGqR1fLVTd2/jW9I4Bv8\na4HxgyGKoiDKKrUoI6oGrXYHRVURBJmiqFA1nbKApt2hLEAQVGqpIq1KBEVmNh4h1QWqWLOajnAt\nkzIuCZMthqlAnVMEW7qWQUNTkISaKAmYLcaYpszFyy8x1Zrtdkav22Q4HLKeL4n9ALGC7/zSG3zx\nxefouk6Q+Dw7e0mQ5oy2Z1xvn+E0LT784U+4c3xIlXicnT7lRx/8Jc+//ICrs8+o8yvybYxZwYPD\nLmGYUP4c4dTfxjck8A3+f41MhA/3VT74j36LVv8I0+piKCZiWrAeTRCyFCGLEcWCUsjJ0ghvteJe\n/wgtrujqFnJSMr68ot3t8+mzz9kUC0RVZLlc0N1r0XNdgsDnanLNaHZBUvjUQoqgVWSJT+p52IqO\naVqstktyoeD08pSN52FbNv7apyxrirLm29/6DrJgsZpGHLaH9Eyb2ydHLOMEyTLRlZr9QZPuYI+F\nVDKtMyxTZm9XoW1r7LRNxCwmjudYggLhV8uGv/Ynwn/63/5DBKWEuiBIY0zTZrNZUtYVENLQB+hW\ng7k3YXfQ5snLZ3jehvuPHjKdnqFpKpZtkmUSs/mUZtPFtm1enl6xv7/LejNBlATKusRSDJqOg5cE\nlHWGIusImcz0aoZh6LQHXURZYu6HGLJGML9Gd2yqvOJ6sqB7sEteJCSlgBd4HB26BIuceFNw62SP\n+XKKQI1uCChKk+l8cRMtRkHb7bLdhnibhHfefpvxZIQoVTQbDi/OLxAlEcuxUGWJhuMwHS/ZhD53\nHp1wevGSYXeHOiqQJBXNUNBkAVVtcH19ge0atNs96koi8jckaUm73WIzm5HLCoJSU6QpttVCUWWS\nKKWuRVrNNmmaEMYhptzkxRfPqTOZb739LueXL2m4NnATjc5//i9/u//6936Xp0+fEEcb5nFA72iP\n0fyUIpMx1AYD94iiiJFVgWC5oCgrdoeHTOZTJEWlKiWKTYyp6jSHfZ68fIapqzQ7bUbjKxxdg6Km\n3+7R6XaZTKZkeUAYhmRpxbtvvcd4NCWOIpbeBkWBsqy4PB/xxv2H5LXFneO3eff1f5OOISMXOVWW\nYVsdiixB9tdEkyeMv/iMOw8fULU7iEiEaYwmiFiInJ9ecHCwj6cldGyXukxZTdf02jZ5klLJCpIg\nsRhPsW0DP4hodlwurs8RFJ2j42O28zVJkWNrFuvNmpbj4m9i5v6U/U6fYkenFgQMw2J8foEky9w6\n3uPk6DZ/8ed/hqwKiIWOoWucjacEOwXrTcyju02yJKZjqyS5xk7/Lt5yTmpCEoIgllj63wN7sVKO\niQufi80FWZ0wXY/JhYxCSomLGNSaoqrI0pDPn/2EtPRRFZlgtkHMdOZXa1bjFWXm03RMdFXk5OSY\n3eEhZVHTbvdR5Qbt5i6KZrMOQrK6Jkoz1sslZVXT6raRDJEoj5mt5+z09ri8XFAJIpIio5smpmWT\nhwKNRpter8XBbg+ldHn93i/y3jtvUZU3bsCSIuHYDrqqMeh2UBAp85ooSmi6bfr9LqPra7IiIo58\nsiBmr9Pj8d37yAikSYKp61SU7O4d8uz5iLzWqTEhVTFkGZmCskwo6oySCkc3WY5HFIlPu91A1QTi\nKKAIct5/8zs4gkXX6RJvMxbTDavVhjzNEZDQVJO6EBktZgz29zk4OeCTLz8jJ6cSS+I4wXZeHT7y\n5PxDFsE1RR3y27/+Ploeo5Uqt/dO6DV6bIMpceoRhWuKOuXk5DaTyZgw9FjM55iGg24ZtLouT0+f\n4DQsvG1At9fHaTZpDfoopk4mZlzPz1n6c1b+isePH6NrGmcXF6RlgW5blIJAe2eftBa58+B14kDg\nH//ib/D+yS2OhQA39bAFAUvXEXUNUdWoRI284RAvV3zwR/8T+XpOJhTomoRCjEYFskgqSqiGhpSX\nKLnEXmuXMsooogS5FljN5ux0+5RJjqiofPHilJ29IwzJYHY5I/VTWo02CAoiClVWoUkilqwyNG2s\nrCALPM5ePqPjulR5Rq/f44/+x/8V0zTptlz2d1uoYsXv/jvfpcgWHO87FBvQs1to4m1cZ484jmk0\nmwx2RB4/7rA72OHNu4++8gx+7ZVAvF1QSAWaXBPGPlmRY5oNoixFqBUEUWByfQ5SSRLX5AKQVYRb\nn7rWkBKbRBRJqwBdFyjLgufPT/GDBU7jRmlmmhZd22XjrSgVAQkTTTHQNJ3AyxkMe5xfPSGOI5ot\nl2C7xm1LNG2XPCtY+T5RmdLSC6glplcXqGKBarsEm8sbJyHTRqwgrkKoRZS6xDB0bGVAkeWs/RB/\n6dFstqmqDF0yOTg+4vLlGYIkslguUVQDxbSYhzHbrCT3Q7qtLtt4y3w+4ri3Q06EUNbYuolQyewN\njogjn1ajS15mRFFGWUO8TZEljenqkqqKaOlt2sMWeVGz9dcYjsnWWyDpCkg5LUvF0g3GlzPspoNl\nmyyXK1qWg++/url0vVxw5+6bpN6K7/2zv8BWVUzRJYsqzq4mZEnErbu3eO3+Q/7qgw8YjSdstz5p\nktDr3yTkhEWClNcYtoRlKPTuHrGYXbHX7bHxlhi6TF1X6IaJFlc0Gm1EWSEIAwa7B0RJRqvZ4smX\nT6iKPvv9AarW4/U3XscqCtKLT7jyfQyzgWRaFLJBpWrIioFcBkRjn1Cy2PoTFi8vaT80qCUV1x5A\npmHYOmkdIpY2htWkXUpstz699i5R7LFeztEUnSgIEPKULK9REcnCmDLPsTQLQbnJRjRNAz8JCMKI\nRsNhu/U5W4yIixTFNtETic18RtNt0TTanFZfYjq7fPbiB9TiBsvUOZu+oDm0KXKdQX8P23KIgoSi\nCvC9DU3LRhYlnj87J6lc3n77zleewa+9EqgryNOCuqyQJei3O3TsFm+89g52c4fz6ZptchOyoEka\nhmrQG/RQLRVdEGhoDQ7u3sV0W8iiimPcWGPtDQ4gV9AlHbFMicMtZV6g1TZyIWPIFoZqcu/uEVke\nUlU1YlVjaibbdUJD7dK2Bsi5xPHggIHr0rQVpHrNbr9BGlWokkkUxkRRiCxLNwaUJbTtDrvDHdb+\nmiTJUFQZXdFwbAvb1DFMHVnVkWSV3eGQcL2lr7vc6g7RMrAqmYbWYq9zSLLJcRSDfrtFnAWomnwj\nIMpByAvSYEuv3UOoNFrOPqEvo4smsqAjaRbj5QhUgW0QsgomyHpKw+5SxQrtZpc8qpEEjaP9fYoi\nx205dPsuqirR6bfRLI04e7UWv2c1UFORzWLLcLjLJkqxDI3lbMKdw11unexwefmCH/z4z27m7qOY\nZquFt0nwtyGSJpFUCWEa4zZbpElC5IdoisJiOaYSUvx4wSZcMFuPqeSIub9kG0V0+l0kRaDZdFBl\nmVbDYj6eIEkyHdPG0XV0w0GyHARLIQwXnH/x1yyef0KymDA+f850PMbWFZxmn40vcnU6wV+NCQKf\nOInY7+9hSC0mFwvuH99lMp/j+1tsW6MocnTDIAxCdEXDNixMReeg1eC43adcRzSNBmEYkZU5//yH\nf43vb9FlBQHYbDyyKCYtc7IsQ6wFNF2irGOi0EcWSvYPD3jyxTMk1aYsVERsitwlDnUQDMIoRpZ1\nFtcT0jhiOppx6/Aes/GG3k6HZreJn7762/1tfO0kIAgCsiQjCTKDbo947RNdzdieXSFGPm88fERa\nFFxeXbNdbEi8DZvFHNOxsToq/YFGv60hpzFFGOEYGlJZMezuYggudaBS+QpJpBBtoW93sOsG4SIk\nCH1W3gRZqjg6PERWZPIqpySgSmL0XKBrtGgZLe4dPMQsbPyxh1ZLHB0dcnh8i7oSMAyDqqqQBIXD\nZp+D/hHPX1yx0xlgmSZmw0aRNDqdDqZpUggVdtNhEaz5bHTKOotY+CumywVHJ8eYtsHu0MV1Re7e\n3adhqpiKSkO3yMMCIRehFHFMi26zTbBZIVY1hqAilQmkFUJZobs6SZlRCjmGq1EpNZPJnJ1OB1sx\n0AWNvf4+rtPk/HzMdrtElGrG4xFZnrBYTNBtFVl7tZ9A3+khh/Do1lssV1swSkqh4O3XHrHXbKHU\nKlUtozlNvDDGtW0uLy64e/8BTq/D5fVL8iLCaNrM1ltEWUZSZWRZJc0rriZzNmFOKeg0WgNqWQZR\n4Hw6xmq3iLMYQchZzEdYtsH+/h5lDb1+h5bromttnN4xTvc2mt1H1xrkKfhBju42qfOa6dX8ZvJU\n1Lg8GyFnOrZs4K88ijQnDQL6HYuXzz5GlgpMS6HRbREna/KsxNDb3D55DLWMqhrIgkbL6XIw3CNP\nY2RFptHtcnJ3B0NR0UuJ3faALIg4OTyiKkt6vS5lVZJRYtgqQp5w+fQDsnSN3tGoCgVLa0OpkCcC\nRVaw3o6IYo/TF6fs7+8hFhWP7zzm4x99SsPssQkymoPezzWE+dv42knAiyPCNMOwHH7w4x/z2dkL\nTkcXXF5fIssFC+8zdg4a7N3eo717iNXskv7MLERsKBR2zNQfsa18pFZNkG053D9gu9hysnNC2+iS\neBllUmEoDpPRlm3sI6oSSZyhK22EwqbOakxdpmmZ3N29j1ypRH6GJCpopsb56BRRLLl/7w0odYJN\njr+KabgGq9WSvIixHJWokpmFGyJCLmZjVEnisLmLKIekqU+/NyDYBngrn9loQr8zQBBl9m7dxbZc\nzs+vSNIaRZR4/vQJnrdE11TiMKPhtNBwMdU2d2+/hiKbrDdrFFXCslSm0wVHh3dJi5BBd4eTwW2y\nNKbIC/K6QhBV7E6Pl9enlHJOJdTMRlc0NJ2m0cYS29iayuHRDkmZc//+IzbbLcnPc6epZUxb5eLy\nOaqmcv/BA8q65Msvn3IxusSUdbp2k6baQIhibNehN9yl0XPJpBrHbfDwwWPW8zW2biBLEt1ul/Fo\nxMnJHTRJIwkLNpOEaJGRrXKEKKcha6wmC1puEz/yWUQLeoc7pGWGJsL5ly+o0oQiXRMHAcvFhjjN\nyMKcXNEpLYutFzCZTPA2C6ZnczbbmkjU+dFHn/Lpi4+4Hj+jkjLKumAdRHiRR5Bm2K02SZTS6drE\n4QbfX/Cnf/K/sJxNEGqRJCpYbTzOzycc798GoWS2OKcoJQxbJZUzxospnh8iKBK6aXN6cUktiTSb\nTbxgxXQ7Q2nZTNdnUPrIakVaVpSqTFYrWHoHMdE4vXiJaME8TdhsdG7tv8Hjx/fYhim77ROe/fAL\nsuX//dwA/CsgG/7v//yAqizY2d1lHft4WQBexK07D7iaXOF2app6j+nVClEwsVpttqsFjqGAmLPb\nb+PlOX66QSJj2DogiyW6zRbXpzN05aZsMlwbSVMQhIrZfMTuwQ5+uKXd7LHdbtBkE29ekeY5za6C\nWFWUSUqw9al0KIUMU1cJ/RxVNWh2dpjOZlhOThxnFEWJZVj0BkfMNpfM12OOdk7w5jP2dnZYhBOo\ndHSlQSmWZKXAs9PPOLlzh8V0gYRI22yg6jrX8wndXpf1ao2u68RRgKmqHAz32QYBIFIUBUG4QdU1\nLFvFUm2SSMBwJPxkjVm41LXENFjQ7Q5Isi2B79PQG/S7Q67Pr3E7LmkUEKcFhuKgaQZhsiCqM2rV\nom1anF0/o9Gw+S/+w0//rrfJN/h/Cd/73o28++fJhr/2xuCgP6AoMnrdHmboYmUrpEZElK1ouw7z\n8zX6MGZ3OCRPZfwswLY1NFWkYbgQCLi6SpIXtFo6mqQhyiJhEDIYukiiTL3Mubh+yt37j1EUk0bD\nZbv1EMSK5eYCyhq9Vul2XapSpJBibF0hFmSWqzWuqFPVkAQFt/aPGc88+p0j5tMlhiqS5yJJElKW\nNfu9PtfXT2naDsPOkDyMWIcLkjTFtRoEYUyWx1SigttsEYY+uqZg6ippEDKZj1Esg8VigWNbhFGC\nKinUeUkexVRlgWpopEmCoGkkRUaVVGyWIVUho1cSceyRFhGt7hDHaSDmFY7WwpQsLs+vuLv/iMiN\n0AwVoaxZeiNMzUIUQJAEZvM5u7caBGlASUWWl1/3NvkG/x/ia78OCKTYjsKTJx/hhSFbL2Qb1FRF\njj9bc3//Pum6wFv4KEpJHC8oqoQ4DAiDBFkz+ezTJ+z391nPPLIQTNVlNl2TZBnTxRi3a3P33i1C\n36Nh29i2y2qzYhOuyPKUoq6I6y1JOcGPz6FKEQSZ8/ELJLlAEgSKVKDX3COvJDTD4MX1TwmEGWGS\n0rBcsjhBQOLi+hRTtbDlJucX5yz9FdttRBpKLBdTdlq3EeoKPxhRFhGFULPJY/w6Rm1p6K7G7Vu3\n6LT7REmKbmi4doNBZ8hguEddVWyDBZVSISkySVWz8WPsZofB4T6K3KCh7RJsa6aLEVXi4TZUZFXG\n0Bo4ZpNPv/iMUpKIkpQXo2tKReHZ+Ckz74q1vwEqFrMZ84WHpvdYeymS/NUa9G/w9xNfOwkUckVO\njqbJ3B70sfKaYaND3+zQ7/SZL0fkpcB3f/V3GE82dJ0+u90BlqzS7bT58vQZO7s7rBdLTMXEUhqU\nWYWuSkwnEwzdQhV11vM1TbNJHmakSYilWbTMAYP2Ldz2PpusZB3ESLpGHIdcjU6R1RrFVNn4PrKs\nYpsW3mpJVeQ4moOju9SlTi2JDPb2cVpNZts1y9BnufG5uLzAcRrIioZlm8ShzDuPfhPJzMhJqKWC\nqk5QlQRRTTmfnFMpAttwy8nxCV23RZkmZFnCbPV/sPcmsbLk15nfL+YhIyPn4c733XfvG2tgFckS\nRanVNCVKlmURghsWIMACeyHYOwMyYIFLaSNR0MbyQmsR2lALGyIh0C3JltitbkosqshiVb1X9Yb7\n7pzzEBnzHF68trptUGQbjQbbRp9NLCLwz0ggz5fn/P/n+74pj548AkSiICUrK5p2h3tHd/DXAevl\nCrFICZYOsiDTHHQQSxmijI2/YbEeo1k67sajqirW7oYkifjkp3+M9qCD0DDZCCVvv3vGbv8uNbmH\notokSUqvP6B361/+qH8q/yn+A8W/EwgURcEbb7zBL/7iLwKwWq343Oc+x507d/jZn/1ZHOffiE78\nzu/8DicnJ9y7d48///M//6FrJ1mGnyS0tre4nFzQaNlUZEiljiTKDA+3qLUs1m6M2TRx/DUXFxdU\ngozjr2n1m0i6TBAEDLtbrGdr0iiGTERBRRVU3JWLbTaRKnBWC6QS0ihBESRmozHxyqVfb1NEBV27\nj1VrkOUeVr1OJYtYTRvHXZLkAY67RLNF4iTi7u5rGGqDdbChUkTcKGC0mlNpMqlYkBcFlBCEEWla\nESclj579JdNFTFGVKKZJFhVookmVQFO10JOSYunyt3/1LyArkRDJywzRFNFtHU23cBwfUdC5fnHD\n/GzGfnePTr2FWElsHBdZkdg4a5yNSy4qJJSgFkzm1yzmc24fH71sScqcv/w//gxNlakpFi2rzX/5\nc59lcjNCRaLTbNGwTZI04L/5H/8nDh7+i/9UEfz/MP6d9gR+//d/nwcPHuB5L3cav/SlL/G5z32O\n3/iN3+B3f/d3+dKXvsSXvvQlHj9+zB//8R/z+PFjbm5u+Jmf+RmePn2KKP7DWCPIJYZhkqUpumni\nug7NZhNFhMPuAeeja7YHPaLCp1NvojaaVBQEWYAfBdiWhaHYeGXMaDqlqdvcnD/n5N4D8rLEMHU8\nN6SME1SzxjycE2drWt0OKQlp+tK0sWH2WYtrkqRiunTIULCNBqnj4ScBh3ePeHr6DNMymcxGtBtb\ndDpdHr14QqW9TPQ4ivCdEBGJrMhoD7qcXp9jGzplOUDGZ7Z+huMvqVsGVVTRqncQRZHlckVNFIm8\nGLvfYnvXIIlD0iBhe69Pkla4XoSlSAx6AxQEvNCj3jRYzqY0qzZ+lNBp9Hj2+CmNdp3W9oDTyxF9\nIcO0NObzF9x+7RZf/Wd/w9EDm0ngoWsqN2c3iHKFbGZcjc7YPRgiyAKuu8GPPHRLJRcv+Sf/w3+P\nKCloeg1nPSV2M8QspW4ZLN2Yy/mG4bCDalhUVcFyPOfwYI+L9ZzBcJvQc4m8jI6lUfkBAgWpJBLm\nEYOdfSY3I27t30PTdM5PnyGJMt3uAKEocQIHJw4Qyopmo0GSxuiShCqCXe+gySayKPHd97/LnTt3\nCSKfLCq4fj5h0GojGxbf+NtvsTXYoRJSdne3eHF9Tb1joIpgSBVlXlJmOWES8tlPf5bTi0csnTG7\nWwf4ywq3XKPJBYZpU6u1cBYxeerhJw5yAfvDIZEbM9wd8uzmGTu7+8xncw5293CWCxJBYKezz9OP\nHvOTP/HjxH7Kajpltgo5ONrmJrwky+B4Z4/3PvqIg71j2rUW8+UMJJNSlrhyznl4fAelEilIGM+f\nQBzT7x+x9hYkecZwcMDo8hIynVduvflD8/uHVgLX19d8/etf59d+7df+fmfxa1/7Gl/4whcA+MIX\nvsCf/MmfAPDVr36VX/mVX0FRFA4PDzk+Pubtt9/+oW8gChViXoBQYNZqpGlOFCVMxmtso0ERZ2zW\nZ1Ck5H5EugkJwhhBUlgs5kjI7OxsIxkSpZozOBgQ5RVeWjJaroirDNmQWXlTJFnDatxiMg6I8oxY\nEvDTmGcvnrO1t8tys0YQZW4fvY7vJJiqTaPR5GYyQjYt0jKlyDN0U+aDZ99GM0RajTZ5BlUpo0k6\nqqyiqAqO73G0e49264QnZ6fM1y6hUGL1t0A2qddbxEGMuw7QVQNFaVBvDkFuUgqgWQr1lsVkcomp\naXQbDSqxQFd1yjTHbOhcjm9Iypjh1oDA3aAJKp1On6vplCQtaNo18iTCVBrkpcl4OeUzP3ef7f0d\n4iImr0pkUaIUC0qhQDEqvHREUizRtIq94QBDUVmvVxRpwmo2QwXIBE5u3SErImoNC1mT2NvfRhJl\nAndFHsU0zRZzx32prxgmbLV7aEKFv1riLlZIioih6Vh1neViSs0w2awcPnjvPYoyY+OuyYuU5xfP\nqIBWs0mWpzj+GkVTMM0ahmYzXkzQZYM0gDde/QRpWFAVGrIs8PGfeh3JMEjjlE+98RaRH7G/f4jR\nrPHaq/fJgoQ4DAgTFzdcUQk59+894DvffhezpkMCs/MZiecS+RH9bpNut8333nmPxeQFchVTZQp3\nD+5RuBWDVofZxQjDNMkFicH2LuPpgrv332S702OxmqHJMn/3zbd5/OgJWaHyyoM3WCzWfOLup7FE\nAyGv2BscYKg95jMXVdc4OtqnYal0bJ3r8Rmz9YjlaoqQiuzunDCfjQhDlyxPeX7xAYUSMVttuJle\n/fuDwK//+q/ze7/3e/+3f/PpdMpgMABgMBgwnb6UpB6NRuzu7v79c7u7u9zc3PzA9ZVCJXZDyjzg\n+GCHfsPmYHhEp7HD3ZM3eOONn2Bv+ICr8xcIZUGtVkMxdFzXod0acHBwiBt4nI+eEucJz86fMvE3\nhFIKtkasVMy9GaezD0EK2YpUdsYCH+8dInoJcqUiSCq6rvP4g/fRVJmGUWOrNWR3eASCRJYJCJXC\noDOkpjfQdYu1s0SSUmpGgmWGLKanbPVbJFmEosqoqoqAzM//+H9GFHrc2bbp1TUEEorAx5JMsiDB\nXW3w1mv2toZUeUlZgmXWCNKcpMoQzIzjV1/jarQg9QuyKCWMIpbrFfu9IePLNc1Oj3c/+oDeThfR\nEsmVjAevPqSKE/r6kH6tiR9OqdsvyS5np2MunlzSbfRpdZpURk4piqRlhapp1O0akNGwNdzlnMhf\nI6QRpiJhGQreYs1h55Dx9RS1puMES9brGYYoMLSbdI0mwXyJgk9NL7l71CfcLLl+/pT51SXDbhPE\nEllvUgkVvu9gmCqqKFKmBVudHooko+sGG8dlONghiXIadpu63aJeq6NrBgginh8Sewmj1TXPrh4h\nlQKmWkPTBIIgJXQdxBrYHYUtQ2eziHnybEZRlXRtk+1+m+Pb++R5glnTmY0d8kAkzRPOJlcEqcQq\nSSgUmV/5r/87avotHn33hppmIVYZk8sl/9Xn/4uXPhdCipOErMOIQhbY7m0zaLSxFZ08FGhbDW5t\n7aGLBkUm8ODuQ47vneCFp5hqRjT22bN3uLmcIWU5wXJGWq3IlRRJV3DXa+KJgy2arOYOumFj1Gyy\nTKDfH1Kv2eg1gzgp2IQpar1kFH5/ufh/O35gO/Cnf/qn9Pt93njjDb7xjW9832cE4aVX+z8U/9C9\nP/zDl9enszEPXu9ydKzx4tkz9Fqb68mH1Iw64+U1879Zo2siH3/tk0RexNX1U+KqoG62WK7m5L5L\nr9V8OXpab1PfPaDR20azerhU5NGKtMro7XRZzJfYlYFzPqZbdNnSBoR2RqGIUMRs7QxRBNAUifn1\nJWIl029tEWcRQbBB1wxmyxG2oZGmOYWg8tH5BYjQGQy5md7w5sff5Hp0TpqUdBsd/vpffYOWVqI0\nTVZOSkPT0EuRMsyQ5Bp3D+9xc3nGzWSGogN5SSEm1Ot1FqsZjXqds2dX5JHJ4GiHb330Nq/cvU/w\n3UsyWeDwXg/FEmhoFu8/fkbNaiFqKrYoICgSmAIvpgsEuWSr1ydOQ0ohIk4TlDjHkOtUCAgarLwZ\nw26XyWjK9s4+oqxyfnrO/fv30FoaAlAVOfVBHSGUaFgmiRNh146x7w6gKvCDkMl8imFpVEJMXa9w\np1coJOSqxKBvsQ48VLuOJAtEscCwsU+w2SAoDaIkRFVriGJEhUBZ5qxDj1u3brFyAtIkJUsKbN2m\npusYPR1Vr+EnCwyrYuGMqClNijDDNAVktUITc7bMPoxjbvUs7O0WslgxWo3otw0ubs6QVAt/vWbQ\n7/Lu29/i3hu3sXcPyTYZ4/mIvmGZTgAAIABJREFUg4Mhf/jH/zMnRyaaAfu7u7jBBWEo8rf/8s8o\nlzm1dptMlxjctRFki5uP3qPX6TGwmxTRmqv5CrNm0t/ZQVctNrGPVgkEbkEexczCJ8hajVtbhyyd\nJXfu7XN69pjIK3DmK7rdAbJUIeUJv/CPfpqZP+fxhzeYuoLrOWRljhe6HOztMBpN2Gnd58/+9G2y\nJ/8eIPDNb36Tr33ta3z9618njmNc1+VXf/VXGQwGTCYThsMh4/GYfr8PwM7ODldX/6b8uL6+Zmdn\n5/uu/U//6cvrX5zeoiaJ5HFAkecoWkS9bmEaDYq0xG70SFMH3wsYXZ3RrJts/ICD/du8f/qI/f6A\nJIxJghQ3X2BZML6ZcufBTyKFFbZh09qqYRkKeSCjdnYp2j1iNePy/Sfc6h5Qq+lcuzPyMKFoSMzX\nY5qNHrpmEUcFzmaOpMjMVgGZXOF6Aa1Gk8iL0FSdequFXCpYusFkNMbSNOqKSpXmCLZGVMpMNgs0\no0ZYVpSCjKgqyJKMt97wseP7jL0lXuISxhGCAOPxGNu2SNOcJCu59+oxURpwMNwiDSLM3Tp+kWJ0\nu2wSH6nMaDYVZBV2bw3xVx52w+bRu9e09gUURWJ8c03NqiMrAoapsXZcpqFDr93F6jbIKo3ICYnj\nHFnQef7slN29XWRETNXm797/HkdHO/i+RyEIlEUCiU268rh795i/e+dbqJZFlgaEm4KHd+9RVhvy\nMmc1K+nfajHcrrFyNtw62ENWTdxnzxEUDVU20QyD+WL+8ui0SkGWEaQcMy0pwg0tWWYceOzs7pAX\nMRV1sjRnMr3CatW4mq2IbIUHRz3yyOfs8imqZdBp98nENqPNhMNXb2H02lRGzPsfPEO9vcfcC7i1\ne5tcN3j1/ut8M/0WRVVSpQIb16d3uM3MWaKiEgcam3WAsGvS7x6w2QRUOdhtiVQW0a2CyXRKrenT\n1Bq4oU+UugwHW4giSKKEbugYuk5LrfHhB9+jKlSqUkA2AArSIELMckbXN9TtDpm3ZjI95eTOCePp\nCl2o+OpX/xd2Tw5QNZk8y+h1h3h+TN3sIxY5vdoAuTHnU79g8U9ecwH48pe/f57/wHbgt3/7t7m6\nuuLs7IyvfOUrfPazn+WP/uiP+PznP8+X//WKX/7yl/mlX/olAD7/+c/zla98hTRNOTs749mzZ7z1\n1ls/6CMo4gpRMhAlHVM3aDXbUIEkCcyWExbLOVmR4WwcLNsmCAsQBD54+i5VEbOazRCrl1ZRvh+Q\nFQKqqrGeTWhIFZk3RyFmfHHNre0jCnIS1eOD5SMYiORVSJ6VSIXMVnsLRVDpDrZxo4iVuyFNY9ot\nm+vLUyxDpG22IBEhEdEV0OWSTt2ia/UgVkjdHFWUaLVsrKZNZ9AnjgNMWUdCxHE2KJqGpKnkkoRh\ndzm/nlFTLVTNoFZvEMcxqqoiyzKqoqIbOqUc48YOrVaPTegiaAVxHHFn55CW3iJyRW7fPsJumKia\nwHw+I0lSTk6GNOs2efySOry9fYiAQeQJ6GqH45NjoEBIM169/Qp6ZdHQmgiJwOHwEF1UEbKCwFnz\n6oMTRFklilNWxQY33jDs79Fo1RnNLnEDB1WU2O/vc/twj6RwCRIHQUzodA0kseDy6gUHhzsslmPC\nyKHbsMnTjEanQVllPHx4F1kqkUSZuqWSFxuibM0mXBGmG2q1Gq7jEkU5rrcEMSUrQBLrvPHqW2ia\nhON65BXIpgS6Ql7kvPPuO+zfOyYVU2bzazQEBs0WHz665vDgAYv5jFKQyUuBer+B0WoynVyThmsW\nkzmloNEfDlDlOp944xUsU8Rf+SilRalKWEMLq6vQarXQ1DZREKNbJpmsMfFDXoxHKIrKZrqkoaqE\nzoir0+eUKewfHNHqbyF1Giz8DVmasrycUZcNyrKivzNEURTmsxm9zpA8kRgOd0iSkvHYoywlxqMJ\nuiISuks81yUvVgTZBkH54b4D/6/mBP6v0v6LX/wif/EXf8GdO3f4y7/8S774xS8C8ODBA375l3+Z\nBw8e8PM///P8wR/8wQ9sFQB69QGd+gBJrnMxmTMeLUiilNVqQRg6KJrAerNiMhuxXjkMOke02rew\nml1UVSNLSlw3ZGdrj+3hIXLZxxT3sc0GVRihUiGVAoNal9DxWa2mhO6aRqXSt4dIZpPJbEXbsIiK\nEMs2SROoW12ajS6JUFBpBnfvvUrmxeg5bHUHZHkKqNStBq67Jk1DWpbB6w/fJM9i3HhMY1jHcQOE\nSqXX3aahNcjDDFlSqBkG/U6TVIxRbINnp8/I8wRLl19+ryzDcz1WyzkVJWtvysJd8dHVKYJpoJUg\nBApXV5dUWUy3Y7Nep1j1BjfXY7aHQ2RJxK6ntKwmt3fvYSgWWRzSa9nsbg+oWxZpGlPTDIKNw+Ry\nShFXCOS4zpLvvfcO/WGbIMrIypwgiciLEl2wGI2WCBWoWsLcG/Ph2XNUq4YkawhVTJGHFFKEVTcR\nhApVC5CIaFoWYRCgGzruxkHIKoI4Zp1AJqs8uXhBUATYnT5+kpIDlSmyCTacL65RBAnbNAmDOW6w\ngCqjZ+4QTWKsXCacbajpJdP5lMUKJLmJJNXYP7zFN7/1Nk27joGEP17g3yxpywJFlLK9dUi93qMs\nSzrDHvk6JJgneHMfKRcok5S4DClLEX8TsJrPCL2QveEtnMDHzTzccM1ktuD27Tv0mweEWcXFdILV\naSFpGhfjS/S6RS4ojOcrcgmcLCWWSxrDPhePTjnav4UfR/zYpz+D5/hkQYKzDDF0iywq2N865vWH\nn+Le7Y9R02zq+ku3IaESCDyPWk0n8lfYNQt/HRE5P1xZ6EfOHfjzd99EM2RkSyEJA8QgR1JV3Dhh\n0O9xdTlHVnMso06rbqOVNZ6cf4RglMiiSN2qIwoyttWiyHPWqw2KUtLpNmlbO4xmYyxLwzbqPD89\np7/dxfNXLJZLdrcOMJUaeZyQVh6SqXE2OX9J7NBqaKpB5Ic0LAtFUoiSlNV0zs7ONnN3hqiKhFGI\namiouUHDarHxHVJxRakrrCOXj+99nGSj8XT0mIbdoKwEVP3l9GDNMhh2ttmsQ7pNmydPntIetsiq\nlMl4SqNl0bTrZOTkRYWqmsSJQNOqEfhzTo6OODu/pKxSSlGmrASEssKPHdq1LnmcUpYxVqNLFheI\nCmTFiqqsMLUuiyjEqFlMnl5gNg0GrR2KSgSxIo0S0sglzyTS3KUUHaSaTILO/PmcX/qV/5aPvv0+\nhlIwXj9BkDIso0saVyiKyMXFiONX91g5K0RJpK636XW7vPe99+gOtsjygnATk+clRqPF6c2IVr1D\nEI3RNYNub0iUxSSxD4aMv/DoGW1kxaISXDxvg4BE096moQ/ZHQx4fvqEIk+wmiqlITJfbpB0nSgM\nEaOE1I9ZzBZ85lOf45v/6m/QrZLtW3sIosx33/2Ane1dtra3GS8nvHX3Id/+xl9DQ0KrSVQKSEqN\nltYg9hL82KXb6XC0f5+3P/orZF4a3WZZzO37D8nXIb12i7977z3a/T4GFu2GjjOb4eUeW4MD3n/8\nnP3jPYIyoSmbbGZrmu0Gq+Wa/d0HnD1/F0mXcaWSTqdLv9WmadR5+sFThoMBkiEwd2YUeYKsqdTr\nFvPxDVHsk5YZim5g2wM+e/xN4D9iyfG81ChEkU28RhM1us0BltTC1EQm5yPu3DpBUQxk2SAOSyar\nCaqpMWhtYxod1l5CmGes3QWCANvbWzQMGyGOCVyHh/d/goW7Yepc0Ow0WC190ligXrMJww3OZsFq\nM8ONNrwYPSeXMgq5JK1SHM8hyzLESiTxY+qKTr3Z4Gxyw8rzUCWNMg5pGQ0MuSJJ1vilT5KI7LRP\nINZwphM0paLfsei3OtSUGoEb/mtDFZWSmFJwWa1GdJoWSiWhiQo7wz57wz6R7yCKGXHssl5N2Nve\nxZltUCuDYLPAEgVMdLRSpVOzUQUJo9QRC52t1i5tq0u71kQsRORKJopTNM0gySIaDYvT5+fU613k\nUiYjw4vXrFcBprqDadogZCRxTsNuYdYMRLGi1tT57rf+lGYrpW4U6IJG7EVUSYEsVZimzsOHd5Bj\nlduDfVqixsnBXabXMzqNHv1GF13QOdg94vr6BlUsuDfcYX/YRgRqhoWABFlBv9Pm7KMRNdXC3fjk\npBQi2GaLttbk4a0j4mTN1eySy9EYrdalUm2uJxPKwmW1uGHQ75DIBe3dLndeu4tsidw62eHwaIck\nCZCUCslUqbVNdNvEsDu4zpLdXhONkiyNaNctGrrEcj0jLF2MZhel0eKjm0dYLRNJ1djdPeH43sd4\ncX7G5fVT3nv/29RMGV2VkCSZm9EFQXrDMl2zKhz6h10yIUZUS84npwyPtrhZzQmJCaQ5RycPoCro\n9QYkUU4S5UxnS+rtJmGWoul1ykLCMm2yTGQ282k1d4jCnFarj6n3sYz6D83BHzkIGK0mpaQgSCpJ\nlkIloEoGXpSDJqLVFOpWDUoZJB1ZUTBVG11q0rA79LsDZEGmVrORBYE4jOkM9pkuApLS5ebqMYqq\nEyQ5ek0jKzKajQZRGuBGDpVUoRoajusiCyq21sISbRpGGyoJzdTwUh8/CZAklSCKaTS7UOrUaw0a\n1hbX1zc4oUecpZiyiVFZmFmNrr7NbOWwyaZcjp5RFD6GXtHv1rBMDVmVCPIAxIQk97l1MqDExdu4\n6JqCHwT0+gPKQqDZ6iJLOrHr0es2sOtdrm8WBGWO3mkgSCVh7BOVKYpsIqU6FSIVOTdXl4iyzNpz\nMa0e62WIIuuUYcbeVp9Wv0a73abIE8o0Zn844Pi4R5rFNLs6e3sdmnWbIiuRCji5cxcpU8hSjUx4\nKY5SN1s0OzqaJiCJKlWe8OD2PRbrKSU57spjb2ufnfYWwSYgSwsur25461NvkmQZjusiqRJ1s0Gv\n0cbUFIokpi6bfOa119ALEEsVRdYQM5mD/m2a9QbvvvsOqgaqJPLK3XukUUiRxoiSgGGbaKbIaHLB\nnTuHlGoFusDTy8coNSgKmeVmwyJa8/Cth/hFSpiE7B9uc3l1yXg0Iw4FQi9jOV+jqAqKLoOoEicl\nz0/Pcf2YOM/QrTqz9QzHm3F9fUOtM6Q+3KXT22W+3JDKCperMZGpUJhdnDhEseqIskoQhKiGTkbC\nytlwsLfNZr0iTlwatRZSGLDfaZMEPlkaU2QpTrTC8VfcjC/48OyUKEmp1xv4UUpva5u0qCgQmS9m\nPzQHf+QgkIohYRlRlhWZDJvQZTSdsXNwh529E9JcwNusuH14B0k0mC6n2K0a/Z0BaRpRMwxM3cLU\nG2iCxWBwC6+KkRompQIr7wwNmdU64mo+odGt4UZjRDlmtJiQljmiomBZTQ5v3aMqZdyNz+X1GFGR\n2IQuJSVe6LP2AmpmDUlUqTfq3EyuabZb1Jtt0lIkRcR3NoxHV1zdfESzHdPb7eK4Ea3WFpUocXF+\nShT6aKpEEke4XkhZGLSbA5YLH1VTXppdiBqarCGLJi2zSUuzsSSNmqGSZzmVELK1vY2z2fDi8gVL\n3+V6MWXhbJBNiUpLOJ0/Y1P6TH2fSAJBhYbZQJMtWmaXKiiQsoLAdwiqFDdO6A17pPINf/v+/4pg\nLlFUCRSHuJhAkTPoNglWHsPeFoau4vgbFF1ld+8+YZzgpTFJXhBVFafn3yOVShSjx8ZxSYKczcpl\n4/icHJ+ws3NAWaWcHJ9wcu8IXVHoNGz2dnbJgoj7t++hFgoNXeWwv82bx3cxK4GWYpGFL1mgrU4b\nWRY4O39BknloWs56NUYmx3MDZEmjYdvMbkaQpYThhrppcnM1xQ8z+sMBSZoxmUyYjSaMJnN8PyFM\nMrAshttDdnd3qddNxpMRUZyhqiZrZ8Vw2OX58wuqpIkqWyyXl4TrJQe9IbpU597RJ9k2hxz3j1FV\nmWGnT17q3Ds+IY5TtrcOaDT6KKJOs9khqgoefvyYXCwxTItcKekf7hM6Mc56hlVXyMWIRt/AbukE\n2Qa7VaPR7aLbdSRDplAr5t6am6nLcrPGajR+aA7+6EGg9Gk0LcpCQFJUdvdv0d/ZZrNZUpY5vu9g\n13sEsU+nZ9MddvETjydnH6LXTBzXxQ9D8jKjZg+5WY0Zby7xCo8b54ZN7BCGK4btPnEWMd/MyQUd\nxyt565Ofxq41se0emyDB8T0QRVrNPrr+UpGl2Wjiuj6aoeMEPr2dHdwspt5p0+p1CbOctISsrNAM\ng6OjY3ZOtrC3ZdJiRVXk9Lt9Oo1thEqm1+4Sugmu62HWdfqDAZqqoKgKy5VDVYIki+RZji7r1DWD\n1c0IIUso44gkj9lEDkkVM5lNaXd7IMpUqsJy7bJeO4iyRCblzNcuhtbnYw9+giIFU7OYXUx4ePgq\nmVchlgo7vR167T7H20cc9G5hqrskXoODwaeoifsUacnlxYKoEDGsLpkrstPsIWcmTctib3uXNMmJ\nopB79x/SbfXRVQvLsFEUg7rRwNBq1E0LJ3C5+/HX0Vp1Np5LTVMJ1yvKwMdWYMuoMTAtnn3wHpoo\nc3V2iVWzaOo9+s0OznqCLhR023VWswlVIWBoOmWZ0t0yqTUFgnLJ3q0edV2jqTdpmW2IK27vnmDL\nDYRMAtng9iuvU+80WS+W+IsNainQ6fewhx0unjzB7HQ4euUeUVGy9NYkYoXnhy+Zq0CWeaxX17z5\n8WN2t3e5c+uEhtVmMNjFNGtsbzeZ3jxhMr5GomTQbqDLGjXdIvZiyjTn6//b/04lqHS7e2SlzLC3\nhalpBN6GtbckzjJGkyn7Jwe0+n0WzpKr2QU3ywm6bjFzVvT2DpFEjbJMuRw9x482DPpHSORQxsyX\nP3hYD/4jAAENmSwu2ax8lus1S2dNWibUzQZFWSEbMprV4nJ0zcoZUVEgKipZkbFezbh9uI9QZTjL\nNWG0ZrR4QZRGVFJFUkmgqEiaQFaGaJaOYumsNzm9wSHu2sNzffwk4ujkHkatx2IZYlomkiTheyFF\nUVAUGavVEt3UUDSDVqPJcjrn6nLER89O8aKIo9vHNKwG0/Gcpt3FdQXcjUUYK7z3+H2sVpu8yqlk\nkd3DW9gNG8/zOX36AlnRKAWR3naPvAqJojlCmbGZB2zWPmJNZ7KZskljvNBjuLPDbLUkzmOuz8/p\nNFrIskKz0eX1h69z9XRKt7bF0fYJqVdQRhm77R5qqqCi484DurUhnWafNEwRSoXL56fsdzr4oxvK\nMCT31nRMk4Zu8dbrP4ksdvDjlCwCVWwSRXMm0zmL1Zha3aK/3eH87Ir1aEqwcrk+veDR6QvyDJIs\nZu1uMAyVhTNlPL0iiSPETKRXa3H+9DHr9YIg9rka3dDb6qObNvePX0VOFUaLKRfTGxJRQDfrLBcT\nLEtHBMx6jeVqSSUWLN0Zr9y7xzvfeofpYkYpVUiSwcaN2PghzeGQ0WrFYjPnxcVzJuMbJEHE0DQk\nWaFmmKynC+xBk/aWSW7ESB2d+sEWomnT3drGbthEWYGoCeRAISZoZsR8NiIKc6arDZIhM99ssHs9\nlJbBOlyR5xG6YZG4MfOLKS2ryWd+6i3yxCdYz15OOKY+SQ5xJmHU6iCpLzkcRcC3H3+H7vAuqjKk\nxGC3d8RmHdLr7bC9s0OzY5NWEVEeIxvQ29pFMdrMvB+uLPQjBwHXCcnijKbdQlOaGJqNqupQghu4\npELK0l8g65CXJabeIglf2kLHUs7j8w8JSUitklW5JAlL5EwldQvu7n8c3RyySmLkeo0ilzBrA3Z2\nd7kaj9i4K4oqxwsjihLKQqTVHFJWBjkCbuDheSGy8HKYZb30mU2mjK6vsc0altFAFBR0XeXxo/e4\nGZ2jWBXz2QSpMMgTjdVyRadvIAs5qqoxn6/p9oaM5xMsq02/28WL1iRlxOXkAjd0WLlrOj0bxVAo\nypLAizDkOuQCWSggC23Ksk6UQu5JDLQdtrQ9wisfnBwxgfHNFRIlbuhS6RKbNEC2DMLMR9MrVFnH\nqNfww4jlyqU72GHtLHF8h73DYxx3ieMtKBCIvIwnz8/wKh+5Dafz9xF0idOLx0S5SyomzDZTpps1\n7V4H0SiRVAE0jbQoSKucqMy5HI/RZImtQR/PWyFWEjuDE5wwJSwq3v7oCVLT4oMPn6BoICk5opxx\nsL9LtPJ4/e6rdOtNJpMxzW6PQsy5njyhPbTxwjkbb8VHTx9xcveIIPBRdInFesN06TBZLTi9usRu\ndsgyme3tu1Sqgd7qodWaNOwWZVrwjz/1E7RkE+cmRAh0erpJPa0hRhKiKHHrZI97D++jmyZ3H7yG\nG25wQwfJlLGbLSxdR6LAdV28IMRsthEVjfVyiSRr1DSLrd4WnrNhs1pgGBqmqjKbTwmDDEW2yFMR\noZCpEJA1iU3gcXBwi16zhS6ItGodbsZX9DtdAm9Jra5xPbpGUTU01WA0ucEw6hh1m+n6/wM2ZJIi\nUBY5pVBCWeG4S8rKpyhdSlJqRhNTN8jSDEGQyPKYbucIu97B9X1yRLYODtA0k9UqoGZa5JXE0ckD\n5muXRqtPJRi4UYZZbyKLQBWztdWk2bWhKhgOe8iKjG6VGPUCkQhRgvt3HtCx+uhSg+3mbT752o8R\nugFVmhDFEWVVYdcNLq9GzGZLKkpW84gsq4ijCLum0+vVaZg2hZciVwKNhs35+Tm2bRGGEaqqoKk1\nHNen0ekQlxU7h7eZLOcM94aYTRNNNxBFjTfffAtFeSmK0my2seoN9vdv8dH7j6nKkp2dPcqyYKu3\nxV7zADlW2RscsAk21OsWiDJeHNPq7bDYbHCWGwQRuu0Oiqjw4cVTFv6I6eScFzfnbHKPy9ElZzdT\nTu6/iSm2WK19nMDj8uYaL86I0pg4y1n7C+7d+TSrtGAZ3iA2ZA5u7ZPkGbKukIshO4dDXlxeISGj\nSwKnT/6Op2cjpgsPL0lQNZHX7v4kP/7qJ6j8iEfvfYfr5TWKriErNbzJhjRMyIsSr8y4mo8QNZW1\n75JWAl4c4kYeulGn1+ujyiLr9ZTdnR06nTbhZs1uq8nrd46pKzKvPHiIphq89tqruKsVh3sHBBuH\nKkr53I//FK/duUsah8hSSq9Tp2YqrJ056/Wc+w/vI4kVeZpxdnXBcuNQ7zRIxRQ39ekOW6z8FXNn\nit2pMx9PUEqBLIg4HO7QaXdJyMlzkCWd0c2MKgMxE2nXWxSZSK1mEfgOOTGqYXE+OeP+gzsIecr5\n+Bm56PKtd/6GyI9x1h66Xmdv9zaW3qFu1VFklUZt+ENz8EcOAr4XEwYJNaOOWdeYuWMq3SUMPdot\nmzh2yMSUjbemyGMEMUHWSj568i69nT5OsGY5nfBgeI+fevjTvPXK52jYA3LVpjB0gqpAVHWadgNT\nV1h5C9api2FIbLwl63jK2h2zWp1SZmOqbIbjXVDmEZauEWzWPLz/OjdTh+OTO7w4v0QSJBIn4f6d\nh8RZhaaXvPHKJxk09zjcfYBQGWztbrHezJAlkdD3EcuS9XKFbdvEWcLGSUjjiKL0CcNzsngGeUaV\nSSxma67nU85Hp4wnNzTsDuPJEsNsohoVHz3+DoHr0O70eb644tVPvckmWjBLJhSyzE//1H/O6/df\n43hnn8P+Di2phuAnNM0Gn3j9M1CYHN8+QVVUBEo0VcaNlwg6WI0WaZFzcvcBolzjw2dTdMPgU8dv\nslfr8db9TxM6CsPhNo1On1h4ubtNJTFbzajEElSJ7taAtCoIkoz5eo6frnj30beJ8pDFakqRBbz5\nxps07Zw7D3eYXTlIacY///o/4/F3nrGYrGnVt6kVNuPJDLsuMh+PWK+WtHt9nj17gqTqDIbHvHgx\n4u69e2wf3KKoFEaTBY7nMFutESSJ3a0hFy9O0RSZxx9+xM3N+zx+52+Znj9Frxzc1QRn4XF//y5V\nGnP/lSP++jt/wXunb7P2NtjNNqbdwDAb5HFOGKwpi5KPTl9QVjJbvSPiKCFOMhRFJykDJk4AKoRp\nAIiUhYC/Cdjd2ubxo0cgSFh2i+cvLjl9foYuKZw/P2e5mCEKCmkqoMoqc29GXuSYZo3laookFezt\nDYlCj8B3eeWVV/HzCNuy8ZYB6+WcTrfFfDkhrVJ2B99/bP/fDuk3f/M3f/M/dKL/P+O3fuu3/p47\nUBj/iCwvWMcRSZWRkBEmEQ29DghIgsgizzAzk16nS5AsKdUVg51tLlcT2p0GGiaeM+Zi+Zx1dkF7\ny2JYb0I0pmskaFWB77hsDfZZbzwUQyGLE4JU4ODoLugypVyyCTcUqUweg2VYNDQbudJJExmj0+bR\nh99hb/ByDFeWBJIqIq1SlLTFQW+HKgopq5e9X5CsQBKo2zaLyQqjXieIQ7IkYblc8PD+a4xunmNb\nNdI8fnmsJulESUZJiWlaRLEDuUDo54BGKckkAUhUDNp1yiRG1ERWzgwhSegMGuSRj5SKeMGCxWxE\no9ai2+sTpxvi2KVT74BQMh6dM19c0u1bCCKItsHl2SVpWlCIImHikWQ+9+7dZadzyHvvfJdN5nA9\ne4JsCESbkM/+3C+yWXkUWcLh3h1G4w8xdANRqBEEEVGUousKz59dcLT/OrbVZuMExEmCZRucnn2I\nquiIsomiFvSbAw4PT/CSFftHB7z3nUfUNZ2QC7pDiVpD5HIxY2dri+ubS7Z2+7TabTSl4vrqOYau\nUYoVYe7R3W5x/mLJ5/7xzxD6DpvNklarzf7hIcu5x27jhLou4UcrZvMVv/hzP8+z7/4Ng32LF2cv\nSPIKQTZY+hN63SFZltFoNsnDhNV8gd1q4UUh2+1tlLTENAUqIWYxn1NWGbcO7lNlKXniksQl9XaP\n3duHXFydc3LvVZbeGkkyEBWFjmUj5wKvfexVzs4uqbfbdIdDqjziYnKOJpuYokUQBnihC0JOFQbU\n7SaeV3CwvYe7WnLn9l1msxlUGYJQMF06vPLKXYbye8BL7sD3S/cfeSUgCCmL5Q0rZ4IkS8xnc5JU\nZuGvGDtTgtxDq1I0VWZKLUSKAAAgAElEQVTtL0BNWXkbFpsx7aZJr7PLcPeI9s4rdHYPGa3mRDE8\nvXqH2eoRz59/j5vr5yR5ynKxxDYNyiihaXboNffwVhmFp9ExdlGLOqrQoF4fMJpMKIsMUzHJwoiW\nIXPc73ByeISlNbBrNXpmGyPL+exbn6Fe61NJKnW7RRj7FKlATa3hzl22ugOc1RpFkDENnabd5OL0\nnCgI0NUOdq1NnolMxzMajQ6CqBFGKUIloukmhqZhaRpFGDFot3AWG2SpRuxDw+rjThJMwyTKXBRZ\nIskDzLqJ2TZQ6xE3k6ekaUhapZzNLnj24kMyMSYVQ1IhZrqe4s0c+o0uiiKgWyqlUJEkoGhtHj3+\nkCyLELMSXZEY9LqohsLk+jFyXpDFIcv5JU29jZwL1DWNumlhmyp5ULHdPeL0+XOePT9ns4r42Cd+\nDC+oIO/wz//qQ84uJnQbW5ydn9PYbhNZAut8ye03ThCGMpezGcvIxyuX9Hot0iLm/sN7xIlLnLh4\nXkCj0cP3fey2TlzkhEHEL/z0p5ncnKJoBbu7u1iGThx7HOwfUuRLqjJjb3jIj7/+j/jw3e+imCXv\nf/Q+VQW6oeH6LuOxz/X0BkmvOH3xgsPDu7Rq23QbHUxVJt54jKYTBLUiyhw6XRupkIhXU8bnzzDr\nJktvRfJ/Uvcmy5Kk55ne4/PsHnPEOSfOmHNloSoLKAAECKhJLrq1aZnMJKMW0gVoqQvRNegKtGsz\nSW2UsUmATYIYCqwhs3I4mXnmmCM8wudZi8RCC1nXSlbdvvX187r79/v3vHXI8/dfk+kiYZmiKSqe\nbfGvnv1r/FmC3DYx3B4Hx0fIcslidUMY7BgMDrCsFp3+CNfrITQC/npNXjUYoszVty/RkJCamiwO\n2O/tE+1KhAz+q08/Y/n+8jsZ/N5D4Ks3v8cP5nQskfXNBY7ewVA9RNlEUzQ2wRahblCMnEYp2fgp\nEhaG0UYVDBRRR5BlwmjKZv0KRQZTMgmigkRwWZcet5uGfu8IRdE+NMaIGsF6hye7nA1OcEULMZI4\nsI5QaovRYEy3t8/V9AbTUtCKBfuWRhFVpP6WgdWjrXjYtcHn93/Mmze/JY/XOHobf7Vj3NtDKSWK\nqEAWVHTFRjMUiiJFkRTGvSN6dpuO3qFKQubzBX1vCIVEV3TxBIe+O8QzhjhKm906hEZAkhXuFueM\nRm3uHTzgdP8JDh167hChUZEanbwG0dTxw5DV+pY3b75GEHN20RrDchAlnXUYUwsCvb0+8+UEP1iS\npRGGZuDqXcpdTc/s8ejkB+S7FEORsUQ46o0pVwpKaDDsjei6LvluSd/qsNc6oMgr5stbyjohjbbM\nbqesF2s+e/YZklCjqAIn9054cf4NSZDx1W9u6e3ZHJ3dJylqxFzhen5BlcUEccWLt28JqxjJGvPN\nizWS0aKoEoqiYLNcIlFye3vN+PCAwcGImhJLlri3P2A391lMJuhyRVOlLJYTbM9C1yq2wTX3Pz7A\n0jRIROJoi90yCcoKRe9x//4Z69US3TbZPzj8sLa+XFE3NavtGm/UI8kTdNnAtDRaZpfL1+9RxIbL\nuzfoto6/XhPsQqgLBKWkkSo2/hbdMImzFNMy6ZgOu3DDL//iL7CsNpPLGwatPrEfk4cJu82Oh4cP\ncVWXMi8xDZO6aOh4HeJkx42/4OGPP2e22aLKBuF2Q5KEdFyXlumwmc55eHr2nQx+7yHQaXfRVRWx\nEjnsHiDFIJYVjtNBlHSERsJfJiiKynw+J41r8qggiUIUIacpGqbXC67OL9msfEy1xbg3Qqsg3sQf\nCkGTjIqSSqzod3p0vB6D/hBd1tEw0CWDvjPAFtv020PSIEZqRGTD5fzmFQdHhzSVyahziNSoJFGC\n7djUVARJQlpEyIqAqWtYigY57HX26VotOo6L67gojcmgNeR4eEoV5wgNdKwh/srH8dqUYY6mmZiS\nRMtwadKSq3fXUOTsDfbxWj2mkwmrbYooi/zhi39gcvcSoQqw7Q8djELSUNUJu2JGkM2QVOlP59oy\ngR/w6tvXNEi4nsPG99nuEvKcP93f4bo9Tg4foIgqhqIiFAKGrrC31+Xy/BzfX/P49Cn5tkTFJE0F\nbi/uCO58WnkJxZw0lUljCLcZntOn3e4Q+UtO93q0VIUqDymKLZVe8df/y3/D3pMjNAOsjsfl9YrG\n1UlDBVto82R4hpiI2Hob1xlxdbVGcyJqOcS2Deq6YLfc8eKbl1ze3BFXsI5yRFnm6HTMOlkS1T5p\nusZ2JCaTG5IkxvBkwiZB0gT2RgPyMkcQFKKkQtUM3p+/JcsqtmlCq+Pw5tvX5GlKdzhg5s9pt20M\n1cCTdYo44u3L1xyNDlgtFtR1Ra/T5fnrc1LJQDH3MJ0eoqahKBqmYvKHf/odw94If+vzf//q/6Qi\n4Prit9BsaIjx11P8cMf57Q1v3l0i6QaXN+84Pz/HbHV5c3PHZLPj42efUAoFggK3dxOaRmS2njKZ\n3jJfrZivFvzdb371nQx+770DwTalrhVubqYM7Jrx4Qm38wtsT0eURNpaG9VrWE9nuJpJpWuUJBiG\nhOfZVH5MsQ5xDZNEFNh3x3z7L/9C3z1CEVzCeMO9+6cA2LpDkSRIiDiGhyTaqIKIJRtojUzfHWDU\nEfNlzLMHn7ALM+6K90jCkJKad1cvEYSc/f0TNtGaummo6xpdabHx15iSgiFIWIbFzWqKrFVsdytM\nS8UxNDRJ5Nsvf4/XMgnDGMOzUfM+btsg3+boRUGcZRRFRiVUHB0dgwCapHw4z5ZVqjJGtxzWmy0k\nO/R0S6c7xERGUhzultd8+/pLzk4OaSoR23EQqWlZFm3Do0wzxr0RWb5juZvSsXtoqkdRZlxfTbl3\ncoqYh4iphud0uJi/QRQKPvmzzwnDiDTL+eTZZ/zhxR+5WcxwHJcsTLj+9jXtMw/BVMmyktFghCbr\nVFWJJBQURKyiJYcPT9CqgiYTeXvxO/aHx6zWczo9jR//1T06tsqj+/d59/s/4g2GVKIIUoQsiDSy\nzWSzQFcN5ptbTu712C1naJWGY7Tw7C6r+YTeQYeb96+wbRtBkynLkqJq6IzazGYzojQmrxVO+nsE\nzZZN6rO/f8yeZ/NucolVZJw9PuF8viD310RNSVrmOFVDx2uxWa+J8pQ82FJVAj9++phg52MbbaL5\nlvVkxaDVwo8akjBndbdCVgSGTod07fM//nd/ze+/+R21LnB4MqRIJ3R0kzwpCHY7JEnm4ZOPEBTY\nbmcsdlMMx+Tjkyfsggi3t8dPh8f8+t/9I3qnS9GXGO2Pef7qS3KpRFM6/PzPfsLvvvgV3d5/AacD\nrjXk/vhjnj76OcfHTxCQ6A2HFFlGk5VIoohpCESJjyrpPPjoGUt/C7KAInu8f3tBmW4pihBD0tlt\nfE4PTznZf8L942eM9z/CsjtQywiliCFbNCVomk0c7kjiiDyNiDZrsiwgnE+ospRil+CpKiedI7bb\nFeHujlLwUfWG+fqaMNsSJD6GbaOqGiUZUblFVBuSMqYWGrbrDbZlc3dzw3x5w9q/xXBUEDIcxySu\nS55+9JTZfEWaBliaRhRHlGWN3MgUWQZ1jVAWeKaGZWg8enCPzXpOdzSgKkUG/VM67gEiJu/PL2mb\nHj948hnBtkGV2tjmAe/fXbJarZAbGVWsqMoUTZMRihpLNxnv7bFZ7TjY3/9TnVbJ9fQSRW5QFAXT\ndjDcLnkBRV0wWV+j1AmTxTWyZ9C0Ff7l2xlh7qJoCpoKmlaRJFesNzNc20UxO3z06aes64rdNkJU\nVUbDfaIkxrIM1ospRitD2K1ZT99wem8fa+Rx9OABDx4efxCzKhUSLo7XpVIkKqGgoaHIGkZ2Fy2X\nMUudt8/f8WD0EZbSJZhn5KnA/dNPWF2m3N+/jy306bX2qDSJq8mMRhN4dXHOZHnL0yePWcQTFLvB\nsw2OD8/45Z//jLKsiKItgqAw3a1wOjbdw32cfptot2MzD8hjGUOxqLKKpCy5t9dje3fH8aBLy3RQ\nZAUFiV//x7/l/P01+6NDRLkkLyXiqUCZy2hai7hqiHcJf/c3f0Md+/RaHtutz++/+B2WqrPXHkCU\n0bMPGO8/gkJgsVggKAa23WZ4MGITrpE0Fcn4/+6R/H9f33sIkBeM20O0SieNMuo6xdRk8iwljkLi\nVch8dUd74OIYPera4fhsjGN1uLm8Znx0gGYqmLZJv9cjzhLeX1+x3k7xt2skQUZXNaosRihBlwza\nrcGH6XUW4ydrtrlPWG4Js9WH/88ViSha4W8m3K3PWcXXzP0pttNBUlzitKIoKqpSxDQMWh2TpPBZ\nZjMu4wnbOiCrUkxLZ71YcrA3BrHmzdU7Cqnh9eWERhZJ44xwd4NrqKgi2LpOu9Wm1+6z5zm0ZQGL\nDE2MyMstTZOgyhWWbrBbbfjLX/6COFtRSQFGy6Hr7hGsA1pGG083EUqBw4OPaPcPcdttFFEhSbbU\nTcxu59OIMU0p8vVX/4xIgyQWJGlAqcr49Y47/5Ii26KKBn6wZe90SEDCq/eXNJXMR/fvcXQ85P7n\nj3n482fYkkO2zVElk6qoESQF0xK5vn1Lvssp04Tbi6/IkxSxyqHMaaoNsqAgIBOEObPllN7IRTAF\n8qpAlndcXX+F5xkcdI8IdgssRULICtKg4tOf/JJnP/sx1DF5mqEaJk1dk5Ypgqyhtj3iJuHVy5c8\nvH/CzfUlra6FoMVcX73j6OwUIa9wbRNTUgkWWwy1w/X1JSfDEzqmyT//6gt0USWab7AkFeSU9fKG\nqiww2l3EnovZ7VGWAgeDM95+GXI4PMVwRmRBjmzYvH9xidvqs05C9u4dcXp2SB7k5BlMZj6K6VFT\nM1lM2D89oqkKPn/6I/ZbY9qyTlcx+fTRU6o8J40inPYI7+CA0/EBfcvB0nS6rT5ZLvLpD5/y9uIt\nptWhEb77Zf97DwFREIjzHaW04yZ4x2RzzWI6RRUF8m3KcrYjXOVYssUP7n/C5O1zOsqQeidiyDLt\ntoNmyTR1zWI+o9Vq0WgQ5mvidIOuSaRhwsA7oOscIBQyVfZh2CVIEmFZ4OcRQRnydnZJXKSEcUwc\nbSiLHZIoEwQBsihTZwKypEKloFQOcq1QFSUbf4uqOTj2PrrVJkgj1sGC6XpC3tQ8f/OOIm7w3BaO\n1eXg4VMW24g0TanLgsn0DsPScD0Ht+WQFyGb1RRZkihSoBEI/R1Hh0eEYcV6s0PRG5b+JUUdsQh3\nnF+9wmkJnJ4+YHJ3idIYCJXI8y9/Q0uzOe7fZ9DeR6wbsmTLZHpFXmn02j0MyWGvv0cWRhyNj3A0\nm/3BAVUpYdtDTu+fUDbxh5VazwSpwtsbEm0S3v72BeliwyreoRYJu8kteRgQhAl+FBMmO4LMp+3a\nXL++4weHI3odG6W2KPIdab6jFjIMTcG1e2z9DFlWkBqd4WCAH09J0jWqVKHmJVqlfnjqpjnLVcjN\n/JZteEOpzGkPZB4/eczo4Bi702Gvt0+0LUgSiadPHpDld7T7InfTc+6m71EcCNIc2RCwOwLz5Q3+\nzufs3kfUmcxk9oa0DPiLf/ML8qohiwsWkwU9r0+jaNSqwuTuFnGvjb7fpXd0wOHxE/7bf/s/oFUS\nalmiaxrbaMeff/4zRl6Hg9GYumlQNZW6KtEVnaIW6I3HaJaOLgnIWYqRJZyNepRZycLfYHgas+Ut\nZZ0hK1CUBZ5lIovgb3z6gz083WN9t+Fv/u7XmG4bWdPZ7XbfzeD//5j/p6/15obN+pKiWDLa38Ow\nBgiiQ9w09M7G9A9P6HhPeHTyC/ydT6/TYtjqMR7uU+Qp6/UMkYpOp02306ZIcqIiZOnPkbWazXqK\na9tYhkW2y7B1B11WKfOcuszJ6wLTdTFbLV7fXqNYNp32iOVqxWwxJ4lT0rQkSXNqocawHBRV4eBg\nwGZ9w2Z1h6Z8qPjqtgaIuYi/WCNQUdUFR/dO0Q2Ho+NPsI0xdW1h9cZUtcpo2Ge2iNFki5Y1gEom\nDkr6/WMazUKyPA7OHlOhEIcx3W6Xfn/IcNjH1HX+8R/+kX53H822yfIcQ9VI4x299iHD1hFHw0c8\nevgR6/WSYLdl1OnT5BlNmWK3LJx2i2Ad4+g6w16f+e2UpqjYJgWG4RH4MVmS8k+//geC0Ge2uOXq\n+hKv3SGXFGrVYpPqhKFKr+2xDZd4hopQC5SVQpRoNIILikrZBDy495Dlu5gyC1lMFsilRduxEai4\nvp5y/vqSphYp0pQk26KIEC5SCqHFJgyYr98hKyq23uLjhx/T9ro0TcNyu2AbLLi6eMlmvWC4N6ZB\nRqkljuwhf/3n/xOXL6e8vfiS1eaGx48fYWgd/E3OZntBWgf46wn3H56h6ZDGG+6dfcTe4AnL5Q1t\nx+ZnP/9zBkfHYFjUukXTCFAVHJwesvU/KMFarsXN1UscqY1nGDRlhSyrWLZNqX/ov7j59gJPt4mj\nhJP7D6CRkBWdvdMTcrEiSnd0HZO8WvN+9pzGblhlW1ZpgOgZbMm5iVYk+pZ3l6+INhk/+ezH9Dp7\n7A1P2WwLnjx9xuhgTKc/YjHdfCeD37tZ6FeX/5r55A2KoDHYP6IRW8R5ws3saz7ee4yuuaiGTBxE\niAJEaYrXtVAtgeV6gb/ZIGQljm7TctqEWfWnKrENvfaAphZQKg21EfBnt+wdnLCNI7IiI0x9ZFXF\ntDyqIqUWFQ6PP2K9Cpi8e0W0fY9jeeyPDgmTlEYGodFJswzFhMBfYqkyWRFhOAM0w2MVLCnrBtsw\nKeqIupLYrgM6bpewiHE8C0kTSZMEWdZxbJPF7ArXaNFv90nSjDwv0USBIPTptPsIdc7F5QUn9+4R\nNQ27cEanNaJlGmzmC0zbQmrANkzevr3g8Pges8UKXdMZ9Qd8/eVvMF0BoZKwvTbX/pKsaei6Lcow\nRa6h2z+m19rnn775R8YPj3n59pJ9d58gTGikgMXyks8/fcZkPafdO+XickrhX4DifvheLwt0WaCq\nEzTXYZ3mRHVBkoRoqoihqpi1Q52EINk4LY0ojaikNfNphGHoSLVBlkQURcHJ3jHv/nBLLQu4+wIF\nJa41hlrmL3/2Y56//D3vZ1cMBi0mqy17YxehkjDkFrbosY5vkMRHtIyCXbzi1dsXjMYHRMUOR7Po\n9jv4sc9611DXNrW8pmWZnB4+5pvnX9HqWPibhGG3TxhmOLrL8fCEb759QavfRzc14iQgigLWccDx\n/gEvXr3k06MfEN2k6O2E29sLuntDEmoG7WPMWkaXTRaxj+nZXN/dYds6VVlSVQkX1xcc7g1pigRB\nkrmeTHj6g2eIpsTV3R1er0VWZKRJgpBqSHWHlqaS5BO2+ZZa6jPa6/PFN3/g2Sc/4v3rF+Tljv/5\nF3fAf8ZmoWxXI5QiTZ5Spw11vmG8N8AyO5iWh6V7pEmNoKgUFCBmiAJstxFhmKDIOrbTohFEsqoi\nD2NaagshrtjcXGBIElE6IU7mmJZMnMwQxJxW20OSVLqdHrt4haBl1GpFkKYMR0f89Cd/hSja7B/s\nkeY5hmUQ7HKERmG0PyYIArIsxzR1wm1AkQQE/gTKHNcwsDSLokwQJZmf/OxzXK9HpzNEEEUurt4i\nSAI1kMcxtqGgCxLrrY8qtdE1g6Ku6LSGmIZFI6h0RvvcLFaYioJSu8iNxvT6mngbIEo2lWSwzUpE\nUyPMA8ompxAy3r57gW0r5IKE5HlcLu8QRQHPsJhPZ2Rljtaysb0WUZzQ7ll8/c1X2K5NUSWMe2OU\nWmQ82GO5WZMmCb2WhyT4HO2P6XVykt2WpknxswBjv8s83tGIEPs+SbQl2vlE/g5RUwirhtn6AiSJ\nRraIGpFMyAnLENGqMdseSSWzDFJOnz7g8KSDqnoojYhr2LiqwMXLb8k2CabssprEOLVFPkmJpiFN\nGVFUa2pxQcuVePn6BbKUc3x8hiRUDNQebW9EtPGJ/A1SlVBVEUUpsQ58Xl39E5/+8Ckrf85ysyLJ\nGhabGZWU8ObyayRDYhMEqJpGXVfc3d3yycNP8FchD44fUok1ZrdBMFTcUQ/TszBVBT9e0lQ58+Ud\nmi6TRSHHgz66WFETk0gR95+eEGchUVrR7z7g+OApYiOSZyWea7Pa7Jgu7sjTkKzM+OXn/z2fP/tL\nNmlGqXcRtZx//+/+D57uP8CtbcJ1gCar38ng9x4CdeWTbEs+f/avqOuMuk64ePOcUbdPVtZIqkFa\nlrjdFkEWICkicVJSZNBxh4iCRo1IlCXswi00FWUaIjUiluXi+wtu764I0y3bMGEXZth2l2QX05TZ\nhzXX7Zrb2QWDkYtlwO9/8zcUxYb94QG6qRFEPp494vBgD1GS0TSDsizodbqs/ZSHP/glheGRCjJu\nq8vW3xDnS/J8jaHJ3F2uODk8pM5L6lxiOHiILjsUcYzcSBRBw2KxRa4aHLP9YcAl22R5RJJkVLWI\nITt4bpe1v8VWbdIwoC5rHjz9lLiSyEWb2S5jEWZMN2v8ZI1qaQiaimaaBFlGUFX0xsdEQYwiCOiy\nQl3VyIpCtF2hKzJCWTMedqCIkaqcrJ7T6RjIskCWpWiSxPn5KwzVgUahrhVaLRfDNtBslSiOydME\nqSo4aLdQs4p0HSBLIgglTs+mfWixLVKO+/fJrjLU0kQq5Q+SU0ni6PSU47PHuO0uqqRjKxb9dpuo\numEdL1lFW/JGYn9wTN/p01IM0qihOx4hOzW7ZEUuFSx3v+HsZJ+qMknzhKpseH8zJQgKNMdjPa8w\nFAmVNZ88OKAOIqzGIF7MOekPeXp6j3uDe/SNNh2rjeW1Wfk7Hj95zOX7C4RGZHx4zPXVFbIqo4oS\neVnT6fa4vLrEaw+JYgHb3adleuiuhdttYzs6WbalTkOSyGcw9EjTHbfTGwpVQdBMiiJEkOF2ucB1\n+6w2KT1rDyUW6Ug9TttnjJRL/uHv/1dqxac/6mFUDZ+N9/CKijxY8Yuf/yX9wfg7GfzeQ0BAw/UG\nfP3qJXktoIomjuFgywq6I7LL53iuwWo5o6oagjDENm3SNGM2neMvt8RZhoBIU0FDyWbrEyYF8/WS\n27s7DMtFklyOzp6SIvL+9opKCBErCUP32NsbURQVy7sbfvX3/xd2SyGpdoiaQVnljA72sd0ertum\nkQX8cMegP8LzOnx0/wdsw5g0TzFciZIUr9eh1ztmr/0xaq0hlBVXF29wLYOPP3pGv+3imCody8Az\nTfrdPbrdfRyzR5GnjMcPqUqVvAAEHU2x0RqRcL3GcwfEWYAkprQ8l/V2hdKUqIpIlsYfXIBmD9vt\nUVQCyyDBz2SKQsc0Wmz9gNOjU7ZLH89xqIuKaLtitbxksz2nLEPqPEJNQ5o6ZRutCLMdkq6hyNA2\nLAadFlGQoHomutFhsVqyC1PqUiBPM2zH5m56w2q1IkwTbNdCkAWyIqYoEpIkxfUcLt9fs5nMieIA\nTWuhCy1GrWPkSiRYz4jjW+J4TbHdkuQJom5QSwK7XUKcxLz95j3v3r/lejpFqiuuZ+9JMp9dNCeK\nHDIpZhP7BHGA5fQosfj5T/6Sy+cvufn2PY8ePUSRNPodk9nNGwxNxBBdbicT4rykkWqSbM3Kn1PW\nJVUtMOi73Fy/wOmYvL14TVllZHXA0eGQXeQTJP6HdiCrQqxFDg72GfZGiDJsog13mxuCZEFab1E6\nGrPdLV+/fcnDs0/JdgmSIeBaGovVkv2DIybzGV/88bfIWk1Vxhx4Q8ajR7Q6Mv/7r/83/rC6Y//h\np4w0DTHJODw6RpAaBEPkavmG9frmOxn83kPAcj3OnnzC+OgMU5KxFItuq0tdVVxdvidLN+x2ayzD\nxNZNXLtDnm2xVZluq83eaERZlsRJjqZZ9LsnyJJJ09QAeC0XURSI45SbuxmICidnh3z5/AsG+z2a\noqbJLBx7nyRpGO0dYLsOvh+wiwMq0UBUPWoa/PWS48MDFFEgDlOGwyNm0zmuJeJ5KpvFDEe30XAo\nY4Uyk5EVE1EWsAwTXTGpi5I0CFjN10iNwHp5x+sXz3l4dkaR50gyUBsUSUnHGnLQfkjHaiGX4Nky\nebDmeLzHJtgwDaZskyWbbM3f/u2/x3Vt6jolzUFSW1Rihe7ZVJLK+PgeLbPN5N2M7TZCVQ2aSqHT\ndUEA3bJYbhYgKGz8NYJcgJqx2N0hqhqKJpPGCarqsJjNMZQKTRQRS4nj43tEQURT12RFQVmWOJ5H\nnET0Oi06LZthv8dgcMjB4JhckokWGxxHZ3i2h9UxkQULtzPAMm1aqsXz33/FV18+J29ykqZCtwzE\nqsI1LWbzOzabEENtODx5gmI56LpJE9bkU40yMLESE1008boD7p09whUN2hj8x//wHxi7PTyti9mX\nmW1uKRqZqq4wdJt7j56RpAqLdUBOwTevvqTb75MmKSoy0+tb4s2WOPTpdhwQRGzLY7lY4joGpiZh\neQ1ZWtHtdYijiKV/x2R5wS6ds4tm3EwuCaKAvNqRSxm220ZvHEbDPZbv3xOzptJirqfvGY8POD3a\n49AeQFpz/6NPCDdL7jYzlnXN8fghyXSHXMt0+h129Y5ZvOQ2uKCRE1pO5zsZ/N5DoKNblNsVTZQw\nbHUxNAlTVZFqkZPRKXVao4gyaRhiSiJCWZDEPkKdoxsWsqKw8wOO98/o2COqUuB2es7Z2RGKZEOl\n4RltbNOk1fMI84DbxXtOHp0SZCFRkHLv8D4Hg1MMTcdUVahKJEnFMC3SLMNr9bi+vcb12symUwxV\np217rO9mjIZ7+Os506v3tGwLVa7RNYGWazA+PISmQRYhTnYYpkYUbom2KY5mIzUSpuYwHA64OP8a\ntQxYX71g33VpuwLrzYKyKtj6a3bJmvH+iDRb8OU3v6Pb3UfVWrx6fYuiujx79iNevzpHEEQEMSOI\nZxRlieHaKLZKmYfkwZbD/h6GbOO5fa6vJ+yCgDiNuZ5MCYuMppHwzH2yUKCpVIbDI5Iq5O3tGwRJ\nZLvbkuc5SRyiGzZ8E+UAACAASURBVAayLBNFKf3RHpUg0FATxzG2ZWO4FpbpUgo1e4f7zOZT/FWA\nRp9uq0tQzdA8i9HgkLbXJoxC3r97j4LI/rCP53oIaNhtjyiJsV2XII549sMfcnR0wGJ5xw8++gxT\n1Wh3XUatPgfDM549/nPWb+c4hcHs5oLF/JI09dkEE1oDg/uffIxk97i+ec1wv8d49AjLGNDpdnj+\nL3/kR/c+pS3oyEWD7arEZcjdbE7L9Rj2euwN+1hqmyf3f4Qua9x/9JA4SSjLkiDaklUVnfYxaZTw\n6s0LgjQgjQsMq4XXG7AKSmS9Q5IarDYlHa/Dej3BFE2OOodkSUaQRiDmnOztESxX/PbXf6DX3+O3\n3z5nIwTMZrc0mwgjzmmZNnGcosoKTVMQSxmqY1NVBi315DsZ/N5DQDE0Ugpc26TKEmhqsnRHGq2w\ntYokDGi5Nuv5nDovSeMNWVojiiZJkfDFv/wB19ZIt2vatkNS7ugNXPIqods7xtZHdJw96kogyUKc\njk1el6SZRKdzSLtzgNQYtPUWUpGgCxnlzmfk9lAqGUPQ8Ndr4nzF7eIKRS4J1rdEqylFuMb3fYRG\n4t7xfQ7HH7Fc+fi7KZvwmunsgiILSbc7qiZjs50DDYPuEYqgUxY18/mOv/rlvyXaxYgimLbGdH6N\n22uhmCbr5B1huSHXEjbbmLASEXWVyc0tclnxg4efMb+ZASkHRyPqUqbKI+q8ouUOSZOM3W5JsJ6y\nWd1xMBpSRmArXU6O7iEIPUTNpTPoExclURgz6hzy+Owz6kRlt4xZrUsko0t3cIBlOqiah9cf8s9f\n/IogW5MT0ygNiqkQZzGPnzxBV3UUZFpGG1mSOD9/g7+aIDYZ//WzX7Bbbkm2IfcOHiMlMlUeEKwu\nieILLhZfYPUa2j2DjueiyBV5XeOnKZKl8e2LC9brW1rDPtM375CqlHW6wNBlkvUUf3aO0qnJCx1d\nVWjqkEZsCMKArmUzDVdExRwx0ykCgYs3Fwy7Q6hqPM/h3cVX7PwJRdqg42BKNoJU8ury94hShSpr\nGIpImYQcdQ/RBB3ymjrL8FoWlWCxPzrh9uYdluUSxgn3Th4giSJeu8ve3pi1v2W6usazbe6u3mN2\nJaJshdbxUCWD0fiM+WrGdHlLo6icfPSUqqppqwJ+PMVtiTx9eg/TNcm2C2zLoK5FGkGmPzpg2NnH\n1m3csfudDH7vIRDEW9bhhm20JS0L7pY3zHa3CHLFZrvGdSyWqym6oRHsYmTFRdU89obHlHHO8XhM\nk+U0YsYmuMKyZMb791H+NGUvyVhs10RZhazq1FWGWKs4TovV0qfltHGtNmKj4VltyiSmpWmE6wn3\nD4eYms14OKbtehRlSl1U9LojLNtE0xXu3XtIrzUiWmcsJz4iBn68Y1dHpEVJTk6tZJSKhN7xCMoc\n1bOodRnJNDl9/Ih31zfUkkRaNjSiSVr6fPP8K0QpIoq2bKI1VQ2bMIDmg5OxqQWWiyVlljDeO8BS\nHUxRI42XaFKDqUpcvj8n3q5Jwy1+mNIoOpPFkl22I6sS2kabJ/ef0sQ5olSzt3dApzNgOpsQxim9\nbgshL/j46CHtwqUJK4o0RVILNuslg/4pRdFg6QZZGJHFEYpUMbu+oE5T9rtdHh8/RK9siqjh/tF9\nIj/kxVe/R2ugbXR49/acuq4JdhFlClJtkxVt0kKlFhTuVmsMp8/9kyccuAd8/vjn/Oyzn6JJLnsH\nYy6uX3N6eoRu2BRhxfM/vuH6ckowLyjygijZ4UchLfuDj8JPM8JkjaIq2JpHy27h2g4vv31FFIa8\nvviKSo5p6UeMuw/Jy4KiFEiSCiQD1dS4urvgcv4bNv4Nnq1y9/wFHx2dcdg/JtvIjPpjwvWKQWvA\n3eUVXafN64tv2O0isjCn3iV4usnt3RRVF5ktZsxu1pSZTJKk2FaL5WSB2xqxzQp0q8/+yCELr6my\nNdvllCyM2G0iNNWkpCKvYt4tLqlthaLOuLx8g2FpXF2/+U4Gv/cFojiLKIoY1eiTRTmlUFEVCVUD\n8S6h2+0SbgP6/T126xjL9NhuQvxNRMv5YPC13SOoJRbLKW5bwBseEsclAiJhVGM4Jv3RIQt/RlGU\nqKJFt9XDs4ZUzZ+UZnlMlck0lYUfhwhpyGT5lmFnzM27V4hKwe3kCmtsExJT1TKKYXDx5hVhHKNL\nFoPOIUEUUwgSaZlimzr5nySlR/sj4rpEdiyiLKTQA0xR4eLua1xtyP74HpqYk2YyV4tr2h2Z8zcv\nkXWJh48+JiszirSiDhMO9k948dWXjPf3qPIKRS2oEBj2h6w2M/yNTxhHNILK8ek9hFafLG/oum0s\nSaEsE9JoR1Gk3F1OEeWKOAmRxRpT89gb70PZsNn6OKKBW5lkWguhykjLmKxKGY32ECuTQkgINktU\nVSLepThtjW6rRTAPiPwtL5bfoOkmYRJS21AVCX5Y4QcfvoW9Vpf1ekFRFKgtHVP1GLZbTOdznI6N\nIOYMXI9351/w6OETdpMp1+/fcjAeIsgmo/2S+eoOuzNg8n7O2fghQRCT+Rs2iw21ZeA4p+Spgmn2\nWE9vsLsuUR7RlAlZWVDUArUsoOstDKWkajQaQeXlm+fsj8esghW9/oD5YkZdZWx3C2RDZxuuOP/2\na8ptyPliRS0bnJ4+JA9qTscPOD//A7/8sx8ziyLsTgvd0Ji/m/HZo0+5Wk7pjo5ISx9PH/L43qe8\n/fqPDNt94rRGsVUu7+7YOzlFzRSSaoOfzclrAbs9QjUcmlogjKIPv5Ena1KhIIl3aFRUtcj1zVu6\n9n8B5SNpHKGLkGcJmqlAUaErNmKj0XG7qLWEgkQcJQwHfco0Yeh6tBybbeLTHQxoRIPh4QGGa5DE\nGVt/xWp5xXT6nqbKiP2QNA9RFJmuO2Tc2SObbLj58jlNmXE7O2d9d0mxTen3D+kOH5KUOpvQZ7GY\nYxgGYZjQ6wxwWx6dTp92d5/JdIWs5KiagFgKGAj02wOC9QqpzOh0PG52c7rH9zAsjyQtkFWVbRgS\nVxWNoNDy+h/0YwWUsUC/u8/RwRNqPH74k79Ctlp88fVvMZV98kRFqmQM2cV1unz8gx9jGA6j3gih\ngbvJFN32mG8iNL3N3uiAJI64ndwwn13z6vwrvnz9ey4nb5iub1gHUzb+HTUCjjNCkWR22zVXt1fs\n4pgorTk8eEhTitzcnSMaCo1moyoepmLhaDqmaHA4uoeYGYzsMWpjkcQ1ptqh1d8jJSZOtgw6A6Jd\nAJLEbOOjWzqiVHD+5hVNWSIBiqDSclq03T0URSfNY55+8gnnb99htTXm2y1B6WMNHbxWF8fQENQG\n2bCZ3N3Q1DV1I/FgfML90xO2iYKmOYi5iNca8O2332JIBi++fEeQlPhVwKsrH8Vq0x2c8fpyjZzD\nYHDEVsiJm5yLq3c0VUUWxgy6XcqywvO6JGFFFMB8vSMsGnZpzGJzx6uvf4vnWDSSjWl3SOIdWbmF\nRqTKoGW7/NPf/wNq2WCUAo7o4BkedzfP2R96SI2Ea7Yps5xPnjxFvgjZrVeIUglyg26ICDG8+3aO\nrjkf5j62znQy5UdPfsr9/kM61ghVUGgo0f7TVaDAfwYhUJQ5WVFgmSa71RJL06lLkdU2IMhiJssZ\nURKxXCyYTGZs1itM06Kua+oiRqhSTLXgdvYtZbNiONynLCHNM2RFxjAtTNtAFERkSaLJCyxBQ5MV\nnFYLTflgaBUlBU3WqOqKtMxBgrwWiJoPuwW7NKbttamqijzPqGsRy3ZQTBe31aPbb3P5/iWzxStG\n3Q4OFpKkMRo+oSgbkrik2+mSJjvGh8co6oi3b24w5DY9b5+DvWMUyWCznXF5ecFgeETa5HQGZxwf\nPiWJV+RlzKg7INklPHv6U54//5amyYmSHaJY49gGhtww6rQxNY06L+k4bXr2kFFnj3Z7gOG1sew2\nedGQ5g2DwQGibBBHKbrqkMU5A6+NZ9mMej1aLZd3z19yNjykjAssRcUzHKqyIU58tttbgs2GB0cf\nUcUQhyU3N1MQamShZDjoo5sq22DBaP8A2+rw5P59VEFkNpvgaAZHB8f0O10O2kO2qwnz5Zr+sE/V\nZKx3lxQ6KO6IXISr21ssx2G+vWa9u6WoKtbbmLQEbzimNTjhLtziun2GTg8j0dheXyMKJYPBKU1u\ncDp4QLwpyGuZ3uCMV6/fI6UhD/YdMkOibCTans1Bd8zsaoaneqiNQrbN6Vh98rhGEyt03SFvLIZ7\nDxBqHVezaVsuaRrx6uo5cdUw7O4h1zJa3bCdLQmTCLc/oGpKsmCFqWgItUBRl8QNHD++jx/MqAFD\nFNGiHUfDA5pSJowi5KrF6d5TPnv6Q4ok46A/ZHJ1g9zIZJuMaBnRaw2Q8oyjdgtR/W7Ev/cQkCQF\nz/FY7zbUTYFjW6TbgCov2Gy31JKK7bRwHAuvazEcHoBYoWoyti6Rhlui3QZdNHHMIe/ev8U0FRRJ\nhaYmCENevznHMGSoSzarFVmW4nkuqioT7HyCLKZyNKS2SdxkxEVGhYCoK2i2SS2I7NIUWZdQJYM4\nyLH1IfcOf4RU2fjzDcu1T1BHlAQslze4RgshTdCDFFeuEIWayfIt/u4GkYZxb8zD+/cRSglbb0Oh\nkqcV4XbL2dED6rgmWex4evQRB8N75GWJYco0QszBgYtAglCHTJbvWK2vyKIVm9kdZV6h6xZNWtB2\nPYK1j6lqGLJKR7cwkXFUl1ary/7xMRngeh69oUeS7+i0HQxVI09TZne3JElIr+ORhRliI6MIOtEu\nI01TECpMU6WuFmiKiGpq7A9PkASRXbhhOp+Q5Fssx0AzRS4vXqOpBgglpgGm2CA2kAQBtu5wcfEN\nAgtMo2bnFxSZiL8M6LgO315cczffkNY151fviPOIdbAmLBM6oyH742c8/uSnxHmAM3QxLJXRrsZb\nVbQcm9fffMO9k2P2Dge0PJ1f/PAztArKaMXHD48oq3Mmdy/ZhTHbfEoc3fDm1dfEuxhbc3BVF7EW\n0GSB3WZN1z5ju4vw4xW3q4DJZINcSYTbmJvZOa2+TpKveP3unB8+/BlGLdH1OvT7Q46P7zGfL6jL\nGt+/QVEb2p1TNnHJ89evUA0R2za5nc5ZNP9Pe2cSa8l51v1fjaeGMw/33HvPHbv7dt/udud2x46d\n8CWExJP4IApRpIgEWZFYsoJFFLGCDXGHYQELNgh2LMKKRAj8kShYNk6Cid0eeh7uPJx5rKpT8/st\nmhhCQpxAsNvy/UnvouqUqv5Hquevd3jqeSfsd/dBsVmZexSbeUrZOZRQkDOySEJGSmSMNEFLJkjJ\niKPtV1k7qdM92CMvVd82Bt91E2gftsjlCgRJiJYz2Nq5R8G2qBQLFIsFUkkhY1gkcUC3vUMYOey3\nXuPWvRdIoj6d1hbzjTLBcIAIBIXiLPfu3kWVUkQk0FSNEycbvPbaKziOQ6lao93v0BkNCEXMwGtR\nLdj0+l1u3b5+/xNXWcOyC0iKgWYIktShns8yOdiilrOpZQv3VxFShziJKM5XGKiHDJMesapizhS5\nO7xLs3ODhYLNdOghSQ6abpDTK/jDMYf3rqNKIKkyhaKFokhkdI2sUaBkm5i6oFjMcPvmy8hJQBxG\n1MoVmp1tbtx+icHoDjkzRstAEExJIo9SNkO5XMXKFVhaWIQk/bct0MsgQhA+WVUjiUOmrk99fhbZ\n0LF1G7frMWr10OSUXveQzdvXKBRjDtqvkdYS5KLB4lKDsTPGzhqoqnq/i5sKgjBCz0pcevSTeJME\n2yqRxgamPUOUGox9SHQZ2VDpjjo0O036wzEzpQaNpWVSJSFjyEh6nqkLvf4hQg3QDQ2RqhTUKkoS\nk83JLM3XyGomkZtiaAYFq4wumbSbLTZ3X0bPx0ROn/z+ERvZPBlC2od9euM+qXA46txEKAEkEAQy\nv/iJx5mOdSK1QmJWmFuok0xlulOP5fNrLJ5fITagUqtRNqocdIacPnWRaTDFsOvMLpwhweWjv/Q4\nkZKjuDzPq9svomZlwiSgPlfm+69+Eys/ixsk5HN1VE1mbm6WxmKdMI7w/YDDgz0aM0vIqCSygi6r\nzOQXOHnpIsWKRiYNufFP38XWQm6++QKrjQJqPGG2WuShM6eQ45Bxu8tyY4mAKaNoij2TpRP23jYG\n33UTWG0s4Y8mxI6Prt3Pjuv3HfJWGV02yWRkHHdCu9NB1XSaXpPXm3cY4uBGDqoEvu+Ss/OoqYqh\n6Cw21tHULK7XJgw7kMD5tbNoQsUZh2Qsm4xdIFQkOk6Le517lBt5zEqewWiAlI7xJkd44x6a0NGk\niNj3scmxe+Nlegf/zKR7g8HBTUw1QVElYiHIlrJk8mV8JCJZQzayoGZA15hMHIgUavosZbPE0d42\nYTIkTCN64wGZvMJR9xpB0ObNa/+K4w4IpjHe1OPqm1dQ0oTQjVhcOIusZHGdAGfiIQuZaRIxcccM\nuz3yqkklm2PiTvA8D01XaLWaADiOi5rRKRSK6IrK7as3yFk2B/e2mOw3sSSV0WCIJEkUChUc1yFT\nsFFNiXa/yeuvvUJjYZ5bd27gBw5x4qNrCtlsls3bt3j9e9/i4plfpFGZY75uszx7CiWukTdrdFsj\nJEml12mTM7PMVmfpew6TSZfepEnL7yMyNpXKEkLPcdjpYhfKoEFn3ObM/EmGvRHNg7tMJi1UQ8Wy\n83iuw2Tk0FiugS7TGve4Nxjzfd/lr29cYTNJsCpVfA92O4cU6hZx0iX0mgTalFdvfZ/htMvO1SYn\n5k7xveevYdk1Lpz+P4hEpj5TxR2P2dy8g8eQYBpwfu1hFucWWajbLMzm+dgv/F/efP02jaVZ+kEX\nq5wj9mPSOGa/36Iyv0K7PcYIVDpHTUZOiwvnNxgOO/jehOlkStGoMmyOcdoO8TjAtExyOnjTI1LX\nQQ4jHr1wgW77iIcvfIBRt4kSC8btLn40IJAEWr5I66hLzSoSdlIq2gJRf/q2Mfium4Cm6oyGIzQ5\ng5JqKNr9/fryuRJRHBLHU1RFpjE/iyxJTMZT8nYRVdLRFItsoUJGy7G4sEIcpGiyztHRDo7joKoZ\nDDNL4nsEToKpZrG0DCg6/cmYu/t3ieSQIHU4ONxjZqZMvlClXp6lVp2DSGLU77K/s4NQHFzbZ5CZ\ncOgP2GltMpl6LCwtcjS6w/zqAvniPLEfkZF08lYed9qkNdglX9UQks6wd4AzvsfuzZdZmp+j33XJ\nGAUiEbPb3AE5wjRtquU54lDG0GYp2DNYhoFtmEiJQuilyJJGlPgQC0q5HO7Uw/WnSLIESYI7mqBl\nNKIkpFabpV4to2gahm0SRzFhEFLM54jCCF0CVdfJV/KoOYuABDWjI6QYXc4wOBjR2+mxXF1gPBny\n5huvYBk63W6TbM6kP+riBT6+N8Qgxh3v4fv3DcxxO9Qrs6hySj4/h6xkkDQZXc4QhCmF4gy2XSKJ\nTbrjCC+asHW0hSSlhCLm+69fobG4QhgF7Ny5B1GEYc3hpzaNsycJNJ9e0qUdtbm3f4O9zg56OYcx\nWyJZLFP68DraaoFSvYhuwtDvEaUjBoM2r1+9zuzKLJ6YYhVyGBmLG9eusrFxAn86xBkPGU067O81\nGQyHRGkCWkIuL7G9dQVnMCIMJhRyGfRMyvmNFSR1SqVkMJ8vI00jTtXPYKQQx12Wlhrcfu37lEoy\n9UaNfr+H5zsoqcBQMpw/uUE08tBSlVq+ijscEYU+KlMSJUIyBFJGZna2gZYaGHoB4ZkkU5UkVlk+\nuYRsysSJgzOIEE4WUzKpFN8DcwJBKDi1cpZ6cR7PASSd8bBH6LpkTIk09iB1CcMpfpBSK5fIWzNo\nVhlJN9je26Y9arPd2qLrtGkPd7EsBUWLGbsusgIZqchscYnV9UcpVir0dt9EuCN6nT1a7RHnznyI\nfL5IGPgkImX38C690QHZQo6B45LJW0zjgFgGcy6PXKmhFrN88MOf4dbWJo7l0Xf6yJGCqtgkPpjC\nJJtbYSw59NoBeb1AySwzSl12Dt+kapQ4X7vAudkPYGaKjIIJUnaOcRpjliwsu3y/B+J5rJ+8RCl3\nijRJkNOAaBowjQOG0ZDAHbBUzjNbqCGpJoftPUaOixe7FJcKXLv7OrLu0h3tEySCnb1dtm6+xqC9\nj6HGdFt7DLstJv6YIPZRTYM7e7dRDJX9gy52foZ+d0K5UGR1fhE5FIhYkCuX+NerbzBMfAIlZqd5\nQH8ywQ/aKClMQx/HdXHTbfw0Ym6mSraQZX5xCS1XIWOZ7O5epzfuM7d6Ai9MUE2dKNRo7u5xZmWZ\nvG5gqQVstUykpQgklEyGjGLSu90ikiXmV+eZX6hRrdRwJx6B72NIGRqNElbBJpUTUiVhdnaOQsam\nOQrZ9WTyM2dIPYO8qnDv1i1SOcJPYh7+4AepZotM3BbBFNZOnOLs6fOcWj3BmdNrRFJArAQsnqqj\nSRajTp/X3vgmA+UmR84d0mlITs6iKQmB1KNaq6Mh0R0ecvpD5+l5DlahQpjxKJUXCcYlVpcbtNpv\nUC5KyEpIGHuYioo72aXXTcgW5wnwGIdTGqVTHN65g5amVKt1FhsL9wuw5NYoZKoknktns0etvEAq\ngTdK3jYG3/U8AdNIyGghaRyQU1ROn/8kd6+/jmXKjKYpuZzJ4bW7fOSXPsl3r77BfPkcWUVm5E7w\ndIu1h36R0WhEGk4wSjkGwyZxBBkhceHsQ+wd7dCoVylVKgz6Pe5efQ0jo4Gu0Vi4wNziMuk0hUhm\nKnwUVaU3GJAqIXGqo+ULqAWLfsshZxfxXRndUkhimW68Tdtro1gm0+6UUTqlUVymPpflYH8f21BZ\nqKwxckNQTMKwRbe9S32mwn5vl3BykxV3SLGwiGGYlKw6Udxh8+5NluZPo+iQK+aYhl1MI48feBTL\nJiNHp1zJMhpKJEqAP3Ao5mYAk9tbm5i5CmUjj5wY7B8cUS4YVAo1MqpB5ewi/VYHU8+REOL7U+YX\nlyjmC7RHfeZXVijXVlAVg/mldW7efIPDTpdrd26RLepotkZ1pkRz3GN9/QJplGBqEtlGjpJVYPfe\nHWRdJ5YSUl3laPM2mgVnVs/SvHeL1RMbjKcxcZxwbv0sd7fuUqhqLFezDHpdpmkIGZMrr75ENV/j\n61/7a3xfoXEqh2orDEd7pLHCneYI08sBMbI0ZnH+NKP+kIXZZTrdLebqZSRDQdey6HJIhphWf0xF\nX6FSB5HvkgQmBTvH2uoZkihhtZRjc3MTRZbI5Szm5uuM200My+Cwu4eLSskwKKomebmEpwo8p0uh\nWuXVrX/hzOIamSSHnhF0ujvYVhlN1+kOpljlGu40YGVmnYM7N9G0FN2u8PGPPUyn2SZbkJhKLkZ2\nytBtIrCpFCwIwvufjXd8FF1CNycYqsek30XRLLZ3NinOz3Dn1lWWTi5Rrs5hKmWO9gesnV9nrMVv\nG4Pvek+gWDBxxj2iaIgIxliahqTExJFJubjIaJiSq67QawdcXH4UW4YodMnZGeYKZXRJxRn00dKQ\ndOIx7Y+ZL5fJaBrusEvWMNg5vMpR+xZJmnBp7cOcmP8gY3eIpCekScywt8XUb7F64ixCLqFnbexc\nHkWRyKsm06HHaOiiawWgxMidcuHDv8y/XP8etbU5bly9ijd2KVaqpER4vsO5cxcIA4exe79moa3Z\nCFLSNKYwM082nyNXLCPEhEIuj6XYiGRKp7/Hhz/yBLKi4kwmgE93cMBg2KFaLTPqDxBxjON4eElK\nHGrYWplBz8UNXNbW1rGyBpKss3vQ5GMf/zSDoYeeCWk376DEKUjQG/QRKdRn5wjDgCB1kJSQ/sE2\n8niImI7Y3b+N53c4tT7D3GKJoTMmW7Tw3DHJ0KO/06ZoVNDi+zUFw6lLMZchiSIKdo310x8lb9eJ\nBVy79wpO6iGbCv3JPrWZMhmtSkgGJIXD7Rbjnsv6uVV0S6E6N49dWqC0sEptoYrj+uzuhSioBHGA\nYkf4fp/Do0NymTxyrPPYww/T73YolVboxw5jhnjpkEncZZr0yNs2iXxEZTElljNEU5dgAufOrdNu\nD9g9OMJxpqiyQFUVZCUlCVX291v4ImSYDhhEA8bemMHAR1d1VFTmchXWKssoQQxSE2dySGNxERSI\nIoGk2FTzZRZrVZLJJulYQlVlmp3ruO4IWVLptrqEQYyqRAR+gCxbtNsTPNciiAOWTyyRnY25uf0G\nO8N9CvNlrt57ncpChVs7dxlMxvjhhDhwkJwpVVUiODwk6/+cTGBlZYUPfOADXLp0iUcffRSAfr/P\nk08+yenTp3nqqacYDodvXf/ss8+ytrbG+vo6//iP//gT7+2PhnjuiChJKVdqOMMdyoUihUKeojLD\n2ZVLzNYXsbIFCpU8plUES8UsFIjcmGQaUimUAJlg4rBSq9FqHeBMR2ztbyMrElauyMSLUNWUzniX\nWOqDCivzs7jDFv2Bg2XUONjZR0qOsDWNaOKTt/NksjlSSaOYz5FEPuVCkaW5R7izdQ3btmk2Xaq5\nOQr5PKPmXbzREXo4xu1sc3b1LFnNIvJGiPEI4QssyyYWMX7SQTcjtEyWbq9J6HmkCDKGiTf1cD0X\n15sQJR5x5DL1HcZOH0WJKJTzpLGOM04plCtMhUQAHHVa2MUsc0vLaLqJNI0RTh9nNEU3Z7HrK4SG\nyfV72xhZg4nr4PiQq9SJ5AyoGn1vwkQEdIcdSsUstmFTyuXYP9wiO1tiMh2zvLBAvbxI6ETsbr7B\nYNymE/UZRjFSpsbCwhqGlqVolSkV1ikUSlh2BTWT5fVrbyJJJltHR+yODskWaywX1tEDg1K+zt7e\nGKfrEDkeWjjEVmN03cQ0stSKCYPx5H5NyRg0zSSftWm1h+xtv8mwuYNBQOB1CaUQL3EJR0MO200w\nbeyCRS5fQUqzSN793A1F0tjZ3uLCxnnOrj9KoTTDNDSRhYHbb3FqYQZkm2yhijtJWGqsMQhDjnr3\niHAplovcavzOQwAAD0xJREFU3rmBnamSNReYJhOieMTm4S5xHJEGIfViBT2C+cYJJF2lmLXwHI+M\nbNEZtvAil+WFDTJ6jv7IJ7U0JuEYLdbZWD/P4swK/c6Q2EnZvLlDdnGdZtBlbf000wQ2zn8EO1NC\nn5aIjxQsNGaW65Tmqjiu+/MxAUmSeP7557ly5Qovv/wyAJcvX+bJJ5/k9u3bPP7441y+fBmA69ev\n87WvfY3r16/z3HPP8Vu/9Vukafpf31zE5HMlDKvIy1f+hd6oTSarEacy5XIF34lQhISUTnH6fTKS\nQA4gcj1kJUbTJdr9QzIZlaxuUbHmaDTOsHc0QEgWR0d9BoMJEgmDUZtDt8OICVEUMOoPKOcLRGGM\noddwXYfW0RFpHFErV5mMB1hZi5WVdcY9mzB0aDVbVAp1Ou27uBOHgm1hqfb9raTDBDmF7d27OJMD\ntjdf4vDwDrqsEbljSlaJcq6OhsZifRlDzRBFPkHUp9W5SXewRRQFDIYHmGaCLPscHOyCbCDrNhnb\nYOyPGLoDirUKp888xMQP0PP6/XXx+Tk0Lc9oNKbf79NuxqQyFGfqHLT7kLHoezof+OATBImGmc3S\nGx2SLStICJJYolyuU8hXkFWF4WhAtVoDwDJNsrqBbRa4t9VEUlMKlToZs0pqmEQZHaVgoxeqaJk8\ni/UG/Z0tTi3VmbgqrUnML3z0l2keDJEVCznRyRp5FpeW2dzfx02n9Nop25u7HB2O6G47aNMUU45I\nZegPO+hGFtvOosgZSFSO9rpk5DyGmWccJNzdbwIJUTBEoOI5CTIKIDMduzj9IaZsIEeQMzLUqmUg\nIfanWMQY8RAzFWQkQdHKMnVSTC3LucoSsidgquA5I8zSIbNz80xjhxdeuk4cjCEa4Tn7WJkcnpMS\npwFCSkmUiJHXxDJy7B3exHMGDH2XKBODXaA5GYCtkylVORrdJpUEaSKwNJ1stUSUDvj+d79Ho7qM\nkdRZWLlIdVFlrz2mI+0jWSlxrPLQ2iNkY4to4DCYRhztjWnfbqLFPyH2fhYTgB+tTfaNb3yDL37x\niwB88Ytf5G//9m8B+PrXv87nP/95NE1jZWWFU6dOvWUcP45UgmKhxrgfUqoski/NIqk5onTAYHhA\nJJpUazVGo11K5Qq2kWO+sk45N89McQkptriw/hi53AxOLAjkLIVqg41LH6JWX0TL5LDMIkHkgiKw\nqkWOhkfMVmeQk5QkDDF0GcfrYmaqlAqLtDseM/U1ZFlhNOrien0Od6bsHww5f+Ec+wfXsNQslewK\nw7aHkmiIMCVJDRJZoTfsMnQdVlc2KGSKqCJBU1Xmag1UTCbDgEF/gEgVGnNrVMuLRElCECaQltC0\nLEGQYhpFsvY8xdIKVr6MpMkY2QKzCysESUirf0BEiGUWqZZXiAKVZmsXWUkwTdjbGtHrtfD8IVHs\noMghaiwzHfoMJx2cyMdNAlrdfUzTZHnxJFM3YDjsUCiUsK0CpUKJg1YbTVHZvbPNTH2OxdV1VtZO\nUq3N84GLj2DrFvPleZZml9ElQaR5/POtl2jGfTaPNlk/uUHOqHK02WU2t4DvhkyjCMfxONjaodlq\nMnvyJNdfPyJn55mrL1AqzvL6jR282GNpIc9MeQbf9WCsc6Z8gbxX5pc++GEWG2WyJZPUzFCcnUG3\nDDKGYDTwGLSnDPoOtpLDd2KGw4BxlNB2fVojl6kf0esOCcOY3qTJ4WSTQA5QtZjET6lXq3R6u9x5\n7VX8QYeaUUH2NRw3JZTv0HN22Lw3IrdUoS9auEoXZxqxtLBOu30E0oQ4buP6dynnbQhGjFsdUs/j\n3t3X0ROVcqZMMh5ysPnP5PQsRXOVmeoKc7VTtHoT2q0JG2fPMertsjC7wInVhxm0b/LRS5/ESyeM\nvAFB1Kc7aoIeI1dkNj7+ISr5BfqHY4bO2+cN/9Q9gSeeeIJHHnmEv/iLvwCg1WpRr9cBqNfrtFot\nAA4PD1lY+PeSRgsLCxwcHPyX9y4WqyRRyvqJ85xZf5QkUdB0GW/q0B/dpV4/SyQUbHsNJS2iYzNr\nzmAEOlIcQRwSTkaIWObMxjqZcoYwckEJiUVIo7FKuTrLyPFIJIHvDNH/7T9pqkK3c0i5MIORMdEt\n8JlSKBcI04DFpROU8xU8t0vgT6nPNbh75yaGBkoKGUWBKKWUmSFv1ymVijjjJqurC4TC597+DSrZ\nLHktz8gLAQ0lNZmZWaE/jPHSiP3WJu3hDVTTwLLzRMKlP2mDBkOvz8Jqg2J+llQV7O7fJWtVGHQn\nKEJgKBKarDDstClVZ2isrKAaCvlihkAKCdIAvZghW8qyfOI0ijlHkpOIMi56tsTM4jqylmEU9HGm\nfTb33sAuqJRrFSRNJqPpCD/m/KnzKEqR2aUVDgYthBRRzNaR1Yj20f1CJGos0KwprcFN9js7LJw+\ny+LJZSIhEUx9hBvxypXXmZmbJwKkOMUd95mtlJlbXMA0MtRqDRpzp1gtLTBn25zbOE1ltkrsHFHJ\nZaiYVXJynubmDuODfbZfuUnq+ViWjKqM0DSfSegw9DxahwNq+VmMTJ68PUsq68wuzDMOJziyT5ik\naHKRSr6KJky8QMaNMkwnE6RUw3X6+MMBvU6LQJ8ybnYJehPySoaZSh1fSgm1AXpGhyRDo7rEUvU0\ntp6nPexSMC2EKqPYKlJW519v/D8CKaAduWzfvkEpWiSrZ4kSKFVq+OGAfElFeAP84R6Oe4gqh5Ty\nGcaDLtXCHKNej6l/j4QKnt9hVbvIYEfh5PKj2HqWKKNgVGxid0wi+dgLBcqLtbeN759qdeCll15i\nbm6OTqfDk08+yfr6+o+YhCT9147zk37r9QYszOSZTAaQzWJmbLxgiqpm6HWPOLNk45GlvjjP/uYW\nyysrjNw21VKJ/qhLtVokJSCRYjrDTYJwykz5HIpkomsSdt7g+vVb6IZCqoRMHJdGvQKxjKJoyLKM\nIksEUw838NB1nSSO6PUPcRyPbK5AfWYRRWmRs0xEGNNpH6GpGsNeixMnTjPqd3ACBz/yCUSMkdHw\nAwdTJAwmI4r5DAU7S94s42cjUnlKksj4QYzv7SCpUwr5WaJYJYpiUuFi5atUynX6vSOE0iYyZKxi\nkSRNkSQZRZLJWjnCMCI2Qraa1yhVqhy295nX50jihCiKSNOESrnIxBmRKDYTx2GmUsbMaKhoZDNl\nHDdgKiVoqoVtlRj0hvRHbWQpIQlCZmpLFKt17h7eQs6rjKdD7mxPSZWA3qDL8upZDg8c7mxvMfFd\n7HyF7a1NrDUDpJg0lcnaFo25JQI3pFIqM+53kISguX0XyzAwTQvhjjg7N8uw16c4a9FPRyCnzC+f\nYn+/TdZUsIp5vFHIhRPzDJwWcmogh1MKts5k6hFMFaRUwRlJROUMU2dMf3CHmeVZOu0ekm0xDQKI\nBW40xLZKKIrGxHVRTZvADzgcbuJOBsgipVKcp98OKeUKeM6Yia8R9npYVpZqrkApV0AJZcLYw4kc\nBuMxumYwP9tgd2eXubkSGVHFVC18X/DwRx5meKtLlKoEg01mSzVC30cz8rS7+yzPrNP2NgmmMXbW\nRDdBKBZ2Nk+cHjFujljML+Ht9hk5AxpLixw2t8mrFiJMqBXniJMAzYioaiUC/6cIcPEz8vu///vi\nj//4j8WZM2fE0dGREEKIw8NDcebMGSGEEM8++6x49tln37r+6aefFt/73vd+6B4bGxsCOG7H7bi9\ng+3jH//4j43pt913wPM8kiQhl8vhui5PPfUUv/d7v8e3vvUtKpUKX/7yl7l8+TLD4ZDLly9z/fp1\nvvCFL/Dyyy9zcHDAE088wd27d39ib+CYY45593jb4UCr1eIzn/kMAHEc8xu/8Rs89dRTPPLII3zu\nc5/jL//yL1lZWeFv/uZvADh37hyf+9znOHfuHKqq8ud//ufHBnDMMQ8w78oORMccc8yDwzueMfjc\nc8+xvr7O2toaX/3qV9/px/9YfvM3f5N6vc6FCxfeOvfzSob632Jvb49PfOITnD9/noceeog/+7M/\ne6B1+77PY489xsWLFzl37hy/+7u/+0Dr/Y8kScKlS5f41Kc+Bbw3NP9M/KwTg/8T4jgWJ0+eFFtb\nWyIMQ7GxsSGuX7/+Tkr4sbzwwgvi1VdfFQ899NBb5770pS+Jr371q0IIIS5fviy+/OUvCyGEuHbt\nmtjY2BBhGIqtrS1x8uRJkSTJO6756OhIXLlyRQghxGQyEadPnxbXr19/oHW7riuEECKKIvHYY4+J\nF1988YHW+wP+5E/+RHzhC18Qn/rUp4QQD/678bPyjprAd77zHfH000+/dfyfVxLeTba2tn7IBM6c\nOSOazaYQ4n7A/WD14ytf+Yq4fPnyW9c9/fTT4rvf/e47K/bH8OlPf1p885vffE/odl1XPPLII+Lq\n1asPvN69vT3x+OOPi29/+9viV3/1V4UQ77134+14R4cDBwcHLC4uvnX8dolE7yY/r2Sod4Lt7W2u\nXLnCY4899kDrTtOUixcvUq/X3xrKPMh6AX7nd36HP/qjP0KW/z1UHnTNPyvvqAm8V1cJ/ifJUP/b\nOI7DZz/7Wf70T/+UXO6Hy0s/aLplWea1115jf3+fF154gX/6wf70/0HPg6T37/7u75iZmeHSpUs/\ndkvvH2h6kDT/d3hHTaDRaLC3t/fW8d7e3g8554NEvV6n2bxfluvo6IiZmRngR//D/v4+jUbjXdEY\nRRGf/exneeaZZ/i1X/s14L2hu1Ao8Cu/8iu88sorD7Te73znO3zjG99gdXWVz3/+83z729/mmWee\neaA1/7d4J8ceURSJEydOiK2tLREEwQMzMSjEj84JfOlLX3prfPfss8/+yORPEARic3NTnDhxQqRp\n+o7rTdNUPPPMM+K3f/u3f+j8g6q70+mIwWAghBDC8zzxsY99THzrW996YPX+Z55//vm35gTeK5p/\nWt5RExBCiL//+78Xp0+fFidPnhRf+cpX3unH/1h+/dd/XczNzQlN08TCwoL4q7/6K9Hr9cTjjz8u\n1tbWxJNPPvnWCyyEEH/wB38gTp48Kc6cOSOee+65d0Xziy++KCRJEhsbG+LixYvi4sWL4h/+4R8e\nWN1vvPGGuHTpktjY2BAXLlwQf/iHfyiEEA+s3v/M888//9bqwHtF80/LcbLQMce8z3nXy4sdc8wx\n7y7HJnDMMe9zjk3gmGPe5xybwDHHvM85NoFjjnmfc2wCxxzzPufYBI455n3OsQkcc8z7nP8P9tCE\nVcMl27kAAAAASUVORK5CYII=\n", + "png": "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\nAAAAAElFTkSuQmCC\n", "text": [ - "" + "" ] } ], - "prompt_number": 9 + "prompt_number": 10 }, { "cell_type": "markdown", @@ -646,7 +831,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 10 + "prompt_number": 11 } ], "metadata": {} diff --git a/examples/imagenet/get_caffe_rcnn_imagenet_model.sh b/examples/imagenet/get_caffe_rcnn_imagenet_model.sh new file mode 100755 index 00000000000..7cd47fa33a6 --- /dev/null +++ b/examples/imagenet/get_caffe_rcnn_imagenet_model.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env sh +# This scripts downloads the Caffe R-CNN ImageNet +# for ILSVRC13 detection. + +MODEL=caffe_rcnn_imagenet_model +CHECKSUM=42c1556d2d47a9128c4a90e0a9c5341c + +if [ -f $MODEL ]; then + echo "Model already exists. Checking md5..." + os=`uname -s` + if [ "$os" = "Linux" ]; then + checksum=`md5sum $MODEL | awk '{ print $1 }'` + elif [ "$os" = "Darwin" ]; then + checksum=`cat $MODEL | md5` + fi + if [ "$checksum" = "$CHECKSUM" ]; then + echo "Model checksum is correct. No need to download." + exit 0 + else + echo "Model checksum is incorrect. Need to download again." + fi +fi + +echo "Downloading..." + +wget --no-check-certificate https://www.dropbox.com/s/0i3etlgmsmgf5ei/$MODEL +echo "Done. Please run this command again to verify that checksum = $CHECKSUM." diff --git a/examples/imagenet/rcnn_imagenet_deploy.prototxt b/examples/imagenet/rcnn_imagenet_deploy.prototxt new file mode 100644 index 00000000000..ef75a0a5e95 --- /dev/null +++ b/examples/imagenet/rcnn_imagenet_deploy.prototxt @@ -0,0 +1,207 @@ +name: "R-CNN-ilsvrc13" +input: "data" +input_dim: 10 +input_dim: 3 +input_dim: 227 +input_dim: 227 +layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + convolution_param { + num_output: 96 + kernel_size: 11 + stride: 4 + } +} +layers { + name: "relu1" + type: RELU + bottom: "conv1" + top: "conv1" +} +layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "norm1" + type: LRN + bottom: "pool1" + top: "norm1" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + name: "conv2" + type: CONVOLUTION + bottom: "norm1" + top: "conv2" + convolution_param { + num_output: 256 + pad: 2 + kernel_size: 5 + group: 2 + } +} +layers { + name: "relu2" + type: RELU + bottom: "conv2" + top: "conv2" +} +layers { + name: "pool2" + type: POOLING + bottom: "conv2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "norm2" + type: LRN + bottom: "pool2" + top: "norm2" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + name: "conv3" + type: CONVOLUTION + bottom: "norm2" + top: "conv3" + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + } +} +layers { + name: "relu3" + type: RELU + bottom: "conv3" + top: "conv3" +} +layers { + name: "conv4" + type: CONVOLUTION + bottom: "conv3" + top: "conv4" + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + group: 2 + } +} +layers { + name: "relu4" + type: RELU + bottom: "conv4" + top: "conv4" +} +layers { + name: "conv5" + type: CONVOLUTION + bottom: "conv4" + top: "conv5" + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + group: 2 + } +} +layers { + name: "relu5" + type: RELU + bottom: "conv5" + top: "conv5" +} +layers { + name: "pool5" + type: POOLING + bottom: "conv5" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "fc6" + type: INNER_PRODUCT + bottom: "pool5" + top: "fc6" + inner_product_param { + num_output: 4096 + } +} +layers { + name: "relu6" + type: RELU + bottom: "fc6" + top: "fc6" +} +layers { + name: "drop6" + type: DROPOUT + bottom: "fc6" + top: "fc6" + dropout_param { + dropout_ratio: 0.5 + } +} +layers { + name: "fc7" + type: INNER_PRODUCT + bottom: "fc6" + top: "fc7" + inner_product_param { + num_output: 4096 + } +} +layers { + name: "relu7" + type: RELU + bottom: "fc7" + top: "fc7" +} +layers { + name: "drop7" + type: DROPOUT + bottom: "fc7" + top: "fc7" + dropout_param { + dropout_ratio: 0.5 + } +} +# R-CNN classification layer made from R-CNN ILSVRC13 SVMs. +layers { + name: "fc-rcnn" + type: INNER_PRODUCT + bottom: "fc7" + top: "fc-rcnn" + inner_product_param { + num_output: 200 + } +} From 186f521348c4f5a2ee91fdf734b5660b1882da25 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 9 Jun 2014 19:46:07 -0700 Subject: [PATCH 0105/2053] edit detection example, include R-CNN NMS --- examples/detection.ipynb | 477 ++++++++++++++++++++------------------- 1 file changed, 250 insertions(+), 227 deletions(-) diff --git a/examples/detection.ipynb b/examples/detection.ipynb index 5fdfc098679..e4eedfef38c 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -19,35 +19,32 @@ "\n", "Let's run detection on an image of a bicyclist riding a fish bike in the desert (from the ImageNet challenge\u2014no joke).\n", "\n", - "First of all, we'll need a little [Python script](https://github.com/sergeyk/selective_search_ijcv_with_python) to make the region proposals by running the Selective Search MATLAB code. If you have your own region proposals prepared, or would rather not bother with this step, [detect.py](https://github.com/BVLC/caffe/blob/master/python/detect.py) accepts a list of images and bounding boxes as CSV.\n", + "First, we'll need region proposals and the Caffe R-CNN ImageNet model:\n", "\n", - "Before you get started with this notebook, make sure to follow [instructions](http://caffe.berkeleyvision.org/getting_pretrained_models.html) for getting the Caffe R-CNN ImageNet model." + "- [Selective Search](http://koen.me/research/selectivesearch/) is the region proposer used by R-CNN. The [selective_search_ijcv_with_python](https://github.com/sergeyk/selective_search_ijcv_with_python) Python module takes care of extracting proposals through the selective search MATLAB implementation. To install it, download the module and name its directory `selective_search_ijcv_with_python`, run the demo in MATLAB to compile the necessary functions, then add it to your `PYTHONPATH` for importing. (If you have your own region proposals prepared, or would rather not bother with this step, [detect.py](https://github.com/BVLC/caffe/blob/master/python/detect.py) accepts a list of images and bounding boxes as CSV.)\n", + "\n", + "- Follow the [model instructions](http://caffe.berkeleyvision.org/getting_pretrained_models.html) to get the Caffe R-CNN ImageNet model.\n", + "\n", + "With that done, we'll call the bundled `detect.py` to generate the region proposals and run the network. For an explanation of the arguments, do `./detect.py --help`." ] }, { "cell_type": "code", "collapsed": false, "input": [ - "!mkdir _temp\n", + "!mkdir -p _temp\n", "!echo `pwd`/images/fish-bike.jpg > _temp/det_input.txt\n", "!../python/detect.py --crop_mode=selective_search --pretrained_model=imagenet/caffe_rcnn_imagenet_model --model_def=imagenet/rcnn_imagenet_deploy.prototxt _temp/det_input.txt _temp/det_output.h5" ], "language": "python", "metadata": {}, "outputs": [ - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "mkdir: cannot create directory `_temp': File exists\r\n" - ] - }, { "output_type": "stream", "stream": "stdout", "text": [ "WARNING: Logging before InitGoogleLogging() is written to STDERR\r\n", - "I0608 20:59:28.978440 28360 net.cpp:36] Initializing net from parameters: \r\n", + "I0609 19:20:40.532173 1915982608 net.cpp:36] Initializing net from parameters: \r\n", "name: \"R-CNN-ilsvrc13\"\r\n", "layers {\r\n", " bottom: \"data\"\r\n", @@ -254,153 +251,165 @@ "input_dim: 3\r\n", "input_dim: 227\r\n", "input_dim: 227\r\n", - "I0608 20:59:28.979029 28360 net.cpp:77] Creating Layer conv1\r\n", - "I0608 20:59:28.979038 28360 net.cpp:87] conv1 <- data\r\n", - "I0608 20:59:28.979045 28360 net.cpp:113] conv1 -> conv1\r\n", - "I0608 20:59:28.979110 28360 net.cpp:128] Top shape: 10 96 55 55 (2904000)\r\n", - "I0608 20:59:28.979120 28360 net.cpp:154] conv1 needs backward computation.\r\n", - "I0608 20:59:28.979128 28360 net.cpp:77] Creating Layer relu1\r\n", - "I0608 20:59:28.979135 28360 net.cpp:87] relu1 <- conv1\r\n", - "I0608 20:59:28.979141 28360 net.cpp:101] relu1 -> conv1 (in-place)\r\n", - "I0608 20:59:28.979148 28360 net.cpp:128] Top shape: 10 96 55 55 (2904000)\r\n", - "I0608 20:59:28.979154 28360 net.cpp:154] relu1 needs backward computation.\r\n", - "I0608 20:59:28.979161 28360 net.cpp:77] Creating Layer pool1\r\n", - "I0608 20:59:28.979167 28360 net.cpp:87] pool1 <- conv1\r\n", - "I0608 20:59:28.979173 28360 net.cpp:113] pool1 -> pool1\r\n", - "I0608 20:59:28.979183 28360 net.cpp:128] Top shape: 10 96 27 27 (699840)\r\n", - "I0608 20:59:28.979190 28360 net.cpp:154] pool1 needs backward computation.\r\n", - "I0608 20:59:28.979198 28360 net.cpp:77] Creating Layer norm1\r\n", - "I0608 20:59:28.979204 28360 net.cpp:87] norm1 <- pool1\r\n", - "I0608 20:59:28.979210 28360 net.cpp:113] norm1 -> norm1\r\n", - "I0608 20:59:28.979218 28360 net.cpp:128] Top shape: 10 96 27 27 (699840)\r\n", - "I0608 20:59:28.979224 28360 net.cpp:154] norm1 needs backward computation.\r\n", - "I0608 20:59:28.979233 28360 net.cpp:77] Creating Layer conv2\r\n", - "I0608 20:59:28.979241 28360 net.cpp:87] conv2 <- norm1\r\n", - "I0608 20:59:28.979248 28360 net.cpp:113] conv2 -> conv2\r\n", - "I0608 20:59:28.979744 28360 net.cpp:128] Top shape: 10 256 27 27 (1866240)\r\n", - "I0608 20:59:28.979755 28360 net.cpp:154] conv2 needs backward computation.\r\n", - "I0608 20:59:28.979764 28360 net.cpp:77] Creating Layer relu2\r\n", - "I0608 20:59:28.979771 28360 net.cpp:87] relu2 <- conv2\r\n", - "I0608 20:59:28.979779 28360 net.cpp:101] relu2 -> conv2 (in-place)\r\n", - "I0608 20:59:28.979786 28360 net.cpp:128] Top shape: 10 256 27 27 (1866240)\r\n", - "I0608 20:59:28.979794 28360 net.cpp:154] relu2 needs backward computation.\r\n", - "I0608 20:59:28.979800 28360 net.cpp:77] Creating Layer pool2\r\n", - "I0608 20:59:28.979806 28360 net.cpp:87] pool2 <- conv2\r\n", - "I0608 20:59:28.979812 28360 net.cpp:113] pool2 -> pool2\r\n", - "I0608 20:59:28.979820 28360 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", - "I0608 20:59:28.979825 28360 net.cpp:154] pool2 needs backward computation.\r\n", - "I0608 20:59:28.979832 28360 net.cpp:77] Creating Layer norm2\r\n", - "I0608 20:59:28.979837 28360 net.cpp:87] norm2 <- pool2\r\n", - "I0608 20:59:28.979843 28360 net.cpp:113] norm2 -> norm2\r\n", - "I0608 20:59:28.979851 28360 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", - "I0608 20:59:28.979857 28360 net.cpp:154] norm2 needs backward computation.\r\n", - "I0608 20:59:28.979864 28360 net.cpp:77] Creating Layer conv3\r\n", - "I0608 20:59:28.979871 28360 net.cpp:87] conv3 <- norm2\r\n", - "I0608 20:59:28.979876 28360 net.cpp:113] conv3 -> conv3\r\n", - "I0608 20:59:28.981308 28360 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", - "I0608 20:59:28.981322 28360 net.cpp:154] conv3 needs backward computation.\r\n", - "I0608 20:59:28.981328 28360 net.cpp:77] Creating Layer relu3\r\n", - "I0608 20:59:28.981334 28360 net.cpp:87] relu3 <- conv3\r\n", - "I0608 20:59:28.981341 28360 net.cpp:101] relu3 -> conv3 (in-place)\r\n", - "I0608 20:59:28.981348 28360 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", - "I0608 20:59:28.981356 28360 net.cpp:154] relu3 needs backward computation.\r\n", - "I0608 20:59:28.981364 28360 net.cpp:77] Creating Layer conv4\r\n", - "I0608 20:59:28.981369 28360 net.cpp:87] conv4 <- conv3\r\n", - "I0608 20:59:28.981375 28360 net.cpp:113] conv4 -> conv4\r\n", - "I0608 20:59:28.982429 28360 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", - "I0608 20:59:28.982441 28360 net.cpp:154] conv4 needs backward computation.\r\n", - "I0608 20:59:28.982449 28360 net.cpp:77] Creating Layer relu4\r\n", - "I0608 20:59:28.982455 28360 net.cpp:87] relu4 <- conv4\r\n", - "I0608 20:59:28.982460 28360 net.cpp:101] relu4 -> conv4 (in-place)\r\n", - "I0608 20:59:28.982467 28360 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", - "I0608 20:59:28.982472 28360 net.cpp:154] relu4 needs backward computation.\r\n", - "I0608 20:59:28.982480 28360 net.cpp:77] Creating Layer conv5\r\n", - "I0608 20:59:28.982486 28360 net.cpp:87] conv5 <- conv4\r\n", - "I0608 20:59:28.982491 28360 net.cpp:113] conv5 -> conv5\r\n", - "I0608 20:59:28.983197 28360 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", - "I0608 20:59:28.983207 28360 net.cpp:154] conv5 needs backward computation.\r\n", - "I0608 20:59:28.983214 28360 net.cpp:77] Creating Layer relu5\r\n", - "I0608 20:59:28.983221 28360 net.cpp:87] relu5 <- conv5\r\n", - "I0608 20:59:28.983227 28360 net.cpp:101] relu5 -> conv5 (in-place)\r\n", - "I0608 20:59:28.983233 28360 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", - "I0608 20:59:28.983239 28360 net.cpp:154] relu5 needs backward computation.\r\n", - "I0608 20:59:28.983247 28360 net.cpp:77] Creating Layer pool5\r\n", - "I0608 20:59:28.983253 28360 net.cpp:87] pool5 <- conv5\r\n", - "I0608 20:59:28.983258 28360 net.cpp:113] pool5 -> pool5\r\n", - "I0608 20:59:28.983265 28360 net.cpp:128] Top shape: 10 256 6 6 (92160)\r\n", - "I0608 20:59:28.983273 28360 net.cpp:154] pool5 needs backward computation.\r\n", - "I0608 20:59:28.983283 28360 net.cpp:77] Creating Layer fc6\r\n", - "I0608 20:59:28.983289 28360 net.cpp:87] fc6 <- pool5\r\n", - "I0608 20:59:28.983295 28360 net.cpp:113] fc6 -> fc6\r\n" + "I0609 19:20:40.533190 1915982608 net.cpp:77] Creating Layer conv1\r\n", + "I0609 19:20:40.533205 1915982608 net.cpp:87] conv1 <- data\r\n", + "I0609 19:20:40.533215 1915982608 net.cpp:113] conv1 -> conv1\r\n", + "I0609 19:20:40.533259 1915982608 net.cpp:128] Top shape: 10 96 55 55 (2904000)\r\n", + "I0609 19:20:40.533267 1915982608 net.cpp:154] conv1 needs backward computation.\r\n", + "I0609 19:20:40.533274 1915982608 net.cpp:77] Creating Layer relu1\r\n", + "I0609 19:20:40.533279 1915982608 net.cpp:87] relu1 <- conv1\r\n", + "I0609 19:20:40.533285 1915982608 net.cpp:101] relu1 -> conv1 (in-place)\r\n", + "I0609 19:20:40.533293 1915982608 net.cpp:128] Top shape: 10 96 55 55 (2904000)\r\n", + "I0609 19:20:40.533299 1915982608 net.cpp:154] relu1 needs backward computation.\r\n", + "I0609 19:20:40.533306 1915982608 net.cpp:77] Creating Layer pool1\r\n", + "I0609 19:20:40.533311 1915982608 net.cpp:87] pool1 <- conv1\r\n", + "I0609 19:20:40.533316 1915982608 net.cpp:113] pool1 -> pool1\r\n", + "I0609 19:20:40.533330 1915982608 net.cpp:128] Top shape: 10 96 27 27 (699840)\r\n", + "I0609 19:20:40.533336 1915982608 net.cpp:154] pool1 needs backward computation.\r\n", + "I0609 19:20:40.533344 1915982608 net.cpp:77] Creating Layer norm1\r\n", + "I0609 19:20:40.533349 1915982608 net.cpp:87] norm1 <- pool1\r\n", + "I0609 19:20:40.533399 1915982608 net.cpp:113] norm1 -> norm1\r\n", + "I0609 19:20:40.533423 1915982608 net.cpp:128] Top shape: 10 96 27 27 (699840)\r\n", + "I0609 19:20:40.533432 1915982608 net.cpp:154] norm1 needs backward computation.\r\n", + "I0609 19:20:40.533442 1915982608 net.cpp:77] Creating Layer conv2\r\n", + "I0609 19:20:40.533447 1915982608 net.cpp:87] conv2 <- norm1\r\n", + "I0609 19:20:40.533452 1915982608 net.cpp:113] conv2 -> conv2\r\n", + "I0609 19:20:40.534168 1915982608 net.cpp:128] Top shape: 10 256 27 27 (1866240)\r\n", + "I0609 19:20:40.534180 1915982608 net.cpp:154] conv2 needs backward computation.\r\n", + "I0609 19:20:40.534188 1915982608 net.cpp:77] Creating Layer relu2\r\n", + "I0609 19:20:40.534193 1915982608 net.cpp:87] relu2 <- conv2\r\n", + "I0609 19:20:40.534199 1915982608 net.cpp:101] relu2 -> conv2 (in-place)\r\n", + "I0609 19:20:40.534205 1915982608 net.cpp:128] Top shape: 10 256 27 27 (1866240)\r\n", + "I0609 19:20:40.534210 1915982608 net.cpp:154] relu2 needs backward computation.\r\n", + "I0609 19:20:40.534216 1915982608 net.cpp:77] Creating Layer pool2\r\n", + "I0609 19:20:40.534221 1915982608 net.cpp:87] pool2 <- conv2\r\n", + "I0609 19:20:40.534227 1915982608 net.cpp:113] pool2 -> pool2\r\n", + "I0609 19:20:40.534235 1915982608 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0609 19:20:40.534240 1915982608 net.cpp:154] pool2 needs backward computation.\r\n", + "I0609 19:20:40.534246 1915982608 net.cpp:77] Creating Layer norm2\r\n", + "I0609 19:20:40.534251 1915982608 net.cpp:87] norm2 <- pool2\r\n", + "I0609 19:20:40.534261 1915982608 net.cpp:113] norm2 -> norm2\r\n", + "I0609 19:20:40.534270 1915982608 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0609 19:20:40.534275 1915982608 net.cpp:154] norm2 needs backward computation.\r\n", + "I0609 19:20:40.534373 1915982608 net.cpp:77] Creating Layer conv3\r\n", + "I0609 19:20:40.534381 1915982608 net.cpp:87] conv3 <- norm2\r\n", + "I0609 19:20:40.534386 1915982608 net.cpp:113] conv3 -> conv3\r\n", + "I0609 19:20:40.536221 1915982608 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0609 19:20:40.536238 1915982608 net.cpp:154] conv3 needs backward computation.\r\n", + "I0609 19:20:40.536247 1915982608 net.cpp:77] Creating Layer relu3\r\n", + "I0609 19:20:40.536252 1915982608 net.cpp:87] relu3 <- conv3\r\n", + "I0609 19:20:40.536258 1915982608 net.cpp:101] relu3 -> conv3 (in-place)\r\n", + "I0609 19:20:40.536264 1915982608 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0609 19:20:40.536269 1915982608 net.cpp:154] relu3 needs backward computation.\r\n", + "I0609 19:20:40.536277 1915982608 net.cpp:77] Creating Layer conv4\r\n", + "I0609 19:20:40.536281 1915982608 net.cpp:87] conv4 <- conv3\r\n", + "I0609 19:20:40.536286 1915982608 net.cpp:113] conv4 -> conv4\r\n", + "I0609 19:20:40.537760 1915982608 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0609 19:20:40.537786 1915982608 net.cpp:154] conv4 needs backward computation.\r\n", + "I0609 19:20:40.537803 1915982608 net.cpp:77] Creating Layer relu4\r\n", + "I0609 19:20:40.537809 1915982608 net.cpp:87] relu4 <- conv4\r\n", + "I0609 19:20:40.537814 1915982608 net.cpp:101] relu4 -> conv4 (in-place)\r\n", + "I0609 19:20:40.537821 1915982608 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0609 19:20:40.537825 1915982608 net.cpp:154] relu4 needs backward computation.\r\n", + "I0609 19:20:40.537832 1915982608 net.cpp:77] Creating Layer conv5\r\n", + "I0609 19:20:40.537837 1915982608 net.cpp:87] conv5 <- conv4\r\n", + "I0609 19:20:40.537842 1915982608 net.cpp:113] conv5 -> conv5\r\n", + "I0609 19:20:40.538887 1915982608 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0609 19:20:40.538899 1915982608 net.cpp:154] conv5 needs backward computation.\r\n", + "I0609 19:20:40.538908 1915982608 net.cpp:77] Creating Layer relu5\r\n", + "I0609 19:20:40.538913 1915982608 net.cpp:87] relu5 <- conv5\r\n", + "I0609 19:20:40.538918 1915982608 net.cpp:101] relu5 -> conv5 (in-place)\r\n", + "I0609 19:20:40.538923 1915982608 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0609 19:20:40.538928 1915982608 net.cpp:154] relu5 needs backward computation.\r\n", + "I0609 19:20:40.538934 1915982608 net.cpp:77] Creating Layer pool5\r\n", + "I0609 19:20:40.538939 1915982608 net.cpp:87] pool5 <- conv5\r\n", + "I0609 19:20:40.538945 1915982608 net.cpp:113] pool5 -> pool5\r\n", + "I0609 19:20:40.538954 1915982608 net.cpp:128] Top shape: 10 256 6 6 (92160)\r\n", + "I0609 19:20:40.538959 1915982608 net.cpp:154] pool5 needs backward computation.\r\n", + "I0609 19:20:40.538965 1915982608 net.cpp:77] Creating Layer fc6\r\n", + "I0609 19:20:40.538970 1915982608 net.cpp:87] fc6 <- pool5\r\n", + "I0609 19:20:40.538975 1915982608 net.cpp:113] fc6 -> fc6\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0609 19:20:40.628031 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0609 19:20:40.628060 1915982608 net.cpp:154] fc6 needs backward computation.\r\n", + "I0609 19:20:40.628075 1915982608 net.cpp:77] Creating Layer relu6\r\n", + "I0609 19:20:40.628082 1915982608 net.cpp:87] relu6 <- fc6\r\n", + "I0609 19:20:40.628089 1915982608 net.cpp:101] relu6 -> fc6 (in-place)\r\n", + "I0609 19:20:40.628096 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0609 19:20:40.628101 1915982608 net.cpp:154] relu6 needs backward computation.\r\n", + "I0609 19:20:40.628109 1915982608 net.cpp:77] Creating Layer drop6\r\n", + "I0609 19:20:40.628114 1915982608 net.cpp:87] drop6 <- fc6\r\n", + "I0609 19:20:40.628119 1915982608 net.cpp:101] drop6 -> fc6 (in-place)\r\n", + "I0609 19:20:40.628136 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0609 19:20:40.628142 1915982608 net.cpp:154] drop6 needs backward computation.\r\n", + "I0609 19:20:40.628149 1915982608 net.cpp:77] Creating Layer fc7\r\n", + "I0609 19:20:40.628154 1915982608 net.cpp:87] fc7 <- fc6\r\n", + "I0609 19:20:40.628160 1915982608 net.cpp:113] fc7 -> fc7\r\n", + "I0609 19:20:40.666213 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0609 19:20:40.666244 1915982608 net.cpp:154] fc7 needs backward computation.\r\n", + "I0609 19:20:40.666255 1915982608 net.cpp:77] Creating Layer relu7\r\n", + "I0609 19:20:40.666261 1915982608 net.cpp:87] relu7 <- fc7\r\n", + "I0609 19:20:40.666267 1915982608 net.cpp:101] relu7 -> fc7 (in-place)\r\n", + "I0609 19:20:40.666273 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0609 19:20:40.666280 1915982608 net.cpp:154] relu7 needs backward computation.\r\n", + "I0609 19:20:40.666286 1915982608 net.cpp:77] Creating Layer drop7\r\n", + "I0609 19:20:40.666290 1915982608 net.cpp:87] drop7 <- fc7\r\n", + "I0609 19:20:40.666296 1915982608 net.cpp:101] drop7 -> fc7 (in-place)\r\n", + "I0609 19:20:40.666302 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0609 19:20:40.666307 1915982608 net.cpp:154] drop7 needs backward computation.\r\n", + "I0609 19:20:40.666314 1915982608 net.cpp:77] Creating Layer fc-rcnn\r\n", + "I0609 19:20:40.666321 1915982608 net.cpp:87] fc-rcnn <- fc7\r\n", + "I0609 19:20:40.666326 1915982608 net.cpp:113] fc-rcnn -> fc-rcnn\r\n", + "I0609 19:20:40.668617 1915982608 net.cpp:128] Top shape: 10 200 1 1 (2000)\r\n", + "I0609 19:20:40.668654 1915982608 net.cpp:154] fc-rcnn needs backward computation.\r\n", + "I0609 19:20:40.668663 1915982608 net.cpp:165] This network produces output fc-rcnn\r\n", + "I0609 19:20:40.668689 1915982608 net.cpp:183] Collecting Learning Rate and Weight Decay.\r\n", + "I0609 19:20:40.668720 1915982608 net.cpp:176] Network initialization done.\r\n", + "I0609 19:20:40.668737 1915982608 net.cpp:177] Memory required for Data 41950840\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "I0608 20:59:29.042397 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0608 20:59:29.042438 28360 net.cpp:154] fc6 needs backward computation.\r\n", - "I0608 20:59:29.042453 28360 net.cpp:77] Creating Layer relu6\r\n", - "I0608 20:59:29.042460 28360 net.cpp:87] relu6 <- fc6\r\n", - "I0608 20:59:29.042498 28360 net.cpp:101] relu6 -> fc6 (in-place)\r\n", - "I0608 20:59:29.042506 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0608 20:59:29.042512 28360 net.cpp:154] relu6 needs backward computation.\r\n", - "I0608 20:59:29.042520 28360 net.cpp:77] Creating Layer drop6\r\n", - "I0608 20:59:29.042526 28360 net.cpp:87] drop6 <- fc6\r\n", - "I0608 20:59:29.042533 28360 net.cpp:101] drop6 -> fc6 (in-place)\r\n", - "I0608 20:59:29.042546 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0608 20:59:29.042551 28360 net.cpp:154] drop6 needs backward computation.\r\n", - "I0608 20:59:29.042559 28360 net.cpp:77] Creating Layer fc7\r\n", - "I0608 20:59:29.042565 28360 net.cpp:87] fc7 <- fc6\r\n", - "I0608 20:59:29.042572 28360 net.cpp:113] fc7 -> fc7\r\n", - "I0608 20:59:29.068634 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0608 20:59:29.068672 28360 net.cpp:154] fc7 needs backward computation.\r\n", - "I0608 20:59:29.068685 28360 net.cpp:77] Creating Layer relu7\r\n", - "I0608 20:59:29.068692 28360 net.cpp:87] relu7 <- fc7\r\n", - "I0608 20:59:29.068729 28360 net.cpp:101] relu7 -> fc7 (in-place)\r\n", - "I0608 20:59:29.068737 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0608 20:59:29.068743 28360 net.cpp:154] relu7 needs backward computation.\r\n", - "I0608 20:59:29.068752 28360 net.cpp:77] Creating Layer drop7\r\n", - "I0608 20:59:29.068758 28360 net.cpp:87] drop7 <- fc7\r\n", - "I0608 20:59:29.068766 28360 net.cpp:101] drop7 -> fc7 (in-place)\r\n", - "I0608 20:59:29.068774 28360 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0608 20:59:29.068780 28360 net.cpp:154] drop7 needs backward computation.\r\n", - "I0608 20:59:29.068789 28360 net.cpp:77] Creating Layer fc-rcnn\r\n", - "I0608 20:59:29.068794 28360 net.cpp:87] fc-rcnn <- fc7\r\n", - "I0608 20:59:29.068800 28360 net.cpp:113] fc-rcnn -> fc-rcnn\r\n", - "I0608 20:59:29.070180 28360 net.cpp:128] Top shape: 10 200 1 1 (2000)\r\n", - "I0608 20:59:29.070194 28360 net.cpp:154] fc-rcnn needs backward computation.\r\n", - "I0608 20:59:29.070199 28360 net.cpp:165] This network produces output fc-rcnn\r\n", - "I0608 20:59:29.070217 28360 net.cpp:183] Collecting Learning Rate and Weight Decay.\r\n", - "I0608 20:59:29.070231 28360 net.cpp:176] Network initialization done.\r\n", - "I0608 20:59:29.070237 28360 net.cpp:177] Memory required for Data 41950840\r\n" + "Loading input...\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "Loading input...\r\n", - "selective_search({'/home/shelhamer/caffe/examples/images/fish-bike.jpg'}, '/tmp/tmpG3fe4u.mat')\r\n" + "selective_search({'/Users/shelhamer/h/desk/caffe/caffe/examples/images/fish-bike.jpg'}, '/var/folders/bk/dtkn5qjd11bd17b2j36zplyw0000gp/T/tmpCk4v4e.mat')\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "Processed 190 windows in 8.631 s.\r\n" + "Processed 190 windows in 14.397 s.\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "/home/shelhamer/anaconda/lib/python2.7/site-packages/pandas/io/pytables.py:2446: PerformanceWarning: \r\n", + "/Users/shelhamer/anaconda/lib/python2.7/site-packages/pandas/io/pytables.py:2446: PerformanceWarning: \r\n", "your performance may suffer as PyTables will pickle object types that it cannot\r\n", "map directly to c-types [inferred_type->mixed,key->block1_values] [items->['prediction']]\r\n", "\r\n", - " warnings.warn(ws, PerformanceWarning)\r\n", - "Saved to _temp/det_output.h5 in 0.057 s.\r\n" + " warnings.warn(ws, PerformanceWarning)\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Saved to _temp/det_output.h5 in 0.068 s.\r\n" ] } ], @@ -410,10 +419,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Running this outputs a DataFrame with the filenames, selected windows, and their ImageNet scores to an HDF5 file.\n", - "(We only ran on one image, so the filenames will all be the same.)\n", + "This run was in CPU mode. For GPU mode detection, call `detect.py` with the `--gpu` argument.\n", "\n", - "This run was in CPU mode. For GPU mode detection, call `detect.py` with the `--gpu` argument." + "Running this outputs a DataFrame with the filenames, selected windows, and their detection scores to an HDF5 file.\n", + "(We only ran on one image, so the filenames will all be the same.)" ] }, { @@ -434,12 +443,12 @@ "stream": "stdout", "text": [ "(190, 5)\n", - "prediction [-2.10395, -2.06288, -2.76946, -2.32455, -1.77...\n", + "prediction [-2.31462, -1.8712, -2.74564, -2.41909, -1.863...\n", "ymin 0\n", "xmin 0\n", "ymax 323\n", "xmax 481\n", - "Name: /home/shelhamer/caffe/examples/images/fish-bike.jpg, dtype: object\n" + "Name: /Users/shelhamer/h/desk/caffe/caffe/examples/images/fish-bike.jpg, dtype: object\n" ] } ], @@ -449,6 +458,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "190 regions were proposed with this light configuration of selective search. The number of proposals will vary from image to image based on its contents and size -- selective search isn't scale invariant. Note that the full R-CNN system's selective search configuration is more exhaustive and generates ~2,000 proposals per image.\n", + "\n", "In general, `detect.py` is most efficient when running on a lot of images: it first extracts window proposals for all of them, batches the windows for efficient GPU processing, and then outputs the results.\n", "Simply list an image per line in the `images_file`, and it will process all of them.\n", "\n", @@ -481,37 +492,37 @@ "stream": "stdout", "text": [ "name\n", - "accordion -2.103952\n", - "airplane -2.062878\n", - "ant -2.769462\n", - "antelope -2.324549\n", - "apple -1.777492\n", - "armadillo -2.152244\n", - "artichoke -2.547566\n", - "axe -1.905112\n", - "baby bed -0.836331\n", - "backpack -1.134832\n", - "bagel -2.133529\n", - "balance beam -2.338049\n", - "banana -1.584361\n", - "band aid -1.468755\n", - "banjo -1.903778\n", + "accordion -2.314622\n", + "airplane -1.871199\n", + "ant -2.745639\n", + "antelope -2.419094\n", + "apple -1.863528\n", + "armadillo -1.965794\n", + "artichoke -2.634531\n", + "axe -1.960974\n", + "baby bed -0.765412\n", + "backpack -1.186638\n", + "bagel -2.278808\n", + "balance beam -2.417408\n", + "banana -1.467084\n", + "band aid -1.598927\n", + "banjo -2.113579\n", "...\n", - "trombone -1.880981\n", - "trumpet -2.182214\n", - "turtle -2.147969\n", - "tv or monitor -1.362767\n", - "unicycle -1.660976\n", - "vacuum -1.484495\n", - "violin -2.158709\n", - "volleyball -2.454174\n", - "waffle iron -1.827833\n", - "washer -2.017761\n", - "water bottle -1.709274\n", - "watercraft -1.742185\n", - "whale -2.385357\n", - "wine bottle -2.493835\n", - "zebra -1.921937\n", + "trombone -1.890996\n", + "trumpet -2.309392\n", + "turtle -1.685296\n", + "tv or monitor -1.517442\n", + "unicycle -1.536263\n", + "vacuum -1.304291\n", + "violin -2.140619\n", + "volleyball -2.413140\n", + "waffle iron -1.830395\n", + "washer -1.806998\n", + "water bottle -1.686736\n", + "watercraft -1.740314\n", + "whale -2.516271\n", + "wine bottle -2.607729\n", + "zebra -1.917919\n", "Name: 0, Length: 200, dtype: float32\n" ] } @@ -542,22 +553,22 @@ "output_type": "pyout", "prompt_number": 4, "text": [ - "" + "" ] }, { "metadata": {}, "output_type": "display_data", "text": [ - "" + "" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\nkBxYsVjE3bt34fP5hLlQ2R8HQPrdWGgB2oZFqdypJOQqlUqIRqOSM+Rll0wmBU7BOebvEC9FZVLu\nraWlJfy0ofvTP/3TP/2p/8Uv0PizP/szRKNRWK1W4fzQ6/XSTW21WrGysoJyuSyE4hqNBk6nU24P\ng8EgnefVahWBQECkigk7J+t+uVzGW2+9hfX1dQwODsJkMiGbzaJer8PpdKKzs1OIvYmlMBgMcgPz\n8NvtdmQyGXR2dopxoReTyWTQ29srmzOZTAr+iB28JycnclvTGPb19QlNZTqdFlf7+PgYpVJJKDDK\n5TLq9ToMBoNUqBgCDQ0NCd6GlBqVSgXFYlEUJqgu2Wq1UC6X5TO8STmnlDBhAym15PmuXq9XCOo1\nGo1KrI8Hz+VyCR8RRREJ93c4HAL+M5lMIlhHwCHXjDLKnF9KBlHvOxQK4b333kN/f7+U8ck77ff7\n5UIhYM5qtSIQCKBUKuHg4ACnp6fyu8FgEHa7XSSi2VG/vb2Njo4O9PT0CHslDT4NIOfF4/HIu5Aj\niQogZIokBcvh4aFgzOjN0FOkioXSoJGXiKX4ZrOJdDqNQCAg3jq9X4ZkBoNB2AdarRYsFgsymYyo\nnHBd2RDLgga/m8b25s2b+DjT8sAlkmlw2BnLsi7/jDIqRqMRhUIBzWYTmUxGLHI8HhdZDpazuch0\nbXnDEiVKzmBKxZCke2dnR7L7c3Nz2N/fVy1+LBYT/e7Ozk4BrW1sbMhtT9Q05UBYpSAClOGhw+GA\nyWSC3W7H6empSkuLHDLsm+FcMDZnDiKXy2F2dhazs7M4Pj7G9evXYTabZdMwZCLVA3WnuBGJAmbu\n6IMPPhCpFHb6p1Ip7O7uyjOQVKpYLKKrq0tkeEnUPjAwIOqahUJBsDRU6jQYDCqZF6ptUCmDhPIG\ng0FCZ61WK/+u0+lQrVbRarXkmZk/IccyjXU6nRYpIPIfU+OMZW29Xi+0niQFq1arqFarMJlM0Ov1\ncDqdKppPyi+TLD4ajYpkjBLCQIK6/f198ZpzuZw0nHJf0Wil02nZr3a7Xf5HD4uMAPwtgg/L5TKy\n2azsbRLzd3d3i3Q014+X1yOPPKIybqenp5IP7e/vx/r6ujwrvamPGw9ceMUudKCdDCUdRblcxt7e\nnkouxWazQavVolqtSmz93nvv4fj4WDbcwcGBivM2n8/DYrFge3tbxXHLZLPNZhNYPQcxQsxxMLma\n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\n7dVe7fW+rv8DcmMMZpJu4MQAAAAASUVORK5CYII=\n", + "png": "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\n", "text": [ - "" + "" ] } ], @@ -586,28 +597,28 @@ "stream": "stdout", "text": [ "name\n", - "bicycle 0.773379\n", - "person 0.545096\n", - "unicycle -0.210110\n", - "motorcycle -0.503959\n", - "table -0.591293\n", - "cart -0.628063\n", + "bicycle 0.800025\n", + "person 0.545095\n", + "unicycle -0.210109\n", + "motorcycle -0.233815\n", + "lizard -0.366079\n", + "cart -0.590633\n", "electric fan -0.664937\n", - "purse -0.674998\n", - "baby bed -0.677444\n", - "plastic bag -0.717950\n", + "purse -0.681369\n", + "baby bed -0.693025\n", + "snowmobile -0.787456\n", "dtype: float32\n" ] } ], - "prompt_number": 6 + "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The positive detections are in fact a bicycle and person.\n", - "Picking good localizations is work in progress; manually, we see that the top and second-best scoring detections correspond to the bicycle and person." + "Picking good localizations is a work in progress; we pick the top-scoring person and bicycle detections." ] }, { @@ -618,7 +629,7 @@ "window_order = pd.Series(predictions_df.values.max(1)).order(ascending=False)\n", "\n", "i = window_order.index[0]\n", - "j = window_order.index[1]\n", + "j = window_order.index[2]\n", "\n", "# Show top predictions for top detection.\n", "f = pd.Series(df['prediction'].iloc[i], index=labels_df['name'])\n", @@ -653,16 +664,29 @@ "text": [ "Top detection:\n", "name\n", - "bicycle 0.773379\n", - "unicycle -0.519379\n", - "scorpion -0.902484\n", - "soccer ball -1.148745\n", - "cart -1.167148\n", - "dtype: float32\n", + "bicycle 0.800025\n", + "unicycle -0.473696\n", + "scorpion -0.932076\n", + "soccer ball -1.147575\n", + "cart -1.187498\n", + "dtype: float32\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "\n", + "Second-best detection:" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ "\n", - "Second-best detection:\n", "name\n", - "person 0.545096\n", + "person 0.545095\n", "swimming trunks -1.098802\n", "plastic bag -1.130418\n", "rubber eraser -1.185333\n", @@ -673,9 +697,9 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 7, + "prompt_number": 6, "text": [ - "" + "" ] }, { @@ -683,11 +707,11 @@ "output_type": "display_data", "png": "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\nbHX31cVsZH5W2dFzGs+/z4fI9PR0eF8mpl2My+bnj9eCs2p2Yl02K/McOCum/UREHP4M/Fq83/ia\n+fuJ5wbwnjbGQHHtuuPsOYNntBln4N3SazfI4nvBQUSWZahrvUb7CCDpWYUW0gvQ4WeaVtGwy5vo\nsiv5evmz8z3gNezuGX6dy9lVodLv3bsXL7744pV+24lNbGITu+bsYx/7GJ588slL/uyqOPCJTWxi\nE5vYP92uWhNzYhOb2MQm9k+ziQOf2MQmNrFr1K64A3/sscdw0003YdeuXXjooYeu9NtfNfvVX/1V\nzM/P47bbbgvfW1hYwJ133ondu3fjF37hF7C0tBR+9ju/8zvYtWsXbrrpJvzlX/7l1bjkd9yOHz+O\nT3ziE7jllltw66234g/+4A8AXN/rUpYl9u/fj7179+Lmm2/GV77yFQDX95qwGWOwb98+fOpTJDkx\nWRMA7gqa1trt2LHDHT161NV17fbs2eOOHDlyJS/hqtn3vvc999xzz7lbb701fO9LX/qSe+ihh5xz\nzj344IPuy1/+snPOuR/96Eduz549rq5rd/ToUbdjxw5njLkq1/1O2unTp93zzz/vnHNudXXV7d69\n2x05cuS6X5fRaOScc65pGrd//3739NNPX/dr4pxzv//7v+/uu+8+96lPfco5N9k/zjl3RSPwZ555\nBjt37sSNN96IOI5xzz334JFHHrmSl3DV7KMf/ShNNOnY4cOHcfDgQQDAwYMH8a1vfQsA8Mgjj+De\ne+9FHMe48cYbsXPnTjzzzDNves1r3TZv3oy9e/cCIGGw973vfTh58uR1vy4stcwcg9nZ2et+TU6c\nOIFHH30Un//85wO07npfE+AKl1BOnjyJG264Ifx/+/btOHny5JW8hJ8qO3v2LObn5wEA8/PzOHv2\nLADg1KlT2L59e/i962Gdjh07hueffx779++/7tfFWou9e/difn4+lJiu9zX54he/iN/7vd9bw46+\n3tcEuMIO/O1YRdezXU6wnn/+/6sNh0N85jOfwVe/+lVMTU2t+dn1uC5SSrzwwgs4ceIEvve97+GJ\nJ55Y8/PrbU2+/e1vY9OmTdi3b99bEluutzVhu6IOfNu2bTh+/Hj4//Hjx9eclNebzc/P48yZMwCA\n06dPY9OmTQDevE4nTpzAtm3brso1vtPWNA0+85nP4P7778enP/1pAJN1YZuZmcHdd9+NZ5999rpe\nkx/84Ac4fPgw3vOe9+Dee+/Fd7/7Xdx///3X9ZqwXVEHfvvtt+OVV17BsWPHUNc1vvnNb+LAgQNX\n8hJ+quzAgQM4dOgQAODQoUPBgR04cADf+MY3UNc1jh49ildeeQV33HHH1bzUd8Scc/i1X/s13Hzz\nzfj1X//18P3reV3Onz8f0BRFUeDxxx/Hvn37rus1eeCBB3D8+HEcPXoU3/jGN/DJT34SX//616/r\nNQl2pbumjz76qNu9e7fbsWOHe+CBB6702181u+eee9yWLVtcHMdu+/bt7uGHH3YXLlxwP/dzP+d2\n7drl7rzzTre4uBh+/7d/+7fdjh073Hvf+1732GOPXcUrf+fs6aefdkIIt2fPHrd37163d+9e953v\nfOe6XpeXXnrJ7du3z+3Zs8fddttt7nd/93edc+66XpOuPfnkkwGFMlkT5yZU+olNbGITu0ZtwsSc\n2MQmNrFr1CYOfGITm9jErlGbOPCJTWxiE7tGbeLAJzaxiU3sGrWJA5/YxCY2sWvUJg58YhOb2MSu\nUZs48IlNbGITu0Zt4sAnNrGJTewatf8Hq9sL34bnPZ4AAAAASUVORK5CYII=\n", "text": [ - "" + "" ] } ], - "prompt_number": 7 + "prompt_number": 6 }, { "cell_type": "markdown", @@ -700,7 +724,7 @@ "cell_type": "code", "collapsed": false, "input": [ - "def nms_detections(dets, overlap=0.5):\n", + "def nms_detections(dets, overlap=0.3):\n", " \"\"\"\n", " Non-maximum suppression: Greedily select high-scoring detections and\n", " skip detections that are significantly covered by a previously\n", @@ -714,63 +738,54 @@ " dets: ndarray\n", " each row is ['xmin', 'ymin', 'xmax', 'ymax', 'score']\n", " overlap: float\n", - " minimum overlap ratio (0.5 default)\n", + " minimum overlap ratio (0.3 default)\n", "\n", " Output\n", " ------\n", " dets: ndarray\n", " remaining after suppression.\n", " \"\"\"\n", - " if np.shape(dets)[0] < 1:\n", - " return dets\n", - "\n", " x1 = dets[:, 0]\n", " y1 = dets[:, 1]\n", " x2 = dets[:, 2]\n", " y2 = dets[:, 3]\n", + " ind = np.argsort(dets[:, 4])\n", "\n", " w = x2 - x1\n", " h = y2 - y1\n", - " area = w * h\n", - "\n", - " s = dets[:, 4]\n", - " ind = np.argsort(s)\n", + " area = (w * h).astype(float)\n", "\n", " pick = []\n", - " counter = 0\n", " while len(ind) > 0:\n", - " last = len(ind) - 1\n", - " i = ind[last]\n", + " i = ind[-1]\n", " pick.append(i)\n", - " counter += 1\n", + " ind = ind[:-1]\n", "\n", - " xx1 = np.maximum(x1[i], x1[ind[:last]])\n", - " yy1 = np.maximum(y1[i], y1[ind[:last]])\n", - " xx2 = np.minimum(x2[i], x2[ind[:last]])\n", - " yy2 = np.minimum(y2[i], y2[ind[:last]])\n", + " xx1 = np.maximum(x1[i], x1[ind])\n", + " yy1 = np.maximum(y1[i], y1[ind])\n", + " xx2 = np.minimum(x2[i], x2[ind])\n", + " yy2 = np.minimum(y2[i], y2[ind])\n", "\n", - " w = np.maximum(0., xx2 - xx1 + 1)\n", - " h = np.maximum(0., yy2 - yy1 + 1)\n", + " w = np.maximum(0., xx2 - xx1)\n", + " h = np.maximum(0., yy2 - yy1)\n", "\n", - " o = w * h / area[ind[:last]]\n", + " wh = w * h\n", + " o = wh / (area[i] + area[ind] - wh)\n", "\n", - " to_delete = np.concatenate(\n", - " (np.nonzero(o > overlap)[0], np.array([last])))\n", - " ind = np.delete(ind, to_delete)\n", + " ind = ind[np.nonzero(o <= overlap)[0]]\n", "\n", " return dets[pick, :]" ], "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 8 + "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "scores = predictions_df['bicycle']\n", - "scores += scores.min()\n", "windows = df[['xmin', 'ymin', 'xmax', 'ymax']].values\n", "dets = np.hstack((windows, scores[:, np.newaxis]))\n", "nms_dets = nms_detections(dets)" @@ -778,7 +793,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 9 + "prompt_number": 24 }, { "cell_type": "markdown", @@ -806,32 +821,40 @@ { "metadata": {}, "output_type": "display_data", - "png": "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\nAAAAAElFTkSuQmCC\n", + "png": "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\ngg==\n", "text": [ - "" + "" ] } ], - "prompt_number": 10 + "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Remove the temp directory to clean up." + "This was an easy instance for bicycle as it was in the class's training set. However, the person result is a true detection since this was not in the set for that class.\n", + "\n", + "You should try out detection on an image of your own next!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(Remove the temp directory to clean up, and we're done.)" ] }, { "cell_type": "code", "collapsed": false, "input": [ - "import shutil\n", - "shutil.rmtree('_temp')" + "!rm -rf _temp" ], "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 11 + "prompt_number": 1 } ], "metadata": {} From 206bf8687244bf21754231569532f9c1af0765c4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 9 Jun 2014 20:43:47 -0700 Subject: [PATCH 0106/2053] make selective search proposals with R-CNN configuration --- python/caffe/detector.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python/caffe/detector.py b/python/caffe/detector.py index b4e96029e98..56c26aefd45 100644 --- a/python/caffe/detector.py +++ b/python/caffe/detector.py @@ -107,7 +107,10 @@ def detect_selective_search(self, image_fnames): import selective_search_ijcv_with_python as selective_search # Make absolute paths so MATLAB can find the files. image_fnames = [os.path.abspath(f) for f in image_fnames] - windows_list = selective_search.get_windows(image_fnames) + windows_list = selective_search.get_windows( + image_fnames, + cmd='selective_search_rcnn' + ) # Run windowed detection on the selective search list. return self.detect_windows(zip(image_fnames, windows_list)) From 9882d47dad8ee3f0b5fa0c0831fdc3355ee3255d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 9 Jun 2014 20:56:19 -0700 Subject: [PATCH 0107/2053] finish R-CNN detection example - run through and save new output - collect region proposals with R-CNN configuration (see sergeyk/selective_search_ijcv_with_python) - call detect.py in GPU mode - fix NMS plotting: X and Y coords were accidentally exchanged. print scores too. --- examples/detection.ipynb | 448 ++++++++++++++++++--------------------- 1 file changed, 212 insertions(+), 236 deletions(-) diff --git a/examples/detection.ipynb b/examples/detection.ipynb index e4eedfef38c..ff0b7a7ba69 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -34,7 +34,7 @@ "input": [ "!mkdir -p _temp\n", "!echo `pwd`/images/fish-bike.jpg > _temp/det_input.txt\n", - "!../python/detect.py --crop_mode=selective_search --pretrained_model=imagenet/caffe_rcnn_imagenet_model --model_def=imagenet/rcnn_imagenet_deploy.prototxt _temp/det_input.txt _temp/det_output.h5" + "!../python/detect.py --crop_mode=selective_search --pretrained_model=imagenet/caffe_rcnn_imagenet_model --model_def=imagenet/rcnn_imagenet_deploy.prototxt --gpu _temp/det_input.txt _temp/det_output.h5" ], "language": "python", "metadata": {}, @@ -44,7 +44,7 @@ "stream": "stdout", "text": [ "WARNING: Logging before InitGoogleLogging() is written to STDERR\r\n", - "I0609 19:20:40.532173 1915982608 net.cpp:36] Initializing net from parameters: \r\n", + "I0610 10:12:49.299607 25530 net.cpp:36] Initializing net from parameters: \r\n", "name: \"R-CNN-ilsvrc13\"\r\n", "layers {\r\n", " bottom: \"data\"\r\n", @@ -251,165 +251,148 @@ "input_dim: 3\r\n", "input_dim: 227\r\n", "input_dim: 227\r\n", - "I0609 19:20:40.533190 1915982608 net.cpp:77] Creating Layer conv1\r\n", - "I0609 19:20:40.533205 1915982608 net.cpp:87] conv1 <- data\r\n", - "I0609 19:20:40.533215 1915982608 net.cpp:113] conv1 -> conv1\r\n", - "I0609 19:20:40.533259 1915982608 net.cpp:128] Top shape: 10 96 55 55 (2904000)\r\n", - "I0609 19:20:40.533267 1915982608 net.cpp:154] conv1 needs backward computation.\r\n", - "I0609 19:20:40.533274 1915982608 net.cpp:77] Creating Layer relu1\r\n", - "I0609 19:20:40.533279 1915982608 net.cpp:87] relu1 <- conv1\r\n", - "I0609 19:20:40.533285 1915982608 net.cpp:101] relu1 -> conv1 (in-place)\r\n", - "I0609 19:20:40.533293 1915982608 net.cpp:128] Top shape: 10 96 55 55 (2904000)\r\n", - "I0609 19:20:40.533299 1915982608 net.cpp:154] relu1 needs backward computation.\r\n", - "I0609 19:20:40.533306 1915982608 net.cpp:77] Creating Layer pool1\r\n", - "I0609 19:20:40.533311 1915982608 net.cpp:87] pool1 <- conv1\r\n", - "I0609 19:20:40.533316 1915982608 net.cpp:113] pool1 -> pool1\r\n", - "I0609 19:20:40.533330 1915982608 net.cpp:128] Top shape: 10 96 27 27 (699840)\r\n", - "I0609 19:20:40.533336 1915982608 net.cpp:154] pool1 needs backward computation.\r\n", - "I0609 19:20:40.533344 1915982608 net.cpp:77] Creating Layer norm1\r\n", - "I0609 19:20:40.533349 1915982608 net.cpp:87] norm1 <- pool1\r\n", - "I0609 19:20:40.533399 1915982608 net.cpp:113] norm1 -> norm1\r\n", - "I0609 19:20:40.533423 1915982608 net.cpp:128] Top shape: 10 96 27 27 (699840)\r\n", - "I0609 19:20:40.533432 1915982608 net.cpp:154] norm1 needs backward computation.\r\n", - "I0609 19:20:40.533442 1915982608 net.cpp:77] Creating Layer conv2\r\n", - "I0609 19:20:40.533447 1915982608 net.cpp:87] conv2 <- norm1\r\n", - "I0609 19:20:40.533452 1915982608 net.cpp:113] conv2 -> conv2\r\n", - "I0609 19:20:40.534168 1915982608 net.cpp:128] Top shape: 10 256 27 27 (1866240)\r\n", - "I0609 19:20:40.534180 1915982608 net.cpp:154] conv2 needs backward computation.\r\n", - "I0609 19:20:40.534188 1915982608 net.cpp:77] Creating Layer relu2\r\n", - "I0609 19:20:40.534193 1915982608 net.cpp:87] relu2 <- conv2\r\n", - "I0609 19:20:40.534199 1915982608 net.cpp:101] relu2 -> conv2 (in-place)\r\n", - "I0609 19:20:40.534205 1915982608 net.cpp:128] Top shape: 10 256 27 27 (1866240)\r\n", - "I0609 19:20:40.534210 1915982608 net.cpp:154] relu2 needs backward computation.\r\n", - "I0609 19:20:40.534216 1915982608 net.cpp:77] Creating Layer pool2\r\n", - "I0609 19:20:40.534221 1915982608 net.cpp:87] pool2 <- conv2\r\n", - "I0609 19:20:40.534227 1915982608 net.cpp:113] pool2 -> pool2\r\n", - "I0609 19:20:40.534235 1915982608 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", - "I0609 19:20:40.534240 1915982608 net.cpp:154] pool2 needs backward computation.\r\n", - "I0609 19:20:40.534246 1915982608 net.cpp:77] Creating Layer norm2\r\n", - "I0609 19:20:40.534251 1915982608 net.cpp:87] norm2 <- pool2\r\n", - "I0609 19:20:40.534261 1915982608 net.cpp:113] norm2 -> norm2\r\n", - "I0609 19:20:40.534270 1915982608 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", - "I0609 19:20:40.534275 1915982608 net.cpp:154] norm2 needs backward computation.\r\n", - "I0609 19:20:40.534373 1915982608 net.cpp:77] Creating Layer conv3\r\n", - "I0609 19:20:40.534381 1915982608 net.cpp:87] conv3 <- norm2\r\n", - "I0609 19:20:40.534386 1915982608 net.cpp:113] conv3 -> conv3\r\n", - "I0609 19:20:40.536221 1915982608 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", - "I0609 19:20:40.536238 1915982608 net.cpp:154] conv3 needs backward computation.\r\n", - "I0609 19:20:40.536247 1915982608 net.cpp:77] Creating Layer relu3\r\n", - "I0609 19:20:40.536252 1915982608 net.cpp:87] relu3 <- conv3\r\n", - "I0609 19:20:40.536258 1915982608 net.cpp:101] relu3 -> conv3 (in-place)\r\n", - "I0609 19:20:40.536264 1915982608 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", - "I0609 19:20:40.536269 1915982608 net.cpp:154] relu3 needs backward computation.\r\n", - "I0609 19:20:40.536277 1915982608 net.cpp:77] Creating Layer conv4\r\n", - "I0609 19:20:40.536281 1915982608 net.cpp:87] conv4 <- conv3\r\n", - "I0609 19:20:40.536286 1915982608 net.cpp:113] conv4 -> conv4\r\n", - "I0609 19:20:40.537760 1915982608 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", - "I0609 19:20:40.537786 1915982608 net.cpp:154] conv4 needs backward computation.\r\n", - "I0609 19:20:40.537803 1915982608 net.cpp:77] Creating Layer relu4\r\n", - "I0609 19:20:40.537809 1915982608 net.cpp:87] relu4 <- conv4\r\n", - "I0609 19:20:40.537814 1915982608 net.cpp:101] relu4 -> conv4 (in-place)\r\n", - "I0609 19:20:40.537821 1915982608 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", - "I0609 19:20:40.537825 1915982608 net.cpp:154] relu4 needs backward computation.\r\n", - "I0609 19:20:40.537832 1915982608 net.cpp:77] Creating Layer conv5\r\n", - "I0609 19:20:40.537837 1915982608 net.cpp:87] conv5 <- conv4\r\n", - "I0609 19:20:40.537842 1915982608 net.cpp:113] conv5 -> conv5\r\n", - "I0609 19:20:40.538887 1915982608 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", - "I0609 19:20:40.538899 1915982608 net.cpp:154] conv5 needs backward computation.\r\n", - "I0609 19:20:40.538908 1915982608 net.cpp:77] Creating Layer relu5\r\n", - "I0609 19:20:40.538913 1915982608 net.cpp:87] relu5 <- conv5\r\n", - "I0609 19:20:40.538918 1915982608 net.cpp:101] relu5 -> conv5 (in-place)\r\n", - "I0609 19:20:40.538923 1915982608 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", - "I0609 19:20:40.538928 1915982608 net.cpp:154] relu5 needs backward computation.\r\n", - "I0609 19:20:40.538934 1915982608 net.cpp:77] Creating Layer pool5\r\n", - "I0609 19:20:40.538939 1915982608 net.cpp:87] pool5 <- conv5\r\n", - "I0609 19:20:40.538945 1915982608 net.cpp:113] pool5 -> pool5\r\n", - "I0609 19:20:40.538954 1915982608 net.cpp:128] Top shape: 10 256 6 6 (92160)\r\n", - "I0609 19:20:40.538959 1915982608 net.cpp:154] pool5 needs backward computation.\r\n", - "I0609 19:20:40.538965 1915982608 net.cpp:77] Creating Layer fc6\r\n", - "I0609 19:20:40.538970 1915982608 net.cpp:87] fc6 <- pool5\r\n", - "I0609 19:20:40.538975 1915982608 net.cpp:113] fc6 -> fc6\r\n" + "I0610 10:12:49.300204 25530 net.cpp:77] Creating Layer conv1\r\n", + "I0610 10:12:49.300214 25530 net.cpp:87] conv1 <- data\r\n", + "I0610 10:12:49.300220 25530 net.cpp:113] conv1 -> conv1\r\n", + "I0610 10:12:49.300283 25530 net.cpp:128] Top shape: 10 96 55 55 (2904000)\r\n", + "I0610 10:12:49.300294 25530 net.cpp:154] conv1 needs backward computation.\r\n", + "I0610 10:12:49.300302 25530 net.cpp:77] Creating Layer relu1\r\n", + "I0610 10:12:49.300308 25530 net.cpp:87] relu1 <- conv1\r\n", + "I0610 10:12:49.300314 25530 net.cpp:101] relu1 -> conv1 (in-place)\r\n", + "I0610 10:12:49.300323 25530 net.cpp:128] Top shape: 10 96 55 55 (2904000)\r\n", + "I0610 10:12:49.300328 25530 net.cpp:154] relu1 needs backward computation.\r\n", + "I0610 10:12:49.300335 25530 net.cpp:77] Creating Layer pool1\r\n", + "I0610 10:12:49.300341 25530 net.cpp:87] pool1 <- conv1\r\n", + "I0610 10:12:49.300348 25530 net.cpp:113] pool1 -> pool1\r\n", + "I0610 10:12:49.300357 25530 net.cpp:128] Top shape: 10 96 27 27 (699840)\r\n", + "I0610 10:12:49.300365 25530 net.cpp:154] pool1 needs backward computation.\r\n", + "I0610 10:12:49.300372 25530 net.cpp:77] Creating Layer norm1\r\n", + "I0610 10:12:49.300379 25530 net.cpp:87] norm1 <- pool1\r\n", + "I0610 10:12:49.300384 25530 net.cpp:113] norm1 -> norm1\r\n", + "I0610 10:12:49.300393 25530 net.cpp:128] Top shape: 10 96 27 27 (699840)\r\n", + "I0610 10:12:49.300400 25530 net.cpp:154] norm1 needs backward computation.\r\n", + "I0610 10:12:49.300406 25530 net.cpp:77] Creating Layer conv2\r\n", + "I0610 10:12:49.300412 25530 net.cpp:87] conv2 <- norm1\r\n", + "I0610 10:12:49.300420 25530 net.cpp:113] conv2 -> conv2\r\n", + "I0610 10:12:49.300925 25530 net.cpp:128] Top shape: 10 256 27 27 (1866240)\r\n", + "I0610 10:12:49.300935 25530 net.cpp:154] conv2 needs backward computation.\r\n", + "I0610 10:12:49.300941 25530 net.cpp:77] Creating Layer relu2\r\n", + "I0610 10:12:49.300947 25530 net.cpp:87] relu2 <- conv2\r\n", + "I0610 10:12:49.300954 25530 net.cpp:101] relu2 -> conv2 (in-place)\r\n", + "I0610 10:12:49.300961 25530 net.cpp:128] Top shape: 10 256 27 27 (1866240)\r\n", + "I0610 10:12:49.300967 25530 net.cpp:154] relu2 needs backward computation.\r\n", + "I0610 10:12:49.300974 25530 net.cpp:77] Creating Layer pool2\r\n", + "I0610 10:12:49.300981 25530 net.cpp:87] pool2 <- conv2\r\n", + "I0610 10:12:49.300987 25530 net.cpp:113] pool2 -> pool2\r\n", + "I0610 10:12:49.300994 25530 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0610 10:12:49.301000 25530 net.cpp:154] pool2 needs backward computation.\r\n", + "I0610 10:12:49.301007 25530 net.cpp:77] Creating Layer norm2\r\n", + "I0610 10:12:49.301013 25530 net.cpp:87] norm2 <- pool2\r\n", + "I0610 10:12:49.301019 25530 net.cpp:113] norm2 -> norm2\r\n", + "I0610 10:12:49.301026 25530 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0610 10:12:49.301033 25530 net.cpp:154] norm2 needs backward computation.\r\n", + "I0610 10:12:49.301041 25530 net.cpp:77] Creating Layer conv3\r\n", + "I0610 10:12:49.301048 25530 net.cpp:87] conv3 <- norm2\r\n", + "I0610 10:12:49.301054 25530 net.cpp:113] conv3 -> conv3\r\n", + "I0610 10:12:49.302455 25530 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0610 10:12:49.302467 25530 net.cpp:154] conv3 needs backward computation.\r\n", + "I0610 10:12:49.302477 25530 net.cpp:77] Creating Layer relu3\r\n", + "I0610 10:12:49.302484 25530 net.cpp:87] relu3 <- conv3\r\n", + "I0610 10:12:49.302490 25530 net.cpp:101] relu3 -> conv3 (in-place)\r\n", + "I0610 10:12:49.302496 25530 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0610 10:12:49.302503 25530 net.cpp:154] relu3 needs backward computation.\r\n", + "I0610 10:12:49.302510 25530 net.cpp:77] Creating Layer conv4\r\n", + "I0610 10:12:49.302515 25530 net.cpp:87] conv4 <- conv3\r\n", + "I0610 10:12:49.302521 25530 net.cpp:113] conv4 -> conv4\r\n", + "I0610 10:12:49.303639 25530 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0610 10:12:49.303650 25530 net.cpp:154] conv4 needs backward computation.\r\n", + "I0610 10:12:49.303658 25530 net.cpp:77] Creating Layer relu4\r\n", + "I0610 10:12:49.303663 25530 net.cpp:87] relu4 <- conv4\r\n", + "I0610 10:12:49.303670 25530 net.cpp:101] relu4 -> conv4 (in-place)\r\n", + "I0610 10:12:49.303676 25530 net.cpp:128] Top shape: 10 384 13 13 (648960)\r\n", + "I0610 10:12:49.303683 25530 net.cpp:154] relu4 needs backward computation.\r\n", + "I0610 10:12:49.303691 25530 net.cpp:77] Creating Layer conv5\r\n", + "I0610 10:12:49.303697 25530 net.cpp:87] conv5 <- conv4\r\n", + "I0610 10:12:49.303704 25530 net.cpp:113] conv5 -> conv5\r\n", + "I0610 10:12:49.304410 25530 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0610 10:12:49.304420 25530 net.cpp:154] conv5 needs backward computation.\r\n", + "I0610 10:12:49.304427 25530 net.cpp:77] Creating Layer relu5\r\n", + "I0610 10:12:49.304433 25530 net.cpp:87] relu5 <- conv5\r\n", + "I0610 10:12:49.304440 25530 net.cpp:101] relu5 -> conv5 (in-place)\r\n", + "I0610 10:12:49.304446 25530 net.cpp:128] Top shape: 10 256 13 13 (432640)\r\n", + "I0610 10:12:49.304471 25530 net.cpp:154] relu5 needs backward computation.\r\n", + "I0610 10:12:49.304478 25530 net.cpp:77] Creating Layer pool5\r\n", + "I0610 10:12:49.304484 25530 net.cpp:87] pool5 <- conv5\r\n", + "I0610 10:12:49.304491 25530 net.cpp:113] pool5 -> pool5\r\n", + "I0610 10:12:49.304498 25530 net.cpp:128] Top shape: 10 256 6 6 (92160)\r\n", + "I0610 10:12:49.304504 25530 net.cpp:154] pool5 needs backward computation.\r\n", + "I0610 10:12:49.304512 25530 net.cpp:77] Creating Layer fc6\r\n", + "I0610 10:12:49.304517 25530 net.cpp:87] fc6 <- pool5\r\n", + "I0610 10:12:49.304523 25530 net.cpp:113] fc6 -> fc6\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "I0609 19:20:40.628031 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0609 19:20:40.628060 1915982608 net.cpp:154] fc6 needs backward computation.\r\n", - "I0609 19:20:40.628075 1915982608 net.cpp:77] Creating Layer relu6\r\n", - "I0609 19:20:40.628082 1915982608 net.cpp:87] relu6 <- fc6\r\n", - "I0609 19:20:40.628089 1915982608 net.cpp:101] relu6 -> fc6 (in-place)\r\n", - "I0609 19:20:40.628096 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0609 19:20:40.628101 1915982608 net.cpp:154] relu6 needs backward computation.\r\n", - "I0609 19:20:40.628109 1915982608 net.cpp:77] Creating Layer drop6\r\n", - "I0609 19:20:40.628114 1915982608 net.cpp:87] drop6 <- fc6\r\n", - "I0609 19:20:40.628119 1915982608 net.cpp:101] drop6 -> fc6 (in-place)\r\n", - "I0609 19:20:40.628136 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0609 19:20:40.628142 1915982608 net.cpp:154] drop6 needs backward computation.\r\n", - "I0609 19:20:40.628149 1915982608 net.cpp:77] Creating Layer fc7\r\n", - "I0609 19:20:40.628154 1915982608 net.cpp:87] fc7 <- fc6\r\n", - "I0609 19:20:40.628160 1915982608 net.cpp:113] fc7 -> fc7\r\n", - "I0609 19:20:40.666213 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0609 19:20:40.666244 1915982608 net.cpp:154] fc7 needs backward computation.\r\n", - "I0609 19:20:40.666255 1915982608 net.cpp:77] Creating Layer relu7\r\n", - "I0609 19:20:40.666261 1915982608 net.cpp:87] relu7 <- fc7\r\n", - "I0609 19:20:40.666267 1915982608 net.cpp:101] relu7 -> fc7 (in-place)\r\n", - "I0609 19:20:40.666273 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0609 19:20:40.666280 1915982608 net.cpp:154] relu7 needs backward computation.\r\n", - "I0609 19:20:40.666286 1915982608 net.cpp:77] Creating Layer drop7\r\n", - "I0609 19:20:40.666290 1915982608 net.cpp:87] drop7 <- fc7\r\n", - "I0609 19:20:40.666296 1915982608 net.cpp:101] drop7 -> fc7 (in-place)\r\n", - "I0609 19:20:40.666302 1915982608 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", - "I0609 19:20:40.666307 1915982608 net.cpp:154] drop7 needs backward computation.\r\n", - "I0609 19:20:40.666314 1915982608 net.cpp:77] Creating Layer fc-rcnn\r\n", - "I0609 19:20:40.666321 1915982608 net.cpp:87] fc-rcnn <- fc7\r\n", - "I0609 19:20:40.666326 1915982608 net.cpp:113] fc-rcnn -> fc-rcnn\r\n", - "I0609 19:20:40.668617 1915982608 net.cpp:128] Top shape: 10 200 1 1 (2000)\r\n", - "I0609 19:20:40.668654 1915982608 net.cpp:154] fc-rcnn needs backward computation.\r\n", - "I0609 19:20:40.668663 1915982608 net.cpp:165] This network produces output fc-rcnn\r\n", - "I0609 19:20:40.668689 1915982608 net.cpp:183] Collecting Learning Rate and Weight Decay.\r\n", - "I0609 19:20:40.668720 1915982608 net.cpp:176] Network initialization done.\r\n", - "I0609 19:20:40.668737 1915982608 net.cpp:177] Memory required for Data 41950840\r\n" + "I0610 10:12:49.364333 25530 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0610 10:12:49.364372 25530 net.cpp:154] fc6 needs backward computation.\r\n", + "I0610 10:12:49.364387 25530 net.cpp:77] Creating Layer relu6\r\n", + "I0610 10:12:49.364420 25530 net.cpp:87] relu6 <- fc6\r\n", + "I0610 10:12:49.364429 25530 net.cpp:101] relu6 -> fc6 (in-place)\r\n", + "I0610 10:12:49.364437 25530 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0610 10:12:49.364444 25530 net.cpp:154] relu6 needs backward computation.\r\n", + "I0610 10:12:49.364455 25530 net.cpp:77] Creating Layer drop6\r\n", + "I0610 10:12:49.364461 25530 net.cpp:87] drop6 <- fc6\r\n", + "I0610 10:12:49.364467 25530 net.cpp:101] drop6 -> fc6 (in-place)\r\n", + "I0610 10:12:49.364480 25530 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0610 10:12:49.364487 25530 net.cpp:154] drop6 needs backward computation.\r\n", + "I0610 10:12:49.364495 25530 net.cpp:77] Creating Layer fc7\r\n", + "I0610 10:12:49.364501 25530 net.cpp:87] fc7 <- fc6\r\n", + "I0610 10:12:49.364507 25530 net.cpp:113] fc7 -> fc7\r\n", + "I0610 10:12:49.391316 25530 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0610 10:12:49.391350 25530 net.cpp:154] fc7 needs backward computation.\r\n", + "I0610 10:12:49.391361 25530 net.cpp:77] Creating Layer relu7\r\n", + "I0610 10:12:49.391369 25530 net.cpp:87] relu7 <- fc7\r\n", + "I0610 10:12:49.391377 25530 net.cpp:101] relu7 -> fc7 (in-place)\r\n", + "I0610 10:12:49.391384 25530 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0610 10:12:49.391391 25530 net.cpp:154] relu7 needs backward computation.\r\n", + "I0610 10:12:49.391398 25530 net.cpp:77] Creating Layer drop7\r\n", + "I0610 10:12:49.391427 25530 net.cpp:87] drop7 <- fc7\r\n", + "I0610 10:12:49.391433 25530 net.cpp:101] drop7 -> fc7 (in-place)\r\n", + "I0610 10:12:49.391440 25530 net.cpp:128] Top shape: 10 4096 1 1 (40960)\r\n", + "I0610 10:12:49.391446 25530 net.cpp:154] drop7 needs backward computation.\r\n", + "I0610 10:12:49.391454 25530 net.cpp:77] Creating Layer fc-rcnn\r\n", + "I0610 10:12:49.391459 25530 net.cpp:87] fc-rcnn <- fc7\r\n", + "I0610 10:12:49.391466 25530 net.cpp:113] fc-rcnn -> fc-rcnn\r\n", + "I0610 10:12:49.392812 25530 net.cpp:128] Top shape: 10 200 1 1 (2000)\r\n", + "I0610 10:12:49.392823 25530 net.cpp:154] fc-rcnn needs backward computation.\r\n", + "I0610 10:12:49.392829 25530 net.cpp:165] This network produces output fc-rcnn\r\n", + "I0610 10:12:49.392850 25530 net.cpp:183] Collecting Learning Rate and Weight Decay.\r\n", + "I0610 10:12:49.392868 25530 net.cpp:176] Network initialization done.\r\n", + "I0610 10:12:49.392875 25530 net.cpp:177] Memory required for Data 41950840\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "Loading input...\r\n" + "GPU mode\r\n", + "Loading input...\r\n", + "selective_search_rcnn({'/home/shelhamer/caffe/examples/images/fish-bike.jpg'}, '/tmp/tmpo7yOum.mat')\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "selective_search({'/Users/shelhamer/h/desk/caffe/caffe/examples/images/fish-bike.jpg'}, '/var/folders/bk/dtkn5qjd11bd17b2j36zplyw0000gp/T/tmpCk4v4e.mat')\r\n" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Processed 190 windows in 14.397 s.\r\n" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "/Users/shelhamer/anaconda/lib/python2.7/site-packages/pandas/io/pytables.py:2446: PerformanceWarning: \r\n", + "Processed 1570 windows in 35.012 s.\r\n", + "/home/shelhamer/anaconda/lib/python2.7/site-packages/pandas/io/pytables.py:2446: PerformanceWarning: \r\n", "your performance may suffer as PyTables will pickle object types that it cannot\r\n", "map directly to c-types [inferred_type->mixed,key->block1_values] [items->['prediction']]\r\n", "\r\n", - " warnings.warn(ws, PerformanceWarning)\r\n" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "Saved to _temp/det_output.h5 in 0.068 s.\r\n" + " warnings.warn(ws, PerformanceWarning)\r\n", + "Saved to _temp/det_output.h5 in 0.035 s.\r\n" ] } ], @@ -419,7 +402,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This run was in CPU mode. For GPU mode detection, call `detect.py` with the `--gpu` argument.\n", + "This run was in GPU mode. For CPU mode detection, call `detect.py` without the `--gpu` argument.\n", "\n", "Running this outputs a DataFrame with the filenames, selected windows, and their detection scores to an HDF5 file.\n", "(We only ran on one image, so the filenames will all be the same.)" @@ -442,13 +425,13 @@ "output_type": "stream", "stream": "stdout", "text": [ - "(190, 5)\n", - "prediction [-2.31462, -1.8712, -2.74564, -2.41909, -1.863...\n", - "ymin 0\n", - "xmin 0\n", - "ymax 323\n", - "xmax 481\n", - "Name: /Users/shelhamer/h/desk/caffe/caffe/examples/images/fish-bike.jpg, dtype: object\n" + "(1570, 5)\n", + "prediction [-2.64547, -2.88455, -2.85903, -3.17038, -1.92...\n", + "ymin 79.846\n", + "xmin 9.62\n", + "ymax 246.31\n", + "xmax 339.624\n", + "Name: /home/shelhamer/caffe/examples/images/fish-bike.jpg, dtype: object\n" ] } ], @@ -458,7 +441,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "190 regions were proposed with this light configuration of selective search. The number of proposals will vary from image to image based on its contents and size -- selective search isn't scale invariant. Note that the full R-CNN system's selective search configuration is more exhaustive and generates ~2,000 proposals per image.\n", + "1570 regions were proposed with the R-CNN configuration of selective search. The number of proposals will vary from image to image based on its contents and size -- selective search isn't scale invariant.\n", "\n", "In general, `detect.py` is most efficient when running on a lot of images: it first extracts window proposals for all of them, batches the windows for efficient GPU processing, and then outputs the results.\n", "Simply list an image per line in the `images_file`, and it will process all of them.\n", @@ -492,37 +475,37 @@ "stream": "stdout", "text": [ "name\n", - "accordion -2.314622\n", - "airplane -1.871199\n", - "ant -2.745639\n", - "antelope -2.419094\n", - "apple -1.863528\n", - "armadillo -1.965794\n", - "artichoke -2.634531\n", - "axe -1.960974\n", - "baby bed -0.765412\n", - "backpack -1.186638\n", - "bagel -2.278808\n", - "balance beam -2.417408\n", - "banana -1.467084\n", - "band aid -1.598927\n", - "banjo -2.113579\n", + "accordion -2.645470\n", + "airplane -2.884554\n", + "ant -2.859026\n", + "antelope -3.170383\n", + "apple -1.924201\n", + "armadillo -2.493925\n", + "artichoke -2.235427\n", + "axe -2.378177\n", + "baby bed -2.757855\n", + "backpack -2.160120\n", + "bagel -2.715738\n", + "balance beam -2.716172\n", + "banana -2.418939\n", + "band aid -1.604563\n", + "banjo -2.329196\n", "...\n", - "trombone -1.890996\n", - "trumpet -2.309392\n", - "turtle -1.685296\n", - "tv or monitor -1.517442\n", - "unicycle -1.536263\n", - "vacuum -1.304291\n", - "violin -2.140619\n", - "volleyball -2.413140\n", - "waffle iron -1.830395\n", - "washer -1.806998\n", - "water bottle -1.686736\n", - "watercraft -1.740314\n", - "whale -2.516271\n", - "wine bottle -2.607729\n", - "zebra -1.917919\n", + "trombone -2.531519\n", + "trumpet -2.382109\n", + "turtle -2.378510\n", + "tv or monitor -2.777433\n", + "unicycle -2.263807\n", + "vacuum -1.894700\n", + "violin -2.797967\n", + "volleyball -2.807812\n", + "waffle iron -2.418155\n", + "washer -2.429423\n", + "water bottle -2.163465\n", + "watercraft -2.803971\n", + "whale -3.094172\n", + "wine bottle -2.830827\n", + "zebra -2.791829\n", "Name: 0, Length: 200, dtype: float32\n" ] } @@ -553,22 +536,22 @@ "output_type": "pyout", "prompt_number": 4, "text": [ - "" + "" ] }, { "metadata": {}, "output_type": "display_data", "text": [ - "" + "" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\n", + "png": "iVBORw0KGgoAAAANSUhEUgAAALMAAAOoCAYAAACa7cU2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvUmMZOlVPX5ifjHPc2RG5FiZlVWVNXTbbptu1G0MeGNA\nFpK9MBaYBbCyZFnemgWDF5YYhYQFkjcMYgFGgK2WjWQ3zdBtV1XXkFVZOcc8zy8iXkzvv6j/uc7C\nwM9UFoZK1Se1XJXOihcR73v3u/fcc8416Lqu48V6sc7BMv5vv4EX68V6VuvFZn6xzs16sZlfrHOz\nXmzmF+vcrBeb+cU6N+vFZn6xzs06F5v5G9/4BjY2NrC2toYvfelL/yPXyGQyuHLlCq5du4b3ve99\nAIBms4mPfOQjWF9fx0/+5E+i3W4/9ev/0i/9EqLRKC5fviw/+69e/7d+67ewtraGjY0NvPnmm8/s\nml/84heRSqVw7do1XLt2DV//+tef2TVzuRxef/11bG1t4dKlS/i93/u9Z/s59ed8TadTfWVlRT86\nOtLH47G+vb2t7+zsPPPrZDIZvdFoPPGzz3/+8/qXvvQlXdd1/bd/+7f1L3zhC0/9+t/5znf0mzdv\n6pcuXfp/vv79+/f17e1tfTwe60dHR/rKyoo+m82eyTW/+MUv6l/+8pd/4HefxTVLpZJ+69YtXdd1\nvdfr6evr6/rOzs4z+5zPfWR+5513sLq6ikwmA4vFgk984hP42te+9j9yLf3f9Zf+9m//Fp/+9KcB\nAJ/+9KfxN3/zN0/92q+++ir8fv8P9fpf+9rX8MlPfhIWiwWZTAarq6t45513nsk1gR/8nM/qmrFY\nDFevXgUAuFwubG5uolAoPLPP+dxv5kKhgIWFBfl7KpVCoVB45tcxGAz4iZ/4Cbz00kv4yle+AgCo\nVCqIRqMAgGg0ikql8kyv+Z+9frFYRCqVkt971p/593//97G9vY3PfOYzcuQ/62seHx/j1q1beP/7\n3//MPudzv5kNBsOP5Dpvv/02bt26ha9//ev4wz/8Q7z11ls/8D7+J9/L/+v1n9W1f/VXfxVHR0e4\nffs24vE4Pve5zz3za/b7fXz84x/H7/7u78Ltdv/Aaz7t53zuN3MymUQul5O/53K5J57mZ7Xi8TgA\nIBwO4+d+7ufwzjvvIBqNolwuAwBKpRIikcgzveZ/9vr//jPn83kkk8lncs1IJCIb6pd/+ZflWH9W\n15xMJvj4xz+OT33qU/jZn/1ZAM/ucz73m/mll17C3t4ejo+PMR6P8Zd/+Zf42Mc+9kyvMRgM0Ov1\nAACqquLNN9/E5cuX8bGPfQxf/epXAQBf/epX5eY8q/Wfvf7HPvYx/MVf/AXG4zGOjo6wt7cnCMtZ\nV6lUkj//9V//tSAdz+Kauq7jM5/5DC5evIjPfvaz8vNn9jn/W+Xo/9H1D//wD/r6+rq+srKi/+Zv\n/uYzf/3Dw0N9e3tb397e1re2tuQajUZD//CHP6yvra3pH/nIR/RWq/XU1/jEJz6hx+Nx3WKx6KlU\nSv/TP/3T//L1f+M3fkNfWVnRL1y4oH/jG994Jtf8kz/5E/1Tn/qUfvnyZf3KlSv6z/zMz+jlcvmZ\nXfOtt97SDQaDvr29rV+9elW/evWq/vWvf/2ZfU6Drr+ggL5Y52M9N2nGj6Ix8mI93+u5iMyz2QwX\nLlzAN7/5TSSTSbz88sv48z//c2xubv5vv7UX6//Qei4i84+yMfJiPb/rudjMP6rGyIv1fK/nYjP/\nqBojL9bzvcz/22/gh1k/TGPE4XBgOBz+qN/ai/WMl9frfWr24XNRAE6nU1y4cAHf+ta3kEgk8L73\nve8HCkCDwYBf+IVfQDAYxGAwgKqqcLvdmE6nWFhYQL/fR6/Xw3A4RKVSQTqdxmw2Q6VSgcPhwNra\nGgaDAZrNJgBgPB7DZDJhMpnAaDRiMplga2sL2WwWdrsdmqbh29/+Nj784Q9jOp3C6/WiXC7DZDJh\nNpvB4XBgNBrB7/ej3+/DbDZD13XM53PE43H0ej1YrVa43W7kcjkYDAYMBgOk02moqopyuQyj0YiT\nkxNcvnwZ5XIZtVoNGxsb6Pf70HUdm5ub2N/fh8vlQr/fx2w2g8lkwmg0gsViQTgcxmAwQKfTwdLS\nEiaTCfx+P/b396FpGlKpFE5OTuByuWAwGBAIBHB8fIxQKIRAIIBvfetbePXVV1EoFBAKhTAej1Gr\n1ZBIJDCZTLCwsIDJZIKdnR1cvHgRJycnWFhYgMViwf379xEMBuF2u6HrOur1OgBgOBzCbrdjMpkg\nmUzi4OAAyWQSFosFqqrij/7oj/5DotMPs56LyGw2m/EHf/AH+Kmf+inMZjN85jOf+Q+RjHA4jPl8\njnQ6jXfffRfRaBSTyQSz2QyapsHn8yEYDMJiscBsNsNkMkHTNKytraHT6UBRFFitVnQ6HWQyGeRy\n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\nLADwHmTDz5IewE+8aGDMzMsI1YnsSqVS5sAOhUL2dzG7o4tAH82OCWaNiAe6GHiOgEUuh4Q7YvJl\nwUIySbqR5MSfgZGAymRgTVzwCJyg4iFeSDEF3aGFip/xz22nye/+7u8qmUzq4cOH9u++9rWv6d69\ne3rjjTf0m7/5m5aOI0lf//rXtbGxoc3NTX33u9+1f//ee+/p4cOH2tjY0B/90R/9f/6d/MDa7bb1\n/hUKBcOKyWujgBJGChE5DFexWFSv19P+/r7tItL1fFiv128IzyEunIuD4xKDJm4USIHxeGxySela\n7wAzhuQTPyL4LMwmqAGMHWgLR7p0jRdjFJVk9wGyQ5CoooYjpIURgRhfxFd0nUDoYDYIhUJGhVNI\nxB0F+SpGWu4IkiyQ5vj4WHNzc1a1zEj2qs//2mL+nd/5HX3nO9+58e9+5Vd+RU+fPtUHH3ygO3fu\n6Otf/7ok6dmzZ/r7v/97PXv2TN/5znf01a9+1UD53//939df/dVfaWtrS1tbW//lz3Q+dFhHo1HT\n3CKvZBfEvkN6JqUw7BoEsjCHsutxUUokEqbZZaxIp9MmNo/FYkYJx+NxE7VDM0Opo1E+PT1Vo9Gw\nUSMQCJhACGJGkqnfqPjF7eHUNCAHBRlBh+F0gYNz8zNBpLSzs2PqP4osgTFpiSUqjH4Vonfn5ubM\n3wipAurCBoOJls+DnRuZa7FY1LvvvnurNfe/tpi/+MUv/pe83S996Uu2y33+8583T9s//MM/6Mtf\n/rJcLpeWl5e1vr6ud955xySQn/vc5yRJv/3bv61vfetb/+3f6ewZuXPnjoWTSDIyIxQKWbxtIpHQ\n+vq6JRDBhqVSKSUSCZN1UsIDtUzdLk4Q0n24nLGrETbD1+DxeOxFAknw+Xx67bXXbJflzwmFQspk\nMgqHw5Z/HI/HrSmLeC0yo1GfYenCBhUOh027jV4b+hu9Cg4WcplzuZzZrMh3RhYQCATMTMBYwqxP\nzoezEg34kNRUskww+zICplIpra6u3mrN/T+D5r75zW/qy1/+sqTr4/jtt9+2/wbc5XK5bohPstms\nyuXyf/tn1ut12znL5bLtmIwbCG1wP7x48cLmRxqhOP6Bn2D1iMP1+/2q1+s2Q87Pz9tsKsmIEq/X\nq06no2AwaFAZlimOVZwrtVpNmUxG5XLZwl5Y2LCWlKfncjltb29bEQ4j1NTUlO22hUJBmUzGcjgu\n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\nfve7eu+99yRJd+/eNXfSs/Xft85O5s95/fnPf9bQ0JC+973v2dcWFxefojuurq7q5s2bun79uq5f\nv673339fkrSxsaGbN2/q+eef1+Liov7617/q+PhY3/nOd7S4uKgrV67oV7/6lSRpeXlZX/3qV3Xj\nxg3dvHnTYsh++9vfanFxUdeuXdPLL7/8T/zL/wXLOVuf6/r1r3/t/OhHP/pPX3/y5Ilz+fJlx3Ec\np9VqOZ1Ox3Ecx3n06JFz48YNx3Ec55e//KXzi1/8wnEcxzk+PnZ2dnacDz/80PnSl75k36fZbDqO\n4zivvPKKs7S05DiO4/ztb39zXnnlFcdxHGdxcdEpFotPvbZX11mZ8TkvpoD/1To4OND3v/99ffzx\nx+rv79fS0pIk6cUXX9Sbb76pw8NDvfbaa7p69arm5ua0srKiH/zgB3r11Vf15S9/Wbu7u3r//ff1\njW9846nvKUkvvfSSvv3tb+uNN97Q66+//vn8kf8u61/9NPX6+tOf/uTcvHnzP33dfTL/7Gc/c378\n4x87juM43W7XGRgYsNdtbGw477zzjnPt2jXn3XffdRzHcXZ3d53f//73zmuvvea8+eabzvb2tpNK\npf6/v8MHH3zg/PSnP3Wmp6edra2t/84/799qndXMn/N65ZVXtL+/r3feece+dufOHa2trdn/3t7e\nVjKZlCS9++675iCfz+cVi8X01ltv6a233tKtW7cswu3111/X22+/rY8++kjBYFAzMzP63e9+J+mk\n6bxz546kk1r6xRdf1M9//nPFYrFTk3n+rde/+mn637CKxaLzxhtvOHNzc86lS5ecr33ta87S0pKz\nuLjoOI7jLC0tOVeuXHGuXr3q/OQnP3GCwaDjOI7zm9/8xrl8+bLz/PPPOzdv3nRWV1edjz/+2Hnh\nhReca9euOdeuXXP++Mc/Oo5zctJ/5Stfca5eveo899xzzttvv+04juO8/vrrzuLionP58mXnhz/8\n4b/mDfgnrTNuxtnqmXVWZpytnllnm/ls9cw628xnq2fW2WY+Wz2zzjbz2eqZdbaZz1bPrLPNfLZ6\nZp1t5rPVM+s/AIIOk5coA2g1AAAAAElFTkSuQmCC\n", "text": [ - "" + "" ] } ], @@ -597,16 +580,16 @@ "stream": "stdout", "text": [ "name\n", - "bicycle 0.800025\n", - "person 0.545095\n", - "unicycle -0.210109\n", - "motorcycle -0.233815\n", - "lizard -0.366079\n", - "cart -0.590633\n", - "electric fan -0.664937\n", - "purse -0.681369\n", - "baby bed -0.693025\n", - "snowmobile -0.787456\n", + "person 1.883164\n", + "bicycle 0.936994\n", + "unicycle 0.016907\n", + "banjo 0.013019\n", + "motorcycle -0.024704\n", + "electric fan -0.193420\n", + "turtle -0.243857\n", + "cart -0.289637\n", + "lizard -0.307945\n", + "baby bed -0.582180\n", "dtype: float32\n" ] } @@ -617,7 +600,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The positive detections are in fact a bicycle and person.\n", + "The top detections are in fact a person and bicycle.\n", "Picking good localizations is a work in progress; we pick the top-scoring person and bicycle detections." ] }, @@ -625,11 +608,9 @@ "cell_type": "code", "collapsed": false, "input": [ - "# Find, print, and display max detection.\n", - "window_order = pd.Series(predictions_df.values.max(1)).order(ascending=False)\n", - "\n", - "i = window_order.index[0]\n", - "j = window_order.index[2]\n", + "# Find, print, and display the top detections: person and bicycle.\n", + "i = predictions_df['person'].argmax()\n", + "j = predictions_df['bicycle'].argmax()\n", "\n", "# Show top predictions for top detection.\n", "f = pd.Series(df['prediction'].iloc[i], index=labels_df['name'])\n", @@ -664,33 +645,20 @@ "text": [ "Top detection:\n", "name\n", - "bicycle 0.800025\n", - "unicycle -0.473696\n", - "scorpion -0.932076\n", - "soccer ball -1.147575\n", - "cart -1.187498\n", - "dtype: float32\n" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ - "\n", - "Second-best detection:" - ] - }, - { - "output_type": "stream", - "stream": "stdout", - "text": [ + "person 1.883164\n", + "swimming trunks -1.136701\n", + "rubber eraser -1.251888\n", + "plastic bag -1.286928\n", + "snowmobile -1.304962\n", + "dtype: float32\n", "\n", + "Second-best detection:\n", "name\n", - "person 0.545095\n", - "swimming trunks -1.098802\n", - "plastic bag -1.130418\n", - "rubber eraser -1.185333\n", - "tie -1.195762\n", + "bicycle 0.936994\n", + "unicycle -0.372841\n", + "scorpion -0.812350\n", + "lobster -1.041506\n", + "lamp -1.118889\n", "dtype: float32\n" ] }, @@ -699,15 +667,15 @@ "output_type": "pyout", "prompt_number": 6, "text": [ - "" + "" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\nbHX31cVsZH5W2dFzGs+/z4fI9PR0eF8mpl2My+bnj9eCs2p2Yl02K/McOCum/UREHP4M/Fq83/ia\n+fuJ5wbwnjbGQHHtuuPsOYNntBln4N3SazfI4nvBQUSWZahrvUb7CCDpWYUW0gvQ4WeaVtGwy5vo\nsiv5evmz8z3gNezuGX6dy9lVodLv3bsXL7744pV+24lNbGITu+bsYx/7GJ588slL/uyqOPCJTWxi\nE5vYP92uWhNzYhOb2MQm9k+ziQOf2MQmNrFr1K64A3/sscdw0003YdeuXXjooYeu9NtfNfvVX/1V\nzM/P47bbbgvfW1hYwJ133ondu3fjF37hF7C0tBR+9ju/8zvYtWsXbrrpJvzlX/7l1bjkd9yOHz+O\nT3ziE7jllltw66234g/+4A8AXN/rUpYl9u/fj7179+Lmm2/GV77yFQDX95qwGWOwb98+fOpTJDkx\nWRMA7gqa1trt2LHDHT161NV17fbs2eOOHDlyJS/hqtn3vvc999xzz7lbb701fO9LX/qSe+ihh5xz\nzj344IPuy1/+snPOuR/96Eduz549rq5rd/ToUbdjxw5njLkq1/1O2unTp93zzz/vnHNudXXV7d69\n2x05cuS6X5fRaOScc65pGrd//3739NNPX/dr4pxzv//7v+/uu+8+96lPfco5N9k/zjl3RSPwZ555\nBjt37sSNN96IOI5xzz334JFHHrmSl3DV7KMf/ShNNOnY4cOHcfDgQQDAwYMH8a1vfQsA8Mgjj+De\ne+9FHMe48cYbsXPnTjzzzDNves1r3TZv3oy9e/cCIGGw973vfTh58uR1vy4stcwcg9nZ2et+TU6c\nOIFHH30Un//85wO07npfE+AKl1BOnjyJG264Ifx/+/btOHny5JW8hJ8qO3v2LObn5wEA8/PzOHv2\nLADg1KlT2L59e/i962Gdjh07hueffx779++/7tfFWou9e/difn4+lJiu9zX54he/iN/7vd9bw46+\n3tcEuMIO/O1YRdezXU6wnn/+/6sNh0N85jOfwVe/+lVMTU2t+dn1uC5SSrzwwgs4ceIEvve97+GJ\nJ55Y8/PrbU2+/e1vY9OmTdi3b99bEluutzVhu6IOfNu2bTh+/Hj4//Hjx9eclNebzc/P48yZMwCA\n06dPY9OmTQDevE4nTpzAtm3brso1vtPWNA0+85nP4P7778enP/1pAJN1YZuZmcHdd9+NZ5999rpe\nkx/84Ac4fPgw3vOe9+Dee+/Fd7/7Xdx///3X9ZqwXVEHfvvtt+OVV17BsWPHUNc1vvnNb+LAgQNX\n8hJ+quzAgQM4dOgQAODQoUPBgR04cADf+MY3UNc1jh49ildeeQV33HHH1bzUd8Scc/i1X/s13Hzz\nzfj1X//18P3reV3Onz8f0BRFUeDxxx/Hvn37rus1eeCBB3D8+HEcPXoU3/jGN/DJT34SX//616/r\nNQl2pbumjz76qNu9e7fbsWOHe+CBB6702181u+eee9yWLVtcHMdu+/bt7uGHH3YXLlxwP/dzP+d2\n7drl7rzzTre4uBh+/7d/+7fdjh073Hvf+1732GOPXcUrf+fs6aefdkIIt2fPHrd37163d+9e953v\nfOe6XpeXXnrJ7du3z+3Zs8fddttt7nd/93edc+66XpOuPfnkkwGFMlkT5yZU+olNbGITu0ZtwsSc\n2MQmNrFr1CYOfGITm9jErlGbOPCJTWxiE7tGbeLAJzaxiU3sGrWJA5/YxCY2sWvUJg58YhOb2MSu\nUZs48IlNbGITu0Zt4sAnNrGJTewatf8Hq9sL34bnPZ4AAAAASUVORK5CYII=\n", + "png": "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\n77fWWvu9733P7t6925ZlaQ8ePGi3b99u67q+JNf9dtrx48ftSy+9ZK21dnV11e7atcseOHDgsl+X\nwWBgrbW2qip7yy232GefffayXxNrrf385z9v77nnHvuxj33MWjvaP9Zae1Ej8Oeeew47duzAtm3b\nEIYh7rrrLjzxxBMX8xIumX3gAx8gRZOW7d+/H/fddx8A4L777sPjjz8OAHjiiSdw9913IwxDbNu2\nDTt27MBzzz130a/57baNGzdibm4OABGDvfe978X8/Pxlvy5MtcwzBlNTU5f9mhw9ehRPPvkkfv3X\nf91D6y73NQEucgllfn4eV1xxhf/31q1bMT8/fzEv4afKFhYWMDs7CwCYnZ3FwsICAODYsWPYunWr\n/73LYZ0OHTqEl156Cbfccstlvy7GGMzNzWF2dtaXmC73Nfmt3/otfO5zn/NYcWC0f4CL7MB/0lTR\n5WztwYgL/fz/V+v3+/jkJz+JRx55BGNjY2t+djmui5QSL7/8Mo4ePYpvfvObeOaZZ9b8/HJbky9/\n+cuYmZnBnj17LjjYcrmtCdtFdeBbtmzBkSNH/L+PHDmy5qS83Gx2dhYnTpwAABw/fhwzMzMAzl2n\no0ePYsuWLZfkGt9uq6oKn/zkJ3HvvffiE5/4BIDRurBNTEzgzjvvxAsvvHBZr8m3v/1t7N+/H+95\nz3tw991342tf+xruvffey3pN2C6qA7/xxhvx2muv4dChQyjLEo899hj27t17MS/hp8r27t2Lffv2\nAQD27dvnHdjevXvxpS99CWVZ4uDBg3jttddw8803X8pLfVvMWotf+7Vfw9VXX43f/M3f9N+/nNfl\n1KlTHk2RZRmefvpp7Nmz57JekwceeABHjhzBwYMH8aUvfQkf+tCH8MUvfvGyXhNvF7tr+uSTT9pd\nu3bZ7du32wceeOBiv/0ls7vuustu2rTJhmFot27dah999FF7+vRp++EPf9ju3LnT3n777XZpacn/\n/u/93u/Z7du32yuvvNI+9dRTl/DK3z579tlnrRDC7t69287Nzdm5uTn7la985bJel1dffdXu2bPH\n7t6921533XX293//96219rJek7Z9/etf9yiU0ZpYOxqlH9nIRjayd6iNJjFHNrKRjewdaiMHPrKR\njWxk71AbOfCRjWxkI3uH2siBj2xkIxvZO9RGDnxkIxvZyN6hNnLgIxvZyEb2DrWRAx/ZyEY2sneo\njRz4yEY2spG9Q+3/AULZeneOI2OUAAAAAElFTkSuQmCC\n", "text": [ - "" + "" ] } ], @@ -779,7 +747,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 19 + "prompt_number": 7 }, { "cell_type": "code", @@ -793,13 +761,13 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 24 + "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Show top 3 NMS'd detections for 'bicycle' in the image." + "Show top 3 NMS'd detections for 'bicycle' in the image and note the gap between the top scoring box (red) and the remaining boxes." ] }, { @@ -811,23 +779,31 @@ "colors = ['r', 'b', 'y']\n", "for c, det in zip(colors, nms_dets[:3]):\n", " currentAxis.add_patch(\n", - " Rectangle((det[0], det[1]), det[2], det[3],\n", + " Rectangle((det[0], det[1]), det[2]-det[0], det[3]-det[1],\n", " fill=False, edgecolor=c, linewidth=5)\n", - " )" + " )\n", + "print 'scores:', nms_dets[:3, 4]" ], "language": "python", "metadata": {}, "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "scores: [ 0.93699419 -0.65612102 -1.32907355]\n" + ] + }, { "metadata": {}, "output_type": "display_data", - "png": "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\ngg==\n", + "png": "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\n", "text": [ - "" + "" ] } ], - "prompt_number": 25 + "prompt_number": 10 }, { "cell_type": "markdown", @@ -854,7 +830,7 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 1 + "prompt_number": 10 } ], "metadata": {} From 36edcbd87437843fe4b90095bdca01d1055399ad Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 10 Jun 2014 11:35:08 -0700 Subject: [PATCH 0108/2053] fix clang compilation problem w/ DummyDataLayer --- src/caffe/layers/dummy_data_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/dummy_data_layer.cpp b/src/caffe/layers/dummy_data_layer.cpp index 8925772f3a5..58044f4c952 100644 --- a/src/caffe/layers/dummy_data_layer.cpp +++ b/src/caffe/layers/dummy_data_layer.cpp @@ -75,7 +75,7 @@ void DummyDataLayer::SetUp(const vector*>& bottom, (*top)[i]->Reshape(num, channels, height, width); } // Run Forward once, with refill_ inverted, to fill the constant Blobs. - Forward(bottom, top); + this->Forward(bottom, top); // Invert the inverted refill_ values to refill the desired (non-constant) // Blobs in every usual forward pass. for (int i = 0; i < refill_.size(); ++i) { From 9241c68540329aa26323f85bd00fd356e47379ab Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 10 Jun 2014 14:46:53 -0700 Subject: [PATCH 0109/2053] groom install docs - make OS X boost compilation more clear - make punctuation more sincere --- docs/installation.md | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index b84ae3b83e4..1d2c77ec35b 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -21,8 +21,8 @@ Caffe depends on several software packages. * [OpenCV](http://opencv.org/). * [Boost](http://www.boost.org/) (we have only tested 1.55) * `glog`, `gflags`, `protobuf`, `leveldb`, `snappy`, `hdf5` -* For the python wrapper - * `python`, `numpy (>= 1.7)`, Boost-provided `boost.python` +* For the Python wrapper + * `Python`, `numpy (>= 1.7)`, boost-provided `boost.python` * For the MATLAB wrapper * MATLAB with the `mex` compiler. @@ -48,8 +48,7 @@ The choice is yours: ### Python and/or Matlab wrappers (optional) -This is only a requirement if you'd like the Python wrapper for Caffe. -The main required package is `numpy`, and `Boost` (in "Other dependencies" below) must be compiled with Python support. +Python: The main requirements are `numpy` and `boost.python` (provided by boost). `pandas` is useful too and needed for some examples. For **OS X**, we highly recommend using the [Anaconda](https://store.continuum.io/cshop/anaconda/) Python distribution, which provides most of the necessary packages, as well as the `hdf5` library dependency. If you don't, please use Homebrew -- but beware of potential linking errors! @@ -58,7 +57,7 @@ Note that if you use the **Ubuntu** default python, you will need to `apt-get in pip install -r /path/to/caffe/python/requirements.txt -If you would like to have the MATLAB wrapper, install MATLAB, and make sure that its `mex` is in your `$PATH`. +MATLAB: install MATLAB, and make sure that its `mex` is in your `$PATH`. ### The rest of the dependencies @@ -99,12 +98,12 @@ In other `ENV` settings, things may not work as expected. #### 10.8-specific Instructions -Simply run the following. +Simply run the following: - brew install --build-from-source boost + brew install --build-from-source --with-python boost for x in snappy leveldb protobuf gflags glog szip homebrew/science/opencv; do brew install $x; done -Building boost from source is needed to link against your local python (exceptions might be raised during some OS X installs, but **ignore** these and continue). +Building boost from source is needed to link against your local Python (exceptions might be raised during some OS X installs, but **ignore** these and continue). If you do not need the Python wrapper, simply doing `brew install boost` is fine. **Note** that the HDF5 dependency is provided by Anaconda Python in this case. If you're not using Anaconda, include `hdf5` in the list above. @@ -139,18 +138,17 @@ To edit the formulae in turn, run After this, run - for x in snappy leveldb protobuf gflags glog szip boost homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; done + for x in snappy leveldb protobuf gflags glog szip homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; done + brew install --build-from-source --with-python --fresh -vd boost + +**Note** that `brew install --build-from-source --fresh -vd boost` is fine if you do not need the Caffe Python wrapper. **Note** that the HDF5 dependency is provided by Anaconda Python in this case. If you're not using Anaconda, include `hdf5` in the list above. -**Note** that in order to build the caffe python wrappers you must install boost using the --with-python option: - - brew install --build-from-source --with-python --fresh -vd boost - #### Windows -There is an unofficial Windows port of Caffe at [niuzhiheng/caffe:windows](https://github.com/niuzhiheng/caffe). Thanks [@niuzhiheng](https://github.com/niuzhiheng). +There is an unofficial Windows port of Caffe at [niuzhiheng/caffe:windows](https://github.com/niuzhiheng/caffe). Thanks [@niuzhiheng](https://github.com/niuzhiheng)! ## Compilation @@ -165,9 +163,9 @@ The defaults should work, but uncomment the relevant lines if using Anaconda Pyt Note that if there is no GPU in your machine, building and running CPU-only works, but GPU tests will naturally fail. -To compile the python and MATLAB wrappers do `make pycaffe` and `make matcaffe` respectively. -Be sure to set your MATLAB and python paths in `Makefile.config` first! -For Python support, you must add the compiled module to your `PYTHONPATH` (as `/path/to/caffe/python` or the like). +To compile the Python and MATLAB wrappers do `make pycaffe` and `make matcaffe` respectively. +Be sure to set your MATLAB and Python paths in `Makefile.config` first! +For Python support, you must add the compiled module to your `$PYTHONPATH` (as `/path/to/caffe/python` or the like). *Distribution*: run `make distribute` to create a `distribute` directory with all the Caffe headers, compiled libraries, binaries, etc. needed for distribution to other machines. From 300f770ac018edad95d582137945d6a643433236 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 11 Jun 2014 09:55:54 -0700 Subject: [PATCH 0110/2053] drop learning rates and decays from deploy model --- examples/imagenet/imagenet_deploy.prototxt | 32 ---------------------- 1 file changed, 32 deletions(-) diff --git a/examples/imagenet/imagenet_deploy.prototxt b/examples/imagenet/imagenet_deploy.prototxt index fbff3adbe18..4e494f420b5 100644 --- a/examples/imagenet/imagenet_deploy.prototxt +++ b/examples/imagenet/imagenet_deploy.prototxt @@ -9,10 +9,6 @@ layers { type: CONVOLUTION bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 convolution_param { num_output: 96 kernel_size: 11 @@ -52,10 +48,6 @@ layers { type: CONVOLUTION bottom: "norm1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 convolution_param { num_output: 256 pad: 2 @@ -96,10 +88,6 @@ layers { type: CONVOLUTION bottom: "norm2" top: "conv3" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 convolution_param { num_output: 384 pad: 1 @@ -117,10 +105,6 @@ layers { type: CONVOLUTION bottom: "conv3" top: "conv4" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 convolution_param { num_output: 384 pad: 1 @@ -139,10 +123,6 @@ layers { type: CONVOLUTION bottom: "conv4" top: "conv5" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 convolution_param { num_output: 256 pad: 1 @@ -172,10 +152,6 @@ layers { type: INNER_PRODUCT bottom: "pool5" top: "fc6" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 inner_product_param { num_output: 4096 } @@ -200,10 +176,6 @@ layers { type: INNER_PRODUCT bottom: "fc6" top: "fc7" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 inner_product_param { num_output: 4096 } @@ -228,10 +200,6 @@ layers { type: INNER_PRODUCT bottom: "fc7" top: "fc8" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 inner_product_param { num_output: 1000 } From 8dc270e691cb15e540c1b5ac074774163bc6faf1 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 10 Jun 2014 15:01:41 -0700 Subject: [PATCH 0111/2053] pycaffe: leave grayscale images gray according to arg --- python/caffe/io.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/python/caffe/io.py b/python/caffe/io.py index 0bd2f812bec..1fc97231ca6 100644 --- a/python/caffe/io.py +++ b/python/caffe/io.py @@ -5,19 +5,24 @@ from caffe.proto import caffe_pb2 -def load_image(filename): +def load_image(filename, color=True): """ Load an image converting from grayscale or alpha as needed. Take filename: string + color: flag for color format. True (default) loads as RGB while False + loads as intensity (if image is already grayscale). Give - image: an image of size (H x W x 3) with RGB channels of type uint8. + image: an image with type np.float32 of size (H x W x 3) in RGB or + of size (H x W x 1) in grayscale. """ img = skimage.img_as_float(skimage.io.imread(filename)).astype(np.float32) if img.ndim == 2: - img = np.tile(img[:, :, np.newaxis], (1, 1, 3)) + img = img[:, :, np.newaxis] + if color: + img = np.tile(img, (1, 1, 3)) elif img.shape[2] == 4: img = img[:, :, :3] return img From 6a5b2c19c75dd9f6965ca9a377164bf8b6c96688 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 25 May 2014 23:49:51 -0700 Subject: [PATCH 0112/2053] save from python for net surgery 0. Scheme desired parameters. 1. Do surgery on the net through `net.params['name'][idx].data[...] = `. 2. Save post-operation net params by `net.save('fname')`. Handwoven deep nets, anyone? --- python/caffe/_caffe.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 9f190096ace..e9fe5cd3b05 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -224,6 +224,13 @@ struct CaffeNet { PyArray_DIMS(data_arr)[0]); } + // save the network weights to binary proto for net surgeries. + void save(string filename) { + NetParameter net_param; + net_->ToProto(&net_param, false); + WriteProtoToBinaryFile(net_param, filename.c_str()); + } + // The caffe::Caffe utility functions. void set_mode_cpu() { Caffe::set_mode(Caffe::CPU); } void set_mode_gpu() { Caffe::set_mode(Caffe::GPU); } @@ -315,7 +322,8 @@ BOOST_PYTHON_MODULE(_caffe) { .add_property("layers", &CaffeNet::layers) .add_property("inputs", &CaffeNet::inputs) .add_property("outputs", &CaffeNet::outputs) - .def("_set_input_arrays", &CaffeNet::set_input_arrays); + .def("_set_input_arrays", &CaffeNet::set_input_arrays) + .def("save", &CaffeNet::save); boost::python::class_( "Blob", boost::python::no_init) From f0ee675e2ef3e5519e43e903d86570ca634a0f5d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 11 Jun 2014 09:57:07 -0700 Subject: [PATCH 0113/2053] define fully-convolutional imagenet model --- examples/imagenet/imagenet_full_conv.prototxt | 215 ++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 examples/imagenet/imagenet_full_conv.prototxt diff --git a/examples/imagenet/imagenet_full_conv.prototxt b/examples/imagenet/imagenet_full_conv.prototxt new file mode 100644 index 00000000000..6473c1f78fc --- /dev/null +++ b/examples/imagenet/imagenet_full_conv.prototxt @@ -0,0 +1,215 @@ +name: "CaffeNetConv" +input: "data" +input_dim: 1 +input_dim: 3 +input_dim: 454 +input_dim: 454 +layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + convolution_param { + num_output: 96 + kernel_size: 11 + stride: 4 + } +} +layers { + name: "relu1" + type: RELU + bottom: "conv1" + top: "conv1" +} +layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "norm1" + type: LRN + bottom: "pool1" + top: "norm1" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + name: "conv2" + type: CONVOLUTION + bottom: "norm1" + top: "conv2" + convolution_param { + num_output: 256 + pad: 2 + kernel_size: 5 + group: 2 + } +} +layers { + name: "relu2" + type: RELU + bottom: "conv2" + top: "conv2" +} +layers { + name: "pool2" + type: POOLING + bottom: "conv2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "norm2" + type: LRN + bottom: "pool2" + top: "norm2" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + name: "conv3" + type: CONVOLUTION + bottom: "norm2" + top: "conv3" + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + } +} +layers { + name: "relu3" + type: RELU + bottom: "conv3" + top: "conv3" +} +layers { + name: "conv4" + type: CONVOLUTION + bottom: "conv3" + top: "conv4" + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + group: 2 + } +} +layers { + name: "relu4" + type: RELU + bottom: "conv4" + top: "conv4" +} +layers { + name: "conv5" + type: CONVOLUTION + bottom: "conv4" + top: "conv5" + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + group: 2 + } +} +layers { + name: "relu5" + type: RELU + bottom: "conv5" + top: "conv5" +} +layers { + name: "pool5" + type: POOLING + bottom: "conv5" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "fc6-conv" + type: CONVOLUTION + bottom: "pool5" + top: "fc6-conv" + convolution_param { + num_output: 4096 + kernel_size: 6 + } +} +layers { + name: "relu6" + type: RELU + bottom: "fc6-conv" + top: "fc6-conv" +} +layers { + name: "drop6" + type: DROPOUT + bottom: "fc6-conv" + top: "fc6-conv" + dropout_param { + dropout_ratio: 0.5 + } +} +layers { + name: "fc7-conv" + type: CONVOLUTION + bottom: "fc6-conv" + top: "fc7-conv" + convolution_param { + num_output: 4096 + kernel_size: 1 + } +} +layers { + name: "relu7" + type: RELU + bottom: "fc7-conv" + top: "fc7-conv" +} +layers { + name: "drop7" + type: DROPOUT + bottom: "fc7-conv" + top: "fc7-conv" + dropout_param { + dropout_ratio: 0.5 + } +} +layers { + name: "fc8-conv" + type: CONVOLUTION + bottom: "fc7-conv" + top: "fc8-conv" + convolution_param { + num_output: 1000 + kernel_size: 1 + } +} +layers { + name: "prob" + type: SOFTMAX + bottom: "fc8-conv" + top: "prob" +} From c3440fa48b651159ab41d96d8a6c4efdeeb4ffb2 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 12 Jun 2014 14:41:25 -0700 Subject: [PATCH 0114/2053] make notebook for net surgery of fully-convolutional model --- examples/net_surgery.ipynb | 327 +++++++++++++++++++++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 examples/net_surgery.ipynb diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb new file mode 100644 index 00000000000..6cba8bb9a0c --- /dev/null +++ b/examples/net_surgery.ipynb @@ -0,0 +1,327 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Net Surgery\n", + "\n", + "Caffe models can be transformed to your particular needs by editing the network parameters. In this example, we translate the inner product classifier layers of the Caffe Reference ImageNet model into convolutional layers. This yields a fully-convolutional model that generates a classification map for any given input size instead of a single classification. In particular, a classification will be made for every 6 $\\times$ 6 region of the `pool5` layer, giving a 8 $\\times$ 8 classification map for our example 454 $\\times$ 454 input dimensions.\n", + "\n", + "Note that this model isn't totally appropriate for sliding-window detection since it was trained for whole-image classification. Sliding-window training and finetuning can be done by defining a sliding-window ground truth and loss such that a loss map is made for every location and solving as usual. (While planned, this is currently an exercise for the reader.)\n", + "\n", + "Roll up your sleeves for net surgery with pycaffe!" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "!diff imagenet/imagenet_full_conv.prototxt imagenet/imagenet_deploy.prototxt" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "1c1\r\n", + "< name: \"CaffeNetConv\"\r\n", + "---\r\n", + "> name: \"CaffeNet\"\r\n", + "3c3\r\n", + "< input_dim: 1\r\n", + "---\r\n", + "> input_dim: 10\r\n", + "5,6c5,6\r\n", + "< input_dim: 454\r\n", + "< input_dim: 454\r\n", + "---\r\n", + "> input_dim: 227\r\n", + "> input_dim: 227\r\n", + "151,152c151,152\r\n", + "< name: \"fc6-conv\"\r\n", + "< type: CONVOLUTION\r\n", + "---\r\n", + "> name: \"fc6\"\r\n", + "> type: INNER_PRODUCT\r\n", + "154,155c154,155\r\n", + "< top: \"fc6-conv\"\r\n", + "< convolution_param {\r\n", + "---\r\n", + "> top: \"fc6\"\r\n", + "> inner_product_param {\r\n", + "157d156\r\n", + "< kernel_size: 6\r\n", + "163,164c162,163\r\n", + "< bottom: \"fc6-conv\"\r\n", + "< top: \"fc6-conv\"\r\n", + "---\r\n", + "> bottom: \"fc6\"\r\n", + "> top: \"fc6\"\r\n", + "169,170c168,169\r\n", + "< bottom: \"fc6-conv\"\r\n", + "< top: \"fc6-conv\"\r\n", + "---\r\n", + "> bottom: \"fc6\"\r\n", + "> top: \"fc6\"\r\n", + "176,180c175,179\r\n", + "< name: \"fc7-conv\"\r\n", + "< type: CONVOLUTION\r\n", + "< bottom: \"fc6-conv\"\r\n", + "< top: \"fc7-conv\"\r\n", + "< convolution_param {\r\n", + "---\r\n", + "> name: \"fc7\"\r\n", + "> type: INNER_PRODUCT\r\n", + "> bottom: \"fc6\"\r\n", + "> top: \"fc7\"\r\n", + "> inner_product_param {\r\n", + "182d180\r\n", + "< kernel_size: 1\r\n", + "188,189c186,187\r\n", + "< bottom: \"fc7-conv\"\r\n", + "< top: \"fc7-conv\"\r\n", + "---\r\n", + "> bottom: \"fc7\"\r\n", + "> top: \"fc7\"\r\n", + "194,195c192,193\r\n", + "< bottom: \"fc7-conv\"\r\n", + "< top: \"fc7-conv\"\r\n", + "---\r\n", + "> bottom: \"fc7\"\r\n", + "> top: \"fc7\"\r\n", + "201,205c199,203\r\n", + "< name: \"fc8-conv\"\r\n", + "< type: CONVOLUTION\r\n", + "< bottom: \"fc7-conv\"\r\n", + "< top: \"fc8-conv\"\r\n", + "< convolution_param {\r\n", + "---\r\n", + "> name: \"fc8\"\r\n", + "> type: INNER_PRODUCT\r\n", + "> bottom: \"fc7\"\r\n", + "> top: \"fc8\"\r\n", + "> inner_product_param {\r\n", + "207d204\r\n", + "< kernel_size: 1\r\n", + "213c210\r\n", + "< bottom: \"fc8-conv\"\r\n", + "---\r\n", + "> bottom: \"fc8\"\r\n" + ] + } + ], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The only differences needed in the architecture are to change the fully-connected classifier inner product layers into convolutional layers with the right filter size -- 6 x 6, since the reference model classifiers take the 36 elements of `pool5` as input -- and stride 1 for dense classification. Note that the layers are renamed so that Caffe does not try to blindly load the old parameters when it maps layer names to the pretrained model." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import caffe\n", + "\n", + "# Load the original network and extract the fully-connected layers' parameters.\n", + "net = caffe.Net('imagenet/imagenet_deploy.prototxt', 'imagenet/caffe_reference_imagenet_model')\n", + "params = ['fc6', 'fc7', 'fc8']\n", + "# fc_params = {name: (weights, biases)}\n", + "fc_params = {pr: (net.params[pr][0].data, net.params[pr][1].data) for pr in params}\n", + "\n", + "for fc in params:\n", + " print '{} weights are {} dimensional and biases are {} dimensional'.format(fc, fc_params[fc][0].shape, fc_params[fc][1].shape)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "fc6 weights are (1, 1, 4096, 9216) dimensional and biases are (1, 1, 1, 4096) dimensional\n", + "fc7 weights are (1, 1, 4096, 4096) dimensional and biases are (1, 1, 1, 4096) dimensional\n", + "fc8 weights are (1, 1, 1000, 4096) dimensional and biases are (1, 1, 1, 1000) dimensional\n" + ] + } + ], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Consider the shapes of the inner product parameters. For weights and biases the zeroth and first dimensions are both 1. The second and third weight dimensions are the output and input sizes while the last bias dimension is the output size." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Load the fully-convolutional network to transplant the parameters.\n", + "net_full_conv = caffe.Net('imagenet/imagenet_full_conv.prototxt', 'imagenet/caffe_reference_imagenet_model')\n", + "params_full_conv = ['fc6-conv', 'fc7-conv', 'fc8-conv']\n", + "# conv_params = {name: (weights, biases)}\n", + "conv_params = {pr: (net_full_conv.params[pr][0].data, net_full_conv.params[pr][1].data) for pr in params_full_conv}\n", + "\n", + "for conv in params_full_conv:\n", + " print '{} weights are {} dimensional and biases are {} dimensional'.format(conv, conv_params[conv][0].shape, conv_params[conv][1].shape)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "fc6-conv weights are (4096, 256, 6, 6) dimensional and biases are (1, 1, 1, 4096) dimensional\n", + "fc7-conv weights are (4096, 4096, 1, 1) dimensional and biases are (1, 1, 1, 4096) dimensional\n", + "fc8-conv weights are (1000, 4096, 1, 1) dimensional and biases are (1, 1, 1, 1000) dimensional\n" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The convolution weights are arranged in output $\\times$ input $\\times$ height $\\times$ width dimensions. To map the inner product weights to convolution filters, we need to roll the flat inner product vectors into channel $\\times$ height $\\times$ width filter matrices.\n", + "\n", + "The biases are identical to those of the inner product -- let's transplant these first since no reshaping is needed." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for pr, pr_conv in zip(params, params_full_conv):\n", + " conv_params[pr_conv][1][...] = fc_params[pr][1]" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The output channels have the leading dimension of both the inner product and convolution weights, so the parameters are translated by reshaping the flat input dimensional parameter vector from the inner product into the channel $\\times$ height $\\times$ width filter shape." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "for pr, pr_conv in zip(params, params_full_conv):\n", + " out, in_, h, w = conv_params[pr_conv][0].shape\n", + " W = fc_params[pr][0].reshape((out, in_, h, w))\n", + " conv_params[pr_conv][0][...] = W" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 5 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, save the new model weights." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "net_full_conv.save('imagenet/caffe_imagenet_full_conv')" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To conclude, let's make a classification map from the example cat image. This gives an 8-by-8 labeling of overlapping image regions." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# load input and configure preprocessing\n", + "im = caffe.io.load_image('images/cat.jpg')\n", + "plt.imshow(im)\n", + "net_full_conv.set_mean('data', '../python/caffe/imagenet/ilsvrc_2012_mean.npy')\n", + "net_full_conv.set_channel_swap('data', (2,1,0))\n", + "net_full_conv.set_input_scale('data', 255.0)\n", + "# make classification map by forward pass and show top prediction index per location\n", + "out = net_full_conv.forward_all(data=np.asarray([net_full_conv.preprocess('data', im)]))\n", + "out['prob'][0].argmax(axis=0)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 7, + "text": [ + "array([[278, 151, 259, 281, 282, 259, 282, 282],\n", + " [283, 259, 283, 282, 283, 281, 259, 277],\n", + " [283, 283, 283, 287, 287, 287, 287, 282],\n", + " [283, 283, 283, 281, 281, 259, 259, 333],\n", + " [283, 283, 283, 283, 283, 283, 283, 283],\n", + " [283, 283, 283, 283, 283, 259, 283, 333],\n", + " [283, 356, 359, 371, 368, 368, 259, 852],\n", + " [356, 335, 358, 151, 283, 263, 277, 744]])" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAU0AAAEACAYAAAA3NiR2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvU2sbVt23/UbY8y51t77nHPvfa9euSpVZXAqrthWYgWS\n2MIdPpJITkkE6EAiBAIpoLQQSPRoICEhpEjQwh1EI42AIiQ6ER8xKFG+MEEmUqQkhpjICqRcrirX\nq/fuxzln77XmnGPQGHOfVyahiKWKXiGd0XjvnXfP3WvvteYc8z/+//8YWyIieI7neI7neI5/oNBP\n+w08x3M8x3P8/ymek+ZzPMdzPMdvIp6T5nM8x3M8x28inpPmczzHczzHbyKek+ZzPMdzPMdvIp6T\n5nM8x3M8x28i/qEkzZ//+Z/nx3/8x/nKV77CH//jf/wfxiWe4zme4zk+lZDvt09zjMGP/diP8Wf/\n7J/li1/8Ij/1Uz/Fn/pTf4qf+Imf+H5e5jme4zme41OJ7zvS/MVf/EV+9Ed/lB/5kR+h1sof+SN/\nhD/9p//09/syz/Ecz/Ecn0p835Pm17/+dX74h3/46ecvfelLfP3rX/9+X+Y5nuM5nuNTie970hSR\n7/dLPsdzPMdz/MBE+X6/4Be/+EW+9rWvPf38ta99jS996Uu/4XfssOLb/v2+9HM8x3M8x/clTu8t\nPHy0/X3/7PsuBPXe+bEf+zH+3J/7c3zhC1/gp3/6p/8eIUhE+MLP/ONogBMQgpoSxPxzQwxCBS1C\nGIQ5boqqgIEqRAgCOOT/l/xZAAkQH9AHo+0wBoKjEeCO4hiOCSCDESAKioMHEfluxANEiBCut0o1\nP4OaICK4O+4OBGMEvQWjO/u+M4aDBBE7D99s3Hx+IQLMDJGCiFKKYgalGrUWaq3UWliW/LdZYVkW\n1lqxYpgoRNB753x+5P7xzP3DmfO5sW2NCKdY3juxQEwQBaoSDNQCUUFVKMXyZ1HcAx/OaM62OyEt\n72s+WSIEsLw37nlPXBEpqAaHo1GrUExgBG0TpAu/9r+94zNffkFvsG8bbQ9GF9zzulag1GA9GKUK\nughlKQigNvAwRjfCFVwYwxEq+Tg6IoFgCPDdyzkiGCGz+gnwQFXBBBS0Cq5B+EBFcAF3J3zQ+4Ch\nMPJ9ehdKAK6UItjRuHlx4ObFLafblfUgHA4r67Gw3hxZ7w78tf/ub/H7/rWfoS6VshaC4LJvnM8X\nHh8eePP6De/evOXDb3/E/duNvsH2sLHdN3wXGDafc+DdkS4QBn1ABMbAVEACUcUUzGLeTwUCMcdC\nIRQRwyNwhNYdpOAilINQD4VyUtablfUYHG9WSg1KBYmChDLGYLt02uZcHgbbBdpl0M/BuAwujwPf\nBx997SNuPrjFzPK+K0AQ4lACnXtHRaiHhcN7Ky8+eMXp1YEXN8d83yJEOGM4rQeP7x75+Ftvefxo\nJ9xRA7VPXlfNUIQhc7+6IDFYF2E55L4q2hACFUULqDoigxiWa9KdEMOXxl/5E1/j/y01ft+RZimF\nn/u5n+Nnf/ZnGWPwR//oH/37KudaKt4GwUx4QSY9EUQgYgBKhOYfISjg4ij6lDAhkyQB4YA4IYNC\nYDIoq6Gl0M6dPjoxBqaGEIgDEngIoiMToMyNN19cPCDi6VqOgxiiMh9sbkQRYYyBqmNlJqFY88H7\neb5LBTLxixQEg4DegkAYOhgREIqHEATJdijeYATECLD81L1Bb4K74iPoe6P3garOBBeZwAx0MVAw\nNUZ0tBgqmUyviT9cGCMYw1ENIhaIMW9uefqMIiCihBeg43FmXY6UQ6euhaJC352qxngIIqDtjbY7\nowV9z/cWHojl9a0qYoGZYqpcj79wZXRyHYRAKCqF4aASoDXzofd8FiL5+d0RhGqCXDev5AFiZgzp\nSJnPORyrSo+BAqM5NgZhSmwDcbDN6VtBeyYONuH87pHLw8bjyxM3dwsv34fTqyM3r46cXrxgOazc\nfeYOWYJiFY9At9ywIY2tVS7bwuHuiKixbTuH20I7DN69vbA/7EQTdBRkKB4DjQEGJkZ4ZNJUEAlq\nhZDAaq5PJZ+viYFn0lQPRh9zXTaKFRZdnmg1M6MWkLl+Egx0TBfCBVsKSHA5D1rv9A7hQu8dhuT6\nJBAJIgaiiqjgRB7immtHRZBFKTcrL95/xfvvv+LmbqUcSv69ubdaayxR8b1TF2W5FaIHixo+X8s1\nmG/3KaG5Zx5pM/nijqAYg6aDKoao4gwwwU55b0SMKN87LX7fkybAV7/6Vb761a9+718SwSzRjTig\n88ORH1b0mkfzhoRoogTN7B+Rp+v1NMhkm6drELnxuhMMajFuXt4xfGc7X2iXnidRglMsBI+ep5Ab\nEfkqgyAkF18mi0zd4ZEIGZ/XnclTlMiMT4RTl4HQaT1w/2RRMpOh4KgKnussrxtBHw0UejcusbFW\nRWNHCWQoQ5OK7n3QwxnuQKKLNhpqsB4OlCrUGmg13AAdDAYmhooiJjh5yKhmUlYV3EBHPoThAeIQ\nMp9ZJm7H5mETnI4Lx9tgOQliA4ZgKD2AYkQIexvsO4wdeELsibK1QOj13uQBOno8rY8IRdUYYyRq\nFzIhIBPx8rQGAuhjAFBrQUxAwEVAE9HnQQdhWeGYDELnAYNTVmMfMHygVRg9oARWwS+wD0d6QRDe\nvr7w0BqXccROyp28gMUopwJFqIeKLIbMe9vGeDpwSzXWm8K6wyDwIvS9JRK6ObK/W7j/9oX9sYEb\noSNzP4rYwEIQCUxjomynmKICGk6ZC1wJ1PLPR0RWSOQzwjTXXR94KKN3iqy5RlBUHTzXd0QmaZeg\nLsZSYWyd3A0xEyLzH3OPQu4hlUR3ZghKVcOWwuF4YFmPrMuBZV04HAqiwnCn957PtIFVYb1Z8OHE\nKHmP5i4UCURyHbhnyaiRFUJ44EM4+0Y3yfuDEB2MzBmqFVOhVAFzQj+FpPkPEjL/qSKEOshEkzbL\nilBQcORpk43rQ4h4SlT539eNELhDFUUjN10RQ3VAbNSiLDcHeu1c9gt9T7geIWjovI7P12MmP74L\n8SWVEKGEg5RcKD7y/aACkYm6mBAmSIFoC4Ryeu+ClYKpJpKer5mnnoEFEuARiVolMXb4pBw8KKXg\nlkjZfUzkrBwOB9bjymHfGGOw1EpdjLKSi5CBqyIRhAxCZuIXQJU+OohhVsCDEUEbI8+oSITs7vQB\nogrSMAuWg/DifVhuNqJ21A+MJjiCNzi3TnlhbOcgXAkXEMe0oDYPLQtM9IkS8WAeool4BEMi37tP\nNOnfvZYmGhfJTaPFMBNKrQz6TBx5KAcBcj0AIaJDIWmLAmGB0ykO6gEDYh9ggZNVSvUFaUZcgojO\n6J1gpYnjAl0D1+BHfvcXaTJYrDKGE70zxsCH4zFo0enS0INj4Zg5UQUW0E3QWhi2EEB7O7CuFBNE\nBdOspBhBsSUPqxCqKhIdm9QRVzRPTBQyEqjoRHs2KYlwSih771wuykJgItgslSHmNszDxUywItTV\n6K1Ti9JbJv/lZpnPJaslwpEJKlSUoka1QlkKh+XEoRZKMZZlpZaClGBBGT5orbGzs5SFtRY4rbTm\nTFLuqfLJ9ZlUwPDcWx6DsIBYCFcaTphQXJGYn18NJ5O6VLBSErF9j/jUkmaCJUWAMXeAqE7EJYQp\nKoFcmc4IPCCuvBSfJE8RJcITytdKicAkKNIxDRYzwsFjQxzUnGUxii301pHJYfpwfMRTeafzupFv\n7lrJ4T4QUfoOVgIrExEJ4IqVitqgnhZKPSAiXLbB7atKayMXMgvugjtIZuanUl9nudx6cnKmgscZ\nP8KB/Jn5bNdSqVGAFQTMXib61kS7Ho7rQNhp44IF7JGJIyyImfSxPJ3H2PEqIAY9kZzoYIhjIZiC\nLiCl0hnU96DcDpbbSlaOBY/B/RBcKiMa5WahP+4QA7OSaJyGmKFFn0rJCcbxAI2sGFTyf4RMOK4L\n3R1RY4yGzsSgargPVAUrhmqiDzyTjE80ThTcFYsA2ajacauUUhi649GIIkgRNGCMPHw5G9zm87LN\n6UzKJoKbm5XbuyOn2yNDgt4b22XjR37yi2z3G23PZ3t+PON743x+zeVypp3PtP0NqjvLKowYSBWk\nO+NQGJcLCw3dhU2U9jigTbRkA3VBqkB0ihVkdJLjVbwHVibj75J8ogcWSROFg5NUjlaoy0KilGDz\nTq2SPKFYrgFJ8OAjiA4SShGlW8dLJxi5R0Q43i6zapqJ0z0Pvh1sAVkLulbKWlELukyeuRi2VpSB\nhFAtEbofhXLZWG+PSZ89XvDBpMUS6EQkZhkek26KWXlO7UNmbTIUrTrRaVI1VuJJpyil8P8l8nx6\nSDOSnwyUrJmumTORg07ElaejZtUmgWEwq0Wd5XnMcpgIRmt4EYp48jMiecqq42MiQXd8DHrvDB/I\nTMSlVsL8u04vwefrf/edlHK9LvhIvsZUQRwtgZWgHhZsFY63hWU1RKB35/FhsF0arXnylCMYzfGW\n5ZGoZVKVeXi40EYnAmrvdDUEo0jBiqUoYZqCilluAjVUoHvnYXtg6xfcdS4qMIzuSQG4CItpJnxA\nSX4UPDedAmoUMYLOUozD8UBI54P3P0Drh/jq1JPz8nDDh6/fsNgtnzt8jm88fHseBj756iyd1RSr\nmgjTcvFqkSREAiRsIlJwyYSeqEWvRWUeXJoHGddKw6CU5EbzYG2UsmR6UxLtzXXm4ZgX1Au+7/TW\noQRis8asjmqWky12OAyMCj2RsoTRVChm2K2yvLBEiQS9Oful8RgX1JTe79mac7lsbPdvGHGh7Rf2\n2MAiS1frHI6aCL13aAOTQBvUlwkdhnX0Uiie15FZhYnluhZNMfKarCTy8wwfyaGP/FvJD6eeMAZZ\nZS2V5WTIKqyrUEsKkeG59FMkhNGdvjnnh86+C5dLZ+zbU4KSKciGT6otrpz5YIggA9gbUTM5aVFq\ndbCgmlKXOvn+POiKQCFYa6GvC6MP6J6v1zt1sdzXwBgdCUF1lunzfYcPUJ8rBzx6ygJk0qxLUIpS\nS0U0GL+hjvl741NLmqhkCc5MjoCpPiGCiSvQma8yb11RZUzy//9Rpo/AcbokX+EST6XXVXggBmMm\nTG8d94GZTFRjHI4LrXX2vefvzIQaYYl5NUvXCEekEJHoIyIokjff1mA9GstN5XhbWVflcCyEwPkx\neHwYXB4b27nR2qBdBu3S8eZJ2GfxDfgk1mEWWIxwKolOTSzLmnV5EkAQmSxB5O8YmAh9zFIzoOMM\naUhIqoWqeYqFI8WoXRlTUNOqXJmLZTEOp5VYC7UYt3cLn7n9IqfjwtkeaKNxexi8uzQk7nPjemAB\nAyGELL/MU/CxLLVtHprpKsgDIAZoLYgGoYpDCjoB1wyvT/xxJl+1T1wUY3SsMJ0L8w5OukMlGHvD\nZdAt+V4phg6HklxIrAMxsGQEkTWy7GvC0MBiEFaxCuvLhVE9OWIf7K1j543LpeNjsD1sPD5cOD8+\n4P0xHQJl0HQDazS/oKvNAwJEByYriwh+R1IoRehqxMfg507VAhPtqkyaYUqm10rIiUTskyPOklQZ\nozM8mLUUVSpWFg43leW2cKgFLYHISKFkCnIqwj6cCKX3oO1B9Cy7e8S87m/c5nGlgOZz8p4Hl1Zj\nPa1YrZSS/H4EeB/YkodkH0kjKZ6ARBNlsxQuW0ct96EVoTfHPZ72dkSKUzE58YhI54kFBcdKckOi\nnWU5pEtFDWSko+Z7xKeWNEMy70fko3sCciL5mCTRT2j2s6MFF33iD6/8V4RTEcIMCc/Nt3dambwF\nQtVU8ojIE9P9k0SLECMtC5D8zuF4YD2m0HJ+uNB6x2NPK5RADAfRabfJBbt74ApWVpZDpRwGp6Nx\nWIPDTeFwLGgRDkflcNx5fCfcm7JdHBUnuCT/NhJ0p+UmiDYXm6Sdq5jh3hjREQolDhNt8CSSjRjJ\nXclALEux8EzAw53Gmc4l1cZY6VKolKRDYqS1q4BJSWuOOGbCertQqnBT065TS+czLz7L7/itv4Nf\ne/Mr/O1f+zt85Ys/zq/8nb/Nu965XByLI/Q2bWRB8eTqVPI9myWpn44FmRtZkGL4LPcEUCtoKH0S\nvCIQPbL8fqK9PxEgrg4CVU1kOhz3ndECuqNXLgDHqyM1cAt0CUQDOxuyBl47elBsGBKDMMdYGAyO\ny8COJ0oNTAcRjR6F8/meve2MJmwPG5f7C+3hkbZtuDll2bEykkKpG8MajLyeYSx2xEuj2IWVRJ9d\nhNIEzpLKdkvuVmJndJ83oGJy5btzPRZN5biPYPSOSSW0pmvJgsPBkIOiRTFRFikcyoIuSkiH6rTW\ncXZ8DA7HQpNOsVxnQbD3TGii0PqGT+FI5Fqp8aRUO8mHdmAbjRfiRBhmlRAYGoh3+tQXPAaDYIud\n7htCY8QOkVYzIoVH3NHh6LSMJcJ0Rneiz+pUAz0IshSIgmpJkDN51qvw+APLaRIjM2JMFRtJdKSz\n5LiKPpPXCkB6Ehd+tasAV718jIZ5CkCNkYmtgXnB5waN5jBh/ZWQDx/JWV3FHk21eC2Z6A6HyuPD\nhcdto/WRaFWZpWJakCTrAXxA2zqH20P65pbkbZbDwuFYWU4FD+V0e8SWM8FGyMZwp7qiZlkuiVJK\nydN5xKQRnH0MtHVEEyUMz2tLgaozuYgR6oSk/t9bo3suuK3vNG9PfrlSBGJDLeZSUMIiLV0T1Ys6\nIWDVsLUgFZoGv/23fIHPHo9svvGtb3+D3/87/0V+5oe/wf/6N/9n5L2v8L+//jq3qnzUO92CauAO\nLIGaohqppAqI9kSNCBKJADQEUZ3I9FoiOurTeoMwiMl761RPAw/PezDXz+ipsPY2GHtJKoYrR8p8\nYYgxcl3tqfKKAppcnmrSC0U0S7dDAzOqVqiOLIauyhiN7aK0PfJ+P3YuD432bmfsG9EHIhvlCOut\noSURFBJIbKgsyQwcrnROPtMuQg1lbEKcY4pIggxJRxiWSr8k7SA4Irk+xp5IawyHMAaKj05gLKcD\n68koZcU0RZUg6KNjPf2zWst0qCw0WtIYUliOh/SO0ogubOdt/p5M3t8JHJWCBnRvqFmaMKZvWNRp\nozPoNG/s7YxvO8uS1+y9MUba1EZL2iwrvClyxRQNfSTX6mndU7Mnx8eQQdHpwQ2f+UYoRVmXSin2\nG4QuUcVlfM/U9aklTZ8+Sy06b3Au4pjE+xgdsykKiKVyHkGPSJ/dGBRVfDgGFE0exSOQKIQ3ugSP\nrU34n9xGjA0fDfeOBti0OokUcvdMo7RBKcLhcOBwXFgvncvlwrY1tjZo29xtAAxUChLBtjXKo3B7\nd0fg1CWtDHZQyrJSy4HlvRPLek/Eh7QY7L1zu55YygGPTmudPhQfAx87Mgpsg74722hEG3SEWivs\ngdpASqVoIWzgPvAQLm3nvF84b488bI8Eg903rM4DySPft1hSIbO8l6sX6+oIsKQWTOGkynJQpHVe\n2ZHf+ZP/FLYrv/0zX+b27vfwMz/yz/A//MKf4f/4q/85v/fL/xi/8Ou/zDikx/Z83pCaIqBZmYRD\nJo5UhI+ZrIuiYmkKXyopWUQ+njYdBt+t6k4hr0CiVfEnQa2NgOFEGxhpObqKBOGChzMaRE90G8WJ\nqsk14pk4C1kKSmBK+iSrYBLImrfJbeDhyfH5YL9snB+ddx8/0t/uVDWWopgKVuMToUYLIwaVymp3\n3NzeUauAdc77zo7j0YmtYQeHm4J32NoguiEudM8N371T1Kag6ogpe480t4/OQPDRQQcNoUb6pcti\nT5zkvjfK/IziwEguOBs4sgkgXfRKWQveAquCbB18fJfGkBYyTZYcRxBT6lKwalAFl0GLneYLe2vQ\nglWNEQXV5OhNwLeWHGzkc5PJSUgk/yuRe3vEpOCuGoM5lQWmgFVMcJKes3JkXdd0gJRCqXVSAntW\npd8jPj31nBQ3+mB6IZlewdzQViRVVsnSSiVPKSQ3gSHQR24gdySSU4pwNAQkOzBa2+iXjnpj0Blt\nJ8Y+OTyoJflGjx2TgtkxN7QoIYWQfNAvbeF4WHh4PHMa0PadbQwue08rTfTUskK4PAweHxo3Lw4E\nwlLTnrHUA6flDimV918tiC+If4TxbnbnFIQjrScvs22d7dHYt473nRYP9J6kPlJQFfZ9ENbYtbB4\nohcXGF3Y28alP7KNgUewj45YLjoTQdWmT81SkY9MnIOs9lTBtFx1OKQrx9sT6+Lc3N5Rjq/4/PEL\nfPlLvxV/vfH2419lffmKP/jVf4vP/fBP8wt/6b/hW5/7NV6fjW++u2dZjjz0dygdvVIdIZSyMq7W\nhPnMy1I4nJLTBFAXvEs2yfhAwhJxTluLePpOccdJOmJIcqkEhCYnnXam7LRxRooCkV7S2CMN/qXh\nCmudZZr4bAzIikQjX98UlIJqZfSBx4bvjb4p9/cX+tvGeNtoPQUtWRUqtL1Te0lDvg9KPXJ7vOXl\ny/c5HVfqakg1tv4er998RPgD+znAHDejEVSpuAShIz3HbsndKwSOaFBMaZGiY0hhdJn7xXCH8/1G\nXQwrhePNTXKYnkKIaf5/d8cJXITQBSc7xmxeWwvEErBoHq4klWOWrzGAUbIjx4pS14Itii5CXZZs\nNAmdNEqW9b11zIy+t7S5tZ029nQXaHYAmRmjd9LZP3NHa6mID5u2oxRnrYBowT33vYizrpX1sLAe\njLUYIqlpmFZa1O+Zuz49pDnS7iAI4leTakHEP7EZceWnpol5yubCTJSTtzCYvkdBNZK8n5xIzD/r\nYzAi7RfZQTOSIbAAUhmtxZ6UV7OSnq0s5pLnEuF0szK60KpQx+CwFHrb2fZODMcjO0revL5nPQll\nMQ7HQT1m6SlWKFaxVbi9VfyzxuF4w2W7YJZl5RhpnyrbBafTxlXMgt4b3Tt7V5or9ECbU7egnAxq\ncl2+5+LufdA9aOFYKVMsSSKeef9TdU9RRlyTR1VFDFRScAg6g0HbGp9/8RnevXng85/5Erftlr/z\nS7/Cm49+jYfvfJtaFo6fu+N3/b5/ld/ze/8A/8if/I/4r//yn8Hlhnp3w6987R1aKsQnXklXxyXQ\nsEQja+F4c6QsyTWNMdDJ0UU40pUryv/u5gbvPqkLAEdCU+SB9H0yBcSrH4aJOOePfrU2hVKuwiHz\nz53Z3ZKcuE4TOdf1KmndGgO2fWc/N8Yl27hkFDw6wwItBfMs4WXN7qdiJ17cvM/7Lz7g9vaGuq5I\nFfZ9o8gB+A7b43eQ/cJ+DMbB6eekMwh7uo+1LBA7alBPK7oWLAxvg+0hGPeT8x7ZUCEhPJ4b9VhY\no3EoilSddIfOvXNt5Eihp/fB6Lk+YySFVCLFNa1KXQ3PooAgK0A1RRelLlnBWVXKalACqoMGfexI\nV0bIVO19rvdBa3vqCp5VRhvZpZX0tqAy1/LBaHujR7owxkTbeD5bs0o9rBxPaQNc6srxsLCWkteL\nQMIY3r5n7vr0OE3Ph2C1ZJeCpOBzTRzERA+S6qszH+LszNHZJ83Idjks0aeMTzbjCKaBNzc+I4ne\nLPcdGY73YHfH/AErN1gR1rqS3q+Yfr+rutd5ajfL5ne0DIoaRYXdoc9+8+0cfPThmVIry3rg9rii\nhxUoSBRKqdzeGuJGPR54eHxLaz1vjTuLK37vlMuGXXZUUwhKFAoUZ42A4ughWGrnMLLvO4ZlohXA\nFoSgKAglPWmmaEn0e3UH2DTWm2kqnJCoJUBQNAr76KjAD91+wKFXfvt7P8rf/ut/nXePH2EBN/XA\n/XZh+9XBn/+T/zE/+dP/NH/oX/73OL56j5/7E/8pt+v71GJ4AZGaz0b0iV+8dpUsa+F4WLBiBDui\n0JvinvdnjJ6IEUnVOAQRw0cne5wqk5BJ1VTTf4jMxJdaPN6nNcOnZW1azBhp9XIP1K/qe3aK4TyV\njunnzbkCY0AMy0NqG/jWaJeOdJk+YOjNqcXYtz1bCncwX3hx9xlenD7DzeE9bk93nG5usQIP50cI\nwQfsl8Gb/jHRO3V3ojvS0vWQXtqYB5ywHhdOdyf0JJhku+GlDdo7eHh9xs+JArUa9aRgnTF2RI55\niMXI9TNdCqIyu5gSPCCOidIh6RuFRQXqVRidcxtm5YJp0hkraJmwsOiT1xgJ3ButAT0PxmseiLiW\n2/lkR+9T4BngKfaN4Skmdke1JsiKhrhPNG+zg0hYl5V1rRwPh+zIWldWs3loOs4O7QfUcmSTe/D9\njJSSCpqSCASSlwzQ6vQQstcgRRIfYz44R0pQ/CougOosETQXvXkQYQwF1cYwS1IcoyNEG8TeOaO4\nXUAUK2dCVtaoRB34HG5BTP9ZJG84vCcnNmyqvoNSFkTS7LudG+8+3jidjlxewl0o+9mRNXtzl/WA\nvFzgcia0c748QIDIApGlt9pIm4g7Ixr7bA07VAVrVFtY187xFnQFLWPaKwpjgA9FRxq/hcAlBapa\nO1i2syVZmIdEH3NjWCAtu0v6CGo5cVLj4eEB2+F3fekn+ejr3+Dxow9ZxAg1ugifffUB948Xei/8\nrV/8Cyw37/Oz/+y/w9d+/SN+/n/6b1lfHBmSYkWIgQ6izxMeqFU4HoWyDrCsJtRn+2oYLn3mP8s2\nukhrTY+emzEUdT7pdgoluyolr4kQs0datUz/YCdIIm8EWHNkh2FO1Nm3Lx3X7E4yZuPA7JwKLwyX\nRPbbYGwD3yDcEOk4ua58L+wE6+TkRwsqxs1y5ObVK9774DO8ePmCYiU7uCzovKC1zsP9zrYHizVO\n1nnjZ+7bA/IoyKVMm9lgPS0stwW9Cepp5XCsBMLahX4Hx/cPPJwH/bJDFCwqlB2PQffOEoURG/tG\nOjIk91wtK6LC4iV9n0w6wOLJ70tJ2mdEZNktcxCPZouv2RzEY2mWKprrPGIwRlYZqOe69bRQ9dbT\nXBzCooqr4laQEXRaUuIy76dfe87T0kYUCGhxRqiUpWBVuT0cuD0cOZaVKglg0npos+mmf8/c9elZ\njnyfiDAVQNFZcj8ZvQLXASOTBggtJjNNijSKQ/Rs51qmy19nt1HIkxXa3RmuhNucmtJxMSANt2NT\n/OzgDRmsCARtAAAgAElEQVSPWWbfCj65l08UthTXR/fkUz2RLmNkyTNVPFEIbSDG+bxxftx58/qB\nm9MtL16s9H1QbUF14WYtk9jOz9xGQ9XoPvuFZRDijPikx/r2xYH1MHAdHA7K6WWlHoUoWfr0lkZw\nruW2zO4JND9LEepyzIX1hJwTyQ5JZV7EEynIgnrHZUe78uV/9CvUR+OD5Y6/+61fJlXHzt3xltZ3\n3t5vrMfC7c0N3/z4kf/rf/l5ylD+zX/jP+R0+Zj/4m/+Rb51/0Ctgmu2W8YO++zAWtbZ/qm5NoZI\nzh0wJaIlGvdrt3N8cjhOGxpC2pLmShH35MrmPQ7vmcBmqf7JzIJZhSBEd6IVtCjRUoHu4ZSSKOuK\nSmqtU70W+tU4H0LISAQmMS11uc1CheY7qxvsQl93TI4UO3E63PLi7iUffPABPjrNOzymdWg7nzke\nT5z2DZeGSHBTXvGuvuXDb3zMw3lnGdliWQ8L66lk8jyuuDk3NycCo/dGa4VT6+xn5fLYiJ52PilO\njw2NQHykMyOSJx7e6K0hGMULyFUY2umN3HBLfkovCsw2To90dqxLcsIyRV/NykCQp30l0/+sEbPn\nPEFV74225fssnr3xyMjhLpLDb6JLCqSztVKuA0csoAsegg+nVFhW4+Z05Pbultu7dfqFNd8vzijG\n/vefCPcUn155PgYh8+w3YThPnTbp7+pc+8Bllk3ppEyrjEqOrSo27ceWVpxSCuJpDk+vapL47sDI\npGmtMGRgutK2ThPJKUj74DGUMc7szVnXjWWtLKt94iec01uyIyEX1xhBDOjj6pcL1CqqQRsbb988\nUmrhsJ44LnfoonQFkywHaq3p/POV/WFn0HPARd+y93bsiDl1hdPNwrokOswxXoV67Gi1ORbLKUXx\nUHwIwVXgSVXViiYpL0tynJqTqRQYdWTpu++0lpOHIpJ77mPjaJWPP/xVftvv/hnefvsdKsG6npIH\nNmeRRA0qha1tfOkzn+fx0rj/5i9RfkX5g//Sv8svfONv8MADodn1cfGg6YDmqBr1VNIjWtIqU1C6\npxjYe/baf3e0qajmXQfIlsFaKzfHwxTUtlkh5GYlkvtm+BMnep2sk5vYGLvixSk9J0xZrfh4wCyr\nlFzCA29ZxspIe1iQliip2dzgF6Gfn5oucR+0PUveqkdUC3VdORxuOBxvETXWpULfWMeB0Z26HKhL\nlpSDRGRbdG5e3hFeKPGW/aPH2ZUWSBXKsaJVOJ1uoBbWdSV0ZfTO5XHDlkI5dqKD9wk2ypwDoU6t\nlhO9NG1EWYykJYk0VFDGgqrnKMQBIUmDqFi2sorOOQXTLzsV7xR05+i3FlweL/TR5yjDK8c+QUjP\nfUkkIGF4WpF6Guk9YLFCqSkAEvDJZDRAIl0lngNc7u5uuXtxw+m0Po1eTJM7iHcue6MuP6ADO0Yf\nT5N2ZCLM1HImYS8pcrhC9l5lAi0CFk6d8wPTbhMsdZYDGlgkz6n2CZcFOS2lt0GRwjCj2Zhtdxtl\nWejnwd6D7XEQY6fVQV3aJLCvcx9zEYw5b2NEmuNHS8sJMlArBDmVRkR4e/8OOSjxLXhxukNule7C\n8IEtAUsmEMSIcPq+0bad1s7I9CKaBq/eu+WwVsZoLMvKchrYMrCl0n0wYswSqLL1gUvgmgg0Zktd\nsbQYqU0fnVXMjFIWyhhAx03odbYPSXZTvYwjivCFFx8g0tiaU2UlAmo9pApcChLM6gDO+4X1uHL/\n4Lz5pb/CT/wTX+SP/eF/m3//P/sPuL9JwWu5zA6WCksRahG0xJPtIzwV7D4850o+dUgBksXyJ2P5\njOHOejjw4sUt77/3ilILb9685fXrj3l4uMfDnoaBgExf8LU1M5FKDGYPclYUNpzLvufAiOFoyefk\nPRNEMk2zUYKBrcZSCvTCWCp9aVzuJ6obOfEpFnjv8IrD8cSyrqyHBZH0SNZ1ReYcz701xhhUKxzr\ngssBr45qowSMsROXlcswtod7aBujVdyDUgt2LGjNTq5kjVfKslJOO/t5m+28OfijjzkZRnsm9YnI\nHXlqSxwRRBmIVdbjCg2iOccbxyOT6/D+VDWqXscOJpqH+bwRfAR+cRxj905ZDanzOn16Z/tgvzTc\nW3LR7knnSA7nMRH20ZKl1jH76XPWREQOTtECxQr1YNzeHTkcj0lRLWtWpSVRlUj6xkf/AeU0cytk\n+SFkyRQMrmZ3tzTj5si1QDTJXiEnpkT4PB2DtQa1+PT3pQl57gmUmq/nadkQM+zKfdiGNUVN6G1A\nKWzbYN+cfR/0NnBf2C5tNpMpUiSRriZ6y0YWnzMKp4dNHSkjrTEWGJX2cOb16Pzdb36d3/ZbV+ql\n54K14HBac+bnvjP2nfP5TO8pHKSAGxxujJvDylJyKLGWkbaNWnFt+O4U0hAeDlYUbZLWIolsYwyn\nxZ6KrCwIimkBsVSEJekMWZMnHb4jmsNdDwJrOfDecsdNVB4+/pgbLdih5tP0nRiK1kMS+aXgbbBv\nO/YqWC+V//Ov/UV+8g/8K/z+n/oL/Pd/43+cLYw5GrBKJoXjsiSnrQKec0WH5+DbffPsmGKq5h6I\nlqfrhcNyKNze3fDy1S3H08pxWXl5e+KDD17xne98h29/+BHnyzbR6bUrLFFVQIp7qkm7tDm1qCjV\njL515uSXXI+aqNZj5EEkUCqs64Hb5cAit7Rd2S8b928eeff6zP39DqYcTwq1c7q94XS8RTG2fWM5\nLextp/fOvu88PNxz2R4QOoe1EEvlfGmsGAdZWPVA2St+vmdvDwTBeNzwF6d8TxROp2MCCM3Zouth\nobbKflh4OKclz0ebFVrgUVHNIdDi/kRtiKcAqnJAerLAbopYzdkNVhJZzohJKfXeuZx39r2x7+Np\nzGIO4pYUxlBa7Fhkg4dEosrRB96zStDIqnP39GZqUTyViXRWkKwIZF4ID4oIKsrN7YHT6Zb1aJRV\nWQ9lzj8wsGn4bx13aO0HVD3/xFwtaQVi5Cg1zSnp0ixV1atZOdLRr5aw3FBMB0s1ShnUIpgFWJ/J\nLHuzr3PVDKDniTNc2fpgsYWxdawavhleB1I6WgKisKwLpeQEpcfLzn7pKeTo7MCxMk3Wyal136lr\nJUkVsCW9oqFO2zZ6DL718Yf80Oc/4OXhkEZ8qeyXC2WtjP2Rbb9w2c70FhCCSaGWLBnWY6GaUWxk\nH+0sZ5qnr82jTZ6OXGhYDkNhGo/JMreNQWhnpWZJGRAaDOlYUYqmN9Vpc5EoL25vKBfjy7/ld8C3\nhLt6YHt4pB7WLOE054TevXrBxx9/hPeWNhSUr3/9V/mhz36Z9fwhb//6X+IP/8F/nb/8N/8i3ZXG\nQyIigXWxnA0pyb9ezWe956Tx60H5NFVPZQ7mzYnd9Vi5u7nh1csbbm6OqcKvhplxPKSvdWuNfd/p\nPd0CwnWKj0x6NysTF52dQpr8Y3VKU9ymYMl1jmpWQMigLJWDrhzWE3eHWw71hqWcGA6PH1/48Nuv\n+fZHr1EbHN8rHF/d8uLlC+7ubvPAD6HtO+7Ctu28ffOOd2/f8e7+Na0/Um0lUEyDoZn0rRq3L+6I\nXbDYuNw/Evtge7dRj5V6WukjgYea5VDiqhxKpdQch7bV5PEul8s0sE8PrCYqL2SjQ04eWlOk1exl\nt9WmUi6ILIlLp1Yh02UQwzmd8gC9v7+wXXb2ts/uuizbr7NSfXeipBIeIzuCZAPYYXaQpQ+0oHPY\nycApcwBvG+PJ76vzWxFuDyeOxxOvXr1gXVaWo2FV0/5lqSkMz4aRFER/QJGmj45IycEMRRmRfkui\nJt+Rhro0LwvgWW6L7FgoGg3F0BhpXrUxOREy2czBD3MOzjRx56i0ll4kpKV5e3RhWBL+DeH2cORw\nOFFsdiaUnBR+ebzw9s0Db17fs507Rk/BNkp2hOqVxNbs+RafbX7JZVUMH43X9x9zOn1uztXsqTz7\nYPSd7fHMtu2Mnh41s0JZjPVQONSKlZz5V6bYpFVpTRk9T/wY+ZUbY8tNj4wcvzY0v+IghOaN4bOT\nIwrLkgR8XWT2mRuiwaEe8++P7D3+0c/9BF+qX+ax/938Co6b0xwiHUg4TYPXbx6AlXZ5xzG/f4HP\nfvB5Hi7fpK7v8+4bv8wPff738y/83j/Af/VX/zxvR1qCFiss5TpUSfF0lNC60z0TepROFaNb2oWC\nwFsSbOoNZ2M93fHi9pZDNQ51Qc1YjyvVDIrycH/P23fvGPc76ehVcjao0XOZZVurCuhC7w3tig4l\n6GlZMsdKKsjZu5hVyEEX6nLDq/d/iLvbG16sL6aQZoyXzvuvXvDZ+5d85/W3sdX47Puf4eble6y3\nK0Kjj0LZO/ulcf9w4e3rd3z00Xd4/fARgrPW4HicIxMt2GfydFFqNWQ90B5StNk+OqPrgtR7mjin\n21uMPue51vQDke6UOpgT/+fEKYzer5a7q8CqmOdXiuTwlIqxULUg6khMblAmDz77uNPGk8ffuhZK\nOXHZCvePxuM5u/PC95wd6qlpjL4TfXB5POM9hwgXGSwL1BIsy0IplXWtLMuCLalh9HC6j8wt4U9J\n9VRvuL25Y11XXty+pC7G4XBANfn9ER0L5RI508H5Ae0Iuk5d1+tT0FSiPQRkmp9jzgGUVMJGTB/j\nFAnSAjS9dpITjuY3xeRF4koOJ/yaQme2iIlyKNlto0L2FYuyHBbWdU2Or1RqKdRSMV3Y98bdi3tO\ntx/z0YevuTyc6Z6nk7iglr3P3jvesmUudqEV4bgYx0Oin/P2Fi2vsFoJCbrkIInNd7p3RmvM1g4g\nDwA1zQEMlZwl6UlXjFAue6c/jfDKBKo6UfbQVIs9h8z24TkZvu3IKsgxv8bCloXR82suiBVc6OMd\nWoTb21t077w+v0XLhm0N5zqCbo7iGjmI4d2bD/nsZ36Yh95n947zcP+O4+nA/bt36M2R7fU3+ee+\n+sf4X375l3j75g03dzcMyQpBMa6DUXRaVpxHaknk7D3QEYSkn1RqtsbJUNpwzucNPiOU4xGryvGQ\nooSp8uLFgQ8+95LH7Z5vje8kVxZpbxsC6PUrD3TylDlBx2PktPAROS1I8neK1Uyk85BcS+Vwd+Du\nxYn37t7n7sUdh+OJ0oz7hweWg1AfC7fvHXHpvHjvFasV9svGUlf2Lb9ZYL888u7dW968+YjH+zf0\n7ZGtbVzsQu+DQz3gvdFDszWydHacy0gSSfzAdhm8/vV7usP7ZaWXHbMDZXa72PySnVEDjTa/miXY\ntj7tO9k549OcWgRQzf3lmQTTHZB7K+Q6jm9OLpC04F2/qWAE00+qHE8rUrLH+3IZ9CHZreZz8n7f\naXtntJH2sJ4zMKPlvpXIr4qp9cjt7Q2nwytKBZeNbey07SEPAEBLYVFjXRdOpxN1LSyHhbCYQ2EC\nxmDrF1pv89/fWz7/FAd2ZNuAzgHCXGf9jUC0409TaHKAwtWAPCS/U8eM2Zs98E52fkzbjuic3Dx5\nbUiofp2TF0ROCxqwrjkcIJozKpSysKwHii0c1jW/6KwsKOl7XA7r5EQWXn/4joe3Z9plRy0ntbh+\nktDpc4I5QSmV42lhvalYce7PH3O73GElT+Y2bR4RSXDHSNEjSXNNFXUtOXE9AmYPbW+dy2VLq5AH\nMYxxnbcYQrVC77nZcUVcKFa4tAtEQ9iyfAtlWXJQyPAN3LG2sNO4XDqrD17e/hCXX9/SMjJycIRa\nnVPAgzF2TssC4dzcvZptjZ398SMez4NSKr/6jW8jy1/jK+99jj/0T/7z/PJ/+Z9wLEZjfjeQ/t/M\nvcuvbetZ5vd7v9sYY17W2nvt29nn+HCOC4gNGENFhIJAJaTAlCJVLKxE0KBBC/EfQJOuaaeRTlDk\nVhR6oZGUCClBJKSSowJUVCqYMhj7HNt7n3P23us25xjju6bxfnNtV2GIlMgyq2Nr2WvtteYa8/ve\ny/P8Hs23sdYgtZGybmpraXhpJKk0Y+54BDStZoI4Uq4cDgtXN1ec398zDIFh0FZOrEYzhOB49PiC\nahvXr266r1pfr9YXFjnmTp8bKHXFGkixUF3FB1TErdPDO9mSbWqw8N4xhMD5/fucPzjDe4+tlrAd\nuPEWDgYfPc4Z9puJQQxnxtFiobXMsi5c31xze3vD4XDF7e0VS7phSQsihnlZ2O/u6Wyx6u9caiEJ\nOpvOlVrVEz5fZzARP80M06hRGl5Uyubc6+24Bawhi/q+aiukmulNtrb2rqPoRNkQphs/dGTiVePb\ndC4u5cQiNd1VhUqIOlQG0wgDnLEhBMfN8UiNSlEqRa2cNYFUreItDpXtV4wNeLdhu92xmzZshq0C\nxZ3Hmi17L1hTqCgDoLSEM6qmGKcR5x1uUFB1k9pdXFFxeSV2Tei3LBu/zcd379BEy/4iXXFXdb7k\nWtJivvVApqpOnrvjr/Uf2UdIunhpqVIdd7MRbZlVx1V74pLeiKYvPPTw8Bo2o5s40zfiRgjOstls\nGYeRcRxx1iuBKOuhaZ3BMWBQPt9xbiTNgcCJVShAFjBOHQ6dwBO65GHYO1YRQo440YNxXSNxrup0\nqk33EDkT46qZLs6S1qhwXhJiEo1MzpUcE615qlFDgDRdojhjkGI1tbAKOVrEWZzViAINY1PPvCaO\nBBoRJqE0YbAB4zakCO9sn7CPF0w1cYNWsH5w6sqqpwvLYGzg8vaSabNhubnCecMwnVFqphwzbz15\ng+XmwOHrX+Znf/zn+Bf/4n/ha+19nNsCq3YBFqDqa+gjdUkwVmqquGpQ3bNu6FNqSHVE0diMdV14\neXXFk/IGD8IG4516tmuiWgFfkFDZbhzN7YhJcWLGwJp01umyypJqq6TVUYpeUp0fBO1kvdRZMqeq\nDDBVl0Zhb5jOBzZ+UKfbMCo9R1aIG87DxGZNPGSkvYqsQVGGLIklZYiZ4/UVx/mS1BJLnBFjiC2D\nE0Z/hqnKnKxZPfRNoHpHWbJ+ThzXlzPNw+ZsD64gJlGKZbMdddTjlTamDjHbLzpNIzDdDeYkqGrh\n5MrpTh/bCrY1SrIKuqgOkYwRjWDxQWf76uvuyz0xVGlY8QTPHf9gdiuHw1GXrwlaRN1+uZFlxuUB\n2ViaNUzjxHbYMQ0bvB3V3STKkQ120FmtrWRWirFIUadbk4IPAw6Hb5aSC/lUqORMy0pAq+Xv6UwT\n6SFZdz+fOgyaaCWoriClT3N3WylcNiZBYqF1ISum4Tps2HWFlo6aNGa2S167hks3cIVKNeofdlZh\nDtI028d5Sxgs+/OJadqrjtFoBoqde3RGUslQKklv6Vw4wZGbvE4/zK2oyrp5gtsx+R1TCNigyyuR\nQsxJt/ZLJSZ9E7QsrMtKyqsuSky7A8giEbGJWpR2k4tTDmHWxcXrWbGnpEyNQop6SbUCcS1amlt9\nbZwoHCVWVSzkagnWUMUxsiWII7cNm+0F66uEkw5wreC869pGo1HJphKCZ5y2WoVSqcvCZr+l5Myz\nD56x22z42p//Gf/g0Rv8V//0v+R/+Of/PTkEmmtQhdKxXsYUjFSVeVV18ogDk/tle9JoGkGauoOs\nsVzPt3zt2ftsxu9hkj7/kaa8gyD4yTIyQBQQ3RLT41IUM1gpuRGXSkr6+doyyaQ7HW6tpcdJvO6W\nStKDywendHqr9POCpaaFbbDkJvy4e4N7a+DcT9w3AYwQpTIvK7Oc8X+t7/PR7XNujrfUZkirLvhy\nrXqpmRulU2WV7RRRDmVsC5nS/45e9Ze1cvvBDS/GAevvs8aEn1RY7oMCoXWsk/DekrOhFqPmg6Tp\nnCLd107/9UXu9K+mGorM6oTqCg3bVLLlB8846Pxd7xYtairaPRlrcALDIBgzUGMmL4WYViiJlrTD\nyAWS0UA6v6E7fYI6sbLR9FfjcE4BIPr3qV1t+FqLLKKwYrFJ30cN/bvGQkyJuKQOxLF/59H13Ztp\ndlfBqY3WNqeTb/rMpIOsdTrfK02kUpKhdIFwSXRBr27VSq5Iy9Seoy5NEyJbvROVUKRiWve1287x\nFEczSiy3HvxgmTYT27MN3o2KGUsKBcmxMK6BKY5s4uaO1g3ST2W1Iqa06OwxeLwdsAw4ExjchA0W\nZxulLpS8klMhRo3CyOtCSYa0rJSTfdScqC0ZMYma9WbPWR/BlAo0qy16zrTciEbjjktUgIG3VgXK\n0jiFyRlRupK1SnhxNuDMhLUBa7eYbHnw6IKyWDx7xHxEWTOjm4g10woKOult2zyvuOC5ubzGjBta\njkzW8uryFTUlHj96wBJX9tvMB1/6E37ox36G+//b/8jNEClOFxDS89RrLd0e2bBapLD2zWjlhOzQ\nw7vQ8M7gnM6xrg4vef+F58mDM7y3Pa4WsJZpPyC+4qJQxTBYi3T/sRFHyY2SE/MSiVEp/mldOKQG\nvtBM6iqP8vq5pFE6UKRVJZqvy8xgLRbLRZnYfCTcT9/DVC2JzM37H7B6SxHYuYFxN7ELZ3zv/glf\n+uAveGAGbuZKapZYI82IitPXWxpgm7rLytooR0OqhbVkltyQRVtrki56Pnr/JdP5xHDuqXXVgz5l\nCILYQqPrjBXiRm2nw1SzwRGj0SFND8ZhHMA7ciwsOWGDskpjKhzXhMSFdJOZRs9uF9gOk2o+OyRY\n22n9G3svCI7gJ4ZQSUtiTUKLalWt2WqFLVCvIZgZbzcIXuVqhm5kad1YYMBqvIzUih8HctKteLFV\nx/xiaU3HW3FJzMeF5Rh11FW+g4ugd999l7OzM83Z8J4vfvGLvHz5kl/6pV/iq1/9Ku+++y6/8zu/\nw7179/7G175OlNSbrJHVR9zpJpos2a1xfQcuIrgGjUpJFuO7dMQ14qr/L+8btVq1OJ4KPqldSdJd\nH01Uw9lEgQp9aH0X7Gb00LRGfaw+iEJ4s0Ir3OIxIeCCxzlPGAaMtZ3TWDFOISRYj2uVYQgEO1Gy\nJa6OtDpdAlkV6qYFak6QTNcjJtZZ9W1VNN9kjSpPkl4VlmKp1ai8qTVsseSi1ViJ6n/OUgk+3AnC\na+1hal23ak19DZ9wJwG/J4wDQ9jiTGBqgfUIb5w/oBwPpNaIWTAlUoyiuaydsHgMlhAiYhWovJ0m\nlqWCEwYvxPnAMs/s7p+zpIS/PTB88+v83D/6z/jn/+6PWK0jsZJboqRIMVEF/6iQvORCzoaUWgf9\n0mVDMA5CmCy4SrADYhu3x2umyTKNI6hXgmBaz6HRUUtqeoFaa7E24K2CQYQ9rQrLvHJ7ODLHhU0Z\nWeLCXG4xJkFLOkaSrhuVSklJM97XSEuV+fLAxa3jwYeCuy0cb2+4LZDXqCvLWQ/cZ/kV/iPL2+++\ny/c9/h5+4KO3uXl+xY0zxCVpR6axkrQmpLqSciJHS02ZWAbmrAtJyR3S3XkCCUtd4OrFFQ/HM5oz\nHOOqxPKm443aL9ySiy4N+6IIUR2rsV2mIxZnjZLWq4XNwJALcU0cjwu2CdNk77KominMecUNgc12\no6yDlElrImW1DFNs/zcrwUAwCpyJUS2STVYqwjpXYm6YfKlR2wnqturys2TCoNI8qRYxuduZNdrE\nekcq2n6nfpaczqHjcSHOibgWUhJS/A7qNEWEP/iDP+Di4uLuc5///Of5zGc+w6//+q/zW7/1W3z+\n85/n85///N/6PU4kZv3oOSdCnxudQLP1TsogTdl+NMHkRk4qNA4SqCYrDKJKX8a0u2zj/gPTR9HK\n6qz6uRNlqVUQr5xJgFpXWvVggjobMD21TrOAELo9TN90rudoG6cVjLGRXArjtGU7brStzUJZofju\nUCpCOhrijOaxx0ZaK+sSaTT9Xn2EscwrPnh9fcTTTg95s0rYKfSZkA7Sa4/EoGenJDTATBoqwDf9\nEO6vs8pLBCtaDQ9up5KvJhjjGMQyGk8LmbYqbanagmGhOYcxuvAyVqt2kcJmuyEVsK0xjXpYHG9u\nGaaRq5tr7t0842d/8rP82Xt/ydfSh+SSya3orLaIuoBSoyyVtBby0sgLULyObkzDDuC8vaPpYDQW\npKyJ25sbUkyEweKCUHGEfpkMwZNbRw6ekgC8I5gJjF6qwzjihsBUVtbllmUNuBlSOWCcJebYyVkC\nRRcjKUdiysiHkfuz5+0bwVwduKwLU9OkRusnrOjfJcaVIJ64rnz5L/4d319/mB98+in+zasvs66X\nFGuRJp0/UJWfWbqBoSVNAfWNMBmW65XctG03RSU3tRsv1nUlpoStXp+JpAckXWwOkHOjVas6FG2a\nOiZQ7Z4h6ILUOafs0aIFScqFfdxwezgwHw/Eoh2QGMFbr9W5JKbdRE5WUw1it0hK6amf0iNQFCNX\ncyPmiNCjb1rGtsIyF25upG/3E7mMrEvGByEEh5/UVolJ+NGSOvaN1rrRRTPVQYXsy7IS55V1jeSU\nKMt3eHt+8u6ePn73d3+XP/zDPwTgV37lV/iZn/mZb3tont6s3/phbNOZAkKp33LYwWvBqVJU+x8d\nshSsbRQXkbU7Tq15LTru3unW5yxqdQPQf79CR3wBVlP4bBfcGltAMrlGyEYPpZyhFRoJPXVLt1bS\nZUfqMDLG6h97njFiGMcJEU/JaArlbKmmcZyPzIfMfCzkJTHPmbQUzdWxRl+HouJbZyykohCPTnCp\nySjdJau+sOZKjZpPXkpDSHeD7VrBe/Martv/DrXWOyzfaRZk7cQwTDRv8VVIMbPcrNTrhZVMKIYY\nMz4YzWfCd7NMxroADY5x5d75A24ub/FFBdvkhB0t8zLz8Pycj97/Ovff/FF+4lM/ydf+j/+JabAc\nY6T2A3NdM3Ut5LlqJbCo2L1mBT8Yo8utagHJONFlTy7Kxb28vmYcItPkGEZL9pZWR3VWiWpwDUo4\nz7lSKrjB4MWQe8bMtJ3YuZFlCdwebjAG5iiUfGCps87aa2XrNXfGN4t/duRxGfjeFlhc5mAaZ5wx\nS2UYJw7zwmR9lxBN1LyqQkwKV69eYt/c8Or2JZoHRReC96F8Fc1Ql0IVD07hNrEmTFAgS4eIdcfd\nCZD6p0IAACAASURBVDoNa0yEbGhJ1FhCz0/vmVf6uqMSoqoXrHilrofRM00j3oZupqg40SXMzjpq\nbuzTxHHZcnV7w7zOtFqY/IgfAlI1Q8iEgSEMuGMk20ReGrFFSk19G68W0CirFilNM6tM0B2GNZZl\nnSmXmeNyrQzXcSCMls12wE+DBhsOhtCEIXhFyrU+jhO6wSF3t9JCXldiWslrgfU72J6LCD/3cz+H\ntZZf+7Vf41d/9Vd5/vw5T548AeDJkyc8f/78237ta1be6Zv1P7DIXctzIhrd2d1EKE3FxQa135mm\nby6J+i6pJx1dVt95NjrrFBFqUjSYc55SFbTbEJWcSMZIo4lDpCAtU2RPrhXmmep6NOs6M6cDS5qZ\n8y2prORYAX2w9LDUnJIGhOBZ40KxaMpfc8S1YGRFjHBcGtc3M2kuxHVlXVeVt1RdfkjVw9qIoRjd\nIOv87UQ9cuS10LJmFOWssaynJM2c1v6Aa5a1uKAxp8WQ14R3iSpCjJkmVk0CywHrrxiGDZs2EazD\nJmCtuGnicHmlrg0nHNZbgjOUYjRDSCZSg1YL66sDh5eXOGtYBEzVWNpcDdthIObG/uycD//ij/mR\nT/ww/3L7v/OX6ZZUEsc4M8+FNmfirJKpnKXbS4umI3Zhdblr84RSBEkD2MZcBSOZeT1C81hGbDVU\npwsHR0XEkkwiZzU9uGYoxmgkgwjWgbc6F7fOM40T1hnCYpkXT8yRVBe25owQduzsxIOD8CO7e3xc\n7rHUxHqzMPiBYhrBGHKMnE8bWhWsUe5jEcveTxxuEzfpmrfDW+yGLeG4IGsiUfBioTikQnWQS8M2\n9Xnr4ee7vrLhTO0wDkHGwjCNWGewZFpxd/nnxjqtkpshlwIUvPEdmA1iqrpovFM1iDW4UQEvKmwX\nRJTKXhoEE/DREvaWnHfknDEoE5QMGGEQHb/JJFTRzitTcK4RPKSTWcVrp+hcn7sbcM5SpFCaKIz7\nNgOXuGDY7LesbceGQMaTimVNwuId3ulyznm1YueUe9RyJMeiFW9s5Hmlxu+g5OiP/uiPePr0KR9+\n+CGf+cxn+OQnP/nv/e+vqTF/80PUmdXlHHInST+146f5+ikgS4QOF+3kI6NfUUrFVukar0YxWpkZ\nV1WqYw0l65JCNYB6sLSTLMk6rBXls58I8U1L+JRXTLLUatX/nArH+cC8HJnna+bllmWZoViMBJp5\nveVXH6ySgmoqLMvMZtiQUiQ3bcucc/0Pp8No1ahJH1r3oLc+kC+iW2X1vBdUK2UoTQ+UtqpUKcUe\nW1o1N8VZXdJ4EUarC58UEw5oXn2/YswdNCWiVcmRW47+gN84gqn4PGKrkHIilcyaMmEwTNsdN8st\nU0uEOoDxiHVs9+dszy6IaWY77ri6ecE0Om5vrrm5veb6VeKNh4+Qltm9NTGlmf/6P/9l/tv/+b+j\nlMIyQ1qgLEarqtylUaJtaSlZ27NiNPrCKoW+iHYh1itGLFfUd2kaDs8YLC0LJVaKqVhbiKmwxEQs\nmqMtxdB8xY2eWqF0o4A0dVtJM+w2e4ILrGVFZsuZ3+M2W+5lwz+e3uZiuCAXmDtb0tlBnUbe9+RP\nhdUogDnjXGBZCyE4lpLwBDYMKtGxFltQJxuCcQaKYDyctJPQKDWrFdkaNYJUARzOC2Fy+NFgBw3P\nQ4yqRlrvztAMoFpPIy3N+LHO9feqUEoCRnJdGYYRNzjcCZhCwxudt4vZ4LxTYlaHd6SYVKhewVbB\nWc8QBuDAvC60RZdR08ZTbVWr4xhZDlFjqF3f9tNwOEXxlUbOTQ0RTmfRy3LEONXLRlJfZilL1omn\nlKasziqdnJXJJVFqZZkzyzFRv5OV5tOnTwF49OgRn/vc5/jiF7/IkydPePbsGW+88Qbf/OY3efz4\n8bf92stnrwDtNqbdyLAbUT3layvWa2xXu2sjT8sjWu6pg1p1lOI07a81Vgq+GcV1me7LLk1th8Zg\nbNX5lxX0+hMQreAQIeXMklaIQpOgiYhZWJaVNR5Z1iNrPJLyrJj+asA0Wgl3F0XL6qbQxVbhcLhh\nM20VZpwaxs6a19wiKa+sKdFK1SqqNUrJuuHsc9fT5VOMEulVGpMxTbFcJXU1QtVWrhbNvs654Jpm\nzojoaxKs5qUIQkmZbBO1VWUmjlsMBmlHrl6+oK0Jxj3b4QzTImtcwBnScSGnwjhZvudjH+ODZ89Y\n0g3jMBHCfVJSSc5mdw/xgfvT2NmNG26vn2N8YH9+xhoLKcPh+Ue8/R/9Q3783U9z/ef/Nx/MN7QI\nu805t7c3Cg2WqJiraoAeGytqlz3NEyv639MSSbkgJVJz5tg0B3232TC6iRIrkQhtJRY4zImr2wNi\nMvv9ljBqhowbBoLPTKOCoNUVr4F+Dstu2rO3E/th4o068Zk3f5S93TOvM740hmYhBGpT6DT03CVR\nSIRzWq3pZWg41JlgGhu74dH5Y/7s+AxrvEZIVLUnnuqgE6mpIYjR7J1sKhk1SEgGsa0nllb85PU5\nNaghoZk+H9ffp5TC66m/3DmfWqtahRYhpqiyryK4ZmlOR1Kuazg1rNUQ/EjWLRclFfzgKKlCM0hS\nDTVFCFNgiIFcArRMzTAFlUs1Wxi3E0LpqLnOSejjqrhWrC+YqtCY1jKlrqpZbplgQ1d13Dlf7l6z\nlBIpJXKO1Fp5/tdXfPhXt+RcqPE7BCE+Ho+UUtjv9xwOB37v936P3/zN3+Szn/0sX/jCF/iN3/gN\nvvCFL/ALv/AL3/br7795djeiAdSqJiqmPX3uDlD6H1SrmvJraDZjUIlSqRWyg1qpNlNXOsFEeh4R\n1B745O4eDEOvb/UQrSpizjWyRGg2U9vAYi22GWKMrHHVLOaaMJ1mVNbaIxIKxkxajUiPR2hCSUJm\n5uXVM7abneY7o/zA0jJrXllTpKZEzYVcix5+rUFfzuil0cgov1Oquo5qLf1BquSiF4ARnWFq6p4+\nzCCkjuRqtYDXaly67CPGhKRCyer3jqtWx9fHW4bdO2zfHmn2QBZDrTD4wDzfssyZr/71e3zqhz/F\n+1/7K26uL1lyxQ8b5sMVu/MLzh89ZTMGrq5eYa3j/OyCZZ55/uwDLh494ZvPvsHTx+fYv/5Lfuan\n/xn/65/8MW4WHm7P+XC+YTAWPwwUJ0jSeW1PG1G5eYNWtQuJKSFkUk56yJSTzS9xc3Xk3v2MjBaa\noSZlBaRUSEvh6sUNl7cvOD/fst9tcYMwbUe2uy15u6FVheJmKqVlBhF2ZsO0sTyInp9959O80SZu\njwuSM1WUFlSoDNMWQQPdTprBahumVYZh1AurwWAKh+XA9dVLdkFVBiOGZB3WCElS15UqDCXVokAN\nU2miF6W601RGl2vEhgk7DVRfcWFg8K8XgLYrm2vTrbyzHim6CBWULGSD0c25reSyIPOIUEFmNpuK\n9VtCCORatGNzhULGi6cUNTzU0sPYGt262JSiZRvDOOjrmjLZqMSsxcKwV0K7GBX+16Yjt5Z7jIjV\n51WqoVWnQBJbVS0jBeuaOrJ6mCC9u5XqNTynRV0sp8b5oy2bzUg8JuIx8t6Xbv7Ws+//86H5/Plz\nPve5zwE6P/vlX/5lfv7nf54f+7Ef4xd/8Rf57d/+7TvJ0bf76J0sp0xzK2jVKGic6re056elDWiL\n3i9HGtLnMbpRTC1jvGCLdPCCCsuNMTin8y7ndYBtG5r/glXnUGl3ede1ZlIWTH9TeR/0Ae3i59YK\n4xheB2nVqJktNHJZFQTRFJNVWwKJ0IQ1rgoiMbn74BVmvCwzKS7qta1Va5keACdNBf1VDA3bIQiN\nFCPG+O4QUjtYw6hFDpVlqQhAgRi5rEjzlKaREnpfFBrSWZX6b+cIccmMPlGHLWVqTFPlgZ94hVCL\nUFUXDMZSa8YCf/rH/yef+MQPcHtcsEH9vc4Gbg5HLm/+kuAd5/strWbiqmg2v9lxefmCN54+4OZq\n5vw88cbFY/7Jp36SP/q3/4rnty8YmiV34PTAlmpusUVVB6XnydSSVVtZdBsc/EQrleAEcRXjCsJE\nKZlliZRRC6zcMrWVO/J7nBeOlzfUw8K6P+p22hu2+w2PHj1inEZtNaVhqWyGkdYMj2vgc29/miFO\nxDhD0xnldrNVa3ATmjgN9rJdPmd0gSc16xtZrRq6SGzCMkemYSRYhY2IFHKacVbI0lmp1K6RBZOF\nMAlpThSbSM4gTnFw45nHDgVnNeu79vddKZVq9eIsuWBFwcEVjc5Ver6WGEY8wWh4fa3CIR+otxnY\nE/xW8YFu0N/XFJodqV0dkOaF2hrFaMpqq9rV1FzJMeqi1SbCKBjriCWpzM/aHgtv+7Kykis4qwFy\n0rGPLVusCYTRYfxJQ5vIWT3nxkgPxItaYFRNXC3VkqqqTuJaybGyLJXj4TtUaX784x/nT//0T//G\n5y8uLvj93//9/9evrwKmtf7mPekoe0tgu9ZSTg4EFd2eYi8a+qZvBrJpOow+fd+iiYJyCoWyRoPi\nS8UanYU5Z7A2K1PPgh+LDve71ar17Jic9UAquY8F+qLKOxWA6sxRMMWyrqdZYqbQNG60mbufVcdG\nlRhvaWRSU72kob/Z+7ZTsOoRb4Kp+gJI36DrBqBSS69eOxbtpEmqFhpaVZ9uHenieDGNTjygWgtS\nlEcqXd6TpcNdoZL1FouWkhqPvu8cYiHmqhlMElX0WDu/Uyrb7RnvvfdN3nz6vdzcHkA8GcfZ2YgV\ndS6VmDnMt4xjUCjDmrCSuL6+5XyzYbm5ZvjgBf/sn36Wr733ZV4cXnF/u+XlcoOzjkomiNcZdW4k\n03RpRqVEyCUzjVu2W0+jMUzCvFzjAhgCqRRyOXYdaB+dtEYuCr8wRghiKSlz8+pW+QS2sRxXnHiG\ncSJ4RySzwxCmDT/y+GN8cvMIEK7jS9YCgx2ZvCcX5RAE56gYrCjg2DptH1VDbLpywVFMpR0q0zhA\nWpn8xG7aKyuyRCyQ5Uij6mLKWIokaqcRxVxUy+ks1hayy2x2I35rNZfKqYXRWM2JKj00pKRCSeCM\n1wVRq524btS/HzzGKQ6u5EJMl51PGzi8EgZZ1LwxeJwV8EHnzhQFbVdhqQkJVhdVNMRo3IwxBvEC\nnVFjQsVno+i5oFg5yYaUdVnVbKSkQkon2ZDRY91qt+qNJ4y6yHNWL/VTlWW1MqM0HcHlXCgRSizU\nYkml9aPoO7gI+v/3oRs/c1IS1ZM7p5OOiLTmOOW3tKa1daMg1moOcwNnXs8qTouYWjqUoOmGnW57\nyyYpUzM7hsHgq1Zj22nLZqsD7dyqQkAQ0mkrbjTN0fSwKO+d5ooYofRUTREhx6w57l0Z0HLpv6lq\nR0Gp1o1CKrlfGJrjLFYfCqnKkVSajkBVgo+SdwoUpz7xUlVKJOqNNlYlIkYErJrBDfS8JHUBFQGR\n3CUojWp6oJhUjCkK9E1eLwmbVTJSKr7B8fYVMS6opDFhndYgpVQwAy5MeD/y0asPuLh4yJoru90e\nZz23h2vGacNus+XcPOL58/eYxomSHMsxEpdCsoU1FW4un3Hx7k/wE9//aa7TNe9dHzkbd2Az2Rj8\nqkaD6xTJx1UjiaNqM59sdmRnGMbG7myPcUc2dVBMbavYo2ps1zJTo6h0pxr1xddKSbMeqE1wOIVE\nr7AsMz5/hJ82XDy8z2255GJ7n59++sO8u9sjJXJzfcAUFYV7rwsRjMEHjbSQvtALztJqwp26qqYZ\nNmK0NZ62E/EwM4yeV9dHrVBdY/RCTAZpIyUDbdWLtVlKK7SWaM1Sii6XmhfCzjE+DPidYfQBEUOU\nhvcN6W1+6TEtIpZBHN7qIsZ77cDCqBKe0tRJYIxgzaDPnLFQ4HCMhE3C+gDW6vadRnCW1CIpG1zp\nC9ng1NPuDFasVpmtUWyCoHsAK4YqOq/ORjBNPeKlQcqOtCzUZIjRYTE44zRTHr00jASs1Y37CYGn\nIy61S5vWcKicz9TW464bOTZiSbi/r3EXgMqMmm5rT4eCHpKtE8jl7gA6tes6gzuFM51sXv2bcXJm\ntDtB+LfmYnd0DV3NgwSHDRbvLWMYGEZN3FvmRVvp00hA1NPsumzhxBmsIvhaGfOAqZG1+5I1ykSF\nyLVqKJrOJAvFJppUnDV3bgv1wTYQBS93mlaXgABFb1LT3VG1FTQlSPNShEaNGTcG1UxKw9rcD0ND\nM5ZmAdvUTdQS1hU9/MTqDRwc9USir6LkFxrpMjJWi7OenCEdM8Y63f6LVn9Kuj5SSmO7vY+zW/bn\nO168eEkpN5SauL255HmtvPnWx/De8eLFR1zcP2fabnl5+QpjYFomjF2Yn32dn/ipf8KrZ+9x5Ov6\nppLGmhd29wIpZ/7qo4/YbM+5OR65TTMbO9Bc4p2PvcmHh29wfm9kGs85Jku1lZeHSwbXoMys9ZqW\nAikaDesSDWrLVZNQXX/YjHFsQuD6eMN8dWCsaoQYbeazn/5xfujiHuUYmY8R7zwiFes8pYC1jorq\nfo045XKaDtyutTsp9DlX6rkueIpVNuvZxQXXVwvbJ/eQJUPziDkieSWWAlUXh03oWe1dIWIbzQrN\nVcbBsD8bGTZgR8GNFuuUXytGSfO5RJzVwD1bDcFZpmGDsxbvRkQsRTLOWFJO+ny4/m9W3SmUWJmv\nFoxYttsNxWVyqXixGGcYx1HPsz6qKEUXvg19H5V0SkJVXZKxKqwvVcXnpWRqEciVFjMlVlJUMlct\nhdU1BgwhDIjVuBTnLNbyLZlDndVZirrJ1vqaqNRGhEhrSTtK//c0jfKu3UUPPsOp9VZHkMFQ4c5m\nCXoAKjS7VwlWv77vS3SYfWqbTw37yaqJnMpRxBhcCGqNtJ3ebNWiNgSLdxv8alkWFcDqH9dijMU5\nna8omEARc8VXSrDYnLQl6W6cRiPX7p/tP6PQML2i1viOhrf2bqEj5uTY0SF8rqj1sTWdX9am7pWm\nRJ2W1UV1d9mIuqfEZHXJGB1PmNAQV7HeYoyuVq3ROAzNZtLqtIpmN520qw92FwxGPcfjtGG+vcY2\n1UZiHbmCxzBtdngfwFQ+evGczXJg3OxIGRqBy1czKR758z/71/zgpz/F17/2NeI6s9tO2GCY14VX\nh1um7Yb84gVnP/Kj3H/ykI/HW00ARZi2EzZnnl29Ip4rmSlu93zp+is8fHyfD28+ZHSZj12csXGJ\nJw8ekWXDh7cfUBrMqK885VVdU6shNa+xx1WbMmt9r6bVz38+jki6ZTNtOBPLMC/88md+gU/de4tU\nF5a09upFHUk0i3WBhjCOEzElggHvut1VUFlO1bmzdO2d9JjosvYRSDDsz8552jK35kCuHieC9Y5Y\ni+bitKjwi84AFQFjlWsqo1FavSuIE0wAbMV5T+tFw5ISwTlcNUwuMEhg8pMCZazHSCCforbRrPOC\n5s63imqdaXjxpJgoa6KEggwajCi53bENNtsNyzFS69oXOI1CVzyU0hdbqOSuamc2LwstV1I0qoVe\nLXEplCSkNTLaAWMD+KZkI9cjgkULqVP6jEijFLW81pz10ExVgxQPK8ejkFflzIqTjsH72z++e8Fq\nRf/QRvSFp+mbvdaipp8mCBpqryiqPgyuOgepqD5LpTUK4ajVorSk1IGo3FWXTbRFo2Vq0YfYW0dw\noy5UGioaF314x2HC4Dgcjl3Ocqo6O97fCMFbWjEUEbJvNJ9otWeaoBSkKq0nJipX05RKaxZj0QPK\n9Lx2eY22o6n2MBjBmkqRqnlBVUEVJUt34OjiQ0zGjhMEtap5GxDvsR5wGnFsXL98pGCMvoFd4y4a\nWMRhqlVxdwNTg+YvDY79/XNcUcDCZjtxuJppAkuKBD8xbnZYv8UET8bw8OkTps0WFwIvL1+Sc+Lt\nd76P977yZfzG8+df+jI/+MlP8sf/6l9yPFgGb3jj0WPECkuJyKsPOcfwo+98Am5vucyVEBwfv3jA\n9e0NJjeePnjMzdUlizMMt41798953yjQ5HsffZzn5X324Yy2OXLEkfMOKyvz0VCiY8kZlwoHkxlS\nouWMlcTmbOA4Z1gjUhX6EHwgWOHt84f84x/9NJ969CbpcMPcFPSw3Z6RlswQBsRbqjNsNrt+IXqC\n9V33m2hetBIsmnleamUYPFYg10Krkc10RmuRcXMPkcI9v6UdLjnWiomOOFTWmPsyI2Kr5urUqOaO\nJo0weYwfyMYQrMf0fUFqakuMVbn1ZBhdIIhl6x0Wjag2VCQkrFU5W0yR2FK3fUY1VxT1cduxQmgQ\nJ8qxIb4XBkarXoBhGJCq7qElFZJkxDiMFFwTYp8n5qQzepXr6cHsciYvwrqoAaTMIAzEVthsiuaZ\nO/CmEJyG7ZmT9K91OI0ESrcdi6gKYlmL8guMKnHsRjBBL76/6+O72p63pi+Oge4F77rMXmm21tQX\njLa2xugGmb5p1LjYPutsmljZjOgyhdfaxtPGWXqkaIqVZUls9hO9dtWqrzXIKjo2aKyptUIzlsF4\nrDha1tK3lNMNqRKHU6UiGMToVrJWXQ7pz62pjjqf1W21c6cSWjOhRQRvnLYwUqmx53mbviGl9Vwh\nfanMqbrwDlyfMwaHuAwOqgc7GKp0XaoRcA0k60yYimShJQel4+SqajuNq4zTlsfnb9FWSJJw3tFq\nVH1pFkIYGMcBP05M2y1YYT9MGBFefPCclBPWGY6HI6yRRw8e8M1n79PSzAfPP+CNt76Hjz74BmFz\nRqyF+TBzvt/pDHK+4uzhQz5+cc6rm8jufM9977l3fl83tH7gvQx2O/KwOYyfeHRxH2Hm3v6CXWp8\n//13uLp5id8Zvr6+ZM8NcyxMmzd4P36ks79lIZXM4JyS1SXwYbxh8R4jjr0LvHlxj3cenPPf/NRn\neGN/Rl5mlqTaVu88Ka4YY0k0gvWEMJKStnqDN5QSsc4zGk/OCUtTdUfuz3SpHMsKtTH4wCEWpu05\nro5sZEOTGbd6jNsoXGRdsMZhyoptVrPcsy4BaxOs8TpOGnrEC5mExfcwOVsLMWdsFbybdDzTo2AM\nSaVsfa5ejWo9Tc1IyTQSSCFnPTiVSdmIrXC7Zvb7lUlGhtFjijDZAamewVl2O/WsewKt3WLrwhIL\nxo+43EipUPJy10bXIoBV1q0pYJJKioJHMJ3/adhsu9bVVR07OF1mqmtOSKXLkKqmfeaEOu6KMhpK\n1ahsFzSIzU/+7zy3vrszTbT6Oom3W+2HJ3AKR6L1tvzkBjIoubx/TalVB7683qCfZo5aHDZOoVld\nvEQzwuF2ZbNb2EwOcKr7bCpjki7dkWRUYA69OtPvI13Aa8RQS9QNdgcCtKri9CZFK0TRn5mTELk7\nnBS83K8EY3pbpUxRi+oIMbW3QF2bK3rR9F8S+kzIOoEeZdxsw01NF0seTeBEEF9ptkLPTbGilKSa\nKtYE8iqUpdJywTrHxcWOwex56/HHsOK6Hzjg3MqKWk+XVfPZU64Y59me7VnXSC2Z/fmZujC85WuH\nA1evXjKNI8M4kuLC8xcf8AM/+EOknBmsYdpOLGlmGEY2wSKrMJw95ixMyNYwhUBdZ0QM98eA9SOb\np29STOOtccNu2vPs8hXjNDKd7Xh2GHiQd7x9vuffvJrxZ3tWU4ntkm3YULeJOc483Yy8vLnlwdl9\nfG605tgbz/vXVwxhw/fdf8Q7F+d89h/9F9wbhOVwydoy2RmV46SIcx7Es92fY73vz6L056HHZ8So\nTW7OYBuVQs3qFqqtasY8jRIj1lhsCLhhYhMyqTQ2cUtKGXJDCBjxCJZWsorUq2qFQZeCdCq7cRrz\nUqjqdksNU1tnKEARRzKRwU+9iKl6mLSEC0G7upopLRLLQm2FXA7qkIuJXCprblwePM46tod7PKhP\n2J9tcIMWCwMjQbwK2YcBycJmrBzXSjQrrx9whYYbjErvWud2Rt3mi7dqTPAddejAhQaSlKVp0d+0\nFc1lygYzBE21LA2apZTKumbWORNnhX+XWjFWW3rrDcP47+vC/8OP7/KhCfpCofIL033gXfZvxHUv\nd+kHpipUbW/PS3cIlVJOFKveakp34vTWnL6R6/IbmqFkuL667TPMSpOJ3CrbUZBmsdbgjGVwpzeB\nCnPTekrb67DTpkQjZzUpsjoLuVGKUEp3bzQdB2holaiQGdvtXfrztKrbbGvVnaGhXU2jjI36rG0p\n5HKaX2lb7iw0WxHXNATTA7Zhg1KLijQ9OJ1okFpVhF5tCWkeY0aoCr1Qt2DkyeN7PH34CNsGbMvg\nKi2PtKKAjpwEpJKPK9Iqty8+5MP3/xpjG/cvnnDx+BFzPGKaxq2+9e7bfOO9b3B1q159Y4R4jOTa\nuP/oCfHmIx7eP4N2TsorZRgpV88oObLZbNWzVQo4S1kLj7b3cIOHs53SccxASjMPthuqcWw3W94Z\nd9gQaFiG9imeHS555Z5x9uAdvvTBMz795E3m45GXV1d879P7BPFsd3tu5oX74wZK4/H5nk8+fMQ/\n/PinGGWhRFiKWu2sVbCwYMi5Me0m1pjxTdhMIyVnpFYG1w0XosJv64yGltWTdjDjxNw5uBKVkmEc\ndxAdO+e42Qy4ecB7XbJY77DJY6rD2ULOq0qAqmDpcRT6pGHtQG1d53yKRM6ZmhuI4UDC1AysbFwm\nWIO0QVv5fEvNmTVHYlUeQGwZSlSN5YK6r1pmjSDGsqQETnD2EVszUZdMc43iCjFFsOrnd04Rc2Du\n0IU5V1pXn9RYWWNUdUZRPKDVNEGNRRFwTl9DOVXK6Pe15nU8cKuo3TJpNE7qsSKNfFeolFqwwTMM\nhjAWXPh7f2i+/jixNBv0pMZvgXoIdzOKk53Sul7CSX+h6fk8aJusYWv6/U4xF70gBAO31wnhQMqV\nNVWmrUJ9N6MneIcT3ZjX2rpVswe7Vb3JTy16y6XPZQVDwFshdXKQNPX4nkLaRITqdcZVa1R3UZ9j\n6u+r80UxggkOX1RHKQgEIdV29zUiaNC9z9iA8kOd/qcYAaswZDpyq1FxVue+NTVyEgIDtVpapBI6\nWQAAIABJREFUUo3b07ce8+TRA3bTlk044/F0TrBgSurrgIL1VhmMLH2hNeCCYfCedTny7OvvEUth\nu91z794FN1c3WGs5zkdKSazHa7bbDX/xb/81/8lP/KdctZkWI48fPuLZB99kcA9YXl1i6kIRw/78\nPrfXN6ypcphn9uf32IxTv0QNVgJxsbjB89GLj5iypw0BaY1pCGzangsDN8Zy7/yC4SgcWdk8fchX\n83s8vbhPPMxcPHyDD66v2JqBUCrf87E3+cTj7+dj5+dcHT4iV6f2RBFiTAyDh2QI2x0N6UxOtex5\nP1DWhDFe4ztST1lE9YGaDy5d9lPuFoFUNWPklgnbAak3mCxYp6JxCZZpGFiSJ1dPK0k1nhTFEXqL\nL04vbhqpapvbYsGKkFrPdqrQnG7zfY2INMiWZBuILrcKSllPdSHWrC05/b2W0MVKz7KyzRDXylwX\nXplrght64oAn5MY6Ry0ehoAzFhesdi5W319xSazr2rsvPUz1jQ00jc/A9ILGa4/qnLbozlqM1bHV\na+ePQnNqz3vWKpoukleik3UwjA6sLsbcYLvG8+9pe15rveM3fqssqBSdU7aqq55vdVB+KxVJ+v/H\nnryx5nU7XyuaBInQTL37uvYtjM5cMs46bm4iqVRSTZzX0JdNI1PIBOd0DlT7ULo7TkAlSLW34rU2\nagGj8mNEVMPYnL+LALbGMAR9YGiNWAspWWJe74hEDelEeSVP22Y6PKFSzWuqE1VlQTnnXnWrD99Y\nwViFejRBZ5nmjm+OGBVz1yq06vEmkIuS8FsuPLh/wcMHFzw4e8BmDNwbLxgZdDRSFSqB8zx84wmv\nXn5IqAmHo5aG854wOAbvGPbqsX/23vt8+MFHfOUrf81P/vRPsRwOLPOR7Wbk5uol/+Ddp3zlS3/O\nD3ziXdLhiufPv8nmbMtye0s8Lvg2M222iBg2+x3Pv/pVWNVyejHe5xvPn/Hw/mNeXr7EuMCLb3wd\nHwxj8JhmGYeAmxz1mJmM5fzBY4b9OZ98p7KsR17cXvIf/8AnkOtb2rinmcb5kze4tzvyMGy47x5w\ncXafZK5osVCs3rZSKtM0shxuGMN9lsMKrjAMELzrVaNjGEZqzliriZZQWNcF0IViijoOCdZp4JnR\nSnActhgLqUaVLDmDCZbNdqJJwiXLbrPFuMrgDYebW81CRyur0kdbrSmAV4weuEtOlL5V9qK5rdYp\nLei46mImu0YVhYAUGhh9VnMpGnpopetE1TByYnWS+6MW4eb2Fucsu/2OcRhZjqtqM/si11bDctDs\ncwDnBlo7kuJJDK/b7VbpqpXX73lpFWdVV+q8RqI4b9FDtmJtB4nzugixYvBO+gy5c28HQ0mJEDyS\ngzrbjGrAXY/2+Ns+vquSI+DuEKu1du95l9oYoFlat7gVHSzqnKgJtelsspygAuY1asC6Rq5ZM4Yy\n3Umk2+r+r2OMVf1kFY63ysa0UnHNYeqBOghl2ECnvKScSSmizW3oSZDdjYHgaHprmwZOyCjWzVqD\nd0q+DtbgmlMJBnBjjM4VzYKS418j8DTdjy5FUfCIN7YTiXR2pd7i3IPiQKQgUjHSidsVpHiaK2Qa\nvnmSUYBIM4ZWDCYL1IQ4x2bjubefODsfCGGiBRi85+XhBn9defzkTUJwvHp5yW67Zz2uHG6uiWui\nUjCtcn7/PuZwTQMev/kWZ9s911ev+LM/+VM++ekf4qNnH7DdDVw8vuDMGNK4cogL5XCrm80mOF+g\nCXPNjOOGKrCuhfl2xo8Da0y8ujlQU+ErX/lyH9OA84Hj8dD5pQHnhGff+CbzfOT83j22Z1tKK2wG\nz9n+Id4HakvM2wopsd+fU+xAXiqExPm9LZvBkOIGsQutedqyYMUQ55lhs+sXKQQ3YL1TBkBc9Fkd\nJ4IPCBnEqTzHW3JaWY4LKRXEZIpz+Ko/r1jLfn+POFiOhyN1qDgafoCxGoQJKZnaIjkPYCtlEmo8\n4moiidCS5j9oag9IQQnoJyeYGIx3CoNpWo3mDIioUcD2SA/XsDSyFHzQYMFWtJihQq4KIq5ZFSOl\nCMYob/ZwecUz/wyqsNtWSiqE4LHHSMtqZknHhXk+/j/MvcmvrdlZ5vlb7dfs5nS3jcYOmwhjmyKr\nSilRDBIJCZlRCeWgZMlMEAwZMgF5yAT/BcwYeISgBlWQVUqLQlnlkqoGlAqSxiaxwY5w+Ebc5tzT\n7eZrVleDd+19I0hjJFIle0sRuvecc/c5++zvW+td7/s8v4cYhaNprcTYYKDEw2KIYACVlrQXihDh\nc6Jkg9IOjppP0cjK6VCKJ62r4L+A0bWXrGaKRrK9cqwDM5ltGG1/vKfnwMcqzX/0mVfOGmqv8h99\nXlEOY2SxGVKqVbLI8fwjD60QQnst8w+Lk6pH+3GIDDvwaiJnTYiaGPck7yqVOxFTFE2oqlknRY5U\nqVqvlBHro9FinStZdj5rrERj4HDaCRMwZzrVyUBr1MQYqhxIgBgylEIGYkWO50ZrlLfkHGqbQZOj\n7LCHkwxoYrSYbOUGMZkSLCUoCV9zcqOWHIGMtgbtpKeGLXQLT7ds8b7BuYY57ZiswmmPdYbOr8mx\nsN1tMcajbcN0e43V4ox6+u4VpvOsViu2bcc07Gm859Of/gmm7Y433nmTvNthUmK7v+bkZMX1hx9w\nfv+CJga2uz06BMGwzZHOO5yzvHjxkhAjp8uHjBHK7RalFL5t2dzeYpuWm82OxssNM4fIZrNjs91h\nnaVfLhj3e263ezrXUHLidLVgmie2Nzfcf3Bf/PdxZne3wWnNG68/Zp4n5mEHRhP2E2gIIeO7jt00\nsu7PMdqhlMag0bFgtMVqjw6ZkieiEl1tSokYA2GejxswKMI8YxorJ6ZQUG3DZdyym7c1xniWa1sJ\nDcl1FhcVTaphazmA0hhdN8hckBRr6amrXIS6laXvaKyBVNGJlcKotSYiLR9t60BGIwuvgpwSxoh7\nCsS8IZDMA0ZRNvEUFSpl9nEghOeooon3LujHmaZtZd6T64YeM/M0EsJUr3+wVvqxWouc0FgjZDD1\naiCsC5V7K9e+pO4KmPsA0v742iLyv5gTqYj7KxdxbemawKlUjY0+SBN/yONHtmjqf9yzRGq4Ut+g\nI3mCQ4FZezG8cuSInEfE4PGwIGapzgyaVGVDpQgdCOoRP5WjiPyQy1xSZthEWpeksiuRkAQG0ThL\nDHPNZBf9qBzZ85GiUoo6vi6VJf85o+QGsharZQLsdYNx4sFl1tTEVA5BTyDiYTnO1ViNUqOMNYA0\nqmUn1eQKtIgpYrNIgVQpJDLGGrKumlFAWS0kJguUQiLgUGRtBGSiJpKNWK/xSysAidDgVcPD0/t4\nK+mK67IQx0sSIbK+9eSSmELAuoZFvyYXzYffe5/F6ZqT+2cMl3tWXcN6/SaTUcTL57SrnpvrK/Yv\nX3D/8Wu8eHHLul+w2Y2c9AbXOF6+vGS9PmGz2Qhncx4pwHK54GZ3zcOzc8bNljnDFBPOCZBiux+5\nd/+Ceb7m7PSMNBdu7255eXXLerFivVrSdC0fPr3CacP2bsucAsY1nJ+tefTGJ0SeluV9UEmTciHm\nwmK5YgqR1fKUNBfZ7IxE4BqjccaJ/5pMjjMpCyE85UQMs4Cmwwwo2rY52nCLMjTOYxcL7uKeq5uX\nwgUtmWkeIEbmKIR25zTBadrOE2Ni3O0rdLoQJ6kQS0lgBfAr38NIrG6U662WbsJIKEUifhUQ5bpT\n1eNOEi11CK84rZJBZCtf1EoLqUZWlCLAmTgmri+vZNE+OyPOcy0KshRAsTCPI/txT9FZ7KwpCs0I\n6iQ/k5Wquus6NM4ch0EyAINMwRxTGsqx1RdzrJWpQmx11Vef00eSVDPGWKhmA6V+UBH36vGjO57X\nKfehsayr+FBRE28r6qtUVwzIjpiPlkRZMGUQJNNI0ZfVxVGlSjupLYBiKDYfK1aDOmorD4L6YZtw\nZpDQpghqSjAVoq9asaDQyuBs4BjXiyzS6bC7aVCliC895goIsXjvcc5KE9xqnFEoX4SkREIhUoic\n5NicsqC0EqlGlGaKjihV0KXukC7W/qYTF1EoqCiIrJRmitYYbckEjBdbpvYIlVtr5O4B53pwimz2\nxDzifSGXPaFY2nmBCYqzR2s2+y0pBzbbDfMocqhp2DHPE8462sUp1ipM0zPFkbOLcxbLjvNlT0jS\n/nj3L/+Kd/71v+LqTmPCgEmRxcUZN7fXvPapT3L93nuEOJCKoNTGlMnbLVOKdIuWq5srTk9PSCQu\nTs6YNgP7KLa50/MzPDBOYwXxJprGM44j05S4urpmmvZ86lOfZp4GXly+YBpGtBN6eVYaUuLi4h4F\ncb3EGNDKMKeA0oaucQzDjHONcAy04N+sbzHGVtmcoTEaTINxHh12cq2VhHMN+/2eGCN93xNCkHgV\nJe6tUqDrFjx78X2ef/ABru+xSq7nmGchUmVJUSQrrHJ4l1ktLDfzHXk7Q1LkFEhKYZRU3toqSTyo\n7jsV5BBDko3VWlX1xCJbK1lAMamIrTQX5BieM2VWFewKqjipdHMtbogYJTlI0lYJ3G13GGtoYosE\noxzmAZk5jMQ0H2OS8yENU2URmpNxxcKhaq5/yjmLpTkXQowSeVIymYCr8ORSCimK9KpkGf6QX7nv\ncs51eGfr+iLfI//Ak++rx4/OEaTKUYIDB+2lLHBCUBdZDXAssQ+7wLEPWiQQLZcsLoBUyKYQFEg2\nckHqPYR9WX8Xh1+MbDIZrYAogtj9JqOTw3owLjK56tiw1b+qEyobcpHgsJTLEXKc0qGdcPh56xtd\nbwaZ+CuU1TjnUEWmfzEXYpIqIcVAzpk4S7RHURHbFWleV2C7OC0K2inKLIMnEjArspLdVSI9IJUg\nWLxQdZsFsArlEsYVos4YPeC1RRfPdrxjl7csWZLuAovS8PjkIXe7O66vrgmDwD/urjcEZSHPlJgY\n54S1E9ukefjmms99/qd57zvfYb67YX3SsupaQhgJceYf/vIv+G9+4d/wja/9B9rVgqurS6ZhYtUt\nuRkSn3jtNS4vn2Gd4/ziAc+ePmGeRjmBmIauW7PZDjx6dJ80jnQLz24/sV6c0FvDkw+f8Nrj17i9\n2XJxep9nl89ZrxdcX1/z+puPuL29xRvLZrPj5u6Os7Mz5jDTdT3TMLK5vaZLgYQn7AdCgnEcsbZh\nChPWivrBaiuMQ1176El6b5TCFDOuRFrvsW5N42e2mzumecD7BmuFzwoCRlZaFqjlssV5zwfPnvP0\n2XMuFhe4zoAWlF0kiFFCCYQ51GhapRR9t8SsHbt5T4gVBKMVKsrXG62kx6qUXPPUggGJulC6oJU+\nXmdy71WIlqKqTwpWNWCM0NNVwRpbr3sNCKwDJaAsZz0kxeZmT5hmGdQkjfe6PneqqQvpeKzWRr65\nqeAZV4X2By01B6VzyoQoziiVEsWIYF2pQkkypA05o1MWTW1R9VRXYR4cZisHxY3cqzH/mC6ah8FN\nLq/iLOo7I4vdgbhxkKRXMbfi1cBHURfUA5XZiCDWR4EelMwhcFIWFV0X6rrgVqm7INiQ4cM0RAiF\nttMoW3CNJgWNdWCsxCFIz7TKepRYOEvtm8ixvL4ULdVsmGe8d4KoU7LQowtWaVAGby2N9xLsNUvM\naB7lmK5cpiB+3qKLQFMLR+WBfA+FSjWHRcvxPCdEC1o00ywyIVsQITQKrWTCi7MoNF5bvFdkNTFM\nI5RCG1f0vuN8dcrt7UvCPLPd7RiHQJpnYg1cM1ozTyMxwGq1wBL48L2/5/VPvsl62fLdb/8lq8US\np2WzGO5u+fP/5d/z1ud/ir/+iz/nwcUFm+sb/vav/4q3P/ffcnX9FGMbjDHcbTaM48D1zTWnJ6cY\nLTIVUMSY2I4TyljaznF7e8Pq3n3axtM0nozi5m7HOAXWyhJL4fziPjFl7u62dZIt/dnVeslu2HN+\nfo9xtyGOA0oX9rsNBYX3PbFkjLaUSI2BkBbSPM1oqzDVLjmXgjfilx/nGcg4q+mXC9JmxgZLiKn2\n8CyHzDRvBTeXyPzlX/45T29eMnYzTetwrUQ+Jz3jfI01JjCHVI/+FT1HxjhHCCMxZZhmisp4pbGA\nLRlnPUolChpTYEaOxipp8ZhrOZarUiQnqCpIYpLXb3QrfdaiK9owixWZOkDJNeKjEZyeM1aAJFFm\nAikEUpTFNsSZnEWPmVJ5JSMkkUqRHKIiyo+SpS2WDjdYdfqlGsNcRDZDKhFbZGk7LJwciiSqSaYc\nrNnyvZRSQrSncDDq/VOPH11PsxyqSFV1VQg44qCjrLuJPF5Rjg7H+bruHJ0/iXR0CxVyhVBUmYKR\nY4fiEJdRq1qy+ItTRFUQRo6ZMEeICtNoUnSklHA54bOt/VQBuiot3nKJGJXWgNa22tEOPyykaSJo\nQzSOxtZe4XEQZWmsY7YB7yzBmlqBF+Y5keeCDomSJSMFPVPQ1RoKRjt57cXUhn/15FcBe0GsZDJJ\nFN8zUegzmoLL0ghPJoMyqByJ88CoC4vwAKcdsUwsuyVX5oq+7xm319xeXaJoCHMgH/gBKbEbtpxz\nxmq95sXT9+HBPd5656d4/zvfIE0z69UpJc682NyS/tM3eOO1Bzx/dokFXBtRZUsumq5tmcY9BhjH\nPSFNDPtI5yaGaWCxXHJ7s8F7z+WzF9x7cI+SLeM00jRSCQ37mfWiZ5w94zhzfv8++ylinUTC3m02\ndG3HFAZKWYoBooDxHTEENpfPKRZ8t2A/7ijKyDG6gkpiEqG3MQ6jLeO0A6TnOauMVgJoJmZ22z3e\nGZq2QSvN7V1G61F87U3HOI+c2BV923KXJt77/hOur2/Z+z22c/he4zpDthHjFV3nBbxBIodMjBai\nQxdNmEdCrKzMHCkqQSOOGacSrRYzSCajkifmPakkYhIt84GiZbIWm62WdpPFoaNmziMgRKyiD/1F\nK4VDKaLcQGOVxRSDLiL3keZjPX7HGo42SZ/2oIDIOWONxFeQZHIe6z2eD0NhpK96bI/V1hx1tqCQ\nVFuQhfEwbyh1iKWMrprqKh1E5hhay7Nr82Mqbn+Vt13qBFt2NGp/88AaLCV/bGj06t9RyeiH6boS\nEraWX5pWhwGRSJmk5M+QVfWt17yRGiQlRHZAHdItFdSduyCykhI1cQbrFNkdFmQ4tA448Pp01YpV\nNBwqEWKQiiBGqHEDugajaW3w1jGpiFHi5dAoSkiEVFBBmJqlKSinyCqi1KvAN61q37dWwClHYhZ9\nKPXn0VZhrbgojBNXhjLC8RSQsCYVS8iFOW7QU8PKn/L47AF3l9c8fPSQftkTrOVluSTMU82sBg55\n3EphlGYYJvopsl4uuHz2lMvnT7hYn7FJNzy/fEbfOCiZZ88+AC2SGLdoSHNks5/plmvStK9V3YzC\n4F3LfphZX5wzzxE9zJQ0k2oPeT8MeO8Z9oO4QQrM88RtDOKAiol7D14HJTn0z5/eYGzLNO3BKIZh\nkP6vuqFpGqZpIhlRLNxe34C1LBYrtDVstnu0abGuYZ7F1ROmrbA9jWGkYIxo/fpepEj9qidOEyXB\ndrdn2O9o/ALvWrEMpMTJ6QJyYZgC733wnMu7O5xzaFNwnaNdGfyyoJpCXHd0q4Vs/AppHxVHs7Aw\nOOJ4K3ALZ1A6Y3SpqY6gTERp0WpqbZhjBcUoI06zeurKWRYQlaQXKC4mhdctkVxpXZBcgiynrZIL\nRclADJDqsDpzBOv4SjM9jfNRUVCQxAKclTgMkHUAKY5ShXfklOramytsvLb0ULIgV53mEdgjq42s\n7kjvOINQ7KuOWhuH0kl6vJQf3+k5HBbOTDmYs0uuOLgiQNzDVLEucB97lI/8d6hCCzLhlimTTNGV\nvJFaIZPAw/EcqpRH/mFOUvpLT0QGSHHO6KQga0nSCwnrCjmJE8JYLUiwKi0qJVUx7qufOWVJT5Rp\ntxytS90YY4likVTIgEhpSbA8euULKUZ01sxFKhvTypEJVWnrSZr26EKJSrrvSO/U1ERO6zTag2uy\nIL+0COad0WijqbJOUimMsRCDbFLrk4aTbsEwBi6ffUhjpO/WdS3tYsk2jcyzBFN578kx0batVK45\nsb3boYnshw2Xc+DexRnjtJFoBQPTOPD8xQvefvsdNlc33HvwmDgnQghcv7zk/sWFHGORPG5jFM45\nxmHA2Uam0WRiCWij6NqWZ9fXtMuO3VYyrMI0cXJyIr5+BfMc2L94xmZ3yxwGVB45Wd6TCtNZ2q5j\nv9virGV5cspwe4NJCbwnzAHintPTU4zt2IcEqUNhmOfAMEycrHpy0ORxR0ozYSeSNYmaMIwFxmHC\nWE/by6K3ubnm3sU9Wt+hXM8Hm0uevHyJ0p6cDMVltC5km5nVhFWKcVSYxmB9i9IF7xxOt8wh0DeG\nsoKUb9jHGWxmGCYWyxatQz1Wa7xzYo1FIi5CkT6hdhUEY1/dIyVFnLboYmRTNw1FaXKNyYgli/xJ\nga7tE+n1p2qNTuLQqb7yRCFHavKq8B68cyhlRKtr5FoupRC1lJQSAaOEu1nVMkpJhlFKkoSQs2yi\nJZd6T8rgU4YBsk5Y06Br2KG1hm7RSLZ6DbhL8cd00TxIjUReedAhKlIMtWcpi5+2mhhe6a5yrTbl\nNFjf0HpM+Lje87BTyoJgYiYZKcVTPdsf1tuDpKGkKE1sIMcoURlZk5CeobURX6TCi6Fgva6yBQDZ\n0XMppChSDk2d6EeRBYUQiTkR6psuTWhJSTRabiyDwhqDbwzOO8Is0R85QYqRFICoanWXKmBV1fgQ\nRYnVfmYy2hZ8b7FOgrGMtoKhsxFjLNZqvFckE8W3rjNzLAxDQbk9s53ZtXckHekax3Y7oYssXNp7\nulNFuYvsbkRKc3HvgnEaySj2wx5SpHWiGUx64Oo68c47n+XvvvUNcewYx9I2/MPf/h2ffPttbi6v\n+fRbb7PZTgxJrKnzJPaTaZrxvrC5u6YUGf1q12L0BAbmaeT2+lrg0SqzPGnJCfplj7YWbRQhDeSY\nmcZb5uGOOAdWi5VsirqwPD0lJFiuV+y2d2yv97RG0a869llhrKdbrEjKMMwSvqeLx1jP8uSUk3NF\ngyaVAHRMwzU5J5p2KWLwlNjc3qBsz6pf45y0kvb7iZO3OqY4sXrwCd77f/4jw/aW1dlpBaVYtBLI\nhhDQJUp5P+5wRdNYjVcJXSTuVlXsoTWWtN9TIuwS9IuZ3uoqERIQh/Wg54TOSbSdup5ejCIHkU9J\njnrBGY/NrYQJHgLZGoUmE7JGzXO9oxM5Qc4SVZyj4OhCzLWQkNNbmEdpsymBe2tjUDljrZF+qpKI\n4bnk2tssmKKw1hNyoqQk9xv6mPpgjAPycUElI7ZkdTi1KuI+cHnzkhRnHjy4II6RppW8oZQzRf2Y\nLpoC0BAUk0iMKiZOEtOIWnoVqtotRUx+LCrrwlkXSfWRj9XHocTO1cubqGNAo2rPpWo/cxEyelKU\nJLk7KktUa0lCK1JFILMly2StuFjfWKAovNPC0NTuOM3XSgshvsZ4UGRqqBIQMmg5yislvUgjdEUW\nbcErh9OWOCbmKTCOkvFcUiTPDiUbOdbV12IsJgvFSFVdZrEK22iMB+eFzI0S/ak24FtF02qMkwgG\nrBFpE5EYAmPWXM43fPrkEc5Ydvs91iomHdBG07Qe9rKgdYuWGAz7aUPftpR5R396j/0+sNvtBE82\nJ1TK/PVf/0fOTh+gmHGNQE4eP3rI9uYWqy0fPn+fxp5xcfE6c5oxjUaFhtXpqWTEh5HdfoNvV7ic\naZwjR9htd4zjKJRwZRh2O7a7HW3/QBiQIUIqdG3Dk/c/IAwDXb8mYzBNizWKaRbyz26Y2O129P1C\n2jza4eLMer1kDjLU6bqe9dKRkmEaA8MwootiSCNpDuQSyGmQDW2ScLxpmtBo+sYR0kTYzgy7Hc57\nijVMIbFaeP7d//m/0Txa4XAYnUUupAs1KU+ST1NiniKxbAkObKuxeJQS3bBzHmcsGkkXVSiGu8Rs\nPKpLoFVFDc44BxFFUoliSpXhyLfKKtNkjVWiKfZGQMRK16VDK2KJWKPI2crgNUFSkitOkUwrVTJT\nnIlzln6kkg3DWo1zB8qZQLJzViLfos4dkCO10QarHEolnLFkHUUnbF3NCwLRWpqjrpM6EKYoGVbl\nQibSNg3Ft+Tksd6hjSPlSfqp6scUQnyAGR0wb8fZuFIiaoU6yeEYaPbRQjJTDoP2o8Tn45VmpZm/\nmiVVRL98v3zog6QiiZXVISA0+Y+gvQq1qitErUizxnhD8cKaNxWHLFNosa4dgMkaRHtq4JWGA0pO\nhAmprq0Qk1QRr3u2EauMXOTdhB1mzJjJMZNjrSoz2MYKNUf6C7KxqFe9YmMV1im5+E2W66AUjC40\nraZpHd6DaYSAn4niFMmaOCXaRuI8rm7uWPcdhsLd3Z0MPazCOkt0jq7vGPeFxapH6YTThWkaCeO2\nciMLYZ7oGqH99E3L9dVTHtx7ROt6YphYLlbcXN+xWK9QOjCOI48/+SmuLj+gKEXTdljfcHl5xbpd\ncnNzx93VjtWZ5fz8gs11IsxbtNUVkjvim8T6ZIUpmWG3I+QgOdg5s725pW0ti2WPdQuZhDvHHCJa\nKdI0sugX7DcbfLdkyju6rmO/H2i7lXi3e8cU5PifS8Y7xbAfiWHG1XymIpGobMcN8zyhtWPRnZBL\nZtqNxGlHKon12Ymg0Lzj+vkLnjz/AN87mqmAleA6Y+RERFKQqZrDRCwTRlv2Yc+yPZNqwxictXjd\nYFVDiCMFxbDN7Lwck1Gi9TTagilYI7fGISNLGSeSKsAZI8d57VE1V0cAGEoKmzpdBxk2ksEZTZgF\nNkO1MYY5kWJ9fq2wXqI+DiqUgtDyrRHNqlzLhzM3KKOw1uDqghiTwgihXE6etRcL0oM9UPG1yseZ\niDUGv2jp+xatM86J6qEUSbmUwuzHdBCUq5ZLIUMfXahhSgAKmwAlFBZtxHaoaqbFEcArueflAAAg\nAElEQVRRF9hXw6GPZgq9EraX45RdKtlS4RgHyVNRUSjodU2VEAohtFMOQA55MyV/R1GiXJ9aFYGf\nZmHGKyVVs/hhM0YJRM4aJX3IFDDJCFiuTsCtNRQVBfZqFWhNa3raKdK3kbwfGUOFk6gkGdTe4LxU\nmqk6LFQtD7SSnVokaHVaWbmOxmqUVShvoSngAkZ7VIkURiFcR/D0LHpDmjOjGlFpZr/fkRIoxO9r\nnQUlWTSqBFoHbdfgGyhlJudEiDu6bk3Md5gMVi3o+o5p3kHxvPnmW3zn3e/yzk+8zTzPLJfnjGbH\n5uYFaIfRPa6L4Bpuxog/WbIcBnxVP+xToT/p+eD9K/pepDD73Z5TdyF2R6u5fnmDNgPm9DF3t3ek\nNNH3F8Rkmcuei3v3uL7b0/SWYb9DKU0aB5TRbHd3+EWPbXq2d7L4KevYjQN9f4ZrBMwcY8J7yzwO\nTHkmhBFFpgQRfm93O87O7jGFgF94EnK8bBYti9USrS3t+Rnf2wxk73AlYZtCUmIIVlqoXpF4XKSU\nEsfbHDNFz9yN1/i8RBdHzDOt1TTGMqDx2ZJT5Go3o01Dp6qETYFuwCiLs4qcEt5ZVC7YUslhGkHM\nYYkFbDkc7USlkkoiHtUwBaNcdf8GcgzEQB04zVUmJNerwcnwqZpQBD5RjgNUfcisKoK5s1buMa2l\n3YIyGH0YAqnqbKL+HBmKrnVXkfsBI7MLE3De45ykJuQoPx9VlZPSD1809Q/9LPBrv/ZrPHz4kJ/+\n6Z8+fuzq6oovfOELfOYzn+EXf/EXubm5OX7ud37nd3jnnXf47Gc/y5/8yZ/8c08vj4N/vPYqi6rR\nt9TFjvqi+PgR/KN//ygp6aBhlGrzFU6uZE2O0kxOSSJAZYJupP+Saxxo+Qim7vC8xUjed9LkkEgh\nSc7MfOAAFoTCpmsDWwT6KJnYaW3QqsKOs0zopykyz7Euyg5Kg1Je2Jna0zStOIk84uTxBdvKzSNg\nl1xTMevrTa/y3MmJynmqP4shR/m+ISbIM8YWrAXnoes6rOnRJTGUHWPZsxuu2Q0bbjc3vHh5RQgJ\nYxTDeIN3CZ1Hzk96lkvHciU8zv2wJZfMIVdJFmqDcyu6xQOa7oymXbFYnqKU5/33P+TRw4dcvnxG\nTIre9YADpRiGHXPYE5MMhz796bfwfsVifYJftAy7O9beM+4Gcins9wPGWsZpBuPxTcsHz5/z4vIJ\nBMUcM67rQHmysvSrNY8fv85mKFjXs9/sscoR58A4T0xxxvqOkh2XT58yzwPzvEOrTN8t0NozDxM5\nRG6vrnn54TO217fs73aM+5lpNzEOE8OUQFnGMNP0XiDEKtPeO8UvehrXUIylu3+P7zz9Pvcf3Wfd\ntjSLBu8U2kjYnrVycpAUSlkochBy0JQi23nLxJ4x78FM+D6zXlv6torFi6HMMIbMHCAmzRggBoNS\nFm0tbevr0EyKGWNkMYkxEmMgFSGfx5hkkJOkV5tCPA4Fj8jEOqwxWgoJp41cq2QUkZCmap1Mr9w7\nRR/RhyLaB6UjSsufnddoF9A24HzCuYixSf7zGm21qEMMaJNBiUXy0IpTyqBoUEi7TazI0stMWQox\n6Yv+049/dtH81V/9Vb72ta997GNf+cpX+MIXvsC3vvUtfuEXfoGvfOUrAHzzm9/kD/7gD/jmN7/J\n1772NX7913/9uPj8oEdGFsvDELwug/X/5Vg1fvSzr0Ab//ni+bHkSerRvWo+ZceSyXL+yFG+1GqT\n+nX1tCvJj/XjqiANaG1FxhRKtUhKtGhIgv0vIZDCBFW+lEpNxdR1YUNJZGrIzFMgBElyFMw/5FRQ\nVRohlHjJWG9aS9cbbAUMU48bh81B1WlYSZKBkqJQwXPI0pBPuX6fyDwLFCLGgNHgar6KseBcg7aG\npHZ8cPuEd3dP2OYdc4qgDa5pxHnSt3hvuDg/5/R0yfn5mrOzM05Pz1gsOmE/FoHGNm0DBbx3oBNN\np2n8guX6gnv3HrNYOJ49fcbJ6j7OeG62W+7fu8+434hudZplCOQcWmlc03N2eo/t5pYQB65vXorE\nqesoCJOxX52itGEeZ26fvc9ivcCt7nNyfkK/WHHv4QPWZ2cobdjtJm5vrrm++pC+cey3G6awx/se\noxfsx5Fh2mL1hM6Z8/UDUjDibppuyDGyud0QQ8A0kmaaKKI/HOp7W2QUvVguRZCeAv1qwfLslO5s\nLbT51Yrruy17HfG94/75fVbLBd3C07RGqqLDFVrNC5XlAsUQ8syU90Q1oWzCdOA6WPaaVW/wDkzt\nV8YkR9uUNTlpUqi5U5UmZBCpFfWkllI+XqspREJM1cGW5c8xEw+pkTlTciQf/PZRTl1Gyb0VQ5UX\nGTnK55q4KvzLOoStGtgYY03AkT69RlULMlhbcB7a3tItDL4zdI2l71raxtO2LevVkpOTnqYRZkLT\navqlZ7ly+KbgnEKbVDcIaWtIeOJ/IRru537u53j33Xc/9rE//uM/5utf/zoAv/Irv8LP//zP85Wv\nfIU/+qM/4ktf+hLOOd566y3efvtt/uzP/oyf/dmf/c+fWMsvIacCSvRb0piWX9Cx6kS/6k1KTX+E\nEGuZ4XyM2P7RBVVrBVq9qhrriqhyjf/MWaQQdVoPULI97mo5She5QJ2Ki0DXeEQXGgvojJssuWhm\nn9FZQ8hYK3176QZpjCiRoShhWNbc8hAKJY246pXNsdSpe0algtUG3zREBXkSUg6i6yUa6cnkXCS0\nqr5IATJnUjKUSRImFRBjFHCulvzoccpY36CPfv5MLIqcHMkpxjIxTBONkyHAbhhYdh1N29F2PeTC\nNG9xbo1SwqhU5oT9docqEll7fnZOTIFpP7Jen7DoFuy2W9K8JStD35+wWl5wcnpKVg7TNmw2L2na\nFp01u6TwVjbOvmnYDhNusURbh1WW/uSE7WYAApu7Wxrb85nP/Fdsdrc8+f57tM7z4P4bvPbmJ0gl\nMV9d89rjN5nChDKFEGG5bBh3E0+ffoD3La5bMgZxPWmVmLaJ7DpMo3l+9ZIY4cy1kgw5z6xPLzi/\n53jy/SfcO7/H9X4jmswMeC908aLY70Zw8NrZI4oWX/bJeoluFXGx5H//xv/L3zz/FtsyEp2mMy14\nh5kDcc6EFFFJevnaqio9VJALTssQc4pB+JxaPN6qUyxnTUqa3ZSE0IUmK1sHOmIazznRKJlex3q/\nJICUKEEd4cCKQpyh1Pwe0Ex5IqUgpwojPXtdRDqUYpYTT01dEO5blT1pTVGFOc0it4PqkmtEH23E\nNmqMZH5pq3CtxpoGYyX3xxhJzhy2SbiwyBRca8EyppSITiJxnBNiVkqprguHQgqUkeDAnDMhHBCS\nP/jxL+ppPnv2jIcPHwLw8OFDnj17BsAHH3zwsQXyjTfe4MmTJz/wOT7adzQcgsc49muq3bUSjvLR\nyK+UrrDWcjTWl8IR60TtKepqrj18ja7QYPkeH83q4VhRgoAxZNFUGBdFFxbqil0XlxhklzJWUUik\nqAm1v2q0k95TKFU8bI92LZVEB2elAylH5TAT50LjG3kNCKwjhFirZI1SBqPNqw2h1I5sqNP8pMnx\nkPBZ+6ReE1MBM1G0JlVBcAwBsMS2MPvMoDNNK/EfKYoeUmuYcyYUacDHEOmXC3y3EKeINpQs+sim\naYUrmmINw5JjVdd1NWM6c//+fa65JRfRqz6494gQAuv1itubS7TShCny6c+/w83dnl2YCbtbhmnk\n9OSUUCJZa4qFRb9gGHdSoSjLfjexWq65ut1IvjuGueZzj+PAyeM3OT27EKmV8cxo2qYVlBkOrQOb\nl89xzrBan5OyZthtKWlmmjeQYdlfoIxFKdER3n9Q/46i6xpyyTx79pSYAxeffMT2OyPblGm7lmIU\nu+2OtutJKbFatGxv72hXDSenj1gverrO8J3NFf/p+nu8v3uG7Q0tDTFMmCRHxphE5K+0rRVZvfGL\n5D3p6oTJMZLNjG4MVkv12CdNVIrxuqBtQRnprYegMNbJ0VwpYsxYZ7DaEGOULKGUpKWUoBQB24RZ\n3leRwolERybhTlwWShxvJdWwQ6gnM0TmZOXkVTJgiuhslcVah/UCSMhZUHRCj1KSmNmAb8GZhPca\nY9va7oJu4cjRoorDWMQXXzLGKpqmoWkl70iUNLb2TC1GV3dcHaKK2P6HH8D/iwdBP+io/I8//4Me\nIgmSALN/zL8TfdXB+FhQpmAKlBIp2XEEeKCO2DittZScJNFZKSXSAw5ypY9oPXP9/HHZlOpOIZWp\nNfXC1BIs74wmjCKyLkXcRaKPLBRd0CTZfQtkm2qLtmCcrj9HlSGVOsjSSE+lJFIqpDCRU8HZBoGU\nJOmrjZNkpHBwMR0UBOKEyCmjkiLO6SieFzjIQVaVRdJZkXMlJ5LJOGuYhkIxQfrHFe2liyUHhS6G\nzi54uHqDvl/TUsgpoqzDGcc8jQi/sJDngFWaqfqSYw5cXFwwz/Nx+vnixS33zs9wzrHb7UBp2ral\nFMVPvP15vvWtv2Wzu+LZ0w94/fWfYNjcwVHEHHDdGqU1TdNChBQdMcJPfuazDHEmMciChuP+o/u0\nbUNMM6ZpOb+4z9nFPYpSOFPY2ySuMNNgrOXy+QuUdbz1zuf47nffYxxmjDLiZz95gMKwvd0xlw3O\ndSyWKy6vXuCbBU2zYJpmSJa2dTx+8wHZJKxSWO/YDDuG/R6nC64xWCzzmNmPBdOeUryje3CPsr1l\njiNX821VWoDTTrB+hwQDa8QEgUcr2VBVOjA2xd7pc8ah8ErhdcG7wBwLTWewU8LagvYKZQpJQcgK\nNUe0qbBvI1APpWRjDCnKSbC2mUrMpJCJUyRGYWgKgjFBHcY454RKH4Pcj1Wxcrz/tPS6C5BzwGmH\na71Uxl70yVqVOiQqaGuxTtFYg28yxgW8BAhgTal9SbknQjWuaCXT+5ypVklRfIAMcUVHm9FWdNZt\n6zikMKhUcM3/D3EXDx8+5OnTpzx69IgPP/yQBw8eAPD666/z/vvvH7/u+9//Pq+//voPfI67Jzu5\nkQv4padZ+WNVqJR4pMtBi6mUWKuSohjJDT+wLYUTqOsELtdS/vCoerAiE7dSEmSxWMaDyOkwCSTX\naaRGm7ojK4NqZGGLIZNDwWpH04rbxji5oLTWhH0kpULT1J/dlOqSSKSkK1XFCkjDaKxxWA1RCdx4\nDjPZiIsppsA0z4R5QhXJadZV0xqSLIpZH/BdhjxLdaoVwg9VwjQsRqAK0uYQOUaJMG1hZ8sRlkKU\ndoJRGp09UUsomJrBny5oncbNMyUXxjjKz+IMOUZK1sxB+JA5JxZ9j9aG09NzciyElLj/+E3G3a1c\nI2+8idKW1Xotv/+m5VPvfI4Pnnyf9959j+1mplt6qbZjYIozTnesml7iPTDs9jte++TbkuGtIiGk\n6nDxbLY3tG0HSvPaozdZn5+TgaZtGO+u2Q43MLeYvuN285KLizOM6/nekw/RKtEvBd3m3IJhGJjD\ngHWFdXeKxkPWdI2rA5FQY09mXGMw3nJ9ec3uZstut8PogrcZ7x0lK+ZRMspt79jfbXjzE4bu8Rvo\nuwXv/9XfEM2MQYYyRVX5TDKkPImLTReMqqJvJQM+U8BhsEqBCoJGVGKWMCmiVBRrsU4UHcnKCjZP\nF7GwKtBZFnqdIM+RZORkpuosoOTD0KmQgmQCkWXwKTi2cqziZHZQsFpegzGWFBKN90zzWJGQMuxx\nrcG3nq5vsQYxY1hwthzbVd45lNXi7KvidK1r642KStRCGZujYOw+coYk5CiRv0pjjJWN4OgwFGtp\nIvLdv3nGu3/94Q+dwRwe/6JF85d+6Zf46le/ym/+5m/y1a9+lX/7b//t8eO//Mu/zG/8xm/w5MkT\nvv3tb/MzP/MzP/A5Vo9XVfIjFSdksV8ddySEr1elA3Jw1cRa7hcRdtUjuyx6xoBSEimQ84E8pKpt\nsFbFQFQfHRgdUG4zrmkkOVfN8sYoA0p6J9Za5jmjdcQ6L5ZEK0d+ozI5S3pmSQWxIZQ6SZTpPFQ/\nrlYi7jXifGjblrlMYu8bdhIfkITunUuufmbpR+aUyVNCZU2pvvNcokicauUcVUI5och7a4gFQpBc\nl5w1WhfiPjGbgioOFQNlNhhvcDrR+syyPeXUtnzm4ac471bEcU9OmWke8VaxWq8YpxHvHFMlehsj\nnFBrLM43pPgq42XYb3nw6BNobbi9veVs1RGjZg6RaR65f++Cvuu4vLzhO999n2gG3rh4yJwT2jSg\nDs9ZKKowTBPOedanp3zn77/FovEMw0DXLTg7O2fYT7z+xuvc3m7Q1lHIzPOM1g5t13jvmXNitTzD\nG8vlZsv5w8dcf/A9bm7uWCwXjONIyTNKJRq/JIaZGGa58ULAupZs9pLd03eUEthubpiGPdfXLwDY\n3N2hSsE1vQw2w0xSDq8aSky0fYvq1ijjoFhSgXGaiDGRYiAVIfhIQF9B61ytgoLnO3jWXRECu0Na\nBU6rWv8dHG6vrkmrjBynDQKoyAe8oa3uPNBRKkGlDEY1zLGQ54N9OAtLU2oZ6acai/fNkfcgdU71\nhVPo2p4UM646lUB6srp19AtH0xisAWUkQlergFJgncMYhVUahRGJYs6kOZLTLImWSlxHWsnwNs6B\nYowMyZATZizglUdXRUkusR7PxVmlMbz+2TNe/+yZIPKA/+t//Ma/fNH80pe+xNe//nUuLy958803\n+e3f/m1+67d+iy9+8Yv83u/9Hm+99RZ/+Id/CMDnP/95vvjFL/L5z38eay2/+7u/+08ez4+aqrrg\nCZC4UrLR9XhZ5UPVN3rYXcm8gnqkmuOti6TU1STHksrxWB5zPvZCAUzJpFLnMiVJRdA29F2H8VF6\nL0XIJ1YbYgAz136rivi24BuFtkUC7XN9jdnKwqZleFUq+T2XGetkd1RGKuoYM41r8N7RdR3DduDl\ndMU0BvKcpbF+yIuKEFKQDPQ5k6JCKMmHY7ipAyC56o3NtI2jWyhiKYxzJk6GaS/oOa0tYaMoKRLH\nTJgKrs94VyBqmjLJZFt15HlgHG5J0xZrPVq3oqdcLLi7vhVkWJQWgvdtrU6ksg4xSnWQC3fbLYvl\nik++9QmmcWAeBm5vXnL18il/8xd7Ht2/z+rsdX7ycz/J//F//weefO97/MSn3yYXR9c2BDTDFGhM\npm1blsueYRj51Cc+zbe+9Q26rkFpw6Jfc3v9HsZYuq6TSW5p0CkyDAFtehIR5zy+6VEYXn/rPsN2\nR86FRWvZ3lwS4oz1lkW3JMRE36+Y9B6tYRp25JKwbc+6OSWVSNt2xDBDEpr/9vaGEiaWp/fI2rHd\n3rFcNCRr0M5ycn7CYrkmF0mYNMpxd33Hbh4Yx5FhGgU0nKJkJ6ksiNxKJwopShtKS3WIl7gMp01t\nNRVUyWJ4MNXiSyKpLHpiFKUkZG4p75EwvVW1Hh6SDV5N0UtSpMoAUFEwN8pomsZhjaGUuinHVPkL\nGu8NzmSckX+fi8J4g3GGoDLFCM/TaIO38u/RPVZXPkSWe/GwDSgtAYJWVYedE3ScqcPWOeXaz5Sh\ncs4JlQrTQX+qFBCgCHoxxIBxogeVGBppt/2wxz+7aP7+7//+D/z4n/7pn/7Aj3/5y1/my1/+8j/3\ntK8m4NUNJJVgkXlLERqRcDJTnWAXstIiydE1bkIBTkg9Tafw3pCTkaEHWY45RSo0rZVcZIXK0xSC\ndcoK1zgan3FNxncKimc/BrKKQELbhG0NeiygDcoUrAdlCphMyV7CqGIkZ7l4UxFWoSKhTcaYXPuV\nGaOl6mwbg/eeohS+MSSVuHz6kjkEAoKK0y6jYqmVhGY8QDqqXEtVRpNUmiLlaHvD6tSgfcZrw1It\n2N4kGq2YhpEwZfJYyFp+8XGXKXNBLRznbcujfoFDs58msNJ3RmucteL7nQMvty/pu4btMBJDBZUo\n6R0ZbZhjlSkpzzSMoLdYlfi7Zx9wfXXN9dUVz5+/YDdIFev1t1mfLvmpf/Vf89/963/Dv/v3/ytP\nnl/x+MHbqG7BTEJPhbaXSt16h1WGzdUl/aKl5IjSjpgi5xcXtL6RIUYWC2lKgawbUt4wT3usbWkX\nltPzB6QUMe3E1jtuNldYW+i6nqZfoopBm1xRfAVdijhknFjvYpDB11hGwhS5fnGFsZrVyZI5QL84\n5W7Y0PYNy/Ua27W0y5azi1M2u0su5k9Cu+bDZ8+5vb5miJFxHIhzYB4nWShVPYtpAzqRmBA8oEIX\ny36YaJzCIu6hkhPikbAEXcSh5DWq9RyQlyrVe00rmXLPAUxDVkoWBV1zgIqjxICYLsU0obMs2IqC\njBI0WjtSFoShdUokczpjncbbhpIj1ovTx7aerDIlTqLFTEWye3BY29SvzxIFkyX+IicFSuzBRTli\nmtHKUOZCiZF5NkyzZbubGMIEWgkNPgoj8pCDbg6U/hRBlZqoIL1Nd6DXp/BD164fKbCjFJATq6qN\nYXH/qIM48iPi9EMCpVGCqJIcHzmqd31D24qPtWTBuY17GbikRKWdxOoBp5LeqagqhfbQLh2ujWhT\n8N4ypkn6NrqQdMImi7UyDFJolI4YrchESpnluZMcC3IpGCQVUlPQJgoCDukjde0Kpx1N4+m6Duct\ny9jSOokOuLqNbG4mlAuYVgLGhF6taZaWMCa5iSszS+kqyDUR7TX9PY9fB5yDtumJsyLuExaNMZ69\nlmCvRjmWbY9y4lo67dc8XN3jnj9l3ZyQ1MQ4RlSINLaVI3ISLWSeZ7Z3W5rGUUqmaXrZrV1DKYqm\nkdbFOAa0dQy7kWnO7KbEbtS8++Gev/+HW242G5JS+Kbh9QeRy9s/5zNvveCX/vv/gf/5j/8nFosJ\nvRtYeMPJYsFmuCMn8MUxM4ht1cL+LvLo0QV977FuSbdeMyvNarmsCAnNy+vn5JK52+559PiEZtET\nEAvmzfVLtrdXLFYdXq0oWjPWSXDTL9hvZeEjwzQWYgr4GJiTbP7TfgtoFqsWf7Hg2Ycfcu/8TbZb\nQdidP3zEEGZWi56mb5hzJk2JtL/FLs9p+zXDuGUcAvshUKZACAGlCr4xKGelX6ml5RGTBOOFLEfd\nORWsKSiJepTrIWvJO9eqWl9FjWKdwIbLMSZIevmpJKEcYY60olgzkkKYyLmtw9ODdTKitUPZQirz\nQbRHqRFfh7Ay14ipxBhF03is0+zDhEkVcJPF2lmqy+tQpYaQmWcxoqQgVLE4R9om0fUwjwOBgRIT\nm6DZD4qbzcR2lKm9DKk1TjdgJbxwt79lLodKNGKUEkvtosd7h/WWQ2DcP/X4EaLhxOJU6gtQSoYg\nRx9UFWaWckj9Oeg2D+HvgCo0XmOdZrHw1TJoCbGQs0Skmiy8yBSrDZNSM3KAotCpoHShWQqCX9si\nu/ZeMY0HEbkSYbCDFKQDqo1ESxircFaO7UXJMUOha09FYbwFLYi2WApeC2jDGk2/6GjblsY5jDGs\nlyswCd0WpjxQVEA1IkBnjLgg0o12YSp9SZMr5i3lgDbQriz9RWa9drKDZssImObwW1XYAF2/oG8b\n2qbHWEdUkd0w8e6T99mtbnltfcp+85I3Lh7RGw/aMM0zaZoYdgMlzOQc0GaBd43QhXJExZ0MF6xw\nCr1zTMEw0/L0ww03+4Fv/8O79CcnPP7cZ7kIgeeXz7nd3vHdZ5F333/C1d3ELibefucdJh1ZLk7J\naSag2Q8z99Yrht2OptFYrQXs3HXMY8CcONq2JQOnJ+eEPGHs/8fcu/xalt33fZ/13o9z7rOqu7r6\nzSbFpkhaEvVwYDgJLAhOAliInVGcQQaZZJSBPbATJAYyyT8RBHk7GWaQIDCSSHAUKxLsmBIpUXw0\nm81mV3W97+vcc/be65nBb1eLA4sZBc0DFLpRqH7ce89Ze631+34/n446RXy/5fLFQ6wLhG7A+kBM\nC8SCwfDqvftkJUoNcsXTOOwP5BhxWqC6ymmJPOVMLjfg5DAcQicDSdMxT3tev3+PB59c0ppiczRS\nNRyfHXN6fkyuQvLqug7jHMvNA3708fdY9o04F7FeVsixYL2mZWimop2Q4i2GyILSYJQBU1lqojMO\nlSt1VaqY1jAWYlshwkbaSM0UrLXSaRe1IyCDRWHBriWQJJAVsT2CUQLDkNhbxTmDcxalxYrpjbjU\nBXotvp+YIsGDs4JIpCVaVXTGkVWVmrRePzfr1UBeCkY5TLWYWiglU1IiJfkstlUJ01lJ2sScoDkU\nVhbYtVmkjZH1oxayyRIRsxtUymIgiEmmGX1mmaUGq435jIvyF70+Z+95+wz1Jt/sP0fSr2A1WAO3\nL3+3rTEGVYUFaWzFdwkb5GjYlILcWIpoIIwHlREqi1pJSUbqjTlXtBZPugtip2tmRgeD6RRlFiCG\nImH9+u9vhqZWYruTqaU1gWEDeYESMzQn1VBTwRaMl6M0LUl7Ind4FwjB0XeeEHqckxxZVpFsMvt6\nzX56IZrcJhi6MkFXGjaA7WXHnRbQLpBKoSroNjCeKIaNXXFfmRw1rpNFrJqMpxG6wPHJOcZoAhrr\nHXOb8V3h7Oics/GEwVgOseF0QetITYllEk4lREqOtEPDHVmuby6I6YZBC6GpkbHe4t0R2zvvEY7P\neXH7Kd/5o9/nS1/9Oq7r6LrAl97/Bh/88EN+7/f+T6q/pMUT/tn3f0CMld/8rbukktDWc/f8LhfX\nj1HKkMtEHzakODN0HfvrG4KznN09Wz8omhgnNuOI2XakRUAkS70lFs27b71F6I642k2c3DkjNU0f\nerQylPl2zQg3pts9mgNohesH5mlh3AZOjqXiSU1y3FuD2j5Yxr6nHvU8fnZN1QtDOKK0iA+GO+db\nqJFgFJvgKB7wgYcffI9Hz58zTTccrpMsGlrR9T2bTc849CxlJppJdoDak+uNkOQlWAbVUFpAN71i\n2xTegY+VXAyKitMQ1ysipatMrLXsxqgNlWSw+nJ+3JIwF1KR4zamAQml1kSH0aVrHpcAACAASURB\nVDQysEK1Jf8n12vNkHNB6cjiKnZYJ/LKUldNtWT0oLRK1U1qlsViq5XcZpVKcq4Fo8UXXzLoVtF2\nwVuPxYKpGJWwFJwq5GWPVgMUS6kJ1Qq4Jn6kYggaxjuvEHPh8nrHHPekXHFertLszyu5vRSZZsqd\nnFrzjGv+8qf65K29zFiugVOlXraqcM4SuoIPDe0LXS8Edpc1cTbSDW8F443UCpu8QawxEjlSBpct\n2qR198jKnWwMfaAsipYk+F5awwaZbDvv8J2RWFJrGF0Yj0V0P++gpor1iuDXi3AnU9+cI2mKtGqF\nPpMS7ugE5y2hF6PkZjzmPBcu98+xfqbmRM1CoWlORFXdoOm2kJthmjW5REZnJKtoCmFIaCeu65wz\nph8IW1gOGaMrfefx1tBvDMEFOhdECZIKy7JnKntS66H5FYispBJXJINKa8Rc0cpRauPFxTNKXUgp\n0XIkp0I/BgZruXvnNV778td5elV4dPVdXvvSe5QK3/uT7/MLv/g1fvO3/hX+n29+k0+eP2feXfDF\nd9/gS1/9Ot/842/y5a98iXffe4/gPcZaxn5kOeyYpz2b7QmHQyIue8btiJHhMNvxiMOyMHYdZjOy\nVIfpNOWQOTo/5o3XX2XaXbHbz6S4MN08xPiG1h7vLJ0ZBUZmJV429gPTYcfN7oZuMzDFBa0R1umc\nMK1huw7f9YzjBmM83gXcsGXcnnB9cYVVA3fvnNIocmVUwXjH0d17tJz40z/9No8+/ZQ6FTau43ba\nE7xn4wc6O7DpRo7tKfs6cR2fktSy8hKURI0I2CLXlcZUnMpY5VEYKWGohrEO48R/o53BrNhV+TA2\nuQ992chTRsRkGmhaej9KUG2yG9QYJ5pqsSQUOm9RiIJXK0k+a2TXmLxCKScnQZWoTYFyEhlMDWoW\nGEhNtCKAYqMqfRjwrseYnkPckXMirnCUkjLRRqq2FCZy1fL3bYZWmKY9Rsl132YY6EMnAyOrcXZA\nawhdx9vH97mYdlzuXnCz7NGe1UH1F78+t0XTB0uKbUVArcfml0H5NWb1Mhz9EtaxBieAFcNvFNo1\njAcbGtrJMKm1l80HjTfSxilajJXyTzeslrYBTVD31qywXmtQBkKviRMsrdCK7DiNK7heoY3wMp11\nOCPH+1RkCOObJk0N4xXOKZxhrbjJlDtHxcX+lqCPmDcLpUas6yROYaDre7p54OhoQ1ZX5JhQTiqY\nrgvUMdN1DhsMyji6ZJnnjHFS5TQ6Y8MeY0UP0GxbFRsQ9QE68MbjHdig2Pa9ELYNdN7QdVuUlye/\nVnL9L1GOSM6JZZqwSuGsW5tLkcN+x9D1UPt1Ejzhui1Hd+9zcv9dZj3w8NGPuLy65v57r/P8yVN+\n8vDH/LNv/Qm/+3/9IRcXz4nLRIqJHz98yF/+pd/g6M5jHj+/4c37C1pprHM4a7hOM1pD7yzZW5zZ\n4BxY5dgenzIvB45OR7qjc4w/wVbZNfphw4nd8L1vf4snj55x8eIBaVmY9gec9Yxjz9mrp7z9hV9g\nu93Shy37NGP7wKA1lcQ8J+xKj3LayIOpCSHcOIu1gVIKSxLL5J27W8bRUXOlqYRRFqu05Hi1wjjH\nzcVTPnn0Y9699xp3230+fPCIfdszhi3eeoJRBKNxztIY2ecOtMLrmUVsgVgqqgnqzVu56pG2TRVz\n6Vqtc1atPhwBXb9s4em25pVfTsl5GRtS6+S9odVab24SxdOr2kVc5w1ri4TKtSGmJHnjWslVeAcp\nN7QpKGPXBl6FaohTZlkSk4ocbccVGCKxQVVlUKysIlRH6yx6Fh9nqolQJSPaVERVRa0RrfLKh5AB\n0tiPOBRBWbquxxmHVQFnnQC1vWc7HnP/9BUe3zzmYvecpuLPXLs+t0Xz+GTgdrcQUxZPzcsLYP4c\n4stP4d4AUNKAQAvFxHsJmSstbQZlGs4aSqmr7mE9NllLzXKx/vKeFORSnGbQZgAq3stCDOA9uN6x\nRHnymlYwfjUIBolGeBPwfkEZTSoG1wA9Y7zF6x5tLM4K0FVlJT/sotk927HtDoybA7eHK4btQMuS\nc6ytYD30fSAsHTATtIcoH8yqG8PoQVXG/oT9fpYpu+mpLZFLxnmLUwtNW2ZdiWbGhICNkmY2TsCv\n1ii8tZIosApvBJhrqyKTOJQdTlUWBsosQXtnDLFkAoZaktT7FEzTgjEdyjnunG157d67vPruF1Fu\nwyFNPH36BNf1nB+f8Gff/CapVWqFBx//CDRMhwP/xt/4bf77/+a/4O//nb+P/tqv8emTD5jmSQZh\nRhofxjd06Zj3B4bBc31xJQCCznF1mDg/GdFO0Z28giagUmF/mLlzdpd/8r/9z3z3ex8w2Fe5nF7h\n2fMLUq4M1nKeNM+fP+LTjx/wi7/yPl94+8sMR1tKzizTAaUNNU/CvQS095ycbjikPc5YOmuI87S+\nNzPOBQwNezRQqyLGiDWWuCSq0WxPT9A1UQ/XfOHNt3iy3/HRRz8GBdtuQ0sVf9TjjAwyfRBlrrcG\npwNRdygTsdqgkLxuLprm9FposCglXAXVBD7dWhH+6hrRAbWqRwQFh6prAw10s2gEhahsxdoKpf4U\n4Ud2nKnW9YQmdtVUM1o1Ui3EJlnjlCsxa5wzlMZaCknYplC50BJMJaN1wnuPMnq9nKsoVait4K1e\nDaWN62VHrQs0TWsGihFmZs2oJnGiVioVjcngbQC1kIvm6PiIwQ60FuQUZhUai3eee+4eY7BcTU9+\n5tr1uS2awxhw3nB7e2Besjy5SgEr942q/XQUSa1h1NXDoxrOOYxLEqh2Gucb1jWMyWhb6HsheiuE\n7qK9J1QJJmtt0cqwLGnNZymMqWgjfnOaHKe74IheqC66GZQyhKBxTmMs1LZQjYAEjG+4FUCsek/n\nA7WsrMyWASWiq1gpB3j2+BofDJvjgO93bMfGNJUVUxXX+1rDoAZc8TQnaDnnLMFo+o28uZRqzKkJ\n7q4KZ9BqhcLKw6hmQYaYgg8V5QzKVpyWIz9mvUe2BauVuMbNiCuyyz6khKoTtUZYEt4Y+q4jRdGu\nxtW7XltjGMQPNIyn2G6gKcPp6Qm7h8+RDnLj+cUNMSmuLm9Ad1gteVrnO37040+otfLbf/O3+S//\nq3/IvDT6oxP6IIMZqx01JU7PXkF3hpxuGTZbWs5sjo4YTu5Q5z0ta1rTlNDTmOi6jo++/wGPH+15\n8Awe3XzE6at3GO69SscJ0xL54GKHSZ63tOKjP31AjI53v/AOqlZiqmjX04+NmtOqa5CHYHCOUiqH\naY8PPb0fUUrG0k0BtcoO0BliWghDx3B8ynByxhIXfvDwh3zrwz/l+z/5EbXA6XjKrB03h2uMKhjr\ncc5InK5W+uRYioAtVDWopjE6YDGonDBNTlROGwmSe0VulUknNJGsKraBWjcO3ggVXcwGMjh+WVZQ\nVUyT3stASSNRvxgzVgVKE06s0w2vqzBZdaUoyKWJ3tk6yVhmwcm95HXINimhrDT6jLaUbFiiIRgH\n2kjqELk6qLqimlwnbetWhIntIImRKjXOYA2da4x9YZrAKQFuKz1Lxls1DtMz+uO36J0nzU4aVl6W\nwT4m1HAE7ed0pzkMjloNobdcXx2YJiGfNNYIUv3puFFba1NiO3ReM246fC8cPa0kS6hVA93oe7+6\nYNS6YKg1qwc+dNJ9rQ3tNM6vE3IjrR9RCwhAQmmBvCrVoAkbsh86hlGhzUKtiVI02hmCl6GUKwaa\nwakGbV2EWeuUOdJW588yRfa3M5eXN4S+R9xRilwjSxF3SrBeYhtao5RH6Q5tDM42uiDTz1wNpiTJ\npc0FRZEPRJOprjOO1OSoHYJFd4amFQ6L0o1qRNeqkF2MqpB0o3eWPjt80Zgsu4hq5ft2OEw4q+XX\nZkPKGW89tcF2M2CsYhwD/bDBe8/gLGfnW27+7Pu8+dY79F1PMJacG0XpzwLhD370ff7hf/s/UpeF\n/e6W3X5iszlhHHqJjljD8WaLMdIKGq3nZnfFyXaD7TrKelS2fkS7Hpwn7W9Jh8R3v/MB3/zuAw6+\n45VffIXT8Q0ePnzEhx//kDvHI+//4teY9ws/+PBDju/cY7drPH1yyenJiHOOuExy4nAKq+Glg0bK\nZdLgUbVQc8UHUdDqpigUfDCklCQE3nm2x6coHXjw4Xf5J//093mRbtlYj9EBZTs6Z2m6kNNM7TW1\nRGo1KJ3pQ0edQStHkCIdpq4+cmXQzQg7QSm8C/SdwwWDs6BD5Ho+UNNCSUmKB3ZVVFQls0tlaUVh\nrBF7pWmEFSv30lOkqqKkLKcjYzG6rgYDOS1ar+mzo2QrNWaiXMGpTKNQysusk7h9jLXY1qNVYL9L\nGDLWBjkJqoquoFzFAjkVgnb04QTtDU3vaU0iYFopnFV0vWYzGgyWcXC4oPBBiGW57Hmx+4Q7x2/R\nhwFT22rWNPTeAp7iNz9z7frcFs0QAs7JHZA1jt3uwP5WlJ4vgRq8LEz+1G7TOE0/eMaNoRuMuG90\nlvsMI6FV6xq+M4RexPQheIyR6FLJFec8VnvsnFhUpLTMuDnB+0xT6bOKmLEK6y25zdSoscFiOnBB\ng7LoamRjnApKa7rBQ9MrLagILNYoaq7ElKipsCyQdWF0jjYbbq8X9ts9ZOh6y7RMxJrIRIzSWNdj\nSqWgsKbjM5J17VE+YXUBZkqWuIi1A9YYalpoTeGV9G2TW9bduZfKXLQYxI1u7LojFiqKzE+zplMO\nry3WK/SsiCtCrFE47G8pSViK25MTmmr0vYUSUXrDxdPnvPb2O8R5z52zM774ZuEfpT9kOSTefvct\nnt0850++/REgWUCjNF/+4mt8+4/+Kbe7iR9+8AO2RkMRpe322HP1/AZlBpZS6b1DqUzfeWJtnNhA\nt9mQ9w1/ciJUpDljbceHP/4JnzzZ83yuvPHOa/zb/87f5s75u/zdv/ef8uD5Nd/7zg958viCv/pX\nfo2v/Pqv8sff+hP+tfvf4Oj4dUKXSdMlU1zojUFjMEoTYxSCjvNQM1o5nFuHe84SvAw68pLRSpw0\ng+9x/YDfbEna8L2PvkOsezpVOD8/58X1Itlb69mwYZ+ek8oVcx6wBRoJrxVZ289UFMY0MhHVEk5t\n2dhO+tvOSZSu8/ihw3lFNzju5sJuOnB9c8M0H1jqAd0ke9yZDucttQh/0nmFdRmnEzDjjBEWrPLE\nJpVKhUK3QqsZYy1Gd+jScH2PqWsN2hoMk7zPXKOUSM2Wisf5AVqAOhDchsZCLpXbaUEph/ca1Uv+\n1JoV6OPXarQB6zqimmipUqjYDlzW9J0g5cxQ5RRq/jx7OcULPn66cP/8C5wNJ+haSXkBJVdb3f/H\nsvi5LZr96HHWYe1I3/d0/gZjrjgcFva3cpyV1qNM1Guta/WtEbqCcQ0XLMFLmF0ZiSLVlkFlQteT\nJsVcpW4odxfSQddKjpTOy1SxNodzDesqqA6aYNtKzryknqPAGkfXebqukss6BHDI/asKYntUbYUr\nyNepSGtv+eUxVuIYxgcRryWIU8GwQC0scWYpM9XIXalZwR6sldAubISEvfqCFAbdMt6IgtWoRrCB\nhiYhcBOQnacLgeAHjLYktABQKAIidoWiBdXkzIitDpUUMSWhINGIKUFp8vWUyjBs6LQllyo9YR3I\nOTJNM9lm/vD3f4e3vvB1+u3rHA2av/Vb/yr/0//xj/nSL7zDF997B4PnweNP6fuee/fu8fWvfZm4\nND768SdcPH/GN/7KN0QzXKHGSrCOpDRdCDjdqPNMS4mTk3OUlxplVQbjN+QqErDDTeGTTx7zB9/+\ngK/9yi/zw598n//g7/wndP2WDz78gPmwZ9kv/PG3v8PdOye880XFe3/p1/nkOvKV8R7kSyyXONWo\nK2A6z2IB9V7urdMyEXzHkma0giXKdYVzDmsstam10VPo77yKPrtHTjNHJ+ecbk7YPf2Evh+4q0dq\nysyt4sII80TmgPEFpSeMlpZbDYqQDaZVgtOkIgMmr4S63nsrv8a1mugMOnR0uSemzHg0cLQ95mZ3\ny+72ksN+xqAI1tE5h/cb4U96hQuZVtedbo0yU6iRqhsZvaZHDJBBFbQu9DqQGthNL8PCatA64taY\nk1rvPIPVVKNEj1ECPnj6LqCryNqmZaJZx3So9J0G3SCArQplRThnnUJbQ1MLyiqqUvRViXe+WZyr\neC9XC0Z7sSboyrwkLnaP8KYRXAdqkayzbjjf/oVr1svX57doBo93HqOt/KCcpZmInNYa8yFRqxT1\nGy/955m+9/iu4AM43wh9FcJJlcXVGPlzWmV8F8jr4sI6IUc1ako45yXvWcBqTT+IoldhMFqOKJOW\naZy1ilzEL2StxgVoy8vJPqu9z4mveY1zxJZQupFLpNSFnCulKKmDNcU0HTg5O2PTDeikaLYxlURZ\nnT/OOrQR7p/SBqUqS5oZx9O1RVUxqqBbXZtKUmFzyqErNGVRukDVaDwGg9U9gx9AVYJ2kOVOx6zD\nBvneZ3JeiMXR2gAKcs2oZaLEQlwWnDUMw4ANFopmGAYhJDXQ1jDf7lG9ZRy3PPrJj3n9vQ7dMr/0\npdeY6q/zO7/7+7z/9S/T9Rve/fJbbLqO09Nznj6LfP+7P+BHH36fr73/Dr/6K18n51tyilxfLKS4\nwzuN9YY4z6Igrl4yltZhXKCyx2yOKMnQlsxH3/shf/BH3+Z6aSjfSMvEd7/7LYoCVw3T7pr/6B/8\nA/7yb3yD//jv/V3unt/n9LhwnW451MqQG9fPP2W6ekxOC40qtdtuJMaBzck5J9tTrm8uqLWseVvx\nJ2ljsM4Anlwiwzigjo6hH6BERhc48h3v3X+dw1KYOs9+Mgza8Dwe8FnkX239MMtubyQXRauJ4Axj\nCDTA6kbJDeclVmadwXeBzjuM6/BqJCdPypUua4au0XUbhnFk2S+keY+qRQoRVkl+uFMoU6lVMH5W\nJw77HSXLsIcqiw9V0Q2FlAvbsRfcm7XEWeP9Fu97Urui8ARDouodxkqluet65grKVrypbMcNXncU\nVdlNF+ymW1TQtAjKKqwuWCdYN6011q8AHyWcz1YtGs8QPIqwxheVXH3QQTFUlfEqYIrh+uoJ52d3\nZPixXh8Y83O6aG76NdCtjMBya+Ps7JRSILW8VtMEgMrK66ssoJxEebyiD4ouFHI2tKLWO03kiWcq\nNiRMFOWDkG6KtBVoxDThrCcEjzYNZwvBO5yR3JsmsPSJeZopRdOMHBWcl0CwIPEtygvNR9zQYgAs\nVLIppCyRomqjPA0nYWi6AK1Gzk+2nJ6dQoNgDM0UplZoqaGrwuHIaiZXycwZnal1xuhe4AhK0Fah\nOaHeNCTIi7ixFW6twQkyK1hH7+SqokSLsT2siC7B6FWyBdMaNWVu0h4VG33z2LiQp0XUqTkx7TOh\neHyQgZeyipgKeUlSIa2ezThgmfjuP/89su94/c0v8o333+W0s3zvhx9i0gFXMjePdlx88phSKu/e\nGfg3//2/zZ2796hzIS3XPHvygPv3z6EWtF6PxkZTS2McB2JrdLkQdzs2J2eUacH4nsvHL7g+FL71\ng4+49+Z7pCWTpkqnFRGDMpqlwNnZKb/x67+GdT2tNQ7zhI6iCDk6GZkuO/YVbndX+NCxnw6ELrM9\n0jSuSV0ip8SyHDCbYzKRmCaC79kenUjxAiM7nZRQOTLtrki7K0almWohLTuGcIwfey7iHmsUm2HD\nbZJjbQWsHtf7+cIYLE1B54VUbnXF9p5SZ5TJglA0Ct91hG5L1R0QSKWyRMc0z2C0gDP8TIkdqlZp\neWFEEREktldKlWBTjTgPSjvB9qVGikAViI21DaWSzBSsx9uOo82rWN1YUqDZHuV2LDlwe9iRUsS6\nxmazoWaNN06aV53cnw4qkNrMVdqhqsNGjeoq1RacrWuDp6xDngoqY7TDmxWajNz9irDN0srq7LIj\nNWmUFUndFK8Zh1O0scQ0r3nxv/j1uS2azkv9EJCFrhmiMvSDIyxGNBGqME9xJZJL9bC0ggua0AnP\n0jrJTc77RKmyEzS2p7UolkhdaMWTM7TqSEkupYU7WNCu4L2T+xEb8N6jlYdWONqMlBS5vsnUrNc7\nGcRKycrkM+IX0drjjBezo67YmlnSLYKWU7hQiVPEeU1Vmlfuvspmu2Wz3UgWU1W013L5r2X4Y1cS\nea1if8bIrk+3BCVjVlOnLprcDlhnKRHaOgQCjXUeE2cKUXD/1mF1IxuDNR1UK7peDlSiBPo1JNUo\nLdE7j60e7TOuNlIsLPNMP46oYiTuYySvp1sl1cIUE/vDnsvbK95++13Oj04wXeDFowdcXt5w92TD\nX/3Vr5BiY5lneWNrRW+hlJllitxMz+jdBlPAuca0v8Fby3xYON4OTIcDvQEzeEw/cJgPbE7OmA4H\nNqFnuYxc3+y4uV0wdsvN7S3O3+fOK3fwXaDOGVrl5PiEf/S//y6qFbbjBtMbjIIWNcErNnd72vwm\nh90Fp0bx/OICq2V09vzqkm4/8corr6KUIoRBuKJNpsTBD2I+VY3edeKaqmKodNMtm03HJm6YLg+0\nznOxXBH1wpwjyhp6pVB0JCf1Ya07uk6MAlMLUgv0hqYrugmk2DmLd4qSIzkq2mmPHR3OBJoeyAXc\ntKp7lVx5RQ25M1AarcgDSWthJgiLM0kkqVYMCquyBMerPLjKSidzToNKGKcYuzOcOYNqMTqBKiTE\nVOq9JseCUgspX7AdTmjFrWH0mboOX63PuNQYlELVSFLSdRqURtsqR3KdsG6FgWtDUgqlsmxkEIkh\nhJUUbyhZfOxOW1rVkppRjlIP9H0AJbi4n/X63BZNay1o8XDXLOpaXRpdZ+iCZc4T4ybgTGY/JUqu\nn4WtG/mzPndTQv0wVgvWScslMQqUroReYkq1WLHplSKZtYroWNVA6BogObDgB5qydA1s66gloWjk\ncrv+wCvaK3QV1YQAYQPBBLwPQKNUsM4yqI45TqRUsUHTDYZ50vih4/U3XmXcdDgnVTitGlUlDI4Q\neqxX8jU2yZW+pNekdMBqh9LSNzduHZTVdadtFZS6LoiyaNZOo7XBG9lRvsTkybXCEcE3GpXU5Ii3\nnwoB2PqROkWKlu+BtZYUM5vtlu7oiFI0ZmUeqpZJSYYBtVVMU3QedjfXvPH6mfiqtz1LSVw8fc4Y\nArlmjjcdoe9oxmH9wO7qGTomTscNNzfXHPY3TFNhfOcdrm9v2Y6BGjOaJpPU0IOSae50u2N7fEpe\ndjz7dMfuUBmC4rXzI77zk4+pX32P19865+3X3uDPfvADjDZYY/jHv/O/8qMPvsmXv/T+ykrt8LbS\nO8twukFdn/Puu1/kxbNPyc1y2F3QmmHTBZncpnlttOn1IW6wrqMBuSRc8uAaug/i2Zl25NsLnLFY\n29OFnpu0A5XAaLabgaUWmWprRykL3ajpjaLvT8FodLhhng4YD2gLGeIc6Xyj1SJd8fWBbrzH2YDv\nB1KqGH1YYduW/X597yyALXKPnw3WeJSVHKMpUJIE0xMOoyPBGg5UdHEol0Qlo8D5QOMa609lk5My\nzjqqahiV0NoQ281q2fTE2XGYLjg5fo08Z1ItECVxYK1m7B3WOZYYiSWitFkD+3+u2VDKMvQD2Ypu\nJtlF1gttaFlgzlKXl79mPa951baeLOW9NC+3Mu3/C3CWn61d/7+ujD/jJeShArVKuV9brLUYI/Gd\nWgRY0CqMyrHEBdUMVpfVDCnys0bEuoG+98zzywnZOn1fp2GtGuaDApU+oyvVqqkolpToq5aGh9Vg\nwCiH9oZgBmo9xVmDdSO17QleKCulVlQuOLOh5p7gPFYHlrJfw/iWvpcAcs6WohphmznGcbo55+ho\nKzY8rTFBKEwtKbSy+H5DbQmMIscZVIUKMU0S3DcOVQET6WwGnagpoZR72Q+hqroi/leVr1I4o3DW\nUlvGBo1Vspt1K2gipQOqNI5tj6odaoLebzAEbEhUnfG6k2+xNozjSKvSvrDaYpwjl4LzgZpmctEs\nS+Lxo4+5c/9NSoHTYWTjE8PRlvHkFaiF4zt3GY/OuX5xzWF3QUkHOle4uXpIKYUvv/8+F8+eoI3m\nbDvScsUqOT7Pc6Y3iZZmbueJrvM43TPd3FJj4Pz8Lr/9r/81Hv7X/wOf/OQpb75zl9/4l36F2A48\nePCYWitf+8oXefvdN7h//11OTs958vED/sYv/wqnr56gN0foo552Bcenp9wcJqyONDRTWtAYrq6v\nGccNm80RxmmUshgbcM5RFcRW6Y0FF1Bec3j8kHLYM4YNZ5tESbc4/SrbfmYphbkVDrUxk6nOoHVP\n6HsGd4T1HSEE+nHDzf6S/byjUuQIrysxzjSV0M6QSkGpQG4d1sppKlgPJlNVBAW6Wpy1JGeIy56s\nIDPLe7guKDVjdKSqeY0IaawRipX3mezteo+/R2vppVciqT2nFU3n7pFrwXlDbR5lNeDJfYerFas9\nKWWW+QpvNkJKapF5Fv5lsOBdwCpgiUIpq41aHcF7vDOSteQW5w+0ujraW6ZmRdN23fgYAXYrTTBO\nOunKgPIS09OVWhXBO8Eu/ozX57Zozsse5yw5JeYkk6/WCtosuFDJ1aKbQHwVZsVUZZkYa6FOC3rK\nShTBNVLSq2BNtBbSNRU8lbXSHqhVtBTOGErJtJYpRa9g4EwLUtnT1kF0bLfH9P2GTZeJ5YqmL3B+\nljC5bTjbQzkWt7KKBNfT5pnSFlALzje6wZBTo1o4GjtxWgeDcVEqnNaSSmWeD1SV0aoHbWUDUQw5\nHagkSjtIUDoIoqxNGUwht5lSo0Bei+wuYVWAVAEBWwOKjKLInSOCwKMqtHZYs8VnMG5gNANdf0IY\nHFY1HBB3EzlNLHEGVium0lhvMc4yH3bM+1tKkhjQ2HfEqdF3R9jecXl9ydtvvkONlXG7pdSMbxMm\nbHj+6QOunj1h2d+yu3hM33mePXuMVpnt8cDFi6csy8LdO2cYldjvd1itCDA5DgAAIABJREFUSVKE\n58WzJ3ivWeaFw/U1tw+fkPaNkgqb7RFvnAX+s//w3+U//+/+Fy4edrz11Xv89d/8a3zy8BOMabxy\n9zXeuP8Wu/mWxx9/yq+/8zavvL3l7ntvENOO2nYMznN58wJvNH7csp8TNUJTijgnXGgY19H1PbUm\njBH7YdNKHtzGY+xIvd1hlz1VGXql2SpPsyNJOYJzXM97VFogGNCS7w1e0/UndO6YMHhMcxx5y2Zz\nwtNnn3K9e7bGrzr2+8g8LWgTaNVBtXInj2NOGWOk6tj1jlqiYNycpnnDrUoc8oy1CUUBFamp4UxG\nWVjyAWtlAGt9wfdmtRnI/6tICQu0Qk4HtNtRWo9xQfxUdU+rC5WJ0BlKMXgzUqsmR6lXagO5zhgD\nNUds8Cg0g3e05qh5Amsx1WOUxZse50CZDbncktUe40TMlpug9MraFnK+k2poquJEbwrvRNmiKqCN\n6GzG7meuXZ/bohnTRENyeDHvqVl0F8ZIRKBVTQSUEuhtwGJcJ9Uwm0W25gWwga4Yi1BMELxbKcKv\nbKVgrFu9IhKmhZdUTCONBiv5u5yjkL6LvOmtCxhtmKcDfhhRJlAIxPKcqsTD4swGyga0Jq/k6sqB\nJc1CNNcW7wAS2jtG7wlmwYcJpXpimah4puWWm9tLjo+PBebrLNpAyh5SpSk5VueSPzP61VaIS0Fb\nQ4pK9BLrG8Q4g2qS16str+0kyHmRlpSuWGMw1mOtxXvFIWWWekWOL6h6ppYOE4XJaIG8zITQybHW\nu7WTr0lZuJnKDAyuEuc9Lw4HIIPNDGUglUaKH/HK2V0ePPgJJRceeYPxnWRdafTbY4KRxS9XqMby\n6MULKJU7Z2fs9rd4pWQ40aDvB168eI6zQrSquZCnmZsXF1w+u+L8lXvoAo7Ckd3w7/1b/zIfPXzO\ndz++4MDM66+9QWuJki0vntywzJf80uv3eP+9u/zCL71NPFxx8/wB5uIFF7tLpsOtRNfMgFUJ1xQl\nSvsspsjzi6cMw8B2M6JS46AawTt8Bbc9po0D+dFT2rJnOUxM0wGdIyddx20x7KaCcQXtoOkMpTAE\nT7YNZQSC4s2Gznfkkuk2W5zqiNPCNF/LvbjW1GaISyYtkcM8448hN6l/UiKtIVc7KpHVhFGe3MQT\n1DnPNEUaiaZEC6Faoa4blqqU+MZ7zdHW08pMZkGpRllBzbktUCAXzUSiFXmAh07T8i3GZUInylxl\nDa14kjKUJBuhbtys5soElFWeqBlcRyHijRPvUtbgBVVndQfN0/meXK8peVo3DQVjwtqZBqc0tS7r\n51+WP2tlSFeLlEN0/TnNaWpdxcNCJpcDiYhuDioSKUBBlQZQ5wXIoHWguYnQW6yptDavaCtR7zpr\nKElo1sZ7UrkGEs1KnSsXoVlrLWR4FwasT8LXxK6K30xpkRorw3CXlGTh6e0GZQaU3bCbHXMWIIc3\n5wKqMI1UHCndoE3GFE2pGZrC2gBKpuzGWvlv+j0tWWJaiAV2tztyjSgtu1aJT4H3niUp6ewa4Wc2\nGtqtDqLaKDHJhL0sco9U5B7JWCs6Y9NWe6a8d4wWZmBrmZxn0E52ACoxc8tSr9lPC12+w5Ee2FgP\nRaqDu5uduFmsGPuU0kLsBrR1HOYbye3pxnSY6XoRWXnvSDFyfXPNq/ff5uLyOcZa+n4kx4VaFqZp\nYd7PlFqIy57aDK0FmorEVLnjRpwfscGzpETOMHQdtUZKnEkx8uR2xnUd6Jk0PacuYMKWzXZkON9i\ndeH9t+/zycOnPH52w9WhcXQUMK3yyhtv8PZbb/De19+FJVGvP2L+9IfcPnvMze4KZzsyho0fGLU4\nbOIhk2Jmmm9wzhC8kJ+stoSuF6Tg0TH0IzlFvNZEJ2HzlGZSVVANWhX60DMDUWuKiuhciTagVGJJ\nt+SaODs6EgbAygTt/REUePjoA/aHF3inIMuCU/ItOU8sKWKa0NM9AmRuFQFYl4m4FEoVgLczA3bs\niHHHkjMxXeNMxNpMKQalPdZHhtZDVZSmOExaNhQ5SUi8jRSVoO1FkFYDBkNrBq0DqlkUhuDFclow\n9ENPjpZaBHitnZfvT9mjtJPscZ05LAeRB7aCMnI6Va2X+0oEOqJVh9FJ2lrKgupQKtBqWIEhhVoj\nOcvGwPuOlj2tgGoR6s9pjdIYQ4xNIjlNpms0yShaYylruNYag1UGmmgLjAsYK64YZwMtTWhrsM1h\n6ClaiRLaQjOe3MS0aB2kHCEJpspYjXWGfpRBhjaGSmFJB3ptSWni+vYnbPu36foBimIcenAa48+5\nvp2lNaS9YK4UKGeobQdzQrsiCdOyUJvBWJFgaVfASrUs1SuZlKpGinvAgJqxrhCzaEyd2WKtIbVI\n6KRKp8xCa2LYqxUKhiVK5lTZgpzFtag0qoK4oLVYFGO6JeaE1zMJLcO1FigtAguaIkcU1zHYjhob\n+3TAZkF4lZro1EDLhXlZqLWSSuRmd71mPRVD13G8GTi9c87N1SUX1zvSsuf46JScMod55gvvfYmH\nDx7S9QOvvfE6F8+eMh92jGPP1e4GbTXLbqbrNjjb04eRrj+nWSdA6QpVa3I1tNS4vdkxzwvOGXot\nQNlGoWsVPzpivOH8zffp7r3Ch3/wf/PmGz3vvH2OMj26t2yPTzk+7qmxsH/xEy4fP+D5xx/R5oiy\nim7jsb6nU4Z5lnB/qzCOPQd1YIry4LDWMo69UNBpnBydoc5fgeNT1IsnlFzXHZ0jayO6Z20INnDU\nJIJH0nhvOajKbCpHpmeXPLc3V5wd3af3G4nJBYPzPefxNTbdEdfXT/n44T9HuwPGKmq9JOdLynJC\nPHhaH4C0CtosVXXM2UFVWBVANXKFli2dOcYbj2k9MT2RoUqTzLJKgeIK/WCJ2RJCR8x7piVR5obu\nBEJMS9Qyr0kTvy66cqIzSWGNk567ttRk8bYHq0lpwdgkLFnVr0fpjPEBuItyO4LvX24eSWXCak2t\nmSVONGZKlbt/o3vJLFcDyqKUwfYj8yIAk1QWYmr04QyyktPvT2FJ/kWvz23RrFVQ96kUytr91LD6\naCq6VZzXaOWwTdzlxoAz0ot1Roldztj13sauHDwLWix8unqsTqSa0EYyYbWKMdGg6JyROp6uq3St\nUsokd6M6MMdLunCK1SdY72kCCsQYQxf6z3KYRksFsdZFyDMeWoaildgoyYD4VKqKNO0pTWAM2lRy\n3mO7Ri1Q24RSSTwprWCto+sGCjuSSrgmKlKFIdcijd9myFmm56U1nFoJ1qXgXUCrgRQTpR7k+AfU\nektplkqgpkLThUZEo3AtYJrDNkcXPDpWdC0UK62l2+tLUYW0yjJn5uWAptCyoTs6ocVIOizslkjJ\n9bOd79X1FVrf0lSltIWvfuWXePH0Mc8fTZyennB21HF5c8upOyU9ayydZZonjk7vcPfVN+m6EyE9\nxYQvWSbyXjHlmYahtURqBpcFUG2NZnd7wRv37tKsZrl8gj67yxd/+S9xuLzi6vKSZX7GWE+YLw/c\nPJ2J88J8uEEtM94o2mA45Mh8dWAzCHyjOsGMeec53EykHOmHHtXg5uqSVhPD0YZNv8EcnaKOz2go\n9IpMW3JiOczUIj+LluVr6Y2hGUtVPddKCEO6ZpK1wr9Mt1wfPsX61wl6xChH5yz2aOSw71HV0+5n\nrvZ/xpye0uxMXq5ZDs9xfSBnoYLV6oQ1mxUwUtIt1AVTe+mFV9FFGGMZ/AmhGFK5IOUdjUxDtMJK\nK/ou0ErF6A6rDSVngZqstCSjG0pVai4sU0S1tVefK615tArCRFTSW6daWhMyu3cG321Qpch9fkkE\n7cjVoKoUOlByoqux0SjUFslFct3OeKwNsoM0DZqE31EapZw8BBzMywGaJfhjVPOU+HOqu1BK3tgq\nG7SWjJbVegUFQ6wCcVCARQvJ2YppUhuDMgVp8ldas9SqpTutxZHeapbpWDNYW6muEhdhIWoT8Xoj\nYjM0xitqFQ+RapWUrlFuizKB6/1Djke5K22x4buXwidFaYWSK1EpDJXKxFInrO8BMd9pZYl5QmHJ\ndaaWiZID2lnG0Et3NlnmQ+JwuCbVayrnaNzafy90HJPrgaYupfOOXrFdkuAVG6UciZuWqJUCSiwU\n5I1idKCxrLU+QW61lqAmStPkKJpglS0dhqNui8uOkjLKqhXkkIVNSqRMkTlm5qmQcyKVxGZ7wsWz\n5xjdOPy/zL1brG7pVab3jO8wD/9pnfehdh1N2RhDuZ1uh0MIJCg0EUlDK4mEZBQhYaEkROLG3FkC\ngRLBFTcQISEBUhMpBDURQQpK0lHSdtJpCQeBSbnLUGW7ylV7V9U+rb0O///POb9jLsasouk2Jgpp\nwX9Vqlq1dtVac47vG2O87/N6FEmGChmmcSLGxOZgzfrgiKOjM3IqvPDCs+zGHavNIeN+INQ9MSVy\ndVRnOL15BLXh+nLEhIFbTx0TnaNkwTlHJmDWJ7hcMXGvpoNqGKdrbPGsVyfUccIddEzbC8y45fLd\nu9im4Wx1wGVxXDy5R9e07C6vKbVyfLghL1vefecBl+f3WbcGfKdAZtcTayElyFMk5kSqM6jD6R1l\nHAb65ZLF+pDatdRwjc2VGgdKSnjXEGVPDpGcktKlqMQQMLnQW0ssFpGWnIWpFLzvWYpl2l1zWb9M\nv3ma3i1orMMsFhgimZHt2HNkn2efWoZ4nxICDDvSfqs6xqDvW04VyQZrOpAd15fnODZYezyjGS3W\nOhpr1RSSRyKJmCeEiOBAHH3vyTFgRaliOSudLMakl5hqscZjrUKRY1R9dUwT02Rp/UL5VzWSwg6K\nx+BJAQyVVa+yqZoMtRQlgBkDZSDGgWI9Xgy5VlLVDbjUhUJzzCGWDtPuNEkzKXlKELzvNBa7BITM\nMD1SWZ1Z657k63z+GjOC5kB5r7nWmsEjs/hc3t9mOycqZzFKpX5PD2fm63jKf5ZoGYPyojMN1im5\nyNCSMlAz1hS6pgeqwoaNqP3OVEQmqmQwmVInYk4IC6RmLq/e4fDgBuDIRXT+VxI5JVLKpLxTgrYU\nckq6RHJqgWxblcCUAsUtqDVibY+zepO0pqPvT3F+S2RLLDtiuqDvnJ7oWelKIgbnvMaZlkipmSI6\nhzIUWtNoBAcWqnIUS6nkpA+JGEFEN/zvKSpSiZgSKAmN8ciVGDO5JCTvWNPgm4a0D6SQsKUQxokw\nBmpK7Pd7chZNZDSW3TjirKPdrBXskRMAXbfA9ZGr6y3FdmxObhFKg+1WnO8musUhX757ztnRMXee\nv8F2u6e0D7n7ypc5f3BFzg/ZtI6lF+69fsTJ2W0WywPEeprFEu97olmS3AlLH/C+4DZrSgTEsNs/\n4cbpDTha4oZAazsePHqXEgL7aUByxswz477teP0rX4YaadqOg8MjnDEKl0HIJCgRb1pa17NceIZB\n/eW1JqRUGu9ZLdeYtgNjMPstNU6YUqjWEseJrmuZRk8qkRgnjDgWtqERy7YEVhha47G1YlIilIqn\nY5smhu05sY4smobGPo3FIRSkOPpuwRguWDVHyJSZ0iU5XRPHLUVavFgsaY6/zqSUNVnSV/bjE0wa\n6Zo1OYGd419qjXMn0yLonF55CwqVWy5WDDISgyoWUlE6OrViTYt3DWBneDGAI8WRfd1SS4NrWkpu\ndOEU1a5sciGlwJY96/VqhtG8N1vPxKBxwKVkcoFMBJOpMlFKxbuOXFXor/G/aoKJaU9JmZh02VWq\ndqG1JKb0LtFczDXiL/78pUXzk5/8JL/3e7/HjRs3ePnllwH4mZ/5GX71V3+Vs7MzAH7u536O7//+\n7wfg53/+5/n1X/91rLX84i/+It/3fd/3Nb+viC4nKt3s305gC4JSjpwR8pzFY5v3tt/yXnKQMi9R\niY1YzctxzlKyzEVmxsph3kd62QlKcTNuTdmUzluMVep0ISNNpERDzZYiW2qqlNKw3cJqfYgkUYAB\nmVK19ZzSSI5q/apkataxQtuojtE53a6mFKnG4Eyjsakl4myHcUZD19qWFCdiCdi0V2xXcmAyRty8\n7WcmQFlynAnbiJ7mTuVWxugIoyQV8DurDqsc0dmxoEWcQs2JWjzTOGhJKBliofUecR1UQ9s21DxQ\ncqBpO+IwEXJksdxoiJWx5GJ0tmxVuTDlQtf2iAhXY8BSOTy9ycFmzWpzwLMf+AZOT4/BONq25+Do\nNk8eP6bajnbTsYqJk5MbvPbwVcouIl1ldbpg2j3h9Qdv0fmWbrlieXQD3y9JtmNxeIy3idZOVGNY\nr9dIqSwWjmF/xfL4iJAM3fqYdYpc73f4pufsxjHbJxeEkNltH9F2HbZ2NL7BOa83yRw1frbRW9A4\nbnWGPRSsc7TekSZVKKyWG3yrQOZsG8yUYHdNiokcJ1IMTMM1UGkbjbMVa8gxYhH6WlVbWwpL4/E4\nkghXFIZiCCYTtw94bJbUpaN1C3JRrKAmpToEza7KeUFMetMEVYDEOqn0BiFlCOMEJErdM8VrQrmi\n9z01Cg36zNSayblSSppvmZqoYK3yI9qq7X+pou191SDDvl9iMPqezrNCTYwVfXem/ZyfBbVUcnZI\njhoYR2W/nelIbn7sJapZZU6xtGJIUUdVxhWwGiUtoo4nIwHnNEUzJV30pvnSAQXrtBuyAqWOlDoS\nyvBXK5o/+qM/yk/8xE/wIz/yI/9cwRM+9alP8alPferPfe0rr7zCb/3Wb/HKK69w7949vvd7v5dX\nX311nhf++U+tVbl/ttHYUCNQC9Zape0wkqvVxDqCbnhJNKI3rxjTzOkDmQuKVNHi957uigrGYygq\nircg1WGKx2LmRL74fia6sqwFcZaCJeWJWjOpDkyx0BeDoyekRAwjSCKTKZIJYaTxnoJGY3jjqGKU\nvJPVt15KoWSjVvr5T7M2Yp0QksH6AC4wpiv9b8yNZsGkNLunWphzZkSMivQFUi6zrEpUJ0dRmRGG\nmCKlWGy0+FZjQnJVelOuFakRi1KsS43EMuKlIcZMcYWmXcJYsDZQ2w5iQdaJ5bLjYjtQykTTAzmz\n3+6IKekhUISLqyd60zLCcnmDao84e+oZPvrSN9H6lkcXW/bjyFO3b5Oy4YN/62N4t+Dy+gorHmc3\nXFxPfOXz1/zR73+BF24t+JaPPoUlMeFZtisuL3c0IXCVPM+uDtlNe45vbog5YFLEdZ4qlrbrKX1H\nd/sG5tYzHN+/x/jqFxjHS3Z3H9N4w+1bSx7e23G12zHFxNAf0blC23bQ9fSLHus62sYxjYFxGui6\nnlwy26vHQCRknQ93scDVpb7o/QozteTrc0ouWCKLpiVadfE470i50jjtUDo8aTfSkjFVD9nRGLwJ\n9HhibsnumsvdVynZ4lhi7IYadSkSoiY/1mxxtOSSiEOiykBtqjqPqnYvOWWmKZB2O4QRa4WQ99Ti\n6KXHu1ap/m1FopAmsFKJRWN/a7FIY3BY2oUF02GmaY4BcTRe4d1TCKoksT0xB8RaSgnEOmKDByIl\ntYTksSlTcTS+o5TI5dU7aqSQgSlcKlzD6OVKRMhlrzKq7HAiiK1zLIe+B1PYIXTknBATZ+Kk0tGQ\npJbMKjjjYUYy/5WK5nd913fxxhtvfM2i9y9+fvd3f5dPfOITeO95/vnnefHFF/nc5z7Ht3/7t/9L\nX+uNvvRGBGyjt0OTKSXibEPOAbFgiuipUKNqKv0KQTFkMSdy0V90KoWU1VObS6amjPVG0+oEIoHW\nVlIxiFiM6OnnPVQ0LIuZ0QeGkPIcE6wLErHCMF2oDSvpD1tT60S3/jWr+DZ7sjiMc6S5ODnX6QLK\nFVItTONE13dUKYS8x+aEMZX16pgQd+z3e8ZwjrMLjGm0fTZRRxjG6MNahWqFWNRDrbkvGp0rkrUN\nyUKIELnCGk9xhhIVaZfShHULRNOz5t9pIZcJTMDWR+yCpaSJlVvhmoZp3BFKQpwCpFdHvYKSjbbx\n65UaAXKBmAFnODg8ZsqFwyO9lbZOKDRELP36iKlccf/xjt12z9uPLrHOcfvOM7THt7l9dJMPXW11\nsRUmDpuJ633keNVzevMp/uS1h0yp5dadO9x57gOYruWp0yOOT9bUFNhuBxKVg6NbNLc+CLYjhx5q\nojt8hoPlQ3Yh8nAI7Act+vSHLLtDzfrZXrMb9Sa0OTymGkOqajtslits15NToml6DmxHGa8xs20x\nHqxpjtb6uxq35HHPFBJTmFMTjZBzVZwgWfOcaiVXzdVp51a2lsw+XVMEnC3Y+Z9FK0S27MI9pK7I\n6SGmNNRkQTKd8zizYAhxfi4jebzUpY+gJK8qlCKkOBJzoHEeEPVgl4lq9qSyxUmL8Zpe0JVeo28L\nSrSXgLEVIVHKpLduseSUEaPgnJzUpGKtJeegkjkRGt+QkzCFa4yxMxW/o+L0WYwTvrHkEgjxShe2\n0mO9R2zByBFIZgyXhDhhTNUcsBn9WEqdF1JCjhM5F0rN5CqkOlAp2NohUtQdZRW/WP+qRfMv+vzS\nL/0Sv/Ebv8HHP/5xfuEXfoHDw0PefvvtP1cgn376ae7du/e1/2BrEeOYYp2lKrrFVqlExTlLa3ty\nLlTRjG3bqlfbmo4ULMYmzWQmYavoILqEORTKo1kpKmpXrFuFbGakm26gQUnUqSZsowNwEYuxBUmW\nlANWGp2fJiHEHSXb2YqZlTCPLmNKhpw1j2WUQWODEaxJc6H2GDMRAux3ezAR5zO+eLpuTetPWPVP\nI/Uu17sLYtjibY9U+/4c0tiZYiX6M8xZPfgiyjW01qqEi0KpGjuQc9B4WrF0c3ZMqUIJ2pZUSaQ8\nIaK3zVoSsXqkOyVLItSMsR0HN26zuLNApsqwv+TJxQPyZLi4esiUIvshsGgdq4NjlssjusWK6/GC\nguXeW4nOt9y8ecaqc3T9jBBrMuv1Ac5fc3LrBl3bcb0duNzuaUzhw9/yEgeHJ7z9lS/TDQ8o2XP+\neMCvRl76+Hdw69mPcbU9x/vM8e2Ws9MD2s0B5xeX1NxTs2WwRyAdvjsF72jMligThy++yMM/PCeb\nx4y7rVoYt5eEMbA4WOvopqpDZXf+gCJCzJnVoqftOnWN5cQ021R3uyusF9YHN5HgmLYT1idSSXTW\n0y/WWDNAmZT0Po+EUoogRu2BSaOYqcpisLXi502xKZVDJzgMe3Fkk9QcURMxOnIQvKxxzpCix/ke\n7xK77agtcBj0MRJQu4Ih10gKATu3rwY7O+garNXCGeuEbxtyTjOQxkLRGbkYQwwR6wKYmRFh1IZc\na0Yo1JSQrIsakYRrdLRmnWoxU94CDlPXWNeSY9ZuMaFJmX03L5YMYj1iFT5uZgxkLxus25LLJTBS\n1OxDSAHnwcqKWiGGogCcGpWKxHzbzrPppWgumYrq/38umj/+4z/OT//0TwPwUz/1U/zkT/4kv/Zr\nv/Y1v/a9ON5/8WOtnTfoWa/IxmJMM5vwA9Zq6h3WzqFLHm86naFIA85i6grJlVx3FBEgUquhcUul\nPjuLdZPawWrFiH7PnMBZg2+8puxVbaVTAcl+ZmpWHVybCERCKO+HUzm7JEwRbCTmQsxRs31CJJWi\nPvbq8Y1FJLHdbWmadhbPR20p5jYup0grG7xd422Pk451/xTDkNlPO6Tm2e/bAQNGkpKTcPP2XDeA\n1ugiyljBiNWFTp6dV8XqwshZoo0qLZJWgckm6AbaZowpNFkYh8LyYM1ivWDV3uTQnTJdDVxtdzwJ\n19Rhy7i9Zhqu2F0N3H76aZquo2B4/O4lj999xL38FhXP089+AyenJxyenUJNXA7XHIVDLt58AycL\nDo6OwRoODk8Yc2bTb7i9OeH+w3dxVuUvB0enfM/f+wH+19/+B7QhUcdATi37sRDjRCpPONxsOOpb\njOtwfsnpc6cQoaaM+DXVOmhWWFGL7vnddxievMO7b9+ltwmXA5dPHrLslvjNCuMdxjX43lCqYYoj\nfb/AWa8EoahMz8P1ijQGas2s12uOjs/YnJzSHB6Abagxk7ePmcIEUeVhecqUaWAqI63oZrmWqA6w\nmHR05bRDMqniqtfDvC20thKz5To4aDydh33Ql9xKo6qJohCcVM3srMmkvFfCUoGUE1QN1CsykpNV\nEnzJWlBQ+pFoQAHWRGqNtIueahLRWBgsMQmNW2BcYZwG7cAwlBowRlvjVDKlCGMcEGuxThF072mM\nMQWLoRSZY208+KhxKJPDUNiPmvNkrcyLJDNnqKs7jllPgniqKKshhAnnM/tpoG+1jmAMgsfZFskt\nxuiFQsShO0tl5FL9161//5+K5o0bN97/6x/7sR/jB37gBwC4c+cOb7311vv/7O7du9y5c+drfo/P\n/eM3qRVSKTz1wiHPvniqEI85O8S5npJVY2ktONfg3FLnelUJPYYGpKGEgEiac350Xul9jzGC9wbj\nG6wplDqR7Lxln617OWVyiSTUSeRqg/MK381moFpLiorGSjGTkm4TEV2ipAKIRlpQIcailBSXyEVb\nIWcs03SN80IuFZlDnlKsOK9F3JoVtRpqHbVlMw2gkASZ2xVrPDGN81zGUYujSsYaQ6lxPvk1SraW\nqENzdHhvRJcDuWj2UZ3lSrlEKhNIZtGsOexucvr8HeLQIKFnex6ZhndZ9g0GtaTWdkUuHmkOufW0\n5+LinDe/9Ab73QXtwnF4+BQf/eC/wWp9xPVuz8PHjxjjE1YHa77xQ99MHPfce/iQTX/E4+2W7sGC\nWoVu1fL2vXcxxnHj7AbX045xu2WzOebkzvP87b/793n5s58hJE9ZnnL81B3cBm4cHrJZLDHec/7o\nios3H2C7Hu8cTbfm8LShXy+xNVGNxTcd6/URnD/i6GTNW19+nX7V4w9vsQ8DZRppqeQpEKdJRxC+\nYbvdUYoWx265pm87ckos+p6LS4UQu25JuzwhWdF5bs74/oAigWQm0u4aMZaQi3ZEVrshXcyAGKFx\nDbUUMELrhBQqYy6klJFSaMTSySG1joQ8gBkoVZ041rYgfoZXN0C/ZgpTAAAgAElEQVRPrU6f8zxh\nrGbYl3ylMr3iKRSyUR4BFWTUILWVayg5YN1E4zMljJjOcdgvCM4x7D0pZKztsPaQGJ+Q8ohIIZdM\nKhFqQy5CrIkaGjwJYytNM8dSe0cMy5leNsfVWIupomyErP77lNQs0EkD0VKsxo4IhlQmSt2T614V\nE1ZZm3lWRUzhCmpLpdP8I2kwTuO8pS5IKfD6K+e89eql3lL/VbTn77zzDrdv3wbgd37nd3jppZcA\n+MEf/EF++Id/mE996lPcu3eP1157jW/91m/9mt/j3/73v4mSLcXO5vqU5jmhQ2hwVsiibWlMSUXa\n1QCt+k6LI5WCE0vI+u9b22Do1IZFo6mRjSeXHV1vqDkxEkGqnlJJiKkorTwXXGmg7xDrtOA2hTJp\nBnhKkZQLuQamXBTDZpMSocVQUO0mYhlDJKSIiQXn3ay3TDTGULLKqaYIJWsfcV0u6PsVy/6UGHVT\naXH0fkkpdT5FC7mIbrxLmhdeWbfr8wbdSEVqwdmebMCZTOM6hrgn1R25Nljmr6/Ky6ypIibxkQ+/\nhPWW+++8zZdff4XjzS18OWLhT1m2h5hs6FxiGAeSeI5vHZND4atv/CmXjx7gTOVbv+M7uXX7w7zz\nzlf5Pz7zP/L4yQNOb93k3/t7/yG2P+Ltu2/xv/zP/4iTm2f87Y+9RO8UwzeNE+MYWB+uMMayu97x\nR3/4RxwfH2Oq4dE7j7nc7tlsTnBHN3HrAxY3bmAWHuMNi/6IkkaGYSCFhHGVcfeY1K7Adjx5/ISQ\nLKuasZ3HtC3d8U18SSQbwXekNFFCIFahwRCmHVUycRjJYSKHiHcObx0xRMKoSyAaj3HCwWbNen1K\nvzmgmozPLRJH0sUjdtdXpLDHOEPI0DUdp7efZ7jest8/JoWB1aLDWIMJ6EHpHCYF4n5AaqUzKp0x\nxutMtQoRyxBVZ1tzJadJl57WIuqkwJSG3h0Spy2IJrkaosbCFKEkQ1YzsxobrCXs37MROtYH2pF4\nV0gZSjaKL2w6pLYkFwnRYUxHKZDynpIdvtHn2xqdMUIllqQ/R++UkWsV2+adI9UIWCV/Va85WFY7\nz6XrVQsctuR8Tb8y1AnaWikUxEKOI5hKiAlXHdU1eL8ghsxuesyyb+etv1f6mVOQdywJsYYXPnLE\ncx8+QKowhC3/9H9462vWrf9XRfMTn/gEn/3sZ3n06BHPPPMMP/uzP8tnPvMZPv/5zyMivPDCC/zK\nr/wKAB/5yEf4oR/6IT7ykY/gnOOXf/mX/8L2vMgcipSTesffw9I7BeVConEdORmkRkqqiPuz+SEG\nlRsUwDjEZ1KqWNOQq0EsGiJmCkjA+kh1FY/mm9TsEAc1CTm1GjcqC1JQ6Ib3YEW0fS8wBdVUZqNy\nhZgHyBVvq1ows84PU1BtJKIRHW1u8M08O6oVisbLhqjxqCkZELi8ejzHbLznoAFXe4SemPbEFEgV\nclVBv3W6jSxzWqcK2i0UQ5oSJcssU6q0zZKuB3GaLe3m2zaSuPnUs3hOePfuu2SuEWs4O7kFucEY\nmPKWkgJtWugJbVsOT3qur7ZcPH7EnTsv8JFveYm7b36Jr7z+FV794hd58OQRd24/w3f/O/8uu/0V\n/+Sz/5TqLN572u6YF198kTdef5M7d55mHCecbbHWE6fEOG6ZJpVJxRC4utpzujnA24Htbou4hoPN\nAY/P90z5Psv+CTfONrQu4UzFeej7jpOTm7SLNdV1rFanGNPpIq0IaT9Q6khdLlie3eHZzSnj9RXD\n9SXjuGcct6zmm0owHaNcEseRadKQvkW7YBq2pDDSL1YU69gcbug2HTXuyUPBNAM5QWk6+o0hx54Y\nRmydSNOOy7CjGEO3OqJpn4IcidMOjCPnqEaDKrRNgxTLEAdKyowpgTesxBOqILXDDpkxXjDFJ4xD\nZLV4RouuiUryMSsOl08zxUsqo8qCbCCTSLEyxVEXN2gGFrVh3KksTySyMUvw4FwkxURI+3kZOy9x\n65JMT24qIYAQSHFAjM5HmRUvalLR/QWS0YztoiYXo4QjY4TO95QIgiHUSs1C4zqkVqZ4xeXlfayD\nfqnvqpgAkqi54F0z15AeZ1qa3lFYoFJ5g7hCpcWZTsHNTdSkBCI5q/ba/SVV8S8tmr/5m7/5L/29\nT37yk3/h13/605/m05/+9F/2bYmlYpyGlcU0v/RZaSapZhppMM6xWDjGFEghKKjABYpzGKObOKmG\nmqxawqrOZJxfKonHWdVyWYc1hmyCYuQmIU5A1gF7qoacHGGyODQxrzoza9EADM6uqLVqtojrSbkh\n1nN1Jc3a0VqKbuxKVsmFE1KpaOx5hFgBSwwZZmiBtyr83Q9bUglslgsMjW7NrcXiqWVFyjvCNFBw\niNtTUNKRcVlvAKUSo2K6StGM8YrON7vG03pH1zvE7hjGa5aLDacnL/LmW6+T6+ucrI+QamjoFb5Q\nITPhbYtNPUaWNNbRNR3biz3Wej70Td/MeL3j5Ve+QOcMfdfx4OKa7/7u78G1K/7P//2zxLjj1s2n\nGYqwWJzxw//xJ/iHv/UP+Q/+o7/P7/9ff8hzT9/h6upaSThiSSkSQqDrOq6vr2lcwzaO7Ic9YRh5\n67WvIN/wHIfPnCHeEXPmajeR88CN40Me3H+A9x0HRx7rJ+7cfkZZpCXAJNjFzLdKUJuO9vgU2e51\nE2w8hkfE7SXTtKdQcVI5ONpALJQc5meqkFNlCnqYnR2fIdXQr49w/ZI0RcZxS9uv8G0PNTKeP2bY\nbRl3V0jNNK3DiiOnSIgjWI/3K4pMLG0l5UoIIyEZhW+UTK2FphqmkiEbGtPT5USolTjt2A2JWi5w\n5gDX9+/bcL1dUoP63UuN1NqyD+eITIhMM6NSI3Bz0flmKY5hp++HlBYrmb53FPTZLjlhaHS2Xg2m\ndLTmlFXbMsaH5CqUule1B0LfeyIoC1Z0ZiuE+R0TBcjkQJGJUrdYv0RqZWF7alpQyTR+iY0dU3lI\nSFt2+y2+KRgbEWOwRm2/zneA0o8QMKihxXghpkmBOkbf1ThumR0gmmprdIn69T5/fY6gbCgygTQz\n8NSSqTTV4n3LNAVaa2jcir4tXG4fkSUgU5mlB41uHnMC9AdQcsa4oNxNsYzDiPMC1ulySToKAeej\nUtCz/rKcF6YxE2Mh2Y4YIxjNQwHVvJms1rOUIq1vlTifVSjvnCFRkFyBMoOOtYDlEqBYEL0RxhjI\nsRCniHWGtikgSn6JEhhMZdEssEbHECnOA/PiKWlkShHxgabNiFFRu2TVfOZcGadA0/zZdtM3LV4E\nZwYaByI9d57/Zu69fY+vfPWPqUUwsmLcQ99lSh4JZYtzKxwdhkRM51AHSlpTa+Xm7UN22z1fffNN\nJBuevfUcFxfnLI6f4sN/69v4/B98jjhds1lYmsVtrvaBb/nYt/Hxj38b/+V/8TP8Z//pT/Bf/4P/\nhm//ju/k1Ve/hFA5O7vJbruj6zpqrTx++Ihpmtjt9ioFipk4BA6Ojhl2E/HeWzz97B265YIQlOCe\nMRyenOHbJbVaFosNF5dbQqpgLSdnB8RBA+TEClbAJGidw5wcY8eBtm+RWhkuH9BZy7Db0TjPjds9\n1xdPiGEkpYiVwmrhNUveGbp2Qc0CpsUedjAtVYQ97tmdPyHur4lBpW2N8aQQKTON3wZlH9RuQSmV\nUHSTLUZwXU+I4LKng3mmLjqvNJ79NJHjBTV7pqnHSmHYD3Re7YZ91+ozbB1hnB11pcFWxaxZVzEp\n46rSqqCS0pZaW0qx+MYTbeHySdQZek2EMJIHi6kTzjQYY7TdnaCxPTUdkmwhSyHViJVWDRadJ6Wi\nIXwqpHx/UWWtxmbkvCWRcK2nMQdI7WgWPYIlhKDQ8nSEMiYs5J3alSnMvkCcPaDooBhrdQyQUyZE\n3WVQCqkGQkiMYSKFLaVWXGPUVPCvSnL0V/3EkAjTiJvjGnIqhJqQMeNNi/MNVcA1SxZFmEJhzBfs\npi3WRxq7whg/pz0mck6UbAgM1HpB9Su8OIzpwSpk2MSilBMTSJIR4/QWmg3eiQq6KeyHPb0bITYq\nLaoTvuk059k1FCrGFHzV+AJbzfxjLv9cu/xeXLBF5ozolLOCC8bAOBS865CaMWbS7BVvmaaEYWTR\nGMQKxjRYBx5Dmx1TZn7QoFSwaJ5QxpCLbktJSrfPuSLGzeR5jxg4Ojzi0ePXCGGHtR0xGYpkprRD\nksG6hIREi6Pxa8R6nGuoudL3K45Wxzx6cI/d9YC3DYt2yZQTdz7wQbZXF7z8xy/T9Au805z4YYQP\nffgFnrn9AX7lV/4r/pP//Mf5zP/2Wb773/wuXv3Sq2w2a8ZhQIxmT5ch8cbrX+XR/UecnpxinMfk\nQq2Zg4M17vSMkBLjbse7b7/D4eaQk9MDrFjeuX/F0dGGzvQcbNa0y56K0K06uq5lNw50bUsOgabt\nmcaBEAM5BFLcUYYtIcPqqedYnN7m4s1XGcdHnD95GxPBt7phjiFQbWbReY4Pb3P7+Q/DZoOzjuni\nMTlc0EjLlDP7ccRkQxj25BQZ91uysbTeYrzRXJ9mgTiPEXBujlV2lpgScRqQFOhqxSBEgUollUDK\nE7lGTA7kvJs5sC0lwn63xVqPkYauW1Cyw9kFOQ+kkIkBqjXkojALg1DS7PgRg9CQkyWFJc1yiacy\nbHcKxk6BEAakXNJ6S9ecaLyGabEkvPWk7Ei1YJ06gxrjKEYPd71ZJvLM6FRaewVUG13rRIxbjFuz\nXh2wENW7jrKnZqWB7YbCNE2IK7iawaV5plkwztN3R/pnWYHaIpKodZiXXwZhAvSgiOqzxiSVfRlr\nv27t+usrmiUyjiNtSTTek0tmCDtSzIjNLBdHONtpzo/vWC832LFwNV2TUsDUESNxFr4Gcs7EGDUT\nGWGfEr3vMTYjOKwpeJkzU7zHWkimYm2msUJpHWY+bXOZaHKkOnUNWDMvWholqk/TqCOB2a6prUhB\nyTCGnCI5B1LqcdbTti2lTKScybXMG+1CzoaUMzU7oq2UKdFgKJyrUNc26lX3lloNrfMsuzW7MBHT\nVmlKUjRUSixFmBcCajfNRU/YvtlQSsuN0zPOn9wF+5i2OSCMnpIHjEtghXGaMCVi8h5rWqbc4Rdr\n4li4cfQ8ve/5kz/9v7l5csZ6fUzXrrj31bf5pg9/I6+9/iW8t6yOj5CSkXrAoycP+ZaX/g7eH/Df\n/fe/yd/9vn+L3/nt3+a5Zz/A5/7g9/nGb/wQr7zyxXnG+VVCCIQQuLq65GCjMN/N5pCcEturK6RU\nuuWas9WCxw8ekuLEw0cPuLw+5/T0iNMbZ+yCoV16Lq52iLUa5RA9uSRWBxv2+z2b9SExRFzXcbHb\nUcdL7t9/h+ODNY3AG1/8PDHD3/m27+H83Xe4eueLnJ/fI11fQplYrU91+WcdpUSeXL3DwapB/A3a\nBUAi7LfUkDhoWmKBq8d79rtLdcE5S0Xm5aVlGAZsm+maDubBijGWFEdqyph5dj2OW6Y8gZup/Bly\nmHAZGlEHulRhypk07Fl2C/bD1fsCb+sqOVtisgyhII0+j84pyMK5TIoTxmgIXLvo53QFo4J3YzFS\n2E/3lXNZLLV6apm100kLaqma1aU3Ce2GfNO+L7w3tkKNeN+r7ZmsSapSFa5dKk3TUstECFes+mPl\nJFhd+jhf8dkwDjJv3IWUIyYXXFfYDXexLuHsmpiEPMdo5+TJcUnbWmU3lEDXGZxtKNkwTbrYDePf\n0GC1qVyDKeQ6ErNHxFIZGdOAnzKr5SHOepyt2OrJ3qggPHliHLFmIr0XOlaqRlcUodSorbLRdMqU\nLVAwrqG6pNnec0vPHMokBhonSIvaIst7zoyBRkPGtSUznnGaCCniHag4VnN+SBZKpWajPmURaq4U\nKmlSx4/MWlFrLN5rzChZZkBJYdpPVNyMk1Oh/LI5wpleTz9vSaWlNGumEig5YlwFU6FWpBiqVIyp\n1Fmom9LAdl947rlnefvRG1h2UNfEIroYSoYqhSkN5DzRsMTnlkkCrrnk4vGWF5/+19hdXbCLV5yc\nHENtmabI44d3ufXUU7z8z15muV5QK3T9gtZ1XFxc8tI3/+vEEHn5C5/l27/zW7n/8DE3zm6SU+aD\nH/wgX/zin/Dss89y9+5d2lZVCKvVCu8skirGZEoZOTo80JgFI7RNT6Vy+/YJVMPl9SVXF1ecn1/g\nugWb444QE32ni5zlYgFU+r7Hzo1XihN2sSCnyNFiwa4OrPsFD+6/RdjuONtsuLx4zD/5n/5bbjz1\nFL6D06eeY7g8Z395TuM965MbHB6esD68oQsnMileUfFE14GfGK63jPsd18MexLJaHjAN16qysGa2\nA8d5vqejHZm35KUW+kVHLiqvm8aBputY5ol9HNmWwqGz7GImEVnWSmggYohVw/rGcYvIUpkHBUQs\nMUWG8Zox7hC2tF1WCdqcJeVQqVzruzkmV0h1UoC3/vRm91zB2EAM19QSadwRpQqBnapMZMJaNY/k\nEjDFYEw/R1+XOVl2whqoRa2kahax6ihLic57pjFwUe+x6I8pEsEkMgmxMrflnpQCY87UMtKIp6Vw\nffkO3j/COqvx1tki9YCaOu0ygVwTMQ/EGGdjiiNGKPFv6E2TrPDdnLK6dSx0nWcaEyFOxHLNwqxZ\nNGcEM5CLpfEL7ORJcUtyI8Z4YswouF6jbpGqyXw1YcqIsR6pBZ8d2WScq+SsLoycDGAVBlDnM74k\njAipVqQkBZnalpwrw7BlioFiMsVokdKMZIOVBc4bTAbJjlwi3gtQsEXtcM5aUlG8mjbWKlMSGrpm\nllmFcbZ/JShVXTOdwxl1LZkUqVkfrpLVe2uZ/we8JUwqSUIEyYa0h8PTY9746p+yPBgxlHnjuJqh\nKYUsdXYyaeZOqZ4k1+z3hg/c/jj7/Y4ahb5Zs9+NeoueLM8/8wyvfenLrJYLhv2OzcEhi37Fdrfl\n2eeeo1a4/85dTk5usOg3vPbaGzz3zHNA4Qv/7GWevnOHR48eaWyyMSz7Fftxh9TKwcGGtm2pAuOw\npXVC03gODtbst9c69jCew5M7PHzQcvXkknHcsswrqJ6+W9I0DavVipwTMSg9q+97Lq4uOHAG41qe\n7C6RGJUcHo9ADE/Oz+lax7O3Trm8eEBtW+g8x2c3uXHnWcIQOD48YLM+wK6PMAfHlKEgjOzTRLs+\nY3d3R9pPbC8fkqo6srx1WLGUnCmmQPmzMMGma2dhesEaozKckqhZC4hm2SuN3GZoMiQRjmeaUBTh\nyiVSjTQoKWiaRkIccLadZ/4z19UaTGGW2k10Tm3MRipZQEqmMlLZk0ulaRZshx3rZTN3UKoTLlVB\nGjls2UehWkcou7mbmt5HKBZJ1JIVeGJ7PeDJOKOHRapBUw1MS6094oLO/8OEAa53T8jZqgqFHanu\ndHmGKlVymRe5sUFqxVLIdk9KQuN7jHOIqCQql4EyKjFMjCGXSEwDIKRkoQo1t1+3dP01RviaeQ7S\nKKKJSOs7pCyZpoHtOHKwajGuxVGxblLXkBVSEUJIWFtBVBDsrCOZjFRtGWKcEDNSR1FakCt0uRJT\nwMyc1VLyvEEUbYExpAQlZ2pW8lE2GtAmaOpiipHqC756jNGtvJEFIk4hqbbBeI+RhHOVkPbEnBQt\nVrRtLwXiBN50c/FToXrjlpi2ZUwDMURGChd5i0jLctHiOvXimwIkBSqn6LDOg2hL5LzeXlLOTIPn\nQ89/lIeP32KzPsSWazADtVQsFRFN4as1YlymJH0kjLVIgeeeeZHHF/eRMLGuZ7iiAWteOk6P7vDG\nV17n5umZio77BdUIpcLpjTO22z3GgnUNH3vp4/zjz/wjPvyhb+T8/AnWF87Ojjh/8gjB0nXKDh3G\nHcO4Q1JkHK8IQfM5bhydslouefLkCSenx5yeHXF9ecli4agi3Lp5yGbdIc5iuobVao1vGpbLJdaq\n1CnnTAiBtmlZbw6o0x6RzOlzL/LojS/QWsvh+gM8fniPrvWMwxUYy53100zTiPctzjiadsPJnZsI\nhdy2uNWhFrrGEEbP6mBDyBPrm8+zDEBJXFzen2d9FeySXMZ55q2diogwjRpYJyIU+54CQsEsJRUQ\nS6lFlyZiaEUo1tOkQtpFsjP0qwMIV4SUMaaS9iMhTCwXB4AlxEiuI0imbR1RHE2j89Guaahp0pC/\nmonhgiJWOZXFYnCEKeC9YQrTLMszOBOgRGIKZFpiyGT03ZOis1GRoss3FC9XSsJURwoyRz7vKGlC\nTMWagtARoyOlMPNfJ652d/HhPUyiBriJcdQYiThSEVrnkVygeFKdKKZipSWWALMOVYojlUCpCesK\nlIyYNM//PWHc4+RvaEZQygPWtojxWHFAIcWCwWKko5YFpQqZCUQzTTRgScXoZHW3eN9oVKlRkWxO\n7/nCYRyjwoSqo+yBRnBZ/d4xJmqpqiEzBUyedZuaUEmGUova10WF4GIgprmY+qQRoq6j5E7BHKK8\nzda2GKcLJOfNvL1PupSxLcU6ohUEjzcLGtvSOE/jIeRA53pijcSQcWLYb/e0jcE0dt6oW8Y556Wm\nhjKT76sxQAAKYaqcnT7H/XffxjaBxi0QseRiqSYhcxiW85USVf1qrCK0ah443HyA7W7HdvcWB+55\nakmkOCI4bp09y8NHjzg9OSGmeZBuhOVmw9XVBSKWRb/g3r03uXXrDn/0x3/A8y88z+XlltPTGzx4\ncE+p9zljrTCMe7xvFAdWBWsqzgklRxrXYGaKlKGw357jDg9ZrRfUkvGNY7064OD4kLZfINbRtgsW\niwVd24ERmn6hpgmjywZrPbUBKRH2W47ufIAHb75C3T5hc/MWw2WDua6EZHCupV2fUtLI4vAUsiEN\nI4uT27THx6TthLhMjpPCda+22q3gKd2SxcGxAnfHa6ZYKPmarms0d9xYpVNZR9M2egAblbqJiOIE\nQ8F6LSDGGozRg6LWwhgnplKYxFKrw7mGRWtpmqK5QK4S4kBMHdBQyUxhwHswNapzJyWaRjFtSmjT\nAmd9VdK/tUxBLyPjvtIvFH6d0h7nEoUM3s2Yt5E4WZIMNK2mBxhTVLeZBExHqRNWhDpbPWtOqtU2\nEVOVzCTFkoIup8I0qYun0bGadQYMiOkQM5JKUbaCabAuYUwmx4TxLbZWUkiMMWJNpvUVI3OBbCwp\nR1KNs+e/zHlaUMr+69auv772vCZS7sBA5xtsFUKs1GKhqHDdmlZBGCXjnNJ93nMPCS3VFQwJsLPM\nx82g3YSxnpwLY5gwNlOLV1hxVp5aLUp+0ZO9Yo3CE4ypuuWOCduo9KMQlQotAjMcQzX7HlNaqB7v\nLUUqJe6wzilphULXtGAt++lKmZvGaaywEUqGxnm8bVl2a7rWM8UdU4o0pmFXB8JUaAlM4zWtXSkd\nvG/ZB8MYKiU2GmIlBicNzlViyNw4O2F7caXpgbaB4mjajlAKyE7J5+8jtBrILY3bYMQxDomD9YZ3\n732VVb+BFJgkkPMa7AGPLh9TpXJ5dUFIyg04OT3j6uqKp59+hkcPLxmnLauVjgCaxlJroW09T548\nnscPlff0raoxDVTn8NbjDHRtw/XVSLaW/bDn8KCja73696vaOa+udtw6WrFYHFMEuuUK27T0i15F\n1IAY8G2H9w0pjzSLjriLtIs1aRwo4xYxS25+4KNs33qVOI3cfP5DPL7b0qYBI57FcoWjoS48aZ9o\nxOCmQLm6wm6OKTkzXu4pV/dZmEx69JBtrSzXR0zDgDE6R+X/Ye7NlW1J0zLN55/dfQ17n32miCQg\ns4ukDVrowgwBRASSG0DAUEBDROQWSCQMLgBk0OAOUFpAwdq6O7FKoMkhpjPsca3l7v/cwufnVFV3\nVQqUtWW62bYIizixYw/uv3/D+z5v1zhnWNeIsQYTmtzjenvRd3HRhBBEC9nZjBOdnGXkYrRDaUta\nnphTpGnPYdhJHO5gWZJYIbtRuNWQk2VeT9D9ds+KesPRKFo4Ca3KLDU3SX5sTaMZaF2itoUvq2gt\nc1kru92IcYXaTjgnBY+2jTqLz7wiJDBrO62tKG2ofaW1E96MgIauaaWQcyVRML6gmhzmtIzuEymD\nJK9a6F46w54Fa7hNYbGGXkT/2VWXOOLSpaBQss+Iq4Je6H7BDxJG2FKhfUjcrJ1WNIogyy31MzrT\nbBvqTXVFjhqtPYpCqVWsV6nTcqVuqYuyUXMYNciNg6c3yFFKcKUyylqWRbblWoEJltI1ikqtmbhK\nlk9JbWuL5O2OUpIE3iHnCCB6RzdAkSiCtiG7lO503clFMziPUpJzYqwn94w1Ha0LxjlqCyhdBEpg\nFLordJUMdmsVpWu6FvJ5SR2722HtDrWcRRxtoaGovZETOCcthTWGYZjIbaZWsPVIo1BVRgH7/RXn\n+cycCzv/EmcCtI7WAa+vyF0R88Jgd9TWJPXFBLx9jlaBX/z5l3z+w39hMoGaKr2dUfWKYbrmG598\nk68/f0OZV7qWyInr6xsen554/vIF3//+P/Pi+Svubu/55V/+Ff71X/+VX/qlX+KLL77g6uqKGFcR\nHOsPQmdFSkkywjuEwaM6nE4nhmHk6fTENE6s64W0rLw8TtRaxZpqBLJ82DesGxiHEesDKSamacI5\nR6kF6x1ohTEO2oAZO117TAi0oKhLwWXN/tU36U93XO4fufrGLxMvt9S4+f9DwAwHFBk7OXGAXRa8\nuUfvj+xfvCRbg56fCFeK+ct/4uuv/o3p+jmPj3d46+RB3iRp1li0spRc0ErjtNogNop1XaUwUBIs\n2BVoNdHxLGmGXrk+7FF5x12qtH5mbZDTTK+Sj6V6YZomtAqcTpF1jZSaBeirNXGJmMFQomzhhQon\nM3rNjpREwtc7Qh0qAoQhN6xZGLXfOq8L2ngheqlGzI3aJZxMdSf604o4cVqm1PMm+2lbThiAIkWH\ncQ3NIvdq06QkdDBjhMerlNsWNtszvum7lb6IDhrp3owR+/AbxAAAACAASURBVHWvAtxOuYg7q1XW\nMqNtwdoslXU1lGLpzVFLxRoveUI/4fqpHZp+2AnduUHJjaajBJRtwnA5SCJzF/pJ2fBmwe+oXMki\npxvZVHvxoIPB2RG1zYOs8wQcqFXmOUXkFtrtKC1vURqajuQ61y7SnlIaOVfOc2S/G2TOojpm433S\npVItLuOdxikv0onuWOKZ1i5MUwOdgYIEQDVJ3WsrdIv3AarYR60bKdmS5sJuvyPYRjaR0mQTXkpk\nXTXeR6CjlRV3jpM3sO576CsKodeHwfJ4XnHO01VGmRFl7AaI8Oi6hy62UWc/6FjLlkJ5zeUpMgwT\n1BGfO0EPOG7Y2WfcvbkjXy5oFKV0xmnk9HRiHCd6E6dHCIFp2vHu3TumaSLGyDAMzPMsdjpjhWfa\nt5ZIa4knbmKpM9oTnCHGlWEnkN+YVnqTQC4Gxel8wRhFro1GYwgB50Xb+2Gx1HrDh4FaZcxhg6Om\nhvaetm2Te9cYP9DWSB8CanrJLs3M64ndzWfky4kWn1hrweeIP1yRY0aHgJue0R8+h3c/og0HejpT\n0z3r03v8/gbTFKf7222LLCaJRscZs7045FBkMz2AYAx7b4I+0x9iXRrSTWn2g8jg1iR4udorFcNd\nbbSSQXcqmVoiRg9Mg4OaKOmBGCtLWrFGqEWmNmzQ+CAVGXTK5k8vRdGKEeZml46sYzBaM8+yXFIK\nDFXmpOww2tFLISZFKxYVBkxQqCwyI6UaKS0SZ6GEHlWoEmWhBzoC/daA6uJb781RUsEZxRB2tB5F\nYtg6ujesK3QlBQTNCpRZO4FwN9GE9mYpBVFjULEqg4o4ZSjZkbOmpUZXmpYLdvgZrTQHfy0WyOwo\nKFqPeOPQxrCmyBwv3J9umYYj0KXKo1ArKDWBmjddl7Tv3QaqlhmXqp3et4fTGIFxaKEP9cK2HVOA\nEKJbU9sDJDeGNQH6hbgW9vuOG/Q2MO7krIix0bUixogzCWf3eOvQ2rDbR5Y509uKdaLZbVU4oSkn\neVEgeUcuKHEfYaA7atEiLfEGHQ0oRUVuonVNKLsyDQO78cBoNc1pqvZYHEp3Yl1xRnOJD0yjJUdP\nK4VuMqUqbHc4rTFtxFkwBHTb4d0gVVksHMOOy9OZgz3SVJMOIBse5hPXV6+5e7zDKYGlDMOIQuGd\nYxwG3r95SxhHvn7zJS9evODh4Y6XL19zf/+Ic4ac8ybR2iJHtmiTEAK5iK+70+jaUir43Z7eKrU1\nNIpxN1FqZZ4XEf47jzKB1BqmV1IpDONI2WQ8y7Kg0HKYaygRsHqbl1W6CqjuZAY5WEzLtGGCDr4/\nkk7vsYcrWl6xqXJ+/46bb+ywuwnSSp9n7KtvMv/433DvvxT4SF55eHrPQOHF8xvm+T09RpQL4hLb\nwgFr6+Q1Mg4GoyzeSpT0B8j1sqx4v8G5FYCSw1MV0TJjMaax844lZ56Ne0qurOXCmmZCcGizE5vj\nYNFHg+meLx++IFKElFY7YevKaq7kmqQj0pnWRDrnnYwP6GKfrE0zhhsRoVdIpQsQGLEGD25giYW4\nyjxTbMgdnTb+ZWvbjsCgrZDFvDV4Z2isxHihtYzqBZA5bvCBcdhht0iX3gxWw5wixhQqQgRbo8w2\nU0bAHKiNd2vRulFrxgfRoxqzjRyylo8mlXHpmVx/RoPVDJ5gDmgr8bOlLJS0bjnnlkzhfLkXa6SW\nqE6lNVa5LREvMPmA1ppS1y0ULWP1jGk7ehW3g9YWp8IWwCRZLKAwymHUxs3rRqjtqm5JjVKtSFUp\n6C5rJZxsqEbiR0uh5UYunao0zhq8t7Q+SDVZJXWwdkPOiVaykJJKlcTLFElRlk1392959dwyL9Ji\nlGaxdkRl2R5qFDFLtrgzA9UZhvAcEwaWdKavHW0c2npifmQYnLTqXaHsHoPCWaFYm+oxRuOqpleL\ncTvAcnV8xXxeOJ9OKBI1GxSNuD6h88Cr5z+HKo79eKCuM2prgWrrxLTgvRx8g9lJfksVa2PvneO2\nICqlbGF5cttp7bYqSmaYzmvJvbcOY6VNMgZoFacNgx+2vCiDHwd8mBj2V3Q8rXUenx4BmRvO84zS\nipQiznviUjHe4ZTjclkIVtFVx45OmKR1E4H1SLcKFTVNr8S7hJ5uaJcTo3W8/+G/8uyTz6RdX26J\nvRBePKf+4McYgO45fOOXePt//m88vPkRLz77D8RZtIDaGMmX6h3nPGGaCEHGCKlmgfkag9EWPzr8\n9r0C1JIxppGy8FNjSlIEKC2Fxnrm8fw1l5pAG5TzaGeFgNQUjoCzEiq3JOEjYDU5Su66OHGCaBiV\nsD2tVXS1opQjZzAmiPssy8Go9wGlB1pdSB9g3KajjYjVY0qYZlBNQdViR9ZCendWGJqqK1T7z+kB\ntQticc0XtG5Y17m6eo1zA7VsYyozoLTicr5I4eQTJSlS7SyXLM/MpuQAaF1jtMI6hTENpbYqtgac\nOdKLoSB2Za0lhO0nXT+1Q9OpPaYZtAk4N5BxzLVTW0aj8S6wxJU1nTFesQs7DAeUdgz+CGklaIcP\nGnTeAqFWrE54HajFoaISnJIWR4XzGt0967yKda1rdGvycGpopQq0wDS0lQNatQ2nZbbMEe+wRpGy\nYl0TzhfWPuO8wdFxrjMER1qlUmTTZNLlZumqySKqI5lGrXE5X1j2F1Qw9BYoOVNNZxpGYlwJYUTF\nzGVRlLyjIVCC4Ce8c5yLAGC1dfQu0QnBj2QMrUhOumhNxbERgsfoAaUHvN2DgnXtWBfI/kRaErZp\nVK2YlnFqx9AmYpzJdUVr0EozrwnrPNdXVzydTgzTtOU0qY9SH2OkwvwA1wUIIXC5XND6gzlAMQyB\nTsVaK2OYMCBZ9wpUZxwG7BYlEfwgIW7DhDKe1BoqJva7A5fLiePxKG1u65QqyYveWWiOukS8NeT5\ngp08ywK+5S0pUkGXl/MyZ3pMrOnCZB3T1TPq0z0vvvENyuUkP7PcCfmO0s7oZ695/Ofvoawldc3u\nk5/n4cf/F+fLLdevXvD27VtqlReGdyKxqimTlHjZldabg8nLyEgrwiBZ6jFK0FeMK7VVtLWMNnBO\nkXldeZjPrCWjTGAwikstzPPC3h7FnUijI1tmo7SMl/qm70UOwdYzyjSqACkJZuMo0FG1MbgBqyUX\nvRdDKZr728TVcRIYNkUqxNZxWuawpUpFV0qDnnCILrX3iDMNYw3oSm0rusmIqNVVKkDElaONQemM\ns0estqIGSBIVrIxke3kDuED1nRihlLqlvYo0ySiZaTsnWVdKO5Qa2U0vyGaQxaI21CpuQO1+Rmea\nkk1TofdN+DvhfWNNT+KdNhbvR56Wd7QS8UZt9HPwbsSbidzWTfsFzg60okS64B5BDbQaKLFTtAhs\na9XC9nNQKDg1UreHxRtDaxlvLao5isloFN5orO6iXELhtPxdR0Lq1+XCeB1o3dFaANWxQZOrge1r\ns8pRlMAEjJYb1XoHraKLcAPn+ZGbqyNaiW6y5YK2kjSosRwOB5ENaYPVO4awxxiLVp2zuqepRFwi\nKkTZK5pRkhNVp7VOR6RVrWdSrih2eDOizIDVgbwmrG1sCmBUy9hoUHqgl443UHLlMI3E1GTUgMSs\nPj4+YKwlx4Q10qpba7m7u+Pq6or7+/tNXiRV04dq80Ni6DhOrOuCUshh2TshDKSUtj8HtSn5mRlL\nVYq4JmrjowbTasPlcmEcR5ZlYRwlCbM2eeiXMjOZgU6j5UaKhbXeY4Zn1HVBlRk3TvQMl/nEOO2p\nrGgF8f6O6Rf+Fx7fvWF8e8f0/IrqwexeU8pKffsVJhb218+5/fF/4urFS+IYKDevWc5PtKoJw7At\nsDYiVu8EL9G7wcsipSGc0941Tlvymj62s9YY3OFI7o35MpNSpG0pjmG346palqfKaX3LEmfS2jFq\nQuuBVC4ilLcJ6zp7Y+lNwYevpXaMlTmgNisKAfH2DrZ7yT1SAaqHaqjZU3OlVsNJty0tcoPGoDG6\nC1bRCFXJmwFtG0rLi1ObSiqPBBPoutMpxGRoFEHf1YZSWaJtbKerFW36xh4SF19vRbSuVlIWgtUk\nJ+T7WjspCsy406FLuF+viao6VlmG6RlKTRgUe/bkbOmtkcojVSV+0vVTOzTnfMtgrtC9ojbCiTay\n6OlV0uEmt8d5x93Tl6QU8fpMV54YFVO4olQoKeOHQK1P8mYhSQSu3WEHCTYrZZD5YK2gIygJs+pd\n5BklNoqRXObRB1RqLMwYZSQqootz6YMsROkuVBVTqIjrInjJk9EKEd8a+eUaJzeSUoa9tvQy05um\nakOqCJCiG3qT4Ks+jiKf8ZZUErvdDaqPeD9ymDQlCxLO6B3GgGEH1jEvd0DDtSQRAz0RwohWipY2\nao6pgCGuBWMWaCe0GnBmwJgglrhe0LYQ14WmRlyxeKXpaRbKTNfkUknrSk4JlMFqLfkq2hBjZH91\n5O27dx8rypQS3nuW5cJ+v8d7z+l0YrfbkXMmhMDT04mXL19QqyxBlFIfK9UPWUygoAnspdZCrY3d\nbk/vjXmetxmgVLmC5pMo5bxmlviIdo7BD6TSucQFc04ML8SJlWOjR3lpOmeIcaHWxM4NnO8e+fL7\n/8jNy5+jvPu/adFhwp5iQD9F3PGKy/07rFIMw8jdm7ccryZGF2DY0Uve7k2E1xiCAChixDtHTAml\nKy5Im26bPOTGGKyXWeCHq5ZKCAFjLct6lphcPOt2pOSaxXFE493T14zuSuI5aqT0SDcL1hT0Rifq\nvWGUp9OpathqywtOG6ySzkwrRy2WViRZNadG75rWDJfTgh3k0LReSRFkOj4I1xZjsMbibGdwndpW\nYl3pXCQpVgVSziyLQG5ayWggBCEUDZOXhV95IkVLTk30oCmBVRgVaFay2IfSUWNl1Zp1rdRuMC0I\n0awIXm/cG6zaY9WO1py08mHCWUdKUSKA3f9g7vn/X9fp8ojZH7AUUJ2GJsaMtRrndtSS5Bdn9lyN\nrzjPb6jB0FslxotkjWi2llMeql5Fv9W7QrmIUhZMxaKgaBHL90JXmVTYHsRN/4lCtYZz8suy24NX\nSmOZq1Sw6C0TqFK1QmNoPdF0Yq0z2IrtssyATteaMHi6lh9zp6KVIy6Fbi2WQi8Kqy0WR68LuimU\n8YKUQ1My3Fw/Y5qODM6RYmEpi1RX1kNrWHvAu3vOl4WqFAfrqClS1IK1E3FplJjItUhueis059E6\nMS93aDRTONBKw3gjej0ndkzTPWVNzDYyhonSqryI6CJaTgqFpQdNbBmLxj+/kQwkYJ5nhmHYZEVB\nsmeU4ng8CrAlBJZlEbjvtP+4LFJKMQyDuKmMJ6XEOE7kmGhSkxFC4P7+npcvX7LOy391GNecOVwd\nuL99x/X1M5ZLZH8s3J4fuLm6RiEba7eeMeFImAZaKuS84rUhq0Zm4PHrH3E87Lj/8l94Gi07N5Lm\ni1TTJZL2Gn54z3R9ze0XP6CkwmE3cT4tPLs6kNJM12L0Lbl9nOHK+CJsml8ZZWhtsWic3WZ8XcDS\nvUs2t1bS6Sjr6EoxuoGzi1we77mfH0jlLAdu0ZRUeYgnZp/QGmrNaJU+OsCUg94dk79CYcglYowm\n10rvHqMLRjmc3knhUA0tKzEzZNFK9l5IJZPRTIMB3bHO43SVPYF10D3WC1KOrWPTBVIrQi3qhpw6\nKRnohl6rdHuDB1Up+QzuyBobcQ7kLMvTulmTp2AkGkQVlC0EZbFOobUjzhLlba2Xdp5Or2DMQO8G\n7wa0ChQKKINRgg9T7mfUEbSmR5Z1ZBeeb5KFCWcCKZ9EzqC32IduOQ5HtIrkItqqSuXh8pbReUqJ\nuA7eKazZ0zr0ulJUxqpCGAbWtRC0I66NUjvNJNCN2CKaCY8sLGT5M6OtQRtLWiK0DbRhJVI150Ip\nmdaEValUY00n8XPTaVoOM60VvWe6dttG0kur0RtUqaR072S1Bb51IcBIbnmhNJHMzOsjn4ZfwJsg\nEAVT0dkwr7eEEBj8Adt3jO45hMjcIKcFZTqxrTgzC4k7RnICrRONhUHdYFyj5ZleHshpQetCbRWL\nx7qGriOmj0yHPd5fk5cVb7WI6WnUkhmcRKo2YAoDVhtxFXVZDGj9n6EUtVa8DwJX6bKkG4aBN2/e\ncHPzDLdBG5xzWGs+VozeuY9V0RpXrLFY53DOMY7j9nk9zm2LpdZQVmJkj8cDJSd24w4qjONEuTxy\nOFyRtUF1ETsv8yODdZS4ELPEn4TjDdEZ7h/uOYwTt1/8E/rqG4zGkG8L1Ir95FPKFFCnB24++ZSv\nHt/TrQHVuL29YzcdOF2eRGvYJc9J5nqiN9RagxYW67AtyHLOoJBFYt0E7dYAGmUaVhuK8HtRKdNa\nY24rl7qSeiOiaMoxmj2xLJS6oFXHqI61nW7M9nU4jHVYHNZ5lnRCa0/vGqUiJQtxyfQAzWB6p6pl\nG9VnecF1gav0UtFG461k+5QGWNH/OqOoTZ4HYz2mRGoyxFxBJWqFWgaBzKgmErhWoFl6zazpTMsT\nOWvWdQP0tI6ycD4XdqPGeEXTG5WsN3ZTwDTHujRUUzhjaShsC+ju6AhRiarRtpOWZdufVMxPXp7/\nFMXtbSHmO5x1uBSw2tONgTwyL3dMwyizlS5zsv3wnKfLV+QCtVXWtLBGAXRMm4TFeS2zzKagOpqR\nOIphkAfXDdCzJrfN2VPESmfVgGl92+LJNlVLUgxKd2qVhUXpUQSwKGJt5FwYxrAh5SCXBmRUQ97o\nCJ/QOgvdoLB4pyj5JAN322QY35QwGlUndYEs126xztPqSswzV4dPUKbLzFBrni7vWdcz03jFoK9J\nJRF0pPREzFluhtqJbUYDS8ykKNlI1ncos2zSlWdeH+h1xFnFNDq8HWlREkDDMKGyaAlRnZIbtYm7\nx9gdcXbUZkTq5RzLecHN80dLoLyIGikl9nuh37dtrbnbTayb5zqEAVDs9zu0tqS0fmzRx2nClSJt\n/MMTGD6K1/f7PTFGpnHcBPId7zxdS8Rxb3A47jmfThjAaIV3lrXJdj+WiGqVwVlakQz5h9uvIK3M\n737M1WffZtDCn0zv7qnXL1DK4lJh6RH/byfc//xt3v7v/8LNp8/ZjYHzwwO7aeTd4z2n8+NGtZKv\nrVUxcAzDAMh8d11npv2O3iraeozzBC9RtV0Zuh8lCKw2lLHk0wMqZ7w2vLh+jgk79DDA3UiNtzy1\ne7QCbyy9CjUJIroVvHIYv3EKrAZkL6CUbO178xQWcfg0JH6lCRWsNhlx5RIFbdiqIOBwsvRp0KqM\nvLTptB7Fc648Vn769FpRykN15GI3ZoKl1UBvHTcYjG04L0WKRnOZ35PmHTmOxLXJjNJ6dDM0ldFt\n4MrvQHkST7Re8V6j9xrVNfMaZYNPk2Vr0ZhmqGmFFilkqi5gsgC/8/oTz66fno1Sw5qfcG6P1TuU\nndBqZPCKFBtrOuN0gKowoWOdZXI75rISa6SRUKVuIAArc0qt6RgoFmM7kMi5YCwonbFuFGlFtuKx\nNUJ/Nmhx62jZXtPWbVEVRCjcEyVv4VUtUaumFiOtUnUEtxPykM7EtG1szULXDVKTA6FqdA+ovsOH\nziU+UVSkmYyzshkuOXOJDesbxgbAYJzh9uErXtz8Aik7CcXScnA9nS54E6BKK616geoobQLdsE1J\n+FpbKa0TS8FqGfw7Mq0t6C6ynlI1hgnTHbrBLniBJ8dEqQrVEzXLR1eKmhOldvHWu471Qt4P4yia\nOrulHFY57D4Qh0TgvmXRa9Ee7vd7Wus4J3ZUrS0xLh9b9BAGrG0Mg8zyhmHAWMM0TRhjOBwO0PqW\nFLknWEspBeckisFay36/E0xYl9gKYzzn85PELFdLywpNpZXG6Acent7gW+bu/Z6XQ8COBz55/T9x\n+/4d7ue+RX16ZBhhiSf8j/6F558+Z/76nZDCVSYuhW/+h1/k/dfvyXnevOaaopRoDXunlYK2hnHc\nIaFpSuRgLqB1oPeCsQpKomYhX5Wt01FKScSDMRzGEW0dqnu8GegEPn94y5wWUm9oHRjchCJhTaG3\nTKcIPamL+kRCVWXT3XWjVqlMW51lkdgtrYkoX+J3RWHSexZwRt/o80qE93wQ8BuRC1qv6N1Qm0fr\ninEDKmd6DeI9R+GcYRccIXSsEUhJbiJfyzWSqwLlaV2UAKObMHovFKeicf451u4p5URKYqQIo6fS\nSKlvTkKDVp6SK2x5W1VLBr21kjjb1c/q9hxPa4o1NbwqGApD6Fg0IYw8rrd4XXDW0EvE64Hgr2n9\nkdzF8dN6wiiFqSIPao0tpElRyirC9p5lnmM6Sq14H7DWU0plXcVFYXyTz7NxCFs3KJFnUkoTkbeS\nGWjJ4pUuWYkLyUo1MI47Sl1ZyoXYErpLoJtE5jaCuqYWkT7RA9ZN9HShq0JuCxpLN3KTqKbopaD0\ngm6OmO+5vXvLfnwFOpG2lus8v6e3GWsmYl7prOJe6hatnQibVREUl1KbW8cwjNB1pLVE61oAI7Xj\ntcY0jQ0QlxnXxARQc2W/M3g9osJILpm4gVOUaXRdNqsr2CBkoVIETXZ1dSClzDAMIjbfYj92uz3r\nulJrY5p2HA5Hdrsd1op97oOzyFpxT8nmvTOOAyGEjx/ee7z3lJSZlxnrLd44qe6MwbmBjmyrVRea\nVV1FD2lNJ81n3NghK+L6QFsj3hnCbiQ/PpKfvuTHj4Gfe31D1pnnXlH6SmkrRCT1MxcuD2/ZP7+m\nrhee3bzmdP+WXBIvPvuM09svyFXo4GEMpCTQbBMsHwTYWlsJBTMGyII81HK4am3khY5Ceydqg2XG\nKcNazqytMNdE7wXbO/tp4lW/4evHewGJWIt1Fm+D6BSRDmRNM4oi4nVlqB2sGSkUcswbxEbRS2aZ\nE7oPtN7QSqGNJrWI851OpKlOTBk/aOZ4gSyide0SPWUGdcCa8JEnG+wONUzM55WUZ5zpjMYzmhFv\nK86Lrri2TlyQbqUWepOK3VrhPxz2V+ieiWuCZgnhiLKNeX4AEtYcCWOnd0OvAzl3es843/G+ir1T\nic+/94rRSqKMf8L10zs0FXSlSG0m1hljLwxKAp2s8wx1YIknum/YNkGS+IeKwZqBsXsqia4KBkVb\nKm70wqjUGtUqpURJOcwFctvym4Novxjxe8e79480FqnscmfQRuhDNlDsQoqZ0jTBAV1EuqWA5I47\n0bg5D21i0CNJi2zKtoaxmtwzSwLvj2gl4WdrljjgXhW5JKE86UbDbfNAjbV+i+NtoDR3t29wrweM\ncaScSOWRtXzF093KtH9G7hdyi1g/4LqW7BZlZX5qOmaUWZPqnXGwdO1QNWJUQbWC1RqrKipXWulY\n5xDnu2VSE9bA6XLmcpGFizGKaTdSK4T9kdOcGIYgUJMudspRDdQqsQRirZy2KgkeHx8BmKYdu518\neO8JwZHzmXEcGcdRljq1E0JgXdeP9CJrRfP3ca5pHdNuJOWIUrCuM8PwjN6bzFFLFluldbC5t4Zx\nZD6f6CZzefcVe1+ZT48s85lvvP4mLdywdM903HP75T/xySefcvf5VxjT2SnHl1+95XD9guiaZK6/\n+RHP9s95eHfL1fXI/d0bJr+yuzqIRKoWtNGUUkgpg24E5+RFirTqc4p47whWMoDEe23Q1goDUll6\nq3gNy3Jh5wOJjitS3HVVBa24nDFGMypP6xVrDc4OaIwkduoXxBC5f3zL+SyONeUs1lusgmwqS75g\nnXQDFZjjLFwIoHUlraxydH0RVQmG03oSY4RRYCq6bpK3dmIc5eVllMW3IyWDqQrdheVpjRH+rZIx\nilKVZY7QPb2JySPVKPCVloglsafSssbg0X2AakAdaNVj3Ap6wSAb/NI6KXZyUpTSNi9+xgdJjnDb\nDN2Z6SeeXT89R5Br6C4zpFge0XiMsiI5oqGapavOvC5iGUTLJrE0oTAri3OKXuWfobbEQatRAUFz\n9coaIygoPTHqCa0cznmaHtBq5LNPb7jMicvyQAiNMN7gCEBhnI7kAvG0sPaM7o3S1QYXUZQU2Y2f\nYNgLIkvDGI5c1kRKJ2yvKKMoqfOQ37OfOqVaaqqkXIm5bjT5gtEHBBIv+jnVtWg6G4xDwKiOplNz\nkr+WzLw8kvoT69OdiMC3MYN1OwYT6JQta0baMR8MLYPVFuMHgSakAmSUMmhd8d7hzEAps+DwSmJe\nH+mpU3vn2fNrOUq1IZWKKo3z+ZEQjlgn/u9hCDyezqRU8Erx/PkL9vud5JJvEQ/DMG4H3n7TWgpE\npWSZFV9dHZimHcZotG7sdjvWdcUHoRjZTY5kjCGEQNUGpRBrZ63sDgeeTiee37zg4f4e7w0lixV3\nNw6cLxd0a0yDJ7aMSjO3T3eoBn1duP36x5jBUO1I5omrqxuens7cvP4Gn7/7Avv8E477Z8QUqTVz\nPF5xONzw7t3XKNu5vb0n+EA3iqfTheD8RqeXw7H3TsuZ0jYtgPak3rHaMPgRawPaOLrpIkvTjtaF\nlqQ3yrpC4Yzj5d4z+MBaklSrStHpzOs9RTfGcKR3wzAcGcKEphH8EWMGPrkpLJeVd7dvWeo9RhWC\nfYbe7L8xztgtHdVaoEv2eU6ZXCF4jZ1E7dF6kQhfJfNhpQR47Wyj1UxbMt5NtLrdq2iMGpBcjErX\nCrSltUYpIvPLqZPTB/aDRPaiOlY5es88Pb3n+fFTDB7VusiRasWaG7R+BCWfW0LTJNYiZ7VV8Uqe\nmyaYR8MHXefwE8+un3ho/vjHP+b3f//3efv2LUop/vAP/5A/+qM/4u7ujt/93d/lhz/8Id/61rf4\nm7/5G66vrwH4kz/5E/7yL/8SYwx/8Rd/wW//9m//Nz+36orWq0Rp1kwqC75OqCIOELxFN0uqmiVG\nnNFQQVdDa1pwZ13TKjirqemM1pq4dHTtTOOAM0bkQaUzhAOtSvrdECzDOEKfCPaKF892XJYH3t99\nTm4LNIdwKR3jMDLPE2s8YY2nZkuwHqcNKRXScsF5i1ZY7wAAIABJREFUaVm1FjeLVY5zFL+u84Za\nt/xwFE6PLHGhFkWpHaONbMxVxLoBowLOOnSWUQF0equMe0uKZ4z2oLqANnSllSjJkxpkiORQ2tN1\nwiAb+a4auWSRfmhp/yydpkT034hUHKlHzukJy1lSohs4PH4I7PwBeqOguLl+xjxfYF3J6cJu3OHD\nhA97wuS5vX+idTgcrlCqc331nDWeWNcVrcXtI9g4mMYjp9PTBmfQNKWYxon9/kAInpTyVmEpnj17\nxt1dxWwV5gexfGsN7yXV1DpZOdQqmTvaWnKOzJcLtSR208Td+4XdOJDnMzUvDMcXvHn4isMhcHla\nuTruWZeFyd6gwkA4HHn/wx9w9ewZb96+55PjC+o0YlYIKnH77i21FA5XR6ZxR4ozTVvWmBmN5zAd\nRGtKYxxHcimiojDSfovovaOVAFdKzegP35/RMnvf7gatRRpH7/hR6FV3T4903dlPI4dhz36c2ccT\nT0mTU6GVClYq/nG6Yh+uOeyu2E/PUN0SS+QXPvslvrr9IXePn5PiBW/2NFuJMZNVkQWa9xKGaHe0\nZkQutBZx9li9LZY6zu2gdlqJ5JrQo4y41lzw2aKVkxl5k1lo8I4Q5EBsVSSDtRbJHMqWmkFbISdZ\n3alNXjoyW83McUT3HdRKZyG2jPONro0I6mkYW+ktCwxcNaHLl04plVITpRb2uyucPQhE5d97aDrn\n+LM/+zN+9Vd/lfP5zK/92q/xne98h7/6q7/iO9/5Dn/8x3/Mn/7pn/Ld736X7373u3zve9/jr//6\nr/ne977HF198wW/91m/x/e9/X2QV/6/LYKh903O1TOHCZVU0taertJGPGk4HcpZUvkakRdj5a47h\nhaD2XSLHldgiS5rx4UBchAu42+252u2J8YFORjtDK5116YRjYAzXeHvEENiFa6Zw5P3jj2g9QhE6\nUisNbwaKXVBN4Y3HmkYwBpUr8+kdfhzpeBQrzhvCMFCqIpVHEbmXSm6Juj6gmKk0YumorkmLgdGg\nbRHvevEYHRh2I70kIIJaSOVBbHVaAA678RXH/beID6t45muWoXZNGL2QS6WrA8ZWlJlRJBqFcdhR\nY4Ju0L3QcpbwKazE2jrPNO5RpTEazeCuoVr53sPAYRhJRUKMWmvsD3uUCyjlURYRwANXV1fUWhhH\nyS9XunwUsj9//nwTsEtK5ziO22adDYzsNreQHIYfDsZpmnj7NhPCFa21TbrTpYI1MgPNKWO8/Pdh\nHDDOc7i6Iq+GWiJ5XbG9sTzcUtcz58d77GXB9Mz8eGE/HokloYPjtF7o68qL0ePGgct84ebFCy7v\n3uF3Ab0fiY8Lz25umC8X7u/uuDkcCKMXPWw3hOA30IYs+h7u77cZK/Qm1fUHhUHPldzAB0tKCaU9\n1riPv9vWq+h4lf6IMCylQJdIjF4aow84RN6kdUeZTiORkmY5F6bxGXaaOB6vuT6+4rB7xhIX3rz5\nkqvpGSVfeGgXNAGln9GaY0l3aFXQrmLM5rxTMkpSJtFKQiNqBR8CTnmcG8TH3RIlz0JLV52CAKZ1\nlRli8I7RGYxr9J7oWVGsGNNK06I4CRI3Y4wHMqUs1NzQxmOM5f3jO3bDjGpGzBy9YbSn1jMKYUl8\nyO2yXuM0lFRQ6kOsTCHVC+c5c9wNeHf49x+an3zyCZ988gkA+/2eX/mVX+GLL77g7/7u7/j7v/97\nAP7gD/6A3/zN3+S73/0uf/u3f8vv/d7v4ZzjW9/6Ft/+9rf5h3/4B37jN37j//O5JzvSWyK1TGli\nV2tVUZe66e0qTYkQWGlFJYmoto1b+h3spmthL/LAU5xJtdNyYhoOkBWmeXb7ieA8a7yAltzndZ15\n7E8ML59htcFbQ8kGo0fGcENuj/QegSeabTiXULEzBI9XFt0VrgutPPaV27efc7x5QQsabSfGMDG5\na86LYcm3lO1Gbz3JlhsvM8MipCFqh6rJCcJHaYoCZUFVnPHkvLIsDxwPn6AqTGHPZy/+IyVV7i//\nSeZH6oMkI0qchfXshh25LqIAKKvQopqnFIM10JDo5KoSXg+UXrisMwOW0h2Pl3u83qO8pqyJyzLT\nmiZ4s0UDS9SALN+EAfnq1SvKVi30bQm1LAvGWH7+s2+RS6Q3LZG4RnM8HolReI+dzm7aM4SBXArW\nKEoteO+ptQqCbjuwpZ3PMtPMZSNGyU2ttKLUJhZdOo+nE5BklEEhzRfIkV4SukpIXXCOuKzowaGt\nYzCOUg2X04x3CrosnMabK+7e36L2N3TVySUz7Sdomdoy9/f3XB8PInPDMM8Xrp+/YM0rOWWBEpdK\niuvHEYPzAsPQxklr7iy1ZtoqG3bjLEZ7So7kKtG3Wmv8BufI85lh0EwEhtMD5tFChTVGmqlMo0MZ\ny/3jV7y4fkWvhiHsuLk5EOwLnu0nvv+jhbm845Q0eVnoNELwKP2MuDyilUU7K9k6WgZmgl+zdCUW\nUa8HfAuophl0ABWYlSL2JMnkCUyX58E6w+Ac1gMqkVKlFU3NTYwozWH1bkt2kJbc2iAsU06UdkH3\nhNFB8orMnpKFiNbmFT/UjZMg64jSIjU3UAPaKNKa0FYJPV+tdHVmXj/HaPfvPzT/y+sHP/gB//iP\n/8iv//qv8+bNG16/fg3A69evefPmDQBffvnlf3VAfvbZZ3zxxRf/7f+xcijlqBRSTRhjqO2JSiRV\nv7Vkkhipbcf0Tm4ZqsU5jfeGw/4oMAtreVgf2NsdMSe0ajizoxdNTYohHHB2YM1nUok4P/F0eqTz\nBd94MdA9aCuzxNYqKWeULliF/HmXGaxjcCNOd0wV0EfsGaM763xPf+y8fPmK1mBwE6PbswuB20fF\npT6hraLrKHxLFGMYKWuGbih0cqwSiDZIjk1FeI9KDTQ0qJllecNuv8e7a4bg2ZmBb776X0lfPvC4\n/hCtZEPbe2I3DpvMoxHcHq3gcjkB201eC1V1lJfwq2VZqRmmkBn7me6P1DJw5SdUU+RaGQbL/d0D\nx+MzTqcneu8Mg8P6A4+PD9y8es311TWXNRLCSK0S6XB7e0drleurl2LnxEiQW1NcXV1tNB/NZS6k\nlDDabAu8ytaJopTaFkoj3gfmOdM2J9jp8Ynj8Sgb/FqZt4N0WVactWhVmLzhy8+/YHm4Z/LCIKgx\n4vcTu9GRfMCYAT1o1rTQc0Gnxv7qOQ3QXWOMIzjPeHAYF7h9eKQvJ3opXB33LJcTZRj49NNPuX+4\n58XrV8znM7tJ9KjDuBdjREnkFDc1gWKaJjoKHwLBObQJUmEqUYP4wYMSwjqqSmLqFq/SNnG+dxPv\nL4/MpdCCpVlLSsLPXGtDK0/wisuy8vmX/we7ceI4Hyl5x/PjDU5rUv9FLvXE+9uvUf1CJ1GaZGgN\nfkdKCa278E+9kpyhJFEukUyMib0RuLfqMkoz2uF1xemVljO6D2Iv9g7nxfDhQgXtaAykBj0tpJKh\nBUzwjG5P02xyIcewv+Hkbrms70At4uFvidwu9A65J9GLFoX9oFelkjfKliLJfkQrIZ/Z7RD3HcqF\n8/zP/+OH5vl85nd+53f48z//c9HE/RfXB8vbf+/67/673ii1UrYYn1pWKo1mVxnO9gGjPNrIW0Yp\nacdKO+NDYhiOsmEd9pSW2T0deZxPaKM45/eEyZHrHr1WyUr2Ft0HbBP/uHMr727fEHPjsDswjBMG\njzOdOTZifYR2odPxg8W5PaYNIpnohbJErG20WMmt0taF+fLEzfUrCXejE8KB/f6GckpUpWndbGgs\nJe2TVdSkaNVSeqF3Ta9ZiNeuYLRDY+gqU2sh1RN3p5Gff30jLhljGMKB11f/kVo7T+vnQKeUwjTu\naF3SDZ11OH2F1VUwWcpJHISKWOeYumfyE2WttFpRekQj8Rg5NXQrTNOe8/mJw37PMl9wfmC3P3B3\n/57RFl6+ekFXmmVd0MayrCvOWR4fH8URZQYOhz3DMHK5nJnnCyE8p5SM924jGhlp0+ms64pzbnNg\nlc1hJXKlEAKlZHIpuG2+ef/wQPCe3ThRUmJdVuhwe/cWXSNadW5uXjJrRTzdk0vDGst8ufD/MPcu\nrZZ1973eM+7zttbat6q3pFeWZNmcY78kJibELUO+gTAY1DC45S9g3LHRB3HPDYG/RMAEQo4gB9xw\nGrId2ZYlvZe67NqXdZtzjnsaY1WdkNg6EHOQV6vYULuovdcac4zx//2eZ+yv2dy8gKLbzkRr1uVE\nUorT4T2ygpu65iHPjsfHI8O04+52y/qUOe+fmU97XNfaSe/u75nGDfN+RilNFokiFMFHFAbtDErp\nj4H3Vsxw9F3rPAtZGwbxwxVGlQgtEQiUbci3dtfdSESyNpr/Vt3w/v0jMUk0msE5+tz66j7MgEJp\neL//Cv3F36CtwnaSimDqtwzdlpdX3+Dh7jWff/6IjzPCtFaesQYjRiiFGtvcIfrWfhNIUI4cBefD\ngt45VNHMOWGNolcdur7gKZ9ZRWlZ6iqa+cC0jVHJ7T2eC6RcCD4w2h55qTJb07cCTLUgKy+mDdvp\nijl8SSoeZEURyLJiddvFWqeRMreadS2XO1Ao5YxSQwMeqwqioK1AiBXnRkr+N4bbY4z8/u//Pn/4\nh3/I7/3e7wFtd/nmzRtevXrF69evefnyJQCffvopn3/++ce/+8UXX/Dpp5/+i9/3h//rW2JNxJK4\n+9Ty8lcEVEMthZgEVUeEVReat7oEsFeUrszr/jItBmU007Bju7nllN5SCVijOK73TE6SF0WuLdxs\npCXXgJKVWh1VrNw//YSzH9gNtw1cIQ1CJEQphBRQyrDbXiHERF41JVQonkWciKLhvKw1CFVZjgdi\nWNogR0iMNjjtMKZvRCOhkUpSLvoNUQFRkKK0BlOBVFocxcgOaL/QIvPlcnxl9s8clxOje4EWLW7j\nzBUvdr9ByoXT8p5KIMTIqGWjVYs2IMrZYoRDyg5YqUJgNFg9oMUARmPLRE3QiQEdO6ZhwKoOsmEY\nd7iuY3vlGKaev/+7v2e3u8ZYx7ysjNuOEAPr6Uw/NobmujRYx+3tLc51CFF4fHzPOLZp+jRNbXep\nFKZ29H1HLpHT6ch2uyOlALWyrh5rLc/Pz0xTc5nHED6S32spl7ZKQCuFjw3m3BnN4WlPCSs5htbb\nlgWRweieYbzhvMz0zmKcJJemIckVRIwMux1P9+/x6wnbdWAT4zBy3O8JMWBy4Wq343n/RCmF1c9M\n0w6hNUoYYggNM2gsOa9kUdoA0XtC9CjVfFG1aKiZrnOkmiklI7NoaZAKorQKrtIGkE1r4VQ7pudE\nDgETNbdXdyzWsT8f2S8PjKnjED2lrgg1gGjYti/f/iNSKazrSXnlbnuHEYZBbunMSLWW6CObItGm\n5XWFlKQkkFmRL3lNShvgODmQtSbkxNPxPb3Z4OiQ2aJ1h7MSJXr2cSaWBvsuQtJbjWZkCXsomVJm\ncqio3CGqJa2ROezJNtL3V1gzIWTGdgNOOUa34RBfk+LCGmeKqJc6skBpUFISfCalSow0r3pq7xep\na8PAicRX/7Ty1U+W1s//r6yJv3DRrLXyR3/0R3z22Wf88R//8cevf/e73+UHP/gBf/qnf8oPfvCD\nj4vpd7/7Xf7gD/6AP/mTP+HLL7/kH/7hH/id3/mdf/F7/4//8zfJpRBrJuWFXFdSWdCqxYtibHcb\nQrYJtNL1cjdROPs9S36mzxMmdWip2W22PCwjtcyoAD6vPB/fMdoNPoJQ7TghadNUAeTY4B3ePxGl\nQVjPcmEAlizQ3HF3c8fY3TVwh/QEAqufqVpSrKFmz0brtkusijfvf87XXv065yAoqtnu+q6HdabU\n5mePRTQdgdJIIxEytyhEahPU6FdWAcM4UoS89LgFBcUaZ87+ieN8ze3uZfPKSIUSjk9ufpV8Hzmu\nX+L9kSC3qOwoJVy4ghaKpaa2g7fGUvWpJROKpDcj4dAmlbJUdtOG1XtOpwd0sYgL0GEzGX70ox8x\njgPDONIPIz4lfPCICs5ZYlp5enqk70fu7l4yjVukhOPpCaUk0zQB7RSz27XBTtf1tLB3y69WEss6\ns9lseHh44Pb2FiEEj4+P1NwWy+PxyMuXLy809ERYoSpNDGfC0hQpndGsK5yWGSdVU+4qWmSnc6zL\nyuG4x6UOpzegHNYO+POeZVnZXd8yn54pue2Au2FouUc0i5+RznB9cwOykfZP85nOGPq7G8QaiOcj\nKfiW8kiSkPMlydFskENvWdelmQDMCduPdH2mG9rPTMomA8Q6Pqh8MYUaEuG8UksAZZpHvCaS9yhn\nwQqqKaAFKSZCWDG6Q0mNUvD5F/+M667oht+hlzOdcYxW851Xv8H+/Mhxfk+qnmnYYK1hWTzeJ2Ke\nCUu7vza6R4hCyjQYi5asy8LRn+m3GwSSXAtaaqZuRPc9SyxU1zXOaxFICVZMnMuKXzPRV2qWrCVi\nRLrIFCO+FHZXDis7qgAtBmy3xfY3nJY31PPn+HJoGWSRiaGgOgsIcmr5YWhai0qDfEAipsCr7zi+\n+R8HlJCImvk//pf9/79F84c//CF/+Zd/yW/91m/x27/920CLFP3Zn/0Z3/ve9/iLv/iLj5EjgM8+\n+4zvfe97fPbZZ2it+fM///N/9XjuQ4czFikKCkepM+ckiGmhkknRIGjw35wT2l7qZ7EQi+fLx58w\nbW953qt2SS8zfW8ISyHXuf2Q54AQCSU7nvaK3Wak73vO54hfT0gSqkxIHS7cHIGolXUNdGbkV7/1\nm/TDruUAQ+V1fssy+5bDTBXdSaSwlLDgtKJURxWS4/Kewd0Qz8fWuKitoytLRVfRKoNSkWnKYmpB\nmBWnHSUbEIXKSqVVz1IGrSRGj8zeU2rgsL6j74fLfe1jO2IIy4urXyU/FaI/c8jP1G5Cp4qQBSkc\n2hhyKtSqMGXCygGlM1Jl4joTpKIsgo2zHI9PreVhHUo259I4DLx9+0UjqovK8/MDX73+OV0/sd18\ngh07UinUXBjGka+/+pSrq2uMdhxPe0KI9EN/OXpHaq3EGNntdh8BHfMcLsdzTd/37bQh5UdO5vG4\nJ/rQdtnOMc8zwziwzDNaN5htColaEufTPTfjhtP+EeUUFMnQb4j+jDaKsAREbazW+XAg65V+c0Pt\nBnyKxGVFhMD26go/e7TRLbtoNLl4csnMMXO3vWVdA/2wxcT29efHR8ZpS5LtM9Cwd5okFbM/o4yk\n5EqKsXm7bX8ZDLUHpQ8eJ1U7ndRMDhklaJ4JKRrwVwm8j6SQ8FWSlwUrC8ZoNtMVaz7g18ISPSmH\nVnfEYo1GyMI//uSv2W6uGL/1PyDoMJ3gdvc1/uM3/idKFnz19GMEI+Nwze1uYH/Yc1LvEOKE92fW\n/ICzFzygvOw8naLkzNN8pNs4pDQNENJptLPoc6Fae7kyS42BGUQLpqfmBQo+tCsrY1DWscaIkCfm\n+8+53n7ClXFoO2DcyMYILA5ZBI/hn6mybT5yDm2hDyshFqQwH2lRSsumRFY09XcpiNq0M/LfIlb7\n3d/93Y8oq//366/+6q/+xa9///vf5/vf//4v/EcBQig47dpCVUCJgiiJnCIV0RSvpd3N5JCIPmN0\nm4zFUnm/f83d0xsm93XmpVUmye0NFXIlpkSshf3ZM3Y3lKgJtsNpxdhtmJdnUjzgOo2SrvnSjUPb\nHiETV7trxqHj+uqWq90OqiNEeH3/jjXNxDxf2hodZmgEHlEFQsHZH1DCkmtFCY8VmlLSxXxZESRq\nURin6VyrF8pSqEVSs0QbgXWCnFZaorhN86SwGJM4nZ64+frXOPnnRjLvO+pBIqTG6Q1fu/5Nnvfv\nOK9foeUjgxyaAKt4Fu/ph5coeYWqE05YtPOs8YksV6TusK5HSIVUltubHRKFMztC8CynM1bDUtpA\nx/uFnDxT/xKt4HTaE1LhfPZ859e+Q98PCCEoNeD9Quf6jz30+/t7hGhd664bPvbF5/kdp+MMyI8E\n+PP5TM4fCEj6Y0BcKdWwc0rizzPdVraf46XYsBkG5vnEMA6cTvtWTJCCHFuGWYgmrjPKMA098zyz\nvv+Sq5sbbq5v2L/9CttZ5uPMze0tx+MRZzTOdsQYCV6xzCt5J+j79m/UonheVl7cjPjz8UJNL5ew\n+Bk/z1TRrlza/90QQuMoKGVw1l52Z1ByJoX2IPDzjFatPYMAbR3KGjrbcz4eeD6d8aWRiaZ+yznc\nEvPCMkfWJTYfuJIUmQkRlKoUEj/6ux+yGya+/fX/jhIVWldeXL8kpP+erhs47U84c03fD+yuvsHx\n4Ve4f/gJ++NXHM6PeB9wncbYDi070twUFN4vHOOxDXykRlbVwNG6UnXFWNG87qLVRMmKkgRaSZIE\nWSrXV3dkekKa8XFhvz4xrzPIntF9gmFA5IXBbhCinQjW/Eyi5WLX1V/uvzPOfsgzf1BsV5QuiNbQ\nJaRMZ3uQ/17RcOfMaGwjc9PYeLV4cu4oVUIW5MQHrCA5Z3yBVNtRu8SZr97/mE9fCKiJimKNz4S0\nkGvB5+bXyyWR88zN9R2iWPws0dYyjS9ZQrvDsMqhVU8uht6OSJcY+h1Kdk06prbM80zvJl7dvuJ0\nfI8SO3JMUCOhNMGbkvJSiSss8XyZ/C50ykINjbaUF9AOoVvOTSrDbtfjw8p5XcEU9AWYrKSCojC2\nw2iHVBUZKynOlOxRYuR0PDQajNSE6HGuVe/udt9i6Eaej1+iZGQcBFIYivCs65HN+ALBgLFbjI4U\nLGt6BBEQUrGWGajUOWDUwHwukD2H4x4pC1c3Lxj7Dc+lMPYtP/ru/Vuej0du716243e5AIFpQWVj\n2uJvreX9+/eXhoy41DIVKSViiHRdj9IS7/3HAHvXtUWqlIyzjsfHR/SkLsf6jhQjSkgO+0e6ziFq\nRgvB6Ximc5pcazPQxhN+nRnHER884FHVU0MgKUvXD6zzidPTezCK65s7jvsjt3fXxBSZthPrPJPi\nmb4f2U4bttOWdfWYouiHphARQjCfT6ScCMljRcsQCpp5UymLD5HFR2a/MriOrhuoJbdrBaVJYgGT\nkVXj3Ii5urqAMhQN1NVsrKob2AjJQmV92rPMR1IJ7Rje9YzTyLIE4hIRNAB3aSU6lNaczvf89d/8\nb5Ss+PrLb7d2jFDcXO2o5lusV4HT6YC+xKF22xsqM6kcUVqwhiM+r0S/UomoqrDSgk7s/RGNxSnX\n4LcopJaI4gk+UoQghJYr5jKEoxS6fuRq801GewuiEFLi7I+cl4hfV758/VOuxyt0jUQhkSqRksLq\nTdP81pmQJRdv8uVqr/XV1eWar7ZdFsj2NakUVStk+TfsNP9bvvbHGacDV9cdRjmKTAwyEQ+V85KQ\nuQnlc1kuR1RNSp5UC9oUtJY8Hx7oup/Qu5EqAnPZs/gjJTUFcC0OqWCNCz7OTHaklsQ6F5TpGPot\nPh7QemDsb7B2aMeldCDGxHz21BvFYb/ncDxxPjcV8Nh1aFGIoZBqpXHnWzNCqMqy+Eu8pznbawl0\ntt1lxRIhFXrXQ8qkNaJ6h9EO1zUZWi2KnNs9kawNrzapAbSgUz3n5Z4YjigGCisCjZaegKfi0Moi\nq2BSX7vcC74hpUpne4QYWVeNjwnrBDUbZOlRCHpjWOQjiQI54LRh9YE1eHq1peZGHdpuBlAdb+/f\n4OxEjoJ3h7ec5hM3n3wNJRWd69vRNCWmqT10Qkht0v30TN+3qpq79MihkY989BcknL6I6Nrfcc5d\noNARqSQ3Nzc83L/Hdc0XFGNAKcm6BnJccVpTSiCXiPft3rBc7Jc5R87zM5vNFcEXVKcbbtCvdB2N\nNKQkKWdCDOzubgn5kqm0FpcrNRfOxxkloO97hqHHh4WwJmTXkUtmu9sRU2L1C4f9kZrzZYCi0VLg\nOn1JBWTIzTJpO4nqDLU2JqUulSpbYFt+EH/FSK6Vai/RsdwIUVPXU64Fh1LZ79+jRaXTGzbjgq6K\n02HF+4gVklASWVaUMdhcuH//M/7PH/0nfPZ848W3ccqhtWHbXzEOhdENHA/PZALaaLQZGadrQj5j\n0SjRsXhPyAUtJKVUlNLUKnhaTxTl6I2mzw6pLqSitSnMvPctDlQTQgtyaMbLu5tvoUXXShI0OEp9\ntvTdhLWCh+efoeQrSslYZ5CyIIzF6S2pKPyyknIml4y1HUqJy7C1zQjgQyIjooxDCkWOYH5xTPOX\niIZLkfl8YDM5hrEDmdAqYa4gh6bjNMYSM/gwk2rGmB6n5kbctiPGdZyWGaUkQq2kegbaNNoZSy2O\nabJ4v/D+6QuGr18ha22MzFoROLRyl1qkoTcTZuh4OmWO85lKZv4nz83mU06nBUSl5hWlc0OvCYPK\niVxFIwApLioKhdKSdW6KjBAXIpWYC0JLYjpTo8SwQxSDjAnjGii1ArkmBBJRNGRLCZViKlp0F43F\nwNPhLS+vu0akl0Cd0SWha0SpnpBadbLvJrT+hFoDUg50/Q6hAotfGIis89owZFJSssO5a4QplCUQ\n14BxPeM4YVNPiJXr6Q5VC8fZ8yvf+hXevXnP+XRqLY0cWY5n3O2IVpV1OaOt5enpkZQCSld+/vN/\n5Pq6NYKstYxj25WllFiWGWiLkD3b1pqp5eNdJ4BSbSciEfSuw88LSrQdU83LJXDdVCZaSaTRzOcj\ncTkxdo41ZpSybUcXPO0wa3Fdh5Aa70/EGMi+0ZdKicTk2YwDawjEktsdWC1oVck5cpwPOGcxylKF\npdT2sDydz4zDyDhtCD4RvWc5zIS13dtvNiOqSoxqdk1pNNurO0w3kLIn54rWDmUciDa4pMS2U0WS\nlxVBJWQ4nw48HA68ftrzbj7gkyeIRDG5/TwVOGOZz4G4JChdyzOGhNCOodO8efszUg6sv1759ovv\n0HcO63S75pi2pOh53D8gnUF2EpcGtO/I3iNyRFJxolWXhbokGWwPUfO4PLJhRxKgZcQo00AePrGS\nCNG3WddgqFIy9Fu2VxMSxTpLUo2EJ09vOzrSWSKjAAAgAElEQVTnmlCxZp4Ob6gioYPCWkcVCi47\n6RAj0Ue0tXTdBqvatU7MzQrbGnQRoSD6hBQSK3qK+sXz81/aoqmlhFqZTytXu2us1cTSnMtXW8Vj\ngZwCAtOo56WpGly3oTjT1AxjwVrTvNZGokoDq9bSlBVC1Qt6bCLlhbeHn7Ht76Cohk5T9UIbtyhp\n2yW5qFg3cP/wnv3hnnX9O17efpMcaFRp2eqISjXcfwVUvdxVivYhp2Ss0qjBEmLEuYlcPRWIaUbr\nZtWTukns269BoXTziecUSRG0cKRcWVLAJok0AlEiJSV8mdmfvsLWgXTZhZTk8Su4XiOwkAWlOIxq\nx0YhLEoqpiHyuDzy7t2XTOOZJVq6YUPJDZXXOUlSDWnXS0mMLdw6biZiSuyPDxg7cnw68vz8gKzt\nvrTvNtxeX/O8f0Ybiw0Lm92WL7/6nOvra16//ooQPafzkevrW8Zx+phVTKl5fz6oMT5YLJ1rmubz\n+dx2Bfm/MDq9Wojec8yBcTNhjcTatpNNutIZTY4eZzRpXTkdnrGuQ0nVMqy5otRF7LVmlFGM44jo\nR5JfiSXhpMJeIk1Om1ZZzAnjDMopSrEcjnuO55mrjWn0nDQzbTacj0eSDyBFu7pRsu0wNxtiipxO\nJ6Z+YOgmXNdhhrEtkFKjPmgpmga16XoL7YGQMyBJoYW4s9BUJEIalNYIWQnLypJX/OTprEJ3XfOM\na8WiI/EUKKugSHFRv2is1ty/e8sc/xM5BL756tdQoX2m5vMJaRVCS/aHR/pBtkrszTeYl4Gnxy8x\nKlFqBFlBZ6SthLDgbEUlSUpnghUYYREUSszUlFAUkvck2XgBrncM49DsnLLHq4CfF47HAzkVrO7o\nrEFRKTUT80yh2TWUdK0EUAs1GbTaojAUb9D9gFEFLSvndGxBeB8oGVAtIlaVYKn/ThfNHI9gtoQQ\nCCEwTA7NhoRnmjwRzfPDSsmghUAqS28t1gq0Nvi4UHxBd2CUwilATCQ/E3K41MzEx12M0gahInN6\ni6k9m34HF8dPygZtRLt7y56aKyEk9qcHUjmy//k7jDKY3jDaHVaNzMcVqWjVthTaUSSLFh8qqWXY\nZGTsNaVWau2QqhJjZQkLvTYYs9CytVuCr9jSpFSyGIiBUDxCKM4pkTkzpAPWmuY5qonj/LYRmYrF\nKoftDPO6EE8RUUeCV6hOI9DkpNqOUUpKjNxsFW/ev+Hx8AZ1MvT9ytiPaFnwteLcgLUghENpg8qw\nPzwRvCfFE7d24Hw4YmQzgcYsub75GjFHpmni1atPmFfPmy9+xm5q5HTvW9TLdR1StshN8JFxMjw9\nPV3yl+31AcDxYfhTSpOnTcPA6XxmK1ts6f79PUZK9scnbqeJnAO3V9e8ffMFXiRkbeFvZyRa0abm\nWrc8roSUVrpeUzIICjlGejsyXG9Z4kIJTbFbasEaw4VbRhQVp027q1OSw+GJ0/HIq699yuFw4N3b\nt83t5DoO5yMhBtLlYaC0ph8GnGs09hhbttQiSDEg6oVxWVV7L1mHVB0oi46+pS1qq64GH0ihDTu2\n04RPiYf5QCclOkXWOVOkQbu28NNVdKwImcA051b2hSpohW/gq89/wrwEYg584+V30KpQiKyp7Ww7\nCeG0UI3E6R7Z31J3iXV9wi8ngo+X5Ac032ZsgjVdUbJgVNOMiOSpBQwtkJ5JpBwbxNrIS98+YK2k\nzvmikPas3uC6DRh5GZY1sHEunkqhpEoMmZqb6loWSVojUQiU0hQRm0yvKkTdkM4BZXqKEFQ84r9y\nPv+lLZr90OP9E30/8PhwYhhU252oDauakST6YUD0hvPhhFGGrhsuDp2INY6YAn71dKYnZUsuLfUQ\nfSHGjNECa8XHAHGpoETFGoEPp8tgInFa3qOtonNXH2VrStoW1PYNlNt3CWU8dph4dfdNBBM/+/Jv\nebf/ClmbyTKn0o7tSuC0xGhL13Ut2hJjy0ZagekkoiYkFS1qo7NUQwoNuV+rAjp88uTmfOIQTvS9\npB8dne2ggNAaH32DHaeKQ1KF5zwfSXFPyZqBLcpZQgItJML2lJwxquP2+hPun97wcHzGnheuNjcM\n00iXHZ3u6KcemTVhXolxJYVMSTC4HTEG1nDk+uaalGDrOsZp4t27NyiT+ed/+DGuH7HWYTrL/PiA\nURqjWz70eDxeXEqS8zk3/mXfcH5KN9ybMYZ1XS84OUEtGUTFOcu6rvRdj7aanBJSVR73z5hSwcgW\nGM9ND5piJPuVvu8uAFt58XFnapXE+YyUCu16ZLdp/p5S6bqR3Ar6SGVJJaJMg0+XUvDBo7qO67tX\nDNsrnt+84Xm/Z+x7us7h13AxcepmKTWSYwyksJKjp+s143aLVh1VgpECaRRVqubp0QqhJBUDCIQz\n0PeNy3BxJclcyXElicLTwz0n38oRpWac6YhCQinEWkFJiImqE9ppyuovVdW20DQQh0QKx+P7e/7m\nb/8zPp24Gq+RSiAu71XlWjIkIVC0qJAsDqc2SC0QKbLGGZGb6ydnqFUgVaW3rS1XayXlBn5JJSFk\nxSrNEpvXKuWZlFekVvjYGkGf3L7i6fme/eEJ7QqmtpSJvLBfU84ocaHQy0ZCC0uiSgdF4FWh7yyS\n1GJ3XGYfQbOGNixKsqJS/oVr1y9t0Zys4RQWlvM7jOm4f3/k7uUEWDp3g9GF2hX62qGLwJem1JVa\ntKlXcSQRqMITsm/UHjRUDThO5yOCM65TTFOPu3iEetdjpCJVQb1kJiNn3j19zvUGet2DGpBCUbOm\n5nY5LJxgMNdcT99mO37CZnjFze7r/PWPfsj7h59TRW0B4uSRMjO6yt3NLUYreteUDSkXpDSs0YNs\nts0aExrP7BM1FnKqpNqqc7m0vr0UhVI9i5cg2/VDpyRVt+ZUjpmcBDEDBGourEsipoUYMrbv0VpR\nwkLXW3o3MqqRQXbcbF6yhsrhcEDU5/Zhu/qEECR56NGmwpKY1xNWOKRuFcnNZsfXP/02KWeq8Fjn\nePP6S5b1RD9MdN2G+XyiH0Z+9vnnOGXQUtJNY2u7SIXWmvP5xDgOWNsC3s65jznFD3Gj/X7fgtnW\nEGKk63vev3+P1ppu6Dk8PGClQZTKaT6TXUOsHU4rRla2g+W033O+IOS6TpJyAsAZ1/QlpDbMk8NF\nGZspa6RzhpBmqkxMw451CSBic/YkmOcjMa64vufFq2/i/YnleMRoST+OLMuZ4/lInBe6TtNPPTkb\nzueZ4ANWWaYXV+3+rTRzgda2eZQuURwhVdNaI6iqIoYBM46UdcFYxW605KdHpDyzX4+c08KSMilX\nslJUmSkioDqBUZJqNV0nWJc2/AqhVReLbzGdUgUIeH58z4/+/m/45qffZhpHxn7AaYPAst3eEtOK\nDydKUYhqqNGSo6GESi3DZWfYiO7KSGxpKLZQfBt4iiYPTBSMtcS6oIUghDMxzfh0akT7rjE2x75H\nih1yaaQj1ztq1ZegeoMlR5/QyiCkwmjbZidrq0NXEUAketvwjSVWYvCIZC8Rx3ZdQ/h36j2vIjP0\nA6dlJoVn6F7g54J2GmuuGDcCfV7ZoHBKcU6CnBacvsXYG1b/TEgr5XLEEwKMbXT3KuVHr3QRreMt\nlMNoSQq0hpGUIETLsJUja/Q4s0HYgnEOo3uM2TAvM7UmYghYM3F39Zv0tqfmhCw933rxm8znPT4H\nJJrgY8uUjltyEcRU2WiL1YoQKyk+42yliBUtFdoayIHJTCgcp/O5VUljAVqCoNZWH40hIoTByIEq\nG3fRyFYFS6KBRmqK5NoiS/NpIaiKXQPCtjsmuwpeXX3CtmtQiERhko5jKfgQsOHMed1zd3tHiBqn\nFdKMCF04HE6IAnfXL1HGcV5W3r774qPjJ8bENN0xTRv2x2eoojVpqsCLzO3dHftzq0d+sEs25rK4\nHMWbgE1r3QAuOV+iSOFy55kv9Pf00Zl+Ph5RylCTR2uFs5r90wMvXtzSDz3r4YGH0zPbybEm0MoR\nQ6HrLcfDkd12i9SGlAS12ksZQ9F3tu2m5xnnNCFmTqcTt3d3HPcHjO4oshDXM4PTxNORrFY2dy+J\nOWNKRltDN71k/+4eZwe++vKnpBC4ubnBWktc1vb7Fhlte7a3r5C2mSflpScNgKwtIuQTMqbW/xYa\ncmwnllLYdgP2hSQZOKfM87lQlcKpiNADj0vCqMCm2yBFpOQTw0ayrILj8cw8n5HFIatuaggZGaYe\nUSNvHn7OLlyh9dcbzk2AdGNLgNTAcT6gpCOUBtnI2beNRrGUBEWIdp2AQKhMEZW4FqSQpJKJoume\n2+czQ2ktwef9G0LvuZpeUvHYrilobuzAGp5QQiNFBzQIzodOe4tTNU2IIDaepmmyt5RXUukaM0MZ\nKB05RbQUGGu4dFZ/4dr1S1s0k8iMQ0c/3HHyJ4SZEGLT9JwBrOzppx7hA1pKBJFiDLa/xmiLkY6Q\nYF3uyaygBFW15shuGljXhZTbMSWm1uKxxlKkbpI0UdD64kFXCnLi6XSPmiwpnUDAYCdm/UxJBb9K\n3r2759tfe2QavkXOFSkyJQaMsmQyWktyGfDBE6KmRosIlXhKmF4jRW6999I+vKWeiRlUNdhO0Nlb\nlNny9uH+Y/+4ikBOLbspJdSYqakSq8DUShIJbRTSgiYRsyHmhsRSKGpaSTWQciPrTOPAw9Mbuo1m\n7HbIkjGiRX+SDAglCOXA4fSaT6b/QPYK6yaYoMTEzk0NxpwD7+/fUWtqbABt2F7tCCHhfWiWQQHz\n6QRKYe3QQvxSfiSYa60IgRaOdhbrNMvSnO7QuAfjOBKCR0rFPM/t2K7bqUFKgZKNJZpCQEuHEbC9\nvuLx8REZEzEGttuJ4+FEN4wfOZwpRsZxIKaI0rIF+vmQs227NKk1JE2uimHsiTFwf/+Wl3evOJ7O\nKJUxtuP5dOb26opcM++++hmlVM7BU3NmGCc2V9cc90c20w6hKvM8ozyQMr1qDS1rm/q4TclXlO4v\nu0xBFQahCnFdUGGFWSCsacdS27QYpsws5zNb2/Mru1ucsnw1z5xLIRvNQGINz+AGpk3LKgtxJMTE\nvEZOx5XcrjnJaaUfR7b9BmMEQhTm84F1c8vmxR1OmLa25EynDaUfeNo/XBYiC0ZSc4Es0cIhUUhd\nsNpSi0RZgx4reWmd8ErLU5cSL2UHTQwLylme956UVzrdkcWC7iVGTLiiqaIgtUZoSfBLi24BH8Dd\n7f4Yul4DGefMx0qyEBpotHlsAiGRJmF0uRg2//XXL296bizKGLTpuBp7ioyE8oDjmiwcaT1jXYc0\nPesl/NpNO7RS5JyweoOSezIQlkAWK5PucHagc4VPXmx4MoXj6dCO7FExrwnZVbJIjTCUmlSpVok2\nI+vqOfoDvag423QazlpKDZxPlefDwt/++D/zW5+ZVndEUOqMlCu9SWRfsbZQqEho9KJUWLwn1orU\nDbyKaoMHZS0CxTBsScnS2Z6uf0mVjp99+VNiXtsuJxRSTGhVESLjwxFpB2QoCGsopSURjA3U2Mjt\nqUY6o3BaYYwiCMNSDHHNZCk4HB5Y5xUh2xGp1thABxRInqent0z2BZPZtTiPMbhh4P2bB8Z+CxSU\nsmyGLb/2nc/453/+Jw7He4ZuS+d6brc3/PSffsonX/sGr9+94WqnccbRW3WpTY4s67mJ8IRsP8tS\nWq71MgD6EHgvpeK6vhGPYgLrMKp9sErwuK4tvg9fvaHvJeN2CzE2WIZSnOaZzWb70QETQkCbRhHq\nur5JxXKlFo8QpimgqUilMMZe/izo9cgyw+FwYBgG9od3TN2WF3cvORxOaKfYTVODLitNkYqUM0+P\n73lx94IcZmZ/wtiOlANaKmr94KsppGVGmw0FhYgRTKUK26RqQmA3E8IbalgpORBTahKYbkQUhZZH\nSGecKtwMlqoVr8+efQxQBIO5wtaBoRvoXMDIp5YjTQurt/iTwMqB/spwffUJzmqqDEhbkRLu379G\na8fd9pN2v1wjOZ4pdcXYTAhz0/vW0uj6SJTgwlsNSN02Kr3pQYS2PxQaUxMxL6TadMBSiEsN0lOr\n4GH/JZ3ZXOJ8zask6RrxSemW05QTMQRO50dKiVAqRlqkikguIjvTYMZVRBCy0RxUQRuL0xatE1bn\nprz4RWvXf+O18V99VaVAWarVbMaJUjLzfCRXg08Hamn+E1krSYEnI0tE1waWrSWyrivzOTRAq44E\n14LgqhNcOU1nenYj+FXh14qisqwLvWuSeGj05pp0Cy3r5v9pwb9C10nc6ojF4+yGOK+8fvuOkP93\nttMNuaxAArmiRcV2IHOls5UYPbFYjrFFTQgLpVS0SWjT3ogld030Rs/V9A1EaRW/V3efEjx8+e4f\nqaWFcEG10HcnUCq2iJVySBkRRuJkAxBEfXGvi4LtLBulsFaQlWGsEKpAZkGqmTA/Q1EsKlNqbCqN\nGttRKwc+v/8x3/jkN0i1w4q+xaWMIeUASD799BsA/F9/+yPO8xO77QbjWiXy5z/9CeO4JXiP9yu3\nd3e8ffuWm5e3TNuG9bu/v+f25u4CDzbMS9stlJIJIbDZbNrRSim899jO4ueVGCPqAhwRVTKfZ3rl\nuNqNvH79c9bTe7bTNVE6jocjoiaiDNirzQUPlsn5kv+knci0MRjlCGH+2ELi4vVOObPMbYrvuo7g\nM8sS6PuJZVlBSvrBcT7sSUXShhIJrTQxBISsPD68Y7vZ4lNEpYjrOiqFGgPNrVoRKJS2zQ304S5b\ntGabVIJcBNJOVNEhZUaW1MLt8xnVDdgXLyh+YSkHAhmtNRsHPgbOWaDdyOReYTC4qcWpqJlUA870\nHO7PiNzz4u4ThmF78RK10xpyxasTb17/Pev8wNV010hBok2tMx4pK7YzFCKB3BIJuplVUQ19mIkU\nEZqqmdafrykTc7nASTS6Siq1UaCkYhCCHGdiLJixI4aAsj1KdBQEqmq06jA2kPKBXNcWXS8zri+Y\nmljXREx7ktCEHBGlqbu33USphaGTaB2bjA33C9euX9qiOfvAOAi0aag0aQxVah6O920abUZCdZQQ\nWrCVRI0Lvd2SS8FHj0+peZSrIgVYl5Whg4JGqRbYNWzxIpFkowgtKZDw1CpRuV4UqRZNh7UGLSud\nlm2yLjxX04CslV5qzsVzPj/zOjxwb+4xNtFPmqFr1O1Mou8UWjtqtpeL9sA+Fjo7UWqLcZiaEVGw\nmUZSquwPR5xZ6eyOlAqQuN1cc55f8Lh/wNBThUaKFWsb+LemTEwKZI8o7d42lUwRCaEqVV44jbJi\nKDizwQjLyIhRjrTu8enAcTmQNVgh0GS0MlAbBWjxJ14//Jhv3PwHyJZu6jjOZ5xUjN3Efr+/tHhm\nNtsbUvE8vH3N6eQpJeI6SQyBX//VX+ft29dY02Ru1jpef/UVn7x6BVUQY6TrCtZYDoc922nHshzY\nTLtLlbRdrdRakDajZEsfGC3pOsvhcKaUFS0lN7sbnh6+QNTCZnvNZrtlXRe0s5TcFBBGyubsLhm/\nzjg7UnIGKdGqhdOtMeSU8GvEOsuynqi1Y5pGqJEUIyRaHXOeyWGl7xpBvGSDQpBLxnUd59ORUFa8\nX+mGvlkwz+0B0Q0jqHafVz6AeJAI05BtKmeogqQMJa9I27KE+IK4eHLIiTqf6LRlGHf0VO7ffcUx\nnniKkUNacWZCY1HG4cyAKJ6huyHnzHl5xJlM303kMGGMwvUtu1yyJKXK4s8IUTBWcDw/tgGKAEgY\nbck1YvSFwCRUg6aUAAiybKcHmVdkrcTiUFXQVsmCEAYpt2hVkKpeNCAFrcCo0qrDBXLNnNcFYyZk\nOCGkoOsbGyGXQpUeNwhysq1LHs6UvICUCFXwoZBqRgtahFB1SKGJyUPJVDKF2OKCv+D1y2sERUkJ\nle3VjkRE6UqVkseHZ4jw8muaki8O7ViRFUiZY3gi58TqC7mAFhZyu9soXrAuC73bNAmV0mil0Bdl\nbcqFvliCbUOUvCZCWAgpoVXHdnxBpw0+nZEyo3XH1c6ghCEnxe1oefde8e7xXbPuBUFBQE4waobR\n0VnZuvI10/ctUnOYPdkLZG2hapEkgzPMS2AcJ7yP3L9/y6sXV6z+YisUhc4aNuNI8hljJ6o4Y1UL\n+Qt1MXHWDySkTCqSKhoGLuXEWhLe9Qih2ViHliNW7VDSUI3hKOG0LOSwYq1GVYmWilRWlKzNER5P\nrPEA2mEojLdb8v7I8/6JfhiJMTNNI09PBw7HB+5uv8U0bqAmzucZKTWkipWKzYUyNZ/OKKm43l3x\n7v7ho+N8XVeMdg2EIhukN6WCUpKu69r3EwJrNOfzEeU0QlQ2zvHw8AXbaUQIz3a3Y55nUlrRuqMf\n24NAFHGpLRaMdnRdxzzPLMvyEa4thEbUQq0CbQ0+Rs7zievrLafTzMPDIy/vXvD4OFOK4Gk9s5sm\n1tNCzqBNm/RKa8gRDscTY99zOh6J/szT8YneTtjLsV9oyTCMyFqoQiCMo4hmapTSgVLUmlDaoeQW\ncrhANwAfyH5FCkHIgZzB1IzTlRe7G/LxyCmcieFEbx0URUyZcRD4NSIk9O6KbX9NTM+MVxW/Loha\nqdpRirg0sTy5nMkl0HUdJVuir+QSiHFFyMYjTSlQSiXn5q5PITUhmpTUoghhRTnJKldqoRVXmsUH\nozqEbBVG45rihByoObV7T1EJKbWHtp3p+x4fzyBKk/LVSsq+VZnlhFaOsbviuL9nXj1aWwalOC8r\nRkqMdnARNFZhyekEuhD8ihT/X6fZ//P1S1s0t71jUAInM70dqFWysZLBXrHmt1hp0aLlwFKudELj\nbE/RGqrA6cSgFee1Vep0EY0XGSvZO2Q3taiGjE1BimxPMilwvSWnyiIysVZE1AhhsWbikxffYl7/\nb+beJNTSNa/XfN7269Zae+29Y0fE6bIxU296bK6n9EpOBR0qgiIoznTiTNKx4khHIioIDpyIII7E\nkYXDohLqChctb1VyzVTzZJ5zot3N6r7m7WvwroyqW6VZhVLogphEnNjBiR3rXd/7//9+z7PnOD4j\nJ4+2mpubS6IzKDpW/UBGcbe/ZXYBKQoKgdGC0hmkUAhTSKma9YRQ9L0h+nolzFIiiq7umcmTS0DI\nzOJ2LP7vWHVXuCWQS0HLTGcU2RhSSRg91Ou9ol7btUarjiUcKTkTS2UD6kZgh4w/FqaiSdHBfKRr\nW5SJGCFJQK8bGtkQikdJg5YKkSW2saQSaewaQuFweoa+6DFqjUYhhwHKwjgfkFJxWhzOjzx69ISr\nqytuX33E7Caur9+mbXrGaWK9vcD5wIVSCKl5++23efnyJePk+NSn3mOaljdELa0N2+0ly+Kxjalx\nMmWwtiOnQAiBrushR0xjCcmTYu2Jn05HHt88JmVwsdDKTGvrh1dyS/3gbDooVcXQNSu8dOfZaV0S\nSVn70KlEurZhnjPLnLCmwznHw8M9xtQigRCa2SX61YrgHcEtdH3PsjiWeSHFwKtX+3OgO5FdYHIP\nhEZj275GqYxita2JhCIqsizODqEkYtVRlKFkWUEdWSNFQdiEED3KSJILLLNjijO7ZeK0OIrQrPo1\nhyVhVENIYBC42cEago8UkbBWM6yumdPIEu/IzUJJAp8e0GUGIGSHaSJWgNaJFCaEsKTYknJmXmYK\nqna/JW++RyGCKHUZUx/eWpIrVU2uFcklUq5tp5Qine1pTUORid4KiAnvF4KfCAGWpbCEfIZ5zzSN\nxbk7tLGVwi5bYFWp7EniXSX7bzcVP3hajmjTUqIgRo3VCs4L1uDBn+pGPabp255d/3aH5tqwsRql\nFtp2wzQJSpkYuoGS12gpKTERz+FkciblRC9aaAaiTgghiWEhqyoTKylhZE/2hihNdWAz47ynKQUl\nar5xju5MeIGmM0QKvbUY0SEpDM0VMc3sTx+ChL59RKs3yGLpTM+0VIoRaaHESD7ToJdTRKSCtZpG\n9WdToMAXhzQWYxQJIEsEhpg0+8MBoWd8zsjjkb69w+qW6DMajZamwouVAvmt3jRQSl0mKNBKAwIr\nWpSEGD1DbyF6Tm4ha0EYX1GUpIjAut/i00JIlSWpkFhjsabDKEGRlc5UdEIBIXscR6zqsM0KHyKJ\nqhA4Ho5El7h5/Ji+37J7eMY4H3n65G3mecY5z+X2CUJIVkOL0holBHd3t9w/3HHz+CnzMrIsns1q\nhVKKZZkZhoHj8UROkdbWapwyAuVqVEkBCPA5I5SpfFBr0aIjRWhMzcVaa3HecXGxxRVPDJGcEkmI\nc/8YTNuQU8KnRCqFxiqkqm/4cVxYr9ZvxHBdV1MAuHiuejqUUCRU9dwI2J9G+qZFSUmRir4feHh4\noDnHifw8UjAVXK01XhliCOhhoOjKU61KiwzBo64eE6aAUpnsApSq/CVDDAUzbBj6LfnwgMl18TJG\nKNKCaVBG1LZLFizzxHF8IBaPX2ZcsJjBYNuO4nvwBecLKR1JZT5j9gyZDKUGe3RDbeyUttKCZAZR\nHxSSW5BZosr5aZOAGAwogZAVWVZKZYj6kKr8LRaSN1jbo3Vt/OUSydSki/cRHwUuZsS5Mmp0tZ9m\nGRi9QGaFVZZuuGTVXrNeXxOd53C8Y5qPZHGkbwUmRIoKLMHVqBqCXCIhwBwliK5iJvkXQoj//3w1\nRtI2trq1FRhTryddq/CpJfpIjo5cEsvoKWVG5IK1HVIFCglrDaaz+LhQcq1MllyQGESxBC9Rsiea\nzO5wpJG6ysaspaTKEqQoYtrhwx4hIvMUMUbig6vzE6tZ3IGry4E4S6weuH6UOExvc39KhDATfSSo\nSoXPEaKtwXNFi5WFqD0u1ANUS0k+b4rJCkGllZMnUvZMywHPiChQVIPVfUX3S0sphhQkQhWgAmV9\nPKKNIIY6P7PyrE5NESNn9oeZEDKpLNztPmHoPM5XdQKxkPSZ2t73KNVQVyOBIjM5T0jbkRPcPbxE\nbS24QisLwgjcMWCUZnWxIqXCeDoxz3rBPMkAACAASURBVBNX14/Z74/1aq1tzVamVH/EyOu7ez77\nHZ9hca7WQY97Hj16yv7h/owKzMxThWGAwuiB4GfOiRysEqQUiH7BTROXF5taywye7eWWw37H9vKC\n02nE+wUhJIfDEagHsPOOTisWv9D3PdJISrbgPTEEjscJrQT9sEIgz2MGzpXfhbbtz0+kAqUkh/2B\n8TSzGjoW5xEUFpY3/fPxcGC1WrP4hRQyTb9G5IigHhBKK5J3lJwpfYcwinKcEclTlCGdTuimrU+h\nWpLvjmiREDKjiudwe0Q1HY0qXLQNThbyIlmK5ubyMSFN3O33eD+RpePV/oHV0BKEJ5eGuHiCzwQn\nid4Ql8DiHVJGyLZmhRHEFBAo2tUKJSoo2OiCO39fJQqBIvuICoUewGqyKkQZ0SrTtrrelMjEGFic\nZ/aFwV4xzwt9K8hFkEWAXJdMQRRiiZVupiRDZxCi1DHTmUlh9JpW3vD46nM82twwjoHCxNXmKa1d\nc7f7CCJ1dKUWBq3eIBVLTujGIpJliZ7i2297dv3b1SgHiyiFFALH/Q6UQYo621S6kEX9Sz2Od+wf\nDjS6oJuMloZh3VFE1c9WUrdF6Dp7CdEz+wNCGUw+E2SaNaNxjNNIdgIRBVJJ5iwIUZCF4XZ/y3a7\nq8Dd0uPdQnChXne1ZD/usFim+QHw3FxeINSReWmrkz0F3OLqUkValDQYJRBaILNAy0QKM2Ahq/NT\nUD0UpU6ktBDSkRhqK4LikaUgSyKmA0J1oCwpS+KSyalS6XGJfhgw1pJivW5pWQsB7YWmNz3TtDCO\nAhkHUjGcXKhPivFsNrR1xqmlBhxG1MZMEZ4iCjlZnHPsDrfotkFjq6DNtJVlKgSSCiu5unrKadwT\nYtV7vP3k3TpfzJlH6zXHw4lPv/cet/d3XGy3xBh58uQtUsx1JGEMOUVOxwNaSWyzRpy5h1JCDg6s\npsSAVpLGKFLwrFYrlE44t2CMZVkiTdugtSCEeMbGVfSe1QrvPBfbC1JKxByxTVvbSEBWgtNpVxcN\n7Ror1HlhmM864umNh72x9UPh9vY1fjlgm4YYI+Mx0bYLfdcwrHv2uwNKKkzX10WHqX6pJASpZHxw\nWL+gF08p1aCZRK6HQ/S1zFAKClCbgTQekbkgbEtneg73d5yWE+nsFh/6Lct+BOnoW9jtT8jGs6Q9\nJln2YzVLKmUR3hInRXQDy5w5jJVNmXKC7GsfW0jadgC7xk2FtssIFWh7jy+ZEBYSpo6/tCKWQCFU\nnq/MCBnq+Kfkao4MicUlTpOna5+y7t7i6vKai83A5F/zcPyYEO9x3hFLg24ErTL16+iqjZFKE0Mh\ne4UdejbdJYNZc3XxDoY9tz5wOh14ON0RwoJuEiFONd8pQYi68Gy7hiQKiBUsmRj+nYbb297ApPHO\nczq+xjSmxjWyZNV3yNJwmgKHybM/ZYwKqDnigudSdEjRoHSmUEg5gqgCr5Qz0/LA5CND+4SuazHS\n0A9bTjnivEefq15zEAQCKjfEOPH8xdcpV1DGW3w5kUpkmjza1GaJYiE6U7FtMrNqVjTaMmuNDxM+\nLMScCalW7YRq6maOgsypBsfDRI6ZVBqUsjTNgNYFkTuK2ODcPT48ILMl5UTIM0JrcpwRMiHP1/Pg\nM7M7YpWg0R297VFWsQSH1LkKoyRoC13pWPWXiLhinBwhSHwSOD+9oUvtlyNm2FbKs4ykkojZV1e7\ntEjdcvKvsdIi9ROUMhiRKEawGqo+t1n1+HFkWWZKVjx69JS+33B3e0+32WD7DlMK4zgikqQfVgxD\nV0lFxyPbq2umcYQMKQSsaikxcDw6LraX3N+/oLOWHD3ZO/quw5fMeNzTtIYQJW4Zsaa67Y01SNmz\nWV8wzyNd2xJDOh+q8/8JORaQ00xjLYg67xv6LUIIgq9KjrbTlKzIudAPHYfDgRcvnzF0PRebK548\nfpvd3QuCTwx9j5tOuHGPnwTTNJNzOi8pwCiLtfpMbm9R0p4TFxnChMiauHj0Zo2QiuiOqBix62ui\nPyF9QtkBSCQqLu+yHfDPP+R2f8uUAkEuZGUoZUbKiaZzTOEViQPBmRoklwZjesRi8D4zjrA/OvxZ\nQlZvbhFx1geHxdNqiRYFtzikWghpJJexWjdjoSRLxqOQFGEpSiAI6BjBZ1xQeFVdSrFIVsMN7zx5\nn6vVu2zWG1a9Yeh/AKnheHrJ1z/6W57tv0orAkpESqnq7ywlzkkoKyAyzyPvvbWpbaaU+fx738Wq\n7fmHb3pe3H5Y4eQsKF2hI6UkKIWURZXO6ILKNbJozL/TnKbPdX7kCow+oksGpdGmpVUXQE/Ojt5O\n3JUT2SWkj7gQCWWh7zu0qTQcKRNSFGRRBCdIrJn8wji/5C39Do2xGGMQ66dod2JZqlrVipZpP+KS\nxwrLsowclxcVwyUKWmlSgcUHjLYcdg/4paC1odEGYzS26ZGqQTqF0IpCQmhLKopQMklqgqMK1BAo\nUa+WQtZ2itEKq6uymBKxfctpUszuJShIaFrTn22UkZI92qgabBYWLTuiU3iZsb1B0+KnIy7O5/mQ\nQooNio5UFG3TI2UghD2NjlA8lurTnuIeEQM5LUThESajpKOUE0I2LF5xmg1t09HR0nYtXdtjTYub\nZ1IonI4npFBcPnpUuZ+7B7qhZ7PZUHI6U6cSw7CiH3oohf1+z/X1FdE5RKo0odf3J64uL5nmkZIT\nW65oGo0WEENiPj3QW02jLe54D7LQNQNzeYAigVIhLTEwng5n5FxmtaoHXt32VjlYXUBFSkp0bUfS\nmmVxtG1DznW54X2g71bEWGNKSgha27DMMyXfsdmsWW+2hODZHY4VxiIV0XuGvntTj00xIQwYU3v1\nQoiazTTVWipU5UnqbkXBgjJgRM1r+hmtFeRQbQdnW0DJGZEzT5++B9ri7l8Rhee4vCblhcXvCGXk\ndDrizn3xeXYYtaFrVlgJKRZyjvgUmZaEoiLmpDg7dUx1HJ3GIzEYusFTxIlCpKSFrDSlVEXF6EFJ\nUwWFIuKSRFCgKIzsUVGAkLS6RciOEgt913GxueHpkxsarTns93g1crN9j8yEH59jVSRmQUianFqM\n3dD1F6iS2O0fuHvY812f+QL5jHzr9MC63WClrjsI6asvXNYuegoCimZJsRKvSkZbyPw7BXZEIkEW\n5pyI0pKlQsuMLJGL1Q0hSBQXhLXguf6YXBQlJUpSnA4FONL1PTmPGFMDbp0d0EqyoBBpYjpOHOwD\nrTU0/YDShq7d8iBecHA7pMq0zQq3jLRSI3Jgmk8Mmw7vBdZ2KFWVwf1gQQpcmPAxUaymaxuMWpOU\nITdUgnjyGNNV8nZMiMZizIY5PaBVgVIoKEqpbETnHJLK8gOBFANGXTKKHRBpdEtOLa1tyTrjYs1A\nalWXFRVsIRHRkEZV86xCkkPBC8+q7UFEIhFtDZKIFhkjEiLnKuk6I9GWIFncEZjRtlBSoVMADqkm\npO5I4YiLJ1rVMHQ9Rq6IxSMULKcaBVmWzGk8ETNcXFxiTUsKgaI1Xd9xcg7bKEJ0SKrKohSYjgeG\nvmVZJtabFTF5jBG0tscoECWTcsS5E0oVUnI1UZEWpDLVWEpE65ZMYZwmLjYXLG7CNvWfeqUOWVLK\nGFPjXW8iT/PMfr+naRpWq4GU0huqfPCR++WevmvP1sz6d6+FIoSR/W7hcntDLoK+H7i/f8BqiSgF\nv8xo3ZBSoJTacJJS1+9TLoRcKNqQpT4TlASibWrwXguU6hBSIxKk/R1Q21LFO4qs4JkSPCc3UWRB\nNw05BlycuN+9oGstrdnQMHLce3az53RyrPqM3mikFZDO/nFGjLXIXFMORlukqDPwlAohJKQQ5HEh\nixkIZAFBJkgLGQe2xZeCKpm1tQyqR5uhjiMSZBQx1kSA1pnFveTVvaiEMK25vlhjrELOBecWwhgQ\nsSDIWFmXQEre0PVPCaXOPjs78er2I5689R6Prr5AUYW2s1xfrXi03xLSx0SRa65ZZGJ25ORxzuEz\nJPzZDJvPJLV//vVv5wgKEzEbtG257K5IOVLKgpaWrunJJSHDgm0MRilCiQg6SkkIIlZ3qGKxSqLE\nhAoZGQSbboPNhUZdcZyPLPmOw/GBTf8IoSRGrumur/H3/4U53IJd0+aWrlEYOVQOJ9D1AqvN+bF9\nwC8nstJEoSBnTJEsPqNtpu068uQQwtW8aCok5ShJIl1EN5aGgWV5XbvEMiEIpNhwGg8cJ8fQXtI3\nHSUvFDJWDUCkby7JyRBjQaqza8UkUhpBPDCHha5oYIVIdbM8xkxCkUtdhDR2oTW1nTO76i7q2hUX\n2zVQuL+/I+uId9Xc6UMgLjPWgJszpqmdfiMzQi/kotCmo1jNND1wOFSlriiVQCWFpu/W9MOatm1x\ns6dRmaF9xGH3GqF1rcXqBpEj0S8c3EyjdPUmiVxjN3Ehec+6a9jvXzEejzy+vODV4YG+lQgJ8zIi\nlOJ4ONHHTJG1kqlE3U5zBoHM04K19o2TSBsNpZBTdY3Ps6NpW1JM3N3f0vcrbNvWLf0ZNt2d5W9K\nZdrWIpUEHXC61EP19R3DaqCEwFs3lxyPJ0JShHlkiieaRqHRGKXxbq5e7qahs7qKxUyd1UqpiKke\nfoWCaM/he+ERTUvyHt0aiqhzPZECx2VknE+83L0mGkFBsrhYYRrqCoWl1VfM44Hd7oEsOoRYY2KD\nNqW2kETBohhLFewJoVG2RnwMFkpBSYUQ4MORfI6DZxRRxooaTQqlItdNw+PVmsthwDaSLAVzgNPk\nObrEcfKcUm30lfLA7vACNx853u94uVGYznKYXvL89h+Z3XNaEZCl7gckgBjJZa45UuERJhCOr/i7\nr/3PXPcXyF5APBGCQ8tqQ4gEQGOFRaRMSaEWHtAI1ZKjQxlRuanf5vVvdz0PJ6Rs0KahbVq0lrip\nQaCwpgEFJ39kH1/SrQXaQXKecv4ETOH8jywXhLFI4wHP0GoGtcblhq7tmZLG+z2H6TU3209hZUvX\nbXmL7+Qfnx1QYkZbjdEdnemQMhNyouRSJV66buL9NOOWisQP2RNzoDNriO1ZfaHIxaAVLDEzLuNZ\n2FZD901ziWots9tTyvyGAF8yTNOEWwpldQlQ65lCVqmbttj2gtM0VrhAUUjVsuo3iNJyyrecxiOl\nhUb1VVtRMt4Hiqg09NRIkq7UGe8ybbeisxe0cottNa26ZjzesU/3BALBVSYnQ4tKESkbRMmoJmLb\nREkHXFmzmyJ5dPXJRGjcOCGlYXt5jdEtPsSq3W07Lrcrnj//JqfjkSfvvQcKopuYjvszqXtFSZ5C\nFXAe9g9Ya1itN+weHhASrFU4vxBDJGqJ946MwDYtK0TFi4WA0uCj5+pySwyetqnb0BTDGdYAzqeK\nCHSeO7fQdT3OObp+4Mlb7/Lq9UuO00jfGPq2Qcq6aJOqRl4QNc8aWBAZjNU0na7Cs5TY7x5oVitk\nyIhgAM8yzmiRSUnSNC0zdRHTtpG+ZKQSFFXfwMYoUg7ItgPbU3wi+wVtDUptIEdozxoQkbFNS7zP\nHN3Ifl6QdkXfX7FeCkaBLJmhyWhtiCURYoUECypAJlMjfNZYErqOnKRGK4kSkkZZrGjRQuPLTGMf\nM3mJW+5IsiYUdJGs1JqbzYpPXz/iyXpFv24RMnBYPHcnRwiB3RRZ/MJ4nPB+JBVouxZ1+DrNKuOO\nEPeeyb3mxcM/kHJgZQ2gWfWSlBYSHb19St/0nEaHEBNN43jYfZ2//+Z/5en6RAwPhGhIImOaNSUL\n/LmymZLCqh5tFBEFUpGwCBOqR/7bvL5t9P2jjz7iR37kR/ie7/kevvd7v5ff/d3fBeDXf/3Xeffd\nd/nggw/44IMP+Iu/+Is3v+c3f/M3+c7v/E6+8IUv8Jd/+Zf/7NcOIZKLQ8hMzkv1nZfMen3JdvOU\npzfvMQwbRveMdhVYXRT6TcB2ASHrFSfFRAya6BRSdPVAzbAeOq5XF2yGnuv+mlV3we7wCgFo2aLx\nPN58iveu36czgraVaJ1QytVIk9ZIaZGy5v+ktJTSkuJZbpfALSNC+/N1t8GqeoCWIhEFZJa4eUKT\nMdpSksKaNav+hsZu0FqjZe31CmGYp4UYCyEJTvOMiwVEAwi0tFjTEuIJpQsiG6zoeXz5ad55/AVW\n/ZaiPBMHTmHP4mfmZWaaPYsreJfZ7w8cDjvm6cBht6ttotRUOycN7z39Tj799HNsGougkqXisuBO\nkeN9rp4inyk5ktSBOd/hOKG6Ft30zC6wubzmydNPMc+eh4cHjDFcX1+z3qxxznN7901W6wuG1ZbD\n6YG7F59gDXSdQYuq2kjeQ6r+nq7rsEaRo8cIwaprefHsI6wyiGSJMRFchALO+zMyrkNKQThrNZSq\nnX111quk6Dju7vHzEb+csEaQUw0/q3MmtqB4/OQduq5nvz9wGkeUrmizGCO7wwEfIz4EcoL15oKH\nw5HddMJ2LaJt0P2a3etbxt09IUfW6xUXl5fYvieWwuQ8Snwr9F0oySNLQJQAGpLpKcMlMRnSNCGp\n+DhhWlIRFVySHFIXomlo+p533/4UTy4eY0zl0gbXsu4/xVtPvoNOX9CZgb6tbRmtDcfjAURkmiZO\ny8R8vu73tqXTit5IOhtoDRgJuhSsFGyaLevmKZerz7HuHtOkjkH2XAvLu7blbWu5UILWSkRxhGnB\njQun08j9fsc4jZyOB+bjgbwkmiKxpUUjmdwdiz+yLFNd1MkGpTRTXNiHPTv3QFAW2RhCmXBhR9s4\nlEooJRlsyzc+/irf/OhrfPTqI54fXzMGWK3fZbv5LEZe4JxEiZZGrmjyUOfz9DR6oATx/4bT/PZP\nmsYYfvu3f5sf+IEf4HQ68YM/+IP82I/9GEIIvvSlL/GlL33pv/vvv/KVr/Cnf/qnfOUrX+GTTz7h\nR3/0R/nqV7+KlP/Ps1lxhZtmdLfgXUEWTQiRt578B9596wuUsuBS5sNP/jPez2hhSUYz2oCbKqHI\nO4cxliIbsrYYJfDeE5zHdtC3A6fFMTQXqAj7/WtWj24Yx6W2ClJDay9rdCfkSvEuCylT4RpKkTNo\nqWh1wyIDIS7YViMzhDDRdT2GprYTvMQvlc0nSsEKj3Mv6e3bKDWgTZ1P9U3H3eElTlbfjRCgVY8P\nlbqT8j0Pty+xb71Ha3XtKDeKcYEYj6z7CyQNiUzXb2l6y358zuLuoHi6ovEuMnuP6HuKbmqQN1Uw\n8TQGXvARZMl2dclquIQQWA8DJT/Gzffczo7jMiNkA3OkbQqrZoVSGm01OSRUabHa0AhLc9lQfOD+\n7q4elo+vaZu+1lml4pOXz7m+fsJ6PfCwv8UYxcXVJdN0QEpJ1oZUMjEFvHdcblaEZaZvLG480VmY\nTgtuXhj6nlwiKUPKmcOhvvkzXa2qJgelAmbHVJdPFXuSaZuG1bqOKhLgfKTtDEZZlNFEIjlESi5c\nbC7Y9APjeOJ4mtms18gMGs04n2hNSy6F3W7Per3GTSMvnz3HGE3TWpRWzPOEpFCyrebNdsVqe1kV\nIqo635XW0DSUosguIMWC6K+QpgoH8zJRlrlqCbSEvq/+7qUS4LU1+NnhxolPferzqN0dX/v4GVoK\nTuNIDg2d7ZicpzENmhZkIibPi/sXFJHq6MoKQvS0ZkEbRUaR0SBnogiEEsjyknVnKdFik+J6/S65\nuUC4F6ysoMkZ5yIPuwPTMqEk7JfC3Tjxej7x4E64OZJDYtMKBivpO0XTF2g8BIjygAs13VECxKjQ\nRuG8O2+7Z7aXAypIlATTSvQIRmmy1bi951n4BkJbHt2sgQYtOnLxqDKh5QLOIYui0R0uOiKe4AML\nGlX+FcCOp0+f8vTpUwBWqxXf/d3fzSeffALwxg74f339+Z//OT/7sz+LMYbPfOYzfP7zn+ev/uqv\n+OIXv/hPHJpbZp84+D3W9oQFJIahWVdBfFpYL9W5nZR6046RGlbrBqM2LCkyhxlphor3EpqlJJSb\nyMqCsIAi+oLWAykVbnevkbmp4XEkKvYIM5HkQhARce7OFmS1I0qJwKKlZm0vEGEGlSgKYl5IxTH5\nU53uiHqlL99CTmmDY8L5HW2nUXrAqJau27Beb/jG65dM4+35qtdiTIuUVQal1YlXt/d0dosT1WNz\ndXHJcXpgnF/RmiusuaKcQ75XF29xeNDMp+fINCJUotEdRl3TmB7dZvan27MHBV69foVbAqerK1IJ\nNKrQt1DiXDvaoiW7QhG1wx+cQkSNRmN1vY4XH3DRE1IkeY/NCmM1Q99TsuB4PNJ0Lc+fP+Nie0Hw\nmXEckcbw+c9/jr/+27/h6aMrcsrsp111YC8zq6ElZ0PwkcM+IygYpRinkbZpWa17jscDQhj6Vcv9\nrmC0rhSc3rJarzmNI9oY/DRhbfMGnpFFbWV1wxpx9svHDBAp3iEbQ46RFCLj4YG+X3FxdUmIBedm\ntNL4eanlCJHIIp975NWImbzHjSeWKb+BYecYqlObgrK1hWIaSztssNpiuh7dr8lCIa2mNC1JCESM\nKK2RwwXFebI/wTzXRc/1DdkH1P2O5eEV47Tj5e6WsOtYUmRZPHPUzCGw+J6SMiG56tRqMiUlYkzM\nyz0+JhKZxjYIJRAFAgUlGwodStcMtRCKJR5psqRrLCIYNGtK9ljRYUUmBcu0X7gtRxyZLDPTIhlT\nYi4LQTtEThgtuegaOhPZXGhUA15kfKpqbOcL0StEbpFZE1yocbsEh3Jkt3/BzUoipSbHiCSQvSN6\niE4xlT1Stmw3M/msKslE5tlV93yWlBAJFBYSQUaibRBpg1Hffmr5/3mm+eGHH/LXf/3XfPGLX+TL\nX/4yv/d7v8cf/dEf8UM/9EP81m/9FtvtlmfPnv13B+S777775pD9v79SEhi1wvsRNweCz6iSaZSm\n1ZpkWhSCea6aValVte0ZjcgtBcNmteKqeco8T1WwhKIYSZQGtzhyWPAkQgo0XUuWksNph5VbEAJj\n11ytFHeHbxBZcHmuaLhcnT/ZjKQEgS1aazZDz0Zt2c17TvGOKALLcsZJFw1FoduGWE6YojClkLIh\n5SMhasQk6C+2tM0Vq6EHteE4ThWSoPSZZF5omxXHk2Fa7rnbPVA2a1IUNI1ECc8Sa5DZNjPdsEJi\n0Wrg6fYRi+p58fHfgiv0ZkU7bOmGC5QtTHHkOJ8qs9IXdrvXTPMDBsXFdnOe9QREm9GjxCpDSB4p\nE3lpKX5N9KDNiFEQciDm6zr8lxXV1qw65tnRdoqnT59wOB5RQvHq1Wusbei7NZ9+99P8t7/7GtdX\nV3TdmuPhgYeH1zTdmuurS8iRaRpZrdbM85HrzTXeBwBWw4qUMlKqs8O8sNms6due/f6OEEGZHtsN\nhBAZNmdVbIpIqzDKAoJEobGWzg71piOr/iLOrt5glKZvh7pYGyvbVSnF8bDDLRNWVUtmEYKEYOg7\nZlFIOVXqjq85wKZt8E6RSr2xaCUxuuaTtTrSX9yg2w5t69LHLQt62KJNDwSyc8hmjegNqlXgM3He\nIfYH5OYKcWOxsvDJ6094fjowLq/5+otneODF7h6Po/AZTE4clyPOzyi5YLRAqkxafCVoISg5k4vk\nNBXarFDaI7KCoklCY3VCNgdOfkY3BqRkWU40IhFFQUjBROGYIsfZMecavzO65iqNiBiR8aIS+41J\ndH1Bq4RUdea8uMw4TixeELwm5ojRhpAkUjUEqWhE4vXtc4gnNufyAX7EAKdQiHFGiIAgcnf7Tebh\nKTkmsnAc3T0XKjMYDSkhcmEUkalE/KK56a9Q5w/Bf9WheTqd+Omf/ml+53d+h9VqxS/90i/xa7/2\nawD86q/+Kr/yK7/CH/7hH/6Tv1f8M5ilGucwqLJhXgJSVoxULIXZnwgxMs47Rn9A5IJoBFYKrOpo\n9AUla5Jy+HikGQwlJ4zUGFVpLjELvJ84TntciVhf2GyvaTuDygqjNFIolLlgaJ9wf5gpeaKQ0BKi\njPicKSrSNnc04pKuu6YdOuSomV4/4L1jv7xEiRmp1hQSF72GkBBSMPuCy4IiMzEsRE40/r5GqmbF\noK+5uthyFw+IfCLnBiE6rOm5WN/AKfCwu0UJwaShT4XMVNWj/sjD8ZZtepvt+lNArZBerD+DfnfN\nN/7xbzkd9vSPFG3XYVtFGwZkuWP2gbDEimqTkte3LwnsWPIDxobqZVlBn0ut1eWIEoWUFX4JFH0i\nqAUtH2E4ouWKxqzISXF4ONK1HfM48Y/jN1BKEkLNOA7DQD/03O3uiTHR9xd47xjHIymW6q0uha7v\nOR12lcK/2WJajVsqjs1acz5AyzlHCU1T42TadmhdAc/GtpWsriD4hGpqx9jljJCSMHtcEEgRUUbS\n2aoqISWCd6hGUHRD3/QIUcHSylq6bgC3MM6vMUWhbIekxTkwZ/p7CpZiAinX5Y5pC877c44XbGvr\nQqoURM4IUkUgCkW7ucaFgC6JTINIB3KYEHKgytUGlFmT7j9EHl6T+h55ec3b/+EDPvzPf0mW9T30\njRdfZ4wTRXo+fLbQiQaXAofTARc9UkuESNhVwQSNVBaihCxQtuaJBRKp2krRChmlIlLOWKGZ/TdJ\ncVUXSrrGvJacOYXEXARzkYRcMEiKqu0+qUvt9KuEVpLcSGZZKusgBMZZMB4i4+hZXCb4ephmW+f7\nwibSmVOaReRwuEOkiU27JkYoUWKCIMflHMWK+HBifviIlBNKZrTOKFtvCaWJpHi2N+RMYw1Jefru\nX7k9DyHwUz/1U/z8z/88P/mTPwnA48eP3/z6L/7iL/LjP/7jALzzzjt89NFHb37t448/5p133vkn\nv+5/+Z/+/kxoVty8teHybUuKmcU79uMB5wOH/S3eLbRGMS+JqDyLFqykp2kC2mRC9PgY0CgKgZjP\nV/GcKRJO055AJkuDcQeU3JBKwrYDOTlKVhjb0OgLpjlgZQ26mk4QvScUj0gBGwXGfpqhu8Z018wh\n8PGzr1AIuHjEWoW2mnlyaJ2Q79/8sAAAIABJREFUWlFK3WA7F9A6EOKBdB9ZNY8QZUHogKKwGjqS\nDxSxME0FpSqceD0MjPM9u+MrtG6YXKaxEOJCjgHvPR8/+wrLTeDJ9feizUAShmb9Fk8/2/HhP/5X\n9tPI6skVUjWo0lBCIXldFx8CSpbEUAizplvdMIdbpAjIRtFdaeJSmGeFNgNaX2MLZH9PbAIxHxFR\nI1WHDoH5NLLpB4KvxCI7rJFS0RlDTInt1TW73Y5h0Ogz3m3dN9w/3LHuVmy3W3IOKKVYbS5Amjdv\nvNM4s12tOE1HrG3Z7SaGtUBpzeLmKoQ7Pw1qrVmcxzYNIThs31XVcvJvspdNq4gxMR5nZMzAiuAr\nEFcpW+G2UnI6nehaSzM0zKfT+f+rp5iEP3n6tkWYpi5nlqX+mecWUUqVFamVRtrqPEIpUlS0bUvX\ndRUknQRlWtC2JwuDac5z2W4LpiPsvokpGdVsyCkjRQM3nyGPr1DffAGtojOC7/v89/K//M3/yn48\nsJ/uSCS6wfIwP/BqzggMi3cou0HKUkc4rcVgKElA0JAkWRZEydim5leDK6QQiaoQVaAQSbZCkqNo\nWChY1ZEIeLHgviUIjImYqjCuINFZo4yg6zLyXPcURZC9AxJ+VJyOiekUWXzVGIuUEHhsX53uPhRC\ndCTVEMicyozKLQVFzJVQZa0iJJDKkDxM4YQ6j6W6tUXiybISx6IUuCXx7Bsn7l7cncE16l9+aJZS\n+IVf+AXef/99fvmXf/nNzz9//py33noLgD/7sz/j+77v+wD4iZ/4CX7u536OL33pS3zyySd87Wtf\n44d/+If/ya/9H//TBdoMIAzRC5YyIZC4ZWK3f4VLidP4gJERYwaQmhgLlMQpnghiRpZEKgkfDEZ2\nCJmxskMKgVD1G92te+bjHdnMFAwpC5Q2zEtAm4aSJBrNevUIqzuaMjL7W0optZonagth8iNZjBhj\nsKbn8fXnuL3/iHk+IpVCSiAJ/OJIOoCqylZRIrJJYBw6K0JY+Prz/4bWF2i1QPEY0RKyJ+WZpjEg\nfKWzF8WFvWI8LpymhRAKMcqza71qZmMuPHv5dVJWvPP4u1D2hhI1Gcv25m1mvyOETG4ljeggW6L3\nxGgYQ8SoHtE0ZG/IrmBMyywmRPFoCbLJaKno+2s60dPrDi8Fc/gYKffEPKBLICRXXeUkxnlEK8ug\nNSllUilst1v+/u+/xv/wwX/if/vf/5qbx49oGsXXP/wqQiQutluM0qjGsj/sePzkKePphDEaHzJN\nP+BToghJpLDaXOCWTN8LSnFI+a12jSblTNf3eOfQ2iCVQWtbI0kxYVqLDxkpC7KVtEaxe3jgYrth\nihGEZokZOZ1q9p+M8yNWGkpJBDKt7VndXNdyQdOQUgaqpiPlREn10Dge9nSdRat6GwolYDVkXfCh\nepKQVG6mkYgYEcaC6Wq0SWqay7eJ+2fkIjFdS+aeUnpUs8V3B+bXn5BVYcyF9XbL48sbnt89I4hY\n87O6oGxLTj2rvqM1LcZKpCq0rcboqu31k4JiaTtbCejLA94fmVnwpTCeIsUrsA4ZJ3Tj6Lp3adUF\nOUHy4P2eafIsLlTsosi0ItF1DcZUkHbbdKTkKdmjlCVlT05VCZzzWe1LzQbbRqI0lXrkoWk6vPPc\nLxNWSfrekohIlcgxsyQFyPqEGjOpVKhKCrXEMC9zfZ+KQpGZOUNA8vZ3XfDZ/whXqwFjFV/+H//h\nX3ZofvnLX+aP//iP+f7v/34++OADAH7jN36DP/mTP+Fv/uZvEELw2c9+lj/4gz8A4P333+dnfuZn\neP/999Fa8/u///v/7PX8cHqgazyStnqJiyXnzBxOPBzu8b6a49Z2i25XhOgJYkHkiBSRJXiS32FV\nT/ISZMQaSaIQ0gzFUHTLoK7IMjK6Awy26jCo/VifJTFmerNiMFcQJSVJlPUUuWBkZSDGVMgyszu+\n5mb7HeTsaDq4ur7k2e0BXQSkSoHx0TN0kjALSiORsqX42oM2dmBynslNMM5YLek6Q87pjLwCY2oF\nMJfIsLpg1fXEdebFq5fs9vckqVFaVeZhiAjVo2Th7uFjUg68dfk5OvUIUsCIguk2XF3cYGzDqZko\npaOkhCaz+MDt/YG+axGy8iBLzmRhEDoQpcen/4O5N9mRJMvS9L47i4gOZu4WHkNmZHcVGgTZbIAg\n9/UC9Ur5cmyuueGAZhWrKueIyPDJzHQSufPh4mpGc0EmF6xGpgKxCSDcAm6qovee8//fl8EEcHdb\noLQRwEYwtoMWWi2IKijlOa0r5EY4WJ6fX9jvd4Qw8f33P/DNN1/xL7/6B5wZtbrf/+636F55evyC\nKUykkoiXiHOO82l4eHrvtDr6zxWF9YOwn9KfKDhlPPy0AVWJMRKCxyjLFAxVOmhNR4+5dqpM00KT\nRK6J4+MjedvItbHFhJsCKW7Mflyha9koKJYlEHNEofB+wqBBm6ESL2UE3YWfuJzr7UzcVnRXPF+e\ncd4w+YD3E7pXVM20nPACm9Ys+wfcvEBwo5LYG6bcEKVR2qN3T7TbiaYKegoYSSgtuG++5eVy5nb5\nRHKKj+cX3p+eMc6B8ij1pwi6IriF4A+j666G/91Zj7dCr4ZpWjDaUWrGs2daPGcacdvopSC90BGq\nBUO8q6UjvTukz6TYiWtmjYlbTIAaGpHeQBvspLDOYpRgldAESu3kMmJjIhWrh2TOK8+Wr2g/44Oj\nd0gxD0RkNqzrOGA0SXTRzCEgTci5YJpDzDQQcn3g6FQVaImWhZsWrlbTZLy37U4IobMsBh3+v3Oa\nf/ah+Xd/93c/gWH/76+///u//3/9b375y1/yy1/+8s/+UBj94TWfca7RdUfZPVPY0ZtmXdOgU5fG\ntz/7D5SWOMcLyDO5faZTQBlogRiBJkODII7dsqO3kb0z2iJFcVy+YL87spUTWxQeDwGjZ2IWrLe0\nBkuYmMKe9y8nagXXDeLiiGMoj9SNy/ojn86/Yjd9Te0NbMM6sDRaavTqUf1AXDOKMOaAknC8xbUZ\nb2ZYAiU1aio4PRzXa7xhnFB1Q9kNq4VcGofDAY1i8hM/00/E9XXwIIvCujD84UaYvMd5TS03vnv/\njxz3X7OoPUYV/Lzjq6dvyaWx7TNbbKOrrAf8tbfKx+dnphmmaYjbylapJmG9Gg9lo7nF75kWsGqi\nS7yfrByT93QanUatCaMZyYIyZoctJ7aSsNrivef50yeOx4Xv//D9eKMz/j/WbeNhmpA70GNZFkQG\nkLjc2YcpJXbzQmmVNSWO+x3WG0KraGNxrt/9Phq/hCHOy4mmDH6aUDagm6F0jbYW74XaKq11LuvG\nljPv3r3BaMvlcsW54aWfpkAscq+0Dr1DrfXuENIoLeQUWXYHBMXL8zMljQ/eut0GacvNpLjS04aU\nGakJ3x4IfiFMmVJWbB71T6MPEA7UeMVsK6IEtV9wDwd6LdTSMLpBE1CKL56+5uX0mc/PF7ZaWePG\ntm5k08fpTndy6TQuI6tsPbkrdHXEJOwmhcjQPEwTYxstg7+QbhVaweiK6hX63TSqG0pXGmdiHeSt\nXMqgcNVKz5mm1MjQWs1OHCg3oN3ajB5+2oh5wLp7qzjlRvtIKczkqBIQGf1w6dBqZ70lau3EaMip\n4/w8yg73IH7NQ7ehlEFLH5BzaYgRck5ENKkKa804r9k9OoKFJSh2wdFaQ1r9s8+uvxwazjnS1kg9\nYnxAKBSdudyeqTXhvCXXCBicmXncdVo7U7chdO8yqDG9empLBHugZ6EmjVaanM8Y0zFuR68BRWPv\nh7K2l46yDW8tpVWsbeRypslGqRu39YRvCj9BZ/ws6xXNVT68fsebQ6MVR+sJa0H1hCh/Z2R6qqgB\nWK0VVEMrQ6qdXirajV+msyMEj3SkN1rLoDOVCIyt7JY7x/ln0AXvK7/4m6+haT5+PHNLV7putAKH\n3cRiPF51bmnlu+//Tx7nRxYd+PnjE856ch4PumYTfVfQSeMFUBrnMqfzZ7raY6XR0PTKuAFg8NOM\n85q1vqfVTlkFPwV200RRrzg9I8rRm6XVisWQ8joUtL0R48qbp2/44YcfmCfH6XRGKQaiy4wrdVdw\nPg/n0G635/X1xJdffjWsj6fCNM+gFMoYKH0YI5WltIZYO/r3yoMa1BqAJh3nApZBaRdtcEGjtSPX\nBsqwxZUUE8q6oQ+uMiAgOpJK5jDPpFqZlpnSMlPwo0mj9D1/fIfzKsWnjx8J0+CZbnFFeufh+EiK\nka7g+PSEFY2x5u52H7cKYYTzbcp4PyNxRT407ONEV51WNkzuML9BGY1uGz1HdBXaNfHx40fEzuS2\n8Xx5j5squ92euD4TbxFo1N7RVHK6jat4y+RcoQq73TCCauUIITD7iUU5ZgsiJ/SdhRlQZMbcV1VH\nT5XSLoia6WLvDSM9AOJNUAq6btTauW0rNozigWqVmjI5CekOTdm2lV1YkO4IxqCU5rAciCXS2jDK\ntDb+yalTSkcpjXSLRsi5k3sbC0Pt8C4xW1i8wUil2g1RmtOlccvj2h72GvyKd37YTdNoJ7X8V4qG\nc2FHrhfAUnrGGs/pdObhcCOnip8VKZ1wxtEqxL6CgmnxQ78rHdXGcBelqNmA7dziCe/f0rumcyNY\ncO5Aip7SE95CSRWhIDqPq5WFLV5ptbKmZ863Z3ZlnGSV7gPApRQ9Cj5ETrf3g7zeN4RBnDEujU1c\nH5zEIh1rhFYrNXYOh4mSIg5Hr3chFgOH1824iqzxmUwgeINqhnW7UQ8Nz8x+djzME7vpHYf9O/7w\n4+9pl2eul/Gh/+L4gBVFsAe28+/59OkHvnr6hiadmCOlFc7XDzhT8AcLixpX3tzwzbDfPxKmHdIL\npDNUQy0a/7CgWNjNe1p+5fPtA7k70mU8mGpfCbawVw5pFmMMPXd6r9SsaGosdq7nC252XC8bxhiW\nZRhInQtsMfP09oHT+YXH4wMxRnIuOO/ZSqcINEA7RxVBOTs6/jLc7uDoArl1nBvE/lwaunQwmi4G\nZx3KeLQzpFTv4xAhpcYWV7a4skx+LKrmiS7g7IDS7uaZUitGxod88iOS0nsfriYUSltSSnz3u9/w\nb//Nv+Hrr3/Bjz/+BnTjiy+/wpiRJHHO470bD5SaENXJvTPZUVtsqaD8DTm9EqNhevcNHWiXFeff\ngJkGV1QXsELKkefXD7zPGZlHfXQrG4kbpd7G+7s7QJN6YgrDytNrQVqktsjrueOdwXrNLVVs1zz6\nPcl5TBgYD20K2gjkgbpDOYIa8jltB8XeaI3TI2/s7EZXI+erlIx54zZKJaWPU3LrkLeC6IW0NqR0\nJit4Y/B6HC4SlpJBRKGVxehxeh6KZ+550/GQa02Ry8C8Od2Z95rFrrQ7sT/eOi0Pm6qbFNoPepNS\njVYNRSlqG4zOP/f6yz005wesFIx19GqpqXLcHXF2QmvL+faZ18v3iOlM7BFtx8JFZjQe4xV0oVHJ\npfJ6+xGjHtArHB8LQWucsmxboZYXlHioig0hx4gJjU6lScHaDe8CMa+IGTf/2iupjCFyF0XXCgPk\n2NCS0Hp8AJZpJsWI6Z3gFKVrRDtKL3Qaxnms7uSWsQooFYWjNQH00AAohTUeJzPxDFkrdodHLrcb\nf3z/ax53C99+845vvvwFD8cHHrQhTI7+u8Yy7yFXelcYP0LM+/2BXDK5V9a0cr48U6VzXj8RwsDR\nYRgf5GaQ5Hk8vkOapddE0itdPL2AlQVd9uSbY3ZPvNnt+fj8StwivSd2e0tbMsZEFAmn92ith7iu\nFba0sVv2LHs9xFutsBzH0qd0CH5mmie2uDJNM1uM9AYPj2/oSpFKHw+TpihlXL+rVGwIpFrR2jNN\ny/jyFI3xI8NrrMXNilbBGwvaYZyn3Te71lpyznf1wn+mqJ/Pr6ScefPmDet2pbdBRSqxsJs1LXWs\n1njrEOnEmO5kp8jkA61XfvzhD3z19dd8/fW/BaUQ1bB+GuZJ7bHOjcC+M7h5ZpoPzMsB4xe6UpSU\nMRpsTNRPH3GPj8jjI42CloluHmii6Ndn5nnP8eGJf/iX/4Xn93/EmsZuObClMyEkSsuk7LDG4OyE\nNdPYWDNcVUggpzxywKKwNhCmGcGSRWFhLGiUGspd5ehFE28VoxacdWA9AjQp0CsKIdgwyFqzwnlF\nCBZnFBpNbR26RpthfC250prmst3wjzO5dRA9mBK6k1MdOc5eB63egg8WYwVQ1NIHPakWcrYEzVh0\n6UZxnRwza4VbKSQq1iumxRB8I3hP742YKq1rRCzS/0rJ7U077HRAq8zsZ3KvfPH0JUYpemsEtZDi\niDCINzgmnA/jgxRP6K6xxg0Ule4om1jjCxpDv67sl4XQdhgZbMRa4sig94G50tqOrZwSWjszzxb6\ngJlao+mtUbvQRaFUgDpIKVcK5tHjvdC7EPzEbgqslwgWKp6qHOZ+klB6DMOnMLGbZ/J25XrbqAXQ\n4CaLNwatpmGvrBOaPb3N+DlRz3/g9eVHlnnisMAXTzPHnceiua4nvn//gd2bA1MIeOOJsWDCwu4h\nYr0CW7mtz3QVWKYv2C2vxPiKnxpOCcaD2x/Z72YkG3pxpO2EC4qmDfEcMfOMrgYzWVrzLDaQ1Hu2\nmDFGoRVUK2O2qTu9ji53b8PvPc0T5+sz1gbmeRlRkA5Ke9Y18fbpie+++z273Z7gw4gN+YnaNKVW\npAqIHle02rDmDnVBsN4Nin8D6zytgzaGLg1hxMmUsQgWZfRYggUFfcBMjDFsqRKWHefbjTVVpt2R\nVDo1VXoflUolQtwi1mpKE7yFECZqrVwul9GDr5Wf/+xnbJcTeUtMjxPGegwd0YpcK34ariitNdOy\nsBwextbfW3Iu2DCuyD2X4QxPJ9qm0buvIK6IrKjpAWccEma4PuOsHeOTlyHY29k95vgLrK4oc+GG\nvs8y1RgnyZ3VgB32RV3Gybffb0DaAoGtZShCVwXNAMH0IujukdIpq8YuC10P1GGTQuuDNWrQGK2w\nQQiTxShwWg0zwjTTBbw2gGeLK70m1nPldo4sy4GR+7MjXqXymG0CzgXmec962+hSaE1Ri7q/N6A3\nOwDINlH1MGLm0jldOtdN0Yxi2WvCzjCFjrSVpjS1C6VYtBrM0z/3+os9NL01IybCkLYb78nlxtOb\nJ2rtvNxWbudMmAWxYCeHtjOmG87xhC6FyVdSLpSc7g8gAx3QFTGKTEGVTFegzPAblwI1Czlf6G1g\nuIy1XM8JEzKVhhaNsY6qBK8ciKPrQhXF7RLZamKeZp6O45erDBwf91AOqIcnfHjAqMp1e+b19oHZ\nWeZ5D01hQmC73bBuIlcNbUCN7WzQCLrPTPOX5GLGKfSp88fTBekG3SeoAas9wWfeHB95ef2MOGGa\nlhFGVgWdGn7nx5zPlLH0SRXfHYfpW9bbRr6dmQ8TlEzVnVITxnhs6zwePJodtyKct8TL64nZK9Z5\nYvIPtCYs08PgErYMd2+Rc6M4UHXGKk0Feol8+nBBgKevfkbDoMxCmAMvrx/52Zff8sfvfxwZRm3I\ntXE47FDGjkhVjHhn0UrTWiN4R64VY8CacdtQxlJKxPtxTUYrSgXrJ1BmnOzU2FDlPh4Qt22jtE5p\nDWUMcbuODnwFby3r7QXJmeAceS2INJyC2jKZxGwDKY/TNL1St/HFPNnA49OXAzCtRpyJOzfT0Gjr\nmZRvzPsdLQpFG4yzFOn4w5ekmKjbjWl3pNsZky60mJDtgvIzkm/0P/4fyPQWezgSVeX5dEW2yHZ+\nZuszyI5gF477RJPfoXpDZKG1hrIRo4/oCns9+KpbHtdcYxzWTDg3k5uQG7QtA4nJzxirsLqC9ohq\n9GLp2YMYel6RlqhS0V2wJqKsYl48ypQxRtEapRxzWDBGEawd1U06JVWMM1y3zjxZSnPM3bHYTm6G\nVjOTdxg9YZVn3h8oNVLbSk2dLoUUy1j+6jHbzkAqmetFOJ8FUY6wWNwsuKlgXMegKUnIfWhzQCH1\nr3QRVMuYWcl9EaKsofTMNV6IceNyW3HGs5sDSge8d7QeUUoI1nHdMrSh37TGIaqhpTPUW42crmjt\nccphfECJHpY8IxQjGDvRkqGXQkp1IPprGTESA62PbzZlBO80UjRvDm/4+Td/wzTNaNOhCS7c56yS\nCW7iyy//luPxC2JK/PDjd/z695bz6zM5rkNI3zqajh3GdHppJKlYZfF+wYig1Mpu9wWxJKbgOe7e\n4MzMPL/BqB1KAjnf0JQRo7gHko0CXeH48AUprShVqHWj1Igxuzv4WKAaugTWYlmCR+lGca8UmQkd\n5skxhwdCE6pe2eKVz6eVfRHK3FHWoy1oGT5yuqL3CREH2qJ0RekRwSmlUGseDvNcUaaBqvzmt9/x\n9ddf8v2P3yO9sdsvtD4WI85P1NrxbnjBrXMIf4IVN2rNlNrorbHMCwc/0dCIchjr7wWHgFJ37FkT\nnNOU2n6KBLUO1gZqPQGG2mC7nam1st1WbrcTuzCBGsQkWsHcDZGX9IL0whfv3nF6fcEpNUAtkwY9\ntM3T5H/qthszTl0io0NfSqVfV3aPM6Y3jAo4/wjdMC2PbJfPlFJwfqHPCsoNtZ3BHVDLzxHZ8/rb\nf+bzP/2KLob3z594//KRy/VK1lCbsJ92NBzWO7y6Djd69KMFZzqiLcoY9kbBmtniddy+zKid9ju0\nptQ6NLeto5qMLyUzbk/WTAiW1jNZVaQP06OdBR9G5dlODu0sCk+lI6rjvGM3Hwhu4eHBYtUHav6B\nOAvbrZJLRuvx+xoUiEapBW0NIQSkWqyxOGu4rnc9R+1IuzvWReiiSWVcu1MeYBcfNPvZsgudyXno\nid4b/Z55blJxZsb8P6ckf3r9xR6aqEbv+k6zHkT2qi2xVEobG7XD4ZFlDihrgKFBqG3FOo3JhpQv\naGtwRmGdoPR9Y9ehtYj60/bUGIKdgAPbdiXnQi1C8w6p4HKjI6R+oUqixEIIO6Rrbr1QneLt48x/\n8/P/jv/2v/rv+dt/9wuss3x+/cQ1PpPWG26C3DYel4nDMiRlwU5oNLftihFFr6NO6Ztl9o4sjIhI\nS3gtaDK+Grb0wu6gueULVW20vBEOD2htqbXT+9hSeiyLm/l4u3G2it20sJsfUXpmtzRKfSG3C7E+\nY00DL+g0FCG+30+F10pvmcYNqxWeEcTWdOadZ+qOx/7AWRviekE0zIZBylEdqZ0wz9AV0tSoymmL\n2HFV6q3B/YPY7vnQ3333K969/YLT+cJ6O/P27RPazcQ1sd/vRyiZP+Udb0zOUWvBe8/1dkKAdU1Y\na6ldc7psKAWld4K1pNvoVrfWMcbSu6I1iDGN8Hkbm9dSCqVUSmlsa+Xz51e+eHrL6XxBpDIdJ3JJ\ntBJx0ri2+1IoR1pd2S2evN3AGLzzlJqZd/4u7ZL7hl3d7aCjWitWMc07nLdjsWEsYhyXFAl0gvP4\np7e06wv9uiIHg1kOSK9Qb4h/pO++4vHbyH/6n/4j//M//AO4M9fyabjLS6HWQGlXOpW1FppdmafG\npHf0OqEoI73RHEV7Ql0oNaOVQ0RRW6U3RS2ZnDPoERa3SmGNJUxDhWH0WDDltpFawWiYZo/tA+Tr\ngkWcR9shPs850aVj3MTh+MTXX/wtzhx4c3jl4fBb/ln+kZM54e2Edp4snZYiXYReKjFtLOENKEMf\nuGqUsrSqqVkjgOl2JDNEaNVy2xqpNFxwhAm8TUx3m2vpnVo11niyFrRMd57vX+tJ8543g3ESUDSc\nTOymhWI1XZ/RZUQPVFekkjFW44Nj1jOtVXJ2pH5jbQUjDi0aZw2iG14rrC4oveLtxG5+xNsdwS18\nev4j1gveeFp1EAYo0xZDa4WrnEl5xbCguyG2xBY91li8cjg14MfGgHeelQvX15WYIzVr1tS5rJ0f\n33/m5flCiiCt0krDNs1kNK00tm1lNUJxYL0ltYoWg2qZ6+U7KkLqCS3C7fXEef+CF4NSAa+F/fSW\n4+HKy7aybitKK7x9Ox6cCJITKT4jurGVThNDVxvzPmAy2KbpzpPFjLiWFk66U0xlaZGpFh72Dqsb\n1u3YLkJON6Rluil4v0PUoJ13pWm609Wg46AVojaUcfTcsZOllcjlU8SGiV4759OGsZqUG751nBrz\n59UnShdyrSNTWBtNIEwzCkstiVoax/0D223FOYc2lnkaCgWFvnfSp3GyZhgpY4zj/dY7Ip31toIo\nUt643D5hnaVLG9AMXbhdr5S0oiXzeDxyO50IZNbrhcl8wac/vh/2yZTYHT26O2LMLMtEznXUaMVj\nTP+JdQB2RKMYlUJjA8YEWi2ktdJaY3n7Du0P6ByRpun+3gGvAv0MeofeP/Hv/uv/wD/+8Hv+99/+\nr3T9ylpWzmuhiUVrR2/Cml75+tsvMbqgJkWJjV4r8IQyDqOuuOZweQHGKFHQxBKJWyKWfJf5VbzX\nxNqY50GfN3ocerZSSWnkenEW43fYZcb53d0h3qk1oSTj3XDDa7ND2z1xSxhr2M3HMfOvt3Ejkk6p\nZXiU0jCBSm9czs/jBN7Htr60ipLhgNfOYK3+aVufa6InBW0sjp3rBBfAdjQNozphGl+qR5ko3dGK\nDMHjn3n95cjtMeKMwWlzr7Q5THBcrxvWCloguPHQjPFGLBFRsLSZMGkOuz2rrtS1UHulS0fLoHJ7\nC0YYw3Rf0KZx2O+w6oA2ls+nD6y3V5x2KNnRdUfj8GomxYbRltpGONvooQF4eb3yL7/5Nc7suNTz\nYFheTpQ2rI3X24mPn36NcQarAqfXxIfPn1jjlWXeMS8LSsCUglUDRnBrmdjHA0Gb4ZZWtfHghg8n\naQVdY5ipW+Ny+gy9UfQjXz88sMw7nt58yefXZ9Z6GVGq3WBySu+kaqmtoVoD8dTSaH34fIqqdDO+\nYLRW6BAQZcapq8hgN3ZB3bONvloyDjfNKKkUqdC2QQdqCuM0hULFI8oiUmm9jTZPH4AQcR1piilM\nnE4nhi3MQlfUNmZZ27Z0IWaHAAAgAElEQVSCunC+3vjyqy8HWehyuecazXCPp8w8zeMa1vv9RDkY\nq3/qfY8H47h55DtV9k9+oD/9meODmVm3G406tueXC4/7Hb0UtFbUtOGdovaK0JA2ImatVopsTPt3\naFHEuKHNTMuRVQYF3ShFanVwWY1Fa03YLfhl5rBMVKNBGroLc5gpKaNrpX7+hFkmZHa02pCcUfMC\n0zRoTXpDWmc7XxBG8uLj68aWO7dYQFdyuRG3wldf/pyD/hanT5jpwq2/0kxFyQL9LVrNGNMIYYgO\nu3RqKZSSiDWTa4bcyCkO17sx1NbYz46mGr0X8jWTSqJUUPPCPFs6boxQSgUKva1UOZNLosY9f/yY\nsbYT7ESqhZg/YU3n4XHHFjWtCm6294fb2LTnpEgp3rfcBqPGOMRqS1EdxThl1gopCzEVchLGokMw\nxoy6pWWAebzGO0tKZahpRLHWjub/R/f8v+RLaATXMKJHBrI0UhqnhtIyOZ7Hxls7YnolVzWO5a2j\nZMZO4M3E5CP5ehuqXOtxXY9YRs3k3FhvV3IJPB5W/LKH0jG2UdXr+FbtZ6RbSt9jJQyStnJoBUYH\ngnN4O1F741e/+z3/8uvfop3CTJa3bx55+/gFh4eFUjZu6UapFxwzt9fGLV2xFtAZBSxhRk0GKYmq\nwfSArgUboDFmf32r7H1gsYbJeow2bDKheuLy+n5kG6eJNh/wy8Rxf+Srh3f87v2FRiTnlZjPKJ1p\n94pbqwktBZqjlkpKEe9nuvVIzdA6k3M0IJhAAbZWKWvG+U4XQ1MNZcrY9IuhlkypeXTnjUc14ZZH\nTW5nFE4pHGNAPyJIldzbnULUiDFhrCOlzPLwSO+dDx8/cpwWvv/+B6YwUVNhrRdu68rueMB7T9o2\n1nXj8dEPsdm9315rxTlLrZVa68C2CVwul3tL6D9L1FobN5zWGtfrdbBhxRBzQovCu5lKxYVBUerS\ncV4zLxZjLct0pPeKnSdaqWitkNp5ef0BxDDNHWsNlQGyLoB3jjBNxNsFowrOdMy0oEyFlkltVFKV\ntlAvUAqiH4aTJwQqDTEOI4JeV+rrhfcfP/JyXVmvQ3O8RiGn0SyrTXg4vOXbL/6GhQmLIpYzWkew\nClUv9KwxZsFPE6WPnUAtFd0rVerQUqfR66dq1hgxdqGlMm6B2g2mahq3rOY6giJYj5Kx2LHGsPUT\nXRVEbvSWSOtGjJ+J2zOPh2+Zw0RMCR8c662jVccEsPZuFVVQ+zCmClDzaGUhFSUdLaOiKqLQopEG\n25pIqdA6GKNw3ozruW+IdcN57jRVMiP8L2wJtiRM4V+Jp/mv/XrwDm+5K2YH7TnmV0ryvHnzjsUu\nfHx5z7a90EVRS2ErK7FmuiSWOjBbZWtQzAiktj4WI1XoVdOSI7WMtMQn/xn9zlNqQklCqzG3EN3o\noii1ULrDyILHD7ivVZjgUNoRBIyZuJzPnF5P5Jz58Mdn/v2/V0yuE/yOrA9svY9N/tzYK4NqwqQ0\nTtvx0DAWpgmsEFTAtoIymg4oZ8BXmgMdZoyzhFLoUpE64Llbu7HGV05x5th27O2ex8M7fnz5nmu6\ncr2+J/jOYdlBqdjm0c3ff37lzfwWdQj46YAoxWU7QT4RtMEoD8ZyjYlSE5f1RpOCNhZtLDY4HIqq\nQXV9l4BB64muNbk0ok4EPYbs0jXUBikNrQcOJZrb+TNu2pNTZtk90NPGrVSU0ny6vhBzxBrN9XIe\nUZ6Scc5wBtZ1Gw/h2snlNnK0XVjcbniRRKi1Ms8zp9PpThsadcd1Xcfv/P7vtm37CaY99LqZ/f6I\nUqM9Y5TCTWPkQ4M57BAl6DDes61Vcjoz+QnpQ5d8OX8ibpUw7/BuT9eakhPJW6TMWGvoTlNTHn/f\nwRBbI5aRzQzeDjZlqZh2pXmHnhxmWmgNVG+U68avfvN7/uXD77muzzgdoAYkJWY3Y51BGcvXX33F\n7BXOCVtq3HqmGcHYhFIXtHXjz1SeZV4oudDKqN5IbtAVGktPI9LVyoCj5MVwq1fmeWQca2koMQQL\nSCSKRvWIlUJsbewhzNAvCwPZVrZGo9ELNCMcDo8oPJftB4xrhBCwviKS6EWhzUJOJ4yqgELJilEe\npQKixjiuGwNWUyWSa0VQ+ODYLZ1lhmmx5JagZkSpkW+WTKuOUgZYZkBF/krD7UErjO33DXojpk5O\nK0/Hbzkub0Y2Us/84z9/pPU0HONKsa5XttuJh/2Mtm6ItupYAmQlOKOQqUEdgeheDFvLnP0ZZyeU\nAtUnAoEQMjFnYumjx91nYAZG8K/lhBiPCWPp4Zzn7dMX7HY7Pn/8zHU7cT4/8+44MVuP6tC2Sjea\nOczsbR3+6zxO0s1BkYauAaU0Ljgs4NQIuucOvSRQQlGB3BvKWqxvGNSY23hPlsI5XbmkA0fj2IWJ\np2XP6+U9qRRiFmb/DmeHL8mat7Si2amGNxPz/oANe2La8BfD5VO+iw06TRJIJOc0gt6pYIzCTIFv\n3h7ZKU3SsJZOukW0K+zDI4ufccaNXnDPTK3fg933LwR1n5eJkOJGRzEvO9bbhWW3ENeV4+MT6/VG\nSRG923G5XNhi4njYk2ImbgmlNdZYXs8npmkaWDPpdBG2OGAfXYSYEus2HrC993tVbxtvejvaO9fr\ndWxjz40uHRTMywwyfN/r9cThuCdtEWc9pQhKM+qTrXK73FgOjmIq3i+4NjKWNVWomc4V5WdCCOS6\nsW7Cw/ENohy1DR2LcTswBlVvpG3F6IllHgUBNOgp0BGUDVg90Z8/cPn0TDeGuml+/MMHrvUT3k/0\n3tHGMoXAl199ibUORedlfeHDyw80fWJ61BxnTdcRpS/jRF4UGoc23Jd7g9Kkm8KJRoymls6YFiuk\nCjoMK6RSo+mk7EgIaFvB3mjK0GrEOIULhclorJ6hCqUWrPd4Z0cypQbEafYPE08yE/OFsBS0SShR\npG3wPL9498DlFeJWUVSsHp8jcYJhFFCSLvRaUQaUUYRZERaNDZbSOp2OypbWG0oNpTBMA1NpwQTB\nyl9pjTKtlZ11dFNH1hGN08JuXpCm6MoMC2QB5zyT9xgKOnVi6WyxjhwiHiWayc+4YEal0baBi5KG\nt51eG6VuxHTCe4cRC0mz5YR1liUEeh6/TGTF6BmnNSlXIhFrHEoP4rbWGn98YFn2bNuFGk+DuRiO\nHN0RffS83k9oIqAFnA3U7BBjcXbw/oy5S9qATsEog6pCkUpRnbMUVJNRF9SKZADdmQyUllm3C9tt\nRvuFTEdC4OndA0k2QtBYC9buaWVUDKedQjEBit1hzIK6DJJU6wVVG8YplO5oE8FEzAQOIXiNdwnL\nmf3uiK6VnDI9bbTkaaIJy8wuHPA6INlR9YZ1imneU5Wl5xNKN6RrvLVYI5R44+HNlwOWvD9wev1M\nq4WWxxzw/YfPHI5HjBlX8E+fPvL27RuUh3LLPD48sm2RN28ef7pm7/f7n+aZOWeUUsQYUUpRSvmp\nCTQ25xmRTrlHXJwbMaF1u6HkhlWBh+ndUHtojbYBoxXH/UJNkZYL/t6AyjlhreHx+ESO86gKqjbi\nOdpg7Iy1HtEOUYppWTB+GsUBo5hbQ/WKiKaimINHMCjrUNOC6ICoQNeW//Trf+KfvnvPh/NHVKiU\ntA3KlGkIwuPbr1h2A2Rx2VY+f3rPFiO4CQXcqmCnjHURzYLCIvThTxehlIpFERglDzEK5UHyIDz5\nYO+Nm3FCV25kjMV2mlKUNFzsSnsmPEo6vYEOink/IfWBXBP0QpMzxweHkjL8RLPGBM9l/YEuheAe\nSUVRu4yR3tKGQTIPp7xIRWlFMJZbzQgNpTpKKs4K1irknrm2MuwOufWfHvYuBJwarTyRAbBx/xrk\n9v8Sr8slY50mALlVSjOkuPHp+Xt+9tWBVDJxPWHEsw/CbjI4q7FWeLlBRqOVZ/Ka2XtM0MyHHdZN\nlL6RY2S9XkjxOnKIchotcbE03Jhn1PvpsFd6NuRN0ck4Y+5XuvEQli5o1dniRpiGqc8FP5iYhwOt\nNXLqGDE8zE+05rhsz+Rshgb48RHvHI0Vra9YX5jDhG2jlXGTxDW+4MwdZ6bicDxrj9YzRjvcpoib\nkGVDtcLna0QrxZvlgFiFXSbeHt9R6ooLmqZPoFa6CMbtKd2gdR2LktsLVTSnS+Ll8wtsDe7+GusL\nk+3kVunsKJPGqJFr87OlGTC94k3BecV2U9xuK/UhY/WEXyaUHREQXTJKDwyc9g8joF4bQqO2cYUu\ndR0qZxO4pjOldcJyIK15zKna6HbHkng5n3h4HPNPay1GG968eTMeinDPVJbh/aljoztNE9u2jb//\n+wzTe8/lcgHgdrthZHhxlNbkFDE0nA5My3Fc+Vvnej3z+PCGuG2U3hEFT1++o1RBGYPVHWsUVluc\n3yFaKDXfm2GVLiN/+vTuS3YPb5kPB9x8RIkaUI0uLPs9vRWMKFAB8QaMHZXHsg3FcRPCwxf8b//j\nf+TD6df0vv6UQDjfVp7evmVZHEoUrQufP30iniKzHW2p2mHtiakr+pxYpkingezo3dK74Gj0ejeS\nunGSVxoIgrEN6z27aUJJZasNVYcfyyuDVxaqJhfF5B26KrQH7S1NC0lFgrfsd/OoZPaVXIR5emB2\nFpigVGb3htPpmddPL0gFbwIOi9WabhTNa0pTNO3YO4uqFacVVVtuUimM6qyzjl5GGqOYjLJg/HBK\nWQPBarrKlNSJK/SiMGn+s8+uv9hD85oyNgq1e5oWam5oBc+ff6BmMyJJLWFlRffApCec7lQ3Yy3k\nVkZ9TMHD5Jh3HrfMGLejmQNXdUX3Caf2bOmVLpFcL2jjKHQipyGtCgFTO11VttypWZhnB6JxRvDe\nEoJlmhYutwvPn39ktxzY7WfmcP+Wlooylqo0cY14M1OjpfdACID2I3RdLsR6xkjENU+wTyixOCX4\nvlH7GRcssx6dd288qAEi6C1S03nMlKqm4PlwvbDFA27aMQWDMeMq6MLQO9RUOKdniM/YkUYnpcSH\nl5VShM5Mq56p7VmcxVhN5ca0CNYFzjdhuy1j6y6a2DSua4ybsF4xz4MzGvPGc7zidxkphtnNeCzW\navLWcfOE7ZaaEkKjtYa3Dq0UIo15suR4ozUZAj00r6+fefP2iefTK49vj2y3iDXjoTgAKQO48adT\nJff67Z9etZafTpatNZoxrNt2r9BqYtxYt43eCiOUNFpNKWXePS4/PTRKSdS8spv2aDXmluvtAtKo\n1bBf9khrTLMHYbjCQxgErjLmarMfdkNrDfv9E8e3XxCWI9rsyLWjdb6XPDSH41ukVKp07HxAlnkU\nBWIlv5747e/+wGVd+earb/nj8+85XzeMgRwLtXQeH49wd/Cs68Z2Lez9AUenqs5WM68fG8dumCWR\n7DOTeUPTHtTQjKlJYaqm9ErpY9bX7VisFQ17Y9Cljk1+7WgpBKPwxuE6ZEbV1iuL3DZqhGYbehKy\n1ci8koxBh4CzgbgmSnlh8gNUbO1QZtvDzzkaOH/8gVqFXtdxJnZHlt1Eah1FR0pEK1i8oxlBZ0XR\nE7FU8pboRqFswYWCt5rJg7YN26HmSC2QN01ZHSp5YvsrnWkuy0KpkdZWRBqt2tHzlcTp9Y/3VH9F\nW02siTU5fLPUPkK1qmpqVxhbocURTm+Cs+D6xBwCNMgxo9lTsuf0ciHvRlddazPcLzIUGZ17xMhW\nctpwdqIrPYbMYeC83rx5IuXILV9YX68s857DdGSZLR9Pn3BhgipjaeKF7bIyLTNh3mF04LJ+4PVy\n5XROHObC23kiqJlqCwozlBRYTO/obuhVYa0Qe8HQ2DtN1oMGX8qAGcd8xeU9O79jWjy73YS3O1Sy\nvJke+eoX/wPPn37g0/M/0dSVlBSXS6ErS+fGXsFxbsxmJpeCWGg1oq1nN+2gdza5QWtoNZHFIKWA\nDYSjwklGutDymdf1PVZ/g4jgsfTOYCcC3LvD3rkxrG+dXjvzztFyRCvN3g2cW1pfCdPCbT3z8HCk\n10pcL1glaKXotXF6eeXd0zukjzd4yRljx/Z8IN7+L+beJNby9Sz3+339v1nN3ru602EfFEMikygB\nRYQBEkh0Uq5kGBnBFfKYKQMYMopspgyYRCA5ygRmWBlEYWAREUXhhoT45vrS2DH2aeqcOlW7W2v9\nm6/N4F217atgBiAFtlQ6Vadqr1q191rv937v+zy/R+ZSOWdijJJ/DsQo4vbTaSKlRCuvt+2KkgtD\nH/AuUHVjjgu6Zoy2BH9maDY4nQ5YGipYliYi/FaFx6qdRnmPswb9WhbVKn3XMwwD3f6CrBxUxXq6\n5jid0CbThxHnAiUXnO9oztGspSkL2gMr3lhiyfy7v/33vLr/iN1uy5yP3J9uqWvhU+/8AJ3XeCNJ\nqofjAWt6eV2WlVwSuSGw7MXhOk+ZC2VzQtuK6zp8UZxSIqtCMZpSC2luFF0fJEeuKGiVEhNaQQBs\np9G64XUvwG01YDLoWjktjdwSTWf6QdFSo6nCEg+0dqCzju3FwHYfGIeA9wNX4wZCY3GRwV4S14o1\nA9vdFbYfhczeCnGdSYtEcMeUeHl7R06FORvm0jAm41wRQ4yz1FpIs0C8VYOSLGV2xFPDrB6ve0z7\nFyo5Gi4uuJuusSVTcgYiqIR1ipKKdHraURCR89204r0m58S0JqoRH3BSlpNu3N4vdMkS8oIxHQZD\nw+K9YT5pWnLoOpIOBWUzxgaqWSmqkJJGK4PrpOdo1cDZ5ulMYwwabR3abPj0O45vf/gNTvPMy08+\n5tRdc7l/BDTmm48opfHo4ilPn7zB0I90YeAHnn2GmDKn4w3r9E0Oh4lbNLf9S56MG0n266C6LfME\nQWU2WiDGs8nMJEqKjE6jq8dr8G1hVZWsZiiau2Ml5Z6SC7p0XF5ese/fZdvt+KG3/yte3H6H//1r\n/wN38TvEtWPJkRAayWmqkhmiAnJRJG2gVjoFbhzoQ89xOgrUYI6yVTUa4wyDC5AVLQTmNbLkGYMi\nGI0xBqcDLWbmdcF7D61xup9wVok/fbqnlIzzHSVquu2Iao1x9DQUlxcDS0xoMn0X6F3P3emO0AXm\nVYrjZr9jXVdcrcw5nzfZ0mEus6DoyrmY1lq5uXkFWoAqmgYt01plCAFn5Vq9HTa8evkhbz15yuHu\nFu+9pFI6KwuPWijrBGdKToyZYbCgNUZLOqf1DgUyp14X6Hqs1eJkKglrDa0mjtMdwfb0u0EWG95R\nfcBUIc7raojHGz54/1u8uHvJ9f0Nz199R6j01uGc4eLiEfvdgLOVdV356KNbTktDI26XhmEtM80o\nrOlIK8S5yb93XQkdWCNjmOg10SpUBEcilYpKGl9hcAaSjK600mSVcd5RKGjnKM2gtEWXgi6NnAo6\nF+I6EXae0hzzqbKmzHyKrLFi9cLjRTS4p+0rri6u2A+DxHB0mkfjO/Rhiwt73GbABY0xhZRX5mXh\n+vqOV6+uocHF5R4bNsS7W1TJdDtL7zpay6y5EY8rLTYohloN61xpc6bXjkELWMe2f6GSo87vOc6F\nlQnlLOhMipmG+I21kZAsVQotruSaSfNJgsCq0JnXCjfHhbuT2KSmkOk3hW6IQnFO5iw9qEK9WSva\nGVS15LWSqRjv0EY6unHTaFVRqmT9NB3RHu6mD3j2dEtJjS4MPL18i/fXvyPrwu31zHRcxdNeV1pT\nXG7fIM6Wd978FLvNFbvxgike2fR7rNow9oabFwvHm8jBRC52HVePB/RgqRhul0obAiEYjAsiOM4z\nsRS6rsc6y3T8BF2PaF0xulDaTC6NnC2n48J0es7gnvLOm/8xb1y+w5uPP8Wn3voM/8u/+R/52l//\nT6yHzLp05OVE3xl6s2JdQNWOPEWWtkBXCFYxBCGK53Vlzo04SdTy2G/orKKpTDYGFTpaS5RUJJzL\nK8iKkiJ96Mgpcjyd2O53jENHmheO04EudMSc2GxGXFBSdFpiv93TGUUsM2NQ1FpJ8Y68HNlueu5v\nbiT69h7iukrn2Bpd14MSmnoumRACy7JwOp1kZJAWjHXn5UcVmIZS4g8vgn5TJTEEz3S4ZV2OHA+e\n0gqXF1tKOkEsOCu2Q60tznmWZaF3Fo1s2FVDiE3G0YwE/SkgpUVI8GEghJ6UhbS+2xUI4rVXm4GS\ngWWlDoaM5q/fe59/+81/y4fX32SOJ2Ku1Kp548ljxrHSBUXOlVcvb3n+4hYY6IIccFrbM81HijUq\nsy7SYaMbxhSMWUFl2R1o4W4qZTCjpy7g0QQaRlVKOkvrLChjMNbTqkXRYVPB1oqJCW01oRsIF5aq\nK3OEnCPxpFiPjiVXmlnAXkNvqaFhjpW4WjZ+w0X3BGsD7ZxqmdSM0x4bBI49jFsuL57wxpuRTz65\n44P33iOfPmG3UzzqL1FBYYphmRPrfOB0EzmdGjVFKJaaITToOovqAkJs/Bdqo2xoaB2d71AqiaTH\nDOSUiFFyzp13GD0Ql0CtMh9bU6KzjjUlcVykTFpBH1Zs0PRzYdxXxsHTqohVU2nCUlSJuTRUajit\nUFiWVLGuoh0YW9FaydDeKVQrhDFh9Mpx/ojBvcsyF7TSBNsR24q1lWUR4nethloa1+M9bz1+F3Lg\n8cXbjJst6dUHaOUwvrAbetYJXnx4YIqRVhMXfWDjOprSLLVxN50Y7Z5td0FvLe34ipom5tbwLbDt\n34DlFuc1zjlims/QAkVVmrQm/upvvoYLHeMw8uTqMS51/OCn/1OO80u+8d7XONwt5FQ5qsSuOxGM\np9Mb5iyzoLu0MnpLPwjBPaVEzYgcrCpS1phFlgepSIqn7y3OB4oxnEpCL5FRaZZlYl0Wrq6u8EZh\nVAVvGVpHzZntdqTrN9Si0V7Thw5vDCUeCUSosjBap2uCNaTpnhYGTscD/bgTwIVzkrJpZCZean5g\nZq7ritYwTUe0aajqaOcgNHWeIUuMq0dTWOYDeZ2YVsl3WtdZ5ERF5qStlnOeU6WWgtGgqJS4QgjU\n1rBKYYyhs4EWDEVDSoKHG1xgniM5icbXW3k+Xntq06jUoB9pcaHe3VLWirM90ymTJ0U+Serpo8db\nhsFgHVRjubm/4eXdidOcqesEO4cxFutlCaRMwKoZYw25emocSWskuogPoFWl1RWnNZUKVRH8GdJR\nFMYKvKPVJjBjqvhnlBZdrtISyZETxjZ8Z1EGtLKc0ip09amRbgQKgo0oV+l3FuMNWgeWKPpNoiYd\nEyHMeKso9wsLM6YVhjGw216x3TwiBIczPU8eBTbDnqvbF1zfv6KUxnZ8QlpmDm3F5owK9zy1PT6c\nYT7aYrRlMIqh6zDeiPyMr33f2vXPVjSXQ5acaWAcOqiZFCGlI8ZkrLayJOlGrNqIb7hvGOWpDaxL\n6NZYlWexiXmeOR4jaVXUOlNzwzuDq1ZOKISEVFum1gIUNp1GNxF9l1ihNpoS2rc3UgAiE8503E8f\noLqOMnfkUtmNjzHW8uLlR5RpZp6gFYPWhu988G12+0uc2zDPE873rOuRu9PHXGz3krD5ZkeeE+tt\nxVlHKRODGtHN8DJ51rjS2sowBDbhEp01Lz/5K7rtBp0qtTRGu+Oi30q6Yp44rkfmGJnyRMmam9MN\nf/6X/yt3t/d89jM/gtUGSmO3fcKn3/407/Gc29uFqiprToS0oPyGzfiIQ4rUGkFV5uWeJTdKtTJL\nMgmlBKRyiAttlYOk+gVdgKywxeMqhFY5pMJgPOPFSO87ghdyUErnRFDr6PoRb3qqnUgx4ozDqkxK\nK51dUbaS80IrYgGc54zfVJTuuD0cqC1RDwJ12Y0b7m7vcd6xLKLNXBahlNf2mmozUUo9098tuSa8\ns8AEGskncobpFMnLiYvNDmca03Tk8uIp0+GOmO7prCXHRFpnlAmyFFSNblOxbgfKsdTIfvMIrQ2+\nGyjKcThNxHXC2kAXenRLaDxVWZQt4CTN0mNJS+Rb732b++PE1vf0xjP2yDLSyra7ZMf94cR8TFIc\ntccGxKBhOoxR37Wdnu3LffDUmolFU6dCLQYQNia6Uo2makfTYABt5UqulML6RpY/TamKmjWqaZRr\noHvsRtN3VojwRnYRap5I8wlaxYxKlokjmJ2hHzWh02KAqA2Fx+pHBHeJtwMxRo7HE/Oc0UZzGg05\nyt7j0m0Y+g3BJoIt9H7PW49/GENHa5ZaDCUq1rlQP6MYnKfzHdbJLTMYJ7Q0ax++Rv8N//33rV3/\nfDrN5UDKB0kyZINqipxWpmmm1kjfR7p+g2pQq6LmLATnM3WaJqZ8ay0jSmJyqcSaSathNivFiqBW\na08fgszq2kyqCe00uMS2M5wmwzppdNbiG7YVYzPNOppuxBwxBF68eg/PHqU3NGkthIjtelaywGyD\nwxnP+x98h9AN7LZbDtOR+/mG+9MNxq4EFeid5nK/55hmVFPo1jHHhc4lnqrK382J2Hl2/SX7/VNm\nZZluPySeJmaibHudx7nGZXB4N2JjYjsollMjtoK1ntPxjv/t//qf+Xff+Dc8urxku+mwNjP0I48f\nPyWmV/i6iAf6rEft9Y43LwYOp48ZvCLnzBAMJxZaE37omgpzOUkKpEnknGk4ks4Y1VAtE7Qg+fph\nwGW5dsv3fmWNM85ZpunEMIxst1tSLCynhbEfaeWEVoLlc26LNaI7NCVxfX9iXjPKG9CF0hyHw7Wk\nAAw913c33NzdsRlH1nVBKc00HSlF5EhKyespJSEntZrpQ0cXNIOz9M5yf7pjnRZyylAq83xiWRrj\nuKVEobXXgFCeBs2yLgzWA41lmmhV4ZTFKI33nhxXjA8YZzDGMyiDorEsq6Qvup7aCto7SmuoBr4k\nyjzz8ccv+etvfIO//MZfcHf6gOYXHj/a0myhtcLpkFnTkVOurKVgvKMbPZTCdjcy9h2aSlJnVcbm\nCb4TbaZzmlgaWicutht6N2LoUCWgm8XQU2qmxInj/TUxLijl2G1HlIJ1Xak0tPUobfHdQN+PDIPH\naehCj7EdtSliTGwAOkkAACAASURBVCzTQorpLMTXkhHVa7qz80ocQw5dLVY5Oj/gnDBnVRNHkYxh\nBDOnbMPj2bstu80gB+W8SsxMbnIo6gBFY7XHKY/ukSz6c0SH1eZBp9lqFiPJP/Dxz1Y0a5uxOhHr\nwuE+sq6VFtND91nmhTxG5tmiULQzubupDMrRcOIjVwpbIZhG8g6jPSYvlAWqK6gQ0dbQSsIahx3E\nRdR10A+KYB29hmM9Qlppi2KKhUV1pDUJ+aYWrK2ouhBLxthKwZNyQilN8IHSe5SeUUWu9sYUvvP8\nGyid2Q2PyO2e0+kTXIhol9G5YzAGtxnIqbImQZyVjcMY6Cx0fsvji0/x1tvv8ol5j+PL73B3WGml\ncDyd6IY9YdMxnTLDtmfoCqWeaAFiabRS6XqHTolPPvkOH37473l8teGNN58w9I8IYcPVo0q8+wit\nMzEfGDcDkQmtd2wv34R6i+saiix+9ZTJRlHNQqmFTEZViYNdzcIyZ2JJGBVQYQsEbINge2qTQ26Z\npGDe39+x3++5urrieDwynU6otjDsL7g93NNdPEYpS+i9CI9z47TO1GJI6Zq4HInNsKZMWTKzUjQt\n9KKGQtXCmuUNmlI6R3CUhyXR667Ce8eTx5dsvaWlmZwnliXy6PFT4hSIy0Q7x15QIjku+H7EdgMt\nZVQteJSwJ5uj1gz1nrsScRaa3mJ1Y7vdcDzNlJZIVVB1ApJwaO0lgaCumM0jeY8c7rh+/oIPn3/M\nx7c3nO6OaGcwwaNolFyIEab7RsmKYbNj8IrFNHQY6Hzgan/FdhiFSmQ8wXdsLzZ4L8mfKQudPtjA\ndtyIy8p38r4IHVppUiwcTkfu7m5Zo5Cp+kFuRcu6cjyJv38cekLoCEG6Z9UUygguUJ0txXFZiSmz\npgWrDM7tGMeK7x1WG3I2olKgoXWjKY03Hd45tFYYbUFDbN+dR9faRGRfNUTD4EY5TG2hGTEtdGEg\nGI9WiqLyg5Y3p4I6w1QAsO67P/8+H/9g0VyWhZ/6qZ9iXVdijPziL/4iX/ziF7m+vuaXf/mX+fa3\nv827777LH/3RH3FxcQHAF7/4Rf7gD/4AYwy/+7u/y8///M//vY/dOw0hgKrEXEgZ5lJZcoECukLJ\nM9oIfaUh80bJc3a05mhrJcUV7wLaefY7OUW07mlppuaIpkIR6VDJMj/a767w3jF0AdUiqEzIlVA8\ng018eEicUqYUxTpHmd7rSeI1cqPxglgcnLfE/TBgfcVNQqxxvWPcdmz3T1iWlev7b1DLgVpWbIzM\nrDwO9tz1OIKrtBJRduSYEl1o7DaOZ88e8/jxUy67C9buFlXAlkKrhUe7LcoM1KgZdltyitg+QKr0\npZDVyoSilBVrGvvNwP1d5MXHL6jMPH2c8DawsYWTs7RSqWVhmV+gxyfUXHHdTlIyucUYj9JwStco\nY3k0BjCa6bByHQ/MLROaENKXNRKsA2/Zb67O2DdNcJ51mUkl4rVmMw48unrGy0+eMy1HnLVc7SQG\ndzNusVYWGN6LXY7acH3A24BWjpf396Qlsqwr83EFa7DBEueID4776YCwpBMgkFmQhVLOQjGy1nC1\nv2IIA0ZlirHM94l+GIjrwnZ/xW1NqFow55woQ8W2iqmGaj01rSilKXVmTSuXF5fM00xL99xdZ+zj\nT5PKQNMQOkHxURVGa3JKZ2dKh+o8ynmq38nz5IZP7u+4Oy08uXiM/6H/jGm5p5HwrsPajnlNxGfL\nOQGhscaZXCpaeTb9hmEYHqyk47hjsxnZ9iPeiGhdW9n0O+dQSjosbRRd1xFCh3eeUhIXy8DlVjp3\n5zzb7e7MACikuJJLpgudbNJzIedyDj0E5+SK77Ulzok1r2dDgqYbAn034jvRaFI0OS8ykz4nWirV\nMEZUB9Y6ikIKcFwpJeGsoZ7/LmMUIcgSucnRiTL6HGanRaifG6Um1rgQ10gqAe8lu0lrJSO6f2zR\n7LqOr371qwzDQM6Zn/zJn+TP/uzP+MpXvsLP/dzP8Zu/+Zv8zu/8Dl/60pf40pe+xNe//nX+8A//\nkK9//et88MEH/OzP/ix/8zd/8/dW7poKYRsoNWK8JNNRZPifFsGKtdJoWUuIVMs4ozGl4QdLaxXj\nDZhA5xzdxjNsAkoXKopaxE2tamNNEwUoxUFRWLOhZkvJCkVgXQpDq2gmLjaFu9g4LE10m6YHKrVF\nlqXQsqbWTG0S8qOdQ3fgg8HZXmjqzvHG07f4of/ov8Bbz7fe/xbf/Luvs5wUoUmM6ZRAG8/2Yo9K\nlbzcc7idoFdk3bBDwPhKrZHDceb6+sjLF3f41qgGlKlsdwFthUpetaWVcqbTa954uqdUwzFNHE43\nZBaGYHF6ZDpMHNwtu81GFhVdRzxmsIaqInF+IYmH6xPG/m1iseR6h7MeZ7doneiDpRs2dDoSE9yc\nFgyB3vf4UlHNo7GkXLCt0azjOC+o2hg3e8iJYeu5u33Fzc0Nl1dbtv2INrJcCH4khI6mDCF0D1dq\naHTjwEWqJCDWW6YFUUmkxGStZLyoRo4J24UHGLGz7pyD03AorFUMw0DvPYf7W0o80PU9SlucMUzH\ne4YRnB8gr7LsoFFKpFWPM456pp1H5Yhacr5zruwvLjmd7uhCTyurOE/WBW0CuiIdDlbwc3GlbXaY\nMNCsh7SgSiXlRjfs2I6ZZiTMbVn2dEPg0aMrNuOeGhuH21vpuJTiOJ9Y14jVrylBomGNMaFaIS4z\nt/OMtZ7NMOBMwDYjh0op524uMPQD3ovqIKUVrTQXux05DyLIV1qusUZ0qb3pqa2RYjrT+gW113Ui\n9NdnorrtNLaN9L1Yer13aO/wzsuN0jaJm2lGtJXGnIt+oVWkm7fyWqi1YJ1wPY0xZ3aqzKONMd/z\nuZWS8tm2LJg4CTMUghTnAltKQimLUv9EneYwCJw0xkgphcvLS77yla/wp3/6pwB84Qtf4Kd/+qf5\n0pe+xB//8R/zK7/yKzjnePfdd/nMZz7Dn//5n/MTP/ET/9+iWSo6V7yFOSqcC1SfRPisFceoqFWL\nayTLBlRZ2QR621EoBN/jrcUbycbJNVNSQmdY50qNkOsRnCfVTMuB1UtnO44bSgroalEUTmlB94pW\nDugQSFlRasZZyTQZbEdqiftjJldDQ6AAqTVaPREGJ5BTU3Ej/MCnfojPfuY/x6qK046PXnzE/f2E\njtJt5AQXuz1WW2wtlGZJC5KP3hJD0KQ8c3P9Ia/UHX/34q/48Po9Ll2g63uqipxO94wXgeN0j/eO\nlGa0KoybjkeXT3Buw/NPPiTHE24TKN3EkgI5J5blBV3fcHpg8BvcbsAUha6Neb5B2yNGPcFvR3a7\nd7m++xZ5XdHtEqvv6buesd+zHu+oMWN1xVnLRe8QjH3FdT00QzCw5sQ4bER6NE9opzkeT9zdv2QY\nHZvNjqv9hlfXL7GqYLsgXXgIkrfjHFiDaQrvDP1mZFMzqSTiWjidEsfpAKeJvh9IUZZltsnIph8H\nKlYOg1JxWrz/4zCgyHLVX2dQsiGOayL0O5EJaYO2jtiaSHRaIZfI8djo9wNKnWMluktyKnir0dbw\nzqd+mGWd2T96xnD5DKUDx6UyV1BG9LY2eJzWGKVpzlNNQKV7VAGtB7zf0IcTyzpRjaLb7ri8uODy\n4pJh2EjUsdH0XY91jmVZKFkkduK3j5xOJ+b5dPbbJ6ZpIsY7DqFjt9uy2Q74Jn7rLnTs93vGcXz4\nfHDnrtxyOk2Y2oQUdWZUil9dxiDi61+lUaqglIwBpkmwj9aKPMsaJ4qF1sBompJIihZlPCdxx3JV\nzqpRqiZXYQmQwHmPMkY6RO8enGEpJVSTW7LW8n1QTUAx2hpZMBswRRZUtVbQ5gHqYq196Lj/0UWz\n1sqP/diP8c1vfpNf//Vf50d+5Ef4+OOPefbsGQDPnj3j448/BuDDDz/8DwrkO++8wwcffPD3P25u\nlCmTnae0haABbSjFY3xgbZNs3LSi7yWC1DqHU2J5lEJZaGRSEYJJmRN388I6LTgsJoM1nuoKWIVu\nhbicOByO3L4K9F0QMSuNViOxBrQJVLPQbRSHa0dFY7qKbQHvOmp/4hQTtXYUVYi5PhTYMCxUr9mr\nC9544xlXF48peUVVw37c8qJlNBIYVpwE+pg+MKnM7f2R6/mEMQGtQJnCqb/nRfiAOVWu779NtzfE\nlgBDsCMFQ1wWYrvHWk8uiZQn3uQtSiiEccUHUQ+onOm2PV2J5KKobZIfOKKSuU9RlWUqnBbP4fiS\nZ08fMQ47jDOM+7eYDq9wppBOirwo7lMUJF+16Ozo+gGvBjm9rSOYLRvTY6rlauOo6cRyuiW4jpvr\na4xpPHr8DtRM3/XMa5ZD0Y84789dj6YhBPccFYYGRqDD8mc7XBfpw0zKhlbzeSYGnKHUm82Wcbcj\nOE9MkZqLLIBKRut2lrkJF7SVhu+Eo9n3O6gRawu1NXqlUTHRvCKnhXW9w/pLbNidA/ok3qLre7zx\nmK7nnTffod9foL2HohiCJc0L67LQWmW730BwYBzkKDPArMhzZl4i5ew4AmRDHDw0zatXN7y8vqEV\nyQH33uGUYxwHWoMQgiyrajkXzZmU8vnAXB6893LTkKu5UiK3m6bpAfrcmowyrLXM88yyLNQqEi5j\nDKVkEbqfIz2kKFoERSPFS2l9ZgVovHN4f54tCpdOCEVnGVPOhVrb+eov/NOmhVXwmkxkjWZdV/kW\nN5lnanWmWdUm+EctexClGhr9kDBbUkZ5f44i0UJ6Nxqjzw2aev3M/wlFU2vNX/7lX3J3d8cv/MIv\n8NWvfvU/+P3XX+zv9/H9fi/mgtFZgAQpYpXHGk2KldYK3pxD0Kro/5SRWYvSQBEhfDWOWh26JpZD\n4nS98vIwk1Oh6xSb3lOb5MEoLcuAJRaq0SRWYrQsrifYQBccL68n+gtHVY1hyJAr8ZSgBZR1WNfh\nioZyJ/nLFZSy1JKJSyG3SquVzeaCNx5/mj4M3OSZD6+/jfeZ7a5nmmdMMmBlOuZ8ILuMTobB9ejU\nCQxWWabVYA8n1nQgzi9pZkFZQ26RYHrB6ulMqxPTfCShOC0LLb6grImhsywqSd702KFMorkisGXj\nKK2iW08rnqaCDNO1Y+su0N3Eegf2kcOtmlI1Y318BpPs6JqjJbA6wcUbGDXSeUPvvPBPK5hShF41\nDKzTkRQXvGrc3L5CO83F5QVxbXKFBeblRIorm8ExDAO1NmJcQMm8TClNy8vZtpjovSU6z6bvuTN3\n0hUpiylFdILG4IxArrXWeCMAZBUsYFC2QVlYzjnjm80W5ywxR1RTnI43XG43KNtBNVir0F09P2ZD\n58Y6RazOWCdSHKWNiPODIww9aANGgzHUVMklo2qWZMscictEf3EhDiWdITbJVsqZw/0d02k6LyKl\n2PT9wLIs3Nxco5S8P/tersDzvJyD3Cz7/Y6uCzLiOHfIr7u3lArH40HspmfqfWuV1uB0OrLMH3N3\nd0MIgRDCAyFKnb338nfIFbaU190mYrw4X8VlJKcEuXj+tTHnYLRzRyiFT50PSFHECCSnUUqm1Moa\nV6qpGCVhaspYVGvUKs+n1so6L7RaH4qsMkayl16zCUomrvVBOUFcsNbx+pruvQdtaFqTW32AVP+j\ni+brj/1+z7/6V/+Kv/iLv+DZs2d89NFHvPHGGzx//pynT58C8Pbbb/Pee+89fM7777/P22+//fc+\n3v/99Y9x2tMMXL7lePo4Y7xnurunFnFoNK1QrbEulWwqpSgpKDnSqFhbJbK2VMzicXi62lhyQhfO\nGdgeTSLHRq4Sp0qsZBw1Q5xXJn3eghtLjoaLC4+34AbFXcncn+7ohx5rHf1wyWEqrPEezvFOzhla\nc+RsmOPMxXjFhd8Q14nnn3zExzffQrUZHxw3Nzc0IxDbJ7uACZ5NcFjXuDkcZJ6yLmTlKcawpoWa\nVkzw9IMQw9c5UrnD1o5QJdEztpk0GVzbcIpwrVZM6XH9QB+8EORbBCO54NYYKJqaDE0HIY6PIwyW\nKSzU8QjFoE4Kq3qGbDC6EW0lqgWDJQSPs45PP+lQWEpJ1FqYl4n7+xM0MH3HEld5ATfLcT5Ry0IX\nNixRiqqyclDdHu/Y9p1kmbcGCKbMe0MrIm+J64RzIqExquK9xmnYbDYsuXB7d+B0ukcrwDlijKzr\nAkfN1I6SMW7FF99q5GLbCexht5e0TC0Sq85Z1ttb2sZBbfS6x/WOlFdsU+cCsaJapTTJZu96j8Kg\nzsTx7cUe223QSuyVpVWOcSXFjEfRB4vTDWKhPbmkWYM+rqT7I8dZlko5SXSGtU7kXTRyyec3/NmS\nmTPT8ciyrkIpcpZ1PjJNJ7ou0JBu8fX1WOHOM8DK/f09SqlzMauU0liWiWUR2+v3Fs1hGCSUz/uH\nAtT3g8iBlOhAjTFy/T5fc9ezU8taKbKvwc/LspBWuW7HlOi67mGjXYtkyOcsW+5qGt5KAR8Gj7Fg\n7fCgiihFkkm1MSitqede0Z4PyTXGh9uHMQbTmmzw14WcCzFG/s+vfZ3/42tfFylj/Scsgl6+fIm1\nlouLC+Z55k/+5E/47d/+bT73uc/x5S9/md/6rd/iy1/+Mr/0S78EwOc+9zl+9Vd/ld/4jd/ggw8+\n4G//9m/58R//8b/3sT/7YwO9eiz+2dFQ6wlyxnfw4sVKcJqu81hgjSvT2vCqoFRBGY0yCjU0MBFl\nPM5ruVoFUNbiOivZ5VU22spZgoOyFqa1YKyXZYFqpFLRLZ+THg22NvrBUEzE+QzOoa1m2z/CqoKu\nN0x3M94CZ4+1NWBqxXaG1CIf3X1M5yZefPg+19cv0eZIaRptM7nOzAvczgObNHDZ7zCdYiqVw3xA\nGYM2nhCs/Ht1o9MObS0xrqAVORcMwhztzCP6TpZSzmwJYWQbthLmZQyoSs1gDOfPUZAanRHKN0bh\ntccFT86J2S/kNGKMdAutKbx1YjXsM3ot0BReW0LoZCanFUUZ5lQQf4BcjzQKpTqSgiUdqLVicDgV\nHsAI3nqm5SUpVfzl5gEILJ7uCBV678lpppT1nJ8tbhurKtZByRO6FayGHItsU62jtQLos/0246yV\nDHNj8WFkmSe0Llxfv+TyYoe1IosxJlApxCi55sO2QzdF7zpqLuTWsF3AOYFatNbIpbDbbjHeo6zn\n1ctXPH3mqOMWVRqtrJSYUaWQ64o1PdpqYKZZi7IXKDdxP7/iww+e8/HdNUkW/jjvscawLoaYkyw0\ntGFOK/bsA0dp3BgYXYeicXNz89Bhei9xG4r4sJUuRcj7OWdakw16CBKXHaMkUU7TdP5//gF88vq/\nIJ2usQZjNOsaWdaFnGXMIrIhucKv6/Ig88qlkHKkFkkCNdayrAGjDbkVSqr44Eg1c384UOpKF0Z2\nux1d19O7QMqZw/2B29tbDqcjxlr6vuNif0EfgoCUUeQYUUqMCih1llFJUsPhuHB7e0NOmR/+zNt8\n9j95F+dFq/zf/nd/9I8rms+fP+cLX/gCtVZqrfzar/0aP/MzP8OP/uiP8vnPf57f//3ff5AcAXz2\ns5/l85//PJ/97Gex1vJ7v/d73/d63vyENZFtuGQ2ilLPGcfaMs+Z+5tCMKBtorcBXRKndcEogY+a\nrHCDY+g8JSlcsNDg0lqWLI+XSyO1QisyMxuCFkZhtZJvU62QT8iCu6cxFQM5syaNHQuutyhAtRVq\nBiqVxjIlqjc0I7EYncl0TvNocwWp8sHHf4WzG56/eJ9WDPenhDXggmE6zhjTeHX7kt4KU9N6RNQb\nPZ0bCf2Oi2GDM0DNkrnjLWsEUc4UvB3RtcNqATPoWvE+0PUbhnGE1yf9OqNR9L4HrTgdjszLRNKJ\nru9ltjNaaJW+66BJvLGz9uEaVasUoteZ4UpBU4p5mriLws0M3p+hyg1rRcQtHmxJeu/GkRotnRH5\nWEqJp0+eMM8zHz3/BOcNRgVSqVhjOR4OpDQzhL0AOYzMvDVGYieA2haM0fRDx4tPbkWW3JoIxZXC\nKI2zjqurJ9BWWhbijjOWOC+0GllOB5Z1RqvHXL98ydh1TMtECD2lJHrvWeMJ66BhGEJ4GMUY00sQ\n4HlGti4L237EauiHDdZJHC3NYEfHlStCrm+Z0PWEQUTyqhlQAeUtZvOYqX3C7TFyuLvBe8/FxQXF\nWpLWaGPZbHfU2ui0wbuOoI3okd3rA0ZE7q+v0n3fY85zP60bzjmGYWS3u5CRgdbnua49E8gkvdOd\nO8bXWUwCdk4Piph5nnHeS4OSBe5Mk830OA6M45bLqyvmaWJdI6VkOqupteN0OhHTkdPpwLJIcbbW\nncEflZgip/lETiu1aVzo8NNEWuezA/DI8XhkXiPuPCstVSj8RhtqFfeQ83J4euvgPH+NecV5z+XV\npcwyOaMFjcK67h8qi6j2OiTl/8cPpRT/9b9+xFX/Dt5uyQ5iuWcMEZrjcJ/45l+/YDka9lsnp38p\nFKvIpSCjUINVme2mI3QjmoqKjsNaOcwnSaOLlTjNDL1hM3rGvqOawhqrJBfOhWUuAv+gULWCUghK\nM3aO4aLhR40OHYO+4HLzg3S2Q9dCigVnDJxPcnFFaC4vt2x3nmEXOM3w6nrioxfvcThd03WGMfTo\nJvT4YB2d9+x2O3zwpCrdo9eGYRwYepGElJwoWb5NiiKFq2XJX4mggWA6cbycN/7aSAcQzydtP/RY\nY5mWmbvbe3lxlYo1hmHo2WxGxmF4mG0dj8eHjeL3pjvGlKA1Qghnj3dmWibB4VmLbrIFfb0o8F4C\n0JoGciEtM6ZFSly4uhg5He+5vX9B73dYp3j25BHeBfb9lo8+/g7WFcYwsNtfCuyiNpSy5FpZU2Wa\nFw7LwifXB97/4GOub++JWb4G+/2ex0/f4PLJG+wvnmBVY4kzrSJ59Icb7u8+oKYTTx5dklfogkbY\nQpXdZqTkiNVGDudc2O+3gsKrhZQSwYqbZLe/QBspMGM/0Pee8fIZ48Vj2pOnKLOhxkTLneSo20Kz\nvciMjKFph1YOSuTmo+d85+/+H24Ptxxu7x6u4bVU0Ss6j3UioUI1lFUM3mOwMkP1RmakSa63nfdy\nSMT1IS/JWodzDucsrXGe47XzHDk+gJ67rqM7y7YOh8MD8b7WzLKs8pjneAitxf0UnCyRdhd7nj59\nxnZ3KVfumOWmpCrLsnB3e8vxcORwPMjV3srn2xDIOXN7e8vLly9JKbPZbNluZZmnkATS1mSL7zrp\nhH3weOdECtXAhwBnFUEuhVYboQt03eZc4KUZUKoS1zMFC0VThv/yJ3+R71ca//kgxEeFzge2fUdd\nM6d8g3GOjfU82ffMn7rk2397y2mqDIOh2zhqSOjiME1hKhh1doqgaBoh6yCnfl5W5iliUZgGHoXX\nimYsuoN1bdQSsa3KqZwbLUqspwma4iq5NS7CFbvxMY/3b3K5f8p+vKKzYvJ33uOtxxpFzHIN9MHi\ng6FSybvKm/uFT10+IpcsWDAjsNqaC50PKNvYDJszYl+uuaa91ir6c4aSzNliEgtaWiJNV7rSmNoK\niODdOoMGefyWWE8TxmhCL9rQZZk4HO6JWeIdxl5ebM77h1iI1xKSnDOnaZJFmhbi+rzMoDV9CILN\n01rI7Naizz9qqSgthb9RRXCuLaBIZaKoxrrOOF14dfOKdZ7o+w3LtDDaAE3jfeDlzQtqbVgrS6uU\nqzzXM1Vf5k6iLWy1UVOmC5a+C5S5orREGQybPdZY1vnEVCGXjA+S0ClBa5rgNwQ3QlmE4k/jcrsB\nLfTzoR+pqklUtFLCyqyiHTRao7TidDyw2V8IP1QbjPOoZTnfbJqMKvQGNiNGXwKysGhny56iUXNk\neXXN6e4gB50L2P2FJD2WfN7MB9koo2i1CB5PVWZnqakS15Xt5Z7ddk9wjqYNnCU3uciBWEsl5QXO\nxeT13FGff52LBJuFcWDcbc+EKrGc5pxoSjrMaZo4HA7c3d09LGGs9egQ2GxHfDeQcuF4f0Ab0Mgs\n/fV4oWqF6RyX/ZXcSM4jl5ST3Dy1kg6ZlZYLeV3xRrSy5pynDkriWrSVOBWQvQWadT1RaiatmeW8\nbR+Ggc1GvpbLPBNjkgYq5XMBVees9u//8c9WNH3bcbrLtOW5CJq7ws0nmv4J+ACf/oFHGAzPn9/i\nvEH5c+yqq+xtx4gGa7g/LcR5ohs7dE2oktGnBZsye2NR/ryFL5XjdMQag7Yeby1mdDhvWJaVtGSc\nh2RX3NjRjY4n+ye8ffGDvH3xKXYXe2H6WQ1O4a0sQTabDS4IJ9IqGUKXlCk1k1MieMX+SSDHldqg\nINEBSiuBV3SdbBfPL5h67mCEd/td3ZhzmhAcMWWiX86uliz5QylTS5brM5KSmJOMw5WW7Pi4RilC\nzsP5DeD77sF3W0ohnfWQ4qaQN8b17Q0pZ7quE4huEOdE04pMo2mFdQ5jxaJntEafdW+vO1SllAjN\nncNkQ7MG1SpLPKF15XQqOGfYbnag4P7uFqsbm82IUvUsp6ronBnGwOmUKCUDlvo9XfAyz0Ja8oHQ\nDbh+wzQvLGsidCOpFtZ5ZbMZ8EaWNY0sgXBnneG8TDy52pFjBGvpg5C3cl4ZN/1ZfuNxzrMuC7rz\ncjA5fxaEe7SVyAu/20O/QdmRPCW0bhBGtOlpVQvLE6gVlBbJzauX13zw4YdM6wQlM08nTtOdzPL6\nEa3V97hb5HaTUsYax/1yYlkL3amiRkNOSQomfE+scXsgQb3+Xi/Lwv39PdM0scZIN/S89dZbDJsR\n4yxxXclrZD0rEow1DMPwsF3f7/fAdztN+/pKDMynE7fLNSEEodpbKzCQWumdZQi7h+0+CAXKoCg6\nEZyHYaD14/nP6PMySyRCtTWm04lY8kMXXbKMI4a+l9exEnfh60VRjJF5nmitMc8z6yJLSmss1snz\ns/9Si2Zve7RqlHRkCA7V7cWXvESc9+xt4AfeucKFjhc3L1FaYZtiXVZSD+5iQ3/G498dFkhRoku7\nTB4LtjPUmMG0eQAAIABJREFUoqnKEquiaocLms4HNv1I3/f40KO0YskLyxSJKVN1A5vpg+fZ/tM8\nuXiT/WbDMPY0XUhkbLUscSJXi1kVpUgGuFyZemouaM15+9hByyyLZV1mbGuyMVYKdb4G6irSB+et\nZFub72ZzA2c9nAzvu+AYh16uxdMk/EFlRcQ8zdze38pGlEbXS0Lh8XiUF9w5GO615lUhOrq+7+Vq\nfZaGvC5C1lp22x2lVbq+Yxz+X+bepGeyLM3r/J3pztfM3smHcI/IqYrOLkSjVrNEQq1GqFnxXeoT\nsKL2tUbs+RT0gk2rQSWoJIvKqsoks9Ij3P0dbbjjueecXjzXLCIFFBIIZdomIjzcX39fs3vPfZ7/\nWGGM6PVe9nuJOCsr6rqhyCu0lptZJEHyNUIMhLAQhQznHPIsxXAHCldgjBBKRdGilLx3m82WcehR\nSg7FvMxWHd+yfo+JkIJgbnoWZllpwuJxrqAsWsqsJCjFOAWS8uz38t5UVc3tbie9PhaGqaeuc5Yw\n0hQ5hc0YTkeCNjRXV3g/MUynNeszl4YAl2GcJXhP7iqZdqNMuBZNVVaw3ZKymuQK3GYrlsnFk5jB\nymYBSph+FMZktO0VRfnEkiLRzxwO3/D88rRKeewq2xF2Os8zMuOIRIpM/N7ZbkueWU7dHhEQuMsU\ndy6VOz/Izoeoc46721sSawBHSrRNg9WGw+FItz+s+K3ARvJgFqZbGPSSIi/QRkuYxuIFikiJU9/L\nA9l7yrISJUP6Nq8ykYhB4JxEEv95Euy0LkvaugZlLrBCjBFFwqzSp7KssOuD89xeuoSAD5Gqqqjq\nmmLViV5+Zq3kvSlydGbXe0ykT0WW4/TvbAixJnoPPqfKKrJNS+UyhrlnmSPeaqqq5v3bjMwq9i8H\nliWyLIlhWhhiorKGMgcdCvzoJaGncTTtNdYUQo5Yh1M1xhU4aynyirKQMIMsK6Q3WwdZyxbpd344\nfiSGhev6hqou0U6zxLA6HNSao2mZpp4YZrF/kciLmk0JeZZTlIUUh/kZP0uWIwhulFKQkquQ6PoR\nSFRVCX5ZL3AB2ZVi9eAuaGNBrZKKtbLWr5IMEDYzL3NKX9P3IwuBarNBh4SfZiIwrDILCfOdRBSs\npZVzWgXMbuXtTOZothsaJdqtlBJKG8bJczqdAMhdTeZaNs3u4txZ/MwSIxE57Bfv6U8DIUiwRfKB\nyU/4JWBciXMF1mXcXr+WsrtxRqnINI0UWc4wdaAWrLLYPGNaZpRWFFlJ52eWBMZklJXc0KdpkYdp\nntFNkTQNWJMx+wWlJNxDjxPj1LFpDP1hpMlyEZv7marekOJCUZQcDnu0u5O2x2WCxRExxEzj/Uy7\n2TF0J2JCFB2ro0XXGSkvya6+ItgG/AI5glkOMwzPqDojZtfEpDBpQUnjF80XX/J3337BMhz5qz/7\ndxzHB2KeePz6nqfD1xibc321u5AuVlnqqqGtagJyUJ2hlixzvH37PUzmmP24fo9CjhVZxjSK5dI5\nIZqauqapRQealoX+cGCaPbP3KK0IIRH6k9T4xoRf2z6dM0xDj1Ia5ySVPsRAWA9VpRUuUxLfFwPH\n/UHE9SnispykzGXyzeoSvSzUZXN5mH9XWnTeXmKU+u+m3pBWXaa7hG2k9UGcX4YPpZSQv0mhjTQ0\nGONQqIsSIMaIWUX9f9Prt3ZoLnFBK4/NDCoWVLrCqIG0KI6nhRQHqrImBEXmSvIs0HUvMsGlDOcr\n0tLQ1huuq4wY9Lo2OZQrJVUFhTIGZ3K0cVhjQYmDIHPCEtZ1KxPDClQPfU8Cjv0BZcSVoIgsS7gI\n+ZVSq0wj4iexeCYSKsJiLYVzpBgIyyzZgSvZkueZiHaDpLOEEBjWbm45KBUi8ZGJKqZEiiKCzrKM\noqwvTPY0jUyT4HLLslDXNUVRURQ5TVOxhAVDoqgKMmfxy8Lce0IKAlFoI6ttWC5TkmBS9rK2GWOY\np4l5mmTiU5ZxmIgxUhQVNrOU69pujWFaA3/PjO15Gk4pMs8TQ7cnLTNKGfKspLAZdVHJzzvPpLSg\nY8QYBFLw4qBSZMwhYFxiGnuqqsH7URKudIQo4vQsd7RNQ5HXmCzn48Mzh9ORxUc2mx3vvnjDbrOh\n73u6voMAVZGRuYx5HCmcxRkLSVOVkjTfDz1KKdrtFWGWNsNpGkQGVor10DpHWVUYZ3BlQZFl2DUo\nJGnQRU1aRsKxZ3g8rY2hGcX1jG2vSTq7hJFZq0kYrLvhi9/7MU+nF477gapqsZklzwqKPFuvnZ55\nnkgxME4js19YlgljLLMf6Too8ieKsuTUHUgpkWeZEILrwdD3PVlWcjqdZHWGy8bhXEZVlRiV8OMs\nNs3ei6xodf+UZUWM/jt4oGwBXXdinuW6PV9XRVGs15ambdtviUb17bqfZdkFVz8fpHKvpQsp6b24\nmqyRa1ivv99p0FYmdgkcyQVKAiB9+3UwKCUHrXYZyWppnV0DPlD/AylH/zNfh9MjTkVad0sKOfMx\noFxiGRfSHPn0zTObNtC2DZkp2ZSGuQukEHl1/Zrr3WvyesMu22BNjlaigynyAmMLlEbSVpLIX6y1\noGRN8OvqIAeX9EVLWnPEWk1T1qsVTNaIZQmrmV9d7GXTPENKmJRYonxf+ECVZXijSXEhLdIzlOXZ\nKr1S+Dms2ZNizTPWSsuhkTCJuMo6Yowi8rbi1sA4gFU/N6EU6+Ela5ExhmHo6LpOMgE1pCUwLx1+\nWZiC/AwaefLHFPGTX8F3LeRRFCLhzHzLf8t6RQIfRkI4C38FY8ryXHzh66/F+K2j4lw/odbg2vND\nIYSIQZJ9hmmQWgilqVxJXjgWP5BiZJ685DK6XJLTrSIGYT2VAhVEwZAZS68TEHCZJS8KglJM00w/\nTPhp4XDoqKuCGBOnrictmmxXoEt3mVwkT9ThZ880B6q6YRwG8ixDJcNmc0VcEnYVfC9BbtgYI9ZZ\nlLVEpaluXxN3tySbo7oeUg8qI/jIX374OUVmuKtaYcVdSary79wZUnlMgs3NG7549yO6pwOFK1Eq\nSZV6pqW1YBIcrxvkM86yjKqqxdIYJ1lXh4G2kmSjYRhIITJ6SSoyRg7Hvu9Wd1BYlRSNaC5Xq+cw\ndixhoWkbGTwiNM2GqtIcjwf64USMyyr7yUlJrlO9ypjkwZku4vjCZes1I8RTiCJ2n+eFuo4r/qkv\nEMAZKsoy+XPnr51glXrJQzfME36Wo89PI5MThcdZ9pitzqNgFpnwo8HEGWbNWVMqldN/8+u3dmjO\nUyCoRGkUySjmaWHqRvrxBb8EZj/zsRvxc+Lu9jWmKtlsDUVW8e7mHbv2FrQmNxlKJ6zREuu/AtUp\nwcSCw3CJl7IGa40kq6yyC1Rk8eKYALAObu82aGNEgBvlaTyO4wVXSUn8yrIeKYw1+CBss589duvE\nMWIsWV6gjVi2/DIRkwR9kLToKp0jhcA8Txy7E+MwMowDbdNSqeoiJHamurgtzo4MEePL10BFEfCu\nMonMZczLjJ9mhmkErciMIXOWuOoXTQZunTq/a3ubVveE957JB/F5a0Nu5UIOIaCtpmk2NHV7kRWF\nEDiFI8t6A5+dFUI0yeQQFvGDn1e6wuVYbSizjLYueHr6CNGxq0tO/oWKjBQ8y9hhq4qqKAhLIM+E\nUQ/TgnMFmQs426MmyfkMFKAMVjt0bqW6+PM9dV1TFgXGyEOkLFrCPFO3GxSRoqqZ/TOBGT/1oGCe\nJ9qqFnmZFU2fNo4UDTGuh8PoubpuqauKJSqy7VswLWSWw4e/RqcjPnlMNAyHgU45XB1YhpGs+vY2\nlTpiLg+Zm1df8Oviz3GZY5h64hIwVuF9ICoo6hq9NmXmeS4tkSHQj5AXEv12GDr5DFCUeU6TlRdn\nz3kbODtmzhOhXTW6j4/PdN0JbRREST5rNzV5YdEm8fT4wsdP39ANJ3bba7768h1lXtKspBgK/Cwb\nzjRPdF3H4gJ1VVG3LfXaR39evc8PWuCChYIceHVdy7UGoA2ZFYkRJIJdBM+Sd3EV1cfLwQ1ctKXa\naFKEQCCayELCL15yDmKicNnfeHb9FomgDc5pMlugtbyxi5/RSTpG8BIq6k+BpZYUly9ur2nrK7b1\nTmK5UhC8hUQyCjLQWhG9BJRao1mSRitEl5bpyxt3ZohTko4Xu+IhLsukSN7KCL8sM2UpxMs4jhd5\nxrmHxmZ29UUrTl3HN58/scTIZrsR3HQeybIc1hX+PKGldT0/rxoX7EULk33qTvSD1My2bSvryGUd\nEtC77/vVoWFZwsQ0zWKxXJn1EBc04jcW94fGZTmgICWcXTMMUWi9dgBF0QE65zBbwzhLXUSWyYrc\nnXrGcaKuazabZvVcS0NvjCIFOq9Z5xtAJpbl4i1OUTqDrpqC6COb3YbSWvpTR4oJrSKzHykLwTy7\n/sC81vzqpIhKcTx2FIV0gqu157vKCoZhZhoGfFJorajrEu8DSsmNOM+zrGEuUVcbwjTJpK4NRV6y\nPx3ohw5nG0l2dw6rBWtdXIY5k01Wo9VC5uThYIzCLyN+UZR1Toi9TDA6Z/P+K8bDE/7lhW8+foMz\ngaYucbnF5AYIkIwM4knaMaOWKpa8bAjW0r/sCSmwPzwTg5Aq2+0V1ze3sIZshBDo+46UEnVZ4ceJ\n/ngi2+4omxpbS6CH2B4lQrBpGm5uJPT4fA2KvEmz2Wx49eoV0zSITzzB1dU1VV0SwsLsPVXdsNle\nM82B47Hn06cHrq+ueHV3R71piSlRpMQ0jpKb6ztIMiUGoCqr3/CrT9N0aQ09r+TnCfOynodlleEN\nxBjIs1xS+6MoR2QTU6uMz2Dtmv4UemIUPagxFqs1uRFJol88AZlcx3WA+q+9fmuH5tWmZOo9MSwM\nhw5jwE8LyinyvMItmsXmuNQQBrBVw1V9x6bOsZmkqYdF8MHMalH0L4F4PpBSXHG7sKYxi9XrPK6f\nZTaSr6jJMrOu3oLJ+CVAEv+rXV0SRZbz+eH+kuSiyXHGkjvHvHhM7ng+inSjrCqxfeVyMAlzZ1as\nUA58s7KBXd9jnKXJCsLK9AlQnqjq+nIhLWGhLAu0MnTdSSRHrpAkmjBLZmDiAp6b8wQZpAoEJd59\nrQTrVYq18iH/jZCFFAJ1UYhAvGlWYfTMYerxheCnu6tbqqoGIn6Z6PsRP01oLe4TQBhz1CWsoZ9n\nLJEYFEVeQ0pcX2+x1jDME85qJj9ztWvx84DLNNMYGYYJZw3TNK6NjoIpS6yXIsQIEYzWlNYxjjOn\n3uOniW4c8CESl8DQd8QUCT7w5Rc7UqhFHpOL373relymyLKckBJd3+Gt43Z3Rbc/kpU5S0oYgqRN\nBU+7uZJA3wh1VWOyGrQ4gcKi8IcnPBkuA11Zrq5b/vwnf8qmbvDza8oUSGsaE8iEuQx7VLklJWF4\nv/zRj/j4lwv744GUIqdjx+k0kJLGaEtdlJTOUWy2PGnF4+MTY9cT5gU/TizlTGa27DYbrLMSkhOj\nsNbzTNvUVFV9WdG11mtAh+bqakeMLafTEaUUd3d34iJaFvq+o65O5HlJ07Q8PT3z+PTC5/vPfHp6\n4Pbujqvtlm2zo212tM32ou8U0tBzCke01pdUJqXTSiiZ1RyRo/X5wZ/our1wEVXNHAPBB/GwG4X3\nC113YpommqbBGHtJdYor6bksC/Mc1nskUXgJGZnGEW3MxXb5N71+e8VqemZUPYtfyJaAmjXJTDgN\nRhtsUZLbK7K8pCwKCmtxdiZgCLOsEiHKSqqdQa+xVj5FjDMQICTBmvLcYa1MQpAuIl05MLlMmSEE\n5nmUcf68hi/yBmuV8F6qgeOqlVu0WlnjtDohMkyDaB+NxFHJhybd203TMI6eGPuL5kwpWLynO504\ncE65VhR5ToiR0U/MYcFpg8NyOp4wWpo6i3ydGgHWEAaRDpkL5ikXi8DcahU653l2cYGM47hitiv5\nFANZlvO83xNDpCpFdTBNE0HJBK9NRuaKlRyTG+ywfwECmSvQOjEMo4ivh55plp75dnOFigtFkVNm\niV2dEUbP4gdcXkBYeP/2C+KS8L6XzMruAwQoXcWSojixnEaz4JcRl9cYrVAssOLaPniGceI4zvTd\nRAiCi0nO5ExhDJlVZIUjq1ucjnT7e3Z1ydPjC29fv5Y8xqComwpjDXld0U8T280Oo5xYYo1hmEbK\npqZsasYp8ub1DVy/JaQM5XLy3Zb+4RP3nz6TOcvbt2/59//u33P/8sj7sUO/PNOWLcnWItVWwGJQ\npxdSs0OpjPdffJ8Pv/hLDv2Rtm6piw3jPOD9zNPzJ47OkdmKmzu1TtQRYxXbqw3zMnE47tlebZn8\nSIhrkWBcUAmU1pAEHkopSVp7lq+Qll7rj4cVzrIcDge6rl8Dhguurm/ZXd8RCPRdz/PzE49PD3g/\niYzHOGIA0LRtQ55XpKSYppE8zy4yojPeWOQNqhCrslRcGLxfmKYJBeKcI7IgZo5+HgnzWc0i4Sze\nL2v0nVrdTIEQ4noGCHzRdd0lA/RM6PW9pD45+12M+T9//faIoP7E5AdKlwguooJCe09MkTLfosoC\nYwrx1TpxgsxhIU6TlCKtk1GWief0zGivDiohWLQiz865ghHvJ2G8/bcHyiUVfF1pl0WyFe2Ke6Yk\n2OHxuK7Sw4DLheE7O3bM2nuTZr+ub7IizPM5czBcJlxJwvYXllBrzTCMeC/+2YD0dmfWiSc4QZFn\nFEWJ0eYC2iv4DiOZ0XWdgOyrpSyEFaNdGVH5uycRDxsJgvV+XqUZkl0ZY2LoJ2IKl/W6Gwb6oWee\nPdZpbF7gssTsZwhyYE/jyDxNdP2RTbtjWcIK7HuOxzVFJ8u4u7kis5aizNg2FXVVCFZaiF729PyJ\nw8Mv8YcDc9IoNG2bM55GbL6h84noJ2LI0MqKgN8EXJ6TxwI7RwKzWFo1FFlO7qR21/tZxP6xoMoM\nbdtgtcUoxTwsbOqa0+FAWTl89EzTgM4MHgW2QmtEZRE1KnMkrcmaAqst4xy4zgTP9OOIRaP1DSF6\ndJrFapkUx+7Ept3xB3/wd3h8/JquHzD5iDsdKHclKhkUAW0d3edPVDZHlY6sqrE2x08Tg19IC1zd\n7mStNdB1HafTI58eP1EWJXmWUazGhbquUEpRVZIxMPtZ7voUZejQjmEYOBwOxBi4vZWKFdHjiuPn\nPH1qLeLw4/FZtJ13t/JwTlKS5rRm27SUucXPM9Za2rZBK/F+T9MorbJ8S8qcmwMuye7WYZ04dM6u\nIMlFVThrYSUV1QrjOKVJRki/ZTVhxDhwOBzXjZL1vg5r3qdZN8V2Jak6nh73DGMPCGRF+TvKnqcR\nESMrUM6RaRiGCR8WlrGndRtslmNNgbGOkAIsGkXAGntxCACXD/XsASclafjLS6rvaL2ka8Rc1g9Y\nQ0xXMa0EBujL106KNQ1mIS5hxSSFlT9HZpWlxPwvK5bitEy9uctIiouo9ltWWUrIziSJfF8SbWat\nJcQomG4EqzWFzSgr+Tnm4HGupa7ri697s9lewHytRdtaFPmqC12ra5dFLs7VSdL3PcMgWOU0DAzO\nkWVigVuWxPEkSfBFWTLNM9o5cmsIfmJZFvwsaeDGKDSKvpcAhU8fP6NwZJlnWWaOpwPzMlJXFUVu\nicFzc3eDtYZlCey7EaXhi3bL9faaN6/f8Xh/x/7+gWo+kcaJ/f091bZk9F6G6lkMAWfLqSYxLjPa\nZGA9arUY1k1NTYExUltytqEGP1KXGVVZsGtaupdnmrZlmjqKssT7yH4/EKKmrHLy8gadXVFVt6Ak\neYswsIye/bFn2265vrphnALl1pJttlJ9y4RCM+/vUVNiu71iel6Y55EYpJ/o6fEJbMb27g1EL3AS\nkIzm9HykMAfM+w1oQ1ltyMuS3S4j+cSyPtjyvODrD595fPqGGBM313fc3t7y+PxMW0vL5zzP7Pey\n1nrvwUDbtiglXUDO5uvDe8D7wPF4vMh+nHPUdU2MC13XARITmWXiXX+8f+DTpw+yTWWObdPy1Vdf\n0r55K06j05HD8WF1Ckkk33czCaZpRmu7CtVzyjKnH06rFCojhcg0+TU1aQ2YDpEUSoGB1jXf+4Bz\nUmqntWKzqfF+4vNniaIry5K2bVeyaebx8ZFxnHDOrvDCZiWa3O+uTtPEDOMVKCNd5EoKtJZFoW0F\nWYHLLc4K0aC11HpecDrkzUerywFkrcUqIYOKoqCupaojBE9KiAsok1FcyIkkuHtiDSYoiFFWORGP\ne0L4NhzgzOD5daJVSuHHia7vGY4dmRNMtClKiqJgipIeY1dbodZKAlFXUbDRTjInnUWv/dAoRVrF\nvKz4Y4wLXX+6iG/zLMO6HGsN4yhavaqStUowWfEYS32tiHeXlYW3VtjgruuwmSMsnvG059T1LEvE\nZmIPtNay3W5/QzOX55Ksk+LMNIm+b5omZu9ZQkClwOnwJAfz0JOSNP0p4yQY1hpO/YncOUyW0TQb\nrLYsQfHwsse5QFbUXL91vHaa0/FAXjfsXx4Zu0dC6DExoDOJnlviggkGFmljTCEJfItDkeOTxypH\nDJL8bZyE8laZo6xyen9iAQ7Hg0yJGspNw7a9JUYYl4mb2zt22yva2zuBd1JCDSOLn2jaLVpBmgeK\njdRzLLYQh5fWpARZvaUfn3Am4/bqmsPhhcEPzPPCz3/+CxSK7//+75O0k68NLENPvWsgh6QCCsgt\n/PD9V8zeczoeOXQHpmmgqSt+9L0vsSry+PyAXyZAc3V1g9FCvC0xrA9qgUaSMliTA4nuNFKW0LZb\nrnb1mskpwSBVVZDnJUopjsc9XX9gHCeuru4oipJhGJn8gnEWF6V2YkmBj/cPlE3D7etXzEHkXt1p\nWLFKt96TgaKQa9b7hXEcOBxeqJucsfekGKlva5Q2pCIxDiOPT0e60wltNWVers2ZjmmaqesaEDIu\nxPFyXy9eMMrDfuR4eEFrzaHr6LueLHe4cofNc0ku8zMYTZP/jq7n169v8VNkGkeiTwyLx6sBHcRW\nZs25qyOuU1Ip4vXsnA+YrSkt7nJTn2/wlL4jDVq+c0iZ6mL9OjtYRK8JWtnV52xpmoYQI6dOBL/S\nsLdcIIGzjCHpRNAiV9puWvJM8J8lSHXo9fZaLtKUmGbP6XhAK2Es86ykbRpJYylyAqITDCs84MMC\nIaDVWZs5X1b9GCPTNNB1i4Dn68SrteF06pimiboqGMZBNG3GMPtZ+sankaEfsCv7b5xcAn6eVjxH\nft6z/XKz2aCUtA6e8VMFDONpxTRXPawPjOPE6fiMso5p8VxVLTEEnl+eKd+8Is8ykYFUjt3VNWVV\nUxWVuFNmzzCd6PYPnA5PEEautjt+8O57DO+/Ii2a//ThF8TjC/M8UBYFyzzQjyNLWr83ZQlrMM3p\ndKTcVORFQYqRXFUoq8iNwSlDSgshKRIZ9W4DStFsdnz1/d8nRkVV1fT9kdevXrPZ7uSzAsZhZPHS\nVomC2jn8KORDkWmMyUg6kdSEMRuGx4+kceLr0wOzX7hqS5bVgRWXSFVXzLOnRLIG5tOe51/+Bdu2\nwm4qYZpVYNuUlOYGH0fKMqOdpRRPA3nm+FvF3+Lnv7B8un/k+fmB7XZLntfEGKiKkjyXNVyj6XyP\nTopm2+C0Y1p7hGT6i4Q4k+ctLjP4ZeCwP/L49CAxcC6jyItLy+XpdKTdbMgyx+l0knzL4+kCB4ht\n1zJ0vRSs5Rlx7VgaZ4VZZpZl4nQ6CEz1QaIIt1c7bGkoixLWskDnMvK8pG7KNekrokIU6G6Wa1v+\nTrvKCAPWZWLVVIa2btBGcX3zCpc7zJpBavMMozUhCsxQFL+jh+btF28osoKnw4n7j585PA1inTMZ\ntXOitUSBVpRlQdPWWJPjMnVJoAYuZv8zmaNUuuiyzuvH+d/PLpUzYXLGGF1WkBc5i5/x80yWFeRG\nrViIsLQ2Ly4+2XEYGIee66trEQMXcmANg3xogx9YDp7MKqyCpC3d6cTz8wtfvntLXVXkRUnbbDge\nj2RFQZY7lJak6a7vpZaBCEmmzvOheT70x3lmGAaaprlINc42TWM0p+6E956Hhwe0MXTTwDgMWG0w\nSuOXBd+dVhVBlCoKl6NJGCsuisPhcCGszsnd54fUsixM034lnOB4OrDfH3h8fKSpa3RuMVGRVSW3\nuxs2my1ZkbFta3a7G6pmR1GWGCX95C5z+JAzY3DGsn/uUcuCWvbUu3coVfLV997xfN+ilUiI5smj\nD88s9585hYVpWfAexmmW6LbZc4onMSNME0VdUDStuE8Kmdqb4payraiqkvfv39O0Ow7HA8vKwFq7\nXmtKrrslLmirxGmVF1BvMCiKyRPTQAgDOiSUySHNBDxZ2XJX1fzk3/xb/NzS9z37/Z6rZkOe5/ix\no1x6lMk4PN8L4280b5XDKo1KnqvrLb/65SPT2K2rbCl/1ntUSmy3G7Kywv3VL3h6+sinTz273Q0x\nBjZNQ5ZZ6rrmuD/il4XH+ZFpmWSbsIa+P7E/CN44jtJL3zTthTQ5HjsUllevdmts2+OKIeZkueCm\n0zRR1xUhRP7kT/6EP/3TP+XHP/4x0+zpxp4iL4h9T4wzeZ5d/h5JaNe0zQ0xCRmaVTmH08Tj05FN\nXVJVFW1b0TQVXXciRqjrnM2mxdiceJZbxcg4S47mVbMVuWCKLOtkq5VaO+DNqj6R7M5IosxzMZro\n39H1XCmDczk3NyUQ0FnkeFAEH7E6J6LJy5zd5opms6XZNOTrSnp2qyzf0VOF4MkywS+/i/mdRbtn\nnPIcTHHWgInk50heOPIiByVumRDkSSZhxoFc2YuXGkRcneKCHwdZ0+O0Jr60zPNI13e87F94fHkG\nlRj6kbKocHm5WiYTrnBUqabrexILeV7Q1jVxmXl4eJQbNSvIigKz2slUFAD/bJ2c5/miH1XKsN1u\nsVYzjsI4ZllGUorKVGItMxY/ewY/oUlkRhK5+yUyDEeybOLq+oZN26JJJKU5nU6Xaf6svRzGQdjK\nUf6LLWYlAAAgAElEQVTex+dH9t2Rp+cXulNHXhTYt2+otwVX11dc7XZCQOUFxlqsSVS5BNs27ZaY\nFK4UVn3MwcQFtZwYDs8Mx4GivmbRkbjk6GILNuLMQomimwbSwwt+karaFCMPj5+wx4If/eAHl/Vc\no1j8zDAPlM0NeVniikxcTVkOSjP0A8EvzCHgQyIc9lSbjYRIjKO0hxqHcQU6q0jWkrRDZS1qGVB6\nQesKEPIjb24ZP3/i48NHvDb8xV/8nM/396QFfBE49Cc2w8j8/Mi8eA4PnxiXhTSOPPz6F+yu3+CH\nPb4/cjj0EjOnxBhxtuFaZ9iUW66tRanv86tfOT5//rhKdfI1/s1TlusDMATGeeZl/0K9afneF1/g\n/czxuGcYOmL0zLPn/v4TXdfTdT3eB65217zs7/n6m18SI7y6e8ubN29Y/MTj0yOn0wHnpNI4z3NO\npxN/+pOfiHTKWdqqxqCwTkNYyLIKm+cUdbtWZGjyvOTq6gprHX3fryVv35JFz8/PWFtRNzkQ6YaZ\nrLAUNqNtM1giWbkQl0hW5NLSmTkSCa3MCi8FhtXtpKORBCStUTERU2T5b2iOfntEECXeG3Kn2VXX\nGBzzkMCBI2e33XF7fcP17jW77YaiynBOHB7nKfNcFTqvnuez1quu68t0dsZQzj7Yc9/JOS2nKKTD\nZp7nNSDArL0yE33X4WfJGYwhMa9C7127ZZwGrHPc3tzIwTVJEnSWiYD4ZneLyRzH7shf//WvCDGi\njOXj/Wc2VcGXX30PgHfvvyCEwK9+/Us+3X/kkOUoJG1GaU3V1CTiRQTfdT1aq8vPcy7SynPBrE6n\nwwWOOE/ZMSUqJ1FZcQmkCjI/s/hAXdcEv1A3JcfjccV2Bcaoqopp9pfAYRAm0ntPdxrI85xpnOjH\ngY+fvuHjxw88Pwhb3jQbumGmaXbcXr+T99UPhJTT9x1h8fh55vr6GpcLARaOnqurW+Yiw6RI/+J5\n+viRcd7zVXVDCIldozF5ZAolKRNFRGYbrOlYgidFD1EIDJc5SQxfN4+4RGydUVUtZV3LgzfEi99e\n4sImqcXNHE1TrVCIhF/0/cD13Q1125JcQTQWyTQya15mJcFF0YCW4GVtMvy8sH945Pj4wsPXT0yn\nWeqf/cKnrx+wtuB0OrI/nHh5fqRwjrhpef7FZ54//CeywnA49Rhtubq55tgdmH2gbVuOxyMpKZ6f\nn8St07a8e/fFKsEZaZqKupRJLYRAls3cvXmDyzJeDns+P9zz/ov3tM12TVAf8T6QkmaaPMMwApqq\nkoHl5WV/SYoqy5LNZosxihjF5eX9xDDMNI0EbvR9j1v7fbz3LGFhiZolaMl1tTlX17dkWcbxKH71\nh4cHlFK8evWKqqp4eXlcZXuSYVpWFU1VMS+yyjvn1i3KsqkacqtghY1iCMyT3D/F6oTqlxHnrGQQ\nnE7UZUVd1+R5Ljbk/0Yu+2/t0AxpISKgeZFXWFUS3xZM/YlaVby5e82ruy9oipq8EEYanyBPl7gr\n1oiqM3N+tvJ1XXfxp54tYdLaV14sW8B6EUly+tlNsXgpp1rWN9yt2KpKkXkQkWy9tby+vcNZtx5u\n8gEPw8DD4yPv33/Fm7tXUkZvv+TVq9c8PT0xzJ77h88kXbLZbkgxsd/vGaeBh4fPgjkaReYKwHA6\nndgfXyTZPROc5RzY0TTNd6AGuaG/G+R6tn5m1jJ7z9j1qAQYOYjbrCYlzdiPnDpJuznfCCmxlmFJ\nx1CxrjIXC6XWXF1dMa0Ppbws0MawaVv2N0JSkBJN3bDEiePpEaVE8L4sHhY4HY9U1bhiX0qmmWmi\ndBZlSurtDj8e+PXHT2TFDbbaoSyyEptIlVXERRN9pCsjKd2vm4NnXiJFWWKz7BKUa4zh1d0rnJMY\nM6Mcr17dkGc5Smu600BTx7MLlTwX1Ua2BleUVS3/zCrCojDOkDAoVZEQuCAlSbVHF4A4epIzfNg/\n8f/+2/+PD998IKCJfqQuSmY/cBr2fHr6mqou2DQ1db2lbAQuaOoaP0387K//gk/ffObv/Ph/pe8l\niKZpNlxdXVMUBT/7iz9fRd0DTdNye/uat29fs9+/YIzhZb8X4s9avvjiC169fo1fAtoaxmXhl7/8\nFdYYnLPU1Q6tBfcOiyZGzTh2PD4+StRaVWDXPM2UEsfjYb0XDX5OzD6gtSXPhRG/3l1T5jVFVZGX\nBdPipWFg9my312SZoyqrS16rQFzfJg8NQ8fT88PFw+6co2l3XO+uuHr9BaeXPX/585+hSbRNy+Hl\nhbZpycqC4CUYORAxxooJZjkHWK/KGaSl4BwbR0qc1nrj/9rrt3Zo3t8/sGkmRruKzzG0141UQsSG\nXXvDtmkotCUCfpRwglIlZtZCpzVXkRDxa4rJsiwoo4khUq/OlHPIhjFu9UBbskyCMJTSoq1MC2kJ\n4EXCEpcAfrm4hwCqoiTGhDUZuStYQqAbeqq8FDfOSshkmcUVEiwQxgmrNTdXUk5XOccw9Nx/vuf2\nassSPC+Pj8z9RLbKOwCU8gyjIgTNPC8CboeFLJfq3yWIHVBSXixl5ZjnhXx195wTZMqy4unpiaKU\nySMlOB06rBV87qwiyPNMCLAQmfyCKwumcea0P2KMpWkqxphEYO69YHda46yWpKNXd1xvNyxfLKtJ\nQDJGq7IUW+QkkpAQ5b3U2nDqO0IUIXzhMtQKxGtt0NuWvN+RFa/44d/+3zDlTpLZ2walZNKeiUSX\noQqLBzSWmAL9OEiuwBLopxlrxVgQ47zqV8WWmzl5EDlrOa4Gg3zTYLFYZRiGgWzNHd1sr6QzaehZ\nlomca3S5Idll7UDSoC1nhV+CNagEfvQH/zv/6ee/4jQOtE0tU/cyMQ4dJlP0/Yk8y9nubri9ueUc\n5qu1JS8L6sctX35ZUa5OnKquIEV+/eGXQpLmJWFJtM2WLMvoTh1FUXFzcydSo6IQm2nV8vbNe77+\n5gP3j4/c3d7yvbfvOBz2F8hrGAbpVHp3zevXr3l4eOSbbz6SuQ7nrEz722vubl9dwjPOYRq3t6+p\n65qqKlf5kl8HHHNJOPLe03Un3Natw4oEs3x4/MA0DRgDr169pmkaGWJmj06ah8+P2Czj/Zc/4G53\nR9k2GOeot81ls+ymkeADjAPVGqtY6vKSraCNYVomdNBkuRB2LneMU8fz45MMNGnC9/8DbZT/M1+/\n/tUHmjpDZZYyL6jKkqooyLSjqm/RFgkpjp558sR1/XaZ/U6auWiqtDWYFEkhkrmMMs8l629Vult3\nnhYDmdMoDGktcwshMg+C26QkB3BcPOM8SYHbGk+V5zm3t7frwRLYv+zp+452u6GwGeM4UlQlN19+\neak0PtvSxnHk4eFhLbOqMKZmGgY+r/0q4zhSlRLndr7Y4FtJlbgwugvpdXZInH/+cxqMnwO6lYi8\ntt3S9z3eL7jVH332rc+zZBNaZ3nz5i0g/eJCei1opfGTQBhXV7sLC5pXMoV2XUffC9t6PnSLorh8\n3+ccRFSJ0VZY+FamfT/NaGfxi6fdNChk4o+sh6VWGKvJ7RV9deQP/u7/waQMZbtBWYXSGWVRofTA\ndDqt33Mizxv6IfD80l1i82JMKxar6fuB4/GItQLhVGugsjESfgFwGnpcnZM7R54bCu1gncBimFkW\nRVoWMpOhokYKdQORhcXPZKYkGSUh08ikJOk+G/7P/+v/5u2rK37603+HsYbr7Fp0kJmlKmtubm7X\nJPSSw+GF4/F4iUu72l5T1xXGaKbZo5VmGEWQvt/v2bTXK+Qkh1TbtlRlKY4aIh8/9WilKeuKx+dH\nbK7ZXskWMA/xAvecw6oBHh+fmaYB0Lx69YpxnMgykQVuNpsVd5TjQ1Lly4uape+7i5nj7LRLKXE6\nyQR37j4XJ5D0FMUkxpKX/QvHriOzlqauiSHyV3/1V2RZxve/9z22Vxv6sWcYOlh10K+ubjl2B+7v\nH9i/vNDnZ9jKrCYSe7FRyv3rmWfhIEC63vcvjyRlJfvgdzWEeH88Mc2iQSNIjG/b5Hz55gdE84qX\npyd0DNRFBepb50BdVaJnRMI2Fu/JraMtC+k39h5rDFldSTXEPF1shHrtdRbyZLhE5KdVxmNWvLTM\nC7nZMs1ut7vIm25ubnDO8eHrD8zBU9QVZZXTHU7c3N5we3vLw8MDnz59wlnL/f092VoS9e7de4wx\n3N/fr/F0E3lmKcpC+kvSt7UN5ylRGSFhznCEtZaqqhnHkTybmP18CWfV2pDl2XphavHTTtMlmV0c\nPmnFRIUQOHXdhXk/43bLEvh0/0jbtmw3rUxhxz3GODJbgIKizDBWoddE7XntlT7fKMMwrCYCdZF8\nnQ/9LMvwSSo/vPegFJlzPD0+sWlb+To2IyxQb2+ZZoULkWgUS4gok+gmcVAtYSEsC8M4EJWlGxf2\nh46uFwunwDBiebXW8fLygtbuO5mNEa3lgPzVr555/fYNGsU8e2bnycqC3Dlub28pXM43H37Nq1ev\nsFVNyguCtuhkUWnGkljmIyrP0bpcxVmyyQTv+cu/+DPmZWK33RFTZJonbm9uL9iftW69iRXb7U7M\nA9rQHY9kdg3sjoq5H3jqj4yr26wsK3G+5Tmn0/Hi4ImLvDcxRNp2Szf03D/c83R4pMxzkZut3u5z\nXsHNzc3l2pOHsagHzBpLaKylyHOqqryQqPMsB/X5ofndjNdL1cmykGVO+n6MkaSjxfPpc4fWSmSH\nMbHbXTFOE4fjI6fF8/z8QJFJJuayBP7sz/4jP/Q/4u76ltNpz+H5hbKsKeoKZwwWRZ45lEo8PT1y\nf/9A359omoa2bWnblqcnh1KGzWazev6lffLNmx+Q5zKV+rj8F06sb1+/tUMzTp7oEqV2LICfF44v\nPeE24pXnef+AX2bu7u5oqwbjDNoq1BpSEFPA++VCWFT5ObjiW7wyLAvjMBBmKas/J8HM87eHTYzL\nmh5UsiyR56cnttutTK1VQZ6L62IYBu7v7+WA8UK01GVF6XJCLvjfsizs93uO+z3v3r1DAc9Pj/Rj\nj3WaqqrWsFa5AH0MTMcjLpPDuluxRa01TV2vpU8JZw2PDwL03968wmhL22zWFKRpFSHnjOPEp0+f\neX5+pq4ltm0YJo7HDpd7hmGgO57ouo43b94wjxOHNT6r7wf2LzIJhKVj/zwyDSdcVjL7QAhHUIrd\nVmpJhn68HPLnGLGzjEOcHhNdf6IsKspyxNiMdp34UcJi+7Xcarfd8vXXXzMOA+/fv6O2goe5rES7\ngnaT0w8Dv/jFL/nxj/8XdNSXz88vC90wsz88S8p9DGuOPr8RzuL9zPF05Pvf/6GErxQFIUWeXp65\n2u1YYpAwZW0ZhxG9zfnw4QNX2x13r19jrq/45k/+hKrOuaozlNuArlEklrEnxp6suiElK7imAtZl\n/bR/xk8vDHMvkJFWtHrL8bBnHEf+3t/7eyil0Vrx8rJH0v2hH0aWxXM8dvTDns2mpa52GJuhF79i\nc4oQFowRn/iZBBzXg+v29pab3Ya//cVb/uOf/5Rjd2QaF6Zhkv4nH3jz5s3qmCmwVrHf79e+c4GL\nlBLr7bHvsNrwZfkeQDDecg2RXhsGnHMiL8vkIXU4HJimidPpRFmKGaIfB5pGjCfjMKOSyNuGoefN\nmy949+Y14zjwk5/8hIfPz6T1QZc7xy9/8SuOTy8ENRPnyDB5nv/6F9zdvYIgfEc/dMzzxPX1Ne/e\nvUcptfIC2SUrFmRj894zTmInPnvp+R9xBI3jyD/4B/9AXB/zzD/5J/+EP/qjP+Kf/tN/yj//5/+c\nu7s7AP7ZP/tn/ON//I8B+KM/+iP+xb/4Fxhj+OM//mP+0T/6R//Fr711mrKwuCJn6AaMsWzaKyqX\nEyaxsXn/LIxgVYuX1lqWMBMneRKcw3q994zr0yuFQHc8Mq3s+TRNK3Ypk+l5tT8HG1xf3VDkBVlZ\nrFpISTmXJ+S8kkPzWoCmLqvnmW0V3+8J75dLK19elnz6/HmdAIWgenp64v7zPfMc1sNGQhXOhNVZ\noH6OwBI8LefVKwmPuLm5pShyhkH8u0rpdT17YbPdcrXbkWU5N9evKIpa6n/XiLePnz6JBU4rXOb4\nYvvF6sO1F6PAm6YhIgkz83THOApB9Pj0dLF4mtWOejgcLqVa54MzrK2G3yXmmqYlc7LCo8xlXSIo\nxnFgHAdubmTyff/+PX/5Zz8jRiHy8jzj3NEdY2C32eKMY/+yX22PE1M/4OeZcZrZn07s93vJN13r\nD7RWFzIwxsD33nzJZtNeDvTT+tm1bcvt7a0c9uNEkeckIl9//TWvX7+GmIjHE2VVULcbIk6cQHRA\nJg9BJV09KCWw0OWV+PjNB/Yvz0zLjO8n2m1LW1WMQ09d17y8vFDXzSV/IMZA3w9SgUIJaG5vb9bM\nR3kQvLp7cwmdUEq2haIoePv27cXkMIwDc4h87/aGjx++4fF5j19mdu2W7//w9/iBgo8fP7IsC5vN\nhjdv3lw2quPxxDgOa2NnxGWKq2shnmJKxJU/cM5dAmnOao55ni+xh+dfy/NixdQThXXsH17QCsq6\nBqUvyUn/4T/8e1KSMPG62XB995ppUdRVvUICmrE/8vL8hLKJrNjwt7/8PkqLPLDveqyzvH4t70MM\nCevMeg5IWZ84D2UzatsW6/K1PG8hKng5Pv/3H5pFUfCv/tW/oqpEgvL3//7f51//63+NUoo//MM/\n5A//8A9/4/f/9Kc/5V/+y3/JT3/6Uz58+MA//If/kJ/97GcXnOS7rzc/ekvegDGOeUqM0wiqZEgL\n0zwzLwmtLNM4ixxlWSSS30BKatWDWbS2DOPAab9nXDxLiujIhQwBVmY9XjCXb+1b4mm11uGsHFbb\n7Xb1Zce13znhsgzvA09Pn/m93/t9irygH3oOhwNlVnBADq8YE2VZSBJLWBjGkc2mZbvdroeLoqqy\ni9wJIpvNBq0Vx6P4bZumYZ5nPn/+TJ4X5FnB1dUVV1c7jsfjJWjEGFa/uGPsRn59+oaskPqIZQ4c\n/AmXOeZpYrvdrO2AmnHomceJcVoL1Yzl7u7uEq2lV51qDIHD4UCzaTgeO8ZpYleVon2rK6zRssau\nDPrGbSTCbmXxf6P50Gpenp5JUfCsQiv68URbNSyL5/l5L2RNW7N/OdBuRB4jSeAFz4cnUJof/ugH\nfPPNRxLQHY90vYiuHx4+8+HD1+wPB0DjjMVmmbR+rnmikrLTMk0yifXDwDB2fPXVe0CtUWJmfU8M\nQ9dTFDmbdovRBlxGXZfkRUVwBUnFy0SLUszDTFGumZiSvS7/PyW+/8Pv8x/+zf/Dp4dPfPn+e7KS\nVzXvq3KtghBNYoiBzWZLdxpXaCNQ5Bk3t3cUecniPc8vj8QI87yg0KClkgQFxlg+fPhAWdacTife\nvXtHXpR8/eEj33z8wNu3b8iLDIJe8dKM6+sbwiITq9GGxZ+j+ypOxx6FpW4l5tBHCZeeh7VqIsbf\ncKqdpX9nmZ8Et0yrplqMH8fjkVPXX/Jhn08dh8OB3Xa7Sqa2lEWDMiBd6ye2t6/Z7bY8PT5xtd2x\nBENQRqbL6Ng2t1inuX/8mru7W1K6FeXJy4GmbJnDxOl4RGnDZiNe/M2mvUBeZwWKGEQSN9ur//5D\nE6QnmP+/vTONsfQq7/zv3de719a1uKvc7sXddrqbWJiJNCLBMv4QcDKDlAmMDBJBIyHlQyIURXwg\n0XyIDYlQFCJFijSJBJmJYBSNFESACRqwcGRmIKaB2J0Eu6nGtXUtd7/vvpz5cN57bSdgjYPcnrTv\n/5O7qlz3PVW3nnPO8/wXmO0erZb8hj+Ky/SXf/mXvPe978UwDDY3N7nnnnv45je/ydve9rZ/9rWL\nW4tQCtJcIKwCPXLRCw1TMUizDFWzcXQDDUEax0SViqfUpxJISRGaTELyvJhRf1zXkxPP6sQx3bnz\nPJ2djmSPUNpGaYpGHGfs7r9Io9nCUA10XcMw7KpQTXBdj8XFJRYXF+U1MoxI04h6q06Sg6opqJpM\nYQZkVo6qIHQVNA3XsaTyyFBknEWW0Gw0MAz5S0vTHFDodDo4jgz08jyHNMkwNJkfs7e7S6/fl62D\nsqRZ8zF0Dcdz0XSdIs3Jk5SQiKN+j3ASsLqyjOM4LC0tSR/GyYRIFGiGSrPVlAFbtoWmKRwfH7K2\nvibDqLKCNEmhLKXSqlQwVZnWs7KwSFCpjWzdhKLErsxLdEXFNS1UTSWKYylzw0JRwbJ0+qMuYTLB\nUBWKPGdpeZnWJEAzjjE0CJIx/fEQzVpHrVQdUmig0OsOqNV9gjTi5s2bmJrN4fEtgijk75+7zuHh\nPmmWUhY5mqljWtJkNsvLyqZMYzRMWFz0yIocVQgc28Vzahz3jlE1DcPUSdKI0jChOnWXoiArMyxd\nQzdN0iLG0CxIUhRNA8UAU0X3bMpogrAtNLWOIgqEokGZIKIJrfYCt05u4Xk2/d4J0WSCaeqoik6k\nV3+8qo7wXRRF4PsuigppGmNpWjWE0cny2ox/W1SeqVJmbGG7tjwhRhFbd22ioFAIwd7uHqe37iaK\nYxp+YxZp8o//+A84jixUmia9D+qNBoICTVdZXOrMNvJOpyNFDoDnurPe6VQpNhoNXxFNkef5zBRm\nyhmeDmNazSaWbeF5/ks867KkLIvq5qXTaNQpy5JGvY6uWHi6Q211TQ5KhYpheAwnI6I4JAhPKPKc\n5559FkVR2Ni8G89xEWXBsD+k3mphWVL22e+NKMqEXq+H53kcHh4SRBMajQau69BudzBN45/Vq9dU\nNMuy5C1veQs3btzgwx/+MJcuXeIv/uIv+MM//EM+85nP8MADD/DJT36SZrPJ/v7+Kwrk+vo6e3t7\nP/obFwplWmCqKkqpkedQMxyMUpN5OQDVtS+O5S7l1XyKQiEIEuI4qBrOBaKUsjbPdWchTi+3zIdy\nxtecksKnV2tDN9BUDdev0e33MVA5dWoVVZX8LTllVRkMhhwdHRKEkbyOmRpZJk/Bg8EQ3/VRFaSP\npBC4nosqZG9JKnxOZn0VebIcyZ04ilFUBcsyZ30fyRkNKXJBkkykebCi4tebmI6DgiApCkRO5QSl\noZYKlqYjNDi1uMzIkiRkqYgSM+9Cmb8iLcN0VUU3DZI4ZnNrc0Y7qdXrpGmGaTu0SsHaqmzV9AcD\nut2TKsTNJo5iGna98izMZ7u3HATJDawsBGVekFJgmToH+wcMqudKspQkTVjsdKh7HoZpsvPijnxt\nw3wp4EqBLEsZjV2G/Yh+f0KR9tjZf5GbOy8SBmMMS3qT6qaL0JDZ1aWCaWsomo1pGNRrPmE0YTwe\noGoqnuszGA2J0gyBDJBrN5uYpjFjGARV4JiuG/iOx8lxj1auoikCVGlCoqgm6ThCVwuyCXgLDqgG\neTpCIyLJQu4+fZrhZECWFdTqTRm4Z+g4tidpcFUkbxznNOpt0jyVw47RkDwfYJ9InqTvS8ZBXhb4\njoxDcVyXRr1eOfbYjMdjklSuJ8tLTp8+XWWlK2TpVEWncPXqW6Q8UpV2hMdHR+R5Vskk+7iuR6fT\nIc8z9vb2XsroqVo7qqrOONHyZ5bOhoLyNvRKcx0hBPV6g2nW1tRVo16rzXrUpmnNLA+n3OAoTEn6\nJ9i2hW7o5GXE8cGLmK5NnKQcTvZo1OtsbZ0hTiI838ZQocgEuiYQRS75vQg52dehXvfk4amKvuj1\nBogSwnCf/f2dn6xoqqrKd77zHYbDIY888ghPPvkkH/7wh/mt3/otAD72sY/xkY98hD/5kz/5kf//\nlOP4TzE8OMEoFTTboshV0kFIpsa0G4sYrklZOedkVRaP3LUEmipVPZNJIE+WTk32UyydaUjYNJ9G\natDFTCNrWZYMiE9ShsMRWZbRbNSp12vEJzFFWrCxtkKWptiOVUU6NOh2T8gyWbw93yVJUyZhRF6U\nlFlGp9NB1wyCSYCCilcVvna9jqAkiMKZRdeU21YUBWEgaQ9mFXCVxBlBEc122yiJSfOcRqNBrVbD\nsixGozH9fg9d19na2iKKItIkJs4KDFW66+i6hm2Z5IW085q2Kaamq9P/Nj0HTYVGwyeOYwYDOTxo\n3tOSU99CzHTmQggajQaqptLtdqnX/Zn/sWlq2LaHqsqTmm3XsSs3KU1RsEyHuIjJ8pjlxTa94YgX\nX3yRfv+Ek94RC50lXNOVvc4kYjKOcF2/YjokZGQIBUxdIwozjm7tQ5kwDkJEkeN5LqapowCqrmO6\nkhNIKR2vDFNm51BmFEXK0fGR5KaaNmUJSZ4xmYzwaz6OY6GMod8fMBgN6PZ60tg4maCbLkEYkWeH\nMi7athGKwDYddnYPGE4GGKbGVq7QXt1ClBl5FCCyGMs0+Jm3/QxRGGLZLkE0piykiKJm1Wg2m9Sa\ndbpHR7iuQzYaUq+3WT91F25Dtj7GgwFJktDpLKBUzAVT18mKlF6vh2mas+GL63mYrs25s3cz6PUY\nDeR8oFFvUqs1ZZ9fVXGciGAyQjc0VldXGQwGFEXB5uYWw+GwGuzU8Dwfy7bpdruVc5daiRKMqhiF\nM8+H6aFF0+RAT3p0LjAcDmfSXmDm4yl9YOXpWc5Pplf6HNt2KQuI4ohBP8C2LKLxiHrDp9XpoKoq\n7UaDtNoM4lSG6UVBUPVbR+RijPey/KHd3X06nZizZ89y7uw5xpMQXdfZ39+nLAu2tu7+yYrmFI1G\ng5//+Z/nb//2b/nZn/3Z2cc/9KEP8e53vxuAtbU1dnZeqtK7u7usra39yO937W9uIBRVEmkXa9h1\njTITOK6Pm9tkSUoqBGYU4ft16cdYKhiG/KW4nqRpOI5DHMfEYUhncVG60wTR7A9+agRclvKXJF2A\n5IDIceRkuNuTxhMbq6uziVqSxBRlzvGx3OEkoTqu9Oc5WZyBphKnMVm/wDJN8qwEpcSw61iqVQ2I\nspmfp+yzyo2gLEDVYHVthTiSlIt63ZmpHjRNoxCG7HPVfExTFvzxZIzt2CwtLhEEAVE8kXZnjbLz\n7sQAABS1SURBVBq6rkoFi23LgZMQuGHIYNgjSiJsx6LpN/B9D+nKLY2Iy6IAzcR0StIg4PvPP08Y\nRTiOg2NLCWWjVZdOR0qJZRn0ej35eqY9k1aapkK9Jk+XSZRyeHjIxUvnKUWOnlk4VhNF1+h02tx7\nZou8FPT6PQajIZNxwGgSUYiCW91baF0Nrer76rbJcDRmMplI8reuYFpNNNuh1miiaCpZFuPXfFaW\nV1CQPNM0TUiLrIoCKSkKkxLoj4YkYUhZyJz7JAmJwwiv0SAMYrI4xTQMSlRe3NklL0tcQwNVY39v\nn87yAnla4Dg2QihMJmPiOEEoGpPxkCSKuU8rCcMJaZzS9F1M10EANc/BshxMFZIsI8sFmq6Q5zGj\nXopjW9ju1LFqQJJGHP9A+lGORiMcx+HGD27gux71Wo3dg1s4tk1vMsJxfZr1Fo7lUQppuNvvnlDz\nfY4ODyjCEsd1GQdjPNcDkaOoKfVGnfF4VFGBcpIoZtTvM5lMuP7ss+iGhuO61Gr1WR78dFLf7fbI\n85x2u0Wz2azaeQJNk5zkvb09dnd3uX79OisrK6ysrCCEYDAYYFnWLMq3yEtM06Ld8un2jmQsRhCR\neQWqpaHbBn7TZzQaozkOHiqW4Ujp61jGbsdxTDAZg6LSPTzk+LjHoD/E8W2WlpZYXj7F5uYmF+49\nx83tHX5w44eS9O85/MML2/zvb13D8zx5S3kVKOJVhJYnJyfouk6zKdUsjzzyCL/927/NpUuXWFlZ\nAeD3f//3+da3vsWf//mfc/36dd73vvfxzW9+czYIeuGFF/7ZaVNRFK5eWiDVdDQ1RzEVUAWuarG5\ndjdtp0MqMur1Jq1ag1ajKRv0ponnWnIwk6YkaVpZ4kvS6vQUN3ULn8bHyqFEWcUeSFPT6UDF932C\nIKDRaOC40lBYVTR0XZ15WiqKMitmYSgLpygzDMsgy3PCIKh2SkGaTknhrdkpuSikxjsMQ05OTrDM\nqs9IIbOGFANDN0krLf2U/Nvt98mynHa7TSkERSn9ESVkw73daZGmsoFt6Ua1liZJlnHSPal06dK2\nazQaInIZcFZvNKS5bCG1vOPxGKFKXX7veMBoOKbVanJ6c4NTp5akd2LF+5TXyITvf//7tNttZK67\nh2XZGLo0k+73huztHXDu/BatVh2lmp6HYUiSxNTrTbIslSeCKsZY6CaObUu/yLHspcVRTElOWcL+\n3i2iOGJpeRnTMMgpEaWkmUXjCXt7u7TbbU6dOgVIR/lS00mSSMbyxgV5npGkUUWDCTBUg16/S5RE\naKpBGIU4tsvq0jLNepMomtBaaEvKlF9nMOwhKPFcl3q9gedIAxbdMFjfWKXdWqIsBa4rSfR5lpLG\nGVmZS1MZTWYCaZpOXoLjyGKUZtKYOE3SSmUj7fjyXA7EkiSlVqsxGAzY3d3Fc10Wmm3JsjDl4HEw\nHmHbNqurp0jTlBs3trEdm7P3nGEykUyBhYUFoODw8JAkkX4LyyunCIOQZ555RrYiTJ1mo0UYBtx1\n12nCMGU87KNoAsOQUcZxHFNWrTPTNKvY3+rmZBocHR1Tq9XJM8luGQzl9bfRaMiN15ZtIsexGfQl\nXcwwTYosmzn5D4cTlheXeebb/4fzF+4lCkMG/T7Li4uMRgPKEilQETJosD8cyBtRrUGWFZimg2Xb\nLHTaNBsNms0mL9y4wXg0YmNjA1XV6Pd7CKWQ6tdqeOl5Hm99x7//sRr0Vz1pHhwc8IEPfGBWYB57\n7DEeeugh3v/+9/Od73wHRVHY2trij//4jwG4ePEiv/RLv8TFixfRdZ0/+qM/+rHX8zCrMskNDQdF\n2u8LQZ6XaLrK+tK6lGRZNrbl4DkejuUgtIKkSm/UZnSSkigKCQJJT5k1yqveoDTx8BmPh7hujVpN\nXjENw5jZq/m+z2A4pLO4wEmvS6PekNfw0bDK9kkBBde12dvbp9mq4egOjuNWul2ZeOd5Jr1ej/F4\nTKfTQWZJyxPJzZ0D1ldPMRwGlWdnKonDQqm04/JnNXUUMg2DOJb5J8PRCEXVWFpqzXps04KMIsjS\nDMuQOvo8l9ng7XZjRgWR1mAOJ8cn2KZJs9mUlne6zBV3a4LDw0NqtRqnVttYtmQcBMGEOG4xmYTS\nsEQBRZH8vLvvPsPJybGcrGbZjN1QFPIk0em0WF5Z4Zlrf8dbLl+cTaeHwwHD4U021tfRmjWyqi9n\nVEoX21LQDQ/f9xhPSjTVI45TTp9eRVF09nZ3cdpt/FodpRSEcYSSF9y1cReOY+H7Mj42iiKEqqPr\nbcnJFZXbu6oShNJ0OUkzGa5m6Hiey3Ak7cXCQMol1/0NGWan6SRxRMdewLJs/MoVve54LCx2sG0P\nTbeYBAMc10RXBE/9zdO8/d/+G0ChbtewdIPxZDLzZjUrPwRQsA3zJRvCiqeqajrxJGQymWCaJtvb\n22iaxtbmJsF4Qppl9AZ9FpYW2TxzN8PhgJs3b3Jj+wf4nk+r1UJRBMfHJ6BIu8DReET3pMvKygqm\n4XJ0eIJAY2lxgUuXLkkjj/GEIi9ZaXZ4/sY2FBlLCwusb5zG9XxGowFFXhDnOb7vMx6PuXbtGvff\nfz9FUfDF//kN7rv3LCcnJ1y98tOMRgFRlFV/kyVZGpGnCadWVzk6PpJTa0WgqALP9+l1+5imxeLC\nAqPREN+v0T08Yn93j/2jW7Q6i3i1OrW6PxNkLK+t01hYoOZLgUSeFdTrTdI4IYrkoebo6Ajf8xCl\nnMrXfJ+lpSXCKKRW96WjkmnQHwxerSy++knz9YKiKJy9ryG5kqqOqkqChqtrXDh9gbtOn2G9s1pZ\nvKlSgaLJAhmGMt7Td1yEKv0wNU2dWdpPdclBECCKEsd2qNfrDAYDdMvAcWwcx2UwGGCa0nFH9kKl\nEsSy7VkzW0EOogxNq2z0pXFvmmdYtkmr1aIoyuqNJzi1eqq62mez06uCwKoiND7z3/+K//Dv3kme\nQxgG2I6FIgS2ZaNqKqMgRFU1mYUiAEX+ca+srJAXBYYpd2d5QpUFtihkYmVcxZ6qKtXVKauu+Wol\np3yJMzeNDC6zHN+X/bIsTZERvDmmacnTqyJjUGu1Gp5XI8sjhCgwDAsFjShK2d7eZmlpgaLIK1MH\nj6OjExQFao06a6vL/LfPfYFf/U//kaIsqujiHBmRLKe7eSl3evKMJE6lLlhAEAbouoJluoxGEzld\njXMKSoIgYG1tjSAI6HW7IBQsW/a7a7WaNF5OY0oU2XsUkJclAkGRFzJgTjdpt9ugarNJeZ6nFFmG\noRtQpZnGUQIls/eY79dwbJtms0m/35e8zhKai0v0eodEkzGdZptP/Zf/yn/+2EfBdtDSALUsSfMS\nXVEQiiJjjwvpoqQgA/lUVWM4GFCUObppYJjSeUdVVVRFkrJty2Q0HKBouixyg151xS3Icpl1vrq6\nymQ0JkkixkGE63qsrp/iH/7+OUajgPZCh431DTRFI02iio6nMRwNiJIEIVSWV5bZ39shSzLCioJ1\n18YmJSmWaZGlCXlWMAkCbt68OaMf/Y+/+l985Fc/RLfbw3EcVpaXGY7GaJpBv9fF81wGvZ60tdM1\nXN9mOBxQZAWKqlCictztcXrzbmmVWEpHs4V2mx/u7mO7HgiFTqdFs9GWswJdpds9YjTsU+YyXtg0\nDO7a3OL45BgA13E4PDzEsm2yNGV5eZlSCIIwpFZvoKgq29vbWJbBw49+4F920nw9IXR5ygSBKKTf\nZL21xOm1Le5ZOY1bd9Ffpq3WNJ1wPCGvNOhJkhAmEXEczwYl04IZhhF5Lh2MVEPn4OiQJElYtBdJ\n05w0HVZX+YQwnFTZKXLCfOtgf6b5XVhYJIoiojgmz2A0GWNZFkvLy9LZfTJBVZXqelWQphlHRyc0\nGvVZM9x2HZI4ks5BRUkUpViWJ/O8JxGqgDTJqDVquK6DYTtyQxCCsnwp3waUmaRS06X7TFnKKWYY\nBNVUXE78pS7doiiimRVeWZazdsuU8J2Uyex6VeYFk8mYZqOGYVozr8Y0zbjnnnvQdYMolgYUSZIB\nZaUx1smyHNe1pcoozVjotCnyArcuixfIZFABGJaJKeTQZjgaUSLwPGl2a3g2nqdUfD/ZXlE1SJN8\n1isbZTJlsLXQYTgYzKwAoWQwGOH7VV65qlIWAtd1CCaBbCvYNmtraxiGwXA4xLJMWu0Gw+GIosjJ\ny5I0D1EKmEQBqi7dx1uNJqZh0e50pMFyxRCwHIvT9bswdINBv8+ge4v+UZejky6L7VUMw8F06jJb\nqdBJ4zFJEtNqNiRNLo6q946K6zhkeY4QKq3FJcJwxGQyJsuLiucrebOKonDc7fPCC9/n/IVLdA+7\n2JbFwkKHZrPF0VEfr15nd++HxEnEufMX0DUpI93d+yHrd22gIBkmt24dMB7LALJWq0FWZLKdkOSc\nPn0WXbOp1Rs4ls2g1yOMQ3p9eUCYjCf4ns808nppaZmDg4OqlRdzeHjEysoKQTDhu3/3DO3WAr7f\noNluomsavYHCwfERq6trGHYLX5PMl6WFRXrdAVmm88Mb+9z/Uz/FxvoyQTimUW9g2XWyskCIovLa\nlMFrR0dHpHlOrdGh3zvBciy6xyf0B99j8+4tAJI058rVn+ao2yWOY+rtDnGSoJgmYRThui4bGxvs\n7+++au16w4pmreGh60BZEIcFtaUVrm7dy/rSCl6rhaYU5EU2kz4C5GWOIhSiMIKyQLfM2VUmz2Vc\n7LS/GUURvX6f6NYtWq3WzBRV6q5Vokh6JjqONdNfT6WAU8PTKIro9/tEcYLj13C8OkUm6UOyd2MS\nBBMWOoukWYmqSgMM2duRqh4U0KtpoaEbNJsdRCmwXRttouPoJq12E0UTREmC6XoyKCrPMQ1JjZr6\nF05lgZqqM+gPsG0bRdGwLCkzS9OEZrMJSFMNx5FXyKIyofU8f0byL4qSZq1ZDXFyTN2i0aiTFxmK\nAp3OBnmeMwkCjo6O8DyfUkjFlNyBS7yawXgsOYRT5+68SNBNhUv33UeYZtWUVVKbSmRftsxSTN3A\ncR1pPlsZiliGPCHrukmSZKiqShyHM5ux8XjMYDTAr8sQrJ0jqeMPwpAiz9nc3JTvhYporWoa44nU\nHi8sLlKW0nW/5rvYy4vcOtzn5g+HaIpNmsbYjoPrtXANB9/3ObW+ShyGqBVHWNc0dENGnwghUBUV\nBBwc3KIscwbDIZbn8lOra6imilAhCodYliLzrqwGTmpRqiqCosqNl3ScXAgs30WUgjAI0SyDmlan\nyCQLZDDoV+FoDqIsOHfPGVRVkfaDFdUtjo+5ub2N5dksnVqlGAkmQcCgN2BjfR1RFCRFgaELXnzx\nRZaXlzh79ixpKk2l8yKTPFdF5dTqusyo0oAyo+Zt0Ov18TwHMIh8GW2xvLqK47jkWcpdG5sMBgPW\n19a4994Llb/tJp2DBZ599jlUxeTy1fPs7u1y7XvfxbJMTno9ScYfT1hbXyMYDUmTAFUTPPi2n2Zx\ncYXDw0Nc1yEOU8qSqkefYlk2juuSxYJWq85oEMrsIieh1+9hVhtqWTIz25lMJrQ7izNnr2bLYDQc\nUPN8OVQimhnu/Di8IdfzK1eu8N3vfvd2v+wcc8wxx/8T3v72t/Pkk0/+yM+9IUVzjjnmmONfK149\nFX2OOeaYY45XYF4055hjjjleA2570fzyl7/MhQsXOHv2LJ/4xCdu98u/rvjgBz/I8vIy999//+xj\nvV6Phx9+mHPnzvHOd76Twcs4YE888QRnz57lwoUL/PVf//Ub8cg/MXZ2dvi5n/s5Ll26xH333cen\nPvUp4M5fdxzHPPjgg1y5coWLFy/y0Y9+FLjz1z1FURRcvXp1pgZ8s6wbAHEbkee5OHPmjNje3hZp\nmorLly+L69ev385HeF3x9a9/XXz7298W99133+xjv/EbvyE+8YlPCCGE+PjHPy5+8zd/UwghxHPP\nPScuX74s0jQV29vb4syZM6IoijfkuX8SHBwciGvXrgkhhBiPx+LcuXPi+vXrd/y6hRAiCAIhhBBZ\nlokHH3xQPPXUU2+KdQshxCc/+Unxvve9T7z73e8WQtz57/OX47YWzaefflo88sgjs38/8cQT4okn\nnridj/C6Y3t7+xVF8/z58+LWrVtCCFlgzp8/L4QQ4vHHHxcf//jHZ1/3yCOPiG984xu392FfB/zC\nL/yC+MpXvvKmWncQBOKBBx4Qzz777Jti3Ts7O+Khhx4SX/3qV8W73vUuIcSb631+W6/ne3t7bGxs\nzP79qtZxdwgODw+l+zewvLzM4eEhAPv7+6yvr8++7k74Wdy8eZNr167x4IMPvinWXZYlV65cYXl5\nedaieDOs+9d//df5vd/7vVeYi78Z1j3FbS2aP06H/mbBy+OAf9zn/7ViMpnwnve8hz/4gz+gVqu9\n4nN36rqntom7u7t8/etf52tf+9orPn8nrvsLX/gCS0tLXL169cfKDO/Edb8ct7Vo/lPruJ2dnVfs\nQncilpeXuXXrFiANUKZqg9dio/f/O7Is4z3veQ+PPfYYv/iLvwi8OdY9xdQ28Zlnnrnj1/3000/z\n+c9/nq2tLd773vfy1a9+lccee+yOX/fLcVuL5gMPPMDzzz8/E/d/7nOf49FHH72dj3Db8eijj/Lp\nT38agE9/+tOzovLoo4/y2c9+ljSVphfPP/88b33rW9/IR/0XQQjBr/zKr3Dx4kV+7dd+bfbxO33d\nJycnswlxFEV85Stf4erVq3f8uh9//HF2dnbY3t7ms5/9LO94xzv4sz/7szt+3a/A7W6ifvGLXxTn\nzp0TZ86cEY8//vjtfvnXFb/8y78sTp06JQzDEOvr6+JP//RPRbfbFQ899JA4e/asePjhh0W/3599\n/e/8zu+IM2fOiPPnz4svf/nLb+CT/8vx1FNPCUVRxOXLl8WVK1fElStXxJe+9KU7ft3f+973xNWr\nV8Xly5fF/fffL373d39XCCHu+HW/HE8++eRsev5mWvdcRjnHHHPM8RowVwTNMcccc7wGzIvmHHPM\nMcdrwLxozjHHHHO8BsyL5hxzzDHHa8C8aM4xxxxzvAbMi+Ycc8wxx2vAvGjOMcccc7wGzIvmHHPM\nMcdrwP8F7/c7xJLyUh8AAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 7 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The classifications include various cats -- 282 = tabby, 283 = tiger, 281 = persian -- and foxes and other mammals.\n", + "\n", + "In this way the fully-connected layers can be extracted as dense features across an image (see `net_full_conv.blobs['fc6'].data` for instance), which is perhaps more useful than the classification map itself." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*A thank you to Rowland Depp for first suggesting this trick.*" + ] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file From 4de3b94e67725b663601e6dac89e8a68e2b11009 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 12 Jun 2014 14:58:07 -0700 Subject: [PATCH 0115/2053] make test_net use DUMMY_DATA instead of leveldb --- src/caffe/test/test_net.cpp | 101 +++++++++++++----------------------- 1 file changed, 36 insertions(+), 65 deletions(-) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 4c7f0e7f7ac..1e43a038455 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -1,8 +1,6 @@ // Copyright 2014 BVLC and contributors. #include -#include -#include #include #include "gtest/gtest.h" @@ -14,43 +12,28 @@ namespace caffe { - template class NetTest : public ::testing::Test { protected: - virtual void SetUp() { // Create the leveldb - filename_ = tmpnam(NULL); // get temp name - LOG(INFO) << "Using temporary leveldb " << filename_; - leveldb::DB* db; - leveldb::Options options; - options.error_if_exists = true; - options.create_if_missing = true; - leveldb::Status status = leveldb::DB::Open(options, filename_, &db); - CHECK(status.ok()); - for (int i = 0; i < 5; ++i) { - Datum datum; - datum.set_label(i); - datum.set_channels(2); - datum.set_height(3); - datum.set_width(4); - std::string* data = datum.mutable_data(); - for (int j = 0; j < 24; ++j) { - data->push_back((uint8_t)i); - } - std::stringstream ss; - ss << i; - db->Put(leveldb::WriteOptions(), ss.str(), datum.SerializeAsString()); - } - delete db; - - const string& proto_prefix = + virtual void SetUp() { + const string& proto = "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " - " data_param { "; - const string& proto_suffix = - " batch_size: 1 " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: 5 " + " channels: 2 " + " height: 3 " + " width: 4 " + " num: 5 " + " channels: 1 " + " height: 1 " + " width: 1 " + " data_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " " } " " top: 'data' " " top: 'label' " @@ -82,55 +65,43 @@ class NetTest : public ::testing::Test { " bottom: 'innerproduct' " " bottom: 'label' " "} "; - proto_ = proto_prefix + "source: '" + string(this->filename_) + - "' " + proto_suffix; + NetParameter param; + CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); + net_.reset(new Net(param)); } - char* filename_; - string proto_; + shared_ptr > net_; }; typedef ::testing::Types Dtypes; TYPED_TEST_CASE(NetTest, Dtypes); TYPED_TEST(NetTest, TestHasBlob) { - NetParameter param; - CHECK(google::protobuf::TextFormat::ParseFromString(this->proto_, ¶m)); - Net net(param); - EXPECT_TRUE(net.has_blob("data")); - EXPECT_TRUE(net.has_blob("label")); - EXPECT_TRUE(net.has_blob("innerproduct")); - EXPECT_FALSE(net.has_blob("loss")); + EXPECT_TRUE(this->net_->has_blob("data")); + EXPECT_TRUE(this->net_->has_blob("label")); + EXPECT_TRUE(this->net_->has_blob("innerproduct")); + EXPECT_FALSE(this->net_->has_blob("loss")); } TYPED_TEST(NetTest, TestGetBlob) { - NetParameter param; - CHECK(google::protobuf::TextFormat::ParseFromString(this->proto_, ¶m)); - Net net(param); - EXPECT_EQ(net.blob_by_name("data"), net.blobs()[0]); - EXPECT_EQ(net.blob_by_name("label"), net.blobs()[1]); - EXPECT_EQ(net.blob_by_name("innerproduct"), net.blobs()[2]); - EXPECT_FALSE(net.blob_by_name("loss")); + EXPECT_EQ(this->net_->blob_by_name("data"), this->net_->blobs()[0]); + EXPECT_EQ(this->net_->blob_by_name("label"), this->net_->blobs()[1]); + EXPECT_EQ(this->net_->blob_by_name("innerproduct"), this->net_->blobs()[2]); + EXPECT_FALSE(this->net_->blob_by_name("loss")); } TYPED_TEST(NetTest, TestHasLayer) { - NetParameter param; - CHECK(google::protobuf::TextFormat::ParseFromString(this->proto_, ¶m)); - Net net(param); - EXPECT_TRUE(net.has_layer("data")); - EXPECT_TRUE(net.has_layer("innerproduct")); - EXPECT_TRUE(net.has_layer("loss")); - EXPECT_FALSE(net.has_layer("label")); + EXPECT_TRUE(this->net_->has_layer("data")); + EXPECT_TRUE(this->net_->has_layer("innerproduct")); + EXPECT_TRUE(this->net_->has_layer("loss")); + EXPECT_FALSE(this->net_->has_layer("label")); } TYPED_TEST(NetTest, TestGetLayerByName) { - NetParameter param; - CHECK(google::protobuf::TextFormat::ParseFromString(this->proto_, ¶m)); - Net net(param); - EXPECT_EQ(net.layer_by_name("data"), net.layers()[0]); - EXPECT_EQ(net.layer_by_name("innerproduct"), net.layers()[1]); - EXPECT_EQ(net.layer_by_name("loss"), net.layers()[2]); - EXPECT_FALSE(net.layer_by_name("label")); + EXPECT_EQ(this->net_->layer_by_name("data"), this->net_->layers()[0]); + EXPECT_EQ(this->net_->layer_by_name("innerproduct"), this->net_->layers()[1]); + EXPECT_EQ(this->net_->layer_by_name("loss"), this->net_->layers()[2]); + EXPECT_FALSE(this->net_->layer_by_name("label")); } } // namespace caffe From 383d92d3a47b09fd5464d4bc0892591cbe0fd617 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 10 Jun 2014 13:19:34 -0700 Subject: [PATCH 0116/2053] make Net::Init loop indices clearer --- src/caffe/net.cpp | 77 ++++++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 9f84b0978f4..0c5ca7d9dbd 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -69,41 +69,42 @@ void Net::Init(const NetParameter& in_param) { top_vecs_.resize(param.layers_size()); bottom_id_vecs_.resize(param.layers_size()); top_id_vecs_.resize(param.layers_size()); - for (int i = 0; i < param.layers_size(); ++i) { + for (int layer_id = 0; layer_id < param.layers_size(); ++layer_id) { bool in_place = false; - const LayerParameter& layer_param = param.layers(i); + const LayerParameter& layer_param = param.layers(layer_id); layers_.push_back(shared_ptr >(GetLayer(layer_param))); layer_names_.push_back(layer_param.name()); LOG(INFO) << "Creating Layer " << layer_param.name(); bool need_backward = param.force_backward(); // Figure out this layer's input and output - for (int j = 0; j < layer_param.bottom_size(); ++j) { - const string& blob_name = layer_param.bottom(j); + for (int bottom_id = 0; bottom_id < layer_param.bottom_size(); + ++bottom_id) { + const string& blob_name = layer_param.bottom(bottom_id); const int blob_id = blob_name_to_idx[blob_name]; if (available_blobs.find(blob_name) == available_blobs.end()) { LOG(FATAL) << "Unknown blob input " << blob_name << - " to layer" << j; + " to layer" << bottom_id; } LOG(INFO) << layer_param.name() << " <- " << blob_name; - bottom_vecs_[i].push_back( + bottom_vecs_[layer_id].push_back( blobs_[blob_id].get()); - bottom_id_vecs_[i].push_back(blob_id); + bottom_id_vecs_[layer_id].push_back(blob_id); // If a blob needs backward, this layer should provide it. need_backward |= blob_need_backward_[blob_id]; available_blobs.erase(blob_name); } - for (int j = 0; j < layer_param.top_size(); ++j) { - const string& blob_name = layer_param.top(j); + for (int top_id = 0; top_id < layer_param.top_size(); ++top_id) { + const string& blob_name = layer_param.top(top_id); // Check if we are doing in-place computation - if (layer_param.bottom_size() > j && - blob_name == layer_param.bottom(j)) { + if (layer_param.bottom_size() > top_id && + blob_name == layer_param.bottom(top_id)) { // In-place computation LOG(INFO) << layer_param.name() << " -> " << blob_name << " (in-place)"; in_place = true; available_blobs.insert(blob_name); - top_vecs_[i].push_back( + top_vecs_[layer_id].push_back( blobs_[blob_name_to_idx[blob_name]].get()); - top_id_vecs_[i].push_back(blob_name_to_idx[blob_name]); + top_id_vecs_[layer_id].push_back(blob_name_to_idx[blob_name]); } else if (blob_name_to_idx.find(blob_name) != blob_name_to_idx.end()) { // If we are not doing in-place computation but has duplicated blobs, // raise an error. @@ -117,33 +118,34 @@ void Net::Init(const NetParameter& in_param) { blob_need_backward_.push_back(param.force_backward()); blob_name_to_idx[blob_name] = blob_names_.size() - 1; available_blobs.insert(blob_name); - top_vecs_[i].push_back(blobs_[blob_names_.size() - 1].get()); - top_id_vecs_[i].push_back(blob_names_.size() - 1); + top_vecs_[layer_id].push_back(blobs_[blob_names_.size() - 1].get()); + top_id_vecs_[layer_id].push_back(blob_names_.size() - 1); } } // After this layer is connected, set it up. - // LOG(INFO) << "Setting up " << layer_names_[i]; - layers_[i]->SetUp(bottom_vecs_[i], &top_vecs_[i]); - for (int topid = 0; topid < top_vecs_[i].size(); ++topid) { - LOG(INFO) << "Top shape: " << top_vecs_[i][topid]->num() << " " - << top_vecs_[i][topid]->channels() << " " - << top_vecs_[i][topid]->height() << " " - << top_vecs_[i][topid]->width() << " (" - << top_vecs_[i][topid]->count() << ")"; + // LOG(INFO) << "Setting up " << layer_names_[layer_id]; + layers_[layer_id]->SetUp(bottom_vecs_[layer_id], &top_vecs_[layer_id]); + for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { + LOG(INFO) << "Top shape: " << top_vecs_[layer_id][top_id]->num() << " " + << top_vecs_[layer_id][top_id]->channels() << " " + << top_vecs_[layer_id][top_id]->height() << " " + << top_vecs_[layer_id][top_id]->width() << " (" + << top_vecs_[layer_id][top_id]->count() << ")"; if (!in_place) - memory_used += top_vecs_[i][topid]->count(); + memory_used += top_vecs_[layer_id][top_id]->count(); } DLOG(INFO) << "Memory required for Data " << memory_used*sizeof(Dtype); - int blobs_lr_size = layers_[i]->layer_param().blobs_lr_size(); - CHECK(blobs_lr_size == layers_[i]->blobs().size() || blobs_lr_size == 0) + int blobs_lr_size = layers_[layer_id]->layer_param().blobs_lr_size(); + CHECK(blobs_lr_size == layers_[layer_id]->blobs().size() || blobs_lr_size == 0) << "Incorrect blobs lr size: should be either 0 or the same as " "the number of the layer's parameter blobs."; if (blobs_lr_size) { // Check if this layer needs backward operation itself - for (int j = 0; j < blobs_lr_size; ++j) { - need_backward |= (layers_[i]->layer_param().blobs_lr(j) > 0); + for (int param_id = 0; param_id < blobs_lr_size; ++param_id) { + need_backward |= + (layers_[layer_id]->layer_param().blobs_lr(param_id) > 0); } - } else if (layers_[i]->blobs().size()) { + } else if (layers_[layer_id]->blobs().size()) { // catch: if a layer param does not specify blobs_lr, we should assume the // learning rate to be 1. Thus we will need to perform backward. need_backward = true; @@ -151,12 +153,13 @@ void Net::Init(const NetParameter& in_param) { // Finally, set the backward flag layer_need_backward_.push_back(need_backward); if (need_backward) { - LOG(INFO) << layer_names_[i] << " needs backward computation."; - for (int j = 0; j < top_id_vecs_[i].size(); ++j) { - blob_need_backward_[top_id_vecs_[i][j]] = true; + LOG(INFO) << layer_names_[layer_id] << " needs backward computation."; + for (int top_id = 0; top_id < top_id_vecs_[layer_id].size(); ++top_id) { + blob_need_backward_[top_id_vecs_[layer_id][top_id]] = true; } } else { - LOG(INFO) << layer_names_[i] << " does not need backward computation."; + LOG(INFO) << layer_names_[layer_id] + << " does not need backward computation."; } } // In the end, all remaining blobs are considered output blobs. @@ -166,11 +169,11 @@ void Net::Init(const NetParameter& in_param) { net_output_blobs_.push_back(blobs_[blob_name_to_idx[*it]].get()); net_output_blob_indices_.push_back(blob_name_to_idx[*it]); } - for (size_t i = 0; i < blob_names_.size(); ++i) { - blob_names_index_[blob_names_[i]] = i; + for (size_t blob_id = 0; blob_id < blob_names_.size(); ++blob_id) { + blob_names_index_[blob_names_[blob_id]] = blob_id; } - for (size_t i = 0; i < layer_names_.size(); ++i) { - layer_names_index_[layer_names_[i]] = i; + for (size_t layer_id = 0; layer_id < layer_names_.size(); ++layer_id) { + layer_names_index_[layer_names_[layer_id]] = layer_id; } GetLearningRateAndWeightDecay(); LOG(INFO) << "Network initialization done."; From 653aa25c262080e1b8a6fdf30e9d0dc4b1cfa6f9 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 10 Jun 2014 19:22:16 -0700 Subject: [PATCH 0117/2053] refactor Net::Init to call helpers AppendBottom and AppendTop --- include/caffe/net.hpp | 13 ++++ src/caffe/net.cpp | 149 ++++++++++++++++++++++++------------------ 2 files changed, 98 insertions(+), 64 deletions(-) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 46d72a6b0a1..5b5dd22a282 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -4,6 +4,7 @@ #define CAFFE_NET_HPP_ #include +#include #include #include @@ -14,6 +15,7 @@ using std::map; using std::vector; +using std::set; using std::string; namespace caffe { @@ -100,6 +102,15 @@ class Net { const shared_ptr > layer_by_name(const string& layer_name); protected: + // Helpers for Init. + // Append a new input or top blob to the net. + void AppendTop(const NetParameter& param, const int layer_id, + const int top_id, set* available_blobs, + map* blob_name_to_idx); + // Append a new bottom blob to the net. + int AppendBottom(const NetParameter& param, const int layer_id, + const int bottom_id, set* available_blobs, + map* blob_name_to_idx); // Function to get misc parameters, e.g. the learning rate multiplier and // weight decay. void GetLearningRateAndWeightDecay(); @@ -135,6 +146,8 @@ class Net { vector params_lr_; // the weight decay multipliers vector params_weight_decay_; + // The bytes of memory used by this net + size_t memory_used_; DISABLE_COPY_AND_ASSIGN(Net); }; diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 0c5ca7d9dbd..41ae7520356 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -44,26 +44,14 @@ void Net::Init(const NetParameter& in_param) { set available_blobs; int num_layers = param.layers_size(); CHECK_EQ(param.input_size() * 4, param.input_dim_size()) - << "Incorrect bottom blob dimension specifications."; - size_t memory_used = 0; + << "Incorrect input blob dimension specifications."; + memory_used_ = 0; // set the input blobs - for (int i = 0; i < param.input_size(); ++i) { - const string& blob_name = param.input(i); - shared_ptr > blob_pointer( - new Blob(param.input_dim(i * 4), - param.input_dim(i * 4 + 1), - param.input_dim(i * 4 + 2), - param.input_dim(i * 4 + 3))); - blobs_.push_back(blob_pointer); - blob_names_.push_back(blob_name); - blob_need_backward_.push_back(param.force_backward()); - net_input_blob_indices_.push_back(i); - net_input_blobs_.push_back(blob_pointer.get()); - blob_name_to_idx[blob_name] = i; - available_blobs.insert(blob_name); - memory_used += blob_pointer->count(); + for (int input_id = 0; input_id < param.input_size(); ++input_id) { + const int layer_id = -1; // inputs have fake layer ID -1 + AppendTop(param, layer_id, input_id, &available_blobs, &blob_name_to_idx); } - DLOG(INFO) << "Memory required for Data" << memory_used*sizeof(Dtype); + DLOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); // For each layer, set up their input and output bottom_vecs_.resize(param.layers_size()); top_vecs_.resize(param.layers_size()); @@ -79,48 +67,13 @@ void Net::Init(const NetParameter& in_param) { // Figure out this layer's input and output for (int bottom_id = 0; bottom_id < layer_param.bottom_size(); ++bottom_id) { - const string& blob_name = layer_param.bottom(bottom_id); - const int blob_id = blob_name_to_idx[blob_name]; - if (available_blobs.find(blob_name) == available_blobs.end()) { - LOG(FATAL) << "Unknown blob input " << blob_name << - " to layer" << bottom_id; - } - LOG(INFO) << layer_param.name() << " <- " << blob_name; - bottom_vecs_[layer_id].push_back( - blobs_[blob_id].get()); - bottom_id_vecs_[layer_id].push_back(blob_id); + const int blob_id = AppendBottom(param, layer_id, bottom_id, + &available_blobs, &blob_name_to_idx); // If a blob needs backward, this layer should provide it. need_backward |= blob_need_backward_[blob_id]; - available_blobs.erase(blob_name); } for (int top_id = 0; top_id < layer_param.top_size(); ++top_id) { - const string& blob_name = layer_param.top(top_id); - // Check if we are doing in-place computation - if (layer_param.bottom_size() > top_id && - blob_name == layer_param.bottom(top_id)) { - // In-place computation - LOG(INFO) << layer_param.name() << " -> " << blob_name << " (in-place)"; - in_place = true; - available_blobs.insert(blob_name); - top_vecs_[layer_id].push_back( - blobs_[blob_name_to_idx[blob_name]].get()); - top_id_vecs_[layer_id].push_back(blob_name_to_idx[blob_name]); - } else if (blob_name_to_idx.find(blob_name) != blob_name_to_idx.end()) { - // If we are not doing in-place computation but has duplicated blobs, - // raise an error. - LOG(FATAL) << "Duplicate blobs produced by multiple sources."; - } else { - // Normal output. - LOG(INFO) << layer_param.name() << " -> " << blob_name; - shared_ptr > blob_pointer(new Blob()); - blobs_.push_back(blob_pointer); - blob_names_.push_back(blob_name); - blob_need_backward_.push_back(param.force_backward()); - blob_name_to_idx[blob_name] = blob_names_.size() - 1; - available_blobs.insert(blob_name); - top_vecs_[layer_id].push_back(blobs_[blob_names_.size() - 1].get()); - top_id_vecs_[layer_id].push_back(blob_names_.size() - 1); - } + AppendTop(param, layer_id, top_id, &available_blobs, &blob_name_to_idx); } // After this layer is connected, set it up. // LOG(INFO) << "Setting up " << layer_names_[layer_id]; @@ -131,14 +84,12 @@ void Net::Init(const NetParameter& in_param) { << top_vecs_[layer_id][top_id]->height() << " " << top_vecs_[layer_id][top_id]->width() << " (" << top_vecs_[layer_id][top_id]->count() << ")"; - if (!in_place) - memory_used += top_vecs_[layer_id][top_id]->count(); } - DLOG(INFO) << "Memory required for Data " << memory_used*sizeof(Dtype); - int blobs_lr_size = layers_[layer_id]->layer_param().blobs_lr_size(); - CHECK(blobs_lr_size == layers_[layer_id]->blobs().size() || blobs_lr_size == 0) - << "Incorrect blobs lr size: should be either 0 or the same as " - "the number of the layer's parameter blobs."; + DLOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); + const int blobs_lr_size = layers_[layer_id]->layer_param().blobs_lr_size(); + CHECK(blobs_lr_size == layers_[layer_id]->blobs().size() || + blobs_lr_size == 0) << "Incorrect blobs lr size: should be either 0 " + << "or the same as the number of the layer's parameter blobs."; if (blobs_lr_size) { // Check if this layer needs backward operation itself for (int param_id = 0; param_id < blobs_lr_size; ++param_id) { @@ -177,9 +128,79 @@ void Net::Init(const NetParameter& in_param) { } GetLearningRateAndWeightDecay(); LOG(INFO) << "Network initialization done."; - LOG(INFO) << "Memory required for Data " << memory_used*sizeof(Dtype); + LOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); +} + +// Helper for Net::Init: add a new input or top blob to the net. (Inputs have +// layer_id == -1, tops have layer_id >= 0.) +template +void Net::AppendTop(const NetParameter& param, const int layer_id, + const int top_id, set* available_blobs, + map* blob_name_to_idx) { + shared_ptr layer_param((layer_id >= 0) ? + (new LayerParameter(param.layers(layer_id))) : NULL); + const string& blob_name = layer_param ? + layer_param->top(top_id) : param.input(top_id); + // Check if we are doing in-place computation + if (layer_param && layer_param->bottom_size() > top_id && + blob_name == layer_param->bottom(top_id)) { + // In-place computation + LOG(INFO) << layer_param->name() << " -> " << blob_name << " (in-place)"; + top_vecs_[layer_id].push_back(blobs_[(*blob_name_to_idx)[blob_name]].get()); + top_id_vecs_[layer_id].push_back((*blob_name_to_idx)[blob_name]); + } else if (blob_name_to_idx->find(blob_name) != blob_name_to_idx->end()) { + // If we are not doing in-place computation but have duplicated blobs, + // raise an error. + LOG(FATAL) << "Duplicate blobs produced by multiple sources."; + } else { + // Normal output. + if (layer_param) { + LOG(INFO) << layer_param->name() << " -> " << blob_name; + } else { + LOG(INFO) << "Input " << top_id << " -> " << blob_name; + } + shared_ptr > blob_pointer(new Blob()); + const int blob_id = blobs_.size(); + blobs_.push_back(blob_pointer); + blob_names_.push_back(blob_name); + blob_need_backward_.push_back(param.force_backward()); + (*blob_name_to_idx)[blob_name] = blob_id; + if (layer_id == -1) { + // Set the (explicitly specified) dimensions of the input blob. + blob_pointer->Reshape(param.input_dim(top_id * 4), + param.input_dim(top_id * 4 + 1), + param.input_dim(top_id * 4 + 2), + param.input_dim(top_id * 4 + 3)); + net_input_blob_indices_.push_back(blob_id); + net_input_blobs_.push_back(blob_pointer.get()); + } else { + top_id_vecs_[layer_id].push_back(blob_id); + top_vecs_[layer_id].push_back(blob_pointer.get()); + } + memory_used_ += blob_pointer->count(); + } + available_blobs->insert(blob_name); } +// Helper for Net::Init: add a new bottom blob to the net. +template +int Net::AppendBottom(const NetParameter& param, + const int layer_id, const int bottom_id, + set* available_blobs, map* blob_name_to_idx) { + const LayerParameter& layer_param = param.layers(layer_id); + const string& blob_name = layer_param.bottom(bottom_id); + if (available_blobs->find(blob_name) == available_blobs->end()) { + LOG(FATAL) << "Unknown blob input " << blob_name + << " (at index " << bottom_id << ") to layer " << layer_id; + } + const int blob_id = (*blob_name_to_idx)[blob_name]; + LOG(INFO) << layer_names_[layer_id] << " <- " << blob_name; + bottom_vecs_[layer_id].push_back(blobs_[blob_id].get()); + bottom_id_vecs_[layer_id].push_back(blob_id); + available_blobs->erase(blob_name); + bool need_backward = param.force_backward() || blob_need_backward_[blob_id]; + return blob_id; +} template void Net::GetLearningRateAndWeightDecay() { From 12f6fd52a8cd5e4b5972f3bf78bb526403c05f77 Mon Sep 17 00:00:00 2001 From: linmin Date: Thu, 22 May 2014 00:15:32 +0800 Subject: [PATCH 0118/2053] add option for lmdb --- Makefile | 1 + include/caffe/data_layers.hpp | 10 +++ src/caffe/layers/data_layer.cpp | 142 ++++++++++++++++++++++++++------ src/caffe/proto/caffe.proto | 5 ++ 4 files changed, 132 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index c43b30ee33a..943165a4642 100644 --- a/Makefile +++ b/Makefile @@ -129,6 +129,7 @@ LIBRARY_DIRS += $(CUDA_LIB_DIR) LIBRARIES := cudart cublas curand \ pthread \ glog protobuf leveldb snappy \ + lmdb \ boost_system \ hdf5_hl hdf5 \ opencv_core opencv_highgui opencv_imgproc diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 3d3ce94bc88..2b4c278eafe 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -8,6 +8,7 @@ #include #include "leveldb/db.h" +#include "lmdb.h" #include "pthread.h" #include "hdf5.h" #include "boost/scoped_ptr.hpp" @@ -133,8 +134,17 @@ class DataLayer : public Layer { virtual unsigned int PrefetchRand(); shared_ptr prefetch_rng_; + + // LEVELDB shared_ptr db_; shared_ptr iter_; + // LMDB + MDB_env* mdb_env_; + MDB_dbi mdb_dbi_; + MDB_txn* mdb_txn_; + MDB_cursor* mdb_cursor_; + MDB_val mdb_key_, mdb_value_; + int datum_channels_; int datum_height_; int datum_width_; diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 348753e5db9..3b307ec7743 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -12,6 +12,7 @@ #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" #include "caffe/vision_layers.hpp" +#include "caffe/proto/caffe.pb.h" using std::string; @@ -46,9 +47,22 @@ void* DataLayerPrefetch(void* layer_pointer) { const Dtype* mean = layer->data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob - CHECK(layer->iter_); - CHECK(layer->iter_->Valid()); - datum.ParseFromString(layer->iter_->value().ToString()); + switch (layer->layer_param_.data_param().backend()) { + case DataParameter_DB_LEVELDB: + CHECK(layer->iter_); + CHECK(layer->iter_->Valid()); + datum.ParseFromString(layer->iter_->value().ToString()); + break; + case DataParameter_DB_LMDB: + CHECK_EQ(mdb_cursor_get(layer->mdb_cursor_, &layer->mdb_key_, + &layer->mdb_value_, MDB_GET_CURRENT), MDB_SUCCESS); + datum.ParseFromArray(layer->mdb_value_.mv_data, + layer->mdb_value_.mv_size); + break; + default: + LOG(FATAL) << "Unknown database backend"; + } + const string& data = datum.data(); if (crop_size) { CHECK(data.size()) << "Image cropping only support uint8 data"; @@ -110,11 +124,26 @@ void* DataLayerPrefetch(void* layer_pointer) { top_label[item_id] = datum.label(); } // go to the next iter - layer->iter_->Next(); - if (!layer->iter_->Valid()) { - // We have reached the end. Restart from the first. - DLOG(INFO) << "Restarting data prefetching from start."; - layer->iter_->SeekToFirst(); + switch (layer->layer_param_.data_param().backend()) { + case DataParameter_DB_LEVELDB: + layer->iter_->Next(); + if (!layer->iter_->Valid()) { + // We have reached the end. Restart from the first. + DLOG(INFO) << "Restarting data prefetching from start."; + layer->iter_->SeekToFirst(); + } + break; + case DataParameter_DB_LMDB: + if (mdb_cursor_get(layer->mdb_cursor_, &layer->mdb_key_, + &layer->mdb_value_, MDB_NEXT) != MDB_SUCCESS) { + // We have reached the end. Restart from the first. + DLOG(INFO) << "Restarting data prefetching from start."; + CHECK_EQ(mdb_cursor_get(layer->mdb_cursor_, &layer->mdb_key_, + &layer->mdb_value_, MDB_FIRST), MDB_SUCCESS); + } + break; + default: + LOG(FATAL) << "Unknown database backend"; } } @@ -124,6 +153,19 @@ void* DataLayerPrefetch(void* layer_pointer) { template DataLayer::~DataLayer() { JoinPrefetchThread(); + // clean up the database resources + switch (this->layer_param_.data_param().backend()) { + case DataParameter_DB_LEVELDB: + break; // do nothing + case DataParameter_DB_LMDB: + mdb_cursor_close(mdb_cursor_); + mdb_close(mdb_env_, mdb_dbi_); + mdb_txn_abort(mdb_txn_); + mdb_env_close(mdb_env_); + break; + default: + LOG(FATAL) << "Unknown database backend"; + } } template @@ -135,35 +177,83 @@ void DataLayer::SetUp(const vector*>& bottom, } else { output_labels_ = true; } - // Initialize the leveldb - leveldb::DB* db_temp; - leveldb::Options options; - options.create_if_missing = false; - options.max_open_files = 100; - LOG(INFO) << "Opening leveldb " << this->layer_param_.data_param().source(); - leveldb::Status status = leveldb::DB::Open( - options, this->layer_param_.data_param().source(), &db_temp); - CHECK(status.ok()) << "Failed to open leveldb " - << this->layer_param_.data_param().source() << std::endl - << status.ToString(); - db_.reset(db_temp); - iter_.reset(db_->NewIterator(leveldb::ReadOptions())); - iter_->SeekToFirst(); + // Initialize DB + switch (this->layer_param_.data_param().backend()) { + case DataParameter_DB_LEVELDB: + { + leveldb::DB* db_temp; + leveldb::Options options; + options.create_if_missing = false; + options.max_open_files = 100; + LOG(INFO) << "Opening leveldb " << this->layer_param_.data_param().source(); + leveldb::Status status = leveldb::DB::Open( + options, this->layer_param_.data_param().source(), &db_temp); + CHECK(status.ok()) << "Failed to open leveldb " + << this->layer_param_.data_param().source() << std::endl + << status.ToString(); + db_.reset(db_temp); + iter_.reset(db_->NewIterator(leveldb::ReadOptions())); + iter_->SeekToFirst(); + } + break; + case DataParameter_DB_LMDB: + CHECK_EQ(mdb_env_create(&mdb_env_), MDB_SUCCESS) << "mdb_env_create failed"; + CHECK_EQ(mdb_env_set_mapsize(mdb_env_, 1099511627776), MDB_SUCCESS); // 1TB + CHECK_EQ(mdb_env_open(mdb_env_, + this->layer_param_.data_param().source().c_str(), + MDB_RDONLY|MDB_NOTLS, 0664), MDB_SUCCESS) << "mdb_env_open failed"; + CHECK_EQ(mdb_txn_begin(mdb_env_, NULL, MDB_RDONLY, &mdb_txn_), MDB_SUCCESS) + << "mdb_txn_begin failed"; + CHECK_EQ(mdb_open(mdb_txn_, NULL, 0, &mdb_dbi_), MDB_SUCCESS) + << "mdb_open failed"; + CHECK_EQ(mdb_cursor_open(mdb_txn_, mdb_dbi_, &mdb_cursor_), MDB_SUCCESS) + << "mdb_cursor_open failed"; + LOG(INFO) << "Opening lmdb " << this->layer_param_.data_param().source(); + CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, MDB_FIRST), + MDB_SUCCESS) << "mdb_cursor_get failed"; + break; + default: + LOG(FATAL) << "Unknown database backend"; + } + // Check if we would need to randomly skip a few data points if (this->layer_param_.data_param().rand_skip()) { unsigned int skip = caffe_rng_rand() % this->layer_param_.data_param().rand_skip(); LOG(INFO) << "Skipping first " << skip << " data points."; while (skip-- > 0) { - iter_->Next(); - if (!iter_->Valid()) { - iter_->SeekToFirst(); + switch (this->layer_param_.data_param().backend()) { + case DataParameter_DB_LEVELDB: + iter_->Next(); + if (!iter_->Valid()) { + iter_->SeekToFirst(); + } + break; + case DataParameter_DB_LMDB: + if(mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, MDB_NEXT) + != MDB_SUCCESS) { + CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, + MDB_FIRST), MDB_SUCCESS); + } + break; + default: + LOG(FATAL) << "Unknown database backend"; } } } // Read a data point, and use it to initialize the top blob. Datum datum; - datum.ParseFromString(iter_->value().ToString()); + switch (this->layer_param_.data_param().backend()) { + case DataParameter_DB_LEVELDB: + datum.ParseFromString(iter_->value().ToString()); + break; + case DataParameter_DB_LMDB: + datum.ParseFromArray(mdb_value_.mv_data, mdb_value_.mv_size); + break; + default: + LOG(FATAL) << "Unknown database backend"; + } + // image int crop_size = this->layer_param_.data_param().crop_size(); if (crop_size > 0) { diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 60c7daa9031..b85b49c77f7 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -229,6 +229,10 @@ message ConvolutionParameter { // Message that stores parameters used by DataLayer message DataParameter { + enum DB { + LEVELDB = 0; + LMDB = 1; + } // Specify the data source. optional string source = 1; // For data pre-processing, we can do simple scaling and subtracting the @@ -247,6 +251,7 @@ message DataParameter { // point would be set as rand_skip * rand(0,1). Note that rand_skip should not // be larger than the number of keys in the leveldb. optional uint32 rand_skip = 7 [default = 0]; + optional DB backend = 8 [default = LEVELDB]; } // Message that stores parameters used by DropoutLayer From f43f555dc03a8bf616c21f9ae6225012bad3ad1b Mon Sep 17 00:00:00 2001 From: linmin Date: Fri, 13 Jun 2014 10:19:33 +0800 Subject: [PATCH 0119/2053] add tests for lmdb of datalayer (copied from test_data_layer.cpp) --- src/caffe/test/test_data_layer_lmdb.cpp | 565 ++++++++++++++++++++++++ 1 file changed, 565 insertions(+) create mode 100644 src/caffe/test/test_data_layer_lmdb.cpp diff --git a/src/caffe/test/test_data_layer_lmdb.cpp b/src/caffe/test/test_data_layer_lmdb.cpp new file mode 100644 index 00000000000..9b5b7d2bfc6 --- /dev/null +++ b/src/caffe/test/test_data_layer_lmdb.cpp @@ -0,0 +1,565 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include +#include + +#include "cuda_runtime.h" +#include "leveldb/db.h" +#include "lmdb.h" +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/test/test_caffe_main.hpp" + +using std::string; +using std::stringstream; + +namespace caffe { + +extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; + +template +class DataLayerTestLmdb : public ::testing::Test { + protected: + DataLayerTestLmdb() + : blob_top_data_(new Blob()), + blob_top_label_(new Blob()), + filename_(new string(tmpnam(NULL))), + seed_(1701) {} + virtual void SetUp() { + blob_top_vec_.push_back(blob_top_data_); + blob_top_vec_.push_back(blob_top_label_); + } + + // Fill the LMDB with data: if unique_pixels, each pixel is unique but + // all images are the same; else each image is unique but all pixels within + // an image are the same. + + void FillLMDB(const bool unique_pixels) { + LOG(INFO) << "Using temporary lmdb " << *filename_; + CHECK_EQ(mkdir(filename_->c_str(), 0744), 0) << "mkdir " << filename_ + << "failed"; + MDB_env *env; + MDB_dbi dbi; + MDB_val mdbkey, mdbdata; + MDB_txn *txn; + CHECK_EQ(mdb_env_create(&env), MDB_SUCCESS) << "mdb_env_create failed"; + CHECK_EQ(mdb_env_set_mapsize(env, 1099511627776), MDB_SUCCESS) // 1TB + << "mdb_env_set_mapsize failed"; + CHECK_EQ(mdb_env_open(env, filename_->c_str(), 0, 0664), MDB_SUCCESS) + << "mdb_env_open failed"; + CHECK_EQ(mdb_txn_begin(env, NULL, 0, &txn), MDB_SUCCESS) + << "mdb_txn_begin failed"; + CHECK_EQ(mdb_open(txn, NULL, 0, &dbi), MDB_SUCCESS) << "mdb_open failed"; + + for (int i = 0; i < 5; ++i) { + Datum datum; + datum.set_label(i); + datum.set_channels(2); + datum.set_height(3); + datum.set_width(4); + std::string* data = datum.mutable_data(); + for (int j = 0; j < 24; ++j) { + int datum = unique_pixels ? j : i; + data->push_back(static_cast(datum)); + } + stringstream ss; + ss << i; + + string value; + datum.SerializeToString(&value); + mdbdata.mv_size = value.size(); + mdbdata.mv_data = reinterpret_cast(&value[0]); + string keystr = ss.str(); + mdbkey.mv_size = keystr.size(); + mdbkey.mv_data = reinterpret_cast(&keystr[0]); + CHECK_EQ(mdb_put(txn, dbi, &mdbkey, &mdbdata, 0), MDB_SUCCESS) + << "mdb_put failed"; + } + CHECK_EQ(mdb_txn_commit(txn), MDB_SUCCESS) << "mdb_txn_commit failed"; + mdb_close(env, dbi); + mdb_env_close(env); + } + + virtual ~DataLayerTestLmdb() { delete blob_top_data_; delete blob_top_label_; } + + shared_ptr filename_; + Blob* const blob_top_data_; + Blob* const blob_top_label_; + vector*> blob_bottom_vec_; + vector*> blob_top_vec_; + int seed_; +}; + +typedef ::testing::Types Dtypes; +TYPED_TEST_CASE(DataLayerTestLmdb, Dtypes); + +TYPED_TEST(DataLayerTestLmdb, TestReadCPU) { + Caffe::set_mode(Caffe::CPU); + const bool unique_pixels = false; // all pixels the same; images different + this->FillLMDB(unique_pixels); + const TypeParam scale = 3; + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_scale(scale); + data_param->set_source(this->filename_->c_str()); + data_param->set_backend(DataParameter_DB_LMDB); + DataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->blob_top_data_->num(), 5); + EXPECT_EQ(this->blob_top_data_->channels(), 2); + EXPECT_EQ(this->blob_top_data_->height(), 3); + EXPECT_EQ(this->blob_top_data_->width(), 4); + EXPECT_EQ(this->blob_top_label_->num(), 5); + EXPECT_EQ(this->blob_top_label_->channels(), 1); + EXPECT_EQ(this->blob_top_label_->height(), 1); + EXPECT_EQ(this->blob_top_label_->width(), 1); + + for (int iter = 0; iter < 100; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 24; ++j) { + EXPECT_EQ(scale * i, this->blob_top_data_->cpu_data()[i * 24 + j]) + << "debug: iter " << iter << " i " << i << " j " << j; + } + } + } +} + +TYPED_TEST(DataLayerTestLmdb, TestReadGPU) { + Caffe::set_mode(Caffe::GPU); + const bool unique_pixels = false; // all pixels the same; images different + this->FillLMDB(unique_pixels); + const TypeParam scale = 3; + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_scale(scale); + data_param->set_source(this->filename_->c_str()); + data_param->set_backend(DataParameter_DB_LMDB); + DataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->blob_top_data_->num(), 5); + EXPECT_EQ(this->blob_top_data_->channels(), 2); + EXPECT_EQ(this->blob_top_data_->height(), 3); + EXPECT_EQ(this->blob_top_data_->width(), 4); + EXPECT_EQ(this->blob_top_label_->num(), 5); + EXPECT_EQ(this->blob_top_label_->channels(), 1); + EXPECT_EQ(this->blob_top_label_->height(), 1); + EXPECT_EQ(this->blob_top_label_->width(), 1); + + for (int iter = 0; iter < 100; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 24; ++j) { + EXPECT_EQ(scale * i, this->blob_top_data_->cpu_data()[i * 24 + j]) + << "debug: iter " << iter << " i " << i << " j " << j; + } + } + } +} + +TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainCPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::CPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + const TypeParam scale = 3; + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_scale(scale); + data_param->set_crop_size(1); + data_param->set_source(this->filename_->c_str()); + data_param->set_backend(DataParameter_DB_LMDB); + DataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->blob_top_data_->num(), 5); + EXPECT_EQ(this->blob_top_data_->channels(), 2); + EXPECT_EQ(this->blob_top_data_->height(), 1); + EXPECT_EQ(this->blob_top_data_->width(), 1); + EXPECT_EQ(this->blob_top_label_->num(), 5); + EXPECT_EQ(this->blob_top_label_->channels(), 1); + EXPECT_EQ(this->blob_top_label_->height(), 1); + EXPECT_EQ(this->blob_top_label_->width(), 1); + + for (int iter = 0; iter < 2; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + int num_with_center_value = 0; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + const TypeParam center_value = scale * (j ? 17 : 5); + num_with_center_value += + (center_value == this->blob_top_data_->cpu_data()[i * 2 + j]); + } + } + // Check we did not get the center crop all 10 times (occurs with + // probability 1-1/12^10 in working implementation). + EXPECT_LT(num_with_center_value, 10); + } +} + +TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainGPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::GPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + const TypeParam scale = 3; + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_scale(scale); + data_param->set_crop_size(1); + data_param->set_source(this->filename_->c_str()); + data_param->set_backend(DataParameter_DB_LMDB); + DataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->blob_top_data_->num(), 5); + EXPECT_EQ(this->blob_top_data_->channels(), 2); + EXPECT_EQ(this->blob_top_data_->height(), 1); + EXPECT_EQ(this->blob_top_data_->width(), 1); + EXPECT_EQ(this->blob_top_label_->num(), 5); + EXPECT_EQ(this->blob_top_label_->channels(), 1); + EXPECT_EQ(this->blob_top_label_->height(), 1); + EXPECT_EQ(this->blob_top_label_->width(), 1); + + for (int iter = 0; iter < 2; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + int num_with_center_value = 0; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + const TypeParam center_value = scale * (j ? 17 : 5); + num_with_center_value += + (center_value == this->blob_top_data_->cpu_data()[i * 2 + j]); + } + } + // Check we did not get the center crop all 10 times (occurs with + // probability 1-1/12^10 in working implementation). + EXPECT_LT(num_with_center_value, 10); + } +} + +// Test that the sequence of random crops is consistent when using +// Caffe::set_random_seed. +TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainSequenceSeededCPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::CPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_crop_size(1); + data_param->set_mirror(true); + data_param->set_source(this->filename_->c_str()); + data_param->set_backend(DataParameter_DB_LMDB); + // Get crop sequence with Caffe seed 1701. + Caffe::set_random_seed(this->seed_); + vector > crop_sequence; + { + DataLayer layer1(param); + layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + vector iter_crop_sequence; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + iter_crop_sequence.push_back( + this->blob_top_data_->cpu_data()[i * 2 + j]); + } + } + crop_sequence.push_back(iter_crop_sequence); + } + } // destroy 1st data layer and unlock the leveldb + + // Get crop sequence after reseeding Caffe with 1701. + // Check that the sequence is the same as the original. + Caffe::set_random_seed(this->seed_); + DataLayer layer2(param); + layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + EXPECT_EQ(crop_sequence[iter][i * 2 + j], + this->blob_top_data_->cpu_data()[i * 2 + j]) + << "debug: iter " << iter << " i " << i << " j " << j; + } + } + } +} + +// Test that the sequence of random crops is consistent when using +// Caffe::set_random_seed. +TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainSequenceSeededGPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::GPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_crop_size(1); + data_param->set_mirror(true); + data_param->set_source(this->filename_->c_str()); + data_param->set_backend(DataParameter_DB_LMDB); + // Get crop sequence with Caffe seed 1701. + Caffe::set_random_seed(this->seed_); + vector > crop_sequence; + { + DataLayer layer1(param); + layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + vector iter_crop_sequence; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + iter_crop_sequence.push_back( + this->blob_top_data_->cpu_data()[i * 2 + j]); + } + } + crop_sequence.push_back(iter_crop_sequence); + } + } // destroy 1st data layer and unlock the leveldb + + // Get crop sequence after reseeding Caffe with 1701. + // Check that the sequence is the same as the original. + Caffe::set_random_seed(this->seed_); + DataLayer layer2(param); + layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + EXPECT_EQ(crop_sequence[iter][i * 2 + j], + this->blob_top_data_->cpu_data()[i * 2 + j]) + << "debug: iter " << iter << " i " << i << " j " << j; + } + } + } +} + +// Test that the sequence of random crops differs across iterations when +// Caffe::set_random_seed isn't called (and seeds from srand are ignored). +TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainSequenceUnseededCPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::CPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_crop_size(1); + data_param->set_mirror(true); + data_param->set_source(this->filename_->c_str()); + data_param->set_backend(DataParameter_DB_LMDB); + // Get crop sequence with Caffe seed 1701, srand seed 1701. + Caffe::set_random_seed(this->seed_); + srand(this->seed_); + vector > crop_sequence; + { + DataLayer layer1(param); + layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + vector iter_crop_sequence; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + iter_crop_sequence.push_back( + this->blob_top_data_->cpu_data()[i * 2 + j]); + } + } + crop_sequence.push_back(iter_crop_sequence); + } + } // destroy 1st data layer and unlock the leveldb + + // Get crop sequence continuing from previous Caffe RNG state; + // reseed srand with 1701. Check that the sequence differs from the original. + srand(this->seed_); + DataLayer layer2(param); + layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + int num_sequence_matches = 0; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + num_sequence_matches += (crop_sequence[iter][i * 2 + j] == + this->blob_top_data_->cpu_data()[i * 2 + j]); + } + } + EXPECT_LT(num_sequence_matches, 10); + } +} + +// Test that the sequence of random crops differs across iterations when +// Caffe::set_random_seed isn't called (and seeds from srand are ignored). +TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainSequenceUnseededGPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::GPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_crop_size(1); + data_param->set_mirror(true); + data_param->set_source(this->filename_->c_str()); + data_param->set_backend(DataParameter_DB_LMDB); + // Get crop sequence with Caffe seed 1701, srand seed 1701. + Caffe::set_random_seed(this->seed_); + srand(this->seed_); + vector > crop_sequence; + { + DataLayer layer1(param); + layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + vector iter_crop_sequence; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + iter_crop_sequence.push_back( + this->blob_top_data_->cpu_data()[i * 2 + j]); + } + } + crop_sequence.push_back(iter_crop_sequence); + } + } // destroy 1st data layer and unlock the leveldb + + // Get crop sequence continuing from previous Caffe RNG state; + // reseed srand with 1701. Check that the sequence differs from the original. + srand(this->seed_); + DataLayer layer2(param); + layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + int num_sequence_matches = 0; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + num_sequence_matches += (crop_sequence[iter][i * 2 + j] == + this->blob_top_data_->cpu_data()[i * 2 + j]); + } + } + EXPECT_LT(num_sequence_matches, 10); + } +} + +TYPED_TEST(DataLayerTestLmdb, TestReadCropTestCPU) { + Caffe::set_phase(Caffe::TEST); + Caffe::set_mode(Caffe::CPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + const TypeParam scale = 3; + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_scale(scale); + data_param->set_crop_size(1); + data_param->set_source(this->filename_->c_str()); + data_param->set_backend(DataParameter_DB_LMDB); + DataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->blob_top_data_->num(), 5); + EXPECT_EQ(this->blob_top_data_->channels(), 2); + EXPECT_EQ(this->blob_top_data_->height(), 1); + EXPECT_EQ(this->blob_top_data_->width(), 1); + EXPECT_EQ(this->blob_top_label_->num(), 5); + EXPECT_EQ(this->blob_top_label_->channels(), 1); + EXPECT_EQ(this->blob_top_label_->height(), 1); + EXPECT_EQ(this->blob_top_label_->width(), 1); + + for (int iter = 0; iter < 2; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + const TypeParam center_value = scale * (j ? 17 : 5); + EXPECT_EQ(center_value, this->blob_top_data_->cpu_data()[i * 2 + j]) + << "debug: iter " << iter << " i " << i << " j " << j; + } + } + } +} + +TYPED_TEST(DataLayerTestLmdb, TestReadCropTestGPU) { + Caffe::set_phase(Caffe::TEST); + Caffe::set_mode(Caffe::GPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + const TypeParam scale = 3; + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_scale(scale); + data_param->set_crop_size(1); + data_param->set_source(this->filename_->c_str()); + data_param->set_backend(DataParameter_DB_LMDB); + DataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->blob_top_data_->num(), 5); + EXPECT_EQ(this->blob_top_data_->channels(), 2); + EXPECT_EQ(this->blob_top_data_->height(), 1); + EXPECT_EQ(this->blob_top_data_->width(), 1); + EXPECT_EQ(this->blob_top_label_->num(), 5); + EXPECT_EQ(this->blob_top_label_->channels(), 1); + EXPECT_EQ(this->blob_top_label_->height(), 1); + EXPECT_EQ(this->blob_top_label_->width(), 1); + + for (int iter = 0; iter < 2; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); + } + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + const TypeParam center_value = scale * (j ? 17 : 5); + EXPECT_EQ(center_value, this->blob_top_data_->cpu_data()[i * 2 + j]) + << "debug: iter " << iter << " i " << i << " j " << j; + } + } + } +} + +} // namespace caffe From c77c6e12e49048e4cfcfac82dee0a8dae3e69d56 Mon Sep 17 00:00:00 2001 From: linmin Date: Fri, 13 Jun 2014 10:26:38 +0800 Subject: [PATCH 0120/2053] fixed cpplint error --- src/caffe/test/test_data_layer_lmdb.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/caffe/test/test_data_layer_lmdb.cpp b/src/caffe/test/test_data_layer_lmdb.cpp index 9b5b7d2bfc6..f3f9d723b5b 100644 --- a/src/caffe/test/test_data_layer_lmdb.cpp +++ b/src/caffe/test/test_data_layer_lmdb.cpp @@ -1,8 +1,8 @@ // Copyright 2014 BVLC and contributors. +#include #include #include -#include #include "cuda_runtime.h" #include "leveldb/db.h" @@ -48,7 +48,7 @@ class DataLayerTestLmdb : public ::testing::Test { MDB_val mdbkey, mdbdata; MDB_txn *txn; CHECK_EQ(mdb_env_create(&env), MDB_SUCCESS) << "mdb_env_create failed"; - CHECK_EQ(mdb_env_set_mapsize(env, 1099511627776), MDB_SUCCESS) // 1TB + CHECK_EQ(mdb_env_set_mapsize(env, 1099511627776), MDB_SUCCESS) // 1TB << "mdb_env_set_mapsize failed"; CHECK_EQ(mdb_env_open(env, filename_->c_str(), 0, 0664), MDB_SUCCESS) << "mdb_env_open failed"; @@ -85,7 +85,10 @@ class DataLayerTestLmdb : public ::testing::Test { mdb_env_close(env); } - virtual ~DataLayerTestLmdb() { delete blob_top_data_; delete blob_top_label_; } + virtual ~DataLayerTestLmdb() { + delete blob_top_data_; + delete blob_top_label_; + } shared_ptr filename_; Blob* const blob_top_data_; From c17e413b305c29f64fdaa348d070478414a208a6 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 12 Jun 2014 22:29:59 -0700 Subject: [PATCH 0121/2053] lint --- src/caffe/layers/data_layer.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 3b307ec7743..f12ae1c12e1 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -156,7 +156,7 @@ DataLayer::~DataLayer() { // clean up the database resources switch (this->layer_param_.data_param().backend()) { case DataParameter_DB_LEVELDB: - break; // do nothing + break; // do nothing case DataParameter_DB_LMDB: mdb_cursor_close(mdb_cursor_); mdb_close(mdb_env_, mdb_dbi_); @@ -198,10 +198,10 @@ void DataLayer::SetUp(const vector*>& bottom, break; case DataParameter_DB_LMDB: CHECK_EQ(mdb_env_create(&mdb_env_), MDB_SUCCESS) << "mdb_env_create failed"; - CHECK_EQ(mdb_env_set_mapsize(mdb_env_, 1099511627776), MDB_SUCCESS); // 1TB + CHECK_EQ(mdb_env_set_mapsize(mdb_env_, 1099511627776), MDB_SUCCESS); // 1TB CHECK_EQ(mdb_env_open(mdb_env_, - this->layer_param_.data_param().source().c_str(), - MDB_RDONLY|MDB_NOTLS, 0664), MDB_SUCCESS) << "mdb_env_open failed"; + this->layer_param_.data_param().source().c_str(), + MDB_RDONLY|MDB_NOTLS, 0664), MDB_SUCCESS) << "mdb_env_open failed"; CHECK_EQ(mdb_txn_begin(mdb_env_, NULL, MDB_RDONLY, &mdb_txn_), MDB_SUCCESS) << "mdb_txn_begin failed"; CHECK_EQ(mdb_open(mdb_txn_, NULL, 0, &mdb_dbi_), MDB_SUCCESS) @@ -230,10 +230,10 @@ void DataLayer::SetUp(const vector*>& bottom, } break; case DataParameter_DB_LMDB: - if(mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, MDB_NEXT) + if (mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, MDB_NEXT) != MDB_SUCCESS) { CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, - MDB_FIRST), MDB_SUCCESS); + MDB_FIRST), MDB_SUCCESS); } break; default: From f8ebd09d067d893289e34b0ccc8ac2d2ac2cca8f Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 12 Jun 2014 22:51:33 -0700 Subject: [PATCH 0122/2053] unify test_data_layer tests --- src/caffe/test/test_data_layer.cpp | 573 ++++++++++------------------- 1 file changed, 191 insertions(+), 382 deletions(-) diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 1eae1a4e068..98ac60d47b4 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -63,6 +63,187 @@ class DataLayerTest : public ::testing::Test { delete db; } + void TestRead() { + const Dtype scale = 3; + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_scale(scale); + data_param->set_source(filename_->c_str()); + DataLayer layer(param); + layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + EXPECT_EQ(blob_top_data_->num(), 5); + EXPECT_EQ(blob_top_data_->channels(), 2); + EXPECT_EQ(blob_top_data_->height(), 3); + EXPECT_EQ(blob_top_data_->width(), 4); + EXPECT_EQ(blob_top_label_->num(), 5); + EXPECT_EQ(blob_top_label_->channels(), 1); + EXPECT_EQ(blob_top_label_->height(), 1); + EXPECT_EQ(blob_top_label_->width(), 1); + + for (int iter = 0; iter < 100; ++iter) { + layer.Forward(blob_bottom_vec_, &blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); + } + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 24; ++j) { + EXPECT_EQ(scale * i, blob_top_data_->cpu_data()[i * 24 + j]) + << "debug: iter " << iter << " i " << i << " j " << j; + } + } + } + } + + void TestReadCrop() { + const Dtype scale = 3; + LayerParameter param; + Caffe::set_random_seed(1701); + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_scale(scale); + data_param->set_crop_size(1); + data_param->set_source(filename_->c_str()); + DataLayer layer(param); + layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + EXPECT_EQ(blob_top_data_->num(), 5); + EXPECT_EQ(blob_top_data_->channels(), 2); + EXPECT_EQ(blob_top_data_->height(), 1); + EXPECT_EQ(blob_top_data_->width(), 1); + EXPECT_EQ(blob_top_label_->num(), 5); + EXPECT_EQ(blob_top_label_->channels(), 1); + EXPECT_EQ(blob_top_label_->height(), 1); + EXPECT_EQ(blob_top_label_->width(), 1); + + for (int iter = 0; iter < 2; ++iter) { + layer.Forward(blob_bottom_vec_, &blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); + } + int num_with_center_value = 0; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + const Dtype center_value = scale * (j ? 17 : 5); + num_with_center_value += + (center_value == blob_top_data_->cpu_data()[i * 2 + j]); + // At TEST time, check that we always get center value. + if (Caffe::phase() == Caffe::TEST) { + EXPECT_EQ(center_value, this->blob_top_data_->cpu_data()[i * 2 + j]) + << "debug: iter " << iter << " i " << i << " j " << j; + } + } + } + // At TRAIN time, check that we did not get the center crop all 10 times. + // (This check fails with probability 1-1/12^10 in a correct + // implementation, so we call set_random_seed.) + if (Caffe::phase() == Caffe::TRAIN) { + EXPECT_LT(num_with_center_value, 10); + } + } + } + + void TestReadCropTrainSequenceSeeded() { + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_crop_size(1); + data_param->set_mirror(true); + data_param->set_source(filename_->c_str()); + + // Get crop sequence with Caffe seed 1701. + Caffe::set_random_seed(seed_); + vector > crop_sequence; + { + DataLayer layer1(param); + layer1.SetUp(blob_bottom_vec_, &blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer1.Forward(blob_bottom_vec_, &blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); + } + vector iter_crop_sequence; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + iter_crop_sequence.push_back( + blob_top_data_->cpu_data()[i * 2 + j]); + } + } + crop_sequence.push_back(iter_crop_sequence); + } + } // destroy 1st data layer and unlock the leveldb + + // Get crop sequence after reseeding Caffe with 1701. + // Check that the sequence is the same as the original. + Caffe::set_random_seed(seed_); + DataLayer layer2(param); + layer2.SetUp(blob_bottom_vec_, &blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer2.Forward(blob_bottom_vec_, &blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); + } + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + EXPECT_EQ(crop_sequence[iter][i * 2 + j], + blob_top_data_->cpu_data()[i * 2 + j]) + << "debug: iter " << iter << " i " << i << " j " << j; + } + } + } + } + + void TestReadCropTrainSequenceUnseeded() { + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(5); + data_param->set_crop_size(1); + data_param->set_mirror(true); + data_param->set_source(filename_->c_str()); + + // Get crop sequence with Caffe seed 1701, srand seed 1701. + Caffe::set_random_seed(seed_); + srand(seed_); + vector > crop_sequence; + { + DataLayer layer1(param); + layer1.SetUp(blob_bottom_vec_, &blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer1.Forward(blob_bottom_vec_, &blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); + } + vector iter_crop_sequence; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + iter_crop_sequence.push_back( + blob_top_data_->cpu_data()[i * 2 + j]); + } + } + crop_sequence.push_back(iter_crop_sequence); + } + } // destroy 1st data layer and unlock the leveldb + + // Get crop sequence continuing from previous Caffe RNG state; + // reseed srand with 1701. Check that the sequence differs from the original. + srand(seed_); + DataLayer layer2(param); + layer2.SetUp(blob_bottom_vec_, &blob_top_vec_); + for (int iter = 0; iter < 2; ++iter) { + layer2.Forward(blob_bottom_vec_, &blob_top_vec_); + for (int i = 0; i < 5; ++i) { + EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); + } + int num_sequence_matches = 0; + for (int i = 0; i < 5; ++i) { + for (int j = 0; j < 2; ++j) { + num_sequence_matches += (crop_sequence[iter][i * 2 + j] == + blob_top_data_->cpu_data()[i * 2 + j]); + } + } + EXPECT_LT(num_sequence_matches, 10); + } + } + virtual ~DataLayerTest() { delete blob_top_data_; delete blob_top_label_; } shared_ptr filename_; @@ -80,70 +261,14 @@ TYPED_TEST(DataLayerTest, TestReadCPU) { Caffe::set_mode(Caffe::CPU); const bool unique_pixels = false; // all pixels the same; images different this->FillLevelDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_source(this->filename_->c_str()); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 3); - EXPECT_EQ(this->blob_top_data_->width(), 4); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 100; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 24; ++j) { - EXPECT_EQ(scale * i, this->blob_top_data_->cpu_data()[i * 24 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } + this->TestRead(); } TYPED_TEST(DataLayerTest, TestReadGPU) { Caffe::set_mode(Caffe::GPU); const bool unique_pixels = false; // all pixels the same; images different this->FillLevelDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_source(this->filename_->c_str()); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 3); - EXPECT_EQ(this->blob_top_data_->width(), 4); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 100; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 24; ++j) { - EXPECT_EQ(scale * i, this->blob_top_data_->cpu_data()[i * 24 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } + this->TestRead(); } TYPED_TEST(DataLayerTest, TestReadCropTrainCPU) { @@ -151,41 +276,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainCPU) { Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_crop_size(1); - data_param->set_source(this->filename_->c_str()); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 1); - EXPECT_EQ(this->blob_top_data_->width(), 1); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - int num_with_center_value = 0; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - const TypeParam center_value = scale * (j ? 17 : 5); - num_with_center_value += - (center_value == this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - // Check we did not get the center crop all 10 times (occurs with - // probability 1-1/12^10 in working implementation). - EXPECT_LT(num_with_center_value, 10); - } + this->TestReadCrop(); } TYPED_TEST(DataLayerTest, TestReadCropTrainGPU) { @@ -193,41 +284,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainGPU) { Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_crop_size(1); - data_param->set_source(this->filename_->c_str()); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 1); - EXPECT_EQ(this->blob_top_data_->width(), 1); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - int num_with_center_value = 0; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - const TypeParam center_value = scale * (j ? 17 : 5); - num_with_center_value += - (center_value == this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - // Check we did not get the center crop all 10 times (occurs with - // probability 1-1/12^10 in working implementation). - EXPECT_LT(num_with_center_value, 10); - } + this->TestReadCrop(); } // Test that the sequence of random crops is consistent when using @@ -237,53 +294,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededCPU) { Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_crop_size(1); - data_param->set_mirror(true); - data_param->set_source(this->filename_->c_str()); - - // Get crop sequence with Caffe seed 1701. - Caffe::set_random_seed(this->seed_); - vector > crop_sequence; - { - DataLayer layer1(param); - layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - vector iter_crop_sequence; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - iter_crop_sequence.push_back( - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - crop_sequence.push_back(iter_crop_sequence); - } - } // destroy 1st data layer and unlock the leveldb - - // Get crop sequence after reseeding Caffe with 1701. - // Check that the sequence is the same as the original. - Caffe::set_random_seed(this->seed_); - DataLayer layer2(param); - layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - EXPECT_EQ(crop_sequence[iter][i * 2 + j], - this->blob_top_data_->cpu_data()[i * 2 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } + this->TestReadCropTrainSequenceSeeded(); } // Test that the sequence of random crops is consistent when using @@ -293,53 +304,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededGPU) { Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_crop_size(1); - data_param->set_mirror(true); - data_param->set_source(this->filename_->c_str()); - - // Get crop sequence with Caffe seed 1701. - Caffe::set_random_seed(this->seed_); - vector > crop_sequence; - { - DataLayer layer1(param); - layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - vector iter_crop_sequence; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - iter_crop_sequence.push_back( - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - crop_sequence.push_back(iter_crop_sequence); - } - } // destroy 1st data layer and unlock the leveldb - - // Get crop sequence after reseeding Caffe with 1701. - // Check that the sequence is the same as the original. - Caffe::set_random_seed(this->seed_); - DataLayer layer2(param); - layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - EXPECT_EQ(crop_sequence[iter][i * 2 + j], - this->blob_top_data_->cpu_data()[i * 2 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } + this->TestReadCropTrainSequenceSeeded(); } // Test that the sequence of random crops differs across iterations when @@ -349,55 +314,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededCPU) { Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_crop_size(1); - data_param->set_mirror(true); - data_param->set_source(this->filename_->c_str()); - - // Get crop sequence with Caffe seed 1701, srand seed 1701. - Caffe::set_random_seed(this->seed_); - srand(this->seed_); - vector > crop_sequence; - { - DataLayer layer1(param); - layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - vector iter_crop_sequence; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - iter_crop_sequence.push_back( - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - crop_sequence.push_back(iter_crop_sequence); - } - } // destroy 1st data layer and unlock the leveldb - - // Get crop sequence continuing from previous Caffe RNG state; - // reseed srand with 1701. Check that the sequence differs from the original. - srand(this->seed_); - DataLayer layer2(param); - layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - int num_sequence_matches = 0; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - num_sequence_matches += (crop_sequence[iter][i * 2 + j] == - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - EXPECT_LT(num_sequence_matches, 10); - } + this->TestReadCropTrainSequenceUnseeded(); } // Test that the sequence of random crops differs across iterations when @@ -407,55 +324,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededGPU) { Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_crop_size(1); - data_param->set_mirror(true); - data_param->set_source(this->filename_->c_str()); - - // Get crop sequence with Caffe seed 1701, srand seed 1701. - Caffe::set_random_seed(this->seed_); - srand(this->seed_); - vector > crop_sequence; - { - DataLayer layer1(param); - layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - vector iter_crop_sequence; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - iter_crop_sequence.push_back( - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - crop_sequence.push_back(iter_crop_sequence); - } - } // destroy 1st data layer and unlock the leveldb - - // Get crop sequence continuing from previous Caffe RNG state; - // reseed srand with 1701. Check that the sequence differs from the original. - srand(this->seed_); - DataLayer layer2(param); - layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - int num_sequence_matches = 0; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - num_sequence_matches += (crop_sequence[iter][i * 2 + j] == - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - EXPECT_LT(num_sequence_matches, 10); - } + this->TestReadCropTrainSequenceUnseeded(); } TYPED_TEST(DataLayerTest, TestReadCropTestCPU) { @@ -463,37 +332,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTestCPU) { Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_crop_size(1); - data_param->set_source(this->filename_->c_str()); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 1); - EXPECT_EQ(this->blob_top_data_->width(), 1); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - const TypeParam center_value = scale * (j ? 17 : 5); - EXPECT_EQ(center_value, this->blob_top_data_->cpu_data()[i * 2 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } + this->TestReadCrop(); } TYPED_TEST(DataLayerTest, TestReadCropTestGPU) { @@ -501,37 +340,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTestGPU) { Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_crop_size(1); - data_param->set_source(this->filename_->c_str()); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 1); - EXPECT_EQ(this->blob_top_data_->width(), 1); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - const TypeParam center_value = scale * (j ? 17 : 5); - EXPECT_EQ(center_value, this->blob_top_data_->cpu_data()[i * 2 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } + this->TestReadCrop(); } } // namespace caffe From 1dd0d94bbea53bd080ad48ae15d53e4e9d47cad7 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 12 Jun 2014 23:07:23 -0700 Subject: [PATCH 0123/2053] unify data layer tests: was copied four times for all combinations of cpu/gpu and leveldb/lmdb; now just one copy of each test body --- src/caffe/test/test_data_layer.cpp | 167 ++++++- src/caffe/test/test_data_layer_lmdb.cpp | 568 ------------------------ 2 files changed, 154 insertions(+), 581 deletions(-) delete mode 100644 src/caffe/test/test_data_layer_lmdb.cpp diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 98ac60d47b4..68f2618d323 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -27,6 +27,7 @@ class DataLayerTest : public ::testing::Test { : blob_top_data_(new Blob()), blob_top_label_(new Blob()), filename_(new string(tmpnam(NULL))), + backend_(DataParameter_DB_LEVELDB), seed_(1701) {} virtual void SetUp() { blob_top_vec_.push_back(blob_top_data_); @@ -37,6 +38,7 @@ class DataLayerTest : public ::testing::Test { // all images are the same; else each image is unique but all pixels within // an image are the same. void FillLevelDB(const bool unique_pixels) { + backend_ = DataParameter_DB_LEVELDB; LOG(INFO) << "Using temporary leveldb " << *filename_; leveldb::DB* db; leveldb::Options options; @@ -63,6 +65,54 @@ class DataLayerTest : public ::testing::Test { delete db; } + // Fill the LMDB with data: unique_pixels has same meaning as in FillLevelDB. + void FillLMDB(const bool unique_pixels) { + backend_ = DataParameter_DB_LMDB; + LOG(INFO) << "Using temporary lmdb " << *filename_; + CHECK_EQ(mkdir(filename_->c_str(), 0744), 0) << "mkdir " << filename_ + << "failed"; + MDB_env *env; + MDB_dbi dbi; + MDB_val mdbkey, mdbdata; + MDB_txn *txn; + CHECK_EQ(mdb_env_create(&env), MDB_SUCCESS) << "mdb_env_create failed"; + CHECK_EQ(mdb_env_set_mapsize(env, 1099511627776), MDB_SUCCESS) // 1TB + << "mdb_env_set_mapsize failed"; + CHECK_EQ(mdb_env_open(env, filename_->c_str(), 0, 0664), MDB_SUCCESS) + << "mdb_env_open failed"; + CHECK_EQ(mdb_txn_begin(env, NULL, 0, &txn), MDB_SUCCESS) + << "mdb_txn_begin failed"; + CHECK_EQ(mdb_open(txn, NULL, 0, &dbi), MDB_SUCCESS) << "mdb_open failed"; + + for (int i = 0; i < 5; ++i) { + Datum datum; + datum.set_label(i); + datum.set_channels(2); + datum.set_height(3); + datum.set_width(4); + std::string* data = datum.mutable_data(); + for (int j = 0; j < 24; ++j) { + int datum = unique_pixels ? j : i; + data->push_back(static_cast(datum)); + } + stringstream ss; + ss << i; + + string value; + datum.SerializeToString(&value); + mdbdata.mv_size = value.size(); + mdbdata.mv_data = reinterpret_cast(&value[0]); + string keystr = ss.str(); + mdbkey.mv_size = keystr.size(); + mdbkey.mv_data = reinterpret_cast(&keystr[0]); + CHECK_EQ(mdb_put(txn, dbi, &mdbkey, &mdbdata, 0), MDB_SUCCESS) + << "mdb_put failed"; + } + CHECK_EQ(mdb_txn_commit(txn), MDB_SUCCESS) << "mdb_txn_commit failed"; + mdb_close(env, dbi); + mdb_env_close(env); + } + void TestRead() { const Dtype scale = 3; LayerParameter param; @@ -70,6 +120,7 @@ class DataLayerTest : public ::testing::Test { data_param->set_batch_size(5); data_param->set_scale(scale); data_param->set_source(filename_->c_str()); + data_param->set_backend(backend_); DataLayer layer(param); layer.SetUp(blob_bottom_vec_, &blob_top_vec_); EXPECT_EQ(blob_top_data_->num(), 5); @@ -104,6 +155,7 @@ class DataLayerTest : public ::testing::Test { data_param->set_scale(scale); data_param->set_crop_size(1); data_param->set_source(filename_->c_str()); + data_param->set_backend(backend_); DataLayer layer(param); layer.SetUp(blob_bottom_vec_, &blob_top_vec_); EXPECT_EQ(blob_top_data_->num(), 5); @@ -134,7 +186,7 @@ class DataLayerTest : public ::testing::Test { } } // At TRAIN time, check that we did not get the center crop all 10 times. - // (This check fails with probability 1-1/12^10 in a correct + // (This check fails with probability 1-1/12^10 in a correct // implementation, so we call set_random_seed.) if (Caffe::phase() == Caffe::TRAIN) { EXPECT_LT(num_with_center_value, 10); @@ -149,6 +201,7 @@ class DataLayerTest : public ::testing::Test { data_param->set_crop_size(1); data_param->set_mirror(true); data_param->set_source(filename_->c_str()); + data_param->set_backend(backend_); // Get crop sequence with Caffe seed 1701. Caffe::set_random_seed(seed_); @@ -199,6 +252,7 @@ class DataLayerTest : public ::testing::Test { data_param->set_crop_size(1); data_param->set_mirror(true); data_param->set_source(filename_->c_str()); + data_param->set_backend(backend_); // Get crop sequence with Caffe seed 1701, srand seed 1701. Caffe::set_random_seed(seed_); @@ -223,8 +277,8 @@ class DataLayerTest : public ::testing::Test { } } // destroy 1st data layer and unlock the leveldb - // Get crop sequence continuing from previous Caffe RNG state; - // reseed srand with 1701. Check that the sequence differs from the original. + // Get crop sequence continuing from previous Caffe RNG state; reseed + // srand with 1701. Check that the sequence differs from the original. srand(seed_); DataLayer layer2(param); layer2.SetUp(blob_bottom_vec_, &blob_top_vec_); @@ -246,6 +300,7 @@ class DataLayerTest : public ::testing::Test { virtual ~DataLayerTest() { delete blob_top_data_; delete blob_top_label_; } + DataParameter_DB backend_; shared_ptr filename_; Blob* const blob_top_data_; Blob* const blob_top_label_; @@ -257,21 +312,21 @@ class DataLayerTest : public ::testing::Test { typedef ::testing::Types Dtypes; TYPED_TEST_CASE(DataLayerTest, Dtypes); -TYPED_TEST(DataLayerTest, TestReadCPU) { +TYPED_TEST(DataLayerTest, TestReadLevelDBCPU) { Caffe::set_mode(Caffe::CPU); const bool unique_pixels = false; // all pixels the same; images different this->FillLevelDB(unique_pixels); this->TestRead(); } -TYPED_TEST(DataLayerTest, TestReadGPU) { +TYPED_TEST(DataLayerTest, TestReadLevelDBGPU) { Caffe::set_mode(Caffe::GPU); const bool unique_pixels = false; // all pixels the same; images different this->FillLevelDB(unique_pixels); this->TestRead(); } -TYPED_TEST(DataLayerTest, TestReadCropTrainCPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainLevelDBCPU) { Caffe::set_phase(Caffe::TRAIN); Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different @@ -279,7 +334,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainCPU) { this->TestReadCrop(); } -TYPED_TEST(DataLayerTest, TestReadCropTrainGPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainLevelDBGPU) { Caffe::set_phase(Caffe::TRAIN); Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different @@ -289,7 +344,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainGPU) { // Test that the sequence of random crops is consistent when using // Caffe::set_random_seed. -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededCPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLevelDBCPU) { Caffe::set_phase(Caffe::TRAIN); Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different @@ -299,7 +354,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededCPU) { // Test that the sequence of random crops is consistent when using // Caffe::set_random_seed. -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededGPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLevelDBGPU) { Caffe::set_phase(Caffe::TRAIN); Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different @@ -309,7 +364,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededGPU) { // Test that the sequence of random crops differs across iterations when // Caffe::set_random_seed isn't called (and seeds from srand are ignored). -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededCPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLevelDBCPU) { Caffe::set_phase(Caffe::TRAIN); Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different @@ -319,7 +374,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededCPU) { // Test that the sequence of random crops differs across iterations when // Caffe::set_random_seed isn't called (and seeds from srand are ignored). -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededGPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLevelDBGPU) { Caffe::set_phase(Caffe::TRAIN); Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different @@ -327,7 +382,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededGPU) { this->TestReadCropTrainSequenceUnseeded(); } -TYPED_TEST(DataLayerTest, TestReadCropTestCPU) { +TYPED_TEST(DataLayerTest, TestReadCropTestLevelDBCPU) { Caffe::set_phase(Caffe::TEST); Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different @@ -335,7 +390,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTestCPU) { this->TestReadCrop(); } -TYPED_TEST(DataLayerTest, TestReadCropTestGPU) { +TYPED_TEST(DataLayerTest, TestReadCropTestLevelDBGPU) { Caffe::set_phase(Caffe::TEST); Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different @@ -343,4 +398,90 @@ TYPED_TEST(DataLayerTest, TestReadCropTestGPU) { this->TestReadCrop(); } +TYPED_TEST(DataLayerTest, TestReadLMDBCPU) { + Caffe::set_mode(Caffe::CPU); + const bool unique_pixels = false; // all pixels the same; images different + this->FillLMDB(unique_pixels); + this->TestRead(); +} + +TYPED_TEST(DataLayerTest, TestReadLMDBGPU) { + Caffe::set_mode(Caffe::GPU); + const bool unique_pixels = false; // all pixels the same; images different + this->FillLMDB(unique_pixels); + this->TestRead(); +} + +TYPED_TEST(DataLayerTest, TestReadCropTrainLMDBCPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::CPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + this->TestReadCrop(); +} + +TYPED_TEST(DataLayerTest, TestReadCropTrainLMDBGPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::GPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + this->TestReadCrop(); +} + +// Test that the sequence of random crops is consistent when using +// Caffe::set_random_seed. +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLMDBCPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::CPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + this->TestReadCropTrainSequenceSeeded(); +} + +// Test that the sequence of random crops is consistent when using +// Caffe::set_random_seed. +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLMDBGPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::GPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + this->TestReadCropTrainSequenceSeeded(); +} + +// Test that the sequence of random crops differs across iterations when +// Caffe::set_random_seed isn't called (and seeds from srand are ignored). +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLMDBCPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::CPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + this->TestReadCropTrainSequenceUnseeded(); +} + +// Test that the sequence of random crops differs across iterations when +// Caffe::set_random_seed isn't called (and seeds from srand are ignored). +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLMDBGPU) { + Caffe::set_phase(Caffe::TRAIN); + Caffe::set_mode(Caffe::GPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + this->TestReadCropTrainSequenceUnseeded(); +} + +TYPED_TEST(DataLayerTest, TestReadCropTestLMDBCPU) { + Caffe::set_phase(Caffe::TEST); + Caffe::set_mode(Caffe::CPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + this->TestReadCrop(); +} + +TYPED_TEST(DataLayerTest, TestReadCropTestLMDBGPU) { + Caffe::set_phase(Caffe::TEST); + Caffe::set_mode(Caffe::GPU); + const bool unique_pixels = true; // all images the same; pixels different + this->FillLMDB(unique_pixels); + this->TestReadCrop(); +} + } // namespace caffe diff --git a/src/caffe/test/test_data_layer_lmdb.cpp b/src/caffe/test/test_data_layer_lmdb.cpp deleted file mode 100644 index f3f9d723b5b..00000000000 --- a/src/caffe/test/test_data_layer_lmdb.cpp +++ /dev/null @@ -1,568 +0,0 @@ -// Copyright 2014 BVLC and contributors. - -#include -#include -#include - -#include "cuda_runtime.h" -#include "leveldb/db.h" -#include "lmdb.h" -#include "gtest/gtest.h" -#include "caffe/blob.hpp" -#include "caffe/common.hpp" -#include "caffe/filler.hpp" -#include "caffe/vision_layers.hpp" -#include "caffe/proto/caffe.pb.h" -#include "caffe/test/test_caffe_main.hpp" - -using std::string; -using std::stringstream; - -namespace caffe { - -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - -template -class DataLayerTestLmdb : public ::testing::Test { - protected: - DataLayerTestLmdb() - : blob_top_data_(new Blob()), - blob_top_label_(new Blob()), - filename_(new string(tmpnam(NULL))), - seed_(1701) {} - virtual void SetUp() { - blob_top_vec_.push_back(blob_top_data_); - blob_top_vec_.push_back(blob_top_label_); - } - - // Fill the LMDB with data: if unique_pixels, each pixel is unique but - // all images are the same; else each image is unique but all pixels within - // an image are the same. - - void FillLMDB(const bool unique_pixels) { - LOG(INFO) << "Using temporary lmdb " << *filename_; - CHECK_EQ(mkdir(filename_->c_str(), 0744), 0) << "mkdir " << filename_ - << "failed"; - MDB_env *env; - MDB_dbi dbi; - MDB_val mdbkey, mdbdata; - MDB_txn *txn; - CHECK_EQ(mdb_env_create(&env), MDB_SUCCESS) << "mdb_env_create failed"; - CHECK_EQ(mdb_env_set_mapsize(env, 1099511627776), MDB_SUCCESS) // 1TB - << "mdb_env_set_mapsize failed"; - CHECK_EQ(mdb_env_open(env, filename_->c_str(), 0, 0664), MDB_SUCCESS) - << "mdb_env_open failed"; - CHECK_EQ(mdb_txn_begin(env, NULL, 0, &txn), MDB_SUCCESS) - << "mdb_txn_begin failed"; - CHECK_EQ(mdb_open(txn, NULL, 0, &dbi), MDB_SUCCESS) << "mdb_open failed"; - - for (int i = 0; i < 5; ++i) { - Datum datum; - datum.set_label(i); - datum.set_channels(2); - datum.set_height(3); - datum.set_width(4); - std::string* data = datum.mutable_data(); - for (int j = 0; j < 24; ++j) { - int datum = unique_pixels ? j : i; - data->push_back(static_cast(datum)); - } - stringstream ss; - ss << i; - - string value; - datum.SerializeToString(&value); - mdbdata.mv_size = value.size(); - mdbdata.mv_data = reinterpret_cast(&value[0]); - string keystr = ss.str(); - mdbkey.mv_size = keystr.size(); - mdbkey.mv_data = reinterpret_cast(&keystr[0]); - CHECK_EQ(mdb_put(txn, dbi, &mdbkey, &mdbdata, 0), MDB_SUCCESS) - << "mdb_put failed"; - } - CHECK_EQ(mdb_txn_commit(txn), MDB_SUCCESS) << "mdb_txn_commit failed"; - mdb_close(env, dbi); - mdb_env_close(env); - } - - virtual ~DataLayerTestLmdb() { - delete blob_top_data_; - delete blob_top_label_; - } - - shared_ptr filename_; - Blob* const blob_top_data_; - Blob* const blob_top_label_; - vector*> blob_bottom_vec_; - vector*> blob_top_vec_; - int seed_; -}; - -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(DataLayerTestLmdb, Dtypes); - -TYPED_TEST(DataLayerTestLmdb, TestReadCPU) { - Caffe::set_mode(Caffe::CPU); - const bool unique_pixels = false; // all pixels the same; images different - this->FillLMDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_source(this->filename_->c_str()); - data_param->set_backend(DataParameter_DB_LMDB); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 3); - EXPECT_EQ(this->blob_top_data_->width(), 4); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 100; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 24; ++j) { - EXPECT_EQ(scale * i, this->blob_top_data_->cpu_data()[i * 24 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } -} - -TYPED_TEST(DataLayerTestLmdb, TestReadGPU) { - Caffe::set_mode(Caffe::GPU); - const bool unique_pixels = false; // all pixels the same; images different - this->FillLMDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_source(this->filename_->c_str()); - data_param->set_backend(DataParameter_DB_LMDB); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 3); - EXPECT_EQ(this->blob_top_data_->width(), 4); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 100; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 24; ++j) { - EXPECT_EQ(scale * i, this->blob_top_data_->cpu_data()[i * 24 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } -} - -TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainCPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::CPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_crop_size(1); - data_param->set_source(this->filename_->c_str()); - data_param->set_backend(DataParameter_DB_LMDB); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 1); - EXPECT_EQ(this->blob_top_data_->width(), 1); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - int num_with_center_value = 0; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - const TypeParam center_value = scale * (j ? 17 : 5); - num_with_center_value += - (center_value == this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - // Check we did not get the center crop all 10 times (occurs with - // probability 1-1/12^10 in working implementation). - EXPECT_LT(num_with_center_value, 10); - } -} - -TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainGPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::GPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_crop_size(1); - data_param->set_source(this->filename_->c_str()); - data_param->set_backend(DataParameter_DB_LMDB); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 1); - EXPECT_EQ(this->blob_top_data_->width(), 1); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - int num_with_center_value = 0; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - const TypeParam center_value = scale * (j ? 17 : 5); - num_with_center_value += - (center_value == this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - // Check we did not get the center crop all 10 times (occurs with - // probability 1-1/12^10 in working implementation). - EXPECT_LT(num_with_center_value, 10); - } -} - -// Test that the sequence of random crops is consistent when using -// Caffe::set_random_seed. -TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainSequenceSeededCPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::CPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_crop_size(1); - data_param->set_mirror(true); - data_param->set_source(this->filename_->c_str()); - data_param->set_backend(DataParameter_DB_LMDB); - // Get crop sequence with Caffe seed 1701. - Caffe::set_random_seed(this->seed_); - vector > crop_sequence; - { - DataLayer layer1(param); - layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - vector iter_crop_sequence; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - iter_crop_sequence.push_back( - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - crop_sequence.push_back(iter_crop_sequence); - } - } // destroy 1st data layer and unlock the leveldb - - // Get crop sequence after reseeding Caffe with 1701. - // Check that the sequence is the same as the original. - Caffe::set_random_seed(this->seed_); - DataLayer layer2(param); - layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - EXPECT_EQ(crop_sequence[iter][i * 2 + j], - this->blob_top_data_->cpu_data()[i * 2 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } -} - -// Test that the sequence of random crops is consistent when using -// Caffe::set_random_seed. -TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainSequenceSeededGPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::GPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_crop_size(1); - data_param->set_mirror(true); - data_param->set_source(this->filename_->c_str()); - data_param->set_backend(DataParameter_DB_LMDB); - // Get crop sequence with Caffe seed 1701. - Caffe::set_random_seed(this->seed_); - vector > crop_sequence; - { - DataLayer layer1(param); - layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - vector iter_crop_sequence; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - iter_crop_sequence.push_back( - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - crop_sequence.push_back(iter_crop_sequence); - } - } // destroy 1st data layer and unlock the leveldb - - // Get crop sequence after reseeding Caffe with 1701. - // Check that the sequence is the same as the original. - Caffe::set_random_seed(this->seed_); - DataLayer layer2(param); - layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - EXPECT_EQ(crop_sequence[iter][i * 2 + j], - this->blob_top_data_->cpu_data()[i * 2 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } -} - -// Test that the sequence of random crops differs across iterations when -// Caffe::set_random_seed isn't called (and seeds from srand are ignored). -TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainSequenceUnseededCPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::CPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_crop_size(1); - data_param->set_mirror(true); - data_param->set_source(this->filename_->c_str()); - data_param->set_backend(DataParameter_DB_LMDB); - // Get crop sequence with Caffe seed 1701, srand seed 1701. - Caffe::set_random_seed(this->seed_); - srand(this->seed_); - vector > crop_sequence; - { - DataLayer layer1(param); - layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - vector iter_crop_sequence; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - iter_crop_sequence.push_back( - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - crop_sequence.push_back(iter_crop_sequence); - } - } // destroy 1st data layer and unlock the leveldb - - // Get crop sequence continuing from previous Caffe RNG state; - // reseed srand with 1701. Check that the sequence differs from the original. - srand(this->seed_); - DataLayer layer2(param); - layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - int num_sequence_matches = 0; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - num_sequence_matches += (crop_sequence[iter][i * 2 + j] == - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - EXPECT_LT(num_sequence_matches, 10); - } -} - -// Test that the sequence of random crops differs across iterations when -// Caffe::set_random_seed isn't called (and seeds from srand are ignored). -TYPED_TEST(DataLayerTestLmdb, TestReadCropTrainSequenceUnseededGPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::GPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_crop_size(1); - data_param->set_mirror(true); - data_param->set_source(this->filename_->c_str()); - data_param->set_backend(DataParameter_DB_LMDB); - // Get crop sequence with Caffe seed 1701, srand seed 1701. - Caffe::set_random_seed(this->seed_); - srand(this->seed_); - vector > crop_sequence; - { - DataLayer layer1(param); - layer1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - vector iter_crop_sequence; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - iter_crop_sequence.push_back( - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - crop_sequence.push_back(iter_crop_sequence); - } - } // destroy 1st data layer and unlock the leveldb - - // Get crop sequence continuing from previous Caffe RNG state; - // reseed srand with 1701. Check that the sequence differs from the original. - srand(this->seed_); - DataLayer layer2(param); - layer2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int iter = 0; iter < 2; ++iter) { - layer2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - int num_sequence_matches = 0; - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - num_sequence_matches += (crop_sequence[iter][i * 2 + j] == - this->blob_top_data_->cpu_data()[i * 2 + j]); - } - } - EXPECT_LT(num_sequence_matches, 10); - } -} - -TYPED_TEST(DataLayerTestLmdb, TestReadCropTestCPU) { - Caffe::set_phase(Caffe::TEST); - Caffe::set_mode(Caffe::CPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_crop_size(1); - data_param->set_source(this->filename_->c_str()); - data_param->set_backend(DataParameter_DB_LMDB); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 1); - EXPECT_EQ(this->blob_top_data_->width(), 1); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - const TypeParam center_value = scale * (j ? 17 : 5); - EXPECT_EQ(center_value, this->blob_top_data_->cpu_data()[i * 2 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } -} - -TYPED_TEST(DataLayerTestLmdb, TestReadCropTestGPU) { - Caffe::set_phase(Caffe::TEST); - Caffe::set_mode(Caffe::GPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - const TypeParam scale = 3; - LayerParameter param; - DataParameter* data_param = param.mutable_data_param(); - data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_crop_size(1); - data_param->set_source(this->filename_->c_str()); - data_param->set_backend(DataParameter_DB_LMDB); - DataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->blob_top_data_->num(), 5); - EXPECT_EQ(this->blob_top_data_->channels(), 2); - EXPECT_EQ(this->blob_top_data_->height(), 1); - EXPECT_EQ(this->blob_top_data_->width(), 1); - EXPECT_EQ(this->blob_top_label_->num(), 5); - EXPECT_EQ(this->blob_top_label_->channels(), 1); - EXPECT_EQ(this->blob_top_label_->height(), 1); - EXPECT_EQ(this->blob_top_label_->width(), 1); - - for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - for (int i = 0; i < 5; ++i) { - EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < 5; ++i) { - for (int j = 0; j < 2; ++j) { - const TypeParam center_value = scale * (j ? 17 : 5); - EXPECT_EQ(center_value, this->blob_top_data_->cpu_data()[i * 2 + j]) - << "debug: iter " << iter << " i " << i << " j " << j; - } - } - } -} - -} // namespace caffe From 27ece9381607baf058ae14b151a789b4d7be1a6a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 13 Jun 2014 11:42:40 -0700 Subject: [PATCH 0124/2053] add net surgery link to docs (+ drop old comment) --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 6857c4e5319..4665425e6ad 100644 --- a/docs/index.md +++ b/docs/index.md @@ -10,8 +10,6 @@ Caffe is released under [the BSD 2-Clause license](https://github.com/BVLC/caffe Check out the [classification demo](http://demo.caffe.berkeleyvision.org/)! - - ## Why Caffe? Caffe aims to provide computer vision scientists and practitioners with a **clean and modifiable implementation** of state-of-the-art deep learning algorithms. @@ -35,6 +33,7 @@ Even in CPU mode, computing predictions on an image takes only 20 ms when images * [Image Classification \[notebook\]][imagenet_classification]: classify images with the pretrained ImageNet model by the Python interface. * [Detection \[notebook\]][detection]: run a pretrained model as a detector in Python. * [Visualizing Features and Filters \[notebook\]][visualizing_filters]: extracting features and visualizing trained filters with an example image, viewed layer-by-layer. +* [Editing Model Parameters \[notebook\]][net_surgery]: how to do net surgery and manually change model parameters. * [LeNet / MNIST Demo](/mnist.html): end-to-end training and testing of LeNet on MNIST. * [CIFAR-10 Demo](/cifar10.html): training and testing on the CIFAR-10 data. * [Training ImageNet](/imagenet_training.html): recipe for end-to-end training of an ImageNet classifier. @@ -43,6 +42,7 @@ Even in CPU mode, computing predictions on an image takes only 20 ms when images [imagenet_classification]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/imagenet_classification.ipynb [detection]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/detection.ipynb [visualizing_filters]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/filter_visualization.ipynb +[net_surgery]: http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/net_surgery.ipynb ## Citing Caffe From e0ce93383e7b09d1f90db89b10f269a47fec360e Mon Sep 17 00:00:00 2001 From: linmin Date: Sat, 14 Jun 2014 16:15:18 +0800 Subject: [PATCH 0125/2053] add lmdb support for convert_imageset --- tools/convert_imageset.cpp | 112 ++++++++++++++++++++++++++++++------- 1 file changed, 92 insertions(+), 20 deletions(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 524d1950cb0..a381eaf4c03 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include // NOLINT(readability/streams) @@ -33,12 +35,13 @@ using std::string; int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); - if (argc < 4 || argc > 8) { + if (argc < 4 || argc > 9) { printf("Convert a set of images to the leveldb format used\n" "as input for Caffe.\n" "Usage:\n" " convert_imageset [-g] ROOTFOLDER/ LISTFILE DB_NAME" - " RANDOM_SHUFFLE_DATA[0 or 1] [resize_height] [resize_width]\n" + " RANDOM_SHUFFLE_DATA[0 or 1] DB_BACKEND[leveldb or lmdb]" + " [resize_height] [resize_width]\n" "The ImageNet dataset for the training demo is at\n" " http://www.image-net.org/download-images\n"); return 1; @@ -60,33 +63,71 @@ int main(int argc, char** argv) { std::random_shuffle(lines.begin(), lines.end()); } LOG(INFO) << "A total of " << lines.size() << " images."; - int resize_height = 0; - int resize_width = 0; + + string db_backend = "leveldb"; if (argc >= (arg_offset+6)) { - resize_height = atoi(argv[arg_offset+5]); + db_backend = string(argv[arg_offset+5]); + if (db_backend != "leveldb" || db_backend != "lmdb") { + LOG(FATAL) << "Unknown db backend " << db_backend; + } } + + int resize_height = 0; + int resize_width = 0; if (argc >= (arg_offset+7)) { - resize_width = atoi(argv[arg_offset+6]); + resize_height = atoi(argv[arg_offset+6]); + } + if (argc >= (arg_offset+8)) { + resize_width = atoi(argv[arg_offset+7]); } + // Open new db + // lmdb + MDB_env *mdb_env; + MDB_dbi mdb_dbi; + MDB_val mdb_key, mdb_data; + MDB_txn *mdb_txn; + // leveldb leveldb::DB* db; leveldb::Options options; options.error_if_exists = true; options.create_if_missing = true; options.write_buffer_size = 268435456; - LOG(INFO) << "Opening leveldb " << argv[arg_offset+3]; - leveldb::Status status = leveldb::DB::Open( - options, argv[arg_offset+3], &db); - CHECK(status.ok()) << "Failed to open leveldb " << argv[arg_offset+3]; + leveldb::WriteBatch* batch; + // Open db + if (db_backend == "leveldb") { // leveldb + LOG(INFO) << "Opening leveldb " << argv[arg_offset+3]; + leveldb::Status status = leveldb::DB::Open( + options, argv[arg_offset+3], &db); + CHECK(status.ok()) << "Failed to open leveldb " << argv[arg_offset+3]; + batch = new leveldb::WriteBatch(); + } else if (db_backend == "lmdb") { // lmdb + LOG(INFO) << "Opening lmdb " << argv[arg_offset+3]; + CHECK_EQ(mkdir(argv[arg_offset+3], 0744), 0) + << "mkdir " << argv[arg_offset+3] << "failed"; + CHECK_EQ(mdb_env_create(&mdb_env), MDB_SUCCESS) << "mdb_env_create failed"; + CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS) // 1TB + << "mdb_env_set_mapsize failed"; + CHECK_EQ(mdb_env_open(mdb_env, argv[3], 0, 0664), MDB_SUCCESS) + << "mdb_env_open failed"; + CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) + << "mdb_txn_begin failed"; + CHECK_EQ(mdb_open(mdb_txn, NULL, 0, &mdb_dbi), MDB_SUCCESS) + << "mdb_open failed"; + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } + + // Storing to db string root_folder(argv[arg_offset+1]); Datum datum; int count = 0; const int kMaxKeyLength = 256; char key_cstr[kMaxKeyLength]; - leveldb::WriteBatch* batch = new leveldb::WriteBatch(); int data_size; bool data_size_initialized = false; + for (int line_id = 0; line_id < lines.size(); ++line_id) { if (!ReadImageToDatum(root_folder + lines[line_id].first, lines[line_id].second, resize_height, resize_width, is_color, &datum)) { @@ -104,23 +145,54 @@ int main(int argc, char** argv) { snprintf(key_cstr, kMaxKeyLength, "%08d_%s", line_id, lines[line_id].first.c_str()); string value; - // get the value datum.SerializeToString(&value); - batch->Put(string(key_cstr), value); + string keystr(key_cstr); + + // Put in db + if (db_backend == "leveldb") { // leveldb + batch->Put(keystr, value); + } else if (db_backend == "lmdb") { // lmdb + mdb_data.mv_size = value.size(); + mdb_data.mv_data = reinterpret_cast(&value[0]); + mdb_key.mv_size = keystr.size(); + mdb_key.mv_data = reinterpret_cast(&keystr[0]); + CHECK_EQ(mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0), MDB_SUCCESS) + << "mdb_put failed"; + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } + if (++count % 1000 == 0) { - db->Write(leveldb::WriteOptions(), batch); + // Commit txn + if (db_backend == "leveldb") { // leveldb + db->Write(leveldb::WriteOptions(), batch); + delete batch; + batch = new leveldb::WriteBatch(); + } else if (db_backend == "lmdb") { // lmdb + CHECK_EQ(mdb_txn_commit(mdb_txn), MDB_SUCCESS) + << "mdb_txn_commit failed"; + CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) + << "mdb_txn_begin failed"; + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } LOG(ERROR) << "Processed " << count << " files."; - delete batch; - batch = new leveldb::WriteBatch(); } } // write the last batch if (count % 1000 != 0) { - db->Write(leveldb::WriteOptions(), batch); + if (db_backend == "leveldb") { // leveldb + db->Write(leveldb::WriteOptions(), batch); + delete batch; + delete db; + } else if (db_backend == "lmdb") { // lmdb + CHECK_EQ(mdb_txn_commit(mdb_txn), MDB_SUCCESS) << "mdb_txn_commit failed"; + mdb_close(mdb_env, mdb_dbi); + mdb_env_close(mdb_env); + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } LOG(ERROR) << "Processed " << count << " files."; } - - delete batch; - delete db; return 0; } From 01481d581b7b333c15f00f8c3597194eb285eeb9 Mon Sep 17 00:00:00 2001 From: linmin Date: Sat, 14 Jun 2014 16:15:44 +0800 Subject: [PATCH 0126/2053] add lmdb support for compute_image_mean --- tools/compute_image_mean.cpp | 145 +++++++++++++++++++++++++++-------- 1 file changed, 115 insertions(+), 30 deletions(-) diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 7cf5fe5f222..5b212b66edd 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -16,28 +17,69 @@ using std::max; int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); - if (argc != 3) { - LOG(ERROR) << "Usage: compute_image_mean input_leveldb output_file"; + if (argc < 3 || argc > 4) { + LOG(ERROR) << "Usage: compute_image_mean input_leveldb output_file" + << " db_backend[leveldb or lmdb]"; return 1; } + string db_backend = "leveldb"; + if (argc == 4) { + db_backend = string(argv[3]); + } + + // leveldb leveldb::DB* db; leveldb::Options options; options.create_if_missing = false; + leveldb::Iterator* it; + // lmdb + MDB_env* mdb_env; + MDB_dbi mdb_dbi; + MDB_val mdb_key, mdb_value; + MDB_txn* mdb_txn; + MDB_cursor* mdb_cursor; - LOG(INFO) << "Opening leveldb " << argv[1]; - leveldb::Status status = leveldb::DB::Open( - options, argv[1], &db); - CHECK(status.ok()) << "Failed to open leveldb " << argv[1]; + // Open db + if (db_backend == "leveldb") { // leveldb + LOG(INFO) << "Opening leveldb " << argv[1]; + leveldb::Status status = leveldb::DB::Open( + options, argv[1], &db); + CHECK(status.ok()) << "Failed to open leveldb " << argv[1]; + leveldb::ReadOptions read_options; + read_options.fill_cache = false; + it = db->NewIterator(read_options); + it->SeekToFirst(); + } else if (db_backend == "lmdb") { // lmdb + LOG(INFO) << "Opening lmdb " << argv[1]; + CHECK_EQ(mdb_env_create(&mdb_env), MDB_SUCCESS) << "mdb_env_create failed"; + CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS); // 1TB + CHECK_EQ(mdb_env_open(mdb_env, argv[1], MDB_RDONLY, 0664), + MDB_SUCCESS) << "mdb_env_open failed"; + CHECK_EQ(mdb_txn_begin(mdb_env, NULL, MDB_RDONLY, &mdb_txn), MDB_SUCCESS) + << "mdb_txn_begin failed"; + CHECK_EQ(mdb_open(mdb_txn, NULL, 0, &mdb_dbi), MDB_SUCCESS) + << "mdb_open failed"; + CHECK_EQ(mdb_cursor_open(mdb_txn, mdb_dbi, &mdb_cursor), MDB_SUCCESS) + << "mdb_cursor_open failed"; + CHECK_EQ(mdb_cursor_get(mdb_cursor, &mdb_key, &mdb_value, MDB_FIRST), + MDB_SUCCESS); + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } - leveldb::ReadOptions read_options; - read_options.fill_cache = false; - leveldb::Iterator* it = db->NewIterator(read_options); - it->SeekToFirst(); Datum datum; BlobProto sum_blob; int count = 0; - datum.ParseFromString(it->value().ToString()); + // load first datum + if (db_backend == "leveldb") { + datum.ParseFromString(it->value().ToString()); + } else if (db_backend == "lmdb") { + datum.ParseFromArray(mdb_value.mv_data, mdb_value.mv_size); + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } + sum_blob.set_num(1); sum_blob.set_channels(datum.channels()); sum_blob.set_height(datum.height()); @@ -49,28 +91,61 @@ int main(int argc, char** argv) { sum_blob.add_data(0.); } LOG(INFO) << "Starting Iteration"; - for (it->SeekToFirst(); it->Valid(); it->Next()) { - // just a dummy operation - datum.ParseFromString(it->value().ToString()); - const string& data = datum.data(); - size_in_datum = std::max(datum.data().size(), datum.float_data_size()); - CHECK_EQ(size_in_datum, data_size) << "Incorrect data field size " << - size_in_datum; - if (data.size() != 0) { - for (int i = 0; i < size_in_datum; ++i) { - sum_blob.set_data(i, sum_blob.data(i) + (uint8_t)data[i]); + if (db_backend == "leveldb") { // leveldb + for (it->SeekToFirst(); it->Valid(); it->Next()) { + // just a dummy operation + datum.ParseFromString(it->value().ToString()); + const string& data = datum.data(); + size_in_datum = std::max(datum.data().size(), + datum.float_data_size()); + CHECK_EQ(size_in_datum, data_size) << "Incorrect data field size " << + size_in_datum; + if (data.size() != 0) { + for (int i = 0; i < size_in_datum; ++i) { + sum_blob.set_data(i, sum_blob.data(i) + (uint8_t)data[i]); + } + } else { + for (int i = 0; i < size_in_datum; ++i) { + sum_blob.set_data(i, sum_blob.data(i) + + static_cast(datum.float_data(i))); + } } - } else { - for (int i = 0; i < size_in_datum; ++i) { - sum_blob.set_data(i, sum_blob.data(i) + - static_cast(datum.float_data(i))); + ++count; + if (count % 10000 == 0) { + LOG(ERROR) << "Processed " << count << " files."; } } - ++count; - if (count % 10000 == 0) { - LOG(ERROR) << "Processed " << count << " files."; - } + } else if (db_backend == "lmdb") { // lmdb + CHECK_EQ(mdb_cursor_get(mdb_cursor, &mdb_key, &mdb_value, MDB_FIRST), + MDB_SUCCESS); + do { + // just a dummy operation + datum.ParseFromArray(mdb_value.mv_data, mdb_value.mv_size); + const string& data = datum.data(); + size_in_datum = std::max(datum.data().size(), + datum.float_data_size()); + CHECK_EQ(size_in_datum, data_size) << "Incorrect data field size " << + size_in_datum; + if (data.size() != 0) { + for (int i = 0; i < size_in_datum; ++i) { + sum_blob.set_data(i, sum_blob.data(i) + (uint8_t)data[i]); + } + } else { + for (int i = 0; i < size_in_datum; ++i) { + sum_blob.set_data(i, sum_blob.data(i) + + static_cast(datum.float_data(i))); + } + } + ++count; + if (count % 10000 == 0) { + LOG(ERROR) << "Processed " << count << " files."; + } + } while (mdb_cursor_get(mdb_cursor, &mdb_key, &mdb_value, MDB_NEXT) + == MDB_SUCCESS); + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; } + if (count % 10000 != 0) { LOG(ERROR) << "Processed " << count << " files."; } @@ -81,6 +156,16 @@ int main(int argc, char** argv) { LOG(INFO) << "Write to " << argv[2]; WriteProtoToBinaryFile(sum_blob, argv[2]); - delete db; + // Clean up + if (db_backend == "leveldb") { + delete db; + } else if (db_backend == "lmdb") { + mdb_cursor_close(mdb_cursor); + mdb_close(mdb_env, mdb_dbi); + mdb_txn_abort(mdb_txn); + mdb_env_close(mdb_env); + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } return 0; } From dbc5ebf31b529db5690dc0d1dad1498ff269e799 Mon Sep 17 00:00:00 2001 From: linmin Date: Sat, 14 Jun 2014 16:35:48 +0800 Subject: [PATCH 0127/2053] fix string compare error --- tools/convert_imageset.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index a381eaf4c03..aa9515514c3 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -67,7 +67,7 @@ int main(int argc, char** argv) { string db_backend = "leveldb"; if (argc >= (arg_offset+6)) { db_backend = string(argv[arg_offset+5]); - if (db_backend != "leveldb" || db_backend != "lmdb") { + if (!(db_backend == "leveldb") && !(db_backend == "lmdb")) { LOG(FATAL) << "Unknown db backend " << db_backend; } } From 40837161e382812b331213f9694fa529b4ae7a4b Mon Sep 17 00:00:00 2001 From: leelurch Date: Sun, 15 Jun 2014 20:07:04 -0500 Subject: [PATCH 0128/2053] Add comment for how to set the CUDA path when cuda tools are installed by the package manager. --- Makefile.config.example | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile.config.example b/Makefile.config.example index f9d8be80100..9754129beb7 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -3,6 +3,9 @@ # CUDA directory contains bin/ and lib/ directories that we need. CUDA_DIR := /usr/local/cuda +# On Ubuntu 14.04, if cuda tools are installed via +# "sudo apt-get install nvidia-cuda-toolkit" then use this instead: +# CUDA_DIR := /usr # CUDA architecture setting: going with all of them. CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \ From 47ef5629d8ad73aba4a262612ea4c3f537b08c17 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Mon, 16 Jun 2014 15:20:17 -0700 Subject: [PATCH 0129/2053] in Caffe::SetDevice, call cudaSetDevice before Get Otherwise initialization will be performed on whichever device is default. --- src/caffe/common.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 7edb3a455ac..218feb7d877 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -69,11 +69,13 @@ void Caffe::SetDevice(const int device_id) { if (current_device == device_id) { return; } + // The call to cudaSetDevice must come before any calls to Get, which + // may perform initialization using the GPU. + CUDA_CHECK(cudaSetDevice(device_id)); if (Get().cublas_handle_) CUBLAS_CHECK(cublasDestroy(Get().cublas_handle_)); if (Get().curand_generator_) { CURAND_CHECK(curandDestroyGenerator(Get().curand_generator_)); } - CUDA_CHECK(cudaSetDevice(device_id)); CUBLAS_CHECK(cublasCreate(&Get().cublas_handle_)); CURAND_CHECK(curandCreateGenerator(&Get().curand_generator_, CURAND_RNG_PSEUDO_DEFAULT)); From e43947a44cddaf975fd6a969eb4dd47ee40e7f9c Mon Sep 17 00:00:00 2001 From: Craig Quiter Date: Tue, 17 Jun 2014 00:00:01 -0700 Subject: [PATCH 0130/2053] Add comment to Makefile.config.example about DEBUG flag issue in OSX per #171. --- Makefile.config.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.config.example b/Makefile.config.example index f9d8be80100..9a75f5e55d5 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -46,7 +46,7 @@ LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib BUILD_DIR := build DISTRIBUTE_DIR := distribute -# Uncomment for debugging. +# Uncomment for debugging. Does not work on OSX due to https://github.com/BVLC/caffe/issues/171 # DEBUG := 1 # The ID of the GPU that 'make runtest' will use to run unit tests. From 3686f872f26e92e5c48e04e24bb89029b225984e Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 19 Jun 2014 12:55:48 -0700 Subject: [PATCH 0131/2053] Set device_id at the begining of Solver.Init() to avoid using memory in the default GPU --- src/caffe/solver.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 6a8f18f1331..769618175ac 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -36,6 +36,11 @@ void Solver::Init(const SolverParameter& param) { LOG(INFO) << "Initializing solver from parameters: " << std::endl << param.DebugString(); param_ = param; + if (param_.solver_mode() == SolverParameter_SolverMode_GPU && + param_.has_device_id()) { + Caffe::SetDevice(param_.device_id()); + } + Caffe::set_mode(Caffe::Brew(param_.solver_mode())); if (param_.random_seed() >= 0) { Caffe::set_random_seed(param_.random_seed()); } @@ -74,14 +79,8 @@ void Solver::Init(const SolverParameter& param) { LOG(INFO) << "Solver scaffolding done."; } - template void Solver::Solve(const char* resume_file) { - Caffe::set_mode(Caffe::Brew(param_.solver_mode())); - if (param_.solver_mode() == SolverParameter_SolverMode_GPU && - param_.has_device_id()) { - Caffe::SetDevice(param_.device_id()); - } Caffe::set_phase(Caffe::TRAIN); LOG(INFO) << "Solving " << net_->name(); PreSolve(); From f5853bc2eb85dda3e44269e6de8a539d0f54d5a1 Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 19 Jun 2014 16:40:32 -0700 Subject: [PATCH 0132/2053] Now Loss layers would return the loss in the top blob if requested --- include/caffe/loss_layers.hpp | 4 ++-- src/caffe/layers/euclidean_loss_layer.cpp | 3 +++ src/caffe/layers/infogain_loss_layer.cpp | 3 +++ src/caffe/layers/loss_layer.cpp | 4 ++++ src/caffe/layers/multinomial_logistic_loss_layer.cpp | 3 +++ src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp | 3 +++ src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu | 3 +++ src/caffe/layers/softmax_loss_layer.cpp | 3 +++ 8 files changed, 24 insertions(+), 2 deletions(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 381bf0f4f8f..dd06ca07187 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -37,7 +37,7 @@ class LossLayer : public Layer { const vector*>& bottom, vector*>* top) {} virtual inline int ExactNumBottomBlobs() const { return 2; } - virtual inline int ExactNumTopBlobs() const { return 0; } + virtual inline int MaxTopBlobs() const { return 1; } }; /* SigmoidCrossEntropyLossLayer @@ -166,7 +166,7 @@ class MultinomialLogisticLossLayer : public LossLayer { /* AccuracyLayer Note: not an actual loss layer! Does not implement backwards step. - Computes the accuracy and logprob of a with respect to b. + Computes the accuracy of a with respect to b. */ template class AccuracyLayer : public Layer { diff --git a/src/caffe/layers/euclidean_loss_layer.cpp b/src/caffe/layers/euclidean_loss_layer.cpp index a894d470c64..766294997f0 100644 --- a/src/caffe/layers/euclidean_loss_layer.cpp +++ b/src/caffe/layers/euclidean_loss_layer.cpp @@ -35,6 +35,9 @@ Dtype EuclideanLossLayer::Forward_cpu(const vector*>& bottom, diff_.mutable_cpu_data()); Dtype dot = caffe_cpu_dot(count, diff_.cpu_data(), diff_.cpu_data()); Dtype loss = dot / bottom[0]->num() / Dtype(2); + if (top->size() == 1) { + (*top)[0]->mutable_cpu_data()[0] = loss; + } return loss; } diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index ab6e67d73b1..3e7fc4f812b 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -48,6 +48,9 @@ Dtype InfogainLossLayer::Forward_cpu(const vector*>& bottom, loss -= infogain_mat[label * dim + j] * log(prob); } } + if (top->size() == 1) { + (*top)[0]->mutable_cpu_data()[0] = loss / num; + } return loss / num; } diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index 14ea975ad0d..ac8ad216732 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -20,6 +20,10 @@ void LossLayer::SetUp( Layer::SetUp(bottom, top); CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; + if (top->size() == 1) { + // Layers should copy the loss in the top blob + (*top)[0]->Reshape(1, 1, 1, 1); + } FurtherSetUp(bottom, top); } diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index 6486621d8aa..5a408795d6d 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -35,6 +35,9 @@ Dtype MultinomialLogisticLossLayer::Forward_cpu( Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); loss -= log(prob); } + if (top->size() == 1){ + (*top)[0]->mutable_cpu_data()[0] = loss / num; + } return loss / num; } diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index a638684f3b6..955581d8875 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -41,6 +41,9 @@ Dtype SigmoidCrossEntropyLossLayer::Forward_cpu( loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) - log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0))); } + if (top->size() == 1) { + (*top)[0]->mutable_cpu_data()[0] = loss / num; + } return loss / num; } diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu index 61004541fce..0caed2b83bd 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu @@ -29,6 +29,9 @@ Dtype SigmoidCrossEntropyLossLayer::Forward_gpu( loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) - log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0))); } + if (top->size() == 1) { + (*top)[0]->mutable_cpu_data()[0] = loss / num; + } return loss / num; } diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index ef6eebabadd..8a37efee395 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -37,6 +37,9 @@ Dtype SoftmaxWithLossLayer::Forward_cpu( loss += -log(max(prob_data[i * dim + static_cast(label[i])], Dtype(FLT_MIN))); } + if (top->size() == 1) { + (*top)[0]->mutable_cpu_data()[0] = loss / num; + } return loss / num; } From 03cd25ce658c0270dd8bcf4c4cc0ff206f87aa05 Mon Sep 17 00:00:00 2001 From: Sergio Date: Thu, 19 Jun 2014 16:45:08 -0700 Subject: [PATCH 0133/2053] Modified test_net to check loss layer with top --- src/caffe/test/test_net.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 1e43a038455..7f2f67b59c6 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -64,6 +64,7 @@ class NetTest : public ::testing::Test { " type: SOFTMAX_LOSS " " bottom: 'innerproduct' " " bottom: 'label' " + " top: 'top_loss' " "} "; NetParameter param; CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); @@ -81,6 +82,7 @@ TYPED_TEST(NetTest, TestHasBlob) { EXPECT_TRUE(this->net_->has_blob("label")); EXPECT_TRUE(this->net_->has_blob("innerproduct")); EXPECT_FALSE(this->net_->has_blob("loss")); + EXPECT_TRUE(this->net_->has_blob("top_loss")); } TYPED_TEST(NetTest, TestGetBlob) { @@ -88,6 +90,7 @@ TYPED_TEST(NetTest, TestGetBlob) { EXPECT_EQ(this->net_->blob_by_name("label"), this->net_->blobs()[1]); EXPECT_EQ(this->net_->blob_by_name("innerproduct"), this->net_->blobs()[2]); EXPECT_FALSE(this->net_->blob_by_name("loss")); + EXPECT_EQ(this->net_->blob_by_name("top_loss"), this->net_->blobs()[3]); } TYPED_TEST(NetTest, TestHasLayer) { From 3d0bc1acbd98de289f038fd836dbab27ffadb4cc Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Fri, 20 Jun 2014 01:05:41 -0700 Subject: [PATCH 0134/2053] remove erroneous comment in ArgMaxLayer --- src/caffe/layers/argmax_layer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index 70ccfff5a36..cc31c0f52d8 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -31,7 +31,6 @@ Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); for (int i = 0; i < num; ++i) { - // Accuracy Dtype max_val = -FLT_MAX; int max_ind = 0; for (int j = 0; j < dim; ++j) { From bb5f9e67522064eeabf915188788bd27535f377a Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 17 Jun 2014 11:43:10 +0800 Subject: [PATCH 0135/2053] Fix the condition prefetch_needs_rand in the ImageDataLayer --- src/caffe/layers/image_data_layer.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 9a79e72fedc..1f7368e7e4d 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -236,9 +236,7 @@ void ImageDataLayer::CreatePrefetchThread() { phase_ = Caffe::phase(); const bool prefetch_needs_rand = this->layer_param_.image_data_param().shuffle() || - ((phase_ == Caffe::TRAIN) && - (this->layer_param_.image_data_param().mirror() || - this->layer_param_.image_data_param().crop_size())); + this->layer_param_.image_data_param().crop_size(); if (prefetch_needs_rand) { const unsigned int prefetch_rng_seed = caffe_rng_rand(); prefetch_rng_.reset(new Caffe::RNG(prefetch_rng_seed)); From ea77c96356a0a432ea990b9dad579a85c5dfe6fa Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 17 Jun 2014 13:35:59 +0800 Subject: [PATCH 0136/2053] Initialize the RNG generator with an orthogonally newed Generator --- src/caffe/common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 218feb7d877..6eadfc7917e 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -126,7 +126,7 @@ class Caffe::RNG::Generator { shared_ptr rng_; }; -Caffe::RNG::RNG() : generator_(new Generator) { } +Caffe::RNG::RNG() : generator_(new Generator()) { } Caffe::RNG::RNG(unsigned int seed) : generator_(new Generator(seed)) { } From 21e4a502e7b81d82aa0be8acb58dd2ba7f384500 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Mon, 2 Jun 2014 13:12:48 +0800 Subject: [PATCH 0137/2053] Extract GPU code out of SyncedMemoryTest::TestCPUWrite --- src/caffe/test/test_syncedmem.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index cd7475898d1..d0d6c31517c 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -39,6 +39,20 @@ TEST_F(SyncedMemoryTest, TestCPUWrite) { for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((reinterpret_cast(cpu_data))[i], 1); } + // do another round + cpu_data = mem.mutable_cpu_data(); + EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); + memset(cpu_data, 2, mem.size()); + for (int i = 0; i < mem.size(); ++i) { + EXPECT_EQ((reinterpret_cast(cpu_data))[i], 2); + } +} + +TEST_F(SyncedMemoryTest, TestGPURead) { + SyncedMemory mem(10); + void* cpu_data = mem.mutable_cpu_data(); + EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); + memset(cpu_data, 1, mem.size()); const void* gpu_data = mem.gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same @@ -52,9 +66,6 @@ TEST_F(SyncedMemoryTest, TestCPUWrite) { cpu_data = mem.mutable_cpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); memset(cpu_data, 2, mem.size()); - for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ((reinterpret_cast(cpu_data))[i], 2); - } gpu_data = mem.gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same From db93727325fa0091dd505975c852e39850f0b99d Mon Sep 17 00:00:00 2001 From: Kai Li Date: Mon, 2 Jun 2014 20:07:48 +0800 Subject: [PATCH 0138/2053] Separate TestForward into Test{CPU, GPU}Forward in HDF5OutputLayerTest --- src/caffe/test/test_hdf5_output_layer.cpp | 129 +++++++++++++++------- 1 file changed, 91 insertions(+), 38 deletions(-) diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index 9f793f2fce6..45cf11ba897 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -19,7 +19,7 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template +template class HDF5OutputLayerTest : public ::testing::Test { protected: HDF5OutputLayerTest() @@ -30,7 +30,8 @@ class HDF5OutputLayerTest : public ::testing::Test { num_(5), channels_(8), height_(5), - width_(5) {} + width_(5) { + } virtual ~HDF5OutputLayerTest() { delete blob_data_; @@ -51,9 +52,9 @@ class HDF5OutputLayerTest : public ::testing::Test { int width_; }; -template -void HDF5OutputLayerTest::CheckBlobEqual( - const Blob& b1, const Blob& b2) { +template +void HDF5OutputLayerTest::CheckBlobEqual(const Blob& b1, + const Blob& b2) { EXPECT_EQ(b1.num(), b2.num()); EXPECT_EQ(b1.channels(), b2.channels()); EXPECT_EQ(b1.height(), b2.height()); @@ -72,8 +73,61 @@ void HDF5OutputLayerTest::CheckBlobEqual( typedef ::testing::Types Dtypes; TYPED_TEST_CASE(HDF5OutputLayerTest, Dtypes); -TYPED_TEST(HDF5OutputLayerTest, TestForward) { +/* + * TestCPUForward and TestGPUForward are almost identical except for the mode. + * They are separated to use with `test_all.testbin --gtest_filter="*CPU*"`. + */ +TYPED_TEST(HDF5OutputLayerTest, TestCPUForward) { + LOG(INFO) << "Loading HDF5 file " << this->input_file_name_; + hid_t file_id = H5Fopen(this->input_file_name_.c_str(), H5F_ACC_RDONLY, + H5P_DEFAULT); + ASSERT_GE(file_id, 0)<< "Failed to open HDF5 file" << + this->input_file_name_; + hdf5_load_nd_dataset(file_id, HDF5_DATA_DATASET_NAME, 0, 4, + this->blob_data_); + hdf5_load_nd_dataset(file_id, HDF5_DATA_LABEL_NAME, 0, 4, + this->blob_label_); + herr_t status = H5Fclose(file_id); + EXPECT_GE(status, 0)<< "Failed to close HDF5 file " << + this->input_file_name_; + this->blob_bottom_vec_.push_back(this->blob_data_); + this->blob_bottom_vec_.push_back(this->blob_label_); + + Caffe::set_mode(Caffe::CPU); + LayerParameter param; + param.mutable_hdf5_output_param()->set_file_name(this->output_file_name_); + // This code block ensures that the layer is deconstructed and + // the output hdf5 file is closed. + { + HDF5OutputLayer layer(param); + EXPECT_EQ(layer.file_name(), this->output_file_name_); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + } + file_id = H5Fopen(this->output_file_name_.c_str(), H5F_ACC_RDONLY, + H5P_DEFAULT); + ASSERT_GE( + file_id, 0)<< "Failed to open HDF5 file" << + this->input_file_name_; + + Blob* blob_data = new Blob(); + hdf5_load_nd_dataset(file_id, HDF5_DATA_DATASET_NAME, 0, 4, + blob_data); + this->CheckBlobEqual(*(this->blob_data_), *blob_data); + + Blob* blob_label = new Blob(); + hdf5_load_nd_dataset(file_id, HDF5_DATA_LABEL_NAME, 0, 4, + blob_label); + this->CheckBlobEqual(*(this->blob_label_), *blob_label); + + status = H5Fclose(file_id); + EXPECT_GE(status, 0) << "Failed to close HDF5 file " << + this->output_file_name_; +} + +TYPED_TEST(HDF5OutputLayerTest, TestGPUForward) { LOG(INFO) << "Loading HDF5 file " << this->input_file_name_; + hid_t file_id = H5Fopen(this->input_file_name_.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); ASSERT_GE(file_id, 0) << "Failed to open HDF5 file" << @@ -88,38 +142,37 @@ TYPED_TEST(HDF5OutputLayerTest, TestForward) { this->blob_bottom_vec_.push_back(this->blob_data_); this->blob_bottom_vec_.push_back(this->blob_label_); - Caffe::Brew modes[] = { Caffe::CPU, Caffe::GPU }; - for (int m = 0; m < 2; ++m) { - Caffe::set_mode(modes[m]); - LayerParameter param; - param.mutable_hdf5_output_param()->set_file_name(this->output_file_name_); - // This code block ensures that the layer is deconstructed and - // the output hdf5 file is closed. - { - HDF5OutputLayer layer(param); - EXPECT_EQ(layer.file_name(), this->output_file_name_); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - } - hid_t file_id = H5Fopen(this->output_file_name_.c_str(), H5F_ACC_RDONLY, - H5P_DEFAULT); - ASSERT_GE(file_id, 0) << "Failed to open HDF5 file" << - this->input_file_name_; - - Blob* blob_data = new Blob(); - hdf5_load_nd_dataset(file_id, HDF5_DATA_DATASET_NAME, 0, 4, - blob_data); - this->CheckBlobEqual(*(this->blob_data_), *blob_data); - - Blob* blob_label = new Blob(); - hdf5_load_nd_dataset(file_id, HDF5_DATA_LABEL_NAME, 0, 4, - blob_label); - this->CheckBlobEqual(*(this->blob_label_), *blob_label); - - herr_t status = H5Fclose(file_id); - EXPECT_GE(status, 0) << "Failed to close HDF5 file " << - this->output_file_name_; + Caffe::set_mode(Caffe::GPU); + LayerParameter param; + param.mutable_hdf5_output_param()->set_file_name(this->output_file_name_); + // This code block ensures that the layer is deconstructed and + // the output hdf5 file is closed. + { + HDF5OutputLayer layer(param); + EXPECT_EQ(layer.file_name(), this->output_file_name_); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); } + file_id = H5Fopen(this->output_file_name_.c_str(), H5F_ACC_RDONLY, + H5P_DEFAULT); + ASSERT_GE( + file_id, 0)<< "Failed to open HDF5 file" << + this->input_file_name_; + + Blob* blob_data = new Blob(); + hdf5_load_nd_dataset(file_id, HDF5_DATA_DATASET_NAME, 0, 4, + blob_data); + this->CheckBlobEqual(*(this->blob_data_), *blob_data); + + Blob* blob_label = new Blob(); + hdf5_load_nd_dataset(file_id, HDF5_DATA_LABEL_NAME, 0, 4, + blob_label); + this->CheckBlobEqual(*(this->blob_label_), *blob_label); + + status = H5Fclose(file_id); + EXPECT_GE(status, 0) << "Failed to close HDF5 file " << + this->output_file_name_; } -} // namespace caffe +} + // namespace caffe From 485a96df6c6b2e0774ae90f7df40083cd77b45dd Mon Sep 17 00:00:00 2001 From: Kai Li Date: Sun, 8 Jun 2014 00:00:26 +0800 Subject: [PATCH 0139/2053] Suppress redundant log messages of unavailable curand --- src/caffe/common.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 218feb7d877..f5600690212 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -50,6 +50,7 @@ void Caffe::set_random_seed(const unsigned int seed) { // Curand seed // Yangqing's note: simply setting the generator seed does not seem to // work on the tesla K20s, so I wrote the ugly reset thing below. + static bool curand_availability_logged = false; if (Get().curand_generator_) { CURAND_CHECK(curandDestroyGenerator(curand_generator())); CURAND_CHECK(curandCreateGenerator(&Get().curand_generator_, @@ -57,7 +58,11 @@ void Caffe::set_random_seed(const unsigned int seed) { CURAND_CHECK(curandSetPseudoRandomGeneratorSeed(curand_generator(), seed)); } else { - LOG(ERROR) << "Curand not available. Skipping setting the curand seed."; + if (!curand_availability_logged) { + LOG(ERROR) << + "Curand not available. Skipping setting the curand seed."; + curand_availability_logged = true; + } } // RNG seed Get().random_generator_.reset(new RNG(seed)); From b61070e309976146afdd94c5d95c78f43bef2e02 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 10 Jun 2014 09:24:39 +0800 Subject: [PATCH 0140/2053] Revert the namespace ending comment to the same line of the bracket --- src/caffe/test/test_hdf5_output_layer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index 45cf11ba897..5b396ef551e 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -174,5 +174,4 @@ TYPED_TEST(HDF5OutputLayerTest, TestGPUForward) { this->output_file_name_; } -} - // namespace caffe +} // namespace caffe From 9aa085863762d8b582159bafedc2559608e447c0 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 10 Jun 2014 09:26:31 +0800 Subject: [PATCH 0141/2053] Rename curand_availability_logged according to the Google style guide --- src/caffe/common.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index f5600690212..88fd3a9c5b6 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -50,7 +50,7 @@ void Caffe::set_random_seed(const unsigned int seed) { // Curand seed // Yangqing's note: simply setting the generator seed does not seem to // work on the tesla K20s, so I wrote the ugly reset thing below. - static bool curand_availability_logged = false; + static bool g_curand_availability_logged = false; if (Get().curand_generator_) { CURAND_CHECK(curandDestroyGenerator(curand_generator())); CURAND_CHECK(curandCreateGenerator(&Get().curand_generator_, @@ -58,10 +58,10 @@ void Caffe::set_random_seed(const unsigned int seed) { CURAND_CHECK(curandSetPseudoRandomGeneratorSeed(curand_generator(), seed)); } else { - if (!curand_availability_logged) { + if (!g_curand_availability_logged) { LOG(ERROR) << "Curand not available. Skipping setting the curand seed."; - curand_availability_logged = true; + g_curand_availability_logged = true; } } // RNG seed From a3ab2c7aa954d28a88e3c863d28a8287e166776f Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 17 Jun 2014 09:36:46 +0800 Subject: [PATCH 0142/2053] Verify the result of memtest in SyncedMemoryTest::TestGPURead --- src/caffe/test/test_syncedmem.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index d0d6c31517c..7bbbbab6a57 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -66,6 +66,9 @@ TEST_F(SyncedMemoryTest, TestGPURead) { cpu_data = mem.mutable_cpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); memset(cpu_data, 2, mem.size()); + for (int i = 0; i < mem.size(); ++i) { + EXPECT_EQ((reinterpret_cast(cpu_data))[i], 2); + } gpu_data = mem.gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same From f2452d8966823bcb993ce64e6045f544d96c3ace Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 20 Jun 2014 18:26:05 -0700 Subject: [PATCH 0143/2053] Merge HingeLoss and L2HingeLoss by adding hinge_norm to params Conflicts: src/caffe/layers/loss_layer.cpp src/caffe/proto/caffe.proto src/caffe/test/test_l2_hinge_loss_layer.cpp --- src/caffe/proto/caffe.proto | 10 ++++++++++ src/caffe/test/test_hinge_loss_layer.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index b85b49c77f7..f1e82f1bfda 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -194,6 +194,7 @@ message LayerParameter { optional PowerParameter power_param = 21; optional WindowDataParameter window_data_param = 20; optional ThresholdParameter threshold_param = 25; + optional HingeLossParameter hinge_loss_param = 29; // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new @@ -305,6 +306,15 @@ message HDF5OutputParameter { optional string file_name = 1; } +message HingeLossParameter { + enum Norm { + L1 = 0; + L2 = 1; + } + // Specify the Norm to use L1 or L2 + optional Norm hinge_norm = 1 [default = L1]; +} + // Message that stores parameters used by ImageDataLayer message ImageDataParameter { // Specify the data source. diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index 1725827755f..e862e1eb191 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -70,4 +70,28 @@ TYPED_TEST(HingeLossLayerTest, TestGradientGPU) { &(this->blob_top_vec_), 0, -1, -1); } + +TYPED_TEST(HingeLossLayerTest, TestGradientCPUL2) { + LayerParameter layer_param; + HingeLossParameter* hinge_loss_param = layer_param.mutable_hinge_loss_param(); + hinge_loss_param->set_hinge_norm(HingeLossParameter_Norm_L2); + Caffe::set_mode(Caffe::CPU); + HingeLossLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + GradientChecker checker(1e-2, 2e-3, 1701, 1, 0.01); + checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0, -1, -1); +} + +TYPED_TEST(HingeLossLayerTest, TestGradientGPUL2) { + LayerParameter layer_param; + HingeLossParameter* hinge_loss_param = layer_param.mutable_hinge_loss_param(); + hinge_loss_param->set_hinge_norm(HingeLossParameter_Norm_L2); + Caffe::set_mode(Caffe::GPU); + HingeLossLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + GradientChecker checker(1e-2, 2e-3, 1701, 1, 0.01); + checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0, -1, -1); +} } // namespace caffe From f25687e1be1915d04171c6f5e9c1cdb0e03731c0 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 20 Jun 2014 18:29:14 -0700 Subject: [PATCH 0144/2053] Removed L2HingeLoss class now a case within HingeLoss class Conflicts: include/caffe/vision_layers.hpp src/caffe/layers/loss_layer.cpp src/caffe/proto/caffe.proto src/caffe/test/test_l2_hinge_loss_layer.cpp --- src/caffe/proto/caffe.proto | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index f1e82f1bfda..b15172fa1ef 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -307,9 +307,9 @@ message HDF5OutputParameter { } message HingeLossParameter { - enum Norm { - L1 = 0; - L2 = 1; + enum Norm { + L1 = 1; + L2 = 2; } // Specify the Norm to use L1 or L2 optional Norm hinge_norm = 1 [default = L1]; From eaa30176f47e7c57009caf6a4755e67253a6bf9d Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 20 Jun 2014 18:32:49 -0700 Subject: [PATCH 0145/2053] Remove spaces and merge tests into one file Conflicts: src/caffe/layers/loss_layer.cpp src/caffe/test/test_hinge_loss_layer.cpp --- src/caffe/layers/loss_layer.cpp | 1 + src/caffe/test/test_hinge_loss_layer.cpp | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index 14ea975ad0d..a8e63c443cc 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -21,6 +21,7 @@ void LossLayer::SetUp( CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; FurtherSetUp(bottom, top); + } INSTANTIATE_CLASS(LossLayer); diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index e862e1eb191..ec74b03c5d7 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -71,8 +71,9 @@ TYPED_TEST(HingeLossLayerTest, TestGradientGPU) { } -TYPED_TEST(HingeLossLayerTest, TestGradientCPUL2) { +TYPED_TEST(HingeLossLayerTest, TestGradientL2CPU) { LayerParameter layer_param; + // Set norm to L2 HingeLossParameter* hinge_loss_param = layer_param.mutable_hinge_loss_param(); hinge_loss_param->set_hinge_norm(HingeLossParameter_Norm_L2); Caffe::set_mode(Caffe::CPU); @@ -83,8 +84,10 @@ TYPED_TEST(HingeLossLayerTest, TestGradientCPUL2) { &(this->blob_top_vec_), 0, -1, -1); } -TYPED_TEST(HingeLossLayerTest, TestGradientGPUL2) { + +TYPED_TEST(HingeLossLayerTest, TestGradientL2GPU) { LayerParameter layer_param; + // Set norm to L2 HingeLossParameter* hinge_loss_param = layer_param.mutable_hinge_loss_param(); hinge_loss_param->set_hinge_norm(HingeLossParameter_Norm_L2); Caffe::set_mode(Caffe::GPU); @@ -94,4 +97,5 @@ TYPED_TEST(HingeLossLayerTest, TestGradientGPUL2) { checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_), 0, -1, -1); } + } // namespace caffe From 7be676cfb743bd2dddb2b070da5bf5c52a9cd8d5 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 20 Jun 2014 18:34:24 -0700 Subject: [PATCH 0146/2053] Fixed switch and test l2hingeloss Conflicts: src/caffe/layers/loss_layer.cpp src/caffe/test/test_hinge_loss_layer.cpp --- src/caffe/test/test_hinge_loss_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index ec74b03c5d7..64657c88dd7 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -79,7 +79,7 @@ TYPED_TEST(HingeLossLayerTest, TestGradientL2CPU) { Caffe::set_mode(Caffe::CPU); HingeLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 2e-3, 1701, 1, 0.01); + GradientChecker checker(1e-2, 2e-3, 1701); checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_), 0, -1, -1); } @@ -93,7 +93,7 @@ TYPED_TEST(HingeLossLayerTest, TestGradientL2GPU) { Caffe::set_mode(Caffe::GPU); HingeLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 2e-3, 1701, 1, 0.01); + GradientChecker checker(1e-2, 2e-3, 1701); checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_), 0, -1, -1); } From 4094170e85d349c821ce3bf68cf95840ba188745 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 20 Jun 2014 18:35:25 -0700 Subject: [PATCH 0147/2053] Fix the loss to follow the convention Conflicts: src/caffe/layers/loss_layer.cpp --- src/caffe/layers/loss_layer.cpp | 246 ++++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index a8e63c443cc..33a221f50d2 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -20,8 +20,254 @@ void LossLayer::SetUp( Layer::SetUp(bottom, top); CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; +<<<<<<< HEAD FurtherSetUp(bottom, top); +======= + CHECK_EQ(bottom[1]->channels(), 1); + CHECK_EQ(bottom[1]->height(), 1); + CHECK_EQ(bottom[1]->width(), 1); +} + +template +Dtype MultinomialLogisticLossLayer::Forward_cpu( + const vector*>& bottom, vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + const Dtype* bottom_label = bottom[1]->cpu_data(); + int num = bottom[0]->num(); + int dim = bottom[0]->count() / bottom[0]->num(); + Dtype loss = 0; + for (int i = 0; i < num; ++i) { + int label = static_cast(bottom_label[i]); + Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); + loss -= log(prob); + } + return loss / num; +} + +template +void MultinomialLogisticLossLayer::Backward_cpu( + const vector*>& top, const bool propagate_down, + vector*>* bottom) { + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* bottom_label = (*bottom)[1]->cpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + int num = (*bottom)[0]->num(); + int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); + memset(bottom_diff, 0, sizeof(Dtype) * (*bottom)[0]->count()); + for (int i = 0; i < num; ++i) { + int label = static_cast(bottom_label[i]); + Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); + bottom_diff[i * dim + label] = -1. / prob / num; + } +} + + +template +void InfogainLossLayer::SetUp( + const vector*>& bottom, vector*>* top) { + CHECK_EQ(bottom.size(), 2) << "Loss Layer takes two blobs as input."; + CHECK_EQ(top->size(), 0) << "Loss Layer takes no output."; + CHECK_EQ(bottom[0]->num(), bottom[1]->num()) + << "The data and label should have the same number."; + CHECK_EQ(bottom[1]->channels(), 1); + CHECK_EQ(bottom[1]->height(), 1); + CHECK_EQ(bottom[1]->width(), 1); + BlobProto blob_proto; + ReadProtoFromBinaryFile(this->layer_param_.infogain_loss_param().source(), + &blob_proto); + infogain_.FromProto(blob_proto); + CHECK_EQ(infogain_.num(), 1); + CHECK_EQ(infogain_.channels(), 1); + CHECK_EQ(infogain_.height(), infogain_.width()); +} + + +template +Dtype InfogainLossLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + const Dtype* bottom_label = bottom[1]->cpu_data(); + const Dtype* infogain_mat = infogain_.cpu_data(); + int num = bottom[0]->num(); + int dim = bottom[0]->count() / bottom[0]->num(); + CHECK_EQ(infogain_.height(), dim); + Dtype loss = 0; + for (int i = 0; i < num; ++i) { + int label = static_cast(bottom_label[i]); + for (int j = 0; j < dim; ++j) { + Dtype prob = max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); + loss -= infogain_mat[label * dim + j] * log(prob); + } + } + return loss / num; +} + +template +void InfogainLossLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, + vector*>* bottom) { + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* bottom_label = (*bottom)[1]->cpu_data(); + const Dtype* infogain_mat = infogain_.cpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + int num = (*bottom)[0]->num(); + int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); + CHECK_EQ(infogain_.height(), dim); + for (int i = 0; i < num; ++i) { + int label = static_cast(bottom_label[i]); + for (int j = 0; j < dim; ++j) { + Dtype prob = max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); + bottom_diff[i * dim + j] = - infogain_mat[label * dim + j] / prob / num; + } + } +} + + +template +void EuclideanLossLayer::SetUp( + const vector*>& bottom, vector*>* top) { + CHECK_EQ(bottom.size(), 2) << "Loss Layer takes two blobs as input."; + CHECK_EQ(top->size(), 0) << "Loss Layer takes no as output."; + CHECK_EQ(bottom[0]->num(), bottom[1]->num()) + << "The data and label should have the same number."; + CHECK_EQ(bottom[0]->channels(), bottom[1]->channels()); + CHECK_EQ(bottom[0]->height(), bottom[1]->height()); + CHECK_EQ(bottom[0]->width(), bottom[1]->width()); + difference_.Reshape(bottom[0]->num(), bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); +} + +template +Dtype EuclideanLossLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + int count = bottom[0]->count(); + int num = bottom[0]->num(); + caffe_sub(count, bottom[0]->cpu_data(), bottom[1]->cpu_data(), + difference_.mutable_cpu_data()); + Dtype loss = caffe_cpu_dot( + count, difference_.cpu_data(), difference_.cpu_data()) / num / Dtype(2); + return loss; +} + +template +void EuclideanLossLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + int count = (*bottom)[0]->count(); + int num = (*bottom)[0]->num(); + // Compute the gradient + caffe_cpu_axpby(count, Dtype(1) / num, difference_.cpu_data(), Dtype(0), + (*bottom)[0]->mutable_cpu_diff()); +} + +template +void AccuracyLayer::SetUp( + const vector*>& bottom, vector*>* top) { + CHECK_EQ(bottom.size(), 2) << "Accuracy Layer takes two blobs as input."; + CHECK_EQ(top->size(), 1) << "Accuracy Layer takes 1 output."; + CHECK_EQ(bottom[0]->num(), bottom[1]->num()) + << "The data and label should have the same number."; + CHECK_EQ(bottom[1]->channels(), 1); + CHECK_EQ(bottom[1]->height(), 1); + CHECK_EQ(bottom[1]->width(), 1); + (*top)[0]->Reshape(1, 2, 1, 1); +} + +template +Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + Dtype accuracy = 0; + Dtype logprob = 0; + const Dtype* bottom_data = bottom[0]->cpu_data(); + const Dtype* bottom_label = bottom[1]->cpu_data(); + int num = bottom[0]->num(); + int dim = bottom[0]->count() / bottom[0]->num(); + for (int i = 0; i < num; ++i) { + // Accuracy + Dtype maxval = -FLT_MAX; + int max_id = 0; + for (int j = 0; j < dim; ++j) { + if (bottom_data[i * dim + j] > maxval) { + maxval = bottom_data[i * dim + j]; + max_id = j; + } + } + if (max_id == static_cast(bottom_label[i])) { + ++accuracy; + } + Dtype prob = max(bottom_data[i * dim + static_cast(bottom_label[i])], + Dtype(kLOG_THRESHOLD)); + logprob -= log(prob); + } + // LOG(INFO) << "Accuracy: " << accuracy; + (*top)[0]->mutable_cpu_data()[0] = accuracy / num; + (*top)[0]->mutable_cpu_data()[1] = logprob / num; + // Accuracy layer should not be used as a loss function. + return Dtype(0); +} + +template +void HingeLossLayer::SetUp(const vector*>& bottom, + vector*>* top) { + CHECK_EQ(bottom.size(), 2) << "Hinge Loss Layer takes two blobs as input."; + CHECK_EQ(top->size(), 0) << "Hinge Loss Layer takes no output."; + C_ = this->layer_param_.hinge_loss_param().c_param(); +} + +template +Dtype HingeLossLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + const Dtype* label = bottom[1]->cpu_data(); + int num = bottom[0]->num(); + int count = bottom[0]->count(); + int dim = count / num; + + caffe_copy(count, bottom_data, bottom_diff); + for (int i = 0; i < num; ++i) { + bottom_diff[i * dim + static_cast(label[i])] *= -1; + } + for (int i = 0; i < num; ++i) { + for (int j = 0; j < dim; ++j) { + bottom_diff[i * dim + j] = max(Dtype(0), 1 + bottom_diff[i * dim + j]); + } + } + switch (this->layer_param_.hinge_loss_param().hinge_norm()) { + case HingeLossParameter_Norm_L1: + return caffe_cpu_asum(count, bottom_diff) / num * C_; + case HingeLossParameter_Norm_L2: + return caffe_cpu_dot(count, bottom_diff, bottom_diff) / num * C_; + default: + LOG(FATAL) << "Unknown hinge_norm"; + } +} + +template +void HingeLossLayer::Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom) { + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const Dtype* label = (*bottom)[1]->cpu_data(); + int num = (*bottom)[0]->num(); + int count = (*bottom)[0]->count(); + int dim = count / num; + + for (int i = 0; i < num; ++i) { + bottom_diff[i * dim + static_cast(label[i])] *= -1; + } + + switch (this->layer_param_.hinge_loss_param().hinge_norm()) { + case HingeLossParameter_Norm_L1: + caffe_cpu_sign(count, bottom_diff, bottom_diff); + caffe_scal(count, Dtype(C_ / num), bottom_diff); + break; + case HingeLossParameter_Norm_L2: + caffe_scal(count, Dtype(2 * C_ / num), bottom_diff); + break; + default: + LOG(FATAL) << "Unknown hinge_norm"; + } +>>>>>>> 161e7cb... Fix the loss to follow the convention } INSTANTIATE_CLASS(LossLayer); From 4c711140543dc88eb2e9c3a46eff8bfb77c1aae0 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 20 Jun 2014 18:37:34 -0700 Subject: [PATCH 0148/2053] Unify L1 and L2 Hinge_Loss to follow convention --- src/caffe/layers/hinge_loss_layer.cpp | 26 ++- src/caffe/layers/loss_layer.cpp | 246 -------------------------- 2 files changed, 22 insertions(+), 250 deletions(-) diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index 24329fba028..f0f8521ff16 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -14,6 +14,7 @@ using std::max; namespace caffe { + template Dtype HingeLossLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { @@ -33,7 +34,14 @@ Dtype HingeLossLayer::Forward_cpu(const vector*>& bottom, bottom_diff[i * dim + j] = max(Dtype(0), 1 + bottom_diff[i * dim + j]); } } - return caffe_cpu_asum(count, bottom_diff) / num; + switch (this->layer_param_.hinge_loss_param().hinge_norm()) { + case HingeLossParameter_Norm_L1: + return caffe_cpu_asum(count, bottom_diff) / num; + case HingeLossParameter_Norm_L2: + return caffe_cpu_dot(count, bottom_diff, bottom_diff) / num; + default: + LOG(FATAL) << "Unknown hinge_norm"; + } } template @@ -44,12 +52,22 @@ void HingeLossLayer::Backward_cpu(const vector*>& top, int num = (*bottom)[0]->num(); int count = (*bottom)[0]->count(); int dim = count / num; - - caffe_cpu_sign(count, bottom_diff, bottom_diff); + for (int i = 0; i < num; ++i) { bottom_diff[i * dim + static_cast(label[i])] *= -1; } - caffe_scal(count, Dtype(1. / num), bottom_diff); + + switch (this->layer_param_.hinge_loss_param().hinge_norm()) { + case HingeLossParameter_Norm_L1: + caffe_cpu_sign(count, bottom_diff, bottom_diff); + caffe_scal(count, Dtype(C_ / num), bottom_diff); + break; + case HingeLossParameter_Norm_L2: + caffe_scal(count, Dtype(2 * C_ / num), bottom_diff); + break; + default: + LOG(FATAL) << "Unknown hinge_norm"; + } } INSTANTIATE_CLASS(HingeLossLayer); diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index 33a221f50d2..a8e63c443cc 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -20,254 +20,8 @@ void LossLayer::SetUp( Layer::SetUp(bottom, top); CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; -<<<<<<< HEAD FurtherSetUp(bottom, top); -======= - CHECK_EQ(bottom[1]->channels(), 1); - CHECK_EQ(bottom[1]->height(), 1); - CHECK_EQ(bottom[1]->width(), 1); -} - -template -Dtype MultinomialLogisticLossLayer::Forward_cpu( - const vector*>& bottom, vector*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - const Dtype* bottom_label = bottom[1]->cpu_data(); - int num = bottom[0]->num(); - int dim = bottom[0]->count() / bottom[0]->num(); - Dtype loss = 0; - for (int i = 0; i < num; ++i) { - int label = static_cast(bottom_label[i]); - Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); - loss -= log(prob); - } - return loss / num; -} - -template -void MultinomialLogisticLossLayer::Backward_cpu( - const vector*>& top, const bool propagate_down, - vector*>* bottom) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - const Dtype* bottom_label = (*bottom)[1]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - int num = (*bottom)[0]->num(); - int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); - memset(bottom_diff, 0, sizeof(Dtype) * (*bottom)[0]->count()); - for (int i = 0; i < num; ++i) { - int label = static_cast(bottom_label[i]); - Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); - bottom_diff[i * dim + label] = -1. / prob / num; - } -} - - -template -void InfogainLossLayer::SetUp( - const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 2) << "Loss Layer takes two blobs as input."; - CHECK_EQ(top->size(), 0) << "Loss Layer takes no output."; - CHECK_EQ(bottom[0]->num(), bottom[1]->num()) - << "The data and label should have the same number."; - CHECK_EQ(bottom[1]->channels(), 1); - CHECK_EQ(bottom[1]->height(), 1); - CHECK_EQ(bottom[1]->width(), 1); - BlobProto blob_proto; - ReadProtoFromBinaryFile(this->layer_param_.infogain_loss_param().source(), - &blob_proto); - infogain_.FromProto(blob_proto); - CHECK_EQ(infogain_.num(), 1); - CHECK_EQ(infogain_.channels(), 1); - CHECK_EQ(infogain_.height(), infogain_.width()); -} - - -template -Dtype InfogainLossLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - const Dtype* bottom_label = bottom[1]->cpu_data(); - const Dtype* infogain_mat = infogain_.cpu_data(); - int num = bottom[0]->num(); - int dim = bottom[0]->count() / bottom[0]->num(); - CHECK_EQ(infogain_.height(), dim); - Dtype loss = 0; - for (int i = 0; i < num; ++i) { - int label = static_cast(bottom_label[i]); - for (int j = 0; j < dim; ++j) { - Dtype prob = max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); - loss -= infogain_mat[label * dim + j] * log(prob); - } - } - return loss / num; -} - -template -void InfogainLossLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, - vector*>* bottom) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - const Dtype* bottom_label = (*bottom)[1]->cpu_data(); - const Dtype* infogain_mat = infogain_.cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - int num = (*bottom)[0]->num(); - int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); - CHECK_EQ(infogain_.height(), dim); - for (int i = 0; i < num; ++i) { - int label = static_cast(bottom_label[i]); - for (int j = 0; j < dim; ++j) { - Dtype prob = max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); - bottom_diff[i * dim + j] = - infogain_mat[label * dim + j] / prob / num; - } - } -} - - -template -void EuclideanLossLayer::SetUp( - const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 2) << "Loss Layer takes two blobs as input."; - CHECK_EQ(top->size(), 0) << "Loss Layer takes no as output."; - CHECK_EQ(bottom[0]->num(), bottom[1]->num()) - << "The data and label should have the same number."; - CHECK_EQ(bottom[0]->channels(), bottom[1]->channels()); - CHECK_EQ(bottom[0]->height(), bottom[1]->height()); - CHECK_EQ(bottom[0]->width(), bottom[1]->width()); - difference_.Reshape(bottom[0]->num(), bottom[0]->channels(), - bottom[0]->height(), bottom[0]->width()); -} - -template -Dtype EuclideanLossLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - int count = bottom[0]->count(); - int num = bottom[0]->num(); - caffe_sub(count, bottom[0]->cpu_data(), bottom[1]->cpu_data(), - difference_.mutable_cpu_data()); - Dtype loss = caffe_cpu_dot( - count, difference_.cpu_data(), difference_.cpu_data()) / num / Dtype(2); - return loss; -} - -template -void EuclideanLossLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - int count = (*bottom)[0]->count(); - int num = (*bottom)[0]->num(); - // Compute the gradient - caffe_cpu_axpby(count, Dtype(1) / num, difference_.cpu_data(), Dtype(0), - (*bottom)[0]->mutable_cpu_diff()); -} - -template -void AccuracyLayer::SetUp( - const vector*>& bottom, vector*>* top) { - CHECK_EQ(bottom.size(), 2) << "Accuracy Layer takes two blobs as input."; - CHECK_EQ(top->size(), 1) << "Accuracy Layer takes 1 output."; - CHECK_EQ(bottom[0]->num(), bottom[1]->num()) - << "The data and label should have the same number."; - CHECK_EQ(bottom[1]->channels(), 1); - CHECK_EQ(bottom[1]->height(), 1); - CHECK_EQ(bottom[1]->width(), 1); - (*top)[0]->Reshape(1, 2, 1, 1); -} - -template -Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - Dtype accuracy = 0; - Dtype logprob = 0; - const Dtype* bottom_data = bottom[0]->cpu_data(); - const Dtype* bottom_label = bottom[1]->cpu_data(); - int num = bottom[0]->num(); - int dim = bottom[0]->count() / bottom[0]->num(); - for (int i = 0; i < num; ++i) { - // Accuracy - Dtype maxval = -FLT_MAX; - int max_id = 0; - for (int j = 0; j < dim; ++j) { - if (bottom_data[i * dim + j] > maxval) { - maxval = bottom_data[i * dim + j]; - max_id = j; - } - } - if (max_id == static_cast(bottom_label[i])) { - ++accuracy; - } - Dtype prob = max(bottom_data[i * dim + static_cast(bottom_label[i])], - Dtype(kLOG_THRESHOLD)); - logprob -= log(prob); - } - // LOG(INFO) << "Accuracy: " << accuracy; - (*top)[0]->mutable_cpu_data()[0] = accuracy / num; - (*top)[0]->mutable_cpu_data()[1] = logprob / num; - // Accuracy layer should not be used as a loss function. - return Dtype(0); -} - -template -void HingeLossLayer::SetUp(const vector*>& bottom, - vector*>* top) { - CHECK_EQ(bottom.size(), 2) << "Hinge Loss Layer takes two blobs as input."; - CHECK_EQ(top->size(), 0) << "Hinge Loss Layer takes no output."; - C_ = this->layer_param_.hinge_loss_param().c_param(); -} - -template -Dtype HingeLossLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); - const Dtype* label = bottom[1]->cpu_data(); - int num = bottom[0]->num(); - int count = bottom[0]->count(); - int dim = count / num; - - caffe_copy(count, bottom_data, bottom_diff); - for (int i = 0; i < num; ++i) { - bottom_diff[i * dim + static_cast(label[i])] *= -1; - } - for (int i = 0; i < num; ++i) { - for (int j = 0; j < dim; ++j) { - bottom_diff[i * dim + j] = max(Dtype(0), 1 + bottom_diff[i * dim + j]); - } - } - switch (this->layer_param_.hinge_loss_param().hinge_norm()) { - case HingeLossParameter_Norm_L1: - return caffe_cpu_asum(count, bottom_diff) / num * C_; - case HingeLossParameter_Norm_L2: - return caffe_cpu_dot(count, bottom_diff, bottom_diff) / num * C_; - default: - LOG(FATAL) << "Unknown hinge_norm"; - } -} - -template -void HingeLossLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const Dtype* label = (*bottom)[1]->cpu_data(); - int num = (*bottom)[0]->num(); - int count = (*bottom)[0]->count(); - int dim = count / num; - - for (int i = 0; i < num; ++i) { - bottom_diff[i * dim + static_cast(label[i])] *= -1; - } - - switch (this->layer_param_.hinge_loss_param().hinge_norm()) { - case HingeLossParameter_Norm_L1: - caffe_cpu_sign(count, bottom_diff, bottom_diff); - caffe_scal(count, Dtype(C_ / num), bottom_diff); - break; - case HingeLossParameter_Norm_L2: - caffe_scal(count, Dtype(2 * C_ / num), bottom_diff); - break; - default: - LOG(FATAL) << "Unknown hinge_norm"; - } ->>>>>>> 161e7cb... Fix the loss to follow the convention } INSTANTIATE_CLASS(LossLayer); From 8d4dacf6d9b5151937927eea34f96ebc6912eb31 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 20 Jun 2014 19:55:59 -0700 Subject: [PATCH 0149/2053] Now AccuracyLayer only computes accuracy, one should use LossLayers to compute loss Changed all val.prototxt in examples to add a LossLayer to compute loss in Test --- examples/cifar10/cifar10_full_test.prototxt | 15 +++++----- examples/cifar10/cifar10_quick_test.prototxt | 15 +++++----- .../feature_extraction/imagenet_val.prototxt | 7 +++++ examples/imagenet/alexnet_val.prototxt | 15 +++++----- examples/imagenet/imagenet_val.prototxt | 15 +++++----- .../mnist/lenet_consolidated_solver.prototxt | 30 ++++++++++--------- examples/mnist/lenet_test.prototxt | 15 +++++----- .../mnist/mnist_autoencoder_test.prototxt | 1 + .../pascal_finetune_val.prototxt | 16 +++++----- include/caffe/loss_layers.hpp | 5 +++- src/caffe/layers/accuracy_layer.cpp | 8 ++--- 11 files changed, 79 insertions(+), 63 deletions(-) diff --git a/examples/cifar10/cifar10_full_test.prototxt b/examples/cifar10/cifar10_full_test.prototxt index 0e1957a9045..1f77b4f0348 100644 --- a/examples/cifar10/cifar10_full_test.prototxt +++ b/examples/cifar10/cifar10_full_test.prototxt @@ -166,16 +166,17 @@ layers { } } } -layers { - name: "prob" - type: SOFTMAX - bottom: "ip1" - top: "prob" -} layers { name: "accuracy" type: ACCURACY - bottom: "prob" + bottom: "ip1" bottom: "label" top: "accuracy" } +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "ip1" + bottom: "label" + top: "loss" +} diff --git a/examples/cifar10/cifar10_quick_test.prototxt b/examples/cifar10/cifar10_quick_test.prototxt index a154b9a0ea7..aa82c32aa24 100644 --- a/examples/cifar10/cifar10_quick_test.prototxt +++ b/examples/cifar10/cifar10_quick_test.prototxt @@ -160,16 +160,17 @@ layers { } } } -layers { - name: "prob" - type: SOFTMAX - bottom: "ip2" - top: "prob" -} layers { name: "accuracy" type: ACCURACY - bottom: "prob" + bottom: "ip2" bottom: "label" top: "accuracy" } +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "ip2" + bottom: "label" + top: "loss" +} diff --git a/examples/feature_extraction/imagenet_val.prototxt b/examples/feature_extraction/imagenet_val.prototxt index 14bfe770ef8..b0451a1a114 100644 --- a/examples/feature_extraction/imagenet_val.prototxt +++ b/examples/feature_extraction/imagenet_val.prototxt @@ -227,3 +227,10 @@ layers { bottom: "label" top: "accuracy" } +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "fc8" + bottom: "label" + top: "loss" +} diff --git a/examples/imagenet/alexnet_val.prototxt b/examples/imagenet/alexnet_val.prototxt index 3fd6296ef9d..1d8d86b78ff 100644 --- a/examples/imagenet/alexnet_val.prototxt +++ b/examples/imagenet/alexnet_val.prototxt @@ -213,15 +213,16 @@ layers { top: "fc8" } layers { - name: "prob" - type: SOFTMAX + name: "accuracy" + type: ACCURACY bottom: "fc8" - top: "prob" + bottom: "label" + top: "accuracy" } layers { - top: "accuracy" - name: "accuracy" - type: ACCURACY - bottom: "prob" + name: "loss" + type: SOFTMAX_LOSS + bottom: "fc8" bottom: "label" + top: "loss" } diff --git a/examples/imagenet/imagenet_val.prototxt b/examples/imagenet/imagenet_val.prototxt index dd26f40ea14..8be5150cdd2 100644 --- a/examples/imagenet/imagenet_val.prototxt +++ b/examples/imagenet/imagenet_val.prototxt @@ -212,16 +212,17 @@ layers { num_output: 1000 } } -layers { - name: "prob" - type: SOFTMAX - bottom: "fc8" - top: "prob" -} layers { name: "accuracy" type: ACCURACY - bottom: "prob" + bottom: "fc8" bottom: "label" top: "accuracy" } +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "fc8" + bottom: "label" + top: "loss" +} \ No newline at end of file diff --git a/examples/mnist/lenet_consolidated_solver.prototxt b/examples/mnist/lenet_consolidated_solver.prototxt index 07cbc211414..ef851e0f656 100644 --- a/examples/mnist/lenet_consolidated_solver.prototxt +++ b/examples/mnist/lenet_consolidated_solver.prototxt @@ -262,19 +262,20 @@ test_net_param { } } } - layers { - name: "prob" - type: SOFTMAX - bottom: "ip2" - top: "prob" - } layers { name: "accuracy" type: ACCURACY - bottom: "prob" + bottom: "ip2" bottom: "label" top: "accuracy" } + layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "ip2" + bottom: "label" + top: "loss" + } } # The train set has 60K images, so we run 600 test iters (600 * 100 = 60K). @@ -385,19 +386,20 @@ test_net_param { } } } - layers { - name: "prob" - type: SOFTMAX - bottom: "ip2" - top: "prob" - } layers { name: "accuracy" type: ACCURACY - bottom: "prob" + bottom: "ip2" bottom: "label" top: "accuracy" } + layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "ip2" + bottom: "label" + top: "loss" + } } # Expected results for first and last 500 iterations: diff --git a/examples/mnist/lenet_test.prototxt b/examples/mnist/lenet_test.prototxt index 3b59b75513d..2497f02ae86 100644 --- a/examples/mnist/lenet_test.prototxt +++ b/examples/mnist/lenet_test.prototxt @@ -102,16 +102,17 @@ layers { } } } -layers { - name: "prob" - type: SOFTMAX - bottom: "ip2" - top: "prob" -} layers { name: "accuracy" type: ACCURACY - bottom: "prob" + bottom: "ip2" bottom: "label" top: "accuracy" } +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "ip2" + bottom: "label" + top: "loss" +} diff --git a/examples/mnist/mnist_autoencoder_test.prototxt b/examples/mnist/mnist_autoencoder_test.prototxt index 5090e82fe0a..b52364c17fc 100644 --- a/examples/mnist/mnist_autoencoder_test.prototxt +++ b/examples/mnist/mnist_autoencoder_test.prototxt @@ -142,4 +142,5 @@ layers { bottom: "flatdata" name: "loss" type: EUCLIDEAN_LOSS + top: "loss" } diff --git a/examples/pascal-finetuning/pascal_finetune_val.prototxt b/examples/pascal-finetuning/pascal_finetune_val.prototxt index ff898fe7376..91ded585d85 100644 --- a/examples/pascal-finetuning/pascal_finetune_val.prototxt +++ b/examples/pascal-finetuning/pascal_finetune_val.prototxt @@ -313,16 +313,18 @@ layers { } } } -layers { - name: "prob" - type: SOFTMAX - bottom: "fc8_pascal" - top: "prob" -} layers { name: "accuracy" type: ACCURACY - bottom: "prob" + bottom: "fc8_pascal" bottom: "label" top: "accuracy" } +layers { + name: "prob" + type: SOFTMAX_LOSS + bottom: "fc8_pascal" + bottom: "label" + top: "loss" +} + diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index dd06ca07187..2f98a1246be 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -166,7 +166,7 @@ class MultinomialLogisticLossLayer : public LossLayer { /* AccuracyLayer Note: not an actual loss layer! Does not implement backwards step. - Computes the accuracy of a with respect to b. + Computes the accuracy of argmax(a) with respect to b. */ template class AccuracyLayer : public Layer { @@ -180,6 +180,9 @@ class AccuracyLayer : public Layer { return LayerParameter_LayerType_ACCURACY; } + virtual inline int ExactNumBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index fbc943eaf2d..899750f869a 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -23,14 +23,13 @@ void AccuracyLayer::SetUp( CHECK_EQ(bottom[1]->channels(), 1); CHECK_EQ(bottom[1]->height(), 1); CHECK_EQ(bottom[1]->width(), 1); - (*top)[0]->Reshape(1, 2, 1, 1); + (*top)[0]->Reshape(1, 1, 1, 1); } template Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { Dtype accuracy = 0; - Dtype logprob = 0; const Dtype* bottom_data = bottom[0]->cpu_data(); const Dtype* bottom_label = bottom[1]->cpu_data(); int num = bottom[0]->num(); @@ -48,13 +47,10 @@ Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, if (max_id == static_cast(bottom_label[i])) { ++accuracy; } - Dtype prob = max(bottom_data[i * dim + static_cast(bottom_label[i])], - Dtype(kLOG_THRESHOLD)); - logprob -= log(prob); } // LOG(INFO) << "Accuracy: " << accuracy; (*top)[0]->mutable_cpu_data()[0] = accuracy / num; - (*top)[0]->mutable_cpu_data()[1] = logprob / num; + // Accuracy layer should not be used as a loss function. return Dtype(0); } From 909fb3924098874a5c68bea4aac7cc1fffe3d220 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 20 Jun 2014 20:22:34 -0700 Subject: [PATCH 0150/2053] Remove C_ mentions, extra spaces and change hinge_norm to norm --- src/caffe/layers/hinge_loss_layer.cpp | 15 +++++++-------- src/caffe/layers/loss_layer.cpp | 1 - src/caffe/proto/caffe.proto | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index f0f8521ff16..e47d3c90114 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -14,7 +14,6 @@ using std::max; namespace caffe { - template Dtype HingeLossLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { @@ -34,13 +33,13 @@ Dtype HingeLossLayer::Forward_cpu(const vector*>& bottom, bottom_diff[i * dim + j] = max(Dtype(0), 1 + bottom_diff[i * dim + j]); } } - switch (this->layer_param_.hinge_loss_param().hinge_norm()) { + switch (this->layer_param_.hinge_loss_param().norm()) { case HingeLossParameter_Norm_L1: return caffe_cpu_asum(count, bottom_diff) / num; case HingeLossParameter_Norm_L2: return caffe_cpu_dot(count, bottom_diff, bottom_diff) / num; default: - LOG(FATAL) << "Unknown hinge_norm"; + LOG(FATAL) << "Unknown Norm"; } } @@ -52,21 +51,21 @@ void HingeLossLayer::Backward_cpu(const vector*>& top, int num = (*bottom)[0]->num(); int count = (*bottom)[0]->count(); int dim = count / num; - + for (int i = 0; i < num; ++i) { bottom_diff[i * dim + static_cast(label[i])] *= -1; } - switch (this->layer_param_.hinge_loss_param().hinge_norm()) { + switch (this->layer_param_.hinge_loss_param().norm()) { case HingeLossParameter_Norm_L1: caffe_cpu_sign(count, bottom_diff, bottom_diff); - caffe_scal(count, Dtype(C_ / num), bottom_diff); + caffe_scal(count, Dtype(1. / num), bottom_diff); break; case HingeLossParameter_Norm_L2: - caffe_scal(count, Dtype(2 * C_ / num), bottom_diff); + caffe_scal(count, Dtype(2. / num), bottom_diff); break; default: - LOG(FATAL) << "Unknown hinge_norm"; + LOG(FATAL) << "Unknown Norm"; } } diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index a8e63c443cc..14ea975ad0d 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -21,7 +21,6 @@ void LossLayer::SetUp( CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; FurtherSetUp(bottom, top); - } INSTANTIATE_CLASS(LossLayer); diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index b15172fa1ef..954f1033e97 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -312,7 +312,7 @@ message HingeLossParameter { L2 = 2; } // Specify the Norm to use L1 or L2 - optional Norm hinge_norm = 1 [default = L1]; + optional Norm norm = 1 [default = L1]; } // Message that stores parameters used by ImageDataLayer From 60ff8bacdde3ac37c2942efd307aa644425add1e Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 20 Jun 2014 20:26:51 -0700 Subject: [PATCH 0151/2053] Change hinge_norm to norm in test_hinge_loss --- src/caffe/test/test_hinge_loss_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index 64657c88dd7..2e8db475914 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -75,7 +75,7 @@ TYPED_TEST(HingeLossLayerTest, TestGradientL2CPU) { LayerParameter layer_param; // Set norm to L2 HingeLossParameter* hinge_loss_param = layer_param.mutable_hinge_loss_param(); - hinge_loss_param->set_hinge_norm(HingeLossParameter_Norm_L2); + hinge_loss_param->set_norm(HingeLossParameter_Norm_L2); Caffe::set_mode(Caffe::CPU); HingeLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); @@ -89,7 +89,7 @@ TYPED_TEST(HingeLossLayerTest, TestGradientL2GPU) { LayerParameter layer_param; // Set norm to L2 HingeLossParameter* hinge_loss_param = layer_param.mutable_hinge_loss_param(); - hinge_loss_param->set_hinge_norm(HingeLossParameter_Norm_L2); + hinge_loss_param->set_norm(HingeLossParameter_Norm_L2); Caffe::set_mode(Caffe::GPU); HingeLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); From 8042be6966653b3290d3c763c53727384e93d723 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sat, 21 Jun 2014 14:08:15 -0700 Subject: [PATCH 0152/2053] fix whitespace error in HingeLossLayer --- src/caffe/layers/hinge_loss_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index e47d3c90114..fd00d8c6930 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -66,7 +66,7 @@ void HingeLossLayer::Backward_cpu(const vector*>& top, break; default: LOG(FATAL) << "Unknown Norm"; - } + } } INSTANTIATE_CLASS(HingeLossLayer); From bddd10ae03ae63cea6651463520ba8a4b89f3dad Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sat, 21 Jun 2014 14:08:30 -0700 Subject: [PATCH 0153/2053] explicitly name L1 hinge test --- src/caffe/test/test_hinge_loss_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index 2e8db475914..318030b67a3 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -50,7 +50,7 @@ typedef ::testing::Types Dtypes; TYPED_TEST_CASE(HingeLossLayerTest, Dtypes); -TYPED_TEST(HingeLossLayerTest, TestGradientCPU) { +TYPED_TEST(HingeLossLayerTest, TestGradientL1CPU) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); HingeLossLayer layer(layer_param); @@ -60,7 +60,7 @@ TYPED_TEST(HingeLossLayerTest, TestGradientCPU) { &(this->blob_top_vec_), 0, -1, -1); } -TYPED_TEST(HingeLossLayerTest, TestGradientGPU) { +TYPED_TEST(HingeLossLayerTest, TestGradientL1GPU) { LayerParameter layer_param; Caffe::set_mode(Caffe::GPU); HingeLossLayer layer(layer_param); From 93049bd7d5e788ca95ee36c4630ba96b7f6a840b Mon Sep 17 00:00:00 2001 From: Craig Quiter Date: Sat, 21 Jun 2014 15:22:05 -0700 Subject: [PATCH 0154/2053] There are 256 filters in conv2. AlexNet paper splits conv2 into two GPU's, each with 128 filters. Reference paper: http://www.cs.toronto.edu/~fritz/absps/imagenet.pdf Applying #528 to dev instead of master per @Yangqing. --- examples/filter_visualization.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index 6f494821028..130df97074a 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -298,7 +298,7 @@ "source": [ "The second layer filters, `conv2`\n", "\n", - "There are 128 filters, each of which has dimension 5 x 5 x 48. We show only the first 48 filters, with each channel shown separately, so that each filter is a row." + "There are 256 filters, each of which has dimension 5 x 5 x 48. We show only the first 48 filters, with each channel shown separately, so that each filter is a row." ] }, { @@ -611,4 +611,4 @@ "metadata": {} } ] -} \ No newline at end of file +} From da0f89bbd495c604f63744374165cdc9f3cbba9f Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 17 Jun 2014 14:53:00 +0800 Subject: [PATCH 0155/2053] Extract multiple features in a single Forward pass --- tools/extract_features.cpp | 123 +++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 47 deletions(-) diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index cdad6676d7f..99eb0dbce26 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -32,9 +33,14 @@ int feature_extraction_pipeline(int argc, char** argv) { LOG(ERROR)<< "This program takes in a trained network and an input data layer, and then" " extract features of the input data produced by the net.\n" - "Usage: demo_extract_features pretrained_net_param" - " feature_extraction_proto_file extract_feature_blob_name" - " save_feature_leveldb_name num_mini_batches [CPU/GPU] [DEVICE_ID=0]"; + "Usage: extract_features pretrained_net_param" + " feature_extraction_proto_file extract_feature_blob_name1[,name2,...]" + " save_feature_leveldb_name1[,name2,...] num_mini_batches [CPU/GPU]" + " [DEVICE_ID=0]\n" + "Note: you can extract multiple features in one pass by specifying" + " multiple feature blob names and leveldb names seperated by ','." + " The names cannot contain white space characters and the number of blobs" + " and leveldbs must be equal."; return 1; } int arg_pos = num_required_args; @@ -91,29 +97,46 @@ int feature_extraction_pipeline(int argc, char** argv) { new Net(feature_extraction_proto)); feature_extraction_net->CopyTrainedLayersFrom(pretrained_binary_proto); - string extract_feature_blob_name(argv[++arg_pos]); - CHECK(feature_extraction_net->has_blob(extract_feature_blob_name)) - << "Unknown feature blob name " << extract_feature_blob_name - << " in the network " << feature_extraction_proto; + string extract_feature_blob_names(argv[++arg_pos]); + vector blob_names; + boost::split(blob_names, extract_feature_blob_names, boost::is_any_of(",")); + + string save_feature_leveldb_names(argv[++arg_pos]); + vector leveldb_names; + boost::split(leveldb_names, save_feature_leveldb_names, + boost::is_any_of(",")); + CHECK_EQ(blob_names.size(), leveldb_names.size()) << + " the number of blob names and leveldb names must be equal"; + size_t num_features = blob_names.size(); + + for (size_t i = 0; i < num_features; i++) { + CHECK(feature_extraction_net->has_blob(blob_names[i])) + << "Unknown feature blob name " << blob_names[i] + << " in the network " << feature_extraction_proto; + } - string save_feature_leveldb_name(argv[++arg_pos]); - leveldb::DB* db; leveldb::Options options; options.error_if_exists = true; options.create_if_missing = true; options.write_buffer_size = 268435456; - LOG(INFO)<< "Opening leveldb " << save_feature_leveldb_name; - leveldb::Status status = leveldb::DB::Open(options, - save_feature_leveldb_name.c_str(), - &db); - CHECK(status.ok()) << "Failed to open leveldb " << save_feature_leveldb_name; + vector feature_dbs; + for (size_t i = 0; i < num_features; ++i) { + LOG(INFO)<< "Opening leveldb " << leveldb_names[i]; + leveldb::DB* db; + leveldb::Status status = leveldb::DB::Open(options, + leveldb_names[i].c_str(), + &db); + CHECK(status.ok()) << "Failed to open leveldb " << leveldb_names[i]; + feature_dbs.push_back(db); + } int num_mini_batches = atoi(argv[++arg_pos]); LOG(ERROR)<< "Extacting Features"; Datum datum; - leveldb::WriteBatch* batch = new leveldb::WriteBatch(); + vector feature_batches( + num_features, new leveldb::WriteBatch()); const int kMaxKeyStrLength = 100; char key_str[kMaxKeyStrLength]; int num_bytes_of_binary_code = sizeof(Dtype); @@ -121,45 +144,51 @@ int feature_extraction_pipeline(int argc, char** argv) { int image_index = 0; for (int batch_index = 0; batch_index < num_mini_batches; ++batch_index) { feature_extraction_net->Forward(input_vec); - const shared_ptr > feature_blob = feature_extraction_net - ->blob_by_name(extract_feature_blob_name); - int num_features = feature_blob->num(); - int dim_features = feature_blob->count() / num_features; - Dtype* feature_blob_data; - for (int n = 0; n < num_features; ++n) { - datum.set_height(dim_features); - datum.set_width(1); - datum.set_channels(1); - datum.clear_data(); - datum.clear_float_data(); - feature_blob_data = feature_blob->mutable_cpu_data() + - feature_blob->offset(n); - for (int d = 0; d < dim_features; ++d) { - datum.add_float_data(feature_blob_data[d]); - } - string value; - datum.SerializeToString(&value); - snprintf(key_str, kMaxKeyStrLength, "%d", image_index); - batch->Put(string(key_str), value); - ++image_index; - if (image_index % 1000 == 0) { - db->Write(leveldb::WriteOptions(), batch); - LOG(ERROR)<< "Extracted features of " << image_index << - " query images."; - delete batch; - batch = new leveldb::WriteBatch(); - } - } // for (int n = 0; n < num_features; ++n) + for (int i = 0; i < num_features; ++i) { + const shared_ptr > feature_blob = feature_extraction_net + ->blob_by_name(blob_names[i]); + int batch_size = feature_blob->num(); + int dim_features = feature_blob->count() / batch_size; + Dtype* feature_blob_data; + for (int n = 0; n < batch_size; ++n) { + datum.set_height(dim_features); + datum.set_width(1); + datum.set_channels(1); + datum.clear_data(); + datum.clear_float_data(); + feature_blob_data = feature_blob->mutable_cpu_data() + + feature_blob->offset(n); + for (int d = 0; d < dim_features; ++d) { + datum.add_float_data(feature_blob_data[d]); + } + string value; + datum.SerializeToString(&value); + snprintf(key_str, kMaxKeyStrLength, "%d", image_index); + feature_batches[i]->Put(string(key_str), value); + ++image_index; + if (image_index % 1000 == 0) { + feature_dbs[i]->Write(leveldb::WriteOptions(), feature_batches[i]); + LOG(ERROR)<< "Extracted features of " << image_index << + " query images."; + delete feature_batches[i]; + feature_batches[i] = new leveldb::WriteBatch(); + } + } // for (int n = 0; n < batch_size; ++n) + } // for (int i = 0; i < num_features; ++i) } // for (int batch_index = 0; batch_index < num_mini_batches; ++batch_index) // write the last batch if (image_index % 1000 != 0) { - db->Write(leveldb::WriteOptions(), batch); + for (int i = 0; i < num_features; ++i) { + feature_dbs[i]->Write(leveldb::WriteOptions(), feature_batches[i]); + } LOG(ERROR)<< "Extracted features of " << image_index << " query images."; } - delete batch; - delete db; + for (int i = 0; i < num_features; ++i) { + delete feature_batches[i]; + delete feature_dbs[i]; + } LOG(ERROR)<< "Successfully extracted the features!"; return 0; } From 4415f8c0453cd272fb2439711f74efd3f88aab1d Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 17 Jun 2014 16:27:24 +0800 Subject: [PATCH 0156/2053] Progress should be reported for each feature blob --- tools/extract_features.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 99eb0dbce26..aa665a00084 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -141,7 +141,7 @@ int feature_extraction_pipeline(int argc, char** argv) { char key_str[kMaxKeyStrLength]; int num_bytes_of_binary_code = sizeof(Dtype); vector*> input_vec; - int image_index = 0; + vector image_indices(num_features, 0); for (int batch_index = 0; batch_index < num_mini_batches; ++batch_index) { feature_extraction_net->Forward(input_vec); for (int i = 0; i < num_features; ++i) { @@ -163,13 +163,13 @@ int feature_extraction_pipeline(int argc, char** argv) { } string value; datum.SerializeToString(&value); - snprintf(key_str, kMaxKeyStrLength, "%d", image_index); + snprintf(key_str, kMaxKeyStrLength, "%d", image_indices[i]); feature_batches[i]->Put(string(key_str), value); - ++image_index; - if (image_index % 1000 == 0) { + ++image_indices[i]; + if (image_indices[i] % 1000 == 0) { feature_dbs[i]->Write(leveldb::WriteOptions(), feature_batches[i]); - LOG(ERROR)<< "Extracted features of " << image_index << - " query images."; + LOG(ERROR)<< "Extracted features of " << image_indices[i] << + " query images for feature blob " << blob_names[i]; delete feature_batches[i]; feature_batches[i] = new leveldb::WriteBatch(); } @@ -177,12 +177,12 @@ int feature_extraction_pipeline(int argc, char** argv) { } // for (int i = 0; i < num_features; ++i) } // for (int batch_index = 0; batch_index < num_mini_batches; ++batch_index) // write the last batch - if (image_index % 1000 != 0) { - for (int i = 0; i < num_features; ++i) { + for (int i = 0; i < num_features; ++i) { + if (image_indices[i] % 1000 != 0) { feature_dbs[i]->Write(leveldb::WriteOptions(), feature_batches[i]); } - LOG(ERROR)<< "Extracted features of " << image_index << - " query images."; + LOG(ERROR)<< "Extracted features of " << image_indices[i] << + " query images for feature blob " << blob_names[i]; } for (int i = 0; i < num_features; ++i) { From 738be6fdfc5faec5fc111e040c2436628d1b9989 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 17 Jun 2014 16:56:30 +0800 Subject: [PATCH 0157/2053] No need to manually delete the pointers which are managed by std::vector --- tools/extract_features.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index aa665a00084..66d4be1eaf1 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -185,10 +185,6 @@ int feature_extraction_pipeline(int argc, char** argv) { " query images for feature blob " << blob_names[i]; } - for (int i = 0; i < num_features; ++i) { - delete feature_batches[i]; - delete feature_dbs[i]; - } LOG(ERROR)<< "Successfully extracted the features!"; return 0; } From 4a276b03fa94bd040a3596e77e34ae0468665a10 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 20 Jun 2014 10:14:19 +0800 Subject: [PATCH 0158/2053] Replace the raw pointers with shared_ptr to ensure memory is released --- tools/extract_features.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 66d4be1eaf1..1bff7ca4f1d 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -119,7 +119,7 @@ int feature_extraction_pipeline(int argc, char** argv) { options.error_if_exists = true; options.create_if_missing = true; options.write_buffer_size = 268435456; - vector feature_dbs; + vector > feature_dbs; for (size_t i = 0; i < num_features; ++i) { LOG(INFO)<< "Opening leveldb " << leveldb_names[i]; leveldb::DB* db; @@ -127,7 +127,7 @@ int feature_extraction_pipeline(int argc, char** argv) { leveldb_names[i].c_str(), &db); CHECK(status.ok()) << "Failed to open leveldb " << leveldb_names[i]; - feature_dbs.push_back(db); + feature_dbs.push_back(shared_ptr(db)); } int num_mini_batches = atoi(argv[++arg_pos]); @@ -135,8 +135,9 @@ int feature_extraction_pipeline(int argc, char** argv) { LOG(ERROR)<< "Extacting Features"; Datum datum; - vector feature_batches( - num_features, new leveldb::WriteBatch()); + vector > feature_batches( + num_features, + shared_ptr(new leveldb::WriteBatch())); const int kMaxKeyStrLength = 100; char key_str[kMaxKeyStrLength]; int num_bytes_of_binary_code = sizeof(Dtype); @@ -167,11 +168,11 @@ int feature_extraction_pipeline(int argc, char** argv) { feature_batches[i]->Put(string(key_str), value); ++image_indices[i]; if (image_indices[i] % 1000 == 0) { - feature_dbs[i]->Write(leveldb::WriteOptions(), feature_batches[i]); + feature_dbs[i]->Write(leveldb::WriteOptions(), + feature_batches[i].get()); LOG(ERROR)<< "Extracted features of " << image_indices[i] << " query images for feature blob " << blob_names[i]; - delete feature_batches[i]; - feature_batches[i] = new leveldb::WriteBatch(); + feature_batches[i].reset(new leveldb::WriteBatch()); } } // for (int n = 0; n < batch_size; ++n) } // for (int i = 0; i < num_features; ++i) @@ -179,7 +180,7 @@ int feature_extraction_pipeline(int argc, char** argv) { // write the last batch for (int i = 0; i < num_features; ++i) { if (image_indices[i] % 1000 != 0) { - feature_dbs[i]->Write(leveldb::WriteOptions(), feature_batches[i]); + feature_dbs[i]->Write(leveldb::WriteOptions(), feature_batches[i].get()); } LOG(ERROR)<< "Extracted features of " << image_indices[i] << " query images for feature blob " << blob_names[i]; From dda092c84e35943ced8be41fd545aea4ab3c6409 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 24 Jun 2014 22:14:54 +0800 Subject: [PATCH 0159/2053] Init google logging --- tools/extract_features.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 1bff7ca4f1d..becc1f86d47 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -28,6 +28,7 @@ int main(int argc, char** argv) { template int feature_extraction_pipeline(int argc, char** argv) { + ::google::InitGoogleLogging(argv[0]); const int num_required_args = 6; if (argc < num_required_args) { LOG(ERROR)<< From adab413fc65f760f9bc2097f379c2703e3641de4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 25 Jun 2014 11:01:10 +0800 Subject: [PATCH 0160/2053] fix SOFTMAX_LOSS to work with loss top blob interface --- include/caffe/vision_layers.hpp | 2 +- src/caffe/layers/softmax_loss_layer.cpp | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index fc3dbbe1938..b7e1068c7d3 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -425,7 +425,7 @@ class SoftmaxWithLossLayer : public Layer { return LayerParameter_LayerType_SOFTMAX_LOSS; } virtual inline int ExactNumBottomBlobs() const { return 2; } - virtual inline int ExactNumTopBlobs() const { return 0; } + virtual inline int MaxTopBlobs() const { return 2; } protected: virtual Dtype Forward_cpu(const vector*>& bottom, diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 8a37efee395..bdb3272ee25 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -20,6 +20,15 @@ void SoftmaxWithLossLayer::SetUp(const vector*>& bottom, softmax_bottom_vec_.push_back(bottom[0]); softmax_top_vec_.push_back(&prob_); softmax_layer_->SetUp(softmax_bottom_vec_, &softmax_top_vec_); + if (top->size() >= 1) { + // softmax loss (averaged across batch) + (*top)[0]->Reshape(1, 1, 1, 1); + } + if (top->size() == 2) { + // softmax output + (*top)[1]->Reshape(bottom[0]->num(), bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); + } } template @@ -37,9 +46,12 @@ Dtype SoftmaxWithLossLayer::Forward_cpu( loss += -log(max(prob_data[i * dim + static_cast(label[i])], Dtype(FLT_MIN))); } - if (top->size() == 1) { + if (top->size() >= 1) { (*top)[0]->mutable_cpu_data()[0] = loss / num; } + if (top->size() == 2) { + (*top)[1]->ShareData(prob_); + } return loss / num; } From ba09a9c3484096827c9f966beebdd9ef34764f8f Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Mon, 26 May 2014 02:02:42 -0700 Subject: [PATCH 0161/2053] actually check status values from all HDF5 calls --- src/caffe/layers/hdf5_data_layer.cpp | 1 + src/caffe/util/io.cpp | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index d5c64f05696..50863b8d93a 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -45,6 +45,7 @@ void HDF5DataLayer::LoadHDF5FileData(const char* filename) { file_id, "label", MIN_LABEL_DIM, MAX_LABEL_DIM, &label_blob_); herr_t status = H5Fclose(file_id); + CHECK_GE(status, 0) << "Failed to close HDF5 file " << filename; CHECK_EQ(data_blob_.num(), label_blob_.num()); LOG(INFO) << "Successully loaded " << data_blob_.num() << " rows"; } diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 65f82547071..ff65bd64d88 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -123,6 +123,7 @@ void hdf5_load_nd_dataset_helper( herr_t status; int ndims; status = H5LTget_dataset_ndims(file_id, dataset_name_, &ndims); + CHECK_GE(status, 0) << "Failed to get dataset ndims for " << dataset_name_; CHECK_GE(ndims, min_dim); CHECK_LE(ndims, max_dim); @@ -131,6 +132,7 @@ void hdf5_load_nd_dataset_helper( H5T_class_t class_; status = H5LTget_dataset_info( file_id, dataset_name_, dims.data(), &class_, NULL); + CHECK_GE(status, 0) << "Failed to get dataset info for " << dataset_name_; CHECK_EQ(class_, H5T_FLOAT) << "Expected float or double data"; blob->Reshape( @@ -146,6 +148,7 @@ void hdf5_load_nd_dataset(hid_t file_id, const char* dataset_name_, hdf5_load_nd_dataset_helper(file_id, dataset_name_, min_dim, max_dim, blob); herr_t status = H5LTread_dataset_float( file_id, dataset_name_, blob->mutable_cpu_data()); + CHECK_GE(status, 0) << "Failed to read float dataset " << dataset_name_; } template <> @@ -154,6 +157,7 @@ void hdf5_load_nd_dataset(hid_t file_id, const char* dataset_name_, hdf5_load_nd_dataset_helper(file_id, dataset_name_, min_dim, max_dim, blob); herr_t status = H5LTread_dataset_double( file_id, dataset_name_, blob->mutable_cpu_data()); + CHECK_GE(status, 0) << "Failed to read double dataset " << dataset_name_; } template <> From c0bcf68f8d2b063dd6b92acdfc30c7d5a5fb44ea Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Tue, 10 Jun 2014 15:34:52 -0700 Subject: [PATCH 0162/2053] check if window file is empty in WindowDataLayer Also note that window files containing windows with different numbers of channels may not work correctly. --- src/caffe/layers/window_data_layer.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index e08bed7d56f..fd4860f98be 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -291,7 +291,10 @@ void WindowDataLayer::SetUp(const vector*>& bottom, string hashtag; int image_index, channels; - while (infile >> hashtag >> image_index) { + if (!(infile >> hashtag >> image_index)) { + LOG(FATAL) << "Window file is empty"; + } + do { CHECK_EQ(hashtag, "#"); // read image path string image_path; @@ -347,7 +350,7 @@ void WindowDataLayer::SetUp(const vector*>& bottom, << image_size[2] << " " << "windows to process: " << num_windows; } - } + } while (infile >> hashtag >> image_index); LOG(INFO) << "Number of images: " << image_index+1; From 636d51c4a61464908f9236ae158b49aca0686da4 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Mon, 26 May 2014 02:31:05 -0700 Subject: [PATCH 0163/2053] initialize in declared order --- include/caffe/blob.hpp | 4 ++-- src/caffe/common.cpp | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index 75101462faf..c04375a10e2 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -13,8 +13,8 @@ template class Blob { public: Blob() - : num_(0), channels_(0), height_(0), width_(0), count_(0), data_(), - diff_() {} + : data_(), diff_(), num_(0), channels_(0), height_(0), width_(0), + count_(0) {} explicit Blob(const int num, const int channels, const int height, const int width); void Reshape(const int num, const int channels, const int height, diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 6eadfc7917e..387d008c614 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -22,9 +22,8 @@ int64_t cluster_seedgen(void) { Caffe::Caffe() - : mode_(Caffe::CPU), phase_(Caffe::TRAIN), cublas_handle_(NULL), - curand_generator_(NULL), - random_generator_() { + : cublas_handle_(NULL), curand_generator_(NULL), random_generator_(), + mode_(Caffe::CPU), phase_(Caffe::TRAIN) { // Try to create a cublas handler, and report an error if failed (but we will // keep the program running as one might just want to run CPU code). if (cublasCreate(&cublas_handle_) != CUBLAS_STATUS_SUCCESS) { From 1ee22bf761c7d6af2dc53c3ec34a4171d749cf72 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Wed, 11 Jun 2014 19:31:22 -0700 Subject: [PATCH 0164/2053] initialize in declared order in tests --- src/caffe/test/test_data_layer.cpp | 4 ++-- src/caffe/test/test_hdf5data_layer.cpp | 6 +++--- src/caffe/test/test_image_data_layer.cpp | 6 +++--- src/caffe/test/test_lrn_layer.cpp | 6 +++--- src/caffe/test/test_memory_data_layer.cpp | 7 ++++--- src/caffe/test/test_random_number_generator.cpp | 4 ++-- 6 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 68f2618d323..782fe1212c6 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -24,9 +24,9 @@ template class DataLayerTest : public ::testing::Test { protected: DataLayerTest() - : blob_top_data_(new Blob()), + : filename_(new string(tmpnam(NULL))), + blob_top_data_(new Blob()), blob_top_label_(new Blob()), - filename_(new string(tmpnam(NULL))), backend_(DataParameter_DB_LEVELDB), seed_(1701) {} virtual void SetUp() { diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index a0ed113b36e..dd2027c5591 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -24,9 +24,9 @@ template class HDF5DataLayerTest : public ::testing::Test { protected: HDF5DataLayerTest() - : blob_top_data_(new Blob()), - blob_top_label_(new Blob()), - filename(NULL) {} + : filename(NULL), + blob_top_data_(new Blob()), + blob_top_label_(new Blob()) {} virtual void SetUp() { blob_top_vec_.push_back(blob_top_data_); blob_top_vec_.push_back(blob_top_label_); diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index fea5793d4be..2278f4e2eb8 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -27,10 +27,10 @@ template class ImageDataLayerTest : public ::testing::Test { protected: ImageDataLayerTest() - : blob_top_data_(new Blob()), - blob_top_label_(new Blob()), + : seed_(1701), filename_(new string(tmpnam(NULL))), - seed_(1701) {} + blob_top_data_(new Blob()), + blob_top_label_(new Blob()) {} virtual void SetUp() { blob_top_vec_.push_back(blob_top_data_); blob_top_vec_.push_back(blob_top_label_); diff --git a/src/caffe/test/test_lrn_layer.cpp b/src/caffe/test/test_lrn_layer.cpp index 1923128dd71..47c46ee1dfe 100644 --- a/src/caffe/test/test_lrn_layer.cpp +++ b/src/caffe/test/test_lrn_layer.cpp @@ -25,9 +25,9 @@ template class LRNLayerTest : public ::testing::Test { protected: LRNLayerTest() - : blob_bottom_(new Blob()), - blob_top_(new Blob()), - epsilon_(Dtype(1e-5)) {} + : epsilon_(Dtype(1e-5)), + blob_bottom_(new Blob()), + blob_top_(new Blob()) {} virtual void SetUp() { Caffe::set_random_seed(1701); blob_bottom_->Reshape(2, 7, 3, 3); diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index 15f01bd41e3..9781439f2fe 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -12,9 +12,10 @@ template class MemoryDataLayerTest : public ::testing::Test { protected: MemoryDataLayerTest() - : data_blob_(new Blob()), - label_blob_(new Blob()), - data_(new Blob()), labels_(new Blob()) {} + : data_(new Blob()), + labels_(new Blob()), + data_blob_(new Blob()), + label_blob_(new Blob()) {} virtual void SetUp() { batch_size_ = 8; batches_ = 12; diff --git a/src/caffe/test/test_random_number_generator.cpp b/src/caffe/test/test_random_number_generator.cpp index 62daf6087fd..4116de4c252 100644 --- a/src/caffe/test/test_random_number_generator.cpp +++ b/src/caffe/test/test_random_number_generator.cpp @@ -16,9 +16,9 @@ template class RandomNumberGeneratorTest : public ::testing::Test { protected: RandomNumberGeneratorTest() - : sample_size_(10000), + : mean_bound_multiplier_(3.8), // ~99.99% confidence for test failure. + sample_size_(10000), seed_(1701), - mean_bound_multiplier_(3.8), // ~99.99% confidence for test failure. data_(new SyncedMemory(sample_size_ * sizeof(Dtype))), data_2_(new SyncedMemory(sample_size_ * sizeof(Dtype))), int_data_(new SyncedMemory(sample_size_ * sizeof(int))), From a65cb967e66c6ec6248ea0923b4398c708af959d Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Mon, 26 May 2014 02:31:34 -0700 Subject: [PATCH 0165/2053] remove unused variables --- src/caffe/layers/tanh_layer.cpp | 1 - src/caffe/net.cpp | 3 --- tools/extract_features.cpp | 1 - 3 files changed, 5 deletions(-) diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp index 66f530f82d5..77b4410411c 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -33,7 +33,6 @@ void TanHLayer::Backward_cpu(const vector*>& top, const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); const int count = (*bottom)[0]->count(); - Dtype exp2x; Dtype tanhx; for (int i = 0; i < count; ++i) { tanhx = top_data[i]; diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 41ae7520356..d76d284df2e 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -42,7 +42,6 @@ void Net::Init(const NetParameter& in_param) { name_ = param.name(); map blob_name_to_idx; set available_blobs; - int num_layers = param.layers_size(); CHECK_EQ(param.input_size() * 4, param.input_dim_size()) << "Incorrect input blob dimension specifications."; memory_used_ = 0; @@ -58,7 +57,6 @@ void Net::Init(const NetParameter& in_param) { bottom_id_vecs_.resize(param.layers_size()); top_id_vecs_.resize(param.layers_size()); for (int layer_id = 0; layer_id < param.layers_size(); ++layer_id) { - bool in_place = false; const LayerParameter& layer_param = param.layers(layer_id); layers_.push_back(shared_ptr >(GetLayer(layer_param))); layer_names_.push_back(layer_param.name()); @@ -198,7 +196,6 @@ int Net::AppendBottom(const NetParameter& param, bottom_vecs_[layer_id].push_back(blobs_[blob_id].get()); bottom_id_vecs_[layer_id].push_back(blob_id); available_blobs->erase(blob_name); - bool need_backward = param.force_backward() || blob_need_backward_[blob_id]; return blob_id; } diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index cdad6676d7f..3a670d96c9a 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -116,7 +116,6 @@ int feature_extraction_pipeline(int argc, char** argv) { leveldb::WriteBatch* batch = new leveldb::WriteBatch(); const int kMaxKeyStrLength = 100; char key_str[kMaxKeyStrLength]; - int num_bytes_of_binary_code = sizeof(Dtype); vector*> input_vec; int image_index = 0; for (int batch_index = 0; batch_index < num_mini_batches; ++batch_index) { From 88472c9b173f9885af192d8b78ebf9b18b89dee5 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Wed, 11 Jun 2014 19:31:40 -0700 Subject: [PATCH 0166/2053] remove unused variables from tests --- src/caffe/test/test_hdf5data_layer.cpp | 1 - src/caffe/test/test_lrn_layer.cpp | 1 - src/caffe/test/test_neuron_layer.cpp | 2 -- src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp | 1 - src/gtest/gtest-all.cpp | 1 - 5 files changed, 6 deletions(-) diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index dd2027c5591..1cbca0090fd 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -61,7 +61,6 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { int batch_size = 5; hdf5_data_param->set_batch_size(batch_size); hdf5_data_param->set_source(*(this->filename)); - int num_rows = 10; int num_cols = 8; int height = 5; int width = 5; diff --git a/src/caffe/test/test_lrn_layer.cpp b/src/caffe/test/test_lrn_layer.cpp index 47c46ee1dfe..7f0a211a50b 100644 --- a/src/caffe/test/test_lrn_layer.cpp +++ b/src/caffe/test/test_lrn_layer.cpp @@ -55,7 +55,6 @@ void LRNLayerTest::ReferenceLRNForward( Blob* blob_top) { blob_top->Reshape(blob_bottom.num(), blob_bottom.channels(), blob_bottom.height(), blob_bottom.width()); - const Dtype* bottom_data = blob_bottom.cpu_data(); Dtype* top_data = blob_top->mutable_cpu_data(); LRNParameter lrn_param = layer_param.lrn_param(); Dtype alpha = lrn_param.alpha(); diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 2210b4612ad..ca70e1acd9b 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -189,7 +189,6 @@ TYPED_TEST(NeuronLayerTest, TestDropoutCPUTestPhase) { // Now, check values const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); - float scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); for (int i = 0; i < this->blob_bottom_->count(); ++i) { if (top_data[i] != 0) { EXPECT_EQ(top_data[i], bottom_data[i]); @@ -244,7 +243,6 @@ TYPED_TEST(NeuronLayerTest, TestDropoutGPUTestPhase) { // Now, check values const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); - float scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); for (int i = 0; i < this->blob_bottom_->count(); ++i) { if (top_data[i] != 0) { EXPECT_EQ(top_data[i], bottom_data[i]); diff --git a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp index d8018be0c25..089d5950967 100644 --- a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp @@ -69,7 +69,6 @@ class SigmoidCrossEntropyLossLayerTest : public ::testing::Test { targets_filler_param.set_max(1.0); UniformFiller targets_filler(targets_filler_param); Dtype eps = 2e-2; - int num_inf = 0; for (int i = 0; i < 100; ++i) { // Fill the data vector data_filler.Fill(this->blob_bottom_data_); diff --git a/src/gtest/gtest-all.cpp b/src/gtest/gtest-all.cpp index 5ced66a90f1..926197419fc 100644 --- a/src/gtest/gtest-all.cpp +++ b/src/gtest/gtest-all.cpp @@ -601,7 +601,6 @@ class GTestFlagSaver { bool list_tests_; String output_; bool print_time_; - bool pretty_; internal::Int32 random_seed_; internal::Int32 repeat_; bool shuffle_; From e84dfb26bbda927e591cf9b15a752d44004c7c8f Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Wed, 11 Jun 2014 15:29:04 -0700 Subject: [PATCH 0167/2053] add missing const qualifiers to MemoryDataLayer ExactNum* functions --- include/caffe/data_layers.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 2b4c278eafe..fc93daacd3c 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -248,8 +248,8 @@ class MemoryDataLayer : public Layer { virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_MEMORY_DATA; } - virtual inline int ExactNumBottomBlobs() { return 0; } - virtual inline int ExactNumTopBlobs() { return 2; } + virtual inline int ExactNumBottomBlobs() const { return 0; } + virtual inline int ExactNumTopBlobs() const { return 2; } // Reset should accept const pointers, but can't, because the memory // will be given to Blob, which is mutable From c41c15a138de23e0bba80c31ad7813f556be6be4 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Tue, 10 Jun 2014 14:45:36 -0700 Subject: [PATCH 0168/2053] move CUDA 6.0 check into switch statement itself This allows -Wswitch to be turned on so that the compiler can check exhaustiveness. --- include/caffe/common.hpp | 5 ----- src/caffe/common.cpp | 2 ++ 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 7bfa5d402bd..bd4e39f136d 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -56,11 +56,6 @@ private:\ // CUDA: check for error after kernel execution and exit loudly if there is one. #define CUDA_POST_KERNEL_CHECK CUDA_CHECK(cudaPeekAtLastError()) -// Define not supported status for pre-6.0 compatibility. -#if CUDA_VERSION < 6000 -#define CUBLAS_STATUS_NOT_SUPPORTED 831486 -#endif - namespace caffe { // We will use the boost shared_ptr instead of the new C++11 one mainly diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 387d008c614..2964b2ce1d0 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -156,8 +156,10 @@ const char* cublasGetErrorString(cublasStatus_t error) { return "CUBLAS_STATUS_EXECUTION_FAILED"; case CUBLAS_STATUS_INTERNAL_ERROR: return "CUBLAS_STATUS_INTERNAL_ERROR"; +#if CUDA_VERSION >= 6000 case CUBLAS_STATUS_NOT_SUPPORTED: return "CUBLAS_STATUS_NOT_SUPPORTED"; +#endif } return "Unknown cublas status"; } From 1334c3fa58eb935d38e2c648f1b05dd995661a70 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Tue, 10 Jun 2014 14:50:24 -0700 Subject: [PATCH 0169/2053] initialize and comment variables that the compiler finds suspicious --- src/caffe/layers/data_layer.cpp | 2 +- src/caffe/layers/pooling_layer.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index f12ae1c12e1..29c4fec8ca4 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -26,7 +26,7 @@ void* DataLayerPrefetch(void* layer_pointer) { Datum datum; CHECK(layer->prefetch_data_); Dtype* top_data = layer->prefetch_data_->mutable_cpu_data(); - Dtype* top_label; + Dtype* top_label = NULL; // suppress warnings about uninitialized variables if (layer->output_labels_) { top_label = layer->prefetch_label_->mutable_cpu_data(); } diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 8f5f82d6ff7..ba84edeab5d 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -87,8 +87,8 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, const int top_count = (*top)[0]->count(); // We'll output the mask to top[1] if it's of size >1. const bool use_top_mask = top->size() > 1; - int* mask; - Dtype* top_mask; + int* mask = NULL; // suppress warnings about uninitalized variables + Dtype* top_mask = NULL; // Different pooling methods. We explicitly do the switch outside the for // loop to save time, although this results in more code. switch (this->layer_param_.pooling_param().pool()) { @@ -195,8 +195,8 @@ void PoolingLayer::Backward_cpu(const vector*>& top, caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); // We'll output the mask to top[1] if it's of size >1. const bool use_top_mask = top.size() > 1; - const int* mask; - const Dtype* top_mask; + const int* mask = NULL; // suppress warnings about uninitialized variables + const Dtype* top_mask = NULL; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: // The main loop From cd81969b245a245fb72e9e33c9f5ffdbfdf1389f Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Tue, 10 Jun 2014 15:34:01 -0700 Subject: [PATCH 0170/2053] don't end comments with \, so that -Wcomment can be used --- tools/convert_imageset.cpp | 2 +- tools/dump_network.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index aa9515514c3..c4bc0b32439 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -2,7 +2,7 @@ // This program converts a set of images to a leveldb by storing them as Datum // proto buffers. // Usage: -// convert_imageset [-g] ROOTFOLDER/ LISTFILE DB_NAME RANDOM_SHUFFLE[0 or 1] \ +// convert_imageset [-g] ROOTFOLDER/ LISTFILE DB_NAME RANDOM_SHUFFLE[0 or 1] // [resize_height] [resize_width] // where ROOTFOLDER is the root folder that holds all the images, and LISTFILE // should be a list of files as well as their labels, in the format as diff --git a/tools/dump_network.cpp b/tools/dump_network.cpp index f29e150b048..8ed8edac284 100644 --- a/tools/dump_network.cpp +++ b/tools/dump_network.cpp @@ -4,7 +4,7 @@ // all the intermediate blobs produced by the net to individual binary // files stored in protobuffer binary formats. // Usage: -// dump_network input_net_param trained_net_param \ +// dump_network input_net_param trained_net_param // input_blob output_prefix 0/1 // if input_net_param is 'none', we will directly load the network from // trained_net_param. If the last argv is 1, we will do a forward-backward pass From ff5e35ee776bae64ce2433f514fd3533fced02b1 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Tue, 10 Jun 2014 15:38:06 -0700 Subject: [PATCH 0171/2053] upgrade warnings to -Wall -Werror -Wno-sign-compare --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 943165a4642..e821b20d13b 100644 --- a/Makefile +++ b/Makefile @@ -134,7 +134,7 @@ LIBRARIES := cudart cublas curand \ hdf5_hl hdf5 \ opencv_core opencv_highgui opencv_imgproc PYTHON_LIBRARIES := boost_python python2.7 -WARNINGS := -Wall +WARNINGS := -Wall -Werror -Wno-sign-compare ############################## # Set build directories From 8490718f4c3f00329a3236ba9ed2795d585f8f3c Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Tue, 10 Jun 2014 15:39:44 -0700 Subject: [PATCH 0172/2053] add WARNINGS to CXXFLAGS --- Makefile | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index e821b20d13b..8ab82b91a3c 100644 --- a/Makefile +++ b/Makefile @@ -218,7 +218,7 @@ LIBRARY_DIRS += $(BLAS_LIB) # Complete build flags. COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir)) -CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) +CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) NVCCFLAGS := -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) \ $(foreach library,$(LIBRARIES),-l$(library)) @@ -283,7 +283,7 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) exit 1; \ fi $(MATLAB_DIR)/bin/mex $(MAT$(PROJECT)_SRC) $(STATIC_NAME) \ - CXXFLAGS="\$$CXXFLAGS $(CXXFLAGS) $(WARNINGS)" \ + CXXFLAGS="\$$CXXFLAGS $(CXXFLAGS)" \ CXXLIBS="\$$CXXLIBS $(LDFLAGS)" -o $@ @ echo @@ -306,7 +306,7 @@ $(ALL_BUILD_DIRS): | $(BUILD_DIR_LINK) @ mkdir -p $@ $(NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) - $(CXX) -shared -o $@ $(OBJS) $(CXXFLAGS) $(LDFLAGS) $(WARNINGS) + $(CXX) -shared -o $@ $(OBJS) $(CXXFLAGS) $(LDFLAGS) @ echo $(STATIC_NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) @@ -321,21 +321,21 @@ $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HDRS) \ $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ - -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS) + -o $@ $(CXXFLAGS) $(LDFLAGS) @ echo $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_NAME) \ - -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS) + -o $@ $(CXXFLAGS) $(LDFLAGS) @ echo $(TOOL_BINS): %.bin : %.o $(STATIC_NAME) - $(CXX) $< $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS) + $(CXX) $< $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) @ echo $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) - $(CXX) $< $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) $(WARNINGS) + $(CXX) $< $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) @ echo $(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \ From aa7371147e42e80a24da5cfc8d40bb207337a7f3 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Fri, 13 Jun 2014 19:59:33 -0700 Subject: [PATCH 0173/2053] turn off some warnings for older compilers --- Makefile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8ab82b91a3c..d62f4150c2e 100644 --- a/Makefile +++ b/Makefile @@ -168,6 +168,11 @@ endif ifeq ($(LINUX), 1) CXX := /usr/bin/g++ + GCCVERSION := $(shell $(CXX) -dumpversion | cut -f1,2 -d.) + # older versions of gcc are too dumb to build boost with -Wuninitalized + ifeq ($(shell echo $(GCCVERSION) \< 4.6 | bc), 1) + WARNINGS += -Wno-uninitialized + endif endif # OS X: @@ -175,6 +180,8 @@ endif # libstdc++ instead of libc++ for CUDA compatibility on 10.9 ifeq ($(OSX), 1) CXX := /usr/bin/clang++ + # clang throws this warning for cuda headers + WARNINGS += -Wno-unneeded-internal-declaration ifneq ($(findstring 10.9, $(shell sw_vers -productVersion)),) CXXFLAGS += -stdlib=libstdc++ endif @@ -220,6 +227,8 @@ LIBRARY_DIRS += $(BLAS_LIB) COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir)) CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) NVCCFLAGS := -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) +# mex may invoke an older gcc that is too liberal with -Wuninitalized +MATLAB_CXXFLAGS := $(CXXFLAGS) -Wno-uninitialized LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) \ $(foreach library,$(LIBRARIES),-l$(library)) PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) @@ -283,7 +292,7 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) exit 1; \ fi $(MATLAB_DIR)/bin/mex $(MAT$(PROJECT)_SRC) $(STATIC_NAME) \ - CXXFLAGS="\$$CXXFLAGS $(CXXFLAGS)" \ + CXXFLAGS="\$$CXXFLAGS $(MATLAB_CXXFLAGS)" \ CXXLIBS="\$$CXXLIBS $(LDFLAGS)" -o $@ @ echo From 73001f2fc0548a034bcd6398361207c9aac31ce4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 25 Jun 2014 17:32:27 -0700 Subject: [PATCH 0174/2053] fix test data layer post-lmdb --- src/caffe/test/test_data_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 782fe1212c6..8ba5f29ff91 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -24,10 +24,10 @@ template class DataLayerTest : public ::testing::Test { protected: DataLayerTest() - : filename_(new string(tmpnam(NULL))), + : backend_(DataParameter_DB_LEVELDB), + filename_(new string(tmpnam(NULL))), blob_top_data_(new Blob()), blob_top_label_(new Blob()), - backend_(DataParameter_DB_LEVELDB), seed_(1701) {} virtual void SetUp() { blob_top_vec_.push_back(blob_top_data_); From 30ad1e237907be354541b1fb79761d909d07728f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 25 Jun 2014 17:35:40 -0700 Subject: [PATCH 0175/2053] make clang++ happy on OSX by not linking with pthread --- Makefile | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index d62f4150c2e..32ce4722aa6 100644 --- a/Makefile +++ b/Makefile @@ -184,6 +184,7 @@ ifeq ($(OSX), 1) WARNINGS += -Wno-unneeded-internal-declaration ifneq ($(findstring 10.9, $(shell sw_vers -productVersion)),) CXXFLAGS += -stdlib=libstdc++ + LINKFLAGS += -stdlib=libstdc++ endif endif @@ -229,6 +230,7 @@ CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) NVCCFLAGS := -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) # mex may invoke an older gcc that is too liberal with -Wuninitalized MATLAB_CXXFLAGS := $(CXXFLAGS) -Wno-uninitialized +LINKFLAGS += -fPIC $(COMMON_FLAGS) $(WARNINGS) LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) \ $(foreach library,$(LIBRARIES),-l$(library)) PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) @@ -278,7 +280,7 @@ py: $(PY$(PROJECT)_SO) $(PROTO_GEN_PY) $(PY$(PROJECT)_SO): $(STATIC_NAME) $(PY$(PROJECT)_SRC) $(CXX) -shared -o $@ $(PY$(PROJECT)_SRC) \ - $(STATIC_NAME) $(CXXFLAGS) $(PYTHON_LDFLAGS) + $(STATIC_NAME) $(LINKFLAGS) $(PYTHON_LDFLAGS) @ echo mat$(PROJECT): mat @@ -315,7 +317,7 @@ $(ALL_BUILD_DIRS): | $(BUILD_DIR_LINK) @ mkdir -p $@ $(NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) - $(CXX) -shared -o $@ $(OBJS) $(CXXFLAGS) $(LDFLAGS) + $(CXX) -shared -o $@ $(OBJS) $(LINKFLAGS) $(LDFLAGS) @ echo $(STATIC_NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) @@ -330,21 +332,21 @@ $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HDRS) \ $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ - -o $@ $(CXXFLAGS) $(LDFLAGS) + -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_NAME) \ - -o $@ $(CXXFLAGS) $(LDFLAGS) + -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo $(TOOL_BINS): %.bin : %.o $(STATIC_NAME) - $(CXX) $< $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) + $(CXX) $< $(STATIC_NAME) -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) - $(CXX) $< $(STATIC_NAME) -o $@ $(CXXFLAGS) $(LDFLAGS) + $(CXX) $< $(STATIC_NAME) -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo $(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \ From 89fd7e333480d0eb4d78fb14dc6f435e76c5638c Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 25 Jun 2014 17:58:38 -0700 Subject: [PATCH 0176/2053] content ourselves to -Wall without -Werror for now --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 32ce4722aa6..77e2ff5edbe 100644 --- a/Makefile +++ b/Makefile @@ -134,7 +134,7 @@ LIBRARIES := cudart cublas curand \ hdf5_hl hdf5 \ opencv_core opencv_highgui opencv_imgproc PYTHON_LIBRARIES := boost_python python2.7 -WARNINGS := -Wall -Werror -Wno-sign-compare +WARNINGS := -Wall -Wno-sign-compare ############################## # Set build directories From 61e1ef03537461f708bcb110e9decb69ca4de544 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 26 Jun 2014 10:21:19 -0700 Subject: [PATCH 0177/2053] file SoftmaxWithLoss in with loss layers --- include/caffe/loss_layers.hpp | 43 +++++++++++++++++++++++++++++++++ include/caffe/vision_layers.hpp | 40 ------------------------------ 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 2f98a1246be..db7c63edca1 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -40,6 +40,49 @@ class LossLayer : public Layer { virtual inline int MaxTopBlobs() const { return 1; } }; +// Forward declare SoftmaxLayer for use in SoftmaxWithLossLayer. +template class SoftmaxLayer; + +/* SoftmaxWithLossLayer + Implements softmax and computes the loss. + + It is preferred over separate softmax + multinomiallogisticloss + layers due to more numerically stable gradients. + + In test, this layer could be replaced by simple softmax layer. +*/ +template +class SoftmaxWithLossLayer : public Layer { + public: + explicit SoftmaxWithLossLayer(const LayerParameter& param) + : Layer(param), softmax_layer_(new SoftmaxLayer(param)) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SOFTMAX_LOSS; + } + virtual inline int ExactNumBottomBlobs() const { return 2; } + virtual inline int MaxTopBlobs() const { return 2; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const bool propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const bool propagate_down, vector*>* bottom); + + shared_ptr > softmax_layer_; + // prob stores the output probability of the layer. + Blob prob_; + // Vector holders to call the underlying softmax layer forward and backward. + vector*> softmax_bottom_vec_; + vector*> softmax_top_vec_; +}; + /* SigmoidCrossEntropyLossLayer */ template diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index b7e1068c7d3..3fd7e2f8bdb 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -405,46 +405,6 @@ class SoftmaxLayer : public Layer { Blob scale_; }; -/* SoftmaxWithLossLayer - Implements softmax and computes the loss. - - It is preferred over separate softmax + multinomiallogisticloss - layers due to more numerically stable gradients. - - In test, this layer could be replaced by simple softmax layer. -*/ -template -class SoftmaxWithLossLayer : public Layer { - public: - explicit SoftmaxWithLossLayer(const LayerParameter& param) - : Layer(param), softmax_layer_(new SoftmaxLayer(param)) {} - virtual void SetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SOFTMAX_LOSS; - } - virtual inline int ExactNumBottomBlobs() const { return 2; } - virtual inline int MaxTopBlobs() const { return 2; } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); - - shared_ptr > softmax_layer_; - // prob stores the output probability of the layer. - Blob prob_; - // Vector holders to call the underlying softmax layer forward and backward. - vector*> softmax_bottom_vec_; - vector*> softmax_top_vec_; -}; - /* SplitLayer */ template From 74443591d62feb2755d98ed87fb4aecc22d78297 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 10 Jun 2014 12:38:59 -0700 Subject: [PATCH 0178/2053] change Backward interface: propagate_down is a vector -- use to fix long-standing issue with how this is handled in loss layers (esp. EuclideanLossLayer) --- include/caffe/data_layers.hpp | 28 ++-- include/caffe/layer.hpp | 8 +- include/caffe/loss_layers.hpp | 27 ++-- include/caffe/net.hpp | 4 + include/caffe/neuron_layers.hpp | 26 ++-- include/caffe/vision_layers.hpp | 48 +++--- src/caffe/layers/bnll_layer.cpp | 4 +- src/caffe/layers/bnll_layer.cu | 4 +- src/caffe/layers/concat_layer.cpp | 22 +-- src/caffe/layers/concat_layer.cu | 22 +-- src/caffe/layers/conv_layer.cpp | 4 +- src/caffe/layers/conv_layer.cu | 4 +- src/caffe/layers/dropout_layer.cpp | 4 +- src/caffe/layers/dropout_layer.cu | 4 +- src/caffe/layers/eltwise_layer.cpp | 12 +- src/caffe/layers/eltwise_layer.cu | 12 +- src/caffe/layers/euclidean_loss_layer.cpp | 24 +-- src/caffe/layers/euclidean_loss_layer.cu | 45 ++++++ src/caffe/layers/flatten_layer.cpp | 2 +- src/caffe/layers/flatten_layer.cu | 2 +- src/caffe/layers/hdf5_data_layer.cpp | 5 - src/caffe/layers/hdf5_data_layer.cu | 5 - src/caffe/layers/hdf5_output_layer.cpp | 2 +- src/caffe/layers/hdf5_output_layer.cu | 2 +- src/caffe/layers/hinge_loss_layer.cpp | 44 +++--- src/caffe/layers/im2col_layer.cpp | 2 +- src/caffe/layers/im2col_layer.cu | 2 +- src/caffe/layers/infogain_loss_layer.cpp | 32 ++-- src/caffe/layers/inner_product_layer.cpp | 4 +- src/caffe/layers/inner_product_layer.cu | 4 +- src/caffe/layers/lrn_layer.cpp | 20 +-- src/caffe/layers/lrn_layer.cu | 4 +- .../multinomial_logistic_loss_layer.cpp | 28 ++-- src/caffe/layers/pooling_layer.cpp | 4 +- src/caffe/layers/pooling_layer.cu | 4 +- src/caffe/layers/power_layer.cpp | 4 +- src/caffe/layers/power_layer.cu | 4 +- src/caffe/layers/relu_layer.cpp | 4 +- src/caffe/layers/relu_layer.cu | 4 +- .../sigmoid_cross_entropy_loss_layer.cpp | 28 ++-- .../sigmoid_cross_entropy_loss_layer.cu | 28 ++-- src/caffe/layers/sigmoid_layer.cpp | 4 +- src/caffe/layers/sigmoid_layer.cu | 4 +- src/caffe/layers/softmax_layer.cpp | 2 +- src/caffe/layers/softmax_layer.cu | 2 +- src/caffe/layers/softmax_loss_layer.cpp | 29 ++-- src/caffe/layers/softmax_loss_layer.cu | 2 +- src/caffe/layers/split_layer.cpp | 4 +- src/caffe/layers/split_layer.cu | 4 +- src/caffe/layers/tanh_layer.cpp | 4 +- src/caffe/layers/tanh_layer.cu | 4 +- src/caffe/net.cpp | 6 +- src/caffe/test/test_euclidean_loss_layer.cpp | 14 +- src/caffe/test/test_gradient_check_util.hpp | 6 +- src/caffe/test/test_lrn_layer.cpp | 10 +- .../test/test_maxpool_dropout_layers.cpp | 20 ++- src/caffe/test/test_net.cpp | 143 +++++++++++++++++- tools/net_speed_benchmark.cpp | 5 +- 58 files changed, 522 insertions(+), 281 deletions(-) create mode 100644 src/caffe/layers/euclidean_loss_layer.cu diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index fc93daacd3c..2c6be551d8f 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -47,9 +47,9 @@ class HDF5OutputLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void SaveBlobs(); std::string file_name_; @@ -80,9 +80,9 @@ class HDF5DataLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom) {} virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom) {} virtual void LoadHDF5FileData(const char* filename); std::vector hdf_filenames_; @@ -125,9 +125,9 @@ class DataLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } + const vector& propagate_down, vector*>* bottom) {} virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } + const vector& propagate_down, vector*>* bottom) {} virtual void CreatePrefetchThread(); virtual void JoinPrefetchThread(); @@ -175,9 +175,9 @@ class DummyDataLayer : public Layer { virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } + const vector& propagate_down, vector*>* bottom) {} virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } + const vector& propagate_down, vector*>* bottom) {} vector > > fillers_; vector refill_; @@ -211,9 +211,9 @@ class ImageDataLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } + const vector& propagate_down, vector*>* bottom) {} virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } + const vector& propagate_down, vector*>* bottom) {} virtual void ShuffleImages(); @@ -263,9 +263,9 @@ class MemoryDataLayer : public Layer { virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } + const vector& propagate_down, vector*>* bottom) {} virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } + const vector& propagate_down, vector*>* bottom) {} Dtype* data_; Dtype* labels_; @@ -306,9 +306,9 @@ class WindowDataLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } + const vector& propagate_down, vector*>* bottom) {} virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { return; } + const vector& propagate_down, vector*>* bottom) {} virtual void CreatePrefetchThread(); virtual void JoinPrefetchThread(); diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index af3d5441b34..12e7610d756 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -46,7 +46,7 @@ class Layer { inline Dtype Forward(const vector*>& bottom, vector*>* top); inline void Backward(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom); // Returns the vector of blobs. @@ -104,10 +104,10 @@ class Layer { // Backward functions: compute the gradients for any parameters and // for the bottom blobs if propagate_down is true. virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) = 0; virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { // LOG(WARNING) << "Using CPU code as backup."; Backward_cpu(top, propagate_down, bottom); @@ -172,7 +172,7 @@ inline Dtype Layer::Forward(const vector*>& bottom, template inline void Layer::Backward(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { switch (Caffe::mode()) { case Caffe::CPU: diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index db7c63edca1..b8adc996be5 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -62,7 +62,6 @@ class SoftmaxWithLossLayer : public Layer { virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SOFTMAX_LOSS; } - virtual inline int ExactNumBottomBlobs() const { return 2; } virtual inline int MaxTopBlobs() const { return 2; } protected: @@ -71,9 +70,9 @@ class SoftmaxWithLossLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); shared_ptr > softmax_layer_; // prob stores the output probability of the layer. @@ -105,9 +104,9 @@ class SigmoidCrossEntropyLossLayer : public LossLayer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); shared_ptr > sigmoid_layer_; // sigmoid_output stores the output of the sigmoid layer. @@ -138,8 +137,12 @@ class EuclideanLossLayer : public LossLayer { protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); Blob diff_; }; @@ -162,7 +165,7 @@ class InfogainLossLayer : public LossLayer { virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); Blob infogain_; }; @@ -183,7 +186,7 @@ class HingeLossLayer : public LossLayer { virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); }; /* MultinomialLogisticLossLayer @@ -204,7 +207,7 @@ class MultinomialLogisticLossLayer : public LossLayer { virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); }; /* AccuracyLayer @@ -230,15 +233,11 @@ class AccuracyLayer : public Layer { virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { NOT_IMPLEMENTED; } }; -/* Also see -- SoftmaxWithLossLayer in vision_layers.hpp -*/ - } // namespace caffe #endif // CAFFE_LOSS_LAYERS_HPP_ diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 5b5dd22a282..d05ca09f20a 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -81,6 +81,9 @@ class Net { // this unless you do per-layer checks such as gradients. inline vector*> >& bottom_vecs() { return bottom_vecs_; } inline vector*> >& top_vecs() { return top_vecs_; } + inline vector >& bottom_need_backward() { + return bottom_need_backward_; + } // returns the parameters inline vector > >& params() { return params_; } // returns the parameter learning rate multipliers @@ -131,6 +134,7 @@ class Net { // pointers. vector*> > bottom_vecs_; vector > bottom_id_vecs_; + vector > bottom_need_backward_; // top_vecs stores the vectors containing the output for each layer vector*> > top_vecs_; vector > top_id_vecs_; diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index ed664df7570..e52e395e24b 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -64,9 +64,9 @@ class BNLLLayer : public NeuronLayer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); }; /* DropoutLayer @@ -97,9 +97,9 @@ class DropoutLayer : public NeuronLayer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); shared_ptr > rand_vec_; Dtype threshold_; @@ -131,9 +131,9 @@ class PowerLayer : public NeuronLayer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); Dtype power_; Dtype scale_; @@ -167,9 +167,9 @@ class ReLULayer : public NeuronLayer { vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); }; /* SigmoidLayer @@ -199,9 +199,9 @@ class SigmoidLayer : public NeuronLayer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); }; /* TanHLayer @@ -227,9 +227,9 @@ class TanHLayer : public NeuronLayer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); }; /* ThresholdLayer @@ -260,7 +260,7 @@ class ThresholdLayer : public NeuronLayer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { NOT_IMPLEMENTED; } diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 3fd7e2f8bdb..b68dcbf6e83 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -44,7 +44,7 @@ class ArgMaxLayer : public Layer { virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { NOT_IMPLEMENTED; } bool out_max_val_; @@ -74,9 +74,9 @@ class ConcatLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); Blob col_bob_; int count_; @@ -109,9 +109,9 @@ class ConvolutionLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); int kernel_size_; int stride_; @@ -153,9 +153,9 @@ class EltwiseLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); EltwiseParameter_EltwiseOp op_; vector coeffs_; @@ -183,9 +183,9 @@ class FlattenLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); int count_; }; @@ -212,9 +212,9 @@ class Im2colLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); int kernel_size_; int stride_; @@ -246,9 +246,9 @@ class InnerProductLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); int M_; int K_; @@ -284,9 +284,9 @@ class LRNLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual Dtype CrossChannelForward_cpu(const vector*>& bottom, vector*>* top); @@ -295,11 +295,11 @@ class LRNLayer : public Layer { virtual Dtype WithinChannelForward(const vector*>& bottom, vector*>* top); virtual void CrossChannelBackward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void CrossChannelBackward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void WithinChannelBackward(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); int size_; int pre_pad_; @@ -356,9 +356,9 @@ class PoolingLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); int max_top_blobs_; int kernel_size_; @@ -395,9 +395,9 @@ class SoftmaxLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); // sum_multiplier is just used to carry out sum using blas Blob sum_multiplier_; @@ -427,9 +427,9 @@ class SplitLayer : public Layer { virtual Dtype Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom); + const vector& propagate_down, vector*>* bottom); int count_; }; diff --git a/src/caffe/layers/bnll_layer.cpp b/src/caffe/layers/bnll_layer.cpp index d08adc49eef..95e6bd8748c 100644 --- a/src/caffe/layers/bnll_layer.cpp +++ b/src/caffe/layers/bnll_layer.cpp @@ -28,9 +28,9 @@ Dtype BNLLLayer::Forward_cpu(const vector*>& bottom, template void BNLLLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { + if (propagate_down[0]) { const Dtype* bottom_data = (*bottom)[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); diff --git a/src/caffe/layers/bnll_layer.cu b/src/caffe/layers/bnll_layer.cu index 75bea00e993..7849d11c25d 100644 --- a/src/caffe/layers/bnll_layer.cu +++ b/src/caffe/layers/bnll_layer.cu @@ -45,9 +45,9 @@ __global__ void BNLLBackward(const int n, const Dtype* in_diff, template void BNLLLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { + if (propagate_down[0]) { const Dtype* bottom_data = (*bottom)[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index 4541ee74215..4c894ddffc4 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -70,26 +70,30 @@ Dtype ConcatLayer::Forward_cpu(const vector*>& bottom, template void ConcatLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->cpu_diff(); if (concat_dim_ == 0) { int offset_num = 0; for (int i = 0; i < bottom->size(); ++i) { Blob* blob = (*bottom)[i]; - Dtype* bottom_diff = blob->mutable_cpu_diff(); - caffe_copy(blob->count(), - top_diff+top[0]->offset(offset_num), bottom_diff); + if (propagate_down[i]) { + Dtype* bottom_diff = blob->mutable_cpu_diff(); + caffe_copy(blob->count(), top_diff + top[0]->offset(offset_num), + bottom_diff); + } offset_num += blob->num(); } } else if (concat_dim_ == 1) { int offset_channel = 0; for (int i = 0; i < bottom->size(); ++i) { Blob* blob = (*bottom)[i]; - Dtype* bottom_diff = blob->mutable_cpu_diff(); - int num_elem = blob->channels()*blob->height()*blob->width(); - for (int n = 0; n < num_; ++n) { - caffe_copy(num_elem, top_diff+top[0]->offset(n, offset_channel), - bottom_diff+blob->offset(n)); + if (propagate_down[i]) { + Dtype* bottom_diff = blob->mutable_cpu_diff(); + int num_elem = blob->channels()*blob->height()*blob->width(); + for (int n = 0; n < num_; ++n) { + caffe_copy(num_elem, top_diff + top[0]->offset(n, offset_channel), + bottom_diff + blob->offset(n)); + } } offset_channel += blob->channels(); } diff --git a/src/caffe/layers/concat_layer.cu b/src/caffe/layers/concat_layer.cu index 2820bf0dfdf..ca0cf0c1b5b 100644 --- a/src/caffe/layers/concat_layer.cu +++ b/src/caffe/layers/concat_layer.cu @@ -41,26 +41,30 @@ Dtype ConcatLayer::Forward_gpu(const vector*>& bottom, template void ConcatLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->gpu_diff(); if (concat_dim_ == 0) { int offset_num = 0; for (int i = 0; i < bottom->size(); ++i) { Blob* blob = (*bottom)[i]; - Dtype* bottom_diff = blob->mutable_gpu_diff(); - caffe_gpu_copy(blob->count(), - top_diff + top[0]->offset(offset_num), bottom_diff); + if (propagate_down[i]) { + Dtype* bottom_diff = blob->mutable_gpu_diff(); + caffe_gpu_copy(blob->count(), top_diff + top[0]->offset(offset_num), + bottom_diff); + } offset_num += blob->num(); } } else if (concat_dim_ == 1) { int offset_channel = 0; for (int i = 0; i < bottom->size(); ++i) { Blob* blob = (*bottom)[i]; - Dtype* bottom_diff = blob->mutable_gpu_diff(); - int num_elem = blob->channels()*blob->height()*blob->width(); - for (int n = 0; n < num_; ++n) { - caffe_gpu_copy(num_elem, top_diff + top[0]->offset(n, offset_channel), - bottom_diff + blob->offset(n)); + if (propagate_down[i]) { + Dtype* bottom_diff = blob->mutable_gpu_diff(); + int num_elem = blob->channels()*blob->height()*blob->width(); + for (int n = 0; n < num_; ++n) { + caffe_gpu_copy(num_elem, top_diff + top[0]->offset(n, offset_channel), + bottom_diff + blob->offset(n)); + } } offset_channel += blob->channels(); } diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 880b83afccb..9ec8da47e1a 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -109,7 +109,7 @@ Dtype ConvolutionLayer::Forward_cpu(const vector*>& bottom, template void ConvolutionLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->cpu_diff(); const Dtype* weight = this->blobs_[0]->cpu_data(); Dtype* weight_diff = this->blobs_[0]->mutable_cpu_diff(); @@ -148,7 +148,7 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, weight_diff + weight_offset * g); } // gradient w.r.t. bottom data, if necessary - if (propagate_down) { + if (propagate_down[0]) { for (int g = 0; g < group_; ++g) { caffe_cpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, (Dtype)1., weight + weight_offset * g, diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 51f5d159879..85f95fd32c9 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -43,7 +43,7 @@ Dtype ConvolutionLayer::Forward_gpu(const vector*>& bottom, template void ConvolutionLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* weight = this->blobs_[0]->gpu_data(); Dtype* weight_diff = this->blobs_[0]->mutable_gpu_diff(); @@ -84,7 +84,7 @@ void ConvolutionLayer::Backward_gpu(const vector*>& top, weight_diff + weight_offset * g); } // gradient w.r.t. bottom data, if necessary - if (propagate_down) { + if (propagate_down[0]) { for (int g = 0; g < group_; ++g) { caffe_gpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, (Dtype)1., weight + weight_offset * g, diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index f1e54112986..e9a1a524d63 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -47,10 +47,10 @@ Dtype DropoutLayer::Forward_cpu(const vector*>& bottom, template void DropoutLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { CHECK(Caffe::phase() == Caffe::TRAIN); - if (propagate_down) { + if (propagate_down[0]) { const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); const unsigned int* mask = rand_vec_->cpu_data(); diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 3c25d6a1292..2c7226402e8 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -56,10 +56,10 @@ __global__ void DropoutBackward(const int n, const Dtype* in_diff, template void DropoutLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { CHECK(Caffe::phase() == Caffe::TRAIN); - if (propagate_down) { + if (propagate_down[0]) { const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); const unsigned int* mask = diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 5e5d760c993..2c265f6678f 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -67,12 +67,12 @@ Dtype EltwiseLayer::Forward_cpu( template void EltwiseLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - if (propagate_down) { - const int count = top[0]->count(); - const Dtype* top_data = top[0]->cpu_data(); - const Dtype* top_diff = top[0]->cpu_diff(); - for (int i = 0; i < bottom->size(); ++i) { + const vector& propagate_down, vector*>* bottom) { + const int count = top[0]->count(); + const Dtype* top_data = top[0]->cpu_data(); + const Dtype* top_diff = top[0]->cpu_diff(); + for (int i = 0; i < bottom->size(); ++i) { + if (propagate_down[i]) { const Dtype* bottom_data = (*bottom)[i]->cpu_data(); Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); switch (op_) { diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index 75827badb80..3860944889c 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -36,12 +36,12 @@ Dtype EltwiseLayer::Forward_gpu( template void EltwiseLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - if (propagate_down) { - const int count = top[0]->count(); - const Dtype* top_data = top[0]->gpu_data(); - const Dtype* top_diff = top[0]->gpu_diff(); - for (int i = 0; i < bottom->size(); ++i) { + const vector& propagate_down, vector*>* bottom) { + const int count = top[0]->count(); + const Dtype* top_data = top[0]->gpu_data(); + const Dtype* top_diff = top[0]->gpu_diff(); + for (int i = 0; i < bottom->size(); ++i) { + if (propagate_down[i]) { const Dtype* bottom_data = (*bottom)[i]->gpu_data(); Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); switch (op_) { diff --git a/src/caffe/layers/euclidean_loss_layer.cpp b/src/caffe/layers/euclidean_loss_layer.cpp index 766294997f0..2478a514cac 100644 --- a/src/caffe/layers/euclidean_loss_layer.cpp +++ b/src/caffe/layers/euclidean_loss_layer.cpp @@ -1,8 +1,5 @@ // Copyright 2014 BVLC and contributors. -#include -#include -#include #include #include "caffe/layer.hpp" @@ -10,8 +7,6 @@ #include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" -using std::max; - namespace caffe { template @@ -43,13 +38,18 @@ Dtype EuclideanLossLayer::Forward_cpu(const vector*>& bottom, template void EuclideanLossLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - caffe_cpu_axpby( - (*bottom)[0]->count(), // count - Dtype(1) / (*bottom)[0]->num(), // alpha - diff_.cpu_data(), // a - Dtype(0), // beta - (*bottom)[0]->mutable_cpu_diff()); // b + const vector& propagate_down, vector*>* bottom) { + for (int i = 0; i < 2; ++i) { + if (propagate_down[i]) { + const Dtype sign = (i == 0) ? 1 : -1; + caffe_cpu_axpby( + (*bottom)[i]->count(), // count + sign / (*bottom)[i]->num(), // alpha + diff_.cpu_data(), // a + Dtype(0), // beta + (*bottom)[i]->mutable_cpu_diff()); // b + } + } } INSTANTIATE_CLASS(EuclideanLossLayer); diff --git a/src/caffe/layers/euclidean_loss_layer.cu b/src/caffe/layers/euclidean_loss_layer.cu new file mode 100644 index 00000000000..b070ea96ff8 --- /dev/null +++ b/src/caffe/layers/euclidean_loss_layer.cu @@ -0,0 +1,45 @@ +// Copyright 2014 BVLC and contributors. + +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/util/io.hpp" + +namespace caffe { + +template +Dtype EuclideanLossLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + int count = bottom[0]->count(); + caffe_gpu_sub( + count, + bottom[0]->gpu_data(), + bottom[1]->gpu_data(), + diff_.mutable_gpu_data()); + Dtype dot; + caffe_gpu_dot(count, diff_.gpu_data(), diff_.gpu_data(), &dot); + Dtype loss = dot / bottom[0]->num() / Dtype(2); + return loss; +} + +template +void EuclideanLossLayer::Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) { + for (int i = 0; i < 2; ++i) { + if (propagate_down[i]) { + const Dtype sign = (i == 0) ? 1 : -1; + caffe_gpu_axpby( + (*bottom)[i]->count(), // count + sign / (*bottom)[i]->num(), // alpha + diff_.gpu_data(), // a + Dtype(0), // beta + (*bottom)[i]->mutable_gpu_diff()); // b + } + } +} + +INSTANTIATE_CLASS(EuclideanLossLayer); + +} // namespace caffe diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index 95f4859f8d9..9494da9a255 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -29,7 +29,7 @@ Dtype FlattenLayer::Forward_cpu(const vector*>& bottom, template void FlattenLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { (*bottom)[0]->ShareDiff(*top[0]); } diff --git a/src/caffe/layers/flatten_layer.cu b/src/caffe/layers/flatten_layer.cu index 157eeb1dcdc..68add383c48 100644 --- a/src/caffe/layers/flatten_layer.cu +++ b/src/caffe/layers/flatten_layer.cu @@ -17,7 +17,7 @@ Dtype FlattenLayer::Forward_gpu(const vector*>& bottom, template void FlattenLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { (*bottom)[0]->ShareDiff(*top[0]); } diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 50863b8d93a..2ba7fa77f45 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -114,11 +114,6 @@ Dtype HDF5DataLayer::Forward_cpu(const vector*>& bottom, return Dtype(0.); } -// The backward operations are dummy - they do not carry any computation. -template -void HDF5DataLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { } - INSTANTIATE_CLASS(HDF5DataLayer); } // namespace caffe diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu index 9c5bb5a818f..b2b09ef7dd1 100644 --- a/src/caffe/layers/hdf5_data_layer.cu +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -54,11 +54,6 @@ Dtype HDF5DataLayer::Forward_gpu(const vector*>& bottom, return Dtype(0.); } -template -void HDF5DataLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { -} - INSTANTIATE_CLASS(HDF5DataLayer); } // namespace caffe diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index 0961b9b73a3..3a513b9c366 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -67,7 +67,7 @@ Dtype HDF5OutputLayer::Forward_cpu(const vector*>& bottom, template void HDF5OutputLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { return; } diff --git a/src/caffe/layers/hdf5_output_layer.cu b/src/caffe/layers/hdf5_output_layer.cu index b9948252285..59505ee6acf 100644 --- a/src/caffe/layers/hdf5_output_layer.cu +++ b/src/caffe/layers/hdf5_output_layer.cu @@ -40,7 +40,7 @@ Dtype HDF5OutputLayer::Forward_gpu(const vector*>& bottom, template void HDF5OutputLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { return; } diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index fd00d8c6930..8097761d22b 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -45,27 +45,33 @@ Dtype HingeLossLayer::Forward_cpu(const vector*>& bottom, template void HingeLossLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const Dtype* label = (*bottom)[1]->cpu_data(); - int num = (*bottom)[0]->num(); - int count = (*bottom)[0]->count(); - int dim = count / num; - - for (int i = 0; i < num; ++i) { - bottom_diff[i * dim + static_cast(label[i])] *= -1; + const vector& propagate_down, vector*>* bottom) { + if (propagate_down[1]) { + LOG(FATAL) << this->type_name() + << " Layer cannot backpropagate to label inputs."; } + if (propagate_down[0]) { + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const Dtype* label = (*bottom)[1]->cpu_data(); + int num = (*bottom)[0]->num(); + int count = (*bottom)[0]->count(); + int dim = count / num; - switch (this->layer_param_.hinge_loss_param().norm()) { - case HingeLossParameter_Norm_L1: - caffe_cpu_sign(count, bottom_diff, bottom_diff); - caffe_scal(count, Dtype(1. / num), bottom_diff); - break; - case HingeLossParameter_Norm_L2: - caffe_scal(count, Dtype(2. / num), bottom_diff); - break; - default: - LOG(FATAL) << "Unknown Norm"; + for (int i = 0; i < num; ++i) { + bottom_diff[i * dim + static_cast(label[i])] *= -1; + } + + switch (this->layer_param_.hinge_loss_param().norm()) { + case HingeLossParameter_Norm_L1: + caffe_cpu_sign(count, bottom_diff, bottom_diff); + caffe_scal(count, Dtype(1. / num), bottom_diff); + break; + case HingeLossParameter_Norm_L2: + caffe_scal(count, Dtype(2. / num), bottom_diff); + break; + default: + LOG(FATAL) << "Unknown Norm"; + } } } diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index f0c26c9a1cb..e047dfb80a7 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -38,7 +38,7 @@ Dtype Im2colLayer::Forward_cpu(const vector*>& bottom, template void Im2colLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); for (int n = 0; n < top[0]->num(); ++n) { diff --git a/src/caffe/layers/im2col_layer.cu b/src/caffe/layers/im2col_layer.cu index 26bc1b97959..9cfb74e815c 100644 --- a/src/caffe/layers/im2col_layer.cu +++ b/src/caffe/layers/im2col_layer.cu @@ -23,7 +23,7 @@ Dtype Im2colLayer::Forward_gpu(const vector*>& bottom, template void Im2colLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); for (int n = 0; n < top[0]->num(); ++n) { diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index 3e7fc4f812b..a72874e4bb4 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -56,20 +56,26 @@ Dtype InfogainLossLayer::Forward_cpu(const vector*>& bottom, template void InfogainLossLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - const Dtype* bottom_label = (*bottom)[1]->cpu_data(); - const Dtype* infogain_mat = infogain_.cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - int num = (*bottom)[0]->num(); - int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); - CHECK_EQ(infogain_.height(), dim); - for (int i = 0; i < num; ++i) { - int label = static_cast(bottom_label[i]); - for (int j = 0; j < dim; ++j) { - Dtype prob = max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); - bottom_diff[i * dim + j] = - infogain_mat[label * dim + j] / prob / num; + if (propagate_down[1]) { + LOG(FATAL) << this->type_name() + << " Layer cannot backpropagate to label inputs."; + } + if (propagate_down[0]) { + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* bottom_label = (*bottom)[1]->cpu_data(); + const Dtype* infogain_mat = infogain_.cpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + int num = (*bottom)[0]->num(); + int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); + CHECK_EQ(infogain_.height(), dim); + for (int i = 0; i < num; ++i) { + int label = static_cast(bottom_label[i]); + for (int j = 0; j < dim; ++j) { + Dtype prob = max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); + bottom_diff[i * dim + j] = - infogain_mat[label * dim + j] / prob / num; + } } } } diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index 971254c9c45..ddf55e49b63 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -74,7 +74,7 @@ Dtype InnerProductLayer::Forward_cpu(const vector*>& bottom, template void InnerProductLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->cpu_diff(); const Dtype* bottom_data = (*bottom)[0]->cpu_data(); @@ -87,7 +87,7 @@ void InnerProductLayer::Backward_cpu(const vector*>& top, reinterpret_cast(bias_multiplier_->cpu_data()), (Dtype)0., this->blobs_[1]->mutable_cpu_diff()); } - if (propagate_down) { + if (propagate_down[0]) { // Gradient with respect to bottom data caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, M_, K_, N_, (Dtype)1., top_diff, this->blobs_[0]->cpu_data(), (Dtype)0., diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu index f139c23c310..5b95a57b23b 100644 --- a/src/caffe/layers/inner_product_layer.cu +++ b/src/caffe/layers/inner_product_layer.cu @@ -31,7 +31,7 @@ Dtype InnerProductLayer::Forward_gpu(const vector*>& bottom, template void InnerProductLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* bottom_data = (*bottom)[0]->gpu_data(); @@ -44,7 +44,7 @@ void InnerProductLayer::Backward_gpu(const vector*>& top, reinterpret_cast(bias_multiplier_->gpu_data()), (Dtype)0., this->blobs_[1]->mutable_gpu_diff()); } - if (propagate_down) { + if (propagate_down[0]) { // Gradient with respect to bottom data caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, K_, N_, (Dtype)1., top_diff, this->blobs_[0]->gpu_data(), (Dtype)0., diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index 071e7198544..a86c1d4c59d 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -173,7 +173,7 @@ Dtype LRNLayer::WithinChannelForward( template void LRNLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { switch (this->layer_param_.lrn_param().norm_region()) { case LRNParameter_NormRegion_ACROSS_CHANNELS: CrossChannelBackward_cpu(top, propagate_down, bottom); @@ -188,7 +188,7 @@ void LRNLayer::Backward_cpu(const vector*>& top, template void LRNLayer::CrossChannelBackward_cpu( - const vector*>& top, const bool propagate_down, + const vector*>& top, const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->cpu_diff(); const Dtype* top_data = top[0]->cpu_data(); @@ -243,14 +243,16 @@ void LRNLayer::CrossChannelBackward_cpu( template void LRNLayer::WithinChannelBackward( - const vector*>& top, const bool propagate_down, + const vector*>& top, const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { - product_layer_->Backward(top, true, &product_bottom_vec_); - power_layer_->Backward(power_top_vec_, true, &pool_top_vec_); - pool_layer_->Backward(pool_top_vec_, true, &square_top_vec_); - square_layer_->Backward(square_top_vec_, true, &square_bottom_vec_); - split_layer_->Backward(split_top_vec_, true, bottom); + if (propagate_down[0]) { + vector product_propagate_down(2, true); + product_layer_->Backward(top, product_propagate_down, &product_bottom_vec_); + power_layer_->Backward(power_top_vec_, propagate_down, &pool_top_vec_); + pool_layer_->Backward(pool_top_vec_, propagate_down, &square_top_vec_); + square_layer_->Backward(square_top_vec_, propagate_down, + &square_bottom_vec_); + split_layer_->Backward(split_top_vec_, propagate_down, bottom); } } diff --git a/src/caffe/layers/lrn_layer.cu b/src/caffe/layers/lrn_layer.cu index b2097eb99cf..237a42b2860 100644 --- a/src/caffe/layers/lrn_layer.cu +++ b/src/caffe/layers/lrn_layer.cu @@ -104,7 +104,7 @@ Dtype LRNLayer::CrossChannelForward_gpu( template void LRNLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { switch (this->layer_param_.lrn_param().norm_region()) { case LRNParameter_NormRegion_ACROSS_CHANNELS: CrossChannelBackward_gpu(top, propagate_down, bottom); @@ -180,7 +180,7 @@ __global__ void LRNComputeDiff(const int nthreads, const Dtype* bottom_data, template void LRNLayer::CrossChannelBackward_gpu( - const vector*>& top, const bool propagate_down, + const vector*>& top, const vector& propagate_down, vector*>* bottom) { int n_threads = num_ * height_ * width_; // NOLINT_NEXT_LINE(whitespace/operators) diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index 5a408795d6d..013d4034240 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -43,18 +43,24 @@ Dtype MultinomialLogisticLossLayer::Forward_cpu( template void MultinomialLogisticLossLayer::Backward_cpu( - const vector*>& top, const bool propagate_down, + const vector*>& top, const vector& propagate_down, vector*>* bottom) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - const Dtype* bottom_label = (*bottom)[1]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - int num = (*bottom)[0]->num(); - int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); - memset(bottom_diff, 0, sizeof(Dtype) * (*bottom)[0]->count()); - for (int i = 0; i < num; ++i) { - int label = static_cast(bottom_label[i]); - Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); - bottom_diff[i * dim + label] = -1. / prob / num; + if (propagate_down[1]) { + LOG(FATAL) << this->type_name() + << " Layer cannot backpropagate to label inputs."; + } + if (propagate_down[0]) { + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* bottom_label = (*bottom)[1]->cpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + int num = (*bottom)[0]->num(); + int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); + memset(bottom_diff, 0, sizeof(Dtype) * (*bottom)[0]->count()); + for (int i = 0; i < num; ++i) { + int label = static_cast(bottom_label[i]); + Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); + bottom_diff[i * dim + label] = -1. / prob / num; + } } } diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index ba84edeab5d..bc002078814 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -184,8 +184,8 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, template void PoolingLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - if (!propagate_down) { + const vector& propagate_down, vector*>* bottom) { + if (!propagate_down[0]) { return; } const Dtype* top_diff = top[0]->cpu_diff(); diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index abba6252cc6..f07fe3c48ac 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -322,8 +322,8 @@ __global__ void StoPoolBackward(const int nthreads, template void PoolingLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - if (!propagate_down) { + const vector& propagate_down, vector*>* bottom) { + if (!propagate_down[0]) { return; } const Dtype* top_diff = top[0]->gpu_diff(); diff --git a/src/caffe/layers/power_layer.cpp b/src/caffe/layers/power_layer.cpp index 85c84423aa2..5ff3392968e 100644 --- a/src/caffe/layers/power_layer.cpp +++ b/src/caffe/layers/power_layer.cpp @@ -49,9 +49,9 @@ Dtype PowerLayer::Forward_cpu(const vector*>& bottom, template void PowerLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { + if (propagate_down[0]) { Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); const int count = (*bottom)[0]->count(); const Dtype* top_diff = top[0]->cpu_diff(); diff --git a/src/caffe/layers/power_layer.cu b/src/caffe/layers/power_layer.cu index 9a25de72d36..6d699636e21 100644 --- a/src/caffe/layers/power_layer.cu +++ b/src/caffe/layers/power_layer.cu @@ -38,9 +38,9 @@ Dtype PowerLayer::Forward_gpu(const vector*>& bottom, template void PowerLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { + if (propagate_down[0]) { Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); const int count = (*bottom)[0]->count(); const Dtype* top_diff = top[0]->gpu_diff(); diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index 7a33e556268..d7a8509b247 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -24,9 +24,9 @@ Dtype ReLULayer::Forward_cpu(const vector*>& bottom, template void ReLULayer::Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { + if (propagate_down[0]) { const Dtype* bottom_data = (*bottom)[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index 51e5ef26c81..a5b24afab60 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -45,9 +45,9 @@ __global__ void ReLUBackward(const int n, const Dtype* in_diff, template void ReLULayer::Backward_gpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { + if (propagate_down[0]) { const Dtype* bottom_data = (*bottom)[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index 955581d8875..8cb830ff248 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -16,7 +16,7 @@ template void SigmoidCrossEntropyLossLayer::FurtherSetUp( const vector*>& bottom, vector*>* top) { CHECK_EQ(bottom[0]->count(), bottom[1]->count()) << - "SigmoidCrossEntropyLoss Layer inputs must have same count."; + "SIGMOID_CROSS_ENTROPY_LOSS layer inputs must have the same count."; sigmoid_bottom_vec_.clear(); sigmoid_bottom_vec_.push_back(bottom[0]); sigmoid_top_vec_.clear(); @@ -49,17 +49,23 @@ Dtype SigmoidCrossEntropyLossLayer::Forward_cpu( template void SigmoidCrossEntropyLossLayer::Backward_cpu( - const vector*>& top, const bool propagate_down, + const vector*>& top, const vector& propagate_down, vector*>* bottom) { - // First, compute the diff - const int count = (*bottom)[0]->count(); - const int num = (*bottom)[0]->num(); - const Dtype* sigmoid_output_data = sigmoid_output_->cpu_data(); - const Dtype* target = (*bottom)[1]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - caffe_sub(count, sigmoid_output_data, target, bottom_diff); - // Scale down gradient - caffe_scal(count, Dtype(1) / num, bottom_diff); + if (propagate_down[1]) { + LOG(FATAL) << this->type_name() + << " Layer cannot backpropagate to label inputs."; + } + if (propagate_down[0]) { + // First, compute the diff + const int count = (*bottom)[0]->count(); + const int num = (*bottom)[0]->num(); + const Dtype* sigmoid_output_data = sigmoid_output_->cpu_data(); + const Dtype* target = (*bottom)[1]->cpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + caffe_sub(count, sigmoid_output_data, target, bottom_diff); + // Scale down gradient + caffe_scal(count, Dtype(1) / num, bottom_diff); + } } INSTANTIATE_CLASS(SigmoidCrossEntropyLossLayer); diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu index 0caed2b83bd..8f7275827e2 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu @@ -37,18 +37,24 @@ Dtype SigmoidCrossEntropyLossLayer::Forward_gpu( template void SigmoidCrossEntropyLossLayer::Backward_gpu( - const vector*>& top, const bool propagate_down, + const vector*>& top, const vector& propagate_down, vector*>* bottom) { - // First, compute the diff - const int count = (*bottom)[0]->count(); - const int num = (*bottom)[0]->num(); - const Dtype* sigmoid_output_data = sigmoid_output_->gpu_data(); - const Dtype* target = (*bottom)[1]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - caffe_gpu_copy(count, sigmoid_output_data, bottom_diff); - caffe_gpu_axpy(count, Dtype(-1), target, bottom_diff); - // Scale down gradient - caffe_gpu_scal(count, Dtype(1) / num, bottom_diff); + if (propagate_down[1]) { + LOG(FATAL) << this->type_name() + << " Layer cannot backpropagate to label inputs."; + } + if (propagate_down[0]) { + // First, compute the diff + const int count = (*bottom)[0]->count(); + const int num = (*bottom)[0]->num(); + const Dtype* sigmoid_output_data = sigmoid_output_->gpu_data(); + const Dtype* target = (*bottom)[1]->gpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + caffe_gpu_copy(count, sigmoid_output_data, bottom_diff); + caffe_gpu_axpy(count, Dtype(-1), target, bottom_diff); + // Scale down gradient + caffe_gpu_scal(count, Dtype(1) / num, bottom_diff); + } } INSTANTIATE_CLASS(SigmoidCrossEntropyLossLayer); diff --git a/src/caffe/layers/sigmoid_layer.cpp b/src/caffe/layers/sigmoid_layer.cpp index 88a7920fc18..50139d863dd 100644 --- a/src/caffe/layers/sigmoid_layer.cpp +++ b/src/caffe/layers/sigmoid_layer.cpp @@ -28,9 +28,9 @@ Dtype SigmoidLayer::Forward_cpu(const vector*>& bottom, template void SigmoidLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { + if (propagate_down[0]) { const Dtype* top_data = top[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); diff --git a/src/caffe/layers/sigmoid_layer.cu b/src/caffe/layers/sigmoid_layer.cu index aa8568abb3f..d55968e58c2 100644 --- a/src/caffe/layers/sigmoid_layer.cu +++ b/src/caffe/layers/sigmoid_layer.cu @@ -47,9 +47,9 @@ __global__ void SigmoidBackward(const int n, const Dtype* in_diff, template void SigmoidLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { + if (propagate_down[0]) { const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index dbe16da2343..57847d005f6 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -60,7 +60,7 @@ Dtype SoftmaxLayer::Forward_cpu(const vector*>& bottom, template void SoftmaxLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->cpu_diff(); const Dtype* top_data = top[0]->cpu_data(); diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index a264a819b78..f53883c9206 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -79,7 +79,7 @@ Dtype SoftmaxLayer::Forward_gpu(const vector*>& bottom, // TODO(Yangqing): implement the GPU version of softmax. template void SoftmaxLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* top_data = top[0]->gpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index bdb3272ee25..1a3601aa9e6 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -57,20 +57,25 @@ Dtype SoftmaxWithLossLayer::Forward_cpu( template void SoftmaxWithLossLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - // Compute the diff - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const Dtype* prob_data = prob_.cpu_data(); - memcpy(bottom_diff, prob_data, sizeof(Dtype) * prob_.count()); - const Dtype* label = (*bottom)[1]->cpu_data(); - int num = prob_.num(); - int dim = prob_.count() / num; - for (int i = 0; i < num; ++i) { - bottom_diff[i * dim + static_cast(label[i])] -= 1; + if (propagate_down[1]) { + LOG(FATAL) << this->type_name() + << " Layer cannot backpropagate to label inputs."; + } + if (propagate_down[0]) { + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const Dtype* prob_data = prob_.cpu_data(); + memcpy(bottom_diff, prob_data, sizeof(Dtype) * prob_.count()); + const Dtype* label = (*bottom)[1]->cpu_data(); + int num = prob_.num(); + int dim = prob_.count() / num; + for (int i = 0; i < num; ++i) { + bottom_diff[i * dim + static_cast(label[i])] -= 1; + } + // Scale down gradient + caffe_scal(prob_.count(), Dtype(1) / num, bottom_diff); } - // Scale down gradient - caffe_scal(prob_.count(), Dtype(1) / num, bottom_diff); } diff --git a/src/caffe/layers/softmax_loss_layer.cu b/src/caffe/layers/softmax_loss_layer.cu index 24a3c384c96..e46be6ba85d 100644 --- a/src/caffe/layers/softmax_loss_layer.cu +++ b/src/caffe/layers/softmax_loss_layer.cu @@ -21,7 +21,7 @@ Dtype SoftmaxWithLossLayer::Forward_gpu( template void SoftmaxWithLossLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { + const vector& propagate_down, vector*>* bottom) { // TODO(Yangqing): implement the GPU version of softmax. Backward_cpu(top, propagate_down, bottom); } diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index 2f99ca1842c..28abd95f5ff 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -37,8 +37,8 @@ Dtype SplitLayer::Forward_cpu(const vector*>& bottom, template void SplitLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - if (propagate_down) { + const vector& propagate_down, vector*>* bottom) { + if (propagate_down[0]) { (*bottom)[0]->ShareDiff(*top[0]); // Add remaining top blob diffs. Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); diff --git a/src/caffe/layers/split_layer.cu b/src/caffe/layers/split_layer.cu index e2269b8beab..4c921d39f17 100644 --- a/src/caffe/layers/split_layer.cu +++ b/src/caffe/layers/split_layer.cu @@ -19,8 +19,8 @@ Dtype SplitLayer::Forward_gpu(const vector*>& bottom, template void SplitLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, vector*>* bottom) { - if (propagate_down) { + const vector& propagate_down, vector*>* bottom) { + if (propagate_down[0]) { (*bottom)[0]->ShareDiff(*top[0]); // Add remaining top blob diffs. Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp index 77b4410411c..6b5166d53e9 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -26,9 +26,9 @@ Dtype TanHLayer::Forward_cpu(const vector*>& bottom, template void TanHLayer::Backward_cpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { + if (propagate_down[0]) { const Dtype* top_data = top[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); diff --git a/src/caffe/layers/tanh_layer.cu b/src/caffe/layers/tanh_layer.cu index aa822d84f38..9307cab2ec5 100644 --- a/src/caffe/layers/tanh_layer.cu +++ b/src/caffe/layers/tanh_layer.cu @@ -42,9 +42,9 @@ __global__ void TanHBackward(const int n, const Dtype* in_diff, template void TanHLayer::Backward_gpu(const vector*>& top, - const bool propagate_down, + const vector& propagate_down, vector*>* bottom) { - if (propagate_down) { + if (propagate_down[0]) { const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index d76d284df2e..8687d0070ce 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -56,6 +56,7 @@ void Net::Init(const NetParameter& in_param) { top_vecs_.resize(param.layers_size()); bottom_id_vecs_.resize(param.layers_size()); top_id_vecs_.resize(param.layers_size()); + bottom_need_backward_.resize(param.layers_size()); for (int layer_id = 0; layer_id < param.layers_size(); ++layer_id) { const LayerParameter& layer_param = param.layers(layer_id); layers_.push_back(shared_ptr >(GetLayer(layer_param))); @@ -196,6 +197,8 @@ int Net::AppendBottom(const NetParameter& param, bottom_vecs_[layer_id].push_back(blobs_[blob_id].get()); bottom_id_vecs_[layer_id].push_back(blob_id); available_blobs->erase(blob_name); + const bool need_backward = param.force_backward() || blob_need_backward_[blob_id]; + bottom_need_backward_[layer_id].push_back(need_backward); return blob_id; } @@ -288,7 +291,8 @@ template void Net::Backward() { for (int i = layers_.size() - 1; i >= 0; --i) { if (layer_need_backward_[i]) { - layers_[i]->Backward(top_vecs_[i], true, &bottom_vecs_[i]); + layers_[i]->Backward( + top_vecs_[i], bottom_need_backward_[i], &bottom_vecs_[i]); } } } diff --git a/src/caffe/test/test_euclidean_loss_layer.cpp b/src/caffe/test/test_euclidean_loss_layer.cpp index d5e4107ac5e..02945b655de 100644 --- a/src/caffe/test/test_euclidean_loss_layer.cpp +++ b/src/caffe/test/test_euclidean_loss_layer.cpp @@ -47,13 +47,23 @@ typedef ::testing::Types Dtypes; TYPED_TEST_CASE(EuclideanLossLayerTest, Dtypes); TYPED_TEST(EuclideanLossLayerTest, TestGradientCPU) { - LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); + LayerParameter layer_param; + EuclideanLossLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + GradientChecker checker(1e-2, 1e-2, 1701); + checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), -1, -1, -1); +} + +TYPED_TEST(EuclideanLossLayerTest, TestGradientGPU) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; EuclideanLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); GradientChecker checker(1e-2, 1e-2, 1701); checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); + &(this->blob_top_vec_), -1, -1, -1); } } // namespace caffe diff --git a/src/caffe/test/test_gradient_check_util.hpp b/src/caffe/test/test_gradient_check_util.hpp index bcf03973dd3..ff104b90eb9 100644 --- a/src/caffe/test/test_gradient_check_util.hpp +++ b/src/caffe/test/test_gradient_check_util.hpp @@ -86,6 +86,7 @@ void GradientChecker::CheckGradientSingle(Layer* layer, } // First, figure out what blobs we need to check against. vector*> blobs_to_check; + vector propagate_down(bottom->size(), check_bottom < 0); for (int i = 0; i < layer->blobs().size(); ++i) { blobs_to_check.push_back(layer->blobs()[i].get()); } @@ -94,8 +95,9 @@ void GradientChecker::CheckGradientSingle(Layer* layer, blobs_to_check.push_back((*bottom)[i]); } } else { - CHECK(check_bottom < bottom->size()); + CHECK_LT(check_bottom, bottom->size()); blobs_to_check.push_back((*bottom)[check_bottom]); + propagate_down[check_bottom] = true; } // Compute the gradient analytically using Backward Caffe::set_random_seed(seed_); @@ -103,7 +105,7 @@ void GradientChecker::CheckGradientSingle(Layer* layer, Dtype computed_objective = layer->Forward(*bottom, top); // Get additional loss from the objective computed_objective += GetObjAndGradient(top, top_id, top_data_id); - layer->Backward(*top, true, bottom); + layer->Backward(*top, propagate_down, bottom); // Store computed gradients for all checked blobs vector > > computed_gradient_blobs(blobs_to_check.size()); diff --git a/src/caffe/test/test_lrn_layer.cpp b/src/caffe/test/test_lrn_layer.cpp index 7f0a211a50b..6996a234fc6 100644 --- a/src/caffe/test/test_lrn_layer.cpp +++ b/src/caffe/test/test_lrn_layer.cpp @@ -164,7 +164,9 @@ TYPED_TEST(LRNLayerTest, TestCPUGradientAcrossChannels) { for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + vector propagate_down(this->blob_bottom_vec_.size(), true); + layer.Backward(this->blob_top_vec_, propagate_down, + &(this->blob_bottom_vec_)); // for (int i = 0; i < this->blob_bottom_->count(); ++i) { // std::cout << "CPU diff " << this->blob_bottom_->cpu_diff()[i] // << std::endl; @@ -183,7 +185,9 @@ TYPED_TEST(LRNLayerTest, TestGPUGradientAcrossChannels) { for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + vector propagate_down(this->blob_bottom_vec_.size(), true); + layer.Backward(this->blob_top_vec_, propagate_down, + &(this->blob_bottom_vec_)); // for (int i = 0; i < this->blob_bottom_->count(); ++i) { // std::cout << "GPU diff " << this->blob_bottom_->cpu_diff()[i] // << std::endl; @@ -254,7 +258,6 @@ TYPED_TEST(LRNLayerTest, TestCPUGradientWithinChannel) { for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } @@ -272,7 +275,6 @@ TYPED_TEST(LRNLayerTest, TestGPUGradientWithinChannel) { for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp index 3862e12697b..ac6f86f0cf8 100644 --- a/src/caffe/test/test_maxpool_dropout_layers.cpp +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -130,7 +130,9 @@ TYPED_TEST(MaxPoolingDropoutTest, CPUBackward) { for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + vector propagate_down(this->blob_bottom_vec_.size(), true); + layer.Backward(this->blob_top_vec_, propagate_down, + &(this->blob_bottom_vec_)); const TypeParam* bottom_diff = this->blob_bottom_->cpu_diff(); TypeParam sum = 0.; for (int i = 0; i < this->blob_bottom_->count(); ++i) { @@ -141,8 +143,10 @@ TYPED_TEST(MaxPoolingDropoutTest, CPUBackward) { DropoutLayer dropout_layer(layer_param); dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); - dropout_layer.Backward(this->blob_top_vec_, true, &(this->blob_top_vec_)); - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + dropout_layer.Backward(this->blob_top_vec_, propagate_down, + &(this->blob_top_vec_)); + layer.Backward(this->blob_top_vec_, propagate_down, + &(this->blob_bottom_vec_)); TypeParam sum_with_dropout = 0.; bottom_diff = this->blob_bottom_->cpu_diff(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { @@ -164,7 +168,9 @@ TYPED_TEST(MaxPoolingDropoutTest, GPUBackward) { for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + vector propagate_down(this->blob_bottom_vec_.size(), true); + layer.Backward(this->blob_top_vec_, propagate_down, + &(this->blob_bottom_vec_)); const TypeParam* bottom_diff = this->blob_bottom_->cpu_diff(); TypeParam sum = 0.; for (int i = 0; i < this->blob_bottom_->count(); ++i) { @@ -175,8 +181,10 @@ TYPED_TEST(MaxPoolingDropoutTest, GPUBackward) { DropoutLayer dropout_layer(layer_param); dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); - dropout_layer.Backward(this->blob_top_vec_, true, &(this->blob_top_vec_)); - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + dropout_layer.Backward(this->blob_top_vec_, propagate_down, + &(this->blob_top_vec_)); + layer.Backward(this->blob_top_vec_, propagate_down, + &(this->blob_bottom_vec_)); TypeParam sum_with_dropout = 0.; bottom_diff = this->blob_bottom_->cpu_diff(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 7f2f67b59c6..eb368cd6c22 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -1,7 +1,9 @@ // Copyright 2014 BVLC and contributors. -#include #include +#include + +#include "google/protobuf/text_format.h" #include "gtest/gtest.h" #include "caffe/common.hpp" @@ -15,9 +17,15 @@ namespace caffe { template class NetTest : public ::testing::Test { protected: - virtual void SetUp() { - const string& proto = - "name: 'TestNetwork' " + virtual void InitNetFromProtoString(const string& proto) { + NetParameter param; + CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); + net_.reset(new Net(param)); + } + + virtual void InitTinyNet(const bool force_backward = false) { + string proto = + "name: 'TinyTestNetwork' " "layers: { " " name: 'data' " " type: DUMMY_DATA " @@ -66,9 +74,84 @@ class NetTest : public ::testing::Test { " bottom: 'label' " " top: 'top_loss' " "} "; - NetParameter param; - CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); - net_.reset(new Net(param)); + if (force_backward) { + proto += "force_backward: true "; + } + InitNetFromProtoString(proto); + } + + virtual void InitTrickyNet() { + const string& proto = + "name: 'TrickyTestNetwork' " + "layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: 5 " + " channels: 2 " + " height: 3 " + " width: 4 " + " num: 5 " + " channels: 1 " + " height: 1 " + " width: 1 " + " data_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " } " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerproduct' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 1000 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 0 " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'data' " + " top: 'transformed_data' " + "} " + "layers: { " + " name: 'innerproduct' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 1 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 0 " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'label' " + " top: 'transformed_label' " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'transformed_data' " + " bottom: 'transformed_label' " + "} "; + InitNetFromProtoString(proto); } shared_ptr > net_; @@ -78,6 +161,7 @@ typedef ::testing::Types Dtypes; TYPED_TEST_CASE(NetTest, Dtypes); TYPED_TEST(NetTest, TestHasBlob) { + this->InitTinyNet(); EXPECT_TRUE(this->net_->has_blob("data")); EXPECT_TRUE(this->net_->has_blob("label")); EXPECT_TRUE(this->net_->has_blob("innerproduct")); @@ -86,6 +170,7 @@ TYPED_TEST(NetTest, TestHasBlob) { } TYPED_TEST(NetTest, TestGetBlob) { + this->InitTinyNet(); EXPECT_EQ(this->net_->blob_by_name("data"), this->net_->blobs()[0]); EXPECT_EQ(this->net_->blob_by_name("label"), this->net_->blobs()[1]); EXPECT_EQ(this->net_->blob_by_name("innerproduct"), this->net_->blobs()[2]); @@ -94,6 +179,7 @@ TYPED_TEST(NetTest, TestGetBlob) { } TYPED_TEST(NetTest, TestHasLayer) { + this->InitTinyNet(); EXPECT_TRUE(this->net_->has_layer("data")); EXPECT_TRUE(this->net_->has_layer("innerproduct")); EXPECT_TRUE(this->net_->has_layer("loss")); @@ -101,10 +187,53 @@ TYPED_TEST(NetTest, TestHasLayer) { } TYPED_TEST(NetTest, TestGetLayerByName) { + this->InitTinyNet(); EXPECT_EQ(this->net_->layer_by_name("data"), this->net_->layers()[0]); EXPECT_EQ(this->net_->layer_by_name("innerproduct"), this->net_->layers()[1]); EXPECT_EQ(this->net_->layer_by_name("loss"), this->net_->layers()[2]); EXPECT_FALSE(this->net_->layer_by_name("label")); } +TYPED_TEST(NetTest, TestBottomNeedBackward) { + this->InitTinyNet(); + const vector >& bottom_need_backward = + this->net_->bottom_need_backward(); + EXPECT_EQ(3, bottom_need_backward.size()); + EXPECT_EQ(0, bottom_need_backward[0].size()); + EXPECT_EQ(1, bottom_need_backward[1].size()); + EXPECT_EQ(false, bottom_need_backward[1][0]); + EXPECT_EQ(2, bottom_need_backward[2].size()); + EXPECT_EQ(true, bottom_need_backward[2][0]); + EXPECT_EQ(false, bottom_need_backward[2][1]); +} + +TYPED_TEST(NetTest, TestBottomNeedBackwardForce) { + const bool force_backward = true; + this->InitTinyNet(force_backward); + const vector >& bottom_need_backward = + this->net_->bottom_need_backward(); + EXPECT_EQ(3, bottom_need_backward.size()); + EXPECT_EQ(0, bottom_need_backward[0].size()); + EXPECT_EQ(1, bottom_need_backward[1].size()); + EXPECT_EQ(true, bottom_need_backward[1][0]); + EXPECT_EQ(2, bottom_need_backward[2].size()); + EXPECT_EQ(true, bottom_need_backward[2][0]); + EXPECT_EQ(true, bottom_need_backward[2][1]); +} + +TYPED_TEST(NetTest, TestBottomNeedBackwardTricky) { + this->InitTrickyNet(); + const vector >& bottom_need_backward = + this->net_->bottom_need_backward(); + EXPECT_EQ(4, bottom_need_backward.size()); + EXPECT_EQ(0, bottom_need_backward[0].size()); + EXPECT_EQ(1, bottom_need_backward[1].size()); + EXPECT_EQ(false, bottom_need_backward[1][0]); + EXPECT_EQ(1, bottom_need_backward[2].size()); + EXPECT_EQ(false, bottom_need_backward[2][0]); + EXPECT_EQ(2, bottom_need_backward[3].size()); + EXPECT_EQ(true, bottom_need_backward[3][0]); + EXPECT_EQ(true, bottom_need_backward[3][1]); +} + } // namespace caffe diff --git a/tools/net_speed_benchmark.cpp b/tools/net_speed_benchmark.cpp index 36a00779f60..4b65cfd3dcc 100644 --- a/tools/net_speed_benchmark.cpp +++ b/tools/net_speed_benchmark.cpp @@ -64,6 +64,8 @@ int main(int argc, char** argv) { const vector > >& layers = caffe_net.layers(); vector*> >& bottom_vecs = caffe_net.bottom_vecs(); vector*> >& top_vecs = caffe_net.top_vecs(); + const vector >& bottom_need_backward = + caffe_net.bottom_need_backward(); LOG(ERROR) << "*** Benchmark begins ***"; Timer total_timer; total_timer.Start(); @@ -87,7 +89,8 @@ int main(int argc, char** argv) { const string& layername = layers[i]->layer_param().name(); timer.Start(); for (int j = 0; j < total_iter; ++j) { - layers[i]->Backward(top_vecs[i], true, &bottom_vecs[i]); + layers[i]->Backward(top_vecs[i], bottom_need_backward[i], + &bottom_vecs[i]); } LOG(ERROR) << layername << "\tbackward: " << timer.MilliSeconds() << " milli seconds."; From a04834f6ceee13310b7f4e17ccf639c1e7abd459 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 16 Jun 2014 16:37:17 -0700 Subject: [PATCH 0179/2053] force_backward works properly with non-backproppable things --- include/caffe/layer.hpp | 8 ++++ include/caffe/loss_layers.hpp | 15 +++++++ src/caffe/net.cpp | 21 ++++++++-- src/caffe/test/test_net.cpp | 73 +++++++++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+), 3 deletions(-) diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 12e7610d756..690c36ba23f 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -84,6 +84,14 @@ class Layer { virtual inline int MinTopBlobs() const { return -1; } virtual inline int MaxTopBlobs() const { return -1; } + // Declare for each bottom blob whether to allow force_backward -- that is, + // if AllowForceBackward(i) == false, we will ignore the force_backward + // setting and backpropagate to blob i only if it needs gradient information + // (as is done when force_backward == false). + virtual inline bool AllowForceBackward(const int bottom_index) const { + return true; + } + protected: // The protobuf that stores the layer parameters LayerParameter layer_param_; diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index b8adc996be5..bb03f637450 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -38,6 +38,11 @@ class LossLayer : public Layer { virtual inline int ExactNumBottomBlobs() const { return 2; } virtual inline int MaxTopBlobs() const { return 1; } + // We usually cannot backpropagate to the labels; ignore force_backward for + // these inputs. + virtual inline bool AllowForceBackward(const int bottom_index) const { + return bottom_index != 1; + } }; // Forward declare SoftmaxLayer for use in SoftmaxWithLossLayer. @@ -63,6 +68,11 @@ class SoftmaxWithLossLayer : public Layer { return LayerParameter_LayerType_SOFTMAX_LOSS; } virtual inline int MaxTopBlobs() const { return 2; } + // We cannot backpropagate to the labels; ignore force_backward for these + // inputs. + virtual inline bool AllowForceBackward(const int bottom_index) const { + return bottom_index != 1; + } protected: virtual Dtype Forward_cpu(const vector*>& bottom, @@ -133,6 +143,11 @@ class EuclideanLossLayer : public LossLayer { virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_EUCLIDEAN_LOSS; } + // Unlike most loss layers, in the EuclideanLossLayer we can backpropagate + // to both inputs. + virtual inline bool AllowForceBackward(const int bottom_index) const { + return true; + } protected: virtual Dtype Forward_cpu(const vector*>& bottom, diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 8687d0070ce..a6537619a8b 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -62,7 +62,7 @@ void Net::Init(const NetParameter& in_param) { layers_.push_back(shared_ptr >(GetLayer(layer_param))); layer_names_.push_back(layer_param.name()); LOG(INFO) << "Creating Layer " << layer_param.name(); - bool need_backward = param.force_backward(); + bool need_backward = false; // Figure out this layer's input and output for (int bottom_id = 0; bottom_id < layer_param.bottom_size(); ++bottom_id) { @@ -112,6 +112,21 @@ void Net::Init(const NetParameter& in_param) { << " does not need backward computation."; } } + // Handle force_backward if needed. + if (param.force_backward()) { + for (int layer_id = 0; layer_id < layers_.size(); ++layer_id) { + layer_need_backward_[layer_id] = true; + for (int bottom_id = 0; + bottom_id < bottom_need_backward_[layer_id].size(); ++bottom_id) { + bottom_need_backward_[layer_id][bottom_id] = + bottom_need_backward_[layer_id][bottom_id] || + layers_[layer_id]->AllowForceBackward(bottom_id); + blob_need_backward_[bottom_id_vecs_[layer_id][bottom_id]] = + blob_need_backward_[bottom_id_vecs_[layer_id][bottom_id]] || + bottom_need_backward_[layer_id][bottom_id]; + } + } + } // In the end, all remaining blobs are considered output blobs. for (set::iterator it = available_blobs.begin(); it != available_blobs.end(); ++it) { @@ -162,7 +177,7 @@ void Net::AppendTop(const NetParameter& param, const int layer_id, const int blob_id = blobs_.size(); blobs_.push_back(blob_pointer); blob_names_.push_back(blob_name); - blob_need_backward_.push_back(param.force_backward()); + blob_need_backward_.push_back(false); (*blob_name_to_idx)[blob_name] = blob_id; if (layer_id == -1) { // Set the (explicitly specified) dimensions of the input blob. @@ -197,7 +212,7 @@ int Net::AppendBottom(const NetParameter& param, bottom_vecs_[layer_id].push_back(blobs_[blob_id].get()); bottom_id_vecs_[layer_id].push_back(blob_id); available_blobs->erase(blob_name); - const bool need_backward = param.force_backward() || blob_need_backward_[blob_id]; + const bool need_backward = blob_need_backward_[blob_id]; bottom_need_backward_[layer_id].push_back(need_backward); return blob_id; } diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index eb368cd6c22..8fb02fcb7a7 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -80,6 +80,62 @@ class NetTest : public ::testing::Test { InitNetFromProtoString(proto); } + virtual void InitTinyNetEuclidean(const bool force_backward = false) { + string proto = + "name: 'TinyTestEuclidLossNetwork' " + "layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: 5 " + " channels: 2 " + " height: 3 " + " width: 4 " + " num: 5 " + " channels: 1 " + " height: 1 " + " width: 1 " + " data_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " } " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerproduct' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 1 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 0 " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'data' " + " top: 'innerproduct' " + "} " + "layers: { " + " name: 'loss' " + " type: EUCLIDEAN_LOSS " + " bottom: 'innerproduct' " + " bottom: 'label' " + "} "; + if (force_backward) { + proto += "force_backward: true "; + } + InitNetFromProtoString(proto); + } + virtual void InitTrickyNet() { const string& proto = "name: 'TrickyTestNetwork' " @@ -218,6 +274,20 @@ TYPED_TEST(NetTest, TestBottomNeedBackwardForce) { EXPECT_EQ(true, bottom_need_backward[1][0]); EXPECT_EQ(2, bottom_need_backward[2].size()); EXPECT_EQ(true, bottom_need_backward[2][0]); + EXPECT_EQ(false, bottom_need_backward[2][1]); +} + +TYPED_TEST(NetTest, TestBottomNeedBackwardEuclideanForce) { + const bool force_backward = true; + this->InitTinyNetEuclidean(force_backward); + const vector >& bottom_need_backward = + this->net_->bottom_need_backward(); + EXPECT_EQ(3, bottom_need_backward.size()); + EXPECT_EQ(0, bottom_need_backward[0].size()); + EXPECT_EQ(1, bottom_need_backward[1].size()); + EXPECT_EQ(true, bottom_need_backward[1][0]); + EXPECT_EQ(2, bottom_need_backward[2].size()); + EXPECT_EQ(true, bottom_need_backward[2][0]); EXPECT_EQ(true, bottom_need_backward[2][1]); } @@ -233,6 +303,9 @@ TYPED_TEST(NetTest, TestBottomNeedBackwardTricky) { EXPECT_EQ(false, bottom_need_backward[2][0]); EXPECT_EQ(2, bottom_need_backward[3].size()); EXPECT_EQ(true, bottom_need_backward[3][0]); + // The label input to the SoftmaxLossLayer should say it "needs backward" + // since it has weights under it, even though we expect this to cause a crash + // at training/test time. EXPECT_EQ(true, bottom_need_backward[3][1]); } From 41685ac81b6bab42c4fa47cc6c8faa203a4d0c54 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 8 Jun 2014 19:53:45 -0700 Subject: [PATCH 0180/2053] weight sharing --- include/caffe/net.hpp | 10 +- src/caffe/net.cpp | 111 ++++++++- src/caffe/proto/caffe.proto | 12 + src/caffe/test/test_net.cpp | 469 ++++++++++++++++++++++++++++++++++++ 4 files changed, 594 insertions(+), 8 deletions(-) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index d05ca09f20a..aa540edf27e 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "caffe/blob.hpp" @@ -14,9 +15,10 @@ #include "caffe/proto/caffe.pb.h" using std::map; -using std::vector; +using std::pair; using std::set; using std::string; +using std::vector; namespace caffe { @@ -103,6 +105,7 @@ class Net { const shared_ptr > blob_by_name(const string& blob_name); bool has_layer(const string& layer_name); const shared_ptr > layer_by_name(const string& layer_name); + const map& param_names_index() { return param_names_index_; } protected: // Helpers for Init. @@ -114,6 +117,8 @@ class Net { int AppendBottom(const NetParameter& param, const int layer_id, const int bottom_id, set* available_blobs, map* blob_name_to_idx); + void AppendParam(const NetParameter& param, const int layer_id, + const int param_id); // Function to get misc parameters, e.g. the learning rate multiplier and // weight decay. void GetLearningRateAndWeightDecay(); @@ -138,6 +143,9 @@ class Net { // top_vecs stores the vectors containing the output for each layer vector*> > top_vecs_; vector > top_id_vecs_; + vector param_owners_; + vector > param_net_indices_; + map param_names_index_; // blob indices for the input and the output of the net vector net_input_blob_indices_; vector net_output_blob_indices_; diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index a6537619a8b..fc532b7b376 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -11,10 +11,12 @@ #include "caffe/net.hpp" #include "caffe/util/io.hpp" #include "caffe/util/insert_splits.hpp" +#include "caffe/util/math_functions.hpp" #include "caffe/util/upgrade_proto.hpp" -using std::pair; +using std::make_pair; using std::map; +using std::pair; using std::set; namespace caffe { @@ -86,8 +88,9 @@ void Net::Init(const NetParameter& in_param) { } DLOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); const int blobs_lr_size = layers_[layer_id]->layer_param().blobs_lr_size(); - CHECK(blobs_lr_size == layers_[layer_id]->blobs().size() || - blobs_lr_size == 0) << "Incorrect blobs lr size: should be either 0 " + const int num_param_blobs = layers_[layer_id]->blobs().size(); + CHECK(blobs_lr_size == num_param_blobs || blobs_lr_size == 0) + << "Incorrect blobs lr size: should be either 0 " << "or the same as the number of the layer's parameter blobs."; if (blobs_lr_size) { // Check if this layer needs backward operation itself @@ -100,6 +103,17 @@ void Net::Init(const NetParameter& in_param) { // learning rate to be 1. Thus we will need to perform backward. need_backward = true; } + const int blob_name_size = layer_param.blob_name_size(); + CHECK(blob_name_size == num_param_blobs || blob_name_size == 0) + << "Incorrect blob_name size: should be either 0 or the same as " + "the number of the layer's parameter blobs: " << num_param_blobs; + const int blob_share_mode_size = layer_param.blob_share_mode_size(); + CHECK(blob_share_mode_size == num_param_blobs || blob_share_mode_size == 0) + << "Incorrect blob_share_mode size: should be either 0 or the same as " + "the number of the layer's parameter blobs: " << num_param_blobs; + for (int param_id = 0; param_id < num_param_blobs; ++param_id) { + AppendParam(param, layer_id, param_id); + } // Finally, set the backward flag layer_need_backward_.push_back(need_backward); if (need_backward) { @@ -217,14 +231,69 @@ int Net::AppendBottom(const NetParameter& param, return blob_id; } +template +void Net::AppendParam(const NetParameter& param, const int layer_id, + const int param_id) { + const LayerParameter& layer_param = layers_[layer_id]->layer_param(); + const int blob_name_size = layer_param.blob_name_size(); + string param_name; + if (blob_name_size) { + param_name = layer_param.blob_name(param_id); + } + const int net_param_id = params_.size(); + params_.push_back(layers_[layer_id]->blobs()[param_id]); + param_net_indices_.push_back(make_pair(layer_id, param_id)); + if (!blob_name_size || !param_name.size() || (param_name.size() && + param_names_index_.find(param_name) == param_names_index_.end())) { + // This layer "owns" this parameter blob -- it is either anonymous + // (i.e., not given a param_name) or explicitly given a name that we + // haven't already seen. + param_owners_.push_back(-1); + if (blob_name_size) { + param_names_index_[param_name] = net_param_id; + } + } else { + // Named param blob with name we've seen before: share params + const int owner_net_param_id = param_names_index_[param_name]; + param_owners_.push_back(owner_net_param_id); + const pair& owner_index = + param_net_indices_[owner_net_param_id]; + const int owner_layer_id = owner_index.first; + const int owner_param_id = owner_index.second; + LOG(INFO) << "Sharing parameters '" << param_name << "' owned by " + << "layer '" << layer_names_[owner_layer_id] << "', param " + << "index " << owner_param_id; + Blob* this_blob = layers_[layer_id]->blobs()[param_id].get(); + Blob* owner_blob = + layers_[owner_layer_id]->blobs()[owner_param_id].get(); + const int blob_share_mode_size = layer_param.blob_share_mode_size(); + if (blob_share_mode_size > param_id && + (layer_param.blob_share_mode(param_id) == + LayerParameter_DimCheckMode_PERMISSIVE)) { + // Permissive dimension checking -- only check counts are the same. + CHECK_EQ(this_blob->count(), owner_blob->count()) + << "Shared parameter blobs must have the same count."; + } else { + // Strict dimension checking -- all dims must be the same. + CHECK_EQ(this_blob->num(), owner_blob->num()) + << "Shared parameter blobs must have the same num."; + CHECK_EQ(this_blob->channels(), owner_blob->channels()) + << "Shared parameter blobs must have the same channels."; + CHECK_EQ(this_blob->height(), owner_blob->height()) + << "Shared parameter blobs must have the same height."; + CHECK_EQ(this_blob->width(), owner_blob->width()) + << "Shared parameter blobs must have the same width."; + } + layers_[layer_id]->blobs()[param_id]->ShareData( + *layers_[owner_layer_id]->blobs()[owner_param_id]); + } +} + template void Net::GetLearningRateAndWeightDecay() { LOG(INFO) << "Collecting Learning Rate and Weight Decay."; for (int i = 0; i < layers_.size(); ++i) { vector > >& layer_blobs = layers_[i]->blobs(); - for (int j = 0; j < layer_blobs.size(); ++j) { - params_.push_back(layer_blobs[j]); - } // push the learning rate mutlipliers if (layers_[i]->layer_param().blobs_lr_size()) { CHECK_EQ(layers_[i]->layer_param().blobs_lr_size(), layer_blobs.size()); @@ -403,8 +472,36 @@ void Net::ToProto(NetParameter* param, bool write_diff) { template void Net::Update() { + // First, accumulate the diffs of any shared parameters into their owner's + // diff. (Assumes that the learning rate, weight decay, etc. have already been + // accounted for in the current diff.) for (int i = 0; i < params_.size(); ++i) { - params_[i]->Update(); + if (param_owners_[i] < 0) { + continue; + } + const int count = params_[i]->count(); + const Dtype* this_diff; + Dtype* owner_diff; + switch (Caffe::mode()) { + case Caffe::CPU: + this_diff = params_[i]->cpu_diff(); + owner_diff = params_[param_owners_[i]]->mutable_cpu_diff(); + caffe_add(count, this_diff, owner_diff, owner_diff); + break; + case Caffe::GPU: + this_diff = params_[i]->gpu_diff(); + owner_diff = params_[param_owners_[i]]->mutable_gpu_diff(); + caffe_gpu_add(count, this_diff, owner_diff, owner_diff); + break; + default: + LOG(FATAL) << "Unknown caffe mode: " << Caffe::mode(); + } + } + // Now, update the owned parameters. + for (int i = 0; i < params_.size(); ++i) { + if (param_owners_[i] < 0) { + params_[i]->Update(); + } } } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 954f1033e97..76b643d5ff4 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -170,6 +170,18 @@ message LayerParameter { // The blobs containing the numeric parameters of the layer repeated BlobProto blobs = 6; + // The names of the parameter blobs -- useful for sharing parameters among + // layers (but never required). + repeated string blob_name = 1001; + // Whether to require shared weights to have the same shape, or just the same + // count -- defaults to STRICT if unspecified. + repeated DimCheckMode blob_share_mode = 1002; + enum DimCheckMode { + // STRICT (default) requires that num, channels, height, width each match. + STRICT = 0; + // PERMISSIVE requires only the count (num*channels*height*width) to match. + PERMISSIVE = 1; + } // The ratio that is multiplied on the global learning rate. If you want to // set the learning ratio for one blob, you need to set it for all blobs. repeated float blobs_lr = 7; diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 8fb02fcb7a7..1eb7b077cdf 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -1,6 +1,7 @@ // Copyright 2014 BVLC and contributors. #include +#include #include #include "google/protobuf/text_format.h" @@ -8,6 +9,7 @@ #include "gtest/gtest.h" #include "caffe/common.hpp" #include "caffe/net.hpp" +#include "caffe/util/math_functions.hpp" #include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" @@ -17,6 +19,8 @@ namespace caffe { template class NetTest : public ::testing::Test { protected: + NetTest() : seed_(1701) {} + virtual void InitNetFromProtoString(const string& proto) { NetParameter param; CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); @@ -210,6 +214,245 @@ class NetTest : public ::testing::Test { InitNetFromProtoString(proto); } + virtual void InitUnsharedWeightsNet() { + const string& proto = + "name: 'UnsharedWeightsNetwork' " + "layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: 5 " + " channels: 2 " + " height: 3 " + " width: 4 " + " data_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " } " + " top: 'data' " + "} " + "layers: { " + " name: 'innerproduct1' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'gaussian' " + " std: 10 " + " } " + " } " + " blob_name: 'unsharedweights1' " + " bottom: 'data' " + " top: 'innerproduct1' " + "} " + "layers: { " + " name: 'innerproduct2' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'gaussian' " + " std: 10 " + " } " + " } " + " blob_name: 'unsharedweights2' " + " bottom: 'data' " + " top: 'innerproduct2' " + "} " + "layers: { " + " name: 'loss' " + " type: EUCLIDEAN_LOSS " + " bottom: 'innerproduct1' " + " bottom: 'innerproduct2' " + "} "; + InitNetFromProtoString(proto); + } + + virtual void InitSharedWeightsNet() { + const string& proto = + "name: 'SharedWeightsNetwork' " + "layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: 5 " + " channels: 2 " + " height: 3 " + " width: 4 " + " data_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " } " + " top: 'data' " + "} " + "layers: { " + " name: 'innerproduct1' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'gaussian' " + " std: 10 " + " } " + " } " + " blob_name: 'sharedweights' " + " bottom: 'data' " + " top: 'innerproduct1' " + "} " + "layers: { " + " name: 'innerproduct2' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'gaussian' " + " std: 10 " + " } " + " } " + " blob_name: 'sharedweights' " + " bottom: 'data' " + " top: 'innerproduct2' " + "} " + "layers: { " + " name: 'loss' " + " type: EUCLIDEAN_LOSS " + " bottom: 'innerproduct1' " + " bottom: 'innerproduct2' " + "} "; + InitNetFromProtoString(proto); + } + + virtual void InitDiffDataUnsharedWeightsNet() { + const string& proto = + "name: 'DiffDataUnsharedWeightsNetwork' " + "layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: 10 " + " channels: 10 " + " height: 1 " + " width: 1 " + " num: 10 " + " channels: 10 " + " height: 1 " + " width: 1 " + " data_filler { " + " type: 'gaussian' " + " std: 10 " + " } " + " } " + " top: 'data1' " + " top: 'data2' " + "} " + "layers: { " + " name: 'innerproduct1' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'constant' " + " value: 0.5 " + " } " + " } " + " blob_name: 'unsharedweights1' " + " bottom: 'data1' " + " top: 'innerproduct1' " + "} " + "layers: { " + " name: 'innerproduct2' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'constant' " + " value: 0.5 " + " } " + " } " + " blob_name: 'unsharedweights2' " + " bottom: 'innerproduct1' " + " top: 'innerproduct2' " + "} " + "layers: { " + " name: 'loss' " + " type: EUCLIDEAN_LOSS " + " bottom: 'data2' " + " bottom: 'innerproduct2' " + "} "; + InitNetFromProtoString(proto); + } + + virtual void InitDiffDataSharedWeightsNet() { + const string& proto = + "name: 'DiffDataSharedWeightsNetwork' " + "layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: 10 " + " channels: 10 " + " height: 1 " + " width: 1 " + " num: 10 " + " channels: 10 " + " height: 1 " + " width: 1 " + " data_filler { " + " type: 'gaussian' " + " std: 10 " + " } " + " } " + " top: 'data1' " + " top: 'data2' " + "} " + "layers: { " + " name: 'innerproduct1' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'constant' " + " value: 0.5 " + " } " + " } " + " blob_name: 'sharedweights' " + " bottom: 'data1' " + " top: 'innerproduct1' " + "} " + "layers: { " + " name: 'innerproduct2' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'constant' " + " value: 0.5 " + " } " + " } " + " blob_name: 'sharedweights' " + " bottom: 'innerproduct1' " + " top: 'innerproduct2' " + "} " + "layers: { " + " name: 'loss' " + " type: EUCLIDEAN_LOSS " + " bottom: 'data2' " + " bottom: 'innerproduct2' " + "} "; + InitNetFromProtoString(proto); + } + + int seed_; shared_ptr > net_; }; @@ -309,4 +552,230 @@ TYPED_TEST(NetTest, TestBottomNeedBackwardTricky) { EXPECT_EQ(true, bottom_need_backward[3][1]); } +TYPED_TEST(NetTest, TestUnsharedWeightsDataNet) { + this->InitUnsharedWeightsNet(); + vector*> bottom; + TypeParam loss; + this->net_->Forward(bottom, &loss); + EXPECT_GT(loss, 0); +} + +TYPED_TEST(NetTest, TestSharedWeightsDataNet) { + this->InitSharedWeightsNet(); + vector*> bottom; + TypeParam loss; + this->net_->Forward(bottom, &loss); + EXPECT_FLOAT_EQ(loss, 0); +} + +TYPED_TEST(NetTest, TestUnsharedWeightsDiffNet) { + this->InitUnsharedWeightsNet(); + vector*> bottom; + Net* net = this->net_.get(); + net->Forward(bottom); + net->Backward(); + Layer* ip1_layer = net->layer_by_name("innerproduct1").get(); + Layer* ip2_layer = net->layer_by_name("innerproduct2").get(); + const int count = ip1_layer->blobs()[0]->count(); + const TypeParam* grad1 = ip1_layer->blobs()[0]->cpu_diff(); + const TypeParam* grad2 = ip2_layer->blobs()[0]->cpu_diff(); + for (int i = 0; i < count; ++i) { + EXPECT_GT(fabs(grad1[i]), 0); + EXPECT_FLOAT_EQ(-1 * grad1[i], grad2[i]); + } +} + +TYPED_TEST(NetTest, TestSharedWeightsDiffNet) { + this->InitSharedWeightsNet(); + vector*> bottom; + Net* net = this->net_.get(); + TypeParam loss; + net->Forward(bottom, &loss); + net->Backward(); + EXPECT_FLOAT_EQ(loss, 0); + Layer* ip1_layer = net->layer_by_name("innerproduct1").get(); + Layer* ip2_layer = net->layer_by_name("innerproduct2").get(); + const int count = ip1_layer->blobs()[0]->count(); + const TypeParam* grad1 = ip1_layer->blobs()[0]->cpu_diff(); + const TypeParam* grad2 = ip2_layer->blobs()[0]->cpu_diff(); + for (int i = 0; i < count; ++i) { + EXPECT_FLOAT_EQ(0, grad1[i]); + EXPECT_FLOAT_EQ(0, grad2[i]); + } +} + +TYPED_TEST(NetTest, TestSharedWeightsUpdateCPU) { + Caffe::set_random_seed(this->seed_); + Caffe::set_mode(Caffe::CPU); + this->InitDiffDataSharedWeightsNet(); + vector*> bottom; + EXPECT_EQ(this->net_->layer_names()[1], "innerproduct1"); + EXPECT_EQ(this->net_->layer_names()[2], "innerproduct2"); + Blob* ip1_weights = this->net_->layers()[1]->blobs()[0].get(); + Blob* ip2_weights = this->net_->layers()[2]->blobs()[0].get(); + // Check that data blobs of shared weights share the same location in memory. + EXPECT_EQ(ip1_weights->cpu_data(), ip2_weights->cpu_data()); + // Check that diff blobs of shared weights are at different locations in + // locations. (The diffs should be accumulated at update time.) + EXPECT_NE(ip1_weights->cpu_diff(), ip2_weights->cpu_diff()); + this->net_->Forward(bottom); + this->net_->Backward(); + // Compute the expected update as the data minus the two diffs. + Blob shared_params; + const bool reshape = true; + const bool copy_diff = false; + shared_params.CopyFrom(*ip1_weights, copy_diff, reshape); + shared_params.CopyFrom(*ip1_weights, !copy_diff, reshape); + const int count = ip1_weights->count(); + // Make sure the diffs are non-trivial. + for (int i = 0; i < count; ++i) { + EXPECT_NE(0, ip1_weights->cpu_diff()[i]); + EXPECT_NE(0, ip2_weights->cpu_diff()[i]); + EXPECT_NE(ip1_weights->cpu_diff()[i], ip2_weights->cpu_diff()[i]); + } + caffe_axpy(count, TypeParam(1), ip2_weights->cpu_diff(), + shared_params.mutable_cpu_diff()); + caffe_axpy(count, TypeParam(-1), shared_params.cpu_diff(), + shared_params.mutable_cpu_data()); + const TypeParam* expected_updated_params = shared_params.cpu_data(); + this->net_->Update(); + const TypeParam* actual_updated_params = ip1_weights->cpu_data(); + for (int i = 0; i < count; ++i) { + EXPECT_EQ(expected_updated_params[i], actual_updated_params[i]); + } + // Check that data blobs of shared weights STILL point to the same memory + // location (because ... who knows). + EXPECT_EQ(ip1_weights->cpu_data(), ip2_weights->cpu_data()); + + Caffe::set_random_seed(this->seed_); + this->InitDiffDataUnsharedWeightsNet(); + EXPECT_EQ(this->net_->layer_names()[1], "innerproduct1"); + EXPECT_EQ(this->net_->layer_names()[2], "innerproduct2"); + ip1_weights = this->net_->layers()[1]->blobs()[0].get(); + ip2_weights = this->net_->layers()[2]->blobs()[0].get(); + // Check that data and diff blobs of unshared weights are at different + // locations in memory. + EXPECT_NE(ip1_weights->cpu_data(), ip2_weights->cpu_data()); + EXPECT_NE(ip1_weights->cpu_diff(), ip2_weights->cpu_diff()); + this->net_->Forward(bottom); + this->net_->Backward(); + // Compute the expected update. + Blob unshared_params1; + unshared_params1.CopyFrom(*ip1_weights, copy_diff, reshape); + unshared_params1.CopyFrom(*ip1_weights, !copy_diff, reshape); + Blob unshared_params2; + unshared_params2.CopyFrom(*ip2_weights, copy_diff, reshape); + unshared_params2.CopyFrom(*ip2_weights, !copy_diff, reshape); + // Make sure the diffs are non-trivial and sum to the diff in the shared net. + for (int i = 0; i < count; ++i) { + EXPECT_NE(0, ip1_weights->cpu_diff()[i]); + EXPECT_NE(0, ip2_weights->cpu_diff()[i]); + EXPECT_NE(ip1_weights->cpu_diff()[i], ip2_weights->cpu_diff()[i]); + EXPECT_EQ(ip1_weights->cpu_diff()[i] + ip2_weights->cpu_diff()[i], + shared_params.cpu_diff()[i]); + } + caffe_axpy(count, TypeParam(-1), ip1_weights->cpu_diff(), + unshared_params1.mutable_cpu_data()); + caffe_axpy(count, TypeParam(-1), ip2_weights->cpu_diff(), + unshared_params2.mutable_cpu_data()); + const TypeParam* expected_updated_params1 = unshared_params1.cpu_data(); + const TypeParam* expected_updated_params2 = unshared_params2.cpu_data(); + this->net_->Update(); + const TypeParam* actual_updated_params1 = ip1_weights->cpu_data(); + const TypeParam* actual_updated_params2 = ip2_weights->cpu_data(); + for (int i = 0; i < count; ++i) { + EXPECT_EQ(expected_updated_params1[i], actual_updated_params1[i]); + EXPECT_EQ(expected_updated_params2[i], actual_updated_params2[i]); + EXPECT_NE(actual_updated_params1[i], actual_updated_params2[i]); + EXPECT_NE(expected_updated_params, expected_updated_params1); + } +} + +TYPED_TEST(NetTest, TestSharedWeightsUpdateGPU) { + Caffe::set_random_seed(this->seed_); + Caffe::set_mode(Caffe::GPU); + this->InitDiffDataSharedWeightsNet(); + vector*> bottom; + EXPECT_EQ(this->net_->layer_names()[1], "innerproduct1"); + EXPECT_EQ(this->net_->layer_names()[2], "innerproduct2"); + Blob* ip1_weights = this->net_->layers()[1]->blobs()[0].get(); + Blob* ip2_weights = this->net_->layers()[2]->blobs()[0].get(); + // Check that data blobs of shared weights share the same location in memory. + EXPECT_EQ(ip1_weights->cpu_data(), ip2_weights->cpu_data()); + // Check that diff blobs of shared weights are at different locations in + // locations. (The diffs should be accumulated at update time.) + EXPECT_NE(ip1_weights->cpu_diff(), ip2_weights->cpu_diff()); + this->net_->Forward(bottom); + this->net_->Backward(); + // Compute the expected update as the data minus the two diffs. + Blob shared_params; + const bool reshape = true; + const bool copy_diff = false; + shared_params.CopyFrom(*ip1_weights, copy_diff, reshape); + shared_params.CopyFrom(*ip1_weights, !copy_diff, reshape); + const int count = ip1_weights->count(); + // Make sure the diffs are non-trivial. + for (int i = 0; i < count; ++i) { + EXPECT_NE(0, ip1_weights->cpu_diff()[i]); + EXPECT_NE(0, ip2_weights->cpu_diff()[i]); + EXPECT_NE(ip1_weights->cpu_diff()[i], ip2_weights->cpu_diff()[i]); + } + caffe_axpy(count, TypeParam(1), ip2_weights->cpu_diff(), + shared_params.mutable_cpu_diff()); + caffe_axpy(count, TypeParam(-1), shared_params.cpu_diff(), + shared_params.mutable_cpu_data()); + const TypeParam* expected_updated_params = shared_params.cpu_data(); + this->net_->Update(); + const TypeParam* actual_updated_params = ip1_weights->cpu_data(); + for (int i = 0; i < count; ++i) { + EXPECT_EQ(expected_updated_params[i], actual_updated_params[i]); + } + // Check that data blobs of shared weights STILL point to the same memory + // location (because ... who knows). + EXPECT_EQ(ip1_weights->cpu_data(), ip2_weights->cpu_data()); + + Caffe::set_random_seed(this->seed_); + this->InitDiffDataUnsharedWeightsNet(); + EXPECT_EQ(this->net_->layer_names()[1], "innerproduct1"); + EXPECT_EQ(this->net_->layer_names()[2], "innerproduct2"); + ip1_weights = this->net_->layers()[1]->blobs()[0].get(); + ip2_weights = this->net_->layers()[2]->blobs()[0].get(); + // Check that data and diff blobs of unshared weights are at different + // locations in memory. + EXPECT_NE(ip1_weights->cpu_data(), ip2_weights->cpu_data()); + EXPECT_NE(ip1_weights->cpu_diff(), ip2_weights->cpu_diff()); + this->net_->Forward(bottom); + this->net_->Backward(); + // Compute the expected update. + Blob unshared_params1; + unshared_params1.CopyFrom(*ip1_weights, copy_diff, reshape); + unshared_params1.CopyFrom(*ip1_weights, !copy_diff, reshape); + Blob unshared_params2; + unshared_params2.CopyFrom(*ip2_weights, copy_diff, reshape); + unshared_params2.CopyFrom(*ip2_weights, !copy_diff, reshape); + // Make sure the diffs are non-trivial and sum to the diff in the shared net. + for (int i = 0; i < count; ++i) { + EXPECT_NE(0, ip1_weights->cpu_diff()[i]); + EXPECT_NE(0, ip2_weights->cpu_diff()[i]); + EXPECT_NE(ip1_weights->cpu_diff()[i], ip2_weights->cpu_diff()[i]); + EXPECT_EQ(ip1_weights->cpu_diff()[i] + ip2_weights->cpu_diff()[i], + shared_params.cpu_diff()[i]); + } + caffe_axpy(count, TypeParam(-1), ip1_weights->cpu_diff(), + unshared_params1.mutable_cpu_data()); + caffe_axpy(count, TypeParam(-1), ip2_weights->cpu_diff(), + unshared_params2.mutable_cpu_data()); + const TypeParam* expected_updated_params1 = unshared_params1.cpu_data(); + const TypeParam* expected_updated_params2 = unshared_params2.cpu_data(); + this->net_->Update(); + const TypeParam* actual_updated_params1 = ip1_weights->cpu_data(); + const TypeParam* actual_updated_params2 = ip2_weights->cpu_data(); + for (int i = 0; i < count; ++i) { + EXPECT_EQ(expected_updated_params1[i], actual_updated_params1[i]); + EXPECT_EQ(expected_updated_params2[i], actual_updated_params2[i]); + EXPECT_NE(actual_updated_params1[i], actual_updated_params2[i]); + EXPECT_NE(expected_updated_params, expected_updated_params1); + } +} + } // namespace caffe From 26e022acedcb53b2c45147b635fc9081b66396af Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 26 Jun 2014 12:49:00 -0700 Subject: [PATCH 0181/2053] change weight blob field name to param --- src/caffe/net.cpp | 16 ++++++++-------- src/caffe/proto/caffe.proto | 6 +++--- src/caffe/test/test_net.cpp | 16 ++++++++-------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index fc532b7b376..e25c754bda6 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -103,9 +103,9 @@ void Net::Init(const NetParameter& in_param) { // learning rate to be 1. Thus we will need to perform backward. need_backward = true; } - const int blob_name_size = layer_param.blob_name_size(); - CHECK(blob_name_size == num_param_blobs || blob_name_size == 0) - << "Incorrect blob_name size: should be either 0 or the same as " + const int param_size = layer_param.param_size(); + CHECK(param_size == num_param_blobs || param_size == 0) + << "Incorrect param size: should be either 0 or the same as " "the number of the layer's parameter blobs: " << num_param_blobs; const int blob_share_mode_size = layer_param.blob_share_mode_size(); CHECK(blob_share_mode_size == num_param_blobs || blob_share_mode_size == 0) @@ -235,21 +235,21 @@ template void Net::AppendParam(const NetParameter& param, const int layer_id, const int param_id) { const LayerParameter& layer_param = layers_[layer_id]->layer_param(); - const int blob_name_size = layer_param.blob_name_size(); + const int param_size = layer_param.param_size(); string param_name; - if (blob_name_size) { - param_name = layer_param.blob_name(param_id); + if (param_size) { + param_name = layer_param.param(param_id); } const int net_param_id = params_.size(); params_.push_back(layers_[layer_id]->blobs()[param_id]); param_net_indices_.push_back(make_pair(layer_id, param_id)); - if (!blob_name_size || !param_name.size() || (param_name.size() && + if (!param_size || !param_name.size() || (param_name.size() && param_names_index_.find(param_name) == param_names_index_.end())) { // This layer "owns" this parameter blob -- it is either anonymous // (i.e., not given a param_name) or explicitly given a name that we // haven't already seen. param_owners_.push_back(-1); - if (blob_name_size) { + if (param_size) { param_names_index_[param_name] = net_param_id; } } else { diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 76b643d5ff4..fd71f45fab4 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -172,7 +172,7 @@ message LayerParameter { repeated BlobProto blobs = 6; // The names of the parameter blobs -- useful for sharing parameters among // layers (but never required). - repeated string blob_name = 1001; + repeated string param = 1001; // Whether to require shared weights to have the same shape, or just the same // count -- defaults to STRICT if unspecified. repeated DimCheckMode blob_share_mode = 1002; @@ -319,9 +319,9 @@ message HDF5OutputParameter { } message HingeLossParameter { - enum Norm { + enum Norm { L1 = 1; - L2 = 2; + L2 = 2; } // Specify the Norm to use L1 or L2 optional Norm norm = 1 [default = L1]; diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 1eb7b077cdf..18b03476996 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -243,7 +243,7 @@ class NetTest : public ::testing::Test { " std: 10 " " } " " } " - " blob_name: 'unsharedweights1' " + " param: 'unsharedweights1' " " bottom: 'data' " " top: 'innerproduct1' " "} " @@ -258,7 +258,7 @@ class NetTest : public ::testing::Test { " std: 10 " " } " " } " - " blob_name: 'unsharedweights2' " + " param: 'unsharedweights2' " " bottom: 'data' " " top: 'innerproduct2' " "} " @@ -300,7 +300,7 @@ class NetTest : public ::testing::Test { " std: 10 " " } " " } " - " blob_name: 'sharedweights' " + " param: 'sharedweights' " " bottom: 'data' " " top: 'innerproduct1' " "} " @@ -315,7 +315,7 @@ class NetTest : public ::testing::Test { " std: 10 " " } " " } " - " blob_name: 'sharedweights' " + " param: 'sharedweights' " " bottom: 'data' " " top: 'innerproduct2' " "} " @@ -362,7 +362,7 @@ class NetTest : public ::testing::Test { " value: 0.5 " " } " " } " - " blob_name: 'unsharedweights1' " + " param: 'unsharedweights1' " " bottom: 'data1' " " top: 'innerproduct1' " "} " @@ -377,7 +377,7 @@ class NetTest : public ::testing::Test { " value: 0.5 " " } " " } " - " blob_name: 'unsharedweights2' " + " param: 'unsharedweights2' " " bottom: 'innerproduct1' " " top: 'innerproduct2' " "} " @@ -424,7 +424,7 @@ class NetTest : public ::testing::Test { " value: 0.5 " " } " " } " - " blob_name: 'sharedweights' " + " param: 'sharedweights' " " bottom: 'data1' " " top: 'innerproduct1' " "} " @@ -439,7 +439,7 @@ class NetTest : public ::testing::Test { " value: 0.5 " " } " " } " - " blob_name: 'sharedweights' " + " param: 'sharedweights' " " bottom: 'innerproduct1' " " top: 'innerproduct2' " "} " From a71354f87d9b4cf205180e5339b958fc684e8a51 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 26 Jun 2014 13:05:44 -0700 Subject: [PATCH 0182/2053] rename layer -> param mapping for clarity --- include/caffe/net.hpp | 2 +- src/caffe/net.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index aa540edf27e..cbd5becde2d 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -144,7 +144,7 @@ class Net { vector*> > top_vecs_; vector > top_id_vecs_; vector param_owners_; - vector > param_net_indices_; + vector > layer_param_indices_; map param_names_index_; // blob indices for the input and the output of the net vector net_input_blob_indices_; diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index e25c754bda6..f364e6767c6 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -242,7 +242,7 @@ void Net::AppendParam(const NetParameter& param, const int layer_id, } const int net_param_id = params_.size(); params_.push_back(layers_[layer_id]->blobs()[param_id]); - param_net_indices_.push_back(make_pair(layer_id, param_id)); + layer_param_indices_.push_back(make_pair(layer_id, param_id)); if (!param_size || !param_name.size() || (param_name.size() && param_names_index_.find(param_name) == param_names_index_.end())) { // This layer "owns" this parameter blob -- it is either anonymous @@ -257,7 +257,7 @@ void Net::AppendParam(const NetParameter& param, const int layer_id, const int owner_net_param_id = param_names_index_[param_name]; param_owners_.push_back(owner_net_param_id); const pair& owner_index = - param_net_indices_[owner_net_param_id]; + layer_param_indices_[owner_net_param_id]; const int owner_layer_id = owner_index.first; const int owner_param_id = owner_index.second; LOG(INFO) << "Sharing parameters '" << param_name << "' owned by " From 6450e0f0c8e19cde6c5e3c26ffb50deba4308bc7 Mon Sep 17 00:00:00 2001 From: James Thewlis Date: Thu, 26 Jun 2014 18:12:30 +0100 Subject: [PATCH 0183/2053] Test for im2col kernel With associated Makefile changes for .cu tests This tests that the grid-stride loop works for im2col, using the CPU version as a reference. --- Makefile | 14 ++- src/caffe/test/test_im2col_kernel.cu | 125 +++++++++++++++++++++++++++ 2 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 src/caffe/test/test_im2col_kernel.cu diff --git a/Makefile b/Makefile index 77e2ff5edbe..14072747b19 100644 --- a/Makefile +++ b/Makefile @@ -30,11 +30,12 @@ CXX_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cpp" -name "*.cpp") # HXX_SRCS are the header files HXX_SRCS := $(shell find include/$(PROJECT) -name "*.hpp") # CU_SRCS are the cuda source files -CU_SRCS := $(shell find src/$(PROJECT) -name "*.cu") +CU_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cu" -name "*.cu") # TEST_SRCS are the test source files TEST_MAIN_SRC := src/$(PROJECT)/test/test_caffe_main.cpp TEST_SRCS := $(shell find src/$(PROJECT) -name "test_*.cpp") TEST_SRCS := $(filter-out $(TEST_MAIN_SRC), $(TEST_SRCS)) +TEST_CU_SRCS := $(shell find src/$(PROJECT) -name "test_*.cu") GTEST_SRC := src/gtest/gtest-all.cpp # TEST_HDRS are the test header files TEST_HDRS := $(shell find src/$(PROJECT) -name "test_*.hpp") @@ -101,7 +102,9 @@ OBJS := $(PROTO_OBJS) $(CXX_OBJS) $(CU_OBJS) TOOL_OBJS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o}) TOOL_BUILD_DIR := $(BUILD_DIR)/tools TEST_BUILD_DIR := $(BUILD_DIR)/src/$(PROJECT)/test -TEST_OBJS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o}) +TEST_CXX_OBJS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o}) +TEST_CU_OBJS := $(addprefix $(BUILD_DIR)/, ${TEST_CU_SRCS:.cu=.cuo}) +TEST_OBJS := $(TEST_CXX_OBJS) $(TEST_CU_OBJS) GTEST_OBJ := $(addprefix $(BUILD_DIR)/, ${GTEST_SRC:.cpp=.o}) GTEST_BUILD_DIR := $(dir $(GTEST_OBJ)) EXAMPLE_OBJS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o}) @@ -329,13 +332,18 @@ $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HDRS) \ $(CXX) $< $(CXXFLAGS) -c -o $@ @ echo +$(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HDRS) \ + | $(TEST_BUILD_DIR) + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ + @ echo + $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo -$(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) $(STATIC_NAME) \ +$(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.*o $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_NAME) \ -o $@ $(LINKFLAGS) $(LDFLAGS) diff --git a/src/caffe/test/test_im2col_kernel.cu b/src/caffe/test/test_im2col_kernel.cu new file mode 100644 index 00000000000..f49a5b7e4d9 --- /dev/null +++ b/src/caffe/test/test_im2col_kernel.cu @@ -0,0 +1,125 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include + +#include "cuda_runtime.h" +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/im2col.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +// Forward declare kernel functions +template +__global__ void im2col_gpu_kernel(const int n, const Dtype* data_im, + const int height, const int width, const int ksize, const int pad, + const int stride, const int height_col, const int width_col, + Dtype* data_col); + +extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; + +template +class Im2colKernelTest : public ::testing::Test { + protected: + Im2colKernelTest() + // big so launches > 1024 threads + : blob_bottom_(new Blob(5, 500, 10, 10)), + blob_top_(new Blob()), + blob_top_cpu_(new Blob()) { + FillerParameter filler_param; + GaussianFiller filler(filler_param); + filler.Fill(this->blob_bottom_); + + height_ = blob_bottom_->height(); + width_ = blob_bottom_->width(); + channels_ = blob_bottom_->channels(); + pad_ = 0; + stride_ = 2; + kernel_size_ = 3; + height_col_ = (height_ + 2 * pad_ - kernel_size_) / stride_ + 1; + width_col_ = (width_ + 2 * pad_ - kernel_size_) / stride_ + 1; + } + + virtual ~Im2colKernelTest() { + delete blob_bottom_; + delete blob_top_; + delete blob_top_cpu_; + } + + Blob* const blob_bottom_; + Blob* const blob_top_; + Blob* const blob_top_cpu_; + int height_; + int width_; + int channels_; + int pad_; + int stride_; + int kernel_size_; + int height_col_; + int width_col_; +}; + +typedef ::testing::Types Dtypes; +TYPED_TEST_CASE(Im2colKernelTest, Dtypes); + +TYPED_TEST(Im2colKernelTest, TestGPU) { + Caffe::set_mode(Caffe::GPU); + + // Reshape the blobs to correct size for im2col output + this->blob_top_->Reshape(this->blob_bottom_->num(), + this->channels_ * this->kernel_size_ * this->kernel_size_, + this->height_col_, + this->width_col_); + + this->blob_top_cpu_->Reshape(this->blob_bottom_->num(), + this->channels_ * this->kernel_size_ * this->kernel_size_, + this->height_col_, + this->width_col_); + + const TypeParam* bottom_data = this->blob_bottom_->gpu_data(); + TypeParam* top_data = this->blob_top_->mutable_gpu_data(); + TypeParam* cpu_data = this->blob_top_cpu_->mutable_cpu_data(); + + // CPU Version + for (int n = 0; n < this->blob_bottom_->num(); ++n) { + im2col_cpu(this->blob_bottom_->cpu_data() + this->blob_bottom_->offset(n), + this->channels_, this->height_, this->width_, this->kernel_size_, + this->pad_, this->stride_, cpu_data + this->blob_top_cpu_->offset(n)); + } + + // GPU version + int num_kernels = this->channels_ * this->height_col_ * this->width_col_; + int default_grid_dim = CAFFE_GET_BLOCKS(num_kernels); + + // Launch with different grid sizes + for (int grid_div = 2; grid_div <= 8; grid_div++) { + for (int n = 0; n < this->blob_bottom_->num(); ++n) { + int grid_dim = default_grid_dim/grid_div; + // NOLINT_NEXT_LINE(whitespace/operators) + im2col_gpu_kernel<<>>( + num_kernels, bottom_data + this->blob_bottom_->offset(n), + this->height_, this->width_, this->kernel_size_, this->pad_, + this->stride_, this->height_col_, this->width_col_, + top_data + this->blob_top_->offset(n)); + CUDA_POST_KERNEL_CHECK; + } + + // Compare results against CPU version + for (int i = 0; i < this->blob_top_->count(); ++i) { + TypeParam cpuval = cpu_data[i]; + TypeParam gpuval = this->blob_top_->cpu_data()[i]; + EXPECT_EQ(cpuval, gpuval); + if (cpuval != gpuval) { + break; + } + } + } +} + +} // namespace caffe From 423808dd60c5077dda16432080caa69a2e6f8d13 Mon Sep 17 00:00:00 2001 From: James Thewlis Date: Fri, 27 Jun 2014 10:49:08 +0100 Subject: [PATCH 0184/2053] Make resizing & cropping with PIL work Previously it was trying to use undefined variables --- tools/extra/resize_and_crop_images.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/extra/resize_and_crop_images.py b/tools/extra/resize_and_crop_images.py index 0ab75dc2ae5..c844f590c06 100755 --- a/tools/extra/resize_and_crop_images.py +++ b/tools/extra/resize_and_crop_images.py @@ -3,7 +3,7 @@ import gflags import os import cv2 -import PIL +from PIL import Image # gflags gflags.DEFINE_string('image_lib', 'opencv', @@ -37,9 +37,10 @@ def resize_and_crop_image(self, input_file, output_file, output_side_length = 25 class PILResizeCrop: ## http://united-coders.com/christian-harms/image-resizing-tips-every-coder-should-know/ - def resize_and_crop_image(self, input_file, output_file, output_side_length = 256): + def resize_and_crop_image(self, input_file, output_file, output_side_length = 256, fit = True): '''Downsample the image. ''' + img = Image.open(input_file) box = (output_side_length, output_side_length) #preresize image with factor 2, 4, 8 and fast algorithm factor = 1 From 180a75bb960b8494a7d1096d2d7557fe5f19192a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 27 Jun 2014 08:47:42 -0700 Subject: [PATCH 0185/2053] add latest CUDA arch to fix invalid device function errors ...on devices of that architecture. --- Makefile.config.example | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile.config.example b/Makefile.config.example index 9754129beb7..c41bada9ac2 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -7,11 +7,15 @@ CUDA_DIR := /usr/local/cuda # "sudo apt-get install nvidia-cuda-toolkit" then use this instead: # CUDA_DIR := /usr -# CUDA architecture setting: going with all of them. +# CUDA architecture setting: going with all of them (up to CUDA 5.5 compatible). +# For the latest architecture, you need to install CUDA >= 6.0 and uncomment +# the *_50 lines below. CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \ -gencode arch=compute_20,code=sm_21 \ -gencode arch=compute_30,code=sm_30 \ -gencode arch=compute_35,code=sm_35 + #-gencode=arch=compute_50,code=sm_50 \ + #-gencode=arch=compute_50,code=compute_50 # BLAS choice: # atlas for ATLAS (default) From 5890a353e6a158ff1b30a12565a6864f4c047f55 Mon Sep 17 00:00:00 2001 From: Rob Hess Date: Fri, 13 Jun 2014 18:16:04 -0700 Subject: [PATCH 0186/2053] Add parameter for AccuracyLayer in proto. --- src/caffe/proto/caffe.proto | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index fd71f45fab4..48d6fe27ed8 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -188,6 +188,7 @@ message LayerParameter { // The weight decay that is multiplied on the global weight decay. repeated float weight_decay = 8; + optional AccuracyParameter accuracy_param = 27; optional ArgMaxParameter argmax_param = 23; optional ConcatParameter concat_param = 9; optional ConvolutionParameter convolution_param = 10; @@ -214,6 +215,14 @@ message LayerParameter { optional V0LayerParameter layer = 1; } +// Message that stores parameters used by AccuracyLayer +message AccuracyParameter { + // When computing accuracy, count as correct by comparing the true label to + // the top k scoring classes. By default, only compare to the top scoring + // class (i.e. argmax). + optional uint32 compare_to_top_k = 1 [default = 1]; +} + // Message that stores parameters used by ArgMaxLayer message ArgMaxParameter { // If true produce pairs (argmax, maxval) From 1c640c976b113839514ca5b70a28f6a921cf9eb2 Mon Sep 17 00:00:00 2001 From: Rob Hess Date: Fri, 13 Jun 2014 19:07:38 -0700 Subject: [PATCH 0187/2053] Incorporate top_k param into AccuracyLayer and check it's value. --- include/caffe/loss_layers.hpp | 2 ++ src/caffe/layers/accuracy_layer.cpp | 3 +++ src/caffe/proto/caffe.proto | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index bb03f637450..3a4d41662fd 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -251,6 +251,8 @@ class AccuracyLayer : public Layer { const vector& propagate_down, vector*>* bottom) { NOT_IMPLEMENTED; } + + int top_k_; }; } // namespace caffe diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 899750f869a..55f620d8af6 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -18,8 +18,11 @@ template void AccuracyLayer::SetUp( const vector*>& bottom, vector*>* top) { Layer::SetUp(bottom, top); + top_k_ = this->layer_param_.accuracy_param().top_k(); CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; + CHECK_LE(top_k_, bottom[0]->count() / bottom[0]->num()) + << "top_k must be less than the number of classes."; CHECK_EQ(bottom[1]->channels(), 1); CHECK_EQ(bottom[1]->height(), 1); CHECK_EQ(bottom[1]->width(), 1); diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 48d6fe27ed8..936a215e131 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -220,7 +220,7 @@ message AccuracyParameter { // When computing accuracy, count as correct by comparing the true label to // the top k scoring classes. By default, only compare to the top scoring // class (i.e. argmax). - optional uint32 compare_to_top_k = 1 [default = 1]; + optional uint32 top_k = 1 [default = 1]; } // Message that stores parameters used by ArgMaxLayer From 5a887fc30fba742501ad395165d3f0968738db04 Mon Sep 17 00:00:00 2001 From: Rob Hess Date: Mon, 16 Jun 2014 13:35:46 -0700 Subject: [PATCH 0188/2053] Compute top-k accuracy in AccuracyLayer. --- src/caffe/layers/accuracy_layer.cpp | 34 +++++++++++++++++++---------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 55f620d8af6..a284f6b191a 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -22,7 +22,7 @@ void AccuracyLayer::SetUp( CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; CHECK_LE(top_k_, bottom[0]->count() / bottom[0]->num()) - << "top_k must be less than the number of classes."; + << "top_k must be less than or equal to the number of classes."; CHECK_EQ(bottom[1]->channels(), 1); CHECK_EQ(bottom[1]->height(), 1); CHECK_EQ(bottom[1]->width(), 1); @@ -37,20 +37,32 @@ Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, const Dtype* bottom_label = bottom[1]->cpu_data(); int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); + Dtype* maxval = new Dtype[top_k_+1]; + int* max_id = new int[top_k_+1]; for (int i = 0; i < num; ++i) { - // Accuracy - Dtype maxval = -FLT_MAX; - int max_id = 0; - for (int j = 0; j < dim; ++j) { - if (bottom_data[i * dim + j] > maxval) { - maxval = bottom_data[i * dim + j]; - max_id = j; + // Top-k accuracy + std::fill_n(maxval, top_k_, -FLT_MAX); + std::fill_n(max_id, top_k_, 0); + for (int j = 0, k; j < dim; ++j) { + // insert into (reverse-)sorted top-k array + Dtype val = bottom_data[i * dim + j]; + for (k = top_k_; k > 0 && maxval[k-1] < val; k--) { + maxval[k] = maxval[k-1]; + max_id[k] = max_id[k-1]; } + maxval[k] = val; + max_id[k] = j; } - if (max_id == static_cast(bottom_label[i])) { - ++accuracy; - } + // check if true label is in top k predictions + for (int k = 0; k < top_k_; k++) + if (max_id[k] == static_cast(bottom_label[i])) { + ++accuracy; + break; + } } + delete[] maxval; + delete[] max_id; + // LOG(INFO) << "Accuracy: " << accuracy; (*top)[0]->mutable_cpu_data()[0] = accuracy / num; From fde99cce7735a7362f458a8592e4662965734482 Mon Sep 17 00:00:00 2001 From: Rob Hess Date: Thu, 19 Jun 2014 15:12:56 -0700 Subject: [PATCH 0189/2053] Use vectors instead of arrays. --- src/caffe/layers/accuracy_layer.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index a284f6b191a..409965519ca 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -37,12 +37,12 @@ Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, const Dtype* bottom_label = bottom[1]->cpu_data(); int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); - Dtype* maxval = new Dtype[top_k_+1]; - int* max_id = new int[top_k_+1]; + vector maxval(top_k_+1); + vector max_id(top_k_+1); for (int i = 0; i < num; ++i) { // Top-k accuracy - std::fill_n(maxval, top_k_, -FLT_MAX); - std::fill_n(max_id, top_k_, 0); + std::fill_n(maxval.begin(), top_k_, -FLT_MAX); + std::fill_n(max_id.begin(), top_k_, 0); for (int j = 0, k; j < dim; ++j) { // insert into (reverse-)sorted top-k array Dtype val = bottom_data[i * dim + j]; @@ -60,8 +60,6 @@ Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, break; } } - delete[] maxval; - delete[] max_id; // LOG(INFO) << "Accuracy: " << accuracy; (*top)[0]->mutable_cpu_data()[0] = accuracy / num; From cca6500874f35fc051eab76230e96eda2ff24688 Mon Sep 17 00:00:00 2001 From: cypof Date: Thu, 19 Jun 2014 15:52:10 -0700 Subject: [PATCH 0190/2053] Next LayerParameter proto id --- src/caffe/proto/caffe.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 936a215e131..e42c208ecb5 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -115,7 +115,7 @@ message SolverState { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 27 (last added: dummy_data_param) +// LayerParameter next available ID: 28 (last added: dummy_data_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs From e2e443b27e032f04e08fe2469363897a7702036f Mon Sep 17 00:00:00 2001 From: Rob Hess Date: Fri, 20 Jun 2014 14:37:07 -0700 Subject: [PATCH 0191/2053] Add unit test for accuracy layer. --- src/caffe/test/test_accuracy_layer.cpp | 90 ++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/caffe/test/test_accuracy_layer.cpp diff --git a/src/caffe/test/test_accuracy_layer.cpp b/src/caffe/test/test_accuracy_layer.cpp new file mode 100644 index 00000000000..f87089b6c8b --- /dev/null +++ b/src/caffe/test/test_accuracy_layer.cpp @@ -0,0 +1,90 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include +#include +#include + +#include "cuda_runtime.h" +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; + +template +class AccuracyLayerTest : public ::testing::Test { + protected: + AccuracyLayerTest() + : blob_bottom_data_(new Blob(2, 10, 1, 1)), + blob_bottom_label_(new Blob(2, 1, 1, 1)), + blob_top_(new Blob()), + top_k_(3) { + // fill the probability values + FillerParameter filler_param; + GaussianFiller filler(filler_param); + filler.Fill(this->blob_bottom_data_); + + // set the labels; first label is set to max-probability index + Dtype m_val = -FLT_MAX; + int m_id = 0; + for (int i = 0; i < 10; i++) + if (blob_bottom_data_->data_at(0, i, 0, 0) > m_val) { + m_val = blob_bottom_data_->data_at(0, i, 0, 0); + m_id = i; + } + Dtype* label_data = blob_bottom_label_->mutable_cpu_data(); + int offset = blob_bottom_label_->offset(0); + label_data[offset] = m_id; + + // set the labels; first label is set to min-probability index + m_val = FLT_MAX; + m_id = 0; + for (int i = 0; i < 10; i++) + if (blob_bottom_data_->data_at(1, i, 0, 0) < m_val) { + m_val = blob_bottom_data_->data_at(1, i, 0, 0); + m_id = i; + } + offset = blob_bottom_label_->offset(1); + label_data[offset] = m_id; + + blob_bottom_vec_.push_back(blob_bottom_data_); + blob_bottom_vec_.push_back(blob_bottom_label_); + blob_top_vec_.push_back(blob_top_); + } + virtual ~AccuracyLayerTest() { + delete blob_bottom_data_; + delete blob_bottom_label_; + delete blob_top_; + } + Blob* const blob_bottom_data_; + Blob* const blob_bottom_label_; + Blob* const blob_top_; + vector*> blob_bottom_vec_; + vector*> blob_top_vec_; + int top_k_; +}; + +typedef ::testing::Types Dtypes; +TYPED_TEST_CASE(AccuracyLayerTest, Dtypes); + +TYPED_TEST(AccuracyLayerTest, TestForwardCPU) { + LayerParameter layer_param; + AccuracyParameter* accuracy_param = layer_param.mutable_accuracy_param(); + accuracy_param->set_top_k(this->top_k_); + Caffe::set_mode(Caffe::CPU); + AccuracyLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + + // Output accuracy should be ~0.5 + EXPECT_NEAR(this->blob_top_->data_at(0, 0, 0, 0), 0.5, 1e-4); +} + +} // namespace caffe From 4a57e726c83d54c251392101d5bb9888cd1c1d78 Mon Sep 17 00:00:00 2001 From: Rob Hess Date: Fri, 20 Jun 2014 14:39:58 -0700 Subject: [PATCH 0192/2053] Update name of last added param. --- src/caffe/proto/caffe.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index e42c208ecb5..adb75264f8e 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -115,7 +115,7 @@ message SolverState { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 28 (last added: dummy_data_param) +// LayerParameter next available ID: 28 (last added: accuracy_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs From 228c3266377330cd46b36cec3343a0fc1980976f Mon Sep 17 00:00:00 2001 From: Rob Hess Date: Mon, 23 Jun 2014 17:22:43 -0700 Subject: [PATCH 0193/2053] Comment-fix. --- src/caffe/test/test_accuracy_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/test/test_accuracy_layer.cpp b/src/caffe/test/test_accuracy_layer.cpp index f87089b6c8b..deb72af34ec 100644 --- a/src/caffe/test/test_accuracy_layer.cpp +++ b/src/caffe/test/test_accuracy_layer.cpp @@ -43,7 +43,7 @@ class AccuracyLayerTest : public ::testing::Test { int offset = blob_bottom_label_->offset(0); label_data[offset] = m_id; - // set the labels; first label is set to min-probability index + // set the labels; second label is set to min-probability index m_val = FLT_MAX; m_id = 0; for (int i = 0; i < 10; i++) From a63feadb088f1fdcfc0cdc5d1ec73978f574375e Mon Sep 17 00:00:00 2001 From: James Thewlis Date: Sat, 28 Jun 2014 00:49:53 +0100 Subject: [PATCH 0194/2053] Fix building tests with parallel make The changes for .cu tests meant that creating TEST_BUILD_DIR wasn't happening first --- Makefile | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 14072747b19..6d8cb905128 100644 --- a/Makefile +++ b/Makefile @@ -116,8 +116,11 @@ TOOL_BINS := ${TOOL_OBJS:.o=.bin} EXAMPLE_BINS := ${EXAMPLE_OBJS:.o=.bin} # Put the test binaries in build/test for convenience. TEST_BIN_DIR := $(BUILD_DIR)/test -TEST_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ - $(foreach obj,$(TEST_OBJS),$(basename $(notdir $(obj)))))) +TEST_CU_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ + $(foreach obj,$(TEST_CU_OBJS),$(basename $(notdir $(obj)))))) +TEST_CXX_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ + $(foreach obj,$(TEST_CXX_OBJS),$(basename $(notdir $(obj)))))) +TEST_BINS := $(TEST_CXX_BINS) $(TEST_CU_BINS) TEST_ALL_BIN := $(TEST_BIN_DIR)/test_all.testbin ############################## @@ -343,7 +346,13 @@ $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo -$(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.*o $(GTEST_OBJ) $(STATIC_NAME) \ +$(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.cuo $(GTEST_OBJ) $(STATIC_NAME) \ + | $(TEST_BIN_DIR) + $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_NAME) \ + -o $@ $(LINKFLAGS) $(LDFLAGS) + @ echo + +$(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_NAME) \ -o $@ $(LINKFLAGS) $(LDFLAGS) From aa654a5daea5e6f6f5c5514687ed75662637901e Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 27 Jun 2014 18:54:08 -0700 Subject: [PATCH 0195/2053] Modify Dropout to allow backward pass in TEST phase Conflicts: src/caffe/layers/dropout_layer.cpp src/caffe/layers/dropout_layer.cu --- src/caffe/layers/dropout_layer.cpp | 13 ++++++++----- src/caffe/layers/dropout_layer.cu | 19 +++++++++++-------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index e9a1a524d63..a3501bf518c 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -49,14 +49,17 @@ template void DropoutLayer::Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - CHECK(Caffe::phase() == Caffe::TRAIN); if (propagate_down[0]) { const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const unsigned int* mask = rand_vec_->cpu_data(); - const int count = (*bottom)[0]->count(); - for (int i = 0; i < count; ++i) { - bottom_diff[i] = top_diff[i] * mask[i] * scale_; + if (Caffe::phase() == Caffe::TRAIN) { + const unsigned int* mask = rand_vec_->cpu_data(); + const int count = (*bottom)[0]->count(); + for (int i = 0; i < count; ++i) { + bottom_diff[i] = top_diff[i] * mask[i] * scale_; + } + } else { + caffe_copy(top[0]->count(), top_diff, bottom_diff); } } } diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 2c7226402e8..0040d263803 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -58,17 +58,20 @@ template void DropoutLayer::Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - CHECK(Caffe::phase() == Caffe::TRAIN); if (propagate_down[0]) { const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - const unsigned int* mask = - static_cast(rand_vec_->gpu_data()); - const int count = (*bottom)[0]->count(); - // NOLINT_NEXT_LINE(whitespace/operators) - DropoutBackward<<>>( - count, top_diff, mask, uint_thres_, scale_, bottom_diff); - CUDA_POST_KERNEL_CHECK; + if (Caffe::phase() == Caffe::TRAIN) { + const unsigned int* mask = + static_cast(rand_vec_->gpu_data()); + const int count = (*bottom)[0]->count(); + // NOLINT_NEXT_LINE(whitespace/operators) + DropoutBackward<<>>( + count, top_diff, mask, uint_thres_, scale_, bottom_diff); + CUDA_POST_KERNEL_CHECK; + } else { + caffe_gpu_copy(top[0]->count(), bottom_data, top_data); + } } } From ae83a22e5805612f07264b7f2ac30986317e7624 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 13 Jun 2014 18:54:28 -0700 Subject: [PATCH 0196/2053] Fix var names in Dropout.cu --- src/caffe/layers/dropout_layer.cu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 0040d263803..2e0b0d3aa2c 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -70,7 +70,7 @@ void DropoutLayer::Backward_gpu(const vector*>& top, count, top_diff, mask, uint_thres_, scale_, bottom_diff); CUDA_POST_KERNEL_CHECK; } else { - caffe_gpu_copy(top[0]->count(), bottom_data, top_data); + caffe_gpu_copy(top[0]->count(), top_diff, bottom_diff); } } } From 06da1a7de277763164c8bf0c700429785b531c09 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sat, 14 Jun 2014 08:39:35 -0700 Subject: [PATCH 0197/2053] Added test to Dropout to check gradients during Test phase --- src/caffe/layers/dropout_layer.cu | 3 ++- src/caffe/test/test_neuron_layer.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 2e0b0d3aa2c..225e0919409 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -66,7 +66,8 @@ void DropoutLayer::Backward_gpu(const vector*>& top, static_cast(rand_vec_->gpu_data()); const int count = (*bottom)[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) - DropoutBackward<<>>( + DropoutBackward<<>>( count, top_diff, mask, uint_thres_, scale_, bottom_diff); CUDA_POST_KERNEL_CHECK; } else { diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index ca70e1acd9b..c7c0dc1675d 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -178,6 +178,15 @@ TYPED_TEST(NeuronLayerTest, TestDropoutGradientCPU) { &(this->blob_top_vec_)); } +TYPED_TEST(NeuronLayerTest, TestDropoutGradientCPUTest) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::CPU); + Caffe::set_phase(Caffe::TEST); + DropoutLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} TYPED_TEST(NeuronLayerTest, TestDropoutCPUTestPhase) { LayerParameter layer_param; @@ -232,6 +241,22 @@ TYPED_TEST(NeuronLayerTest, TestDropoutGradientGPU) { } } +TYPED_TEST(NeuronLayerTest, TestDropoutGradientGPUTest) { + if (CAFFE_TEST_CUDA_PROP.major >= 2) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::GPU); + Caffe::set_phase(Caffe::TEST); + DropoutLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + // it is too expensive to call curand multiple times, so we don't do an + // exhaustive gradient check. + checker.CheckGradient(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + } else { + LOG(ERROR) << "Skipping test to spare my laptop."; + } +} + TYPED_TEST(NeuronLayerTest, TestDropoutGPUTestPhase) { LayerParameter layer_param; From 2dd0bc13b51d456a1cd1aaa2dbaf7372baeda7b3 Mon Sep 17 00:00:00 2001 From: Sergio Date: Wed, 18 Jun 2014 18:49:14 -0700 Subject: [PATCH 0198/2053] Check that pointers are different before copying in caffe_copy and caffe_gpu_copy --- src/caffe/util/math_functions.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index 67274ef73cc..90df51248e2 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -151,22 +151,30 @@ void caffe_add_scalar(const int N, const double alpha, double* Y) { template <> void caffe_copy(const int N, const float* X, float* Y) { - cblas_scopy(N, X, 1, Y, 1); + if (X != Y) { + cblas_scopy(N, X, 1, Y, 1); + } } template <> void caffe_copy(const int N, const double* X, double* Y) { - cblas_dcopy(N, X, 1, Y, 1); + if (X != Y) { + cblas_dcopy(N, X, 1, Y, 1); + } } template <> void caffe_gpu_copy(const int N, const float* X, float* Y) { - CUBLAS_CHECK(cublasScopy(Caffe::cublas_handle(), N, X, 1, Y, 1)); + if (X != Y) { + CUBLAS_CHECK(cublasScopy(Caffe::cublas_handle(), N, X, 1, Y, 1)); + } } template <> void caffe_gpu_copy(const int N, const double* X, double* Y) { - CUBLAS_CHECK(cublasDcopy(Caffe::cublas_handle(), N, X, 1, Y, 1)); + if (X != Y) { + CUBLAS_CHECK(cublasDcopy(Caffe::cublas_handle(), N, X, 1, Y, 1)); + } } template <> From 5316ca0a06efe71eed59dc4eef1f17606c8f2b56 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sat, 28 Jun 2014 10:22:13 -0700 Subject: [PATCH 0199/2053] Remove Cuda.major >= 2 check on Dropout test --- src/caffe/test/test_neuron_layer.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index c7c0dc1675d..a439128a13b 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -226,7 +226,6 @@ TYPED_TEST(NeuronLayerTest, TestDropoutGPU) { TYPED_TEST(NeuronLayerTest, TestDropoutGradientGPU) { - if (CAFFE_TEST_CUDA_PROP.major >= 2) { LayerParameter layer_param; Caffe::set_mode(Caffe::GPU); Caffe::set_phase(Caffe::TRAIN); @@ -236,13 +235,9 @@ TYPED_TEST(NeuronLayerTest, TestDropoutGradientGPU) { // exhaustive gradient check. checker.CheckGradient(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); - } else { - LOG(ERROR) << "Skipping test to spare my laptop."; - } } TYPED_TEST(NeuronLayerTest, TestDropoutGradientGPUTest) { - if (CAFFE_TEST_CUDA_PROP.major >= 2) { LayerParameter layer_param; Caffe::set_mode(Caffe::GPU); Caffe::set_phase(Caffe::TEST); @@ -252,9 +247,6 @@ TYPED_TEST(NeuronLayerTest, TestDropoutGradientGPUTest) { // exhaustive gradient check. checker.CheckGradient(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); - } else { - LOG(ERROR) << "Skipping test to spare my laptop."; - } } From e6a46c2be6f5917c84198de49848887daa28098a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 28 Jun 2014 13:54:58 -0700 Subject: [PATCH 0200/2053] lint --- src/caffe/layers/multinomial_logistic_loss_layer.cpp | 2 +- src/caffe/net.cpp | 1 + tools/compute_image_mean.cpp | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index 013d4034240..dd5cae44d6d 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -35,7 +35,7 @@ Dtype MultinomialLogisticLossLayer::Forward_cpu( Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); loss -= log(prob); } - if (top->size() == 1){ + if (top->size() == 1) { (*top)[0]->mutable_cpu_data()[0] = loss / num; } return loss / num; diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index f364e6767c6..c0f124b0ea7 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "caffe/common.hpp" diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 5b212b66edd..a7cbc8bd6b1 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -53,7 +53,7 @@ int main(int argc, char** argv) { } else if (db_backend == "lmdb") { // lmdb LOG(INFO) << "Opening lmdb " << argv[1]; CHECK_EQ(mdb_env_create(&mdb_env), MDB_SUCCESS) << "mdb_env_create failed"; - CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS); // 1TB + CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS); // 1TB CHECK_EQ(mdb_env_open(mdb_env, argv[1], MDB_RDONLY, 0664), MDB_SUCCESS) << "mdb_env_open failed"; CHECK_EQ(mdb_txn_begin(mdb_env, NULL, MDB_RDONLY, &mdb_txn), MDB_SUCCESS) From fae9b13f717789084275c546619adc79452fe44e Mon Sep 17 00:00:00 2001 From: yzhuan <465022947@qq.com> Date: Mon, 30 Jun 2014 16:08:55 +0800 Subject: [PATCH 0201/2053] Update Makefile.config.example fix some typing error --- Makefile.config.example | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile.config.example b/Makefile.config.example index 73c3740b1c7..6c3948fc2d7 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -13,9 +13,9 @@ CUDA_DIR := /usr/local/cuda CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \ -gencode arch=compute_20,code=sm_21 \ -gencode arch=compute_30,code=sm_30 \ - -gencode arch=compute_35,code=sm_35 - #-gencode=arch=compute_50,code=sm_50 \ - #-gencode=arch=compute_50,code=compute_50 + -gencode arch=compute_35,code=sm_35 \ + #-gencode arch=compute_50,code=sm_50 \ + #-gencode arch=compute_50,code=compute_50 # BLAS choice: # atlas for ATLAS (default) From 9dc87346005c5676aaaa62b17d6d1749ab56bb6c Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 1 Jul 2014 10:15:29 -0700 Subject: [PATCH 0202/2053] fix uninitialized variable warnings in tools --- tools/compute_image_mean.cpp | 2 +- tools/convert_imageset.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index a7cbc8bd6b1..0c0f0f3f7e5 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -32,7 +32,7 @@ int main(int argc, char** argv) { leveldb::DB* db; leveldb::Options options; options.create_if_missing = false; - leveldb::Iterator* it; + leveldb::Iterator* it = NULL; // lmdb MDB_env* mdb_env; MDB_dbi mdb_dbi; diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index c4bc0b32439..28de653b2c7 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -93,7 +93,7 @@ int main(int argc, char** argv) { options.error_if_exists = true; options.create_if_missing = true; options.write_buffer_size = 268435456; - leveldb::WriteBatch* batch; + leveldb::WriteBatch* batch = NULL; // Open db if (db_backend == "leveldb") { // leveldb From eada9dbdb5084fdcfb89b9da4bbcf825c1a84477 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 3 Jul 2014 20:15:53 +0800 Subject: [PATCH 0203/2053] Separate layers relatively independent of images out of vision_layers --- include/caffe/common_layers.hpp | 182 ++++++++++++++++++++++++++++++++ include/caffe/vision_layers.hpp | 165 +---------------------------- 2 files changed, 185 insertions(+), 162 deletions(-) create mode 100644 include/caffe/common_layers.hpp diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp new file mode 100644 index 00000000000..761c19fa7e2 --- /dev/null +++ b/include/caffe/common_layers.hpp @@ -0,0 +1,182 @@ +// Copyright 2014 BVLC and contributors. + +#ifndef CAFFE_COMMON_LAYERS_HPP_ +#define CAFFE_COMMON_LAYERS_HPP_ + +#include +#include +#include + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/layer.hpp" +#include "caffe/neuron_layers.hpp" +#include "caffe/loss_layers.hpp" +#include "caffe/data_layers.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +/* ArgmaxLayer + Compute the index of the max value across all (channels x height x width). + [In the future, can take specific dimension.] + Intended for use after a classification layer to produce prediction. + If parameter out_max_val is set to true, then output is a vector of pairs + (max_ind, max_val) for each image. + + NOTE: does not implement Backwards operation. +*/ +template +class ArgMaxLayer : public Layer { + public: + explicit ArgMaxLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_ARGMAX; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) { + NOT_IMPLEMENTED; + } + bool out_max_val_; +}; + +/* ConcatLayer + Takes at least two blobs and concatenates them along either num or + channel dim, outputting the result. +*/ +template +class ConcatLayer : public Layer { + public: + explicit ConcatLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_CONCAT; + } + virtual inline int MinBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + + Blob col_bob_; + int count_; + int num_; + int channels_; + int height_; + int width_; + int concat_dim_; +}; + +/* FlattenLayer +*/ +template +class FlattenLayer : public Layer { + public: + explicit FlattenLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_FLATTEN; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + + int count_; +}; + +/* SoftmaxLayer +*/ +template +class SoftmaxLayer : public Layer { + public: + explicit SoftmaxLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SOFTMAX; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + + // sum_multiplier is just used to carry out sum using blas + Blob sum_multiplier_; + // scale is an intermediate blob to hold temporary results. + Blob scale_; +}; + +/* SplitLayer +*/ +template +class SplitLayer : public Layer { + public: + explicit SplitLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SPLIT; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int MinTopBlobs() const { return 1; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + + int count_; +}; + +} // namespace caffe + +#endif // CAFFE_COMMON_LAYERS_HPP_ diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index b68dcbf6e83..ef04772a98c 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -9,84 +9,15 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" +#include "caffe/common_layers.hpp" +#include "caffe/data_layers.hpp" #include "caffe/layer.hpp" -#include "caffe/neuron_layers.hpp" #include "caffe/loss_layers.hpp" -#include "caffe/data_layers.hpp" +#include "caffe/neuron_layers.hpp" #include "caffe/proto/caffe.pb.h" namespace caffe { -/* ArgmaxLayer - Compute the index of the max value across all (channels x height x width). - [In the future, can take specific dimension.] - Intended for use after a classification layer to produce prediction. - If parameter out_max_val is set to true, then output is a vector of pairs - (max_ind, max_val) for each image. - - NOTE: does not implement Backwards operation. -*/ -template -class ArgMaxLayer : public Layer { - public: - explicit ArgMaxLayer(const LayerParameter& param) - : Layer(param) {} - virtual void SetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_ARGMAX; - } - virtual inline int ExactNumBottomBlobs() const { return 1; } - virtual inline int ExactNumTopBlobs() const { return 1; } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) { - NOT_IMPLEMENTED; - } - bool out_max_val_; -}; - -/* ConcatLayer - Takes at least two blobs and concatenates them along either num or - channel dim, outputting the result. -*/ -template -class ConcatLayer : public Layer { - public: - explicit ConcatLayer(const LayerParameter& param) - : Layer(param) {} - virtual void SetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_CONCAT; - } - virtual inline int MinBottomBlobs() const { return 2; } - virtual inline int ExactNumTopBlobs() const { return 1; } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - - Blob col_bob_; - int count_; - int num_; - int channels_; - int height_; - int width_; - int concat_dim_; -}; - /* ConvolutionLayer */ template @@ -161,35 +92,6 @@ class EltwiseLayer : public Layer { vector coeffs_; }; -/* FlattenLayer -*/ -template -class FlattenLayer : public Layer { - public: - explicit FlattenLayer(const LayerParameter& param) - : Layer(param) {} - virtual void SetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_FLATTEN; - } - virtual inline int ExactNumBottomBlobs() const { return 1; } - virtual inline int ExactNumTopBlobs() const { return 1; } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - - int count_; -}; - /* Im2colLayer */ template @@ -373,67 +275,6 @@ class PoolingLayer : public Layer { shared_ptr > max_idx_; }; -/* SoftmaxLayer -*/ -template -class SoftmaxLayer : public Layer { - public: - explicit SoftmaxLayer(const LayerParameter& param) - : Layer(param) {} - virtual void SetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SOFTMAX; - } - virtual inline int ExactNumBottomBlobs() const { return 1; } - virtual inline int ExactNumTopBlobs() const { return 1; } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - - // sum_multiplier is just used to carry out sum using blas - Blob sum_multiplier_; - // scale is an intermediate blob to hold temporary results. - Blob scale_; -}; - -/* SplitLayer -*/ -template -class SplitLayer : public Layer { - public: - explicit SplitLayer(const LayerParameter& param) - : Layer(param) {} - virtual void SetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SPLIT; - } - virtual inline int ExactNumBottomBlobs() const { return 1; } - virtual inline int MinTopBlobs() const { return 1; } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - - int count_; -}; - } // namespace caffe #endif // CAFFE_VISION_LAYERS_HPP_ From 8e1689faa55f4e7dc57a222792eb80e0afe1a3a7 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 3 Jul 2014 20:16:54 +0800 Subject: [PATCH 0204/2053] Arrange the data layers to be in alphabetical order --- include/caffe/data_layers.hpp | 137 +++++++++++++++++----------------- 1 file changed, 68 insertions(+), 69 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 2c6be551d8f..06c90ea9923 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -24,75 +24,6 @@ namespace caffe { #define HDF5_DATA_DATASET_NAME "data" #define HDF5_DATA_LABEL_NAME "label" -template -class HDF5OutputLayer : public Layer { - public: - explicit HDF5OutputLayer(const LayerParameter& param); - virtual ~HDF5OutputLayer(); - virtual void SetUp(const vector*>& bottom, - vector*>* top) {} - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_HDF5_OUTPUT; - } - // TODO: no limit on the number of blobs - virtual inline int ExactNumBottomBlobs() const { return 2; } - virtual inline int ExactNumTopBlobs() const { return 0; } - - inline std::string file_name() const { return file_name_; } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - virtual void SaveBlobs(); - - std::string file_name_; - hid_t file_id_; - Blob data_blob_; - Blob label_blob_; -}; - - -template -class HDF5DataLayer : public Layer { - public: - explicit HDF5DataLayer(const LayerParameter& param) - : Layer(param) {} - virtual ~HDF5DataLayer(); - virtual void SetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_HDF5_DATA; - } - virtual inline int ExactNumBottomBlobs() const { return 0; } - virtual inline int ExactNumTopBlobs() const { return 2; } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) {} - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) {} - virtual void LoadHDF5FileData(const char* filename); - - std::vector hdf_filenames_; - unsigned int num_files_; - unsigned int current_file_; - hsize_t current_row_; - Blob data_blob_; - Blob label_blob_; -}; - // TODO: DataLayer, ImageDataLayer, and WindowDataLayer all have the // same basic structure and a lot of duplicated code. @@ -183,6 +114,74 @@ class DummyDataLayer : public Layer { vector refill_; }; +template +class HDF5DataLayer : public Layer { + public: + explicit HDF5DataLayer(const LayerParameter& param) + : Layer(param) {} + virtual ~HDF5DataLayer(); + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_HDF5_DATA; + } + virtual inline int ExactNumBottomBlobs() const { return 0; } + virtual inline int ExactNumTopBlobs() const { return 2; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) {} + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) {} + virtual void LoadHDF5FileData(const char* filename); + + std::vector hdf_filenames_; + unsigned int num_files_; + unsigned int current_file_; + hsize_t current_row_; + Blob data_blob_; + Blob label_blob_; +}; + +template +class HDF5OutputLayer : public Layer { + public: + explicit HDF5OutputLayer(const LayerParameter& param); + virtual ~HDF5OutputLayer(); + virtual void SetUp(const vector*>& bottom, + vector*>* top) {} + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_HDF5_OUTPUT; + } + // TODO: no limit on the number of blobs + virtual inline int ExactNumBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 0; } + + inline std::string file_name() const { return file_name_; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void SaveBlobs(); + + std::string file_name_; + hid_t file_id_; + Blob data_blob_; + Blob label_blob_; +}; + // This function is used to create a pthread that prefetches the data. template void* ImageDataLayerPrefetch(void* layer_pointer); From 97deb9101b5a555b135ddc9826ab2925536be69a Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 3 Jul 2014 20:17:41 +0800 Subject: [PATCH 0205/2053] Organize the loss layers in alphabetical order --- include/caffe/loss_layers.hpp | 206 +++++++++++++++++----------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 3a4d41662fd..fb7f5539674 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -22,6 +22,36 @@ namespace caffe { const float kLOG_THRESHOLD = 1e-20; +/* AccuracyLayer + Note: not an actual loss layer! Does not implement backwards step. + Computes the accuracy of argmax(a) with respect to b. +*/ +template +class AccuracyLayer : public Layer { + public: + explicit AccuracyLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_ACCURACY; + } + + virtual inline int ExactNumBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) { + NOT_IMPLEMENTED; + } + + int top_k_; +}; + /* LossLayer Takes two inputs of same num (a and b), and has no output. The gradient is propagated to a. @@ -45,67 +75,27 @@ class LossLayer : public Layer { } }; -// Forward declare SoftmaxLayer for use in SoftmaxWithLossLayer. -template class SoftmaxLayer; - -/* SoftmaxWithLossLayer - Implements softmax and computes the loss. - - It is preferred over separate softmax + multinomiallogisticloss - layers due to more numerically stable gradients. +/* EuclideanLossLayer + Compute the L_2 distance between the two inputs. - In test, this layer could be replaced by simple softmax layer. + loss = (1/2 \sum_i (a_i - b_i)^2) + a' = 1/I (a - b) */ template -class SoftmaxWithLossLayer : public Layer { +class EuclideanLossLayer : public LossLayer { public: - explicit SoftmaxWithLossLayer(const LayerParameter& param) - : Layer(param), softmax_layer_(new SoftmaxLayer(param)) {} - virtual void SetUp(const vector*>& bottom, + explicit EuclideanLossLayer(const LayerParameter& param) + : LossLayer(param), diff_() {} + virtual void FurtherSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SOFTMAX_LOSS; + return LayerParameter_LayerType_EUCLIDEAN_LOSS; } - virtual inline int MaxTopBlobs() const { return 2; } - // We cannot backpropagate to the labels; ignore force_backward for these - // inputs. + // Unlike most loss layers, in the EuclideanLossLayer we can backpropagate + // to both inputs. virtual inline bool AllowForceBackward(const int bottom_index) const { - return bottom_index != 1; - } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - - shared_ptr > softmax_layer_; - // prob stores the output probability of the layer. - Blob prob_; - // Vector holders to call the underlying softmax layer forward and backward. - vector*> softmax_bottom_vec_; - vector*> softmax_top_vec_; -}; - -/* SigmoidCrossEntropyLossLayer -*/ -template -class SigmoidCrossEntropyLossLayer : public LossLayer { - public: - explicit SigmoidCrossEntropyLossLayer(const LayerParameter& param) - : LossLayer(param), - sigmoid_layer_(new SigmoidLayer(param)), - sigmoid_output_(new Blob()) {} - virtual void FurtherSetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS; + return true; } protected: @@ -118,48 +108,26 @@ class SigmoidCrossEntropyLossLayer : public LossLayer { virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); - shared_ptr > sigmoid_layer_; - // sigmoid_output stores the output of the sigmoid layer. - shared_ptr > sigmoid_output_; - // Vector holders to call the underlying sigmoid layer forward and backward. - vector*> sigmoid_bottom_vec_; - vector*> sigmoid_top_vec_; + Blob diff_; }; -/* EuclideanLossLayer - Compute the L_2 distance between the two inputs. - - loss = (1/2 \sum_i (a_i - b_i)^2) - a' = 1/I (a - b) +/* HingeLossLayer */ template -class EuclideanLossLayer : public LossLayer { +class HingeLossLayer : public LossLayer { public: - explicit EuclideanLossLayer(const LayerParameter& param) - : LossLayer(param), diff_() {} - virtual void FurtherSetUp(const vector*>& bottom, - vector*>* top); + explicit HingeLossLayer(const LayerParameter& param) + : LossLayer(param) {} virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_EUCLIDEAN_LOSS; - } - // Unlike most loss layers, in the EuclideanLossLayer we can backpropagate - // to both inputs. - virtual inline bool AllowForceBackward(const int bottom_index) const { - return true; + return LayerParameter_LayerType_HINGE_LOSS; } protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, - vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - - Blob diff_; }; /* InfogainLossLayer @@ -185,16 +153,18 @@ class InfogainLossLayer : public LossLayer { Blob infogain_; }; -/* HingeLossLayer +/* MultinomialLogisticLossLayer */ template -class HingeLossLayer : public LossLayer { +class MultinomialLogisticLossLayer : public LossLayer { public: - explicit HingeLossLayer(const LayerParameter& param) + explicit MultinomialLogisticLossLayer(const LayerParameter& param) : LossLayer(param) {} + virtual void FurtherSetUp(const vector*>& bottom, + vector*>* top); virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_HINGE_LOSS; + return LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS; } protected: @@ -204,55 +174,85 @@ class HingeLossLayer : public LossLayer { const vector& propagate_down, vector*>* bottom); }; -/* MultinomialLogisticLossLayer +/* SigmoidCrossEntropyLossLayer */ template -class MultinomialLogisticLossLayer : public LossLayer { +class SigmoidCrossEntropyLossLayer : public LossLayer { public: - explicit MultinomialLogisticLossLayer(const LayerParameter& param) - : LossLayer(param) {} + explicit SigmoidCrossEntropyLossLayer(const LayerParameter& param) + : LossLayer(param), + sigmoid_layer_(new SigmoidLayer(param)), + sigmoid_output_(new Blob()) {} virtual void FurtherSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS; + return LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS; } protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + + shared_ptr > sigmoid_layer_; + // sigmoid_output stores the output of the sigmoid layer. + shared_ptr > sigmoid_output_; + // Vector holders to call the underlying sigmoid layer forward and backward. + vector*> sigmoid_bottom_vec_; + vector*> sigmoid_top_vec_; }; -/* AccuracyLayer - Note: not an actual loss layer! Does not implement backwards step. - Computes the accuracy of argmax(a) with respect to b. +// Forward declare SoftmaxLayer for use in SoftmaxWithLossLayer. +template class SoftmaxLayer; + +/* SoftmaxWithLossLayer + Implements softmax and computes the loss. + + It is preferred over separate softmax + multinomiallogisticloss + layers due to more numerically stable gradients. + + In test, this layer could be replaced by simple softmax layer. */ template -class AccuracyLayer : public Layer { +class SoftmaxWithLossLayer : public Layer { public: - explicit AccuracyLayer(const LayerParameter& param) - : Layer(param) {} + explicit SoftmaxWithLossLayer(const LayerParameter& param) + : Layer(param), softmax_layer_(new SoftmaxLayer(param)) {} virtual void SetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_ACCURACY; + return LayerParameter_LayerType_SOFTMAX_LOSS; + } + virtual inline int MaxTopBlobs() const { return 2; } + // We cannot backpropagate to the labels; ignore force_backward for these + // inputs. + virtual inline bool AllowForceBackward(const int bottom_index) const { + return bottom_index != 1; } - - virtual inline int ExactNumBottomBlobs() const { return 2; } - virtual inline int ExactNumTopBlobs() const { return 1; } protected: virtual Dtype Forward_cpu(const vector*>& bottom, vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) { - NOT_IMPLEMENTED; - } + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); - int top_k_; + shared_ptr > softmax_layer_; + // prob stores the output probability of the layer. + Blob prob_; + // Vector holders to call the underlying softmax layer forward and backward. + vector*> softmax_bottom_vec_; + vector*> softmax_top_vec_; }; } // namespace caffe From 872e6c5bc794c8535f4c6d7211f12e8c597dabf7 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 3 Jul 2014 14:39:35 -0700 Subject: [PATCH 0206/2053] add EqualNumBottomTopBlobs() property for layers; use in ConvolutionLayer --- include/caffe/layer.hpp | 9 +++++++++ include/caffe/vision_layers.hpp | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 690c36ba23f..b8afcfe37cf 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -84,6 +84,10 @@ class Layer { virtual inline int MinTopBlobs() const { return -1; } virtual inline int MaxTopBlobs() const { return -1; } + // EqualNumBottomTopBlobs should return true for layers requiring an equal + // number of bottom and top blobs. + virtual inline bool EqualNumBottomTopBlobs() const { return false; } + // Declare for each bottom blob whether to allow force_backward -- that is, // if AllowForceBackward(i) == false, we will ignore the force_backward // setting and backpropagate to blob i only if it needs gradient information @@ -156,6 +160,11 @@ class Layer { << type_name() << " Layer produces at most " << MaxTopBlobs() << " top blob(s) as output."; } + if (EqualNumBottomTopBlobs()) { + CHECK_EQ(bottom.size(), top.size()) + << type_name() << " Layer produces one top blob as output for each " + << "bottom blob input."; + } } DISABLE_COPY_AND_ASSIGN(Layer); diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index b68dcbf6e83..c9beebe6849 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -100,8 +100,9 @@ class ConvolutionLayer : public Layer { virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_CONVOLUTION; } - virtual inline int ExactNumBottomBlobs() const { return 1; } - virtual inline int ExactNumTopBlobs() const { return 1; } + virtual inline int MinBottomBlobs() const { return 1; } + virtual inline int MinTopBlobs() const { return 1; } + virtual inline bool EqualNumBottomTopBlobs() const { return true; } protected: virtual Dtype Forward_cpu(const vector*>& bottom, From a2b287472d7d85f997d2621bc4a2486c3837f6ba Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 3 Jul 2014 15:33:12 -0700 Subject: [PATCH 0207/2053] ConvolutionLayer can take N bottom blobs and N top blobs --- src/caffe/layers/conv_layer.cpp | 141 ++++++++++++---------- src/caffe/layers/conv_layer.cu | 124 ++++++++++--------- src/caffe/test/test_convolution_layer.cpp | 60 +++++++-- 3 files changed, 195 insertions(+), 130 deletions(-) diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 9ec8da47e1a..67913bfa574 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -22,6 +22,16 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); + // TODO: generalize to handle inputs of different shapes. + for (int bottom_id = 1; bottom_id < bottom.size(); ++bottom_id) { + CHECK_EQ(num_, bottom[bottom_id]->num()) << "Inputs must have same num."; + CHECK_EQ(channels_, bottom[bottom_id]->channels()) + << "Inputs must have same channels."; + CHECK_EQ(height_, bottom[bottom_id]->height()) + << "Inputs must have same height."; + CHECK_EQ(width_, bottom[bottom_id]->width()) + << "Inputs must have same width."; + } num_output_ = this->layer_param_.convolution_param().num_output(); CHECK_GT(num_output_, 0); CHECK_EQ(channels_ % group_, 0); @@ -39,7 +49,9 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, M_ = num_output_ / group_; K_ = channels_ * kernel_size_ * kernel_size_ / group_; N_ = height_out * width_out; - (*top)[0]->Reshape(bottom[0]->num(), num_output_, height_out, width_out); + for (int top_id = 0; top_id < top->size(); ++top_id) { + (*top)[top_id]->Reshape(num_, num_output_, height_out, width_out); + } // Check if we need to set up the weights if (this->blobs_.size() > 0) { LOG(INFO) << "Skipping parameter initialization"; @@ -56,7 +68,7 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, shared_ptr > weight_filler(GetFiller( this->layer_param_.convolution_param().weight_filler())); weight_filler->Fill(this->blobs_[0].get()); - // If necessary, intiialize and fill the bias term + // If necessary, initialize and fill the bias term if (bias_term_) { this->blobs_[1].reset(new Blob(1, 1, 1, num_output_)); shared_ptr > bias_filler(GetFiller( @@ -79,29 +91,31 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, template Dtype ConvolutionLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - Dtype* col_data = col_buffer_.mutable_cpu_data(); - const Dtype* weight = this->blobs_[0]->cpu_data(); - int weight_offset = M_ * K_; - int col_offset = K_ * N_; - int top_offset = M_ * N_; - for (int n = 0; n < num_; ++n) { - // First, im2col - im2col_cpu(bottom_data + bottom[0]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, col_data); - // Second, innerproduct with groups - for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, - (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, - (Dtype)0., top_data + (*top)[0]->offset(n) + top_offset * g); - } - // third, add bias - if (bias_term_) { - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num_output_, - N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), - reinterpret_cast(bias_multiplier_->cpu_data()), - (Dtype)1., top_data + (*top)[0]->offset(n)); + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->cpu_data(); + Dtype* top_data = (*top)[i]->mutable_cpu_data(); + Dtype* col_data = col_buffer_.mutable_cpu_data(); + const Dtype* weight = this->blobs_[0]->cpu_data(); + int weight_offset = M_ * K_; + int col_offset = K_ * N_; + int top_offset = M_ * N_; + for (int n = 0; n < num_; ++n) { + // First, im2col + im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, + width_, kernel_size_, pad_, stride_, col_data); + // Second, innerproduct with groups + for (int g = 0; g < group_; ++g) { + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, + (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, + (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); + } + // third, add bias + if (bias_term_) { + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num_output_, + N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), + reinterpret_cast(bias_multiplier_->cpu_data()), + (Dtype)1., top_data + (*top)[i]->offset(n)); + } } } return Dtype(0.); @@ -110,54 +124,57 @@ Dtype ConvolutionLayer::Forward_cpu(const vector*>& bottom, template void ConvolutionLayer::Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - const Dtype* top_diff = top[0]->cpu_diff(); const Dtype* weight = this->blobs_[0]->cpu_data(); Dtype* weight_diff = this->blobs_[0]->mutable_cpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - Dtype* col_data = col_buffer_.mutable_cpu_data(); - Dtype* col_diff = col_buffer_.mutable_cpu_diff(); - // bias gradient if necessary + memset(weight_diff, 0, sizeof(Dtype) * this->blobs_[0]->count()); Dtype* bias_diff = NULL; - if (bias_term_) { bias_diff = this->blobs_[1]->mutable_cpu_diff(); memset(bias_diff, 0, sizeof(Dtype) * this->blobs_[1]->count()); - for (int n = 0; n < num_; ++n) { - caffe_cpu_gemv(CblasNoTrans, num_output_, N_, - 1., top_diff + top[0]->offset(n), - reinterpret_cast(bias_multiplier_->cpu_data()), 1., - bias_diff); - } } + const int weight_offset = M_ * K_; + const int col_offset = K_ * N_; + const int top_offset = M_ * N_; + for (int i = 0; i < top.size(); ++i) { + const Dtype* top_diff = top[i]->cpu_diff(); + const Dtype* bottom_data = (*bottom)[i]->cpu_data(); + Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); + Dtype* col_data = col_buffer_.mutable_cpu_data(); + Dtype* col_diff = col_buffer_.mutable_cpu_diff(); - int weight_offset = M_ * K_; - int col_offset = K_ * N_; - int top_offset = M_ * N_; - memset(weight_diff, 0, sizeof(Dtype) * this->blobs_[0]->count()); - for (int n = 0; n < num_; ++n) { - // since we saved memory in the forward pass by not storing all col data, - // we will need to recompute them. - im2col_cpu(bottom_data + (*bottom)[0]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, col_data); - // gradient w.r.t. weight. Note that we will accumulate diffs. - for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, - (Dtype)1., top_diff + top[0]->offset(n) + top_offset * g, - col_data + col_offset * g, (Dtype)1., - weight_diff + weight_offset * g); + // Bias gradient, if necessary. + if (bias_term_) { + for (int n = 0; n < num_; ++n) { + caffe_cpu_gemv(CblasNoTrans, num_output_, N_, + 1., top_diff + top[0]->offset(n), + static_cast(bias_multiplier_->cpu_data()), 1., + bias_diff); + } } - // gradient w.r.t. bottom data, if necessary - if (propagate_down[0]) { + for (int n = 0; n < num_; ++n) { + // Since we saved memory in the forward pass by not storing all col data, + // we will need to recompute them. + im2col_cpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, + width_, kernel_size_, pad_, stride_, col_data); + // gradient w.r.t. weight. Note that we will accumulate diffs. for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, - (Dtype)1., weight + weight_offset * g, - top_diff + top[0]->offset(n) + top_offset * g, - (Dtype)0., col_diff + col_offset * g); + caffe_cpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, + (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, + col_data + col_offset * g, (Dtype)1., + weight_diff + weight_offset * g); + } + // gradient w.r.t. bottom data, if necessary + if (propagate_down[i]) { + for (int g = 0; g < group_; ++g) { + caffe_cpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, + (Dtype)1., weight + weight_offset * g, + top_diff + top[i]->offset(n) + top_offset * g, + (Dtype)0., col_diff + col_offset * g); + } + // col2im back to the data + col2im_cpu(col_diff, channels_, height_, width_, kernel_size_, pad_, + stride_, bottom_diff + (*bottom)[i]->offset(n)); } - // col2im back to the data - col2im_cpu(col_diff, channels_, height_, width_, kernel_size_, pad_, - stride_, bottom_diff + (*bottom)[0]->offset(n)); } } } diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 85f95fd32c9..71b00c9566b 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -13,29 +13,31 @@ namespace caffe { template Dtype ConvolutionLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { - const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); - Dtype* col_data = col_buffer_.mutable_gpu_data(); - const Dtype* weight = this->blobs_[0]->gpu_data(); - int weight_offset = M_ * K_; - int col_offset = K_ * N_; - int top_offset = M_ * N_; - for (int n = 0; n < num_; ++n) { - // First, im2col - im2col_gpu(bottom_data + bottom[0]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, col_data); - // Second, innerproduct with groups - for (int g = 0; g < group_; ++g) { - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, - (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, - (Dtype)0., top_data + (*top)[0]->offset(n) + top_offset * g); - } - // third, add bias - if (bias_term_) { - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num_output_, - N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), - reinterpret_cast(bias_multiplier_->gpu_data()), - (Dtype)1., top_data + (*top)[0]->offset(n)); + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->gpu_data(); + Dtype* top_data = (*top)[i]->mutable_gpu_data(); + Dtype* col_data = col_buffer_.mutable_gpu_data(); + const Dtype* weight = this->blobs_[0]->gpu_data(); + int weight_offset = M_ * K_; + int col_offset = K_ * N_; + int top_offset = M_ * N_; + for (int n = 0; n < num_; ++n) { + // First, im2col + im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, + width_, kernel_size_, pad_, stride_, col_data); + // Second, innerproduct with groups + for (int g = 0; g < group_; ++g) { + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, + (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, + (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); + } + // third, add bias + if (bias_term_) { + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num_output_, + N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), + reinterpret_cast(bias_multiplier_->gpu_data()), + (Dtype)1., top_data + (*top)[i]->offset(n)); + } } } return Dtype(0.); @@ -44,56 +46,58 @@ Dtype ConvolutionLayer::Forward_gpu(const vector*>& bottom, template void ConvolutionLayer::Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* weight = this->blobs_[0]->gpu_data(); Dtype* weight_diff = this->blobs_[0]->mutable_gpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + CUDA_CHECK(cudaMemset(weight_diff, 0, + sizeof(Dtype) * this->blobs_[0]->count())); Dtype* col_data = col_buffer_.mutable_gpu_data(); Dtype* col_diff = col_buffer_.mutable_gpu_diff(); - // bias gradient if necessary Dtype* bias_diff = NULL; - if (bias_term_) { bias_diff = this->blobs_[1]->mutable_gpu_diff(); CUDA_CHECK(cudaMemset(bias_diff, 0, sizeof(Dtype) * this->blobs_[1]->count())); - for (int n = 0; n < num_; ++n) { - caffe_gpu_gemv(CblasNoTrans, num_output_, N_, - 1., top_diff + top[0]->offset(n), - reinterpret_cast(bias_multiplier_->gpu_data()), - 1., bias_diff); - } } - - int weight_offset = M_ * K_; - int col_offset = K_ * N_; - int top_offset = M_ * N_; - CUDA_CHECK(cudaMemset(weight_diff, 0, - sizeof(Dtype) * this->blobs_[0]->count())); - for (int n = 0; n < num_; ++n) { - // since we saved memory in the forward pass by not storing all col data, - // we will need to recompute them. - im2col_gpu(bottom_data + (*bottom)[0]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, col_data); - // gradient w.r.t. weight. Note that we will accumulate diffs. - for (int g = 0; g < group_; ++g) { - caffe_gpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, - (Dtype)1., top_diff + top[0]->offset(n) + top_offset * g, - col_data + col_offset * g, (Dtype)1., - weight_diff + weight_offset * g); + const int weight_offset = M_ * K_; + const int col_offset = K_ * N_; + const int top_offset = M_ * N_; + for (int i = 0; i < top.size(); ++i) { + const Dtype* top_diff = top[i]->gpu_diff(); + const Dtype* bottom_data = (*bottom)[i]->gpu_data(); + Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); + // Bias gradient, if necessary. + if (bias_term_) { + for (int n = 0; n < num_; ++n) { + caffe_gpu_gemv(CblasNoTrans, num_output_, N_, + 1., top_diff + top[0]->offset(n), + static_cast(bias_multiplier_->gpu_data()), + 1., bias_diff); + } } - // gradient w.r.t. bottom data, if necessary - if (propagate_down[0]) { + for (int n = 0; n < num_; ++n) { + // since we saved memory in the forward pass by not storing all col data, + // we will need to recompute them. + im2col_gpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, + width_, kernel_size_, pad_, stride_, col_data); + // gradient w.r.t. weight. Note that we will accumulate diffs. for (int g = 0; g < group_; ++g) { - caffe_gpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, - (Dtype)1., weight + weight_offset * g, - top_diff + top[0]->offset(n) + top_offset * g, - (Dtype)0., col_diff + col_offset * g); + caffe_gpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, + (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, + col_data + col_offset * g, (Dtype)1., + weight_diff + weight_offset * g); + } + // gradient w.r.t. bottom data, if necessary + if (propagate_down[i]) { + for (int g = 0; g < group_; ++g) { + caffe_gpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, + (Dtype)1., weight + weight_offset * g, + top_diff + top[i]->offset(n) + top_offset * g, + (Dtype)0., col_diff + col_offset * g); + } + // col2im back to the data + col2im_gpu(col_diff, channels_, height_, width_, kernel_size_, pad_, + stride_, bottom_diff + (*bottom)[i]->offset(n)); } - // col2im back to the data - col2im_gpu(col_diff, channels_, height_, width_, kernel_size_, pad_, - stride_, bottom_diff + (*bottom)[0]->offset(n)); } } } diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index b08486e10a3..f7401015538 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -21,22 +21,32 @@ template class ConvolutionLayerTest : public ::testing::Test { protected: ConvolutionLayerTest() - : blob_bottom_(new Blob()), - blob_top_(new Blob()) {} + : blob_bottom_(new Blob(2, 3, 6, 4)), + blob_bottom_2_(new Blob(2, 3, 6, 4)), + blob_top_(new Blob()), + blob_top_2_(new Blob()) {} virtual void SetUp() { - blob_bottom_->Reshape(2, 3, 6, 4); // fill the values FillerParameter filler_param; filler_param.set_value(1.); GaussianFiller filler(filler_param); filler.Fill(this->blob_bottom_); + filler.Fill(this->blob_bottom_2_); blob_bottom_vec_.push_back(blob_bottom_); blob_top_vec_.push_back(blob_top_); } - virtual ~ConvolutionLayerTest() { delete blob_bottom_; delete blob_top_; } + virtual ~ConvolutionLayerTest() { + delete blob_bottom_; + delete blob_bottom_2_; + delete blob_top_; + delete blob_top_2_; + } + Blob* const blob_bottom_; + Blob* const blob_bottom_2_; Blob* const blob_top_; + Blob* const blob_top_2_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; }; @@ -51,6 +61,8 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { convolution_param->set_kernel_size(3); convolution_param->set_stride(2); convolution_param->set_num_output(4); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); shared_ptr > layer( new ConvolutionLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -58,6 +70,10 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { EXPECT_EQ(this->blob_top_->channels(), 4); EXPECT_EQ(this->blob_top_->height(), 2); EXPECT_EQ(this->blob_top_->width(), 1); + EXPECT_EQ(this->blob_top_2_->num(), 2); + EXPECT_EQ(this->blob_top_2_->channels(), 4); + EXPECT_EQ(this->blob_top_2_->height(), 2); + EXPECT_EQ(this->blob_top_2_->width(), 1); // setting group should not change the shape convolution_param->set_num_output(3); convolution_param->set_group(3); @@ -67,14 +83,24 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { EXPECT_EQ(this->blob_top_->channels(), 3); EXPECT_EQ(this->blob_top_->height(), 2); EXPECT_EQ(this->blob_top_->width(), 1); + EXPECT_EQ(this->blob_top_2_->num(), 2); + EXPECT_EQ(this->blob_top_2_->channels(), 3); + EXPECT_EQ(this->blob_top_2_->height(), 2); + EXPECT_EQ(this->blob_top_2_->width(), 1); } TYPED_TEST(ConvolutionLayerTest, TestCPUSimpleConvolution) { // We will simply see if the convolution layer carries out averaging well. + shared_ptr > filler; FillerParameter filler_param; filler_param.set_value(1.); - ConstantFiller filler(filler_param); - filler.Fill(this->blob_bottom_); + filler.reset(new ConstantFiller(filler_param)); + filler->Fill(this->blob_bottom_); + filler_param.set_value(2.); + filler.reset(new ConstantFiller(filler_param)); + filler->Fill(this->blob_bottom_2_); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); @@ -95,14 +121,24 @@ TYPED_TEST(ConvolutionLayerTest, TestCPUSimpleConvolution) { for (int i = 0; i < this->blob_top_->count(); ++i) { EXPECT_NEAR(top_data[i], 27.1, 1e-4); } + top_data = this->blob_top_2_->cpu_data(); + for (int i = 0; i < this->blob_top_2_->count(); ++i) { + EXPECT_NEAR(top_data[i], 54.1, 1e-4); + } } TYPED_TEST(ConvolutionLayerTest, TestGPUSimpleConvolution) { // We will simply see if the convolution layer carries out averaging well. + shared_ptr > filler; FillerParameter filler_param; filler_param.set_value(1.); - ConstantFiller filler(filler_param); - filler.Fill(this->blob_bottom_); + filler.reset(new ConstantFiller(filler_param)); + filler->Fill(this->blob_bottom_); + filler_param.set_value(2.); + filler.reset(new ConstantFiller(filler_param)); + filler->Fill(this->blob_bottom_2_); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); @@ -123,6 +159,10 @@ TYPED_TEST(ConvolutionLayerTest, TestGPUSimpleConvolution) { for (int i = 0; i < this->blob_top_->count(); ++i) { EXPECT_NEAR(top_data[i], 27.1, 1e-4); } + top_data = this->blob_top_2_->cpu_data(); + for (int i = 0; i < this->blob_top_2_->count(); ++i) { + EXPECT_NEAR(top_data[i], 54.1, 1e-4); + } } TYPED_TEST(ConvolutionLayerTest, TestCPUSimpleConvolutionGroup) { @@ -223,6 +263,8 @@ TYPED_TEST(ConvolutionLayerTest, TestCPUGradient) { LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); convolution_param->set_kernel_size(3); convolution_param->set_stride(2); convolution_param->set_num_output(2); @@ -256,6 +298,8 @@ TYPED_TEST(ConvolutionLayerTest, TestGPUGradient) { LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); convolution_param->set_kernel_size(3); convolution_param->set_stride(2); convolution_param->set_num_output(2); From 1fcd29fb9aaedb763f58a1702dedc4a1e3904422 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 27 Jun 2014 15:01:02 -0700 Subject: [PATCH 0208/2053] report UVA in platform test --- src/caffe/test/test_platform.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caffe/test/test_platform.cpp b/src/caffe/test/test_platform.cpp index c3868f34d9f..7cf8306e8c9 100644 --- a/src/caffe/test/test_platform.cpp +++ b/src/caffe/test/test_platform.cpp @@ -47,6 +47,8 @@ TEST_F(PlatformTest, TestInitialization) { CAFFE_TEST_CUDA_PROP.multiProcessorCount); printf("Kernel execution timeout: %s\n", (CAFFE_TEST_CUDA_PROP.kernelExecTimeoutEnabled ? "Yes" : "No")); + printf("Unified virtual addressing: %s\n", + (CAFFE_TEST_CUDA_PROP.unifiedAddressing ? "Yes" : "No")); EXPECT_TRUE(true); } From 9f74b6b129ab6ae161d569ce73d346553e04ec49 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 27 Jun 2014 18:36:48 -0700 Subject: [PATCH 0209/2053] switch to unified virtual addressing CUDA memcpy Host / device copies are distinguished by the virtual address of the pointers instead of explicit memcpy modes. --- matlab/caffe/matcaffe.cpp | 10 +++++----- src/caffe/blob.cpp | 4 ++-- src/caffe/layers/data_layer.cu | 4 ++-- src/caffe/layers/hdf5_data_layer.cu | 4 ++-- src/caffe/layers/hdf5_output_layer.cu | 4 ++-- src/caffe/layers/image_data_layer.cu | 4 ++-- src/caffe/layers/window_data_layer.cu | 4 ++-- src/caffe/syncedmem.cpp | 4 ++-- src/caffe/test/test_syncedmem.cpp | 4 ++-- 9 files changed, 21 insertions(+), 21 deletions(-) diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index 21f51e83994..1b2b65ec7d8 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -59,7 +59,7 @@ static mxArray* do_forward(const mxArray* const bottom) { break; case Caffe::GPU: cudaMemcpy(input_blobs[i]->mutable_gpu_data(), data_ptr, - sizeof(float) * input_blobs[i]->count(), cudaMemcpyHostToDevice); + sizeof(float) * input_blobs[i]->count(), cudaMemcpyDefault); break; default: LOG(FATAL) << "Unknown Caffe mode."; @@ -82,7 +82,7 @@ static mxArray* do_forward(const mxArray* const bottom) { break; case Caffe::GPU: cudaMemcpy(data_ptr, output_blobs[i]->gpu_data(), - sizeof(float) * output_blobs[i]->count(), cudaMemcpyDeviceToHost); + sizeof(float) * output_blobs[i]->count(), cudaMemcpyDefault); break; default: LOG(FATAL) << "Unknown Caffe mode."; @@ -109,7 +109,7 @@ static mxArray* do_backward(const mxArray* const top_diff) { break; case Caffe::GPU: cudaMemcpy(output_blobs[i]->mutable_gpu_diff(), data_ptr, - sizeof(float) * output_blobs[i]->count(), cudaMemcpyHostToDevice); + sizeof(float) * output_blobs[i]->count(), cudaMemcpyDefault); break; default: LOG(FATAL) << "Unknown Caffe mode."; @@ -134,7 +134,7 @@ static mxArray* do_backward(const mxArray* const top_diff) { break; case Caffe::GPU: cudaMemcpy(data_ptr, input_blobs[i]->gpu_diff(), - sizeof(float) * input_blobs[i]->count(), cudaMemcpyDeviceToHost); + sizeof(float) * input_blobs[i]->count(), cudaMemcpyDefault); break; default: LOG(FATAL) << "Unknown Caffe mode."; @@ -211,7 +211,7 @@ static mxArray* do_get_weights() { break; case Caffe::GPU: CUDA_CHECK(cudaMemcpy(weights_ptr, layer_blobs[j]->gpu_data(), - sizeof(float) * layer_blobs[j]->count(), cudaMemcpyDeviceToHost)); + sizeof(float) * layer_blobs[j]->count(), cudaMemcpyDefault)); break; default: LOG(FATAL) << "Unknown caffe mode: " << Caffe::mode(); diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index e603712fd82..eb1075a0273 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -150,10 +150,10 @@ void Blob::CopyFrom(const Blob& source, bool copy_diff, bool reshape) { case Caffe::GPU: if (copy_diff) { CUDA_CHECK(cudaMemcpy(diff_->mutable_gpu_data(), source.gpu_diff(), - sizeof(Dtype) * count_, cudaMemcpyDeviceToDevice)); + sizeof(Dtype) * count_, cudaMemcpyDefault)); } else { CUDA_CHECK(cudaMemcpy(data_->mutable_gpu_data(), source.gpu_data(), - sizeof(Dtype) * count_, cudaMemcpyDeviceToDevice)); + sizeof(Dtype) * count_, cudaMemcpyDefault)); } break; case Caffe::CPU: diff --git a/src/caffe/layers/data_layer.cu b/src/caffe/layers/data_layer.cu index 2ff9a292b3e..5a8bb0bfc65 100644 --- a/src/caffe/layers/data_layer.cu +++ b/src/caffe/layers/data_layer.cu @@ -23,11 +23,11 @@ Dtype DataLayer::Forward_gpu(const vector*>& bottom, // Copy the data CUDA_CHECK(cudaMemcpy((*top)[0]->mutable_gpu_data(), prefetch_data_->cpu_data(), sizeof(Dtype) * prefetch_data_->count(), - cudaMemcpyHostToDevice)); + cudaMemcpyDefault)); if (output_labels_) { CUDA_CHECK(cudaMemcpy((*top)[1]->mutable_gpu_data(), prefetch_label_->cpu_data(), sizeof(Dtype) * prefetch_label_->count(), - cudaMemcpyHostToDevice)); + cudaMemcpyDefault)); } // Start a new prefetch thread CreatePrefetchThread(); diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu index b2b09ef7dd1..232f55fd677 100644 --- a/src/caffe/layers/hdf5_data_layer.cu +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -44,12 +44,12 @@ Dtype HDF5DataLayer::Forward_gpu(const vector*>& bottom, &(*top)[0]->mutable_gpu_data()[i * data_count], &data_blob_.cpu_data()[current_row_ * data_count], sizeof(Dtype) * data_count, - cudaMemcpyHostToDevice)); + cudaMemcpyDefault)); CUDA_CHECK(cudaMemcpy( &(*top)[1]->mutable_gpu_data()[i * label_data_count], &label_blob_.cpu_data()[current_row_ * label_data_count], sizeof(Dtype) * label_data_count, - cudaMemcpyHostToDevice)); + cudaMemcpyDefault)); } return Dtype(0.); } diff --git a/src/caffe/layers/hdf5_output_layer.cu b/src/caffe/layers/hdf5_output_layer.cu index 59505ee6acf..19567c12b2b 100644 --- a/src/caffe/layers/hdf5_output_layer.cu +++ b/src/caffe/layers/hdf5_output_layer.cu @@ -29,10 +29,10 @@ Dtype HDF5OutputLayer::Forward_gpu(const vector*>& bottom, for (int i = 0; i < bottom[0]->num(); ++i) { CUDA_CHECK(cudaMemcpy(&data_blob_.mutable_cpu_data()[i * data_datum_dim], &bottom[0]->gpu_data()[i * data_datum_dim], - sizeof(Dtype) * data_datum_dim, cudaMemcpyDeviceToHost)); + sizeof(Dtype) * data_datum_dim, cudaMemcpyDefault)); CUDA_CHECK(cudaMemcpy(&label_blob_.mutable_cpu_data()[i * label_datum_dim], &bottom[1]->gpu_data()[i * label_datum_dim], - sizeof(Dtype) * label_datum_dim, cudaMemcpyDeviceToHost)); + sizeof(Dtype) * label_datum_dim, cudaMemcpyDefault)); } SaveBlobs(); return Dtype(0.); diff --git a/src/caffe/layers/image_data_layer.cu b/src/caffe/layers/image_data_layer.cu index 98047297d80..3f905bc461a 100644 --- a/src/caffe/layers/image_data_layer.cu +++ b/src/caffe/layers/image_data_layer.cu @@ -29,10 +29,10 @@ Dtype ImageDataLayer::Forward_gpu(const vector*>& bottom, // Copy the data CUDA_CHECK(cudaMemcpy((*top)[0]->mutable_gpu_data(), prefetch_data_->cpu_data(), sizeof(Dtype) * prefetch_data_->count(), - cudaMemcpyHostToDevice)); + cudaMemcpyDefault)); CUDA_CHECK(cudaMemcpy((*top)[1]->mutable_gpu_data(), prefetch_label_->cpu_data(), sizeof(Dtype) * prefetch_label_->count(), - cudaMemcpyHostToDevice)); + cudaMemcpyDefault)); // Start a new prefetch thread CreatePrefetchThread(); return Dtype(0.); diff --git a/src/caffe/layers/window_data_layer.cu b/src/caffe/layers/window_data_layer.cu index bc49fef6545..5e8cdb7841d 100644 --- a/src/caffe/layers/window_data_layer.cu +++ b/src/caffe/layers/window_data_layer.cu @@ -30,10 +30,10 @@ Dtype WindowDataLayer::Forward_gpu(const vector*>& bottom, // Copy the data CUDA_CHECK(cudaMemcpy((*top)[0]->mutable_gpu_data(), prefetch_data_->cpu_data(), sizeof(Dtype) * prefetch_data_->count(), - cudaMemcpyHostToDevice)); + cudaMemcpyDefault)); CUDA_CHECK(cudaMemcpy((*top)[1]->mutable_gpu_data(), prefetch_label_->cpu_data(), sizeof(Dtype) * prefetch_label_->count(), - cudaMemcpyHostToDevice)); + cudaMemcpyDefault)); // Start a new prefetch thread CreatePrefetchThread(); return Dtype(0.); diff --git a/src/caffe/syncedmem.cpp b/src/caffe/syncedmem.cpp index fec37d6e9ec..ec4c528f46d 100644 --- a/src/caffe/syncedmem.cpp +++ b/src/caffe/syncedmem.cpp @@ -32,7 +32,7 @@ inline void SyncedMemory::to_cpu() { CaffeMallocHost(&cpu_ptr_, size_); own_cpu_data_ = true; } - CUDA_CHECK(cudaMemcpy(cpu_ptr_, gpu_ptr_, size_, cudaMemcpyDeviceToHost)); + CUDA_CHECK(cudaMemcpy(cpu_ptr_, gpu_ptr_, size_, cudaMemcpyDefault)); head_ = SYNCED; break; case HEAD_AT_CPU: @@ -52,7 +52,7 @@ inline void SyncedMemory::to_gpu() { if (gpu_ptr_ == NULL) { CUDA_CHECK(cudaMalloc(&gpu_ptr_, size_)); } - CUDA_CHECK(cudaMemcpy(gpu_ptr_, cpu_ptr_, size_, cudaMemcpyHostToDevice)); + CUDA_CHECK(cudaMemcpy(gpu_ptr_, cpu_ptr_, size_, cudaMemcpyDefault)); head_ = SYNCED; break; case HEAD_AT_GPU: diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index 7bbbbab6a57..e741f0f70da 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -58,7 +58,7 @@ TEST_F(SyncedMemoryTest, TestGPURead) { // check if values are the same char* recovered_value = new char[10]; cudaMemcpy(reinterpret_cast(recovered_value), gpu_data, 10, - cudaMemcpyDeviceToHost); + cudaMemcpyDefault); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((reinterpret_cast(recovered_value))[i], 1); } @@ -73,7 +73,7 @@ TEST_F(SyncedMemoryTest, TestGPURead) { EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same cudaMemcpy(reinterpret_cast(recovered_value), gpu_data, 10, - cudaMemcpyDeviceToHost); + cudaMemcpyDefault); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((reinterpret_cast(recovered_value))[i], 2); } From 803a7a94f3033e4d389de57c18524c98ac744b3f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 27 Jun 2014 18:38:39 -0700 Subject: [PATCH 0210/2053] replace softmax cudaMemcpy with caffe_gpu_copy --- src/caffe/layers/softmax_layer.cu | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index f53883c9206..5ec4412ccfb 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -50,8 +50,7 @@ Dtype SoftmaxLayer::Forward_gpu(const vector*>& bottom, Dtype* scale_data = scale_.mutable_gpu_data(); int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); - CUDA_CHECK(cudaMemcpy(top_data, bottom_data, - sizeof(Dtype) * bottom[0]->count(), cudaMemcpyDeviceToDevice)); + caffe_gpu_copy(bottom[0]->count(), bottom_data, top_data); // we need to subtract the max to avoid numerical issues, compute the exp, // and then normalize. // Compute max @@ -85,8 +84,7 @@ void SoftmaxLayer::Backward_gpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); int num = top[0]->num(); int dim = top[0]->count() / top[0]->num(); - CUDA_CHECK(cudaMemcpy(bottom_diff, top_diff, - sizeof(Dtype) * top[0]->count(), cudaMemcpyDeviceToDevice)); + caffe_gpu_copy(top[0]->count(), top_diff, bottom_diff); // Compute inner1d(top_diff, top_data) and subtract them from the bottom diff // cuda dot returns the result to cpu, so we temporarily change the pointer // mode From aaa9f24d369798cfa268f465ec5a1c35257ed500 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 27 Jun 2014 21:25:36 -0700 Subject: [PATCH 0211/2053] do all caffe_copy() as UVA mem copy, and drop caffe_gpu_copy() Do all memory copies by `cudaMemcpy` in UVA mode so that the same `caffe_copy()` interface works for all transfers. `cudaMemcpy()` is used in lieu of BLAS copies because they do not understand UVA. Drop the now unnecessary `caffe_gpu_copy()` since location of the pointers is now irrelevant to the interface. --- include/caffe/util/math_functions.hpp | 5 ++--- src/caffe/util/math_functions.cpp | 21 +++++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 99519974243..b5f4dfbd1a8 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -59,15 +59,14 @@ void caffe_gpu_axpby(const int N, const Dtype alpha, const Dtype* X, template void caffe_copy(const int N, const Dtype *X, Dtype *Y); +void caffe_copy(const size_t N, const void *X, void *Y); + template void caffe_set(const int N, const Dtype alpha, Dtype *X); template void caffe_gpu_set(const int N, const Dtype alpha, Dtype *X); -template -void caffe_gpu_copy(const int N, const Dtype *X, Dtype *Y); - template void caffe_add_scalar(const int N, const Dtype alpha, Dtype *X); diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index 90df51248e2..b1b62edb0d2 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -150,30 +150,35 @@ void caffe_add_scalar(const int N, const double alpha, double* Y) { } template <> -void caffe_copy(const int N, const float* X, float* Y) { +void caffe_copy(const int N, const int* X, int* Y) { if (X != Y) { - cblas_scopy(N, X, 1, Y, 1); + CUDA_CHECK(cudaMemcpy(Y, X, sizeof(int) * N, cudaMemcpyDefault)); } } template <> -void caffe_copy(const int N, const double* X, double* Y) { +void caffe_copy(const int N, const unsigned int* X, + unsigned int* Y) { if (X != Y) { - cblas_dcopy(N, X, 1, Y, 1); + CUDA_CHECK(cudaMemcpy(Y, X, sizeof(unsigned int) * N, cudaMemcpyDefault)); } } template <> -void caffe_gpu_copy(const int N, const float* X, float* Y) { +void caffe_copy(const int N, const float* X, float* Y) { if (X != Y) { - CUBLAS_CHECK(cublasScopy(Caffe::cublas_handle(), N, X, 1, Y, 1)); + CUDA_CHECK(cudaMemcpy(Y, X, sizeof(float) * N, cudaMemcpyDefault)); } } template <> -void caffe_gpu_copy(const int N, const double* X, double* Y) { +void caffe_copy(const int N, const double* X, double* Y) { + CUDA_CHECK(cudaMemcpy(Y, X, sizeof(double) * N, cudaMemcpyDefault)); +} + +void caffe_copy(const size_t N, const void* X, void* Y) { if (X != Y) { - CUBLAS_CHECK(cublasDcopy(Caffe::cublas_handle(), N, X, 1, Y, 1)); + CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); } } From 1da30a555827e778e36c5db72ef9cc672ad85675 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 27 Jun 2014 19:51:33 -0700 Subject: [PATCH 0212/2053] replace all memcpy by caffe_copy --- include/caffe/blob.hpp | 1 + include/caffe/syncedmem.hpp | 1 + matlab/caffe/matcaffe.cpp | 38 +++++++++---------- src/caffe/blob.cpp | 16 ++++---- src/caffe/layers/concat_layer.cu | 8 ++-- src/caffe/layers/data_layer.cu | 10 ++--- src/caffe/layers/dropout_layer.cu | 2 +- src/caffe/layers/eltwise_layer.cu | 2 +- src/caffe/layers/hdf5_data_layer.cu | 16 +++----- src/caffe/layers/hdf5_output_layer.cpp | 10 ++--- src/caffe/layers/hdf5_output_layer.cu | 10 ++--- src/caffe/layers/image_data_layer.cu | 10 ++--- src/caffe/layers/power_layer.cu | 4 +- .../sigmoid_cross_entropy_loss_layer.cu | 2 +- src/caffe/layers/softmax_layer.cpp | 4 +- src/caffe/layers/softmax_layer.cu | 4 +- src/caffe/layers/softmax_loss_layer.cpp | 2 +- src/caffe/layers/window_data_layer.cu | 10 ++--- src/caffe/solver.cpp | 2 +- src/caffe/syncedmem.cpp | 5 ++- src/caffe/test/test_gradient_check_util.hpp | 4 +- src/caffe/test/test_math_functions.cpp | 2 +- src/caffe/test/test_syncedmem.cpp | 7 ++-- src/caffe/test/test_util_blas.cpp | 16 ++++---- 24 files changed, 86 insertions(+), 100 deletions(-) diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index c04375a10e2..bbea86aea69 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -6,6 +6,7 @@ #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/math_functions.hpp" namespace caffe { diff --git a/include/caffe/syncedmem.hpp b/include/caffe/syncedmem.hpp index bed55c3806e..2b7f349025a 100644 --- a/include/caffe/syncedmem.hpp +++ b/include/caffe/syncedmem.hpp @@ -6,6 +6,7 @@ #include #include "caffe/common.hpp" +#include "caffe/util/math_functions.hpp" namespace caffe { diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index 1b2b65ec7d8..957ebea008e 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -54,12 +54,12 @@ static mxArray* do_forward(const mxArray* const bottom) { reinterpret_cast(mxGetPr(elem)); switch (Caffe::mode()) { case Caffe::CPU: - memcpy(input_blobs[i]->mutable_cpu_data(), data_ptr, - sizeof(float) * input_blobs[i]->count()); + caffe_copy(input_blobs[i]->count(), data_ptr, + input_blobs[i]->mutable_cpu_data()); break; case Caffe::GPU: - cudaMemcpy(input_blobs[i]->mutable_gpu_data(), data_ptr, - sizeof(float) * input_blobs[i]->count(), cudaMemcpyDefault); + caffe_copy(input_blobs[i]->count(), data_ptr, + input_blobs[i]->mutable_gpu_data()); break; default: LOG(FATAL) << "Unknown Caffe mode."; @@ -77,12 +77,12 @@ static mxArray* do_forward(const mxArray* const bottom) { float* data_ptr = reinterpret_cast(mxGetPr(mx_blob)); switch (Caffe::mode()) { case Caffe::CPU: - memcpy(data_ptr, output_blobs[i]->cpu_data(), - sizeof(float) * output_blobs[i]->count()); + caffe_copy(output_blobs[i]->count(), output_blobs[i]->cpu_data(), + data_ptr); break; case Caffe::GPU: - cudaMemcpy(data_ptr, output_blobs[i]->gpu_data(), - sizeof(float) * output_blobs[i]->count(), cudaMemcpyDefault); + caffe_copy(output_blobs[i]->count(), output_blobs[i]->gpu_data(), + data_ptr); break; default: LOG(FATAL) << "Unknown Caffe mode."; @@ -104,12 +104,12 @@ static mxArray* do_backward(const mxArray* const top_diff) { reinterpret_cast(mxGetPr(elem)); switch (Caffe::mode()) { case Caffe::CPU: - memcpy(output_blobs[i]->mutable_cpu_diff(), data_ptr, - sizeof(float) * output_blobs[i]->count()); + caffe_copy(output_blobs[i]->count(), data_ptr, + output_blobs[i]->mutable_cpu_diff()); break; case Caffe::GPU: - cudaMemcpy(output_blobs[i]->mutable_gpu_diff(), data_ptr, - sizeof(float) * output_blobs[i]->count(), cudaMemcpyDefault); + caffe_copy(output_blobs[i]->count(), data_ptr, + output_blobs[i]->mutable_gpu_diff()); break; default: LOG(FATAL) << "Unknown Caffe mode."; @@ -129,12 +129,10 @@ static mxArray* do_backward(const mxArray* const top_diff) { float* data_ptr = reinterpret_cast(mxGetPr(mx_blob)); switch (Caffe::mode()) { case Caffe::CPU: - memcpy(data_ptr, input_blobs[i]->cpu_diff(), - sizeof(float) * input_blobs[i]->count()); + caffe_copy(input_blobs[i]->count(), input_blobs[i]->cpu_diff(), data_ptr); break; case Caffe::GPU: - cudaMemcpy(data_ptr, input_blobs[i]->gpu_diff(), - sizeof(float) * input_blobs[i]->count(), cudaMemcpyDefault); + caffe_copy(input_blobs[i]->count(), input_blobs[i]->gpu_diff(), data_ptr); break; default: LOG(FATAL) << "Unknown Caffe mode."; @@ -206,12 +204,12 @@ static mxArray* do_get_weights() { switch (Caffe::mode()) { case Caffe::CPU: - memcpy(weights_ptr, layer_blobs[j]->cpu_data(), - sizeof(float) * layer_blobs[j]->count()); + caffe_copy(layer_blobs[j]->count(), layer_blobs[j]->cpu_data(), + weights_ptr); break; case Caffe::GPU: - CUDA_CHECK(cudaMemcpy(weights_ptr, layer_blobs[j]->gpu_data(), - sizeof(float) * layer_blobs[j]->count(), cudaMemcpyDefault)); + caffe_copy(layer_blobs[j]->count(), layer_blobs[j]->gpu_data(), + weights_ptr); break; default: LOG(FATAL) << "Unknown caffe mode: " << Caffe::mode(); diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index eb1075a0273..69ff49efc46 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -149,20 +149,20 @@ void Blob::CopyFrom(const Blob& source, bool copy_diff, bool reshape) { switch (Caffe::mode()) { case Caffe::GPU: if (copy_diff) { - CUDA_CHECK(cudaMemcpy(diff_->mutable_gpu_data(), source.gpu_diff(), - sizeof(Dtype) * count_, cudaMemcpyDefault)); + caffe_copy(count_, source.gpu_diff(), + reinterpret_cast(diff_->mutable_gpu_data())); } else { - CUDA_CHECK(cudaMemcpy(data_->mutable_gpu_data(), source.gpu_data(), - sizeof(Dtype) * count_, cudaMemcpyDefault)); + caffe_copy(count_, source.gpu_data(), + reinterpret_cast(data_->mutable_gpu_data())); } break; case Caffe::CPU: if (copy_diff) { - memcpy(diff_->mutable_cpu_data(), source.cpu_diff(), - sizeof(Dtype) * count_); + caffe_copy(count_, source.cpu_diff(), + reinterpret_cast(diff_->mutable_cpu_data())); } else { - memcpy(data_->mutable_cpu_data(), source.cpu_data(), - sizeof(Dtype) * count_); + caffe_copy(count_, source.cpu_data(), + reinterpret_cast(data_->mutable_cpu_data())); } break; default: diff --git a/src/caffe/layers/concat_layer.cu b/src/caffe/layers/concat_layer.cu index ca0cf0c1b5b..2643d7441c8 100644 --- a/src/caffe/layers/concat_layer.cu +++ b/src/caffe/layers/concat_layer.cu @@ -16,7 +16,7 @@ Dtype ConcatLayer::Forward_gpu(const vector*>& bottom, int offset_num = 0; for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); - caffe_gpu_copy(bottom[i]->count(), bottom_data, + caffe_copy(bottom[i]->count(), bottom_data, top_data + (*top)[0]->offset(offset_num)); offset_num += bottom[i]->num(); } @@ -27,7 +27,7 @@ Dtype ConcatLayer::Forward_gpu(const vector*>& bottom, int num_elem = bottom[i]->channels() * bottom[i]->height() * bottom[i]->width(); for (int n = 0; n < num_; ++n) { - caffe_gpu_copy(num_elem, bottom_data+bottom[i]->offset(n), + caffe_copy(num_elem, bottom_data+bottom[i]->offset(n), top_data + (*top)[0]->offset(n, offset_channel)); } offset_channel += bottom[i]->channels(); @@ -49,7 +49,7 @@ void ConcatLayer::Backward_gpu(const vector*>& top, Blob* blob = (*bottom)[i]; if (propagate_down[i]) { Dtype* bottom_diff = blob->mutable_gpu_diff(); - caffe_gpu_copy(blob->count(), top_diff + top[0]->offset(offset_num), + caffe_copy(blob->count(), top_diff + top[0]->offset(offset_num), bottom_diff); } offset_num += blob->num(); @@ -62,7 +62,7 @@ void ConcatLayer::Backward_gpu(const vector*>& top, Dtype* bottom_diff = blob->mutable_gpu_diff(); int num_elem = blob->channels()*blob->height()*blob->width(); for (int n = 0; n < num_; ++n) { - caffe_gpu_copy(num_elem, top_diff + top[0]->offset(n, offset_channel), + caffe_copy(num_elem, top_diff + top[0]->offset(n, offset_channel), bottom_diff + blob->offset(n)); } } diff --git a/src/caffe/layers/data_layer.cu b/src/caffe/layers/data_layer.cu index 5a8bb0bfc65..40316a16772 100644 --- a/src/caffe/layers/data_layer.cu +++ b/src/caffe/layers/data_layer.cu @@ -21,13 +21,11 @@ Dtype DataLayer::Forward_gpu(const vector*>& bottom, // First, join the thread JoinPrefetchThread(); // Copy the data - CUDA_CHECK(cudaMemcpy((*top)[0]->mutable_gpu_data(), - prefetch_data_->cpu_data(), sizeof(Dtype) * prefetch_data_->count(), - cudaMemcpyDefault)); + caffe_copy(prefetch_data_->count(), prefetch_data_->cpu_data(), + (*top)[0]->mutable_gpu_data()); if (output_labels_) { - CUDA_CHECK(cudaMemcpy((*top)[1]->mutable_gpu_data(), - prefetch_label_->cpu_data(), sizeof(Dtype) * prefetch_label_->count(), - cudaMemcpyDefault)); + caffe_copy(prefetch_label_->count(), prefetch_label_->cpu_data(), + (*top)[1]->mutable_gpu_data()); } // Start a new prefetch thread CreatePrefetchThread(); diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 225e0919409..11a426312ce 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -40,7 +40,7 @@ Dtype DropoutLayer::Forward_gpu(const vector*>& bottom, count, bottom_data, mask, uint_thres_, scale_, top_data); CUDA_POST_KERNEL_CHECK; } else { - caffe_gpu_copy(count, bottom_data, top_data); + caffe_copy(count, bottom_data, top_data); } return Dtype(0); } diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index 3860944889c..99c14feace1 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -51,7 +51,7 @@ void EltwiseLayer::Backward_gpu(const vector*>& top, break; case EltwiseParameter_EltwiseOp_SUM: if (coeffs_[i] == Dtype(1.)) { - caffe_gpu_copy(count, top_diff, bottom_diff); + caffe_copy(count, top_diff, bottom_diff); } else { caffe_gpu_scale(count, coeffs_[i], top_diff, bottom_diff); } diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu index 232f55fd677..3c27f37e360 100644 --- a/src/caffe/layers/hdf5_data_layer.cu +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -40,16 +40,12 @@ Dtype HDF5DataLayer::Forward_gpu(const vector*>& bottom, } current_row_ = 0; } - CUDA_CHECK(cudaMemcpy( - &(*top)[0]->mutable_gpu_data()[i * data_count], - &data_blob_.cpu_data()[current_row_ * data_count], - sizeof(Dtype) * data_count, - cudaMemcpyDefault)); - CUDA_CHECK(cudaMemcpy( - &(*top)[1]->mutable_gpu_data()[i * label_data_count], - &label_blob_.cpu_data()[current_row_ * label_data_count], - sizeof(Dtype) * label_data_count, - cudaMemcpyDefault)); + caffe_copy(data_count, + &data_blob_.cpu_data()[current_row_ * data_count], + &(*top)[0]->mutable_gpu_data()[i * data_count]); + caffe_copy(label_data_count, + &label_blob_.cpu_data()[current_row_ * label_data_count], + &(*top)[1]->mutable_gpu_data()[i * label_data_count]); } return Dtype(0.); } diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index 3a513b9c366..8307ad7c184 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -54,12 +54,10 @@ Dtype HDF5OutputLayer::Forward_cpu(const vector*>& bottom, const int label_datum_dim = bottom[1]->count() / bottom[1]->num(); for (int i = 0; i < bottom[0]->num(); ++i) { - memcpy(&data_blob_.mutable_cpu_data()[i * data_datum_dim], - &bottom[0]->cpu_data()[i * data_datum_dim], - sizeof(Dtype) * data_datum_dim); - memcpy(&label_blob_.mutable_cpu_data()[i * label_datum_dim], - &bottom[1]->cpu_data()[i * label_datum_dim], - sizeof(Dtype) * label_datum_dim); + caffe_copy(data_datum_dim, &bottom[0]->cpu_data()[i * data_datum_dim], + &data_blob_.mutable_cpu_data()[i * data_datum_dim]); + caffe_copy(label_datum_dim, &bottom[0]->cpu_data()[i * label_datum_dim], + &label_blob_.mutable_cpu_data()[i * label_datum_dim]); } SaveBlobs(); return Dtype(0.); diff --git a/src/caffe/layers/hdf5_output_layer.cu b/src/caffe/layers/hdf5_output_layer.cu index 19567c12b2b..744b8fe1128 100644 --- a/src/caffe/layers/hdf5_output_layer.cu +++ b/src/caffe/layers/hdf5_output_layer.cu @@ -27,12 +27,10 @@ Dtype HDF5OutputLayer::Forward_gpu(const vector*>& bottom, const int label_datum_dim = bottom[1]->count() / bottom[1]->num(); for (int i = 0; i < bottom[0]->num(); ++i) { - CUDA_CHECK(cudaMemcpy(&data_blob_.mutable_cpu_data()[i * data_datum_dim], - &bottom[0]->gpu_data()[i * data_datum_dim], - sizeof(Dtype) * data_datum_dim, cudaMemcpyDefault)); - CUDA_CHECK(cudaMemcpy(&label_blob_.mutable_cpu_data()[i * label_datum_dim], - &bottom[1]->gpu_data()[i * label_datum_dim], - sizeof(Dtype) * label_datum_dim, cudaMemcpyDefault)); + caffe_copy(data_datum_dim, &bottom[0]->gpu_data()[i * data_datum_dim], + &data_blob_.mutable_cpu_data()[i * data_datum_dim]); + caffe_copy(label_datum_dim, &bottom[0]->gpu_data()[i * label_datum_dim], + &label_blob_.mutable_cpu_data()[i * label_datum_dim]); } SaveBlobs(); return Dtype(0.); diff --git a/src/caffe/layers/image_data_layer.cu b/src/caffe/layers/image_data_layer.cu index 3f905bc461a..dd5bdbc2068 100644 --- a/src/caffe/layers/image_data_layer.cu +++ b/src/caffe/layers/image_data_layer.cu @@ -27,12 +27,10 @@ Dtype ImageDataLayer::Forward_gpu(const vector*>& bottom, // First, join the thread JoinPrefetchThread(); // Copy the data - CUDA_CHECK(cudaMemcpy((*top)[0]->mutable_gpu_data(), - prefetch_data_->cpu_data(), sizeof(Dtype) * prefetch_data_->count(), - cudaMemcpyDefault)); - CUDA_CHECK(cudaMemcpy((*top)[1]->mutable_gpu_data(), - prefetch_label_->cpu_data(), sizeof(Dtype) * prefetch_label_->count(), - cudaMemcpyDefault)); + caffe_copy(prefetch_data_->count(), prefetch_data_->cpu_data(), + (*top)[0]->mutable_gpu_data()); + caffe_copy(prefetch_label_->count(), prefetch_label_->cpu_data(), + (*top)[1]->mutable_gpu_data()); // Start a new prefetch thread CreatePrefetchThread(); return Dtype(0.); diff --git a/src/caffe/layers/power_layer.cu b/src/caffe/layers/power_layer.cu index 6d699636e21..e7f9831eb13 100644 --- a/src/caffe/layers/power_layer.cu +++ b/src/caffe/layers/power_layer.cu @@ -23,7 +23,7 @@ Dtype PowerLayer::Forward_gpu(const vector*>& bottom, return Dtype(0); } const Dtype* bottom_data = bottom[0]->gpu_data(); - caffe_gpu_copy(count, bottom_data, top_data); + caffe_copy(count, bottom_data, top_data); if (scale_ != Dtype(1)) { caffe_gpu_scal(count, scale_, top_data); } @@ -68,7 +68,7 @@ void PowerLayer::Backward_gpu(const vector*>& top, caffe_gpu_div(count, top_data, bottom_data, bottom_diff); caffe_gpu_scal(count, power_, bottom_diff); } else { - caffe_gpu_copy(count, bottom_data, bottom_diff); + caffe_copy(count, bottom_data, bottom_diff); if (scale_ != Dtype(1)) { caffe_gpu_scal(count, scale_, bottom_diff); } diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu index 8f7275827e2..0c858cdfc19 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu @@ -50,7 +50,7 @@ void SigmoidCrossEntropyLossLayer::Backward_gpu( const Dtype* sigmoid_output_data = sigmoid_output_->gpu_data(); const Dtype* target = (*bottom)[1]->gpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - caffe_gpu_copy(count, sigmoid_output_data, bottom_diff); + caffe_copy(count, sigmoid_output_data, bottom_diff); caffe_gpu_axpy(count, Dtype(-1), target, bottom_diff); // Scale down gradient caffe_gpu_scal(count, Dtype(1) / num, bottom_diff); diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 57847d005f6..5d60d9df1ba 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -34,7 +34,7 @@ Dtype SoftmaxLayer::Forward_cpu(const vector*>& bottom, Dtype* scale_data = scale_.mutable_cpu_data(); int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); - memcpy(top_data, bottom_data, sizeof(Dtype) * bottom[0]->count()); + caffe_copy(bottom[0]->count(), bottom_data, top_data); // we need to subtract the max to avoid numerical issues, compute the exp, // and then normalize. for (int i = 0; i < num; ++i) { @@ -68,7 +68,7 @@ void SoftmaxLayer::Backward_cpu(const vector*>& top, Dtype* scale_data = scale_.mutable_cpu_data(); int num = top[0]->num(); int dim = top[0]->count() / top[0]->num(); - memcpy(bottom_diff, top_diff, sizeof(Dtype) * top[0]->count()); + caffe_copy(top[0]->count(), top_diff, bottom_diff); // Compute inner1d(top_diff, top_data) and subtract them from the bottom diff for (int i = 0; i < num; ++i) { scale_data[i] = caffe_cpu_dot(dim, top_diff + i * dim, diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index 5ec4412ccfb..ceeaff5b020 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -50,7 +50,7 @@ Dtype SoftmaxLayer::Forward_gpu(const vector*>& bottom, Dtype* scale_data = scale_.mutable_gpu_data(); int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); - caffe_gpu_copy(bottom[0]->count(), bottom_data, top_data); + caffe_copy(bottom[0]->count(), bottom_data, top_data); // we need to subtract the max to avoid numerical issues, compute the exp, // and then normalize. // Compute max @@ -84,7 +84,7 @@ void SoftmaxLayer::Backward_gpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); int num = top[0]->num(); int dim = top[0]->count() / top[0]->num(); - caffe_gpu_copy(top[0]->count(), top_diff, bottom_diff); + caffe_copy(top[0]->count(), top_diff, bottom_diff); // Compute inner1d(top_diff, top_data) and subtract them from the bottom diff // cuda dot returns the result to cpu, so we temporarily change the pointer // mode diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 1a3601aa9e6..37c5ebc45be 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -66,7 +66,7 @@ void SoftmaxWithLossLayer::Backward_cpu(const vector*>& top, if (propagate_down[0]) { Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); const Dtype* prob_data = prob_.cpu_data(); - memcpy(bottom_diff, prob_data, sizeof(Dtype) * prob_.count()); + caffe_copy(prob_.count(), prob_data, bottom_diff); const Dtype* label = (*bottom)[1]->cpu_data(); int num = prob_.num(); int dim = prob_.count() / num; diff --git a/src/caffe/layers/window_data_layer.cu b/src/caffe/layers/window_data_layer.cu index 5e8cdb7841d..ca664fcef41 100644 --- a/src/caffe/layers/window_data_layer.cu +++ b/src/caffe/layers/window_data_layer.cu @@ -28,12 +28,10 @@ Dtype WindowDataLayer::Forward_gpu(const vector*>& bottom, // First, join the thread JoinPrefetchThread(); // Copy the data - CUDA_CHECK(cudaMemcpy((*top)[0]->mutable_gpu_data(), - prefetch_data_->cpu_data(), sizeof(Dtype) * prefetch_data_->count(), - cudaMemcpyDefault)); - CUDA_CHECK(cudaMemcpy((*top)[1]->mutable_gpu_data(), - prefetch_label_->cpu_data(), sizeof(Dtype) * prefetch_label_->count(), - cudaMemcpyDefault)); + caffe_copy(prefetch_data_->count(), prefetch_data_->cpu_data(), + (*top)[0]->mutable_gpu_data()); + caffe_copy(prefetch_label_->count(), prefetch_label_->cpu_data(), + (*top)[1]->mutable_gpu_data()); // Start a new prefetch thread CreatePrefetchThread(); return Dtype(0.); diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 769618175ac..ca1d92525c9 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -310,7 +310,7 @@ void SGDSolver::ComputeUpdateValue() { history_[param_id]->mutable_gpu_data()); } // copy - caffe_gpu_copy(net_params[param_id]->count(), + caffe_copy(net_params[param_id]->count(), history_[param_id]->gpu_data(), net_params[param_id]->mutable_gpu_diff()); } diff --git a/src/caffe/syncedmem.cpp b/src/caffe/syncedmem.cpp index ec4c528f46d..011d35976a5 100644 --- a/src/caffe/syncedmem.cpp +++ b/src/caffe/syncedmem.cpp @@ -6,6 +6,7 @@ #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" +#include "caffe/util/math_functions.hpp" namespace caffe { @@ -32,7 +33,7 @@ inline void SyncedMemory::to_cpu() { CaffeMallocHost(&cpu_ptr_, size_); own_cpu_data_ = true; } - CUDA_CHECK(cudaMemcpy(cpu_ptr_, gpu_ptr_, size_, cudaMemcpyDefault)); + caffe_copy(size_, gpu_ptr_, cpu_ptr_); head_ = SYNCED; break; case HEAD_AT_CPU: @@ -52,7 +53,7 @@ inline void SyncedMemory::to_gpu() { if (gpu_ptr_ == NULL) { CUDA_CHECK(cudaMalloc(&gpu_ptr_, size_)); } - CUDA_CHECK(cudaMemcpy(gpu_ptr_, cpu_ptr_, size_, cudaMemcpyDefault)); + caffe_copy(size_, cpu_ptr_, gpu_ptr_); head_ = SYNCED; break; case HEAD_AT_GPU: diff --git a/src/caffe/test/test_gradient_check_util.hpp b/src/caffe/test/test_gradient_check_util.hpp index ff104b90eb9..2d551f82428 100644 --- a/src/caffe/test/test_gradient_check_util.hpp +++ b/src/caffe/test/test_gradient_check_util.hpp @@ -230,7 +230,7 @@ Dtype GradientChecker::GetObjAndGradient(vector*>* top, loss += top_blob_data[j] * top_blob_data[j]; } // set the diff: simply the data. - memcpy(top_blob_diff, top_blob_data, sizeof(Dtype) * top_blob->count()); + caffe_copy(top_blob->count(), top_blob_data, top_blob_diff); } loss /= 2.; } else { @@ -238,7 +238,7 @@ Dtype GradientChecker::GetObjAndGradient(vector*>* top, for (int i = 0; i < top->size(); ++i) { Blob* top_blob = (*top)[i]; Dtype* top_blob_diff = top_blob->mutable_cpu_diff(); - memset(top_blob_diff, 0, sizeof(Dtype) * top_blob->count()); + caffe_set(top_blob->count(), Dtype(0), top_blob_diff); } loss = (*top)[top_id]->cpu_data()[top_data_id]; (*top)[top_id]->mutable_cpu_diff()[top_data_id] = 1.; diff --git a/src/caffe/test/test_math_functions.cpp b/src/caffe/test/test_math_functions.cpp index d0265767c07..941d8b9479a 100644 --- a/src/caffe/test/test_math_functions.cpp +++ b/src/caffe/test/test_math_functions.cpp @@ -219,7 +219,7 @@ TYPED_TEST(MathFunctionsTest, TestCopyGPU) { const int n = this->blob_bottom_->count(); const TypeParam* bottom_data = this->blob_bottom_->gpu_data(); TypeParam* top_data = this->blob_top_->mutable_gpu_data(); - caffe_gpu_copy(n, bottom_data, top_data); + caffe_copy(n, bottom_data, top_data); bottom_data = this->blob_bottom_->cpu_data(); top_data = this->blob_top_->mutable_cpu_data(); for (int i = 0; i < n; ++i) { diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index e741f0f70da..a7a5131578e 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -7,6 +7,7 @@ #include "gtest/gtest.h" #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" +#include "caffe/util/math_functions.hpp" #include "caffe/test/test_caffe_main.hpp" @@ -57,8 +58,7 @@ TEST_F(SyncedMemoryTest, TestGPURead) { EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same char* recovered_value = new char[10]; - cudaMemcpy(reinterpret_cast(recovered_value), gpu_data, 10, - cudaMemcpyDefault); + caffe_copy(size_t(10), gpu_data, reinterpret_cast(recovered_value)); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((reinterpret_cast(recovered_value))[i], 1); } @@ -72,8 +72,7 @@ TEST_F(SyncedMemoryTest, TestGPURead) { gpu_data = mem.gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same - cudaMemcpy(reinterpret_cast(recovered_value), gpu_data, 10, - cudaMemcpyDefault); + caffe_copy(size_t(10), gpu_data, reinterpret_cast(recovered_value)); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((reinterpret_cast(recovered_value))[i], 2); } diff --git a/src/caffe/test/test_util_blas.cpp b/src/caffe/test/test_util_blas.cpp index 2e4c6795952..5b4c48eaf80 100644 --- a/src/caffe/test/test_util_blas.cpp +++ b/src/caffe/test/test_util_blas.cpp @@ -30,8 +30,8 @@ TYPED_TEST(GemmTest, TestGemm) { TypeParam A_reshape_data[6] = {1, 4, 2, 5, 3, 6}; TypeParam B_reshape_data[12] = {1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12}; TypeParam result[8] = {38, 44, 50, 56, 83, 98, 113, 128}; - memcpy(A.mutable_cpu_data(), data, 6 * sizeof(TypeParam)); - memcpy(B.mutable_cpu_data(), data, 12 * sizeof(TypeParam)); + caffe_copy(6, data, A.mutable_cpu_data()); + caffe_copy(12, data, B.mutable_cpu_data()); if (sizeof(TypeParam) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { // [1, 2, 3; 4 5 6] * [1, 2, 3, 4; 5, 6, 7, 8; 9, 10, 11, 12]; @@ -48,7 +48,7 @@ TYPED_TEST(GemmTest, TestGemm) { // Test when we have a transposed A A.Reshape(1, 1, 3, 2); - memcpy(A.mutable_cpu_data(), A_reshape_data, 6 * sizeof(TypeParam)); + caffe_copy(6, A_reshape_data, A.mutable_cpu_data()); caffe_cpu_gemm(CblasTrans, CblasNoTrans, 2, 4, 3, 1., A.cpu_data(), B.cpu_data(), 0., C.mutable_cpu_data()); for (int i = 0; i < 8; ++i) { @@ -62,7 +62,7 @@ TYPED_TEST(GemmTest, TestGemm) { // Test when we have a transposed A and a transposed B too B.Reshape(1, 1, 4, 3); - memcpy(B.mutable_cpu_data(), B_reshape_data, 12 * sizeof(TypeParam)); + caffe_copy(12, B_reshape_data, B.mutable_cpu_data()); caffe_cpu_gemm(CblasTrans, CblasTrans, 2, 4, 3, 1., A.cpu_data(), B.cpu_data(), 0., C.mutable_cpu_data()); for (int i = 0; i < 8; ++i) { @@ -76,7 +76,7 @@ TYPED_TEST(GemmTest, TestGemm) { // Test when we have a transposed B A.Reshape(1, 1, 2, 3); - memcpy(A.mutable_cpu_data(), data, 6 * sizeof(TypeParam)); + caffe_copy(6, data, A.mutable_cpu_data()); caffe_cpu_gemm(CblasNoTrans, CblasTrans, 2, 4, 3, 1., A.cpu_data(), B.cpu_data(), 0., C.mutable_cpu_data()); for (int i = 0; i < 8; ++i) { @@ -100,8 +100,8 @@ TYPED_TEST(GemmTest, TestGemv) { TypeParam data[6] = {1, 2, 3, 4, 5, 6}; TypeParam result_2[2] = {14, 32}; TypeParam result_3[3] = {9, 12, 15}; - memcpy(A.mutable_cpu_data(), data, 6 * sizeof(TypeParam)); - memcpy(x.mutable_cpu_data(), data, 3 * sizeof(TypeParam)); + caffe_copy(6, data, A.mutable_cpu_data()); + caffe_copy(3, data, x.mutable_cpu_data()); if (sizeof(TypeParam) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { caffe_cpu_gemv(CblasNoTrans, 2, 3, 1., A.cpu_data(), @@ -116,7 +116,7 @@ TYPED_TEST(GemmTest, TestGemv) { } // Test transpose case - memcpy(y.mutable_cpu_data(), data, 2 * sizeof(TypeParam)); + caffe_copy(2, data, y.mutable_cpu_data()); caffe_cpu_gemv(CblasTrans, 2, 3, 1., A.cpu_data(), y.cpu_data(), 0., x.mutable_cpu_data()); for (int i = 0; i < 3; ++i) { From af624faa55eb75f31de5f612b3d6b1553d652563 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 28 Jun 2014 01:52:49 -0700 Subject: [PATCH 0213/2053] replace all memset with caffe_set() / caffe_gpu_set() ...except for `SyncedMem` since it has no type. --- src/caffe/layers/conv_layer.cpp | 4 ++-- src/caffe/layers/conv_layer.cu | 6 ++---- src/caffe/layers/lrn_layer.cpp | 6 +++--- .../multinomial_logistic_loss_layer.cpp | 2 +- src/caffe/layers/window_data_layer.cpp | 2 +- src/caffe/util/im2col.cpp | 3 ++- src/caffe/util/im2col.cu | 2 -- src/caffe/util/math_functions.cu | 21 +++++++------------ 8 files changed, 18 insertions(+), 28 deletions(-) diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 67913bfa574..963dc688a0e 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -126,11 +126,11 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { const Dtype* weight = this->blobs_[0]->cpu_data(); Dtype* weight_diff = this->blobs_[0]->mutable_cpu_diff(); - memset(weight_diff, 0, sizeof(Dtype) * this->blobs_[0]->count()); + caffe_set(this->blobs_[0]->count(), Dtype(0), weight_diff); Dtype* bias_diff = NULL; if (bias_term_) { bias_diff = this->blobs_[1]->mutable_cpu_diff(); - memset(bias_diff, 0, sizeof(Dtype) * this->blobs_[1]->count()); + caffe_set(this->blobs_[1]->count(), Dtype(0), bias_diff); } const int weight_offset = M_ * K_; const int col_offset = K_ * N_; diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 71b00c9566b..59ec58dfebe 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -48,15 +48,13 @@ void ConvolutionLayer::Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { const Dtype* weight = this->blobs_[0]->gpu_data(); Dtype* weight_diff = this->blobs_[0]->mutable_gpu_diff(); - CUDA_CHECK(cudaMemset(weight_diff, 0, - sizeof(Dtype) * this->blobs_[0]->count())); + caffe_gpu_set(this->blobs_[0]->count(), Dtype(0), weight_diff); Dtype* col_data = col_buffer_.mutable_gpu_data(); Dtype* col_diff = col_buffer_.mutable_gpu_diff(); Dtype* bias_diff = NULL; if (bias_term_) { bias_diff = this->blobs_[1]->mutable_gpu_diff(); - CUDA_CHECK(cudaMemset(bias_diff, 0, - sizeof(Dtype) * this->blobs_[1]->count())); + caffe_gpu_set(this->blobs_[1]->count(), Dtype(0), bias_diff); } const int weight_offset = M_ * K_; const int col_offset = K_ * N_; diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index a86c1d4c59d..2bda0430c15 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -123,7 +123,7 @@ Dtype LRNLayer::CrossChannelForward_cpu( } Blob padded_square(1, channels_ + size_ - 1, height_, width_); Dtype* padded_square_data = padded_square.mutable_cpu_data(); - memset(padded_square_data, 0, sizeof(Dtype) * padded_square.count()); + caffe_set(padded_square.count(), Dtype(0), padded_square_data); Dtype alpha_over_size = alpha_ / size_; // go through the images for (int n = 0; n < num_; ++n) { @@ -201,7 +201,7 @@ void LRNLayer::CrossChannelBackward_cpu( Dtype* accum_ratio_data = accum_ratio.mutable_cpu_data(); // We hack a little bit by using the diff() to store an additional result Dtype* accum_ratio_times_bottom = accum_ratio.mutable_cpu_diff(); - memset(padded_ratio_data, 0, sizeof(Dtype) * padded_ratio.count()); + caffe_set(padded_ratio.count(), Dtype(0), padded_ratio_data); Dtype cache_ratio_value = 2. * alpha_ * beta_ / size_; caffe_powx(scale_.count(), scale_data, -beta_, bottom_diff); @@ -220,7 +220,7 @@ void LRNLayer::CrossChannelBackward_cpu( scale_data + block_offset, padded_ratio_data + padded_ratio.offset(0, inverse_pre_pad)); // Now, compute the accumulated ratios and the bottom diff - memset(accum_ratio_data, 0, sizeof(Dtype) * accum_ratio.count()); + caffe_set(accum_ratio.count(), Dtype(0), accum_ratio_data); for (int c = 0; c < size_ - 1; ++c) { caffe_axpy(height_ * width_, 1., padded_ratio_data + padded_ratio.offset(0, c), accum_ratio_data); diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index dd5cae44d6d..8687784d6ab 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -55,7 +55,7 @@ void MultinomialLogisticLossLayer::Backward_cpu( Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); int num = (*bottom)[0]->num(); int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); - memset(bottom_diff, 0, sizeof(Dtype) * (*bottom)[0]->count()); + caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); for (int i = 0; i < num; ++i) { int label = static_cast(bottom_label[i]); Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index fd4860f98be..5dbdff330ff 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -59,7 +59,7 @@ void* WindowDataLayerPrefetch(void* layer_pointer) { bool use_square = (crop_mode == "square") ? true : false; // zero out batch - memset(top_data, 0, sizeof(Dtype)*layer->prefetch_data_->count()); + caffe_set(layer->prefetch_data_->count(), Dtype(0), top_data); const int num_fg = static_cast(static_cast(batch_size) * fg_fraction); diff --git a/src/caffe/util/im2col.cpp b/src/caffe/util/im2col.cpp index 037410e29b7..ce4e18848bf 100644 --- a/src/caffe/util/im2col.cpp +++ b/src/caffe/util/im2col.cpp @@ -5,6 +5,7 @@ #include #include "caffe/util/im2col.hpp" +#include "caffe/util/math_functions.hpp" namespace caffe { @@ -45,7 +46,7 @@ template void col2im_cpu(const Dtype* data_col, const int channels, const int height, const int width, const int ksize, const int pad, const int stride, Dtype* data_im) { - memset(data_im, 0, sizeof(Dtype) * height * width * channels); + caffe_set(height * width * channels, Dtype(0), data_im); int height_col = (height + 2 * pad - ksize) / stride + 1; int width_col = (width + 2 * pad - ksize) / stride + 1; int channels_col = channels * ksize * ksize; diff --git a/src/caffe/util/im2col.cu b/src/caffe/util/im2col.cu index ec4465eff66..79faa6cb5c9 100644 --- a/src/caffe/util/im2col.cu +++ b/src/caffe/util/im2col.cu @@ -106,8 +106,6 @@ template void col2im_gpu(const Dtype* data_col, const int channels, const int height, const int width, const int ksize, const int pad, const int stride, Dtype* data_im) { - // CUDA_CHECK(cudaMemset(data_im, 0, - // sizeof(Dtype) * height * width * channels)); int height_col = (height + 2 * pad - ksize) / stride + 1; int width_col = (width + 2 * pad - ksize) / stride + 1; int num_kernels = channels * height * width; diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index 63c8fac69c5..849e53b9ca4 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -20,27 +20,20 @@ __global__ void set_kernel(const int n, const Dtype alpha, Dtype* y) { } } -template <> -void caffe_gpu_set(const int N, const float alpha, float* Y) { +template +void caffe_gpu_set(const int N, const Dtype alpha, Dtype* Y) { if (alpha == 0) { - CUDA_CHECK(cudaMemset(Y, 0, sizeof(float) * N)); + CUDA_CHECK(cudaMemset(Y, 0, sizeof(Dtype) * N)); return; } // NOLINT_NEXT_LINE(whitespace/operators) - set_kernel<<>>( + set_kernel<<>>( N, alpha, Y); } -template <> -void caffe_gpu_set(const int N, const double alpha, double* Y) { - if (alpha == 0) { - CUDA_CHECK(cudaMemset(Y, 0, sizeof(double) * N)); - return; - } - // NOLINT_NEXT_LINE(whitespace/operators) - set_kernel<<>>( - N, alpha, Y); -} +template void caffe_gpu_set(const int N, const int alpha, int* Y); +template void caffe_gpu_set(const int N, const float alpha, float* Y); +template void caffe_gpu_set(const int N, const double alpha, double* Y); template __global__ void add_scalar_kernel(const int n, const Dtype alpha, Dtype* y) { From 6461365565bd8a661522a267c7caae1a37313935 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 28 Jun 2014 13:48:37 -0700 Subject: [PATCH 0214/2053] reduce caffe_copy to instantiations, split off caffe_memcpy for void* --- include/caffe/util/math_functions.hpp | 2 +- src/caffe/layers/dropout_layer.cu | 2 +- src/caffe/syncedmem.cpp | 4 ++-- src/caffe/test/test_syncedmem.cpp | 4 ++-- src/caffe/util/math_functions.cpp | 32 ++++++++------------------- 5 files changed, 15 insertions(+), 29 deletions(-) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index b5f4dfbd1a8..97a057103db 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -59,7 +59,7 @@ void caffe_gpu_axpby(const int N, const Dtype alpha, const Dtype* X, template void caffe_copy(const int N, const Dtype *X, Dtype *Y); -void caffe_copy(const size_t N, const void *X, void *Y); +void caffe_memcpy(const size_t N, const void *X, void *Y); template void caffe_set(const int N, const Dtype alpha, Dtype *X); diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 11a426312ce..c9f3ecd2dd5 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -71,7 +71,7 @@ void DropoutLayer::Backward_gpu(const vector*>& top, count, top_diff, mask, uint_thres_, scale_, bottom_diff); CUDA_POST_KERNEL_CHECK; } else { - caffe_gpu_copy(top[0]->count(), top_diff, bottom_diff); + caffe_copy(top[0]->count(), top_diff, bottom_diff); } } } diff --git a/src/caffe/syncedmem.cpp b/src/caffe/syncedmem.cpp index 011d35976a5..9fe55280de9 100644 --- a/src/caffe/syncedmem.cpp +++ b/src/caffe/syncedmem.cpp @@ -33,7 +33,7 @@ inline void SyncedMemory::to_cpu() { CaffeMallocHost(&cpu_ptr_, size_); own_cpu_data_ = true; } - caffe_copy(size_, gpu_ptr_, cpu_ptr_); + caffe_memcpy(size_, gpu_ptr_, cpu_ptr_); head_ = SYNCED; break; case HEAD_AT_CPU: @@ -53,7 +53,7 @@ inline void SyncedMemory::to_gpu() { if (gpu_ptr_ == NULL) { CUDA_CHECK(cudaMalloc(&gpu_ptr_, size_)); } - caffe_copy(size_, cpu_ptr_, gpu_ptr_); + caffe_memcpy(size_, cpu_ptr_, gpu_ptr_); head_ = SYNCED; break; case HEAD_AT_GPU: diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index a7a5131578e..3aaeafc353e 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -58,7 +58,7 @@ TEST_F(SyncedMemoryTest, TestGPURead) { EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same char* recovered_value = new char[10]; - caffe_copy(size_t(10), gpu_data, reinterpret_cast(recovered_value)); + caffe_memcpy(10, gpu_data, recovered_value); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((reinterpret_cast(recovered_value))[i], 1); } @@ -72,7 +72,7 @@ TEST_F(SyncedMemoryTest, TestGPURead) { gpu_data = mem.gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same - caffe_copy(size_t(10), gpu_data, reinterpret_cast(recovered_value)); + caffe_memcpy(10, gpu_data, recovered_value); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((reinterpret_cast(recovered_value))[i], 2); } diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index b1b62edb0d2..918bb3c361c 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -149,34 +149,20 @@ void caffe_add_scalar(const int N, const double alpha, double* Y) { } } -template <> -void caffe_copy(const int N, const int* X, int* Y) { - if (X != Y) { - CUDA_CHECK(cudaMemcpy(Y, X, sizeof(int) * N, cudaMemcpyDefault)); - } -} - -template <> -void caffe_copy(const int N, const unsigned int* X, - unsigned int* Y) { - if (X != Y) { - CUDA_CHECK(cudaMemcpy(Y, X, sizeof(unsigned int) * N, cudaMemcpyDefault)); - } -} - -template <> -void caffe_copy(const int N, const float* X, float* Y) { +template +void caffe_copy(const int N, const Dtype* X, Dtype* Y) { if (X != Y) { - CUDA_CHECK(cudaMemcpy(Y, X, sizeof(float) * N, cudaMemcpyDefault)); + CUDA_CHECK(cudaMemcpy(Y, X, sizeof(Dtype) * N, cudaMemcpyDefault)); } } -template <> -void caffe_copy(const int N, const double* X, double* Y) { - CUDA_CHECK(cudaMemcpy(Y, X, sizeof(double) * N, cudaMemcpyDefault)); -} +template void caffe_copy(const int N, const int* X, int* Y); +template void caffe_copy(const int N, const unsigned int* X, + unsigned int* Y); +template void caffe_copy(const int N, const float* X, float* Y); +template void caffe_copy(const int N, const double* X, double* Y); -void caffe_copy(const size_t N, const void* X, void* Y) { +void caffe_memcpy(const size_t N, const void* X, void* Y) { if (X != Y) { CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); } From 19e909ba982baeaf5505812ea49aba7066967576 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 28 Jun 2014 14:05:35 -0700 Subject: [PATCH 0215/2053] fix casts (static for void*) --- src/caffe/blob.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index 69ff49efc46..8df46323eee 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -75,25 +75,25 @@ const Dtype* Blob::gpu_diff() const { template Dtype* Blob::mutable_cpu_data() { CHECK(data_); - return reinterpret_cast(data_->mutable_cpu_data()); + return static_cast(data_->mutable_cpu_data()); } template Dtype* Blob::mutable_gpu_data() { CHECK(data_); - return reinterpret_cast(data_->mutable_gpu_data()); + return static_cast(data_->mutable_gpu_data()); } template Dtype* Blob::mutable_cpu_diff() { CHECK(diff_); - return reinterpret_cast(diff_->mutable_cpu_data()); + return static_cast(diff_->mutable_cpu_data()); } template Dtype* Blob::mutable_gpu_diff() { CHECK(diff_); - return reinterpret_cast(diff_->mutable_gpu_data()); + return static_cast(diff_->mutable_gpu_data()); } template @@ -121,15 +121,15 @@ void Blob::Update() { case SyncedMemory::HEAD_AT_CPU: // perform computation on CPU caffe_axpy(count_, Dtype(-1), - reinterpret_cast(diff_->cpu_data()), - reinterpret_cast(data_->mutable_cpu_data())); + static_cast(diff_->cpu_data()), + static_cast(data_->mutable_cpu_data())); break; case SyncedMemory::HEAD_AT_GPU: case SyncedMemory::SYNCED: // perform computation on GPU caffe_gpu_axpy(count_, Dtype(-1), - reinterpret_cast(diff_->gpu_data()), - reinterpret_cast(data_->mutable_gpu_data())); + static_cast(diff_->gpu_data()), + static_cast(data_->mutable_gpu_data())); break; default: LOG(FATAL) << "Syncedmem not initialized."; @@ -150,19 +150,19 @@ void Blob::CopyFrom(const Blob& source, bool copy_diff, bool reshape) { case Caffe::GPU: if (copy_diff) { caffe_copy(count_, source.gpu_diff(), - reinterpret_cast(diff_->mutable_gpu_data())); + static_cast(diff_->mutable_gpu_data())); } else { caffe_copy(count_, source.gpu_data(), - reinterpret_cast(data_->mutable_gpu_data())); + static_cast(data_->mutable_gpu_data())); } break; case Caffe::CPU: if (copy_diff) { caffe_copy(count_, source.cpu_diff(), - reinterpret_cast(diff_->mutable_cpu_data())); + static_cast(diff_->mutable_cpu_data())); } else { caffe_copy(count_, source.cpu_data(), - reinterpret_cast(data_->mutable_cpu_data())); + static_cast(data_->mutable_cpu_data())); } break; default: From 18a4e2d1fc7a269e03be24f3a23bc59bc071a03e Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 3 Jul 2014 18:15:38 -0700 Subject: [PATCH 0216/2053] customize compiler setting in Makefile.config in case of issues with default compilers or exotic platforms. --- Makefile | 5 +++++ Makefile.config.example | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/Makefile b/Makefile index 6d8cb905128..f8abc1b2b88 100644 --- a/Makefile +++ b/Makefile @@ -194,6 +194,11 @@ ifeq ($(OSX), 1) endif endif +# Custom compiler +ifdef CUSTOM_CXX + CXX := $(CUSTOM_CXX) +endif + # Debugging ifeq ($(DEBUG), 1) COMMON_FLAGS := -DDEBUG -g -O0 diff --git a/Makefile.config.example b/Makefile.config.example index 6c3948fc2d7..17c90016f75 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -1,6 +1,10 @@ ## Refer to http://caffe.berkeleyvision.org/installation.html # Contributions simplifying and improving our build system are welcome! +# To customize your choice of compiler, uncomment and set the following. +# N.B. the default for Linux is g++ and the default for OSX is clang++ +# CUSTOM_CXX := g++ + # CUDA directory contains bin/ and lib/ directories that we need. CUDA_DIR := /usr/local/cuda # On Ubuntu 14.04, if cuda tools are installed via From 4e5ef959abd2f5a3f18010963f12537425ce091e Mon Sep 17 00:00:00 2001 From: Ronghang Hu Date: Thu, 3 Jul 2014 20:30:25 -0700 Subject: [PATCH 0217/2053] Update caffe.proto Add pad_h, pad_w, kernel_size_h, kernel_size_w, stride_h, stride_w to support pooling on rectangle regions. --- src/caffe/proto/caffe.proto | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index adb75264f8e..effebd09a38 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -405,11 +405,17 @@ message PoolingParameter { STOCHASTIC = 2; } optional PoolMethod pool = 1 [default = MAX]; // The pooling method - optional uint32 kernel_size = 2; // The kernel size - optional uint32 stride = 3 [default = 1]; // The stride - // The padding size -- currently implemented only for average and max pooling. - // average pooling zero pads. max pooling -inf pads. - optional uint32 pad = 4 [default = 0]; + // Pad, kernel size, and stride are all given as a single value for equal + // dimensions in height and width or as Y, X pairs. + optional uint32 pad = 4 [default = 0]; // The padding size (equal in Y, X) + optional uint32 pad_h = 9 [default = 0]; // The padding height + optional uint32 pad_w = 10 [default = 0]; // The padding width + optional uint32 kernel_size = 2; // The kernel size (square) + optional uint32 kernel_size_h = 5; // The kernel height + optional uint32 kernel_size_w = 6; // The kernel width + optional uint32 stride = 3 [default = 1]; // The stride (equal in Y, X) + optional uint32 stride_h = 7; // The stride height + optional uint32 stride_w = 8; // The stride width } // Message that stores parameters used by PowerLayer From 9905c20130783046248b8c17a3cbc17847019d22 Mon Sep 17 00:00:00 2001 From: Ronghang Hu Date: Thu, 3 Jul 2014 20:33:50 -0700 Subject: [PATCH 0218/2053] Update vision_layers.hpp Replace pad_, kernel_size_, stride_ with pad_h_, pad_w_, kernel_size_h_, kernel_size_w_, stride_h_, stride_w_ to support pooling on rectangle regions. --- include/caffe/vision_layers.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index b68dcbf6e83..62b65bc1780 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -361,9 +361,9 @@ class PoolingLayer : public Layer { const vector& propagate_down, vector*>* bottom); int max_top_blobs_; - int kernel_size_; - int stride_; - int pad_; + int kernel_size_h_, kernel_size_w_; + int stride_h_, stride_w_; + int pad_h_, pad_w_; int channels_; int height_; int width_; From dd82d97190a2c14ebe3799a7ed01ff2c38578f96 Mon Sep 17 00:00:00 2001 From: Ronghang Hu Date: Thu, 3 Jul 2014 20:42:58 -0700 Subject: [PATCH 0219/2053] Update pooling_layer.cpp Replace pad_, kernel_size_, stride_ with pad_h_, pad_w_, kernel_size_h_, kernel_size_w_, stride_h_, stride_w_ to support pooling on rectangle regions. --- src/caffe/layers/pooling_layer.cpp | 81 +++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 24 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index bc002078814..3b64741fa5f 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -28,35 +28,68 @@ void PoolingLayer::SetUp(const vector*>& bottom, max_top_blobs_ = 1; } Layer::SetUp(bottom, top); - kernel_size_ = this->layer_param_.pooling_param().kernel_size(); - stride_ = this->layer_param_.pooling_param().stride(); - pad_ = this->layer_param_.pooling_param().pad(); - if (pad_ != 0) { + PoolingParameter pool_param = this->layer_param_.pooling_param(); + CHECK(!pool_param.has_kernel_size() != + !(pool_param.has_kernel_h() && pool_param.has_kernel_w())) + << "Filter size is kernel_size OR kernel_h and kernel_w; not both"; + CHECK(pool_param.has_kernel_size() || + (pool_param.has_kernel_h() && pool_param.has_kernel_w())) + << "For non-square filters both kernel_h and kernel_w are required."; + CHECK((pool_param.has_pad() + && !(pool_param.has_pad_h() || pool_param.has_pad_w())) + || (!pool_param.has_pad() + && (pool_param.has_pad_h() && pool_param.has_pad_w()) + || (!pool_param.has_pad_h() && !pool_param.has_pad_w()))) + << "Padding size is pad OR pad_h and pad_w; not both"; + CHECK(!pool_param.has_stride() != + !(pool_param.has_stride_h() && pool_param.has_stride_w())) + << "Stride is stride OR stride_h and stride_w are required."; + if (pool_param.has_kernel_size()) { + kernel_h_ = kernel_w_ = pool_param.kernel_size(); + } else { + kernel_h_ = pool_param.kernel_h(); + kernel_w_ = pool_param.kernel_w(); + } + CHECK_GT(kernel_h_ * kernel_w_, 0) << "Filter dimensions cannot be zero."; + if (pool_param.has_pad()) { + pad_h_ = pad_w_ = pool_param.pad(); + } else { + pad_h_ = pool_param.pad_h(); + pad_w_ = pool_param.pad_w(); + } + if (pool_param.has_stride()) { + stride_h_ = stride_w_ = pool_param.stride(); + } else { + stride_h_ = pool_param.stride_h(); + stride_w_ = pool_param.stride_w(); + } + if (pad_h_ != 0 || pad_w_ != 0) { CHECK(this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_AVE || this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX) << "Padding implemented only for average and max pooling."; - CHECK_LT(pad_, kernel_size_); + CHECK_LT(pad_h_, kernel_size_h_); + CHECK_LT(pad_w_, kernel_size_w_); } channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); pooled_height_ = static_cast(ceil(static_cast( - height_ + 2 * pad_ - kernel_size_) / stride_)) + 1; + height_ + 2 * pad_h_ - kernel_size_h_) / stride_h_)) + 1; pooled_width_ = static_cast(ceil(static_cast( - width_ + 2 * pad_ - kernel_size_) / stride_)) + 1; - if (pad_) { + width_ + 2 * pad_w_ - kernel_size_w_) / stride_w_)) + 1; + if (pad_h_ || pad_w_) { // If we have padding, ensure that the last pooling starts strictly // inside the image (instead of at the padding); otherwise clip the last. - if ((pooled_height_ - 1) * stride_ >= height_ + pad_) { + if ((pooled_height_ - 1) * stride_h_ >= height_ + pad_h_) { --pooled_height_; } - if ((pooled_width_ - 1) * stride_ >= width_ + pad_) { + if ((pooled_width_ - 1) * stride_w_ >= width_ + pad_w_) { --pooled_width_; } - CHECK_LT((pooled_height_ - 1) * stride_, height_ + pad_); - CHECK_LT((pooled_width_ - 1) * stride_, width_ + pad_); + CHECK_LT((pooled_height_ - 1) * stride_h_, height_ + pad_h_); + CHECK_LT((pooled_width_ - 1) * stride_w_, width_ + pad_w_); } (*top)[0]->Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); @@ -107,10 +140,10 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, for (int c = 0; c < channels_; ++c) { for (int ph = 0; ph < pooled_height_; ++ph) { for (int pw = 0; pw < pooled_width_; ++pw) { - int hstart = ph * stride_ - pad_; - int wstart = pw * stride_ - pad_; - int hend = min(hstart + kernel_size_, height_); - int wend = min(wstart + kernel_size_, width_); + int hstart = ph * stride_h_ - pad_h_; + int wstart = pw * stride_w_ - pad_w_; + int hend = min(hstart + kernel_size_h_, height_); + int wend = min(wstart + kernel_size_w_, width_); hstart = max(hstart, 0); wstart = max(wstart, 0); const int pool_index = ph * pooled_width_ + pw; @@ -149,10 +182,10 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, for (int c = 0; c < channels_; ++c) { for (int ph = 0; ph < pooled_height_; ++ph) { for (int pw = 0; pw < pooled_width_; ++pw) { - int hstart = ph * stride_ - pad_; - int wstart = pw * stride_ - pad_; - int hend = min(hstart + kernel_size_, height_ + pad_); - int wend = min(wstart + kernel_size_, width_ + pad_); + int hstart = ph * stride_h_ - pad_h_; + int wstart = pw * stride_w_ - pad_w_; + int hend = min(hstart + kernel_size_h_, height_ + pad_h_); + int wend = min(wstart + kernel_size_w_, width_ + pad_w_); int pool_size = (hend - hstart) * (wend - wstart); hstart = max(hstart, 0); wstart = max(wstart, 0); @@ -231,10 +264,10 @@ void PoolingLayer::Backward_cpu(const vector*>& top, for (int c = 0; c < channels_; ++c) { for (int ph = 0; ph < pooled_height_; ++ph) { for (int pw = 0; pw < pooled_width_; ++pw) { - int hstart = ph * stride_ - pad_; - int wstart = pw * stride_ - pad_; - int hend = min(hstart + kernel_size_, height_ + pad_); - int wend = min(wstart + kernel_size_, width_ + pad_); + int hstart = ph * stride_h_ - pad_h_; + int wstart = pw * stride_w_ - pad_w_; + int hend = min(hstart + kernel_size_h_, height_ + pad_h_); + int wend = min(wstart + kernel_size_w_, width_ + pad_w_); int pool_size = (hend - hstart) * (wend - wstart); hstart = max(hstart, 0); wstart = max(wstart, 0); From ce88f9f966d68db43a7c0a7563c27c59e8433cdc Mon Sep 17 00:00:00 2001 From: Ronghang Hu Date: Thu, 3 Jul 2014 21:05:23 -0700 Subject: [PATCH 0220/2053] Update pooling_layer.cu Replace pad_, kernel_size_, stride_ with pad_h_, pad_w_, kernel_size_h_, kernel_size_w_, stride_h_, stride_w_ to support pooling on rectangle regions. --- src/caffe/layers/pooling_layer.cu | 117 ++++++++++++++++-------------- 1 file changed, 64 insertions(+), 53 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index f07fe3c48ac..3ac74f8bbb3 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -17,17 +17,18 @@ template __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, const int pad, Dtype* top_data, + const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int stride_w, const int pad_h, const int pad_w, Dtype* top_data, int* mask, Dtype* top_mask) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; int n = index / pooled_width / pooled_height / channels; - int hstart = ph * stride - pad; - int wstart = pw * stride - pad; - int hend = min(hstart + kernel_size, height); - int wend = min(wstart + kernel_size, width); + int hstart = ph * stride_h - pad_h; + int wstart = pw * stride_w - pad_w; + int hend = min(hstart + kernel_size_h, height); + int wend = min(wstart + kernel_size_w, width); hstart = max(hstart, 0); wstart = max(wstart, 0); Dtype maxval = -FLT_MAX; @@ -54,16 +55,17 @@ template __global__ void AvePoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, const int pad, Dtype* top_data) { + const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int stride_w, const int pad_h, const int pad_w, Dtype* top_data) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; int n = index / pooled_width / pooled_height / channels; - int hstart = ph * stride - pad; - int wstart = pw * stride - pad; - int hend = min(hstart + kernel_size, height + pad); - int wend = min(wstart + kernel_size, width + pad); + int hstart = ph * stride_h - pad_h; + int wstart = pw * stride_w - pad_w; + int hend = min(hstart + kernel_size_h, height + pad_h); + int wend = min(wstart + kernel_size_w, width + pad_w); int pool_size = (hend - hstart) * (wend - wstart); hstart = max(hstart, 0); wstart = max(wstart, 0); @@ -85,16 +87,17 @@ __global__ void StoPoolForwardTrain(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, Dtype* rand_idx, Dtype* top_data) { + const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int stride_w, Dtype* rand_idx, Dtype* top_data) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; int n = index / pooled_width / pooled_height / channels; - int hstart = ph * stride; - int hend = min(hstart + kernel_size, height); - int wstart = pw * stride; - int wend = min(wstart + kernel_size, width); + int hstart = ph * stride_h; + int hend = min(hstart + kernel_size_h, height); + int wstart = pw * stride_w; + int wend = min(wstart + kernel_size_w, width); Dtype cumsum = 0.; bottom_data += (n * channels + c) * height * width; // First pass: get sum @@ -125,16 +128,17 @@ __global__ void StoPoolForwardTest(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, Dtype* top_data) { + const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int stride_w, Dtype* top_data) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; int ph = (index / pooled_width) % pooled_height; int c = (index / pooled_width / pooled_height) % channels; int n = index / pooled_width / pooled_height / channels; - int hstart = ph * stride; - int hend = min(hstart + kernel_size, height); - int wstart = pw * stride; - int wend = min(wstart + kernel_size, width); + int hstart = ph * stride_h; + int hend = min(hstart + kernel_size_h, height); + int wstart = pw * stride_w; + int wend = min(wstart + kernel_size_w, width); // We set cumsum to be 0 to avoid divide-by-zero problems Dtype cumsum = FLT_MIN; Dtype cumvalues = 0.; @@ -171,15 +175,16 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_size_, stride_, - pad_, top_data, mask, top_mask); + height_, width_, pooled_height_, pooled_width_, kernel_size_h_, + kernel_size_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data, + mask, top_mask); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) AvePoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_size_, stride_, - pad_, top_data); + height_, width_, pooled_height_, pooled_width_, kernel_size_h_, + kernel_size_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data); break; case PoolingParameter_PoolMethod_STOCHASTIC: if (Caffe::phase() == Caffe::TRAIN) { @@ -190,15 +195,16 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, StoPoolForwardTrain<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_size_, stride_, + height_, width_, pooled_height_, pooled_width_, kernel_size_h_, + kernel_size_w_, stride_h_, stride_w_, rand_idx_.mutable_gpu_data(), top_data); } else { // NOLINT_NEXT_LINE(whitespace/operators) StoPoolForwardTest<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_size_, stride_, - top_data); + height_, width_, pooled_height_, pooled_width_, kernel_size_h_, + kernel_size_w_, stride_h_, stride_w_, top_data); } break; default: @@ -213,8 +219,9 @@ template __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, const int* mask, const Dtype* top_mask, const int num, const int channels, const int height, const int width, const int pooled_height, - const int pooled_width, const int kernel_size, const int stride, - const int pad, Dtype* bottom_diff) { + const int pooled_width, const int kernel_size_h, const int kernel_size_w, + const int stride_h, const int stride_w, const int pad_h, const int pad_w, + Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset @@ -223,11 +230,11 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, int c = (index / width / height) % channels; int n = index / width / height / channels; int phstart = - (h + pad < kernel_size) ? 0 : (h + pad - kernel_size) / stride + 1; - int phend = min((h + pad) / stride + 1, pooled_height); + (h + pad_h < kernel_size_h) ? 0 : (h + pad_h - kernel_size_h) / stride_h + 1; + int phend = min((h + pad_h) / stride_h + 1, pooled_height); int pwstart = - (w + pad < kernel_size) ? 0 : (w + pad - kernel_size) / stride + 1; - int pwend = min((w + pad) / stride + 1, pooled_width); + (w + pad_w < kernel_size_w) ? 0 : (w + pad_w - kernel_size_w) / stride_w + 1; + int pwend = min((w + pad_w) / stride_w + 1, pooled_width); Dtype gradient = 0; int offset = (n * channels + c) * pooled_height * pooled_width; top_diff += offset; @@ -258,28 +265,29 @@ template __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, const int pad, + const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int stride_w, const int pad_h, const int pad_w, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset - int w = index % width + pad; - int h = (index / width) % height + pad; + int w = index % width + pad_w; + int h = (index / width) % height + pad_h; int c = (index / width / height) % channels; int n = index / width / height / channels; - int phstart = (h < kernel_size) ? 0 : (h - kernel_size) / stride + 1; - int phend = min(h / stride + 1, pooled_height); - int pwstart = (w < kernel_size) ? 0 : (w - kernel_size) / stride + 1; - int pwend = min(w / stride + 1, pooled_width); + int phstart = (h < kernel_size_h) ? 0 : (h - kernel_size_h) / stride_h + 1; + int phend = min(h / stride_h + 1, pooled_height); + int pwstart = (w < kernel_size_w) ? 0 : (w - kernel_size_w) / stride_w + 1; + int pwend = min(w / stride_w + 1, pooled_width); Dtype gradient = 0; top_diff += (n * channels + c) * pooled_height * pooled_width; for (int ph = phstart; ph < phend; ++ph) { for (int pw = pwstart; pw < pwend; ++pw) { // figure out the pooling size - int hstart = ph * stride - pad; - int wstart = pw * stride - pad; - int hend = min(hstart + kernel_size, height + pad); - int wend = min(wstart + kernel_size, width + pad); + int hstart = ph * stride_h - pad_h; + int wstart = pw * stride_w - pad_w; + int hend = min(hstart + kernel_size_h, height + pad_h); + int wend = min(wstart + kernel_size_w, width + pad_w); int pool_size = (hend - hstart) * (wend - wstart); gradient += top_diff[ph * pooled_width + pw] / pool_size; } @@ -294,7 +302,8 @@ __global__ void StoPoolBackward(const int nthreads, const Dtype* rand_idx, const Dtype* top_diff, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size, const int stride, Dtype* bottom_diff) { + const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int stride_w, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index // find out the local offset @@ -302,10 +311,10 @@ __global__ void StoPoolBackward(const int nthreads, int h = (index / width) % height; int c = (index / width / height) % channels; int n = index / width / height / channels; - int phstart = (h < kernel_size) ? 0 : (h - kernel_size) / stride + 1; - int phend = min(h / stride + 1, pooled_height); - int pwstart = (w < kernel_size) ? 0 : (w - kernel_size) / stride + 1; - int pwend = min(w / stride + 1, pooled_width); + int phstart = (h < kernel_size_h) ? 0 : (h - kernel_size_h) / stride_h + 1; + int phend = min(h / stride_h + 1, pooled_height); + int pwstart = (w < kernel_size_w) ? 0 : (w - kernel_size_w) / stride_w + 1; + int pwend = min(w / stride_w + 1, pooled_width); Dtype gradient = 0; rand_idx += (n * channels + c) * pooled_height * pooled_width; top_diff += (n * channels + c) * pooled_height * pooled_width; @@ -345,21 +354,23 @@ void PoolingLayer::Backward_gpu(const vector*>& top, MaxPoolBackward<<>>( count, top_diff, mask, top_mask, top[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, - kernel_size_, stride_, pad_, bottom_diff); + kernel_size_h_, kernel_size_w_, stride_h_, stride_w_, pad_h_, pad_w_, + bottom_diff); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) AvePoolBackward<<>>( count, top_diff, top[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_size_, stride_, - pad_, bottom_diff); + height_, width_, pooled_height_, pooled_width_, kernel_size_h_, + kernel_size_w_, stride_h_, stride_w_, pad_h_, pad_w_, bottom_diff); break; case PoolingParameter_PoolMethod_STOCHASTIC: // NOLINT_NEXT_LINE(whitespace/operators) StoPoolBackward<<>>( count, rand_idx_.gpu_data(), top_diff, top[0]->num(), channels_, height_, width_, pooled_height_, - pooled_width_, kernel_size_, stride_, bottom_diff); + pooled_width_, kernel_size_h_, kernel_size_w_, stride_h_, stride_w_, + bottom_diff); break; default: LOG(FATAL) << "Unknown pooling method."; From 7b727b020d1159dea63ef56daf98eaa147fd0ebb Mon Sep 17 00:00:00 2001 From: Ronghang Hu Date: Fri, 4 Jul 2014 17:29:56 -0700 Subject: [PATCH 0221/2053] fixing pooling SetUp() to allow default values for stride and pad --- src/caffe/layers/pooling_layer.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 3b64741fa5f..d4feaad178f 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -35,15 +35,15 @@ void PoolingLayer::SetUp(const vector*>& bottom, CHECK(pool_param.has_kernel_size() || (pool_param.has_kernel_h() && pool_param.has_kernel_w())) << "For non-square filters both kernel_h and kernel_w are required."; - CHECK((pool_param.has_pad() - && !(pool_param.has_pad_h() || pool_param.has_pad_w())) - || (!pool_param.has_pad() - && (pool_param.has_pad_h() && pool_param.has_pad_w()) - || (!pool_param.has_pad_h() && !pool_param.has_pad_w()))) - << "Padding size is pad OR pad_h and pad_w; not both"; - CHECK(!pool_param.has_stride() != - !(pool_param.has_stride_h() && pool_param.has_stride_w())) + CHECK((!pool_param.has_pad() && pool_param.has_pad_h() + && pool_param.has_pad_w()) + || (!pool_param.has_pad_h() && !pool_param.has_pad_w())) + << "pad is pad OR pad_h and pad_w are required."; + CHECK((!pool_param.has_stride() && pool_param.has_stride_h() + && pool_param.has_stride_w()) + || (!pool_param.has_stride_h() && !pool_param.has_stride_w())) << "Stride is stride OR stride_h and stride_w are required."; + if (pool_param.has_kernel_size()) { kernel_h_ = kernel_w_ = pool_param.kernel_size(); } else { @@ -51,13 +51,13 @@ void PoolingLayer::SetUp(const vector*>& bottom, kernel_w_ = pool_param.kernel_w(); } CHECK_GT(kernel_h_ * kernel_w_, 0) << "Filter dimensions cannot be zero."; - if (pool_param.has_pad()) { + if (!pool_param.has_pad_h()) { pad_h_ = pad_w_ = pool_param.pad(); } else { pad_h_ = pool_param.pad_h(); pad_w_ = pool_param.pad_w(); } - if (pool_param.has_stride()) { + if (!pool_param.has_stride_h()) { stride_h_ = stride_w_ = pool_param.stride(); } else { stride_h_ = pool_param.stride_h(); From f74979e7de2532ae4eccffa8aabad46c31a90285 Mon Sep 17 00:00:00 2001 From: Ronghang Hu Date: Sat, 5 Jul 2014 08:21:50 -0700 Subject: [PATCH 0222/2053] add tests for rectangular pooling regions --- include/caffe/vision_layers.hpp | 2 +- src/caffe/layers/pooling_layer.cpp | 24 +-- src/caffe/layers/pooling_layer.cu | 70 +++---- src/caffe/proto/caffe.proto | 4 +- src/caffe/test/test_pooling_layer.cpp | 270 +++++++++++++++++++++++++- 5 files changed, 314 insertions(+), 56 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 62b65bc1780..450524e2a7d 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -361,7 +361,7 @@ class PoolingLayer : public Layer { const vector& propagate_down, vector*>* bottom); int max_top_blobs_; - int kernel_size_h_, kernel_size_w_; + int kernel_h_, kernel_w_; int stride_h_, stride_w_; int pad_h_, pad_w_; int channels_; diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index d4feaad178f..d8cd2e2139d 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -43,14 +43,14 @@ void PoolingLayer::SetUp(const vector*>& bottom, && pool_param.has_stride_w()) || (!pool_param.has_stride_h() && !pool_param.has_stride_w())) << "Stride is stride OR stride_h and stride_w are required."; - if (pool_param.has_kernel_size()) { kernel_h_ = kernel_w_ = pool_param.kernel_size(); } else { kernel_h_ = pool_param.kernel_h(); kernel_w_ = pool_param.kernel_w(); } - CHECK_GT(kernel_h_ * kernel_w_, 0) << "Filter dimensions cannot be zero."; + CHECK_GT(kernel_h_, 0) << "Filter dimensions cannot be zero."; + CHECK_GT(kernel_w_, 0) << "Filter dimensions cannot be zero."; if (!pool_param.has_pad_h()) { pad_h_ = pad_w_ = pool_param.pad(); } else { @@ -69,16 +69,16 @@ void PoolingLayer::SetUp(const vector*>& bottom, || this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX) << "Padding implemented only for average and max pooling."; - CHECK_LT(pad_h_, kernel_size_h_); - CHECK_LT(pad_w_, kernel_size_w_); + CHECK_LT(pad_h_, kernel_h_); + CHECK_LT(pad_w_, kernel_w_); } channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); pooled_height_ = static_cast(ceil(static_cast( - height_ + 2 * pad_h_ - kernel_size_h_) / stride_h_)) + 1; + height_ + 2 * pad_h_ - kernel_h_) / stride_h_)) + 1; pooled_width_ = static_cast(ceil(static_cast( - width_ + 2 * pad_w_ - kernel_size_w_) / stride_w_)) + 1; + width_ + 2 * pad_w_ - kernel_w_) / stride_w_)) + 1; if (pad_h_ || pad_w_) { // If we have padding, ensure that the last pooling starts strictly // inside the image (instead of at the padding); otherwise clip the last. @@ -142,8 +142,8 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, for (int pw = 0; pw < pooled_width_; ++pw) { int hstart = ph * stride_h_ - pad_h_; int wstart = pw * stride_w_ - pad_w_; - int hend = min(hstart + kernel_size_h_, height_); - int wend = min(wstart + kernel_size_w_, width_); + int hend = min(hstart + kernel_h_, height_); + int wend = min(wstart + kernel_w_, width_); hstart = max(hstart, 0); wstart = max(wstart, 0); const int pool_index = ph * pooled_width_ + pw; @@ -184,8 +184,8 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, for (int pw = 0; pw < pooled_width_; ++pw) { int hstart = ph * stride_h_ - pad_h_; int wstart = pw * stride_w_ - pad_w_; - int hend = min(hstart + kernel_size_h_, height_ + pad_h_); - int wend = min(wstart + kernel_size_w_, width_ + pad_w_); + int hend = min(hstart + kernel_h_, height_ + pad_h_); + int wend = min(wstart + kernel_w_, width_ + pad_w_); int pool_size = (hend - hstart) * (wend - wstart); hstart = max(hstart, 0); wstart = max(wstart, 0); @@ -266,8 +266,8 @@ void PoolingLayer::Backward_cpu(const vector*>& top, for (int pw = 0; pw < pooled_width_; ++pw) { int hstart = ph * stride_h_ - pad_h_; int wstart = pw * stride_w_ - pad_w_; - int hend = min(hstart + kernel_size_h_, height_ + pad_h_); - int wend = min(wstart + kernel_size_w_, width_ + pad_w_); + int hend = min(hstart + kernel_h_, height_ + pad_h_); + int wend = min(wstart + kernel_w_, width_ + pad_w_); int pool_size = (hend - hstart) * (wend - wstart); hstart = max(hstart, 0); wstart = max(wstart, 0); diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 3ac74f8bbb3..e38028dd061 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -17,7 +17,7 @@ template __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, const int pad_h, const int pad_w, Dtype* top_data, int* mask, Dtype* top_mask) { CUDA_KERNEL_LOOP(index, nthreads) { @@ -27,8 +27,8 @@ __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, int n = index / pooled_width / pooled_height / channels; int hstart = ph * stride_h - pad_h; int wstart = pw * stride_w - pad_w; - int hend = min(hstart + kernel_size_h, height); - int wend = min(wstart + kernel_size_w, width); + int hend = min(hstart + kernel_h, height); + int wend = min(wstart + kernel_w, width); hstart = max(hstart, 0); wstart = max(wstart, 0); Dtype maxval = -FLT_MAX; @@ -55,7 +55,7 @@ template __global__ void AvePoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, const int pad_h, const int pad_w, Dtype* top_data) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; @@ -64,8 +64,8 @@ __global__ void AvePoolForward(const int nthreads, const Dtype* bottom_data, int n = index / pooled_width / pooled_height / channels; int hstart = ph * stride_h - pad_h; int wstart = pw * stride_w - pad_w; - int hend = min(hstart + kernel_size_h, height + pad_h); - int wend = min(wstart + kernel_size_w, width + pad_w); + int hend = min(hstart + kernel_h, height + pad_h); + int wend = min(wstart + kernel_w, width + pad_w); int pool_size = (hend - hstart) * (wend - wstart); hstart = max(hstart, 0); wstart = max(wstart, 0); @@ -87,7 +87,7 @@ __global__ void StoPoolForwardTrain(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, Dtype* rand_idx, Dtype* top_data) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; @@ -95,9 +95,9 @@ __global__ void StoPoolForwardTrain(const int nthreads, int c = (index / pooled_width / pooled_height) % channels; int n = index / pooled_width / pooled_height / channels; int hstart = ph * stride_h; - int hend = min(hstart + kernel_size_h, height); + int hend = min(hstart + kernel_h, height); int wstart = pw * stride_w; - int wend = min(wstart + kernel_size_w, width); + int wend = min(wstart + kernel_w, width); Dtype cumsum = 0.; bottom_data += (n * channels + c) * height * width; // First pass: get sum @@ -128,7 +128,7 @@ __global__ void StoPoolForwardTest(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, Dtype* top_data) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; @@ -136,9 +136,9 @@ __global__ void StoPoolForwardTest(const int nthreads, int c = (index / pooled_width / pooled_height) % channels; int n = index / pooled_width / pooled_height / channels; int hstart = ph * stride_h; - int hend = min(hstart + kernel_size_h, height); + int hend = min(hstart + kernel_h, height); int wstart = pw * stride_w; - int wend = min(wstart + kernel_size_w, width); + int wend = min(wstart + kernel_w, width); // We set cumsum to be 0 to avoid divide-by-zero problems Dtype cumsum = FLT_MIN; Dtype cumvalues = 0.; @@ -175,16 +175,16 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_size_h_, - kernel_size_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data, + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data, mask, top_mask); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) AvePoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_size_h_, - kernel_size_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data); + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data); break; case PoolingParameter_PoolMethod_STOCHASTIC: if (Caffe::phase() == Caffe::TRAIN) { @@ -195,16 +195,16 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, StoPoolForwardTrain<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_size_h_, - kernel_size_w_, stride_h_, stride_w_, + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, rand_idx_.mutable_gpu_data(), top_data); } else { // NOLINT_NEXT_LINE(whitespace/operators) StoPoolForwardTest<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_size_h_, - kernel_size_w_, stride_h_, stride_w_, top_data); + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, top_data); } break; default: @@ -219,7 +219,7 @@ template __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, const int* mask, const Dtype* top_mask, const int num, const int channels, const int height, const int width, const int pooled_height, - const int pooled_width, const int kernel_size_h, const int kernel_size_w, + const int pooled_width, const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, const int pad_h, const int pad_w, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { @@ -230,10 +230,10 @@ __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, int c = (index / width / height) % channels; int n = index / width / height / channels; int phstart = - (h + pad_h < kernel_size_h) ? 0 : (h + pad_h - kernel_size_h) / stride_h + 1; + (h + pad_h < kernel_h) ? 0 : (h + pad_h - kernel_h) / stride_h + 1; int phend = min((h + pad_h) / stride_h + 1, pooled_height); int pwstart = - (w + pad_w < kernel_size_w) ? 0 : (w + pad_w - kernel_size_w) / stride_w + 1; + (w + pad_w < kernel_w) ? 0 : (w + pad_w - kernel_w) / stride_w + 1; int pwend = min((w + pad_w) / stride_w + 1, pooled_width); Dtype gradient = 0; int offset = (n * channels + c) * pooled_height * pooled_width; @@ -265,7 +265,7 @@ template __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, const int pad_h, const int pad_w, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { @@ -275,9 +275,9 @@ __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, int h = (index / width) % height + pad_h; int c = (index / width / height) % channels; int n = index / width / height / channels; - int phstart = (h < kernel_size_h) ? 0 : (h - kernel_size_h) / stride_h + 1; + int phstart = (h < kernel_h) ? 0 : (h - kernel_h) / stride_h + 1; int phend = min(h / stride_h + 1, pooled_height); - int pwstart = (w < kernel_size_w) ? 0 : (w - kernel_size_w) / stride_w + 1; + int pwstart = (w < kernel_w) ? 0 : (w - kernel_w) / stride_w + 1; int pwend = min(w / stride_w + 1, pooled_width); Dtype gradient = 0; top_diff += (n * channels + c) * pooled_height * pooled_width; @@ -286,8 +286,8 @@ __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, // figure out the pooling size int hstart = ph * stride_h - pad_h; int wstart = pw * stride_w - pad_w; - int hend = min(hstart + kernel_size_h, height + pad_h); - int wend = min(wstart + kernel_size_w, width + pad_w); + int hend = min(hstart + kernel_h, height + pad_h); + int wend = min(wstart + kernel_w, width + pad_w); int pool_size = (hend - hstart) * (wend - wstart); gradient += top_diff[ph * pooled_width + pw] / pool_size; } @@ -302,7 +302,7 @@ __global__ void StoPoolBackward(const int nthreads, const Dtype* rand_idx, const Dtype* top_diff, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_size_h, const int kernel_size_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index @@ -311,9 +311,9 @@ __global__ void StoPoolBackward(const int nthreads, int h = (index / width) % height; int c = (index / width / height) % channels; int n = index / width / height / channels; - int phstart = (h < kernel_size_h) ? 0 : (h - kernel_size_h) / stride_h + 1; + int phstart = (h < kernel_h) ? 0 : (h - kernel_h) / stride_h + 1; int phend = min(h / stride_h + 1, pooled_height); - int pwstart = (w < kernel_size_w) ? 0 : (w - kernel_size_w) / stride_w + 1; + int pwstart = (w < kernel_w) ? 0 : (w - kernel_w) / stride_w + 1; int pwend = min(w / stride_w + 1, pooled_width); Dtype gradient = 0; rand_idx += (n * channels + c) * pooled_height * pooled_width; @@ -354,22 +354,22 @@ void PoolingLayer::Backward_gpu(const vector*>& top, MaxPoolBackward<<>>( count, top_diff, mask, top_mask, top[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, - kernel_size_h_, kernel_size_w_, stride_h_, stride_w_, pad_h_, pad_w_, + kernel_h_, kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, bottom_diff); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) AvePoolBackward<<>>( count, top_diff, top[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_size_h_, - kernel_size_w_, stride_h_, stride_w_, pad_h_, pad_w_, bottom_diff); + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, bottom_diff); break; case PoolingParameter_PoolMethod_STOCHASTIC: // NOLINT_NEXT_LINE(whitespace/operators) StoPoolBackward<<>>( count, rand_idx_.gpu_data(), top_diff, top[0]->num(), channels_, height_, width_, pooled_height_, - pooled_width_, kernel_size_h_, kernel_size_w_, stride_h_, stride_w_, + pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, bottom_diff); break; default: diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index effebd09a38..70a4ab2e8e9 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -411,8 +411,8 @@ message PoolingParameter { optional uint32 pad_h = 9 [default = 0]; // The padding height optional uint32 pad_w = 10 [default = 0]; // The padding width optional uint32 kernel_size = 2; // The kernel size (square) - optional uint32 kernel_size_h = 5; // The kernel height - optional uint32 kernel_size_w = 6; // The kernel width + optional uint32 kernel_h = 5; // The kernel height + optional uint32 kernel_w = 6; // The kernel width optional uint32 stride = 3 [default = 1]; // The stride (equal in Y, X) optional uint32 stride_h = 7; // The stride height optional uint32 stride_w = 8; // The stride width diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index b13d11f6c6d..651d20305b4 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -44,8 +44,8 @@ class PoolingLayerTest : public ::testing::Test { Blob* const blob_top_mask_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; - - void TestForward() { + // Test for 2x 2 square pooling layer + void TestForwardSquare() { LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(2); @@ -116,6 +116,256 @@ class PoolingLayerTest : public ::testing::Test { } } } + // Test for 3x 2 rectangular pooling layer with kernel_h > kernel_w + void TestForwardRectHigh() { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(3); + pooling_param->set_kernel_w(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + const int num = 2; + const int channels = 2; + blob_bottom_->Reshape(num, channels, 6, 6); + // Input: 2x 2 channels of: + // [35 1 6 26 19 24] + // [ 3 32 7 21 23 25] + // [31 9 2 22 27 20] + // [ 8 28 33 17 10 15] + // [30 5 34 12 14 16] + // [ 4 36 29 13 18 11] (this is generated by magic(6) in MATLAB) + for (int i = 0; i < 36 * num * channels; i += 36) { + blob_bottom_->mutable_cpu_data()[i + 0] = 35; + blob_bottom_->mutable_cpu_data()[i + 1] = 1; + blob_bottom_->mutable_cpu_data()[i + 2] = 6; + blob_bottom_->mutable_cpu_data()[i + 3] = 26; + blob_bottom_->mutable_cpu_data()[i + 4] = 19; + blob_bottom_->mutable_cpu_data()[i + 5] = 24; + blob_bottom_->mutable_cpu_data()[i + 6] = 3; + blob_bottom_->mutable_cpu_data()[i + 7] = 32; + blob_bottom_->mutable_cpu_data()[i + 8] = 7; + blob_bottom_->mutable_cpu_data()[i + 9] = 21; + blob_bottom_->mutable_cpu_data()[i + 10] = 23; + blob_bottom_->mutable_cpu_data()[i + 11] = 25; + blob_bottom_->mutable_cpu_data()[i + 12] = 31; + blob_bottom_->mutable_cpu_data()[i + 13] = 9; + blob_bottom_->mutable_cpu_data()[i + 14] = 2; + blob_bottom_->mutable_cpu_data()[i + 15] = 22; + blob_bottom_->mutable_cpu_data()[i + 16] = 27; + blob_bottom_->mutable_cpu_data()[i + 17] = 20; + blob_bottom_->mutable_cpu_data()[i + 18] = 8; + blob_bottom_->mutable_cpu_data()[i + 19] = 28; + blob_bottom_->mutable_cpu_data()[i + 20] = 33; + blob_bottom_->mutable_cpu_data()[i + 21] = 17; + blob_bottom_->mutable_cpu_data()[i + 22] = 10; + blob_bottom_->mutable_cpu_data()[i + 23] = 15; + blob_bottom_->mutable_cpu_data()[i + 24] = 30; + blob_bottom_->mutable_cpu_data()[i + 25] = 5; + blob_bottom_->mutable_cpu_data()[i + 26] = 34; + blob_bottom_->mutable_cpu_data()[i + 27] = 12; + blob_bottom_->mutable_cpu_data()[i + 28] = 14; + blob_bottom_->mutable_cpu_data()[i + 29] = 16; + blob_bottom_->mutable_cpu_data()[i + 30] = 4; + blob_bottom_->mutable_cpu_data()[i + 31] = 36; + blob_bottom_->mutable_cpu_data()[i + 32] = 29; + blob_bottom_->mutable_cpu_data()[i + 33] = 13; + blob_bottom_->mutable_cpu_data()[i + 34] = 18; + blob_bottom_->mutable_cpu_data()[i + 35] = 11; + } + PoolingLayer layer(layer_param); + layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + EXPECT_EQ(blob_top_->num(), num); + EXPECT_EQ(blob_top_->channels(), channels); + EXPECT_EQ(blob_top_->height(), 4); + EXPECT_EQ(blob_top_->width(), 5); + if (blob_top_vec_.size() > 1) { + EXPECT_EQ(blob_top_mask_->num(), num); + EXPECT_EQ(blob_top_mask_->channels(), channels); + EXPECT_EQ(blob_top_mask_->height(), 4); + EXPECT_EQ(blob_top_mask_->width(), 5); + } + layer.Forward(blob_bottom_vec_, &blob_top_vec_); + // Expected output: 2x 2 channels of: + // [35 32 26 27 27] + // [32 33 33 27 27] + // [31 34 34 27 27] + // [36 36 34 18 18] + for (int i = 0; i < 20 * num * channels; i += 20) { + EXPECT_EQ(blob_top_->cpu_data()[i + 0], 35); + EXPECT_EQ(blob_top_->cpu_data()[i + 1], 32); + EXPECT_EQ(blob_top_->cpu_data()[i + 2], 26); + EXPECT_EQ(blob_top_->cpu_data()[i + 3], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 4], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 5], 32); + EXPECT_EQ(blob_top_->cpu_data()[i + 6], 33); + EXPECT_EQ(blob_top_->cpu_data()[i + 7], 33); + EXPECT_EQ(blob_top_->cpu_data()[i + 8], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 9], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 10], 31); + EXPECT_EQ(blob_top_->cpu_data()[i + 11], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 12], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 13], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 14], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 15], 36); + EXPECT_EQ(blob_top_->cpu_data()[i + 16], 36); + EXPECT_EQ(blob_top_->cpu_data()[i + 17], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 18], 18); + EXPECT_EQ(blob_top_->cpu_data()[i + 19], 18); + } + if (blob_top_vec_.size() > 1) { + // [ 1 8 4 17 17] + // [ 8 21 21 17 17] + // [13 27 27 17 17] + // [32 32 27 35 35] + for (int i = 0; i < 20 * num * channels; i += 20) { + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 0], 0); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 1], 7); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 2], 3); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 3], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 4], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 5], 7); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 6], 20); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 7], 20); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 8], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 9], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 10], 12); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 11], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 12], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 13], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 14], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 15], 31); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 16], 31); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 17], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 18], 34); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 19], 34); + } + } + } + // Test for rectangular pooling layer with kernel_w > kernel_h + void TestForwardRectWide() { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(2); + pooling_param->set_kernel_w(3); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + const int num = 2; + const int channels = 2; + blob_bottom_->Reshape(num, channels, 6, 6); + // Input: 2x 2 channels of: + // [35 1 6 26 19 24] + // [ 3 32 7 21 23 25] + // [31 9 2 22 27 20] + // [ 8 28 33 17 10 15] + // [30 5 34 12 14 16] + // [ 4 36 29 13 18 11] (this is generated by magic(6) in MATLAB) + for (int i = 0; i < 36 * num * channels; i += 36) { + blob_bottom_->mutable_cpu_data()[i + 0] = 35; + blob_bottom_->mutable_cpu_data()[i + 1] = 1; + blob_bottom_->mutable_cpu_data()[i + 2] = 6; + blob_bottom_->mutable_cpu_data()[i + 3] = 26; + blob_bottom_->mutable_cpu_data()[i + 4] = 19; + blob_bottom_->mutable_cpu_data()[i + 5] = 24; + blob_bottom_->mutable_cpu_data()[i + 6] = 3; + blob_bottom_->mutable_cpu_data()[i + 7] = 32; + blob_bottom_->mutable_cpu_data()[i + 8] = 7; + blob_bottom_->mutable_cpu_data()[i + 9] = 21; + blob_bottom_->mutable_cpu_data()[i + 10] = 23; + blob_bottom_->mutable_cpu_data()[i + 11] = 25; + blob_bottom_->mutable_cpu_data()[i + 12] = 31; + blob_bottom_->mutable_cpu_data()[i + 13] = 9; + blob_bottom_->mutable_cpu_data()[i + 14] = 2; + blob_bottom_->mutable_cpu_data()[i + 15] = 22; + blob_bottom_->mutable_cpu_data()[i + 16] = 27; + blob_bottom_->mutable_cpu_data()[i + 17] = 20; + blob_bottom_->mutable_cpu_data()[i + 18] = 8; + blob_bottom_->mutable_cpu_data()[i + 19] = 28; + blob_bottom_->mutable_cpu_data()[i + 20] = 33; + blob_bottom_->mutable_cpu_data()[i + 21] = 17; + blob_bottom_->mutable_cpu_data()[i + 22] = 10; + blob_bottom_->mutable_cpu_data()[i + 23] = 15; + blob_bottom_->mutable_cpu_data()[i + 24] = 30; + blob_bottom_->mutable_cpu_data()[i + 25] = 5; + blob_bottom_->mutable_cpu_data()[i + 26] = 34; + blob_bottom_->mutable_cpu_data()[i + 27] = 12; + blob_bottom_->mutable_cpu_data()[i + 28] = 14; + blob_bottom_->mutable_cpu_data()[i + 29] = 16; + blob_bottom_->mutable_cpu_data()[i + 30] = 4; + blob_bottom_->mutable_cpu_data()[i + 31] = 36; + blob_bottom_->mutable_cpu_data()[i + 32] = 29; + blob_bottom_->mutable_cpu_data()[i + 33] = 13; + blob_bottom_->mutable_cpu_data()[i + 34] = 18; + blob_bottom_->mutable_cpu_data()[i + 35] = 11; + } + PoolingLayer layer(layer_param); + layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + EXPECT_EQ(blob_top_->num(), num); + EXPECT_EQ(blob_top_->channels(), channels); + EXPECT_EQ(blob_top_->height(), 5); + EXPECT_EQ(blob_top_->width(), 4); + if (blob_top_vec_.size() > 1) { + EXPECT_EQ(blob_top_mask_->num(), num); + EXPECT_EQ(blob_top_mask_->channels(), channels); + EXPECT_EQ(blob_top_mask_->height(), 5); + EXPECT_EQ(blob_top_mask_->width(), 4); + } + layer.Forward(blob_bottom_vec_, &blob_top_vec_); + // Expected output: 2x 2 channels of: + // [35 32 26 26] + // [32 32 27 27] + // [33 33 33 27] + // [34 34 34 17] + // [36 36 34 18] + for (int i = 0; i < 20 * num * channels; i += 20) { + EXPECT_EQ(blob_top_->cpu_data()[i + 0], 35); + EXPECT_EQ(blob_top_->cpu_data()[i + 1], 32); + EXPECT_EQ(blob_top_->cpu_data()[i + 2], 26); + EXPECT_EQ(blob_top_->cpu_data()[i + 3], 26); + EXPECT_EQ(blob_top_->cpu_data()[i + 4], 32); + EXPECT_EQ(blob_top_->cpu_data()[i + 5], 32); + EXPECT_EQ(blob_top_->cpu_data()[i + 6], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 7], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 8], 33); + EXPECT_EQ(blob_top_->cpu_data()[i + 9], 33); + EXPECT_EQ(blob_top_->cpu_data()[i + 10], 33); + EXPECT_EQ(blob_top_->cpu_data()[i + 11], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 12], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 13], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 14], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 15], 17); + EXPECT_EQ(blob_top_->cpu_data()[i + 16], 36); + EXPECT_EQ(blob_top_->cpu_data()[i + 17], 36); + EXPECT_EQ(blob_top_->cpu_data()[i + 18], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 19], 18); + } + if (blob_top_vec_.size() > 1) { + // [ 1 8 4 4] + // [ 8 8 17 17] + // [21 21 21 17] + // [27 27 27 22] + // [32 32 27 35] + for (int i = 0; i < 20 * num * channels; i += 20) { + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 0], 0); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 1], 7); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 2], 3); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 3], 3); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 4], 7); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 5], 7); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 6], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 7], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 8], 20); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 9], 20); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 10], 20); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 11], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 12], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 13], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 14], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 15], 21); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 16], 31); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 17], 31); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 18], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 19], 34); + } + } + } }; typedef ::testing::Types Dtypes; @@ -207,24 +457,32 @@ TYPED_TEST(PoolingLayerTest, PrintCPUBackward) { TYPED_TEST(PoolingLayerTest, TestCPUForwardMax) { Caffe::set_mode(Caffe::CPU); - this->TestForward(); + this->TestForwardSquare(); + this->TestForwardRectHigh(); + this->TestForwardRectWide(); } TYPED_TEST(PoolingLayerTest, TestGPUForwardMax) { Caffe::set_mode(Caffe::GPU); - this->TestForward(); + this->TestForwardSquare(); + this->TestForwardRectHigh(); + this->TestForwardRectWide(); } TYPED_TEST(PoolingLayerTest, TestCPUForwardMaxTopMask) { Caffe::set_mode(Caffe::CPU); this->blob_top_vec_.push_back(this->blob_top_mask_); - this->TestForward(); + this->TestForwardSquare(); + this->TestForwardRectHigh(); + this->TestForwardRectWide(); } TYPED_TEST(PoolingLayerTest, TestGPUForwardMaxTopMask) { Caffe::set_mode(Caffe::GPU); this->blob_top_vec_.push_back(this->blob_top_mask_); - this->TestForward(); + this->TestForwardSquare(); + this->TestForwardRectHigh(); + this->TestForwardRectWide(); } TYPED_TEST(PoolingLayerTest, TestCPUGradientMax) { From e10977f8a598f6753c28d1388e0900e7805280ac Mon Sep 17 00:00:00 2001 From: Ronghang Hu Date: Mon, 7 Jul 2014 11:32:58 -0700 Subject: [PATCH 0223/2053] fixed style errors --- src/caffe/layers/pooling_layer.cpp | 4 ++-- src/caffe/layers/pooling_layer.cu | 34 +++++++++++++-------------- src/caffe/test/test_pooling_layer.cpp | 6 +++-- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index d8cd2e2139d..9151ff23674 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -35,11 +35,11 @@ void PoolingLayer::SetUp(const vector*>& bottom, CHECK(pool_param.has_kernel_size() || (pool_param.has_kernel_h() && pool_param.has_kernel_w())) << "For non-square filters both kernel_h and kernel_w are required."; - CHECK((!pool_param.has_pad() && pool_param.has_pad_h() + CHECK((!pool_param.has_pad() && pool_param.has_pad_h() && pool_param.has_pad_w()) || (!pool_param.has_pad_h() && !pool_param.has_pad_w())) << "pad is pad OR pad_h and pad_w are required."; - CHECK((!pool_param.has_stride() && pool_param.has_stride_h() + CHECK((!pool_param.has_stride() && pool_param.has_stride_h() && pool_param.has_stride_w()) || (!pool_param.has_stride_h() && !pool_param.has_stride_w())) << "Stride is stride OR stride_h and stride_w are required."; diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index e38028dd061..a44b1770ee3 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -17,7 +17,7 @@ template __global__ void MaxPoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_h, const int kernel_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, const int pad_h, const int pad_w, Dtype* top_data, int* mask, Dtype* top_mask) { CUDA_KERNEL_LOOP(index, nthreads) { @@ -55,7 +55,7 @@ template __global__ void AvePoolForward(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_h, const int kernel_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, const int pad_h, const int pad_w, Dtype* top_data) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; @@ -87,7 +87,7 @@ __global__ void StoPoolForwardTrain(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_h, const int kernel_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, Dtype* rand_idx, Dtype* top_data) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; @@ -128,7 +128,7 @@ __global__ void StoPoolForwardTest(const int nthreads, const Dtype* bottom_data, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_h, const int kernel_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, Dtype* top_data) { CUDA_KERNEL_LOOP(index, nthreads) { int pw = index % pooled_width; @@ -175,15 +175,15 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_h_, - kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data, + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data, mask, top_mask); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) AvePoolForward<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_h_, + height_, width_, pooled_height_, pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data); break; case PoolingParameter_PoolMethod_STOCHASTIC: @@ -195,7 +195,7 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, StoPoolForwardTrain<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_h_, + height_, width_, pooled_height_, pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, rand_idx_.mutable_gpu_data(), top_data); } else { @@ -203,7 +203,7 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, StoPoolForwardTest<<>>( count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_h_, + height_, width_, pooled_height_, pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, top_data); } break; @@ -219,8 +219,8 @@ template __global__ void MaxPoolBackward(const int nthreads, const Dtype* top_diff, const int* mask, const Dtype* top_mask, const int num, const int channels, const int height, const int width, const int pooled_height, - const int pooled_width, const int kernel_h, const int kernel_w, - const int stride_h, const int stride_w, const int pad_h, const int pad_w, + const int pooled_width, const int kernel_h, const int kernel_w, + const int stride_h, const int stride_w, const int pad_h, const int pad_w, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index @@ -265,8 +265,8 @@ template __global__ void AvePoolBackward(const int nthreads, const Dtype* top_diff, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_h, const int kernel_w, const int stride_h, - const int stride_w, const int pad_h, const int pad_w, + const int kernel_h, const int kernel_w, const int stride_h, + const int stride_w, const int pad_h, const int pad_w, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index @@ -302,7 +302,7 @@ __global__ void StoPoolBackward(const int nthreads, const Dtype* rand_idx, const Dtype* top_diff, const int num, const int channels, const int height, const int width, const int pooled_height, const int pooled_width, - const int kernel_h, const int kernel_w, const int stride_h, + const int kernel_h, const int kernel_w, const int stride_h, const int stride_w, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local index @@ -354,14 +354,14 @@ void PoolingLayer::Backward_gpu(const vector*>& top, MaxPoolBackward<<>>( count, top_diff, mask, top_mask, top[0]->num(), channels_, height_, width_, pooled_height_, pooled_width_, - kernel_h_, kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, + kernel_h_, kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, bottom_diff); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) AvePoolBackward<<>>( count, top_diff, top[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_h_, + height_, width_, pooled_height_, pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, bottom_diff); break; case PoolingParameter_PoolMethod_STOCHASTIC: @@ -369,7 +369,7 @@ void PoolingLayer::Backward_gpu(const vector*>& top, StoPoolBackward<<>>( count, rand_idx_.gpu_data(), top_diff, top[0]->num(), channels_, height_, width_, pooled_height_, - pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, + pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, bottom_diff); break; default: diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index 651d20305b4..bb21113a666 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -132,7 +132,8 @@ class PoolingLayerTest : public ::testing::Test { // [31 9 2 22 27 20] // [ 8 28 33 17 10 15] // [30 5 34 12 14 16] - // [ 4 36 29 13 18 11] (this is generated by magic(6) in MATLAB) + // [ 4 36 29 13 18 11] + // (this is generated by magic(6) in MATLAB) for (int i = 0; i < 36 * num * channels; i += 36) { blob_bottom_->mutable_cpu_data()[i + 0] = 35; blob_bottom_->mutable_cpu_data()[i + 1] = 1; @@ -256,7 +257,8 @@ class PoolingLayerTest : public ::testing::Test { // [31 9 2 22 27 20] // [ 8 28 33 17 10 15] // [30 5 34 12 14 16] - // [ 4 36 29 13 18 11] (this is generated by magic(6) in MATLAB) + // [ 4 36 29 13 18 11] + // (this is generated by magic(6) in MATLAB) for (int i = 0; i < 36 * num * channels; i += 36) { blob_bottom_->mutable_cpu_data()[i + 0] = 35; blob_bottom_->mutable_cpu_data()[i + 1] = 1; From 45e201d42d2c2243a06ceb9376998903ac227f4b Mon Sep 17 00:00:00 2001 From: Ronghang Hu Date: Mon, 7 Jul 2014 12:12:59 -0700 Subject: [PATCH 0224/2053] added gradient check for non-square pooling --- src/caffe/test/test_pooling_layer.cpp | 214 +++++++++++++++----------- 1 file changed, 128 insertions(+), 86 deletions(-) diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index bb21113a666..fdc3ea4cafa 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -488,31 +488,41 @@ TYPED_TEST(PoolingLayerTest, TestGPUForwardMaxTopMask) { } TYPED_TEST(PoolingLayerTest, TestCPUGradientMax) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - pooling_param->set_pad(1); - pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - Caffe::set_mode(Caffe::CPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pad(1); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + Caffe::set_mode(Caffe::CPU); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-4, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + } + } } TYPED_TEST(PoolingLayerTest, TestGPUGradientMax) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - pooling_param->set_pad(1); - pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - Caffe::set_mode(Caffe::GPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pad(1); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + Caffe::set_mode(Caffe::GPU); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-4, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + } + } } TYPED_TEST(PoolingLayerTest, TestCPUForwardMaxPadded) { @@ -608,31 +618,43 @@ TYPED_TEST(PoolingLayerTest, TestGPUForwardMaxPadded) { TYPED_TEST(PoolingLayerTest, TestCPUGradientMaxTopMask) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - this->blob_top_vec_.push_back(this->blob_top_mask_); - Caffe::set_mode(Caffe::CPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + this->blob_top_vec_.push_back(this->blob_top_mask_); + Caffe::set_mode(Caffe::CPU); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-4, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + this->blob_top_vec_.pop_back(); + } + } } TYPED_TEST(PoolingLayerTest, TestGPUGradientMaxTopMask) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - this->blob_top_vec_.push_back(this->blob_top_mask_); - Caffe::set_mode(Caffe::GPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + this->blob_top_vec_.push_back(this->blob_top_mask_); + Caffe::set_mode(Caffe::GPU); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-4, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + this->blob_top_vec_.pop_back(); + } + } } @@ -703,60 +725,80 @@ TYPED_TEST(PoolingLayerTest, TestGPUForwardAve) { TYPED_TEST(PoolingLayerTest, TestCPUGradientAve) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - Caffe::set_mode(Caffe::CPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); + Caffe::set_mode(Caffe::CPU); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + } + } } TYPED_TEST(PoolingLayerTest, TestGPUGradientAve) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - Caffe::set_mode(Caffe::GPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); + Caffe::set_mode(Caffe::GPU); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + } + } } TYPED_TEST(PoolingLayerTest, TestCPUGradientAvePadded) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - pooling_param->set_pad(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - Caffe::set_mode(Caffe::CPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pad(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); + Caffe::set_mode(Caffe::CPU); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + } + } } TYPED_TEST(PoolingLayerTest, TestGPUGradientAvePadded) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - pooling_param->set_pad(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - Caffe::set_mode(Caffe::GPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pad(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); + Caffe::set_mode(Caffe::GPU); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + } + } } From e5be75459a706d0e1261851894d11c223d07d4d6 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 8 Jul 2014 15:02:00 -0700 Subject: [PATCH 0225/2053] Don't make clean when running linecount --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f8abc1b2b88..c8b25d935bf 100644 --- a/Makefile +++ b/Makefile @@ -266,7 +266,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo all: $(NAME) $(STATIC_NAME) tools examples -linecount: clean +linecount: cloc --read-lang-def=$(PROJECT).cloc src/$(PROJECT)/ lint: $(LINT_REPORT) From ba8a2bb8c99f39b66cd915b5cfab0d3991b1488f Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 8 Jul 2014 15:58:12 -0700 Subject: [PATCH 0226/2053] Dump compiler warnings to *.warnings.txt; use "make warn" to print them --- Makefile | 68 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index c8b25d935bf..4d67aa32802 100644 --- a/Makefile +++ b/Makefile @@ -123,6 +123,22 @@ TEST_CXX_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ TEST_BINS := $(TEST_CXX_BINS) $(TEST_CU_BINS) TEST_ALL_BIN := $(TEST_BIN_DIR)/test_all.testbin +############################## +# Derive compiler warning dump locations +############################## +WARNS_EXT := warnings.txt +CXX_WARNS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o.${WARNS_EXT}}) +CU_WARNS := $(addprefix $(BUILD_DIR)/, ${CU_SRCS:.cu=.cuo.${WARNS_EXT}}) +TOOL_WARNS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o.${WARNS_EXT}}) +EXAMPLE_WARNS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o.${WARNS_EXT}}) +TEST_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o.${WARNS_EXT}}) +TEST_CU_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_CU_SRCS:.cu=.cuo.${WARNS_EXT}}) +ALL_CXX_WARNS := $(CXX_WARNS) $(TOOL_WARNS) $(EXAMPLE_WARNS) $(TEST_WARNS) +ALL_CU_WARNS := $(CU_WARNS) $(TEST_CU_WARNS) +ALL_WARNS := $(ALL_CXX_WARNS) $(ALL_CU_WARNS) + +ALL_WARNS_FILENAME := $(BUILD_DIR)/$(WARNS_EXT) + ############################## # Derive include and lib directories ############################## @@ -262,7 +278,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo ############################## .PHONY: all test clean linecount lint tools examples $(DIST_ALIASES) \ py mat py$(PROJECT) mat$(PROJECT) proto runtest \ - superclean supercleanlist supercleanfiles + superclean supercleanlist supercleanfiles warn all: $(NAME) $(STATIC_NAME) tools examples @@ -312,6 +328,23 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) runtest: $(TEST_ALL_BIN) $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle +warn: $(ALL_WARNS_FILENAME) + +$(ALL_WARNS_FILENAME): $(ALL_WARNS) | $(BUILD_DIR) + @ touch $(ALL_WARNS) + @ cat $(ALL_WARNS) > $@ + @ # If the concatenated warning file is non-empty, touch all dependencies + @ # so that "make warn" always prints the error list and only says + @ # "nothing to be done" when there are no warnings. + @ if [ -s "$@" ]; then touch $(ALL_WARNS); else echo "No compiler warnings!"; fi + @ cat $@ + +$(ALL_CXX_WARNS): %.o.${WARNS_EXT} : %.o + @ cat $@ + +$(ALL_CU_WARNS): %.cuo.${WARNS_EXT} : %.cuo + @ cat $@ + $(BUILD_DIR_LINK): $(BUILD_DIR)/.linked # Create a target ".linked" in this BUILD_DIR to tell Make that the "build" link @@ -337,12 +370,14 @@ $(STATIC_NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HDRS) \ | $(TEST_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HDRS) \ | $(TEST_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ @@ -373,42 +408,51 @@ $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) $(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \ | $(LAYER_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \ | $(PROTO_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(UTIL_BUILD_DIR)/%.o: src/$(PROJECT)/util/%.cpp $(HXX_SRCS) | $(UTIL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(GTEST_OBJ): $(GTEST_SRC) | $(GTEST_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(LAYER_BUILD_DIR)/%.cuo: src/$(PROJECT)/layers/%.cu $(HXX_SRCS) \ | $(LAYER_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(UTIL_BUILD_DIR)/%.cuo: src/$(PROJECT)/util/%.cu | $(UTIL_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(TOOL_BUILD_DIR)/%.o: tools/%.cpp $(PROTO_GEN_HEADER) | $(TOOL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(EXAMPLE_BUILD_DIR)/%.o: examples/%.cpp $(PROTO_GEN_HEADER) \ | $(EXAMPLE_BUILD_DIRS) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo $(BUILD_DIR)/src/$(PROJECT)/%.o: src/$(PROJECT)/%.cpp $(HXX_SRCS) - $(CXX) $< $(CXXFLAGS) -c -o $@ + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} + @ cat $@.${WARNS_EXT} @ echo proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER) From 933dc6e7d9fc190ad64bf61d53217c2af9465b1d Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 8 Jul 2014 17:52:49 -0700 Subject: [PATCH 0227/2053] Output a lint report for every source file linted; use to lint incrementally --- Makefile | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 4d67aa32802..74e4a944bc3 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,9 @@ NONGEN_CXX_SRCS := $(shell find \ examples \ tools \ -name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh") +LINT_OUTPUT_DIR := $(BUILD_DIR)/lint +LINT_EXT := lint.txt +LINT_OUTPUTS := $(addsuffix .$(LINT_EXT), $(addprefix $(LINT_OUTPUT_DIR)/, ${NONGEN_CXX_SRCS})) LINT_REPORT := $(BUILD_DIR)/cpp_lint.log FAILED_LINT_REPORT := $(BUILD_DIR)/cpp_lint.error_log # PY$(PROJECT)_SRC is the python wrapper for $(PROJECT) @@ -173,6 +176,7 @@ ALL_BUILD_DIRS := $(sort \ $(LAYER_BUILD_DIR) $(UTIL_BUILD_DIR) $(TOOL_BUILD_DIR) \ $(TEST_BUILD_DIR) $(TEST_BIN_DIR) $(GTEST_BUILD_DIR) \ $(EXAMPLE_BUILD_DIRS) \ + $(LINT_OUTPUT_DIR) \ $(PROTO_BUILD_DIR) $(PROTO_BUILD_INCLUDE_DIR) $(PY_PROTO_BUILD_DIR) \ $(DISTRIBUTE_SUBDIRS)) @@ -287,13 +291,22 @@ linecount: lint: $(LINT_REPORT) -$(LINT_REPORT): $(NONGEN_CXX_SRCS) | $(BUILD_DIR) - @ (python ./scripts/cpp_lint.py $(NONGEN_CXX_SRCS) > $(LINT_REPORT) 2>&1 \ - && ($(RM) $(FAILED_LINT_REPORT); echo "No lint errors!")) || ( \ - mv $(LINT_REPORT) $(FAILED_LINT_REPORT); \ - grep -v "^Done processing " $(FAILED_LINT_REPORT); \ - echo "Found 1 or more lint errors; see log at $(FAILED_LINT_REPORT)"; \ - exit 1) +$(LINT_REPORT): $(LINT_OUTPUTS) + @ cat $(LINT_OUTPUTS) > $@ + @ if [ -s "$@" ]; then \ + cat $@; mv $@ $(FAILED_LINT_REPORT); \ + else \ + echo "No lint errors!"; \ + fi + +$(LINT_OUTPUTS): $(LINT_OUTPUT_DIR)/%.lint.txt : % | $(LINT_OUTPUT_DIR) + @ mkdir -p $(dir $@) + @ python ./scripts/cpp_lint.py $< 2>&1 \ + | grep -v "^Done processing " \ + | grep -v "^Total errors found: 0" \ + > $@ \ + || true + @ if [ -s "$@" ]; then touch $<; cat $@; fi test: $(TEST_ALL_BIN) $(TEST_BINS) From d86735ed3bc1d84bb5e0e01958f8a3bab277b503 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Wed, 9 Jul 2014 11:37:14 -0700 Subject: [PATCH 0228/2053] Makefile: cleanup lint/warn report logic (and make the two more consistent) --- Makefile | 99 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/Makefile b/Makefile index 74e4a944bc3..a55e44b0836 100644 --- a/Makefile +++ b/Makefile @@ -62,11 +62,11 @@ NONGEN_CXX_SRCS := $(shell find \ examples \ tools \ -name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh") -LINT_OUTPUT_DIR := $(BUILD_DIR)/lint +LINT_OUTPUT_DIR := $(BUILD_DIR)/.lint LINT_EXT := lint.txt -LINT_OUTPUTS := $(addsuffix .$(LINT_EXT), $(addprefix $(LINT_OUTPUT_DIR)/, ${NONGEN_CXX_SRCS})) -LINT_REPORT := $(BUILD_DIR)/cpp_lint.log -FAILED_LINT_REPORT := $(BUILD_DIR)/cpp_lint.error_log +LINT_OUTPUTS := $(addsuffix .$(LINT_EXT), $(addprefix $(LINT_OUTPUT_DIR)/, $(NONGEN_CXX_SRCS))) +EMPTY_LINT_REPORT := $(BUILD_DIR)/.$(LINT_EXT) +NONEMPTY_LINT_REPORT := $(BUILD_DIR)/$(LINT_EXT) # PY$(PROJECT)_SRC is the python wrapper for $(PROJECT) PY$(PROJECT)_SRC := python/$(PROJECT)/_$(PROJECT).cpp PY$(PROJECT)_SO := python/$(PROJECT)/_$(PROJECT).so @@ -130,17 +130,18 @@ TEST_ALL_BIN := $(TEST_BIN_DIR)/test_all.testbin # Derive compiler warning dump locations ############################## WARNS_EXT := warnings.txt -CXX_WARNS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o.${WARNS_EXT}}) -CU_WARNS := $(addprefix $(BUILD_DIR)/, ${CU_SRCS:.cu=.cuo.${WARNS_EXT}}) -TOOL_WARNS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o.${WARNS_EXT}}) -EXAMPLE_WARNS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o.${WARNS_EXT}}) -TEST_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o.${WARNS_EXT}}) -TEST_CU_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_CU_SRCS:.cu=.cuo.${WARNS_EXT}}) +CXX_WARNS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o.$(WARNS_EXT)}) +CU_WARNS := $(addprefix $(BUILD_DIR)/, ${CU_SRCS:.cu=.cuo.$(WARNS_EXT)}) +TOOL_WARNS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o.$(WARNS_EXT)}) +EXAMPLE_WARNS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o.$(WARNS_EXT)}) +TEST_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o.$(WARNS_EXT)}) +TEST_CU_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_CU_SRCS:.cu=.cuo.$(WARNS_EXT)}) ALL_CXX_WARNS := $(CXX_WARNS) $(TOOL_WARNS) $(EXAMPLE_WARNS) $(TEST_WARNS) ALL_CU_WARNS := $(CU_WARNS) $(TEST_CU_WARNS) ALL_WARNS := $(ALL_CXX_WARNS) $(ALL_CU_WARNS) -ALL_WARNS_FILENAME := $(BUILD_DIR)/$(WARNS_EXT) +EMPTY_WARN_REPORT := $(BUILD_DIR)/.$(WARNS_EXT) +NONEMPTY_WARN_REPORT := $(BUILD_DIR)/$(WARNS_EXT) ############################## # Derive include and lib directories @@ -289,13 +290,15 @@ all: $(NAME) $(STATIC_NAME) tools examples linecount: cloc --read-lang-def=$(PROJECT).cloc src/$(PROJECT)/ -lint: $(LINT_REPORT) +lint: $(EMPTY_LINT_REPORT) -$(LINT_REPORT): $(LINT_OUTPUTS) +$(EMPTY_LINT_REPORT): $(LINT_OUTPUTS) | $(BUILD_DIR) @ cat $(LINT_OUTPUTS) > $@ @ if [ -s "$@" ]; then \ - cat $@; mv $@ $(FAILED_LINT_REPORT); \ + cat $@; \ + mv $@ $(NONEMPTY_LINT_REPORT); \ else \ + $(RM) $(NONEMPTY_LINT_REPORT); \ echo "No lint errors!"; \ fi @@ -306,7 +309,6 @@ $(LINT_OUTPUTS): $(LINT_OUTPUT_DIR)/%.lint.txt : % | $(LINT_OUTPUT_DIR) | grep -v "^Total errors found: 0" \ > $@ \ || true - @ if [ -s "$@" ]; then touch $<; cat $@; fi test: $(TEST_ALL_BIN) $(TEST_BINS) @@ -341,22 +343,21 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) runtest: $(TEST_ALL_BIN) $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle -warn: $(ALL_WARNS_FILENAME) +warn: $(EMPTY_WARN_REPORT) -$(ALL_WARNS_FILENAME): $(ALL_WARNS) | $(BUILD_DIR) - @ touch $(ALL_WARNS) +$(EMPTY_WARN_REPORT): $(ALL_WARNS) | $(BUILD_DIR) @ cat $(ALL_WARNS) > $@ - @ # If the concatenated warning file is non-empty, touch all dependencies - @ # so that "make warn" always prints the error list and only says - @ # "nothing to be done" when there are no warnings. - @ if [ -s "$@" ]; then touch $(ALL_WARNS); else echo "No compiler warnings!"; fi - @ cat $@ + @ if [ -s "$@" ]; then \ + cat $@; \ + mv $@ $(NONEMPTY_WARN_REPORT); \ + else \ + $(RM) $(NONEMPTY_WARN_REPORT); \ + echo "No compiler warnings!"; \ + fi -$(ALL_CXX_WARNS): %.o.${WARNS_EXT} : %.o - @ cat $@ +$(ALL_CXX_WARNS): %.o.$(WARNS_EXT) : %.o -$(ALL_CU_WARNS): %.cuo.${WARNS_EXT} : %.cuo - @ cat $@ +$(ALL_CU_WARNS): %.cuo.$(WARNS_EXT) : %.cuo $(BUILD_DIR_LINK): $(BUILD_DIR)/.linked @@ -383,14 +384,14 @@ $(STATIC_NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HDRS) \ | $(TEST_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo $(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HDRS) \ | $(TEST_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ @@ -421,51 +422,51 @@ $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) $(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \ | $(LAYER_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo $(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \ | $(PROTO_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo $(UTIL_BUILD_DIR)/%.o: src/$(PROJECT)/util/%.cpp $(HXX_SRCS) | $(UTIL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo $(GTEST_OBJ): $(GTEST_SRC) | $(GTEST_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo $(LAYER_BUILD_DIR)/%.cuo: src/$(PROJECT)/layers/%.cu $(HXX_SRCS) \ | $(LAYER_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo $(UTIL_BUILD_DIR)/%.cuo: src/$(PROJECT)/util/%.cu | $(UTIL_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo $(TOOL_BUILD_DIR)/%.o: tools/%.cpp $(PROTO_GEN_HEADER) | $(TOOL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo $(EXAMPLE_BUILD_DIR)/%.o: examples/%.cpp $(PROTO_GEN_HEADER) \ | $(EXAMPLE_BUILD_DIRS) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo $(BUILD_DIR)/src/$(PROJECT)/%.o: src/$(PROJECT)/%.cpp $(HXX_SRCS) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.${WARNS_EXT} - @ cat $@.${WARNS_EXT} + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + @ cat $@.$(WARNS_EXT) @ echo proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER) From 37329cbc2c283a4701c18170a1f19c69d92e5168 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Wed, 9 Jul 2014 15:47:21 -0700 Subject: [PATCH 0229/2053] fix bug introduced by warning logs: errors didn't print because they are logged to the warnings file --- Makefile | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index a55e44b0836..839532eff56 100644 --- a/Makefile +++ b/Makefile @@ -384,13 +384,15 @@ $(STATIC_NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HDRS) \ | $(TEST_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo $(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HDRS) \ | $(TEST_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo @@ -422,50 +424,59 @@ $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) $(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \ | $(LAYER_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo $(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \ | $(PROTO_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo $(UTIL_BUILD_DIR)/%.o: src/$(PROJECT)/util/%.cpp $(HXX_SRCS) | $(UTIL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo $(GTEST_OBJ): $(GTEST_SRC) | $(GTEST_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo $(LAYER_BUILD_DIR)/%.cuo: src/$(PROJECT)/layers/%.cu $(HXX_SRCS) \ | $(LAYER_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo $(UTIL_BUILD_DIR)/%.cuo: src/$(PROJECT)/util/%.cu | $(UTIL_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo $(TOOL_BUILD_DIR)/%.o: tools/%.cpp $(PROTO_GEN_HEADER) | $(TOOL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo $(EXAMPLE_BUILD_DIR)/%.o: examples/%.cpp $(PROTO_GEN_HEADER) \ | $(EXAMPLE_BUILD_DIRS) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo $(BUILD_DIR)/src/$(PROJECT)/%.o: src/$(PROJECT)/%.cpp $(HXX_SRCS) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + || cat $@.$(WARNS_EXT); exit 1 @ cat $@.$(WARNS_EXT) @ echo From 1679815f678f5bf78951d415a04a12b4f64173f3 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Wed, 9 Jul 2014 16:39:17 -0700 Subject: [PATCH 0230/2053] makefile hotfix --- Makefile | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index 839532eff56..829602b7946 100644 --- a/Makefile +++ b/Makefile @@ -385,14 +385,14 @@ $(STATIC_NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HDRS) \ | $(TEST_BUILD_DIR) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo $(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HDRS) \ | $(TEST_BUILD_DIR) $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo @@ -425,58 +425,58 @@ $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) $(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \ | $(LAYER_BUILD_DIR) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo $(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \ | $(PROTO_BUILD_DIR) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo $(UTIL_BUILD_DIR)/%.o: src/$(PROJECT)/util/%.cpp $(HXX_SRCS) | $(UTIL_BUILD_DIR) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo $(GTEST_OBJ): $(GTEST_SRC) | $(GTEST_BUILD_DIR) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo $(LAYER_BUILD_DIR)/%.cuo: src/$(PROJECT)/layers/%.cu $(HXX_SRCS) \ | $(LAYER_BUILD_DIR) $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo $(UTIL_BUILD_DIR)/%.cuo: src/$(PROJECT)/util/%.cu | $(UTIL_BUILD_DIR) $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo $(TOOL_BUILD_DIR)/%.o: tools/%.cpp $(PROTO_GEN_HEADER) | $(TOOL_BUILD_DIR) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo $(EXAMPLE_BUILD_DIR)/%.o: examples/%.cpp $(PROTO_GEN_HEADER) \ | $(EXAMPLE_BUILD_DIRS) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo $(BUILD_DIR)/src/$(PROJECT)/%.o: src/$(PROJECT)/%.cpp $(HXX_SRCS) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || cat $@.$(WARNS_EXT); exit 1 + || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo From 3bd49bac72bbaeea225a1e5e5a730482b366241a Mon Sep 17 00:00:00 2001 From: Kai Li Date: Mon, 7 Jul 2014 15:26:24 +0800 Subject: [PATCH 0231/2053] Avoid using cudaMemcpy for memcpy when there is no GPU and CUDA driver --- src/caffe/test/test_math_functions.cpp | 2 ++ src/caffe/util/math_functions.cpp | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_math_functions.cpp b/src/caffe/test/test_math_functions.cpp index 941d8b9479a..ddb9f060972 100644 --- a/src/caffe/test/test_math_functions.cpp +++ b/src/caffe/test/test_math_functions.cpp @@ -209,6 +209,7 @@ TYPED_TEST(MathFunctionsTest, TestCopyCPU) { const int n = this->blob_bottom_->count(); const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); TypeParam* top_data = this->blob_top_->mutable_cpu_data(); + Caffe::set_mode(Caffe::CPU); caffe_copy(n, bottom_data, top_data); for (int i = 0; i < n; ++i) { EXPECT_EQ(bottom_data[i], top_data[i]); @@ -219,6 +220,7 @@ TYPED_TEST(MathFunctionsTest, TestCopyGPU) { const int n = this->blob_bottom_->count(); const TypeParam* bottom_data = this->blob_bottom_->gpu_data(); TypeParam* top_data = this->blob_top_->mutable_gpu_data(); + Caffe::set_mode(Caffe::GPU); caffe_copy(n, bottom_data, top_data); bottom_data = this->blob_bottom_->cpu_data(); top_data = this->blob_top_->mutable_cpu_data(); diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index 918bb3c361c..df32093238f 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -152,7 +152,11 @@ void caffe_add_scalar(const int N, const double alpha, double* Y) { template void caffe_copy(const int N, const Dtype* X, Dtype* Y) { if (X != Y) { - CUDA_CHECK(cudaMemcpy(Y, X, sizeof(Dtype) * N, cudaMemcpyDefault)); + if (Caffe::mode() == Caffe::CPU) { + memcpy(Y, X, sizeof(Dtype) * N); + } else { + CUDA_CHECK(cudaMemcpy(Y, X, sizeof(Dtype) * N, cudaMemcpyDefault)); + } } } @@ -164,7 +168,11 @@ template void caffe_copy(const int N, const double* X, double* Y); void caffe_memcpy(const size_t N, const void* X, void* Y) { if (X != Y) { - CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); + if (Caffe::mode() == Caffe::CPU) { + memcpy(Y, X, N); + } else { + CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); + } } } From 4d16ed5969d8963babd63ae650289dfb8fd633f4 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Wed, 9 Jul 2014 09:47:28 +0800 Subject: [PATCH 0232/2053] Check the GPU mode to decide which memcpy to use --- src/caffe/util/math_functions.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index df32093238f..9311a398721 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -152,10 +152,10 @@ void caffe_add_scalar(const int N, const double alpha, double* Y) { template void caffe_copy(const int N, const Dtype* X, Dtype* Y) { if (X != Y) { - if (Caffe::mode() == Caffe::CPU) { - memcpy(Y, X, sizeof(Dtype) * N); - } else { + if (Caffe::mode() == Caffe::GPU) { CUDA_CHECK(cudaMemcpy(Y, X, sizeof(Dtype) * N, cudaMemcpyDefault)); + } else { + memcpy(Y, X, sizeof(Dtype) * N); } } } @@ -168,10 +168,10 @@ template void caffe_copy(const int N, const double* X, double* Y); void caffe_memcpy(const size_t N, const void* X, void* Y) { if (X != Y) { - if (Caffe::mode() == Caffe::CPU) { - memcpy(Y, X, N); - } else { + if (Caffe::mode() == Caffe::GPU) { CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); + } else { + memcpy(Y, X, N); } } } From 00433d8082796bdaa2cafa067c158a5f31245985 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Wed, 9 Jul 2014 10:12:07 +0800 Subject: [PATCH 0233/2053] Switch to GPU mode when pointer is move to or from GPU in SyncedMemory --- src/caffe/syncedmem.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caffe/syncedmem.cpp b/src/caffe/syncedmem.cpp index 9fe55280de9..5d6d0585222 100644 --- a/src/caffe/syncedmem.cpp +++ b/src/caffe/syncedmem.cpp @@ -33,6 +33,7 @@ inline void SyncedMemory::to_cpu() { CaffeMallocHost(&cpu_ptr_, size_); own_cpu_data_ = true; } + Caffe::set_mode(Caffe::GPU); caffe_memcpy(size_, gpu_ptr_, cpu_ptr_); head_ = SYNCED; break; @@ -53,6 +54,7 @@ inline void SyncedMemory::to_gpu() { if (gpu_ptr_ == NULL) { CUDA_CHECK(cudaMalloc(&gpu_ptr_, size_)); } + Caffe::set_mode(Caffe::GPU); caffe_memcpy(size_, cpu_ptr_, gpu_ptr_); head_ = SYNCED; break; From ac0dd39252812aba1f67b9b0b0e18e62ea1742e6 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 10 Jul 2014 01:57:16 +0800 Subject: [PATCH 0234/2053] Implement @Yangqing's solution to copy memory in the SyncedMemory --- src/caffe/syncedmem.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/caffe/syncedmem.cpp b/src/caffe/syncedmem.cpp index 5d6d0585222..3f9a3be9ebf 100644 --- a/src/caffe/syncedmem.cpp +++ b/src/caffe/syncedmem.cpp @@ -33,8 +33,7 @@ inline void SyncedMemory::to_cpu() { CaffeMallocHost(&cpu_ptr_, size_); own_cpu_data_ = true; } - Caffe::set_mode(Caffe::GPU); - caffe_memcpy(size_, gpu_ptr_, cpu_ptr_); + CUDA_CHECK(cudaMemcpy(cpu_ptr_, gpu_ptr_, size_, cudaMemcpyDefault)); head_ = SYNCED; break; case HEAD_AT_CPU: @@ -54,8 +53,7 @@ inline void SyncedMemory::to_gpu() { if (gpu_ptr_ == NULL) { CUDA_CHECK(cudaMalloc(&gpu_ptr_, size_)); } - Caffe::set_mode(Caffe::GPU); - caffe_memcpy(size_, cpu_ptr_, gpu_ptr_); + CUDA_CHECK(cudaMemcpy(gpu_ptr_, cpu_ptr_, size_, cudaMemcpyDefault)); head_ = SYNCED; break; case HEAD_AT_GPU: From 904c2ce69b728c988004cef6796fbdf07ecb4c1e Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 10 Jul 2014 07:50:31 +0800 Subject: [PATCH 0235/2053] Replace cudaMemcpy with caffe_gpu_memcpy in SyncedMemory per @longjon --- include/caffe/util/math_functions.hpp | 2 +- src/caffe/syncedmem.cpp | 4 ++-- src/caffe/test/test_syncedmem.cpp | 4 ++-- src/caffe/util/math_functions.cpp | 8 ++------ 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 97a057103db..2df0fc983f9 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -59,7 +59,7 @@ void caffe_gpu_axpby(const int N, const Dtype alpha, const Dtype* X, template void caffe_copy(const int N, const Dtype *X, Dtype *Y); -void caffe_memcpy(const size_t N, const void *X, void *Y); +void caffe_gpu_memcpy(const size_t N, const void *X, void *Y); template void caffe_set(const int N, const Dtype alpha, Dtype *X); diff --git a/src/caffe/syncedmem.cpp b/src/caffe/syncedmem.cpp index 3f9a3be9ebf..77dfe7a4636 100644 --- a/src/caffe/syncedmem.cpp +++ b/src/caffe/syncedmem.cpp @@ -33,7 +33,7 @@ inline void SyncedMemory::to_cpu() { CaffeMallocHost(&cpu_ptr_, size_); own_cpu_data_ = true; } - CUDA_CHECK(cudaMemcpy(cpu_ptr_, gpu_ptr_, size_, cudaMemcpyDefault)); + caffe_gpu_memcpy(size_, gpu_ptr_, cpu_ptr_); head_ = SYNCED; break; case HEAD_AT_CPU: @@ -53,7 +53,7 @@ inline void SyncedMemory::to_gpu() { if (gpu_ptr_ == NULL) { CUDA_CHECK(cudaMalloc(&gpu_ptr_, size_)); } - CUDA_CHECK(cudaMemcpy(gpu_ptr_, cpu_ptr_, size_, cudaMemcpyDefault)); + caffe_gpu_memcpy(size_, cpu_ptr_, gpu_ptr_); head_ = SYNCED; break; case HEAD_AT_GPU: diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index 3aaeafc353e..3a757088e89 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -58,7 +58,7 @@ TEST_F(SyncedMemoryTest, TestGPURead) { EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same char* recovered_value = new char[10]; - caffe_memcpy(10, gpu_data, recovered_value); + caffe_gpu_memcpy(10, gpu_data, recovered_value); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((reinterpret_cast(recovered_value))[i], 1); } @@ -72,7 +72,7 @@ TEST_F(SyncedMemoryTest, TestGPURead) { gpu_data = mem.gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same - caffe_memcpy(10, gpu_data, recovered_value); + caffe_gpu_memcpy(10, gpu_data, recovered_value); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((reinterpret_cast(recovered_value))[i], 2); } diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index 9311a398721..b989ca2ab69 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -166,13 +166,9 @@ template void caffe_copy(const int N, const unsigned int* X, template void caffe_copy(const int N, const float* X, float* Y); template void caffe_copy(const int N, const double* X, double* Y); -void caffe_memcpy(const size_t N, const void* X, void* Y) { +void caffe_gpu_memcpy(const size_t N, const void* X, void* Y) { if (X != Y) { - if (Caffe::mode() == Caffe::GPU) { - CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); - } else { - memcpy(Y, X, N); - } + CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); } } From e07a2c0eea903e8d7c7050e14d177bbd0f8f611a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 11 Jul 2014 06:09:41 +0200 Subject: [PATCH 0236/2053] fix link for caffe_rcnn_imagenet_model --- examples/imagenet/get_caffe_rcnn_imagenet_model.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/imagenet/get_caffe_rcnn_imagenet_model.sh b/examples/imagenet/get_caffe_rcnn_imagenet_model.sh index 7cd47fa33a6..c7f36edcbf0 100755 --- a/examples/imagenet/get_caffe_rcnn_imagenet_model.sh +++ b/examples/imagenet/get_caffe_rcnn_imagenet_model.sh @@ -23,5 +23,5 @@ fi echo "Downloading..." -wget --no-check-certificate https://www.dropbox.com/s/0i3etlgmsmgf5ei/$MODEL +wget http://dl.caffe.berkeleyvision.org/$MODEL echo "Done. Please run this command again to verify that checksum = $CHECKSUM." From e5ce15d29d183f8a2cdc48ab12e90d254cf4fad1 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 12 Jul 2014 06:58:35 -0700 Subject: [PATCH 0237/2053] Move test headers to include/. Add a test param to test both CPU and GPU (with both float and double Dtypes). --- Makefile | 9 +- include/caffe/test/test_caffe_main.hpp | 62 ++++ .../caffe/test/test_gradient_check_util.hpp | 0 src/caffe/test/test_accuracy_layer.cpp | 4 +- src/caffe/test/test_argmax_layer.cpp | 4 +- src/caffe/test/test_benchmark.cpp | 106 +------ src/caffe/test/test_blob.cpp | 5 +- src/caffe/test/test_caffe_main.cpp | 2 +- src/caffe/test/test_caffe_main.hpp | 20 -- src/caffe/test/test_common.cpp | 6 +- src/caffe/test/test_concat_layer.cpp | 39 +-- src/caffe/test/test_convolution_layer.cpp | 185 ++---------- src/caffe/test/test_data_layer.cpp | 125 +------- src/caffe/test/test_dummy_data_layer.cpp | 3 +- src/caffe/test/test_eltwise_layer.cpp | 172 +++-------- src/caffe/test/test_euclidean_loss_layer.cpp | 26 +- src/caffe/test/test_filler.cpp | 10 +- src/caffe/test/test_flatten_layer.cpp | 48 +-- src/caffe/test/test_hdf5_output_layer.cpp | 78 +---- src/caffe/test/test_hdf5data_layer.cpp | 88 +++--- src/caffe/test/test_hinge_loss_layer.cpp | 49 +-- src/caffe/test/test_im2col_kernel.cu | 3 +- src/caffe/test/test_im2col_layer.cpp | 55 +--- src/caffe/test/test_image_data_layer.cpp | 24 +- src/caffe/test/test_inner_product_layer.cpp | 78 ++--- src/caffe/test/test_lrn_layer.cpp | 123 ++------ src/caffe/test/test_math_functions.cpp | 3 +- .../test/test_maxpool_dropout_layers.cpp | 108 ++----- src/caffe/test/test_memory_data_layer.cpp | 3 +- .../test_multinomial_logistic_loss_layer.cpp | 3 +- src/caffe/test/test_net.cpp | 170 +++-------- src/caffe/test/test_neuron_layer.cpp | 251 ++++------------ src/caffe/test/test_pooling_layer.cpp | 281 +++--------------- src/caffe/test/test_power_layer.cpp | 189 ++++-------- .../test/test_random_number_generator.cpp | 5 +- .../test_sigmoid_cross_entropy_loss_layer.cpp | 36 +-- src/caffe/test/test_softmax_layer.cpp | 9 +- .../test/test_softmax_with_loss_layer.cpp | 27 +- src/caffe/test/test_split_layer.cpp | 89 ++---- src/caffe/test/test_stochastic_pooling.cpp | 3 +- src/caffe/test/test_syncedmem.cpp | 28 +- src/caffe/test/test_tanh_layer.cpp | 54 +--- src/caffe/test/test_threshold_layer.cpp | 83 ++---- src/caffe/test/test_util_blas.cpp | 10 +- 44 files changed, 684 insertions(+), 1992 deletions(-) create mode 100644 include/caffe/test/test_caffe_main.hpp rename {src => include}/caffe/test/test_gradient_check_util.hpp (100%) delete mode 100644 src/caffe/test/test_caffe_main.hpp diff --git a/Makefile b/Makefile index 829602b7946..c17d4980b79 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ STATIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).a # CXX_SRCS are the source files excluding the test ones. CXX_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cpp" -name "*.cpp") # HXX_SRCS are the header files -HXX_SRCS := $(shell find include/$(PROJECT) -name "*.hpp") +HXX_SRCS := $(shell find include/$(PROJECT) ! -name "test_*.hpp" -name "*.hpp") # CU_SRCS are the cuda source files CU_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cu" -name "*.cu") # TEST_SRCS are the test source files @@ -38,7 +38,7 @@ TEST_SRCS := $(filter-out $(TEST_MAIN_SRC), $(TEST_SRCS)) TEST_CU_SRCS := $(shell find src/$(PROJECT) -name "test_*.cu") GTEST_SRC := src/gtest/gtest-all.cpp # TEST_HDRS are the test header files -TEST_HDRS := $(shell find src/$(PROJECT) -name "test_*.hpp") +TEST_HDRS := $(shell find include/$(PROJECT) -name "test_*.hpp") # TOOL_SRCS are the source files for the tool binaries TOOL_SRCS := $(shell find tools -name "*.cpp") # EXAMPLE_SRCS are the source files for the example binaries @@ -282,7 +282,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo # Define build targets ############################## .PHONY: all test clean linecount lint tools examples $(DIST_ALIASES) \ - py mat py$(PROJECT) mat$(PROJECT) proto runtest \ + py mat py$(PROJECT) mat$(PROJECT) proto runtest runtestnogpu \ superclean supercleanlist supercleanfiles warn all: $(NAME) $(STATIC_NAME) tools examples @@ -343,6 +343,9 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) runtest: $(TEST_ALL_BIN) $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle +runtestnogpu: $(TEST_ALL_BIN) + $(TEST_ALL_BIN) --gtest_shuffle --gtest_filter="-*GPU*:*/2.*:*/3.*" + warn: $(EMPTY_WARN_REPORT) $(EMPTY_WARN_REPORT): $(ALL_WARNS) | $(BUILD_DIR) diff --git a/include/caffe/test/test_caffe_main.hpp b/include/caffe/test/test_caffe_main.hpp new file mode 100644 index 00000000000..e1a76455bed --- /dev/null +++ b/include/caffe/test/test_caffe_main.hpp @@ -0,0 +1,62 @@ +// Copyright 2014 BVLC and contributors. + +// The main caffe test code. Your test cpp code should include this hpp +// to allow a main function to be compiled into the binary. +#ifndef CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ +#define CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ + +#include +#include +#include + +#include +#include + +#include "caffe/common.hpp" + +using std::cout; +using std::endl; + +int main(int argc, char** argv); + +namespace caffe { + +template +class MultiDeviceTest : public ::testing::Test { + public: + typedef typename TypeParam::Dtype Dtype; + protected: + MultiDeviceTest() { + Caffe::set_mode(TypeParam::device); + } + virtual ~MultiDeviceTest() {} +}; + +typedef ::testing::Types TestDtypes; + +struct FloatCPU { + typedef float Dtype; + static const Caffe::Brew device = Caffe::CPU; +}; + +struct DoubleCPU { + typedef double Dtype; + static const Caffe::Brew device = Caffe::CPU; +}; + +struct FloatGPU { + typedef float Dtype; + static const Caffe::Brew device = Caffe::GPU; +}; + +struct DoubleGPU { + typedef double Dtype; + static const Caffe::Brew device = Caffe::GPU; +}; + +typedef ::testing::Types + TestDtypesAndDevices; + +} // namespace caffe + +#endif // CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ diff --git a/src/caffe/test/test_gradient_check_util.hpp b/include/caffe/test/test_gradient_check_util.hpp similarity index 100% rename from src/caffe/test/test_gradient_check_util.hpp rename to include/caffe/test/test_gradient_check_util.hpp diff --git a/src/caffe/test/test_accuracy_layer.cpp b/src/caffe/test/test_accuracy_layer.cpp index deb72af34ec..355a36b3c95 100644 --- a/src/caffe/test/test_accuracy_layer.cpp +++ b/src/caffe/test/test_accuracy_layer.cpp @@ -71,14 +71,12 @@ class AccuracyLayerTest : public ::testing::Test { int top_k_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(AccuracyLayerTest, Dtypes); +TYPED_TEST_CASE(AccuracyLayerTest, TestDtypes); TYPED_TEST(AccuracyLayerTest, TestForwardCPU) { LayerParameter layer_param; AccuracyParameter* accuracy_param = layer_param.mutable_accuracy_param(); accuracy_param->set_top_k(this->top_k_); - Caffe::set_mode(Caffe::CPU); AccuracyLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index c4150e5abe0..44a13b99b1a 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -37,9 +37,7 @@ class ArgMaxLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(ArgMaxLayerTest, Dtypes); - +TYPED_TEST_CASE(ArgMaxLayerTest, TestDtypes); TYPED_TEST(ArgMaxLayerTest, TestSetup) { LayerParameter layer_param; diff --git a/src/caffe/test/test_benchmark.cpp b/src/caffe/test/test_benchmark.cpp index 40eee9c80f9..82880088073 100644 --- a/src/caffe/test/test_benchmark.cpp +++ b/src/caffe/test/test_benchmark.cpp @@ -12,26 +12,19 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -class BenchmarkTest : public ::testing::Test {}; +template +class BenchmarkTest : public MultiDeviceTest {}; -TEST_F(BenchmarkTest, TestTimerConstructorCPU) { - Caffe::set_mode(Caffe::CPU); - Timer timer; - EXPECT_TRUE(timer.initted()); - EXPECT_FALSE(timer.running()); - EXPECT_FALSE(timer.has_run_at_least_once()); -} +TYPED_TEST_CASE(BenchmarkTest, TestDtypesAndDevices); -TEST_F(BenchmarkTest, TestTimerConstructorGPU) { - Caffe::set_mode(Caffe::GPU); +TYPED_TEST(BenchmarkTest, TestTimerConstructor) { Timer timer; EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_FALSE(timer.has_run_at_least_once()); } -TEST_F(BenchmarkTest, TestTimerStartCPU) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(BenchmarkTest, TestTimerStart) { Timer timer; timer.Start(); EXPECT_TRUE(timer.initted()); @@ -48,26 +41,7 @@ TEST_F(BenchmarkTest, TestTimerStartCPU) { EXPECT_TRUE(timer.has_run_at_least_once()); } -TEST_F(BenchmarkTest, TestTimerStartGPU) { - Caffe::set_mode(Caffe::GPU); - Timer timer; - timer.Start(); - EXPECT_TRUE(timer.initted()); - EXPECT_TRUE(timer.running()); - EXPECT_TRUE(timer.has_run_at_least_once()); - timer.Stop(); - timer.Start(); - EXPECT_TRUE(timer.initted()); - EXPECT_TRUE(timer.running()); - EXPECT_TRUE(timer.has_run_at_least_once()); - timer.Start(); - EXPECT_TRUE(timer.initted()); - EXPECT_TRUE(timer.running()); - EXPECT_TRUE(timer.has_run_at_least_once()); -} - -TEST_F(BenchmarkTest, TestTimerStopCPU) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(BenchmarkTest, TestTimerStop) { Timer timer; timer.Stop(); EXPECT_TRUE(timer.initted()); @@ -84,83 +58,31 @@ TEST_F(BenchmarkTest, TestTimerStopCPU) { EXPECT_TRUE(timer.has_run_at_least_once()); } -TEST_F(BenchmarkTest, TestTimerStopGPU) { - Caffe::set_mode(Caffe::GPU); - Timer timer; - timer.Stop(); - EXPECT_TRUE(timer.initted()); - EXPECT_FALSE(timer.running()); - EXPECT_FALSE(timer.has_run_at_least_once()); - timer.Start(); - timer.Stop(); - EXPECT_TRUE(timer.initted()); - EXPECT_FALSE(timer.running()); - EXPECT_TRUE(timer.has_run_at_least_once()); - timer.Stop(); - EXPECT_TRUE(timer.initted()); - EXPECT_FALSE(timer.running()); - EXPECT_TRUE(timer.has_run_at_least_once()); -} - -TEST_F(BenchmarkTest, TestTimerMilliSecondsCPU) { - Caffe::set_mode(Caffe::CPU); - Timer timer; - CHECK_EQ(timer.MilliSeconds(), 0); - EXPECT_TRUE(timer.initted()); - EXPECT_FALSE(timer.running()); - EXPECT_FALSE(timer.has_run_at_least_once()); - timer.Start(); - usleep(300 * 1000); - CHECK_GE(timer.MilliSeconds(), 298); - CHECK_LE(timer.MilliSeconds(), 302); - EXPECT_TRUE(timer.initted()); - EXPECT_FALSE(timer.running()); - EXPECT_TRUE(timer.has_run_at_least_once()); -} - -TEST_F(BenchmarkTest, TestTimerMilliSecondsGPU) { - Caffe::set_mode(Caffe::GPU); - Timer timer; - CHECK_EQ(timer.MilliSeconds(), 0); - EXPECT_TRUE(timer.initted()); - EXPECT_FALSE(timer.running()); - EXPECT_FALSE(timer.has_run_at_least_once()); - timer.Start(); - usleep(300 * 1000); - CHECK_GE(timer.MilliSeconds(), 298); - CHECK_LE(timer.MilliSeconds(), 302); - EXPECT_TRUE(timer.initted()); - EXPECT_FALSE(timer.running()); - EXPECT_TRUE(timer.has_run_at_least_once()); -} - -TEST_F(BenchmarkTest, TestTimerSecondsCPU) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(BenchmarkTest, TestTimerMilliSeconds) { Timer timer; - CHECK_EQ(timer.Seconds(), 0); + EXPECT_EQ(timer.MilliSeconds(), 0); EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_FALSE(timer.has_run_at_least_once()); timer.Start(); usleep(300 * 1000); - CHECK_GE(timer.Seconds(), 0.298); - CHECK_LE(timer.Seconds(), 0.302); + EXPECT_GE(timer.MilliSeconds(), 298); + EXPECT_LE(timer.MilliSeconds(), 302); EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_TRUE(timer.has_run_at_least_once()); } -TEST_F(BenchmarkTest, TestTimerSecondsGPU) { - Caffe::set_mode(Caffe::GPU); +TYPED_TEST(BenchmarkTest, TestTimerSeconds) { Timer timer; - CHECK_EQ(timer.Seconds(), 0); + EXPECT_EQ(timer.Seconds(), 0); EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_FALSE(timer.has_run_at_least_once()); timer.Start(); usleep(300 * 1000); - CHECK_GE(timer.Seconds(), 0.298); - CHECK_LE(timer.Seconds(), 0.302); + EXPECT_GE(timer.Seconds(), 0.298); + EXPECT_LE(timer.Seconds(), 0.302); EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_TRUE(timer.has_run_at_least_once()); diff --git a/src/caffe/test/test_blob.cpp b/src/caffe/test/test_blob.cpp index 5d38e54ff75..a5240940fd8 100644 --- a/src/caffe/test/test_blob.cpp +++ b/src/caffe/test/test_blob.cpp @@ -23,8 +23,7 @@ class BlobSimpleTest : public ::testing::Test { Blob* const blob_preshaped_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(BlobSimpleTest, Dtypes); +TYPED_TEST_CASE(BlobSimpleTest, TestDtypes); TYPED_TEST(BlobSimpleTest, TestInitialization) { EXPECT_TRUE(this->blob_); @@ -41,7 +40,7 @@ TYPED_TEST(BlobSimpleTest, TestInitialization) { EXPECT_EQ(this->blob_->count(), 0); } -TYPED_TEST(BlobSimpleTest, TestPointers) { +TYPED_TEST(BlobSimpleTest, TestPointersCPUGPU) { EXPECT_TRUE(this->blob_preshaped_->gpu_data()); EXPECT_TRUE(this->blob_preshaped_->cpu_data()); EXPECT_TRUE(this->blob_preshaped_->mutable_gpu_data()); diff --git a/src/caffe/test/test_caffe_main.cpp b/src/caffe/test/test_caffe_main.cpp index ecc117e3b36..07e6b8d5ef2 100644 --- a/src/caffe/test/test_caffe_main.cpp +++ b/src/caffe/test/test_caffe_main.cpp @@ -3,7 +3,7 @@ // The main caffe test code. Your test cpp code should include this hpp // to allow a main function to be compiled into the binary. -#include "test_caffe_main.hpp" +#include "caffe/test/test_caffe_main.hpp" namespace caffe { cudaDeviceProp CAFFE_TEST_CUDA_PROP; diff --git a/src/caffe/test/test_caffe_main.hpp b/src/caffe/test/test_caffe_main.hpp deleted file mode 100644 index df64cbb41cc..00000000000 --- a/src/caffe/test/test_caffe_main.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2014 BVLC and contributors. - -// The main caffe test code. Your test cpp code should include this hpp -// to allow a main function to be compiled into the binary. -#ifndef CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ -#define CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ - -#include -#include -#include - -#include -#include - -using std::cout; -using std::endl; - -int main(int argc, char** argv); - -#endif // CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ diff --git a/src/caffe/test/test_common.cpp b/src/caffe/test/test_common.cpp index 13c2d9514f7..a452b612890 100644 --- a/src/caffe/test/test_common.cpp +++ b/src/caffe/test/test_common.cpp @@ -13,7 +13,7 @@ namespace caffe { class CommonTest : public ::testing::Test {}; -TEST_F(CommonTest, TestCublasHandler) { +TEST_F(CommonTest, TestCublasHandlerGPU) { int cuda_device_id; CUDA_CHECK(cudaGetDevice(&cuda_device_id)); EXPECT_TRUE(Caffe::cublas_handle()); @@ -53,10 +53,10 @@ TEST_F(CommonTest, TestRandSeedGPU) { SyncedMemory data_b(10 * sizeof(unsigned int)); Caffe::set_random_seed(1701); CURAND_CHECK(curandGenerate(Caffe::curand_generator(), - reinterpret_cast(data_a.mutable_gpu_data()), 10)); + static_cast(data_a.mutable_gpu_data()), 10)); Caffe::set_random_seed(1701); CURAND_CHECK(curandGenerate(Caffe::curand_generator(), - reinterpret_cast(data_b.mutable_gpu_data()), 10)); + static_cast(data_b.mutable_gpu_data()), 10)); for (int i = 0; i < 10; ++i) { EXPECT_EQ(((const unsigned int*)(data_a.cpu_data()))[i], ((const unsigned int*)(data_b.cpu_data()))[i]); diff --git a/src/caffe/test/test_concat_layer.cpp b/src/caffe/test/test_concat_layer.cpp index 72e3c902cf1..ff208a90d3a 100644 --- a/src/caffe/test/test_concat_layer.cpp +++ b/src/caffe/test/test_concat_layer.cpp @@ -17,8 +17,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class ConcatLayerTest : public ::testing::Test { +template +class ConcatLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: ConcatLayerTest() : blob_bottom_0(new Blob(2, 3, 6, 5)), @@ -55,13 +57,13 @@ class ConcatLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(ConcatLayerTest, Dtypes); +TYPED_TEST_CASE(ConcatLayerTest, TestDtypesAndDevices); TYPED_TEST(ConcatLayerTest, TestSetupNum) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; layer_param.mutable_concat_param()->set_concat_dim(0); - ConcatLayer layer(layer_param); + ConcatLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_1, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_0->num() + this->blob_bottom_2->num()); @@ -71,8 +73,9 @@ TYPED_TEST(ConcatLayerTest, TestSetupNum) { } TYPED_TEST(ConcatLayerTest, TestSetupChannels) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - ConcatLayer layer(layer_param); + ConcatLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_0, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_0->num()); EXPECT_EQ(this->blob_top_->channels(), @@ -82,10 +85,10 @@ TYPED_TEST(ConcatLayerTest, TestSetupChannels) { } -TYPED_TEST(ConcatLayerTest, TestCPUNum) { +TYPED_TEST(ConcatLayerTest, TestNum) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - ConcatLayer layer(layer_param); - Caffe::set_mode(Caffe::CPU); + ConcatLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_0, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_0, &(this->blob_top_vec_)); for (int n = 0; n < this->blob_top_->num(); ++n) { @@ -108,21 +111,11 @@ TYPED_TEST(ConcatLayerTest, TestCPUNum) { } } - -TYPED_TEST(ConcatLayerTest, TestCPUGradient) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - ConcatLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradient(&layer, &(this->blob_bottom_vec_0), - &(this->blob_top_vec_)); -} - -TYPED_TEST(ConcatLayerTest, TestGPUGradient) { +TYPED_TEST(ConcatLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - ConcatLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); + ConcatLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); checker.CheckGradient(&layer, &(this->blob_bottom_vec_0), &(this->blob_top_vec_)); } diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index f7401015538..6f3e3146117 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -17,8 +17,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class ConvolutionLayerTest : public ::testing::Test { +template +class ConvolutionLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: ConvolutionLayerTest() : blob_bottom_(new Blob(2, 3, 6, 4)), @@ -51,10 +53,10 @@ class ConvolutionLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(ConvolutionLayerTest, Dtypes); +TYPED_TEST_CASE(ConvolutionLayerTest, TestDtypesAndDevices); TYPED_TEST(ConvolutionLayerTest, TestSetup) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); @@ -63,8 +65,8 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { convolution_param->set_num_output(4); this->blob_bottom_vec_.push_back(this->blob_bottom_2_); this->blob_top_vec_.push_back(this->blob_top_2_); - shared_ptr > layer( - new ConvolutionLayer(layer_param)); + shared_ptr > layer( + new ConvolutionLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 4); @@ -77,7 +79,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { // setting group should not change the shape convolution_param->set_num_output(3); convolution_param->set_group(3); - layer.reset(new ConvolutionLayer(layer_param)); + layer.reset(new ConvolutionLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 3); @@ -89,15 +91,16 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { EXPECT_EQ(this->blob_top_2_->width(), 1); } -TYPED_TEST(ConvolutionLayerTest, TestCPUSimpleConvolution) { +TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) { // We will simply see if the convolution layer carries out averaging well. - shared_ptr > filler; + typedef typename TypeParam::Dtype Dtype; + shared_ptr > filler; FillerParameter filler_param; filler_param.set_value(1.); - filler.reset(new ConstantFiller(filler_param)); + filler.reset(new ConstantFiller(filler_param)); filler->Fill(this->blob_bottom_); filler_param.set_value(2.); - filler.reset(new ConstantFiller(filler_param)); + filler.reset(new ConstantFiller(filler_param)); filler->Fill(this->blob_bottom_2_); this->blob_bottom_vec_.push_back(this->blob_bottom_2_); this->blob_top_vec_.push_back(this->blob_top_2_); @@ -111,13 +114,12 @@ TYPED_TEST(ConvolutionLayerTest, TestCPUSimpleConvolution) { convolution_param->mutable_weight_filler()->set_value(1); convolution_param->mutable_bias_filler()->set_type("constant"); convolution_param->mutable_bias_filler()->set_value(0.1); - shared_ptr > layer( - new ConvolutionLayer(layer_param)); + shared_ptr > layer( + new ConvolutionLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - Caffe::set_mode(Caffe::CPU); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // After the convolution, the output should all have output values 27.1 - const TypeParam* top_data = this->blob_top_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_top_->count(); ++i) { EXPECT_NEAR(top_data[i], 27.1, 1e-4); } @@ -127,98 +129,14 @@ TYPED_TEST(ConvolutionLayerTest, TestCPUSimpleConvolution) { } } -TYPED_TEST(ConvolutionLayerTest, TestGPUSimpleConvolution) { - // We will simply see if the convolution layer carries out averaging well. - shared_ptr > filler; - FillerParameter filler_param; - filler_param.set_value(1.); - filler.reset(new ConstantFiller(filler_param)); - filler->Fill(this->blob_bottom_); - filler_param.set_value(2.); - filler.reset(new ConstantFiller(filler_param)); - filler->Fill(this->blob_bottom_2_); - this->blob_bottom_vec_.push_back(this->blob_bottom_2_); - this->blob_top_vec_.push_back(this->blob_top_2_); - LayerParameter layer_param; - ConvolutionParameter* convolution_param = - layer_param.mutable_convolution_param(); - convolution_param->set_kernel_size(3); - convolution_param->set_stride(2); - convolution_param->set_num_output(4); - convolution_param->mutable_weight_filler()->set_type("constant"); - convolution_param->mutable_weight_filler()->set_value(1); - convolution_param->mutable_bias_filler()->set_type("constant"); - convolution_param->mutable_bias_filler()->set_value(0.1); - shared_ptr > layer( - new ConvolutionLayer(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - Caffe::set_mode(Caffe::GPU); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // After the convolution, the output should all have output values 27.1 - const TypeParam* top_data = this->blob_top_->cpu_data(); - for (int i = 0; i < this->blob_top_->count(); ++i) { - EXPECT_NEAR(top_data[i], 27.1, 1e-4); - } - top_data = this->blob_top_2_->cpu_data(); - for (int i = 0; i < this->blob_top_2_->count(); ++i) { - EXPECT_NEAR(top_data[i], 54.1, 1e-4); - } -} - -TYPED_TEST(ConvolutionLayerTest, TestCPUSimpleConvolutionGroup) { - // We will simply see if the convolution layer carries out averaging well. - FillerParameter filler_param; - filler_param.set_value(1.); - ConstantFiller filler(filler_param); - filler.Fill(this->blob_bottom_); - TypeParam* bottom_data = this->blob_bottom_->mutable_cpu_data(); - for (int n = 0; n < this->blob_bottom_->num(); ++n) { - for (int c = 0; c < this->blob_bottom_->channels(); ++c) { - for (int h = 0; h < this->blob_bottom_->height(); ++h) { - for (int w = 0; w < this->blob_bottom_->width(); ++w) { - bottom_data[this->blob_bottom_->offset(n, c, h, w)] = c; - } - } - } - } - LayerParameter layer_param; - ConvolutionParameter* convolution_param = - layer_param.mutable_convolution_param(); - convolution_param->set_kernel_size(3); - convolution_param->set_stride(2); - convolution_param->set_num_output(3); - convolution_param->set_group(3); - convolution_param->mutable_weight_filler()->set_type("constant"); - convolution_param->mutable_weight_filler()->set_value(1); - convolution_param->mutable_bias_filler()->set_type("constant"); - convolution_param->mutable_bias_filler()->set_value(0.1); - shared_ptr > layer( - new ConvolutionLayer(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - Caffe::set_mode(Caffe::CPU); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // After the convolution, the output should all have output values 9.1 - const TypeParam* top_data = this->blob_top_->cpu_data(); - for (int n = 0; n < this->blob_top_->num(); ++n) { - for (int c = 0; c < this->blob_top_->channels(); ++c) { - for (int h = 0; h < this->blob_top_->height(); ++h) { - for (int w = 0; w < this->blob_top_->width(); ++w) { - TypeParam data = top_data[this->blob_top_->offset(n, c, h, w)]; - EXPECT_NEAR(data, c * 9 + 0.1, 1e-4); - } - } - } - } -} - - -TYPED_TEST(ConvolutionLayerTest, TestGPUSimpleConvolutionGroup) { +TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) { // We will simply see if the convolution layer carries out averaging well. + typedef typename TypeParam::Dtype Dtype; FillerParameter filler_param; filler_param.set_value(1.); - ConstantFiller filler(filler_param); + ConstantFiller filler(filler_param); filler.Fill(this->blob_bottom_); - TypeParam* bottom_data = this->blob_bottom_->mutable_cpu_data(); + Dtype* bottom_data = this->blob_bottom_->mutable_cpu_data(); for (int n = 0; n < this->blob_bottom_->num(); ++n) { for (int c = 0; c < this->blob_bottom_->channels(); ++c) { for (int h = 0; h < this->blob_bottom_->height(); ++h) { @@ -239,18 +157,17 @@ TYPED_TEST(ConvolutionLayerTest, TestGPUSimpleConvolutionGroup) { convolution_param->mutable_weight_filler()->set_value(1); convolution_param->mutable_bias_filler()->set_type("constant"); convolution_param->mutable_bias_filler()->set_value(0.1); - shared_ptr > layer( - new ConvolutionLayer(layer_param)); + shared_ptr > layer( + new ConvolutionLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - Caffe::set_mode(Caffe::GPU); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // After the convolution, the output should all have output values 9.1 - const TypeParam* top_data = this->blob_top_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); for (int n = 0; n < this->blob_top_->num(); ++n) { for (int c = 0; c < this->blob_top_->channels(); ++c) { for (int h = 0; h < this->blob_top_->height(); ++h) { for (int w = 0; w < this->blob_top_->width(); ++w) { - TypeParam data = top_data[this->blob_top_->offset(n, c, h, w)]; + Dtype data = top_data[this->blob_top_->offset(n, c, h, w)]; EXPECT_NEAR(data, c * 9 + 0.1, 1e-4); } } @@ -258,43 +175,8 @@ TYPED_TEST(ConvolutionLayerTest, TestGPUSimpleConvolutionGroup) { } } - -TYPED_TEST(ConvolutionLayerTest, TestCPUGradient) { - LayerParameter layer_param; - ConvolutionParameter* convolution_param = - layer_param.mutable_convolution_param(); - this->blob_bottom_vec_.push_back(this->blob_bottom_2_); - this->blob_top_vec_.push_back(this->blob_top_2_); - convolution_param->set_kernel_size(3); - convolution_param->set_stride(2); - convolution_param->set_num_output(2); - convolution_param->mutable_weight_filler()->set_type("gaussian"); - convolution_param->mutable_bias_filler()->set_type("gaussian"); - Caffe::set_mode(Caffe::CPU); - ConvolutionLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(ConvolutionLayerTest, TestCPUGradientGroup) { - LayerParameter layer_param; - ConvolutionParameter* convolution_param = - layer_param.mutable_convolution_param(); - convolution_param->set_kernel_size(3); - convolution_param->set_stride(2); - convolution_param->set_num_output(3); - convolution_param->set_group(3); - convolution_param->mutable_weight_filler()->set_type("gaussian"); - convolution_param->mutable_bias_filler()->set_type("gaussian"); - Caffe::set_mode(Caffe::CPU); - ConvolutionLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(ConvolutionLayerTest, TestGPUGradient) { +TYPED_TEST(ConvolutionLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); @@ -305,14 +187,14 @@ TYPED_TEST(ConvolutionLayerTest, TestGPUGradient) { convolution_param->set_num_output(2); convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("gaussian"); - Caffe::set_mode(Caffe::GPU); - ConvolutionLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); + ConvolutionLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } -TYPED_TEST(ConvolutionLayerTest, TestGPUGradientGroup) { +TYPED_TEST(ConvolutionLayerTest, TestGradientGroup) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); @@ -322,9 +204,8 @@ TYPED_TEST(ConvolutionLayerTest, TestGPUGradientGroup) { convolution_param->set_group(3); convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("gaussian"); - Caffe::set_mode(Caffe::GPU); - ConvolutionLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); + ConvolutionLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 8ba5f29ff91..8cd157dd98a 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -20,8 +20,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class DataLayerTest : public ::testing::Test { +template +class DataLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: DataLayerTest() : backend_(DataParameter_DB_LEVELDB), @@ -309,54 +311,25 @@ class DataLayerTest : public ::testing::Test { int seed_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(DataLayerTest, Dtypes); +TYPED_TEST_CASE(DataLayerTest, TestDtypesAndDevices); -TYPED_TEST(DataLayerTest, TestReadLevelDBCPU) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(DataLayerTest, TestReadLevelDB) { const bool unique_pixels = false; // all pixels the same; images different this->FillLevelDB(unique_pixels); this->TestRead(); } -TYPED_TEST(DataLayerTest, TestReadLevelDBGPU) { - Caffe::set_mode(Caffe::GPU); - const bool unique_pixels = false; // all pixels the same; images different - this->FillLevelDB(unique_pixels); - this->TestRead(); -} - -TYPED_TEST(DataLayerTest, TestReadCropTrainLevelDBCPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainLevelDB) { Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); this->TestReadCrop(); } -TYPED_TEST(DataLayerTest, TestReadCropTrainLevelDBGPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::GPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLevelDB(unique_pixels); - this->TestReadCrop(); -} - -// Test that the sequence of random crops is consistent when using -// Caffe::set_random_seed. -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLevelDBCPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::CPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLevelDB(unique_pixels); - this->TestReadCropTrainSequenceSeeded(); -} - // Test that the sequence of random crops is consistent when using // Caffe::set_random_seed. -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLevelDBGPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLevelDB) { Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); this->TestReadCropTrainSequenceSeeded(); @@ -364,65 +337,28 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLevelDBGPU) { // Test that the sequence of random crops differs across iterations when // Caffe::set_random_seed isn't called (and seeds from srand are ignored). -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLevelDBCPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLevelDB) { Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); this->TestReadCropTrainSequenceUnseeded(); } -// Test that the sequence of random crops differs across iterations when -// Caffe::set_random_seed isn't called (and seeds from srand are ignored). -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLevelDBGPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::GPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLevelDB(unique_pixels); - this->TestReadCropTrainSequenceUnseeded(); -} - -TYPED_TEST(DataLayerTest, TestReadCropTestLevelDBCPU) { - Caffe::set_phase(Caffe::TEST); - Caffe::set_mode(Caffe::CPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLevelDB(unique_pixels); - this->TestReadCrop(); -} - -TYPED_TEST(DataLayerTest, TestReadCropTestLevelDBGPU) { +TYPED_TEST(DataLayerTest, TestReadCropTestLevelDB) { Caffe::set_phase(Caffe::TEST); - Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLevelDB(unique_pixels); this->TestReadCrop(); } -TYPED_TEST(DataLayerTest, TestReadLMDBCPU) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(DataLayerTest, TestReadLMDB) { const bool unique_pixels = false; // all pixels the same; images different this->FillLMDB(unique_pixels); this->TestRead(); } -TYPED_TEST(DataLayerTest, TestReadLMDBGPU) { - Caffe::set_mode(Caffe::GPU); - const bool unique_pixels = false; // all pixels the same; images different - this->FillLMDB(unique_pixels); - this->TestRead(); -} - -TYPED_TEST(DataLayerTest, TestReadCropTrainLMDBCPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainLMDB) { Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::CPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - this->TestReadCrop(); -} - -TYPED_TEST(DataLayerTest, TestReadCropTrainLMDBGPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLMDB(unique_pixels); this->TestReadCrop(); @@ -430,55 +366,24 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainLMDBGPU) { // Test that the sequence of random crops is consistent when using // Caffe::set_random_seed. -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLMDBCPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLMDB) { Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::CPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLMDB(unique_pixels); this->TestReadCropTrainSequenceSeeded(); } -// Test that the sequence of random crops is consistent when using -// Caffe::set_random_seed. -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLMDBGPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::GPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - this->TestReadCropTrainSequenceSeeded(); -} - -// Test that the sequence of random crops differs across iterations when -// Caffe::set_random_seed isn't called (and seeds from srand are ignored). -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLMDBCPU) { - Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::CPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - this->TestReadCropTrainSequenceUnseeded(); -} - // Test that the sequence of random crops differs across iterations when // Caffe::set_random_seed isn't called (and seeds from srand are ignored). -TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLMDBGPU) { +TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLMDB) { Caffe::set_phase(Caffe::TRAIN); - Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLMDB(unique_pixels); this->TestReadCropTrainSequenceUnseeded(); } -TYPED_TEST(DataLayerTest, TestReadCropTestLMDBCPU) { - Caffe::set_phase(Caffe::TEST); - Caffe::set_mode(Caffe::CPU); - const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); - this->TestReadCrop(); -} - -TYPED_TEST(DataLayerTest, TestReadCropTestLMDBGPU) { +TYPED_TEST(DataLayerTest, TestReadCropTestLMDB) { Caffe::set_phase(Caffe::TEST); - Caffe::set_mode(Caffe::GPU); const bool unique_pixels = true; // all images the same; pixels different this->FillLMDB(unique_pixels); this->TestReadCrop(); diff --git a/src/caffe/test/test_dummy_data_layer.cpp b/src/caffe/test/test_dummy_data_layer.cpp index 7d9287e86ab..3a83a79772c 100644 --- a/src/caffe/test/test_dummy_data_layer.cpp +++ b/src/caffe/test/test_dummy_data_layer.cpp @@ -46,8 +46,7 @@ class DummyDataLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(DummyDataLayerTest, Dtypes); +TYPED_TEST_CASE(DummyDataLayerTest, TestDtypes); TYPED_TEST(DummyDataLayerTest, TestOneTopConstant) { Caffe::set_mode(Caffe::CPU); diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index 5f72f625da4..66490d2bc4e 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -16,8 +16,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class EltwiseLayerTest : public ::testing::Test { +template +class EltwiseLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: EltwiseLayerTest() : blob_bottom_a_(new Blob(2, 3, 4, 5)), @@ -49,15 +51,15 @@ class EltwiseLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(EltwiseLayerTest, Dtypes); +TYPED_TEST_CASE(EltwiseLayerTest, TestDtypesAndDevices); TYPED_TEST(EltwiseLayerTest, TestSetUp) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); - shared_ptr > layer( - new EltwiseLayer(layer_param)); + shared_ptr > layer( + new EltwiseLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 3); @@ -65,185 +67,99 @@ TYPED_TEST(EltwiseLayerTest, TestSetUp) { EXPECT_EQ(this->blob_top_->width(), 5); } -TYPED_TEST(EltwiseLayerTest, TestProdCPU) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(EltwiseLayerTest, TestProd) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); - shared_ptr > layer( - new EltwiseLayer(layer_param)); + shared_ptr > layer( + new EltwiseLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* data = this->blob_top_->cpu_data(); + const Dtype* data = this->blob_top_->cpu_data(); const int count = this->blob_top_->count(); - const TypeParam* in_data_a = this->blob_bottom_a_->cpu_data(); - const TypeParam* in_data_b = this->blob_bottom_b_->cpu_data(); - const TypeParam* in_data_c = this->blob_bottom_c_->cpu_data(); + const Dtype* in_data_a = this->blob_bottom_a_->cpu_data(); + const Dtype* in_data_b = this->blob_bottom_b_->cpu_data(); + const Dtype* in_data_c = this->blob_bottom_c_->cpu_data(); for (int i = 0; i < count; ++i) { EXPECT_EQ(data[i], in_data_a[i] * in_data_b[i] * in_data_c[i]); } } -TYPED_TEST(EltwiseLayerTest, TestSumCPU) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(EltwiseLayerTest, TestSum) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); - shared_ptr > layer( - new EltwiseLayer(layer_param)); + shared_ptr > layer( + new EltwiseLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* data = this->blob_top_->cpu_data(); + const Dtype* data = this->blob_top_->cpu_data(); const int count = this->blob_top_->count(); - const TypeParam* in_data_a = this->blob_bottom_a_->cpu_data(); - const TypeParam* in_data_b = this->blob_bottom_b_->cpu_data(); - const TypeParam* in_data_c = this->blob_bottom_c_->cpu_data(); + const Dtype* in_data_a = this->blob_bottom_a_->cpu_data(); + const Dtype* in_data_b = this->blob_bottom_b_->cpu_data(); + const Dtype* in_data_c = this->blob_bottom_c_->cpu_data(); for (int i = 0; i < count; ++i) { EXPECT_EQ(data[i], in_data_a[i] + in_data_b[i] + in_data_c[i]); } } -TYPED_TEST(EltwiseLayerTest, TestSumCoeffCPU) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(EltwiseLayerTest, TestSumCoeff) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); eltwise_param->add_coeff(1); eltwise_param->add_coeff(-0.5); eltwise_param->add_coeff(2); - shared_ptr > layer( - new EltwiseLayer(layer_param)); + shared_ptr > layer( + new EltwiseLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* data = this->blob_top_->cpu_data(); + const Dtype* data = this->blob_top_->cpu_data(); const int count = this->blob_top_->count(); - const TypeParam* in_data_a = this->blob_bottom_a_->cpu_data(); - const TypeParam* in_data_b = this->blob_bottom_b_->cpu_data(); - const TypeParam* in_data_c = this->blob_bottom_c_->cpu_data(); + const Dtype* in_data_a = this->blob_bottom_a_->cpu_data(); + const Dtype* in_data_b = this->blob_bottom_b_->cpu_data(); + const Dtype* in_data_c = this->blob_bottom_c_->cpu_data(); for (int i = 0; i < count; ++i) { EXPECT_NEAR(data[i], in_data_a[i] - 0.5*in_data_b[i] + 2*in_data_c[i], 1e-4); } } -TYPED_TEST(EltwiseLayerTest, TestProdGPU) { - Caffe::set_mode(Caffe::GPU); +TYPED_TEST(EltwiseLayerTest, TestProdGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); - shared_ptr > layer( - new EltwiseLayer(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* data = this->blob_top_->cpu_data(); - const int count = this->blob_top_->count(); - const TypeParam* in_data_a = this->blob_bottom_a_->cpu_data(); - const TypeParam* in_data_b = this->blob_bottom_b_->cpu_data(); - const TypeParam* in_data_c = this->blob_bottom_c_->cpu_data(); - for (int i = 0; i < count; ++i) { - EXPECT_EQ(data[i], in_data_a[i] * in_data_b[i] * in_data_c[i]); - } -} - -TYPED_TEST(EltwiseLayerTest, TestSumGPU) { - Caffe::set_mode(Caffe::GPU); - LayerParameter layer_param; - EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); - eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); - shared_ptr > layer( - new EltwiseLayer(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* data = this->blob_top_->cpu_data(); - const int count = this->blob_top_->count(); - const TypeParam* in_data_a = this->blob_bottom_a_->cpu_data(); - const TypeParam* in_data_b = this->blob_bottom_b_->cpu_data(); - const TypeParam* in_data_c = this->blob_bottom_c_->cpu_data(); - for (int i = 0; i < count; ++i) { - EXPECT_EQ(data[i], in_data_a[i] + in_data_b[i] + in_data_c[i]); - } -} - -TYPED_TEST(EltwiseLayerTest, TestSumCoeffGPU) { - Caffe::set_mode(Caffe::GPU); - LayerParameter layer_param; - EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); - eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); - eltwise_param->add_coeff(1); - eltwise_param->add_coeff(-0.5); - eltwise_param->add_coeff(2); - shared_ptr > layer( - new EltwiseLayer(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* data = this->blob_top_->cpu_data(); - const int count = this->blob_top_->count(); - const TypeParam* in_data_a = this->blob_bottom_a_->cpu_data(); - const TypeParam* in_data_b = this->blob_bottom_b_->cpu_data(); - const TypeParam* in_data_c = this->blob_bottom_c_->cpu_data(); - for (int i = 0; i < count; ++i) { - EXPECT_NEAR(data[i], in_data_a[i] - 0.5*in_data_b[i] + 2*in_data_c[i], - 1e-4); - } -} - -TYPED_TEST(EltwiseLayerTest, TestProdCPUGradient) { - Caffe::set_mode(Caffe::CPU); - LayerParameter layer_param; - EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); - eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); - EltwiseLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(EltwiseLayerTest, TestSumCPUGradient) { - Caffe::set_mode(Caffe::CPU); - LayerParameter layer_param; - EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); - eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); - EltwiseLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(EltwiseLayerTest, TestSumCoeffCPUGradient) { - Caffe::set_mode(Caffe::CPU); - LayerParameter layer_param; - EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); - eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); - eltwise_param->add_coeff(1); - eltwise_param->add_coeff(-0.5); - eltwise_param->add_coeff(2); - EltwiseLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); + EltwiseLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } -TYPED_TEST(EltwiseLayerTest, TestSumGPUGradient) { - Caffe::set_mode(Caffe::GPU); +TYPED_TEST(EltwiseLayerTest, TestSumGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); - EltwiseLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); + EltwiseLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } -TYPED_TEST(EltwiseLayerTest, TestSumCoeffGPUGradient) { - Caffe::set_mode(Caffe::GPU); +TYPED_TEST(EltwiseLayerTest, TestSumCoeffGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); eltwise_param->add_coeff(1); eltwise_param->add_coeff(-0.5); eltwise_param->add_coeff(2); - EltwiseLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); + EltwiseLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } diff --git a/src/caffe/test/test_euclidean_loss_layer.cpp b/src/caffe/test/test_euclidean_loss_layer.cpp index 02945b655de..8c796945b89 100644 --- a/src/caffe/test/test_euclidean_loss_layer.cpp +++ b/src/caffe/test/test_euclidean_loss_layer.cpp @@ -19,8 +19,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class EuclideanLossLayerTest : public ::testing::Test { +template +class EuclideanLossLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: EuclideanLossLayerTest() : blob_bottom_data_(new Blob(10, 5, 1, 1)), @@ -43,27 +45,17 @@ class EuclideanLossLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(EuclideanLossLayerTest, Dtypes); +TYPED_TEST_CASE(EuclideanLossLayerTest, TestDtypesAndDevices); -TYPED_TEST(EuclideanLossLayerTest, TestGradientCPU) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(EuclideanLossLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - EuclideanLossLayer layer(layer_param); + EuclideanLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 1e-2, 1701); + GradientChecker checker(1e-2, 1e-2, 1701); checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_), -1, -1, -1); } -TYPED_TEST(EuclideanLossLayerTest, TestGradientGPU) { - Caffe::set_mode(Caffe::GPU); - LayerParameter layer_param; - EuclideanLossLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 1e-2, 1701); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), -1, -1, -1); -} } // namespace caffe diff --git a/src/caffe/test/test_filler.cpp b/src/caffe/test/test_filler.cpp index e8b556a66b5..93eda7e8330 100644 --- a/src/caffe/test/test_filler.cpp +++ b/src/caffe/test/test_filler.cpp @@ -10,8 +10,6 @@ namespace caffe { -typedef ::testing::Types Dtypes; - template class ConstantFillerTest : public ::testing::Test { protected: @@ -28,7 +26,7 @@ class ConstantFillerTest : public ::testing::Test { shared_ptr > filler_; }; -TYPED_TEST_CASE(ConstantFillerTest, Dtypes); +TYPED_TEST_CASE(ConstantFillerTest, TestDtypes); TYPED_TEST(ConstantFillerTest, TestFill) { EXPECT_TRUE(this->blob_); @@ -57,7 +55,7 @@ class UniformFillerTest : public ::testing::Test { shared_ptr > filler_; }; -TYPED_TEST_CASE(UniformFillerTest, Dtypes); +TYPED_TEST_CASE(UniformFillerTest, TestDtypes); TYPED_TEST(UniformFillerTest, TestFill) { EXPECT_TRUE(this->blob_); @@ -84,7 +82,7 @@ class PositiveUnitballFillerTest : public ::testing::Test { shared_ptr > filler_; }; -TYPED_TEST_CASE(PositiveUnitballFillerTest, Dtypes); +TYPED_TEST_CASE(PositiveUnitballFillerTest, TestDtypes); TYPED_TEST(PositiveUnitballFillerTest, TestFill) { EXPECT_TRUE(this->blob_); @@ -123,7 +121,7 @@ class GaussianFillerTest : public ::testing::Test { shared_ptr > filler_; }; -TYPED_TEST_CASE(GaussianFillerTest, Dtypes); +TYPED_TEST_CASE(GaussianFillerTest, TestDtypes); TYPED_TEST(GaussianFillerTest, TestFill) { EXPECT_TRUE(this->blob_); diff --git a/src/caffe/test/test_flatten_layer.cpp b/src/caffe/test/test_flatten_layer.cpp index 52c567b0295..e6e777e69c0 100644 --- a/src/caffe/test/test_flatten_layer.cpp +++ b/src/caffe/test/test_flatten_layer.cpp @@ -17,8 +17,9 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class FlattenLayerTest : public ::testing::Test { +template +class FlattenLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; protected: FlattenLayerTest() : blob_bottom_(new Blob(2, 3, 6, 5)), @@ -38,12 +39,12 @@ class FlattenLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(FlattenLayerTest, Dtypes); +TYPED_TEST_CASE(FlattenLayerTest, TestDtypesAndDevices); TYPED_TEST(FlattenLayerTest, TestSetup) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - FlattenLayer layer(layer_param); + FlattenLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 3 * 6 * 5); @@ -51,10 +52,10 @@ TYPED_TEST(FlattenLayerTest, TestSetup) { EXPECT_EQ(this->blob_top_->width(), 1); } -TYPED_TEST(FlattenLayerTest, TestCPU) { +TYPED_TEST(FlattenLayerTest, Test) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - FlattenLayer layer(layer_param); - Caffe::set_mode(Caffe::CPU); + FlattenLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); for (int c = 0; c < 3 * 6 * 5; ++c) { @@ -65,34 +66,11 @@ TYPED_TEST(FlattenLayerTest, TestCPU) { } } -TYPED_TEST(FlattenLayerTest, TestGPU) { +TYPED_TEST(FlattenLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - FlattenLayer layer(layer_param); - Caffe::set_mode(Caffe::GPU); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - for (int c = 0; c < 3 * 6 * 5; ++c) { - EXPECT_EQ(this->blob_top_->data_at(0, c, 0, 0), - this->blob_bottom_->data_at(0, c / (6 * 5), (c / 5) % 6, c % 5)); - EXPECT_EQ(this->blob_top_->data_at(1, c, 0, 0), - this->blob_bottom_->data_at(1, c / (6 * 5), (c / 5) % 6, c % 5)); - } -} - -TYPED_TEST(FlattenLayerTest, TestCPUGradient) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - FlattenLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(FlattenLayerTest, TestGPUGradient) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - FlattenLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); + FlattenLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index 5b396ef551e..6fd9a2fc194 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -19,8 +19,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class HDF5OutputLayerTest : public ::testing::Test { +template +class HDF5OutputLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: HDF5OutputLayerTest() : output_file_name_(tmpnam(NULL)), @@ -52,9 +54,9 @@ class HDF5OutputLayerTest : public ::testing::Test { int width_; }; -template -void HDF5OutputLayerTest::CheckBlobEqual(const Blob& b1, - const Blob& b2) { +template +void HDF5OutputLayerTest::CheckBlobEqual(const Blob& b1, + const Blob& b2) { EXPECT_EQ(b1.num(), b2.num()); EXPECT_EQ(b1.channels(), b2.channels()); EXPECT_EQ(b1.height(), b2.height()); @@ -70,14 +72,10 @@ void HDF5OutputLayerTest::CheckBlobEqual(const Blob& b1, } } -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(HDF5OutputLayerTest, Dtypes); +TYPED_TEST_CASE(HDF5OutputLayerTest, TestDtypesAndDevices); -/* - * TestCPUForward and TestGPUForward are almost identical except for the mode. - * They are separated to use with `test_all.testbin --gtest_filter="*CPU*"`. - */ -TYPED_TEST(HDF5OutputLayerTest, TestCPUForward) { +TYPED_TEST(HDF5OutputLayerTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; LOG(INFO) << "Loading HDF5 file " << this->input_file_name_; hid_t file_id = H5Fopen(this->input_file_name_.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); @@ -93,62 +91,12 @@ TYPED_TEST(HDF5OutputLayerTest, TestCPUForward) { this->blob_bottom_vec_.push_back(this->blob_data_); this->blob_bottom_vec_.push_back(this->blob_label_); - Caffe::set_mode(Caffe::CPU); - LayerParameter param; - param.mutable_hdf5_output_param()->set_file_name(this->output_file_name_); - // This code block ensures that the layer is deconstructed and - // the output hdf5 file is closed. - { - HDF5OutputLayer layer(param); - EXPECT_EQ(layer.file_name(), this->output_file_name_); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - } - file_id = H5Fopen(this->output_file_name_.c_str(), H5F_ACC_RDONLY, - H5P_DEFAULT); - ASSERT_GE( - file_id, 0)<< "Failed to open HDF5 file" << - this->input_file_name_; - - Blob* blob_data = new Blob(); - hdf5_load_nd_dataset(file_id, HDF5_DATA_DATASET_NAME, 0, 4, - blob_data); - this->CheckBlobEqual(*(this->blob_data_), *blob_data); - - Blob* blob_label = new Blob(); - hdf5_load_nd_dataset(file_id, HDF5_DATA_LABEL_NAME, 0, 4, - blob_label); - this->CheckBlobEqual(*(this->blob_label_), *blob_label); - - status = H5Fclose(file_id); - EXPECT_GE(status, 0) << "Failed to close HDF5 file " << - this->output_file_name_; -} - -TYPED_TEST(HDF5OutputLayerTest, TestGPUForward) { - LOG(INFO) << "Loading HDF5 file " << this->input_file_name_; - - hid_t file_id = H5Fopen(this->input_file_name_.c_str(), H5F_ACC_RDONLY, - H5P_DEFAULT); - ASSERT_GE(file_id, 0) << "Failed to open HDF5 file" << - this->input_file_name_; - hdf5_load_nd_dataset(file_id, HDF5_DATA_DATASET_NAME, 0, 4, - this->blob_data_); - hdf5_load_nd_dataset(file_id, HDF5_DATA_LABEL_NAME, 0, 4, - this->blob_label_); - herr_t status = H5Fclose(file_id); - EXPECT_GE(status, 0) << "Failed to close HDF5 file " << - this->input_file_name_; - this->blob_bottom_vec_.push_back(this->blob_data_); - this->blob_bottom_vec_.push_back(this->blob_label_); - - Caffe::set_mode(Caffe::GPU); LayerParameter param; param.mutable_hdf5_output_param()->set_file_name(this->output_file_name_); // This code block ensures that the layer is deconstructed and // the output hdf5 file is closed. { - HDF5OutputLayer layer(param); + HDF5OutputLayer layer(param); EXPECT_EQ(layer.file_name(), this->output_file_name_); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); @@ -159,12 +107,12 @@ TYPED_TEST(HDF5OutputLayerTest, TestGPUForward) { file_id, 0)<< "Failed to open HDF5 file" << this->input_file_name_; - Blob* blob_data = new Blob(); + Blob* blob_data = new Blob(); hdf5_load_nd_dataset(file_id, HDF5_DATA_DATASET_NAME, 0, 4, blob_data); this->CheckBlobEqual(*(this->blob_data_), *blob_data); - Blob* blob_label = new Blob(); + Blob* blob_label = new Blob(); hdf5_load_nd_dataset(file_id, HDF5_DATA_LABEL_NAME, 0, 4, blob_label); this->CheckBlobEqual(*(this->blob_label_), *blob_label); diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index 1cbca0090fd..3eb24210d99 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -20,8 +20,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class HDF5DataLayerTest : public ::testing::Test { +template +class HDF5DataLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: HDF5DataLayerTest() : filename(NULL), @@ -49,10 +51,10 @@ class HDF5DataLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(HDF5DataLayerTest, Dtypes); +TYPED_TEST_CASE(HDF5DataLayerTest, TestDtypesAndDevices); TYPED_TEST(HDF5DataLayerTest, TestRead) { + typedef typename TypeParam::Dtype Dtype; // Create LayerParameter with the known parameters. // The data file we are reading has 10 rows and 8 columns, // with values from 0 to 10*8 reshaped in row-major order. @@ -66,7 +68,7 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { int width = 5; // Test that the layer setup got the correct parameters. - HDF5DataLayer layer(param); + HDF5DataLayer layer(param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); EXPECT_EQ(this->blob_top_data_->num(), batch_size); EXPECT_EQ(this->blob_top_data_->channels(), num_cols); @@ -78,49 +80,41 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { EXPECT_EQ(this->blob_top_label_->height(), 1); EXPECT_EQ(this->blob_top_label_->width(), 1); - for (int t = 0; t < 2; ++t) { - // TODO: make this a TypedTest instead of this silly loop. - if (t == 0) { - Caffe::set_mode(Caffe::CPU); - } else { - Caffe::set_mode(Caffe::GPU); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + + // Go through the data 10 times (5 batches). + const int data_size = num_cols * height * width; + for (int iter = 0; iter < 10; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + + // On even iterations, we're reading the first half of the data. + // On odd iterations, we're reading the second half of the data. + int label_offset = (iter % 2 == 0) ? 0 : batch_size; + int data_offset = (iter % 2 == 0) ? 0 : batch_size * data_size; + + // Every two iterations we are reading the second file, + // which has the same labels, but data is offset by total data size, + // which is 2000 (see generate_sample_data). + int file_offset = (iter % 4 < 2) ? 0 : 2000; + + for (int i = 0; i < batch_size; ++i) { + EXPECT_EQ( + label_offset + i, + this->blob_top_label_->cpu_data()[i]); } - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - - // Go through the data 10 times (5 batches). - const int data_size = num_cols * height * width; - for (int iter = 0; iter < 10; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - - // On even iterations, we're reading the first half of the data. - // On odd iterations, we're reading the second half of the data. - int label_offset = (iter % 2 == 0) ? 0 : batch_size; - int data_offset = (iter % 2 == 0) ? 0 : batch_size * data_size; - - // Every two iterations we are reading the second file, - // which has the same labels, but data is offset by total data size, - // which is 2000 (see generate_sample_data). - int file_offset = (iter % 4 < 2) ? 0 : 2000; - - for (int i = 0; i < batch_size; ++i) { - EXPECT_EQ( - label_offset + i, - this->blob_top_label_->cpu_data()[i]); - } - for (int i = 0; i < batch_size; ++i) { - for (int j = 0; j < num_cols; ++j) { - for (int h = 0; h < height; ++h) { - for (int w = 0; w < width; ++w) { - int idx = ( - i * num_cols * height * width + - j * height * width + - h * width + w); - EXPECT_EQ( - file_offset + data_offset + idx, - this->blob_top_data_->cpu_data()[idx]) - << "debug: i " << i << " j " << j - << " iter " << iter << " t " << t; - } + for (int i = 0; i < batch_size; ++i) { + for (int j = 0; j < num_cols; ++j) { + for (int h = 0; h < height; ++h) { + for (int w = 0; w < width; ++w) { + int idx = ( + i * num_cols * height * width + + j * height * width + + h * width + w); + EXPECT_EQ( + file_offset + data_offset + idx, + this->blob_top_data_->cpu_data()[idx]) + << "debug: i " << i << " j " << j + << " iter " << iter; } } } diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index 318030b67a3..868e9e9ae16 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -19,8 +19,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class HingeLossLayerTest : public ::testing::Test { +template +class HingeLossLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: HingeLossLayerTest() : blob_bottom_data_(new Blob(10, 5, 1, 1)), @@ -46,56 +48,31 @@ class HingeLossLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(HingeLossLayerTest, Dtypes); +TYPED_TEST_CASE(HingeLossLayerTest, TestDtypesAndDevices); -TYPED_TEST(HingeLossLayerTest, TestGradientL1CPU) { +TYPED_TEST(HingeLossLayerTest, TestGradientL1) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - HingeLossLayer layer(layer_param); + HingeLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 1e-3, 1701, 1, 0.01); + GradientChecker checker(1e-2, 1e-3, 1701, 1, 0.01); checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_), 0, -1, -1); } -TYPED_TEST(HingeLossLayerTest, TestGradientL1GPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - HingeLossLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 1e-3, 1701, 1, 0.01); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); -} - - -TYPED_TEST(HingeLossLayerTest, TestGradientL2CPU) { +TYPED_TEST(HingeLossLayerTest, TestGradientL2) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; // Set norm to L2 HingeLossParameter* hinge_loss_param = layer_param.mutable_hinge_loss_param(); hinge_loss_param->set_norm(HingeLossParameter_Norm_L2); - Caffe::set_mode(Caffe::CPU); - HingeLossLayer layer(layer_param); + HingeLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 2e-3, 1701); + GradientChecker checker(1e-2, 2e-3, 1701); checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_), 0, -1, -1); } -TYPED_TEST(HingeLossLayerTest, TestGradientL2GPU) { - LayerParameter layer_param; - // Set norm to L2 - HingeLossParameter* hinge_loss_param = layer_param.mutable_hinge_loss_param(); - hinge_loss_param->set_norm(HingeLossParameter_Norm_L2); - Caffe::set_mode(Caffe::GPU); - HingeLossLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 2e-3, 1701); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); -} - } // namespace caffe diff --git a/src/caffe/test/test_im2col_kernel.cu b/src/caffe/test/test_im2col_kernel.cu index f49a5b7e4d9..bd4404a0000 100644 --- a/src/caffe/test/test_im2col_kernel.cu +++ b/src/caffe/test/test_im2col_kernel.cu @@ -65,8 +65,7 @@ class Im2colKernelTest : public ::testing::Test { int width_col_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(Im2colKernelTest, Dtypes); +TYPED_TEST_CASE(Im2colKernelTest, TestDtypes); TYPED_TEST(Im2colKernelTest, TestGPU) { Caffe::set_mode(Caffe::GPU); diff --git a/src/caffe/test/test_im2col_layer.cpp b/src/caffe/test/test_im2col_layer.cpp index 7f677ca03d6..5be191742fc 100644 --- a/src/caffe/test/test_im2col_layer.cpp +++ b/src/caffe/test/test_im2col_layer.cpp @@ -17,8 +17,9 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class Im2colLayerTest : public ::testing::Test { +template +class Im2colLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; protected: Im2colLayerTest() : blob_bottom_(new Blob(2, 3, 6, 5)), @@ -37,16 +38,16 @@ class Im2colLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(Im2colLayerTest, Dtypes); +TYPED_TEST_CASE(Im2colLayerTest, TestDtypesAndDevices); TYPED_TEST(Im2colLayerTest, TestSetup) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); convolution_param->set_kernel_size(3); convolution_param->set_stride(2); - Im2colLayer layer(layer_param); + Im2colLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 27); @@ -54,31 +55,14 @@ TYPED_TEST(Im2colLayerTest, TestSetup) { EXPECT_EQ(this->blob_top_->width(), 2); } -TYPED_TEST(Im2colLayerTest, TestCPU) { +TYPED_TEST(Im2colLayerTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); convolution_param->set_kernel_size(3); convolution_param->set_stride(2); - Im2colLayer layer(layer_param); - Caffe::set_mode(Caffe::CPU); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // We are lazy and will only check the top left block - for (int c = 0; c < 27; ++c) { - EXPECT_EQ(this->blob_top_->data_at(0, c, 0, 0), - this->blob_bottom_->data_at(0, (c / 9), (c / 3) % 3, c % 3)); - } -} - -TYPED_TEST(Im2colLayerTest, TestGPU) { - LayerParameter layer_param; - ConvolutionParameter* convolution_param = - layer_param.mutable_convolution_param(); - convolution_param->set_kernel_size(3); - convolution_param->set_stride(2); - Im2colLayer layer(layer_param); - Caffe::set_mode(Caffe::GPU); + Im2colLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // We are lazy and will only check the top left block @@ -88,28 +72,15 @@ TYPED_TEST(Im2colLayerTest, TestGPU) { } } -TYPED_TEST(Im2colLayerTest, TestCPUGradient) { - LayerParameter layer_param; - ConvolutionParameter* convolution_param = - layer_param.mutable_convolution_param(); - convolution_param->set_kernel_size(3); - convolution_param->set_stride(2); - Caffe::set_mode(Caffe::CPU); - Im2colLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(Im2colLayerTest, TestGPUGradient) { +TYPED_TEST(Im2colLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); convolution_param->set_kernel_size(3); convolution_param->set_stride(2); - Caffe::set_mode(Caffe::GPU); - Im2colLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); + Im2colLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index 2278f4e2eb8..fbd4a1ca9d4 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -23,8 +23,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class ImageDataLayerTest : public ::testing::Test { +template +class ImageDataLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: ImageDataLayerTest() : seed_(1701), @@ -57,16 +59,16 @@ class ImageDataLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(ImageDataLayerTest, Dtypes); +TYPED_TEST_CASE(ImageDataLayerTest, TestDtypesAndDevices); TYPED_TEST(ImageDataLayerTest, TestRead) { + typedef typename TypeParam::Dtype Dtype; LayerParameter param; ImageDataParameter* image_data_param = param.mutable_image_data_param(); image_data_param->set_batch_size(5); image_data_param->set_source(this->filename_->c_str()); image_data_param->set_shuffle(false); - ImageDataLayer layer(param); + ImageDataLayer layer(param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); EXPECT_EQ(this->blob_top_data_->num(), 5); EXPECT_EQ(this->blob_top_data_->channels(), 3); @@ -86,6 +88,7 @@ TYPED_TEST(ImageDataLayerTest, TestRead) { } TYPED_TEST(ImageDataLayerTest, TestResize) { + typedef typename TypeParam::Dtype Dtype; LayerParameter param; ImageDataParameter* image_data_param = param.mutable_image_data_param(); image_data_param->set_batch_size(5); @@ -93,7 +96,7 @@ TYPED_TEST(ImageDataLayerTest, TestResize) { image_data_param->set_new_height(256); image_data_param->set_new_width(256); image_data_param->set_shuffle(false); - ImageDataLayer layer(param); + ImageDataLayer layer(param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); EXPECT_EQ(this->blob_top_data_->num(), 5); EXPECT_EQ(this->blob_top_data_->channels(), 3); @@ -113,12 +116,13 @@ TYPED_TEST(ImageDataLayerTest, TestResize) { } TYPED_TEST(ImageDataLayerTest, TestShuffle) { + typedef typename TypeParam::Dtype Dtype; LayerParameter param; ImageDataParameter* image_data_param = param.mutable_image_data_param(); image_data_param->set_batch_size(5); image_data_param->set_source(this->filename_->c_str()); image_data_param->set_shuffle(true); - ImageDataLayer layer(param); + ImageDataLayer layer(param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); EXPECT_EQ(this->blob_top_data_->num(), 5); EXPECT_EQ(this->blob_top_data_->channels(), 3); @@ -131,14 +135,14 @@ TYPED_TEST(ImageDataLayerTest, TestShuffle) { // Go through the data twice for (int iter = 0; iter < 2; ++iter) { layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - map values_to_indices; + map values_to_indices; int num_in_order = 0; for (int i = 0; i < 5; ++i) { - TypeParam value = this->blob_top_label_->cpu_data()[i]; + Dtype value = this->blob_top_label_->cpu_data()[i]; // Check that the value has not been seen already (no duplicates). EXPECT_EQ(values_to_indices.find(value), values_to_indices.end()); values_to_indices[value] = i; - num_in_order += (value == TypeParam(i)); + num_in_order += (value == Dtype(i)); } EXPECT_EQ(5, values_to_indices.size()); EXPECT_GT(5, num_in_order); diff --git a/src/caffe/test/test_inner_product_layer.cpp b/src/caffe/test/test_inner_product_layer.cpp index 91917df6cae..ad4783f991a 100644 --- a/src/caffe/test/test_inner_product_layer.cpp +++ b/src/caffe/test/test_inner_product_layer.cpp @@ -17,8 +17,9 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class InnerProductLayerTest : public ::testing::Test { +template +class InnerProductLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; protected: InnerProductLayerTest() : blob_bottom_(new Blob(2, 3, 4, 5)), @@ -37,16 +38,16 @@ class InnerProductLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(InnerProductLayerTest, Dtypes); +TYPED_TEST_CASE(InnerProductLayerTest, TestDtypesAndDevices); TYPED_TEST(InnerProductLayerTest, TestSetUp) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; InnerProductParameter* inner_product_param = layer_param.mutable_inner_product_param(); inner_product_param->set_num_output(10); - shared_ptr > layer( - new InnerProductLayer(layer_param)); + shared_ptr > layer( + new InnerProductLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->height(), 1); @@ -54,43 +55,23 @@ TYPED_TEST(InnerProductLayerTest, TestSetUp) { EXPECT_EQ(this->blob_top_->channels(), 10); } -TYPED_TEST(InnerProductLayerTest, TestCPU) { - LayerParameter layer_param; - InnerProductParameter* inner_product_param = - layer_param.mutable_inner_product_param(); - Caffe::set_mode(Caffe::CPU); - inner_product_param->set_num_output(10); - inner_product_param->mutable_weight_filler()->set_type("uniform"); - inner_product_param->mutable_bias_filler()->set_type("uniform"); - inner_product_param->mutable_bias_filler()->set_min(1); - inner_product_param->mutable_bias_filler()->set_max(2); - shared_ptr > layer( - new InnerProductLayer(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* data = this->blob_top_->cpu_data(); - const int count = this->blob_top_->count(); - for (int i = 0; i < count; ++i) { - EXPECT_GE(data[i], 1.); - } -} - -TYPED_TEST(InnerProductLayerTest, TestGPU) { - if (sizeof(TypeParam) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { +TYPED_TEST(InnerProductLayerTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; + if (Caffe::mode() == Caffe::CPU || + sizeof(Dtype) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { LayerParameter layer_param; InnerProductParameter* inner_product_param = layer_param.mutable_inner_product_param(); - Caffe::set_mode(Caffe::GPU); inner_product_param->set_num_output(10); inner_product_param->mutable_weight_filler()->set_type("uniform"); inner_product_param->mutable_bias_filler()->set_type("uniform"); inner_product_param->mutable_bias_filler()->set_min(1); inner_product_param->mutable_bias_filler()->set_max(2); - shared_ptr > layer( - new InnerProductLayer(layer_param)); + shared_ptr > layer( + new InnerProductLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* data = this->blob_top_->cpu_data(); + const Dtype* data = this->blob_top_->cpu_data(); const int count = this->blob_top_->count(); for (int i = 0; i < count; ++i) { EXPECT_GE(data[i], 1.); @@ -100,34 +81,21 @@ TYPED_TEST(InnerProductLayerTest, TestGPU) { } } -TYPED_TEST(InnerProductLayerTest, TestCPUGradient) { - LayerParameter layer_param; - InnerProductParameter* inner_product_param = - layer_param.mutable_inner_product_param(); - Caffe::set_mode(Caffe::CPU); - inner_product_param->set_num_output(10); - inner_product_param->mutable_weight_filler()->set_type("gaussian"); - inner_product_param->mutable_bias_filler()->set_type("gaussian"); - inner_product_param->mutable_bias_filler()->set_min(1); - inner_product_param->mutable_bias_filler()->set_max(2); - InnerProductLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(InnerProductLayerTest, TestGPUGradient) { - if (sizeof(TypeParam) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { +TYPED_TEST(InnerProductLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; + if (Caffe::mode() == Caffe::CPU || + sizeof(Dtype) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { LayerParameter layer_param; InnerProductParameter* inner_product_param = layer_param.mutable_inner_product_param(); - Caffe::set_mode(Caffe::GPU); inner_product_param->set_num_output(10); inner_product_param->mutable_weight_filler()->set_type("gaussian"); inner_product_param->mutable_bias_filler()->set_type("gaussian"); - InnerProductLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradient(&layer, &(this->blob_bottom_vec_), + inner_product_param->mutable_bias_filler()->set_min(1); + inner_product_param->mutable_bias_filler()->set_max(2); + InnerProductLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } else { LOG(ERROR) << "Skipping test due to old architecture."; diff --git a/src/caffe/test/test_lrn_layer.cpp b/src/caffe/test/test_lrn_layer.cpp index 6996a234fc6..a627c97f40f 100644 --- a/src/caffe/test/test_lrn_layer.cpp +++ b/src/caffe/test/test_lrn_layer.cpp @@ -21,8 +21,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class LRNLayerTest : public ::testing::Test { +template +class LRNLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: LRNLayerTest() : epsilon_(Dtype(1e-5)), @@ -49,10 +51,11 @@ class LRNLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -template -void LRNLayerTest::ReferenceLRNForward( +template +void LRNLayerTest::ReferenceLRNForward( const Blob& blob_bottom, const LayerParameter& layer_param, Blob* blob_top) { + typedef typename TypeParam::Dtype Dtype; blob_top->Reshape(blob_bottom.num(), blob_bottom.channels(), blob_bottom.height(), blob_bottom.width()); Dtype* top_data = blob_top->mutable_cpu_data(); @@ -111,12 +114,12 @@ void LRNLayerTest::ReferenceLRNForward( } } -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(LRNLayerTest, Dtypes); +TYPED_TEST_CASE(LRNLayerTest, TestDtypesAndDevices); TYPED_TEST(LRNLayerTest, TestSetupAcrossChannels) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - LRNLayer layer(layer_param); + LRNLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 7); @@ -124,28 +127,13 @@ TYPED_TEST(LRNLayerTest, TestSetupAcrossChannels) { EXPECT_EQ(this->blob_top_->width(), 3); } -TYPED_TEST(LRNLayerTest, TestCPUForwardAcrossChannels) { - LayerParameter layer_param; - LRNLayer layer(layer_param); - Caffe::set_mode(Caffe::CPU); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - Blob top_reference; - this->ReferenceLRNForward(*(this->blob_bottom_), layer_param, - &top_reference); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_NEAR(this->blob_top_->cpu_data()[i], top_reference.cpu_data()[i], - this->epsilon_); - } -} - -TYPED_TEST(LRNLayerTest, TestGPUForwardAcrossChannels) { +TYPED_TEST(LRNLayerTest, TestForwardAcrossChannels) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - LRNLayer layer(layer_param); - Caffe::set_mode(Caffe::GPU); + LRNLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - Blob top_reference; + Blob top_reference; this->ReferenceLRNForward(*(this->blob_bottom_), layer_param, &top_reference); for (int i = 0; i < this->blob_bottom_->count(); ++i) { @@ -154,11 +142,11 @@ TYPED_TEST(LRNLayerTest, TestGPUForwardAcrossChannels) { } } -TYPED_TEST(LRNLayerTest, TestCPUGradientAcrossChannels) { +TYPED_TEST(LRNLayerTest, TestGradientAcrossChannels) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - LRNLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - Caffe::set_mode(Caffe::CPU); + LRNLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); for (int i = 0; i < this->blob_top_->count(); ++i) { @@ -175,33 +163,13 @@ TYPED_TEST(LRNLayerTest, TestCPUGradientAcrossChannels) { &(this->blob_top_vec_)); } -TYPED_TEST(LRNLayerTest, TestGPUGradientAcrossChannels) { - LayerParameter layer_param; - LRNLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - Caffe::set_mode(Caffe::GPU); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - for (int i = 0; i < this->blob_top_->count(); ++i) { - this->blob_top_->mutable_cpu_diff()[i] = 1.; - } - vector propagate_down(this->blob_bottom_vec_.size(), true); - layer.Backward(this->blob_top_vec_, propagate_down, - &(this->blob_bottom_vec_)); - // for (int i = 0; i < this->blob_bottom_->count(); ++i) { - // std::cout << "GPU diff " << this->blob_bottom_->cpu_diff()[i] - // << std::endl; - // } - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - TYPED_TEST(LRNLayerTest, TestSetupWithinChannel) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; layer_param.mutable_lrn_param()->set_norm_region( LRNParameter_NormRegion_WITHIN_CHANNEL); layer_param.mutable_lrn_param()->set_local_size(3); - LRNLayer layer(layer_param); + LRNLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 7); @@ -209,16 +177,16 @@ TYPED_TEST(LRNLayerTest, TestSetupWithinChannel) { EXPECT_EQ(this->blob_top_->width(), 3); } -TYPED_TEST(LRNLayerTest, TestCPUForwardWithinChannel) { +TYPED_TEST(LRNLayerTest, TestForwardWithinChannel) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; layer_param.mutable_lrn_param()->set_norm_region( LRNParameter_NormRegion_WITHIN_CHANNEL); layer_param.mutable_lrn_param()->set_local_size(3); - LRNLayer layer(layer_param); - Caffe::set_mode(Caffe::CPU); + LRNLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - Blob top_reference; + Blob top_reference; this->ReferenceLRNForward(*(this->blob_bottom_), layer_param, &top_reference); for (int i = 0; i < this->blob_bottom_->count(); ++i) { @@ -227,49 +195,14 @@ TYPED_TEST(LRNLayerTest, TestCPUForwardWithinChannel) { } } -TYPED_TEST(LRNLayerTest, TestGPUForwardWithinChannel) { - LayerParameter layer_param; - layer_param.mutable_lrn_param()->set_norm_region( - LRNParameter_NormRegion_WITHIN_CHANNEL); - layer_param.mutable_lrn_param()->set_local_size(3); - LRNLayer layer(layer_param); - Caffe::set_mode(Caffe::GPU); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - Blob top_reference; - this->ReferenceLRNForward(*(this->blob_bottom_), layer_param, - &top_reference); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_NEAR(this->blob_top_->cpu_data()[i], top_reference.cpu_data()[i], - this->epsilon_); - } -} - -TYPED_TEST(LRNLayerTest, TestCPUGradientWithinChannel) { - LayerParameter layer_param; - layer_param.mutable_lrn_param()->set_norm_region( - LRNParameter_NormRegion_WITHIN_CHANNEL); - layer_param.mutable_lrn_param()->set_local_size(3); - LRNLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - Caffe::set_mode(Caffe::CPU); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - for (int i = 0; i < this->blob_top_->count(); ++i) { - this->blob_top_->mutable_cpu_diff()[i] = 1.; - } - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(LRNLayerTest, TestGPUGradientWithinChannel) { +TYPED_TEST(LRNLayerTest, TestGradientWithinChannel) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; layer_param.mutable_lrn_param()->set_norm_region( LRNParameter_NormRegion_WITHIN_CHANNEL); layer_param.mutable_lrn_param()->set_local_size(3); - LRNLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - Caffe::set_mode(Caffe::GPU); + LRNLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); for (int i = 0; i < this->blob_top_->count(); ++i) { diff --git a/src/caffe/test/test_math_functions.cpp b/src/caffe/test/test_math_functions.cpp index ddb9f060972..2a70c9c4aba 100644 --- a/src/caffe/test/test_math_functions.cpp +++ b/src/caffe/test/test_math_functions.cpp @@ -65,8 +65,7 @@ class MathFunctionsTest : public ::testing::Test { Blob* const blob_top_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(MathFunctionsTest, Dtypes); +TYPED_TEST_CASE(MathFunctionsTest, TestDtypes); TYPED_TEST(MathFunctionsTest, TestNothing) { // The first test case of a test suite takes the longest time diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp index ac6f86f0cf8..eef375acea7 100644 --- a/src/caffe/test/test_maxpool_dropout_layers.cpp +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -16,8 +16,9 @@ namespace caffe { -template -class MaxPoolingDropoutTest : public ::testing::Test { +template +class MaxPoolingDropoutTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; protected: MaxPoolingDropoutTest() : blob_bottom_(new Blob()), @@ -40,17 +41,17 @@ class MaxPoolingDropoutTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(MaxPoolingDropoutTest, Dtypes); +TYPED_TEST_CASE(MaxPoolingDropoutTest, TestDtypesAndDevices); TYPED_TEST(MaxPoolingDropoutTest, TestSetup) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - PoolingLayer max_layer(layer_param); + PoolingLayer max_layer(layer_param); max_layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - DropoutLayer dropout_layer(layer_param); + DropoutLayer dropout_layer(layer_param); dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); @@ -59,27 +60,27 @@ TYPED_TEST(MaxPoolingDropoutTest, TestSetup) { } -TYPED_TEST(MaxPoolingDropoutTest, CPUForward) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(MaxPoolingDropoutTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - PoolingLayer layer(layer_param); + PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* top_data = this->blob_top_->cpu_data(); - TypeParam sum = 0.; + const Dtype* top_data = this->blob_top_->cpu_data(); + Dtype sum = 0.; for (int i = 0; i < this->blob_top_->count(); ++i) { sum += top_data[i]; } EXPECT_EQ(sum, this->blob_top_->count()); // Dropout in-place - DropoutLayer dropout_layer(layer_param); + DropoutLayer dropout_layer(layer_param); dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); sum = 0.; - TypeParam scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); + Dtype scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_top_->count(); ++i) { sum += top_data[i]; @@ -88,81 +89,14 @@ TYPED_TEST(MaxPoolingDropoutTest, CPUForward) { EXPECT_LE(sum, this->blob_top_->count()*scale); } -TYPED_TEST(MaxPoolingDropoutTest, GPUForward) { - Caffe::set_mode(Caffe::GPU); - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - PoolingLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - const TypeParam* top_data = this->blob_top_->cpu_data(); - TypeParam sum = 0.; - for (int i = 0; i < this->blob_top_->count(); ++i) { - sum += top_data[i]; - } - EXPECT_EQ(sum, this->blob_top_->count()); - - DropoutLayer dropout_layer(layer_param); - dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); - dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); - sum = 0.; - TypeParam scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); - top_data = this->blob_top_->cpu_data(); - for (int i = 0; i < this->blob_top_->count(); ++i) { - sum += top_data[i]; - } - EXPECT_GE(sum, 0); - EXPECT_LE(sum, this->blob_top_->count()*scale); -} - -TYPED_TEST(MaxPoolingDropoutTest, CPUBackward) { - Caffe::set_mode(Caffe::CPU); - Caffe::set_phase(Caffe::TRAIN); - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - PoolingLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - for (int i = 0; i < this->blob_top_->count(); ++i) { - this->blob_top_->mutable_cpu_diff()[i] = 1.; - } - vector propagate_down(this->blob_bottom_vec_.size(), true); - layer.Backward(this->blob_top_vec_, propagate_down, - &(this->blob_bottom_vec_)); - const TypeParam* bottom_diff = this->blob_bottom_->cpu_diff(); - TypeParam sum = 0.; - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - sum += bottom_diff[i]; - } - EXPECT_EQ(sum, this->blob_top_->count()); - // Dropout in-place - DropoutLayer dropout_layer(layer_param); - dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); - dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); - dropout_layer.Backward(this->blob_top_vec_, propagate_down, - &(this->blob_top_vec_)); - layer.Backward(this->blob_top_vec_, propagate_down, - &(this->blob_bottom_vec_)); - TypeParam sum_with_dropout = 0.; - bottom_diff = this->blob_bottom_->cpu_diff(); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - sum_with_dropout += bottom_diff[i]; - } - EXPECT_GE(sum_with_dropout, sum); -} - -TYPED_TEST(MaxPoolingDropoutTest, GPUBackward) { - Caffe::set_mode(Caffe::GPU); +TYPED_TEST(MaxPoolingDropoutTest, TestBackward) { + typedef typename TypeParam::Dtype Dtype; Caffe::set_phase(Caffe::TRAIN); LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - PoolingLayer layer(layer_param); + PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); for (int i = 0; i < this->blob_top_->count(); ++i) { @@ -171,21 +105,21 @@ TYPED_TEST(MaxPoolingDropoutTest, GPUBackward) { vector propagate_down(this->blob_bottom_vec_.size(), true); layer.Backward(this->blob_top_vec_, propagate_down, &(this->blob_bottom_vec_)); - const TypeParam* bottom_diff = this->blob_bottom_->cpu_diff(); - TypeParam sum = 0.; + const Dtype* bottom_diff = this->blob_bottom_->cpu_diff(); + Dtype sum = 0.; for (int i = 0; i < this->blob_bottom_->count(); ++i) { sum += bottom_diff[i]; } EXPECT_EQ(sum, this->blob_top_->count()); // Dropout in-place - DropoutLayer dropout_layer(layer_param); + DropoutLayer dropout_layer(layer_param); dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); dropout_layer.Backward(this->blob_top_vec_, propagate_down, &(this->blob_top_vec_)); layer.Backward(this->blob_top_vec_, propagate_down, &(this->blob_bottom_vec_)); - TypeParam sum_with_dropout = 0.; + Dtype sum_with_dropout = 0.; bottom_diff = this->blob_bottom_->cpu_diff(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { sum_with_dropout += bottom_diff[i]; diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index 9781439f2fe..c9d588986c2 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -55,8 +55,7 @@ class MemoryDataLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(MemoryDataLayerTest, Dtypes); +TYPED_TEST_CASE(MemoryDataLayerTest, TestDtypes); TYPED_TEST(MemoryDataLayerTest, TestSetup) { LayerParameter layer_param; diff --git a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp index aa475ca27c7..d73347e8e2e 100644 --- a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp +++ b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp @@ -46,8 +46,7 @@ class MultinomialLogisticLossLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(MultinomialLogisticLossLayerTest, Dtypes); +TYPED_TEST_CASE(MultinomialLogisticLossLayerTest, TestDtypes); TYPED_TEST(MultinomialLogisticLossLayerTest, TestGradientCPU) { diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 18b03476996..129d4447c41 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -16,8 +16,10 @@ namespace caffe { -template +template class NetTest : public ::testing::Test { + typedef typename TypeParam::Dtype Dtype; + protected: NetTest() : seed_(1701) {} @@ -456,8 +458,7 @@ class NetTest : public ::testing::Test { shared_ptr > net_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(NetTest, Dtypes); +TYPED_TEST_CASE(NetTest, TestDtypesAndDevices); TYPED_TEST(NetTest, TestHasBlob) { this->InitTinyNet(); @@ -507,6 +508,7 @@ TYPED_TEST(NetTest, TestBottomNeedBackward) { } TYPED_TEST(NetTest, TestBottomNeedBackwardForce) { + typedef typename TypeParam::Dtype Dtype; const bool force_backward = true; this->InitTinyNet(force_backward); const vector >& bottom_need_backward = @@ -521,6 +523,7 @@ TYPED_TEST(NetTest, TestBottomNeedBackwardForce) { } TYPED_TEST(NetTest, TestBottomNeedBackwardEuclideanForce) { + typedef typename TypeParam::Dtype Dtype; const bool force_backward = true; this->InitTinyNetEuclidean(force_backward); const vector >& bottom_need_backward = @@ -553,32 +556,35 @@ TYPED_TEST(NetTest, TestBottomNeedBackwardTricky) { } TYPED_TEST(NetTest, TestUnsharedWeightsDataNet) { + typedef typename TypeParam::Dtype Dtype; this->InitUnsharedWeightsNet(); - vector*> bottom; - TypeParam loss; + vector*> bottom; + Dtype loss; this->net_->Forward(bottom, &loss); EXPECT_GT(loss, 0); } TYPED_TEST(NetTest, TestSharedWeightsDataNet) { + typedef typename TypeParam::Dtype Dtype; this->InitSharedWeightsNet(); - vector*> bottom; - TypeParam loss; + vector*> bottom; + Dtype loss; this->net_->Forward(bottom, &loss); EXPECT_FLOAT_EQ(loss, 0); } TYPED_TEST(NetTest, TestUnsharedWeightsDiffNet) { + typedef typename TypeParam::Dtype Dtype; this->InitUnsharedWeightsNet(); - vector*> bottom; - Net* net = this->net_.get(); + vector*> bottom; + Net* net = this->net_.get(); net->Forward(bottom); net->Backward(); - Layer* ip1_layer = net->layer_by_name("innerproduct1").get(); - Layer* ip2_layer = net->layer_by_name("innerproduct2").get(); + Layer* ip1_layer = net->layer_by_name("innerproduct1").get(); + Layer* ip2_layer = net->layer_by_name("innerproduct2").get(); const int count = ip1_layer->blobs()[0]->count(); - const TypeParam* grad1 = ip1_layer->blobs()[0]->cpu_diff(); - const TypeParam* grad2 = ip2_layer->blobs()[0]->cpu_diff(); + const Dtype* grad1 = ip1_layer->blobs()[0]->cpu_diff(); + const Dtype* grad2 = ip2_layer->blobs()[0]->cpu_diff(); for (int i = 0; i < count; ++i) { EXPECT_GT(fabs(grad1[i]), 0); EXPECT_FLOAT_EQ(-1 * grad1[i], grad2[i]); @@ -586,120 +592,34 @@ TYPED_TEST(NetTest, TestUnsharedWeightsDiffNet) { } TYPED_TEST(NetTest, TestSharedWeightsDiffNet) { + typedef typename TypeParam::Dtype Dtype; this->InitSharedWeightsNet(); - vector*> bottom; - Net* net = this->net_.get(); - TypeParam loss; + vector*> bottom; + Net* net = this->net_.get(); + Dtype loss; net->Forward(bottom, &loss); net->Backward(); EXPECT_FLOAT_EQ(loss, 0); - Layer* ip1_layer = net->layer_by_name("innerproduct1").get(); - Layer* ip2_layer = net->layer_by_name("innerproduct2").get(); + Layer* ip1_layer = net->layer_by_name("innerproduct1").get(); + Layer* ip2_layer = net->layer_by_name("innerproduct2").get(); const int count = ip1_layer->blobs()[0]->count(); - const TypeParam* grad1 = ip1_layer->blobs()[0]->cpu_diff(); - const TypeParam* grad2 = ip2_layer->blobs()[0]->cpu_diff(); + const Dtype* grad1 = ip1_layer->blobs()[0]->cpu_diff(); + const Dtype* grad2 = ip2_layer->blobs()[0]->cpu_diff(); for (int i = 0; i < count; ++i) { EXPECT_FLOAT_EQ(0, grad1[i]); EXPECT_FLOAT_EQ(0, grad2[i]); } } -TYPED_TEST(NetTest, TestSharedWeightsUpdateCPU) { - Caffe::set_random_seed(this->seed_); - Caffe::set_mode(Caffe::CPU); - this->InitDiffDataSharedWeightsNet(); - vector*> bottom; - EXPECT_EQ(this->net_->layer_names()[1], "innerproduct1"); - EXPECT_EQ(this->net_->layer_names()[2], "innerproduct2"); - Blob* ip1_weights = this->net_->layers()[1]->blobs()[0].get(); - Blob* ip2_weights = this->net_->layers()[2]->blobs()[0].get(); - // Check that data blobs of shared weights share the same location in memory. - EXPECT_EQ(ip1_weights->cpu_data(), ip2_weights->cpu_data()); - // Check that diff blobs of shared weights are at different locations in - // locations. (The diffs should be accumulated at update time.) - EXPECT_NE(ip1_weights->cpu_diff(), ip2_weights->cpu_diff()); - this->net_->Forward(bottom); - this->net_->Backward(); - // Compute the expected update as the data minus the two diffs. - Blob shared_params; - const bool reshape = true; - const bool copy_diff = false; - shared_params.CopyFrom(*ip1_weights, copy_diff, reshape); - shared_params.CopyFrom(*ip1_weights, !copy_diff, reshape); - const int count = ip1_weights->count(); - // Make sure the diffs are non-trivial. - for (int i = 0; i < count; ++i) { - EXPECT_NE(0, ip1_weights->cpu_diff()[i]); - EXPECT_NE(0, ip2_weights->cpu_diff()[i]); - EXPECT_NE(ip1_weights->cpu_diff()[i], ip2_weights->cpu_diff()[i]); - } - caffe_axpy(count, TypeParam(1), ip2_weights->cpu_diff(), - shared_params.mutable_cpu_diff()); - caffe_axpy(count, TypeParam(-1), shared_params.cpu_diff(), - shared_params.mutable_cpu_data()); - const TypeParam* expected_updated_params = shared_params.cpu_data(); - this->net_->Update(); - const TypeParam* actual_updated_params = ip1_weights->cpu_data(); - for (int i = 0; i < count; ++i) { - EXPECT_EQ(expected_updated_params[i], actual_updated_params[i]); - } - // Check that data blobs of shared weights STILL point to the same memory - // location (because ... who knows). - EXPECT_EQ(ip1_weights->cpu_data(), ip2_weights->cpu_data()); - - Caffe::set_random_seed(this->seed_); - this->InitDiffDataUnsharedWeightsNet(); - EXPECT_EQ(this->net_->layer_names()[1], "innerproduct1"); - EXPECT_EQ(this->net_->layer_names()[2], "innerproduct2"); - ip1_weights = this->net_->layers()[1]->blobs()[0].get(); - ip2_weights = this->net_->layers()[2]->blobs()[0].get(); - // Check that data and diff blobs of unshared weights are at different - // locations in memory. - EXPECT_NE(ip1_weights->cpu_data(), ip2_weights->cpu_data()); - EXPECT_NE(ip1_weights->cpu_diff(), ip2_weights->cpu_diff()); - this->net_->Forward(bottom); - this->net_->Backward(); - // Compute the expected update. - Blob unshared_params1; - unshared_params1.CopyFrom(*ip1_weights, copy_diff, reshape); - unshared_params1.CopyFrom(*ip1_weights, !copy_diff, reshape); - Blob unshared_params2; - unshared_params2.CopyFrom(*ip2_weights, copy_diff, reshape); - unshared_params2.CopyFrom(*ip2_weights, !copy_diff, reshape); - // Make sure the diffs are non-trivial and sum to the diff in the shared net. - for (int i = 0; i < count; ++i) { - EXPECT_NE(0, ip1_weights->cpu_diff()[i]); - EXPECT_NE(0, ip2_weights->cpu_diff()[i]); - EXPECT_NE(ip1_weights->cpu_diff()[i], ip2_weights->cpu_diff()[i]); - EXPECT_EQ(ip1_weights->cpu_diff()[i] + ip2_weights->cpu_diff()[i], - shared_params.cpu_diff()[i]); - } - caffe_axpy(count, TypeParam(-1), ip1_weights->cpu_diff(), - unshared_params1.mutable_cpu_data()); - caffe_axpy(count, TypeParam(-1), ip2_weights->cpu_diff(), - unshared_params2.mutable_cpu_data()); - const TypeParam* expected_updated_params1 = unshared_params1.cpu_data(); - const TypeParam* expected_updated_params2 = unshared_params2.cpu_data(); - this->net_->Update(); - const TypeParam* actual_updated_params1 = ip1_weights->cpu_data(); - const TypeParam* actual_updated_params2 = ip2_weights->cpu_data(); - for (int i = 0; i < count; ++i) { - EXPECT_EQ(expected_updated_params1[i], actual_updated_params1[i]); - EXPECT_EQ(expected_updated_params2[i], actual_updated_params2[i]); - EXPECT_NE(actual_updated_params1[i], actual_updated_params2[i]); - EXPECT_NE(expected_updated_params, expected_updated_params1); - } -} - -TYPED_TEST(NetTest, TestSharedWeightsUpdateGPU) { +TYPED_TEST(NetTest, TestSharedWeightsUpdate) { + typedef typename TypeParam::Dtype Dtype; Caffe::set_random_seed(this->seed_); - Caffe::set_mode(Caffe::GPU); this->InitDiffDataSharedWeightsNet(); - vector*> bottom; + vector*> bottom; EXPECT_EQ(this->net_->layer_names()[1], "innerproduct1"); EXPECT_EQ(this->net_->layer_names()[2], "innerproduct2"); - Blob* ip1_weights = this->net_->layers()[1]->blobs()[0].get(); - Blob* ip2_weights = this->net_->layers()[2]->blobs()[0].get(); + Blob* ip1_weights = this->net_->layers()[1]->blobs()[0].get(); + Blob* ip2_weights = this->net_->layers()[2]->blobs()[0].get(); // Check that data blobs of shared weights share the same location in memory. EXPECT_EQ(ip1_weights->cpu_data(), ip2_weights->cpu_data()); // Check that diff blobs of shared weights are at different locations in @@ -708,7 +628,7 @@ TYPED_TEST(NetTest, TestSharedWeightsUpdateGPU) { this->net_->Forward(bottom); this->net_->Backward(); // Compute the expected update as the data minus the two diffs. - Blob shared_params; + Blob shared_params; const bool reshape = true; const bool copy_diff = false; shared_params.CopyFrom(*ip1_weights, copy_diff, reshape); @@ -720,13 +640,13 @@ TYPED_TEST(NetTest, TestSharedWeightsUpdateGPU) { EXPECT_NE(0, ip2_weights->cpu_diff()[i]); EXPECT_NE(ip1_weights->cpu_diff()[i], ip2_weights->cpu_diff()[i]); } - caffe_axpy(count, TypeParam(1), ip2_weights->cpu_diff(), + caffe_axpy(count, Dtype(1), ip2_weights->cpu_diff(), shared_params.mutable_cpu_diff()); - caffe_axpy(count, TypeParam(-1), shared_params.cpu_diff(), + caffe_axpy(count, Dtype(-1), shared_params.cpu_diff(), shared_params.mutable_cpu_data()); - const TypeParam* expected_updated_params = shared_params.cpu_data(); + const Dtype* expected_updated_params = shared_params.cpu_data(); this->net_->Update(); - const TypeParam* actual_updated_params = ip1_weights->cpu_data(); + const Dtype* actual_updated_params = ip1_weights->cpu_data(); for (int i = 0; i < count; ++i) { EXPECT_EQ(expected_updated_params[i], actual_updated_params[i]); } @@ -747,10 +667,10 @@ TYPED_TEST(NetTest, TestSharedWeightsUpdateGPU) { this->net_->Forward(bottom); this->net_->Backward(); // Compute the expected update. - Blob unshared_params1; + Blob unshared_params1; unshared_params1.CopyFrom(*ip1_weights, copy_diff, reshape); unshared_params1.CopyFrom(*ip1_weights, !copy_diff, reshape); - Blob unshared_params2; + Blob unshared_params2; unshared_params2.CopyFrom(*ip2_weights, copy_diff, reshape); unshared_params2.CopyFrom(*ip2_weights, !copy_diff, reshape); // Make sure the diffs are non-trivial and sum to the diff in the shared net. @@ -761,15 +681,15 @@ TYPED_TEST(NetTest, TestSharedWeightsUpdateGPU) { EXPECT_EQ(ip1_weights->cpu_diff()[i] + ip2_weights->cpu_diff()[i], shared_params.cpu_diff()[i]); } - caffe_axpy(count, TypeParam(-1), ip1_weights->cpu_diff(), + caffe_axpy(count, Dtype(-1), ip1_weights->cpu_diff(), unshared_params1.mutable_cpu_data()); - caffe_axpy(count, TypeParam(-1), ip2_weights->cpu_diff(), + caffe_axpy(count, Dtype(-1), ip2_weights->cpu_diff(), unshared_params2.mutable_cpu_data()); - const TypeParam* expected_updated_params1 = unshared_params1.cpu_data(); - const TypeParam* expected_updated_params2 = unshared_params2.cpu_data(); + const Dtype* expected_updated_params1 = unshared_params1.cpu_data(); + const Dtype* expected_updated_params2 = unshared_params2.cpu_data(); this->net_->Update(); - const TypeParam* actual_updated_params1 = ip1_weights->cpu_data(); - const TypeParam* actual_updated_params2 = ip2_weights->cpu_data(); + const Dtype* actual_updated_params1 = ip1_weights->cpu_data(); + const Dtype* actual_updated_params2 = ip2_weights->cpu_data(); for (int i = 0; i < count; ++i) { EXPECT_EQ(expected_updated_params1[i], actual_updated_params1[i]); EXPECT_EQ(expected_updated_params2[i], actual_updated_params2[i]); diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index a439128a13b..f44471843a9 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -17,8 +17,9 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class NeuronLayerTest : public ::testing::Test { +template +class NeuronLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; protected: NeuronLayerTest() : blob_bottom_(new Blob(2, 3, 4, 5)), @@ -38,97 +39,41 @@ class NeuronLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(NeuronLayerTest, Dtypes); +TYPED_TEST_CASE(NeuronLayerTest, TestDtypesAndDevices); -TYPED_TEST(NeuronLayerTest, TestReLUCPU) { +TYPED_TEST(NeuronLayerTest, TestReLU) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - ReLULayer layer(layer_param); + ReLULayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); EXPECT_TRUE(top_data[i] == 0 || top_data[i] == bottom_data[i]); } } - -TYPED_TEST(NeuronLayerTest, TestReLUGradientCPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - ReLULayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - - -TYPED_TEST(NeuronLayerTest, TestReLUGPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - ReLULayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_GE(top_data[i], 0.); - EXPECT_TRUE(top_data[i] == 0 || top_data[i] == bottom_data[i]); - } -} - - -TYPED_TEST(NeuronLayerTest, TestReLUGradientGPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - ReLULayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - - -TYPED_TEST(NeuronLayerTest, TestSigmoidCPU) { +TYPED_TEST(NeuronLayerTest, TestReLUGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - SigmoidLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_FLOAT_EQ(top_data[i], 1. / (1 + exp(-bottom_data[i]))); - // check that we squashed the value between 0 and 1 - EXPECT_GE(top_data[i], 0.); - EXPECT_LE(top_data[i], 1.); - } -} - - -TYPED_TEST(NeuronLayerTest, TestSigmoidGradientCPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - SigmoidLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); + ReLULayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } -TYPED_TEST(NeuronLayerTest, TestSigmoidGPU) { +TYPED_TEST(NeuronLayerTest, TestSigmoid) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - SigmoidLayer layer(layer_param); + SigmoidLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_FLOAT_EQ(top_data[i], 1. / (1 + exp(-bottom_data[i]))); // check that we squashed the value between 0 and 1 @@ -137,28 +82,25 @@ TYPED_TEST(NeuronLayerTest, TestSigmoidGPU) { } } - -TYPED_TEST(NeuronLayerTest, TestSigmoidGradientGPU) { +TYPED_TEST(NeuronLayerTest, TestSigmoidGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - SigmoidLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); + SigmoidLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } - - -TYPED_TEST(NeuronLayerTest, TestDropoutCPU) { +TYPED_TEST(NeuronLayerTest, TestDropout) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); Caffe::set_phase(Caffe::TRAIN); - DropoutLayer layer(layer_param); + DropoutLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); float scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); for (int i = 0; i < this->blob_bottom_->count(); ++i) { if (top_data[i] != 0) { @@ -167,37 +109,16 @@ TYPED_TEST(NeuronLayerTest, TestDropoutCPU) { } } - -TYPED_TEST(NeuronLayerTest, TestDropoutGradientCPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - Caffe::set_phase(Caffe::TRAIN); - DropoutLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(NeuronLayerTest, TestDropoutGradientCPUTest) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - Caffe::set_phase(Caffe::TEST); - DropoutLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(NeuronLayerTest, TestDropoutCPUTestPhase) { +TYPED_TEST(NeuronLayerTest, TestDropoutTestPhase) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); Caffe::set_phase(Caffe::TEST); - DropoutLayer layer(layer_param); + DropoutLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { if (top_data[i] != 0) { EXPECT_EQ(top_data[i], bottom_data[i]); @@ -205,116 +126,46 @@ TYPED_TEST(NeuronLayerTest, TestDropoutCPUTestPhase) { } } - -TYPED_TEST(NeuronLayerTest, TestDropoutGPU) { +TYPED_TEST(NeuronLayerTest, TestDropoutGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); Caffe::set_phase(Caffe::TRAIN); - DropoutLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - float scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - if (top_data[i] != 0) { - EXPECT_EQ(top_data[i], bottom_data[i] * scale); - } - } -} - - -TYPED_TEST(NeuronLayerTest, TestDropoutGradientGPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - Caffe::set_phase(Caffe::TRAIN); - DropoutLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - // it is too expensive to call curand multiple times, so we don't do an - // exhaustive gradient check. - checker.CheckGradient(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(NeuronLayerTest, TestDropoutGradientGPUTest) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - Caffe::set_phase(Caffe::TEST); - DropoutLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - // it is too expensive to call curand multiple times, so we don't do an - // exhaustive gradient check. - checker.CheckGradient(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + DropoutLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } - -TYPED_TEST(NeuronLayerTest, TestDropoutGPUTestPhase) { +TYPED_TEST(NeuronLayerTest, TestDropoutGradientTest) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); Caffe::set_phase(Caffe::TEST); - DropoutLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - if (top_data[i] != 0) { - EXPECT_EQ(top_data[i], bottom_data[i]); - } - } -} - - -TYPED_TEST(NeuronLayerTest, TestBNLLCPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - BNLLLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_GE(top_data[i], 0.); - EXPECT_GE(top_data[i], bottom_data[i]); - } -} - - -TYPED_TEST(NeuronLayerTest, TestBNLLGradientCPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - BNLLLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); + DropoutLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } - -TYPED_TEST(NeuronLayerTest, TestBNLLGPU) { +TYPED_TEST(NeuronLayerTest, TestBNLL) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - BNLLLayer layer(layer_param); + BNLLLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); EXPECT_GE(top_data[i], bottom_data[i]); } } - -TYPED_TEST(NeuronLayerTest, TestBNLLGradientGPU) { +TYPED_TEST(NeuronLayerTest, TestBNLLGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - BNLLLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); + BNLLLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index fdc3ea4cafa..b209d821a32 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -17,8 +17,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class PoolingLayerTest : public ::testing::Test { +template +class PoolingLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: PoolingLayerTest() : blob_bottom_(new Blob()), @@ -370,15 +372,15 @@ class PoolingLayerTest : public ::testing::Test { } }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(PoolingLayerTest, Dtypes); +TYPED_TEST_CASE(PoolingLayerTest, TestDtypesAndDevices); TYPED_TEST(PoolingLayerTest, TestSetup) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - PoolingLayer layer(layer_param); + PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); @@ -387,13 +389,14 @@ TYPED_TEST(PoolingLayerTest, TestSetup) { } TYPED_TEST(PoolingLayerTest, TestSetupPadded) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - PoolingLayer layer(layer_param); + PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); @@ -402,41 +405,11 @@ TYPED_TEST(PoolingLayerTest, TestSetupPadded) { } /* -TYPED_TEST(PoolingLayerTest, PrintGPUBackward) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - Caffe::set_mode(Caffe::GPU); - PoolingLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - cout << "bottom data " << i << " " << this->blob_bottom_->cpu_data()[i] << endl; - } - for (int i = 0; i < this->blob_top_->count(); ++i) { - cout << "top data " << i << " " << this->blob_top_->cpu_data()[i] << endl; - } - - for (int i = 0; i < this->blob_top_->count(); ++i) { - this->blob_top_->mutable_cpu_diff()[i] = 1.; - } - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - cout << "bottom diff " << i << " " << this->blob_bottom_->cpu_diff()[i] << endl; - } -} -*/ - -/* -TYPED_TEST(PoolingLayerTest, PrintCPUBackward) { +TYPED_TEST(PoolingLayerTest, PrintBackward) { LayerParameter layer_param; layer_param.set_kernelsize(3); layer_param.set_stride(2); layer_param.set_pool(LayerParameter_PoolMethod_MAX); - Caffe::set_mode(Caffe::CPU); PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -457,56 +430,21 @@ TYPED_TEST(PoolingLayerTest, PrintCPUBackward) { } */ -TYPED_TEST(PoolingLayerTest, TestCPUForwardMax) { - Caffe::set_mode(Caffe::CPU); - this->TestForwardSquare(); - this->TestForwardRectHigh(); - this->TestForwardRectWide(); -} - -TYPED_TEST(PoolingLayerTest, TestGPUForwardMax) { - Caffe::set_mode(Caffe::GPU); +TYPED_TEST(PoolingLayerTest, TestForwardMax) { this->TestForwardSquare(); this->TestForwardRectHigh(); this->TestForwardRectWide(); } -TYPED_TEST(PoolingLayerTest, TestCPUForwardMaxTopMask) { - Caffe::set_mode(Caffe::CPU); +TYPED_TEST(PoolingLayerTest, TestForwardMaxTopMask) { this->blob_top_vec_.push_back(this->blob_top_mask_); this->TestForwardSquare(); this->TestForwardRectHigh(); this->TestForwardRectWide(); } -TYPED_TEST(PoolingLayerTest, TestGPUForwardMaxTopMask) { - Caffe::set_mode(Caffe::GPU); - this->blob_top_vec_.push_back(this->blob_top_mask_); - this->TestForwardSquare(); - this->TestForwardRectHigh(); - this->TestForwardRectWide(); -} - -TYPED_TEST(PoolingLayerTest, TestCPUGradientMax) { - for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { - for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_h(kernel_h); - pooling_param->set_kernel_w(kernel_w); - pooling_param->set_stride(2); - pooling_param->set_pad(1); - pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - Caffe::set_mode(Caffe::CPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); - } - } -} - -TYPED_TEST(PoolingLayerTest, TestGPUGradientMax) { +TYPED_TEST(PoolingLayerTest, TestGradientMax) { + typedef typename TypeParam::Dtype Dtype; for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { LayerParameter layer_param; @@ -516,23 +454,22 @@ TYPED_TEST(PoolingLayerTest, TestGPUGradientMax) { pooling_param->set_stride(2); pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - Caffe::set_mode(Caffe::GPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-4, 1e-2); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-4, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } } } -TYPED_TEST(PoolingLayerTest, TestCPUForwardMaxPadded) { +TYPED_TEST(PoolingLayerTest, TestForwardMaxPadded) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); pooling_param->set_pad(2); pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - Caffe::set_mode(Caffe::CPU); this->blob_bottom_->Reshape(1, 1, 3, 3); // Input: // [ 1 2 4 ] @@ -547,14 +484,14 @@ TYPED_TEST(PoolingLayerTest, TestCPUForwardMaxPadded) { this->blob_bottom_->mutable_cpu_data()[6] = 4; this->blob_bottom_->mutable_cpu_data()[7] = 2; this->blob_bottom_->mutable_cpu_data()[8] = 1; - PoolingLayer layer(layer_param); + PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); EXPECT_EQ(this->blob_top_->height(), 3); EXPECT_EQ(this->blob_top_->width(), 3); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - TypeParam epsilon = 1e-8; + Dtype epsilon = 1e-8; // Output: // [ 1 4 4 ] // [ 4 4 4 ] @@ -570,54 +507,8 @@ TYPED_TEST(PoolingLayerTest, TestCPUForwardMaxPadded) { EXPECT_NEAR(this->blob_top_->cpu_data()[8], 1, epsilon); } - -TYPED_TEST(PoolingLayerTest, TestGPUForwardMaxPadded) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(2); - pooling_param->set_pad(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - Caffe::set_mode(Caffe::GPU); - this->blob_bottom_->Reshape(1, 1, 3, 3); - // Input: - // [ 1 2 4 ] - // [ 2 3 2 ] - // [ 4 2 1 ] - this->blob_bottom_->mutable_cpu_data()[0] = 1; - this->blob_bottom_->mutable_cpu_data()[1] = 2; - this->blob_bottom_->mutable_cpu_data()[2] = 4; - this->blob_bottom_->mutable_cpu_data()[3] = 2; - this->blob_bottom_->mutable_cpu_data()[4] = 3; - this->blob_bottom_->mutable_cpu_data()[5] = 2; - this->blob_bottom_->mutable_cpu_data()[6] = 4; - this->blob_bottom_->mutable_cpu_data()[7] = 2; - this->blob_bottom_->mutable_cpu_data()[8] = 1; - PoolingLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - EXPECT_EQ(this->blob_top_->num(), 1); - EXPECT_EQ(this->blob_top_->channels(), 1); - EXPECT_EQ(this->blob_top_->height(), 3); - EXPECT_EQ(this->blob_top_->width(), 3); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - TypeParam epsilon = 1e-8; - // Output: - // [ 1 4 4 ] - // [ 4 4 4 ] - // [ 4 4 1 ] - EXPECT_NEAR(this->blob_top_->cpu_data()[0], 1, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[1], 4, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[2], 4, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[3], 4, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[4], 4, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[5], 4, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[6], 4, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[7], 4, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[8], 1, epsilon); -} - - -TYPED_TEST(PoolingLayerTest, TestCPUGradientMaxTopMask) { +TYPED_TEST(PoolingLayerTest, TestGradientMaxTopMask) { + typedef typename TypeParam::Dtype Dtype; for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { LayerParameter layer_param; @@ -627,9 +518,8 @@ TYPED_TEST(PoolingLayerTest, TestCPUGradientMaxTopMask) { pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); this->blob_top_vec_.push_back(this->blob_top_mask_); - Caffe::set_mode(Caffe::CPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-4, 1e-2); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-4, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); this->blob_top_vec_.pop_back(); @@ -637,48 +527,27 @@ TYPED_TEST(PoolingLayerTest, TestCPUGradientMaxTopMask) { } } -TYPED_TEST(PoolingLayerTest, TestGPUGradientMaxTopMask) { - for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { - for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_h(kernel_h); - pooling_param->set_kernel_w(kernel_w); - pooling_param->set_stride(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - this->blob_top_vec_.push_back(this->blob_top_mask_); - Caffe::set_mode(Caffe::GPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); - this->blob_top_vec_.pop_back(); - } - } -} - - -TYPED_TEST(PoolingLayerTest, TestCPUForwardAve) { +TYPED_TEST(PoolingLayerTest, TestForwardAve) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(1); pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - Caffe::set_mode(Caffe::CPU); this->blob_bottom_->Reshape(1, 1, 3, 3); FillerParameter filler_param; - filler_param.set_value(TypeParam(2)); - ConstantFiller filler(filler_param); + filler_param.set_value(Dtype(2)); + ConstantFiller filler(filler_param); filler.Fill(this->blob_bottom_); - PoolingLayer layer(layer_param); + PoolingLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); EXPECT_EQ(this->blob_top_->height(), 3); EXPECT_EQ(this->blob_top_->width(), 3); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - TypeParam epsilon = 1e-5; + Dtype epsilon = 1e-5; EXPECT_NEAR(this->blob_top_->cpu_data()[0], 8.0 / 9, epsilon); EXPECT_NEAR(this->blob_top_->cpu_data()[1], 4.0 / 3, epsilon); EXPECT_NEAR(this->blob_top_->cpu_data()[2], 8.0 / 9, epsilon); @@ -690,79 +559,8 @@ TYPED_TEST(PoolingLayerTest, TestCPUForwardAve) { EXPECT_NEAR(this->blob_top_->cpu_data()[8], 8.0 / 9, epsilon); } - -TYPED_TEST(PoolingLayerTest, TestGPUForwardAve) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_size(3); - pooling_param->set_stride(1); - pooling_param->set_pad(1); - pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - Caffe::set_mode(Caffe::GPU); - this->blob_bottom_->Reshape(1, 1, 3, 3); - FillerParameter filler_param; - filler_param.set_value(TypeParam(2)); - ConstantFiller filler(filler_param); - filler.Fill(this->blob_bottom_); - PoolingLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - EXPECT_EQ(this->blob_top_->num(), 1); - EXPECT_EQ(this->blob_top_->channels(), 1); - EXPECT_EQ(this->blob_top_->height(), 3); - EXPECT_EQ(this->blob_top_->width(), 3); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - TypeParam epsilon = 1e-5; - EXPECT_NEAR(this->blob_top_->cpu_data()[0], 8.0 / 9, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[1], 4.0 / 3, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[2], 8.0 / 9, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[3], 4.0 / 3, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[4], 2.0 , epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[5], 4.0 / 3, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[6], 8.0 / 9, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[7], 4.0 / 3, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[8], 8.0 / 9, epsilon); -} - - -TYPED_TEST(PoolingLayerTest, TestCPUGradientAve) { - for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { - for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_h(kernel_h); - pooling_param->set_kernel_w(kernel_w); - pooling_param->set_stride(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - Caffe::set_mode(Caffe::CPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); - } - } -} - - -TYPED_TEST(PoolingLayerTest, TestGPUGradientAve) { - for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { - for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { - LayerParameter layer_param; - PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); - pooling_param->set_kernel_h(kernel_h); - pooling_param->set_kernel_w(kernel_w); - pooling_param->set_stride(2); - pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - Caffe::set_mode(Caffe::GPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); - } - } -} - - -TYPED_TEST(PoolingLayerTest, TestCPUGradientAvePadded) { +TYPED_TEST(PoolingLayerTest, TestGradientAve) { + typedef typename TypeParam::Dtype Dtype; for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { LayerParameter layer_param; @@ -770,19 +568,17 @@ TYPED_TEST(PoolingLayerTest, TestCPUGradientAvePadded) { pooling_param->set_kernel_h(kernel_h); pooling_param->set_kernel_w(kernel_w); pooling_param->set_stride(2); - pooling_param->set_pad(2); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - Caffe::set_mode(Caffe::CPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } } } - -TYPED_TEST(PoolingLayerTest, TestGPUGradientAvePadded) { +TYPED_TEST(PoolingLayerTest, TestGradientAvePadded) { + typedef typename TypeParam::Dtype Dtype; for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { LayerParameter layer_param; @@ -792,9 +588,8 @@ TYPED_TEST(PoolingLayerTest, TestGPUGradientAvePadded) { pooling_param->set_stride(2); pooling_param->set_pad(2); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - Caffe::set_mode(Caffe::GPU); - PoolingLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); + PoolingLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } diff --git a/src/caffe/test/test_power_layer.cpp b/src/caffe/test/test_power_layer.cpp index 99b127d3dbc..a1b716ad531 100644 --- a/src/caffe/test/test_power_layer.cpp +++ b/src/caffe/test/test_power_layer.cpp @@ -20,8 +20,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class PowerLayerTest : public ::testing::Test { +template +class PowerLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: PowerLayerTest() : blob_bottom_(new Blob(2, 3, 4, 5)), @@ -90,166 +92,85 @@ class PowerLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(PowerLayerTest, Dtypes); - -TYPED_TEST(PowerLayerTest, TestPowerCPU) { - Caffe::set_mode(Caffe::CPU); - TypeParam power = 0.37; - TypeParam scale = 0.83; - TypeParam shift = -2.4; - this->TestForward(power, scale, shift); -} - -TYPED_TEST(PowerLayerTest, TestPowerGradientCPU) { - Caffe::set_mode(Caffe::CPU); - TypeParam power = 0.37; - TypeParam scale = 0.83; - TypeParam shift = -2.4; - this->TestBackward(power, scale, shift); -} - -TYPED_TEST(PowerLayerTest, TestPowerGradientShiftZeroCPU) { - Caffe::set_mode(Caffe::CPU); - TypeParam power = 0.37; - TypeParam scale = 0.83; - TypeParam shift = 0.0; - this->TestBackward(power, scale, shift); -} - -TYPED_TEST(PowerLayerTest, TestPowerZeroCPU) { - Caffe::set_mode(Caffe::CPU); - TypeParam power = 0.0; - TypeParam scale = 0.83; - TypeParam shift = -2.4; - this->TestForward(power, scale, shift); -} - -TYPED_TEST(PowerLayerTest, TestPowerZeroGradientCPU) { - Caffe::set_mode(Caffe::CPU); - TypeParam power = 0.0; - TypeParam scale = 0.83; - TypeParam shift = -2.4; - this->TestBackward(power, scale, shift); -} - -TYPED_TEST(PowerLayerTest, TestPowerOneCPU) { - Caffe::set_mode(Caffe::CPU); - TypeParam power = 1.0; - TypeParam scale = 0.83; - TypeParam shift = -2.4; - this->TestForward(power, scale, shift); -} - -TYPED_TEST(PowerLayerTest, TestPowerOneGradientCPU) { - Caffe::set_mode(Caffe::CPU); - TypeParam power = 1.0; - TypeParam scale = 0.83; - TypeParam shift = -2.4; - this->TestBackward(power, scale, shift); -} - -TYPED_TEST(PowerLayerTest, TestPowerTwoCPU) { - Caffe::set_mode(Caffe::CPU); - TypeParam power = 2.0; - TypeParam scale = 0.34; - TypeParam shift = -2.4; - this->TestForward(power, scale, shift); -} - -TYPED_TEST(PowerLayerTest, TestPowerTwoGradientCPU) { - Caffe::set_mode(Caffe::CPU); - TypeParam power = 2.0; - TypeParam scale = 0.83; - TypeParam shift = -2.4; - this->TestBackward(power, scale, shift); -} - -TYPED_TEST(PowerLayerTest, TestPowerTwoScaleHalfGradientCPU) { - Caffe::set_mode(Caffe::CPU); - TypeParam power = 2.0; - TypeParam scale = 0.5; - TypeParam shift = -2.4; - this->TestBackward(power, scale, shift); -} +TYPED_TEST_CASE(PowerLayerTest, TestDtypesAndDevices); -TYPED_TEST(PowerLayerTest, TestPowerGPU) { - Caffe::set_mode(Caffe::GPU); - TypeParam power = 0.37; - TypeParam scale = 0.83; - TypeParam shift = -2.4; +TYPED_TEST(PowerLayerTest, TestPower) { + typedef typename TypeParam::Dtype Dtype; + Dtype power = 0.37; + Dtype scale = 0.83; + Dtype shift = -2.4; this->TestForward(power, scale, shift); } -TYPED_TEST(PowerLayerTest, TestPowerGradientGPU) { - Caffe::set_mode(Caffe::GPU); - TypeParam power = 0.37; - TypeParam scale = 0.83; - TypeParam shift = -2.4; +TYPED_TEST(PowerLayerTest, TestPowerGradient) { + typedef typename TypeParam::Dtype Dtype; + Dtype power = 0.37; + Dtype scale = 0.83; + Dtype shift = -2.4; this->TestBackward(power, scale, shift); } -TYPED_TEST(PowerLayerTest, TestPowerGradientShiftZeroGPU) { - Caffe::set_mode(Caffe::GPU); - TypeParam power = 0.37; - TypeParam scale = 0.83; - TypeParam shift = 0.0; +TYPED_TEST(PowerLayerTest, TestPowerGradientShiftZero) { + typedef typename TypeParam::Dtype Dtype; + Dtype power = 0.37; + Dtype scale = 0.83; + Dtype shift = 0.0; this->TestBackward(power, scale, shift); } -TYPED_TEST(PowerLayerTest, TestPowerZeroGPU) { - Caffe::set_mode(Caffe::GPU); - TypeParam power = 0.0; - TypeParam scale = 0.83; - TypeParam shift = -2.4; +TYPED_TEST(PowerLayerTest, TestPowerZero) { + typedef typename TypeParam::Dtype Dtype; + Dtype power = 0.0; + Dtype scale = 0.83; + Dtype shift = -2.4; this->TestForward(power, scale, shift); } -TYPED_TEST(PowerLayerTest, TestPowerZeroGradientGPU) { - Caffe::set_mode(Caffe::GPU); - TypeParam power = 0.0; - TypeParam scale = 0.83; - TypeParam shift = -2.4; +TYPED_TEST(PowerLayerTest, TestPowerZeroGradient) { + typedef typename TypeParam::Dtype Dtype; + Dtype power = 0.0; + Dtype scale = 0.83; + Dtype shift = -2.4; this->TestBackward(power, scale, shift); } -TYPED_TEST(PowerLayerTest, TestPowerOneGPU) { - Caffe::set_mode(Caffe::GPU); - TypeParam power = 1.0; - TypeParam scale = 0.83; - TypeParam shift = -2.4; +TYPED_TEST(PowerLayerTest, TestPowerOne) { + typedef typename TypeParam::Dtype Dtype; + Dtype power = 1.0; + Dtype scale = 0.83; + Dtype shift = -2.4; this->TestForward(power, scale, shift); } -TYPED_TEST(PowerLayerTest, TestPowerOneGradientGPU) { - Caffe::set_mode(Caffe::GPU); - TypeParam power = 1.0; - TypeParam scale = 0.83; - TypeParam shift = -2.4; +TYPED_TEST(PowerLayerTest, TestPowerOneGradient) { + typedef typename TypeParam::Dtype Dtype; + Dtype power = 1.0; + Dtype scale = 0.83; + Dtype shift = -2.4; this->TestBackward(power, scale, shift); } -TYPED_TEST(PowerLayerTest, TestPowerTwoGPU) { - Caffe::set_mode(Caffe::GPU); - TypeParam power = 2.0; - TypeParam scale = 0.34; - TypeParam shift = -2.4; +TYPED_TEST(PowerLayerTest, TestPowerTwo) { + typedef typename TypeParam::Dtype Dtype; + Dtype power = 2.0; + Dtype scale = 0.34; + Dtype shift = -2.4; this->TestForward(power, scale, shift); } -TYPED_TEST(PowerLayerTest, TestPowerTwoGradientGPU) { - Caffe::set_mode(Caffe::GPU); - TypeParam power = 2.0; - TypeParam scale = 0.83; - TypeParam shift = -2.4; +TYPED_TEST(PowerLayerTest, TestPowerTwoGradient) { + typedef typename TypeParam::Dtype Dtype; + Dtype power = 2.0; + Dtype scale = 0.83; + Dtype shift = -2.4; this->TestBackward(power, scale, shift); } -TYPED_TEST(PowerLayerTest, TestPowerTwoScaleHalfGradientGPU) { - Caffe::set_mode(Caffe::GPU); - TypeParam power = 2.0; - TypeParam scale = 0.5; - TypeParam shift = -2.4; +TYPED_TEST(PowerLayerTest, TestPowerTwoScaleHalfGradient) { + typedef typename TypeParam::Dtype Dtype; + Dtype power = 2.0; + Dtype scale = 0.5; + Dtype shift = -2.4; this->TestBackward(power, scale, shift); } diff --git a/src/caffe/test/test_random_number_generator.cpp b/src/caffe/test/test_random_number_generator.cpp index 4116de4c252..3ab4680e976 100644 --- a/src/caffe/test/test_random_number_generator.cpp +++ b/src/caffe/test/test_random_number_generator.cpp @@ -202,10 +202,7 @@ class RandomNumberGeneratorTest : public ::testing::Test { shared_ptr int_data_2_; }; - -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(RandomNumberGeneratorTest, Dtypes); - +TYPED_TEST_CASE(RandomNumberGeneratorTest, TestDtypes); TYPED_TEST(RandomNumberGeneratorTest, TestRngGaussian) { const TypeParam mu = 0; diff --git a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp index 089d5950967..76bbfb48a17 100644 --- a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp @@ -18,8 +18,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class SigmoidCrossEntropyLossLayerTest : public ::testing::Test { +template +class SigmoidCrossEntropyLossLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: SigmoidCrossEntropyLossLayerTest() : blob_bottom_data_(new Blob(10, 5, 1, 1)), @@ -95,36 +97,18 @@ class SigmoidCrossEntropyLossLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(SigmoidCrossEntropyLossLayerTest, Dtypes); - - -TYPED_TEST(SigmoidCrossEntropyLossLayerTest, TestSigmoidCrossEntropyLossCPU) { - Caffe::set_mode(Caffe::CPU); - this->TestForward(); -} +TYPED_TEST_CASE(SigmoidCrossEntropyLossLayerTest, TestDtypesAndDevices); -TYPED_TEST(SigmoidCrossEntropyLossLayerTest, TestSigmoidCrossEntropyLossGPU) { - Caffe::set_mode(Caffe::GPU); +TYPED_TEST(SigmoidCrossEntropyLossLayerTest, TestSigmoidCrossEntropyLoss) { this->TestForward(); } -TYPED_TEST(SigmoidCrossEntropyLossLayerTest, TestGradientCPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - SigmoidCrossEntropyLossLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 1e-2, 1701); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); -} - -TYPED_TEST(SigmoidCrossEntropyLossLayerTest, TestGradientGPU) { +TYPED_TEST(SigmoidCrossEntropyLossLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - SigmoidCrossEntropyLossLayer layer(layer_param); + SigmoidCrossEntropyLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 1e-2, 1701); + GradientChecker checker(1e-2, 1e-2, 1701); checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_), 0, -1, -1); } diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index 3ba302d4c60..4a9c0f2867d 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -38,12 +38,10 @@ class SoftmaxLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(SoftmaxLayerTest, Dtypes); +TYPED_TEST_CASE(SoftmaxLayerTest, TestDtypes); -TYPED_TEST(SoftmaxLayerTest, TestForwardCPU) { +TYPED_TEST(SoftmaxLayerTest, TestForward) { LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); SoftmaxLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -73,9 +71,8 @@ TYPED_TEST(SoftmaxLayerTest, TestForwardCPU) { } } -TYPED_TEST(SoftmaxLayerTest, TestGradientCPU) { +TYPED_TEST(SoftmaxLayerTest, TestGradient) { LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); SoftmaxLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), diff --git a/src/caffe/test/test_softmax_with_loss_layer.cpp b/src/caffe/test/test_softmax_with_loss_layer.cpp index 8b8be8e8b6d..efd6e33c2f7 100644 --- a/src/caffe/test/test_softmax_with_loss_layer.cpp +++ b/src/caffe/test/test_softmax_with_loss_layer.cpp @@ -19,8 +19,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class SoftmaxWithLossLayerTest : public ::testing::Test { +template +class SoftmaxWithLossLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: SoftmaxWithLossLayerTest() : blob_bottom_data_(new Blob(10, 5, 1, 1)), @@ -46,26 +48,15 @@ class SoftmaxWithLossLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(SoftmaxWithLossLayerTest, Dtypes); - +TYPED_TEST_CASE(SoftmaxWithLossLayerTest, TestDtypesAndDevices); -TYPED_TEST(SoftmaxWithLossLayerTest, TestGradientCPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - SoftmaxWithLossLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 1e-2, 1701); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); -} -TYPED_TEST(SoftmaxWithLossLayerTest, TestGradientGPU) { +TYPED_TEST(SoftmaxWithLossLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - SoftmaxWithLossLayer layer(layer_param); + SoftmaxWithLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 1e-2, 1701); + GradientChecker checker(1e-2, 1e-2, 1701); checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_), 0, -1, -1); } diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index 327bcf937ac..455fb59d4d3 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -20,8 +20,10 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class SplitLayerTest : public ::testing::Test { +template +class SplitLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: SplitLayerTest() : blob_bottom_(new Blob(2, 3, 6, 5)), @@ -47,12 +49,12 @@ class SplitLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(SplitLayerTest, Dtypes); +TYPED_TEST_CASE(SplitLayerTest, TestDtypesAndDevices); TYPED_TEST(SplitLayerTest, TestSetup) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - SplitLayer layer(layer_param); + SplitLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_a_->num(), 2); EXPECT_EQ(this->blob_top_a_->channels(), 3); @@ -64,91 +66,46 @@ TYPED_TEST(SplitLayerTest, TestSetup) { EXPECT_EQ(this->blob_top_b_->width(), 5); } -TYPED_TEST(SplitLayerTest, TestCPU) { +TYPED_TEST(SplitLayerTest, Test) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - SplitLayer layer(layer_param); - Caffe::set_mode(Caffe::CPU); + SplitLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); for (int i = 0; i < this->blob_bottom_->count(); ++i) { - TypeParam bottom_value = this->blob_bottom_->cpu_data()[i]; + Dtype bottom_value = this->blob_bottom_->cpu_data()[i]; EXPECT_EQ(bottom_value, this->blob_top_a_->cpu_data()[i]); EXPECT_EQ(bottom_value, this->blob_top_b_->cpu_data()[i]); } } -TYPED_TEST(SplitLayerTest, TestGPU) { - LayerParameter layer_param; - SplitLayer layer(layer_param); - Caffe::set_mode(Caffe::GPU); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - TypeParam bottom_value = this->blob_bottom_->cpu_data()[i]; - EXPECT_EQ(bottom_value, this->blob_top_a_->cpu_data()[i]); - EXPECT_EQ(bottom_value, this->blob_top_b_->cpu_data()[i]); - } -} - -TYPED_TEST(SplitLayerTest, TestCPUInPlace) { - LayerParameter layer_param; - SplitLayer layer(layer_param); - Caffe::set_mode(Caffe::CPU); - this->blob_top_vec_[0] = this->blob_bottom_vec_[0]; - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - TypeParam bottom_value = this->blob_bottom_->cpu_data()[i]; - EXPECT_EQ(bottom_value, this->blob_top_b_->cpu_data()[i]); - } -} - -TYPED_TEST(SplitLayerTest, TestGPUInPlace) { +TYPED_TEST(SplitLayerTest, TestInPlace) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - SplitLayer layer(layer_param); - Caffe::set_mode(Caffe::GPU); + SplitLayer layer(layer_param); this->blob_top_vec_[0] = this->blob_bottom_vec_[0]; layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); for (int i = 0; i < this->blob_bottom_->count(); ++i) { - TypeParam bottom_value = this->blob_bottom_->cpu_data()[i]; + Dtype bottom_value = this->blob_bottom_->cpu_data()[i]; EXPECT_EQ(bottom_value, this->blob_top_b_->cpu_data()[i]); } } -TYPED_TEST(SplitLayerTest, TestCPUGradient) { +TYPED_TEST(SplitLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - SplitLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(SplitLayerTest, TestGPUGradient) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - SplitLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(SplitLayerTest, TestCPUGradientInPlace) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - SplitLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - this->blob_top_vec_[0] = this->blob_bottom_vec_[0]; + SplitLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } -TYPED_TEST(SplitLayerTest, TestGPUGradientInPlace) { +TYPED_TEST(SplitLayerTest, TestGradientInPlace) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - SplitLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); + SplitLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); this->blob_top_vec_[0] = this->blob_bottom_vec_[0]; checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); diff --git a/src/caffe/test/test_stochastic_pooling.cpp b/src/caffe/test/test_stochastic_pooling.cpp index 0ad8123f881..7a931d224d8 100644 --- a/src/caffe/test/test_stochastic_pooling.cpp +++ b/src/caffe/test/test_stochastic_pooling.cpp @@ -49,8 +49,7 @@ class StochasticPoolingLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(StochasticPoolingLayerTest, Dtypes); +TYPED_TEST_CASE(StochasticPoolingLayerTest, TestDtypes); TYPED_TEST(StochasticPoolingLayerTest, TestSetup) { LayerParameter layer_param; diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index 3a757088e89..20bd86138b5 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -24,7 +24,7 @@ TEST_F(SyncedMemoryTest, TestInitialization) { delete p_mem; } -TEST_F(SyncedMemoryTest, TestAllocation) { +TEST_F(SyncedMemoryTest, TestAllocationCPUGPU) { SyncedMemory mem(10); EXPECT_TRUE(mem.cpu_data()); EXPECT_TRUE(mem.gpu_data()); @@ -32,20 +32,32 @@ TEST_F(SyncedMemoryTest, TestAllocation) { EXPECT_TRUE(mem.mutable_gpu_data()); } +TEST_F(SyncedMemoryTest, TestAllocationCPU) { + SyncedMemory mem(10); + EXPECT_TRUE(mem.cpu_data()); + EXPECT_TRUE(mem.mutable_cpu_data()); +} + +TEST_F(SyncedMemoryTest, TestAllocationGPU) { + SyncedMemory mem(10); + EXPECT_TRUE(mem.gpu_data()); + EXPECT_TRUE(mem.mutable_gpu_data()); +} + TEST_F(SyncedMemoryTest, TestCPUWrite) { SyncedMemory mem(10); void* cpu_data = mem.mutable_cpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); memset(cpu_data, 1, mem.size()); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ((reinterpret_cast(cpu_data))[i], 1); + EXPECT_EQ((static_cast(cpu_data))[i], 1); } // do another round cpu_data = mem.mutable_cpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); memset(cpu_data, 2, mem.size()); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ((reinterpret_cast(cpu_data))[i], 2); + EXPECT_EQ((static_cast(cpu_data))[i], 2); } } @@ -60,21 +72,21 @@ TEST_F(SyncedMemoryTest, TestGPURead) { char* recovered_value = new char[10]; caffe_gpu_memcpy(10, gpu_data, recovered_value); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ((reinterpret_cast(recovered_value))[i], 1); + EXPECT_EQ((static_cast(recovered_value))[i], 1); } // do another round cpu_data = mem.mutable_cpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); memset(cpu_data, 2, mem.size()); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ((reinterpret_cast(cpu_data))[i], 2); + EXPECT_EQ((static_cast(cpu_data))[i], 2); } gpu_data = mem.gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same caffe_gpu_memcpy(10, gpu_data, recovered_value); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ((reinterpret_cast(recovered_value))[i], 2); + EXPECT_EQ((static_cast(recovered_value))[i], 2); } delete[] recovered_value; } @@ -86,7 +98,7 @@ TEST_F(SyncedMemoryTest, TestGPUWrite) { CUDA_CHECK(cudaMemset(gpu_data, 1, mem.size())); const void* cpu_data = mem.cpu_data(); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ((reinterpret_cast(cpu_data))[i], 1); + EXPECT_EQ((static_cast(cpu_data))[i], 1); } EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); @@ -95,7 +107,7 @@ TEST_F(SyncedMemoryTest, TestGPUWrite) { CUDA_CHECK(cudaMemset(gpu_data, 2, mem.size())); cpu_data = mem.cpu_data(); for (int i = 0; i < mem.size(); ++i) { - EXPECT_EQ((reinterpret_cast(cpu_data))[i], 2); + EXPECT_EQ((static_cast(cpu_data))[i], 2); } EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); } diff --git a/src/caffe/test/test_tanh_layer.cpp b/src/caffe/test/test_tanh_layer.cpp index 9c9f8a74ae2..171eb4e472e 100644 --- a/src/caffe/test/test_tanh_layer.cpp +++ b/src/caffe/test/test_tanh_layer.cpp @@ -19,8 +19,9 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class TanHLayerTest : public ::testing::Test { +template +class TanHLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; protected: TanHLayerTest() : blob_bottom_(new Blob(2, 10, 1, 1)), @@ -39,13 +40,12 @@ class TanHLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(TanHLayerTest, Dtypes); +TYPED_TEST_CASE(TanHLayerTest, TestDtypesAndDevices); -TYPED_TEST(TanHLayerTest, TestForwardCPU) { +TYPED_TEST(TanHLayerTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - TanHLayer layer(layer_param); + TanHLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Test exact values @@ -65,43 +65,11 @@ TYPED_TEST(TanHLayerTest, TestForwardCPU) { } } -TYPED_TEST(TanHLayerTest, TestGradientCPU) { +TYPED_TEST(TanHLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - TanHLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -TYPED_TEST(TanHLayerTest, TestForwardGPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - TanHLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Test exact values - for (int i = 0; i < this->blob_bottom_->num(); ++i) { - for (int j = 0; j < this->blob_bottom_->channels(); ++j) { - for (int k = 0; k < this->blob_bottom_->height(); ++k) { - for (int l = 0; l < this->blob_bottom_->width(); ++l) { - EXPECT_GE(this->blob_top_->data_at(i, j, k, l) + 1e-4, - (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / - (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); - EXPECT_LE(this->blob_top_->data_at(i, j, k, l) - 1e-4, - (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / - (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); - } - } - } - } -} - -TYPED_TEST(TanHLayerTest, TestGradientGPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - TanHLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); + TanHLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 8303e442007..46519ff2094 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -16,8 +16,9 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class ThresholdLayerTest : public ::testing::Test { +template +class ThresholdLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; protected: ThresholdLayerTest() : blob_bottom_(new Blob(2, 3, 6, 5)), @@ -37,13 +38,13 @@ class ThresholdLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(ThresholdLayerTest, Dtypes); +TYPED_TEST_CASE(ThresholdLayerTest, TestDtypesAndDevices); TYPED_TEST(ThresholdLayerTest, TestSetup) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - ThresholdLayer layer(layer_param); + ThresholdLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); @@ -51,16 +52,16 @@ TYPED_TEST(ThresholdLayerTest, TestSetup) { EXPECT_EQ(this->blob_top_->width(), this->blob_bottom_->width()); } -TYPED_TEST(ThresholdLayerTest, TestCPU) { +TYPED_TEST(ThresholdLayerTest, Test) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - ThresholdLayer layer(layer_param); + ThresholdLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - const TypeParam threshold_ = layer_param.threshold_param().threshold(); + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); + const Dtype threshold_ = layer_param.threshold_param().threshold(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); EXPECT_LE(top_data[i], 1.); @@ -73,67 +74,19 @@ TYPED_TEST(ThresholdLayerTest, TestCPU) { } } -TYPED_TEST(ThresholdLayerTest, TestCPU2) { +TYPED_TEST(ThresholdLayerTest, Test2) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); ThresholdParameter* threshold_param = layer_param.mutable_threshold_param(); threshold_param->set_threshold(0.5); - ThresholdLayer layer(layer_param); + ThresholdLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - const TypeParam threshold_ = layer_param.threshold_param().threshold(); - EXPECT_FLOAT_EQ(threshold_, 0.5); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_GE(top_data[i], 0.); - EXPECT_LE(top_data[i], 1.); - if (top_data[i] == 0) { - EXPECT_LE(bottom_data[i], threshold_); - } - if (top_data[i] == 1) { - EXPECT_GT(bottom_data[i], threshold_); - } - } -} - -TYPED_TEST(ThresholdLayerTest, TestGPU) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - ThresholdLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - const TypeParam threshold_ = layer_param.threshold_param().threshold(); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_GE(top_data[i], 0.); - EXPECT_LE(top_data[i], 1.); - if (top_data[i] == 0) { - EXPECT_LE(bottom_data[i], threshold_); - } - if (top_data[i] == 1) { - EXPECT_GT(bottom_data[i], threshold_); - } - } -} - -TYPED_TEST(ThresholdLayerTest, TestGPU2) { - LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - ThresholdParameter* threshold_param = - layer_param.mutable_threshold_param(); - threshold_param->set_threshold(0.5); - ThresholdLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); - const TypeParam threshold_ = layer_param.threshold_param().threshold(); + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); + const Dtype threshold_ = layer_param.threshold_param().threshold(); EXPECT_FLOAT_EQ(threshold_, 0.5); for (int i = 0; i < this->blob_bottom_->count(); ++i) { EXPECT_GE(top_data[i], 0.); diff --git a/src/caffe/test/test_util_blas.cpp b/src/caffe/test/test_util_blas.cpp index 5b4c48eaf80..725d24e21d3 100644 --- a/src/caffe/test/test_util_blas.cpp +++ b/src/caffe/test/test_util_blas.cpp @@ -15,14 +15,12 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -typedef ::testing::Types Dtypes; - -template +template class GemmTest : public ::testing::Test {}; -TYPED_TEST_CASE(GemmTest, Dtypes); +TYPED_TEST_CASE(GemmTest, TestDtypes); -TYPED_TEST(GemmTest, TestGemm) { +TYPED_TEST(GemmTest, TestGemmCPUGPU) { Blob A(1, 1, 2, 3); Blob B(1, 1, 3, 4); Blob C(1, 1, 2, 4); @@ -93,7 +91,7 @@ TYPED_TEST(GemmTest, TestGemm) { } -TYPED_TEST(GemmTest, TestGemv) { +TYPED_TEST(GemmTest, TestGemvCPUGPU) { Blob A(1, 1, 2, 3); Blob x(1, 1, 1, 3); Blob y(1, 1, 1, 2); From 00a8f3af825e9083b4674437e6890d4159a0ec1d Mon Sep 17 00:00:00 2001 From: huy Date: Wed, 9 Jul 2014 23:02:06 -0700 Subject: [PATCH 0238/2053] @huyng's .travis.yml integration configuration file to install and test Caffe. --- .travis.yml | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000000..1dd8a2d8a78 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,41 @@ +language: cpp +compiler: + - gcc + - clang +before_install: + - echo $LANG + - echo $LC_ALL + - sudo apt-get -y update +install: + - sudo apt-get -y install wget git curl python-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev + - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz + - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - + - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb + - sudo apt-get -y update && sudo apt-get -y install cuda + - curl https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -o /tmp/mdb.tar.gz && tar -C /tmp -xzvf /tmp/mdb.tar.gz && rm /tmp/mdb.tar.gz + - cd /tmp/mdb-mdb/libraries/liblmdb/ && make && sudo make install && cd - +before_script: + - mv Makefile.config.example Makefile.config +script: + - make all + - make test + - LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64 make runtest +branches: + only: + - master + - dev + - travisci +notifications: + recipients: + - huy@huyng.com + email: + on_success: change + on_failure: always + irc: + channels: + - "chat.freenode.net#caffe" + template: + - "%{repository}/%{branch} (%{commit} - %{author}): %{message}" +os: + - linux + - osx From 24bfd03da3da5342034be7ba18116dcf0596216c Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 12 Jul 2014 10:00:44 -0700 Subject: [PATCH 0239/2053] -Override the default compiler by specifying a CXX in Makefile.config instead of CUSTOM_CXX, as Travis exports CXX as the compiler env variable name. -Change TEST_HDFS -> TEST_HXX_SRCS. --- Makefile | 17 ++++++----------- Makefile.config.example | 2 +- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index c17d4980b79..fc3ffe6a30b 100644 --- a/Makefile +++ b/Makefile @@ -37,8 +37,8 @@ TEST_SRCS := $(shell find src/$(PROJECT) -name "test_*.cpp") TEST_SRCS := $(filter-out $(TEST_MAIN_SRC), $(TEST_SRCS)) TEST_CU_SRCS := $(shell find src/$(PROJECT) -name "test_*.cu") GTEST_SRC := src/gtest/gtest-all.cpp -# TEST_HDRS are the test header files -TEST_HDRS := $(shell find include/$(PROJECT) -name "test_*.hpp") +# TEST_HXX_SRCS are the test header files +TEST_HXX_SRCS := $(shell find include/$(PROJECT) -name "test_*.hpp") # TOOL_SRCS are the source files for the tool binaries TOOL_SRCS := $(shell find tools -name "*.cpp") # EXAMPLE_SRCS are the source files for the example binaries @@ -194,7 +194,7 @@ else ifeq ($(UNAME), Darwin) endif ifeq ($(LINUX), 1) - CXX := /usr/bin/g++ + CXX ?= /usr/bin/g++ GCCVERSION := $(shell $(CXX) -dumpversion | cut -f1,2 -d.) # older versions of gcc are too dumb to build boost with -Wuninitalized ifeq ($(shell echo $(GCCVERSION) \< 4.6 | bc), 1) @@ -206,7 +206,7 @@ endif # clang++ instead of g++ # libstdc++ instead of libc++ for CUDA compatibility on 10.9 ifeq ($(OSX), 1) - CXX := /usr/bin/clang++ + CXX ?= /usr/bin/clang++ # clang throws this warning for cuda headers WARNINGS += -Wno-unneeded-internal-declaration ifneq ($(findstring 10.9, $(shell sw_vers -productVersion)),) @@ -215,11 +215,6 @@ ifeq ($(OSX), 1) endif endif -# Custom compiler -ifdef CUSTOM_CXX - CXX := $(CUSTOM_CXX) -endif - # Debugging ifeq ($(DEBUG), 1) COMMON_FLAGS := -DDEBUG -g -O0 @@ -385,14 +380,14 @@ $(STATIC_NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) ar rcs $@ $(PROTO_OBJS) $(OBJS) @ echo -$(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HDRS) \ +$(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HXX_SRCS) \ | $(TEST_BUILD_DIR) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo -$(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HDRS) \ +$(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HXX_SRCS) \ | $(TEST_BUILD_DIR) $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ || (cat $@.$(WARNS_EXT); exit 1) diff --git a/Makefile.config.example b/Makefile.config.example index 17c90016f75..81effb481f3 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -3,7 +3,7 @@ # To customize your choice of compiler, uncomment and set the following. # N.B. the default for Linux is g++ and the default for OSX is clang++ -# CUSTOM_CXX := g++ +# CXX := g++ # CUDA directory contains bin/ and lib/ directories that we need. CUDA_DIR := /usr/local/cuda From 89d50ca20746517f71e7c7c121401d09d40e3ebc Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 12 Jul 2014 04:27:36 -0700 Subject: [PATCH 0240/2053] @jeffdonahue's tweaks to .travis.yml config: -Add (CPU-only) test, lint, warn and parallel (-j 4) to travis CI build. -Add /usr/local/lib to travis config (seems needed for LMDB). -Put export in "before_script"; disable clang build -- doesn't work on Linux. -Cache Ubuntu apt packages. -Install bc package to hopefully suppress "bc: not found" errors -Get apt packages before_install as suggested by Travis official docs -Remove specified email address and IRC notifications (emails are sent to the committer by default; others can view build results in public Travis feed, on pull requests, etc.). --- .travis.yml | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1dd8a2d8a78..fcea38c8f47 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,18 @@ language: cpp +# Cache Ubuntu apt packages. +cache: apt compiler: - gcc - - clang +# Disable clang build: doesn't seem to work on Linux. +# (@jeffdonahue: Travis buildbot's failure behavior is similar to what I see +# building on Linux.) +# - clang before_install: - echo $LANG - echo $LC_ALL - sudo apt-get -y update + - sudo apt-get -y install wget git curl python-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc install: - - sudo apt-get -y install wget git curl python-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb @@ -16,26 +21,33 @@ install: - cd /tmp/mdb-mdb/libraries/liblmdb/ && make && sudo make install && cd - before_script: - mv Makefile.config.example Makefile.config + - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/lib + - export NUM_THREADS=4 script: - - make all - - make test - - LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64 make runtest + - make -j $NUM_THREADS all test warn lint + - make runtestnogpu + - make -j $NUM_THREADS all + - make -j $NUM_THREADS test + - make -j $NUM_THREADS warn + - make -j $NUM_THREADS lint branches: only: - master - dev - travisci notifications: - recipients: - - huy@huyng.com +# Emails are sent to the committer's git-configured email address by default, +# but only if they have access to the repository. To enable Travis on your +# public fork of Caffe, just go to travis-ci.org and flip the switch on for +# your Caffe fork. To configure your git email address, use: +# git config --global user.email me@example.com email: - on_success: change + on_success: always on_failure: always - irc: - channels: - - "chat.freenode.net#caffe" - template: - - "%{repository}/%{branch} (%{commit} - %{author}): %{message}" -os: - - linux - - osx +# IRC notifications disabled by default. +# Uncomment next 5 lines to send notifications to chat.freenode.net#caffe +# irc: +# channels: +# - "chat.freenode.net#caffe" +# template: +# - "%{repository}/%{branch} (%{commit} - %{author}): %{message}" From c962e7de51be765584504b11c84eb7023a9b9e89 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 12 Jul 2014 22:37:10 -0700 Subject: [PATCH 0241/2053] Travis build failure wasn't working for lint/warn because they didn't exit with a non-zero code -- this fixes that. --- Makefile | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index fc3ffe6a30b..38c180c28da 100644 --- a/Makefile +++ b/Makefile @@ -292,10 +292,11 @@ $(EMPTY_LINT_REPORT): $(LINT_OUTPUTS) | $(BUILD_DIR) @ if [ -s "$@" ]; then \ cat $@; \ mv $@ $(NONEMPTY_LINT_REPORT); \ - else \ - $(RM) $(NONEMPTY_LINT_REPORT); \ - echo "No lint errors!"; \ - fi + echo "Found one or more lint errors."; \ + exit 1; \ + fi; \ + $(RM) $(NONEMPTY_LINT_REPORT); \ + echo "No lint errors!"; $(LINT_OUTPUTS): $(LINT_OUTPUT_DIR)/%.lint.txt : % | $(LINT_OUTPUT_DIR) @ mkdir -p $(dir $@) @@ -348,10 +349,11 @@ $(EMPTY_WARN_REPORT): $(ALL_WARNS) | $(BUILD_DIR) @ if [ -s "$@" ]; then \ cat $@; \ mv $@ $(NONEMPTY_WARN_REPORT); \ - else \ - $(RM) $(NONEMPTY_WARN_REPORT); \ - echo "No compiler warnings!"; \ - fi + echo "Found one or more lint errors."; \ + exit 1; \ + fi; \ + $(RM) $(NONEMPTY_WARN_REPORT); \ + echo "No compiler warnings!"; $(ALL_CXX_WARNS): %.o.$(WARNS_EXT) : %.o From 717b6b0c1f396923e6380f3745db3b141e7d5f19 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 14 Jul 2014 02:44:28 -0700 Subject: [PATCH 0242/2053] Seed HingeLossLayerTest; bad values can cause test (and therefore Travis CI build) to fail --- src/caffe/test/test_hinge_loss_layer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index 868e9e9ae16..df6d8e25803 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -28,6 +28,7 @@ class HingeLossLayerTest : public MultiDeviceTest { : blob_bottom_data_(new Blob(10, 5, 1, 1)), blob_bottom_label_(new Blob(10, 1, 1, 1)) { // fill the values + Caffe::set_random_seed(1701); FillerParameter filler_param; filler_param.set_std(10); GaussianFiller filler(filler_param); From 856f06d44fbaae09c12d060d078b81e257159d50 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 14 Jul 2014 19:54:48 +0200 Subject: [PATCH 0243/2053] fix Makefile comment about library names --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 38c180c28da..ad3c1bb41c0 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ else OTHER_BUILD_DIR := $(DEBUG_BUILD_DIR) endif -# The target static library and shared library name +# The target shared library and static library name LIB_BUILD_DIR := $(BUILD_DIR)/lib NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so STATIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).a From 9045fd20eec25b8a59f8a196bacf69d0b157c6a5 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 14 Jul 2014 13:31:13 -0700 Subject: [PATCH 0244/2053] Add --keep-going flag to first make so that any targets that can be built are built; write out full -j flag as --jobs for clarity. --- .travis.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index fcea38c8f47..7951b2e78f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,12 +24,12 @@ before_script: - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/lib - export NUM_THREADS=4 script: - - make -j $NUM_THREADS all test warn lint + - make --keep-going --jobs=$NUM_THREADS all test warn lint - make runtestnogpu - - make -j $NUM_THREADS all - - make -j $NUM_THREADS test - - make -j $NUM_THREADS warn - - make -j $NUM_THREADS lint + - make --jobs=$NUM_THREADS all + - make --jobs=$NUM_THREADS test + - make --jobs=$NUM_THREADS warn + - make --jobs=$NUM_THREADS lint branches: only: - master From 89159f395c02d5dab59d4658e4121fd981d89363 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 14 Jul 2014 13:37:13 -0700 Subject: [PATCH 0245/2053] Run Travis build on all branches (remove whitelist from .travis.yml). --- .travis.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7951b2e78f2..19ef68375e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,11 +30,6 @@ script: - make --jobs=$NUM_THREADS test - make --jobs=$NUM_THREADS warn - make --jobs=$NUM_THREADS lint -branches: - only: - - master - - dev - - travisci notifications: # Emails are sent to the committer's git-configured email address by default, # but only if they have access to the repository. To enable Travis on your From 9c65fbaa865829e4b479e43eae72cf8f5f09afcc Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 14 Jul 2014 13:43:08 -0700 Subject: [PATCH 0246/2053] Replace CUSTOM_CXX env var to specify non-default C++ compiler. --- Makefile | 5 +++++ Makefile.config.example | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ad3c1bb41c0..00f67c978dc 100644 --- a/Makefile +++ b/Makefile @@ -215,6 +215,11 @@ ifeq ($(OSX), 1) endif endif +# Custom compiler +ifdef CUSTOM_CXX + CXX := $(CUSTOM_CXX) +endif + # Debugging ifeq ($(DEBUG), 1) COMMON_FLAGS := -DDEBUG -g -O0 diff --git a/Makefile.config.example b/Makefile.config.example index 81effb481f3..17c90016f75 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -3,7 +3,7 @@ # To customize your choice of compiler, uncomment and set the following. # N.B. the default for Linux is g++ and the default for OSX is clang++ -# CXX := g++ +# CUSTOM_CXX := g++ # CUDA directory contains bin/ and lib/ directories that we need. CUDA_DIR := /usr/local/cuda From 97d6ccfda5ec371b8113713f01b86ac54135ff58 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 14 Jul 2014 13:46:09 -0700 Subject: [PATCH 0247/2053] Add blank lines between fields for readability. --- .travis.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.travis.yml b/.travis.yml index 19ef68375e4..1f780471b3b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,21 @@ language: cpp + # Cache Ubuntu apt packages. cache: apt + compiler: - gcc # Disable clang build: doesn't seem to work on Linux. # (@jeffdonahue: Travis buildbot's failure behavior is similar to what I see # building on Linux.) # - clang + before_install: - echo $LANG - echo $LC_ALL - sudo apt-get -y update - sudo apt-get -y install wget git curl python-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc + install: - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - @@ -19,10 +23,12 @@ install: - sudo apt-get -y update && sudo apt-get -y install cuda - curl https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -o /tmp/mdb.tar.gz && tar -C /tmp -xzvf /tmp/mdb.tar.gz && rm /tmp/mdb.tar.gz - cd /tmp/mdb-mdb/libraries/liblmdb/ && make && sudo make install && cd - + before_script: - mv Makefile.config.example Makefile.config - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/lib - export NUM_THREADS=4 + script: - make --keep-going --jobs=$NUM_THREADS all test warn lint - make runtestnogpu @@ -30,6 +36,7 @@ script: - make --jobs=$NUM_THREADS test - make --jobs=$NUM_THREADS warn - make --jobs=$NUM_THREADS lint + notifications: # Emails are sent to the committer's git-configured email address by default, # but only if they have access to the repository. To enable Travis on your @@ -39,6 +46,7 @@ notifications: email: on_success: always on_failure: always + # IRC notifications disabled by default. # Uncomment next 5 lines to send notifications to chat.freenode.net#caffe # irc: From c28823f7829b91c5dd56060579dda2cecbc22d7b Mon Sep 17 00:00:00 2001 From: Ross Girshick Date: Mon, 14 Jul 2014 17:04:43 -0700 Subject: [PATCH 0248/2053] fix bug that breaks MATLAB 2014a compilation --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 00f67c978dc..855d948f230 100644 --- a/Makefile +++ b/Makefile @@ -336,9 +336,9 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) "to build mat$(PROJECT)."; \ exit 1; \ fi - $(MATLAB_DIR)/bin/mex $(MAT$(PROJECT)_SRC) $(STATIC_NAME) \ + $(MATLAB_DIR)/bin/mex $(MAT$(PROJECT)_SRC) \ CXXFLAGS="\$$CXXFLAGS $(MATLAB_CXXFLAGS)" \ - CXXLIBS="\$$CXXLIBS $(LDFLAGS)" -o $@ + CXXLIBS="\$$CXXLIBS $(STATIC_NAME) $(LDFLAGS)" -output $@ @ echo runtest: $(TEST_ALL_BIN) From 304be2fec6440aef246ac19b4832d3d5e72fc6c9 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 14 Jul 2014 23:49:36 -0700 Subject: [PATCH 0249/2053] Fix SoftmaxLayerTest: forgot to change this one to use DtypesAndDevices; was causing Travis build to randomly fail if a previous test had set the mode to GPU (which no test that is run by 'make runtestnogpu' should, so I guess there's another bug somewhere). --- src/caffe/test/test_softmax_layer.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index 4a9c0f2867d..f0be279bbca 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -18,8 +18,9 @@ namespace caffe { extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; -template -class SoftmaxLayerTest : public ::testing::Test { +template +class SoftmaxLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; protected: SoftmaxLayerTest() : blob_bottom_(new Blob(2, 10, 1, 1)), @@ -38,16 +39,17 @@ class SoftmaxLayerTest : public ::testing::Test { vector*> blob_top_vec_; }; -TYPED_TEST_CASE(SoftmaxLayerTest, TestDtypes); +TYPED_TEST_CASE(SoftmaxLayerTest, TestDtypesAndDevices); TYPED_TEST(SoftmaxLayerTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - SoftmaxLayer layer(layer_param); + SoftmaxLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Test sum for (int i = 0; i < this->blob_bottom_->num(); ++i) { - TypeParam sum = 0; + Dtype sum = 0; for (int j = 0; j < this->blob_top_->channels(); ++j) { sum += this->blob_top_->data_at(i, j, 0, 0); } @@ -56,7 +58,7 @@ TYPED_TEST(SoftmaxLayerTest, TestForward) { } // Test exact values for (int i = 0; i < this->blob_bottom_->num(); ++i) { - TypeParam scale = 0; + Dtype scale = 0; for (int j = 0; j < this->blob_bottom_->channels(); ++j) { scale += exp(this->blob_bottom_->data_at(i, j, 0, 0)); } @@ -72,9 +74,10 @@ TYPED_TEST(SoftmaxLayerTest, TestForward) { } TYPED_TEST(SoftmaxLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - SoftmaxLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); + SoftmaxLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } From 6a0883d45ffc277aa67d0746acc1e82718316104 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 15 Jul 2014 10:20:10 +0200 Subject: [PATCH 0250/2053] fix choice of clang++ in OS X build --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 855d948f230..f7e58700b67 100644 --- a/Makefile +++ b/Makefile @@ -206,7 +206,7 @@ endif # clang++ instead of g++ # libstdc++ instead of libc++ for CUDA compatibility on 10.9 ifeq ($(OSX), 1) - CXX ?= /usr/bin/clang++ + CXX := /usr/bin/clang++ # clang throws this warning for cuda headers WARNINGS += -Wno-unneeded-internal-declaration ifneq ($(findstring 10.9, $(shell sw_vers -productVersion)),) From 0271224513e02c1d1a0421d784b02d8a0e900baf Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 15 Jul 2014 16:06:59 +0200 Subject: [PATCH 0251/2053] [example] elaborate net surgery description --- examples/net_surgery.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 550f4112830..0a6e208f6d7 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -1,7 +1,7 @@ { "metadata": { "name": "Editing model parameters", - "description": "How to do net surgery and manually change model parameters.", + "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "include_in_docs": true }, "nbformat": 3, From 3e35a160e284f9a2da1fcc7df9b6ad15eaf20480 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 15 Jul 2014 13:47:14 -0700 Subject: [PATCH 0252/2053] Fix Makefile warning error message. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f7e58700b67..ad13bb949e7 100644 --- a/Makefile +++ b/Makefile @@ -354,7 +354,7 @@ $(EMPTY_WARN_REPORT): $(ALL_WARNS) | $(BUILD_DIR) @ if [ -s "$@" ]; then \ cat $@; \ mv $@ $(NONEMPTY_WARN_REPORT); \ - echo "Found one or more lint errors."; \ + echo "Compiler produced one or more warnings."; \ exit 1; \ fi; \ $(RM) $(NONEMPTY_WARN_REPORT); \ From 8a0ba0fd405ebdd1aa247695edf20b991b9e7b98 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Wed, 9 Jul 2014 14:25:55 -0700 Subject: [PATCH 0253/2053] use layer_param instead of layers_[layer_id]->layer_param() --- src/caffe/net.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index c0f124b0ea7..0b9cc8412cb 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -88,7 +88,7 @@ void Net::Init(const NetParameter& in_param) { << top_vecs_[layer_id][top_id]->count() << ")"; } DLOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); - const int blobs_lr_size = layers_[layer_id]->layer_param().blobs_lr_size(); + const int blobs_lr_size = layer_param.blobs_lr_size(); const int num_param_blobs = layers_[layer_id]->blobs().size(); CHECK(blobs_lr_size == num_param_blobs || blobs_lr_size == 0) << "Incorrect blobs lr size: should be either 0 " @@ -96,8 +96,7 @@ void Net::Init(const NetParameter& in_param) { if (blobs_lr_size) { // Check if this layer needs backward operation itself for (int param_id = 0; param_id < blobs_lr_size; ++param_id) { - need_backward |= - (layers_[layer_id]->layer_param().blobs_lr(param_id) > 0); + need_backward |= layer_param.blobs_lr(param_id) > 0; } } else if (layers_[layer_id]->blobs().size()) { // catch: if a layer param does not specify blobs_lr, we should assume the From b2a9a3c7fea3022cccecf1cd729b44db3fd9dffd Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Wed, 9 Jul 2014 14:47:46 -0700 Subject: [PATCH 0254/2053] Add param_propagate_down_ vector to layer, populate according to blobs_lr in Net::Init --- include/caffe/layer.hpp | 17 +++++++++++++++++ src/caffe/net.cpp | 12 +++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index b8afcfe37cf..d4d10aafa31 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -96,11 +96,28 @@ class Layer { return true; } + // param_propagate_down specifies whether the layer should compute gradients + // in Backward. You can safely ignore false and always compute gradients + // for all parameters, but possibly with wasteful computation. + inline bool param_propagate_down(const int param_id) { + return (param_propagate_down_.size() > param_id) ? + param_propagate_down_[param_id] : false; + } + inline void set_param_propagate_down(const int param_id, const bool value) { + if (param_propagate_down_.size() <= param_id) { + param_propagate_down_.resize(param_id + 1, true); + } + param_propagate_down_[param_id] = value; + } + + protected: // The protobuf that stores the layer parameters LayerParameter layer_param_; // The vector that stores the parameters as a set of blobs. vector > > blobs_; + // Vector indicating whether to compute the diff of each param blob. + vector param_propagate_down_; // Forward functions: compute the layer output // (and loss layers return the loss; other layers return the dummy value 0.) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 0b9cc8412cb..edea726fb51 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -96,12 +96,18 @@ void Net::Init(const NetParameter& in_param) { if (blobs_lr_size) { // Check if this layer needs backward operation itself for (int param_id = 0; param_id < blobs_lr_size; ++param_id) { - need_backward |= layer_param.blobs_lr(param_id) > 0; + const bool param_need_backward = layer_param.blobs_lr(param_id) > 0; + need_backward |= param_need_backward; + layers_[layer_id]->set_param_propagate_down(param_id, + param_need_backward); } } else if (layers_[layer_id]->blobs().size()) { // catch: if a layer param does not specify blobs_lr, we should assume the // learning rate to be 1. Thus we will need to perform backward. need_backward = true; + for (int param_id = 0; param_id < blobs_lr_size; ++param_id) { + layers_[layer_id]->set_param_propagate_down(param_id, true); + } } const int param_size = layer_param.param_size(); CHECK(param_size == num_param_blobs || param_size == 0) @@ -139,6 +145,10 @@ void Net::Init(const NetParameter& in_param) { blob_need_backward_[bottom_id_vecs_[layer_id][bottom_id]] || bottom_need_backward_[layer_id][bottom_id]; } + for (int param_id = 0; param_id < layers_[layer_id]->blobs().size(); + ++param_id) { + layers_[layer_id]->set_param_propagate_down(param_id, true); + } } } // In the end, all remaining blobs are considered output blobs. From d5351bc99eb40bcf2de750b5b3aeeb43cafce82f Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Wed, 9 Jul 2014 15:05:57 -0700 Subject: [PATCH 0255/2053] Make ConvolutionLayer and InnerProductLayer abide by param_propagate_down_ --- src/caffe/layers/conv_layer.cpp | 76 +++++++++++++---------- src/caffe/layers/conv_layer.cu | 78 ++++++++++++++---------- src/caffe/layers/inner_product_layer.cpp | 17 ++++-- src/caffe/layers/inner_product_layer.cu | 20 +++--- 4 files changed, 112 insertions(+), 79 deletions(-) diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 963dc688a0e..0d6871d6ac4 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -85,6 +85,7 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, bias_multiplier_data[i] = 1.; } } + this->param_propagate_down_.resize(this->blobs_.size(), true); } @@ -124,11 +125,15 @@ Dtype ConvolutionLayer::Forward_cpu(const vector*>& bottom, template void ConvolutionLayer::Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - const Dtype* weight = this->blobs_[0]->cpu_data(); - Dtype* weight_diff = this->blobs_[0]->mutable_cpu_diff(); - caffe_set(this->blobs_[0]->count(), Dtype(0), weight_diff); + const Dtype* weight = NULL; + Dtype* weight_diff = NULL; + if (this->param_propagate_down_[0]) { + weight = this->blobs_[0]->cpu_data(); + weight_diff = this->blobs_[0]->mutable_cpu_diff(); + caffe_set(this->blobs_[0]->count(), Dtype(0), weight_diff); + } Dtype* bias_diff = NULL; - if (bias_term_) { + if (bias_term_ && this->param_propagate_down_[1]) { bias_diff = this->blobs_[1]->mutable_cpu_diff(); caffe_set(this->blobs_[1]->count(), Dtype(0), bias_diff); } @@ -136,14 +141,10 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, const int col_offset = K_ * N_; const int top_offset = M_ * N_; for (int i = 0; i < top.size(); ++i) { - const Dtype* top_diff = top[i]->cpu_diff(); - const Dtype* bottom_data = (*bottom)[i]->cpu_data(); - Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); - Dtype* col_data = col_buffer_.mutable_cpu_data(); - Dtype* col_diff = col_buffer_.mutable_cpu_diff(); - + const Dtype* top_diff = NULL; // Bias gradient, if necessary. - if (bias_term_) { + if (bias_term_ && this->param_propagate_down_[1]) { + top_diff = top[i]->cpu_diff(); for (int n = 0; n < num_; ++n) { caffe_cpu_gemv(CblasNoTrans, num_output_, N_, 1., top_diff + top[0]->offset(n), @@ -151,29 +152,40 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, bias_diff); } } - for (int n = 0; n < num_; ++n) { - // Since we saved memory in the forward pass by not storing all col data, - // we will need to recompute them. - im2col_cpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, col_data); - // gradient w.r.t. weight. Note that we will accumulate diffs. - for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, - (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, - col_data + col_offset * g, (Dtype)1., - weight_diff + weight_offset * g); + if (this->param_propagate_down_[0] || propagate_down[i]) { + if (!top_diff) { + top_diff = top[i]->cpu_diff(); } - // gradient w.r.t. bottom data, if necessary - if (propagate_down[i]) { - for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, - (Dtype)1., weight + weight_offset * g, - top_diff + top[i]->offset(n) + top_offset * g, - (Dtype)0., col_diff + col_offset * g); + Dtype* col_data = col_buffer_.mutable_cpu_data(); + Dtype* col_diff = col_buffer_.mutable_cpu_diff(); + const Dtype* bottom_data = (*bottom)[i]->cpu_data(); + Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); + for (int n = 0; n < num_; ++n) { + // Since we saved memory in the forward pass by not storing all col + // data, we will need to recompute them. + im2col_cpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, + width_, kernel_size_, pad_, stride_, col_data); + // gradient w.r.t. weight. Note that we will accumulate diffs. + if (this->param_propagate_down_[0]) { + for (int g = 0; g < group_; ++g) { + caffe_cpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, + (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, + col_data + col_offset * g, (Dtype)1., + weight_diff + weight_offset * g); + } + } + // gradient w.r.t. bottom data, if necessary + if (propagate_down[i]) { + for (int g = 0; g < group_; ++g) { + caffe_cpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, + (Dtype)1., weight + weight_offset * g, + top_diff + top[i]->offset(n) + top_offset * g, + (Dtype)0., col_diff + col_offset * g); + } + // col2im back to the data + col2im_cpu(col_diff, channels_, height_, width_, kernel_size_, pad_, + stride_, bottom_diff + (*bottom)[i]->offset(n)); } - // col2im back to the data - col2im_cpu(col_diff, channels_, height_, width_, kernel_size_, pad_, - stride_, bottom_diff + (*bottom)[i]->offset(n)); } } } diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 59ec58dfebe..74067886c6a 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -46,13 +46,15 @@ Dtype ConvolutionLayer::Forward_gpu(const vector*>& bottom, template void ConvolutionLayer::Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - const Dtype* weight = this->blobs_[0]->gpu_data(); - Dtype* weight_diff = this->blobs_[0]->mutable_gpu_diff(); - caffe_gpu_set(this->blobs_[0]->count(), Dtype(0), weight_diff); - Dtype* col_data = col_buffer_.mutable_gpu_data(); - Dtype* col_diff = col_buffer_.mutable_gpu_diff(); + const Dtype* weight = NULL; + Dtype* weight_diff = NULL; + if (this->param_propagate_down_[0]) { + weight = this->blobs_[0]->gpu_data(); + weight_diff = this->blobs_[0]->mutable_gpu_diff(); + caffe_gpu_set(this->blobs_[0]->count(), Dtype(0), weight_diff); + } Dtype* bias_diff = NULL; - if (bias_term_) { + if (bias_term_ && this->param_propagate_down_[1]) { bias_diff = this->blobs_[1]->mutable_gpu_diff(); caffe_gpu_set(this->blobs_[1]->count(), Dtype(0), bias_diff); } @@ -60,41 +62,51 @@ void ConvolutionLayer::Backward_gpu(const vector*>& top, const int col_offset = K_ * N_; const int top_offset = M_ * N_; for (int i = 0; i < top.size(); ++i) { - const Dtype* top_diff = top[i]->gpu_diff(); - const Dtype* bottom_data = (*bottom)[i]->gpu_data(); - Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); + const Dtype* top_diff = NULL; // Bias gradient, if necessary. - if (bias_term_) { + if (bias_term_ && this->param_propagate_down_[1]) { + top_diff = top[i]->gpu_diff(); for (int n = 0; n < num_; ++n) { caffe_gpu_gemv(CblasNoTrans, num_output_, N_, 1., top_diff + top[0]->offset(n), - static_cast(bias_multiplier_->gpu_data()), - 1., bias_diff); + static_cast(bias_multiplier_->gpu_data()), 1., + bias_diff); } } - for (int n = 0; n < num_; ++n) { - // since we saved memory in the forward pass by not storing all col data, - // we will need to recompute them. - im2col_gpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, col_data); - // gradient w.r.t. weight. Note that we will accumulate diffs. - for (int g = 0; g < group_; ++g) { - caffe_gpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, - (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, - col_data + col_offset * g, (Dtype)1., - weight_diff + weight_offset * g); + if (this->param_propagate_down_[0] || propagate_down[i]) { + if (!top_diff) { + top_diff = top[i]->gpu_diff(); } - // gradient w.r.t. bottom data, if necessary - if (propagate_down[i]) { - for (int g = 0; g < group_; ++g) { - caffe_gpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, - (Dtype)1., weight + weight_offset * g, - top_diff + top[i]->offset(n) + top_offset * g, - (Dtype)0., col_diff + col_offset * g); + Dtype* col_data = col_buffer_.mutable_gpu_data(); + Dtype* col_diff = col_buffer_.mutable_gpu_diff(); + const Dtype* bottom_data = (*bottom)[i]->gpu_data(); + Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); + for (int n = 0; n < num_; ++n) { + // Since we saved memory in the forward pass by not storing all col + // data, we will need to recompute them. + im2col_gpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, + width_, kernel_size_, pad_, stride_, col_data); + // gradient w.r.t. weight. Note that we will accumulate diffs. + if (this->param_propagate_down_[0]) { + for (int g = 0; g < group_; ++g) { + caffe_gpu_gemm(CblasNoTrans, CblasTrans, M_, K_, N_, + (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, + col_data + col_offset * g, (Dtype)1., + weight_diff + weight_offset * g); + } + } + // gradient w.r.t. bottom data, if necessary + if (propagate_down[i]) { + for (int g = 0; g < group_; ++g) { + caffe_gpu_gemm(CblasTrans, CblasNoTrans, K_, N_, M_, + (Dtype)1., weight + weight_offset * g, + top_diff + top[i]->offset(n) + top_offset * g, + (Dtype)0., col_diff + col_offset * g); + } + // col2im back to the data + col2im_gpu(col_diff, channels_, height_, width_, kernel_size_, pad_, + stride_, bottom_diff + (*bottom)[i]->offset(n)); } - // col2im back to the data - col2im_gpu(col_diff, channels_, height_, width_, kernel_size_, pad_, - stride_, bottom_diff + (*bottom)[i]->offset(n)); } } } diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index ddf55e49b63..29df6bf2924 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -54,6 +54,7 @@ void InnerProductLayer::SetUp(const vector*>& bottom, bias_multiplier_data[i] = 1.; } } + this->param_propagate_down_.resize(this->blobs_.size(), true); } template @@ -76,18 +77,22 @@ template void InnerProductLayer::Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - const Dtype* top_diff = top[0]->cpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - // Gradient with respect to weight - caffe_cpu_gemm(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1., - top_diff, bottom_data, (Dtype)0., this->blobs_[0]->mutable_cpu_diff()); - if (bias_term_) { + if (this->param_propagate_down_[0]) { + const Dtype* top_diff = top[0]->cpu_diff(); + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + // Gradient with respect to weight + caffe_cpu_gemm(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1., + top_diff, bottom_data, (Dtype)0., this->blobs_[0]->mutable_cpu_diff()); + } + if (bias_term_ && this->param_propagate_down_[1]) { + const Dtype* top_diff = top[0]->cpu_diff(); // Gradient with respect to bias caffe_cpu_gemv(CblasTrans, M_, N_, (Dtype)1., top_diff, reinterpret_cast(bias_multiplier_->cpu_data()), (Dtype)0., this->blobs_[1]->mutable_cpu_diff()); } if (propagate_down[0]) { + const Dtype* top_diff = top[0]->cpu_diff(); // Gradient with respect to bottom data caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, M_, K_, N_, (Dtype)1., top_diff, this->blobs_[0]->cpu_data(), (Dtype)0., diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu index 5b95a57b23b..f3e494679d2 100644 --- a/src/caffe/layers/inner_product_layer.cu +++ b/src/caffe/layers/inner_product_layer.cu @@ -33,18 +33,22 @@ template void InnerProductLayer::Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - const Dtype* top_diff = top[0]->gpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - // Gradient with respect to weight - caffe_gpu_gemm(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1., - top_diff, bottom_data, (Dtype)0., this->blobs_[0]->mutable_gpu_diff()); - if (bias_term_) { + if (this->param_propagate_down_[0]) { + const Dtype* top_diff = top[0]->gpu_diff(); + const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + // Gradient with respect to weight + caffe_gpu_gemm(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1., + top_diff, bottom_data, (Dtype)0., this->blobs_[0]->mutable_gpu_diff()); + } + if (bias_term_ && this->param_propagate_down_[1]) { + const Dtype* top_diff = top[0]->gpu_diff(); // Gradient with respect to bias caffe_gpu_gemv(CblasTrans, M_, N_, (Dtype)1., top_diff, - reinterpret_cast(bias_multiplier_->gpu_data()), - (Dtype)0., this->blobs_[1]->mutable_gpu_diff()); + reinterpret_cast(bias_multiplier_->gpu_data()), (Dtype)0., + this->blobs_[1]->mutable_gpu_diff()); } if (propagate_down[0]) { + const Dtype* top_diff = top[0]->gpu_diff(); // Gradient with respect to bottom data caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, K_, N_, (Dtype)1., top_diff, this->blobs_[0]->gpu_data(), (Dtype)0., From fb8c0616f4827795f50e0b665805403eb3719966 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Wed, 9 Jul 2014 15:34:44 -0700 Subject: [PATCH 0256/2053] Use Blobs instead of SyncedMemorys for the bias_multiplier_'s. --- include/caffe/vision_layers.hpp | 4 ++-- src/caffe/layers/conv_layer.cpp | 12 ++++-------- src/caffe/layers/conv_layer.cu | 4 ++-- src/caffe/layers/inner_product_layer.cpp | 12 ++++-------- src/caffe/layers/inner_product_layer.cu | 4 ++-- 5 files changed, 14 insertions(+), 22 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 1016f761af5..c8b4609c20f 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -55,7 +55,7 @@ class ConvolutionLayer : public Layer { int num_output_; int group_; Blob col_buffer_; - shared_ptr bias_multiplier_; + shared_ptr > bias_multiplier_; bool bias_term_; int M_; int K_; @@ -157,7 +157,7 @@ class InnerProductLayer : public Layer { int K_; int N_; bool bias_term_; - shared_ptr bias_multiplier_; + shared_ptr > bias_multiplier_; }; // Forward declare PoolingLayer and SplitLayer for use in LRNLayer. diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 0d6871d6ac4..d7099e5511d 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -78,12 +78,8 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, } // Set up the bias filler if (bias_term_) { - bias_multiplier_.reset(new SyncedMemory(N_ * sizeof(Dtype))); - Dtype* bias_multiplier_data = - reinterpret_cast(bias_multiplier_->mutable_cpu_data()); - for (int i = 0; i < N_; ++i) { - bias_multiplier_data[i] = 1.; - } + bias_multiplier_.reset(new Blob(1, 1, 1, N_)); + caffe_set(N_, Dtype(1), bias_multiplier_->mutable_cpu_data()); } this->param_propagate_down_.resize(this->blobs_.size(), true); } @@ -114,7 +110,7 @@ Dtype ConvolutionLayer::Forward_cpu(const vector*>& bottom, if (bias_term_) { caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num_output_, N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), - reinterpret_cast(bias_multiplier_->cpu_data()), + bias_multiplier_->cpu_data(), (Dtype)1., top_data + (*top)[i]->offset(n)); } } @@ -148,7 +144,7 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, for (int n = 0; n < num_; ++n) { caffe_cpu_gemv(CblasNoTrans, num_output_, N_, 1., top_diff + top[0]->offset(n), - static_cast(bias_multiplier_->cpu_data()), 1., + bias_multiplier_->cpu_data(), 1., bias_diff); } } diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 74067886c6a..0b6e912b639 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -35,7 +35,7 @@ Dtype ConvolutionLayer::Forward_gpu(const vector*>& bottom, if (bias_term_) { caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num_output_, N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), - reinterpret_cast(bias_multiplier_->gpu_data()), + bias_multiplier_->gpu_data(), (Dtype)1., top_data + (*top)[i]->offset(n)); } } @@ -69,7 +69,7 @@ void ConvolutionLayer::Backward_gpu(const vector*>& top, for (int n = 0; n < num_; ++n) { caffe_gpu_gemv(CblasNoTrans, num_output_, N_, 1., top_diff + top[0]->offset(n), - static_cast(bias_multiplier_->gpu_data()), 1., + bias_multiplier_->gpu_data(), 1., bias_diff); } } diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index 29df6bf2924..a92b56a333c 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -47,12 +47,8 @@ void InnerProductLayer::SetUp(const vector*>& bottom, } // parameter initialization // Setting up the bias multiplier if (bias_term_) { - bias_multiplier_.reset(new SyncedMemory(M_ * sizeof(Dtype))); - Dtype* bias_multiplier_data = - reinterpret_cast(bias_multiplier_->mutable_cpu_data()); - for (int i = 0; i < M_; ++i) { - bias_multiplier_data[i] = 1.; - } + bias_multiplier_.reset(new Blob(1, 1, 1, M_)); + caffe_set(M_, Dtype(1), bias_multiplier_->mutable_cpu_data()); } this->param_propagate_down_.resize(this->blobs_.size(), true); } @@ -67,7 +63,7 @@ Dtype InnerProductLayer::Forward_cpu(const vector*>& bottom, bottom_data, weight, (Dtype)0., top_data); if (bias_term_) { caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, 1, (Dtype)1., - reinterpret_cast(bias_multiplier_->cpu_data()), + bias_multiplier_->cpu_data(), this->blobs_[1]->cpu_data(), (Dtype)1., top_data); } return Dtype(0); @@ -88,7 +84,7 @@ void InnerProductLayer::Backward_cpu(const vector*>& top, const Dtype* top_diff = top[0]->cpu_diff(); // Gradient with respect to bias caffe_cpu_gemv(CblasTrans, M_, N_, (Dtype)1., top_diff, - reinterpret_cast(bias_multiplier_->cpu_data()), (Dtype)0., + bias_multiplier_->cpu_data(), (Dtype)0., this->blobs_[1]->mutable_cpu_diff()); } if (propagate_down[0]) { diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu index f3e494679d2..453593cf552 100644 --- a/src/caffe/layers/inner_product_layer.cu +++ b/src/caffe/layers/inner_product_layer.cu @@ -23,7 +23,7 @@ Dtype InnerProductLayer::Forward_gpu(const vector*>& bottom, bottom_data, weight, (Dtype)0., top_data); if (bias_term_) { caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, 1, (Dtype)1., - reinterpret_cast(bias_multiplier_->gpu_data()), + bias_multiplier_->gpu_data(), this->blobs_[1]->gpu_data(), (Dtype)1., top_data); } return Dtype(0); @@ -44,7 +44,7 @@ void InnerProductLayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = top[0]->gpu_diff(); // Gradient with respect to bias caffe_gpu_gemv(CblasTrans, M_, N_, (Dtype)1., top_diff, - reinterpret_cast(bias_multiplier_->gpu_data()), (Dtype)0., + bias_multiplier_->gpu_data(), (Dtype)0., this->blobs_[1]->mutable_gpu_diff()); } if (propagate_down[0]) { From 5b974e05f28a4950fdf5aa6f7604ff207fe7684e Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 15 Jul 2014 13:15:36 -0700 Subject: [PATCH 0257/2053] Add Net Test to verify correct param_propagate_down behavior. --- src/caffe/test/test_net.cpp | 119 +++++++++++++++++++++++++++++++++--- 1 file changed, 111 insertions(+), 8 deletions(-) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 129d4447c41..cd6daeb6ade 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -14,6 +14,8 @@ #include "caffe/test/test_caffe_main.hpp" +using std::ostringstream; + namespace caffe { template @@ -216,8 +218,11 @@ class NetTest : public ::testing::Test { InitNetFromProtoString(proto); } - virtual void InitUnsharedWeightsNet() { - const string& proto = + virtual void InitUnsharedWeightsNet(const bool bias_term = false, + const Dtype blobs_lr_w1 = 1, const Dtype blobs_lr_b1 = 2, + const Dtype blobs_lr_w2 = 1, const Dtype blobs_lr_b2 = 2) { + ostringstream proto; + proto << "name: 'UnsharedWeightsNetwork' " "layers: { " " name: 'data' " @@ -236,16 +241,25 @@ class NetTest : public ::testing::Test { "} " "layers: { " " name: 'innerproduct1' " - " type: INNER_PRODUCT " + " type: INNER_PRODUCT " " inner_product_param { " " num_output: 10 " - " bias_term: false " + " bias_term: " << bias_term << " weight_filler { " " type: 'gaussian' " " std: 10 " " } " " } " - " param: 'unsharedweights1' " + " param: 'unsharedweights1' "; + if (bias_term) { + proto << " param: '' "; + } + proto << + " blobs_lr: " << blobs_lr_w1; + if (bias_term) { + proto << " blobs_lr: " << blobs_lr_b1; + } + proto << " bottom: 'data' " " top: 'innerproduct1' " "} " @@ -254,14 +268,23 @@ class NetTest : public ::testing::Test { " type: INNER_PRODUCT " " inner_product_param { " " num_output: 10 " - " bias_term: false " + " bias_term: " << bias_term << " weight_filler { " " type: 'gaussian' " " std: 10 " " } " " } " - " param: 'unsharedweights2' " + " param: 'unsharedweights2' "; + if (bias_term) { + proto << " param: '' "; + } + proto << " bottom: 'data' " + " blobs_lr: " << blobs_lr_w2; + if (bias_term) { + proto << " blobs_lr: " << blobs_lr_b2; + } + proto << " top: 'innerproduct2' " "} " "layers: { " @@ -270,7 +293,7 @@ class NetTest : public ::testing::Test { " bottom: 'innerproduct1' " " bottom: 'innerproduct2' " "} "; - InitNetFromProtoString(proto); + InitNetFromProtoString(proto.str()); } virtual void InitSharedWeightsNet() { @@ -698,4 +721,84 @@ TYPED_TEST(NetTest, TestSharedWeightsUpdate) { } } +TYPED_TEST(NetTest, TestParamPropagateDown) { + typedef typename TypeParam::Dtype Dtype; + vector*> bottom; + const bool kBiasTerm = true; + + // Run the net with all params learned; check that gradients are non-zero. + Caffe::set_random_seed(this->seed_); + Dtype blobs_lr_w1 = 1, blobs_lr_w2 = 1, blobs_lr_b1 = 2, blobs_lr_b2 = 2; + this->InitUnsharedWeightsNet(kBiasTerm, blobs_lr_w1, blobs_lr_w2, + blobs_lr_b1, blobs_lr_b2); + this->net_->Forward(bottom); + this->net_->Backward(); + const vector > >& params = this->net_->params(); + const int num_params = params.size(); + ASSERT_EQ(4, num_params); + const Dtype kNonZeroTestMin = 1e-3; + vector param_asums(params.size()); + for (int i = 0; i < num_params; ++i) { + const Dtype param_asum = + caffe_cpu_asum(params[i]->count(), params[i]->cpu_diff()); + param_asums[i] = param_asum; + EXPECT_GT(param_asum, kNonZeroTestMin); + } + + // Change the learning rates to different non-zero values; should see same + // gradients. + Caffe::set_random_seed(this->seed_); + blobs_lr_w1 *= 2, blobs_lr_w2 *= 2, blobs_lr_b1 *= 2, blobs_lr_b2 *= 2; + this->InitUnsharedWeightsNet(kBiasTerm, blobs_lr_w1, blobs_lr_w2, + blobs_lr_b1, blobs_lr_b2); + this->net_->Forward(bottom); + this->net_->Backward(); + const vector > >& params2 = this->net_->params(); + ASSERT_EQ(num_params, params2.size()); + for (int i = 0; i < num_params; ++i) { + const Dtype param_asum = + caffe_cpu_asum(params2[i]->count(), params2[i]->cpu_diff()); + EXPECT_EQ(param_asum, param_asums[i]); + } + + // Change a subset of the learning rates to zero; check that we see zero + // gradients for those. + Caffe::set_random_seed(this->seed_); + blobs_lr_w1 = 1, blobs_lr_w2 = 0, blobs_lr_b1 = 0, blobs_lr_b2 = 1; + this->InitUnsharedWeightsNet(kBiasTerm, blobs_lr_w1, blobs_lr_w2, + blobs_lr_b1, blobs_lr_b2); + this->net_->Forward(bottom); + this->net_->Backward(); + const vector > >& params3 = this->net_->params(); + ASSERT_EQ(num_params, params3.size()); + for (int i = 0; i < num_params; ++i) { + const Dtype param_asum = + caffe_cpu_asum(params3[i]->count(), params3[i]->cpu_diff()); + if (i == 1 || i == 2) { + EXPECT_EQ(0, param_asum); + } else { + EXPECT_EQ(param_asum, param_asums[i]); + } + } + + // Change the opposite subset of the learning rates to zero. + Caffe::set_random_seed(this->seed_); + blobs_lr_w1 = 0, blobs_lr_w2 = 1, blobs_lr_b1 = 1, blobs_lr_b2 = 0; + this->InitUnsharedWeightsNet(kBiasTerm, blobs_lr_w1, blobs_lr_w2, + blobs_lr_b1, blobs_lr_b2); + this->net_->Forward(bottom); + this->net_->Backward(); + const vector > >& params4 = this->net_->params(); + ASSERT_EQ(num_params, params4.size()); + for (int i = 0; i < num_params; ++i) { + const Dtype param_asum = + caffe_cpu_asum(params4[i]->count(), params4[i]->cpu_diff()); + if (i == 0 || i == 3) { + EXPECT_EQ(0, param_asum); + } else { + EXPECT_EQ(param_asum, param_asums[i]); + } + } +} + } // namespace caffe From 53825cd3c71fb044d1ee1683f2041d5b4a65b9cc Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 15 Jul 2014 15:12:51 -0700 Subject: [PATCH 0258/2053] Another bugfix related to my CPU/GPU test changes: make NetTest a MultiDeviceTest (Caffe:set_mode(Caffe::CPU/GPU) isn't run without this). --- src/caffe/test/test_net.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index cd6daeb6ade..c30f4168edc 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -19,7 +19,7 @@ using std::ostringstream; namespace caffe { template -class NetTest : public ::testing::Test { +class NetTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; protected: From 7dccb008c1422acf4a51036bea49c274788dc939 Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Wed, 16 Jul 2014 16:15:09 -0700 Subject: [PATCH 0259/2053] move using statements inside namespace caffe to avoid polluting the whole name space. --- include/caffe/layer.hpp | 4 ++-- include/caffe/net.hpp | 5 ++--- include/caffe/util/insert_splits.hpp | 4 ++-- include/caffe/util/io.hpp | 6 +++--- include/caffe/util/upgrade_proto.hpp | 4 ++-- src/caffe/layer_factory.cpp | 3 +-- src/caffe/layers/accuracy_layer.cpp | 3 ++- src/caffe/layers/bnll_layer.cpp | 4 ++-- src/caffe/layers/bnll_layer.cu | 4 ++-- src/caffe/layers/data_layer.cpp | 2 -- src/caffe/layers/data_layer.cu | 2 -- src/caffe/layers/hdf5_data_layer.cu | 2 -- src/caffe/layers/image_data_layer.cpp | 5 ++--- src/caffe/layers/image_data_layer.cu | 5 ++--- src/caffe/layers/window_data_layer.cpp | 7 +++---- src/caffe/layers/window_data_layer.cu | 7 +++---- 16 files changed, 28 insertions(+), 39 deletions(-) diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index d4d10aafa31..3e386b362c8 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -10,11 +10,11 @@ #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" +namespace caffe { + using std::string; using std::vector; -namespace caffe { - template class Layer { public: diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index cbd5becde2d..ce82e28602c 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -14,15 +14,14 @@ #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" +namespace caffe { + using std::map; using std::pair; using std::set; using std::string; using std::vector; -namespace caffe { - - template class Net { public: diff --git a/include/caffe/util/insert_splits.hpp b/include/caffe/util/insert_splits.hpp index e25cdd7faf1..45c3a051021 100644 --- a/include/caffe/util/insert_splits.hpp +++ b/include/caffe/util/insert_splits.hpp @@ -7,11 +7,11 @@ #include "caffe/proto/caffe.pb.h" +namespace caffe { + using std::pair; using std::string; -namespace caffe { - // Copy NetParameters with SplitLayers added to replace any shared bottom // blobs with unique bottom blobs provided by the SplitLayer. void InsertSplits(const NetParameter& param, NetParameter* param_split); diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 4458096ef78..accb0947a9c 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -12,13 +12,13 @@ #include "caffe/blob.hpp" -using std::string; -using ::google::protobuf::Message; - #define HDF5_NUM_DIMS 4 namespace caffe { +using std::string; +using ::google::protobuf::Message; + bool ReadProtoFromTextFile(const char* filename, Message* proto); inline bool ReadProtoFromTextFile(const string& filename, Message* proto) { diff --git a/include/caffe/util/upgrade_proto.hpp b/include/caffe/util/upgrade_proto.hpp index a1ac060970f..0772f803057 100644 --- a/include/caffe/util/upgrade_proto.hpp +++ b/include/caffe/util/upgrade_proto.hpp @@ -8,10 +8,10 @@ #include "caffe/proto/caffe.pb.h" #include "caffe/proto/caffe_pretty_print.pb.h" -using std::string; - namespace caffe { +using std::string; + // Return true iff any layer contains parameters specified using // deprecated V0LayerParameter. bool NetNeedsUpgrade(const NetParameter& net_param); diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index d6e506dfb9f..173c870f6ae 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -9,10 +9,9 @@ #include "caffe/vision_layers.hpp" #include "caffe/proto/caffe.pb.h" -using std::string; - namespace caffe { +using std::string; // A function to get a specific layer from the specification given in // LayerParameter. Ideally this would be replaced by a factory pattern, diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 409965519ca..ddfe38ab38e 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -10,10 +10,11 @@ #include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" -using std::max; namespace caffe { +using std::max; + template void AccuracyLayer::SetUp( const vector*>& bottom, vector*>* top) { diff --git a/src/caffe/layers/bnll_layer.cpp b/src/caffe/layers/bnll_layer.cpp index 95e6bd8748c..a00de9e302e 100644 --- a/src/caffe/layers/bnll_layer.cpp +++ b/src/caffe/layers/bnll_layer.cpp @@ -6,10 +6,10 @@ #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -using std::min; - namespace caffe { +using std::min; + const float kBNLL_THRESHOLD = 50.; template diff --git a/src/caffe/layers/bnll_layer.cu b/src/caffe/layers/bnll_layer.cu index 7849d11c25d..8fbe7f79eed 100644 --- a/src/caffe/layers/bnll_layer.cu +++ b/src/caffe/layers/bnll_layer.cu @@ -6,10 +6,10 @@ #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -using std::max; - namespace caffe { +using std::max; + const float kBNLL_THRESHOLD = 50.; template diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 29c4fec8ca4..5ff1a440d64 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -14,8 +14,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/proto/caffe.pb.h" -using std::string; - namespace caffe { template diff --git a/src/caffe/layers/data_layer.cu b/src/caffe/layers/data_layer.cu index 40316a16772..4409f47f21c 100644 --- a/src/caffe/layers/data_layer.cu +++ b/src/caffe/layers/data_layer.cu @@ -11,8 +11,6 @@ #include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" -using std::string; - namespace caffe { template diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu index 3c27f37e360..d50d9616771 100644 --- a/src/caffe/layers/hdf5_data_layer.cu +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -15,8 +15,6 @@ TODO: #include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" -using std::string; - namespace caffe { template diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 1f7368e7e4d..90ecadfd335 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -16,12 +16,11 @@ #include "caffe/util/rng.hpp" #include "caffe/vision_layers.hpp" +namespace caffe { + using std::iterator; -using std::string; using std::pair; -namespace caffe { - template void* ImageDataLayerPrefetch(void* layer_pointer) { CHECK(layer_pointer); diff --git a/src/caffe/layers/image_data_layer.cu b/src/caffe/layers/image_data_layer.cu index dd5bdbc2068..2b8c8ed0a35 100644 --- a/src/caffe/layers/image_data_layer.cu +++ b/src/caffe/layers/image_data_layer.cu @@ -16,11 +16,10 @@ #include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" -using std::string; -using std::pair; - namespace caffe { +using std::pair; + template Dtype ImageDataLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 5dbdff330ff..53467e8d55c 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -22,16 +22,15 @@ #include "caffe/util/rng.hpp" #include "caffe/vision_layers.hpp" -using std::string; -using std::map; -using std::pair; - // caffe.proto > LayerParameter > WindowDataParameter // 'source' field specifies the window_file // 'crop_size' indicates the desired warped size namespace caffe { +using std::map; +using std::pair; + template void* WindowDataLayerPrefetch(void* layer_pointer) { WindowDataLayer* layer = diff --git a/src/caffe/layers/window_data_layer.cu b/src/caffe/layers/window_data_layer.cu index ca664fcef41..d4efeca06c1 100644 --- a/src/caffe/layers/window_data_layer.cu +++ b/src/caffe/layers/window_data_layer.cu @@ -12,16 +12,15 @@ #include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" -using std::string; -using std::map; -using std::pair; - // caffe.proto > LayerParameter > WindowDataParameter // 'source' field specifies the window_file // 'crop_size' indicates the desired warped size namespace caffe { +using std::map; +using std::pair; + template Dtype WindowDataLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { From b3ba56b23e8447ff4b50b3aa7d873572612fcabf Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Wed, 16 Jul 2014 16:22:52 -0700 Subject: [PATCH 0260/2053] neuron_layers.hpp should not need to include leveldb --- include/caffe/neuron_layers.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index e52e395e24b..070b89044d0 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -7,7 +7,6 @@ #include #include -#include "leveldb/db.h" #include "pthread.h" #include "boost/scoped_ptr.hpp" #include "hdf5.h" From b6d881d1e7eeb75515e70254fc5168f7854f7c42 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 29 Jun 2014 20:45:41 -0700 Subject: [PATCH 0261/2053] configure Makefile for CPU-only build --- Makefile | 16 +++++++++++++--- Makefile.config.example | 3 +++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index ad13bb949e7..ef3aa4ba3f3 100644 --- a/Makefile +++ b/Makefile @@ -202,6 +202,16 @@ ifeq ($(LINUX), 1) endif endif +# CPU-only configuration +ifeq ($(CPU_ONLY), 1) + OBJS := $(PROTO_OBJS) $(CXX_OBJS) + TEST_OBJS := $(TEST_CXX_OBJS) + TEST_BINS := $(TEST_CXX_BINS) + ALL_WARNS := $(ALL_CXX_WARNS) + TEST_FILTER := --gtest_filter="-*GPU*:*/2.*:*/3.*" + COMMON_FLAGS += -DCPU_ONLY +endif + # OS X: # clang++ instead of g++ # libstdc++ instead of libc++ for CUDA compatibility on 10.9 @@ -222,9 +232,9 @@ endif # Debugging ifeq ($(DEBUG), 1) - COMMON_FLAGS := -DDEBUG -g -O0 + COMMON_FLAGS += -DDEBUG -g -O0 else - COMMON_FLAGS := -DNDEBUG -O2 + COMMON_FLAGS += -DNDEBUG -O2 endif # BLAS configuration (default = ATLAS) @@ -342,7 +352,7 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) @ echo runtest: $(TEST_ALL_BIN) - $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle + $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) runtestnogpu: $(TEST_ALL_BIN) $(TEST_ALL_BIN) --gtest_shuffle --gtest_filter="-*GPU*:*/2.*:*/3.*" diff --git a/Makefile.config.example b/Makefile.config.example index 17c90016f75..708a39c7841 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -1,6 +1,9 @@ ## Refer to http://caffe.berkeleyvision.org/installation.html # Contributions simplifying and improving our build system are welcome! +# CPU-only switch (uncomment to build without GPU support). +# CPU_ONLY := 1 + # To customize your choice of compiler, uncomment and set the following. # N.B. the default for Linux is g++ and the default for OSX is clang++ # CUSTOM_CXX := g++ From 41e063f77647a489aaabb26d795e27c8850a816f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 29 Jun 2014 20:47:40 -0700 Subject: [PATCH 0262/2053] stub out GPU layer methods to crash loudly in CPU-only mode --- include/caffe/layer.hpp | 1 + include/caffe/util/cpu_only.hpp | 37 +++++++++++++++++++ src/caffe/layers/bnll_layer.cpp | 3 ++ src/caffe/layers/concat_layer.cpp | 4 ++ src/caffe/layers/conv_layer.cpp | 4 ++ src/caffe/layers/data_layer.cpp | 4 ++ src/caffe/layers/dropout_layer.cpp | 4 ++ src/caffe/layers/eltwise_layer.cpp | 4 ++ src/caffe/layers/euclidean_loss_layer.cpp | 4 ++ src/caffe/layers/flatten_layer.cpp | 4 ++ src/caffe/layers/hdf5_data_layer.cpp | 4 ++ src/caffe/layers/hdf5_output_layer.cpp | 4 ++ src/caffe/layers/im2col_layer.cpp | 4 ++ src/caffe/layers/image_data_layer.cpp | 4 ++ src/caffe/layers/inner_product_layer.cpp | 4 ++ src/caffe/layers/lrn_layer.cpp | 6 +++ src/caffe/layers/pooling_layer.cpp | 4 ++ src/caffe/layers/power_layer.cpp | 4 ++ src/caffe/layers/relu_layer.cpp | 4 ++ src/caffe/layers/relu_layer.cu | 1 + .../sigmoid_cross_entropy_loss_layer.cpp | 4 ++ src/caffe/layers/sigmoid_layer.cpp | 4 ++ src/caffe/layers/softmax_layer.cpp | 4 ++ src/caffe/layers/softmax_loss_layer.cpp | 4 ++ src/caffe/layers/split_layer.cpp | 4 ++ src/caffe/layers/tanh_layer.cpp | 4 ++ src/caffe/layers/threshold_layer.cpp | 4 ++ src/caffe/layers/window_data_layer.cpp | 4 ++ 28 files changed, 140 insertions(+) create mode 100644 include/caffe/util/cpu_only.hpp diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index d4d10aafa31..31689a4fe6f 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -9,6 +9,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/cpu_only.hpp" using std::string; using std::vector; diff --git a/include/caffe/util/cpu_only.hpp b/include/caffe/util/cpu_only.hpp new file mode 100644 index 00000000000..1ae6ec9dac2 --- /dev/null +++ b/include/caffe/util/cpu_only.hpp @@ -0,0 +1,37 @@ +// Copyright 2014 BVLC and contributors. + +#ifndef CAFFE_UTIL_CPU_ONLY_H_ +#define CAFFE_UTIL_CPU_ONLY_H_ + +#include + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" + +// For CPU-only Caffe, stub out GPU calls as unavailable. +#ifdef CPU_ONLY + +#define NO_GPU LOG(FATAL) << "CPU-only Mode" + +#define STUB_GPU(classname) \ +template \ +Dtype classname::Forward_gpu(const vector*>& bottom, \ + vector*>* top) { NO_GPU; } \ +template \ +void classname::Backward_gpu(const vector*>& top, \ + const vector& propagate_down, \ + vector*>* bottom) { NO_GPU; } \ + +#define STUB_GPU_FORWARD(classname, funcname) \ +template \ +Dtype classname::funcname##_##gpu(const vector*>& bottom, \ + vector*>* top) { NO_GPU; } \ + +#define STUB_GPU_BACKWARD(classname, funcname) \ +template \ +void classname::funcname##_##gpu(const vector*>& top, \ + const vector& propagate_down, \ + vector*>* bottom) { NO_GPU; } \ + +#endif // CPU_ONLY +#endif // CAFFE_UTIL_CPU_ONLY_H_ diff --git a/src/caffe/layers/bnll_layer.cpp b/src/caffe/layers/bnll_layer.cpp index 95e6bd8748c..0e30b8aacbf 100644 --- a/src/caffe/layers/bnll_layer.cpp +++ b/src/caffe/layers/bnll_layer.cpp @@ -43,6 +43,9 @@ void BNLLLayer::Backward_cpu(const vector*>& top, } } +#ifdef CPU_ONLY +STUB_GPU(BNLLLayer); +#endif INSTANTIATE_CLASS(BNLLLayer); diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index 4c894ddffc4..dd899a57c85 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -100,6 +100,10 @@ void ConcatLayer::Backward_cpu(const vector*>& top, } // concat_dim_ is guaranteed to be 0 or 1 by SetUp. } +#ifdef CPU_ONLY +STUB_GPU(ConcatLayer); +#endif + INSTANTIATE_CLASS(ConcatLayer); } // namespace caffe diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index d7099e5511d..e8f08c7e3cd 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -187,6 +187,10 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, } } +#ifdef CPU_ONLY +STUB_GPU(ConvolutionLayer); +#endif + INSTANTIATE_CLASS(ConvolutionLayer); } // namespace caffe diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 29c4fec8ca4..e9ec15c501c 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -362,6 +362,10 @@ Dtype DataLayer::Forward_cpu(const vector*>& bottom, return Dtype(0.); } +#ifdef CPU_ONLY +STUB_GPU_FORWARD(DataLayer, Forward); +#endif + INSTANTIATE_CLASS(DataLayer); } // namespace caffe diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index a3501bf518c..a9372977693 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -65,6 +65,10 @@ void DropoutLayer::Backward_cpu(const vector*>& top, } +#ifdef CPU_ONLY +STUB_GPU(DropoutLayer); +#endif + INSTANTIATE_CLASS(DropoutLayer); diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 2c265f6678f..44bad932a11 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -94,6 +94,10 @@ void EltwiseLayer::Backward_cpu(const vector*>& top, } } +#ifdef CPU_ONLY +STUB_GPU(EltwiseLayer); +#endif + INSTANTIATE_CLASS(EltwiseLayer); diff --git a/src/caffe/layers/euclidean_loss_layer.cpp b/src/caffe/layers/euclidean_loss_layer.cpp index 2478a514cac..43e9989f513 100644 --- a/src/caffe/layers/euclidean_loss_layer.cpp +++ b/src/caffe/layers/euclidean_loss_layer.cpp @@ -52,6 +52,10 @@ void EuclideanLossLayer::Backward_cpu(const vector*>& top, } } +#ifdef CPU_ONLY +STUB_GPU(EuclideanLossLayer); +#endif + INSTANTIATE_CLASS(EuclideanLossLayer); } // namespace caffe diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index 9494da9a255..7e106d26f79 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -33,6 +33,10 @@ void FlattenLayer::Backward_cpu(const vector*>& top, (*bottom)[0]->ShareDiff(*top[0]); } +#ifdef CPU_ONLY +STUB_GPU(FlattenLayer); +#endif + INSTANTIATE_CLASS(FlattenLayer); } // namespace caffe diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 2ba7fa77f45..81cfdc096df 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -114,6 +114,10 @@ Dtype HDF5DataLayer::Forward_cpu(const vector*>& bottom, return Dtype(0.); } +#ifdef CPU_ONLY +STUB_GPU_FORWARD(HDF5DataLayer, Forward); +#endif + INSTANTIATE_CLASS(HDF5DataLayer); } // namespace caffe diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index 8307ad7c184..ffa240f15cc 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -69,6 +69,10 @@ void HDF5OutputLayer::Backward_cpu(const vector*>& top, return; } +#ifdef CPU_ONLY +STUB_GPU(HDF5OutputLayer); +#endif + INSTANTIATE_CLASS(HDF5OutputLayer); } // namespace caffe diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index e047dfb80a7..2c86412bb15 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -47,6 +47,10 @@ void Im2colLayer::Backward_cpu(const vector*>& top, } } +#ifdef CPU_ONLY +STUB_GPU(Im2colLayer); +#endif + INSTANTIATE_CLASS(Im2colLayer); } // namespace caffe diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 1f7368e7e4d..9d09d3c4583 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -287,6 +287,10 @@ Dtype ImageDataLayer::Forward_cpu(const vector*>& bottom, return Dtype(0.); } +#ifdef CPU_ONLY +STUB_GPU_FORWARD(ImageDataLayer, Forward); +#endif + INSTANTIATE_CLASS(ImageDataLayer); } // namespace caffe diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index a92b56a333c..4da8578d76f 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -96,6 +96,10 @@ void InnerProductLayer::Backward_cpu(const vector*>& top, } } +#ifdef CPU_ONLY +STUB_GPU(InnerProductLayer); +#endif + INSTANTIATE_CLASS(InnerProductLayer); } // namespace caffe diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index 2bda0430c15..0e2df2ff4bb 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -256,6 +256,12 @@ void LRNLayer::WithinChannelBackward( } } +#ifdef CPU_ONLY +STUB_GPU(LRNLayer); +STUB_GPU_FORWARD(LRNLayer, CrossChannelForward); +STUB_GPU_BACKWARD(LRNLayer, CrossChannelBackward); +#endif + INSTANTIATE_CLASS(LRNLayer); diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 9151ff23674..d6fef07ba46 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -296,6 +296,10 @@ void PoolingLayer::Backward_cpu(const vector*>& top, } +#ifdef CPU_ONLY +STUB_GPU(PoolingLayer); +#endif + INSTANTIATE_CLASS(PoolingLayer); diff --git a/src/caffe/layers/power_layer.cpp b/src/caffe/layers/power_layer.cpp index 5ff3392968e..4607457a460 100644 --- a/src/caffe/layers/power_layer.cpp +++ b/src/caffe/layers/power_layer.cpp @@ -99,6 +99,10 @@ void PowerLayer::Backward_cpu(const vector*>& top, } } +#ifdef CPU_ONLY +STUB_GPU(PowerLayer); +#endif + INSTANTIATE_CLASS(PowerLayer); diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index d7a8509b247..6d6017442d4 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -38,6 +38,10 @@ void ReLULayer::Backward_cpu(const vector*>& top, } +#ifdef CPU_ONLY +STUB_GPU(ReLULayer); +#endif + INSTANTIATE_CLASS(ReLULayer); diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index a5b24afab60..2ad689126a3 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -59,6 +59,7 @@ void ReLULayer::Backward_gpu(const vector*>& top, } } + INSTANTIATE_CLASS(ReLULayer); diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index 8cb830ff248..074fa6cef3c 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -68,6 +68,10 @@ void SigmoidCrossEntropyLossLayer::Backward_cpu( } } +#ifdef CPU_ONLY +STUB_GPU(SigmoidCrossEntropyLossLayer); +#endif + INSTANTIATE_CLASS(SigmoidCrossEntropyLossLayer); diff --git a/src/caffe/layers/sigmoid_layer.cpp b/src/caffe/layers/sigmoid_layer.cpp index 50139d863dd..e25db04c42a 100644 --- a/src/caffe/layers/sigmoid_layer.cpp +++ b/src/caffe/layers/sigmoid_layer.cpp @@ -42,6 +42,10 @@ void SigmoidLayer::Backward_cpu(const vector*>& top, } } +#ifdef CPU_ONLY +STUB_GPU(SigmoidLayer); +#endif + INSTANTIATE_CLASS(SigmoidLayer); diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 5d60d9df1ba..665cfaec3ad 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -82,6 +82,10 @@ void SoftmaxLayer::Backward_cpu(const vector*>& top, } +#ifdef CPU_ONLY +STUB_GPU(SoftmaxLayer); +#endif + INSTANTIATE_CLASS(SoftmaxLayer); diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 37c5ebc45be..c87270eab22 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -79,6 +79,10 @@ void SoftmaxWithLossLayer::Backward_cpu(const vector*>& top, } +#ifdef CPU_ONLY +STUB_GPU(SoftmaxWithLossLayer); +#endif + INSTANTIATE_CLASS(SoftmaxWithLossLayer); diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index 28abd95f5ff..6bae4ef22fb 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -50,6 +50,10 @@ void SplitLayer::Backward_cpu(const vector*>& top, } +#ifdef CPU_ONLY +STUB_GPU(SplitLayer); +#endif + INSTANTIATE_CLASS(SplitLayer); } // namespace caffe diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp index 6b5166d53e9..0a6ec68d1f9 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -41,6 +41,10 @@ void TanHLayer::Backward_cpu(const vector*>& top, } } +#ifdef CPU_ONLY +STUB_GPU(TanHLayer); +#endif + INSTANTIATE_CLASS(TanHLayer); } // namespace caffe diff --git a/src/caffe/layers/threshold_layer.cpp b/src/caffe/layers/threshold_layer.cpp index e6ed8a6b40e..2c8546c957a 100644 --- a/src/caffe/layers/threshold_layer.cpp +++ b/src/caffe/layers/threshold_layer.cpp @@ -27,6 +27,10 @@ Dtype ThresholdLayer::Forward_cpu(const vector*>& bottom, return Dtype(0); } +#ifdef CPU_ONLY +STUB_GPU_FORWARD(ThresholdLayer, Forward); +#endif + INSTANTIATE_CLASS(ThresholdLayer); } // namespace caffe diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 5dbdff330ff..51e0dc09e35 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -453,6 +453,10 @@ Dtype WindowDataLayer::Forward_cpu(const vector*>& bottom, return Dtype(0.); } +#ifdef CPU_ONLY +STUB_GPU_FORWARD(WindowDataLayer, Forward); +#endif + INSTANTIATE_CLASS(WindowDataLayer); } // namespace caffe From b882c3b4707eeb072a04490c6f36bd7c4deb03df Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 29 Jun 2014 21:11:44 -0700 Subject: [PATCH 0263/2053] add guards to drop GPU code in CPU-only mode --- Makefile | 2 +- include/caffe/test/test_caffe_main.hpp | 8 ++ src/caffe/net.cpp | 2 + src/caffe/test/test_math_functions.cpp | 129 +++++++++--------- .../test/test_random_number_generator.cpp | 42 +++--- 5 files changed, 102 insertions(+), 81 deletions(-) diff --git a/Makefile b/Makefile index ef3aa4ba3f3..69f2c30e49c 100644 --- a/Makefile +++ b/Makefile @@ -208,7 +208,7 @@ ifeq ($(CPU_ONLY), 1) TEST_OBJS := $(TEST_CXX_OBJS) TEST_BINS := $(TEST_CXX_BINS) ALL_WARNS := $(ALL_CXX_WARNS) - TEST_FILTER := --gtest_filter="-*GPU*:*/2.*:*/3.*" + TEST_FILTER := --gtest_filter="-*GPU*" COMMON_FLAGS += -DCPU_ONLY endif diff --git a/include/caffe/test/test_caffe_main.hpp b/include/caffe/test/test_caffe_main.hpp index e1a76455bed..3541c0b2c8a 100644 --- a/include/caffe/test/test_caffe_main.hpp +++ b/include/caffe/test/test_caffe_main.hpp @@ -44,6 +44,12 @@ struct DoubleCPU { static const Caffe::Brew device = Caffe::CPU; }; +#ifdef CPU_ONLY + +typedef ::testing::Types TestDtypesAndDevices; + +#else + struct FloatGPU { typedef float Dtype; static const Caffe::Brew device = Caffe::GPU; @@ -57,6 +63,8 @@ struct DoubleGPU { typedef ::testing::Types TestDtypesAndDevices; +#endif + } // namespace caffe #endif // CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index edea726fb51..aba4cc2f4f2 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -498,11 +498,13 @@ void Net::Update() { owner_diff = params_[param_owners_[i]]->mutable_cpu_diff(); caffe_add(count, this_diff, owner_diff, owner_diff); break; +#ifndef CPU_ONLY case Caffe::GPU: this_diff = params_[i]->gpu_diff(); owner_diff = params_[param_owners_[i]]->mutable_gpu_diff(); caffe_gpu_add(count, this_diff, owner_diff, owner_diff); break; +#endif default: LOG(FATAL) << "Unknown caffe mode: " << Caffe::mode(); } diff --git a/src/caffe/test/test_math_functions.cpp b/src/caffe/test/test_math_functions.cpp index 2a70c9c4aba..502b77e07a8 100644 --- a/src/caffe/test/test_math_functions.cpp +++ b/src/caffe/test/test_math_functions.cpp @@ -80,18 +80,6 @@ TYPED_TEST(MathFunctionsTest, TestHammingDistanceCPU) { caffe_cpu_hamming_distance(n, x, y)); } -// TODO: Fix caffe_gpu_hamming_distance and re-enable this test. -TYPED_TEST(MathFunctionsTest, DISABLED_TestHammingDistanceGPU) { - int n = this->blob_bottom_->count(); - const TypeParam* x = this->blob_bottom_->cpu_data(); - const TypeParam* y = this->blob_top_->cpu_data(); - int reference_distance = this->ReferenceHammingDistance(n, x, y); - x = this->blob_bottom_->gpu_data(); - y = this->blob_top_->gpu_data(); - int computed_distance = caffe_gpu_hamming_distance(n, x, y); - EXPECT_EQ(reference_distance, computed_distance); -} - TYPED_TEST(MathFunctionsTest, TestAsumCPU) { int n = this->blob_bottom_->count(); const TypeParam* x = this->blob_bottom_->cpu_data(); @@ -103,91 +91,116 @@ TYPED_TEST(MathFunctionsTest, TestAsumCPU) { EXPECT_LT((cpu_asum - std_asum) / std_asum, 1e-2); } -TYPED_TEST(MathFunctionsTest, TestAsumGPU) { +TYPED_TEST(MathFunctionsTest, TestSignCPU) { int n = this->blob_bottom_->count(); const TypeParam* x = this->blob_bottom_->cpu_data(); - TypeParam std_asum = 0; + caffe_cpu_sign(n, x, this->blob_bottom_->mutable_cpu_diff()); + const TypeParam* signs = this->blob_bottom_->cpu_diff(); for (int i = 0; i < n; ++i) { - std_asum += std::fabs(x[i]); + EXPECT_EQ(signs[i], x[i] > 0 ? 1 : (x[i] < 0 ? -1 : 0)); } - TypeParam gpu_asum; - caffe_gpu_asum(n, this->blob_bottom_->gpu_data(), &gpu_asum); - EXPECT_LT((gpu_asum - std_asum) / std_asum, 1e-2); } -TYPED_TEST(MathFunctionsTest, TestSignCPU) { +TYPED_TEST(MathFunctionsTest, TestSgnbitCPU) { int n = this->blob_bottom_->count(); const TypeParam* x = this->blob_bottom_->cpu_data(); - caffe_cpu_sign(n, x, this->blob_bottom_->mutable_cpu_diff()); - const TypeParam* signs = this->blob_bottom_->cpu_diff(); + caffe_cpu_sgnbit(n, x, this->blob_bottom_->mutable_cpu_diff()); + const TypeParam* signbits = this->blob_bottom_->cpu_diff(); for (int i = 0; i < n; ++i) { - EXPECT_EQ(signs[i], x[i] > 0 ? 1 : (x[i] < 0 ? -1 : 0)); + EXPECT_EQ(signbits[i], x[i] < 0 ? 1 : 0); } } -TYPED_TEST(MathFunctionsTest, TestSignGPU) { +TYPED_TEST(MathFunctionsTest, TestFabsCPU) { int n = this->blob_bottom_->count(); - caffe_gpu_sign(n, this->blob_bottom_->gpu_data(), - this->blob_bottom_->mutable_gpu_diff()); - const TypeParam* signs = this->blob_bottom_->cpu_diff(); const TypeParam* x = this->blob_bottom_->cpu_data(); + caffe_cpu_fabs(n, x, this->blob_bottom_->mutable_cpu_diff()); + const TypeParam* abs_val = this->blob_bottom_->cpu_diff(); for (int i = 0; i < n; ++i) { - EXPECT_EQ(signs[i], x[i] > 0 ? 1 : (x[i] < 0 ? -1 : 0)); + EXPECT_EQ(abs_val[i], x[i] > 0 ? x[i] : -x[i]); } } -TYPED_TEST(MathFunctionsTest, TestSgnbitCPU) { +TYPED_TEST(MathFunctionsTest, TestScaleCPU) { int n = this->blob_bottom_->count(); + TypeParam alpha = this->blob_bottom_->cpu_diff()[caffe_rng_rand() % + this->blob_bottom_->count()]; + caffe_cpu_scale(n, alpha, this->blob_bottom_->cpu_data(), + this->blob_bottom_->mutable_cpu_diff()); + const TypeParam* scaled = this->blob_bottom_->cpu_diff(); const TypeParam* x = this->blob_bottom_->cpu_data(); - caffe_cpu_sgnbit(n, x, this->blob_bottom_->mutable_cpu_diff()); - const TypeParam* signbits = this->blob_bottom_->cpu_diff(); for (int i = 0; i < n; ++i) { - EXPECT_EQ(signbits[i], x[i] < 0 ? 1 : 0); + EXPECT_EQ(scaled[i], x[i] * alpha); } } -TYPED_TEST(MathFunctionsTest, TestSgnbitGPU) { +TYPED_TEST(MathFunctionsTest, TestCopyCPU) { + const int n = this->blob_bottom_->count(); + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + TypeParam* top_data = this->blob_top_->mutable_cpu_data(); + Caffe::set_mode(Caffe::CPU); + caffe_copy(n, bottom_data, top_data); + for (int i = 0; i < n; ++i) { + EXPECT_EQ(bottom_data[i], top_data[i]); + } +} + +#ifndef CPU_ONLY + +// TODO: Fix caffe_gpu_hamming_distance and re-enable this test. +TYPED_TEST(MathFunctionsTest, DISABLED_TestHammingDistanceGPU) { + int n = this->blob_bottom_->count(); + const TypeParam* x = this->blob_bottom_->cpu_data(); + const TypeParam* y = this->blob_top_->cpu_data(); + int reference_distance = this->ReferenceHammingDistance(n, x, y); + x = this->blob_bottom_->gpu_data(); + y = this->blob_top_->gpu_data(); + int computed_distance = caffe_gpu_hamming_distance(n, x, y); + EXPECT_EQ(reference_distance, computed_distance); +} + +TYPED_TEST(MathFunctionsTest, TestAsumGPU) { int n = this->blob_bottom_->count(); - caffe_gpu_sgnbit(n, this->blob_bottom_->gpu_data(), - this->blob_bottom_->mutable_gpu_diff()); - const TypeParam* signbits = this->blob_bottom_->cpu_diff(); const TypeParam* x = this->blob_bottom_->cpu_data(); + TypeParam std_asum = 0; for (int i = 0; i < n; ++i) { - EXPECT_EQ(signbits[i], x[i] < 0 ? 1 : 0); + std_asum += std::fabs(x[i]); } + TypeParam gpu_asum; + caffe_gpu_asum(n, this->blob_bottom_->gpu_data(), &gpu_asum); + EXPECT_LT((gpu_asum - std_asum) / std_asum, 1e-2); } -TYPED_TEST(MathFunctionsTest, TestFabsCPU) { +TYPED_TEST(MathFunctionsTest, TestSignGPU) { int n = this->blob_bottom_->count(); + caffe_gpu_sign(n, this->blob_bottom_->gpu_data(), + this->blob_bottom_->mutable_gpu_diff()); + const TypeParam* signs = this->blob_bottom_->cpu_diff(); const TypeParam* x = this->blob_bottom_->cpu_data(); - caffe_cpu_fabs(n, x, this->blob_bottom_->mutable_cpu_diff()); - const TypeParam* abs_val = this->blob_bottom_->cpu_diff(); for (int i = 0; i < n; ++i) { - EXPECT_EQ(abs_val[i], x[i] > 0 ? x[i] : -x[i]); + EXPECT_EQ(signs[i], x[i] > 0 ? 1 : (x[i] < 0 ? -1 : 0)); } } -TYPED_TEST(MathFunctionsTest, TestFabsGPU) { +TYPED_TEST(MathFunctionsTest, TestSgnbitGPU) { int n = this->blob_bottom_->count(); - caffe_gpu_fabs(n, this->blob_bottom_->gpu_data(), + caffe_gpu_sgnbit(n, this->blob_bottom_->gpu_data(), this->blob_bottom_->mutable_gpu_diff()); - const TypeParam* abs_val = this->blob_bottom_->cpu_diff(); + const TypeParam* signbits = this->blob_bottom_->cpu_diff(); const TypeParam* x = this->blob_bottom_->cpu_data(); for (int i = 0; i < n; ++i) { - EXPECT_EQ(abs_val[i], x[i] > 0 ? x[i] : -x[i]); + EXPECT_EQ(signbits[i], x[i] < 0 ? 1 : 0); } } -TYPED_TEST(MathFunctionsTest, TestScaleCPU) { +TYPED_TEST(MathFunctionsTest, TestFabsGPU) { int n = this->blob_bottom_->count(); - TypeParam alpha = this->blob_bottom_->cpu_diff()[caffe_rng_rand() % - this->blob_bottom_->count()]; - caffe_cpu_scale(n, alpha, this->blob_bottom_->cpu_data(), - this->blob_bottom_->mutable_cpu_diff()); - const TypeParam* scaled = this->blob_bottom_->cpu_diff(); + caffe_gpu_fabs(n, this->blob_bottom_->gpu_data(), + this->blob_bottom_->mutable_gpu_diff()); + const TypeParam* abs_val = this->blob_bottom_->cpu_diff(); const TypeParam* x = this->blob_bottom_->cpu_data(); for (int i = 0; i < n; ++i) { - EXPECT_EQ(scaled[i], x[i] * alpha); + EXPECT_EQ(abs_val[i], x[i] > 0 ? x[i] : -x[i]); } } @@ -204,17 +217,6 @@ TYPED_TEST(MathFunctionsTest, TestScaleGPU) { } } -TYPED_TEST(MathFunctionsTest, TestCopyCPU) { - const int n = this->blob_bottom_->count(); - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - TypeParam* top_data = this->blob_top_->mutable_cpu_data(); - Caffe::set_mode(Caffe::CPU); - caffe_copy(n, bottom_data, top_data); - for (int i = 0; i < n; ++i) { - EXPECT_EQ(bottom_data[i], top_data[i]); - } -} - TYPED_TEST(MathFunctionsTest, TestCopyGPU) { const int n = this->blob_bottom_->count(); const TypeParam* bottom_data = this->blob_bottom_->gpu_data(); @@ -228,4 +230,7 @@ TYPED_TEST(MathFunctionsTest, TestCopyGPU) { } } +#endif + + } // namespace caffe diff --git a/src/caffe/test/test_random_number_generator.cpp b/src/caffe/test/test_random_number_generator.cpp index 3ab4680e976..3cd77da9876 100644 --- a/src/caffe/test/test_random_number_generator.cpp +++ b/src/caffe/test/test_random_number_generator.cpp @@ -65,11 +65,6 @@ class RandomNumberGeneratorTest : public ::testing::Test { caffe_rng_gaussian(sample_size_, mu, sigma, rng_data); } - void RngGaussianFillGPU(const Dtype mu, const Dtype sigma, void* gpu_data) { - Dtype* rng_data = static_cast(gpu_data); - caffe_gpu_rng_gaussian(sample_size_, mu, sigma, rng_data); - } - void RngGaussianChecks(const Dtype mu, const Dtype sigma, const void* cpu_data, const Dtype sparse_p = 0) { const Dtype* rng_data = static_cast(cpu_data); @@ -114,19 +109,6 @@ class RandomNumberGeneratorTest : public ::testing::Test { caffe_rng_uniform(sample_size_, lower, upper, rng_data); } - void RngUniformFillGPU(const Dtype lower, const Dtype upper, void* gpu_data) { - CHECK_GE(upper, lower); - Dtype* rng_data = static_cast(gpu_data); - caffe_gpu_rng_uniform(sample_size_, lower, upper, rng_data); - } - - // Fills with uniform integers in [0, UINT_MAX] using 2 argument form of - // caffe_gpu_rng_uniform. - void RngUniformIntFillGPU(void* gpu_data) { - unsigned int* rng_data = static_cast(gpu_data); - caffe_gpu_rng_uniform(sample_size_, rng_data); - } - void RngUniformChecks(const Dtype lower, const Dtype upper, const void* cpu_data, const Dtype sparse_p = 0) { const Dtype* rng_data = static_cast(cpu_data); @@ -188,6 +170,28 @@ class RandomNumberGeneratorTest : public ::testing::Test { EXPECT_NEAR(sample_mean, true_mean, bound); } +#ifndef CPU_ONLY + + void RngGaussianFillGPU(const Dtype mu, const Dtype sigma, void* gpu_data) { + Dtype* rng_data = static_cast(gpu_data); + caffe_gpu_rng_gaussian(sample_size_, mu, sigma, rng_data); + } + + void RngUniformFillGPU(const Dtype lower, const Dtype upper, void* gpu_data) { + CHECK_GE(upper, lower); + Dtype* rng_data = static_cast(gpu_data); + caffe_gpu_rng_uniform(sample_size_, lower, upper, rng_data); + } + + // Fills with uniform integers in [0, UINT_MAX] using 2 argument form of + // caffe_gpu_rng_uniform. + void RngUniformIntFillGPU(void* gpu_data) { + unsigned int* rng_data = static_cast(gpu_data); + caffe_gpu_rng_uniform(sample_size_, rng_data); + } + +#endif + int num_above_mean; int num_below_mean; @@ -393,6 +397,7 @@ TYPED_TEST(RandomNumberGeneratorTest, TestRngBernoulliTimesBernoulli) { EXPECT_NEAR(true_mean, sample_p, bound); } +#ifndef CPU_ONLY TYPED_TEST(RandomNumberGeneratorTest, TestRngGaussianGPU) { const TypeParam mu = 0; @@ -512,5 +517,6 @@ TYPED_TEST(RandomNumberGeneratorTest, TestRngUniformTimesUniformGPU) { this->RngUniformChecks(lower_prod, upper_prod, uniform_data_1); } +#endif } // namespace caffe From e52d91ea331dfd1430384808db272926561b116f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 15 Jul 2014 15:56:36 +0200 Subject: [PATCH 0264/2053] collect CUDA includes and calls, separate from CPU-only mode, leave out - collect CUDA includes in device_alternate.hpp - add guards for CUDA code - move GPU code into cu from cpp - make CUDA includes and libraries conditional in Makefile - drop CUDA dependency from travis-ci build --- .travis.yml | 4 +- Makefile | 12 +- include/caffe/common.hpp | 17 +- include/caffe/layer.hpp | 2 +- include/caffe/test/test_caffe_main.hpp | 1 - include/caffe/util/benchmark.hpp | 5 +- .../{cpu_only.hpp => device_alternate.hpp} | 23 +- include/caffe/util/math_functions.hpp | 208 +++++++++--------- src/caffe/blob.cpp | 7 +- src/caffe/common.cpp | 49 ++++- src/caffe/layers/image_data_layer.cu | 1 - src/caffe/layers/inner_product_layer.cu | 2 - src/caffe/solver.cpp | 4 + src/caffe/syncedmem.cpp | 20 +- src/caffe/test/test_accuracy_layer.cpp | 3 - src/caffe/test/test_argmax_layer.cpp | 3 - src/caffe/test/test_benchmark.cpp | 3 - src/caffe/test/test_blob.cpp | 1 - src/caffe/test/test_caffe_main.cpp | 6 + src/caffe/test/test_common.cpp | 9 +- src/caffe/test/test_concat_layer.cpp | 3 - src/caffe/test/test_convolution_layer.cpp | 3 - src/caffe/test/test_data_layer.cpp | 3 - src/caffe/test/test_dummy_data_layer.cpp | 2 - src/caffe/test/test_eltwise_layer.cpp | 3 - src/caffe/test/test_euclidean_loss_layer.cpp | 3 - src/caffe/test/test_filler.cpp | 1 - src/caffe/test/test_flatten_layer.cpp | 3 - src/caffe/test/test_hdf5_output_layer.cpp | 3 - src/caffe/test/test_hdf5data_layer.cpp | 3 - src/caffe/test/test_hinge_loss_layer.cpp | 3 - src/caffe/test/test_im2col_kernel.cu | 1 - src/caffe/test/test_im2col_layer.cpp | 3 - src/caffe/test/test_image_data_layer.cpp | 4 - src/caffe/test/test_inner_product_layer.cpp | 15 +- src/caffe/test/test_lrn_layer.cpp | 3 - .../test/test_maxpool_dropout_layers.cpp | 2 - .../test_multinomial_logistic_loss_layer.cpp | 3 - src/caffe/test/test_neuron_layer.cpp | 3 - src/caffe/test/test_platform.cpp | 5 +- src/caffe/test/test_pooling_layer.cpp | 3 - src/caffe/test/test_power_layer.cpp | 3 - .../test/test_random_number_generator.cpp | 1 - .../test_sigmoid_cross_entropy_loss_layer.cpp | 2 - src/caffe/test/test_softmax_layer.cpp | 3 - .../test/test_softmax_with_loss_layer.cpp | 3 - src/caffe/test/test_split_layer.cpp | 3 - src/caffe/test/test_stochastic_pooling.cpp | 3 - src/caffe/test/test_syncedmem.cpp | 14 +- src/caffe/test/test_tanh_layer.cpp | 3 - src/caffe/test/test_threshold_layer.cpp | 3 - src/caffe/test/test_upgrade_proto.cpp | 1 - src/caffe/test/test_util_blas.cpp | 8 +- src/caffe/util/benchmark.cpp | 21 +- src/caffe/util/math_functions.cpp | 135 +----------- src/caffe/util/math_functions.cu | 131 +++++++++++ tools/dump_network.cpp | 1 - tools/extract_features.cpp | 1 - tools/finetune_net.cpp | 2 - tools/net_speed_benchmark.cpp | 1 - tools/test_net.cpp | 2 - tools/train_net.cpp | 2 - 62 files changed, 422 insertions(+), 373 deletions(-) rename include/caffe/util/{cpu_only.hpp => device_alternate.hpp} (71%) diff --git a/.travis.yml b/.travis.yml index 1f780471b3b..c0119756c6b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,14 +19,12 @@ before_install: install: - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - - - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb - - sudo apt-get -y update && sudo apt-get -y install cuda - curl https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -o /tmp/mdb.tar.gz && tar -C /tmp -xzvf /tmp/mdb.tar.gz && rm /tmp/mdb.tar.gz - cd /tmp/mdb-mdb/libraries/liblmdb/ && make && sudo make install && cd - before_script: - mv Makefile.config.example Makefile.config - - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/lib + - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib - export NUM_THREADS=4 script: diff --git a/Makefile b/Makefile index 69f2c30e49c..417ff868218 100644 --- a/Makefile +++ b/Makefile @@ -149,11 +149,13 @@ NONEMPTY_WARN_REPORT := $(BUILD_DIR)/$(WARNS_EXT) CUDA_INCLUDE_DIR := $(CUDA_DIR)/include CUDA_LIB_DIR := $(CUDA_DIR)/lib64 $(CUDA_DIR)/lib -INCLUDE_DIRS += $(BUILD_INCLUDE_DIR) -INCLUDE_DIRS += ./src ./include $(CUDA_INCLUDE_DIR) -LIBRARY_DIRS += $(CUDA_LIB_DIR) -LIBRARIES := cudart cublas curand \ - pthread \ +INCLUDE_DIRS += $(BUILD_INCLUDE_DIR) ./src ./include +ifneq ($(CPU_ONLY), 1) + INCLUDE_DIRS += $(CUDA_INCLUDE_DIR) + LIBRARY_DIRS += $(CUDA_LIB_DIR) + LIBRARIES := cudart cublas curand +endif +LIBRARIES += pthread \ glog protobuf leveldb snappy \ lmdb \ boost_system \ diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index bd4e39f136d..0ee49f36030 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -4,12 +4,10 @@ #define CAFFE_COMMON_HPP_ #include -#include -#include -#include -#include // cuda driver types #include +#include "caffe/util/device_alternate.hpp" + // Disable the copy and assignment operator for a class. #define DISABLE_COPY_AND_ASSIGN(classname) \ private:\ @@ -25,6 +23,8 @@ private:\ // is executed we will see a fatal log. #define NOT_IMPLEMENTED LOG(FATAL) << "Not Implemented Yet" +#ifndef CPU_ONLY + // CUDA: various checks for different function calls. #define CUDA_CHECK(condition) \ /* Code block avoids redefinition of cudaError_t error */ \ @@ -56,6 +56,8 @@ private:\ // CUDA: check for error after kernel execution and exit loudly if there is one. #define CUDA_POST_KERNEL_CHECK CUDA_CHECK(cudaPeekAtLastError()) +#endif // CPU_ONLY + namespace caffe { // We will use the boost shared_ptr instead of the new C++11 one mainly @@ -99,10 +101,12 @@ class Caffe { } return *(Get().random_generator_); } +#ifndef CPU_ONLY inline static cublasHandle_t cublas_handle() { return Get().cublas_handle_; } inline static curandGenerator_t curand_generator() { return Get().curand_generator_; } +#endif // Returns the mode: running on CPU or GPU. inline static Brew mode() { return Get().mode_; } @@ -125,8 +129,10 @@ class Caffe { static void DeviceQuery(); protected: +#ifndef CPU_ONLY cublasHandle_t cublas_handle_; curandGenerator_t curand_generator_; +#endif shared_ptr random_generator_; Brew mode_; @@ -140,6 +146,8 @@ class Caffe { DISABLE_COPY_AND_ASSIGN(Caffe); }; +#ifndef CPU_ONLY + // NVIDIA_CUDA-5.5_Samples/common/inc/helper_cuda.h const char* cublasGetErrorString(cublasStatus_t error); const char* curandGetErrorString(curandStatus_t error); @@ -158,6 +166,7 @@ inline int CAFFE_GET_BLOCKS(const int N) { return (N + CAFFE_CUDA_NUM_THREADS - 1) / CAFFE_CUDA_NUM_THREADS; } +#endif // CPU_ONLY } // namespace caffe diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 31689a4fe6f..06518c2eef1 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -9,7 +9,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" -#include "caffe/util/cpu_only.hpp" +#include "caffe/util/device_alternate.hpp" using std::string; using std::vector; diff --git a/include/caffe/test/test_caffe_main.hpp b/include/caffe/test/test_caffe_main.hpp index 3541c0b2c8a..9e7b85944da 100644 --- a/include/caffe/test/test_caffe_main.hpp +++ b/include/caffe/test/test_caffe_main.hpp @@ -5,7 +5,6 @@ #ifndef CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ #define CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ -#include #include #include diff --git a/include/caffe/util/benchmark.hpp b/include/caffe/util/benchmark.hpp index 1d26314c62f..8ee76140d9a 100644 --- a/include/caffe/util/benchmark.hpp +++ b/include/caffe/util/benchmark.hpp @@ -4,7 +4,8 @@ #define CAFFE_UTIL_BENCHMARK_H_ #include -#include + +#include "caffe/util/device_alternate.hpp" namespace caffe { @@ -27,8 +28,10 @@ class Timer { bool initted_; bool running_; bool has_run_at_least_once_; +#ifndef CPU_ONLY cudaEvent_t start_gpu_; cudaEvent_t stop_gpu_; +#endif boost::posix_time::ptime start_cpu_; boost::posix_time::ptime stop_cpu_; float elapsed_milliseconds_; diff --git a/include/caffe/util/cpu_only.hpp b/include/caffe/util/device_alternate.hpp similarity index 71% rename from include/caffe/util/cpu_only.hpp rename to include/caffe/util/device_alternate.hpp index 1ae6ec9dac2..abee4f57dd1 100644 --- a/include/caffe/util/cpu_only.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -1,15 +1,13 @@ // Copyright 2014 BVLC and contributors. -#ifndef CAFFE_UTIL_CPU_ONLY_H_ -#define CAFFE_UTIL_CPU_ONLY_H_ +#ifndef CAFFE_UTIL_DEVICE_ALTERNATE_H_ +#define CAFFE_UTIL_DEVICE_ALTERNATE_H_ -#include +#ifdef CPU_ONLY // CPU-only Caffe. -#include "caffe/blob.hpp" -#include "caffe/common.hpp" +#include -// For CPU-only Caffe, stub out GPU calls as unavailable. -#ifdef CPU_ONLY +// Stub out GPU calls as unavailable. #define NO_GPU LOG(FATAL) << "CPU-only Mode" @@ -33,5 +31,14 @@ void classname::funcname##_##gpu(const vector*>& top, \ const vector& propagate_down, \ vector*>* bottom) { NO_GPU; } \ +#else // Normal GPU + CPU Caffe. + +#include +#include +#include +#include +#include // cuda driver types + #endif // CPU_ONLY -#endif // CAFFE_UTIL_CPU_ONLY_H_ + +#endif // CAFFE_UTIL_DEVICE_ALTERNATE_H_ diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 2df0fc983f9..5036a573033 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -3,12 +3,12 @@ #ifndef CAFFE_UTIL_MATH_FUNCTIONS_H_ #define CAFFE_UTIL_MATH_FUNCTIONS_H_ -#include #include #include // for std::fabs and std::signbit #include "glog/logging.h" +#include "caffe/util/device_alternate.hpp" #include "caffe/util/mkl_alternate.hpp" namespace caffe { @@ -21,97 +21,49 @@ void caffe_cpu_gemm(const CBLAS_TRANSPOSE TransA, const Dtype alpha, const Dtype* A, const Dtype* B, const Dtype beta, Dtype* C); -// Decaf gpu gemm provides an interface that is almost the same as the cpu -// gemm function - following the c convention and calling the fortran-order -// gpu code under the hood. -template -void caffe_gpu_gemm(const CBLAS_TRANSPOSE TransA, - const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, - const Dtype alpha, const Dtype* A, const Dtype* B, const Dtype beta, - Dtype* C); - template void caffe_cpu_gemv(const CBLAS_TRANSPOSE TransA, const int M, const int N, const Dtype alpha, const Dtype* A, const Dtype* x, const Dtype beta, Dtype* y); -template -void caffe_gpu_gemv(const CBLAS_TRANSPOSE TransA, const int M, const int N, - const Dtype alpha, const Dtype* A, const Dtype* x, const Dtype beta, - Dtype* y); - template void caffe_axpy(const int N, const Dtype alpha, const Dtype* X, Dtype* Y); -template -void caffe_gpu_axpy(const int N, const Dtype alpha, const Dtype* X, - Dtype* Y); - template void caffe_cpu_axpby(const int N, const Dtype alpha, const Dtype* X, const Dtype beta, Dtype* Y); -template -void caffe_gpu_axpby(const int N, const Dtype alpha, const Dtype* X, - const Dtype beta, Dtype* Y); - template void caffe_copy(const int N, const Dtype *X, Dtype *Y); -void caffe_gpu_memcpy(const size_t N, const void *X, void *Y); - template void caffe_set(const int N, const Dtype alpha, Dtype *X); -template -void caffe_gpu_set(const int N, const Dtype alpha, Dtype *X); - template void caffe_add_scalar(const int N, const Dtype alpha, Dtype *X); -template -void caffe_gpu_add_scalar(const int N, const Dtype alpha, Dtype *X); - template void caffe_scal(const int N, const Dtype alpha, Dtype *X); -template -void caffe_gpu_scal(const int N, const Dtype alpha, Dtype *X); - template void caffe_sqr(const int N, const Dtype* a, Dtype* y); template void caffe_add(const int N, const Dtype* a, const Dtype* b, Dtype* y); -template -void caffe_gpu_add(const int N, const Dtype* a, const Dtype* b, Dtype* y); - template void caffe_sub(const int N, const Dtype* a, const Dtype* b, Dtype* y); -template -void caffe_gpu_sub(const int N, const Dtype* a, const Dtype* b, Dtype* y); - template void caffe_mul(const int N, const Dtype* a, const Dtype* b, Dtype* y); -template -void caffe_gpu_mul(const int N, const Dtype* a, const Dtype* b, Dtype* y); - template void caffe_div(const int N, const Dtype* a, const Dtype* b, Dtype* y); -template -void caffe_gpu_div(const int N, const Dtype* a, const Dtype* b, Dtype* y); - template void caffe_powx(const int n, const Dtype* a, const Dtype b, Dtype* y); -template -void caffe_gpu_powx(const int n, const Dtype* a, const Dtype b, Dtype* y); - unsigned int caffe_rng_rand(); template @@ -120,58 +72,29 @@ Dtype caffe_nextafter(const Dtype b); template void caffe_rng_uniform(const int n, const Dtype a, const Dtype b, Dtype* r); -// caffe_gpu_rng_uniform with two arguments generates integers in the range -// [0, UINT_MAX]. -void caffe_gpu_rng_uniform(const int n, unsigned int* r); - -// caffe_gpu_rng_uniform with four arguments generates floats in the range -// (a, b] (strictly greater than a, less than or equal to b) due to the -// specification of curandGenerateUniform. With a = 0, b = 1, just calls -// curandGenerateUniform; with other limits will shift and scale the outputs -// appropriately after calling curandGenerateUniform. -template -void caffe_gpu_rng_uniform(const int n, const Dtype a, const Dtype b, Dtype* r); - template void caffe_rng_gaussian(const int n, const Dtype mu, const Dtype sigma, Dtype* r); -template -void caffe_gpu_rng_gaussian(const int n, const Dtype mu, const Dtype sigma, - Dtype* r); - template void caffe_rng_bernoulli(const int n, const Dtype p, int* r); template void caffe_rng_bernoulli(const int n, const Dtype p, unsigned int* r); -template -void caffe_gpu_rng_bernoulli(const int n, const Dtype p, int* r); - template void caffe_exp(const int n, const Dtype* a, Dtype* y); template Dtype caffe_cpu_dot(const int n, const Dtype* x, const Dtype* y); -template -void caffe_gpu_dot(const int n, const Dtype* x, const Dtype* y, Dtype* out); - template int caffe_cpu_hamming_distance(const int n, const Dtype* x, const Dtype* y); -template -uint32_t caffe_gpu_hamming_distance(const int n, const Dtype* x, - const Dtype* y); - // Returns the sum of the absolute values of the elements of vector x template Dtype caffe_cpu_asum(const int n, const Dtype* x); -template -void caffe_gpu_asum(const int n, const Dtype* x, Dtype* y); - // the branchless, type-safe version from // http://stackoverflow.com/questions/1903954/is-there-a-standard-sign-function-signum-sgn-in-c-c template @@ -200,6 +123,109 @@ inline char caffe_sign(Dtype val) { template <> \ void caffe_cpu_##name(const int n, const double* x, double* y) +// output is 1 for the positives, 0 for zero, and -1 for the negatives +DEFINE_CAFFE_CPU_UNARY_FUNC(sign, y[i] = caffe_sign(x[i])); + +// This returns a nonzero value if the input has its sign bit set. +// The name sngbit is meant to avoid conflicts with std::signbit in the macro +using std::signbit; +DEFINE_CAFFE_CPU_UNARY_FUNC(sgnbit, y[i] = signbit(x[i])); + +DEFINE_CAFFE_CPU_UNARY_FUNC(fabs, y[i] = std::fabs(x[i])); + +template +void caffe_cpu_scale(const int n, const Dtype alpha, const Dtype *x, Dtype* y); + +#ifndef CPU_ONLY // GPU + +// Decaf gpu gemm provides an interface that is almost the same as the cpu +// gemm function - following the c convention and calling the fortran-order +// gpu code under the hood. +template +void caffe_gpu_gemm(const CBLAS_TRANSPOSE TransA, + const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, + const Dtype alpha, const Dtype* A, const Dtype* B, const Dtype beta, + Dtype* C); + +template +void caffe_gpu_gemv(const CBLAS_TRANSPOSE TransA, const int M, const int N, + const Dtype alpha, const Dtype* A, const Dtype* x, const Dtype beta, + Dtype* y); + +template +void caffe_gpu_axpy(const int N, const Dtype alpha, const Dtype* X, + Dtype* Y); + +template +void caffe_gpu_axpby(const int N, const Dtype alpha, const Dtype* X, + const Dtype beta, Dtype* Y); + +void caffe_gpu_memcpy(const size_t N, const void *X, void *Y); + +template +void caffe_gpu_set(const int N, const Dtype alpha, Dtype *X); + +template +void caffe_gpu_add_scalar(const int N, const Dtype alpha, Dtype *X); + +template +void caffe_gpu_scal(const int N, const Dtype alpha, Dtype *X); + +template +void caffe_gpu_add(const int N, const Dtype* a, const Dtype* b, Dtype* y); + +template +void caffe_gpu_sub(const int N, const Dtype* a, const Dtype* b, Dtype* y); + +template +void caffe_gpu_mul(const int N, const Dtype* a, const Dtype* b, Dtype* y); + +template +void caffe_gpu_div(const int N, const Dtype* a, const Dtype* b, Dtype* y); + +template +void caffe_gpu_powx(const int n, const Dtype* a, const Dtype b, Dtype* y); + +// caffe_gpu_rng_uniform with two arguments generates integers in the range +// [0, UINT_MAX]. +void caffe_gpu_rng_uniform(const int n, unsigned int* r); + +// caffe_gpu_rng_uniform with four arguments generates floats in the range +// (a, b] (strictly greater than a, less than or equal to b) due to the +// specification of curandGenerateUniform. With a = 0, b = 1, just calls +// curandGenerateUniform; with other limits will shift and scale the outputs +// appropriately after calling curandGenerateUniform. +template +void caffe_gpu_rng_uniform(const int n, const Dtype a, const Dtype b, Dtype* r); + +template +void caffe_gpu_rng_gaussian(const int n, const Dtype mu, const Dtype sigma, + Dtype* r); + +template +void caffe_gpu_rng_bernoulli(const int n, const Dtype p, int* r); + +template +void caffe_gpu_dot(const int n, const Dtype* x, const Dtype* y, Dtype* out); + +template +uint32_t caffe_gpu_hamming_distance(const int n, const Dtype* x, + const Dtype* y); + +template +void caffe_gpu_asum(const int n, const Dtype* x, Dtype* y); + +template +void caffe_gpu_sign(const int n, const Dtype* x, Dtype* y); + +template +void caffe_gpu_sgnbit(const int n, const Dtype* x, Dtype* y); + +template +void caffe_gpu_fabs(const int n, const Dtype* x, Dtype* y); + +template +void caffe_gpu_scale(const int n, const Dtype alpha, const Dtype *x, Dtype* y); #define DEFINE_AND_INSTANTIATE_GPU_UNARY_FUNC(name, operation) \ template \ @@ -221,32 +247,8 @@ void caffe_gpu_##name(const int n, const double* x, double* y) { \ n, x, y); \ } -// output is 1 for the positives, 0 for zero, and -1 for the negatives -DEFINE_CAFFE_CPU_UNARY_FUNC(sign, y[i] = caffe_sign(x[i])); - -template -void caffe_gpu_sign(const int n, const Dtype* x, Dtype* y); - -// This returns a nonzero value if the input has its sign bit set. -// The name sngbit is meant to avoid conflicts with std::signbit in the macro -using std::signbit; -DEFINE_CAFFE_CPU_UNARY_FUNC(sgnbit, y[i] = signbit(x[i])); - -template -void caffe_gpu_sgnbit(const int n, const Dtype* x, Dtype* y); - -DEFINE_CAFFE_CPU_UNARY_FUNC(fabs, y[i] = std::fabs(x[i])); - -template -void caffe_gpu_fabs(const int n, const Dtype* x, Dtype* y); - -template -void caffe_cpu_scale(const int n, const Dtype alpha, const Dtype *x, Dtype* y); - -template -void caffe_gpu_scale(const int n, const Dtype alpha, const Dtype *x, Dtype* y); +#endif // CPU_ONLY } // namespace caffe - #endif // CAFFE_UTIL_MATH_FUNCTIONS_H_ diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index 8df46323eee..1051eaa1c2c 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -1,8 +1,5 @@ // Copyright 2014 BVLC and contributors. -#include -#include - #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" @@ -126,10 +123,14 @@ void Blob::Update() { break; case SyncedMemory::HEAD_AT_GPU: case SyncedMemory::SYNCED: +#ifndef CPU_ONLY // perform computation on GPU caffe_gpu_axpy(count_, Dtype(-1), static_cast(diff_->gpu_data()), static_cast(data_->mutable_gpu_data())); +#else + NO_GPU; +#endif break; default: LOG(FATAL) << "Syncedmem not initialized."; diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 631c8afd068..e8765eebff1 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -10,8 +10,7 @@ namespace caffe { shared_ptr Caffe::singleton_; - -// curand seeding +// random seeding int64_t cluster_seedgen(void) { int64_t s, seed, pid; pid = getpid(); @@ -20,6 +19,50 @@ int64_t cluster_seedgen(void) { return seed; } +#ifdef CPU_ONLY // CPU-only Caffe. + +Caffe::Caffe() + : random_generator_(), mode_(Caffe::CPU), phase_(Caffe::TRAIN) { } + +Caffe::~Caffe() { } + +void Caffe::set_random_seed(const unsigned int seed) { + // RNG seed + Get().random_generator_.reset(new RNG(seed)); +} + +void Caffe::SetDevice(const int device_id) { + NO_GPU; +} + +void Caffe::DeviceQuery() { + NO_GPU; +} + + +class Caffe::RNG::Generator { + public: + Generator() : rng_(new caffe::rng_t(cluster_seedgen())) {} + explicit Generator(unsigned int seed) : rng_(new caffe::rng_t(seed)) {} + caffe::rng_t* rng() { return rng_.get(); } + private: + shared_ptr rng_; +}; + +Caffe::RNG::RNG() : generator_(new Generator()) { } + +Caffe::RNG::RNG(unsigned int seed) : generator_(new Generator(seed)) { } + +Caffe::RNG& Caffe::RNG::operator=(const RNG& other) { + generator_.reset(other.generator_.get()); + return *this; +} + +void* Caffe::RNG::generator() { + return static_cast(generator_->rng()); +} + +#else // Normal GPU + CPU Caffe. Caffe::Caffe() : cublas_handle_(NULL), curand_generator_(NULL), random_generator_(), @@ -201,4 +244,6 @@ const char* curandGetErrorString(curandStatus_t error) { return "Unknown curand status"; } +#endif // CPU_ONLY + } // namespace caffe diff --git a/src/caffe/layers/image_data_layer.cu b/src/caffe/layers/image_data_layer.cu index dd5bdbc2068..4026709151f 100644 --- a/src/caffe/layers/image_data_layer.cu +++ b/src/caffe/layers/image_data_layer.cu @@ -1,6 +1,5 @@ // Copyright 2014 BVLC and contributors. -#include #include #include #include diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu index 453593cf552..6ef75788665 100644 --- a/src/caffe/layers/inner_product_layer.cu +++ b/src/caffe/layers/inner_product_layer.cu @@ -1,7 +1,5 @@ // Copyright 2014 BVLC and contributors. -#include - #include #include "caffe/blob.hpp" diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index ca1d92525c9..edfa9c0063e 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -295,6 +295,7 @@ void SGDSolver::ComputeUpdateValue() { } break; case Caffe::GPU: +#ifndef CPU_ONLY for (int param_id = 0; param_id < net_params.size(); ++param_id) { // Compute the value to history, and then copy them to the blob's diff. Dtype local_rate = rate * net_params_lr[param_id]; @@ -314,6 +315,9 @@ void SGDSolver::ComputeUpdateValue() { history_[param_id]->gpu_data(), net_params[param_id]->mutable_gpu_diff()); } +#else + NO_GPU; +#endif break; default: LOG(FATAL) << "Unknown caffe mode: " << Caffe::mode(); diff --git a/src/caffe/syncedmem.cpp b/src/caffe/syncedmem.cpp index 77dfe7a4636..844f639e013 100644 --- a/src/caffe/syncedmem.cpp +++ b/src/caffe/syncedmem.cpp @@ -1,7 +1,5 @@ // Copyright 2014 BVLC and contributors. -#include - #include #include "caffe/common.hpp" @@ -15,9 +13,11 @@ SyncedMemory::~SyncedMemory() { CaffeFreeHost(cpu_ptr_); } +#ifndef CPU_ONLY if (gpu_ptr_) { CUDA_CHECK(cudaFree(gpu_ptr_)); } +#endif // CPU_ONLY } inline void SyncedMemory::to_cpu() { @@ -29,12 +29,16 @@ inline void SyncedMemory::to_cpu() { own_cpu_data_ = true; break; case HEAD_AT_GPU: +#ifndef CPU_ONLY if (cpu_ptr_ == NULL) { CaffeMallocHost(&cpu_ptr_, size_); own_cpu_data_ = true; } caffe_gpu_memcpy(size_, gpu_ptr_, cpu_ptr_); head_ = SYNCED; +#else + NO_GPU; +#endif break; case HEAD_AT_CPU: case SYNCED: @@ -43,6 +47,7 @@ inline void SyncedMemory::to_cpu() { } inline void SyncedMemory::to_gpu() { +#ifndef CPU_ONLY switch (head_) { case UNINITIALIZED: CUDA_CHECK(cudaMalloc(&gpu_ptr_, size_)); @@ -60,6 +65,9 @@ inline void SyncedMemory::to_gpu() { case SYNCED: break; } +#else + NO_GPU; +#endif } const void* SyncedMemory::cpu_data() { @@ -78,8 +86,12 @@ void SyncedMemory::set_cpu_data(void* data) { } const void* SyncedMemory::gpu_data() { +#ifndef CPU_ONLY to_gpu(); return (const void*)gpu_ptr_; +#else + NO_GPU; +#endif } void* SyncedMemory::mutable_cpu_data() { @@ -89,9 +101,13 @@ void* SyncedMemory::mutable_cpu_data() { } void* SyncedMemory::mutable_gpu_data() { +#ifndef CPU_ONLY to_gpu(); head_ = HEAD_AT_GPU; return gpu_ptr_; +#else + NO_GPU; +#endif } diff --git a/src/caffe/test/test_accuracy_layer.cpp b/src/caffe/test/test_accuracy_layer.cpp index 355a36b3c95..40b08748d1f 100644 --- a/src/caffe/test/test_accuracy_layer.cpp +++ b/src/caffe/test/test_accuracy_layer.cpp @@ -5,7 +5,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -16,8 +15,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class AccuracyLayerTest : public ::testing::Test { protected: diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index 44a13b99b1a..d3bdfbde658 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -2,7 +2,6 @@ #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -14,8 +13,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class ArgMaxLayerTest : public ::testing::Test { protected: diff --git a/src/caffe/test/test_benchmark.cpp b/src/caffe/test/test_benchmark.cpp index 82880088073..b613a873ea4 100644 --- a/src/caffe/test/test_benchmark.cpp +++ b/src/caffe/test/test_benchmark.cpp @@ -1,7 +1,6 @@ // Copyright 2014 BVLC and contributors. #include // for usleep -#include #include #include "caffe/common.hpp" @@ -10,8 +9,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class BenchmarkTest : public MultiDeviceTest {}; diff --git a/src/caffe/test/test_blob.cpp b/src/caffe/test/test_blob.cpp index a5240940fd8..aec88f322e6 100644 --- a/src/caffe/test/test_blob.cpp +++ b/src/caffe/test/test_blob.cpp @@ -2,7 +2,6 @@ #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/common.hpp" #include "caffe/blob.hpp" diff --git a/src/caffe/test/test_caffe_main.cpp b/src/caffe/test/test_caffe_main.cpp index 07e6b8d5ef2..bb5e6b46afb 100644 --- a/src/caffe/test/test_caffe_main.cpp +++ b/src/caffe/test/test_caffe_main.cpp @@ -6,14 +6,19 @@ #include "caffe/test/test_caffe_main.hpp" namespace caffe { +#ifndef CPU_ONLY cudaDeviceProp CAFFE_TEST_CUDA_PROP; +#endif } +#ifndef CPU_ONLY using caffe::CAFFE_TEST_CUDA_PROP; +#endif int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); ::google::InitGoogleLogging(argv[0]); +#ifndef CPU_ONLY // Before starting testing, let's first print out a few cuda defice info. int device; cudaGetDeviceCount(&device); @@ -27,6 +32,7 @@ int main(int argc, char** argv) { cudaGetDevice(&device); cout << "Current device id: " << device << endl; cudaGetDeviceProperties(&CAFFE_TEST_CUDA_PROP, device); +#endif // invoke the test. return RUN_ALL_TESTS(); } diff --git a/src/caffe/test/test_common.cpp b/src/caffe/test/test_common.cpp index a452b612890..a8e2eb15270 100644 --- a/src/caffe/test/test_common.cpp +++ b/src/caffe/test/test_common.cpp @@ -2,7 +2,6 @@ #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" @@ -13,12 +12,16 @@ namespace caffe { class CommonTest : public ::testing::Test {}; +#ifndef CPU_ONLY // GPU Caffe singleton test. + TEST_F(CommonTest, TestCublasHandlerGPU) { int cuda_device_id; CUDA_CHECK(cudaGetDevice(&cuda_device_id)); EXPECT_TRUE(Caffe::cublas_handle()); } +#endif + TEST_F(CommonTest, TestBrewMode) { Caffe::set_mode(Caffe::CPU); EXPECT_EQ(Caffe::mode(), Caffe::CPU); @@ -48,6 +51,8 @@ TEST_F(CommonTest, TestRandSeedCPU) { } } +#ifndef CPU_ONLY // GPU Caffe singleton test. + TEST_F(CommonTest, TestRandSeedGPU) { SyncedMemory data_a(10 * sizeof(unsigned int)); SyncedMemory data_b(10 * sizeof(unsigned int)); @@ -63,4 +68,6 @@ TEST_F(CommonTest, TestRandSeedGPU) { } } +#endif + } // namespace caffe diff --git a/src/caffe/test/test_concat_layer.cpp b/src/caffe/test/test_concat_layer.cpp index ff208a90d3a..0550bb2d5c9 100644 --- a/src/caffe/test/test_concat_layer.cpp +++ b/src/caffe/test/test_concat_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -15,8 +14,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class ConcatLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index 6f3e3146117..d0522b13cd0 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -15,8 +14,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class ConvolutionLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 8cd157dd98a..ed7337c5eca 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "leveldb/db.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" @@ -18,8 +17,6 @@ using std::stringstream; namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class DataLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_dummy_data_layer.cpp b/src/caffe/test/test_dummy_data_layer.cpp index 3a83a79772c..5b5f2025737 100644 --- a/src/caffe/test/test_dummy_data_layer.cpp +++ b/src/caffe/test/test_dummy_data_layer.cpp @@ -15,8 +15,6 @@ using std::stringstream; namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class DummyDataLayerTest : public ::testing::Test { protected: diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index 66490d2bc4e..53bff96ed6d 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -2,7 +2,6 @@ #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -14,8 +13,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class EltwiseLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_euclidean_loss_layer.cpp b/src/caffe/test/test_euclidean_loss_layer.cpp index 8c796945b89..dd27670da13 100644 --- a/src/caffe/test/test_euclidean_loss_layer.cpp +++ b/src/caffe/test/test_euclidean_loss_layer.cpp @@ -5,7 +5,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -17,8 +16,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class EuclideanLossLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_filler.cpp b/src/caffe/test/test_filler.cpp index 93eda7e8330..1b145f2418e 100644 --- a/src/caffe/test/test_filler.cpp +++ b/src/caffe/test/test_filler.cpp @@ -2,7 +2,6 @@ #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/filler.hpp" diff --git a/src/caffe/test/test_flatten_layer.cpp b/src/caffe/test/test_flatten_layer.cpp index e6e777e69c0..bea099b1f92 100644 --- a/src/caffe/test/test_flatten_layer.cpp +++ b/src/caffe/test/test_flatten_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -15,8 +14,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class FlattenLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index 6fd9a2fc194..221d62aa2d2 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -1,6 +1,5 @@ // Copyright 2014 BVLC and contributors. -#include #include #include @@ -17,8 +16,6 @@ using std::vector; namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class HDF5OutputLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index 3eb24210d99..e606e209661 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "leveldb/db.h" #include "gtest/gtest.h" @@ -18,8 +17,6 @@ using std::string; namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class HDF5DataLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index df6d8e25803..84374e9579a 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -5,7 +5,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -17,8 +16,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class HingeLossLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_im2col_kernel.cu b/src/caffe/test/test_im2col_kernel.cu index bd4404a0000..5671968b56d 100644 --- a/src/caffe/test/test_im2col_kernel.cu +++ b/src/caffe/test/test_im2col_kernel.cu @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" diff --git a/src/caffe/test/test_im2col_layer.cpp b/src/caffe/test/test_im2col_layer.cpp index 5be191742fc..a40f59df2e8 100644 --- a/src/caffe/test/test_im2col_layer.cpp +++ b/src/caffe/test/test_im2col_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -15,8 +14,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class Im2colLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index fbd4a1ca9d4..ae9a2dbc17d 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -1,7 +1,5 @@ // Copyright 2014 BVLC and contributors. -#include - #include // NOLINT(readability/streams) #include // NOLINT(readability/streams) #include @@ -21,8 +19,6 @@ using std::string; namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class ImageDataLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_inner_product_layer.cpp b/src/caffe/test/test_inner_product_layer.cpp index ad4783f991a..de194f2d63f 100644 --- a/src/caffe/test/test_inner_product_layer.cpp +++ b/src/caffe/test/test_inner_product_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -15,7 +14,9 @@ namespace caffe { +#ifndef CPU_ONLY extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; +#endif template class InnerProductLayerTest : public MultiDeviceTest { @@ -57,8 +58,12 @@ TYPED_TEST(InnerProductLayerTest, TestSetUp) { TYPED_TEST(InnerProductLayerTest, TestForward) { typedef typename TypeParam::Dtype Dtype; + bool IS_VALID_CUDA = false; +#ifndef CPU_ONLY + IS_VALID_CUDA = CAFFE_TEST_CUDA_PROP.major >= 2; +#endif if (Caffe::mode() == Caffe::CPU || - sizeof(Dtype) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { + sizeof(Dtype) == 4 || IS_VALID_CUDA) { LayerParameter layer_param; InnerProductParameter* inner_product_param = layer_param.mutable_inner_product_param(); @@ -83,8 +88,12 @@ TYPED_TEST(InnerProductLayerTest, TestForward) { TYPED_TEST(InnerProductLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; + bool IS_VALID_CUDA = false; +#ifndef CPU_ONLY + IS_VALID_CUDA = CAFFE_TEST_CUDA_PROP.major >= 2; +#endif if (Caffe::mode() == Caffe::CPU || - sizeof(Dtype) == 4 || CAFFE_TEST_CUDA_PROP.major >= 2) { + sizeof(Dtype) == 4 || IS_VALID_CUDA) { LayerParameter layer_param; InnerProductParameter* inner_product_param = layer_param.mutable_inner_product_param(); diff --git a/src/caffe/test/test_lrn_layer.cpp b/src/caffe/test/test_lrn_layer.cpp index a627c97f40f..5bd5533f955 100644 --- a/src/caffe/test/test_lrn_layer.cpp +++ b/src/caffe/test/test_lrn_layer.cpp @@ -4,7 +4,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -19,8 +18,6 @@ using std::max; namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class LRNLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp index eef375acea7..733bbf4ad1f 100644 --- a/src/caffe/test/test_maxpool_dropout_layers.cpp +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -3,8 +3,6 @@ #include #include -#include "cuda_runtime.h" - #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" diff --git a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp index d73347e8e2e..ec53d40e53e 100644 --- a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp +++ b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp @@ -5,7 +5,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -17,8 +16,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class MultinomialLogisticLossLayerTest : public ::testing::Test { protected: diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index f44471843a9..246832d226d 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -15,8 +14,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class NeuronLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_platform.cpp b/src/caffe/test/test_platform.cpp index 7cf8306e8c9..e1c4dafc7bb 100644 --- a/src/caffe/test/test_platform.cpp +++ b/src/caffe/test/test_platform.cpp @@ -1,9 +1,10 @@ // Copyright 2014 BVLC and contributors. +#ifndef CPU_ONLY + #include #include -#include "cuda_runtime.h" #include "glog/logging.h" #include "gtest/gtest.h" #include "caffe/test/test_caffe_main.hpp" @@ -53,3 +54,5 @@ TEST_F(PlatformTest, TestInitialization) { } } // namespace caffe + +#endif // CPU_ONLY diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index b209d821a32..b9cec54af39 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -15,8 +14,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class PoolingLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_power_layer.cpp b/src/caffe/test/test_power_layer.cpp index a1b716ad531..c9992d57f65 100644 --- a/src/caffe/test/test_power_layer.cpp +++ b/src/caffe/test/test_power_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" @@ -18,8 +17,6 @@ using std::isnan; namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class PowerLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_random_number_generator.cpp b/src/caffe/test/test_random_number_generator.cpp index 3cd77da9876..abe21c2523e 100644 --- a/src/caffe/test/test_random_number_generator.cpp +++ b/src/caffe/test/test_random_number_generator.cpp @@ -1,6 +1,5 @@ // Copyright 2014 BVLC and contributors. -#include #include #include diff --git a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp index 76bbfb48a17..a5388db092f 100644 --- a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp @@ -16,8 +16,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class SigmoidCrossEntropyLossLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index f0be279bbca..fa899f92db3 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -4,7 +4,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -16,8 +15,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class SoftmaxLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_softmax_with_loss_layer.cpp b/src/caffe/test/test_softmax_with_loss_layer.cpp index efd6e33c2f7..6f45c3889c2 100644 --- a/src/caffe/test/test_softmax_with_loss_layer.cpp +++ b/src/caffe/test/test_softmax_with_loss_layer.cpp @@ -5,7 +5,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -17,8 +16,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class SoftmaxWithLossLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index 455fb59d4d3..bbee6d28855 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -4,7 +4,6 @@ #include #include -#include "cuda_runtime.h" #include "google/protobuf/text_format.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" @@ -18,8 +17,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class SplitLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_stochastic_pooling.cpp b/src/caffe/test/test_stochastic_pooling.cpp index 7a931d224d8..66e9b2d7d88 100644 --- a/src/caffe/test/test_stochastic_pooling.cpp +++ b/src/caffe/test/test_stochastic_pooling.cpp @@ -4,7 +4,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -18,8 +17,6 @@ using std::min; namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class StochasticPoolingLayerTest : public ::testing::Test { protected: diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index 20bd86138b5..f07682a2aa5 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -3,10 +3,10 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" +#include "caffe/util/device_alternate.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/test/test_caffe_main.hpp" @@ -24,6 +24,8 @@ TEST_F(SyncedMemoryTest, TestInitialization) { delete p_mem; } +#ifndef CPU_ONLY // GPU test + TEST_F(SyncedMemoryTest, TestAllocationCPUGPU) { SyncedMemory mem(10); EXPECT_TRUE(mem.cpu_data()); @@ -32,18 +34,24 @@ TEST_F(SyncedMemoryTest, TestAllocationCPUGPU) { EXPECT_TRUE(mem.mutable_gpu_data()); } +#endif + TEST_F(SyncedMemoryTest, TestAllocationCPU) { SyncedMemory mem(10); EXPECT_TRUE(mem.cpu_data()); EXPECT_TRUE(mem.mutable_cpu_data()); } +#ifndef CPU_ONLY // GPU test + TEST_F(SyncedMemoryTest, TestAllocationGPU) { SyncedMemory mem(10); EXPECT_TRUE(mem.gpu_data()); EXPECT_TRUE(mem.mutable_gpu_data()); } +#endif + TEST_F(SyncedMemoryTest, TestCPUWrite) { SyncedMemory mem(10); void* cpu_data = mem.mutable_cpu_data(); @@ -61,6 +69,8 @@ TEST_F(SyncedMemoryTest, TestCPUWrite) { } } +#ifndef CPU_ONLY // GPU test + TEST_F(SyncedMemoryTest, TestGPURead) { SyncedMemory mem(10); void* cpu_data = mem.mutable_cpu_data(); @@ -112,4 +122,6 @@ TEST_F(SyncedMemoryTest, TestGPUWrite) { EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); } +#endif + } // namespace caffe diff --git a/src/caffe/test/test_tanh_layer.cpp b/src/caffe/test/test_tanh_layer.cpp index 171eb4e472e..7fc443f6d6d 100644 --- a/src/caffe/test/test_tanh_layer.cpp +++ b/src/caffe/test/test_tanh_layer.cpp @@ -5,7 +5,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -17,8 +16,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class TanHLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 46519ff2094..7006dd11880 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -2,7 +2,6 @@ #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -14,8 +13,6 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; - template class ThresholdLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index 9203f5583be..72ee838931d 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -4,7 +4,6 @@ #include #include -#include "cuda_runtime.h" #include "google/protobuf/text_format.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" diff --git a/src/caffe/test/test_util_blas.cpp b/src/caffe/test/test_util_blas.cpp index 725d24e21d3..d74f9f017ee 100644 --- a/src/caffe/test/test_util_blas.cpp +++ b/src/caffe/test/test_util_blas.cpp @@ -1,12 +1,12 @@ // Copyright 2014 BVLC and contributors. -#include +#ifndef CPU_ONLY // CPU-GPU test -#include "cuda_runtime.h" -#include "cublas_v2.h" +#include #include "gtest/gtest.h" #include "caffe/blob.hpp" +#include "caffe/util/device_alternate.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/test/test_caffe_main.hpp" @@ -131,3 +131,5 @@ TYPED_TEST(GemmTest, TestGemvCPUGPU) { } } // namespace caffe + +#endif // CPU_ONLY diff --git a/src/caffe/util/benchmark.cpp b/src/caffe/util/benchmark.cpp index 0bd852182c8..009b118a35a 100644 --- a/src/caffe/util/benchmark.cpp +++ b/src/caffe/util/benchmark.cpp @@ -1,7 +1,6 @@ // Copyright 2014 BVLC and contributors. #include -#include #include "caffe/common.hpp" #include "caffe/util/benchmark.hpp" @@ -17,15 +16,23 @@ Timer::Timer() Timer::~Timer() { if (Caffe::mode() == Caffe::GPU) { +#ifndef CPU_ONLY CUDA_CHECK(cudaEventDestroy(start_gpu_)); CUDA_CHECK(cudaEventDestroy(stop_gpu_)); +#else + NO_GPU; +#endif } } void Timer::Start() { if (!running()) { if (Caffe::mode() == Caffe::GPU) { +#ifndef CPU_ONLY CUDA_CHECK(cudaEventRecord(start_gpu_, 0)); +#else + NO_GPU; +#endif } else { start_cpu_ = boost::posix_time::microsec_clock::local_time(); } @@ -37,8 +44,12 @@ void Timer::Start() { void Timer::Stop() { if (running()) { if (Caffe::mode() == Caffe::GPU) { +#ifndef CPU_ONLY CUDA_CHECK(cudaEventRecord(stop_gpu_, 0)); CUDA_CHECK(cudaEventSynchronize(stop_gpu_)); +#else + NO_GPU; +#endif } else { stop_cpu_ = boost::posix_time::microsec_clock::local_time(); } @@ -55,8 +66,12 @@ float Timer::MilliSeconds() { Stop(); } if (Caffe::mode() == Caffe::GPU) { +#ifndef CPU_ONLY CUDA_CHECK(cudaEventElapsedTime(&elapsed_milliseconds_, start_gpu_, stop_gpu_)); +#else + NO_GPU; +#endif } else { elapsed_milliseconds_ = (stop_cpu_ - start_cpu_).total_milliseconds(); } @@ -70,8 +85,12 @@ float Timer::Seconds() { void Timer::Init() { if (!initted()) { if (Caffe::mode() == Caffe::GPU) { +#ifndef CPU_ONLY CUDA_CHECK(cudaEventCreate(&start_gpu_)); CUDA_CHECK(cudaEventCreate(&stop_gpu_)); +#else + NO_GPU; +#endif } initted_ = true; } diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index b989ca2ab69..36d8877d8c5 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -2,7 +2,6 @@ #include #include -#include #include @@ -34,38 +33,6 @@ void caffe_cpu_gemm(const CBLAS_TRANSPOSE TransA, ldb, beta, C, N); } -template <> -void caffe_gpu_gemm(const CBLAS_TRANSPOSE TransA, - const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, - const float alpha, const float* A, const float* B, const float beta, - float* C) { - // Note that cublas follows fortran order. - int lda = (TransA == CblasNoTrans) ? K : M; - int ldb = (TransB == CblasNoTrans) ? N : K; - cublasOperation_t cuTransA = - (TransA == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; - cublasOperation_t cuTransB = - (TransB == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; - CUBLAS_CHECK(cublasSgemm(Caffe::cublas_handle(), cuTransB, cuTransA, - N, M, K, &alpha, B, ldb, A, lda, &beta, C, N)); -} - -template <> -void caffe_gpu_gemm(const CBLAS_TRANSPOSE TransA, - const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, - const double alpha, const double* A, const double* B, const double beta, - double* C) { - // Note that cublas follows fortran order. - int lda = (TransA == CblasNoTrans) ? K : M; - int ldb = (TransB == CblasNoTrans) ? N : K; - cublasOperation_t cuTransA = - (TransA == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; - cublasOperation_t cuTransB = - (TransB == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; - CUBLAS_CHECK(cublasDgemm(Caffe::cublas_handle(), cuTransB, cuTransA, - N, M, K, &alpha, B, ldb, A, lda, &beta, C, N)); -} - template <> void caffe_cpu_gemv(const CBLAS_TRANSPOSE TransA, const int M, const int N, const float alpha, const float* A, const float* x, @@ -80,26 +47,6 @@ void caffe_cpu_gemv(const CBLAS_TRANSPOSE TransA, const int M, cblas_dgemv(CblasRowMajor, TransA, M, N, alpha, A, N, x, 1, beta, y, 1); } -template <> -void caffe_gpu_gemv(const CBLAS_TRANSPOSE TransA, const int M, - const int N, const float alpha, const float* A, const float* x, - const float beta, float* y) { - cublasOperation_t cuTransA = - (TransA == CblasNoTrans) ? CUBLAS_OP_T : CUBLAS_OP_N; - CUBLAS_CHECK(cublasSgemv(Caffe::cublas_handle(), cuTransA, N, M, &alpha, - A, N, x, 1, &beta, y, 1)); -} - -template <> -void caffe_gpu_gemv(const CBLAS_TRANSPOSE TransA, const int M, - const int N, const double alpha, const double* A, const double* x, - const double beta, double* y) { - cublasOperation_t cuTransA = - (TransA == CblasNoTrans) ? CUBLAS_OP_T : CUBLAS_OP_N; - CUBLAS_CHECK(cublasDgemv(Caffe::cublas_handle(), cuTransA, N, M, &alpha, - A, N, x, 1, &beta, y, 1)); -} - template <> void caffe_axpy(const int N, const float alpha, const float* X, float* Y) { cblas_saxpy(N, alpha, X, 1, Y, 1); } @@ -108,18 +55,6 @@ template <> void caffe_axpy(const int N, const double alpha, const double* X, double* Y) { cblas_daxpy(N, alpha, X, 1, Y, 1); } -template <> -void caffe_gpu_axpy(const int N, const float alpha, const float* X, - float* Y) { - CUBLAS_CHECK(cublasSaxpy(Caffe::cublas_handle(), N, &alpha, X, 1, Y, 1)); -} - -template <> -void caffe_gpu_axpy(const int N, const double alpha, const double* X, - double* Y) { - CUBLAS_CHECK(cublasDaxpy(Caffe::cublas_handle(), N, &alpha, X, 1, Y, 1)); -} - template void caffe_set(const int N, const Dtype alpha, Dtype* Y) { if (alpha == 0) { @@ -153,7 +88,11 @@ template void caffe_copy(const int N, const Dtype* X, Dtype* Y) { if (X != Y) { if (Caffe::mode() == Caffe::GPU) { +#ifndef CPU_ONLY CUDA_CHECK(cudaMemcpy(Y, X, sizeof(Dtype) * N, cudaMemcpyDefault)); +#else + NO_GPU; +#endif } else { memcpy(Y, X, sizeof(Dtype) * N); } @@ -166,12 +105,6 @@ template void caffe_copy(const int N, const unsigned int* X, template void caffe_copy(const int N, const float* X, float* Y); template void caffe_copy(const int N, const double* X, double* Y); -void caffe_gpu_memcpy(const size_t N, const void* X, void* Y) { - if (X != Y) { - CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); - } -} - template <> void caffe_scal(const int N, const float alpha, float *X) { cblas_sscal(N, alpha, X, 1); @@ -182,30 +115,6 @@ void caffe_scal(const int N, const double alpha, double *X) { cblas_dscal(N, alpha, X, 1); } -template <> -void caffe_gpu_scal(const int N, const float alpha, float *X) { - CUBLAS_CHECK(cublasSscal(Caffe::cublas_handle(), N, &alpha, X, 1)); -} - -template <> -void caffe_gpu_scal(const int N, const double alpha, double *X) { - CUBLAS_CHECK(cublasDscal(Caffe::cublas_handle(), N, &alpha, X, 1)); -} - -template <> -void caffe_gpu_axpby(const int N, const float alpha, const float* X, - const float beta, float* Y) { - caffe_gpu_scal(N, beta, Y); - caffe_gpu_axpy(N, alpha, X, Y); -} - -template <> -void caffe_gpu_axpby(const int N, const double alpha, const double* X, - const double beta, double* Y) { - caffe_gpu_scal(N, beta, Y); - caffe_gpu_axpy(N, alpha, X, Y); -} - template <> void caffe_cpu_axpby(const int N, const float alpha, const float* X, const float beta, float* Y) { @@ -407,18 +316,6 @@ double caffe_cpu_dot(const int n, const double* x, const double* y) { return cblas_ddot(n, x, 1, y, 1); } -template <> -void caffe_gpu_dot(const int n, const float* x, const float* y, - float* out) { - CUBLAS_CHECK(cublasSdot(Caffe::cublas_handle(), n, x, 1, y, 1, out)); -} - -template <> -void caffe_gpu_dot(const int n, const double* x, const double* y, - double * out) { - CUBLAS_CHECK(cublasDdot(Caffe::cublas_handle(), n, x, 1, y, 1, out)); -} - template <> int caffe_cpu_hamming_distance(const int n, const float* x, const float* y) { @@ -451,16 +348,6 @@ double caffe_cpu_asum(const int n, const double* x) { return cblas_dasum(n, x, 1); } -template <> -void caffe_gpu_asum(const int n, const float* x, float* y) { - CUBLAS_CHECK(cublasSasum(Caffe::cublas_handle(), n, x, 1, y)); -} - -template <> -void caffe_gpu_asum(const int n, const double* x, double* y) { - CUBLAS_CHECK(cublasDasum(Caffe::cublas_handle(), n, x, 1, y)); -} - INSTANTIATE_CAFFE_CPU_UNARY_FUNC(sign); INSTANTIATE_CAFFE_CPU_UNARY_FUNC(sgnbit); INSTANTIATE_CAFFE_CPU_UNARY_FUNC(fabs); @@ -479,18 +366,4 @@ void caffe_cpu_scale(const int n, const double alpha, const double *x, cblas_dscal(n, alpha, y, 1); } -template <> -void caffe_gpu_scale(const int n, const float alpha, const float *x, - float* y) { - CUBLAS_CHECK(cublasScopy(Caffe::cublas_handle(), n, x, 1, y, 1)); - CUBLAS_CHECK(cublasSscal(Caffe::cublas_handle(), n, &alpha, y, 1)); -} - -template <> -void caffe_gpu_scale(const int n, const double alpha, const double *x, - double* y) { - CUBLAS_CHECK(cublasDcopy(Caffe::cublas_handle(), n, x, 1, y, 1)); - CUBLAS_CHECK(cublasDscal(Caffe::cublas_handle(), n, &alpha, y, 1)); -} - } // namespace caffe diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index 849e53b9ca4..1e934931462 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -4,6 +4,7 @@ #include #include // thrust::plus #include + #include #include #include @@ -13,6 +14,136 @@ namespace caffe { +template <> +void caffe_gpu_gemm(const CBLAS_TRANSPOSE TransA, + const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, + const float alpha, const float* A, const float* B, const float beta, + float* C) { + // Note that cublas follows fortran order. + int lda = (TransA == CblasNoTrans) ? K : M; + int ldb = (TransB == CblasNoTrans) ? N : K; + cublasOperation_t cuTransA = + (TransA == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; + cublasOperation_t cuTransB = + (TransB == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; + CUBLAS_CHECK(cublasSgemm(Caffe::cublas_handle(), cuTransB, cuTransA, + N, M, K, &alpha, B, ldb, A, lda, &beta, C, N)); +} + +template <> +void caffe_gpu_gemm(const CBLAS_TRANSPOSE TransA, + const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, + const double alpha, const double* A, const double* B, const double beta, + double* C) { + // Note that cublas follows fortran order. + int lda = (TransA == CblasNoTrans) ? K : M; + int ldb = (TransB == CblasNoTrans) ? N : K; + cublasOperation_t cuTransA = + (TransA == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; + cublasOperation_t cuTransB = + (TransB == CblasNoTrans) ? CUBLAS_OP_N : CUBLAS_OP_T; + CUBLAS_CHECK(cublasDgemm(Caffe::cublas_handle(), cuTransB, cuTransA, + N, M, K, &alpha, B, ldb, A, lda, &beta, C, N)); +} + +template <> +void caffe_gpu_gemv(const CBLAS_TRANSPOSE TransA, const int M, + const int N, const float alpha, const float* A, const float* x, + const float beta, float* y) { + cublasOperation_t cuTransA = + (TransA == CblasNoTrans) ? CUBLAS_OP_T : CUBLAS_OP_N; + CUBLAS_CHECK(cublasSgemv(Caffe::cublas_handle(), cuTransA, N, M, &alpha, + A, N, x, 1, &beta, y, 1)); +} + +template <> +void caffe_gpu_gemv(const CBLAS_TRANSPOSE TransA, const int M, + const int N, const double alpha, const double* A, const double* x, + const double beta, double* y) { + cublasOperation_t cuTransA = + (TransA == CblasNoTrans) ? CUBLAS_OP_T : CUBLAS_OP_N; + CUBLAS_CHECK(cublasDgemv(Caffe::cublas_handle(), cuTransA, N, M, &alpha, + A, N, x, 1, &beta, y, 1)); +} + +template <> +void caffe_gpu_axpy(const int N, const float alpha, const float* X, + float* Y) { + CUBLAS_CHECK(cublasSaxpy(Caffe::cublas_handle(), N, &alpha, X, 1, Y, 1)); +} + +template <> +void caffe_gpu_axpy(const int N, const double alpha, const double* X, + double* Y) { + CUBLAS_CHECK(cublasDaxpy(Caffe::cublas_handle(), N, &alpha, X, 1, Y, 1)); +} + +void caffe_gpu_memcpy(const size_t N, const void* X, void* Y) { + if (X != Y) { + CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); + } +} + +template <> +void caffe_gpu_scal(const int N, const float alpha, float *X) { + CUBLAS_CHECK(cublasSscal(Caffe::cublas_handle(), N, &alpha, X, 1)); +} + +template <> +void caffe_gpu_scal(const int N, const double alpha, double *X) { + CUBLAS_CHECK(cublasDscal(Caffe::cublas_handle(), N, &alpha, X, 1)); +} + +template <> +void caffe_gpu_axpby(const int N, const float alpha, const float* X, + const float beta, float* Y) { + caffe_gpu_scal(N, beta, Y); + caffe_gpu_axpy(N, alpha, X, Y); +} + +template <> +void caffe_gpu_axpby(const int N, const double alpha, const double* X, + const double beta, double* Y) { + caffe_gpu_scal(N, beta, Y); + caffe_gpu_axpy(N, alpha, X, Y); +} + +template <> +void caffe_gpu_dot(const int n, const float* x, const float* y, + float* out) { + CUBLAS_CHECK(cublasSdot(Caffe::cublas_handle(), n, x, 1, y, 1, out)); +} + +template <> +void caffe_gpu_dot(const int n, const double* x, const double* y, + double * out) { + CUBLAS_CHECK(cublasDdot(Caffe::cublas_handle(), n, x, 1, y, 1, out)); +} + +template <> +void caffe_gpu_asum(const int n, const float* x, float* y) { + CUBLAS_CHECK(cublasSasum(Caffe::cublas_handle(), n, x, 1, y)); +} + +template <> +void caffe_gpu_asum(const int n, const double* x, double* y) { + CUBLAS_CHECK(cublasDasum(Caffe::cublas_handle(), n, x, 1, y)); +} + +template <> +void caffe_gpu_scale(const int n, const float alpha, const float *x, + float* y) { + CUBLAS_CHECK(cublasScopy(Caffe::cublas_handle(), n, x, 1, y, 1)); + CUBLAS_CHECK(cublasSscal(Caffe::cublas_handle(), n, &alpha, y, 1)); +} + +template <> +void caffe_gpu_scale(const int n, const double alpha, const double *x, + double* y) { + CUBLAS_CHECK(cublasDcopy(Caffe::cublas_handle(), n, x, 1, y, 1)); + CUBLAS_CHECK(cublasDscal(Caffe::cublas_handle(), n, &alpha, y, 1)); +} + template __global__ void set_kernel(const int n, const Dtype alpha, Dtype* y) { CUDA_KERNEL_LOOP(index, n) { diff --git a/tools/dump_network.cpp b/tools/dump_network.cpp index 8ed8edac284..c5aac604079 100644 --- a/tools/dump_network.cpp +++ b/tools/dump_network.cpp @@ -13,7 +13,6 @@ #include #include -#include "cuda_runtime.h" #include "fcntl.h" #include "google/protobuf/text_format.h" diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 22e74908a3f..22b0e61e227 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -1,7 +1,6 @@ // Copyright 2014 BVLC and contributors. #include // for snprintf -#include #include #include #include diff --git a/tools/finetune_net.cpp b/tools/finetune_net.cpp index c1cd788a1fb..4d80be9f4da 100644 --- a/tools/finetune_net.cpp +++ b/tools/finetune_net.cpp @@ -4,8 +4,6 @@ // Usage: // finetune_net solver_proto_file pretrained_net -#include - #include #include "caffe/caffe.hpp" diff --git a/tools/net_speed_benchmark.cpp b/tools/net_speed_benchmark.cpp index 4b65cfd3dcc..bdec391fbb6 100644 --- a/tools/net_speed_benchmark.cpp +++ b/tools/net_speed_benchmark.cpp @@ -1,6 +1,5 @@ // Copyright 2014 BVLC and contributors. -#include #include #include diff --git a/tools/test_net.cpp b/tools/test_net.cpp index c5819ec71b7..9d37536c758 100644 --- a/tools/test_net.cpp +++ b/tools/test_net.cpp @@ -6,8 +6,6 @@ // Usage: // test_net net_proto pretrained_net_proto iterations [CPU/GPU] -#include - #include #include #include diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 7c6f23e6240..41a33247854 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -5,8 +5,6 @@ // Usage: // train_net net_proto_file solver_proto_file [resume_point_file] -#include - #include #include "caffe/caffe.hpp" From 79a769c5841960dc755d0f233cd90a79a240fc2f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 17 Jul 2014 11:57:56 +0200 Subject: [PATCH 0265/2053] switch travis build to CPU-only flag, drop runtestnogpu target --- .travis.yml | 3 ++- Makefile | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index c0119756c6b..17b483caaa3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,10 +26,11 @@ before_script: - mv Makefile.config.example Makefile.config - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib - export NUM_THREADS=4 + - export CPU_ONLY=1 script: - make --keep-going --jobs=$NUM_THREADS all test warn lint - - make runtestnogpu + - make runtest - make --jobs=$NUM_THREADS all - make --jobs=$NUM_THREADS test - make --jobs=$NUM_THREADS warn diff --git a/Makefile b/Makefile index 417ff868218..109894dd7c7 100644 --- a/Makefile +++ b/Makefile @@ -294,7 +294,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo # Define build targets ############################## .PHONY: all test clean linecount lint tools examples $(DIST_ALIASES) \ - py mat py$(PROJECT) mat$(PROJECT) proto runtest runtestnogpu \ + py mat py$(PROJECT) mat$(PROJECT) proto runtest \ superclean supercleanlist supercleanfiles warn all: $(NAME) $(STATIC_NAME) tools examples @@ -356,9 +356,6 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) runtest: $(TEST_ALL_BIN) $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) -runtestnogpu: $(TEST_ALL_BIN) - $(TEST_ALL_BIN) --gtest_shuffle --gtest_filter="-*GPU*:*/2.*:*/3.*" - warn: $(EMPTY_WARN_REPORT) $(EMPTY_WARN_REPORT): $(ALL_WARNS) | $(BUILD_DIR) From 5b302f09dc844fe62dec653596838678214d777c Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 16 Jul 2014 15:24:48 +0200 Subject: [PATCH 0266/2053] relax benchmark test timing for cheap hardware / CI build --- src/caffe/test/test_benchmark.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/caffe/test/test_benchmark.cpp b/src/caffe/test/test_benchmark.cpp index b613a873ea4..6555b270ec4 100644 --- a/src/caffe/test/test_benchmark.cpp +++ b/src/caffe/test/test_benchmark.cpp @@ -63,8 +63,8 @@ TYPED_TEST(BenchmarkTest, TestTimerMilliSeconds) { EXPECT_FALSE(timer.has_run_at_least_once()); timer.Start(); usleep(300 * 1000); - EXPECT_GE(timer.MilliSeconds(), 298); - EXPECT_LE(timer.MilliSeconds(), 302); + EXPECT_GE(timer.MilliSeconds(), 295); + EXPECT_LE(timer.MilliSeconds(), 305); EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_TRUE(timer.has_run_at_least_once()); @@ -78,8 +78,8 @@ TYPED_TEST(BenchmarkTest, TestTimerSeconds) { EXPECT_FALSE(timer.has_run_at_least_once()); timer.Start(); usleep(300 * 1000); - EXPECT_GE(timer.Seconds(), 0.298); - EXPECT_LE(timer.Seconds(), 0.302); + EXPECT_GE(timer.Seconds(), 0.295); + EXPECT_LE(timer.Seconds(), 0.305); EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_TRUE(timer.has_run_at_least_once()); From f9f65e50dd44dc5fb43466f4364b2f414a1978f6 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 17 Jul 2014 11:32:29 +0200 Subject: [PATCH 0267/2053] check CPU-only everything, CPU + GPU build with travis --- .travis.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 17b483caaa3..c5445fcdb90 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,8 @@ before_install: install: - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - + - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb + - sudo apt-get -y update && sudo apt-get -y install cuda - curl https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -o /tmp/mdb.tar.gz && tar -C /tmp -xzvf /tmp/mdb.tar.gz && rm /tmp/mdb.tar.gz - cd /tmp/mdb-mdb/libraries/liblmdb/ && make && sudo make install && cd - @@ -26,9 +28,14 @@ before_script: - mv Makefile.config.example Makefile.config - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib - export NUM_THREADS=4 - - export CPU_ONLY=1 script: + # CPU-GPU: build only. + - export CPU_ONLY=0 + - make --keep-going --jobs=$NUM_THREADS all + - make clean + # CPU-only: comprehensive. + - export CPU_ONLY=1 - make --keep-going --jobs=$NUM_THREADS all test warn lint - make runtest - make --jobs=$NUM_THREADS all From d6f3adee56ef408c9c11b44ed74dac9d245a68a0 Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Thu, 17 Jul 2014 12:18:27 -0700 Subject: [PATCH 0268/2053] compute_image_mean namespace fix. --- tools/compute_image_mean.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 0c0f0f3f7e5..79bfdc7c4bb 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -13,6 +13,7 @@ using caffe::Datum; using caffe::BlobProto; +using std::string; using std::max; int main(int argc, char** argv) { From 8ad32ec1c4c790c5af629e424c453ca5c1cbefc9 Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Thu, 17 Jul 2014 17:01:17 -0700 Subject: [PATCH 0269/2053] lint --- include/caffe/common.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 0ee49f36030..cf4fd457318 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -6,6 +6,10 @@ #include #include +#include +#include +#include + #include "caffe/util/device_alternate.hpp" // Disable the copy and assignment operator for a class. From fa6397e891ccfa01cfadb11402b0ac3b62e60c72 Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Fri, 18 Jul 2014 13:32:25 -0700 Subject: [PATCH 0270/2053] cosmetics: add syntax = proto2 --- src/caffe/proto/caffe.proto | 2 ++ src/caffe/proto/caffe_pretty_print.proto | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 70a4ab2e8e9..e4b5ad312c4 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -1,5 +1,7 @@ // Copyright 2014 BVLC and contributors. +syntax = "proto2"; + package caffe; message BlobProto { diff --git a/src/caffe/proto/caffe_pretty_print.proto b/src/caffe/proto/caffe_pretty_print.proto index cfdce82c79f..f34988c9645 100644 --- a/src/caffe/proto/caffe_pretty_print.proto +++ b/src/caffe/proto/caffe_pretty_print.proto @@ -1,5 +1,7 @@ // Copyright 2014 BVLC and contributors. +syntax = "proto2"; + package caffe; import "caffe/proto/caffe.proto"; From 7683986be557fe9d6f44ec1cdd6a2cfd889c07ed Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Fri, 18 Jul 2014 15:18:14 -0700 Subject: [PATCH 0271/2053] reapply namespace change --- include/caffe/common.hpp | 11 +++++++++++ include/caffe/layer.hpp | 3 --- include/caffe/net.hpp | 6 ------ include/caffe/test/test_gradient_check_util.hpp | 6 ++---- include/caffe/util/insert_splits.hpp | 3 --- include/caffe/util/io.hpp | 1 - include/caffe/util/upgrade_proto.hpp | 2 -- src/caffe/layer_factory.cpp | 2 -- src/caffe/layers/accuracy_layer.cpp | 2 -- src/caffe/layers/bnll_layer.cpp | 4 +--- src/caffe/layers/bnll_layer.cu | 2 -- src/caffe/layers/dropout_layer.cu | 2 -- src/caffe/layers/hdf5_output_layer.cpp | 1 - src/caffe/layers/hdf5_output_layer.cu | 1 - src/caffe/layers/hinge_loss_layer.cpp | 5 ++--- src/caffe/layers/image_data_layer.cpp | 3 --- src/caffe/layers/image_data_layer.cu | 2 -- src/caffe/layers/infogain_loss_layer.cpp | 6 ++---- src/caffe/layers/loss_layer.cpp | 2 -- src/caffe/layers/multinomial_logistic_loss_layer.cpp | 8 ++++---- src/caffe/layers/pooling_layer.cpp | 6 +++--- src/caffe/layers/pooling_layer.cu | 3 --- src/caffe/layers/power_layer.cpp | 2 -- src/caffe/layers/power_layer.cu | 2 -- src/caffe/layers/relu_layer.cpp | 4 +--- src/caffe/layers/relu_layer.cu | 2 -- src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp | 2 -- src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu | 2 -- src/caffe/layers/sigmoid_layer.cu | 2 -- src/caffe/layers/softmax_layer.cpp | 4 +--- src/caffe/layers/softmax_layer.cu | 2 -- src/caffe/layers/softmax_loss_layer.cpp | 6 ++---- src/caffe/layers/softmax_loss_layer.cu | 2 -- src/caffe/layers/threshold_layer.cu | 2 -- src/caffe/layers/window_data_layer.cpp | 3 --- src/caffe/layers/window_data_layer.cu | 3 --- src/caffe/net.cpp | 4 ---- src/caffe/solver.cpp | 3 --- src/caffe/test/test_power_layer.cpp | 4 ++-- src/caffe/util/insert_splits.cpp | 5 ----- src/caffe/util/io.cpp | 8 ++------ src/caffe/util/upgrade_proto.cpp | 3 --- 42 files changed, 33 insertions(+), 113 deletions(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index cf4fd457318..2c79f2bc326 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -68,6 +68,17 @@ namespace caffe { // because cuda does not work (at least now) well with C++11 features. using boost::shared_ptr; +// Common functions and classes from std that caffe often uses. +using std::fstream; +using std::ios; +using std::iterator; +using std::make_pair; +using std::map; +using std::ostringstream; +using std::pair; +using std::set; +using std::string; +using std::vector; // A singleton class to hold common caffe stuff, such as the handler that // caffe is going to use for cublas, curand, etc. diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 6d2374fc9ab..aac82447a41 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -13,9 +13,6 @@ namespace caffe { -using std::string; -using std::vector; - template class Layer { public: diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index ce82e28602c..8a2df2bf17f 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -16,12 +16,6 @@ namespace caffe { -using std::map; -using std::pair; -using std::set; -using std::string; -using std::vector; - template class Net { public: diff --git a/include/caffe/test/test_gradient_check_util.hpp b/include/caffe/test/test_gradient_check_util.hpp index 2d551f82428..034aeccb90b 100644 --- a/include/caffe/test/test_gradient_check_util.hpp +++ b/include/caffe/test/test_gradient_check_util.hpp @@ -13,8 +13,6 @@ #include "caffe/layer.hpp" #include "caffe/net.hpp" -using std::max; - namespace caffe { // The gradient checker adds a L2 normalization loss function on top of the @@ -160,8 +158,8 @@ void GradientChecker::CheckGradientSingle(Layer* layer, || fabs(feature) > kink_ + kink_range_) { // We check relative accuracy, but for too small values, we threshold // the scale factor by 1. - Dtype scale = max( - max(fabs(computed_gradient), fabs(estimated_gradient)), 1.); + Dtype scale = std::max( + std::max(fabs(computed_gradient), fabs(estimated_gradient)), 1.); EXPECT_NEAR(computed_gradient, estimated_gradient, threshold_ * scale) << "debug: (top_id, top_data_id, blob_id, feat_id)=" << top_id << "," << top_data_id << "," << blob_id << "," << feat_id; diff --git a/include/caffe/util/insert_splits.hpp b/include/caffe/util/insert_splits.hpp index 45c3a051021..4da1ea81502 100644 --- a/include/caffe/util/insert_splits.hpp +++ b/include/caffe/util/insert_splits.hpp @@ -9,9 +9,6 @@ namespace caffe { -using std::pair; -using std::string; - // Copy NetParameters with SplitLayers added to replace any shared bottom // blobs with unique bottom blobs provided by the SplitLayer. void InsertSplits(const NetParameter& param, NetParameter* param_split); diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index accb0947a9c..631dbe7ca64 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -16,7 +16,6 @@ namespace caffe { -using std::string; using ::google::protobuf::Message; bool ReadProtoFromTextFile(const char* filename, Message* proto); diff --git a/include/caffe/util/upgrade_proto.hpp b/include/caffe/util/upgrade_proto.hpp index 0772f803057..39e4f4ce22c 100644 --- a/include/caffe/util/upgrade_proto.hpp +++ b/include/caffe/util/upgrade_proto.hpp @@ -10,8 +10,6 @@ namespace caffe { -using std::string; - // Return true iff any layer contains parameters specified using // deprecated V0LayerParameter. bool NetNeedsUpgrade(const NetParameter& net_param); diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 173c870f6ae..e6cbe187c3c 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -11,8 +11,6 @@ namespace caffe { -using std::string; - // A function to get a specific layer from the specification given in // LayerParameter. Ideally this would be replaced by a factory pattern, // but we will leave it this way for now. diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index ddfe38ab38e..95439b9af85 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -13,8 +13,6 @@ namespace caffe { -using std::max; - template void AccuracyLayer::SetUp( const vector*>& bottom, vector*>* top) { diff --git a/src/caffe/layers/bnll_layer.cpp b/src/caffe/layers/bnll_layer.cpp index 992c7e09526..9b7a0642779 100644 --- a/src/caffe/layers/bnll_layer.cpp +++ b/src/caffe/layers/bnll_layer.cpp @@ -8,8 +8,6 @@ namespace caffe { -using std::min; - const float kBNLL_THRESHOLD = 50.; template @@ -37,7 +35,7 @@ void BNLLLayer::Backward_cpu(const vector*>& top, const int count = (*bottom)[0]->count(); Dtype expval; for (int i = 0; i < count; ++i) { - expval = exp(min(bottom_data[i], Dtype(kBNLL_THRESHOLD))); + expval = exp(std::min(bottom_data[i], Dtype(kBNLL_THRESHOLD))); bottom_diff[i] = top_diff[i] * expval / (expval + 1.); } } diff --git a/src/caffe/layers/bnll_layer.cu b/src/caffe/layers/bnll_layer.cu index 8fbe7f79eed..bc6a201e9b4 100644 --- a/src/caffe/layers/bnll_layer.cu +++ b/src/caffe/layers/bnll_layer.cu @@ -8,8 +8,6 @@ namespace caffe { -using std::max; - const float kBNLL_THRESHOLD = 50.; template diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index c9f3ecd2dd5..2316c9e0211 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -10,8 +10,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::max; - namespace caffe { diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index ffa240f15cc..accc9f9ccdd 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -12,7 +12,6 @@ #include "caffe/vision_layers.hpp" namespace caffe { -using std::vector; template HDF5OutputLayer::HDF5OutputLayer(const LayerParameter& param) diff --git a/src/caffe/layers/hdf5_output_layer.cu b/src/caffe/layers/hdf5_output_layer.cu index 744b8fe1128..5c790555e50 100644 --- a/src/caffe/layers/hdf5_output_layer.cu +++ b/src/caffe/layers/hdf5_output_layer.cu @@ -12,7 +12,6 @@ #include "caffe/vision_layers.hpp" namespace caffe { -using std::vector; template Dtype HDF5OutputLayer::Forward_gpu(const vector*>& bottom, diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index 8097761d22b..91fe1534da9 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -10,8 +10,6 @@ #include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" -using std::max; - namespace caffe { template @@ -30,7 +28,8 @@ Dtype HingeLossLayer::Forward_cpu(const vector*>& bottom, } for (int i = 0; i < num; ++i) { for (int j = 0; j < dim; ++j) { - bottom_diff[i * dim + j] = max(Dtype(0), 1 + bottom_diff[i * dim + j]); + bottom_diff[i * dim + j] = std::max( + Dtype(0), 1 + bottom_diff[i * dim + j]); } } switch (this->layer_param_.hinge_loss_param().norm()) { diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 408452f5d80..e7779ae4980 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -18,9 +18,6 @@ namespace caffe { -using std::iterator; -using std::pair; - template void* ImageDataLayerPrefetch(void* layer_pointer) { CHECK(layer_pointer); diff --git a/src/caffe/layers/image_data_layer.cu b/src/caffe/layers/image_data_layer.cu index cf74853d902..0fa5842c570 100644 --- a/src/caffe/layers/image_data_layer.cu +++ b/src/caffe/layers/image_data_layer.cu @@ -17,8 +17,6 @@ namespace caffe { -using std::pair; - template Dtype ImageDataLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index a72874e4bb4..204f6c305ca 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -10,8 +10,6 @@ #include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" -using std::max; - namespace caffe { template @@ -44,7 +42,7 @@ Dtype InfogainLossLayer::Forward_cpu(const vector*>& bottom, for (int i = 0; i < num; ++i) { int label = static_cast(bottom_label[i]); for (int j = 0; j < dim; ++j) { - Dtype prob = max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); + Dtype prob = std::max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); loss -= infogain_mat[label * dim + j] * log(prob); } } @@ -73,7 +71,7 @@ void InfogainLossLayer::Backward_cpu(const vector*>& top, for (int i = 0; i < num; ++i) { int label = static_cast(bottom_label[i]); for (int j = 0; j < dim; ++j) { - Dtype prob = max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); + Dtype prob = std::max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); bottom_diff[i * dim + j] = - infogain_mat[label * dim + j] / prob / num; } } diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index ac8ad216732..92eb06f7b0c 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -10,8 +10,6 @@ #include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" -using std::max; - namespace caffe { template diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index 8687784d6ab..beea747c31b 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -10,8 +10,6 @@ #include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" -using std::max; - namespace caffe { template @@ -32,7 +30,8 @@ Dtype MultinomialLogisticLossLayer::Forward_cpu( Dtype loss = 0; for (int i = 0; i < num; ++i) { int label = static_cast(bottom_label[i]); - Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); + Dtype prob = std::max( + bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); loss -= log(prob); } if (top->size() == 1) { @@ -58,7 +57,8 @@ void MultinomialLogisticLossLayer::Backward_cpu( caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); for (int i = 0; i < num; ++i) { int label = static_cast(bottom_label[i]); - Dtype prob = max(bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); + Dtype prob = std::max( + bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); bottom_diff[i * dim + label] = -1. / prob / num; } } diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index d6fef07ba46..37da4d1795a 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -10,11 +10,11 @@ #include "caffe/syncedmem.hpp" #include "caffe/util/math_functions.hpp" -using std::max; -using std::min; - namespace caffe { +using std::min; +using std::max; + template void PoolingLayer::SetUp(const vector*>& bottom, vector*>* top) { diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index a44b1770ee3..4aa94921a31 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -8,9 +8,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::max; -using std::min; - namespace caffe { template diff --git a/src/caffe/layers/power_layer.cpp b/src/caffe/layers/power_layer.cpp index 4607457a460..55ace207b7a 100644 --- a/src/caffe/layers/power_layer.cpp +++ b/src/caffe/layers/power_layer.cpp @@ -7,8 +7,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::max; - namespace caffe { template diff --git a/src/caffe/layers/power_layer.cu b/src/caffe/layers/power_layer.cu index e7f9831eb13..0aa00272eea 100644 --- a/src/caffe/layers/power_layer.cu +++ b/src/caffe/layers/power_layer.cu @@ -7,8 +7,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::max; - namespace caffe { template diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index 6d6017442d4..1e1195501e8 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -6,8 +6,6 @@ #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -using std::max; - namespace caffe { template @@ -17,7 +15,7 @@ Dtype ReLULayer::Forward_cpu(const vector*>& bottom, Dtype* top_data = (*top)[0]->mutable_cpu_data(); const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { - top_data[i] = max(bottom_data[i], Dtype(0)); + top_data[i] = std::max(bottom_data[i], Dtype(0)); } return Dtype(0); } diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index 2ad689126a3..e8b0fbeea57 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -6,8 +6,6 @@ #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -using std::max; - namespace caffe { template diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index 074fa6cef3c..31522dd1fe6 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -8,8 +8,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::max; - namespace caffe { template diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu index 0c858cdfc19..1d1f8cd51ff 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu @@ -8,8 +8,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::max; - namespace caffe { template diff --git a/src/caffe/layers/sigmoid_layer.cu b/src/caffe/layers/sigmoid_layer.cu index d55968e58c2..28cc7f1daa6 100644 --- a/src/caffe/layers/sigmoid_layer.cu +++ b/src/caffe/layers/sigmoid_layer.cu @@ -7,8 +7,6 @@ #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -using std::max; - namespace caffe { template diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 665cfaec3ad..0de1403585a 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -7,8 +7,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::max; - namespace caffe { template @@ -40,7 +38,7 @@ Dtype SoftmaxLayer::Forward_cpu(const vector*>& bottom, for (int i = 0; i < num; ++i) { scale_data[i] = bottom_data[i*dim]; for (int j = 0; j < dim; ++j) { - scale_data[i] = max(scale_data[i], bottom_data[i * dim + j]); + scale_data[i] = std::max(scale_data[i], bottom_data[i * dim + j]); } } // subtraction diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index ceeaff5b020..d471ba51cd0 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -10,8 +10,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::max; - namespace caffe { template diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index c87270eab22..4e957cee9b4 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -8,8 +8,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::max; - namespace caffe { template @@ -43,8 +41,8 @@ Dtype SoftmaxWithLossLayer::Forward_cpu( int dim = prob_.count() / num; Dtype loss = 0; for (int i = 0; i < num; ++i) { - loss += -log(max(prob_data[i * dim + static_cast(label[i])], - Dtype(FLT_MIN))); + loss += -log(std::max(prob_data[i * dim + static_cast(label[i])], + Dtype(FLT_MIN))); } if (top->size() >= 1) { (*top)[0]->mutable_cpu_data()[0] = loss / num; diff --git a/src/caffe/layers/softmax_loss_layer.cu b/src/caffe/layers/softmax_loss_layer.cu index e46be6ba85d..ae7060d90bd 100644 --- a/src/caffe/layers/softmax_loss_layer.cu +++ b/src/caffe/layers/softmax_loss_layer.cu @@ -8,8 +8,6 @@ #include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" -using std::max; - namespace caffe { template diff --git a/src/caffe/layers/threshold_layer.cu b/src/caffe/layers/threshold_layer.cu index 03eb3f32d49..fb973b2ba82 100644 --- a/src/caffe/layers/threshold_layer.cu +++ b/src/caffe/layers/threshold_layer.cu @@ -6,8 +6,6 @@ #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" -using std::max; - namespace caffe { template diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index c45a1521db4..8c8de348628 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -28,9 +28,6 @@ namespace caffe { -using std::map; -using std::pair; - template void* WindowDataLayerPrefetch(void* layer_pointer) { WindowDataLayer* layer = diff --git a/src/caffe/layers/window_data_layer.cu b/src/caffe/layers/window_data_layer.cu index d4efeca06c1..49f67d2b607 100644 --- a/src/caffe/layers/window_data_layer.cu +++ b/src/caffe/layers/window_data_layer.cu @@ -18,9 +18,6 @@ namespace caffe { -using std::map; -using std::pair; - template Dtype WindowDataLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index aba4cc2f4f2..520ee587828 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -15,10 +15,6 @@ #include "caffe/util/math_functions.hpp" #include "caffe/util/upgrade_proto.hpp" -using std::make_pair; -using std::map; -using std::pair; -using std::set; namespace caffe { diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index edfa9c0063e..a33149721bf 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -12,9 +12,6 @@ #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" -using std::max; -using std::min; - namespace caffe { template diff --git a/src/caffe/test/test_power_layer.cpp b/src/caffe/test/test_power_layer.cpp index c9992d57f65..d4e6fc5b05e 100644 --- a/src/caffe/test/test_power_layer.cpp +++ b/src/caffe/test/test_power_layer.cpp @@ -55,8 +55,8 @@ class PowerLayerTest : public MultiDeviceTest { if (isnan(expected_value)) { EXPECT_TRUE(isnan(top_data[i])); } else { - Dtype precision = max(Dtype(abs(expected_value * 0.0001)), - min_precision); + Dtype precision = std::max( + Dtype(std::abs(expected_value * Dtype(1e-4))), min_precision); EXPECT_NEAR(expected_value, top_data[i], precision); } } diff --git a/src/caffe/util/insert_splits.cpp b/src/caffe/util/insert_splits.cpp index b9aeb37c71b..4de546810e5 100644 --- a/src/caffe/util/insert_splits.cpp +++ b/src/caffe/util/insert_splits.cpp @@ -8,11 +8,6 @@ #include "caffe/common.hpp" #include "caffe/util/insert_splits.hpp" -using std::map; -using std::ostringstream; -using std::pair; -using std::make_pair; - namespace caffe { void InsertSplits(const NetParameter& param, NetParameter* param_split) { diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index ff65bd64d88..4f200474459 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -19,10 +19,8 @@ #include "caffe/util/io.hpp" #include "caffe/proto/caffe.pb.h" -using std::fstream; -using std::ios; -using std::max; -using std::string; +namespace caffe { + using google::protobuf::io::FileInputStream; using google::protobuf::io::FileOutputStream; using google::protobuf::io::ZeroCopyInputStream; @@ -31,8 +29,6 @@ using google::protobuf::io::ZeroCopyOutputStream; using google::protobuf::io::CodedOutputStream; using google::protobuf::Message; -namespace caffe { - bool ReadProtoFromTextFile(const char* filename, Message* proto) { int fd = open(filename, O_RDONLY); CHECK_NE(fd, -1) << "File not found: " << filename; diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index e079b422dfb..a17beed70a7 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -12,9 +12,6 @@ #include "caffe/util/upgrade_proto.hpp" #include "caffe/proto/caffe.pb.h" -using std::map; -using std::string; - namespace caffe { bool NetNeedsUpgrade(const NetParameter& net_param) { From ccc4b30c04632416393ef261fcd17945e161aaee Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Mon, 17 Feb 2014 16:35:38 -0800 Subject: [PATCH 0272/2053] add Net::Forward/Backward From/To --- include/caffe/net.hpp | 6 +++++ src/caffe/net.cpp | 56 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index ce82e28602c..d7282f551b8 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -35,6 +35,9 @@ class Net { // Run forward with the input blobs already fed separately. You can get the // input blobs using input_blobs(). const vector*>& ForwardPrefilled(Dtype* loss = NULL); + Dtype ForwardFromTo(int start, int end); + Dtype ForwardFrom(int start); + Dtype ForwardTo(int end); // Run forward using a set of bottom blobs, and return the result. const vector*>& Forward(const vector* > & bottom, Dtype* loss = NULL); @@ -46,6 +49,9 @@ class Net { // computes the gradient w.r.t the parameters, and the data has already // been provided during the forward pass. void Backward(); + void BackwardFromTo(int start, int end); + void BackwardFrom(int start); + void BackwardTo(int end); Dtype ForwardBackward(const vector* > & bottom) { Dtype loss; diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index aba4cc2f4f2..cadcdcdf109 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -335,16 +335,34 @@ void Net::GetLearningRateAndWeightDecay() { } template -const vector*>& Net::ForwardPrefilled(Dtype* loss) { - if (loss != NULL) { - *loss = Dtype(0.); - } - for (int i = 0; i < layers_.size(); ++i) { +Dtype Net::ForwardFromTo(int start, int end) { + CHECK_GE(start, 0); + CHECK_LT(end, layers_.size()); + Dtype loss = 0; + for (int i = start; i <= end; ++i) { // LOG(ERROR) << "Forwarding " << layer_names_[i]; Dtype layer_loss = layers_[i]->Forward(bottom_vecs_[i], &top_vecs_[i]); - if (loss != NULL) { - *loss += layer_loss; - } + loss += layer_loss; + } + return loss; +} + +template +Dtype Net::ForwardFrom(int start) { + return ForwardFromTo(start, layers_.size() - 1); +} + +template +Dtype Net::ForwardTo(int end) { + return ForwardFromTo(0, end); +} + +template +const vector*>& Net::ForwardPrefilled(Dtype* loss) { + if (loss != NULL) { + *loss = ForwardFromTo(0, layers_.size() - 1); + } else { + ForwardFromTo(0, layers_.size() - 1); } return net_output_blobs_; } @@ -380,10 +398,11 @@ string Net::Forward(const string& input_blob_protos, Dtype* loss) { return output; } - template -void Net::Backward() { - for (int i = layers_.size() - 1; i >= 0; --i) { +void Net::BackwardFromTo(int start, int end) { + CHECK_GE(end, 0); + CHECK_LT(start, layers_.size()); + for (int i = start; i >= end; --i) { if (layer_need_backward_[i]) { layers_[i]->Backward( top_vecs_[i], bottom_need_backward_[i], &bottom_vecs_[i]); @@ -422,6 +441,21 @@ void Net::ShareTrainedLayersWith(Net* other) { } } +template +void Net::BackwardFrom(int start) { + BackwardFromTo(start, 0); +} + +template +void Net::BackwardTo(int end) { + BackwardFromTo(layers_.size() - 1, end); +} + +template +void Net::Backward() { + BackwardFromTo(layers_.size() - 1, 0); +} + template void Net::CopyTrainedLayersFrom(const NetParameter& param) { int num_source_layers = param.layers_size(); From 3ef43e41e74f4cebf8b1be006bf0b596a6b37e5a Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Wed, 18 Jun 2014 21:03:28 -0700 Subject: [PATCH 0273/2053] pycaffe: expose Forward/Backward From/To as kwargs start and end --- python/caffe/_caffe.cpp | 8 ++++---- python/caffe/pycaffe.py | 43 ++++++++++++++++++++++++++++++++--------- 2 files changed, 38 insertions(+), 13 deletions(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index e9fe5cd3b05..10fc23b7974 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -181,12 +181,12 @@ struct CaffeNet { } } - void Forward() { - net_->ForwardPrefilled(); + void Forward(int start, int end) { + net_->ForwardFromTo(start, end); } - void Backward() { - net_->Backward(); + void Backward(int start, int end) { + net_->BackwardFromTo(start, end); } void set_input_arrays(object data_obj, object labels_obj) { diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 5c1512cd8b9..0ac1868663d 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -34,8 +34,7 @@ def _Net_params(self): return OrderedDict([(lr.name, lr.blobs) for lr in self.layers if len(lr.blobs) > 0]) - -def _Net_forward(self, blobs=None, **kwargs): +def _Net_forward(self, blobs=None, start=None, end=None, **kwargs): """ Forward pass: prepare inputs and run the net forward. @@ -44,6 +43,8 @@ def _Net_forward(self, blobs=None, **kwargs): kwargs: Keys are input blob names and values are blob ndarrays. For formatting inputs for Caffe, see Net.preprocess(). If None, input is taken from data layers. + start: optional name of layer at which to begin the forward pass + end: optional name of layer at which to finish the forward pass (inclusive) Give outs: {blob name: blob ndarray} dict. @@ -51,6 +52,18 @@ def _Net_forward(self, blobs=None, **kwargs): if blobs is None: blobs = [] + if start is not None: + start_ind = [lr.name for lr in self.layers].index(start) + else: + start_ind = 0 + + if end is not None: + end_ind = [lr.name for lr in self.layers].index(end) + outputs = set([end] + blobs) + else: + end_ind = len(self.layers) - 1 + outputs = set(self.outputs + blobs) + if kwargs: if set(kwargs.keys()) != set(self.inputs): raise Exception('Input blob arguments do not match net inputs.') @@ -63,14 +76,13 @@ def _Net_forward(self, blobs=None, **kwargs): raise Exception('{} blob is not 4-d'.format(in_)) self.blobs[in_].data[...] = blob - self._forward() + self._forward(start_ind, end_ind) # Unpack blobs to extract - outs = {out: self.blobs[out].data for out in set(self.outputs + blobs)} - return outs + return {out: self.blobs[out].data for out in outputs} -def _Net_backward(self, diffs=None, **kwargs): +def _Net_backward(self, diffs=None, start=None, end=None, **kwargs): """ Backward pass: prepare diffs and run the net backward. @@ -78,6 +90,8 @@ def _Net_backward(self, diffs=None, **kwargs): diffs: list of diffs to return in addition to bottom diffs. kwargs: Keys are output blob names and values are diff ndarrays. If None, top diffs are taken from forward loss. + start: optional name of layer at which to begin the backward pass + end: optional name of layer at which to finish the backward pass (inclusive) Give outs: {blob name: diff ndarray} dict. @@ -85,6 +99,18 @@ def _Net_backward(self, diffs=None, **kwargs): if diffs is None: diffs = [] + if start is not None: + start_ind = [lr.name for lr in self.layers].index(start) + else: + start_ind = len(self.layers) - 1 + + if end is not None: + end_ind = [lr.name for lr in self.layers].index(end) + outputs = set([end] + diffs) + else: + end_ind = 0 + outputs = set(self.inputs + diffs) + if kwargs: if set(kwargs.keys()) != set(self.outputs): raise Exception('Top diff arguments do not match net outputs.') @@ -97,11 +123,10 @@ def _Net_backward(self, diffs=None, **kwargs): raise Exception('{} diff is not 4-d'.format(top)) self.blobs[top].diff[...] = diff - self._backward() + self._backward(start_ind, end_ind) # Unpack diffs to extract - outs = {out: self.blobs[out].diff for out in set(self.inputs + diffs)} - return outs + return {out: self.blobs[out].diff for out in outputs} def _Net_forward_all(self, blobs=None, **kwargs): From a27076315e0bacb9216ab3074a281ad017bef98b Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Fri, 18 Jul 2014 15:36:39 -0700 Subject: [PATCH 0274/2053] comment in net.hpp to explain subtleties of From/To on DAGs --- include/caffe/net.hpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index d7282f551b8..44f28b2a04f 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -35,6 +35,13 @@ class Net { // Run forward with the input blobs already fed separately. You can get the // input blobs using input_blobs(). const vector*>& ForwardPrefilled(Dtype* loss = NULL); + + // The From and To variants of Forward and Backward operate on the + // (topological) ordering by which the net is specified. For general DAG + // networks, note that (1) computing from one layer to another might entail + // extra computation on unrelated branches, and (2) computation starting in + // the middle may be incorrect if all of the layers of a fan-in are not + // included. Dtype ForwardFromTo(int start, int end); Dtype ForwardFrom(int start); Dtype ForwardTo(int end); From 1c2328606b7f8b78c0ea5af8637cec09b1e7aa8b Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Fri, 18 Jul 2014 15:39:17 -0700 Subject: [PATCH 0275/2053] test consistency of From/To Forward/Backward --- src/caffe/test/test_net.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index c30f4168edc..e84701d941c 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -801,4 +801,38 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { } } +TYPED_TEST(NetTest, TestFromTo) { + typedef typename TypeParam::Dtype Dtype; + this->InitTinyNet(); + + // Run Forward and Backward, recording the data diff and loss. + Blob data; + data.ReshapeLike(*this->net_->blob_by_name("data")); + this->net_->ForwardPrefilled(); + this->net_->Backward(); + data.CopyFrom(*this->net_->blob_by_name("data"), true, true); + const Dtype *loss_ptr = this->net_->output_blobs()[0]->cpu_data(); + Dtype loss = *loss_ptr; + + // Check that combining partial Forwards gives the same loss. + for (int i = 1; i < this->net_->layers().size(); ++i) { + // Note that we skip layer zero to keep the same data. + this->net_->ForwardFromTo(1, 1); + if (i < this->net_->layers().size() - 1) { + this->net_->ForwardFrom(i + 1); + } + EXPECT_EQ(loss, *loss_ptr); + } + + // Check that combining partial Backwards gives the same data diff. + for (int i = 1; i < this->net_->layers().size(); ++i) { + this->net_->BackwardTo(i); + this->net_->BackwardFrom(i - 1); + for (int j = 0; j < data.count(); ++j) { + EXPECT_EQ(data.cpu_diff()[j], + this->net_->blob_by_name("data")->cpu_diff()[j]); + } + } +} + } // namespace caffe From 49381cc22c360b0c4c8c8e0df93ec6a445db3f30 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Fri, 18 Jul 2014 16:13:24 -0700 Subject: [PATCH 0276/2053] use /usr instead of /usr/local for default Python include/lib This makes the default settings usable with Travis/Ubuntu Python --- Makefile.config.example | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile.config.example b/Makefile.config.example index 708a39c7841..7c96d8a9356 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -42,15 +42,15 @@ BLAS := atlas # NOTE: this is required only if you will compile the python interface. # We need to be able to find Python.h and numpy/arrayobject.h. -PYTHON_INCLUDE := /usr/local/include/python2.7 \ - /usr/local/lib/python2.7/dist-packages/numpy/core/include +PYTHON_INCLUDE := /usr/include/python2.7 \ + /usr/lib/python2.7/dist-packages/numpy/core/include # Anaconda Python distribution is quite popular. Include path: # PYTHON_INCLUDE := $(HOME)/anaconda/include \ # $(HOME)/anaconda/include/python2.7 \ # $(HOME)/anaconda/lib/python2.7/site-packages/numpy/core/include # We need to be able to find libpythonX.X.so or .dylib. -PYTHON_LIB := /usr/local/lib +PYTHON_LIB := /usr/lib # PYTHON_LIB := $(HOME)/anaconda/lib # Whatever else you find you need goes here. From e8b23c47a9fe1b0cd6b707ced1b4ace202fd0e37 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Fri, 18 Jul 2014 15:48:36 -0700 Subject: [PATCH 0277/2053] Travis builds pycaffe --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c5445fcdb90..4a65090b7c4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ before_install: - echo $LANG - echo $LC_ALL - sudo apt-get -y update - - sudo apt-get -y install wget git curl python-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc + - sudo apt-get -y install wget git curl python-dev python-numpy libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc install: - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz @@ -42,6 +42,7 @@ script: - make --jobs=$NUM_THREADS test - make --jobs=$NUM_THREADS warn - make --jobs=$NUM_THREADS lint + - make --jobs=$NUM_THREADS pycaffe notifications: # Emails are sent to the committer's git-configured email address by default, From fc48d5de5c95255ad98eea8666910482235b1c75 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Fri, 18 Jul 2014 16:31:16 -0700 Subject: [PATCH 0278/2053] pycaffe: allow unspecified mean. Fixes #671. --- python/caffe/pycaffe.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 5c1512cd8b9..a2fb16ba06f 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -259,7 +259,6 @@ def _Net_preprocess(self, input_name, input_): caffe_in = input_.astype(np.float32) input_scale = self.input_scale.get(input_name) channel_order = self.channel_swap.get(input_name) - mean = self.mean.get(input_name) in_size = self.blobs[input_name].data.shape[2:] if caffe_in.shape[:2] != in_size: caffe_in = caffe.io.resize_image(caffe_in, in_size) @@ -268,8 +267,8 @@ def _Net_preprocess(self, input_name, input_): if channel_order: caffe_in = caffe_in[:, :, channel_order] caffe_in = caffe_in.transpose((2, 0, 1)) - if mean is not None: - caffe_in -= mean + if hasattr(self, 'mean'): + caffe_in -= self.mean.get(input_name, 0) return caffe_in @@ -280,9 +279,8 @@ def _Net_deprocess(self, input_name, input_): decaf_in = input_.copy().squeeze() input_scale = self.input_scale.get(input_name) channel_order = self.channel_swap.get(input_name) - mean = self.mean.get(input_name) - if mean is not None: - decaf_in += mean + if hasattr(self, 'mean'): + decaf_in += self.mean.get(input_name, 0) decaf_in = decaf_in.transpose((1,2,0)) if channel_order: channel_order_inverse = [channel_order.index(i) From 32fefa96f9ba585bbbf4fff19fef89c3ec125a89 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Fri, 18 Jul 2014 16:32:12 -0700 Subject: [PATCH 0279/2053] pycaffe: reorder exceptions It doesn't make sense to complain about input not being batch-sized if it isn't even 4-d in the first place. --- python/caffe/pycaffe.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index a2fb16ba06f..dde838d6600 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -57,10 +57,10 @@ def _Net_forward(self, blobs=None, **kwargs): # Set input according to defined shapes and make arrays single and # C-contiguous as Caffe expects. for in_, blob in kwargs.iteritems(): - if blob.shape[0] != self.blobs[in_].num: - raise Exception('Input is not batch sized') if blob.ndim != 4: raise Exception('{} blob is not 4-d'.format(in_)) + if blob.shape[0] != self.blobs[in_].num: + raise Exception('Input is not batch sized') self.blobs[in_].data[...] = blob self._forward() @@ -91,10 +91,10 @@ def _Net_backward(self, diffs=None, **kwargs): # Set top diffs according to defined shapes and make arrays single and # C-contiguous as Caffe expects. for top, diff in kwargs.iteritems(): - if diff.shape[0] != self.blobs[top].num: - raise Exception('Diff is not batch sized') if diff.ndim != 4: raise Exception('{} diff is not 4-d'.format(top)) + if diff.shape[0] != self.blobs[top].num: + raise Exception('Diff is not batch sized') self.blobs[top].diff[...] = diff self._backward() From fb2f7c1c2757e2a7e48860f75b6a091f7351fc68 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Fri, 18 Jul 2014 16:45:17 -0700 Subject: [PATCH 0280/2053] pycaffe: test channel_order and input_scale against None An input_scale of zero should produce warnings/errors/infinities rather than being the same as an input_scale of one. A channel_order of () or 0 should not be equivalent to the default ordering. --- python/caffe/pycaffe.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index dde838d6600..5f04a95246b 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -262,9 +262,9 @@ def _Net_preprocess(self, input_name, input_): in_size = self.blobs[input_name].data.shape[2:] if caffe_in.shape[:2] != in_size: caffe_in = caffe.io.resize_image(caffe_in, in_size) - if input_scale: + if input_scale is not None: caffe_in *= input_scale - if channel_order: + if channel_order is not None: caffe_in = caffe_in[:, :, channel_order] caffe_in = caffe_in.transpose((2, 0, 1)) if hasattr(self, 'mean'): @@ -282,11 +282,11 @@ def _Net_deprocess(self, input_name, input_): if hasattr(self, 'mean'): decaf_in += self.mean.get(input_name, 0) decaf_in = decaf_in.transpose((1,2,0)) - if channel_order: + if channel_order is not None: channel_order_inverse = [channel_order.index(i) for i in range(decaf_in.shape[2])] decaf_in = decaf_in[:, :, channel_order_inverse] - if input_scale: + if input_scale is not None: decaf_in /= input_scale return decaf_in From 7722514cddc127ba782ad97732532e6afea0db6e Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 4 Jul 2014 17:19:24 +0800 Subject: [PATCH 0281/2053] Extend the ArgMaxLayer to output top k results --- include/caffe/common_layers.hpp | 1 + src/caffe/layers/argmax_layer.cpp | 54 ++++++++++++++++++------ src/caffe/proto/caffe.proto | 1 + src/caffe/test/test_argmax_layer.cpp | 62 +++++++++++++++++++++++++++- 4 files changed, 103 insertions(+), 15 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 761c19fa7e2..395ea7d6c98 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -48,6 +48,7 @@ class ArgMaxLayer : public Layer { NOT_IMPLEMENTED; } bool out_max_val_; + size_t top_k_; }; /* ConcatLayer diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index cc31c0f52d8..1fe2a89e755 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -1,12 +1,12 @@ // Copyright 2014 BVLC and contributors. -#include #include +#include +#include #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" - namespace caffe { template @@ -14,15 +14,29 @@ void ArgMaxLayer::SetUp(const vector*>& bottom, vector*>* top) { Layer::SetUp(bottom, top); out_max_val_ = this->layer_param_.argmax_param().out_max_val(); + top_k_ = this->layer_param_.argmax_param().top_k(); + CHECK_GE(top_k_, 1) << " top k must not be less than 1."; + CHECK_LE(top_k_, bottom[0]->count() / bottom[0]->num()) + << "top_k must be less than or equal to the number of classes."; if (out_max_val_) { // Produces max_ind and max_val - (*top)[0]->Reshape(bottom[0]->num(), 2, 1, 1); + (*top)[0]->Reshape(bottom[0]->num(), 2, top_k_, 1); } else { // Produces only max_ind - (*top)[0]->Reshape(bottom[0]->num(), 1, 1, 1); + (*top)[0]->Reshape(bottom[0]->num(), 1, top_k_, 1); } } +template +class IDAndValueComparator { + public: + bool operator() (const std::pair& lhs, + const std::pair& rhs) const { + return lhs.second < rhs.second || (lhs.second == rhs.second && + lhs.first < rhs.first); + } +}; + template Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { @@ -30,20 +44,35 @@ Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, Dtype* top_data = (*top)[0]->mutable_cpu_data(); int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); + Dtype value; for (int i = 0; i < num; ++i) { - Dtype max_val = -FLT_MAX; - int max_ind = 0; + std::priority_queue, + std::vector >, IDAndValueComparator > + top_k_results; for (int j = 0; j < dim; ++j) { - if (bottom_data[i * dim + j] > max_val) { - max_val = bottom_data[i * dim + j]; - max_ind = j; + value = -(bottom_data[i * dim + j]); + if (top_k_results.size() >= top_k_) { + if (value < top_k_results.top().second) { + top_k_results.pop(); + top_k_results.push(std::make_pair(j, value)); + } + } else { + top_k_results.push(std::make_pair(j, value)); } } if (out_max_val_) { - top_data[i * 2] = max_ind; - top_data[i * 2 + 1] = max_val; + for (int j = 0; j < top_k_; ++j) { + top_data[i * 2 * top_k_ + (top_k_ - 1 - j) * 2] = + top_k_results.top().first; + top_data[i * 2 * top_k_ + (top_k_ - 1 - j) * 2 + 1] = + -(top_k_results.top().second); + top_k_results.pop(); + } } else { - top_data[i] = max_ind; + for (int j = 0; j < top_k_; ++j) { + top_data[i * top_k_ + (top_k_ - 1 - j)] = top_k_results.top().first; + top_k_results.pop(); + } } } return Dtype(0); @@ -51,5 +80,4 @@ Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, INSTANTIATE_CLASS(ArgMaxLayer); - } // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index e4b5ad312c4..10e52d2ad47 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -229,6 +229,7 @@ message AccuracyParameter { message ArgMaxParameter { // If true produce pairs (argmax, maxval) optional bool out_max_val = 1 [default = false]; + optional uint32 top_k = 2 [default = 1]; } // Message that stores parameters used by ConcatLayer diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index d3bdfbde658..3cd65651c9d 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -17,8 +17,9 @@ template class ArgMaxLayerTest : public ::testing::Test { protected: ArgMaxLayerTest() - : blob_bottom_(new Blob(20, 10, 1, 1)), - blob_top_(new Blob()) { + : blob_bottom_(new Blob(10, 20, 1, 1)), + blob_top_(new Blob()), + top_k_(10) { Caffe::set_random_seed(1701); // fill the values FillerParameter filler_param; @@ -32,6 +33,7 @@ class ArgMaxLayerTest : public ::testing::Test { Blob* const blob_top_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; + size_t top_k_; }; TYPED_TEST_CASE(ArgMaxLayerTest, TestDtypes); @@ -105,4 +107,60 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { } } +TYPED_TEST(ArgMaxLayerTest, TestCPUTopK) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::CPU); + ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); + argmax_param->set_top_k(this->top_k_); + ArgMaxLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + int max_ind; + TypeParam max_val; + int num = this->blob_bottom_->num(); + int dim = this->blob_bottom_->count() / num; + for (int i = 0; i < num; ++i) { + EXPECT_GE(top_data[i], 0); + EXPECT_LE(top_data[i], dim); + max_ind = top_data[i * this->top_k_]; + max_val = bottom_data[i * dim + max_ind]; + EXPECT_EQ(bottom_data[i * dim + max_ind], max_val); + for (int j = 0; j < dim; ++j) { + EXPECT_LE(bottom_data[i * dim + j], max_val); + } + } +} + +TYPED_TEST(ArgMaxLayerTest, TestCPUMaxValTopK) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::CPU); + ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); + argmax_param->set_out_max_val(true); + argmax_param->set_top_k(this->top_k_); + ArgMaxLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + int max_ind; + TypeParam max_val; + int num = this->blob_bottom_->num(); + int dim = this->blob_bottom_->count() / num; + for (int i = 0; i < num; ++i) { + EXPECT_GE(top_data[i], 0); + EXPECT_LE(top_data[i], dim); + max_ind = top_data[i * 2 * this->top_k_]; + max_val = top_data[i * 2 * this->top_k_ + 1]; + EXPECT_EQ(bottom_data[i * dim + max_ind], max_val); + for (int j = 0; j < dim; ++j) { + EXPECT_LE(bottom_data[i * dim + j], max_val); + } + } +} + + } // namespace caffe From b9a9c588be6286ecc4bc899e20b5f040f8d14ae7 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Sat, 5 Jul 2014 17:17:12 +0800 Subject: [PATCH 0282/2053] Add the test cases for the mulitple top predictions argmax layer --- src/caffe/test/test_argmax_layer.cpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index 3cd65651c9d..11b6712797a 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -1,5 +1,7 @@ // Copyright 2014 BVLC and contributors. +#include +#include #include #include "gtest/gtest.h" @@ -19,7 +21,7 @@ class ArgMaxLayerTest : public ::testing::Test { ArgMaxLayerTest() : blob_bottom_(new Blob(10, 20, 1, 1)), blob_top_(new Blob()), - top_k_(10) { + top_k_(5) { Caffe::set_random_seed(1701); // fill the values FillerParameter filler_param; @@ -107,6 +109,12 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { } } +template +bool int_Dtype_pair_greater(std::pair a, + std::pair b) { + return a.second > b.second || (a.second == b.second && a.first > b.first); +} + TYPED_TEST(ArgMaxLayerTest, TestCPUTopK) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); @@ -128,8 +136,15 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUTopK) { max_ind = top_data[i * this->top_k_]; max_val = bottom_data[i * dim + max_ind]; EXPECT_EQ(bottom_data[i * dim + max_ind], max_val); + std::vector > bottom_data_vector; for (int j = 0; j < dim; ++j) { EXPECT_LE(bottom_data[i * dim + j], max_val); + bottom_data_vector.push_back(std::make_pair(j, bottom_data[i * dim + j])); + } + std::sort(bottom_data_vector.begin(), bottom_data_vector.end(), + int_Dtype_pair_greater); + for (int j = 0; j < this->top_k_; ++j) { + EXPECT_EQ(bottom_data_vector[j].first, top_data[i * this->top_k_ + j]); } } } @@ -156,8 +171,18 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUMaxValTopK) { max_ind = top_data[i * 2 * this->top_k_]; max_val = top_data[i * 2 * this->top_k_ + 1]; EXPECT_EQ(bottom_data[i * dim + max_ind], max_val); + std::vector > bottom_data_vector; for (int j = 0; j < dim; ++j) { EXPECT_LE(bottom_data[i * dim + j], max_val); + bottom_data_vector.push_back(std::make_pair(j, bottom_data[i * dim + j])); + } + std::sort(bottom_data_vector.begin(), bottom_data_vector.end(), + int_Dtype_pair_greater); + for (int j = 0; j < this->top_k_; ++j) { + EXPECT_EQ(bottom_data_vector[j].first, + top_data[i * 2 * this->top_k_ + 2 * j]); + EXPECT_EQ(bottom_data_vector[j].second, + top_data[i * 2 * this->top_k_ + 2 * j + 1]); } } } From dfe69b2f06d68633a37a99b56b8878e7fcad14e6 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 8 Jul 2014 22:24:20 +0800 Subject: [PATCH 0283/2053] Simplify the top-k argmax layer using std::sort --- include/caffe/common_layers.hpp | 6 +++ src/caffe/layers/argmax_layer.cpp | 38 ++++------------- src/caffe/test/test_argmax_layer.cpp | 63 ++++++++++------------------ 3 files changed, 37 insertions(+), 70 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 395ea7d6c98..26bfb5d0217 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -17,6 +17,12 @@ namespace caffe { +template +bool int_Dtype_pair_greater(std::pair a, + std::pair b) { + return a.second > b.second || (a.second == b.second && a.first > b.first); +} + /* ArgmaxLayer Compute the index of the max value across all (channels x height x width). [In the future, can take specific dimension.] diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index 1fe2a89e755..00c17f1c554 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -1,5 +1,6 @@ // Copyright 2014 BVLC and contributors. +#include #include #include #include @@ -27,16 +28,6 @@ void ArgMaxLayer::SetUp(const vector*>& bottom, } } -template -class IDAndValueComparator { - public: - bool operator() (const std::pair& lhs, - const std::pair& rhs) const { - return lhs.second < rhs.second || (lhs.second == rhs.second && - lhs.first < rhs.first); - } -}; - template Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { @@ -44,34 +35,21 @@ Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, Dtype* top_data = (*top)[0]->mutable_cpu_data(); int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); - Dtype value; for (int i = 0; i < num; ++i) { - std::priority_queue, - std::vector >, IDAndValueComparator > - top_k_results; + std::vector > bottom_data_vector; for (int j = 0; j < dim; ++j) { - value = -(bottom_data[i * dim + j]); - if (top_k_results.size() >= top_k_) { - if (value < top_k_results.top().second) { - top_k_results.pop(); - top_k_results.push(std::make_pair(j, value)); - } - } else { - top_k_results.push(std::make_pair(j, value)); - } + bottom_data_vector.push_back(std::make_pair(j, bottom_data[i * dim + j])); } + std::sort(bottom_data_vector.begin(), bottom_data_vector.end(), + int_Dtype_pair_greater); if (out_max_val_) { for (int j = 0; j < top_k_; ++j) { - top_data[i * 2 * top_k_ + (top_k_ - 1 - j) * 2] = - top_k_results.top().first; - top_data[i * 2 * top_k_ + (top_k_ - 1 - j) * 2 + 1] = - -(top_k_results.top().second); - top_k_results.pop(); + top_data[(*top)[0]->offset(i, 0, j)] = bottom_data_vector[j].first; + top_data[(*top)[0]->offset(i, 1, j)] = bottom_data_vector[j].second; } } else { for (int j = 0; j < top_k_; ++j) { - top_data[i * top_k_ + (top_k_ - 1 - j)] = top_k_results.top().first; - top_k_results.pop(); + top_data[(*top)[0]->offset(i, 0, j)] = bottom_data_vector[j].first; } } } diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index 11b6712797a..5286a0a390a 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -1,6 +1,5 @@ // Copyright 2014 BVLC and contributors. -#include #include #include @@ -109,12 +108,6 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { } } -template -bool int_Dtype_pair_greater(std::pair a, - std::pair b) { - return a.second > b.second || (a.second == b.second && a.first > b.first); -} - TYPED_TEST(ArgMaxLayerTest, TestCPUTopK) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); @@ -124,27 +117,23 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUTopK) { layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); int max_ind; TypeParam max_val; int num = this->blob_bottom_->num(); int dim = this->blob_bottom_->count() / num; for (int i = 0; i < num; ++i) { - EXPECT_GE(top_data[i], 0); - EXPECT_LE(top_data[i], dim); - max_ind = top_data[i * this->top_k_]; - max_val = bottom_data[i * dim + max_ind]; - EXPECT_EQ(bottom_data[i * dim + max_ind], max_val); - std::vector > bottom_data_vector; - for (int j = 0; j < dim; ++j) { - EXPECT_LE(bottom_data[i * dim + j], max_val); - bottom_data_vector.push_back(std::make_pair(j, bottom_data[i * dim + j])); - } - std::sort(bottom_data_vector.begin(), bottom_data_vector.end(), - int_Dtype_pair_greater); + EXPECT_GE(this->blob_top_->data_at(i, 0, 0, 0), 0); + EXPECT_LE(this->blob_top_->data_at(i, 0, 0, 0), dim); for (int j = 0; j < this->top_k_; ++j) { - EXPECT_EQ(bottom_data_vector[j].first, top_data[i * this->top_k_ + j]); + max_ind = this->blob_top_->data_at(i, 0, j, 0); + max_val = this->blob_bottom_->data_at(i, max_ind, 0, 0); + int count = 0; + for (int k = 0; k < dim; ++k) { + if (this->blob_bottom_->data_at(i, k, 0, 0) > max_val) { + ++count; + } + } + EXPECT_EQ(j, count); } } } @@ -159,30 +148,24 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUMaxValTopK) { layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values - const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); - const TypeParam* top_data = this->blob_top_->cpu_data(); int max_ind; TypeParam max_val; int num = this->blob_bottom_->num(); int dim = this->blob_bottom_->count() / num; for (int i = 0; i < num; ++i) { - EXPECT_GE(top_data[i], 0); - EXPECT_LE(top_data[i], dim); - max_ind = top_data[i * 2 * this->top_k_]; - max_val = top_data[i * 2 * this->top_k_ + 1]; - EXPECT_EQ(bottom_data[i * dim + max_ind], max_val); - std::vector > bottom_data_vector; - for (int j = 0; j < dim; ++j) { - EXPECT_LE(bottom_data[i * dim + j], max_val); - bottom_data_vector.push_back(std::make_pair(j, bottom_data[i * dim + j])); - } - std::sort(bottom_data_vector.begin(), bottom_data_vector.end(), - int_Dtype_pair_greater); + EXPECT_GE(this->blob_top_->data_at(i, 0, 0, 0), 0); + EXPECT_LE(this->blob_top_->data_at(i, 0, 0, 0), dim); for (int j = 0; j < this->top_k_; ++j) { - EXPECT_EQ(bottom_data_vector[j].first, - top_data[i * 2 * this->top_k_ + 2 * j]); - EXPECT_EQ(bottom_data_vector[j].second, - top_data[i * 2 * this->top_k_ + 2 * j + 1]); + max_ind = this->blob_top_->data_at(i, 0, j, 0); + max_val = this->blob_top_->data_at(i, 1, j, 0); + EXPECT_EQ(this->blob_bottom_->data_at(i, max_ind, 0, 0), max_val); + int count = 0; + for (int k = 0; k < dim; ++k) { + if (this->blob_bottom_->data_at(i, k, 0, 0) > max_val) { + ++count; + } + } + EXPECT_EQ(j, count); } } } From 4697b3f2140a89648d2ebbce9d099dbffefe0c97 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Wed, 9 Jul 2014 17:30:05 +0800 Subject: [PATCH 0284/2053] Use std::partial_sort in the ArgMaxLayer as suggested by @shuokay --- src/caffe/layers/argmax_layer.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index 00c17f1c554..f4d9b453314 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -40,8 +40,9 @@ Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, for (int j = 0; j < dim; ++j) { bottom_data_vector.push_back(std::make_pair(j, bottom_data[i * dim + j])); } - std::sort(bottom_data_vector.begin(), bottom_data_vector.end(), - int_Dtype_pair_greater); + std::partial_sort( + bottom_data_vector.begin(), bottom_data_vector.begin() + top_k_, + bottom_data_vector.end(), int_Dtype_pair_greater); if (out_max_val_) { for (int j = 0; j < top_k_; ++j) { top_data[(*top)[0]->offset(i, 0, j)] = bottom_data_vector[j].first; From 7b1a2ca345df0abf36e1863a4b53e9766d6f88ef Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 10 Jul 2014 09:06:11 +0800 Subject: [PATCH 0285/2053] Move compararing function from common_layers to argmax_layer --- include/caffe/common_layers.hpp | 6 ------ src/caffe/layers/argmax_layer.cpp | 10 +++++++++- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 26bfb5d0217..395ea7d6c98 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -17,12 +17,6 @@ namespace caffe { -template -bool int_Dtype_pair_greater(std::pair a, - std::pair b) { - return a.second > b.second || (a.second == b.second && a.first > b.first); -} - /* ArgmaxLayer Compute the index of the max value across all (channels x height x width). [In the future, can take specific dimension.] diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index f4d9b453314..44476cc0f27 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "caffe/layer.hpp" @@ -28,6 +29,12 @@ void ArgMaxLayer::SetUp(const vector*>& bottom, } } +template +bool int_Dtype_pair_greater(std::pair a, + std::pair b) { + return a.second > b.second; +} + template Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { @@ -38,7 +45,8 @@ Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, for (int i = 0; i < num; ++i) { std::vector > bottom_data_vector; for (int j = 0; j < dim; ++j) { - bottom_data_vector.push_back(std::make_pair(j, bottom_data[i * dim + j])); + bottom_data_vector.push_back( + std::make_pair(j, bottom_data[i * dim + j])); } std::partial_sort( bottom_data_vector.begin(), bottom_data_vector.begin() + top_k_, From 907c78a44f4717167206440e4eebf32a371a1162 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 10 Jul 2014 09:37:34 +0800 Subject: [PATCH 0286/2053] Refactor the accuracy layer with std::partial_sort --- src/caffe/layers/accuracy_layer.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index ddfe38ab38e..86ded06a7ec 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -30,6 +30,12 @@ void AccuracyLayer::SetUp( (*top)[0]->Reshape(1, 1, 1, 1); } +template +bool int_Dtype_pair_greater(std::pair a, + std::pair b) { + return a.second > b.second; +} + template Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { @@ -42,21 +48,17 @@ Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, vector max_id(top_k_+1); for (int i = 0; i < num; ++i) { // Top-k accuracy - std::fill_n(maxval.begin(), top_k_, -FLT_MAX); - std::fill_n(max_id.begin(), top_k_, 0); - for (int j = 0, k; j < dim; ++j) { - // insert into (reverse-)sorted top-k array - Dtype val = bottom_data[i * dim + j]; - for (k = top_k_; k > 0 && maxval[k-1] < val; k--) { - maxval[k] = maxval[k-1]; - max_id[k] = max_id[k-1]; - } - maxval[k] = val; - max_id[k] = j; + std::vector > bottom_data_vector; + for (int j = 0; j < dim; ++j) { + bottom_data_vector.push_back( + std::make_pair(j, bottom_data[i * dim + j])); } + std::partial_sort( + bottom_data_vector.begin(), bottom_data_vector.begin() + top_k_, + bottom_data_vector.end(), int_Dtype_pair_greater); // check if true label is in top k predictions for (int k = 0; k < top_k_; k++) - if (max_id[k] == static_cast(bottom_label[i])) { + if (bottom_data_vector[k].first == static_cast(bottom_label[i])) { ++accuracy; break; } From 6abdb003708d6eb82bdd35aa7082113f7b9bf6b4 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 10 Jul 2014 09:38:03 +0800 Subject: [PATCH 0287/2053] Add more test cases for the accuracy layer --- src/caffe/test/test_accuracy_layer.cpp | 106 +++++++++++++++++++------ 1 file changed, 81 insertions(+), 25 deletions(-) diff --git a/src/caffe/test/test_accuracy_layer.cpp b/src/caffe/test/test_accuracy_layer.cpp index 40b08748d1f..5023a809d17 100644 --- a/src/caffe/test/test_accuracy_layer.cpp +++ b/src/caffe/test/test_accuracy_layer.cpp @@ -9,6 +9,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" +#include "caffe/util/rng.hpp" #include "caffe/vision_layers.hpp" #include "caffe/test/test_caffe_main.hpp" @@ -19,8 +20,8 @@ template class AccuracyLayerTest : public ::testing::Test { protected: AccuracyLayerTest() - : blob_bottom_data_(new Blob(2, 10, 1, 1)), - blob_bottom_label_(new Blob(2, 1, 1, 1)), + : blob_bottom_data_(new Blob(100, 10, 1, 1)), + blob_bottom_label_(new Blob(100, 1, 1, 1)), blob_top_(new Blob()), top_k_(3) { // fill the probability values @@ -28,28 +29,14 @@ class AccuracyLayerTest : public ::testing::Test { GaussianFiller filler(filler_param); filler.Fill(this->blob_bottom_data_); - // set the labels; first label is set to max-probability index - Dtype m_val = -FLT_MAX; - int m_id = 0; - for (int i = 0; i < 10; i++) - if (blob_bottom_data_->data_at(0, i, 0, 0) > m_val) { - m_val = blob_bottom_data_->data_at(0, i, 0, 0); - m_id = i; - } + const unsigned int prefetch_rng_seed = caffe_rng_rand(); + shared_ptr rng(new Caffe::RNG(prefetch_rng_seed)); + caffe::rng_t* prefetch_rng = + static_cast(rng->generator()); Dtype* label_data = blob_bottom_label_->mutable_cpu_data(); - int offset = blob_bottom_label_->offset(0); - label_data[offset] = m_id; - - // set the labels; second label is set to min-probability index - m_val = FLT_MAX; - m_id = 0; - for (int i = 0; i < 10; i++) - if (blob_bottom_data_->data_at(1, i, 0, 0) < m_val) { - m_val = blob_bottom_data_->data_at(1, i, 0, 0); - m_id = i; - } - offset = blob_bottom_label_->offset(1); - label_data[offset] = m_id; + for (int i = 0; i < 100; ++i) { + label_data[i] = (*prefetch_rng)() % 10; + } blob_bottom_vec_.push_back(blob_bottom_data_); blob_bottom_vec_.push_back(blob_bottom_label_); @@ -70,7 +57,57 @@ class AccuracyLayerTest : public ::testing::Test { TYPED_TEST_CASE(AccuracyLayerTest, TestDtypes); +TYPED_TEST(AccuracyLayerTest, TestSetup) { + LayerParameter layer_param; + AccuracyLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), 1); + EXPECT_EQ(this->blob_top_->channels(), 1); + EXPECT_EQ(this->blob_top_->height(), 1); + EXPECT_EQ(this->blob_top_->width(), 1); +} + +TYPED_TEST(AccuracyLayerTest, TestSetupTopK) { + LayerParameter layer_param; + AccuracyParameter* accuracy_param = + layer_param.mutable_accuracy_param(); + accuracy_param->set_top_k(5); + AccuracyLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), 1); + EXPECT_EQ(this->blob_top_->channels(), 1); + EXPECT_EQ(this->blob_top_->height(), 1); + EXPECT_EQ(this->blob_top_->width(), 1); +} + TYPED_TEST(AccuracyLayerTest, TestForwardCPU) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::CPU); + AccuracyLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + + TypeParam max_value; + int max_id; + int num_correct_labels = 0; + for (int i = 0; i < 100; ++i) { + max_value = -FLT_MAX; + max_id = 0; + for (int j = 0; j < 10; ++j) { + if (this->blob_bottom_data_->data_at(i, j, 0, 0) > max_value) { + max_value = this->blob_bottom_data_->data_at(i, j, 0, 0); + max_id = j; + } + } + if (max_id == this->blob_bottom_label_->data_at(i, 0, 0, 0)) { + ++num_correct_labels; + } + } + EXPECT_NEAR(this->blob_top_->data_at(0, 0, 0, 0), + num_correct_labels / 100.0, 1e-4); +} + +TYPED_TEST(AccuracyLayerTest, TestForwardCPUTopK) { LayerParameter layer_param; AccuracyParameter* accuracy_param = layer_param.mutable_accuracy_param(); accuracy_param->set_top_k(this->top_k_); @@ -78,8 +115,27 @@ TYPED_TEST(AccuracyLayerTest, TestForwardCPU) { layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Output accuracy should be ~0.5 - EXPECT_NEAR(this->blob_top_->data_at(0, 0, 0, 0), 0.5, 1e-4); + TypeParam current_value; + int current_rank; + int num_correct_labels = 0; + for (int i = 0; i < 100; ++i) { + for (int j = 0; j < 10; ++j) { + current_value = this->blob_bottom_data_->data_at(i, j, 0, 0); + current_rank = 0; + for (int k = 0; k < 10; ++k) { + if (this->blob_bottom_data_->data_at(i, k, 0, 0) > current_value) { + ++current_rank; + } + } + if (current_rank < this->top_k_ && + j == this->blob_bottom_label_->data_at(i, 0, 0, 0)) { + ++num_correct_labels; + } + } + } + + EXPECT_NEAR(this->blob_top_->data_at(0, 0, 0, 0), + num_correct_labels / 100.0, 1e-4); } } // namespace caffe From cf26171b34ec767291abcd4dff1a7d1eeef15250 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 11 Jul 2014 10:22:01 +0800 Subject: [PATCH 0288/2053] Limit the comparison functions to have file scope --- src/caffe/layers/accuracy_layer.cpp | 2 +- src/caffe/layers/argmax_layer.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 86ded06a7ec..916059e8d98 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -31,7 +31,7 @@ void AccuracyLayer::SetUp( } template -bool int_Dtype_pair_greater(std::pair a, +static bool int_Dtype_pair_greater(std::pair a, std::pair b) { return a.second > b.second; } diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index 44476cc0f27..580e4b0f3e6 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -30,7 +30,7 @@ void ArgMaxLayer::SetUp(const vector*>& bottom, } template -bool int_Dtype_pair_greater(std::pair a, +static bool int_Dtype_pair_greater(std::pair a, std::pair b) { return a.second > b.second; } From fe3f6aa062d8d44cb89992854c7e1a97197f12a7 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Sun, 13 Jul 2014 00:29:54 +0800 Subject: [PATCH 0289/2053] Include for pair in the accuracy layer --- src/caffe/layers/accuracy_layer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 916059e8d98..b244c51d321 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "caffe/layer.hpp" From a9281488f0d263667204db0ab4b538cfb9ac1ccc Mon Sep 17 00:00:00 2001 From: Kai Li Date: Sun, 20 Jul 2014 00:42:12 +0800 Subject: [PATCH 0290/2053] Fix style issues in accuracy & argmax layer --- src/caffe/layers/accuracy_layer.cpp | 18 +++++++----------- src/caffe/layers/argmax_layer.cpp | 23 ++++++++--------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index b244c51d321..3ccba3b50d1 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -31,12 +32,6 @@ void AccuracyLayer::SetUp( (*top)[0]->Reshape(1, 1, 1, 1); } -template -static bool int_Dtype_pair_greater(std::pair a, - std::pair b) { - return a.second > b.second; -} - template Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { @@ -49,20 +44,21 @@ Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, vector max_id(top_k_+1); for (int i = 0; i < num; ++i) { // Top-k accuracy - std::vector > bottom_data_vector; + std::vector > bottom_data_vector; for (int j = 0; j < dim; ++j) { bottom_data_vector.push_back( - std::make_pair(j, bottom_data[i * dim + j])); + std::make_pair(bottom_data[i * dim + j], j)); } std::partial_sort( bottom_data_vector.begin(), bottom_data_vector.begin() + top_k_, - bottom_data_vector.end(), int_Dtype_pair_greater); + bottom_data_vector.end(), std::greater >()); // check if true label is in top k predictions - for (int k = 0; k < top_k_; k++) - if (bottom_data_vector[k].first == static_cast(bottom_label[i])) { + for (int k = 0; k < top_k_; k++) { + if (bottom_data_vector[k].second == static_cast(bottom_label[i])) { ++accuracy; break; } + } } // LOG(INFO) << "Accuracy: " << accuracy; diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index 580e4b0f3e6..bd1a2689f3e 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -29,12 +30,6 @@ void ArgMaxLayer::SetUp(const vector*>& bottom, } } -template -static bool int_Dtype_pair_greater(std::pair a, - std::pair b) { - return a.second > b.second; -} - template Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { @@ -43,22 +38,20 @@ Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); for (int i = 0; i < num; ++i) { - std::vector > bottom_data_vector; + std::vector > bottom_data_vector; for (int j = 0; j < dim; ++j) { bottom_data_vector.push_back( - std::make_pair(j, bottom_data[i * dim + j])); + std::make_pair(bottom_data[i * dim + j], j)); } std::partial_sort( bottom_data_vector.begin(), bottom_data_vector.begin() + top_k_, - bottom_data_vector.end(), int_Dtype_pair_greater); + bottom_data_vector.end(), std::greater >()); + for (int j = 0; j < top_k_; ++j) { + top_data[(*top)[0]->offset(i, 0, j)] = bottom_data_vector[j].second; + } if (out_max_val_) { for (int j = 0; j < top_k_; ++j) { - top_data[(*top)[0]->offset(i, 0, j)] = bottom_data_vector[j].first; - top_data[(*top)[0]->offset(i, 1, j)] = bottom_data_vector[j].second; - } - } else { - for (int j = 0; j < top_k_; ++j) { - top_data[(*top)[0]->offset(i, 0, j)] = bottom_data_vector[j].first; + top_data[(*top)[0]->offset(i, 1, j)] = bottom_data_vector[j].first; } } } From 00ecb24ce011b7c06416cb2a6279526856df8a8f Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Mon, 30 Jun 2014 23:11:11 -0700 Subject: [PATCH 0291/2053] use Blob directly instead of shared_ptr for ConvolutionLayer::bias_multiplier_ This will make layer reshaping easier and more uniform, and is consistent with col_buffer_. --- include/caffe/vision_layers.hpp | 2 +- src/caffe/layers/conv_layer.cpp | 10 +++++----- src/caffe/layers/conv_layer.cu | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index c8b4609c20f..a261ac35360 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -55,7 +55,7 @@ class ConvolutionLayer : public Layer { int num_output_; int group_; Blob col_buffer_; - shared_ptr > bias_multiplier_; + Blob bias_multiplier_; bool bias_term_; int M_; int K_; diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index e8f08c7e3cd..11f29e783db 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -76,10 +76,10 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, bias_filler->Fill(this->blobs_[1].get()); } } - // Set up the bias filler + // Set up the all ones "bias multiplier" for adding bias using blas if (bias_term_) { - bias_multiplier_.reset(new Blob(1, 1, 1, N_)); - caffe_set(N_, Dtype(1), bias_multiplier_->mutable_cpu_data()); + bias_multiplier_.Reshape(1, 1, 1, N_); + caffe_set(N_, Dtype(1), bias_multiplier_.mutable_cpu_data()); } this->param_propagate_down_.resize(this->blobs_.size(), true); } @@ -110,7 +110,7 @@ Dtype ConvolutionLayer::Forward_cpu(const vector*>& bottom, if (bias_term_) { caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num_output_, N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), - bias_multiplier_->cpu_data(), + bias_multiplier_.cpu_data(), (Dtype)1., top_data + (*top)[i]->offset(n)); } } @@ -144,7 +144,7 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, for (int n = 0; n < num_; ++n) { caffe_cpu_gemv(CblasNoTrans, num_output_, N_, 1., top_diff + top[0]->offset(n), - bias_multiplier_->cpu_data(), 1., + bias_multiplier_.cpu_data(), 1., bias_diff); } } diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 0b6e912b639..d328fbde9ae 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -35,7 +35,7 @@ Dtype ConvolutionLayer::Forward_gpu(const vector*>& bottom, if (bias_term_) { caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num_output_, N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), - bias_multiplier_->gpu_data(), + bias_multiplier_.gpu_data(), (Dtype)1., top_data + (*top)[i]->offset(n)); } } @@ -69,7 +69,7 @@ void ConvolutionLayer::Backward_gpu(const vector*>& top, for (int n = 0; n < num_; ++n) { caffe_gpu_gemv(CblasNoTrans, num_output_, N_, 1., top_diff + top[0]->offset(n), - bias_multiplier_->gpu_data(), 1., + bias_multiplier_.gpu_data(), 1., bias_diff); } } From 40054a70cd6458e74ba8d42f80d3e534e9312a1d Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sat, 19 Jul 2014 18:02:33 -0700 Subject: [PATCH 0292/2053] use Blob directly instead of shared_ptr for InnerProductLayer::bias_multiplier_ --- include/caffe/vision_layers.hpp | 2 +- src/caffe/layers/inner_product_layer.cpp | 8 ++++---- src/caffe/layers/inner_product_layer.cu | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index a261ac35360..c995992a252 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -157,7 +157,7 @@ class InnerProductLayer : public Layer { int K_; int N_; bool bias_term_; - shared_ptr > bias_multiplier_; + Blob bias_multiplier_; }; // Forward declare PoolingLayer and SplitLayer for use in LRNLayer. diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index 4da8578d76f..5505d08587a 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -47,8 +47,8 @@ void InnerProductLayer::SetUp(const vector*>& bottom, } // parameter initialization // Setting up the bias multiplier if (bias_term_) { - bias_multiplier_.reset(new Blob(1, 1, 1, M_)); - caffe_set(M_, Dtype(1), bias_multiplier_->mutable_cpu_data()); + bias_multiplier_.Reshape(1, 1, 1, M_); + caffe_set(M_, Dtype(1), bias_multiplier_.mutable_cpu_data()); } this->param_propagate_down_.resize(this->blobs_.size(), true); } @@ -63,7 +63,7 @@ Dtype InnerProductLayer::Forward_cpu(const vector*>& bottom, bottom_data, weight, (Dtype)0., top_data); if (bias_term_) { caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, 1, (Dtype)1., - bias_multiplier_->cpu_data(), + bias_multiplier_.cpu_data(), this->blobs_[1]->cpu_data(), (Dtype)1., top_data); } return Dtype(0); @@ -84,7 +84,7 @@ void InnerProductLayer::Backward_cpu(const vector*>& top, const Dtype* top_diff = top[0]->cpu_diff(); // Gradient with respect to bias caffe_cpu_gemv(CblasTrans, M_, N_, (Dtype)1., top_diff, - bias_multiplier_->cpu_data(), (Dtype)0., + bias_multiplier_.cpu_data(), (Dtype)0., this->blobs_[1]->mutable_cpu_diff()); } if (propagate_down[0]) { diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu index 6ef75788665..513e4eb7fa8 100644 --- a/src/caffe/layers/inner_product_layer.cu +++ b/src/caffe/layers/inner_product_layer.cu @@ -21,7 +21,7 @@ Dtype InnerProductLayer::Forward_gpu(const vector*>& bottom, bottom_data, weight, (Dtype)0., top_data); if (bias_term_) { caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, 1, (Dtype)1., - bias_multiplier_->gpu_data(), + bias_multiplier_.gpu_data(), this->blobs_[1]->gpu_data(), (Dtype)1., top_data); } return Dtype(0); @@ -42,7 +42,7 @@ void InnerProductLayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = top[0]->gpu_diff(); // Gradient with respect to bias caffe_gpu_gemv(CblasTrans, M_, N_, (Dtype)1., top_diff, - bias_multiplier_->gpu_data(), (Dtype)0., + bias_multiplier_.gpu_data(), (Dtype)0., this->blobs_[1]->mutable_gpu_diff()); } if (propagate_down[0]) { From 03544062c447019e5a86865ae6c3b12826211553 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Tue, 1 Jul 2014 13:20:01 -0700 Subject: [PATCH 0293/2053] use Blob directly instead of shared_ptr for PoolingLayer::max_idx_ Again, this is more uniform, and will simplify the implementation of Reshape. --- include/caffe/vision_layers.hpp | 2 +- src/caffe/layers/pooling_layer.cpp | 8 ++++---- src/caffe/layers/pooling_layer.cu | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index c995992a252..05c7b45e783 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -273,7 +273,7 @@ class PoolingLayer : public Layer { int pooled_height_; int pooled_width_; Blob rand_idx_; - shared_ptr > max_idx_; + Blob max_idx_; }; } // namespace caffe diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index d6fef07ba46..feb82669e08 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -99,8 +99,8 @@ void PoolingLayer::SetUp(const vector*>& bottom, // If max pooling, we will initialize the vector index part. if (this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX && top->size() == 1) { - max_idx_.reset(new Blob(bottom[0]->num(), channels_, - pooled_height_, pooled_width_)); + max_idx_.Reshape(bottom[0]->num(), channels_, pooled_height_, + pooled_width_); } // If stochastic pooling, we will initialize the random index part. if (this->layer_param_.pooling_param().pool() == @@ -131,7 +131,7 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, top_mask = (*top)[1]->mutable_cpu_data(); caffe_set(top_count, Dtype(-1), top_mask); } else { - mask = max_idx_->mutable_cpu_data(); + mask = max_idx_.mutable_cpu_data(); caffe_set(top_count, -1, mask); } caffe_set(top_count, Dtype(-FLT_MAX), top_data); @@ -236,7 +236,7 @@ void PoolingLayer::Backward_cpu(const vector*>& top, if (use_top_mask) { top_mask = top[1]->cpu_data(); } else { - mask = max_idx_->cpu_data(); + mask = max_idx_.cpu_data(); } for (int n = 0; n < top[0]->num(); ++n) { for (int c = 0; c < channels_; ++c) { diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index a44b1770ee3..42a6c1e5ec7 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -170,7 +170,7 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, if (use_top_mask) { top_mask = (*top)[1]->mutable_gpu_data(); } else { - mask = max_idx_->mutable_gpu_data(); + mask = max_idx_.mutable_gpu_data(); } // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolForward<<>>( @@ -348,7 +348,7 @@ void PoolingLayer::Backward_gpu(const vector*>& top, if (use_top_mask) { top_mask = top[1]->gpu_data(); } else { - mask = max_idx_->gpu_data(); + mask = max_idx_.gpu_data(); } // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<<>>( From f6696d8b5d8c43c7de41c0c7be7af97ba09160a0 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Tue, 1 Jul 2014 12:52:48 -0700 Subject: [PATCH 0294/2053] use Blob directly instead of shared_ptr for DropoutLayer::rand_vec_ This will simplify the implementation of Reshape by making allocation automatic. There is no need for shared_ptr here, and this is more uniform with buffers used by other layers. --- include/caffe/neuron_layers.hpp | 2 +- src/caffe/layers/dropout_layer.cpp | 8 ++++---- src/caffe/layers/dropout_layer.cu | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 070b89044d0..8f0588d4771 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -100,7 +100,7 @@ class DropoutLayer : public NeuronLayer { virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); - shared_ptr > rand_vec_; + Blob rand_vec_; Dtype threshold_; Dtype scale_; unsigned int uint_thres_; diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index a9372977693..65360d67ada 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -17,8 +17,8 @@ void DropoutLayer::SetUp(const vector*>& bottom, vector*>* top) { NeuronLayer::SetUp(bottom, top); // Set up the cache for random number generation - rand_vec_.reset(new Blob(bottom[0]->num(), - bottom[0]->channels(), bottom[0]->height(), bottom[0]->width())); + rand_vec_.Reshape(bottom[0]->num(), bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); threshold_ = this->layer_param_.dropout_param().dropout_ratio(); DCHECK(threshold_ > 0.); DCHECK(threshold_ < 1.); @@ -31,7 +31,7 @@ Dtype DropoutLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); - unsigned int* mask = rand_vec_->mutable_cpu_data(); + unsigned int* mask = rand_vec_.mutable_cpu_data(); const int count = bottom[0]->count(); if (Caffe::phase() == Caffe::TRAIN) { // Create random numbers @@ -53,7 +53,7 @@ void DropoutLayer::Backward_cpu(const vector*>& top, const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); if (Caffe::phase() == Caffe::TRAIN) { - const unsigned int* mask = rand_vec_->cpu_data(); + const unsigned int* mask = rand_vec_.cpu_data(); const int count = (*bottom)[0]->count(); for (int i = 0; i < count; ++i) { bottom_diff[i] = top_diff[i] * mask[i] * scale_; diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index c9f3ecd2dd5..a53eb5e4bed 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -32,7 +32,7 @@ Dtype DropoutLayer::Forward_gpu(const vector*>& bottom, const int count = bottom[0]->count(); if (Caffe::phase() == Caffe::TRAIN) { unsigned int* mask = - static_cast(rand_vec_->mutable_gpu_data()); + static_cast(rand_vec_.mutable_gpu_data()); caffe_gpu_rng_uniform(count, mask); // set thresholds // NOLINT_NEXT_LINE(whitespace/operators) @@ -63,7 +63,7 @@ void DropoutLayer::Backward_gpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); if (Caffe::phase() == Caffe::TRAIN) { const unsigned int* mask = - static_cast(rand_vec_->gpu_data()); + static_cast(rand_vec_.gpu_data()); const int count = (*bottom)[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) DropoutBackward<< Date: Sat, 19 Jul 2014 18:14:53 -0700 Subject: [PATCH 0295/2053] use Blob directly instead of shared_ptr for DataLayer buffers --- include/caffe/data_layers.hpp | 4 ++-- src/caffe/layers/data_layer.cpp | 28 +++++++++++++--------------- src/caffe/layers/data_layer.cu | 4 ++-- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 06c90ea9923..069f0c2eea2 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -81,8 +81,8 @@ class DataLayer : public Layer { int datum_width_; int datum_size_; pthread_t thread_; - shared_ptr > prefetch_data_; - shared_ptr > prefetch_label_; + Blob prefetch_data_; + Blob prefetch_label_; Blob data_mean_; bool output_labels_; Caffe::Phase phase_; diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index a688e197f02..b6afaa972f9 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -22,11 +22,11 @@ void* DataLayerPrefetch(void* layer_pointer) { DataLayer* layer = static_cast*>(layer_pointer); CHECK(layer); Datum datum; - CHECK(layer->prefetch_data_); - Dtype* top_data = layer->prefetch_data_->mutable_cpu_data(); + CHECK(layer->prefetch_data_.count()); + Dtype* top_data = layer->prefetch_data_.mutable_cpu_data(); Dtype* top_label = NULL; // suppress warnings about uninitialized variables if (layer->output_labels_) { - top_label = layer->prefetch_label_->mutable_cpu_data(); + top_label = layer->prefetch_label_.mutable_cpu_data(); } const Dtype scale = layer->layer_param_.data_param().scale(); const int batch_size = layer->layer_param_.data_param().batch_size(); @@ -257,16 +257,14 @@ void DataLayer::SetUp(const vector*>& bottom, if (crop_size > 0) { (*top)[0]->Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), crop_size, crop_size); - prefetch_data_.reset(new Blob( - this->layer_param_.data_param().batch_size(), datum.channels(), - crop_size, crop_size)); + prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), + datum.channels(), crop_size, crop_size); } else { (*top)[0]->Reshape( this->layer_param_.data_param().batch_size(), datum.channels(), datum.height(), datum.width()); - prefetch_data_.reset(new Blob( - this->layer_param_.data_param().batch_size(), datum.channels(), - datum.height(), datum.width())); + prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), + datum.channels(), datum.height(), datum.width()); } LOG(INFO) << "output data size: " << (*top)[0]->num() << "," << (*top)[0]->channels() << "," << (*top)[0]->height() << "," @@ -274,8 +272,8 @@ void DataLayer::SetUp(const vector*>& bottom, // label if (output_labels_) { (*top)[1]->Reshape(this->layer_param_.data_param().batch_size(), 1, 1, 1); - prefetch_label_.reset( - new Blob(this->layer_param_.data_param().batch_size(), 1, 1, 1)); + prefetch_label_.Reshape(this->layer_param_.data_param().batch_size(), + 1, 1, 1); } // datum size datum_channels_ = datum.channels(); @@ -303,9 +301,9 @@ void DataLayer::SetUp(const vector*>& bottom, // cpu_data calls so that the prefetch thread does not accidentally make // simultaneous cudaMalloc calls when the main thread is running. In some // GPUs this seems to cause failures if we do not so. - prefetch_data_->mutable_cpu_data(); + prefetch_data_.mutable_cpu_data(); if (output_labels_) { - prefetch_label_->mutable_cpu_data(); + prefetch_label_.mutable_cpu_data(); } data_mean_.cpu_data(); DLOG(INFO) << "Initializing prefetch"; @@ -349,10 +347,10 @@ Dtype DataLayer::Forward_cpu(const vector*>& bottom, // First, join the thread JoinPrefetchThread(); // Copy the data - caffe_copy(prefetch_data_->count(), prefetch_data_->cpu_data(), + caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), (*top)[0]->mutable_cpu_data()); if (output_labels_) { - caffe_copy(prefetch_label_->count(), prefetch_label_->cpu_data(), + caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), (*top)[1]->mutable_cpu_data()); } // Start a new prefetch thread diff --git a/src/caffe/layers/data_layer.cu b/src/caffe/layers/data_layer.cu index 4409f47f21c..e275e9d913e 100644 --- a/src/caffe/layers/data_layer.cu +++ b/src/caffe/layers/data_layer.cu @@ -19,10 +19,10 @@ Dtype DataLayer::Forward_gpu(const vector*>& bottom, // First, join the thread JoinPrefetchThread(); // Copy the data - caffe_copy(prefetch_data_->count(), prefetch_data_->cpu_data(), + caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), (*top)[0]->mutable_gpu_data()); if (output_labels_) { - caffe_copy(prefetch_label_->count(), prefetch_label_->cpu_data(), + caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), (*top)[1]->mutable_gpu_data()); } // Start a new prefetch thread From 6761735ca027e89230826d02e434723dbd3c5bb9 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sat, 19 Jul 2014 18:18:03 -0700 Subject: [PATCH 0296/2053] use Blob directly instead of shared_ptr for ImageDataLayer buffers --- include/caffe/data_layers.hpp | 4 ++-- src/caffe/layers/image_data_layer.cpp | 23 +++++++++++------------ src/caffe/layers/image_data_layer.cu | 4 ++-- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 069f0c2eea2..4f3136dc27f 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -228,8 +228,8 @@ class ImageDataLayer : public Layer { int datum_width_; int datum_size_; pthread_t thread_; - shared_ptr > prefetch_data_; - shared_ptr > prefetch_label_; + Blob prefetch_data_; + Blob prefetch_label_; Blob data_mean_; Caffe::Phase phase_; }; diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 408452f5d80..e41baaf63d5 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -28,9 +28,9 @@ void* ImageDataLayerPrefetch(void* layer_pointer) { reinterpret_cast*>(layer_pointer); CHECK(layer); Datum datum; - CHECK(layer->prefetch_data_); - Dtype* top_data = layer->prefetch_data_->mutable_cpu_data(); - Dtype* top_label = layer->prefetch_label_->mutable_cpu_data(); + CHECK(layer->prefetch_data_.count()); + Dtype* top_data = layer->prefetch_data_.mutable_cpu_data(); + Dtype* top_label = layer->prefetch_label_.mutable_cpu_data(); ImageDataParameter image_data_param = layer->layer_param_.image_data_param(); const Dtype scale = image_data_param.scale(); const int batch_size = image_data_param.batch_size(); @@ -183,20 +183,19 @@ void ImageDataLayer::SetUp(const vector*>& bottom, const string& mean_file = this->layer_param_.image_data_param().mean_file(); if (crop_size > 0) { (*top)[0]->Reshape(batch_size, datum.channels(), crop_size, crop_size); - prefetch_data_.reset(new Blob(batch_size, datum.channels(), - crop_size, crop_size)); + prefetch_data_.Reshape(batch_size, datum.channels(), crop_size, crop_size); } else { (*top)[0]->Reshape(batch_size, datum.channels(), datum.height(), datum.width()); - prefetch_data_.reset(new Blob(batch_size, datum.channels(), - datum.height(), datum.width())); + prefetch_data_.Reshape(batch_size, datum.channels(), datum.height(), + datum.width()); } LOG(INFO) << "output data size: " << (*top)[0]->num() << "," << (*top)[0]->channels() << "," << (*top)[0]->height() << "," << (*top)[0]->width(); // label (*top)[1]->Reshape(batch_size, 1, 1, 1); - prefetch_label_.reset(new Blob(batch_size, 1, 1, 1)); + prefetch_label_.Reshape(batch_size, 1, 1, 1); // datum size datum_channels_ = datum.channels(); datum_height_ = datum.height(); @@ -222,8 +221,8 @@ void ImageDataLayer::SetUp(const vector*>& bottom, // cpu_data calls so that the prefetch thread does not accidentally make // simultaneous cudaMalloc calls when the main thread is running. In some // GPUs this seems to cause failures if we do not so. - prefetch_data_->mutable_cpu_data(); - prefetch_label_->mutable_cpu_data(); + prefetch_data_.mutable_cpu_data(); + prefetch_label_.mutable_cpu_data(); data_mean_.cpu_data(); DLOG(INFO) << "Initializing prefetch"; CreatePrefetchThread(); @@ -277,9 +276,9 @@ Dtype ImageDataLayer::Forward_cpu(const vector*>& bottom, // First, join the thread JoinPrefetchThread(); // Copy the data - caffe_copy(prefetch_data_->count(), prefetch_data_->cpu_data(), + caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), (*top)[0]->mutable_cpu_data()); - caffe_copy(prefetch_label_->count(), prefetch_label_->cpu_data(), + caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), (*top)[1]->mutable_cpu_data()); // Start a new prefetch thread CreatePrefetchThread(); diff --git a/src/caffe/layers/image_data_layer.cu b/src/caffe/layers/image_data_layer.cu index cf74853d902..b7ee02fe155 100644 --- a/src/caffe/layers/image_data_layer.cu +++ b/src/caffe/layers/image_data_layer.cu @@ -25,9 +25,9 @@ Dtype ImageDataLayer::Forward_gpu(const vector*>& bottom, // First, join the thread JoinPrefetchThread(); // Copy the data - caffe_copy(prefetch_data_->count(), prefetch_data_->cpu_data(), + caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), (*top)[0]->mutable_gpu_data()); - caffe_copy(prefetch_label_->count(), prefetch_label_->cpu_data(), + caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), (*top)[1]->mutable_gpu_data()); // Start a new prefetch thread CreatePrefetchThread(); From 21b019097af1f001fc9707c45c3fa1a31af47d67 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sat, 19 Jul 2014 18:22:28 -0700 Subject: [PATCH 0297/2053] use Blob directly instead of shared_ptr for WindowDataLayer buffers --- include/caffe/data_layers.hpp | 4 ++-- src/caffe/layers/window_data_layer.cpp | 20 +++++++++----------- src/caffe/layers/window_data_layer.cu | 4 ++-- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 4f3136dc27f..1bb6bceb8c8 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -315,8 +315,8 @@ class WindowDataLayer : public Layer { shared_ptr prefetch_rng_; pthread_t thread_; - shared_ptr > prefetch_data_; - shared_ptr > prefetch_label_; + Blob prefetch_data_; + Blob prefetch_label_; Blob data_mean_; vector > > image_database_; enum WindowField { IMAGE_INDEX, LABEL, OVERLAP, X1, Y1, X2, Y2, NUM }; diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index c45a1521db4..c59cac37c0c 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -39,8 +39,8 @@ void* WindowDataLayerPrefetch(void* layer_pointer) { // At each iteration, sample N windows where N*p are foreground (object) // windows and N*(1-p) are background (non-object) windows - Dtype* top_data = layer->prefetch_data_->mutable_cpu_data(); - Dtype* top_label = layer->prefetch_label_->mutable_cpu_data(); + Dtype* top_data = layer->prefetch_data_.mutable_cpu_data(); + Dtype* top_label = layer->prefetch_label_.mutable_cpu_data(); const Dtype scale = layer->layer_param_.window_data_param().scale(); const int batch_size = layer->layer_param_.window_data_param().batch_size(); const int crop_size = layer->layer_param_.window_data_param().crop_size(); @@ -58,7 +58,7 @@ void* WindowDataLayerPrefetch(void* layer_pointer) { bool use_square = (crop_mode == "square") ? true : false; // zero out batch - caffe_set(layer->prefetch_data_->count(), Dtype(0), top_data); + caffe_set(layer->prefetch_data_.count(), Dtype(0), top_data); const int num_fg = static_cast(static_cast(batch_size) * fg_fraction); @@ -370,16 +370,14 @@ void WindowDataLayer::SetUp(const vector*>& bottom, CHECK_GT(crop_size, 0); const int batch_size = this->layer_param_.window_data_param().batch_size(); (*top)[0]->Reshape(batch_size, channels, crop_size, crop_size); - prefetch_data_.reset( - new Blob(batch_size, channels, crop_size, crop_size)); + prefetch_data_.Reshape(batch_size, channels, crop_size, crop_size); LOG(INFO) << "output data size: " << (*top)[0]->num() << "," << (*top)[0]->channels() << "," << (*top)[0]->height() << "," << (*top)[0]->width(); // label (*top)[1]->Reshape(batch_size, 1, 1, 1); - prefetch_label_.reset( - new Blob(batch_size, 1, 1, 1)); + prefetch_label_.Reshape(batch_size, 1, 1, 1); // check if we want to have mean if (this->layer_param_.window_data_param().has_mean_file()) { @@ -400,8 +398,8 @@ void WindowDataLayer::SetUp(const vector*>& bottom, // cpu_data calls so that the prefetch thread does not accidentally make // simultaneous cudaMalloc calls when the main thread is running. In some // GPUs this seems to cause failures if we do not so. - prefetch_data_->mutable_cpu_data(); - prefetch_label_->mutable_cpu_data(); + prefetch_data_.mutable_cpu_data(); + prefetch_label_.mutable_cpu_data(); data_mean_.cpu_data(); DLOG(INFO) << "Initializing prefetch"; CreatePrefetchThread(); @@ -443,9 +441,9 @@ Dtype WindowDataLayer::Forward_cpu(const vector*>& bottom, // First, join the thread JoinPrefetchThread(); // Copy the data - caffe_copy(prefetch_data_->count(), prefetch_data_->cpu_data(), + caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), (*top)[0]->mutable_cpu_data()); - caffe_copy(prefetch_label_->count(), prefetch_label_->cpu_data(), + caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), (*top)[1]->mutable_cpu_data()); // Start a new prefetch thread CreatePrefetchThread(); diff --git a/src/caffe/layers/window_data_layer.cu b/src/caffe/layers/window_data_layer.cu index d4efeca06c1..b7658f6ff4f 100644 --- a/src/caffe/layers/window_data_layer.cu +++ b/src/caffe/layers/window_data_layer.cu @@ -27,9 +27,9 @@ Dtype WindowDataLayer::Forward_gpu(const vector*>& bottom, // First, join the thread JoinPrefetchThread(); // Copy the data - caffe_copy(prefetch_data_->count(), prefetch_data_->cpu_data(), + caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), (*top)[0]->mutable_gpu_data()); - caffe_copy(prefetch_label_->count(), prefetch_label_->cpu_data(), + caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), (*top)[1]->mutable_gpu_data()); // Start a new prefetch thread CreatePrefetchThread(); From 29fd174ec68006bc35d7820b3172c73dd8d2b623 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sat, 19 Jul 2014 18:51:15 -0700 Subject: [PATCH 0298/2053] add an "everything" target to make for comprehensive build testing The everything target builds all components, checks warnings, runs lint, and runs tests. --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 109894dd7c7..b25d1ba798d 100644 --- a/Makefile +++ b/Makefile @@ -295,7 +295,9 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo ############################## .PHONY: all test clean linecount lint tools examples $(DIST_ALIASES) \ py mat py$(PROJECT) mat$(PROJECT) proto runtest \ - superclean supercleanlist supercleanfiles warn + superclean supercleanlist supercleanfiles warn everything + +everything: all py$(PROJECT) mat$(PROJECT) test warn lint runtest all: $(NAME) $(STATIC_NAME) tools examples From 968f82661d8030717d0737a40b1a5fbaea91389e Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sun, 20 Jul 2014 02:29:15 -0700 Subject: [PATCH 0299/2053] remove unused includes in AccuracyLayer and ArgMaxLayer --- src/caffe/layers/accuracy_layer.cpp | 3 --- src/caffe/layers/argmax_layer.cpp | 2 -- 2 files changed, 5 deletions(-) diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 3ccba3b50d1..58ea6ae10e2 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -1,8 +1,6 @@ // Copyright 2014 BVLC and contributors. #include -#include -#include #include #include #include @@ -12,7 +10,6 @@ #include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" - namespace caffe { using std::max; diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index bd1a2689f3e..732f7bf15d1 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -1,9 +1,7 @@ // Copyright 2014 BVLC and contributors. #include -#include #include -#include #include #include From 0193012e5cccb3e1a8d74f84f988bce8966640f7 Mon Sep 17 00:00:00 2001 From: qipeng Date: Sat, 19 Jul 2014 13:24:01 -0700 Subject: [PATCH 0300/2053] leaky relu + unit test --- src/caffe/layers/relu_layer.cpp | 8 ++++++-- src/caffe/layers/relu_layer.cu | 16 ++++++++++------ src/caffe/proto/caffe.proto | 13 ++++++++++++- src/caffe/test/test_neuron_layer.cpp | 26 ++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index 1e1195501e8..57ccf97e046 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -14,8 +14,10 @@ Dtype ReLULayer::Forward_cpu(const vector*>& bottom, const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); const int count = bottom[0]->count(); + Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); for (int i = 0; i < count; ++i) { - top_data[i] = std::max(bottom_data[i], Dtype(0)); + top_data[i] = std::max(bottom_data[i], Dtype(0)) + + negative_slope * std::min(bottom_data[i], Dtype(0)); } return Dtype(0); } @@ -29,8 +31,10 @@ void ReLULayer::Backward_cpu(const vector*>& top, const Dtype* top_diff = top[0]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); const int count = (*bottom)[0]->count(); + Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); for (int i = 0; i < count; ++i) { - bottom_diff[i] = top_diff[i] * (bottom_data[i] > 0); + bottom_diff[i] = top_diff[i] * (bottom_data[i] >= 0) + + top_diff[i] * negative_slope * (bottom_data[i] < 0); } } } diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index e8b0fbeea57..f5a24a9a466 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -9,9 +9,10 @@ namespace caffe { template -__global__ void ReLUForward(const int n, const Dtype* in, Dtype* out) { +__global__ void ReLUForward(const int n, const Dtype* in, Dtype* out, + Dtype negative_slope) { CUDA_KERNEL_LOOP(index, n) { - out[index] = in[index] > 0 ? in[index] : 0; + out[index] = in[index] > 0 ? in[index] : in[index] * negative_slope; } } @@ -21,9 +22,10 @@ Dtype ReLULayer::Forward_gpu(const vector*>& bottom, const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); const int count = bottom[0]->count(); + Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); // NOLINT_NEXT_LINE(whitespace/operators) ReLUForward<<>>( - count, bottom_data, top_data); + count, bottom_data, top_data, negative_slope); CUDA_POST_KERNEL_CHECK; // << " count: " << count << " bottom_data: " // << (unsigned long)bottom_data @@ -35,9 +37,10 @@ Dtype ReLULayer::Forward_gpu(const vector*>& bottom, template __global__ void ReLUBackward(const int n, const Dtype* in_diff, - const Dtype* in_data, Dtype* out_diff) { + const Dtype* in_data, Dtype* out_diff, Dtype negative_slope) { CUDA_KERNEL_LOOP(index, n) { - out_diff[index] = in_diff[index] * (in_data[index] > 0); + out_diff[index] = in_diff[index] * (in_data[index] >= 0) + + in_diff[index] * (in_data[index] < 0) * negative_slope; } } @@ -50,9 +53,10 @@ void ReLULayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = top[0]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); const int count = (*bottom)[0]->count(); + Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); // NOLINT_NEXT_LINE(whitespace/operators) ReLUBackward<<>>( - count, top_diff, bottom_data, bottom_diff); + count, top_diff, bottom_data, bottom_diff, negative_slope); CUDA_POST_KERNEL_CHECK; } } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 10e52d2ad47..9c3ddfe7ed5 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -117,7 +117,7 @@ message SolverState { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 28 (last added: accuracy_param) +// LayerParameter next available ID: 31 (last added: relu_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs @@ -207,6 +207,7 @@ message LayerParameter { optional MemoryDataParameter memory_data_param = 22; optional PoolingParameter pooling_param = 19; optional PowerParameter power_param = 21; + optional ReLUParameter relu_param = 30; optional WindowDataParameter window_data_param = 20; optional ThresholdParameter threshold_param = 25; optional HingeLossParameter hinge_loss_param = 29; @@ -429,6 +430,16 @@ message PowerParameter { optional float shift = 3 [default = 0.0]; } +// Message that stores parameters used by ReLULayer +message ReLUParameter { + // Allow non-zero slope for negative inputs to speed up optimization + // Described in: + // Maas, A. L., Hannun, A. Y., & Ng, A. Y. (2013). Rectifier nonlinearities + // improve neural network acoustic models. In ICML Workshop on Deep Learning + // for Audio, Speech, and Language Processing. + optional float negative_slope = 1 [default = 0]; +} + // Message that stores parameters used by WindowDataLayer message WindowDataParameter { // Specify the data source. diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 246832d226d..db9b934fb5b 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -62,6 +62,32 @@ TYPED_TEST(NeuronLayerTest, TestReLUGradient) { &(this->blob_top_vec_)); } +TYPED_TEST(NeuronLayerTest, TestReLUWithNegativeSlope) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.ParseFromString("relu_param{negative_slope:0.01}"); + ReLULayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + EXPECT_GE(top_data[i], 0.); + EXPECT_TRUE(top_data[i] == 0 || top_data[i] == bottom_data[i]); + } +} + +TYPED_TEST(NeuronLayerTest, TestReLUGradientWithNegativeSlope) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + ReLULayer layer(layer_param); + layer_param.ParseFromString("relu_param{negative_slope:0.01}"); + GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + TYPED_TEST(NeuronLayerTest, TestSigmoid) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; From ba3ea2b6b1733a330057aff7e94e64834b2df439 Mon Sep 17 00:00:00 2001 From: qipeng Date: Sat, 19 Jul 2014 17:28:52 -0700 Subject: [PATCH 0301/2053] reduced multiplications & fixed unit test --- src/caffe/layers/relu_layer.cpp | 4 ++-- src/caffe/layers/relu_layer.cu | 4 ++-- src/caffe/test/test_neuron_layer.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index 57ccf97e046..3a3e8a21afe 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -33,8 +33,8 @@ void ReLULayer::Backward_cpu(const vector*>& top, const int count = (*bottom)[0]->count(); Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); for (int i = 0; i < count; ++i) { - bottom_diff[i] = top_diff[i] * (bottom_data[i] >= 0) - + top_diff[i] * negative_slope * (bottom_data[i] < 0); + bottom_diff[i] = top_diff[i] * ((bottom_data[i] >= 0) + + negative_slope * (bottom_data[i] < 0)); } } } diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index f5a24a9a466..503147c713d 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -39,8 +39,8 @@ template __global__ void ReLUBackward(const int n, const Dtype* in_diff, const Dtype* in_data, Dtype* out_diff, Dtype negative_slope) { CUDA_KERNEL_LOOP(index, n) { - out_diff[index] = in_diff[index] * (in_data[index] >= 0) - + in_diff[index] * (in_data[index] < 0) * negative_slope; + out_diff[index] = in_diff[index] * ((in_data[index] >= 0) + + (in_data[index] < 0) * negative_slope); } } diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index db9b934fb5b..7a7af3188fe 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -81,8 +81,8 @@ TYPED_TEST(NeuronLayerTest, TestReLUWithNegativeSlope) { TYPED_TEST(NeuronLayerTest, TestReLUGradientWithNegativeSlope) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - ReLULayer layer(layer_param); layer_param.ParseFromString("relu_param{negative_slope:0.01}"); + ReLULayer layer(layer_param); GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); From 324973aa6cc9909fc0b09c939f6c0056942cfc04 Mon Sep 17 00:00:00 2001 From: bhack Date: Sun, 13 Jul 2014 01:09:10 +0200 Subject: [PATCH 0302/2053] Add split dim layer Differentiate top test blob vector size Rename to SplitLayer Add slicing points --- include/caffe/common_layers.hpp | 38 ++++++++ src/caffe/layer_factory.cpp | 2 + src/caffe/layers/slice_layer.cpp | 135 ++++++++++++++++++++++++++++ src/caffe/layers/slice_layer.cu | 74 +++++++++++++++ src/caffe/proto/caffe.proto | 13 ++- src/caffe/test/test_slice_layer.cpp | 131 +++++++++++++++++++++++++++ 6 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 src/caffe/layers/slice_layer.cpp create mode 100644 src/caffe/layers/slice_layer.cu create mode 100644 src/caffe/test/test_slice_layer.cpp diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 395ea7d6c98..643c0ee4147 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -178,6 +178,44 @@ class SplitLayer : public Layer { int count_; }; +/* SliceLayer + Takes one blobs and slice it along either num or + channel dim, outputting the result. +*/ +template +class SliceLayer : public Layer { + public: + explicit SliceLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SLICE; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int MinTopBlobs() const { return 2; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + + Blob col_bob_; + int count_; + int num_; + int channels_; + int height_; + int width_; + int slice_dim_; + google::protobuf::RepeatedField slice_point_; +}; + } // namespace caffe #endif // CAFFE_COMMON_LAYERS_HPP_ diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index e6cbe187c3c..de960214153 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -71,6 +71,8 @@ Layer* GetLayer(const LayerParameter& param) { return new SigmoidLayer(param); case LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS: return new SigmoidCrossEntropyLossLayer(param); + case LayerParameter_LayerType_SLICE: + return new SliceLayer(param); case LayerParameter_LayerType_SOFTMAX: return new SoftmaxLayer(param); case LayerParameter_LayerType_SOFTMAX_LOSS: diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp new file mode 100644 index 00000000000..c6a9b05e221 --- /dev/null +++ b/src/caffe/layers/slice_layer.cpp @@ -0,0 +1,135 @@ +// Copyright 2014 BVLC and contributors. + +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void SliceLayer::SetUp(const vector*>& bottom, + vector*>* top) { + Layer::SetUp(bottom, top); + slice_dim_ = this->layer_param_.slice_param().slice_dim(); + slice_point_ = this->layer_param_.slice_param().slice_point(); + CHECK_GE(slice_dim_, 0) << + "slice_dim should be >= 0"; + CHECK_LE(slice_dim_, 1) << + "For now slice_dim <=1, it can only slice num and channels"; + count_ = 0; + num_ = bottom[0]->num(); + channels_ = bottom[0]->channels(); + height_ = bottom[0]->height(); + width_ = bottom[0]->width(); + if (slice_point_.size() != 0) { + CHECK_EQ(slice_point_.size(), top->size()-1); + if (slice_dim_ == 0) { + CHECK_LE(top->size(), num_); + } else { + CHECK_LE(top->size(), channels_); + } + int prev = 0; + vector slices; + for (int i = 0; i < slice_point_.size(); ++i) { + CHECK_GT(slice_point_.Get(i), prev); + slices.push_back(slice_point_.Get(i) - prev); + prev = slice_point_.Get(i); + } + if (slice_dim_ == 0) { + slices.push_back(num_ - prev); + for (int i = 0; i < top->size(); ++i) { + (*top)[i]->Reshape(slices[i], channels_, height_, width_); + count_ += (*top)[i]->count(); + } + } else { + slices.push_back(channels_ - prev); + for (int i = 0; i < top->size(); ++i) { + (*top)[i]->Reshape(num_, slices[i], height_, width_); + count_ += (*top)[i]->count(); + } + } + + } else { + if (slice_dim_ == 0) { + int remainder = num_%top->size(); + CHECK_EQ(remainder, 0); + num_ = num_/top->size(); + } else { + int remainder = channels_%top->size(); + CHECK_EQ(remainder, 0); + channels_ = channels_/top->size(); + } + for (int i = 0; i < top->size(); ++i) { + (*top)[i]->Reshape(num_, channels_, height_, width_); + count_ += (*top)[i]->count(); + } + } + CHECK_EQ(count_, bottom[0]->count()); +} + +template +Dtype SliceLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->mutable_cpu_data(); + if (slice_dim_ == 0) { + int offset_num = 0; + for (int i = 0; i < top->size(); ++i) { + Blob* blob = (*top)[i]; + Dtype* top_data = blob->mutable_cpu_data(); + caffe_copy(blob->count(), bottom_data + bottom[0]->offset(offset_num), + top_data); + offset_num += blob->num(); + } + } else if (slice_dim_ == 1) { + int offset_channel = 0; + for (int i = 0; i < top->size(); ++i) { + Blob* blob = (*top)[i]; + Dtype* top_data = blob->mutable_cpu_data(); + int num_elem = blob->channels()*blob->height()*blob->width(); + for (int n = 0; n < num_; ++n) { + caffe_copy(num_elem, bottom_data + bottom[0]->offset(n, offset_channel), + top_data + blob->offset(n)); + } + offset_channel += blob->channels(); + } + } // slice_dim_ is guaranteed to be 0 or 1 by SetU + return Dtype(0.); +} + +template +void SliceLayer::Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) { + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + if (slice_dim_ == 0) { + int offset_num = 0; + for (int i = 0; i < top.size(); ++i) { + Blob* blob = top[i]; + if (propagate_down[i]) { + const Dtype* top_diff = blob->cpu_diff(); + caffe_copy(blob->count(), top_diff, + bottom_diff + (*bottom)[0]->offset(offset_num)); + } + offset_num += blob->num(); + } + } else if (slice_dim_ == 1) { + int offset_channel = 0; + for (int i = 0; i < top.size(); ++i) { + Blob* blob = top[i]; + if (propagate_down[i]) { + const Dtype* top_diff = blob->cpu_diff(); + int num_elem = blob->channels()*blob->height()*blob->width(); + for (int n = 0; n < num_; ++n) { + caffe_copy(num_elem, top_diff + blob->offset(n), + bottom_diff + (*bottom)[0]->offset(n, offset_channel)); + } + } + offset_channel += blob->channels(); + } + } // slice_dim_ is guaranteed to be 0 or 1 by SetUp. +} + +INSTANTIATE_CLASS(SliceLayer); + +} // namespace caffe diff --git a/src/caffe/layers/slice_layer.cu b/src/caffe/layers/slice_layer.cu new file mode 100644 index 00000000000..c2eeb5c7d95 --- /dev/null +++ b/src/caffe/layers/slice_layer.cu @@ -0,0 +1,74 @@ +// Copyright 2014 BVLC and contributors. + +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +Dtype SliceLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->mutable_gpu_data(); + if (slice_dim_ == 0) { + int offset_num = 0; + for (int i = 0; i < top->size(); ++i) { + Blob* blob = (*top)[i]; + Dtype* top_data = blob->mutable_gpu_data(); + caffe_copy(blob->count(), bottom_data + bottom[0]->offset(offset_num), + top_data); + offset_num += blob->num(); + } + } else if (slice_dim_ == 1) { + int offset_channel = 0; + for (int i = 0; i < top->size(); ++i) { + Blob* blob = (*top)[i]; + Dtype* top_data = blob->mutable_gpu_data(); + int num_elem = blob->channels()*blob->height()*blob->width(); + for (int n = 0; n < num_; ++n) { + caffe_copy(num_elem, bottom_data + bottom[0]->offset(n, offset_channel), + top_data + blob->offset(n)); + } + offset_channel += blob->channels(); + } + } // slice_dim_ is guaranteed to be 0 or 1 by SetU + return Dtype(0.); +} + +template +void SliceLayer::Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) { + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + if (slice_dim_ == 0) { + int offset_num = 0; + for (int i = 0; i < top.size(); ++i) { + Blob* blob = top[i]; + if (propagate_down[i]) { + const Dtype* top_diff = blob->gpu_diff(); + caffe_copy(blob->count(), top_diff, + bottom_diff + (*bottom)[0]->offset(offset_num)); + } + offset_num += blob->num(); + } + } else if (slice_dim_ == 1) { + int offset_channel = 0; + for (int i = 0; i < top.size(); ++i) { + Blob* blob = top[i]; + if (propagate_down[i]) { + const Dtype* top_diff = blob->gpu_diff(); + int num_elem = blob->channels()*blob->height()*blob->width(); + for (int n = 0; n < num_; ++n) { + caffe_copy(num_elem, top_diff + blob->offset(n), + bottom_diff + (*bottom)[0]->offset(n, offset_channel)); + } + } + offset_channel += blob->channels(); + } + } // slice_dim_ is guaranteed to be 0 or 1 by SetUp. +} + +INSTANTIATE_CLASS(SliceLayer); + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 9c3ddfe7ed5..d1d5336a9c8 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -129,7 +129,7 @@ message LayerParameter { // line above the enum. Update the next available ID when you add a new // LayerType. // - // LayerType next available ID: 33 (last added: DUMMY_DATA) + // LayerType next available ID: 34 (last added: SLICE) enum LayerType { // "NONE" layer type is 0th enum element so that we don't cause confusion // by defaulting to an existent LayerType (instead, should usually error if @@ -164,6 +164,7 @@ message LayerParameter { SOFTMAX = 20; SOFTMAX_LOSS = 21; SPLIT = 22; + SLICE = 33; TANH = 23; WINDOW_DATA = 24; THRESHOLD = 31; @@ -211,6 +212,7 @@ message LayerParameter { optional WindowDataParameter window_data_param = 20; optional ThresholdParameter threshold_param = 25; optional HingeLossParameter hinge_loss_param = 29; + optional SliceParameter slice_param=30; // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new @@ -440,6 +442,15 @@ message ReLUParameter { optional float negative_slope = 1 [default = 0]; } +// Message that stores parameters used by SliceLayer +message SliceParameter { + // Slice Layer needs to specify the dimension along the slice will happen, + // the other dimensions must be the same for all the bottom blobs + // By default it will slice blobs along channels dimension + optional uint32 slice_dim = 1 [default = 1]; + repeated uint32 slice_point = 2; +} + // Message that stores parameters used by WindowDataLayer message WindowDataParameter { // Specify the data source. diff --git a/src/caffe/test/test_slice_layer.cpp b/src/caffe/test/test_slice_layer.cpp new file mode 100644 index 00000000000..8f7bb60171b --- /dev/null +++ b/src/caffe/test/test_slice_layer.cpp @@ -0,0 +1,131 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include + +#include "cuda_runtime.h" +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; + +template +class SliceLayerTest : public ::testing::Test { + protected: + SliceLayerTest() + : blob_bottom_(new Blob(6, 12, 6, 5)), + blob_top_0(new Blob()), + blob_top_1(new Blob()), + blob_top_2(new Blob()) {} + virtual void SetUp() { + // fill the values + FillerParameter filler_param; + filler_param.set_value(1.); + ConstantFiller filler(filler_param); + filler.Fill(this->blob_bottom_); + blob_top_vec_0.push_back(blob_top_0); + blob_top_vec_0.push_back(blob_top_1); + blob_top_vec_1.push_back(blob_top_0); + blob_top_vec_1.push_back(blob_top_1); + blob_top_vec_1.push_back(blob_top_2); + blob_bottom_vec_.push_back(blob_bottom_); + } + + virtual ~SliceLayerTest() { + delete blob_top_0; delete blob_top_1; + delete blob_top_2; delete blob_bottom_; + } + + Blob* const blob_bottom_; + Blob* const blob_top_0; + Blob* const blob_top_1; + Blob* const blob_top_2; + vector*> blob_top_vec_0, blob_top_vec_1; + vector*> blob_bottom_vec_; +}; + +typedef ::testing::Types Dtypes; +TYPED_TEST_CASE(SliceLayerTest, Dtypes); + +TYPED_TEST(SliceLayerTest, TestCPUSetupNum) { + LayerParameter layer_param; + layer_param.mutable_slice_param()->set_slice_dim(0); + SliceLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_1)); + EXPECT_EQ(this->blob_bottom_->num(), + this->blob_top_0->num() + this->blob_top_1->num() + + this->blob_top_2->num()); + EXPECT_EQ(this->blob_bottom_->channels(), this->blob_top_0->channels()); + EXPECT_EQ(this->blob_bottom_->height(), this->blob_top_0->height()); + EXPECT_EQ(this->blob_bottom_->width(), this->blob_top_0->width()); +} + +TYPED_TEST(SliceLayerTest, TestCPUSetupChannels) { + LayerParameter layer_param; + layer_param.mutable_slice_param()->add_slice_point(3); + SliceLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_0)); + EXPECT_EQ(this->blob_top_0->num(), this->blob_bottom_->num()); + EXPECT_EQ(this->blob_top_0->channels(), 3); + EXPECT_EQ(this->blob_top_1->channels(), 9); + EXPECT_EQ(this->blob_bottom_->channels(), + this->blob_top_0->channels()+this->blob_top_1->channels()); + EXPECT_EQ(this->blob_bottom_->height(), this->blob_top_0->height()); + EXPECT_EQ(this->blob_bottom_->width(), this->blob_top_0->width()); +} + + +TYPED_TEST(SliceLayerTest, TestCPUNum) { + LayerParameter layer_param; + SliceLayer layer(layer_param); + Caffe::set_mode(Caffe::CPU); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_0)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_0)); + for (int n = 0; n < this->blob_bottom_->num(); ++n) { + for (int c = 0; c < this->blob_top_0->channels(); ++c) { + for (int h = 0; h < this->blob_bottom_->height(); ++h) { + for (int w = 0; w < this->blob_bottom_->width(); ++w) { + EXPECT_EQ(this->blob_bottom_->data_at(n, c, h, w), + this->blob_top_vec_0[0]->data_at(n, c, h, w)); + } + } + } + for (int c = 0; c < this->blob_top_1->channels(); ++c) { + for (int h = 0; h < this->blob_bottom_->height(); ++h) { + for (int w = 0; w < this->blob_bottom_->width(); ++w) { + EXPECT_EQ(this->blob_bottom_->data_at(n, c+3, h, w), + this->blob_top_vec_0[1]->data_at(n, c, h, w)); + } + } + } + } +} + + +TYPED_TEST(SliceLayerTest, TestCPUGradient) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::CPU); + SliceLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradient(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_0)); +} + +TYPED_TEST(SliceLayerTest, TestGPUGradient) { + LayerParameter layer_param; + Caffe::set_mode(Caffe::GPU); + SliceLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradient(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_0)); +} + +} // namespace caffe From 5db5b31c5928eb18a4d77d49d09d84c6289c0414 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 22 Jul 2014 00:44:53 -0700 Subject: [PATCH 0303/2053] SliceLayer: post-rebase fixes, cleanup, etc. (some from changes suggested by @sguada). Test for both num & channels in forward & backward; use GaussianFiller so that tests are non-trivial. --- include/caffe/common_layers.hpp | 6 +- src/caffe/layers/slice_layer.cpp | 69 +++++----- src/caffe/layers/slice_layer.cu | 27 ++-- src/caffe/proto/caffe.proto | 11 +- src/caffe/test/test_slice_layer.cpp | 187 ++++++++++++++++++---------- 5 files changed, 181 insertions(+), 119 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 643c0ee4147..5d872452ae2 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -179,8 +179,8 @@ class SplitLayer : public Layer { }; /* SliceLayer - Takes one blobs and slice it along either num or - channel dim, outputting the result. + Takes one blobs and slices it along either num or channel dim, + outputting the result into as many top blobs as needed. */ template class SliceLayer : public Layer { @@ -213,7 +213,7 @@ class SliceLayer : public Layer { int height_; int width_; int slice_dim_; - google::protobuf::RepeatedField slice_point_; + vector slice_point_; }; } // namespace caffe diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp index c6a9b05e221..e895e4f0b8a 100644 --- a/src/caffe/layers/slice_layer.cpp +++ b/src/caffe/layers/slice_layer.cpp @@ -12,19 +12,21 @@ template void SliceLayer::SetUp(const vector*>& bottom, vector*>* top) { Layer::SetUp(bottom, top); - slice_dim_ = this->layer_param_.slice_param().slice_dim(); - slice_point_ = this->layer_param_.slice_param().slice_point(); - CHECK_GE(slice_dim_, 0) << - "slice_dim should be >= 0"; - CHECK_LE(slice_dim_, 1) << - "For now slice_dim <=1, it can only slice num and channels"; + const SliceParameter& slice_param = this->layer_param_.slice_param(); + slice_dim_ = slice_param.slice_dim(); + CHECK_GE(slice_dim_, 0); + CHECK_LE(slice_dim_, 1) << "Can only slice num and channels"; + slice_point_.clear(); + for (int i = 0; i < slice_param.slice_point_size(); ++i) { + slice_point_.push_back(slice_param.slice_point(i)); + } count_ = 0; num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); if (slice_point_.size() != 0) { - CHECK_EQ(slice_point_.size(), top->size()-1); + CHECK_EQ(slice_point_.size(), top->size() - 1); if (slice_dim_ == 0) { CHECK_LE(top->size(), num_); } else { @@ -33,9 +35,9 @@ void SliceLayer::SetUp(const vector*>& bottom, int prev = 0; vector slices; for (int i = 0; i < slice_point_.size(); ++i) { - CHECK_GT(slice_point_.Get(i), prev); - slices.push_back(slice_point_.Get(i) - prev); - prev = slice_point_.Get(i); + CHECK_GT(slice_point_[i], prev); + slices.push_back(slice_point_[i] - prev); + prev = slice_point_[i]; } if (slice_dim_ == 0) { slices.push_back(num_ - prev); @@ -53,17 +55,19 @@ void SliceLayer::SetUp(const vector*>& bottom, } else { if (slice_dim_ == 0) { - int remainder = num_%top->size(); - CHECK_EQ(remainder, 0); - num_ = num_/top->size(); + CHECK_EQ(num_ % top->size(), 0) + << "Number of top blobs (" << top->size() << ") " + << "should evenly divide input num ( " << num_ << ")"; + num_ = num_ / top->size(); } else { - int remainder = channels_%top->size(); - CHECK_EQ(remainder, 0); - channels_ = channels_/top->size(); + CHECK_EQ(channels_ % top->size(), 0) + << "Number of top blobs (" << top->size() << ") " + << "should evenly divide input channels ( " << channels_ << ")"; + channels_ = channels_ / top->size(); } for (int i = 0; i < top->size(); ++i) { (*top)[i]->Reshape(num_, channels_, height_, width_); - count_ += (*top)[i]->count(); + count_ += (*top)[i]->count(); } } CHECK_EQ(count_, bottom[0]->count()); @@ -87,49 +91,50 @@ Dtype SliceLayer::Forward_cpu(const vector*>& bottom, for (int i = 0; i < top->size(); ++i) { Blob* blob = (*top)[i]; Dtype* top_data = blob->mutable_cpu_data(); - int num_elem = blob->channels()*blob->height()*blob->width(); + const int num_elem = blob->channels() * blob->height() * blob->width(); for (int n = 0; n < num_; ++n) { caffe_copy(num_elem, bottom_data + bottom[0]->offset(n, offset_channel), - top_data + blob->offset(n)); + top_data + blob->offset(n)); } offset_channel += blob->channels(); } - } // slice_dim_ is guaranteed to be 0 or 1 by SetU + } // slice_dim_ is guaranteed to be 0 or 1 by SetUp. return Dtype(0.); } template void SliceLayer::Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { + if (!propagate_down[0]) { return; } Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); if (slice_dim_ == 0) { int offset_num = 0; for (int i = 0; i < top.size(); ++i) { Blob* blob = top[i]; - if (propagate_down[i]) { - const Dtype* top_diff = blob->cpu_diff(); - caffe_copy(blob->count(), top_diff, - bottom_diff + (*bottom)[0]->offset(offset_num)); - } + const Dtype* top_diff = blob->cpu_diff(); + caffe_copy(blob->count(), top_diff, + bottom_diff + (*bottom)[0]->offset(offset_num)); offset_num += blob->num(); } } else if (slice_dim_ == 1) { int offset_channel = 0; for (int i = 0; i < top.size(); ++i) { Blob* blob = top[i]; - if (propagate_down[i]) { - const Dtype* top_diff = blob->cpu_diff(); - int num_elem = blob->channels()*blob->height()*blob->width(); - for (int n = 0; n < num_; ++n) { - caffe_copy(num_elem, top_diff + blob->offset(n), - bottom_diff + (*bottom)[0]->offset(n, offset_channel)); - } + const Dtype* top_diff = blob->cpu_diff(); + const int num_elem = blob->channels() * blob->height() * blob->width(); + for (int n = 0; n < num_; ++n) { + caffe_copy(num_elem, top_diff + blob->offset(n), + bottom_diff + (*bottom)[0]->offset(n, offset_channel)); } offset_channel += blob->channels(); } } // slice_dim_ is guaranteed to be 0 or 1 by SetUp. } +#ifdef CPU_ONLY +STUB_GPU(SliceLayer); +#endif + INSTANTIATE_CLASS(SliceLayer); } // namespace caffe diff --git a/src/caffe/layers/slice_layer.cu b/src/caffe/layers/slice_layer.cu index c2eeb5c7d95..3ea8d57659d 100644 --- a/src/caffe/layers/slice_layer.cu +++ b/src/caffe/layers/slice_layer.cu @@ -26,43 +26,40 @@ Dtype SliceLayer::Forward_gpu(const vector*>& bottom, for (int i = 0; i < top->size(); ++i) { Blob* blob = (*top)[i]; Dtype* top_data = blob->mutable_gpu_data(); - int num_elem = blob->channels()*blob->height()*blob->width(); + const int num_elem = blob->channels() * blob->height() * blob->width(); for (int n = 0; n < num_; ++n) { caffe_copy(num_elem, bottom_data + bottom[0]->offset(n, offset_channel), - top_data + blob->offset(n)); + top_data + blob->offset(n)); } offset_channel += blob->channels(); } - } // slice_dim_ is guaranteed to be 0 or 1 by SetU + } // slice_dim_ is guaranteed to be 0 or 1 by SetUp. return Dtype(0.); } template void SliceLayer::Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { + if (!propagate_down[0]) { return; } Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); if (slice_dim_ == 0) { int offset_num = 0; for (int i = 0; i < top.size(); ++i) { Blob* blob = top[i]; - if (propagate_down[i]) { - const Dtype* top_diff = blob->gpu_diff(); - caffe_copy(blob->count(), top_diff, - bottom_diff + (*bottom)[0]->offset(offset_num)); - } + const Dtype* top_diff = blob->gpu_diff(); + caffe_copy(blob->count(), top_diff, + bottom_diff + (*bottom)[0]->offset(offset_num)); offset_num += blob->num(); } } else if (slice_dim_ == 1) { int offset_channel = 0; for (int i = 0; i < top.size(); ++i) { Blob* blob = top[i]; - if (propagate_down[i]) { - const Dtype* top_diff = blob->gpu_diff(); - int num_elem = blob->channels()*blob->height()*blob->width(); - for (int n = 0; n < num_; ++n) { - caffe_copy(num_elem, top_diff + blob->offset(n), - bottom_diff + (*bottom)[0]->offset(n, offset_channel)); - } + const Dtype* top_diff = blob->gpu_diff(); + const int num_elem = blob->channels() * blob->height() * blob->width(); + for (int n = 0; n < num_; ++n) { + caffe_copy(num_elem, top_diff + blob->offset(n), + bottom_diff + (*bottom)[0]->offset(n, offset_channel)); } offset_channel += blob->channels(); } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index d1d5336a9c8..34cf8443f56 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -117,7 +117,7 @@ message SolverState { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 31 (last added: relu_param) +// LayerParameter next available ID: 32 (last added: slice_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs @@ -212,7 +212,7 @@ message LayerParameter { optional WindowDataParameter window_data_param = 20; optional ThresholdParameter threshold_param = 25; optional HingeLossParameter hinge_loss_param = 29; - optional SliceParameter slice_param=30; + optional SliceParameter slice_param = 31; // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new @@ -444,9 +444,10 @@ message ReLUParameter { // Message that stores parameters used by SliceLayer message SliceParameter { - // Slice Layer needs to specify the dimension along the slice will happen, - // the other dimensions must be the same for all the bottom blobs - // By default it will slice blobs along channels dimension + // SliceLayer needs to know which dimension to slice across. + // Currently, SliceLayer only supports slicing across num (dim 0) + // and channels (dim 1). + // By default, SliceLayer slices across channels. optional uint32 slice_dim = 1 [default = 1]; repeated uint32 slice_point = 2; } diff --git a/src/caffe/test/test_slice_layer.cpp b/src/caffe/test/test_slice_layer.cpp index 8f7bb60171b..59f6a8d4c66 100644 --- a/src/caffe/test/test_slice_layer.cpp +++ b/src/caffe/test/test_slice_layer.cpp @@ -3,7 +3,6 @@ #include #include -#include "cuda_runtime.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -15,117 +14,177 @@ namespace caffe { -extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; +template +class SliceLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; -template -class SliceLayerTest : public ::testing::Test { protected: SliceLayerTest() - : blob_bottom_(new Blob(6, 12, 6, 5)), - blob_top_0(new Blob()), - blob_top_1(new Blob()), - blob_top_2(new Blob()) {} + : blob_bottom_(new Blob(6, 12, 2, 3)), + blob_top_0_(new Blob()), + blob_top_1_(new Blob()), + blob_top_2_(new Blob()) {} virtual void SetUp() { // fill the values + Caffe::set_random_seed(1701); FillerParameter filler_param; - filler_param.set_value(1.); - ConstantFiller filler(filler_param); + GaussianFiller filler(filler_param); filler.Fill(this->blob_bottom_); - blob_top_vec_0.push_back(blob_top_0); - blob_top_vec_0.push_back(blob_top_1); - blob_top_vec_1.push_back(blob_top_0); - blob_top_vec_1.push_back(blob_top_1); - blob_top_vec_1.push_back(blob_top_2); + blob_top_vec_0_.push_back(blob_top_0_); + blob_top_vec_0_.push_back(blob_top_1_); + blob_top_vec_1_.push_back(blob_top_0_); + blob_top_vec_1_.push_back(blob_top_1_); + blob_top_vec_1_.push_back(blob_top_2_); blob_bottom_vec_.push_back(blob_bottom_); } + virtual void ReduceBottomBlobSize() { + blob_bottom_->Reshape(4, 5, 2, 2); + FillerParameter filler_param; + GaussianFiller filler(filler_param); + filler.Fill(this->blob_bottom_); + } + virtual ~SliceLayerTest() { - delete blob_top_0; delete blob_top_1; - delete blob_top_2; delete blob_bottom_; + delete blob_top_0_; delete blob_top_1_; + delete blob_top_2_; delete blob_bottom_; } Blob* const blob_bottom_; - Blob* const blob_top_0; - Blob* const blob_top_1; - Blob* const blob_top_2; - vector*> blob_top_vec_0, blob_top_vec_1; + Blob* const blob_top_0_; + Blob* const blob_top_1_; + Blob* const blob_top_2_; + vector*> blob_top_vec_0_, blob_top_vec_1_; vector*> blob_bottom_vec_; }; -typedef ::testing::Types Dtypes; -TYPED_TEST_CASE(SliceLayerTest, Dtypes); +TYPED_TEST_CASE(SliceLayerTest, TestDtypesAndDevices); -TYPED_TEST(SliceLayerTest, TestCPUSetupNum) { +TYPED_TEST(SliceLayerTest, TestSetupNum) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; layer_param.mutable_slice_param()->set_slice_dim(0); - SliceLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_1)); - EXPECT_EQ(this->blob_bottom_->num(), - this->blob_top_0->num() + this->blob_top_1->num() + - this->blob_top_2->num()); - EXPECT_EQ(this->blob_bottom_->channels(), this->blob_top_0->channels()); - EXPECT_EQ(this->blob_bottom_->height(), this->blob_top_0->height()); - EXPECT_EQ(this->blob_bottom_->width(), this->blob_top_0->width()); + SliceLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_1_)); + EXPECT_EQ(this->blob_bottom_->num(), 3 * this->blob_top_0_->num()); + EXPECT_EQ(this->blob_top_0_->num(), this->blob_top_1_->num()); + EXPECT_EQ(this->blob_top_0_->num(), this->blob_top_2_->num()); + EXPECT_EQ(this->blob_bottom_->channels(), this->blob_top_0_->channels()); + EXPECT_EQ(this->blob_bottom_->height(), this->blob_top_0_->height()); + EXPECT_EQ(this->blob_bottom_->width(), this->blob_top_0_->width()); } -TYPED_TEST(SliceLayerTest, TestCPUSetupChannels) { +TYPED_TEST(SliceLayerTest, TestSetupChannels) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; layer_param.mutable_slice_param()->add_slice_point(3); - SliceLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_0)); - EXPECT_EQ(this->blob_top_0->num(), this->blob_bottom_->num()); - EXPECT_EQ(this->blob_top_0->channels(), 3); - EXPECT_EQ(this->blob_top_1->channels(), 9); + SliceLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_0_)); + EXPECT_EQ(this->blob_top_0_->num(), this->blob_bottom_->num()); + EXPECT_EQ(this->blob_top_0_->channels(), 3); + EXPECT_EQ(this->blob_top_1_->channels(), 9); EXPECT_EQ(this->blob_bottom_->channels(), - this->blob_top_0->channels()+this->blob_top_1->channels()); - EXPECT_EQ(this->blob_bottom_->height(), this->blob_top_0->height()); - EXPECT_EQ(this->blob_bottom_->width(), this->blob_top_0->width()); + this->blob_top_0_->channels() + this->blob_top_1_->channels()); + EXPECT_EQ(this->blob_bottom_->height(), this->blob_top_0_->height()); + EXPECT_EQ(this->blob_bottom_->width(), this->blob_top_0_->width()); } +TYPED_TEST(SliceLayerTest, TestSliceAcrossNum) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.mutable_slice_param()->set_slice_dim(0); + SliceLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_0_)); + const int top_num = this->blob_bottom_->num() / 2; + ASSERT_EQ(top_num, this->blob_top_0_->num()); + ASSERT_EQ(top_num, this->blob_top_1_->num()); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_0_)); + for (int n = 0; n < top_num; ++n) { + for (int c = 0; c < this->blob_top_0_->channels(); ++c) { + for (int h = 0; h < this->blob_bottom_->height(); ++h) { + for (int w = 0; w < this->blob_bottom_->width(); ++w) { + EXPECT_EQ(this->blob_bottom_->data_at(n, c, h, w), + this->blob_top_0_->data_at(n, c, h, w)); + } + } + } + for (int c = 0; c < this->blob_top_1_->channels(); ++c) { + for (int h = 0; h < this->blob_bottom_->height(); ++h) { + for (int w = 0; w < this->blob_bottom_->width(); ++w) { + EXPECT_EQ(this->blob_bottom_->data_at(n + 3, c, h, w), + this->blob_top_1_->data_at(n, c, h, w)); + } + } + } + } +} -TYPED_TEST(SliceLayerTest, TestCPUNum) { +TYPED_TEST(SliceLayerTest, TestSliceAcrossChannels) { + typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - SliceLayer layer(layer_param); - Caffe::set_mode(Caffe::CPU); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_0)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_0)); + // Slice at 2, 8: should produce output blobs with #channels 2, 6, 4. + const int kSlicePoint0 = 2; + const int kSlicePoint1 = 8; + layer_param.mutable_slice_param()->add_slice_point(kSlicePoint0); + layer_param.mutable_slice_param()->add_slice_point(kSlicePoint1); + SliceLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_1_)); + ASSERT_EQ(kSlicePoint0, this->blob_top_0_->channels()); + ASSERT_EQ(kSlicePoint1 - kSlicePoint0, this->blob_top_1_->channels()); + ASSERT_EQ(this->blob_bottom_->channels() - kSlicePoint1, + this->blob_top_2_->channels()); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_1_)); for (int n = 0; n < this->blob_bottom_->num(); ++n) { - for (int c = 0; c < this->blob_top_0->channels(); ++c) { + for (int c = 0; c < this->blob_top_0_->channels(); ++c) { for (int h = 0; h < this->blob_bottom_->height(); ++h) { for (int w = 0; w < this->blob_bottom_->width(); ++w) { EXPECT_EQ(this->blob_bottom_->data_at(n, c, h, w), - this->blob_top_vec_0[0]->data_at(n, c, h, w)); + this->blob_top_0_->data_at(n, c, h, w)); } } } - for (int c = 0; c < this->blob_top_1->channels(); ++c) { + for (int c = 0; c < this->blob_top_1_->channels(); ++c) { for (int h = 0; h < this->blob_bottom_->height(); ++h) { for (int w = 0; w < this->blob_bottom_->width(); ++w) { - EXPECT_EQ(this->blob_bottom_->data_at(n, c+3, h, w), - this->blob_top_vec_0[1]->data_at(n, c, h, w)); + EXPECT_EQ(this->blob_bottom_->data_at(n, c + kSlicePoint0, h, w), + this->blob_top_1_->data_at(n, c, h, w)); + } + } + } + for (int c = 0; c < this->blob_top_2_->channels(); ++c) { + for (int h = 0; h < this->blob_bottom_->height(); ++h) { + for (int w = 0; w < this->blob_bottom_->width(); ++w) { + EXPECT_EQ(this->blob_bottom_->data_at(n, c + kSlicePoint1, h, w), + this->blob_top_2_->data_at(n, c, h, w)); } } } } } - -TYPED_TEST(SliceLayerTest, TestCPUGradient) { +TYPED_TEST(SliceLayerTest, TestGradientAcrossNum) { + typedef typename TypeParam::Dtype Dtype; + // Gradient checks are slow; reduce blob size. + this->ReduceBottomBlobSize(); LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); - SliceLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradient(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_0)); + layer_param.mutable_slice_param()->set_slice_dim(0); + SliceLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_0_)); } -TYPED_TEST(SliceLayerTest, TestGPUGradient) { +TYPED_TEST(SliceLayerTest, TestGradientAcrossChannels) { + typedef typename TypeParam::Dtype Dtype; + // Gradient checks are slow; reduce blob size. + this->ReduceBottomBlobSize(); LayerParameter layer_param; - Caffe::set_mode(Caffe::GPU); - SliceLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); - checker.CheckGradient(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_0)); + const int kSlicePoint = 4; + layer_param.mutable_slice_param()->add_slice_point(kSlicePoint); + SliceLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_0_)); } } // namespace caffe From 4bd3624c3e85b9d78449a047af1a2f7e274ddd3b Mon Sep 17 00:00:00 2001 From: bhack Date: Tue, 22 Jul 2014 19:25:45 +0200 Subject: [PATCH 0304/2053] Fix repeated field copy loop Fix lint algorithm include Fix spaces --- src/caffe/layers/slice_layer.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp index e895e4f0b8a..e8231e357d9 100644 --- a/src/caffe/layers/slice_layer.cpp +++ b/src/caffe/layers/slice_layer.cpp @@ -1,6 +1,7 @@ // Copyright 2014 BVLC and contributors. #include +#include #include "caffe/layer.hpp" #include "caffe/vision_layers.hpp" @@ -17,9 +18,9 @@ void SliceLayer::SetUp(const vector*>& bottom, CHECK_GE(slice_dim_, 0); CHECK_LE(slice_dim_, 1) << "Can only slice num and channels"; slice_point_.clear(); - for (int i = 0; i < slice_param.slice_point_size(); ++i) { - slice_point_.push_back(slice_param.slice_point(i)); - } + std::copy(slice_param.slice_point().begin(), + slice_param.slice_point().end(), + std::back_inserter(slice_point_)); count_ = 0; num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); From 0ade27b6eda30062ee7a204563d8f28808372012 Mon Sep 17 00:00:00 2001 From: Ross Girshick Date: Tue, 22 Jul 2014 12:51:48 -0700 Subject: [PATCH 0305/2053] Correctly apply padding to pooling layers when upgrading from V0 --- src/caffe/util/upgrade_proto.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index a17beed70a7..e1a48f194e1 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -82,11 +82,13 @@ void UpgradeV0PaddingLayers(const NetParameter& param, LayerParameter source_layer = param.layers(top_idx); if (source_layer.layer().type() == "padding") { // This layer has a padding layer as input -- check that it is a conv - // layer and takes only one input. Also check that the padding layer - // input has only one input and one output. Other cases have undefined - // behavior in Caffe. - CHECK_EQ(layer_param.type(), "conv") << "Padding layer input to " - "non-convolutional layer type " << layer_param.type(); + // layer or a pooling layer and takes only one input. Also check that + // the padding layer input has only one input and one output. Other + // cases have undefined behavior in Caffe. + CHECK((layer_param.type() == "conv") || (layer_param.type() == "pool")) + << "Padding layer input to " + "non-convolutional / non-pooling layer type " + << layer_param.type(); CHECK_EQ(layer_connection.bottom_size(), 1) << "Conv Layer takes a single blob as input."; CHECK_EQ(source_layer.bottom_size(), 1) @@ -186,6 +188,8 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, if (v0_layer_param.has_pad()) { if (type == "conv") { layer_param->mutable_convolution_param()->set_pad(v0_layer_param.pad()); + } else if (type == "pool") { + layer_param->mutable_pooling_param()->set_pad(v0_layer_param.pad()); } else { LOG(ERROR) << "Unknown parameter pad for layer type " << type; is_fully_compatible = false; From 1ceb791ab0c2bee3344ed3f7c724f3e19429cd62 Mon Sep 17 00:00:00 2001 From: Ross Girshick Date: Tue, 22 Jul 2014 20:06:48 -0700 Subject: [PATCH 0306/2053] Use the same CXX for matcaffe as for the rest of the build --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index b25d1ba798d..058d3d9c26e 100644 --- a/Makefile +++ b/Makefile @@ -351,6 +351,7 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) exit 1; \ fi $(MATLAB_DIR)/bin/mex $(MAT$(PROJECT)_SRC) \ + CXX="$(CXX)" \ CXXFLAGS="\$$CXXFLAGS $(MATLAB_CXXFLAGS)" \ CXXLIBS="\$$CXXLIBS $(STATIC_NAME) $(LDFLAGS)" -output $@ @ echo From bd6527b0f306d923f5bea03502483408dab46edf Mon Sep 17 00:00:00 2001 From: qipeng Date: Wed, 23 Jul 2014 11:48:19 -0700 Subject: [PATCH 0307/2053] numerical stability improvement --- src/caffe/layers/relu_layer.cpp | 4 ++-- src/caffe/layers/relu_layer.cu | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index 3a3e8a21afe..b94086df98c 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -33,8 +33,8 @@ void ReLULayer::Backward_cpu(const vector*>& top, const int count = (*bottom)[0]->count(); Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); for (int i = 0; i < count; ++i) { - bottom_diff[i] = top_diff[i] * ((bottom_data[i] >= 0) - + negative_slope * (bottom_data[i] < 0)); + bottom_diff[i] = top_diff[i] * ((bottom_data[i] > 0) + + negative_slope * (bottom_data[i] <= 0)); } } } diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index 503147c713d..e0d6aa1b5c3 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -39,8 +39,8 @@ template __global__ void ReLUBackward(const int n, const Dtype* in_diff, const Dtype* in_data, Dtype* out_diff, Dtype negative_slope) { CUDA_KERNEL_LOOP(index, n) { - out_diff[index] = in_diff[index] * ((in_data[index] >= 0) - + (in_data[index] < 0) * negative_slope); + out_diff[index] = in_diff[index] * ((in_data[index] > 0) + + (in_data[index] <= 0) * negative_slope); } } From 15bc0f767fa0b8f12302f81e86654bd11daf8bea Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Wed, 23 Jul 2014 22:47:25 -0700 Subject: [PATCH 0308/2053] add gflags dependency to caffe. --- Makefile | 4 +-- include/caffe/common.hpp | 4 +++ src/caffe/common.cpp | 57 ++++++++++++++++++++++++---------------- 3 files changed, 41 insertions(+), 24 deletions(-) diff --git a/Makefile b/Makefile index 109894dd7c7..6f0da361a69 100644 --- a/Makefile +++ b/Makefile @@ -155,8 +155,8 @@ ifneq ($(CPU_ONLY), 1) LIBRARY_DIRS += $(CUDA_LIB_DIR) LIBRARIES := cudart cublas curand endif -LIBRARIES += pthread \ - glog protobuf leveldb snappy \ +LIBRARIES += \ + glog gflags pthread protobuf leveldb snappy \ lmdb \ boost_system \ hdf5_hl hdf5 \ diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 2c79f2bc326..ff8649ad2a1 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -80,6 +80,10 @@ using std::set; using std::string; using std::vector; +// A global initialization function that you should call in your main function. +// Currently it initializes google flags and google logging. +void GlobalInit(int* pargc, char*** pargv); + // A singleton class to hold common caffe stuff, such as the handler that // caffe is going to use for cublas, curand, etc. class Caffe { diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index e8765eebff1..5894a961dcc 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -1,11 +1,14 @@ // Copyright 2014 BVLC and contributors. +#include +#include #include #include #include "caffe/common.hpp" #include "caffe/util/rng.hpp" + namespace caffe { shared_ptr Caffe::singleton_; @@ -19,6 +22,14 @@ int64_t cluster_seedgen(void) { return seed; } + +void GlobalInit(int* pargc, char*** pargv) { + // Google flags. + ::gflags::ParseCommandLineFlags(pargc, pargv, true); + // Google logging. + ::google::InitGoogleLogging(*(pargv)[0]); +} + #ifdef CPU_ONLY // CPU-only Caffe. Caffe::Caffe() @@ -138,28 +149,30 @@ void Caffe::DeviceQuery() { return; } CUDA_CHECK(cudaGetDeviceProperties(&prop, device)); - printf("Device id: %d\n", device); - printf("Major revision number: %d\n", prop.major); - printf("Minor revision number: %d\n", prop.minor); - printf("Name: %s\n", prop.name); - printf("Total global memory: %lu\n", prop.totalGlobalMem); - printf("Total shared memory per block: %lu\n", prop.sharedMemPerBlock); - printf("Total registers per block: %d\n", prop.regsPerBlock); - printf("Warp size: %d\n", prop.warpSize); - printf("Maximum memory pitch: %lu\n", prop.memPitch); - printf("Maximum threads per block: %d\n", prop.maxThreadsPerBlock); - printf("Maximum dimension of block: %d, %d, %d\n", - prop.maxThreadsDim[0], prop.maxThreadsDim[1], prop.maxThreadsDim[2]); - printf("Maximum dimension of grid: %d, %d, %d\n", - prop.maxGridSize[0], prop.maxGridSize[1], prop.maxGridSize[2]); - printf("Clock rate: %d\n", prop.clockRate); - printf("Total constant memory: %lu\n", prop.totalConstMem); - printf("Texture alignment: %lu\n", prop.textureAlignment); - printf("Concurrent copy and execution: %s\n", - (prop.deviceOverlap ? "Yes" : "No")); - printf("Number of multiprocessors: %d\n", prop.multiProcessorCount); - printf("Kernel execution timeout: %s\n", - (prop.kernelExecTimeoutEnabled ? "Yes" : "No")); + LOG(INFO) << "Device id: " << device; + LOG(INFO) << "Major revision number: " << prop.major; + LOG(INFO) << "Minor revision number: " << prop.minor; + LOG(INFO) << "Name: " << prop.name; + LOG(INFO) << "Total global memory: " << prop.totalGlobalMem; + LOG(INFO) << "Total shared memory per block: " << prop.sharedMemPerBlock; + LOG(INFO) << "Total registers per block: " << prop.regsPerBlock; + LOG(INFO) << "Warp size: " << prop.warpSize; + LOG(INFO) << "Maximum memory pitch: " << prop.memPitch; + LOG(INFO) << "Maximum threads per block: " << prop.maxThreadsPerBlock; + LOG(INFO) << "Maximum dimension of block: " + << prop.maxThreadsDim[0] << ", " << prop.maxThreadsDim[1] << ", " + << prop.maxThreadsDim[2]; + LOG(INFO) << "Maximum dimension of grid: " + << prop.maxGridSize[0] << ", " << prop.maxGridSize[1] << ", " + << prop.maxGridSize[2]; + LOG(INFO) << "Clock rate: " << prop.clockRate; + LOG(INFO) << "Total constant memory: " << prop.totalConstMem; + LOG(INFO) << "Texture alignment: " << prop.textureAlignment; + LOG(INFO) << "Concurrent copy and execution: " + << (prop.deviceOverlap ? "Yes" : "No"); + LOG(INFO) << "Number of multiprocessors: " << prop.multiProcessorCount; + LOG(INFO) << "Kernel execution timeout: " + << (prop.kernelExecTimeoutEnabled ? "Yes" : "No"); return; } From d13d6a2a642c2753588e867614a8bf6e3d81e80e Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Wed, 23 Jul 2014 22:47:58 -0700 Subject: [PATCH 0309/2053] add gflags dependency doc --- docs/installation.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index c32f2d0a43c..6ff1887574b 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -71,12 +71,22 @@ And on **CentOS or RHEL**, you can install via yum using: sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel -The only exception being the google logging library, which does not exist in the Ubuntu 12.04 or CentOS/RHEL repositories. To install it, do: +The only exceptions being the google logging library and the google flags library, which does not exist in the Ubuntu 12.04 or CentOS/RHEL repositories. To install them, do: + # glog wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz tar zxvf glog-0.3.3.tar.gz ./configure make && make install + # gflags + wget https://github.com/schuhschuh/gflags/archive/master.zip + unzip master.zip + cd gflags-master + mkdir build && cd build + cmake .. + make && make install + +Note that if you have newer versions of Ubuntu, like 13.04 or 14.04, gflags may be available under apt-get. #### OS X From 09f196bf26f7ae95c0ace981c78389a4578c5bed Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Wed, 23 Jul 2014 22:49:16 -0700 Subject: [PATCH 0310/2053] gflags should preferrably be installed before glog --- docs/installation.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 6ff1887574b..5f092594dec 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -71,13 +71,8 @@ And on **CentOS or RHEL**, you can install via yum using: sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel -The only exceptions being the google logging library and the google flags library, which does not exist in the Ubuntu 12.04 or CentOS/RHEL repositories. To install them, do: +The only exceptions being the google flags library and the google logging library, which does not exist in the Ubuntu 12.04 or CentOS/RHEL repositories. To install them, do: - # glog - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz - tar zxvf glog-0.3.3.tar.gz - ./configure - make && make install # gflags wget https://github.com/schuhschuh/gflags/archive/master.zip unzip master.zip @@ -85,6 +80,11 @@ The only exceptions being the google logging library and the google flags librar mkdir build && cd build cmake .. make && make install + # glog + wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz + tar zxvf glog-0.3.3.tar.gz + ./configure + make && make install Note that if you have newer versions of Ubuntu, like 13.04 or 14.04, gflags may be available under apt-get. From 57d7ecbc464c36cbf635ebb8bc510b003f7944f1 Mon Sep 17 00:00:00 2001 From: TANGUY Arnaud Date: Wed, 16 Jul 2014 15:20:15 +0200 Subject: [PATCH 0311/2053] Cleanup pthread code for data layers Get rid of the ugly "friend" thread function. Simplify the creation of the thread by inheriting from a base class. Thus, defining the thread is as simple as overriding a virtual function. --- include/caffe/data_layers.hpp | 36 +++-------- include/caffe/internal_thread.hpp | 46 ++++++++++++++ src/caffe/layers/data_layer.cpp | 83 ++++++++++++-------------- src/caffe/layers/image_data_layer.cpp | 60 +++++++++---------- src/caffe/layers/window_data_layer.cpp | 56 ++++++++--------- src/caffe/test/test_power_layer.cpp | 2 - 6 files changed, 144 insertions(+), 139 deletions(-) create mode 100644 include/caffe/internal_thread.hpp diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 1bb6bceb8c8..107d7800d1e 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -9,7 +9,6 @@ #include "leveldb/db.h" #include "lmdb.h" -#include "pthread.h" #include "hdf5.h" #include "boost/scoped_ptr.hpp" @@ -18,6 +17,7 @@ #include "caffe/filler.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/internal_thread.hpp" namespace caffe { @@ -27,15 +27,8 @@ namespace caffe { // TODO: DataLayer, ImageDataLayer, and WindowDataLayer all have the // same basic structure and a lot of duplicated code. -// This function is used to create a pthread that prefetches the data. template -void* DataLayerPrefetch(void* layer_pointer); - -template -class DataLayer : public Layer { - // The function used to perform prefetching. - friend void* DataLayerPrefetch(void* layer_pointer); - +class DataLayer : public Layer, public InternalThread { public: explicit DataLayer(const LayerParameter& param) : Layer(param) {} @@ -63,6 +56,8 @@ class DataLayer : public Layer { virtual void CreatePrefetchThread(); virtual void JoinPrefetchThread(); virtual unsigned int PrefetchRand(); + // The thread's function + virtual void InternalThreadEntry(); shared_ptr prefetch_rng_; @@ -80,7 +75,6 @@ class DataLayer : public Layer { int datum_height_; int datum_width_; int datum_size_; - pthread_t thread_; Blob prefetch_data_; Blob prefetch_label_; Blob data_mean_; @@ -182,15 +176,8 @@ class HDF5OutputLayer : public Layer { Blob label_blob_; }; -// This function is used to create a pthread that prefetches the data. -template -void* ImageDataLayerPrefetch(void* layer_pointer); - template -class ImageDataLayer : public Layer { - // The function used to perform prefetching. - friend void* ImageDataLayerPrefetch(void* layer_pointer); - +class ImageDataLayer : public Layer, public InternalThread { public: explicit ImageDataLayer(const LayerParameter& param) : Layer(param) {} @@ -219,6 +206,7 @@ class ImageDataLayer : public Layer { virtual void CreatePrefetchThread(); virtual void JoinPrefetchThread(); virtual unsigned int PrefetchRand(); + virtual void InternalThreadEntry(); shared_ptr prefetch_rng_; vector > lines_; @@ -227,7 +215,6 @@ class ImageDataLayer : public Layer { int datum_height_; int datum_width_; int datum_size_; - pthread_t thread_; Blob prefetch_data_; Blob prefetch_label_; Blob data_mean_; @@ -277,15 +264,8 @@ class MemoryDataLayer : public Layer { int pos_; }; -// This function is used to create a pthread that prefetches the window data. -template -void* WindowDataLayerPrefetch(void* layer_pointer); - template -class WindowDataLayer : public Layer { - // The function used to perform prefetching. - friend void* WindowDataLayerPrefetch(void* layer_pointer); - +class WindowDataLayer : public Layer, public InternalThread { public: explicit WindowDataLayer(const LayerParameter& param) : Layer(param) {} @@ -312,9 +292,9 @@ class WindowDataLayer : public Layer { virtual void CreatePrefetchThread(); virtual void JoinPrefetchThread(); virtual unsigned int PrefetchRand(); + virtual void InternalThreadEntry(); shared_ptr prefetch_rng_; - pthread_t thread_; Blob prefetch_data_; Blob prefetch_label_; Blob data_mean_; diff --git a/include/caffe/internal_thread.hpp b/include/caffe/internal_thread.hpp new file mode 100644 index 00000000000..46f67360f0c --- /dev/null +++ b/include/caffe/internal_thread.hpp @@ -0,0 +1,46 @@ +// Copyright 2014 BVLC and contributors. + +#ifndef CAFFE_INTERNAL_THREAD_HPP_ +#define CAFFE_INTERNAL_THREAD_HPP_ + +#include + +namespace caffe { + +/** + * Virutal class encapsulate pthread for use in base class + * The child class will acquire the ability to run a single pthread, + * by reimplementing the virutal function InternalThreadEntry. + */ +class InternalThread { + public: + InternalThread() {} + virtual ~InternalThread() {} + + /** Returns true if the thread was successfully started **/ + bool StartInternalThread() { + return pthread_create(&_thread, NULL, InternalThreadEntryFunc, this); + } + + /** Will not return until the internal thread has exited. */ + bool WaitForInternalThreadToExit() { + return pthread_join(_thread, NULL); + } + + protected: + /* Implement this method in your subclass + with the code you want your thread to run. */ + virtual void InternalThreadEntry() = 0; + + private: + static void * InternalThreadEntryFunc(void * This) { + reinterpret_cast(This)->InternalThreadEntry(); + return NULL; + } + + pthread_t _thread; +}; + +} // namespace caffe + +#endif diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index b6afaa972f9..ef27c1a3f1f 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -2,7 +2,6 @@ #include #include -#include #include #include @@ -16,46 +15,44 @@ namespace caffe { +// This function is used to create a pthread that prefetches the data. template -void* DataLayerPrefetch(void* layer_pointer) { - CHECK(layer_pointer); - DataLayer* layer = static_cast*>(layer_pointer); - CHECK(layer); +void DataLayer::InternalThreadEntry() { Datum datum; - CHECK(layer->prefetch_data_.count()); - Dtype* top_data = layer->prefetch_data_.mutable_cpu_data(); + CHECK(prefetch_data_.count()); + Dtype* top_data = prefetch_data_.mutable_cpu_data(); Dtype* top_label = NULL; // suppress warnings about uninitialized variables - if (layer->output_labels_) { - top_label = layer->prefetch_label_.mutable_cpu_data(); + if (output_labels_) { + top_label = prefetch_label_.mutable_cpu_data(); } - const Dtype scale = layer->layer_param_.data_param().scale(); - const int batch_size = layer->layer_param_.data_param().batch_size(); - const int crop_size = layer->layer_param_.data_param().crop_size(); - const bool mirror = layer->layer_param_.data_param().mirror(); + const Dtype scale = this->layer_param_.data_param().scale(); + const int batch_size = this->layer_param_.data_param().batch_size(); + const int crop_size = this->layer_param_.data_param().crop_size(); + const bool mirror = this->layer_param_.data_param().mirror(); if (mirror && crop_size == 0) { LOG(FATAL) << "Current implementation requires mirror and crop_size to be " << "set at the same time."; } // datum scales - const int channels = layer->datum_channels_; - const int height = layer->datum_height_; - const int width = layer->datum_width_; - const int size = layer->datum_size_; - const Dtype* mean = layer->data_mean_.cpu_data(); + const int channels = datum_channels_; + const int height = datum_height_; + const int width = datum_width_; + const int size = datum_size_; + const Dtype* mean = data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob - switch (layer->layer_param_.data_param().backend()) { + switch (this->layer_param_.data_param().backend()) { case DataParameter_DB_LEVELDB: - CHECK(layer->iter_); - CHECK(layer->iter_->Valid()); - datum.ParseFromString(layer->iter_->value().ToString()); + CHECK(iter_); + CHECK(iter_->Valid()); + datum.ParseFromString(iter_->value().ToString()); break; case DataParameter_DB_LMDB: - CHECK_EQ(mdb_cursor_get(layer->mdb_cursor_, &layer->mdb_key_, - &layer->mdb_value_, MDB_GET_CURRENT), MDB_SUCCESS); - datum.ParseFromArray(layer->mdb_value_.mv_data, - layer->mdb_value_.mv_size); + CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, + &mdb_value_, MDB_GET_CURRENT), MDB_SUCCESS); + datum.ParseFromArray(mdb_value_.mv_data, + mdb_value_.mv_size); break; default: LOG(FATAL) << "Unknown database backend"; @@ -66,14 +63,14 @@ void* DataLayerPrefetch(void* layer_pointer) { CHECK(data.size()) << "Image cropping only support uint8 data"; int h_off, w_off; // We only do random crop when we do training. - if (layer->phase_ == Caffe::TRAIN) { - h_off = layer->PrefetchRand() % (height - crop_size); - w_off = layer->PrefetchRand() % (width - crop_size); + if (phase_ == Caffe::TRAIN) { + h_off = PrefetchRand() % (height - crop_size); + w_off = PrefetchRand() % (width - crop_size); } else { h_off = (height - crop_size) / 2; w_off = (width - crop_size) / 2; } - if (mirror && layer->PrefetchRand() % 2) { + if (mirror && PrefetchRand() % 2) { // Copy mirrored version for (int c = 0; c < channels; ++c) { for (int h = 0; h < crop_size; ++h) { @@ -118,34 +115,32 @@ void* DataLayerPrefetch(void* layer_pointer) { } } - if (layer->output_labels_) { + if (output_labels_) { top_label[item_id] = datum.label(); } // go to the next iter - switch (layer->layer_param_.data_param().backend()) { + switch (this->layer_param_.data_param().backend()) { case DataParameter_DB_LEVELDB: - layer->iter_->Next(); - if (!layer->iter_->Valid()) { + iter_->Next(); + if (!iter_->Valid()) { // We have reached the end. Restart from the first. DLOG(INFO) << "Restarting data prefetching from start."; - layer->iter_->SeekToFirst(); + iter_->SeekToFirst(); } break; case DataParameter_DB_LMDB: - if (mdb_cursor_get(layer->mdb_cursor_, &layer->mdb_key_, - &layer->mdb_value_, MDB_NEXT) != MDB_SUCCESS) { + if (mdb_cursor_get(mdb_cursor_, &mdb_key_, + &mdb_value_, MDB_NEXT) != MDB_SUCCESS) { // We have reached the end. Restart from the first. DLOG(INFO) << "Restarting data prefetching from start."; - CHECK_EQ(mdb_cursor_get(layer->mdb_cursor_, &layer->mdb_key_, - &layer->mdb_value_, MDB_FIRST), MDB_SUCCESS); + CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, + &mdb_value_, MDB_FIRST), MDB_SUCCESS); } break; default: LOG(FATAL) << "Unknown database backend"; } } - - return static_cast(NULL); } template @@ -323,14 +318,12 @@ void DataLayer::CreatePrefetchThread() { } else { prefetch_rng_.reset(); } - // Create the thread. - CHECK(!pthread_create(&thread_, NULL, DataLayerPrefetch, - static_cast(this))) << "Pthread execution failed."; + CHECK(!StartInternalThread()) << "Pthread execution failed"; } template void DataLayer::JoinPrefetchThread() { - CHECK(!pthread_join(thread_, NULL)) << "Pthread joining failed."; + CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed"; } template diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 30050ddd3c6..1ba2a3b2456 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -2,7 +2,6 @@ #include #include -#include #include #include @@ -18,17 +17,14 @@ namespace caffe { +// This function is used to create a pthread that prefetches the data. template -void* ImageDataLayerPrefetch(void* layer_pointer) { - CHECK(layer_pointer); - ImageDataLayer* layer = - reinterpret_cast*>(layer_pointer); - CHECK(layer); +void ImageDataLayer::InternalThreadEntry() { Datum datum; - CHECK(layer->prefetch_data_.count()); - Dtype* top_data = layer->prefetch_data_.mutable_cpu_data(); - Dtype* top_label = layer->prefetch_label_.mutable_cpu_data(); - ImageDataParameter image_data_param = layer->layer_param_.image_data_param(); + CHECK(prefetch_data_.count()); + Dtype* top_data = prefetch_data_.mutable_cpu_data(); + Dtype* top_label = prefetch_label_.mutable_cpu_data(); + ImageDataParameter image_data_param = this->layer_param_.image_data_param(); const Dtype scale = image_data_param.scale(); const int batch_size = image_data_param.batch_size(); const int crop_size = image_data_param.crop_size(); @@ -41,17 +37,17 @@ void* ImageDataLayerPrefetch(void* layer_pointer) { << "set at the same time."; } // datum scales - const int channels = layer->datum_channels_; - const int height = layer->datum_height_; - const int width = layer->datum_width_; - const int size = layer->datum_size_; - const int lines_size = layer->lines_.size(); - const Dtype* mean = layer->data_mean_.cpu_data(); + const int channels = datum_channels_; + const int height = datum_height_; + const int width = datum_width_; + const int size = datum_size_; + const int lines_size = lines_.size(); + const Dtype* mean = data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob - CHECK_GT(lines_size, layer->lines_id_); - if (!ReadImageToDatum(layer->lines_[layer->lines_id_].first, - layer->lines_[layer->lines_id_].second, + CHECK_GT(lines_size, lines_id_); + if (!ReadImageToDatum(lines_[lines_id_].first, + lines_[lines_id_].second, new_height, new_width, &datum)) { continue; } @@ -60,14 +56,14 @@ void* ImageDataLayerPrefetch(void* layer_pointer) { CHECK(data.size()) << "Image cropping only support uint8 data"; int h_off, w_off; // We only do random crop when we do training. - if (layer->phase_ == Caffe::TRAIN) { - h_off = layer->PrefetchRand() % (height - crop_size); - w_off = layer->PrefetchRand() % (width - crop_size); + if (phase_ == Caffe::TRAIN) { + h_off = PrefetchRand() % (height - crop_size); + w_off = PrefetchRand() % (width - crop_size); } else { h_off = (height - crop_size) / 2; w_off = (width - crop_size) / 2; } - if (mirror && layer->PrefetchRand() % 2) { + if (mirror && PrefetchRand() % 2) { // Copy mirrored version for (int c = 0; c < channels; ++c) { for (int h = 0; h < crop_size; ++h) { @@ -114,18 +110,16 @@ void* ImageDataLayerPrefetch(void* layer_pointer) { top_label[item_id] = datum.label(); // go to the next iter - layer->lines_id_++; - if (layer->lines_id_ >= lines_size) { + lines_id_++; + if (lines_id_ >= lines_size) { // We have reached the end. Restart from the first. DLOG(INFO) << "Restarting data prefetching from start."; - layer->lines_id_ = 0; - if (layer->layer_param_.image_data_param().shuffle()) { - layer->ShuffleImages(); + lines_id_ = 0; + if (this->layer_param_.image_data_param().shuffle()) { + ShuffleImages(); } } } - - return reinterpret_cast(NULL); } template @@ -239,8 +233,7 @@ void ImageDataLayer::CreatePrefetchThread() { prefetch_rng_.reset(); } // Create the thread. - CHECK(!pthread_create(&thread_, NULL, ImageDataLayerPrefetch, - static_cast(this))) << "Pthread execution failed."; + CHECK(!StartInternalThread()) << "Pthread execution failed"; } template @@ -255,9 +248,10 @@ void ImageDataLayer::ShuffleImages() { } } + template void ImageDataLayer::JoinPrefetchThread() { - CHECK(!pthread_join(thread_, NULL)) << "Pthread joining failed."; + CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed"; } template diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 9b4a23d22a8..fe7f61c91df 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -3,7 +3,6 @@ // Based on data_layer.cpp by Yangqing Jia. #include -#include #include #include @@ -28,34 +27,32 @@ namespace caffe { +// Thread fetching the data template -void* WindowDataLayerPrefetch(void* layer_pointer) { - WindowDataLayer* layer = - reinterpret_cast*>(layer_pointer); - +void WindowDataLayer::InternalThreadEntry() { // At each iteration, sample N windows where N*p are foreground (object) // windows and N*(1-p) are background (non-object) windows - Dtype* top_data = layer->prefetch_data_.mutable_cpu_data(); - Dtype* top_label = layer->prefetch_label_.mutable_cpu_data(); - const Dtype scale = layer->layer_param_.window_data_param().scale(); - const int batch_size = layer->layer_param_.window_data_param().batch_size(); - const int crop_size = layer->layer_param_.window_data_param().crop_size(); - const int context_pad = layer->layer_param_.window_data_param().context_pad(); - const bool mirror = layer->layer_param_.window_data_param().mirror(); + Dtype* top_data = prefetch_data_.mutable_cpu_data(); + Dtype* top_label = prefetch_label_.mutable_cpu_data(); + const Dtype scale = this->layer_param_.window_data_param().scale(); + const int batch_size = this->layer_param_.window_data_param().batch_size(); + const int crop_size = this->layer_param_.window_data_param().crop_size(); + const int context_pad = this->layer_param_.window_data_param().context_pad(); + const bool mirror = this->layer_param_.window_data_param().mirror(); const float fg_fraction = - layer->layer_param_.window_data_param().fg_fraction(); - const Dtype* mean = layer->data_mean_.cpu_data(); - const int mean_off = (layer->data_mean_.width() - crop_size) / 2; - const int mean_width = layer->data_mean_.width(); - const int mean_height = layer->data_mean_.height(); + this->layer_param_.window_data_param().fg_fraction(); + const Dtype* mean = data_mean_.cpu_data(); + const int mean_off = (data_mean_.width() - crop_size) / 2; + const int mean_width = data_mean_.width(); + const int mean_height = data_mean_.height(); cv::Size cv_crop_size(crop_size, crop_size); - const string& crop_mode = layer->layer_param_.window_data_param().crop_mode(); + const string& crop_mode = this->layer_param_.window_data_param().crop_mode(); bool use_square = (crop_mode == "square") ? true : false; // zero out batch - caffe_set(layer->prefetch_data_.count(), Dtype(0), top_data); + caffe_set(prefetch_data_.count(), Dtype(0), top_data); const int num_fg = static_cast(static_cast(batch_size) * fg_fraction); @@ -66,24 +63,24 @@ void* WindowDataLayerPrefetch(void* layer_pointer) { for (int is_fg = 0; is_fg < 2; ++is_fg) { for (int dummy = 0; dummy < num_samples[is_fg]; ++dummy) { // sample a window - const unsigned int rand_index = layer->PrefetchRand(); + const unsigned int rand_index = PrefetchRand(); vector window = (is_fg) ? - layer->fg_windows_[rand_index % layer->fg_windows_.size()] : - layer->bg_windows_[rand_index % layer->bg_windows_.size()]; + fg_windows_[rand_index % fg_windows_.size()] : + bg_windows_[rand_index % bg_windows_.size()]; bool do_mirror = false; - if (mirror && layer->PrefetchRand() % 2) { + if (mirror && PrefetchRand() % 2) { do_mirror = true; } // load the image containing the window pair > image = - layer->image_database_[window[WindowDataLayer::IMAGE_INDEX]]; + image_database_[window[WindowDataLayer::IMAGE_INDEX]]; cv::Mat cv_img = cv::imread(image.first, CV_LOAD_IMAGE_COLOR); if (!cv_img.data) { LOG(ERROR) << "Could not open or find file " << image.first; - return reinterpret_cast(NULL); + return; } const int channels = cv_img.channels(); @@ -210,7 +207,7 @@ void* WindowDataLayerPrefetch(void* layer_pointer) { // useful debugging code for dumping transformed windows to disk string file_id; std::stringstream ss; - ss << layer->PrefetchRand(); + ss << PrefetchRand(); ss >> file_id; std::ofstream inf((string("dump/") + file_id + string("_info.txt")).c_str(), std::ofstream::out); @@ -242,8 +239,6 @@ void* WindowDataLayerPrefetch(void* layer_pointer) { item_id++; } } - - return reinterpret_cast(NULL); } template @@ -415,13 +410,12 @@ void WindowDataLayer::CreatePrefetchThread() { prefetch_rng_.reset(); } // Create the thread. - CHECK(!pthread_create(&thread_, NULL, WindowDataLayerPrefetch, - static_cast(this))) << "Pthread execution failed."; + CHECK(!StartInternalThread()) << "Pthread execution failed."; } template void WindowDataLayer::JoinPrefetchThread() { - CHECK(!pthread_join(thread_, NULL)) << "Pthread joining failed."; + CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed."; } template diff --git a/src/caffe/test/test_power_layer.cpp b/src/caffe/test/test_power_layer.cpp index d4e6fc5b05e..44fcbd9117c 100644 --- a/src/caffe/test/test_power_layer.cpp +++ b/src/caffe/test/test_power_layer.cpp @@ -13,8 +13,6 @@ #include "caffe/test/test_caffe_main.hpp" -using std::isnan; - namespace caffe { template From 5fbf4af1387bf31b194ba61175c905ea92a80adb Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Thu, 24 Jul 2014 09:28:46 -0700 Subject: [PATCH 0312/2053] travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index c5445fcdb90..a61e5084f87 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,7 @@ before_install: - sudo apt-get -y install wget git curl python-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc install: + - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && cmake .. && make && sudo make install && popd - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb From 6136f5dcb7b840e00eb1efcda5640f992fe10cf7 Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Thu, 24 Jul 2014 10:28:06 -0700 Subject: [PATCH 0313/2053] travis - does adding cflags help? want to keep minimal invasion into gflags installation. --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index a61e5084f87..5d8beb13902 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,6 +15,8 @@ before_install: - echo $LC_ALL - sudo apt-get -y update - sudo apt-get -y install wget git curl python-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc + - export CFLAGS="-fPIC" + - export CXXFLAGS="-fPIC" install: - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && cmake .. && make && sudo make install && popd From 781630d0e979192ce34c2485d49d40bb772b5349 Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Thu, 24 Jul 2014 10:48:04 -0700 Subject: [PATCH 0314/2053] turns out that glog does not compile with gflags 2.1 - compiling glog first and then gflags. --- .travis.yml | 4 +--- docs/installation.md | 12 ++++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d8beb13902..fd04ac247ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,12 +15,10 @@ before_install: - echo $LC_ALL - sudo apt-get -y update - sudo apt-get -y install wget git curl python-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc - - export CFLAGS="-fPIC" - - export CXXFLAGS="-fPIC" install: - - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && cmake .. && make && sudo make install && popd - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz + - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && cmake .. && make && sudo make install && popd - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb - sudo apt-get -y update && sudo apt-get -y install cuda diff --git a/docs/installation.md b/docs/installation.md index 5f092594dec..a74071f8ecb 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -73,6 +73,11 @@ And on **CentOS or RHEL**, you can install via yum using: The only exceptions being the google flags library and the google logging library, which does not exist in the Ubuntu 12.04 or CentOS/RHEL repositories. To install them, do: + # glog + wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz + tar zxvf glog-0.3.3.tar.gz + ./configure + make && make install # gflags wget https://github.com/schuhschuh/gflags/archive/master.zip unzip master.zip @@ -80,13 +85,8 @@ The only exceptions being the google flags library and the google logging librar mkdir build && cd build cmake .. make && make install - # glog - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz - tar zxvf glog-0.3.3.tar.gz - ./configure - make && make install -Note that if you have newer versions of Ubuntu, like 13.04 or 14.04, gflags may be available under apt-get. +Note that glog does not compile with the most recent gflags version (2.1), so before that is solved you will need to build with gflags first. Also note that if you have newer versions of Ubuntu, like 13.04 or 14.04, gflags may be available under apt-get. #### OS X From ca7d992c30d0284e7bbba3c4823baca1b9ed979c Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Thu, 24 Jul 2014 10:53:53 -0700 Subject: [PATCH 0315/2053] I am really bad at debugging travis. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fd04ac247ac..d2c850b3964 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,8 @@ before_install: install: - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && cmake .. && make && sudo make install && popd - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - + - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && cmake .. && make && sudo make install && popd - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb - sudo apt-get -y update && sudo apt-get -y install cuda - curl https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -o /tmp/mdb.tar.gz && tar -C /tmp -xzvf /tmp/mdb.tar.gz && rm /tmp/mdb.tar.gz From e8dc0ee5f76876caf7993a476aecf1f91c6fd1fc Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Thu, 24 Jul 2014 11:05:58 -0700 Subject: [PATCH 0316/2053] travis: gflags still needs -fPIC, otherwise it makes caffe cry. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d2c850b3964..72291e40c7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ before_install: install: - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - - - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && cmake .. && make && sudo make install && popd + - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1 && sudo make install && popd - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb - sudo apt-get -y update && sudo apt-get -y install cuda - curl https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -o /tmp/mdb.tar.gz && tar -C /tmp -xzvf /tmp/mdb.tar.gz && rm /tmp/mdb.tar.gz From 6f46bb90294c9f5f544da76594d49c111788612c Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Fri, 25 Jul 2014 09:02:03 -0700 Subject: [PATCH 0317/2053] include benchmark.hpp --- include/caffe/caffe.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/caffe/caffe.hpp b/include/caffe/caffe.hpp index ada0695472a..172fc5f3bf7 100644 --- a/include/caffe/caffe.hpp +++ b/include/caffe/caffe.hpp @@ -5,15 +5,15 @@ #ifndef CAFFE_CAFFE_HPP_ #define CAFFE_CAFFE_HPP_ -#include "caffe/common.hpp" #include "caffe/blob.hpp" +#include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/layer.hpp" #include "caffe/net.hpp" +#include "caffe/proto/caffe.pb.h" #include "caffe/solver.hpp" +#include "caffe/util/benchmark.hpp" #include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/proto/caffe.pb.h" - #endif // CAFFE_CAFFE_HPP_ From a916ef49fad7b7a3c5faee7df46af3d327aecee9 Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Fri, 25 Jul 2014 09:02:37 -0700 Subject: [PATCH 0318/2053] Adding new caffe binary that does everything in one binary; deprecating device_query, finetune_net, net_speed_benchmark, train_net --- tools/caffe.cpp | 176 ++++++++++++++++++++++++++++++++++ tools/device_query.cpp | 17 +--- tools/finetune_net.cpp | 26 +---- tools/net_speed_benchmark.cpp | 100 +------------------ tools/train_net.cpp | 30 +----- 5 files changed, 184 insertions(+), 165 deletions(-) create mode 100644 tools/caffe.cpp diff --git a/tools/caffe.cpp b/tools/caffe.cpp new file mode 100644 index 00000000000..48352485bc6 --- /dev/null +++ b/tools/caffe.cpp @@ -0,0 +1,176 @@ +#include +#include + +#include +#include + +#include "caffe/caffe.hpp" + +using caffe::Blob; +using caffe::Caffe; +using caffe::Net; +using caffe::Layer; +using caffe::shared_ptr; +using caffe::Timer; +using caffe::string; +using std::vector; + + +// Used in device query +DEFINE_int32(device_id, 0, + "[devicequery,speedtest] The device id to use."); +// Used in training +DEFINE_string(solver_proto_file, "", + "[train] The protobuf containing the solver definition."); +DEFINE_string(net_proto_file, "", + "[speedtest] The net proto file to use."); +DEFINE_string(resume_point_file, "", + "[train] (optional) The snapshot from which to resume training."); +DEFINE_string(pretrained_net_file, "", + "[train] (optional) A pretrained network to run finetune from. " + "Cannot be set simultaneously with resume_point_file."); +DEFINE_int32(run_iterations, 50, + "[speedtest] The number of iterations to run."); +DEFINE_bool(speedtest_with_gpu, false, + "[speedtest] Test the model with GPU."); + +// A simple registry for caffe commands. +typedef int (*BrewFunction)(); +typedef std::map BrewMap; +BrewMap g_brew_map; + +#define RegisterBrewFunction(func) \ + namespace { \ + class __Registerer_##func { \ + public: \ + __Registerer_##func() { \ + g_brew_map[#func] = &func; \ + } \ + }; \ + __Registerer_##func g_registerer_##func; \ + } + +static BrewFunction GetBrewFunction(const std::string& name) { + if (g_brew_map.count(name)) { + return g_brew_map[name]; + } else { + LOG(ERROR) << "Available caffe actions:"; + for (BrewMap::iterator it = g_brew_map.begin(); + it != g_brew_map.end(); ++it) { + LOG(ERROR) << "\t" << it->first; + } + LOG(FATAL) << "Unknown action: " << name; + return NULL; // not reachable, just to suppress old compiler warnings. + } +} + +// caffe actions that could be called in the form +// caffe.bin action +// To do so, define actions as "int action()" functions, and register it with +// RegisterBrewFunction(action); + +int devicequery() { + LOG(INFO) << "Querying device_id = " << FLAGS_device_id; + caffe::Caffe::SetDevice(FLAGS_device_id); + caffe::Caffe::DeviceQuery(); + return 0; +} +RegisterBrewFunction(devicequery); + +int train() { + CHECK_GT(FLAGS_solver_proto_file.size(), 0); + + caffe::SolverParameter solver_param; + caffe::ReadProtoFromTextFileOrDie(FLAGS_solver_proto_file, &solver_param); + + LOG(INFO) << "Starting Optimization"; + caffe::SGDSolver solver(solver_param); + if (FLAGS_resume_point_file.size()) { + LOG(INFO) << "Resuming from " << FLAGS_resume_point_file; + solver.Solve(FLAGS_resume_point_file); + } else if (FLAGS_pretrained_net_file.size()) { + LOG(INFO) << "Finetuning from " << FLAGS_pretrained_net_file; + solver.net()->CopyTrainedLayersFrom(FLAGS_pretrained_net_file); + solver.Solve(); + } else { + solver.Solve(); + } + LOG(INFO) << "Optimization Done."; + return 0; +} +RegisterBrewFunction(train); + +int speedtest() { + // Set device id and mode + if (FLAGS_speedtest_with_gpu) { + LOG(INFO) << "Use GPU with device id " << FLAGS_device_id; + Caffe::SetDevice(FLAGS_device_id); + Caffe::set_mode(Caffe::GPU); + } else { + LOG(INFO) << "Use CPU."; + Caffe::set_mode(Caffe::CPU); + } + // Instantiate the caffe net. + Caffe::set_phase(Caffe::TRAIN); + Net caffe_net(FLAGS_net_proto_file); + + // Do a clean forward and backward pass, so that memory allocation are done + // and future iterations will be more stable. + LOG(INFO) << "Performing Forward"; + // Note that for the speed benchmark, we will assume that the network does + // not take any input blobs. + float initial_loss; + caffe_net.Forward(vector*>(), &initial_loss); + LOG(INFO) << "Initial loss: " << initial_loss; + LOG(INFO) << "Performing Backward"; + caffe_net.Backward(); + + const vector > >& layers = caffe_net.layers(); + vector*> >& bottom_vecs = caffe_net.bottom_vecs(); + vector*> >& top_vecs = caffe_net.top_vecs(); + const vector >& bottom_need_backward = + caffe_net.bottom_need_backward(); + LOG(INFO) << "*** Benchmark begins ***"; + LOG(INFO) << "Testing for " << FLAGS_run_iterations << " iterations."; + Timer total_timer; + total_timer.Start(); + Timer forward_timer; + forward_timer.Start(); + Timer timer; + for (int i = 0; i < layers.size(); ++i) { + const string& layername = layers[i]->layer_param().name(); + timer.Start(); + for (int j = 0; j < FLAGS_run_iterations; ++j) { + layers[i]->Forward(bottom_vecs[i], &top_vecs[i]); + } + LOG(INFO) << layername << "\tforward: " << timer.MilliSeconds() << + " milli seconds."; + } + LOG(INFO) << "Forward pass: " << forward_timer.MilliSeconds() << + " milli seconds."; + Timer backward_timer; + backward_timer.Start(); + for (int i = layers.size() - 1; i >= 0; --i) { + const string& layername = layers[i]->layer_param().name(); + timer.Start(); + for (int j = 0; j < FLAGS_run_iterations; ++j) { + layers[i]->Backward(top_vecs[i], bottom_need_backward[i], + &bottom_vecs[i]); + } + LOG(INFO) << layername << "\tbackward: " + << timer.MilliSeconds() << " milli seconds."; + } + LOG(INFO) << "Backward pass: " << backward_timer.MilliSeconds() << + " milli seconds."; + LOG(INFO) << "Total Time: " << total_timer.MilliSeconds() << + " milli seconds."; + LOG(INFO) << "*** Benchmark ends ***"; + return 0; +} +RegisterBrewFunction(speedtest); + +int main(int argc, char** argv) { + caffe::GlobalInit(&argc, &argv); + CHECK_EQ(argc, 2); + return GetBrewFunction(std::string(argv[1]))(); +} diff --git a/tools/device_query.cpp b/tools/device_query.cpp index 5040b8ee9d1..224a3145308 100644 --- a/tools/device_query.cpp +++ b/tools/device_query.cpp @@ -1,23 +1,8 @@ // Copyright 2014 BVLC and contributors. - #include "caffe/common.hpp" -#include "caffe/net.hpp" - - -using namespace caffe; // NOLINT(build/namespaces) int main(int argc, char** argv) { - if (argc > 2) { - LOG(ERROR) << "device_query [device_id=0]"; - return 1; - } - if (argc == 2) { - LOG(INFO) << "Querying device_id=" << argv[1]; - Caffe::SetDevice(atoi(argv[1])); - Caffe::DeviceQuery(); - } else { - Caffe::DeviceQuery(); - } + LOG(ERROR) << "Deprecated. Use caffe.bin devicequery [--device_id=0] instead."; return 0; } diff --git a/tools/finetune_net.cpp b/tools/finetune_net.cpp index 4d80be9f4da..dff97215f5e 100644 --- a/tools/finetune_net.cpp +++ b/tools/finetune_net.cpp @@ -1,31 +1,9 @@ // Copyright 2014 BVLC and contributors. -// -// This is a simple script that allows one to quickly finetune a network. -// Usage: -// finetune_net solver_proto_file pretrained_net - -#include #include "caffe/caffe.hpp" -using namespace caffe; // NOLINT(build/namespaces) - int main(int argc, char** argv) { - ::google::InitGoogleLogging(argv[0]); - if (argc != 3) { - LOG(ERROR) << "Usage: finetune_net solver_proto_file pretrained_net"; - return 1; - } - - SolverParameter solver_param; - ReadProtoFromTextFileOrDie(argv[1], &solver_param); - - LOG(INFO) << "Starting Optimization"; - SGDSolver solver(solver_param); - LOG(INFO) << "Loading from " << argv[2]; - solver.net()->CopyTrainedLayersFrom(string(argv[2])); - solver.Solve(); - LOG(INFO) << "Optimization Done."; - + LOG(ERROR) << "Deprecated. Use caffe.bin train --solver_proto_file=... " + "[pretrained_net_file=...] instead."; return 0; } diff --git a/tools/net_speed_benchmark.cpp b/tools/net_speed_benchmark.cpp index bdec391fbb6..9e6bb4cbe95 100644 --- a/tools/net_speed_benchmark.cpp +++ b/tools/net_speed_benchmark.cpp @@ -1,103 +1,9 @@ // Copyright 2014 BVLC and contributors. -#include -#include - -#include -#include -#include -#include - -#include "caffe/blob.hpp" -#include "caffe/common.hpp" -#include "caffe/net.hpp" -#include "caffe/filler.hpp" -#include "caffe/proto/caffe.pb.h" -#include "caffe/util/benchmark.hpp" -#include "caffe/util/io.hpp" -#include "caffe/solver.hpp" - -using namespace caffe; // NOLINT(build/namespaces) +#include "caffe/caffe.hpp" int main(int argc, char** argv) { - int total_iter = 50; - if (argc < 2 || argc > 5) { - LOG(ERROR) << "net_speed_benchmark net_proto [iterations=50]" - " [CPU/GPU] [Device_id=0]"; - return 1; - } - - if (argc >=3) { - total_iter = atoi(argv[2]); - } - - LOG(ERROR) << "Testing for " << total_iter << "Iterations."; - - if (argc >= 4 && strcmp(argv[3], "GPU") == 0) { - LOG(ERROR) << "Using GPU"; - uint device_id = 0; - if (argc >= 5 && strcmp(argv[3], "GPU") == 0) { - device_id = atoi(argv[4]); - } - LOG(ERROR) << "Using Device_id=" << device_id; - Caffe::SetDevice(device_id); - Caffe::set_mode(Caffe::GPU); - } else { - LOG(ERROR) << "Using CPU"; - Caffe::set_mode(Caffe::CPU); - } - - Caffe::set_phase(Caffe::TRAIN); - Net caffe_net(argv[1]); - - // Run the network without training. - LOG(ERROR) << "Performing Forward"; - // Note that for the speed benchmark, we will assume that the network does - // not take any input blobs. - float initial_loss; - caffe_net.Forward(vector*>(), &initial_loss); - LOG(ERROR) << "Initial loss: " << initial_loss; - LOG(ERROR) << "Performing Backward"; - caffe_net.Backward(); - - const vector > >& layers = caffe_net.layers(); - vector*> >& bottom_vecs = caffe_net.bottom_vecs(); - vector*> >& top_vecs = caffe_net.top_vecs(); - const vector >& bottom_need_backward = - caffe_net.bottom_need_backward(); - LOG(ERROR) << "*** Benchmark begins ***"; - Timer total_timer; - total_timer.Start(); - Timer forward_timer; - forward_timer.Start(); - Timer timer; - for (int i = 0; i < layers.size(); ++i) { - const string& layername = layers[i]->layer_param().name(); - timer.Start(); - for (int j = 0; j < total_iter; ++j) { - layers[i]->Forward(bottom_vecs[i], &top_vecs[i]); - } - LOG(ERROR) << layername << "\tforward: " << timer.MilliSeconds() << - " milli seconds."; - } - LOG(ERROR) << "Forward pass: " << forward_timer.MilliSeconds() << - " milli seconds."; - Timer backward_timer; - backward_timer.Start(); - for (int i = layers.size() - 1; i >= 0; --i) { - const string& layername = layers[i]->layer_param().name(); - timer.Start(); - for (int j = 0; j < total_iter; ++j) { - layers[i]->Backward(top_vecs[i], bottom_need_backward[i], - &bottom_vecs[i]); - } - LOG(ERROR) << layername << "\tbackward: " - << timer.MilliSeconds() << " milli seconds."; - } - LOG(ERROR) << "Backward pass: " << backward_timer.MilliSeconds() << - " milli seconds."; - LOG(ERROR) << "Total Time: " << total_timer.MilliSeconds() << - " milli seconds."; - LOG(ERROR) << "*** Benchmark ends ***"; + LOG(ERROR) << "Deprecated. Use caffe.bin speedtest --net_proto_file=... " + "[--run_iterations=50] [--speedtest_with_gpu] [--device_id=0]"; return 0; } diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 41a33247854..568260c7b45 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -1,35 +1,9 @@ // Copyright 2014 BVLC and contributors. -// -// This is a simple script that allows one to quickly train a network whose -// parameters are specified by text format protocol buffers. -// Usage: -// train_net net_proto_file solver_proto_file [resume_point_file] - -#include #include "caffe/caffe.hpp" -using namespace caffe; // NOLINT(build/namespaces) - int main(int argc, char** argv) { - ::google::InitGoogleLogging(argv[0]); - if (argc < 2 || argc > 3) { - LOG(ERROR) << "Usage: train_net solver_proto_file [resume_point_file]"; - return 1; - } - - SolverParameter solver_param; - ReadProtoFromTextFileOrDie(argv[1], &solver_param); - - LOG(INFO) << "Starting Optimization"; - SGDSolver solver(solver_param); - if (argc == 3) { - LOG(INFO) << "Resuming from " << argv[2]; - solver.Solve(argv[2]); - } else { - solver.Solve(); - } - LOG(INFO) << "Optimization Done."; - + LOG(ERROR) << "Deprecated. Use caffe.bin train --solver_proto_file=... " + "[resume_point_file=...] instead."; return 0; } From 2ced4c9ab9021f7df3b03c604248a300510bfeba Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Fri, 25 Jul 2014 09:52:30 -0700 Subject: [PATCH 0319/2053] lint --- tools/caffe.cpp | 29 ++++++++++++++++------------- tools/device_query.cpp | 3 ++- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 48352485bc6..dde58c68b3f 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -1,8 +1,11 @@ +// Copyright 2014 BVLC and contributors. #include #include #include #include +#include +#include #include "caffe/caffe.hpp" @@ -13,7 +16,7 @@ using caffe::Layer; using caffe::shared_ptr; using caffe::Timer; using caffe::string; -using std::vector; +using caffe::vector; // Used in device query @@ -36,21 +39,21 @@ DEFINE_bool(speedtest_with_gpu, false, // A simple registry for caffe commands. typedef int (*BrewFunction)(); -typedef std::map BrewMap; +typedef std::map BrewMap; BrewMap g_brew_map; #define RegisterBrewFunction(func) \ - namespace { \ - class __Registerer_##func { \ - public: \ - __Registerer_##func() { \ - g_brew_map[#func] = &func; \ - } \ - }; \ - __Registerer_##func g_registerer_##func; \ - } +namespace { \ +class __Registerer_##func { \ + public: /* NOLINT */ \ + __Registerer_##func() { \ + g_brew_map[#func] = &func; \ + } \ +}; \ +__Registerer_##func g_registerer_##func; \ +} -static BrewFunction GetBrewFunction(const std::string& name) { +static BrewFunction GetBrewFunction(const string& name) { if (g_brew_map.count(name)) { return g_brew_map[name]; } else { @@ -172,5 +175,5 @@ RegisterBrewFunction(speedtest); int main(int argc, char** argv) { caffe::GlobalInit(&argc, &argv); CHECK_EQ(argc, 2); - return GetBrewFunction(std::string(argv[1]))(); + return GetBrewFunction(string(argv[1]))(); } diff --git a/tools/device_query.cpp b/tools/device_query.cpp index 224a3145308..a87e23c8722 100644 --- a/tools/device_query.cpp +++ b/tools/device_query.cpp @@ -3,6 +3,7 @@ #include "caffe/common.hpp" int main(int argc, char** argv) { - LOG(ERROR) << "Deprecated. Use caffe.bin devicequery [--device_id=0] instead."; + LOG(ERROR) << "Deprecated. Use caffe.bin devicequery " + "[--device_id=0] instead."; return 0; } From 2cfbda510c27e103cf060f4a9b10d5d51806358e Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Fri, 25 Jul 2014 10:11:26 -0700 Subject: [PATCH 0320/2053] oops, wrong deprecation message (should have --) --- tools/finetune_net.cpp | 2 +- tools/train_net.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/finetune_net.cpp b/tools/finetune_net.cpp index dff97215f5e..17b7f3a7bce 100644 --- a/tools/finetune_net.cpp +++ b/tools/finetune_net.cpp @@ -4,6 +4,6 @@ int main(int argc, char** argv) { LOG(ERROR) << "Deprecated. Use caffe.bin train --solver_proto_file=... " - "[pretrained_net_file=...] instead."; + "[--pretrained_net_file=...] instead."; return 0; } diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 568260c7b45..35b1c776470 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -4,6 +4,6 @@ int main(int argc, char** argv) { LOG(ERROR) << "Deprecated. Use caffe.bin train --solver_proto_file=... " - "[resume_point_file=...] instead."; + "[--resume_point_file=...] instead."; return 0; } From 7de3382561bbbe235358f4259328093ecf048e2d Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Wed, 23 Jul 2014 19:22:11 -0700 Subject: [PATCH 0321/2053] Add gradient checks for infogain loss layer, letting it take the infogain matrix as the third bottom blob. --- src/caffe/layers/infogain_loss_layer.cpp | 51 +++++++++++----- src/caffe/test/test_infogain_loss_layer.cpp | 67 +++++++++++++++++++++ 2 files changed, 104 insertions(+), 14 deletions(-) create mode 100644 src/caffe/test/test_infogain_loss_layer.cpp diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index 204f6c305ca..4b02f4e61db 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -18,14 +18,24 @@ void InfogainLossLayer::FurtherSetUp( CHECK_EQ(bottom[1]->channels(), 1); CHECK_EQ(bottom[1]->height(), 1); CHECK_EQ(bottom[1]->width(), 1); - - BlobProto blob_proto; - ReadProtoFromBinaryFile( - this->layer_param_.infogain_loss_param().source(), &blob_proto); - infogain_.FromProto(blob_proto); - CHECK_EQ(infogain_.num(), 1); - CHECK_EQ(infogain_.channels(), 1); - CHECK_EQ(infogain_.height(), infogain_.width()); + Blob* infogain = NULL; + if (bottom.size() < 3) { + CHECK(this->layer_param_.infogain_loss_param().has_source()) + << "Infogain matrix source must be specified."; + BlobProto blob_proto; + ReadProtoFromBinaryFile( + this->layer_param_.infogain_loss_param().source(), &blob_proto); + infogain_.FromProto(blob_proto); + infogain = &infogain_; + } else { + infogain = bottom[2]; + } + const int num = bottom[0]->num(); + const int dim = bottom[0]->count() / num; + CHECK_EQ(infogain->num(), 1); + CHECK_EQ(infogain->channels(), 1); + CHECK_EQ(infogain->height(), dim); + CHECK_EQ(infogain->width(), dim); } @@ -34,10 +44,14 @@ Dtype InfogainLossLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); const Dtype* bottom_label = bottom[1]->cpu_data(); - const Dtype* infogain_mat = infogain_.cpu_data(); + const Dtype* infogain_mat = NULL; + if (bottom.size() < 3) { + infogain_mat = infogain_.cpu_data(); + } else { + infogain_mat = bottom[2]->cpu_data(); + } int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); - CHECK_EQ(infogain_.height(), dim); Dtype loss = 0; for (int i = 0; i < num; ++i) { int label = static_cast(bottom_label[i]); @@ -46,10 +60,11 @@ Dtype InfogainLossLayer::Forward_cpu(const vector*>& bottom, loss -= infogain_mat[label * dim + j] * log(prob); } } + loss /= num; if (top->size() == 1) { - (*top)[0]->mutable_cpu_data()[0] = loss / num; + (*top)[0]->mutable_cpu_data()[0] = loss; } - return loss / num; + return loss; } template @@ -60,14 +75,22 @@ void InfogainLossLayer::Backward_cpu(const vector*>& top, LOG(FATAL) << this->type_name() << " Layer cannot backpropagate to label inputs."; } + if (propagate_down.size() > 2 && propagate_down[2]) { + LOG(FATAL) << this->type_name() + << " Layer cannot backpropagate to infogain inputs."; + } if (propagate_down[0]) { const Dtype* bottom_data = (*bottom)[0]->cpu_data(); const Dtype* bottom_label = (*bottom)[1]->cpu_data(); - const Dtype* infogain_mat = infogain_.cpu_data(); + const Dtype* infogain_mat = NULL; + if (bottom->size() < 3) { + infogain_mat = infogain_.cpu_data(); + } else { + infogain_mat = (*bottom)[2]->cpu_data(); + } Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); int num = (*bottom)[0]->num(); int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); - CHECK_EQ(infogain_.height(), dim); for (int i = 0; i < num; ++i) { int label = static_cast(bottom_label[i]); for (int j = 0; j < dim; ++j) { diff --git a/src/caffe/test/test_infogain_loss_layer.cpp b/src/caffe/test/test_infogain_loss_layer.cpp new file mode 100644 index 00000000000..99bad263e88 --- /dev/null +++ b/src/caffe/test/test_infogain_loss_layer.cpp @@ -0,0 +1,67 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include +#include +#include + +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/loss_layers.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +template +class InfogainLossLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + InfogainLossLayerTest() + : blob_bottom_data_(new Blob(10, 5, 1, 1)), + blob_bottom_label_(new Blob(10, 1, 1, 1)), + blob_bottom_infogain_(new Blob(1, 1, 5, 5)) { + Caffe::set_random_seed(1701); + FillerParameter filler_param; + PositiveUnitballFiller filler(filler_param); + filler.Fill(this->blob_bottom_data_); + blob_bottom_vec_.push_back(blob_bottom_data_); + for (int i = 0; i < blob_bottom_label_->count(); ++i) { + blob_bottom_label_->mutable_cpu_data()[i] = caffe_rng_rand() % 5; + } + blob_bottom_vec_.push_back(blob_bottom_label_); + filler_param.set_min(0.1); + filler_param.set_max(2.0); + UniformFiller infogain_filler(filler_param); + infogain_filler.Fill(this->blob_bottom_infogain_); + blob_bottom_vec_.push_back(blob_bottom_infogain_); + } + virtual ~InfogainLossLayerTest() { + delete blob_bottom_data_; + delete blob_bottom_label_; + delete blob_bottom_infogain_; + } + Blob* const blob_bottom_data_; + Blob* const blob_bottom_label_; + Blob* const blob_bottom_infogain_; + vector*> blob_bottom_vec_; + vector*> blob_top_vec_; +}; + +TYPED_TEST_CASE(InfogainLossLayerTest, TestDtypesAndDevices); + + +TYPED_TEST(InfogainLossLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + InfogainLossLayer layer(layer_param); + GradientChecker checker(1e-4, 2e-2, 1701, 1, 0.01); + checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0, -1, -1); +} + +} // namespace caffe From 70b01f2164dd5e53605fc58c25530da3a5cccbd3 Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Fri, 25 Jul 2014 17:58:35 -0700 Subject: [PATCH 0322/2053] using caffe::string to be consistent with other string definition. --- tools/caffe.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index dde58c68b3f..ec414298ea4 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -15,7 +15,6 @@ using caffe::Net; using caffe::Layer; using caffe::shared_ptr; using caffe::Timer; -using caffe::string; using caffe::vector; @@ -39,7 +38,7 @@ DEFINE_bool(speedtest_with_gpu, false, // A simple registry for caffe commands. typedef int (*BrewFunction)(); -typedef std::map BrewMap; +typedef std::map BrewMap; BrewMap g_brew_map; #define RegisterBrewFunction(func) \ @@ -53,7 +52,7 @@ class __Registerer_##func { \ __Registerer_##func g_registerer_##func; \ } -static BrewFunction GetBrewFunction(const string& name) { +static BrewFunction GetBrewFunction(const caffe::string& name) { if (g_brew_map.count(name)) { return g_brew_map[name]; } else { @@ -141,7 +140,7 @@ int speedtest() { forward_timer.Start(); Timer timer; for (int i = 0; i < layers.size(); ++i) { - const string& layername = layers[i]->layer_param().name(); + const caffe::string& layername = layers[i]->layer_param().name(); timer.Start(); for (int j = 0; j < FLAGS_run_iterations; ++j) { layers[i]->Forward(bottom_vecs[i], &top_vecs[i]); @@ -154,7 +153,7 @@ int speedtest() { Timer backward_timer; backward_timer.Start(); for (int i = layers.size() - 1; i >= 0; --i) { - const string& layername = layers[i]->layer_param().name(); + const caffe::string& layername = layers[i]->layer_param().name(); timer.Start(); for (int j = 0; j < FLAGS_run_iterations; ++j) { layers[i]->Backward(top_vecs[i], bottom_need_backward[i], @@ -175,5 +174,5 @@ RegisterBrewFunction(speedtest); int main(int argc, char** argv) { caffe::GlobalInit(&argc, &argv); CHECK_EQ(argc, 2); - return GetBrewFunction(string(argv[1]))(); + return GetBrewFunction(caffe::string(argv[1]))(); } From 9862d5a4dcc70edba94291a64c303b659e7bd362 Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Sat, 26 Jul 2014 08:37:05 -0700 Subject: [PATCH 0323/2053] LOG(ERROR)->LOG(FATAL), and misc script changes. --- examples/cifar10/readme.md | 2 +- examples/cifar10/train_full.sh | 16 ++++++++-------- examples/cifar10/train_quick.sh | 7 +++++-- examples/imagenet/resume_training.sh | 5 +++-- examples/imagenet/train_alexnet.sh | 3 ++- examples/imagenet/train_imagenet.sh | 3 ++- examples/mnist/readme.md | 2 +- examples/mnist/train_lenet.sh | 3 ++- examples/mnist/train_lenet_consolidated.sh | 3 ++- examples/mnist/train_mnist_autoencoder.sh | 3 ++- tools/device_query.cpp | 2 +- tools/finetune_net.cpp | 2 +- tools/net_speed_benchmark.cpp | 2 +- tools/train_net.cpp | 2 +- 14 files changed, 32 insertions(+), 23 deletions(-) diff --git a/examples/cifar10/readme.md b/examples/cifar10/readme.md index 9d5bd7b2b0c..315713f7022 100644 --- a/examples/cifar10/readme.md +++ b/examples/cifar10/readme.md @@ -42,7 +42,7 @@ Training the model is simple after you have written the network definition proto cd $CAFFE_ROOT/examples/cifar10 ./train_quick.sh -`train_quick.sh` is a simple script, so have a look inside. `GLOG_logtostderr=1` is the google logging flag that prints all the logging messages directly to stderr. The main tool for training is `train_net.bin`, with the solver protobuf text file as its argument. +`train_quick.sh` is a simple script, so have a look inside. `GLOG_logtostderr=1` is the google logging flag that prints all the logging messages directly to stderr. The main tool for training is `caffe.bin` with the `train` action, and the solver protobuf text file as its argument. When you run the code, you will see a lot of messages flying by like this: diff --git a/examples/cifar10/train_full.sh b/examples/cifar10/train_full.sh index 4db7b9a98f1..930b27a1a32 100755 --- a/examples/cifar10/train_full.sh +++ b/examples/cifar10/train_full.sh @@ -2,15 +2,15 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/train_net.bin \ - cifar10_full_solver.prototxt +GLOG_logtostderr=1 $TOOLS/caffe.bin train \ + --solver_proto_file=cifar10_full_solver.prototxt #reduce learning rate by factor of 10 -GLOG_logtostderr=1 $TOOLS/train_net.bin \ - cifar10_full_solver_lr1.prototxt \ - cifar10_full_iter_60000.solverstate +GLOG_logtostderr=1 $TOOLS/caffe.bin train \ + --solver_proto_file=cifar10_full_solver_lr1.prototxt \ + --resume_point_file=cifar10_full_iter_60000.solverstate #reduce learning rate by factor of 10 -GLOG_logtostderr=1 $TOOLS/train_net.bin \ - cifar10_full_solver_lr2.prototxt \ - cifar10_full_iter_65000.solverstate +GLOG_logtostderr=1 $TOOLS/caffe.bin train \ + --solver_proto_file=cifar10_full_solver_lr2.prototxt \ + --resume_point_file=cifar10_full_iter_65000.solverstate diff --git a/examples/cifar10/train_quick.sh b/examples/cifar10/train_quick.sh index 1d954b5935e..5e8fffccd48 100755 --- a/examples/cifar10/train_quick.sh +++ b/examples/cifar10/train_quick.sh @@ -2,7 +2,10 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/train_net.bin cifar10_quick_solver.prototxt +GLOG_logtostderr=1 $TOOLS/caffe.bin train \ + --solver_proto_file=cifar10_quick_solver.prototxt #reduce learning rate by fctor of 10 after 8 epochs -GLOG_logtostderr=1 $TOOLS/train_net.bin cifar10_quick_solver_lr1.prototxt cifar10_quick_iter_4000.solverstate +GLOG_logtostderr=1 $TOOLS/caffe.bin train \ + --solver_proto_file=cifar10_quick_solver_lr1.prototxt \ + --resume_point_file=cifar10_quick_iter_4000.solverstate diff --git a/examples/imagenet/resume_training.sh b/examples/imagenet/resume_training.sh index 2b3b4031b5d..b43a9b1bf7c 100755 --- a/examples/imagenet/resume_training.sh +++ b/examples/imagenet/resume_training.sh @@ -2,7 +2,8 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/train_net.bin \ - imagenet_solver.prototxt caffe_imagenet_train_10000.solverstate +GLOG_logtostderr=1 $TOOLS/caffe.bin train\ + --solver_proto_file=imagenet_solver.prototxt \ + --resume_point_file=caffe_imagenet_train_10000.solverstate echo "Done." diff --git a/examples/imagenet/train_alexnet.sh b/examples/imagenet/train_alexnet.sh index c91e9108ae5..d43a235dba1 100755 --- a/examples/imagenet/train_alexnet.sh +++ b/examples/imagenet/train_alexnet.sh @@ -2,6 +2,7 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/train_net.bin alexnet_solver.prototxt +GLOG_logtostderr=1 $TOOLS/caffe.bin train \ + --solver_proto_file=alexnet_solver.prototxt echo "Done." diff --git a/examples/imagenet/train_imagenet.sh b/examples/imagenet/train_imagenet.sh index 0d2563b0c9d..90dcdfaddb8 100755 --- a/examples/imagenet/train_imagenet.sh +++ b/examples/imagenet/train_imagenet.sh @@ -2,6 +2,7 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/train_net.bin imagenet_solver.prototxt +GLOG_logtostderr=1 $TOOLS/caffe.bin train \ + --solver_proto_file=imagenet_solver.prototxt echo "Done." diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index d609cfff9aa..4f3f4d9ce12 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -212,7 +212,7 @@ Training the model is simple after you have written the network definition proto cd $CAFFE_ROOT/examples/mnist ./train_lenet.sh -`train_lenet.sh` is a simple script, but here are a few explanations: `GLOG_logtostderr=1` is the google logging flag that prints all the logging messages directly to stderr. The main tool for training is `train_net.bin`, with the solver protobuf text file as its argument. +`train_lenet.sh` is a simple script, but here are a few explanations: `GLOG_logtostderr=1` is the google logging flag that prints all the logging messages directly to stderr. The main tool for training is `caffe.bin` with action `train`, with the solver protobuf text file as its argument. When you run the code, you will see a lot of messages flying by like this: diff --git a/examples/mnist/train_lenet.sh b/examples/mnist/train_lenet.sh index c30fc3e02e1..4d0f1eea051 100755 --- a/examples/mnist/train_lenet.sh +++ b/examples/mnist/train_lenet.sh @@ -2,4 +2,5 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/train_net.bin lenet_solver.prototxt +GLOG_logtostderr=1 $TOOLS/caffe.bin train \ + --solver_proto_file=lenet_solver.prototxt diff --git a/examples/mnist/train_lenet_consolidated.sh b/examples/mnist/train_lenet_consolidated.sh index ff6897e263d..802c801e31f 100755 --- a/examples/mnist/train_lenet_consolidated.sh +++ b/examples/mnist/train_lenet_consolidated.sh @@ -2,4 +2,5 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/train_net.bin lenet_consolidated_solver.prototxt +GLOG_logtostderr=1 $TOOLS/caffe.bin train \ + --solver_proto_file=lenet_consolidated_solver.prototxt diff --git a/examples/mnist/train_mnist_autoencoder.sh b/examples/mnist/train_mnist_autoencoder.sh index af2245e07f0..3fb493534db 100755 --- a/examples/mnist/train_mnist_autoencoder.sh +++ b/examples/mnist/train_mnist_autoencoder.sh @@ -1,4 +1,5 @@ #!/bin/bash TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/train_net.bin mnist_autoencoder_solver.prototxt +GLOG_logtostderr=1 $TOOLS/caffe.bin train \ + --solver_proto_file=mnist_autoencoder_solver.prototxt diff --git a/tools/device_query.cpp b/tools/device_query.cpp index a87e23c8722..efdbbbbc90e 100644 --- a/tools/device_query.cpp +++ b/tools/device_query.cpp @@ -3,7 +3,7 @@ #include "caffe/common.hpp" int main(int argc, char** argv) { - LOG(ERROR) << "Deprecated. Use caffe.bin devicequery " + LOG(FATAL) << "Deprecated. Use caffe.bin devicequery " "[--device_id=0] instead."; return 0; } diff --git a/tools/finetune_net.cpp b/tools/finetune_net.cpp index 17b7f3a7bce..213ff01702a 100644 --- a/tools/finetune_net.cpp +++ b/tools/finetune_net.cpp @@ -3,7 +3,7 @@ #include "caffe/caffe.hpp" int main(int argc, char** argv) { - LOG(ERROR) << "Deprecated. Use caffe.bin train --solver_proto_file=... " + LOG(FATAL) << "Deprecated. Use caffe.bin train --solver_proto_file=... " "[--pretrained_net_file=...] instead."; return 0; } diff --git a/tools/net_speed_benchmark.cpp b/tools/net_speed_benchmark.cpp index 9e6bb4cbe95..f520e1d7785 100644 --- a/tools/net_speed_benchmark.cpp +++ b/tools/net_speed_benchmark.cpp @@ -3,7 +3,7 @@ #include "caffe/caffe.hpp" int main(int argc, char** argv) { - LOG(ERROR) << "Deprecated. Use caffe.bin speedtest --net_proto_file=... " + LOG(FATAL) << "Deprecated. Use caffe.bin speedtest --net_proto_file=... " "[--run_iterations=50] [--speedtest_with_gpu] [--device_id=0]"; return 0; } diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 35b1c776470..08602d4a7ca 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -3,7 +3,7 @@ #include "caffe/caffe.hpp" int main(int argc, char** argv) { - LOG(ERROR) << "Deprecated. Use caffe.bin train --solver_proto_file=... " + LOG(FATAL) << "Deprecated. Use caffe.bin train --solver_proto_file=... " "[--resume_point_file=...] instead."; return 0; } From 149a176dc2f35f2218cd7a639157e90c59b12e72 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 25 Jul 2014 20:40:07 -0700 Subject: [PATCH 0324/2053] Print blob L1 norms during forward/backward passes and updates if new "debug_info" field in SolverParameter is set. --- include/caffe/blob.hpp | 4 ++ include/caffe/net.hpp | 18 +++++-- src/caffe/blob.cpp | 70 +++++++++++++++++++++++++++ src/caffe/net.cpp | 95 ++++++++++++++++++++++++++++++++----- src/caffe/proto/caffe.proto | 4 ++ src/caffe/solver.cpp | 10 +++- 6 files changed, 186 insertions(+), 15 deletions(-) diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index bbea86aea69..ab7a0f60f80 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -76,6 +76,10 @@ class Blob { void FromProto(const BlobProto& proto); void ToProto(BlobProto* proto, bool write_diff = false) const; + // Compute the sum of absolute values (L1 norm) of the data or diff. + Dtype asum_data() const; + Dtype asum_diff() const; + // Set the data_/diff_ shared_ptr to point to the SyncedMemory holding the // data_/diff_ of Blob other -- useful in layers which simply perform a copy // in their forward or backward pass. diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 481a64979f1..7548011d973 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -95,8 +95,9 @@ class Net { // returns the parameters inline vector > >& params() { return params_; } // returns the parameter learning rate multipliers - inline vector& params_lr() {return params_lr_; } + inline vector& params_lr() { return params_lr_; } inline vector& params_weight_decay() { return params_weight_decay_; } + const map& param_names_index() { return param_names_index_; } // Input and output blob numbers inline int num_inputs() { return net_input_blobs_.size(); } inline int num_outputs() { return net_output_blobs_.size(); } @@ -111,7 +112,8 @@ class Net { const shared_ptr > blob_by_name(const string& blob_name); bool has_layer(const string& layer_name); const shared_ptr > layer_by_name(const string& layer_name); - const map& param_names_index() { return param_names_index_; } + + void set_debug_info(const bool value) { debug_info_ = value; } protected: // Helpers for Init. @@ -125,6 +127,12 @@ class Net { map* blob_name_to_idx); void AppendParam(const NetParameter& param, const int layer_id, const int param_id); + + // Helpers for displaying debug info. + void ForwardDebugInfo(const int layer_id); + void BackwardDebugInfo(const int layer_id); + void UpdateDebugInfo(const int param_id); + // Function to get misc parameters, e.g. the learning rate multiplier and // weight decay. void GetLearningRateAndWeightDecay(); @@ -150,7 +158,8 @@ class Net { vector*> > top_vecs_; vector > top_id_vecs_; vector param_owners_; - vector > layer_param_indices_; + vector param_display_names_; + vector > param_layer_indices_; map param_names_index_; // blob indices for the input and the output of the net vector net_input_blob_indices_; @@ -166,6 +175,9 @@ class Net { vector params_weight_decay_; // The bytes of memory used by this net size_t memory_used_; + // Whether to compute and display debug info for the net. + bool debug_info_; + DISABLE_COPY_AND_ASSIGN(Net); }; diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index 1051eaa1c2c..738b549e10c 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -137,6 +137,76 @@ void Blob::Update() { } } +template <> unsigned int Blob::asum_data() const { + NOT_IMPLEMENTED; + return 0; +} + +template <> int Blob::asum_data() const { + NOT_IMPLEMENTED; + return 0; +} + +template +Dtype Blob::asum_data() const { + if (!data_) { return 0; } + switch (data_->head()) { + case SyncedMemory::HEAD_AT_CPU: + return caffe_cpu_asum(count_, cpu_data()); + case SyncedMemory::HEAD_AT_GPU: + case SyncedMemory::SYNCED: +#ifndef CPU_ONLY + { + Dtype asum; + caffe_gpu_asum(count_, gpu_data(), &asum); + return asum; + } +#else + NO_GPU; +#endif + case SyncedMemory::UNINITIALIZED: + return 0; + default: + LOG(FATAL) << "Unknown SyncedMemory head state: " << data_->head(); + } + return 0; +} + +template <> unsigned int Blob::asum_diff() const { + NOT_IMPLEMENTED; + return 0; +} + +template <> int Blob::asum_diff() const { + NOT_IMPLEMENTED; + return 0; +} + +template +Dtype Blob::asum_diff() const { + if (!diff_) { return 0; } + switch (diff_->head()) { + case SyncedMemory::HEAD_AT_CPU: + return caffe_cpu_asum(count_, cpu_diff()); + case SyncedMemory::HEAD_AT_GPU: + case SyncedMemory::SYNCED: +#ifndef CPU_ONLY + { + Dtype asum; + caffe_gpu_asum(count_, gpu_diff(), &asum); + return asum; + } +#else + NO_GPU; +#endif + case SyncedMemory::UNINITIALIZED: + return 0; + default: + LOG(FATAL) << "Unknown SyncedMemory head state: " << diff_->head(); + } + return 0; +} + template void Blob::CopyFrom(const Blob& source, bool copy_diff, bool reshape) { if (num_ != source.num() || channels_ != source.channels() || diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 7673608a5ed..612cbb1b60d 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -163,6 +163,8 @@ void Net::Init(const NetParameter& in_param) { GetLearningRateAndWeightDecay(); LOG(INFO) << "Network initialization done."; LOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); + // Don't display debug info by default. + debug_info_ = false; } // Helper for Net::Init: add a new input or top blob to the net. (Inputs have @@ -242,13 +244,17 @@ void Net::AppendParam(const NetParameter& param, const int layer_id, const int param_id) { const LayerParameter& layer_param = layers_[layer_id]->layer_param(); const int param_size = layer_param.param_size(); - string param_name; - if (param_size) { - param_name = layer_param.param(param_id); + string param_name = param_size ? layer_param.param(param_id) : ""; + if (param_name.size()) { + param_display_names_.push_back(param_name); + } else { + ostringstream param_display_name; + param_display_name << param_id; + param_display_names_.push_back(param_display_name.str()); } const int net_param_id = params_.size(); params_.push_back(layers_[layer_id]->blobs()[param_id]); - layer_param_indices_.push_back(make_pair(layer_id, param_id)); + param_layer_indices_.push_back(make_pair(layer_id, param_id)); if (!param_size || !param_name.size() || (param_name.size() && param_names_index_.find(param_name) == param_names_index_.end())) { // This layer "owns" this parameter blob -- it is either anonymous @@ -263,7 +269,7 @@ void Net::AppendParam(const NetParameter& param, const int layer_id, const int owner_net_param_id = param_names_index_[param_name]; param_owners_.push_back(owner_net_param_id); const pair& owner_index = - layer_param_indices_[owner_net_param_id]; + param_layer_indices_[owner_net_param_id]; const int owner_layer_id = owner_index.first; const int owner_param_id = owner_index.second; LOG(INFO) << "Sharing parameters '" << param_name << "' owned by " @@ -339,6 +345,7 @@ Dtype Net::ForwardFromTo(int start, int end) { // LOG(ERROR) << "Forwarding " << layer_names_[i]; Dtype layer_loss = layers_[i]->Forward(bottom_vecs_[i], &top_vecs_[i]); loss += layer_loss; + if (debug_info_) { ForwardDebugInfo(i); } } return loss; } @@ -402,10 +409,75 @@ void Net::BackwardFromTo(int start, int end) { if (layer_need_backward_[i]) { layers_[i]->Backward( top_vecs_[i], bottom_need_backward_[i], &bottom_vecs_[i]); + if (debug_info_) { BackwardDebugInfo(i); } } } } +template +void Net::ForwardDebugInfo(const int layer_id) { + for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { + const Blob& blob = *top_vecs_[layer_id][top_id]; + const string& blob_name = blob_names_[top_id_vecs_[layer_id][top_id]]; + const Dtype asum = blob.asum_data(); + const Dtype asum_mean = asum / blob.count(); + LOG(INFO) << " [Forward] " + << "Layer " << layer_names_[layer_id] << ", top blob " << blob_name + << " data: " << asum << " (" << asum_mean << ")"; + } +} + +template +void Net::BackwardDebugInfo(const int layer_id) { + const vector*>& bottom_vec = bottom_vecs_[layer_id]; + for (int bottom_id = 0; bottom_id < bottom_vec.size(); ++bottom_id) { + if (!bottom_need_backward_[layer_id][bottom_id]) { continue; } + const Blob& blob = *bottom_vec[bottom_id]; + const string& blob_name = blob_names_[bottom_id_vecs_[layer_id][bottom_id]]; + const Dtype asum = blob.asum_diff(); + const Dtype asum_mean = asum / blob.count(); + LOG(INFO) << " [Backward] " + << "Layer " << layer_names_[layer_id] << ", bottom blob " << blob_name + << " diff: " << asum << " (" << asum_mean << ")"; + } + for (int param_id = 0; param_id < layers_[layer_id]->blobs().size(); + ++param_id) { + if (!layers_[layer_id]->param_propagate_down(param_id)) { continue; } + const Blob& blob = *layers_[layer_id]->blobs()[param_id]; + const Dtype asum = blob.asum_diff(); + const Dtype asum_mean = asum / blob.count(); + LOG(INFO) << " [Backward] " + << "Layer " << layer_names_[layer_id] << ", param blob " << param_id + << " diff: " << asum << " (" << asum_mean << ")"; + } +} + +template +void Net::UpdateDebugInfo(const int param_id) { + const Blob& blob = *params_[param_id]; + const int param_owner = param_owners_[param_id]; + const string& layer_name = layer_names_[param_layer_indices_[param_id].first]; + const string& param_display_name = param_display_names_[param_id]; + const Dtype asum_diff = blob.asum_diff(); + const Dtype asum_diff_mean = asum_diff / blob.count(); + if (param_owner < 0) { + const Dtype asum_data = blob.asum_data(); + const Dtype asum_data_mean = asum_data / blob.count(); + LOG(INFO) << " [Update] Layer " << layer_name + << ", param " << param_display_name + << " data: " << asum_data << " (" << asum_data_mean << ");" + << " diff: " << asum_diff << " (" << asum_diff_mean << ")"; + } else { + const string& owner_layer_name = + layer_names_[param_layer_indices_[param_owner].first]; + LOG(INFO) << " [Update] Layer " << layer_name + << ", param blob " << param_display_name + << " (owned by layer " << owner_layer_name << ", " + << "param " << param_display_names_[param_owners_[param_id]] << ")" + << " diff: " << asum_diff << " (" << asum_diff_mean << ")"; + } +} + template void Net::ShareTrainedLayersWith(Net* other) { int num_source_layers = other->layers().size(); @@ -516,9 +588,8 @@ void Net::Update() { // diff. (Assumes that the learning rate, weight decay, etc. have already been // accounted for in the current diff.) for (int i = 0; i < params_.size(); ++i) { - if (param_owners_[i] < 0) { - continue; - } + if (param_owners_[i] < 0) { continue; } + if (debug_info_) { UpdateDebugInfo(i); } const int count = params_[i]->count(); const Dtype* this_diff; Dtype* owner_diff; @@ -534,6 +605,8 @@ void Net::Update() { owner_diff = params_[param_owners_[i]]->mutable_gpu_diff(); caffe_gpu_add(count, this_diff, owner_diff, owner_diff); break; +#else + NO_GPU; #endif default: LOG(FATAL) << "Unknown caffe mode: " << Caffe::mode(); @@ -541,9 +614,9 @@ void Net::Update() { } // Now, update the owned parameters. for (int i = 0; i < params_.size(); ++i) { - if (param_owners_[i] < 0) { - params_[i]->Update(); - } + if (param_owners_[i] >= 0) { continue; } + if (debug_info_) { UpdateDebugInfo(i); } + params_[i]->Update(); } } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 34cf8443f56..5e437dff327 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -105,6 +105,10 @@ message SolverParameter { // random number generator -- useful for reproducible results. Otherwise, // (and by default) initialize using a seed derived from the system clock. optional int64 random_seed = 20 [default = -1]; + + // If true, print information about the state of the net that may help with + // debugging learning problems. + optional bool debug_info = 23 [default = false]; } // A message that stores the solver snapshots diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index a33149721bf..0dfc7f0a52d 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -53,6 +53,8 @@ void Solver::Init(const SolverParameter& param) { LOG(INFO) << "Creating training net from file: " << param_.train_net(); net_.reset(new Net(param_.train_net())); } + CHECK(net_) << "Training net uninitialized."; + net_->set_debug_info(param_.debug_info()); const int num_test_net_params = param_.test_net_param_size(); const int num_test_net_files = param_.test_net_size(); const int num_test_nets = num_test_net_params + num_test_net_files; @@ -100,11 +102,17 @@ void Solver::Solve(const char* resume_file) { // should be given, and we will just provide dummy vecs. vector*> bottom_vec; while (iter_++ < param_.max_iter()) { + const bool display = param_.display() && iter_ % param_.display() == 0; + if (display) { + net_->set_debug_info(param_.debug_info()); + } else { + net_->set_debug_info(false); + } Dtype loss = net_->ForwardBackward(bottom_vec); ComputeUpdateValue(); net_->Update(); - if (param_.display() && iter_ % param_.display() == 0) { + if (display) { LOG(INFO) << "Iteration " << iter_ << ", loss = " << loss; } if (param_.test_interval() && iter_ % param_.test_interval() == 0) { From 69997119747d0c61424a8338ae70c0a805b74f0d Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 26 Jul 2014 15:18:41 -0700 Subject: [PATCH 0325/2053] Print just the mean absolute value (no sum/l1norm) --- src/caffe/net.cpp | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 612cbb1b60d..8e99d307f32 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -419,11 +419,10 @@ void Net::ForwardDebugInfo(const int layer_id) { for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { const Blob& blob = *top_vecs_[layer_id][top_id]; const string& blob_name = blob_names_[top_id_vecs_[layer_id][top_id]]; - const Dtype asum = blob.asum_data(); - const Dtype asum_mean = asum / blob.count(); + const Dtype asum_mean = blob.asum_data() / blob.count(); LOG(INFO) << " [Forward] " << "Layer " << layer_names_[layer_id] << ", top blob " << blob_name - << " data: " << asum << " (" << asum_mean << ")"; + << " data: " << asum_mean; } } @@ -434,21 +433,19 @@ void Net::BackwardDebugInfo(const int layer_id) { if (!bottom_need_backward_[layer_id][bottom_id]) { continue; } const Blob& blob = *bottom_vec[bottom_id]; const string& blob_name = blob_names_[bottom_id_vecs_[layer_id][bottom_id]]; - const Dtype asum = blob.asum_diff(); - const Dtype asum_mean = asum / blob.count(); + const Dtype asum_mean = blob.asum_diff() / blob.count(); LOG(INFO) << " [Backward] " << "Layer " << layer_names_[layer_id] << ", bottom blob " << blob_name - << " diff: " << asum << " (" << asum_mean << ")"; + << " diff: " << asum_mean; } for (int param_id = 0; param_id < layers_[layer_id]->blobs().size(); ++param_id) { if (!layers_[layer_id]->param_propagate_down(param_id)) { continue; } const Blob& blob = *layers_[layer_id]->blobs()[param_id]; - const Dtype asum = blob.asum_diff(); - const Dtype asum_mean = asum / blob.count(); + const Dtype asum_mean = blob.asum_diff() / blob.count(); LOG(INFO) << " [Backward] " << "Layer " << layer_names_[layer_id] << ", param blob " << param_id - << " diff: " << asum << " (" << asum_mean << ")"; + << " diff: " << asum_mean; } } @@ -458,15 +455,12 @@ void Net::UpdateDebugInfo(const int param_id) { const int param_owner = param_owners_[param_id]; const string& layer_name = layer_names_[param_layer_indices_[param_id].first]; const string& param_display_name = param_display_names_[param_id]; - const Dtype asum_diff = blob.asum_diff(); - const Dtype asum_diff_mean = asum_diff / blob.count(); + const Dtype asum_diff_mean = blob.asum_diff() / blob.count(); if (param_owner < 0) { - const Dtype asum_data = blob.asum_data(); - const Dtype asum_data_mean = asum_data / blob.count(); + const Dtype asum_data_mean = blob.asum_data() / blob.count(); LOG(INFO) << " [Update] Layer " << layer_name << ", param " << param_display_name - << " data: " << asum_data << " (" << asum_data_mean << ");" - << " diff: " << asum_diff << " (" << asum_diff_mean << ")"; + << " data: " << asum_data_mean << "; diff: " << asum_diff_mean; } else { const string& owner_layer_name = layer_names_[param_layer_indices_[param_owner].first]; @@ -474,7 +468,7 @@ void Net::UpdateDebugInfo(const int param_id) { << ", param blob " << param_display_name << " (owned by layer " << owner_layer_name << ", " << "param " << param_display_names_[param_owners_[param_id]] << ")" - << " diff: " << asum_diff << " (" << asum_diff_mean << ")"; + << " diff: " << asum_diff_mean; } } From 4fe16db831ee8d5aa47c8798b4cb5ff83637944d Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 26 Jul 2014 19:53:15 -0700 Subject: [PATCH 0326/2053] Fix my nonsensical variable names. --- src/caffe/net.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 8e99d307f32..228f826a8b9 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -419,10 +419,10 @@ void Net::ForwardDebugInfo(const int layer_id) { for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { const Blob& blob = *top_vecs_[layer_id][top_id]; const string& blob_name = blob_names_[top_id_vecs_[layer_id][top_id]]; - const Dtype asum_mean = blob.asum_data() / blob.count(); + const Dtype data_abs_val_mean = blob.asum_data() / blob.count(); LOG(INFO) << " [Forward] " << "Layer " << layer_names_[layer_id] << ", top blob " << blob_name - << " data: " << asum_mean; + << " data: " << data_abs_val_mean; } } @@ -433,19 +433,19 @@ void Net::BackwardDebugInfo(const int layer_id) { if (!bottom_need_backward_[layer_id][bottom_id]) { continue; } const Blob& blob = *bottom_vec[bottom_id]; const string& blob_name = blob_names_[bottom_id_vecs_[layer_id][bottom_id]]; - const Dtype asum_mean = blob.asum_diff() / blob.count(); + const Dtype diff_abs_val_mean = blob.asum_diff() / blob.count(); LOG(INFO) << " [Backward] " << "Layer " << layer_names_[layer_id] << ", bottom blob " << blob_name - << " diff: " << asum_mean; + << " diff: " << diff_abs_val_mean; } for (int param_id = 0; param_id < layers_[layer_id]->blobs().size(); ++param_id) { if (!layers_[layer_id]->param_propagate_down(param_id)) { continue; } const Blob& blob = *layers_[layer_id]->blobs()[param_id]; - const Dtype asum_mean = blob.asum_diff() / blob.count(); + const Dtype diff_abs_val_mean = blob.asum_diff() / blob.count(); LOG(INFO) << " [Backward] " << "Layer " << layer_names_[layer_id] << ", param blob " << param_id - << " diff: " << asum_mean; + << " diff: " << diff_abs_val_mean; } } @@ -455,12 +455,12 @@ void Net::UpdateDebugInfo(const int param_id) { const int param_owner = param_owners_[param_id]; const string& layer_name = layer_names_[param_layer_indices_[param_id].first]; const string& param_display_name = param_display_names_[param_id]; - const Dtype asum_diff_mean = blob.asum_diff() / blob.count(); + const Dtype diff_abs_val_mean = blob.asum_diff() / blob.count(); if (param_owner < 0) { - const Dtype asum_data_mean = blob.asum_data() / blob.count(); + const Dtype data_abs_val_mean = blob.asum_data() / blob.count(); LOG(INFO) << " [Update] Layer " << layer_name << ", param " << param_display_name - << " data: " << asum_data_mean << "; diff: " << asum_diff_mean; + << " data: " << data_abs_val_mean << "; diff: " << diff_abs_val_mean; } else { const string& owner_layer_name = layer_names_[param_layer_indices_[param_owner].first]; @@ -468,7 +468,7 @@ void Net::UpdateDebugInfo(const int param_id) { << ", param blob " << param_display_name << " (owned by layer " << owner_layer_name << ", " << "param " << param_display_names_[param_owners_[param_id]] << ")" - << " diff: " << asum_diff_mean; + << " diff: " << diff_abs_val_mean; } } From 84c424b50e5cc2c21e298ee45180b74fefa0d81e Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 26 Jul 2014 17:03:27 -0700 Subject: [PATCH 0327/2053] Make training iterations 0-indexed. --- src/caffe/solver.cpp | 51 ++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 0dfc7f0a52d..b44948eda58 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -89,25 +89,24 @@ void Solver::Solve(const char* resume_file) { LOG(INFO) << "Restoring previous solver status from " << resume_file; Restore(resume_file); } - - // Run a test pass before doing any training to avoid waiting a potentially - // very long time (param_.test_interval() training iterations) to report that - // there's not enough memory to run the test net and crash, etc.; and to gauge - // the effect of the first training iterations. - if (param_.test_interval()) { - TestAll(); - } + // Remember the initial iter_ value; will be non-zero if we loaded from a + // resume_file above. + const int start_iter = iter_; // For a network that is trained by the solver, no bottom or top vecs // should be given, and we will just provide dummy vecs. vector*> bottom_vec; - while (iter_++ < param_.max_iter()) { - const bool display = param_.display() && iter_ % param_.display() == 0; - if (display) { - net_->set_debug_info(param_.debug_info()); - } else { - net_->set_debug_info(false); + for (; iter_ < param_.max_iter(); ++iter_) { + // Save a snapshot if needed. + if (param_.snapshot() && iter_ > start_iter && + iter_ % param_.snapshot() == 0) { + Snapshot(); + } + if (param_.test_interval() && iter_ % param_.test_interval() == 0) { + TestAll(); } + const bool display = param_.display() && iter_ % param_.display() == 0; + net_->set_debug_info(display && param_.debug_info()); Dtype loss = net_->ForwardBackward(bottom_vec); ComputeUpdateValue(); net_->Update(); @@ -115,17 +114,23 @@ void Solver::Solve(const char* resume_file) { if (display) { LOG(INFO) << "Iteration " << iter_ << ", loss = " << loss; } - if (param_.test_interval() && iter_ % param_.test_interval() == 0) { - TestAll(); - } - // Check if we need to do snapshot - if (param_.snapshot() && iter_ % param_.snapshot() == 0) { - Snapshot(); - } } - // After the optimization is done, always do a snapshot. - iter_--; + // Always save a snapshot after optimization. Snapshot(); + // After the optimization is done, run an additional train and test pass to + // display the train and test loss/outputs if appropriate (based on the + // display and test_interval settings, respectively). Unlike in the rest of + // training, for the train net we only run a forward pass as we've already + // updated the parameters "max_iter" times -- this final pass is only done to + // display the loss, which is computed in the forward pass. + if (param_.display() && iter_ % param_.display() == 0) { + Dtype loss; + net_->Forward(bottom_vec, &loss); + LOG(INFO) << "Iteration " << iter_ << ", loss = " << loss; + } + if (param_.test_interval() && iter_ % param_.test_interval() == 0) { + TestAll(); + } LOG(INFO) << "Optimization Done."; } From 91ed16ba7ec96ccfe0dee27ca8923d566d28371a Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 26 Jul 2014 20:57:07 -0700 Subject: [PATCH 0328/2053] Move loss display before lr display in ComputeUpdateValue. --- src/caffe/solver.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index b44948eda58..91738817875 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -102,18 +102,20 @@ void Solver::Solve(const char* resume_file) { iter_ % param_.snapshot() == 0) { Snapshot(); } + if (param_.test_interval() && iter_ % param_.test_interval() == 0) { TestAll(); } + const bool display = param_.display() && iter_ % param_.display() == 0; net_->set_debug_info(display && param_.debug_info()); Dtype loss = net_->ForwardBackward(bottom_vec); - ComputeUpdateValue(); - net_->Update(); - if (display) { LOG(INFO) << "Iteration " << iter_ << ", loss = " << loss; } + + ComputeUpdateValue(); + net_->Update(); } // Always save a snapshot after optimization. Snapshot(); From 6d71c516bc5f8179e319d501436681c1ea0aa9d4 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 27 Jul 2014 12:50:13 -0700 Subject: [PATCH 0329/2053] Symlink to tool bins without the .bin extension --- Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7f778d364c7..a788f5a394c 100644 --- a/Makefile +++ b/Makefile @@ -117,6 +117,8 @@ EXAMPLE_BUILD_DIRS += $(foreach obj,$(EXAMPLE_OBJS),$(dir $(obj))) # tool, example, and test bins TOOL_BINS := ${TOOL_OBJS:.o=.bin} EXAMPLE_BINS := ${EXAMPLE_OBJS:.o=.bin} +# symlinks to tool bins without the ".bin" extension +TOOL_BIN_LINKS := ${TOOL_BINS:.bin=} # Put the test binaries in build/test for convenience. TEST_BIN_DIR := $(BUILD_DIR)/test TEST_CU_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ @@ -327,7 +329,7 @@ $(LINT_OUTPUTS): $(LINT_OUTPUT_DIR)/%.lint.txt : % | $(LINT_OUTPUT_DIR) test: $(TEST_ALL_BIN) $(TEST_BINS) -tools: $(TOOL_BINS) +tools: $(TOOL_BINS) $(TOOL_BIN_LINKS) examples: $(EXAMPLE_BINS) @@ -431,6 +433,11 @@ $(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo +# Target for extension-less symlinks to tool binaries with extension '*.bin'. +$(TOOL_BUILD_DIR)/%: $(TOOL_BUILD_DIR)/%.bin | $(TOOL_BUILD_DIR) + @ $(RM) $@ + @ ln -s $(abspath $<) $@ + $(TOOL_BINS): %.bin : %.o $(STATIC_NAME) $(CXX) $< $(STATIC_NAME) -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo From 0aa8dca699d8029c5698a724e1c668377dc27d1c Mon Sep 17 00:00:00 2001 From: qipeng Date: Sun, 27 Jul 2014 15:52:59 -0700 Subject: [PATCH 0330/2053] relaxed timer test requirements --- src/caffe/test/test_benchmark.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/caffe/test/test_benchmark.cpp b/src/caffe/test/test_benchmark.cpp index 6555b270ec4..fe0cc82a1d8 100644 --- a/src/caffe/test/test_benchmark.cpp +++ b/src/caffe/test/test_benchmark.cpp @@ -63,8 +63,8 @@ TYPED_TEST(BenchmarkTest, TestTimerMilliSeconds) { EXPECT_FALSE(timer.has_run_at_least_once()); timer.Start(); usleep(300 * 1000); - EXPECT_GE(timer.MilliSeconds(), 295); - EXPECT_LE(timer.MilliSeconds(), 305); + EXPECT_GE(timer.MilliSeconds(), 290); + EXPECT_LE(timer.MilliSeconds(), 310); EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_TRUE(timer.has_run_at_least_once()); @@ -78,8 +78,8 @@ TYPED_TEST(BenchmarkTest, TestTimerSeconds) { EXPECT_FALSE(timer.has_run_at_least_once()); timer.Start(); usleep(300 * 1000); - EXPECT_GE(timer.Seconds(), 0.295); - EXPECT_LE(timer.Seconds(), 0.305); + EXPECT_GE(timer.Seconds(), 0.290); + EXPECT_LE(timer.Seconds(), 0.310); EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_TRUE(timer.has_run_at_least_once()); From 4f12cc7391b05c351ae73fe39410f69c8658ab54 Mon Sep 17 00:00:00 2001 From: alfredtofu Date: Mon, 28 Jul 2014 10:19:51 +0800 Subject: [PATCH 0331/2053] Update image_data_layer.cpp fix bug for getting new width --- src/caffe/layers/image_data_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 30050ddd3c6..d3cc7ff17bf 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -138,7 +138,7 @@ void ImageDataLayer::SetUp(const vector*>& bottom, vector*>* top) { Layer::SetUp(bottom, top); const int new_height = this->layer_param_.image_data_param().new_height(); - const int new_width = this->layer_param_.image_data_param().new_height(); + const int new_width = this->layer_param_.image_data_param().new_width(); CHECK((new_height == 0 && new_width == 0) || (new_height > 0 && new_width > 0)) << "Current implementation requires " "new_height and new_width to be set at the same time."; From 19e87d946829cb91e74a03463cda166f79cfe7ae Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 27 Jul 2014 19:02:58 -0700 Subject: [PATCH 0332/2053] Only install the minimal CUDA subpackages necessary for building. --- .travis.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index db115173f47..7721de112e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,7 +21,14 @@ install: - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1 && sudo make install && popd - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb - - sudo apt-get -y update && sudo apt-get -y install cuda + - sudo apt-get -y update + # Install the minimal CUDA subpackages required to test Caffe build. + # For a full CUDA installation, add 'cuda' to the list of packages. + - sudo apt-get -y install cuda-core-6-0 cuda-extra-libs-6-0 + # Create CUDA symlink at /usr/local/cuda + # (This would normally be created by the CUDA installer, but we create it + # manually since we did a partial installation.) + - sudo ln -s /usr/local/cuda-6.0 /usr/local/cuda - curl https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -o /tmp/mdb.tar.gz && tar -C /tmp -xzvf /tmp/mdb.tar.gz && rm /tmp/mdb.tar.gz - cd /tmp/mdb-mdb/libraries/liblmdb/ && make && sudo make install && cd - From 6388b049ff02f3d5cb371efa11e8b06b8cdde673 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 27 Jul 2014 15:02:38 -0700 Subject: [PATCH 0333/2053] set_mode to CPU in ArgMaxLayerTest constructor to avoid random Travis failures. --- src/caffe/test/test_argmax_layer.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index 5286a0a390a..51d68c42f9a 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -21,6 +21,7 @@ class ArgMaxLayerTest : public ::testing::Test { : blob_bottom_(new Blob(10, 20, 1, 1)), blob_top_(new Blob()), top_k_(5) { + Caffe::set_mode(Caffe::CPU); Caffe::set_random_seed(1701); // fill the values FillerParameter filler_param; @@ -59,7 +60,6 @@ TYPED_TEST(ArgMaxLayerTest, TestSetupMaxVal) { TYPED_TEST(ArgMaxLayerTest, TestCPU) { LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); ArgMaxLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -83,7 +83,6 @@ TYPED_TEST(ArgMaxLayerTest, TestCPU) { TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_out_max_val(true); ArgMaxLayer layer(layer_param); @@ -110,7 +109,6 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { TYPED_TEST(ArgMaxLayerTest, TestCPUTopK) { LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_top_k(this->top_k_); ArgMaxLayer layer(layer_param); @@ -140,7 +138,6 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUTopK) { TYPED_TEST(ArgMaxLayerTest, TestCPUMaxValTopK) { LayerParameter layer_param; - Caffe::set_mode(Caffe::CPU); ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_out_max_val(true); argmax_param->set_top_k(this->top_k_); From 9fc6ff3586ed8d8e341d25c2a2fb2e41c8e22e56 Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Mon, 28 Jul 2014 13:38:38 -0700 Subject: [PATCH 0334/2053] gflags 2.1 bugfix (or rather a hack). --- src/caffe/common.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 5894a961dcc..9eea0cacf12 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -8,6 +8,17 @@ #include "caffe/common.hpp" #include "caffe/util/rng.hpp" +// gflags 2.1 issue: namespace google was changed to gflags without warning. +// Luckily we will be able to use GFLAGS_GFAGS_H_ to detect if it is version +// 2.1. If it is not, we will add a temporary solution to redirect the +// namespace. +// TODO(Yangqing): Once gflags solves the problem in a more elegant way, let's +// remove the following hack. +#ifdef GFLAGS_GFLAGS_H_ +namespace google { +using namespace gflags; +} // namespace google +#endif // GFLAGS_GFLAGS_H_ namespace caffe { @@ -25,7 +36,7 @@ int64_t cluster_seedgen(void) { void GlobalInit(int* pargc, char*** pargv) { // Google flags. - ::gflags::ParseCommandLineFlags(pargc, pargv, true); + ::google::ParseCommandLineFlags(pargc, pargv, true); // Google logging. ::google::InitGoogleLogging(*(pargv)[0]); } From ad5ce91c6d16b25cae911f475867f05279197aaa Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Mon, 28 Jul 2014 13:44:40 -0700 Subject: [PATCH 0335/2053] fixing comment --- src/caffe/common.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 9eea0cacf12..ed46b3aae95 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -10,8 +10,7 @@ // gflags 2.1 issue: namespace google was changed to gflags without warning. // Luckily we will be able to use GFLAGS_GFAGS_H_ to detect if it is version -// 2.1. If it is not, we will add a temporary solution to redirect the -// namespace. +// 2.1. If yes , we will add a temporary solution to redirect the namespace. // TODO(Yangqing): Once gflags solves the problem in a more elegant way, let's // remove the following hack. #ifdef GFLAGS_GFLAGS_H_ From cd1313fac76a2127006e4ab905cc1a522ecd6cbb Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Mon, 28 Jul 2014 14:16:25 -0700 Subject: [PATCH 0336/2053] lint --- src/caffe/common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index ed46b3aae95..1810bb70b61 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -15,7 +15,7 @@ // remove the following hack. #ifdef GFLAGS_GFLAGS_H_ namespace google { -using namespace gflags; +using ::gflags::ParseCommandLineFlags; } // namespace google #endif // GFLAGS_GFLAGS_H_ From cbc507e71fd2615747dd60edf00d7be702aa5aa9 Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Mon, 28 Jul 2014 14:54:03 -0700 Subject: [PATCH 0337/2053] FIX: tests now catch bug reported in #750 (in HDF5 output layer) --- .../test/test_data/generate_sample_data.py | 5 ++++- src/caffe/test/test_data/sample_data.h5 | Bin 10184 -> 10184 bytes .../test/test_data/sample_data_2_gzip.h5 | Bin 9992 -> 9992 bytes src/caffe/test/test_hdf5_output_layer.cpp | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_data/generate_sample_data.py b/src/caffe/test/test_data/generate_sample_data.py index 0d8f5aa98e3..0516eff9158 100644 --- a/src/caffe/test/test_data/generate_sample_data.py +++ b/src/caffe/test/test_data/generate_sample_data.py @@ -14,7 +14,10 @@ data = np.arange(total_size) data = data.reshape(num_rows, num_cols, height, width) data = data.astype('float32') -label = np.arange(num_rows)[:, np.newaxis] + +# We had a bug where data was copied into label, but the tests weren't +# catching it, so let's make label 1-indexed. +label = 1 + np.arange(num_rows)[:, np.newaxis] label = label.astype('float32') print data diff --git a/src/caffe/test/test_data/sample_data.h5 b/src/caffe/test/test_data/sample_data.h5 index a1f923a71ae51bf568810679b01e98ab67adaccf..cb327573cae5de98cb1008eb38a3372c229a499c 100644 GIT binary patch delta 41 wcmX@%f5Lym9cJb?N3U(Z&uq%X4rBx~Fl202WOHSjcz|tl8i$Siljh*<6_>9$?#?#$h8rIf+9J09A4hP5=M^ diff --git a/src/caffe/test/test_data/sample_data_2_gzip.h5 b/src/caffe/test/test_data/sample_data_2_gzip.h5 index 56c0a740ec2a5163d2200826c3748bb930d26b78..b3d187cb1da4445a6a2f5510dc98ba4b25e8ec75 100644 GIT binary patch delta 79 zcmeD1>+sva!@~UL=(WxKEM4MC85`0Q5(*fU6!I7zu{zW+bjULpHY+nXGYDu~Ffr5{ ju^CU^Eq#(5s6Lp1!C~S?*U1Jf5{zmSH_9*OkmUjZ7UCHA delta 79 zcmeD1>+sva!@~S7L2WZXOP9D3LnB+Y!b1iZhdT^MxEp>j2-q_uvAMIcF}gFP=dxa6 jU|^WMTlyqBP<=21gTus)u9FQ|Bp8(^Zj@ilA::CheckBlobEqual(const Blob& b1, for (int c = 0; c < b1.channels(); ++c) { for (int h = 0; h < b1.height(); ++h) { for (int w = 0; w < b1.width(); ++w) { - EXPECT_EQ(b1.data_at(n, c, h, w), b1.data_at(n, c, h, w)); + EXPECT_EQ(b1.data_at(n, c, h, w), b2.data_at(n, c, h, w)); } } } From 65c9c4a4c89f9d5112f265d56cc842e47f698afb Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Mon, 28 Jul 2014 14:55:05 -0700 Subject: [PATCH 0338/2053] FIX: both data and label now copied correctly in HDF5 output layer --- src/caffe/layers/hdf5_output_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index accc9f9ccdd..30e4997854b 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -55,7 +55,7 @@ Dtype HDF5OutputLayer::Forward_cpu(const vector*>& bottom, for (int i = 0; i < bottom[0]->num(); ++i) { caffe_copy(data_datum_dim, &bottom[0]->cpu_data()[i * data_datum_dim], &data_blob_.mutable_cpu_data()[i * data_datum_dim]); - caffe_copy(label_datum_dim, &bottom[0]->cpu_data()[i * label_datum_dim], + caffe_copy(label_datum_dim, &bottom[1]->cpu_data()[i * label_datum_dim], &label_blob_.mutable_cpu_data()[i * label_datum_dim]); } SaveBlobs(); From 416a7a1747fd95bb4564268627bf9a88fbb3928d Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Mon, 28 Jul 2014 15:09:47 -0700 Subject: [PATCH 0339/2053] FIX: updating HDF5 input test for new test data --- src/caffe/test/test_hdf5data_layer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index e606e209661..f3d7c8c6974 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -86,7 +86,8 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { // On even iterations, we're reading the first half of the data. // On odd iterations, we're reading the second half of the data. - int label_offset = (iter % 2 == 0) ? 0 : batch_size; + // NB: label is 1-indexed + int label_offset = 1 + ((iter % 2 == 0) ? 0 : batch_size); int data_offset = (iter % 2 == 0) ? 0 : batch_size * data_size; // Every two iterations we are reading the second file, From dff2023a67dad3e59450dfdaf6c5042c1c6b0ccb Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 28 Jul 2014 15:22:43 -0700 Subject: [PATCH 0340/2053] make "all" the default target "all" is the right default since it builds the library itself. define "everything" after it. --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index a788f5a394c..391d3c08e5c 100644 --- a/Makefile +++ b/Makefile @@ -299,10 +299,10 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo py mat py$(PROJECT) mat$(PROJECT) proto runtest \ superclean supercleanlist supercleanfiles warn everything -everything: all py$(PROJECT) mat$(PROJECT) test warn lint runtest - all: $(NAME) $(STATIC_NAME) tools examples +everything: all py$(PROJECT) mat$(PROJECT) test warn lint runtest + linecount: cloc --read-lang-def=$(PROJECT).cloc src/$(PROJECT)/ From 2e48c3fc4fdfd73d9bfac13829ef78da0e5ad474 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 28 Jul 2014 19:45:09 -0700 Subject: [PATCH 0341/2053] [docs] fix missing glog install cd --- docs/installation.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/installation.md b/docs/installation.md index a74071f8ecb..9cf9700235a 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -76,6 +76,7 @@ The only exceptions being the google flags library and the google logging librar # glog wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz tar zxvf glog-0.3.3.tar.gz + cd glog-0.3.3 ./configure make && make install # gflags From fdb190358ed5045d79a8d7de872aaa9682cc81e5 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 28 Jul 2014 19:49:10 -0700 Subject: [PATCH 0342/2053] [docs] install glog first given incompatibility --- docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index 9cf9700235a..820b918d64a 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -87,7 +87,7 @@ The only exceptions being the google flags library and the google logging librar cmake .. make && make install -Note that glog does not compile with the most recent gflags version (2.1), so before that is solved you will need to build with gflags first. Also note that if you have newer versions of Ubuntu, like 13.04 or 14.04, gflags may be available under apt-get. +Note that glog does not compile with the most recent gflags version (2.1), so before that is solved you will need to build with glog first. Also note that if you have newer versions of Ubuntu, like 13.04 or 14.04, gflags may be available under apt-get. #### OS X From f3140227a8a91aafeac2933c85ff94d40458c876 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 28 Jul 2014 19:53:44 -0700 Subject: [PATCH 0343/2053] [docs] compile gflags with -fPIC for linking --- docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index 820b918d64a..fa29a0e6d90 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -84,7 +84,7 @@ The only exceptions being the google flags library and the google logging librar unzip master.zip cd gflags-master mkdir build && cd build - cmake .. + export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1 make && make install Note that glog does not compile with the most recent gflags version (2.1), so before that is solved you will need to build with glog first. Also note that if you have newer versions of Ubuntu, like 13.04 or 14.04, gflags may be available under apt-get. From edf438a4a6609f2e32eeeca4ce353ff9c9c4a905 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 16 Jun 2014 00:38:50 -0700 Subject: [PATCH 0344/2053] add h/w kernel size, stride, and pad for non-square filtering while keeping everything working as-is. --- src/caffe/proto/caffe.proto | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 5e437dff327..c27e9e5aebe 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -251,10 +251,18 @@ message ConcatParameter { message ConvolutionParameter { optional uint32 num_output = 1; // The number of outputs for the layer optional bool bias_term = 2 [default = true]; // whether to have bias terms - optional uint32 pad = 3 [default = 0]; // The padding size - optional uint32 kernel_size = 4; // The kernel size + // Pad, kernel size, and stride are all given as a single value for equal + // dimensions in height and width or as Y, X pairs. + optional uint32 pad = 3 [default = 0]; // The padding size (equal in Y, X) + optional uint32 pad_h = 9 [default = 0]; // The padding height + optional uint32 pad_w = 10 [default = 0]; // The padding width + optional uint32 kernel_size = 4; // The kernel size (square) + optional uint32 kernel_h = 11; // The kernel height + optional uint32 kernel_w = 12; // The kernel width optional uint32 group = 5 [default = 1]; // The group size for group conv - optional uint32 stride = 6 [default = 1]; // The stride + optional uint32 stride = 6 [default = 1]; // The stride (equal in Y, X) + optional uint32 stride_h = 13; // The stride height + optional uint32 stride_w = 14; // The stride width optional FillerParameter weight_filler = 7; // The filler for the weight optional FillerParameter bias_filler = 8; // The filler for the bias } From 4d44fe7b5ecf94411db34484e7e86e07f6e735ab Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 30 Jun 2014 12:06:27 -0700 Subject: [PATCH 0345/2053] im2col + convolve non-square filters, padding, and stride --- include/caffe/util/im2col.hpp | 20 +++--- include/caffe/vision_layers.hpp | 12 ++-- src/caffe/layers/conv_layer.cpp | 58 ++++++++++++++---- src/caffe/layers/conv_layer.cu | 11 ++-- src/caffe/layers/im2col_layer.cpp | 51 +++++++++++++--- src/caffe/layers/im2col_layer.cu | 6 +- src/caffe/test/test_im2col_kernel.cu | 17 ++++-- src/caffe/util/im2col.cpp | 62 ++++++++++--------- src/caffe/util/im2col.cu | 91 ++++++++++++++++------------ 9 files changed, 216 insertions(+), 112 deletions(-) diff --git a/include/caffe/util/im2col.hpp b/include/caffe/util/im2col.hpp index a649d8cc4e8..c263997ae66 100644 --- a/include/caffe/util/im2col.hpp +++ b/include/caffe/util/im2col.hpp @@ -7,23 +7,27 @@ namespace caffe { template void im2col_cpu(const Dtype* data_im, const int channels, - const int height, const int width, const int ksize, const int pad, - const int stride, Dtype* data_col); + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, Dtype* data_col); template void col2im_cpu(const Dtype* data_col, const int channels, - const int height, const int width, const int psize, const int pad, - const int stride, Dtype* data_im); + const int height, const int width, const int patch_h, const int patch_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, Dtype* data_im); template void im2col_gpu(const Dtype* data_im, const int channels, - const int height, const int width, const int ksize, const int pad, - const int stride, Dtype* data_col); + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, Dtype* data_col); template void col2im_gpu(const Dtype* data_col, const int channels, - const int height, const int width, const int psize, const int pad, - const int stride, Dtype* data_im); + const int height, const int width, const int patch_h, const int patch_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, Dtype* data_im); } // namespace caffe diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 05c7b45e783..80dc37543ee 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -45,11 +45,11 @@ class ConvolutionLayer : public Layer { virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); - int kernel_size_; - int stride_; + int kernel_h_, kernel_w_; + int stride_h_, stride_w_; int num_; int channels_; - int pad_; + int pad_h_, pad_w_; int height_; int width_; int num_output_; @@ -119,12 +119,12 @@ class Im2colLayer : public Layer { virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); - int kernel_size_; - int stride_; + int kernel_h_, kernel_w_; + int stride_h_, stride_w_; int channels_; int height_; int width_; - int pad_; + int pad_h_, pad_w_; }; /* InnerProductLayer diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 11f29e783db..79b040f08d8 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -14,10 +14,42 @@ template void ConvolutionLayer::SetUp(const vector*>& bottom, vector*>* top) { Layer::SetUp(bottom, top); - kernel_size_ = this->layer_param_.convolution_param().kernel_size(); - stride_ = this->layer_param_.convolution_param().stride(); + ConvolutionParameter conv_param = this->layer_param_.convolution_param(); + CHECK(!conv_param.has_kernel_size() != + !(conv_param.has_kernel_h() && conv_param.has_kernel_w())) + << "Filter size is kernel_size OR kernel_h and kernel_w; not both"; + CHECK(conv_param.has_kernel_size() || + (conv_param.has_kernel_h() && conv_param.has_kernel_w())) + << "For non-square filters both kernel_h and kernel_w are required."; + CHECK((!conv_param.has_pad() && conv_param.has_pad_h() + && conv_param.has_pad_w()) + || (!conv_param.has_pad_h() && !conv_param.has_pad_w())) + << "pad is pad OR pad_h and pad_w are required."; + CHECK((!conv_param.has_stride() && conv_param.has_stride_h() + && conv_param.has_stride_w()) + || (!conv_param.has_stride_h() && !conv_param.has_stride_w())) + << "Stride is stride OR stride_h and stride_w are required."; + if (conv_param.has_kernel_size()) { + kernel_h_ = kernel_w_ = conv_param.kernel_size(); + } else { + kernel_h_ = conv_param.kernel_h(); + kernel_w_ = conv_param.kernel_w(); + } + CHECK_GT(kernel_h_, 0) << "Filter dimensions cannot be zero."; + CHECK_GT(kernel_w_, 0) << "Filter dimensions cannot be zero."; + if (!conv_param.has_pad_h()) { + pad_h_ = pad_w_ = conv_param.pad(); + } else { + pad_h_ = conv_param.pad_h(); + pad_w_ = conv_param.pad_w(); + } + if (!conv_param.has_stride_h()) { + stride_h_ = stride_w_ = conv_param.stride(); + } else { + stride_h_ = conv_param.stride_h(); + stride_w_ = conv_param.stride_w(); + } group_ = this->layer_param_.convolution_param().group(); - pad_ = this->layer_param_.convolution_param().pad(); num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); @@ -37,17 +69,18 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, CHECK_EQ(channels_ % group_, 0); // The im2col result buffer would only hold one image at a time to avoid // overly large memory usage. - int height_out = (height_ + 2 * pad_ - kernel_size_) / stride_ + 1; - int width_out = (width_ + 2 * pad_ - kernel_size_) / stride_ + 1; + int height_out = + (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; + int width_out = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; col_buffer_.Reshape( - 1, channels_ * kernel_size_ * kernel_size_, height_out, width_out); + 1, channels_ * kernel_h_ * kernel_w_, height_out, width_out); // Set the parameters CHECK_EQ(num_output_ % group_, 0) << "Number of output should be multiples of group."; bias_term_ = this->layer_param_.convolution_param().bias_term(); // Figure out the dimensions for individual gemms. M_ = num_output_ / group_; - K_ = channels_ * kernel_size_ * kernel_size_ / group_; + K_ = channels_ * kernel_h_ * kernel_w_ / group_; N_ = height_out * width_out; for (int top_id = 0; top_id < top->size(); ++top_id) { (*top)[top_id]->Reshape(num_, num_output_, height_out, width_out); @@ -63,7 +96,7 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, } // Intialize the weight this->blobs_[0].reset(new Blob( - num_output_, channels_ / group_, kernel_size_, kernel_size_)); + num_output_, channels_ / group_, kernel_h_, kernel_w_)); // fill the weights shared_ptr > weight_filler(GetFiller( this->layer_param_.convolution_param().weight_filler())); @@ -99,7 +132,8 @@ Dtype ConvolutionLayer::Forward_cpu(const vector*>& bottom, for (int n = 0; n < num_; ++n) { // First, im2col im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, col_data); + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_data); + stride_h_, stride_w_, col_data); // Second, innerproduct with groups for (int g = 0; g < group_; ++g) { caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, @@ -160,7 +194,7 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, // Since we saved memory in the forward pass by not storing all col // data, we will need to recompute them. im2col_cpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, col_data); + width_, kernel_h_, kernel_w_ pad_h_, pad_w_, stride_h_, stride_w_, col_data); // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { for (int g = 0; g < group_; ++g) { @@ -179,8 +213,8 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, (Dtype)0., col_diff + col_offset * g); } // col2im back to the data - col2im_cpu(col_diff, channels_, height_, width_, kernel_size_, pad_, - stride_, bottom_diff + (*bottom)[i]->offset(n)); + col2im_cpu(col_diff, channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, bottom_diff + (*bottom)[i]->offset(n)); } } } diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index d328fbde9ae..86c047b4307 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -24,7 +24,8 @@ Dtype ConvolutionLayer::Forward_gpu(const vector*>& bottom, for (int n = 0; n < num_; ++n) { // First, im2col im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, col_data); + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_data); + pad_w_, stride_h_, stride_w_, col_data); // Second, innerproduct with groups for (int g = 0; g < group_; ++g) { caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, @@ -65,6 +66,7 @@ void ConvolutionLayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = NULL; // Bias gradient, if necessary. if (bias_term_ && this->param_propagate_down_[1]) { + width_, kernel_h_, kernel_w_, pad_h_, top_diff = top[i]->gpu_diff(); for (int n = 0; n < num_; ++n) { caffe_gpu_gemv(CblasNoTrans, num_output_, N_, @@ -85,7 +87,8 @@ void ConvolutionLayer::Backward_gpu(const vector*>& top, // Since we saved memory in the forward pass by not storing all col // data, we will need to recompute them. im2col_gpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, col_data); + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, col_data); // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { for (int g = 0; g < group_; ++g) { @@ -104,8 +107,8 @@ void ConvolutionLayer::Backward_gpu(const vector*>& top, (Dtype)0., col_diff + col_offset * g); } // col2im back to the data - col2im_gpu(col_diff, channels_, height_, width_, kernel_size_, pad_, - stride_, bottom_diff + (*bottom)[i]->offset(n)); + col2im_gpu(col_diff, channels_, height_, width_, kernel_h_, kernel_w, pad_h_, pad_w_, + stride_h_, stride_w_, bottom_diff + (*bottom)[i]->offset(n)); } } } diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index 2c86412bb15..fabce0a6ad6 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -13,15 +13,48 @@ template void Im2colLayer::SetUp(const vector*>& bottom, vector*>* top) { Layer::SetUp(bottom, top); - kernel_size_ = this->layer_param_.convolution_param().kernel_size(); - stride_ = this->layer_param_.convolution_param().stride(); - pad_ = this->layer_param_.convolution_param().pad(); + ConvolutionParameter conv_param = this->layer_param_.convolution_param(); + CHECK(!conv_param.has_kernel_size() != + !(conv_param.has_kernel_h() && conv_param.has_kernel_w())) + << "Filter size is kernel_size OR kernel_h and kernel_w; not both"; + CHECK(conv_param.has_kernel_size() || + (conv_param.has_kernel_h() && conv_param.has_kernel_w())) + << "For non-square filters both kernel_h and kernel_w are required."; + CHECK((!conv_param.has_pad() && conv_param.has_pad_h() + && conv_param.has_pad_w()) + || (!conv_param.has_pad_h() && !conv_param.has_pad_w())) + << "pad is pad OR pad_h and pad_w are required."; + CHECK((!conv_param.has_stride() && conv_param.has_stride_h() + && conv_param.has_stride_w()) + || (!conv_param.has_stride_h() && !conv_param.has_stride_w())) + << "Stride is stride OR stride_h and stride_w are required."; + if (conv_param.has_kernel_size()) { + kernel_h_ = kernel_w_ = conv_param.kernel_size(); + } else { + kernel_h_ = conv_param.kernel_h(); + kernel_w_ = conv_param.kernel_w(); + } + CHECK_GT(kernel_h_, 0) << "Filter dimensions cannot be zero."; + CHECK_GT(kernel_w_, 0) << "Filter dimensions cannot be zero."; + if (!conv_param.has_pad_h()) { + pad_h_ = pad_w_ = conv_param.pad(); + } else { + pad_h_ = conv_param.pad_h(); + pad_w_ = conv_param.pad_w(); + } + if (!conv_param.has_stride_h()) { + stride_h_ = stride_w_ = conv_param.stride(); + } else { + stride_h_ = conv_param.stride_h(); + stride_w_ = conv_param.stride_w(); + } channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); - (*top)[0]->Reshape(bottom[0]->num(), channels_ * kernel_size_ * kernel_size_, - (height_ + 2 * pad_ - kernel_size_) / stride_ + 1, - (width_ + 2 * pad_ - kernel_size_) / stride_ + 1); + (*top)[0]->Reshape( + bottom[0]->num(), channels_ * kernel_h_ * kernel_w_, + (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1, + (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1); } template @@ -31,7 +64,8 @@ Dtype Im2colLayer::Forward_cpu(const vector*>& bottom, Dtype* top_data = (*top)[0]->mutable_cpu_data(); for (int n = 0; n < bottom[0]->num(); ++n) { im2col_cpu(bottom_data + bottom[0]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, top_data + (*top)[0]->offset(n)); + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, top_data + (*top)[0]->offset(n)); } return Dtype(0.); } @@ -43,7 +77,8 @@ void Im2colLayer::Backward_cpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); for (int n = 0; n < top[0]->num(); ++n) { col2im_cpu(top_diff + top[0]->offset(n), channels_, height_, width_, - kernel_size_, pad_, stride_, bottom_diff + (*bottom)[0]->offset(n)); + kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, bottom_diff + (*bottom)[0]->offset(n)); } } diff --git a/src/caffe/layers/im2col_layer.cu b/src/caffe/layers/im2col_layer.cu index 9cfb74e815c..84439742250 100644 --- a/src/caffe/layers/im2col_layer.cu +++ b/src/caffe/layers/im2col_layer.cu @@ -16,7 +16,8 @@ Dtype Im2colLayer::Forward_gpu(const vector*>& bottom, Dtype* top_data = (*top)[0]->mutable_gpu_data(); for (int n = 0; n < bottom[0]->num(); ++n) { im2col_gpu(bottom_data + bottom[0]->offset(n), channels_, height_, - width_, kernel_size_, pad_, stride_, top_data + (*top)[0]->offset(n)); + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, top_data + (*top)[0]->offset(n)); } return Dtype(0.); } @@ -28,7 +29,8 @@ void Im2colLayer::Backward_gpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); for (int n = 0; n < top[0]->num(); ++n) { col2im_gpu(top_diff + top[0]->offset(n), channels_, height_, width_, - kernel_size_, pad_, stride_, bottom_diff + (*bottom)[0]->offset(n)); + kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, bottom_diff + (*bottom)[0]->offset(n)); } } diff --git a/src/caffe/test/test_im2col_kernel.cu b/src/caffe/test/test_im2col_kernel.cu index 5671968b56d..37d1a1523af 100644 --- a/src/caffe/test/test_im2col_kernel.cu +++ b/src/caffe/test/test_im2col_kernel.cu @@ -17,8 +17,10 @@ namespace caffe { // Forward declare kernel functions template __global__ void im2col_gpu_kernel(const int n, const Dtype* data_im, - const int height, const int width, const int ksize, const int pad, - const int stride, const int height_col, const int width_col, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + const int height_col, const int width_col, Dtype* data_col); extern cudaDeviceProp CAFFE_TEST_CUDA_PROP; @@ -87,8 +89,10 @@ TYPED_TEST(Im2colKernelTest, TestGPU) { // CPU Version for (int n = 0; n < this->blob_bottom_->num(); ++n) { im2col_cpu(this->blob_bottom_->cpu_data() + this->blob_bottom_->offset(n), - this->channels_, this->height_, this->width_, this->kernel_size_, - this->pad_, this->stride_, cpu_data + this->blob_top_cpu_->offset(n)); + this->channels_, this->height_, this->width_, + this->kernel_size_, this->kernel_size_, this->pad_, this->pad_, + this->stride_, this->stride_, + cpu_data + this->blob_top_cpu_->offset(n)); } // GPU version @@ -102,8 +106,9 @@ TYPED_TEST(Im2colKernelTest, TestGPU) { // NOLINT_NEXT_LINE(whitespace/operators) im2col_gpu_kernel<<>>( num_kernels, bottom_data + this->blob_bottom_->offset(n), - this->height_, this->width_, this->kernel_size_, this->pad_, - this->stride_, this->height_col_, this->width_col_, + this->height_, this->width_, this->kernel_size_, this->kernel_size_, + this->pad_, this->pad_, this->stride_, this->stride_, + this->height_col_, this->width_col_, top_data + this->blob_top_->offset(n)); CUDA_POST_KERNEL_CHECK; } diff --git a/src/caffe/util/im2col.cpp b/src/caffe/util/im2col.cpp index ce4e18848bf..ca1dc797985 100644 --- a/src/caffe/util/im2col.cpp +++ b/src/caffe/util/im2col.cpp @@ -11,19 +11,21 @@ namespace caffe { template void im2col_cpu(const Dtype* data_im, const int channels, - const int height, const int width, const int ksize, const int pad, - const int stride, Dtype* data_col) { - int height_col = (height + 2 * pad - ksize) / stride + 1; - int width_col = (width + 2 * pad - ksize) / stride + 1; - int channels_col = channels * ksize * ksize; + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + Dtype* data_col) { + int height_col = (height + 2 * pad_h - kernel_h) / stride_h + 1; + int width_col = (width + 2 * pad_w - kernel_w) / stride_w + 1; + int channels_col = channels * kernel_h * kernel_w; for (int c = 0; c < channels_col; ++c) { - int w_offset = c % ksize; - int h_offset = (c / ksize) % ksize; - int c_im = c / ksize / ksize; + int w_offset = c % kernel_h; + int h_offset = (c / kernel_h) % kernel_h; + int c_im = c / kernel_h / kernel_w; for (int h = 0; h < height_col; ++h) { for (int w = 0; w < width_col; ++w) { - int h_pad = h * stride - pad + h_offset; - int w_pad = w * stride - pad + w_offset; + int h_pad = h * stride_h - pad_h + h_offset; + int w_pad = w * stride_w - pad_w + w_offset; if (h_pad >= 0 && h_pad < height && w_pad >= 0 && w_pad < width) data_col[(c * height_col + h) * width_col + w] = data_im[(c_im * height + h_pad) * width + w_pad]; @@ -36,28 +38,32 @@ void im2col_cpu(const Dtype* data_im, const int channels, // Explicit instantiation template void im2col_cpu(const float* data_im, const int channels, - const int height, const int width, const int ksize, const int pad, - const int stride, float* data_col); + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, float* data_col); template void im2col_cpu(const double* data_im, const int channels, - const int height, const int width, const int ksize, const int pad, - const int stride, double* data_col); + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, double* data_col); template void col2im_cpu(const Dtype* data_col, const int channels, - const int height, const int width, const int ksize, const int pad, + const int height, const int width, const int patch_h, const int patch_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, const int stride, Dtype* data_im) { caffe_set(height * width * channels, Dtype(0), data_im); - int height_col = (height + 2 * pad - ksize) / stride + 1; - int width_col = (width + 2 * pad - ksize) / stride + 1; - int channels_col = channels * ksize * ksize; + int height_col = (height + 2 * pad_h - patch_h) / stride_h + 1; + int width_col = (width + 2 * pad_w - patch_w) / stride_w + 1; + int channels_col = channels * patch_h * patch_w; for (int c = 0; c < channels_col; ++c) { - int w_offset = c % ksize; - int h_offset = (c / ksize) % ksize; - int c_im = c / ksize / ksize; + int w_offset = c % patch_h; + int h_offset = (c / patch_h) % patch_h; + int c_im = c / patch_h / patch_w; for (int h = 0; h < height_col; ++h) { for (int w = 0; w < width_col; ++w) { - int h_pad = h * stride - pad + h_offset; - int w_pad = w * stride - pad + w_offset; + int h_pad = h * stride_h - pad_h + h_offset; + int w_pad = w * stride_w - pad_w + w_offset; if (h_pad >= 0 && h_pad < height && w_pad >= 0 && w_pad < width) data_im[(c_im * height + h_pad) * width + w_pad] += data_col[(c * height_col + h) * width_col + w]; @@ -68,10 +74,12 @@ void col2im_cpu(const Dtype* data_col, const int channels, // Explicit instantiation template void col2im_cpu(const float* data_col, const int channels, - const int height, const int width, const int psize, const int pad, - const int stride, float* data_im); + const int height, const int width, const int patch_h, const int patch_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, float* data_im); template void col2im_cpu(const double* data_col, const int channels, - const int height, const int width, const int psize, const int pad, - const int stride, double* data_im); + const int height, const int width, const int patch_h, const int patch_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, double* data_im); } // namespace caffe diff --git a/src/caffe/util/im2col.cu b/src/caffe/util/im2col.cu index 79faa6cb5c9..b565d2d3843 100644 --- a/src/caffe/util/im2col.cu +++ b/src/caffe/util/im2col.cu @@ -12,23 +12,25 @@ namespace caffe { template __global__ void im2col_gpu_kernel(const int n, const Dtype* data_im, - const int height, const int width, const int ksize, const int pad, - const int stride, const int height_col, const int width_col, + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + const int height_col, const int width_col, Dtype* data_col) { CUDA_KERNEL_LOOP(index, n) { int w_out = index % width_col; int h_index = index / width_col; int h_out = h_index % height_col; int channel_in = h_index / height_col; - int channel_out = channel_in * ksize * ksize; - int h_in = h_out * stride - pad; - int w_in = w_out * stride - pad; + int channel_out = channel_in * kernel_h * kernel_w; + int h_in = h_out * stride_h - pad_h; + int w_in = w_out * stride_w - pad_w; Dtype* data_col_ptr = data_col; data_col_ptr += (channel_out * height_col + h_out) * width_col + w_out; const Dtype* data_im_ptr = data_im; data_im_ptr += (channel_in * height + h_in) * width + w_in; - for (int i = 0; i < ksize; ++i) { - for (int j = 0; j < ksize; ++j) { + for (int i = 0; i < kernel_h; ++i) { + for (int j = 0; j < kernel_w; ++j) { int h = h_in + i; int w = w_in + j; *data_col_ptr = (h >= 0 && w >= 0 && h < height && w < width) ? @@ -41,17 +43,20 @@ __global__ void im2col_gpu_kernel(const int n, const Dtype* data_im, template void im2col_gpu(const Dtype* data_im, const int channels, - const int height, const int width, const int ksize, const int pad, - const int stride, Dtype* data_col) { + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + Dtype* data_col) { // We are going to launch channels * height_col * width_col kernels, each // kernel responsible for copying a single-channel grid. - int height_col = (height + 2 * pad - ksize) / stride + 1; - int width_col = (width + 2 * pad - ksize) / stride + 1; + int height_col = (height + 2 * pad_h - kernel_h) / stride_h + 1; + int width_col = (width + 2 * pad_w - kernel_w) / stride_w + 1; int num_kernels = channels * height_col * width_col; // NOLINT_NEXT_LINE(whitespace/operators) im2col_gpu_kernel<<>>( - num_kernels, data_im, height, width, ksize, pad, stride, height_col, + num_kernels, data_im, height, width, kernel_h, kernel_w, pad_h, + pad_w, stride_h, stride_w, height_col, width_col, data_col); CUDA_POST_KERNEL_CHECK; } @@ -59,40 +64,46 @@ void im2col_gpu(const Dtype* data_im, const int channels, // Explicit instantiation template void im2col_gpu(const float* data_im, const int channels, - const int height, const int width, const int ksize, const int pad, - const int stride, float* data_col); + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + float* data_col); template void im2col_gpu(const double* data_im, const int channels, - const int height, const int width, const int ksize, const int pad, - const int stride, double* data_col); + const int height, const int width, const int kernel_h, const int kernel_w, + const int pad_h, const int pad_w, const int stride_h, const int stride_w, + double* data_col); template __global__ void col2im_gpu_kernel(const int n, const Dtype* data_col, - const int height, const int width, const int channels, const int ksize, - const int pad, const int stride, const int height_col, const int width_col, + const int height, const int width, const int channels, + const int patch_h, const int patch_w, + const int pad_h, const int pad_w, + const int stride_h, const int stride_w, + const int height_col, const int width_col, Dtype* data_im) { CUDA_KERNEL_LOOP(index, n) { Dtype val = 0; - int w = index % width + pad; - int h = (index / width) % height + pad; + int w = index % width + pad_w; + int h = (index / width) % height + pad_h; int c = index / (width * height); // compute the start and end of the output - int w_col_start = (w < ksize) ? 0 : (w - ksize) / stride + 1; - int w_col_end = min(w / stride + 1, width_col); - int h_col_start = (h < ksize) ? 0 : (h - ksize) / stride + 1; - int h_col_end = min(h / stride + 1, height_col); + int w_col_start = (w < patch_w) ? 0 : (w - patch_w) / stride_w + 1; + int w_col_end = min(w / stride_w + 1, width_col); + int h_col_start = (h < patch_h) ? 0 : (h - patch_h) / stride_h + 1; + int h_col_end = min(h / stride_h + 1, height_col); /* for (int h_col = h_col_start; h_col < h_col_end; ++h_col) { for (int w_col = w_col_start; w_col < w_col_end; ++w_col) { // the col location: [c * width * height + h_out, w_out] - int c_col = c * ksize * ksize + (h - h_col * stride) * ksize + (w - w_col * stride); + int c_col = c * patch_h * patch_w + (h - h_col * stride_h) * ksize + + (w - w_col * stride_w); val += data_col[(c_col * height_col + h_col) * width_col + w_col]; } } */ // equivalent implementation - int offset = (c * ksize * ksize + h * ksize + w) * height_col * width_col; - int coeff_h_col = (1 - stride * ksize * height_col) * width_col; - int coeff_w_col = (1 - stride * height_col * width_col); + int offset = (c * patch_h * patch_w + h * patch_h + w) * height_col * width_col; + int coeff_h_col = (1 - stride_h * patch_w * height_col) * width_col; + int coeff_w_col = (1 - stride_w * height_col * width_col); for (int h_col = h_col_start; h_col < h_col_end; ++h_col) { for (int w_col = w_col_start; w_col < w_col_end; ++w_col) { val += data_col[offset + h_col * coeff_h_col + w_col * coeff_w_col]; @@ -104,29 +115,31 @@ __global__ void col2im_gpu_kernel(const int n, const Dtype* data_col, template void col2im_gpu(const Dtype* data_col, const int channels, - const int height, const int width, const int ksize, const int pad, - const int stride, Dtype* data_im) { - int height_col = (height + 2 * pad - ksize) / stride + 1; - int width_col = (width + 2 * pad - ksize) / stride + 1; + const int height, const int width, const int patch_h, const int patch_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, Dtype* data_im) { + int height_col = (height + 2 * pad_h - patch_h) / stride_h + 1; + int width_col = (width + 2 * pad_w - patch_w) / stride_w + 1; int num_kernels = channels * height * width; // To avoid involving atomic operations, we will launch one kernel per // bottom dimension, and then in the kernel add up the top dimensions. // NOLINT_NEXT_LINE(whitespace/operators) col2im_gpu_kernel<<>>( - num_kernels, data_col, height, width, channels, ksize, pad, stride, + num_kernels, data_col, height, width, channels, patch_h, patch_w, + pad_h, pad_w, stride_h, stride_w, height_col, width_col, data_im); CUDA_POST_KERNEL_CHECK; } - // Explicit instantiation template void col2im_gpu(const float* data_col, const int channels, - const int height, const int width, const int psize, const int pad, - const int stride, float* data_im); + const int height, const int width, const int patch_h, const int patch_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, float* data_im); template void col2im_gpu(const double* data_col, const int channels, - const int height, const int width, const int psize, const int pad, - const int stride, double* data_im); - + const int height, const int width, const int patch_h, const int patch_w, + const int pad_h, const int pad_w, const int stride_h, + const int stride_w, double* data_im); } // namespace caffe From 909e4d83e3f19df92316b7bbd85225ef2a3156c3 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 17 Jun 2014 22:08:00 -0700 Subject: [PATCH 0346/2053] test rectangular im2col --- src/caffe/test/test_im2col_layer.cpp | 33 ++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/caffe/test/test_im2col_layer.cpp b/src/caffe/test/test_im2col_layer.cpp index a40f59df2e8..0463cee7040 100644 --- a/src/caffe/test/test_im2col_layer.cpp +++ b/src/caffe/test/test_im2col_layer.cpp @@ -83,4 +83,37 @@ TYPED_TEST(Im2colLayerTest, TestGradient) { } +TYPED_TEST(Im2colLayerTest, TestRect) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_h(5); + convolution_param->set_kernel_w(3); + convolution_param->set_stride(2); + Im2colLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // We are lazy and will only check the top left block + for (int c = 0; c < 45; ++c) { + EXPECT_EQ(this->blob_top_->data_at(0, c, 0, 0), + this->blob_bottom_->data_at(0, (c / 15), (c / 5) % 5, c % 5)); + } +} + + +TYPED_TEST(Im2colLayerTest, TestRectGradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_h(5); + convolution_param->set_kernel_w(3); + convolution_param->set_stride(2); + Im2colLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + } // namespace caffe From ca4482c5ae0ef7ec62a55ebdc920519eb2f63cd5 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 28 Jul 2014 21:47:34 -0700 Subject: [PATCH 0347/2053] fix GPU indexing Thanks to @ejaz-izy's debugging in https://github.com/BVLC/caffe/pull/505#issuecomment-50287608 --- src/caffe/layers/conv_layer.cpp | 10 ++++++---- src/caffe/layers/conv_layer.cu | 10 +++++----- src/caffe/test/test_im2col_layer.cpp | 2 +- src/caffe/util/im2col.cpp | 10 +++++----- src/caffe/util/im2col.cu | 3 ++- 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 79b040f08d8..c7949e049cd 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -132,8 +132,8 @@ Dtype ConvolutionLayer::Forward_cpu(const vector*>& bottom, for (int n = 0; n < num_; ++n) { // First, im2col im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_data); - stride_h_, stride_w_, col_data); + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, + col_data); // Second, innerproduct with groups for (int g = 0; g < group_; ++g) { caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, @@ -194,7 +194,8 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, // Since we saved memory in the forward pass by not storing all col // data, we will need to recompute them. im2col_cpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_ pad_h_, pad_w_, stride_h_, stride_w_, col_data); + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, col_data); // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { for (int g = 0; g < group_; ++g) { @@ -213,7 +214,8 @@ void ConvolutionLayer::Backward_cpu(const vector*>& top, (Dtype)0., col_diff + col_offset * g); } // col2im back to the data - col2im_cpu(col_diff, channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, + col2im_cpu(col_diff, channels_, height_, width_, + kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, bottom_diff + (*bottom)[i]->offset(n)); } } diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 86c047b4307..fc114b0b328 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -24,8 +24,8 @@ Dtype ConvolutionLayer::Forward_gpu(const vector*>& bottom, for (int n = 0; n < num_; ++n) { // First, im2col im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_data); - pad_w_, stride_h_, stride_w_, col_data); + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, + col_data); // Second, innerproduct with groups for (int g = 0; g < group_; ++g) { caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, M_, N_, K_, @@ -66,7 +66,6 @@ void ConvolutionLayer::Backward_gpu(const vector*>& top, const Dtype* top_diff = NULL; // Bias gradient, if necessary. if (bias_term_ && this->param_propagate_down_[1]) { - width_, kernel_h_, kernel_w_, pad_h_, top_diff = top[i]->gpu_diff(); for (int n = 0; n < num_; ++n) { caffe_gpu_gemv(CblasNoTrans, num_output_, N_, @@ -107,8 +106,9 @@ void ConvolutionLayer::Backward_gpu(const vector*>& top, (Dtype)0., col_diff + col_offset * g); } // col2im back to the data - col2im_gpu(col_diff, channels_, height_, width_, kernel_h_, kernel_w, pad_h_, pad_w_, - stride_h_, stride_w_, bottom_diff + (*bottom)[i]->offset(n)); + col2im_gpu(col_diff, channels_, height_, width_, + kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, + bottom_diff + (*bottom)[i]->offset(n)); } } } diff --git a/src/caffe/test/test_im2col_layer.cpp b/src/caffe/test/test_im2col_layer.cpp index 0463cee7040..aaee3d81bf7 100644 --- a/src/caffe/test/test_im2col_layer.cpp +++ b/src/caffe/test/test_im2col_layer.cpp @@ -97,7 +97,7 @@ TYPED_TEST(Im2colLayerTest, TestRect) { // We are lazy and will only check the top left block for (int c = 0; c < 45; ++c) { EXPECT_EQ(this->blob_top_->data_at(0, c, 0, 0), - this->blob_bottom_->data_at(0, (c / 15), (c / 5) % 5, c % 5)); + this->blob_bottom_->data_at(0, (c / 15), (c / 3) % 5, c % 3)); } } diff --git a/src/caffe/util/im2col.cpp b/src/caffe/util/im2col.cpp index ca1dc797985..01df8c89182 100644 --- a/src/caffe/util/im2col.cpp +++ b/src/caffe/util/im2col.cpp @@ -19,8 +19,8 @@ void im2col_cpu(const Dtype* data_im, const int channels, int width_col = (width + 2 * pad_w - kernel_w) / stride_w + 1; int channels_col = channels * kernel_h * kernel_w; for (int c = 0; c < channels_col; ++c) { - int w_offset = c % kernel_h; - int h_offset = (c / kernel_h) % kernel_h; + int w_offset = c % kernel_w; + int h_offset = (c / kernel_w) % kernel_h; int c_im = c / kernel_h / kernel_w; for (int h = 0; h < height_col; ++h) { for (int w = 0; w < width_col; ++w) { @@ -51,14 +51,14 @@ void col2im_cpu(const Dtype* data_col, const int channels, const int height, const int width, const int patch_h, const int patch_w, const int pad_h, const int pad_w, const int stride_h, const int stride_w, - const int stride, Dtype* data_im) { + Dtype* data_im) { caffe_set(height * width * channels, Dtype(0), data_im); int height_col = (height + 2 * pad_h - patch_h) / stride_h + 1; int width_col = (width + 2 * pad_w - patch_w) / stride_w + 1; int channels_col = channels * patch_h * patch_w; for (int c = 0; c < channels_col; ++c) { - int w_offset = c % patch_h; - int h_offset = (c / patch_h) % patch_h; + int w_offset = c % patch_w; + int h_offset = (c / patch_w) % patch_h; int c_im = c / patch_h / patch_w; for (int h = 0; h < height_col; ++h) { for (int w = 0; w < width_col; ++w) { diff --git a/src/caffe/util/im2col.cu b/src/caffe/util/im2col.cu index b565d2d3843..653ce49e7f8 100644 --- a/src/caffe/util/im2col.cu +++ b/src/caffe/util/im2col.cu @@ -101,7 +101,8 @@ __global__ void col2im_gpu_kernel(const int n, const Dtype* data_col, } */ // equivalent implementation - int offset = (c * patch_h * patch_w + h * patch_h + w) * height_col * width_col; + int offset = + (c * patch_h * patch_w + h * patch_w + w) * height_col * width_col; int coeff_h_col = (1 - stride_h * patch_w * height_col) * width_col; int coeff_w_col = (1 - stride_w * height_col * width_col); for (int h_col = h_col_start; h_col < h_col_end; ++h_col) { From dadeb990ade280de90a8d4e0295005ee8d895189 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 28 Jul 2014 22:43:06 -0700 Subject: [PATCH 0348/2053] test non-square filters by separable convolution of Sobel operator Compute the G_x kernel of the Sobel operator as a full filter and as separable filters to check the rectangular filter output. --- src/caffe/test/test_convolution_layer.cpp | 96 +++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index d0522b13cd0..f3cfb680990 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -172,6 +172,102 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) { } } +TYPED_TEST(ConvolutionLayerTest, TestSobelConvolution) { + // Test separable convolution by computing the Sobel operator + // as a single filter then comparing the result + // as the convolution of two rectangular filters. + typedef typename TypeParam::Dtype Dtype; + // Fill bottoms with identical Gaussian noise. + shared_ptr > filler; + FillerParameter filler_param; + filler_param.set_value(1.); + filler.reset(new GaussianFiller(filler_param)); + filler->Fill(this->blob_bottom_); + this->blob_bottom_2_->CopyFrom(*this->blob_bottom_); + // Compute Sobel G_x operator as 3 x 3 convolution. + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_size(3); + convolution_param->set_stride(2); + convolution_param->set_num_output(1); + convolution_param->set_bias_term(false); + shared_ptr > layer( + new ConvolutionLayer(layer_param)); + layer->blobs().resize(1); + layer->blobs()[0].reset(new Blob(1, 3, 3, 3)); + Dtype* weights = layer->blobs()[0]->mutable_cpu_data(); + for (int c = 0; c < 3; ++c) { + int i = c * 9; // 3 x 3 filter + weights[i + 0] = -1; + weights[i + 1] = 0; + weights[i + 2] = 1; + weights[i + 3] = -2; + weights[i + 4] = 0; + weights[i + 5] = 2; + weights[i + 6] = -1; + weights[i + 7] = 0; + weights[i + 8] = 1; + } + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Compute Sobel G_x operator as separable 3 x 1 and 1 x 3 convolutions. + // (1) the [1 2 1] column filter + vector*> sep_blob_bottom_vec; + vector*> sep_blob_top_vec; + shared_ptr > blob_sep(new Blob()); + sep_blob_bottom_vec.push_back(this->blob_bottom_2_); + sep_blob_top_vec.push_back(this->blob_top_2_); + convolution_param->clear_kernel_size(); + convolution_param->clear_stride(); + convolution_param->set_kernel_h(3); + convolution_param->set_kernel_w(1); + convolution_param->set_stride_h(2); + convolution_param->set_stride_w(1); + convolution_param->set_num_output(1); + convolution_param->set_bias_term(false); + layer.reset(new ConvolutionLayer(layer_param)); + layer->blobs().resize(1); + layer->blobs()[0].reset(new Blob(1, 3, 3, 1)); + Dtype* weights_1 = layer->blobs()[0]->mutable_cpu_data(); + for (int c = 0; c < 3; ++c) { + int i = c * 3; // 3 x 1 filter + weights_1[i + 0] = 1; + weights_1[i + 1] = 2; + weights_1[i + 2] = 1; + } + layer->SetUp(sep_blob_bottom_vec, &(sep_blob_top_vec)); + layer->Forward(sep_blob_bottom_vec, &(sep_blob_top_vec)); + // (2) the [-1 0 1] row filter + blob_sep->CopyFrom(*this->blob_top_2_, false, true); + sep_blob_bottom_vec.clear(); + sep_blob_bottom_vec.push_back(blob_sep.get()); + convolution_param->set_kernel_h(1); + convolution_param->set_kernel_w(3); + convolution_param->set_stride_h(1); + convolution_param->set_stride_w(2); + convolution_param->set_num_output(1); + convolution_param->set_bias_term(false); + layer.reset(new ConvolutionLayer(layer_param)); + layer->blobs().resize(1); + layer->blobs()[0].reset(new Blob(1, 3, 1, 3)); + Dtype* weights_2 = layer->blobs()[0]->mutable_cpu_data(); + for (int c = 0; c < 3; ++c) { + int i = c * 3; // 1 x 3 filter + weights_2[i + 0] = -1; + weights_2[i + 1] = 0; + weights_2[i + 2] = 1; + } + layer->SetUp(sep_blob_bottom_vec, &(sep_blob_top_vec)); + layer->Forward(sep_blob_bottom_vec, &(sep_blob_top_vec)); + // Test equivalence of full and separable filters. + const Dtype* top_data = this->blob_top_->cpu_data(); + const Dtype* sep_top_data = this->blob_top_2_->cpu_data(); + for (int i = 0; i < this->blob_top_->count(); ++i) { + EXPECT_NEAR(top_data[i], sep_top_data[i], 1e-4); + } +} + TYPED_TEST(ConvolutionLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; From 374218a07a4bbe9826da8b0d9edf2e6c51042224 Mon Sep 17 00:00:00 2001 From: TANGUY Arnaud Date: Tue, 29 Jul 2014 14:08:42 +0200 Subject: [PATCH 0349/2053] Fix choice MKL directory from Makefile.config --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 391d3c08e5c..8e8ebedbc57 100644 --- a/Makefile +++ b/Makefile @@ -247,7 +247,7 @@ ifeq ($(BLAS), mkl) # MKL LIBRARIES += mkl_rt COMMON_FLAGS += -DUSE_MKL - MKL_DIR = /opt/intel/mkl + MKL_DIR ?= /opt/intel/mkl BLAS_INCLUDE ?= $(MKL_DIR)/include BLAS_LIB ?= $(MKL_DIR)/lib $(MKL_DIR)/lib/intel64 else ifeq ($(BLAS), open) From 5271c029a2d0d81be4bb2a9553344d2b1d431eca Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 29 Jul 2014 09:21:39 -0700 Subject: [PATCH 0350/2053] [example] standardize imagenet leveldb names --- examples/imagenet/create_imagenet.sh | 4 ++-- examples/imagenet/readme.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/imagenet/create_imagenet.sh b/examples/imagenet/create_imagenet.sh index a1bcb7bfc5a..11fc0999059 100755 --- a/examples/imagenet/create_imagenet.sh +++ b/examples/imagenet/create_imagenet.sh @@ -10,11 +10,11 @@ echo "Creating leveldb..." GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \ /path/to/imagenet/train/ \ $DATA/train.txt \ - imagenet_train_leveldb 1 + ilsvrc12_train_leveldb 1 GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \ /path/to/imagenet/val/ \ $DATA/val.txt \ - imagenet_val_leveldb 1 + ilsvrc12_val_leveldb 1 echo "Done." diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index cdc8ecb78c4..734ce74d92f 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -41,7 +41,7 @@ You will also need to resize the images to 256x256: we do not explicitly do this Go to `$CAFFE_ROOT/examples/imagenet/` for the rest of this guide. -Take a look at `create_imagenet.sh`. Set the paths to the train and val dirs as needed. Now simply create the leveldbs with `./create_imagenet.sh`. Note that `imagenet_train_leveldb` and `imagenet_val_leveldb` should not exist before this execution. It will be created by the script. `GLOG_logtostderr=1` simply dumps more information for you to inspect, and you can safely ignore it. +Take a look at `create_imagenet.sh`. Set the paths to the train and val dirs as needed. Now simply create the leveldbs with `./create_imagenet.sh`. Note that `ilsvrc12_train_leveldb` and `ilsvrc12_val_leveldb` should not exist before this execution. It will be created by the script. `GLOG_logtostderr=1` simply dumps more information for you to inspect, and you can safely ignore it. Compute Image Mean ------------------ From c2b74c3cf66b229c0ad926cf052c7e7ed522038d Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 17 Jul 2014 20:12:44 -0700 Subject: [PATCH 0351/2053] Add NetState message with phase, level, stage; NetStateRule message with filtering rules for Layers. --- src/caffe/proto/caffe.proto | 95 +++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 14 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index c27e9e5aebe..d2f61e57f34 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -56,24 +56,55 @@ message NetParameter { // If set False, then whether to carry out backward is determined // automatically according to the net structure and learning rates. optional bool force_backward = 5 [default = false]; + // The current "state" of the network, including the phase, level, and stage. + // Some layers may be included/excluded depending on this state and the states + // specified in the layers' include and exclude fields. + optional NetState state = 6; } +// NOTE +// Update the next available ID when you add a new SolverParameter field. +// +// SolverParameter next available ID: 27 (last added: test_state) message SolverParameter { - // {train,test}_net specify a path to a file containing the {train,test} net - // parameters; {train,test}_net_param specify the net parameters directly - // inside the SolverParameter. + ////////////////////////////////////////////////////////////////////////////// + // Specifying the train and test networks // - // Only either train_net or train_net_param (not both) should be specified. - // You may specify 0 or more test_net and/or test_net_param. All - // nets specified using test_net_param will be tested first, followed by all - // nets specified using test_net (each processed in the order specified in - // the prototxt). - optional string train_net = 1; // The proto filename for the train net. - repeated string test_net = 2; // The proto filenames for the test nets. - optional NetParameter train_net_param = 21; // Full params for the train net. - repeated NetParameter test_net_param = 22; // Full params for the test nets. - // The number of iterations for each testing phase. + // Exactly one train net must be specified using one of the following fields: + // train_net_param, train_net, net_param, net + // One or more test nets may be specified using any of the following fields: + // test_net_param, test_net, net_param, net + // If more than one test net field is specified (e.g., both net and + // test_net are specified), they will be evaluated in the field order given + // above: (1) test_net_param, (2) test_net, (3) net_param/net. + // A test_iter must be specified for each test_net. + // A test_level and/or a test_stage may also be specified for each test_net. + ////////////////////////////////////////////////////////////////////////////// + + // Proto filename for the train net, possibly combined with one or more + // test nets. + optional string net = 24; + // Inline train net param, possibly combined with one or more test nets. + optional NetParameter net_param = 25; + + optional string train_net = 1; // Proto filename for the train net. + repeated string test_net = 2; // Proto filenames for the test nets. + optional NetParameter train_net_param = 21; // Inline train net params. + repeated NetParameter test_net_param = 22; // Inline test net params. + + // The states for the train/test nets. Must be unspecified or + // specified once per net. + // + // By default, all states will have solver = true; + // train_state will have phase = TRAIN, + // and all test_state's will have phase = TEST. + // Other defaults are set according to the NetState defaults. + optional NetState train_state = 26; + repeated NetState test_state = 27; + + // The number of iterations for each test net. repeated int32 test_iter = 3; + // The number of iterations between two testing phases. optional int32 test_interval = 4 [default = 0]; optional bool test_compute_loss = 19 [default = false]; @@ -118,15 +149,51 @@ message SolverState { repeated BlobProto history = 3; // The history for sgd solvers } +enum Phase { + TRAIN = 0; + TEST = 1; +} + +message NetState { + optional Phase phase = 1 [default = TEST]; + optional int32 level = 2 [default = 0]; + repeated string stage = 3; +} + +message NetStateRule { + // Set phase to require the NetState have a particular phase (TRAIN or TEST) + // to meet this rule. + optional Phase phase = 1; + + // Set the minimum and/or maximum levels in which the layer should be used. + // Leave undefined to meet the rule regardless of level. + optional int32 min_level = 2; + optional int32 max_level = 3; + + // A customizable set of stages. + // The net must have ALL of the specified stages to meet the rule. + // (Use multiple NetStateRules to specify conjunctions of stages.) + repeated string stage = 4; +} + // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 32 (last added: slice_param) +// LayerParameter next available ID: 34 (last added: exclude) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs optional string name = 4; // the layer name + // Rules controlling whether and when a layer is included in the network, + // based on the current NetState. You may specify a non-zero number of rules + // to include OR exclude, but not both. If no include or exclude rules are + // specified, the layer is always included. If the current NetState meets + // ANY (i.e., one or more) of the specified rules, the layer is + // included/excluded. + repeated NetStateRule include = 32; + repeated NetStateRule exclude = 33; + // NOTE // Add new LayerTypes to the enum below in lexicographical order (other than // starting with NONE), starting with the next available ID in the comment From b8833565f8234903d33c880017c3768cd02e6fd9 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 29 Jul 2014 11:22:52 -0700 Subject: [PATCH 0352/2053] Add unit tests and skeleton code for Net/Solver filtering functionality. --- include/caffe/net.hpp | 8 + include/caffe/solver.hpp | 5 + src/caffe/net.cpp | 11 + src/caffe/test/test_net.cpp | 820 +++++++++++++++++++++++++++++++++ src/caffe/test/test_solver.cpp | 98 ++++ 5 files changed, 942 insertions(+) create mode 100644 src/caffe/test/test_solver.cpp diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 7548011d973..808b244e47d 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -115,6 +115,14 @@ class Net { void set_debug_info(const bool value) { debug_info_ = value; } + // Helpers for Init. + // Remove layers that the user specified should be excluded given the current + // phase, level, and stage. + static void FilterNet(const NetParameter& param, + NetParameter* param_filtered); + static bool StateMeetsRule(const NetState& state, const NetStateRule& rule, + const string& layer_name); + protected: // Helpers for Init. // Append a new input or top blob to the net. diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 3112c59e0fc..52dcd1936c5 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -6,6 +6,8 @@ #include #include +#include "caffe/net.hpp" + namespace caffe { template @@ -20,6 +22,9 @@ class Solver { inline void Solve(const string resume_file) { Solve(resume_file.c_str()); } virtual ~Solver() {} inline shared_ptr > net() { return net_; } + inline const vector > >& test_nets() { + return test_nets_; + } protected: // PreSolve is run before any solving iteration starts, allowing one to diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 228f826a8b9..a02b1118826 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -167,6 +167,17 @@ void Net::Init(const NetParameter& in_param) { debug_info_ = false; } +template +void Net::FilterNet(const NetParameter& param, + NetParameter* param_filtered) { +} + +template +bool Net::StateMeetsRule(const NetState& state, + const NetStateRule& rule, const string& layer_name) { + return true; +} + // Helper for Net::Init: add a new input or top blob to the net. (Inputs have // layer_id == -1, tops have layer_id >= 0.) template diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index e84701d941c..c4181345573 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -835,4 +835,824 @@ TYPED_TEST(NetTest, TestFromTo) { } } +class FilterNetTest : public ::testing::Test { + protected: + void RunFilterNetTest( + const string& input_param_string, const string& filtered_param_string) { + NetParameter input_param; + CHECK(google::protobuf::TextFormat::ParseFromString( + input_param_string, &input_param)); + NetParameter expected_filtered_param; + CHECK(google::protobuf::TextFormat::ParseFromString( + filtered_param_string, &expected_filtered_param)); + NetParameter actual_filtered_param; + Net::FilterNet(input_param, &actual_filtered_param); + EXPECT_EQ(expected_filtered_param.DebugString(), + actual_filtered_param.DebugString()); + // Also test idempotence. + NetParameter double_filtered_param; + Net::FilterNet(actual_filtered_param, &double_filtered_param); + EXPECT_EQ(actual_filtered_param.DebugString(), + double_filtered_param.DebugString()); + } +}; + +TEST_F(FilterNetTest, TestNoFilter) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, input_proto); +} + +TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { + const string& input_proto = + "name: 'LeNet' " + "layers { " + " name: 'mnist' " + " type: DATA " + " top: 'data' " + " top: 'label' " + " data_param { " + " source: 'mnist-train-leveldb' " + " scale: 0.00390625 " + " batch_size: 64 " + " } " + " include: { phase: TRAIN } " + "} " + "layers { " + " name: 'mnist' " + " type: DATA " + " top: 'data' " + " top: 'label' " + " data_param { " + " source: 'mnist-test-leveldb' " + " scale: 0.00390625 " + " batch_size: 100 " + " } " + " include: { phase: TEST } " + "} " + "layers { " + " name: 'conv1' " + " type: CONVOLUTION " + " bottom: 'data' " + " top: 'conv1' " + " blobs_lr: 1 " + " blobs_lr: 2 " + " convolution_param { " + " num_output: 20 " + " kernel_size: 5 " + " stride: 1 " + " weight_filler { " + " type: 'xavier' " + " } " + " bias_filler { " + " type: 'constant' " + " } " + " } " + "} " + "layers { " + " name: 'ip1' " + " type: INNER_PRODUCT " + " bottom: 'conv1' " + " top: 'ip1' " + " blobs_lr: 1 " + " blobs_lr: 2 " + " inner_product_param { " + " num_output: 10 " + " weight_filler { " + " type: 'xavier' " + " } " + " bias_filler { " + " type: 'constant' " + " } " + " } " + "} " + "layers { " + " name: 'accuracy' " + " type: ACCURACY " + " bottom: 'ip1' " + " bottom: 'label' " + " top: 'accuracy' " + " include: { phase: TEST } " + "} " + "layers { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'ip2' " + " bottom: 'label' " + " top: 'loss' " + "} "; + const string input_proto_train = "state: { phase: TRAIN } " + input_proto; + const string input_proto_test = "state: { phase: TEST } " + input_proto; + const string& output_proto_train = + "state: { phase: TRAIN } " + "name: 'LeNet' " + "layers { " + " name: 'mnist' " + " type: DATA " + " top: 'data' " + " top: 'label' " + " data_param { " + " source: 'mnist-train-leveldb' " + " scale: 0.00390625 " + " batch_size: 64 " + " } " + " include: { phase: TRAIN } " + "} " + "layers { " + " name: 'conv1' " + " type: CONVOLUTION " + " bottom: 'data' " + " top: 'conv1' " + " blobs_lr: 1 " + " blobs_lr: 2 " + " convolution_param { " + " num_output: 20 " + " kernel_size: 5 " + " stride: 1 " + " weight_filler { " + " type: 'xavier' " + " } " + " bias_filler { " + " type: 'constant' " + " } " + " } " + "} " + "layers { " + " name: 'ip1' " + " type: INNER_PRODUCT " + " bottom: 'conv1' " + " top: 'ip1' " + " blobs_lr: 1 " + " blobs_lr: 2 " + " inner_product_param { " + " num_output: 10 " + " weight_filler { " + " type: 'xavier' " + " } " + " bias_filler { " + " type: 'constant' " + " } " + " } " + "} " + "layers { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'ip2' " + " bottom: 'label' " + " top: 'loss' " + "} "; + const string& output_proto_test = + "state: { phase: TEST } " + "name: 'LeNet' " + "layers { " + " name: 'mnist' " + " type: DATA " + " top: 'data' " + " top: 'label' " + " data_param { " + " source: 'mnist-test-leveldb' " + " scale: 0.00390625 " + " batch_size: 100 " + " } " + " include: { phase: TEST } " + "} " + "layers { " + " name: 'conv1' " + " type: CONVOLUTION " + " bottom: 'data' " + " top: 'conv1' " + " blobs_lr: 1 " + " blobs_lr: 2 " + " convolution_param { " + " num_output: 20 " + " kernel_size: 5 " + " stride: 1 " + " weight_filler { " + " type: 'xavier' " + " } " + " bias_filler { " + " type: 'constant' " + " } " + " } " + "} " + "layers { " + " name: 'ip1' " + " type: INNER_PRODUCT " + " bottom: 'conv1' " + " top: 'ip1' " + " blobs_lr: 1 " + " blobs_lr: 2 " + " inner_product_param { " + " num_output: 10 " + " weight_filler { " + " type: 'xavier' " + " } " + " bias_filler { " + " type: 'constant' " + " } " + " } " + "} " + "layers { " + " name: 'accuracy' " + " type: ACCURACY " + " bottom: 'ip1' " + " bottom: 'label' " + " top: 'accuracy' " + " include: { phase: TEST } " + "} " + "layers { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'ip2' " + " bottom: 'label' " + " top: 'loss' " + "} "; + this->RunFilterNetTest(input_proto_train, output_proto_train); + this->RunFilterNetTest(input_proto_test, output_proto_test); +} + +TEST_F(FilterNetTest, TestFilterOutByStage) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + " include: { stage: 'mystage' } " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + const string& output_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, output_proto); +} + +TEST_F(FilterNetTest, TestFilterOutByStage2) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { stage: 'mystage' } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + const string& output_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, output_proto); +} + +TEST_F(FilterNetTest, TestFilterInByStage) { + const string& input_proto = + "state: { stage: 'mystage' } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { stage: 'mystage' } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, input_proto); +} + +TEST_F(FilterNetTest, TestFilterInByStage2) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " exclude: { stage: 'mystage' } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, input_proto); +} + +TEST_F(FilterNetTest, TestFilterOutByMultipleStage) { + const string& input_proto = + "state: { stage: 'mystage' } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { stage: 'mystage' stage: 'myotherstage' } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " include: { stage: 'mystage' } " + "} "; + const string& output_proto = + "state: { stage: 'mystage' } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " include: { stage: 'mystage' } " + "} "; + this->RunFilterNetTest(input_proto, output_proto); +} + +TEST_F(FilterNetTest, TestFilterInByMultipleStage) { + const string& input_proto = + "state: { stage: 'mystage' } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { stage: 'myotherstage' } " + " include: { stage: 'mystage' } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " include: { stage: 'mystage' } " + "} "; + this->RunFilterNetTest(input_proto, input_proto); +} + +TEST_F(FilterNetTest, TestFilterInByMultipleStage2) { + const string& input_proto = + "state: { stage: 'mystage' stage: 'myotherstage' } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { stage: 'mystage' stage: 'myotherstage' } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " include: { stage: 'mystage' } " + "} "; + this->RunFilterNetTest(input_proto, input_proto); +} + +TEST_F(FilterNetTest, TestFilterOutByMinLevel) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { min_level: 3 } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + const string& output_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, output_proto); +} + +TEST_F(FilterNetTest, TestFilterOutByMaxLevel) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { max_level: -3 } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + const string& output_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, output_proto); +} + +TEST_F(FilterNetTest, TestFilterInByMinLevel) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { min_level: 0 } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, input_proto); +} + +TEST_F(FilterNetTest, TestFilterInByMinLevel2) { + const string& input_proto = + "state: { level: 7 } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { min_level: 3 } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, input_proto); +} + +TEST_F(FilterNetTest, TestFilterInByMaxLevel) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { max_level: 0 } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, input_proto); +} + +TEST_F(FilterNetTest, TestFilterInByMaxLevel2) { + const string& input_proto = + "state: { level: -7 } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { max_level: -3 } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + "} "; + this->RunFilterNetTest(input_proto, input_proto); +} + +TEST_F(FilterNetTest, TestFilterInOutByIncludeMultiRule) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { min_level: 2 phase: TRAIN } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " include: { min_level: 2 phase: TEST } " + "} "; + const string& input_proto_train = + "state: { level: 4 phase: TRAIN } " + input_proto; + const string& input_proto_test = + "state: { level: 4 phase: TEST } " + input_proto; + const string& output_proto_train = + "state: { level: 4 phase: TRAIN } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { min_level: 2 phase: TRAIN } " + "} "; + const string& output_proto_test = + "state: { level: 4 phase: TEST } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " include: { min_level: 2 phase: TEST } " + "} "; + this->RunFilterNetTest(input_proto_train, output_proto_train); + this->RunFilterNetTest(input_proto_test, output_proto_test); +} + +TEST_F(FilterNetTest, TestFilterInByIncludeMultiRule) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { min_level: 2 phase: TRAIN } " + " include: { phase: TEST } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " include: { min_level: 2 phase: TEST } " + " include: { phase: TRAIN } " + "} "; + const string& input_proto_train = + "state: { level: 2 phase: TRAIN } " + input_proto; + const string& input_proto_test = + "state: { level: 2 phase: TEST } " + input_proto; + this->RunFilterNetTest(input_proto_train, input_proto_train); + this->RunFilterNetTest(input_proto_test, input_proto_test); +} + +TEST_F(FilterNetTest, TestFilterInOutByExcludeMultiRule) { + const string& input_proto = + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " exclude: { min_level: 2 phase: TRAIN } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " exclude: { min_level: 2 phase: TEST } " + "} "; + const string& input_proto_train = + "state: { level: 4 phase: TRAIN } " + input_proto; + const string& input_proto_test = + "state: { level: 4 phase: TEST } " + input_proto; + const string& output_proto_train = + "state: { level: 4 phase: TRAIN } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " exclude: { min_level: 2 phase: TEST } " + "} "; + const string& output_proto_test = + "state: { level: 4 phase: TEST } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " exclude: { min_level: 2 phase: TRAIN } " + "} "; + this->RunFilterNetTest(input_proto_train, output_proto_train); + this->RunFilterNetTest(input_proto_test, output_proto_test); +} + } // namespace caffe diff --git a/src/caffe/test/test_solver.cpp b/src/caffe/test/test_solver.cpp new file mode 100644 index 00000000000..7380ab86308 --- /dev/null +++ b/src/caffe/test/test_solver.cpp @@ -0,0 +1,98 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include +#include + +#include "google/protobuf/text_format.h" + +#include "gtest/gtest.h" +#include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/solver.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +using std::ostringstream; + +namespace caffe { + +template +class SolverTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + virtual void InitSolverFromProtoString(const string& proto) { + SolverParameter param; + CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); + solver_.reset(new SGDSolver(param)); + } + + shared_ptr > solver_; +}; + +TYPED_TEST_CASE(SolverTest, TestDtypesAndDevices); + +TYPED_TEST(SolverTest, TestInitTrainTestNets) { + const string& proto = + "test_interval: 10 " + "test_iter: 10 " + "test_state: { stage: 'with-softmax' }" + "test_iter: 10 " + "test_state: {}" + "net_param { " + " name: 'TestNetwork' " + " layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: 5 " + " channels: 3 " + " height: 10 " + " width: 10 " + " num: 5 " + " channels: 1 " + " height: 1 " + " width: 1 " + " } " + " top: 'data' " + " top: 'label' " + " } " + " layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " } " + " bottom: 'data' " + " top: 'innerprod' " + " } " + " layers: { " + " name: 'accuracy' " + " type: ACCURACY " + " bottom: 'innerprod' " + " bottom: 'label' " + " top: 'accuracy' " + " exclude: { phase: TRAIN } " + " } " + " layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " include: { phase: TRAIN } " + " include: { phase: TEST stage: 'with-softmax' } " + " } " + "} "; + this->InitSolverFromProtoString(proto); + ASSERT_TRUE(this->solver_->net()); + EXPECT_TRUE(this->solver_->net()->has_layer("loss")); + EXPECT_FALSE(this->solver_->net()->has_layer("accuracy")); + ASSERT_EQ(2, this->solver_->test_nets().size()); + EXPECT_TRUE(this->solver_->test_nets()[0]->has_layer("loss")); + EXPECT_TRUE(this->solver_->test_nets()[0]->has_layer("accuracy")); + EXPECT_FALSE(this->solver_->test_nets()[1]->has_layer("loss")); + EXPECT_TRUE(this->solver_->test_nets()[1]->has_layer("accuracy")); +} + +} // namespace caffe From cb4555c052a6ac2ba65a7d71681d9320a6afefb6 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 17 Jul 2014 20:38:53 -0700 Subject: [PATCH 0353/2053] Incorporate NetState{,Rule} into Solver/Net. Net::FilterNet includes/excludes layers based on whether the NetState meets each layer's NetStateRule(s). --- include/caffe/solver.hpp | 2 + src/caffe/net.cpp | 78 ++++++++++++++++++++++- src/caffe/solver.cpp | 133 +++++++++++++++++++++++++++++++-------- 3 files changed, 185 insertions(+), 28 deletions(-) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 52dcd1936c5..811d70372a4 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -16,6 +16,8 @@ class Solver { explicit Solver(const SolverParameter& param); explicit Solver(const string& param_file); void Init(const SolverParameter& param); + void InitTrainNet(); + void InitTestNets(); // The main entry of the solver function. In default, iter will be zero. Pass // in a non-zero iter number to resume training for a pre-trained net. virtual void Solve(const char* resume_file = NULL); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index a02b1118826..a4d1f235a5a 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -32,11 +32,15 @@ Net::Net(const string& param_file) { template void Net::Init(const NetParameter& in_param) { + // Filter layers based on their include/exclude rules and + // the current NetState. + NetParameter filtered_param; + FilterNet(in_param, &filtered_param); LOG(INFO) << "Initializing net from parameters: " << std::endl - << in_param.DebugString(); - // Create a copy of in_param with splits added where necessary. + << filtered_param.DebugString(); + // Create a copy of filtered_param with splits added where necessary. NetParameter param; - InsertSplits(in_param, ¶m); + InsertSplits(filtered_param, ¶m); // Basically, build all the layers and set up its connections. name_ = param.name(); map blob_name_to_idx; @@ -170,11 +174,79 @@ void Net::Init(const NetParameter& in_param) { template void Net::FilterNet(const NetParameter& param, NetParameter* param_filtered) { + const NetState& net_state = param.state(); + param_filtered->CopyFrom(param); + param_filtered->clear_layers(); + for (int i = 0; i < param.layers_size(); ++i) { + const LayerParameter& layer_param = param.layers(i); + const string& layer_name = layer_param.name(); + CHECK(layer_param.include_size() == 0 || layer_param.exclude_size() == 0) + << "Specify either include rules or exclude rules; not both."; + // If no include rules are specified, the layer is included by default and + // only excluded if it meets one of the exclude rules. + bool layer_included = (layer_param.include_size() == 0); + for (int j = 0; layer_included && j < layer_param.exclude_size(); ++j) { + if (StateMeetsRule(net_state, layer_param.exclude(j), layer_name)) { + layer_included = false; + } + } + for (int j = 0; !layer_included && j < layer_param.include_size(); ++j) { + if (StateMeetsRule(net_state, layer_param.include(j), layer_name)) { + layer_included = true; + } + } + if (layer_included) { + param_filtered->add_layers()->CopyFrom(layer_param); + } + } } template bool Net::StateMeetsRule(const NetState& state, const NetStateRule& rule, const string& layer_name) { + // Check whether the rule is broken due to phase. + if (rule.has_phase()) { + if (rule.phase() != state.phase()) { + LOG(INFO) << "The NetState phase (" << state.phase() + << ") differed from the phase (" << rule.phase() + << ") specified by a rule in layer " << layer_name; + return false; + } + } + // Check whether the rule is broken due to min level. + if (rule.has_min_level()) { + if (state.level() < rule.min_level()) { + LOG(INFO) << "The NetState level (" << state.level() + << ") is above the min_level (" << rule.min_level() + << " specified by a rule in layer " << layer_name; + return false; + } + } + // Check whether the rule is broken due to max level. + if (rule.has_max_level()) { + if (state.level() > rule.max_level()) { + LOG(INFO) << "The NetState level (" << state.level() + << ") is above the max_level (" << rule.max_level() + << " specified by a rule in layer " << layer_name; + return false; + } + } + // Check whether the rule is broken due to stage. If stage is specified, + // the NetState must contain ALL of the rule's stages to meet it. + if (rule.stage_size()) { + for (int i = 0; i < rule.stage_size(); ++i) { + // Check that the NetState contains the rule's ith stage. + bool has_stage = false; + for (int j = 0; !has_stage && j < state.stage_size(); ++j) { + if (rule.stage(i) == state.stage(j)) { has_stage = true; } + } + if (!has_stage) { + LOG(INFO) << "The NetState did not contain stage '" << rule.stage(i) + << "' specified by a rule in layer " << layer_name; + return false; + } + } + } return true; } diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 91738817875..11795f058cd 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -11,6 +11,7 @@ #include "caffe/solver.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/util/upgrade_proto.hpp" namespace caffe { @@ -42,40 +43,122 @@ void Solver::Init(const SolverParameter& param) { Caffe::set_random_seed(param_.random_seed()); } // Scaffolding code + InitTrainNet(); + InitTestNets(); + LOG(INFO) << "Solver scaffolding done."; +} + +template +void Solver::InitTrainNet() { + const int num_train_nets = param_.has_net() + param_.has_net_param() + + param_.has_train_net() + param_.has_train_net_param(); + const string& field_names = "net, net_param, train_net, train_net_param"; + CHECK_GE(num_train_nets, 1) << "SolverParameter must specify a train net " + << "using one of these fields: " << field_names; + CHECK_LE(num_train_nets, 1) << "SolverParameter must not contain more than " + << "one of these fields specifying a train_net: " << field_names; + NetParameter net_param; if (param_.has_train_net_param()) { - CHECK(!param_.has_train_net()) << "Either train_net_param or train_net may " - << "be specified, but not both."; - LOG(INFO) << "Creating training net specified in SolverParameter."; - net_.reset(new Net(param_.train_net_param())); - } else { - CHECK(param_.has_train_net()) - << "Neither train_net nor train_net_param were specified."; - LOG(INFO) << "Creating training net from file: " << param_.train_net(); - net_.reset(new Net(param_.train_net())); + LOG(INFO) << "Creating training net specified in train_net_param."; + net_param.CopyFrom(param_.train_net_param()); + } else if (param_.has_train_net()) { + LOG(INFO) << "Creating training net from train_net file: " + << param_.train_net(); + ReadNetParamsFromTextFileOrDie(param_.train_net(), &net_param); } - CHECK(net_) << "Training net uninitialized."; - net_->set_debug_info(param_.debug_info()); + if (param_.has_net_param()) { + LOG(INFO) << "Creating training net specified in net_param."; + net_param.CopyFrom(param_.net_param()); + } + if (param_.has_net()) { + LOG(INFO) << "Creating training net from net file: " << param_.net(); + ReadNetParamsFromTextFileOrDie(param_.net(), &net_param); + } + // Set the correct NetState. We start with the solver defaults (lowest + // precedence); then, merge in any NetState specified by the net_param itself; + // finally, merge in any NetState specified by the train_state (highest + // precedence). + NetState net_state; + net_state.set_phase(TRAIN); + net_state.MergeFrom(net_param.state()); + net_state.MergeFrom(param_.train_state()); + net_param.mutable_state()->CopyFrom(net_state); + net_.reset(new Net(net_param)); +} + +template +void Solver::InitTestNets() { + const bool has_net_param = param_.has_net_param(); + const bool has_net_file = param_.has_net(); + const int num_generic_nets = has_net_param + has_net_file; + CHECK_LE(num_generic_nets, 1) + << "Both net_param and net_file may not be specified."; const int num_test_net_params = param_.test_net_param_size(); const int num_test_net_files = param_.test_net_size(); const int num_test_nets = num_test_net_params + num_test_net_files; - if (num_test_nets) { - CHECK_EQ(param_.test_iter_size(), num_test_nets) - << "test_iter must be specified for each test network."; + if (num_generic_nets) { + CHECK_GE(param_.test_iter_size(), num_test_nets) + << "test_iter must be specified for each test network."; + } else { + CHECK_EQ(param_.test_iter_size(), num_test_nets) + << "test_iter must be specified for each test network."; + } + // If we have a generic net (specified by net or net_param, rather than + // test_net or test_net_param), we may have an unlimited number of actual + // test networks -- the actual number is given by the number of remaining + // test_iters after any test nets specified by test_net_param and/or test_net + // are evaluated. + const int num_generic_net_instances = param_.test_iter_size() - num_test_nets; + const int num_test_net_instances = num_test_nets + num_generic_net_instances; + if (param_.test_state_size()) { + CHECK_EQ(param_.test_state_size(), num_test_net_instances) + << "test_state must be unspecified or specified once per test net."; + } + if (num_test_net_instances) { CHECK_GT(param_.test_interval(), 0); } - test_nets_.resize(num_test_nets); - for (int i = 0; i < num_test_net_params; ++i) { - LOG(INFO) << "Creating testing net (#" << i - << ") specified in SolverParameter."; - test_nets_[i].reset(new Net(param_.test_net_param(i))); + int test_net_id = 0; + vector sources(num_test_net_instances); + vector net_params(num_test_net_instances); + for (int i = 0; i < num_test_net_params; ++i, ++test_net_id) { + sources[test_net_id] = "test_net_param"; + net_params[test_net_id].CopyFrom(param_.test_net_param(i)); } - for (int i = 0, test_net_id = num_test_net_params; - i < num_test_net_files; ++i, ++test_net_id) { - LOG(INFO) << "Creating testing net (#" << test_net_id - << ") from file: " << param.test_net(i); - test_nets_[test_net_id].reset(new Net(param_.test_net(i))); + for (int i = 0; i < num_test_net_files; ++i, ++test_net_id) { + sources[test_net_id] = "test_net file: " + param_.test_net(i); + ReadNetParamsFromTextFileOrDie(param_.test_net(i), + &net_params[test_net_id]); + } + const int remaining_test_nets = param_.test_iter_size() - test_net_id; + if (has_net_param) { + for (int i = 0; i < remaining_test_nets; ++i, ++test_net_id) { + sources[test_net_id] = "net_param"; + net_params[test_net_id].CopyFrom(param_.net_param()); + } + } + if (has_net_file) { + for (int i = 0; i < remaining_test_nets; ++i, ++test_net_id) { + sources[test_net_id] = "net file: " + param_.net(); + ReadNetParamsFromTextFileOrDie(param_.net(), &net_params[test_net_id]); + } + } + test_nets_.resize(num_test_net_instances); + for (int i = 0; i < num_test_net_instances; ++i) { + // Set the correct NetState. We start with the solver defaults (lowest + // precedence); then, merge in any NetState specified by the net_param + // itself; finally, merge in any NetState specified by the test_state + // (highest precedence). + NetState net_state; + net_state.set_phase(TEST); + net_state.MergeFrom(net_params[i].state()); + if (param_.test_state_size()) { + net_state.MergeFrom(param_.test_state(i)); + } + net_params[i].mutable_state()->CopyFrom(net_state); + LOG(INFO) + << "Creating testing net (#" << i << ") specified by " << sources[i]; + test_nets_[i].reset(new Net(net_params[i])); } - LOG(INFO) << "Solver scaffolding done."; } template From e526e2ddd71c0881b71f31bf522806f85f687648 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 18 Jul 2014 15:07:13 -0700 Subject: [PATCH 0354/2053] Use unified train/test nets in examples. --- examples/cifar10/cifar10_full_solver.prototxt | 6 +- .../cifar10/cifar10_full_solver_lr1.prototxt | 6 +- .../cifar10/cifar10_full_solver_lr2.prototxt | 6 +- examples/cifar10/cifar10_full_train.prototxt | 174 ------------ ...totxt => cifar10_full_train_test.prototxt} | 16 +- .../cifar10/cifar10_quick_solver.prototxt | 6 +- .../cifar10/cifar10_quick_solver_lr1.prototxt | 6 +- examples/cifar10/cifar10_quick_train.prototxt | 168 ------------ ...otxt => cifar10_quick_train_test.prototxt} | 16 +- examples/imagenet/alexnet_solver.prototxt | 3 +- ...in.prototxt => alexnet_train_val.prototxt} | 23 ++ examples/imagenet/alexnet_val.prototxt | 228 --------------- examples/imagenet/imagenet_solver.prototxt | 3 +- ...n.prototxt => imagenet_train_val.prototxt} | 23 ++ examples/imagenet/imagenet_val.prototxt | 228 --------------- examples/imagenet/readme.md | 7 +- .../mnist/lenet_consolidated_solver.prototxt | 259 ++---------------- examples/mnist/lenet_solver.prototxt | 6 +- examples/mnist/lenet_test.prototxt | 118 -------- ...ain.prototxt => lenet_train_test.prototxt} | 23 ++ ...in.prototxt => mnist_autoencoder.prototxt} | 28 ++ .../mnist/mnist_autoencoder_solver.prototxt | 3 +- .../mnist/mnist_autoencoder_test.prototxt | 146 ---------- examples/mnist/readme.md | 6 +- 24 files changed, 177 insertions(+), 1331 deletions(-) delete mode 100644 examples/cifar10/cifar10_full_train.prototxt rename examples/cifar10/{cifar10_full_test.prototxt => cifar10_full_train_test.prototxt} (89%) delete mode 100644 examples/cifar10/cifar10_quick_train.prototxt rename examples/cifar10/{cifar10_quick_test.prototxt => cifar10_quick_train_test.prototxt} (89%) rename examples/imagenet/{alexnet_train.prototxt => alexnet_train_val.prototxt} (91%) delete mode 100644 examples/imagenet/alexnet_val.prototxt rename examples/imagenet/{imagenet_train.prototxt => imagenet_train_val.prototxt} (91%) delete mode 100644 examples/imagenet/imagenet_val.prototxt delete mode 100644 examples/mnist/lenet_test.prototxt rename examples/mnist/{lenet_train.prototxt => lenet_train_test.prototxt} (82%) rename examples/mnist/{mnist_autoencoder_train.prototxt => mnist_autoencoder.prototxt} (88%) delete mode 100644 examples/mnist/mnist_autoencoder_test.prototxt diff --git a/examples/cifar10/cifar10_full_solver.prototxt b/examples/cifar10/cifar10_full_solver.prototxt index 0a0b456308d..49de3f58803 100644 --- a/examples/cifar10/cifar10_full_solver.prototxt +++ b/examples/cifar10/cifar10_full_solver.prototxt @@ -1,10 +1,8 @@ # reduce learning rate after 120 epochs (60000 iters) by factor 0f 10 # then another factor of 10 after 10 more epochs (5000 iters) -# The training protocol buffer definition -train_net: "cifar10_full_train.prototxt" -# The testing protocol buffer definition -test_net: "cifar10_full_test.prototxt" +# The train/test net protocol buffer definition +net: "cifar10_full_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of CIFAR10, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. diff --git a/examples/cifar10/cifar10_full_solver_lr1.prototxt b/examples/cifar10/cifar10_full_solver_lr1.prototxt index 4376de5493f..746f4fba15a 100644 --- a/examples/cifar10/cifar10_full_solver_lr1.prototxt +++ b/examples/cifar10/cifar10_full_solver_lr1.prototxt @@ -1,10 +1,8 @@ # reduce learning rate after 120 epochs (60000 iters) by factor 0f 10 # then another factor of 10 after 10 more epochs (5000 iters) -# The training protocol buffer definition -train_net: "cifar10_full_train.prototxt" -# The testing protocol buffer definition -test_net: "cifar10_full_test.prototxt" +# The train/test net protocol buffer definition +net: "cifar10_full_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of CIFAR10, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. diff --git a/examples/cifar10/cifar10_full_solver_lr2.prototxt b/examples/cifar10/cifar10_full_solver_lr2.prototxt index 19580c5184a..5a549ffc96d 100644 --- a/examples/cifar10/cifar10_full_solver_lr2.prototxt +++ b/examples/cifar10/cifar10_full_solver_lr2.prototxt @@ -1,10 +1,8 @@ # reduce learning rate after 120 epochs (60000 iters) by factor 0f 10 # then another factor of 10 after 10 more epochs (5000 iters) -# The training protocol buffer definition -train_net: "cifar10_full_train.prototxt" -# The testing protocol buffer definition -test_net: "cifar10_full_test.prototxt" +# The train/test net protocol buffer definition +net: "cifar10_full_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of CIFAR10, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. diff --git a/examples/cifar10/cifar10_full_train.prototxt b/examples/cifar10/cifar10_full_train.prototxt deleted file mode 100644 index 25c76060991..00000000000 --- a/examples/cifar10/cifar10_full_train.prototxt +++ /dev/null @@ -1,174 +0,0 @@ -name: "CIFAR10_full_train" -layers { - name: "cifar" - type: DATA - top: "data" - top: "label" - data_param { - source: "cifar10-leveldb/cifar-train-leveldb" - mean_file: "mean.binaryproto" - batch_size: 100 - } -} -layers { - name: "conv1" - type: CONVOLUTION - bottom: "data" - top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - convolution_param { - num_output: 32 - pad: 2 - kernel_size: 5 - stride: 1 - weight_filler { - type: "gaussian" - std: 0.0001 - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "pool1" - type: POOLING - bottom: "conv1" - top: "pool1" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "relu1" - type: RELU - bottom: "pool1" - top: "pool1" -} -layers { - name: "norm1" - type: LRN - bottom: "pool1" - top: "norm1" - lrn_param { - norm_region: WITHIN_CHANNEL - local_size: 3 - alpha: 5e-05 - beta: 0.75 - } -} -layers { - name: "conv2" - type: CONVOLUTION - bottom: "norm1" - top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - convolution_param { - num_output: 32 - pad: 2 - kernel_size: 5 - stride: 1 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "relu2" - type: RELU - bottom: "conv2" - top: "conv2" -} -layers { - name: "pool2" - type: POOLING - bottom: "conv2" - top: "pool2" - pooling_param { - pool: AVE - kernel_size: 3 - stride: 2 - } -} -layers { - name: "norm2" - type: LRN - bottom: "pool2" - top: "norm2" - lrn_param { - norm_region: WITHIN_CHANNEL - local_size: 3 - alpha: 5e-05 - beta: 0.75 - } -} -layers { - name: "conv3" - type: CONVOLUTION - bottom: "norm2" - top: "conv3" - convolution_param { - num_output: 64 - pad: 2 - kernel_size: 5 - stride: 1 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "relu3" - type: RELU - bottom: "conv3" - top: "conv3" -} -layers { - name: "pool3" - type: POOLING - bottom: "conv3" - top: "pool3" - pooling_param { - pool: AVE - kernel_size: 3 - stride: 2 - } -} -layers { - name: "ip1" - type: INNER_PRODUCT - bottom: "pool3" - top: "ip1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 250 - weight_decay: 0 - inner_product_param { - num_output: 10 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "ip1" - bottom: "label" -} diff --git a/examples/cifar10/cifar10_full_test.prototxt b/examples/cifar10/cifar10_full_train_test.prototxt similarity index 89% rename from examples/cifar10/cifar10_full_test.prototxt rename to examples/cifar10/cifar10_full_train_test.prototxt index 1f77b4f0348..4fd52fec133 100644 --- a/examples/cifar10/cifar10_full_test.prototxt +++ b/examples/cifar10/cifar10_full_train_test.prototxt @@ -1,4 +1,16 @@ -name: "CIFAR10_full_test" +name: "CIFAR10_full" +layers { + name: "cifar" + type: DATA + top: "data" + top: "label" + data_param { + source: "cifar10-leveldb/cifar-train-leveldb" + mean_file: "mean.binaryproto" + batch_size: 100 + } + include: { phase: TRAIN } +} layers { name: "cifar" type: DATA @@ -9,6 +21,7 @@ layers { mean_file: "mean.binaryproto" batch_size: 100 } + include: { phase: TEST } } layers { name: "conv1" @@ -172,6 +185,7 @@ layers { bottom: "ip1" bottom: "label" top: "accuracy" + include: { phase: TEST } } layers { name: "loss" diff --git a/examples/cifar10/cifar10_quick_solver.prototxt b/examples/cifar10/cifar10_quick_solver.prototxt index 4b547cc96f4..cdd0722b3a0 100644 --- a/examples/cifar10/cifar10_quick_solver.prototxt +++ b/examples/cifar10/cifar10_quick_solver.prototxt @@ -1,9 +1,7 @@ # reduce the learning rate after 8 epochs (4000 iters) by a factor of 10 -# The training protocol buffer definition -train_net: "cifar10_quick_train.prototxt" -# The testing protocol buffer definition -test_net: "cifar10_quick_test.prototxt" +# The train/test net protocol buffer definition +net: "cifar10_quick_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. diff --git a/examples/cifar10/cifar10_quick_solver_lr1.prototxt b/examples/cifar10/cifar10_quick_solver_lr1.prototxt index d4ba3d525d9..2ed54ad980f 100644 --- a/examples/cifar10/cifar10_quick_solver_lr1.prototxt +++ b/examples/cifar10/cifar10_quick_solver_lr1.prototxt @@ -1,9 +1,7 @@ # reduce the learning rate after 8 epochs (4000 iters) by a factor of 10 -# The training protocol buffer definition -train_net: "cifar10_quick_train.prototxt" -# The testing protocol buffer definition -test_net: "cifar10_quick_test.prototxt" +# The train/test net protocol buffer definition +net: "cifar10_quick_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. diff --git a/examples/cifar10/cifar10_quick_train.prototxt b/examples/cifar10/cifar10_quick_train.prototxt deleted file mode 100644 index de5b6c32c5d..00000000000 --- a/examples/cifar10/cifar10_quick_train.prototxt +++ /dev/null @@ -1,168 +0,0 @@ -name: "CIFAR10_quick_train" -layers { - name: "cifar" - type: DATA - top: "data" - top: "label" - data_param { - source: "cifar10-leveldb/cifar-train-leveldb" - mean_file: "mean.binaryproto" - batch_size: 100 - } -} -layers { - name: "conv1" - type: CONVOLUTION - bottom: "data" - top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - convolution_param { - num_output: 32 - pad: 2 - kernel_size: 5 - stride: 1 - weight_filler { - type: "gaussian" - std: 0.0001 - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "pool1" - type: POOLING - bottom: "conv1" - top: "pool1" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "relu1" - type: RELU - bottom: "pool1" - top: "pool1" -} -layers { - name: "conv2" - type: CONVOLUTION - bottom: "pool1" - top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - convolution_param { - num_output: 32 - pad: 2 - kernel_size: 5 - stride: 1 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "relu2" - type: RELU - bottom: "conv2" - top: "conv2" -} -layers { - name: "pool2" - type: POOLING - bottom: "conv2" - top: "pool2" - pooling_param { - pool: AVE - kernel_size: 3 - stride: 2 - } -} -layers { - name: "conv3" - type: CONVOLUTION - bottom: "pool2" - top: "conv3" - blobs_lr: 1 - blobs_lr: 2 - convolution_param { - num_output: 64 - pad: 2 - kernel_size: 5 - stride: 1 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "relu3" - type: RELU - bottom: "conv3" - top: "conv3" -} -layers { - name: "pool3" - type: POOLING - bottom: "conv3" - top: "pool3" - pooling_param { - pool: AVE - kernel_size: 3 - stride: 2 - } -} -layers { - name: "ip1" - type: INNER_PRODUCT - bottom: "pool3" - top: "ip1" - blobs_lr: 1 - blobs_lr: 2 - inner_product_param { - num_output: 64 - weight_filler { - type: "gaussian" - std: 0.1 - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "ip2" - type: INNER_PRODUCT - bottom: "ip1" - top: "ip2" - blobs_lr: 1 - blobs_lr: 2 - inner_product_param { - num_output: 10 - weight_filler { - type: "gaussian" - std: 0.1 - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "ip2" - bottom: "label" -} diff --git a/examples/cifar10/cifar10_quick_test.prototxt b/examples/cifar10/cifar10_quick_train_test.prototxt similarity index 89% rename from examples/cifar10/cifar10_quick_test.prototxt rename to examples/cifar10/cifar10_quick_train_test.prototxt index aa82c32aa24..b34d1cd2fcb 100644 --- a/examples/cifar10/cifar10_quick_test.prototxt +++ b/examples/cifar10/cifar10_quick_train_test.prototxt @@ -1,4 +1,16 @@ -name: "CIFAR10_quick_test" +name: "CIFAR10_quick" +layers { + name: "cifar" + type: DATA + top: "data" + top: "label" + data_param { + source: "cifar10-leveldb/cifar-train-leveldb" + mean_file: "mean.binaryproto" + batch_size: 100 + } + include: { phase: TRAIN } +} layers { name: "cifar" type: DATA @@ -9,6 +21,7 @@ layers { mean_file: "mean.binaryproto" batch_size: 100 } + include: { phase: TEST } } layers { name: "conv1" @@ -166,6 +179,7 @@ layers { bottom: "ip2" bottom: "label" top: "accuracy" + include: { phase: TEST } } layers { name: "loss" diff --git a/examples/imagenet/alexnet_solver.prototxt b/examples/imagenet/alexnet_solver.prototxt index 75d0d5dffa7..8581e99c6a7 100644 --- a/examples/imagenet/alexnet_solver.prototxt +++ b/examples/imagenet/alexnet_solver.prototxt @@ -1,5 +1,4 @@ -train_net: "alexnet_train.prototxt" -test_net: "alexnet_val.prototxt" +net: "alexnet_train_val.prototxt" test_iter: 1000 test_interval: 1000 base_lr: 0.01 diff --git a/examples/imagenet/alexnet_train.prototxt b/examples/imagenet/alexnet_train_val.prototxt similarity index 91% rename from examples/imagenet/alexnet_train.prototxt rename to examples/imagenet/alexnet_train_val.prototxt index 32a96cfd4d9..f65f3e7f87e 100644 --- a/examples/imagenet/alexnet_train.prototxt +++ b/examples/imagenet/alexnet_train_val.prototxt @@ -2,6 +2,8 @@ name: "AlexNet" layers { name: "data" type: DATA + top: "data" + top: "label" data_param { source: "ilsvrc12_train_leveldb" mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" @@ -9,8 +11,21 @@ layers { crop_size: 227 mirror: true } + include: { phase: TRAIN } +} +layers { + name: "data" + type: DATA top: "data" top: "label" + data_param { + source: "ilsvrc12_val_leveldb" + mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + batch_size: 50 + crop_size: 227 + mirror: false + } + include: { phase: TEST } } layers { name: "conv1" @@ -308,6 +323,14 @@ layers { bottom: "fc7" top: "fc8" } +layers { + name: "accuracy" + type: ACCURACY + bottom: "fc8" + bottom: "label" + top: "accuracy" + include: { phase: TEST } +} layers { name: "loss" type: SOFTMAX_LOSS diff --git a/examples/imagenet/alexnet_val.prototxt b/examples/imagenet/alexnet_val.prototxt deleted file mode 100644 index 1d8d86b78ff..00000000000 --- a/examples/imagenet/alexnet_val.prototxt +++ /dev/null @@ -1,228 +0,0 @@ -name: "AlexNet" -layers { - name: "data" - type: DATA - data_param { - source: "ilsvrc12_val_leveldb" - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" - batch_size: 50 - crop_size: 227 - mirror: false - } - top: "data" - top: "label" -} -layers { - name: "conv1" - type: CONVOLUTION - convolution_param { - num_output: 96 - kernel_size: 11 - stride: 4 - } - bottom: "data" - top: "conv1" -} -layers { - name: "relu1" - type: RELU - bottom: "conv1" - top: "conv1" -} -layers { - name: "norm1" - type: LRN - lrn_param { - local_size: 5 - alpha: 0.0001 - beta: 0.75 - } - bottom: "conv1" - top: "norm1" -} -layers { - name: "pool1" - type: POOLING - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } - bottom: "norm1" - top: "pool1" -} -layers { - name: "conv2" - type: CONVOLUTION - convolution_param { - num_output: 256 - pad: 2 - kernel_size: 5 - group: 2 - } - bottom: "pool1" - top: "conv2" -} -layers { - name: "relu2" - type: RELU - bottom: "conv2" - top: "conv2" -} -layers { - name: "norm2" - type: LRN - lrn_param { - local_size: 5 - alpha: 0.0001 - beta: 0.75 - } - bottom: "conv2" - top: "norm2" -} -layers { - name: "pool2" - type: POOLING - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } - bottom: "norm2" - top: "pool2" -} -layers { - name: "conv3" - type: CONVOLUTION - convolution_param { - num_output: 384 - pad: 1 - kernel_size: 3 - } - bottom: "pool2" - top: "conv3" -} -layers { - name: "relu3" - type: RELU - bottom: "conv3" - top: "conv3" -} -layers { - name: "conv4" - type: CONVOLUTION - convolution_param { - num_output: 384 - pad: 1 - kernel_size: 3 - group: 2 - } - bottom: "conv3" - top: "conv4" -} -layers { - name: "relu4" - type: RELU - bottom: "conv4" - top: "conv4" -} -layers { - name: "conv5" - type: CONVOLUTION - convolution_param { - num_output: 256 - pad: 1 - kernel_size: 3 - group: 2 - } - bottom: "conv4" - top: "conv5" -} -layers { - name: "relu5" - type: RELU - bottom: "conv5" - top: "conv5" -} -layers { - name: "pool5" - type: POOLING - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } - bottom: "conv5" - top: "pool5" -} -layers { - name: "fc6" - type: INNER_PRODUCT - inner_product_param { - num_output: 4096 - } - bottom: "pool5" - top: "fc6" -} -layers { - name: "relu6" - type: RELU - bottom: "fc6" - top: "fc6" -} -layers { - name: "drop6" - type: DROPOUT - dropout_param { - dropout_ratio: 0.5 - } - bottom: "fc6" - top: "fc6" -} -layers { - name: "fc7" - type: INNER_PRODUCT - inner_product_param { - num_output: 4096 - } - bottom: "fc6" - top: "fc7" -} -layers { - name: "relu7" - type: RELU - bottom: "fc7" - top: "fc7" -} -layers { - name: "drop7" - type: DROPOUT - dropout_param { - dropout_ratio: 0.5 - } - bottom: "fc7" - top: "fc7" -} -layers { - name: "fc8" - type: INNER_PRODUCT - inner_product_param { - num_output: 1000 - } - bottom: "fc7" - top: "fc8" -} -layers { - name: "accuracy" - type: ACCURACY - bottom: "fc8" - bottom: "label" - top: "accuracy" -} -layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "fc8" - bottom: "label" - top: "loss" -} diff --git a/examples/imagenet/imagenet_solver.prototxt b/examples/imagenet/imagenet_solver.prototxt index e543ba66cad..aedec4104a6 100644 --- a/examples/imagenet/imagenet_solver.prototxt +++ b/examples/imagenet/imagenet_solver.prototxt @@ -1,5 +1,4 @@ -train_net: "imagenet_train.prototxt" -test_net: "imagenet_val.prototxt" +net: "imagenet_train_val.prototxt" test_iter: 1000 test_interval: 1000 base_lr: 0.01 diff --git a/examples/imagenet/imagenet_train.prototxt b/examples/imagenet/imagenet_train_val.prototxt similarity index 91% rename from examples/imagenet/imagenet_train.prototxt rename to examples/imagenet/imagenet_train_val.prototxt index 519d4509be9..af28c1495e5 100644 --- a/examples/imagenet/imagenet_train.prototxt +++ b/examples/imagenet/imagenet_train_val.prototxt @@ -11,6 +11,21 @@ layers { crop_size: 227 mirror: true } + include: { phase: TRAIN } +} +layers { + name: "data" + type: DATA + top: "data" + top: "label" + data_param { + source: "ilsvrc12_val_leveldb" + mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + batch_size: 50 + crop_size: 227 + mirror: false + } + include: { phase: TEST } } layers { name: "conv1" @@ -308,6 +323,14 @@ layers { } } } +layers { + name: "accuracy" + type: ACCURACY + bottom: "fc8" + bottom: "label" + top: "accuracy" + include: { phase: TEST } +} layers { name: "loss" type: SOFTMAX_LOSS diff --git a/examples/imagenet/imagenet_val.prototxt b/examples/imagenet/imagenet_val.prototxt deleted file mode 100644 index 8be5150cdd2..00000000000 --- a/examples/imagenet/imagenet_val.prototxt +++ /dev/null @@ -1,228 +0,0 @@ -name: "CaffeNet" -layers { - name: "data" - type: DATA - top: "data" - top: "label" - data_param { - source: "ilsvrc12_val_leveldb" - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" - batch_size: 50 - crop_size: 227 - mirror: false - } -} -layers { - name: "conv1" - type: CONVOLUTION - bottom: "data" - top: "conv1" - convolution_param { - num_output: 96 - kernel_size: 11 - stride: 4 - } -} -layers { - name: "relu1" - type: RELU - bottom: "conv1" - top: "conv1" -} -layers { - name: "pool1" - type: POOLING - bottom: "conv1" - top: "pool1" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "norm1" - type: LRN - bottom: "pool1" - top: "norm1" - lrn_param { - local_size: 5 - alpha: 0.0001 - beta: 0.75 - } -} -layers { - name: "conv2" - type: CONVOLUTION - bottom: "norm1" - top: "conv2" - convolution_param { - num_output: 256 - pad: 2 - kernel_size: 5 - group: 2 - } -} -layers { - name: "relu2" - type: RELU - bottom: "conv2" - top: "conv2" -} -layers { - name: "pool2" - type: POOLING - bottom: "conv2" - top: "pool2" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "norm2" - type: LRN - bottom: "pool2" - top: "norm2" - lrn_param { - local_size: 5 - alpha: 0.0001 - beta: 0.75 - } -} -layers { - name: "conv3" - type: CONVOLUTION - bottom: "norm2" - top: "conv3" - convolution_param { - num_output: 384 - pad: 1 - kernel_size: 3 - } -} -layers { - name: "relu3" - type: RELU - bottom: "conv3" - top: "conv3" -} -layers { - name: "conv4" - type: CONVOLUTION - bottom: "conv3" - top: "conv4" - convolution_param { - num_output: 384 - pad: 1 - kernel_size: 3 - group: 2 - } -} -layers { - name: "relu4" - type: RELU - bottom: "conv4" - top: "conv4" -} -layers { - name: "conv5" - type: CONVOLUTION - bottom: "conv4" - top: "conv5" - convolution_param { - num_output: 256 - pad: 1 - kernel_size: 3 - group: 2 - } -} -layers { - name: "relu5" - type: RELU - bottom: "conv5" - top: "conv5" -} -layers { - name: "pool5" - type: POOLING - bottom: "conv5" - top: "pool5" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "fc6" - type: INNER_PRODUCT - bottom: "pool5" - top: "fc6" - inner_product_param { - num_output: 4096 - } -} -layers { - name: "relu6" - type: RELU - bottom: "fc6" - top: "fc6" -} -layers { - name: "drop6" - type: DROPOUT - bottom: "fc6" - top: "fc6" - dropout_param { - dropout_ratio: 0.5 - } -} -layers { - name: "fc7" - type: INNER_PRODUCT - bottom: "fc6" - top: "fc7" - inner_product_param { - num_output: 4096 - } -} -layers { - name: "relu7" - type: RELU - bottom: "fc7" - top: "fc7" -} -layers { - name: "drop7" - type: DROPOUT - bottom: "fc7" - top: "fc7" - dropout_param { - dropout_ratio: 0.5 - } -} -layers { - name: "fc8" - type: INNER_PRODUCT - bottom: "fc7" - top: "fc8" - inner_product_param { - num_output: 1000 - } -} -layers { - name: "accuracy" - type: ACCURACY - bottom: "fc8" - bottom: "label" - top: "accuracy" -} -layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "fc8" - bottom: "label" - top: "loss" -} \ No newline at end of file diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index e74e6b86996..0b5b8452188 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -72,12 +72,11 @@ We will also lay out a protocol buffer for running the solver. Let's make a few * The network will be trained with momentum 0.9 and a weight decay of 0.0005. * For every 10,000 iterations, we will take a snapshot of the current status. -Sound good? This is implemented in `examples/imagenet/imagenet_solver.prototxt`. Again, you will need to change the first two lines: +Sound good? This is implemented in `examples/imagenet/imagenet_solver.prototxt`. Again, you will need to change the first line: - train_net: "imagenet_train.prototxt" - test_net: "imagenet_val.prototxt" + net: "imagenet_train_val.prototxt" -to point to the actual path if you have changed them. +to point to the actual path if you have changed it. Training ImageNet ----------------- diff --git a/examples/mnist/lenet_consolidated_solver.prototxt b/examples/mnist/lenet_consolidated_solver.prototxt index ef851e0f656..980f9382066 100644 --- a/examples/mnist/lenet_consolidated_solver.prototxt +++ b/examples/mnist/lenet_consolidated_solver.prototxt @@ -30,8 +30,19 @@ random_seed: 1701 # solver mode: CPU or GPU solver_mode: GPU -# The training protocol buffer definition -train_net_param { +# We test on both the test and train set using "stages". The TEST DATA layers +# each have a stage, either 'test-on-train-set' or 'test-on-test-set'. +# test_iter specifies how many forward passes the test should carry out. +# In the case of MNIST, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +test_state: { stage: "test-on-test-set" } +# The train set has 60K images, so we run 600 test iters (600 * 100 = 60K). +test_iter: 600 +test_state: { stage: "test-on-train-set" } + +# The net protocol buffer definition +net_param { name: "LeNet" layers { name: "mnist" @@ -43,122 +54,8 @@ train_net_param { scale: 0.00390625 batch_size: 64 } + include: { phase: TRAIN } } - layers { - name: "conv1" - type: CONVOLUTION - bottom: "data" - top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - convolution_param { - num_output: 20 - kernel_size: 5 - stride: 1 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } - } - layers { - name: "pool1" - type: POOLING - bottom: "conv1" - top: "pool1" - pooling_param { - pool: MAX - kernel_size: 2 - stride: 2 - } - } - layers { - name: "conv2" - type: CONVOLUTION - bottom: "pool1" - top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - convolution_param { - num_output: 50 - kernel_size: 5 - stride: 1 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } - } - layers { - name: "pool2" - type: POOLING - bottom: "conv2" - top: "pool2" - pooling_param { - pool: MAX - kernel_size: 2 - stride: 2 - } - } - layers { - name: "ip1" - type: INNER_PRODUCT - bottom: "pool2" - top: "ip1" - blobs_lr: 1 - blobs_lr: 2 - inner_product_param { - num_output: 500 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } - } - layers { - name: "relu1" - type: RELU - bottom: "ip1" - top: "ip1" - } - layers { - name: "ip2" - type: INNER_PRODUCT - bottom: "ip1" - top: "ip2" - blobs_lr: 1 - blobs_lr: 2 - inner_product_param { - num_output: 10 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } - } - layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "ip2" - bottom: "label" - } -} - -# test_iter specifies how many forward passes the test should carry out. -# In the case of MNIST, we have test batch size 100 and 100 test iterations, -# covering the full 10,000 testing images. -test_iter: 100 -# The testing protocol buffer definition -test_net_param { - name: "LeNet-test" layers { name: "mnist" type: DATA @@ -169,120 +66,11 @@ test_net_param { scale: 0.00390625 batch_size: 100 } - } - layers { - name: "conv1" - type: CONVOLUTION - bottom: "data" - top: "conv1" - convolution_param { - num_output: 20 - kernel_size: 5 - stride: 1 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } - } - layers { - name: "pool1" - type: POOLING - bottom: "conv1" - top: "pool1" - pooling_param { - pool: MAX - kernel_size: 2 - stride: 2 - } - } - layers { - name: "conv2" - type: CONVOLUTION - bottom: "pool1" - top: "conv2" - convolution_param { - num_output: 50 - kernel_size: 5 - stride: 1 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } - } - layers { - name: "pool2" - type: POOLING - bottom: "conv2" - top: "pool2" - pooling_param { - pool: MAX - kernel_size: 2 - stride: 2 - } - } - layers { - name: "ip1" - type: INNER_PRODUCT - bottom: "pool2" - top: "ip1" - inner_product_param { - num_output: 500 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } + include: { + phase: TEST + stage: "test-on-test-set" } } - layers { - name: "relu1" - type: RELU - bottom: "ip1" - top: "ip1" - } - layers { - name: "ip2" - type: INNER_PRODUCT - bottom: "ip1" - top: "ip2" - inner_product_param { - num_output: 10 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } - } - layers { - name: "accuracy" - type: ACCURACY - bottom: "ip2" - bottom: "label" - top: "accuracy" - } - layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "ip2" - bottom: "label" - top: "loss" - } -} - -# The train set has 60K images, so we run 600 test iters (600 * 100 = 60K). -test_iter: 600 -# The protocol buffer definition to test on the train set -test_net_param { - name: "LeNet-test-on-train" layers { name: "mnist" type: DATA @@ -293,12 +81,18 @@ test_net_param { scale: 0.00390625 batch_size: 100 } + include: { + phase: TEST + stage: "test-on-train-set" + } } layers { name: "conv1" type: CONVOLUTION bottom: "data" top: "conv1" + blobs_lr: 1 + blobs_lr: 2 convolution_param { num_output: 20 kernel_size: 5 @@ -327,6 +121,8 @@ test_net_param { type: CONVOLUTION bottom: "pool1" top: "conv2" + blobs_lr: 1 + blobs_lr: 2 convolution_param { num_output: 50 kernel_size: 5 @@ -355,6 +151,8 @@ test_net_param { type: INNER_PRODUCT bottom: "pool2" top: "ip1" + blobs_lr: 1 + blobs_lr: 2 inner_product_param { num_output: 500 weight_filler { @@ -376,6 +174,8 @@ test_net_param { type: INNER_PRODUCT bottom: "ip1" top: "ip2" + blobs_lr: 1 + blobs_lr: 2 inner_product_param { num_output: 10 weight_filler { @@ -392,6 +192,7 @@ test_net_param { bottom: "ip2" bottom: "label" top: "accuracy" + include: { phase: TEST } } layers { name: "loss" diff --git a/examples/mnist/lenet_solver.prototxt b/examples/mnist/lenet_solver.prototxt index 7947f2d6a73..a3b33090472 100644 --- a/examples/mnist/lenet_solver.prototxt +++ b/examples/mnist/lenet_solver.prototxt @@ -1,7 +1,5 @@ -# The training protocol buffer definition -train_net: "lenet_train.prototxt" -# The testing protocol buffer definition -test_net: "lenet_test.prototxt" +# The train/test net protocol buffer definition +net: "lenet_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. diff --git a/examples/mnist/lenet_test.prototxt b/examples/mnist/lenet_test.prototxt deleted file mode 100644 index 2497f02ae86..00000000000 --- a/examples/mnist/lenet_test.prototxt +++ /dev/null @@ -1,118 +0,0 @@ -name: "LeNet-test" -layers { - name: "mnist" - type: DATA - top: "data" - top: "label" - data_param { - source: "mnist-test-leveldb" - scale: 0.00390625 - batch_size: 100 - } -} -layers { - name: "conv1" - type: CONVOLUTION - bottom: "data" - top: "conv1" - convolution_param { - num_output: 20 - kernel_size: 5 - stride: 1 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "pool1" - type: POOLING - bottom: "conv1" - top: "pool1" - pooling_param { - pool: MAX - kernel_size: 2 - stride: 2 - } -} -layers { - name: "conv2" - type: CONVOLUTION - bottom: "pool1" - top: "conv2" - convolution_param { - num_output: 50 - kernel_size: 5 - stride: 1 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "pool2" - type: POOLING - bottom: "conv2" - top: "pool2" - pooling_param { - pool: MAX - kernel_size: 2 - stride: 2 - } -} -layers { - name: "ip1" - type: INNER_PRODUCT - bottom: "pool2" - top: "ip1" - inner_product_param { - num_output: 500 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "relu1" - type: RELU - bottom: "ip1" - top: "ip1" -} -layers { - name: "ip2" - type: INNER_PRODUCT - bottom: "ip1" - top: "ip2" - inner_product_param { - num_output: 10 - weight_filler { - type: "xavier" - } - bias_filler { - type: "constant" - } - } -} -layers { - name: "accuracy" - type: ACCURACY - bottom: "ip2" - bottom: "label" - top: "accuracy" -} -layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "ip2" - bottom: "label" - top: "loss" -} diff --git a/examples/mnist/lenet_train.prototxt b/examples/mnist/lenet_train_test.prototxt similarity index 82% rename from examples/mnist/lenet_train.prototxt rename to examples/mnist/lenet_train_test.prototxt index e8a1e74e40b..3c77452130c 100644 --- a/examples/mnist/lenet_train.prototxt +++ b/examples/mnist/lenet_train_test.prototxt @@ -9,7 +9,21 @@ layers { scale: 0.00390625 batch_size: 64 } + include: { phase: TRAIN } } +layers { + name: "mnist" + type: DATA + top: "data" + top: "label" + data_param { + source: "mnist-test-leveldb" + scale: 0.00390625 + batch_size: 100 + } + include: { phase: TEST } +} + layers { name: "conv1" type: CONVOLUTION @@ -110,9 +124,18 @@ layers { } } } +layers { + name: "accuracy" + type: ACCURACY + bottom: "ip2" + bottom: "label" + top: "accuracy" + include: { phase: TEST } +} layers { name: "loss" type: SOFTMAX_LOSS bottom: "ip2" bottom: "label" + top: "loss" } diff --git a/examples/mnist/mnist_autoencoder_train.prototxt b/examples/mnist/mnist_autoencoder.prototxt similarity index 88% rename from examples/mnist/mnist_autoencoder_train.prototxt rename to examples/mnist/mnist_autoencoder.prototxt index 90d2cff99b8..ad1e7665bf2 100644 --- a/examples/mnist/mnist_autoencoder_train.prototxt +++ b/examples/mnist/mnist_autoencoder.prototxt @@ -8,6 +8,18 @@ layers { scale: 0.0039215684 batch_size: 100 } + include: { phase: TRAIN } +} +layers { + top: "data" + name: "data" + type: DATA + data_param { + source: "mnist-test-leveldb" + scale: 0.0039215684 + batch_size: 100 + } + include: { phase: TEST } } layers { bottom: "data" @@ -232,4 +244,20 @@ layers { bottom: "flatdata" name: "loss" type: SIGMOID_CROSS_ENTROPY_LOSS + include: { phase: TRAIN } +} +layers { + bottom: "decode1" + top: "decode1neuron" + name: "decode1neuron" + type: SIGMOID + include: { phase: TEST } +} +layers { + bottom: "decode1neuron" + bottom: "flatdata" + name: "loss" + type: EUCLIDEAN_LOSS + top: "loss" + include: { phase: TEST } } diff --git a/examples/mnist/mnist_autoencoder_solver.prototxt b/examples/mnist/mnist_autoencoder_solver.prototxt index 06e057d53a4..ae1ddebccd2 100644 --- a/examples/mnist/mnist_autoencoder_solver.prototxt +++ b/examples/mnist/mnist_autoencoder_solver.prototxt @@ -1,5 +1,4 @@ -train_net: "mnist_autoencoder_train.prototxt" -test_net: "mnist_autoencoder_test.prototxt" +net: "mnist_autoencoder.prototxt" test_iter: 50 test_interval: 100 test_compute_loss: true diff --git a/examples/mnist/mnist_autoencoder_test.prototxt b/examples/mnist/mnist_autoencoder_test.prototxt deleted file mode 100644 index b52364c17fc..00000000000 --- a/examples/mnist/mnist_autoencoder_test.prototxt +++ /dev/null @@ -1,146 +0,0 @@ -name: "MNISTAutoencoder" -layers { - top: "data" - name: "data" - type: DATA - data_param { - source: "mnist-test-leveldb" - scale: 0.0039215684 - batch_size: 100 - } -} -layers { - bottom: "data" - top: "flatdata" - name: "flatdata" - type: FLATTEN -} -layers { - bottom: "data" - top: "encode1" - name: "encode1" - type: INNER_PRODUCT - inner_product_param { - num_output: 1000 - } -} -layers { - bottom: "encode1" - top: "encode1neuron" - name: "encode1neuron" - type: SIGMOID -} -layers { - bottom: "encode1neuron" - top: "encode2" - name: "encode2" - type: INNER_PRODUCT - inner_product_param { - num_output: 500 - } -} -layers { - bottom: "encode2" - top: "encode2neuron" - name: "encode2neuron" - type: SIGMOID -} -layers { - bottom: "encode2neuron" - top: "encode3" - name: "encode3" - type: INNER_PRODUCT - inner_product_param { - num_output: 250 - } -} -layers { - bottom: "encode3" - top: "encode3neuron" - name: "encode3neuron" - type: SIGMOID -} -layers { - bottom: "encode3neuron" - top: "encode4" - name: "encode4" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 1 - weight_decay: 1 - weight_decay: 0 - inner_product_param { - num_output: 30 - } -} -layers { - bottom: "encode4" - top: "decode4" - name: "decode4" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 1 - weight_decay: 1 - weight_decay: 0 - inner_product_param { - num_output: 250 - } -} -layers { - bottom: "decode4" - top: "decode4neuron" - name: "decode4neuron" - type: SIGMOID -} -layers { - bottom: "decode4neuron" - top: "decode3" - name: "decode3" - type: INNER_PRODUCT - inner_product_param { - num_output: 500 - } -} -layers { - bottom: "decode3" - top: "decode3neuron" - name: "decode3neuron" - type: SIGMOID -} -layers { - bottom: "decode3neuron" - top: "decode2" - name: "decode2" - type: INNER_PRODUCT - inner_product_param { - num_output: 1000 - } -} -layers { - bottom: "decode2" - top: "decode2neuron" - name: "decode2neuron" - type: SIGMOID -} -layers { - bottom: "decode2neuron" - top: "decode1" - name: "decode1" - type: INNER_PRODUCT - inner_product_param { - num_output: 784 - } -} -layers { - bottom: "decode1" - top: "decode1neuron" - name: "decode1neuron" - type: SIGMOID -} -layers { - bottom: "decode1neuron" - bottom: "flatdata" - name: "loss" - type: EUCLIDEAN_LOSS - top: "loss" -} diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 4f3f4d9ce12..65a780714ae 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -177,10 +177,8 @@ The `softmax_loss` layer implements both the softmax and the multinomial logisti Check out the comments explaining each line in the prototxt: - # The training protocol buffer definition - train_net: "lenet_train.prototxt" - # The testing protocol buffer definition - test_net: "lenet_test.prototxt" + # The train/test net protocol buffer definition + net: "lenet_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. From 41a56376816b8c59c4777c1ab2d3230f8a785241 Mon Sep 17 00:00:00 2001 From: yajiedesign Date: Sat, 26 Jul 2014 00:01:15 +0800 Subject: [PATCH 0355/2053] fix some namespace with std::signbit --- include/caffe/util/math_functions.hpp | 6 ++++-- src/caffe/util/math_functions.cpp | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 5036a573033..001950113a1 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -128,8 +128,10 @@ DEFINE_CAFFE_CPU_UNARY_FUNC(sign, y[i] = caffe_sign(x[i])); // This returns a nonzero value if the input has its sign bit set. // The name sngbit is meant to avoid conflicts with std::signbit in the macro -using std::signbit; -DEFINE_CAFFE_CPU_UNARY_FUNC(sgnbit, y[i] = signbit(x[i])); +bool caffe_signbit(float arg); +bool caffe_signbit(double arg); +bool caffe_signbit(long double arg); +DEFINE_CAFFE_CPU_UNARY_FUNC(sgnbit, y[i] = caffe_signbit(x[i])); DEFINE_CAFFE_CPU_UNARY_FUNC(fabs, y[i] = std::fabs(x[i])); diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index 36d8877d8c5..2fdcf91b34b 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -366,4 +366,16 @@ void caffe_cpu_scale(const int n, const double alpha, const double *x, cblas_dscal(n, alpha, y, 1); } + +using std::signbit; +bool caffe_signbit(float arg) { + return signbit(arg); +} +bool caffe_signbit(double arg) { + return signbit(arg); +} +bool caffe_signbit(long double arg) { + return signbit(arg); +} + } // namespace caffe From 6485be076bdebd2ea311e8a06778a55b72a1d095 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 29 Jul 2014 15:59:49 -0700 Subject: [PATCH 0356/2053] Set correct solver_mode in SolverTest so Travis build doesn't randomly fail. --- src/caffe/test/test_solver.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/caffe/test/test_solver.cpp b/src/caffe/test/test_solver.cpp index 7380ab86308..9e087b08c53 100644 --- a/src/caffe/test/test_solver.cpp +++ b/src/caffe/test/test_solver.cpp @@ -25,6 +25,17 @@ class SolverTest : public MultiDeviceTest { virtual void InitSolverFromProtoString(const string& proto) { SolverParameter param; CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); + // Set the solver_mode according to current Caffe::mode. + switch (Caffe::mode()) { + case Caffe::CPU: + param.set_solver_mode(SolverParameter_SolverMode_CPU); + break; + case Caffe::GPU: + param.set_solver_mode(SolverParameter_SolverMode_GPU); + break; + default: + LOG(FATAL) << "Unknown Caffe mode: " << Caffe::mode(); + } solver_.reset(new SGDSolver(param)); } From afa09ecfa5c09c30824cd0aacf7a7f4e48e70a39 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 29 Jul 2014 18:13:32 -0700 Subject: [PATCH 0357/2053] Also apply HDF5OutputLayer fix to GPU version. --- src/caffe/layers/hdf5_output_layer.cu | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/hdf5_output_layer.cu b/src/caffe/layers/hdf5_output_layer.cu index 5c790555e50..9b3dd135841 100644 --- a/src/caffe/layers/hdf5_output_layer.cu +++ b/src/caffe/layers/hdf5_output_layer.cu @@ -28,7 +28,7 @@ Dtype HDF5OutputLayer::Forward_gpu(const vector*>& bottom, for (int i = 0; i < bottom[0]->num(); ++i) { caffe_copy(data_datum_dim, &bottom[0]->gpu_data()[i * data_datum_dim], &data_blob_.mutable_cpu_data()[i * data_datum_dim]); - caffe_copy(label_datum_dim, &bottom[0]->gpu_data()[i * label_datum_dim], + caffe_copy(label_datum_dim, &bottom[1]->gpu_data()[i * label_datum_dim], &label_blob_.mutable_cpu_data()[i * label_datum_dim]); } SaveBlobs(); From 44962584b2f71937dbfd2dadaeeed211d4e49598 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 29 Jul 2014 22:40:45 -0700 Subject: [PATCH 0358/2053] [docs] install update: dependencies, CPU-only, Ubuntu 14.04 - update dependency versions - document CPU-only build - add Ubuntu 14.04 details - include LMDB - warn about defective CUDA driver series 331.* --- docs/installation.md | 76 ++++++++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 27 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index fa29a0e6d90..ff0760dd060 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -6,7 +6,7 @@ title: Caffe # Installation Prior to installing, it is best to read through this guide and take note of the details for your platform. -We have successfully compiled and run Caffe on Ubuntu 12.04, OS X 10.8, and OS X 10.9. +We have installed Caffe on Ubuntu 14.04, Ubuntu 12.04, OS X 10.9, and OS X 10.8. - [Prerequisites](#prerequisites) - [Compilation](#compilation) @@ -16,20 +16,22 @@ We have successfully compiled and run Caffe on Ubuntu 12.04, OS X 10.8, and OS X Caffe depends on several software packages. -* [CUDA](https://developer.nvidia.com/cuda-zone) (5.0, 5.5, or 6.0). +* [CUDA](https://developer.nvidia.com/cuda-zone) library version 6.0, 5.5, or 5.0 and the latest driver version for CUDA 6 or 319.* for CUDA 5 (and NOT 331.*) * [BLAS](http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) (provided via ATLAS, MKL, or OpenBLAS). * [OpenCV](http://opencv.org/). -* [Boost](http://www.boost.org/) (we have only tested 1.55) -* `glog`, `gflags`, `protobuf`, `leveldb`, `snappy`, `hdf5` +* [Boost](http://www.boost.org/) (>= 1.55, although only 1.55 is tested) +* `glog`, `gflags`, `protobuf`, `leveldb`, `snappy`, `hdf5`, `lmdb` * For the Python wrapper - * `Python`, `numpy (>= 1.7)`, boost-provided `boost.python` + * `Python 2.7`, `numpy (>= 1.7)`, boost-provided `boost.python` * For the MATLAB wrapper * MATLAB with the `mex` compiler. +**CPU-only Caffe**: for cold-brewed CPU-only Caffe uncomment the `CPU_ONLY := 1` in `Makefile.config` to configure and build Caffe without CUDA. This is helpful for cloud or cluster deployment. + ### CUDA and BLAS -Caffe requires the CUDA `nvcc` compiler to compile its GPU code. -To install CUDA, go to the [NVIDIA CUDA website](https://developer.nvidia.com/cuda-downloads) and follow installation instructions there. **Note:** you can install the CUDA libraries without a CUDA card or driver, in order to build and run Caffe on a CPU-only machine. +Caffe requires the CUDA `nvcc` compiler to compile its GPU code and CUDA driver for GPU operation. +To install CUDA, go to the [NVIDIA CUDA website](https://developer.nvidia.com/cuda-downloads) and follow installation instructions there. Install the library and the latest standalone driver separately; the driver bundled with the library is usually out-of-date. **Warning!** The 331.* CUDA driver series has a critical performance issue: do not use it. Caffe requires BLAS as the backend of its matrix and vector computations. There are several implementations of this library. @@ -46,32 +48,49 @@ The choice is yours: 1. Install OpenBLAS 2. Set `BLAS := open` in `Makefile.config` -### Python and/or Matlab wrappers (optional) +### Python and/or MATLAB wrappers (optional) -Python: The main requirements are `numpy` and `boost.python` (provided by boost). `pandas` is useful too and needed for some examples. +#### Python -For **OS X**, we highly recommend using the [Anaconda](https://store.continuum.io/cshop/anaconda/) Python distribution, which provides most of the necessary packages, as well as the `hdf5` library dependency. -If you don't, please use Homebrew -- but beware of potential linking errors! +The main requirements are `numpy` and `boost.python` (provided by boost). `pandas` is useful too and needed for some examples. -Note that if you use the **Ubuntu** default python, you will need to `apt-get install` the `python-dev` package to have the python headers. You can install any remaining dependencies with +You can install the dependencies with pip install -r /path/to/caffe/python/requirements.txt -MATLAB: install MATLAB, and make sure that its `mex` is in your `$PATH`. +but we highly recommend first installing the [Anaconda](https://store.continuum.io/cshop/anaconda/) Python distribution, which provides most of the necessary packages, as well as the `hdf5` library dependency. + +For **Ubuntu**, if you use the default Python you will need to `apt-get install` the `python-dev` package to have the Python headers for building the wrapper. + +For **OS X**, Anaconda is the preferred Python. If you decide against it, please use Homebrew -- but beware of potential linking errors! + +To import the `caffe` Python module after completing the installation, add the module directory to your `$PYTHONPATH` by `export PYTHONPATH=/path/to/caffe/python:$PYTHONPATH` or the like. You should not import the module in the `caffe/python/caffe` directory! + +*Caffe's Python interface works with Python 2.7. Python 3 or earlier Pythons are your own adventure.* + +#### MATLAB + +Install MATLAB, and make sure that its `mex` is in your `$PATH`. + +*Caffe's MATLAB interface works with versions 2012b, 2013a/b, and 2014a.* ### The rest of the dependencies #### Linux -On **Ubuntu**, the remaining dependencies can be installed with +On **Ubuntu**, most of the dependencies can be installed with sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev -And on **CentOS or RHEL**, you can install via yum using: +And on **CentOS / RHEL**, you can install via yum with sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel -The only exceptions being the google flags library and the google logging library, which does not exist in the Ubuntu 12.04 or CentOS/RHEL repositories. To install them, do: +and for **Ubuntu 14.04** the rest of the dependencies can be installed with + + sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler + +For **Ubuntu 12.04 and CentOS / RHEL** the only exceptions to package installation are the Google flags library, Google logging library, and LMDB. To install these, do: # glog wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz @@ -86,12 +105,16 @@ The only exceptions being the google flags library and the google logging librar mkdir build && cd build export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1 make && make install + # lmdb + git clone git://gitorious.org/mdb/mdb.git + cd mdb/libraries/liblmdb + make && make install -Note that glog does not compile with the most recent gflags version (2.1), so before that is solved you will need to build with glog first. Also note that if you have newer versions of Ubuntu, like 13.04 or 14.04, gflags may be available under apt-get. +Note that glog does not compile with the most recent gflags version (2.1), so before that is resolved you will need to build with glog first. #### OS X -On **OS X**, we highly recommend using the [homebrew](http://brew.sh/) package manager, and ideally starting from a clean install of the OS (or from a wiped `/usr/local`) to avoid conflicts. +On **OS X**, we highly recommend using the [Homebrew](http://brew.sh/) package manager, and ideally starting from a clean install of the OS (or from a wiped `/usr/local`) to avoid conflicts. In the following, we assume that you're using Anaconda Python and Homebrew. To install the OpenCV dependency, we'll need to provide an additional source for Homebrew: @@ -112,7 +135,7 @@ In other `ENV` settings, things may not work as expected. Simply run the following: brew install --build-from-source --with-python boost - for x in snappy leveldb protobuf gflags glog szip homebrew/science/opencv; do brew install $x; done + for x in snappy leveldb protobuf gflags glog szip lmdb homebrew/science/opencv; do brew install $x; done Building boost from source is needed to link against your local Python (exceptions might be raised during some OS X installs, but **ignore** these and continue). If you do not need the Python wrapper, simply doing `brew install boost` is fine. @@ -125,12 +148,12 @@ In OS X 10.9, clang++ is the default C++ compiler and uses `libc++` as the stand However, NVIDIA CUDA (even version 6.0) currently links only with `libstdc++`. This makes it necessary to change the compilation settings for each of the dependencies. -We do this by modifying the homebrew formulae before installing any packages. -Make sure that homebrew doesn't install any software dependencies in the background; all packages must be linked to `libstdc++`. +We do this by modifying the Homebrew formulae before installing any packages. +Make sure that Homebrew doesn't install any software dependencies in the background; all packages must be linked to `libstdc++`. -The prerequisite homebrew formulae are +The prerequisite Homebrew formulae are - boost snappy leveldb protobuf gflags glog szip homebrew/science/opencv + boost snappy leveldb protobuf gflags glog szip lmdb homebrew/science/opencv For each of these formulas, `brew edit FORMULA`, and add the ENV definitions as shown: @@ -145,11 +168,11 @@ For each of these formulas, `brew edit FORMULA`, and add the ENV definitions as To edit the formulae in turn, run - for x in snappy leveldb protobuf gflags glog szip boost homebrew/science/opencv; do brew edit $x; done + for x in snappy leveldb protobuf gflags glog szip boost lmdb homebrew/science/opencv; do brew edit $x; done After this, run - for x in snappy leveldb protobuf gflags glog szip homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; done + for x in snappy leveldb protobuf gflags glog szip lmdb homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; done brew install --build-from-source --with-python --fresh -vd boost **Note** that `brew install --build-from-source --fresh -vd boost` is fine if you do not need the Caffe Python wrapper. @@ -176,11 +199,10 @@ The defaults should work, but uncomment the relevant lines if using Anaconda Pyt make test make runtest -Note that if there is no GPU in your machine, building and running CPU-only works, but GPU tests will naturally fail. +If there is no GPU in your machine, you should switch to CPU-only Caffe by uncommenting `CPU_ONLY := 1` in `Makefile.config`. To compile the Python and MATLAB wrappers do `make pycaffe` and `make matcaffe` respectively. Be sure to set your MATLAB and Python paths in `Makefile.config` first! -For Python support, you must add the compiled module to your `$PYTHONPATH` (as `/path/to/caffe/python` or the like). *Distribution*: run `make distribute` to create a `distribute` directory with all the Caffe headers, compiled libraries, binaries, etc. needed for distribution to other machines. From 62bbc41e0e2cf2f22f0d30ff795aa09c99d3c63e Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 29 Jul 2014 22:57:47 -0700 Subject: [PATCH 0359/2053] link OpenBLAS as blas OpenBLAS is most easily configured by `update-alternatives` or other symlink strategies. See https://github.com/BVLC/caffe/issues/314#issuecomment-40703048 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8e8ebedbc57..62e5158b9bd 100644 --- a/Makefile +++ b/Makefile @@ -252,7 +252,7 @@ ifeq ($(BLAS), mkl) BLAS_LIB ?= $(MKL_DIR)/lib $(MKL_DIR)/lib/intel64 else ifeq ($(BLAS), open) # OpenBLAS - LIBRARIES += openblas + LIBRARIES += blas else # ATLAS ifeq ($(LINUX), 1) From a08faf645dc8c223718c99a6695fc4072ed3164c Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Tue, 15 Jul 2014 08:13:00 -0700 Subject: [PATCH 0360/2053] [docs] contact us on webpage --- docs/index.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 6ffab7a0675..b8e58cf52dc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -41,7 +41,7 @@ A 4-page report for the ACM Multimedia Open Source competition. Tested on Ubuntu, Red Hat, OS X. * [Pre-trained models](/getting_pretrained_models.html)
    BVLC provides ready-to-use models for non-commercial use. -* [Development](/development.html)
    +* [Developing & Contributing](/development.html)
    Guidelines for development and contributing to Caffe. ### Examples @@ -85,4 +85,13 @@ Additionally, the open-source community plays a large and growing role in Caffe' Check out the Github [project pulse](https://github.com/BVLC/caffe/pulse) for recent activity, and the [contributors](https://github.com/BVLC/caffe/graphs/contributors) for a sorted list. We sincerely appreciate your interest and contributions! -If you'd like to contribute, please read the [development guide](development.html). +If you'd like to contribute, please read the [developing & contributing](development.html) guide. + +## Contacting us + +All questions about installation, code, future development, and applications should be searched for and asked at [GitHub Issues](https://github.com/BVLC/caffe/issues). + +If you have a proposal that may not be suited for public discussion *and an ability to act on it*, please email us [directly](mailto:caffe-dev@googlegroups.com). +Requests for features, explanations, or personal help will be ignored; post such matters publicly as issues. + +Some developers may be able to provide [consulting services](mailto:caffe-coldpress@googlegroups.com) for appropriate projects. From 0428913a3b1c7acc3538557ed0ea0e0db6d69c9c Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Tue, 15 Jul 2014 18:29:19 -0700 Subject: [PATCH 0361/2053] [fix] adding requirements.txt for web_demo. Closes #704 --- examples/web_demo/requirements.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 examples/web_demo/requirements.txt diff --git a/examples/web_demo/requirements.txt b/examples/web_demo/requirements.txt new file mode 100644 index 00000000000..8fb1d2ccbb2 --- /dev/null +++ b/examples/web_demo/requirements.txt @@ -0,0 +1,6 @@ +werkzeug +flask +tornado +numpy +pandas +pillow From 4f0e38add5f64ef28ee6a5a6c827923dbfeaf38f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 29 Jul 2014 09:21:39 -0700 Subject: [PATCH 0362/2053] [example] standardize imagenet leveldb names --- examples/imagenet/create_imagenet.sh | 4 ++-- examples/imagenet/readme.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/imagenet/create_imagenet.sh b/examples/imagenet/create_imagenet.sh index 8767f120a83..24f961bee4c 100755 --- a/examples/imagenet/create_imagenet.sh +++ b/examples/imagenet/create_imagenet.sh @@ -38,7 +38,7 @@ echo "Creating train leveldb..." GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \ $TRAIN_DATA_ROOT \ $DATA/train.txt \ - imagenet_train_leveldb 1 \ + ilsvrc12_train_leveldb 1 $RESIZE_HEIGHT $RESIZE_WIDTH echo "Creating val leveldb..." @@ -46,7 +46,7 @@ echo "Creating val leveldb..." GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \ $VAL_DATA_ROOT \ $DATA/val.txt \ - imagenet_val_leveldb 1 \ + ilsvrc12_val_leveldb 1 $RESIZE_HEIGHT $RESIZE_WIDTH echo "Done." diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index 0b5b8452188..2273c877ca5 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -41,7 +41,7 @@ You may want to resize the images to 256x256 in advance. By default, we do not e Go to `$CAFFE_ROOT/examples/imagenet/` for the rest of this guide. -Take a look at `create_imagenet.sh`. Set the paths to the train and val dirs as needed, and set "RESIZE=true" to resize all images to 256x256 if you haven't resized the images in advance. Now simply create the leveldbs with `./create_imagenet.sh`. Note that `imagenet_train_leveldb` and `imagenet_val_leveldb` should not exist before this execution. It will be created by the script. `GLOG_logtostderr=1` simply dumps more information for you to inspect, and you can safely ignore it. +Take a look at `create_imagenet.sh`. Set the paths to the train and val dirs as needed, and set "RESIZE=true" to resize all images to 256x256 if you haven't resized the images in advance. Now simply create the leveldbs with `./create_imagenet.sh`. Note that `ilsvrc12_train_leveldb` and `ilsvrc12_val_leveldb` should not exist before this execution. It will be created by the script. `GLOG_logtostderr=1` simply dumps more information for you to inspect, and you can safely ignore it. Compute Image Mean ------------------ From d726338b22665d053d6665f4d6ffae01fecb5e17 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 29 Jul 2014 23:37:09 -0700 Subject: [PATCH 0363/2053] [docs] announce caffe-users --- docs/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index b8e58cf52dc..333f5f7e048 100644 --- a/docs/index.md +++ b/docs/index.md @@ -89,7 +89,9 @@ If you'd like to contribute, please read the [developing & contributing](develop ## Contacting us -All questions about installation, code, future development, and applications should be searched for and asked at [GitHub Issues](https://github.com/BVLC/caffe/issues). +All questions about usage, installation, code, and applications should be searched for and asked on the [caffe-users mailing list](https://groups.google.com/forum/#!forum/caffe-users). + +All development discussion should be carried out at [GitHub Issues](https://github.com/BVLC/caffe/issues). If you have a proposal that may not be suited for public discussion *and an ability to act on it*, please email us [directly](mailto:caffe-dev@googlegroups.com). Requests for features, explanations, or personal help will be ignored; post such matters publicly as issues. From e4dece55f5975ff1dd5d9c0a062d02378acefe8f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 30 Jul 2014 00:48:35 -0700 Subject: [PATCH 0364/2053] [example] include image dimensions for oversampling --- examples/imagenet_classification.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/imagenet_classification.ipynb b/examples/imagenet_classification.ipynb index 7ac140d9e79..9a7113e6892 100644 --- a/examples/imagenet_classification.ipynb +++ b/examples/imagenet_classification.ipynb @@ -60,7 +60,8 @@ "net = caffe.Classifier(MODEL_FILE, PRETRAINED,\n", " mean_file=caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy',\n", " channel_swap=(2,1,0),\n", - " input_scale=255)" + " input_scale=255,\n" + " image_dims=(256, 256))" ], "language": "python", "metadata": {}, From ee03edea23edd611b6a3fc5e3d7a440b24f780ed Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 31 Jul 2014 18:14:12 -0700 Subject: [PATCH 0365/2053] [example] fix imagenet classification typo --- examples/imagenet_classification.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/imagenet_classification.ipynb b/examples/imagenet_classification.ipynb index 9a7113e6892..e7fe9f84677 100644 --- a/examples/imagenet_classification.ipynb +++ b/examples/imagenet_classification.ipynb @@ -60,7 +60,7 @@ "net = caffe.Classifier(MODEL_FILE, PRETRAINED,\n", " mean_file=caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy',\n", " channel_swap=(2,1,0),\n", - " input_scale=255,\n" + " input_scale=255,\n", " image_dims=(256, 256))" ], "language": "python", From 8c15185812efc58c32dca00a97e93edfbddd1dce Mon Sep 17 00:00:00 2001 From: qipeng Date: Thu, 31 Jul 2014 16:43:21 -0700 Subject: [PATCH 0366/2053] Included cmath in common.hpp to avoid isnan complaints from the xcode compiler --- include/caffe/common.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index ff8649ad2a1..58f500d0984 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -10,6 +10,8 @@ #include #include +#include + #include "caffe/util/device_alternate.hpp" // Disable the copy and assignment operator for a class. From 9f2b8f305d87974b5f3c3090286075e265fb006c Mon Sep 17 00:00:00 2001 From: qipeng Date: Fri, 1 Aug 2014 08:09:18 -0700 Subject: [PATCH 0367/2053] turns out you need using::isnan too --- include/caffe/common.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 58f500d0984..789b3db023f 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -81,6 +81,7 @@ using std::pair; using std::set; using std::string; using std::vector; +using std::isnan; // A global initialization function that you should call in your main function. // Currently it initializes google flags and google logging. From 7eb8a6fe451317292180ac9474329a5a072c61b4 Mon Sep 17 00:00:00 2001 From: qipeng Date: Fri, 1 Aug 2014 08:10:19 -0700 Subject: [PATCH 0368/2053] the compiler complains about solver tests using pointers as bool --- src/caffe/test/test_solver.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/caffe/test/test_solver.cpp b/src/caffe/test/test_solver.cpp index 9e087b08c53..8b241daeda1 100644 --- a/src/caffe/test/test_solver.cpp +++ b/src/caffe/test/test_solver.cpp @@ -96,14 +96,14 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { " } " "} "; this->InitSolverFromProtoString(proto); - ASSERT_TRUE(this->solver_->net()); - EXPECT_TRUE(this->solver_->net()->has_layer("loss")); - EXPECT_FALSE(this->solver_->net()->has_layer("accuracy")); + ASSERT_TRUE((bool)this->solver_->net()); + EXPECT_TRUE((bool)this->solver_->net()->has_layer("loss")); + EXPECT_FALSE((bool)this->solver_->net()->has_layer("accuracy")); ASSERT_EQ(2, this->solver_->test_nets().size()); - EXPECT_TRUE(this->solver_->test_nets()[0]->has_layer("loss")); - EXPECT_TRUE(this->solver_->test_nets()[0]->has_layer("accuracy")); - EXPECT_FALSE(this->solver_->test_nets()[1]->has_layer("loss")); - EXPECT_TRUE(this->solver_->test_nets()[1]->has_layer("accuracy")); + EXPECT_TRUE((bool)this->solver_->test_nets()[0]->has_layer("loss")); + EXPECT_TRUE((bool)this->solver_->test_nets()[0]->has_layer("accuracy")); + EXPECT_FALSE((bool)this->solver_->test_nets()[1]->has_layer("loss")); + EXPECT_TRUE((bool)this->solver_->test_nets()[1]->has_layer("accuracy")); } } // namespace caffe From d78a8de102111525ae66a4536093d58823fd7129 Mon Sep 17 00:00:00 2001 From: qipeng Date: Fri, 1 Aug 2014 08:28:43 -0700 Subject: [PATCH 0369/2053] lint --- src/caffe/test/test_solver.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/caffe/test/test_solver.cpp b/src/caffe/test/test_solver.cpp index 8b241daeda1..20bad95f878 100644 --- a/src/caffe/test/test_solver.cpp +++ b/src/caffe/test/test_solver.cpp @@ -96,14 +96,18 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { " } " "} "; this->InitSolverFromProtoString(proto); - ASSERT_TRUE((bool)this->solver_->net()); - EXPECT_TRUE((bool)this->solver_->net()->has_layer("loss")); - EXPECT_FALSE((bool)this->solver_->net()->has_layer("accuracy")); + ASSERT_TRUE(static_cast(this->solver_->net())); + EXPECT_TRUE(static_cast(this->solver_->net()->has_layer("loss"))); + EXPECT_FALSE(static_cast(this->solver_->net()->has_layer("accuracy"))); ASSERT_EQ(2, this->solver_->test_nets().size()); - EXPECT_TRUE((bool)this->solver_->test_nets()[0]->has_layer("loss")); - EXPECT_TRUE((bool)this->solver_->test_nets()[0]->has_layer("accuracy")); - EXPECT_FALSE((bool)this->solver_->test_nets()[1]->has_layer("loss")); - EXPECT_TRUE((bool)this->solver_->test_nets()[1]->has_layer("accuracy")); + EXPECT_TRUE(static_cast( + this->solver_->test_nets()[0]->has_layer("loss"))); + EXPECT_TRUE(static_cast( + this->solver_->test_nets()[0]->has_layer("accuracy"))); + EXPECT_FALSE(static_cast( + this->solver_->test_nets()[1]->has_layer("loss"))); + EXPECT_TRUE(static_cast( + this->solver_->test_nets()[1]->has_layer("accuracy"))); } } // namespace caffe From 21d1d91ed63e4ffb486560c0d22278357c3aa896 Mon Sep 17 00:00:00 2001 From: qipeng Date: Fri, 1 Aug 2014 14:24:22 -0700 Subject: [PATCH 0370/2053] fixed unnecessary conversions in test_solver, and rearraged common.hpp a bit --- include/caffe/common.hpp | 5 ++--- src/caffe/test/test_solver.cpp | 18 +++++++----------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 789b3db023f..d3dbd471e67 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -6,12 +6,11 @@ #include #include +#include #include #include #include -#include - #include "caffe/util/device_alternate.hpp" // Disable the copy and assignment operator for a class. @@ -73,6 +72,7 @@ using boost::shared_ptr; // Common functions and classes from std that caffe often uses. using std::fstream; using std::ios; +using std::isnan; using std::iterator; using std::make_pair; using std::map; @@ -81,7 +81,6 @@ using std::pair; using std::set; using std::string; using std::vector; -using std::isnan; // A global initialization function that you should call in your main function. // Currently it initializes google flags and google logging. diff --git a/src/caffe/test/test_solver.cpp b/src/caffe/test/test_solver.cpp index 20bad95f878..feefb51210a 100644 --- a/src/caffe/test/test_solver.cpp +++ b/src/caffe/test/test_solver.cpp @@ -96,18 +96,14 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { " } " "} "; this->InitSolverFromProtoString(proto); - ASSERT_TRUE(static_cast(this->solver_->net())); - EXPECT_TRUE(static_cast(this->solver_->net()->has_layer("loss"))); - EXPECT_FALSE(static_cast(this->solver_->net()->has_layer("accuracy"))); + ASSERT_TRUE(this->solver_->net() != NULL); + EXPECT_TRUE(this->solver_->net()->has_layer("loss")); + EXPECT_FALSE(this->solver_->net()->has_layer("accuracy")); ASSERT_EQ(2, this->solver_->test_nets().size()); - EXPECT_TRUE(static_cast( - this->solver_->test_nets()[0]->has_layer("loss"))); - EXPECT_TRUE(static_cast( - this->solver_->test_nets()[0]->has_layer("accuracy"))); - EXPECT_FALSE(static_cast( - this->solver_->test_nets()[1]->has_layer("loss"))); - EXPECT_TRUE(static_cast( - this->solver_->test_nets()[1]->has_layer("accuracy"))); + EXPECT_TRUE(this->solver_->test_nets()[0]->has_layer("loss")); + EXPECT_TRUE(this->solver_->test_nets()[0]->has_layer("accuracy")); + EXPECT_FALSE(this->solver_->test_nets()[1]->has_layer("loss")); + EXPECT_TRUE(this->solver_->test_nets()[1]->has_layer("accuracy")); } } // namespace caffe From fc4e1d11e6b8a44417085113fda4a8f9b3e7d072 Mon Sep 17 00:00:00 2001 From: qipeng Date: Fri, 1 Aug 2014 14:53:35 -0700 Subject: [PATCH 0371/2053] fix compiler complaint in matcaffe --- matlab/caffe/matcaffe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index 957ebea008e..2aad3192a65 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -183,7 +183,7 @@ static mxArray* do_get_weights() { mxArray* mx_layer_cells = NULL; if (layer_names[i] != prev_layer_name) { prev_layer_name = layer_names[i]; - const mwSize dims[2] = {layer_blobs.size(), 1}; + const mwSize dims[2] = {static_cast(layer_blobs.size()), 1}; mx_layer_cells = mxCreateCellArray(2, dims); mxSetField(mx_layers, mx_layer_index, "weights", mx_layer_cells); mxSetField(mx_layers, mx_layer_index, "layer_names", From 737b79ea72a0193bc7767fc0b7054e78714a9e9a Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 1 Aug 2014 19:10:16 -0700 Subject: [PATCH 0372/2053] Test that DropoutLayer obeys dropout_ratio. --- src/caffe/test/test_neuron_layer.cpp | 57 ++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 7a7af3188fe..b3a536a7bfd 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -17,6 +17,7 @@ namespace caffe { template class NeuronLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; + protected: NeuronLayerTest() : blob_bottom_(new Blob(2, 3, 4, 5)), @@ -34,6 +35,38 @@ class NeuronLayerTest : public MultiDeviceTest { Blob* const blob_top_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; + + void TestDropoutForward(const float dropout_ratio) { + LayerParameter layer_param; + // Fill in the given dropout_ratio, unless it's 0.5, in which case we don't + // set it explicitly to test that 0.5 is the default. + if (dropout_ratio != 0.5) { + layer_param.mutable_dropout_param()->set_dropout_ratio(dropout_ratio); + } + Caffe::set_phase(Caffe::TRAIN); + DropoutLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); + float scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); + const int count = this->blob_bottom_->count(); + // Initialize num_kept to count the number of inputs NOT dropped out. + int num_kept = 0; + for (int i = 0; i < count; ++i) { + if (top_data[i] != 0) { + ++num_kept; + EXPECT_EQ(top_data[i], bottom_data[i] * scale); + } + } + const Dtype std_error = sqrt(dropout_ratio * (1 - dropout_ratio) / count); + // Fail if the number dropped was more than 1.96 * std_error away from the + // expected number -- requires 95% confidence that the dropout layer is not + // obeying the given dropout_ratio for test failure. + const Dtype empirical_dropout_ratio = 1 - num_kept / Dtype(count); + EXPECT_NEAR(empirical_dropout_ratio, dropout_ratio, 1.96 * std_error); + } }; TYPED_TEST_CASE(NeuronLayerTest, TestDtypesAndDevices); @@ -114,22 +147,14 @@ TYPED_TEST(NeuronLayerTest, TestSigmoidGradient) { &(this->blob_top_vec_)); } -TYPED_TEST(NeuronLayerTest, TestDropout) { - typedef typename TypeParam::Dtype Dtype; - LayerParameter layer_param; - Caffe::set_phase(Caffe::TRAIN); - DropoutLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Now, check values - const Dtype* bottom_data = this->blob_bottom_->cpu_data(); - const Dtype* top_data = this->blob_top_->cpu_data(); - float scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - if (top_data[i] != 0) { - EXPECT_EQ(top_data[i], bottom_data[i] * scale); - } - } +TYPED_TEST(NeuronLayerTest, TestDropoutHalf) { + const float kDropoutRatio = 0.5; + this->TestDropoutForward(kDropoutRatio); +} + +TYPED_TEST(NeuronLayerTest, TestDropoutThreeQuarters) { + const float kDropoutRatio = 0.75; + this->TestDropoutForward(kDropoutRatio); } TYPED_TEST(NeuronLayerTest, TestDropoutTestPhase) { From 8880ac8706a205623b830a0f1edb5d2dbbe590d8 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 2 Aug 2014 13:17:09 -0700 Subject: [PATCH 0373/2053] Add script to speedtest imagenet (currently broken as FilterNet ignores Caffe::phase()). --- examples/imagenet/speedtest_imagenet.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100755 examples/imagenet/speedtest_imagenet.sh diff --git a/examples/imagenet/speedtest_imagenet.sh b/examples/imagenet/speedtest_imagenet.sh new file mode 100755 index 00000000000..c790d835c14 --- /dev/null +++ b/examples/imagenet/speedtest_imagenet.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env sh + +TOOLS=../../build/tools + +if [ -z "$1" ]; then + echo "Using CPU! To run GPU speedtest, use:" + echo " ./speedtest_imagenet.sh " + echo "(Try ./speedtest_imagenet.sh 0 if you have just one GPU.)" + sleep 3 # Let the user read + WITH_GPU=false + DEVICE_ID=0 +else + WITH_GPU=true + DEVICE_ID=$1 +fi + +GLOG_logtostderr=1 $TOOLS/caffe.bin speedtest \ + --net_proto_file=imagenet_train_val.prototxt \ + --speedtest_with_gpu=${WITH_GPU} \ + --device_id=${DEVICE_ID} + +echo "Done." From 81e240b351e7fbbc9d6dab2eab3970389ef1ce60 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 2 Aug 2014 13:10:46 -0700 Subject: [PATCH 0374/2053] Add tests for phase filtering according to Caffe singleton phase (currently failing as FilterNet ignores the singleton phase). --- src/caffe/test/test_net.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index c4181345573..a0a387929be 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -961,8 +961,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} "; const string input_proto_train = "state: { phase: TRAIN } " + input_proto; const string input_proto_test = "state: { phase: TEST } " + input_proto; - const string& output_proto_train = - "state: { phase: TRAIN } " + const string output_proto_train = "name: 'LeNet' " "layers { " " name: 'mnist' " @@ -1020,7 +1019,6 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'loss' " "} "; const string& output_proto_test = - "state: { phase: TEST } " "name: 'LeNet' " "layers { " " name: 'mnist' " @@ -1085,8 +1083,26 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " bottom: 'label' " " top: 'loss' " "} "; - this->RunFilterNetTest(input_proto_train, output_proto_train); - this->RunFilterNetTest(input_proto_test, output_proto_test); + const string output_proto_train_explicit = + output_proto_train + " state: { phase: TRAIN } "; + const string output_proto_test_explicit = + output_proto_test + " state: { phase: TEST } "; + this->RunFilterNetTest(input_proto_train, output_proto_train_explicit); + this->RunFilterNetTest(input_proto_test, output_proto_test_explicit); + + // Also check that nets are filtered according to the Caffe singleton phase, + // if not explicitly specified in the input proto. + Caffe::set_phase(Caffe::TRAIN); + this->RunFilterNetTest(input_proto, output_proto_train); + Caffe::set_phase(Caffe::TEST); + this->RunFilterNetTest(input_proto, output_proto_test); + + // Finally, check that the current Caffe singleton phase is ignored if the + // phase is explicitly specified in the input proto. + Caffe::set_phase(Caffe::TEST); + this->RunFilterNetTest(input_proto_train, output_proto_train_explicit); + Caffe::set_phase(Caffe::TRAIN); + this->RunFilterNetTest(input_proto_test, output_proto_test_explicit); } TEST_F(FilterNetTest, TestFilterOutByStage) { From 4cece16571e39e74c7a12bf677b044c9f5341180 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 2 Aug 2014 13:17:15 -0700 Subject: [PATCH 0375/2053] Fix speedtest (and possibly other tools) by setting the net phase to the current Caffe::phase() unless explicitly specified in the state. --- src/caffe/net.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index a4d1f235a5a..b80bbba8479 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -174,7 +174,21 @@ void Net::Init(const NetParameter& in_param) { template void Net::FilterNet(const NetParameter& param, NetParameter* param_filtered) { - const NetState& net_state = param.state(); + NetState net_state(param.state()); + // Let the phase of the net be the current global phase provided in the Caffe + // singleton, unless explicitly provided by the state. + if (!net_state.has_phase()) { + switch (Caffe::phase()) { + case Caffe::TRAIN: + net_state.set_phase(TRAIN); + break; + case Caffe::TEST: + net_state.set_phase(TEST); + break; + default: + LOG(FATAL) << "Unknown phase: " << Caffe::phase(); + } + } param_filtered->CopyFrom(param); param_filtered->clear_layers(); for (int i = 0; i < param.layers_size(); ++i) { From db286e430d282d04e222a50cfca7875867b55df8 Mon Sep 17 00:00:00 2001 From: netheril96 Date: Mon, 4 Aug 2014 12:28:21 +0800 Subject: [PATCH 0376/2053] Fix and improve multiple places about random number generation and shuffling --- include/caffe/util/rng.hpp | 30 ++++++++++++++++++++++++--- src/caffe/common.cpp | 13 +++++++++++- src/caffe/layers/image_data_layer.cpp | 11 +++------- tools/convert_imageset.cpp | 3 ++- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/include/caffe/util/rng.hpp b/include/caffe/util/rng.hpp index 5909d1715ed..2b79ef1801b 100644 --- a/include/caffe/util/rng.hpp +++ b/include/caffe/util/rng.hpp @@ -4,16 +4,40 @@ #define CAFFE_RNG_CPP_HPP_ #include +#include +#include +#include #include "caffe/common.hpp" namespace caffe { - typedef boost::mt19937 rng_t; +typedef boost::mt19937 rng_t; - inline rng_t* caffe_rng() { - return static_cast(Caffe::rng_stream().generator()); +inline rng_t* caffe_rng() { + return static_cast(Caffe::rng_stream().generator()); +} + +// Fisher–Yates algorithm +template +inline void shuffle(RandomAccessIterator begin, RandomAccessIterator end, + RandomGenerator* gen) { + typedef typename std::iterator_traits::difference_type + difference_type; + typedef typename boost::uniform_int dist_type; + + difference_type length = std::distance(begin, end); + if (length <= 0) return; + + for (difference_type i = length - 1; i > 0; --i) { + dist_type dist(0, i); + std::iter_swap(begin + i, begin + dist(*gen)); } +} +template +inline void shuffle(RandomAccessIterator begin, RandomAccessIterator end) { + shuffle(begin, end, caffe_rng()); +} } // namespace caffe #endif // CAFFE_RNG_HPP_ diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 1810bb70b61..019370b1dd7 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -26,6 +26,17 @@ shared_ptr Caffe::singleton_; // random seeding int64_t cluster_seedgen(void) { int64_t s, seed, pid; + FILE* f = fopen("/dev/urandom", "rb"); + if (f && fread(&seed, 1, sizeof(seed), f) == sizeof(seed)) { + fclose(f); + return seed; + } + + LOG(INFO) << "System entropy source not available, " + "using fallback algorithm to generate seed instead."; + if (f) + fclose(f); + pid = getpid(); s = time(NULL); seed = abs(((s * 181) * ((pid - 83) * 359)) % 104729); @@ -75,7 +86,7 @@ Caffe::RNG::RNG() : generator_(new Generator()) { } Caffe::RNG::RNG(unsigned int seed) : generator_(new Generator(seed)) { } Caffe::RNG& Caffe::RNG::operator=(const RNG& other) { - generator_.reset(other.generator_.get()); + generator_ = other.generator_; return *this; } diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index efd593808ec..a0f91af29fa 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -238,14 +238,9 @@ void ImageDataLayer::CreatePrefetchThread() { template void ImageDataLayer::ShuffleImages() { - const int num_images = lines_.size(); - for (int i = 0; i < num_images; ++i) { - const int max_rand_index = num_images - i; - const int rand_index = PrefetchRand() % max_rand_index; - pair item = lines_[rand_index]; - lines_.erase(lines_.begin() + rand_index); - lines_.push_back(item); - } + caffe::rng_t* prefetch_rng = + static_cast(prefetch_rng_->generator()); + shuffle(lines_.begin(), lines_.end(), prefetch_rng); } diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 28de653b2c7..21ff0d38104 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -28,6 +28,7 @@ #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" +#include "caffe/util/rng.hpp" using namespace caffe; // NOLINT(build/namespaces) using std::pair; @@ -60,7 +61,7 @@ int main(int argc, char** argv) { if (argc >= (arg_offset+5) && argv[arg_offset+4][0] == '1') { // randomly shuffle data LOG(INFO) << "Shuffling data"; - std::random_shuffle(lines.begin(), lines.end()); + shuffle(lines.begin(), lines.end()); } LOG(INFO) << "A total of " << lines.size() << " images."; From 5f520af6da1ae70f1a9b3a7fb5b29765927c4fae Mon Sep 17 00:00:00 2001 From: zszhong Date: Sun, 3 Aug 2014 13:55:06 +0800 Subject: [PATCH 0377/2053] modified test_concat_layer.cpp --- src/caffe/test/test_concat_layer.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/caffe/test/test_concat_layer.cpp b/src/caffe/test/test_concat_layer.cpp index 0550bb2d5c9..4cb28b1e24e 100644 --- a/src/caffe/test/test_concat_layer.cpp +++ b/src/caffe/test/test_concat_layer.cpp @@ -26,14 +26,17 @@ class ConcatLayerTest : public MultiDeviceTest { blob_top_(new Blob()) {} virtual void SetUp() { // fill the values + shared_ptr > filler; FillerParameter filler_param; filler_param.set_value(1.); - ConstantFiller filler(filler_param); - filler.Fill(this->blob_bottom_0); + filler.reset(new ConstantFiller(filler_param)); + filler->Fill(this->blob_bottom_0); filler_param.set_value(2.); - filler.Fill(this->blob_bottom_1); + filler.reset(new ConstantFiller(filler_param)); + filler->Fill(this->blob_bottom_1); filler_param.set_value(3.); - filler.Fill(this->blob_bottom_2); + filler.reset(new ConstantFiller(filler_param)); + filler->Fill(this->blob_bottom_2); blob_bottom_vec_0.push_back(blob_bottom_0); blob_bottom_vec_0.push_back(blob_bottom_1); blob_bottom_vec_1.push_back(blob_bottom_0); @@ -112,7 +115,7 @@ TYPED_TEST(ConcatLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ConcatLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-3); + GradientChecker checker(1e-2, 1e-2); checker.CheckGradient(&layer, &(this->blob_bottom_vec_0), &(this->blob_top_vec_)); } From 36fd64cfc44cef04d98d98bbd9fb773df3a3093e Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 4 Aug 2014 13:09:00 -0700 Subject: [PATCH 0378/2053] Add 'snapshot_after_train' to SolverParameter to override the final snapshot. --- src/caffe/proto/caffe.proto | 3 +++ src/caffe/solver.cpp | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index d2f61e57f34..4e77863e7e6 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -140,6 +140,9 @@ message SolverParameter { // If true, print information about the state of the net that may help with // debugging learning problems. optional bool debug_info = 23 [default = false]; + + // If false, don't save a snapshot after training finishes. + optional bool snapshot_after_train = 28 [default = true]; } // A message that stores the solver snapshots diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 11795f058cd..6049ddfec7c 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -200,8 +200,9 @@ void Solver::Solve(const char* resume_file) { ComputeUpdateValue(); net_->Update(); } - // Always save a snapshot after optimization. - Snapshot(); + // Always save a snapshot after optimization, unless overridden by setting + // snapshot_after_train := false. + if (param_.snapshot_after_train()) { Snapshot(); } // After the optimization is done, run an additional train and test pass to // display the train and test loss/outputs if appropriate (based on the // display and test_interval settings, respectively). Unlike in the rest of From b08729e366623245cf632681a0f747192f3b914a Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 3 Aug 2014 16:00:46 -0700 Subject: [PATCH 0379/2053] Add (momentum) SGD solver tests to check that learning rate, weight decay, and momentum are implemented properly on a least squares problem. --- src/caffe/test/test_sgd_solver.cpp | 346 +++++++++++++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 src/caffe/test/test_sgd_solver.cpp diff --git a/src/caffe/test/test_sgd_solver.cpp b/src/caffe/test/test_sgd_solver.cpp new file mode 100644 index 00000000000..a28ed7b1817 --- /dev/null +++ b/src/caffe/test/test_sgd_solver.cpp @@ -0,0 +1,346 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include +#include +#include + +#include "google/protobuf/text_format.h" + +#include "gtest/gtest.h" +#include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/solver.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +using std::ostringstream; + +namespace caffe { + +template +class SGDSolverTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + SGDSolverTest() : + seed_(1701), num_(5), channels_(3), height_(10), width_(10) {} + + // MockSGDSolver: an SGDSolver with public history. + class MockSGDSolver : public SGDSolver { + public: + explicit MockSGDSolver(const SolverParameter& param) : + SGDSolver(param) {} + vector > >& history() { return this->history_; } + }; + + shared_ptr solver_; + int seed_; + int num_, channels_, height_, width_; + + virtual void InitSolverFromProtoString(const string& proto) { + SolverParameter param; + CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); + // Disable saving a final snapshot so the tests don't pollute the user's + // working directory with useless snapshots. + param.set_snapshot_after_train(false); + // Set the solver_mode according to current Caffe::mode. + switch (Caffe::mode()) { + case Caffe::CPU: + param.set_solver_mode(SolverParameter_SolverMode_CPU); + break; + case Caffe::GPU: + param.set_solver_mode(SolverParameter_SolverMode_GPU); + break; + default: + LOG(FATAL) << "Unknown Caffe mode: " << Caffe::mode(); + } + solver_.reset(new MockSGDSolver(param)); + } + + void RunLeastSquaresSolver(const Dtype learning_rate, + const Dtype weight_decay, const Dtype momentum, const int num_iters) { + ostringstream proto; + proto << + "max_iter: " << num_iters << " " + "base_lr: " << learning_rate << " " + "lr_policy: 'fixed' " + "net_param { " + " name: 'TestNetwork' " + " layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: " << num_ << " " + " channels: " << channels_ << " " + " height: " << height_ << " " + " width: " << width_ << " " + " channels: 1 " + " height: 1 " + " width: 1 " + " data_filler { " + " type: 'gaussian' " + " std: 1.0 " + " } " + " } " + " top: 'data' " + " top: 'targets' " + " } " + " layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 1 " + " weight_filler { " + " type: 'gaussian' " + " std: 1.0 " + " } " + " bias_filler { " + " type: 'gaussian' " + " std: 1.0 " + " } " + " } " + " bottom: 'data' " + " top: 'innerprod' " + " } " + " layers: { " + " name: 'loss' " + " type: EUCLIDEAN_LOSS " + " bottom: 'innerprod' " + " bottom: 'targets' " + " } " + "} "; + if (weight_decay != 0) { + proto << "weight_decay: " << weight_decay << " "; + } + if (momentum != 0) { + proto << "momentum: " << momentum << " "; + } + Caffe::set_random_seed(this->seed_); + this->InitSolverFromProtoString(proto.str()); + this->solver_->Solve(); + } + + // Compute an update value given the current state of the train net, + // using the analytical formula for the least squares gradient. + // updated_params will store the updated weight and bias results, + // using the blobs' diffs to hold the update values themselves. + void ComputeLeastSquaresUpdate(const Dtype learning_rate, + const Dtype weight_decay, const Dtype momentum, + vector > >* updated_params) { + const int N = num_; + const int D = channels_ * height_ * width_; + + // Run a forward pass, and manually compute the update values from the + // result. + Net& net = *this->solver_->net(); + vector*> empty_bottom_vec; + net.Forward(empty_bottom_vec); + ASSERT_TRUE(net.has_blob("data")); + const Blob& data = *net.blob_by_name("data"); + ASSERT_TRUE(net.has_blob("targets")); + const Blob& targets = *net.blob_by_name("targets"); + ASSERT_TRUE(net.has_layer("innerprod")); + const vector > >& param_blobs = + net.layer_by_name("innerprod")->blobs(); + const int num_param_blobs = 2; + ASSERT_EQ(num_param_blobs, param_blobs.size()); + const Blob& weights = *param_blobs[0]; + const Blob& bias = *param_blobs[1]; + ASSERT_EQ(D * N, data.count()); + ASSERT_EQ(N, targets.count()); + ASSERT_EQ(D, weights.count()); + ASSERT_EQ(1, bias.count()); + + updated_params->clear(); + updated_params->resize(num_param_blobs); + for (int i = 0; i < num_param_blobs; ++i) { + (*updated_params)[i].reset(new Blob()); + } + Blob& updated_weights = *(*updated_params)[0]; + updated_weights.ReshapeLike(weights); + Blob& updated_bias = *(*updated_params)[1]; + updated_bias.ReshapeLike(bias); + + for (int i = 0; i <= D; ++i) { + // Compute the derivative with respect to the ith weight (i.e., the ith + // element of the gradient). + Dtype grad = 0; + for (int j = 0; j <= D; ++j) { + // Compute element (i, j) of X^T * X. + Dtype element = 0; + for (int k = 0; k < N; ++k) { + // (i, k) in X^T (== (k, i) in X) times (k, j) in X. + const Dtype element_i = (i == D) ? 1 : data.cpu_data()[k * D + i]; + const Dtype element_j = (j == D) ? 1 : data.cpu_data()[k * D + j]; + element += element_i * element_j; + } + if (j == D) { + grad += element * bias.cpu_data()[0]; + } else { + grad += element * weights.cpu_data()[j]; + } + } + for (int k = 0; k < N; ++k) { + const Dtype element_i = (i == D) ? 1 : data.cpu_data()[k * D + i]; + grad -= element_i * targets.cpu_data()[k]; + } + // Scale the gradient over the N samples. + grad /= N; + // Add the weight decay to the gradient. + grad += weight_decay * + ((i == D) ? bias.cpu_data()[0] : weights.cpu_data()[i]); + // Finally, add any momentum. + const vector > >& history = solver_->history(); + ASSERT_EQ(2, history.size()); // 1 blob for weights, 1 for bias + Dtype update_value = learning_rate * grad; + if (i == D) { + update_value += momentum * history[1]->cpu_data()[0]; + updated_bias.mutable_cpu_diff()[0] = update_value; + updated_bias.mutable_cpu_data()[0] = bias.cpu_data()[0] - update_value; + } else { + update_value += momentum * history[0]->cpu_data()[i]; + updated_weights.mutable_cpu_diff()[i] = update_value; + updated_weights.mutable_cpu_data()[i] = + weights.cpu_data()[i] - update_value; + } + } + } + + void CheckLeastSquaresUpdate( + const vector > >& updated_params) { + const int D = channels_ * height_ * width_; + + const Blob& updated_weights = *updated_params[0]; + const Blob& updated_bias = *updated_params[1]; + + Net& net = *this->solver_->net(); + ASSERT_TRUE(net.has_layer("innerprod")); + const vector > >& param_blobs = + net.layer_by_name("innerprod")->blobs(); + ASSERT_EQ(2, param_blobs.size()); + const Blob& solver_updated_weights = *param_blobs[0]; + ASSERT_EQ(D, solver_updated_weights.count()); + const double kPrecision = 1e-3; + const double kMinPrecision = 1e-7; + for (int i = 0; i < D; ++i) { + const Dtype expected_updated_weight = updated_weights.cpu_data()[i]; + const Dtype solver_updated_weight = solver_updated_weights.cpu_data()[i]; + const Dtype error_margin = std::max(kMinPrecision, kPrecision * + std::min(fabs(expected_updated_weight), fabs(solver_updated_weight))); + EXPECT_NEAR(expected_updated_weight, solver_updated_weight, error_margin); + } + const Blob& solver_updated_bias_blob = *param_blobs[1]; + ASSERT_EQ(1, solver_updated_bias_blob.count()); + const Dtype expected_updated_bias = updated_bias.cpu_data()[0]; + const Dtype solver_updated_bias = solver_updated_bias_blob.cpu_data()[0]; + const Dtype error_margin = std::max(kMinPrecision, kPrecision * + std::min(fabs(expected_updated_bias), fabs(solver_updated_bias))); + EXPECT_NEAR(expected_updated_bias, solver_updated_bias, error_margin); + + // Check the solver's history -- should contain the previous update value. + vector > >& history = this->solver_->history(); + ASSERT_EQ(2, history.size()); + for (int i = 0; i < D; ++i) { + const Dtype expected_history = updated_weights.cpu_diff()[i]; + const Dtype solver_history = history[0]->cpu_data()[i]; + const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * + std::min(fabs(expected_history), fabs(solver_history))); + EXPECT_NEAR(expected_history, solver_history, error_margin_hist); + } + const Dtype expected_history = updated_bias.cpu_diff()[0]; + const Dtype solver_history = history[1]->cpu_data()[0]; + const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * + std::min(fabs(expected_history), fabs(solver_history))); + EXPECT_NEAR(expected_history, solver_history, error_margin_hist); + } + + // Test that the correct update is computed for a regularized least squares + // problem: + // + // E = (1/(2n)) || X w - y ||^2 + (lambda / 2) || w ||^2 + // \nabla_w E = (1/n) (X^T X w - X^T y) + lambda * w + // + // X \in R^{n x (d+1)} (each example is a row, (d+1)th element is always 1) + // w \in R^{(d+1) x 1} ((d+1)th element is the bias) + // y \in R^{n x 1} + // lambda is weight_decay + // + // TestLeastSquaresUpdate works "inductively", assuming that the solver + // correctly updates the net K (= iter_to_check) times, then given the history + // from the Kth update, we compute the (K+1)th update and check that it + // matches the solver's (K+1)th update. + void TestLeastSquaresUpdate(const Dtype learning_rate = 1.0, + const Dtype weight_decay = 0.0, const Dtype momentum = 0.0, + const int iter_to_check = 0) { + // Initialize the solver and run K (= iter_to_check) solver iterations. + RunLeastSquaresSolver(learning_rate, weight_decay, momentum, iter_to_check); + + // Compute the (K+1)th update using the analytic least squares gradient. + vector > > updated_params; + ComputeLeastSquaresUpdate(learning_rate, weight_decay, momentum, + &updated_params); + + // Reinitialize the solver and run K+1 solver iterations. + RunLeastSquaresSolver(learning_rate, weight_decay, momentum, + iter_to_check + 1); + + // Check that the solver's solution matches ours. + CheckLeastSquaresUpdate(updated_params); + } +}; + +TYPED_TEST_CASE(SGDSolverTest, TestDtypesAndDevices); + +TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdate) { + typedef typename TypeParam::Dtype Dtype; + this->TestLeastSquaresUpdate(); +} + +TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdateLROneTenth) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 0.1; + this->TestLeastSquaresUpdate(kLearningRate); +} + +TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdateWithWeightDecay) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.5; + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay); +} + +TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdateWithMomentum) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.0; + const Dtype kMomentum = 0.5; + const int kNumIters = 1; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + +TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdateWithMomentumMultiIter) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.0; + const Dtype kMomentum = 0.5; + const int kNumIters = 5; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + +TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdateWithEverything) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 0.01; + const Dtype kWeightDecay = 0.1; + const Dtype kMomentum = 0.9; + const int kNumIters = 5; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + +} // namespace caffe From b1c4f121b4f01b538eef6997ba3af6c9a71afd31 Mon Sep 17 00:00:00 2001 From: Vik Kamath Date: Mon, 7 Jul 2014 15:01:56 +0300 Subject: [PATCH 0380/2053] Changed path in description to point to parse_log.sh It seems that parse_log.sh has moved from /path/to/caffe/scripts/ to /path/to/caffe/tools/extra. The edit changes the description to reflect this change. Nothing major really. --- tools/extra/plot_log.gnuplot.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/extra/plot_log.gnuplot.example b/tools/extra/plot_log.gnuplot.example index 76715c589f8..334ff1f2858 100644 --- a/tools/extra/plot_log.gnuplot.example +++ b/tools/extra/plot_log.gnuplot.example @@ -5,7 +5,7 @@ # You had better check the data files before designing your own plots. # Please generate the neccessary data files with -# /path/to/caffe/scripts/parse_log.sh before plotting. +# /path/to/caffe/tools/extra/parse_log.sh before plotting. # Example usage: # ./parse_log.sh mnist.log # Now you have mnist.log.train and mnist.log.test. From 6786385c82f48ef7c48ad488ab674ff3d750cb26 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 1 Aug 2014 19:42:41 -0700 Subject: [PATCH 0381/2053] Add "lintclean" target to remove current lint outputs -- forces lint to be run again next time "make lint" is run. --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 62e5158b9bd..84f8db26abb 100644 --- a/Makefile +++ b/Makefile @@ -295,7 +295,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo ############################## # Define build targets ############################## -.PHONY: all test clean linecount lint tools examples $(DIST_ALIASES) \ +.PHONY: all test clean linecount lint lintclean tools examples $(DIST_ALIASES) \ py mat py$(PROJECT) mat$(PROJECT) proto runtest \ superclean supercleanlist supercleanfiles warn everything @@ -308,6 +308,9 @@ linecount: lint: $(EMPTY_LINT_REPORT) +lintclean: + @ $(RM) -r $(LINT_OUTPUT_DIR) $(EMPTY_LINT_REPORT) $(NONEMPTY_LINT_REPORT) + $(EMPTY_LINT_REPORT): $(LINT_OUTPUTS) | $(BUILD_DIR) @ cat $(LINT_OUTPUTS) > $@ @ if [ -s "$@" ]; then \ From bd288793ff425a6753e9f60b28f7554524f6e63c Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 1 Aug 2014 19:58:56 -0700 Subject: [PATCH 0382/2053] Enable the 'build/include_alpha' rules to make lint check that the includes are correctly alphabetized. --- scripts/cpp_lint.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/cpp_lint.py b/scripts/cpp_lint.py index 76eee4b2dbe..3f0ca1c3527 100755 --- a/scripts/cpp_lint.py +++ b/scripts/cpp_lint.py @@ -210,7 +210,6 @@ # off by default (i.e., categories that must be enabled by the --filter= flags). # All entries here should start with a '-' or '+', as in the --filter= flag. _DEFAULT_FILTERS = [ - '-build/include_alpha', '-build/include_dir', '-readability/todo', ] From 92f00dd3a6a84315a302e09eead55506369c1104 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 1 Aug 2014 20:14:42 -0700 Subject: [PATCH 0383/2053] Fix header alphabetization lint errors. --- examples/cifar10/convert_cifar_data.cpp | 10 +++++----- examples/mnist/convert_mnist_data.cpp | 10 +++++----- include/caffe/blob.hpp | 2 +- include/caffe/common_layers.hpp | 4 ++-- include/caffe/data_layers.hpp | 6 +++--- include/caffe/filler.hpp | 4 ++-- include/caffe/loss_layers.hpp | 4 ++-- include/caffe/neuron_layers.hpp | 2 +- include/caffe/test/test_caffe_main.hpp | 2 +- include/caffe/util/io.hpp | 2 +- include/caffe/util/rng.hpp | 8 +++++--- matlab/caffe/matcaffe.cpp | 1 + src/caffe/layer_factory.cpp | 2 +- src/caffe/layers/accuracy_layer.cpp | 4 ++-- src/caffe/layers/concat_layer.cpp | 2 +- src/caffe/layers/concat_layer.cu | 2 +- src/caffe/layers/conv_layer.cpp | 4 ++-- src/caffe/layers/conv_layer.cu | 4 ++-- src/caffe/layers/data_layer.cpp | 4 ++-- src/caffe/layers/data_layer.cu | 8 ++++---- src/caffe/layers/dropout_layer.cpp | 2 +- src/caffe/layers/dropout_layer.cu | 2 +- src/caffe/layers/eltwise_layer.cpp | 2 +- src/caffe/layers/eltwise_layer.cu | 2 +- src/caffe/layers/euclidean_loss_layer.cpp | 4 ++-- src/caffe/layers/euclidean_loss_layer.cu | 4 ++-- src/caffe/layers/flatten_layer.cpp | 2 +- src/caffe/layers/flatten_layer.cu | 2 +- src/caffe/layers/hdf5_data_layer.cpp | 4 ++-- src/caffe/layers/hinge_loss_layer.cpp | 6 +++--- src/caffe/layers/im2col_layer.cpp | 2 +- src/caffe/layers/im2col_layer.cu | 2 +- src/caffe/layers/image_data_layer.cpp | 9 +++------ src/caffe/layers/image_data_layer.cu | 7 ------- src/caffe/layers/infogain_loss_layer.cpp | 6 +++--- src/caffe/layers/inner_product_layer.cpp | 2 +- src/caffe/layers/inner_product_layer.cu | 2 +- src/caffe/layers/loss_layer.cpp | 6 +++--- src/caffe/layers/lrn_layer.cpp | 2 +- src/caffe/layers/lrn_layer.cu | 2 +- src/caffe/layers/multinomial_logistic_loss_layer.cpp | 6 +++--- src/caffe/layers/pooling_layer.cpp | 2 +- src/caffe/layers/pooling_layer.cu | 2 +- src/caffe/layers/power_layer.cpp | 2 +- src/caffe/layers/power_layer.cu | 2 +- src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp | 2 +- src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu | 2 +- src/caffe/layers/slice_layer.cpp | 4 ++-- src/caffe/layers/slice_layer.cu | 2 +- src/caffe/layers/softmax_layer.cpp | 2 +- src/caffe/layers/softmax_layer.cu | 2 +- src/caffe/layers/softmax_loss_layer.cpp | 2 +- src/caffe/layers/softmax_loss_layer.cu | 2 +- src/caffe/layers/split_layer.cpp | 2 +- src/caffe/layers/split_layer.cu | 2 +- src/caffe/layers/window_data_layer.cpp | 6 +++--- src/caffe/layers/window_data_layer.cu | 2 +- src/caffe/net.cpp | 5 +++-- src/caffe/test/test_accuracy_layer.cpp | 3 ++- src/caffe/test/test_argmax_layer.cpp | 2 +- src/caffe/test/test_benchmark.cpp | 4 +++- src/caffe/test/test_blob.cpp | 3 ++- src/caffe/test/test_common.cpp | 2 ++ src/caffe/test/test_concat_layer.cpp | 3 ++- src/caffe/test/test_convolution_layer.cpp | 3 ++- src/caffe/test/test_data_layer.cpp | 5 ++++- src/caffe/test/test_dummy_data_layer.cpp | 4 +++- src/caffe/test/test_eltwise_layer.cpp | 3 ++- src/caffe/test/test_euclidean_loss_layer.cpp | 3 ++- src/caffe/test/test_filler.cpp | 1 + src/caffe/test/test_flatten_layer.cpp | 3 ++- src/caffe/test/test_hdf5_output_layer.cpp | 4 +++- src/caffe/test/test_hdf5data_layer.cpp | 4 +++- src/caffe/test/test_hinge_loss_layer.cpp | 3 ++- src/caffe/test/test_im2col_kernel.cu | 3 ++- src/caffe/test/test_im2col_layer.cpp | 3 ++- src/caffe/test/test_image_data_layer.cpp | 6 ++++-- src/caffe/test/test_infogain_loss_layer.cpp | 3 ++- src/caffe/test/test_inner_product_layer.cpp | 3 ++- src/caffe/test/test_lrn_layer.cpp | 3 ++- src/caffe/test/test_math_functions.cpp | 1 + src/caffe/test/test_maxpool_dropout_layers.cpp | 3 ++- src/caffe/test/test_memory_data_layer.cpp | 1 + .../test/test_multinomial_logistic_loss_layer.cpp | 3 ++- src/caffe/test/test_net.cpp | 5 ++--- src/caffe/test/test_neuron_layer.cpp | 3 ++- src/caffe/test/test_platform.cpp | 3 ++- src/caffe/test/test_pooling_layer.cpp | 3 ++- src/caffe/test/test_power_layer.cpp | 2 +- src/caffe/test/test_protobuf.cpp | 4 +++- src/caffe/test/test_random_number_generator.cpp | 2 ++ src/caffe/test/test_sgd_solver.cpp | 1 + .../test/test_sigmoid_cross_entropy_loss_layer.cpp | 3 ++- src/caffe/test/test_slice_layer.cpp | 3 ++- src/caffe/test/test_softmax_layer.cpp | 3 ++- src/caffe/test/test_softmax_with_loss_layer.cpp | 3 ++- src/caffe/test/test_solver.cpp | 2 +- src/caffe/test/test_split_layer.cpp | 5 +++-- src/caffe/test/test_stochastic_pooling.cpp | 3 ++- src/caffe/test/test_syncedmem.cpp | 1 + src/caffe/test/test_tanh_layer.cpp | 3 ++- src/caffe/test/test_threshold_layer.cpp | 2 +- src/caffe/test/test_upgrade_proto.cpp | 1 + src/caffe/test/test_util_blas.cpp | 1 + src/caffe/util/insert_splits.cpp | 2 +- src/caffe/util/io.cpp | 10 +++++----- src/caffe/util/upgrade_proto.cpp | 6 +++--- tools/dump_network.cpp | 4 ++-- tools/extract_features.cpp | 11 ++++++----- tools/test_net.cpp | 2 +- tools/upgrade_net_proto_binary.cpp | 2 +- tools/upgrade_net_proto_text.cpp | 2 +- 112 files changed, 210 insertions(+), 165 deletions(-) diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index 8e223b212ad..d1f3f3e0e9f 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -7,14 +7,14 @@ // The CIFAR dataset could be downloaded at // http://www.cs.toronto.edu/~kriz/cifar.html -#include -#include -#include - -#include #include // NOLINT(readability/streams) #include +#include "glog/logging.h" +#include "google/protobuf/text_format.h" +#include "leveldb/db.h" +#include "stdint.h" + #include "caffe/proto/caffe.pb.h" using std::string; diff --git a/examples/mnist/convert_mnist_data.cpp b/examples/mnist/convert_mnist_data.cpp index 593a2d23313..c2cf4b3af33 100644 --- a/examples/mnist/convert_mnist_data.cpp +++ b/examples/mnist/convert_mnist_data.cpp @@ -7,14 +7,14 @@ // The MNIST dataset could be downloaded at // http://yann.lecun.com/exdb/mnist/ -#include -#include -#include - -#include #include // NOLINT(readability/streams) #include +#include "glog/logging.h" +#include "google/protobuf/text_format.h" +#include "leveldb/db.h" +#include "stdint.h" + #include "caffe/proto/caffe.pb.h" uint32_t swap_endian(uint32_t val) { diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index ab7a0f60f80..2086c5119bc 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -4,8 +4,8 @@ #define CAFFE_BLOB_HPP_ #include "caffe/common.hpp" -#include "caffe/syncedmem.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/syncedmem.hpp" #include "caffe/util/math_functions.hpp" namespace caffe { diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 5d872452ae2..ed11487c6f3 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -9,10 +9,10 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" +#include "caffe/data_layers.hpp" #include "caffe/layer.hpp" -#include "caffe/neuron_layers.hpp" #include "caffe/loss_layers.hpp" -#include "caffe/data_layers.hpp" +#include "caffe/neuron_layers.hpp" #include "caffe/proto/caffe.pb.h" namespace caffe { diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 107d7800d1e..f868b2869da 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -7,17 +7,17 @@ #include #include +#include "boost/scoped_ptr.hpp" +#include "hdf5.h" #include "leveldb/db.h" #include "lmdb.h" -#include "hdf5.h" -#include "boost/scoped_ptr.hpp" #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" +#include "caffe/internal_thread.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" -#include "caffe/internal_thread.hpp" namespace caffe { diff --git a/include/caffe/filler.hpp b/include/caffe/filler.hpp index 242f11a3513..beeee01dcb9 100644 --- a/include/caffe/filler.hpp +++ b/include/caffe/filler.hpp @@ -9,11 +9,11 @@ #include -#include "caffe/common.hpp" #include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" #include "caffe/syncedmem.hpp" #include "caffe/util/math_functions.hpp" -#include "caffe/proto/caffe.pb.h" namespace caffe { diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index fb7f5539674..73a677b624a 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -7,10 +7,10 @@ #include #include -#include "leveldb/db.h" -#include "pthread.h" #include "boost/scoped_ptr.hpp" #include "hdf5.h" +#include "leveldb/db.h" +#include "pthread.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 8f0588d4771..4b3f6f4394d 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -7,9 +7,9 @@ #include #include -#include "pthread.h" #include "boost/scoped_ptr.hpp" #include "hdf5.h" +#include "pthread.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" diff --git a/include/caffe/test/test_caffe_main.hpp b/include/caffe/test/test_caffe_main.hpp index 9e7b85944da..759e01a2629 100644 --- a/include/caffe/test/test_caffe_main.hpp +++ b/include/caffe/test/test_caffe_main.hpp @@ -8,8 +8,8 @@ #include #include -#include #include +#include #include "caffe/common.hpp" diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 631dbe7ca64..4f517ff1d71 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -8,9 +8,9 @@ #include "google/protobuf/message.h" #include "hdf5.h" #include "hdf5_hl.h" -#include "caffe/proto/caffe.pb.h" #include "caffe/blob.hpp" +#include "caffe/proto/caffe.pb.h" #define HDF5_NUM_DIMS 4 diff --git a/include/caffe/util/rng.hpp b/include/caffe/util/rng.hpp index 2b79ef1801b..f774d704569 100644 --- a/include/caffe/util/rng.hpp +++ b/include/caffe/util/rng.hpp @@ -3,10 +3,12 @@ #ifndef CAFFE_RNG_CPP_HPP_ #define CAFFE_RNG_CPP_HPP_ -#include -#include -#include #include +#include + +#include "boost/random/mersenne_twister.hpp" +#include "boost/random/uniform_int.hpp" + #include "caffe/common.hpp" namespace caffe { diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index 2aad3192a65..d0e98f8319d 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -8,6 +8,7 @@ #include #include "mex.h" + #include "caffe/caffe.hpp" #define MEX_ARGS int nlhs, mxArray **plhs, int nrhs, const mxArray **prhs diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index de960214153..1165abc6da8 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -6,8 +6,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 7c913114abc..f99b01dc105 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -6,9 +6,9 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" -#include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index dd899a57c85..32203a8d980 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/concat_layer.cu b/src/caffe/layers/concat_layer.cu index 2643d7441c8..1a97f02a62a 100644 --- a/src/caffe/layers/concat_layer.cu +++ b/src/caffe/layers/concat_layer.cu @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index c7949e049cd..ca63e976e80 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -2,11 +2,11 @@ #include +#include "caffe/filler.hpp" #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/im2col.hpp" -#include "caffe/filler.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index fc114b0b328..616a81a1388 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -2,11 +2,11 @@ #include +#include "caffe/filler.hpp" #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/im2col.hpp" -#include "caffe/filler.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index ef27c1a3f1f..ddc7f770b46 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -1,17 +1,17 @@ // Copyright 2014 BVLC and contributors. -#include #include +#include #include #include #include "caffe/layer.hpp" +#include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/proto/caffe.pb.h" namespace caffe { diff --git a/src/caffe/layers/data_layer.cu b/src/caffe/layers/data_layer.cu index e275e9d913e..fcbf2346840 100644 --- a/src/caffe/layers/data_layer.cu +++ b/src/caffe/layers/data_layer.cu @@ -1,12 +1,12 @@ // Copyright 2014 BVLC and contributors. -#include -#include -#include - #include #include +#include "leveldb/db.h" +#include "pthread.h" +#include "stdint.h" + #include "caffe/layer.hpp" #include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index 65360d67ada..605aa151196 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -5,9 +5,9 @@ #include #include "caffe/common.hpp" -#include "caffe/util/math_functions.hpp" #include "caffe/layer.hpp" #include "caffe/syncedmem.hpp" +#include "caffe/util/math_functions.hpp" #include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 158456f9bc5..8befa4d87fb 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -7,8 +7,8 @@ #include "caffe/common.hpp" #include "caffe/layer.hpp" #include "caffe/syncedmem.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 44bad932a11..09ca66f38e8 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index 99c14feace1..d47d24afad7 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/euclidean_loss_layer.cpp b/src/caffe/layers/euclidean_loss_layer.cpp index 43e9989f513..2a814f0150a 100644 --- a/src/caffe/layers/euclidean_loss_layer.cpp +++ b/src/caffe/layers/euclidean_loss_layer.cpp @@ -3,9 +3,9 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" -#include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/euclidean_loss_layer.cu b/src/caffe/layers/euclidean_loss_layer.cu index b070ea96ff8..e1358f0fb51 100644 --- a/src/caffe/layers/euclidean_loss_layer.cu +++ b/src/caffe/layers/euclidean_loss_layer.cu @@ -3,9 +3,9 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" -#include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index 7e106d26f79..f1fdd322eb4 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/flatten_layer.cu b/src/caffe/layers/flatten_layer.cu index 68add383c48..60b67f06e05 100644 --- a/src/caffe/layers/flatten_layer.cu +++ b/src/caffe/layers/flatten_layer.cu @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 81cfdc096df..38b2b8d23f3 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -7,13 +7,13 @@ :: don't forget to update hdf5_daa_layer.cu accordingly - add ability to shuffle filenames if flag is set */ -#include +#include // NOLINT(readability/streams) #include #include -#include // NOLINT(readability/streams) #include "hdf5.h" #include "hdf5_hl.h" +#include "stdint.h" #include "caffe/layer.hpp" #include "caffe/util/io.hpp" diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index 91fe1534da9..a7ec061eb28 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -1,14 +1,14 @@ // Copyright 2014 BVLC and contributors. #include -#include #include +#include #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" -#include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index fabce0a6ad6..fb3dad43844 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -2,10 +2,10 @@ #include +#include "caffe/common.hpp" #include "caffe/layer.hpp" #include "caffe/util/im2col.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/common.hpp" namespace caffe { diff --git a/src/caffe/layers/im2col_layer.cu b/src/caffe/layers/im2col_layer.cu index 84439742250..c9802541aaa 100644 --- a/src/caffe/layers/im2col_layer.cu +++ b/src/caffe/layers/im2col_layer.cu @@ -2,10 +2,10 @@ #include +#include "caffe/common.hpp" #include "caffe/layer.hpp" #include "caffe/util/im2col.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/common.hpp" namespace caffe { diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index a0f91af29fa..a10f02c37a8 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -1,13 +1,10 @@ // Copyright 2014 BVLC and contributors. -#include -#include - -#include -#include -#include // NOLINT(readability/streams) #include // NOLINT(readability/streams) +#include // NOLINT(readability/streams) +#include #include +#include #include "caffe/layer.hpp" #include "caffe/util/io.hpp" diff --git a/src/caffe/layers/image_data_layer.cu b/src/caffe/layers/image_data_layer.cu index fc7e13b338a..8a449d010e2 100644 --- a/src/caffe/layers/image_data_layer.cu +++ b/src/caffe/layers/image_data_layer.cu @@ -1,13 +1,6 @@ // Copyright 2014 BVLC and contributors. -#include -#include -#include - -#include #include -#include // NOLINT(readability/streams) -#include // NOLINT(readability/streams) #include "caffe/blob.hpp" #include "caffe/common.hpp" diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index 4b02f4e61db..c972c032607 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -1,14 +1,14 @@ // Copyright 2014 BVLC and contributors. #include -#include #include +#include #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" -#include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index 5505d08587a..6493d0bd497 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -6,8 +6,8 @@ #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu index 513e4eb7fa8..4b670d644c2 100644 --- a/src/caffe/layers/inner_product_layer.cu +++ b/src/caffe/layers/inner_product_layer.cu @@ -6,8 +6,8 @@ #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index 92eb06f7b0c..656e85a75d8 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -1,14 +1,14 @@ // Copyright 2014 BVLC and contributors. #include -#include #include +#include #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" -#include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index 0e2df2ff4bb..50ad6464449 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/lrn_layer.cu b/src/caffe/layers/lrn_layer.cu index 237a42b2860..7a19350549c 100644 --- a/src/caffe/layers/lrn_layer.cu +++ b/src/caffe/layers/lrn_layer.cu @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index beea747c31b..e5eafd65078 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -1,14 +1,14 @@ // Copyright 2014 BVLC and contributors. #include -#include #include +#include #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" -#include "caffe/util/math_functions.hpp" #include "caffe/util/io.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 9415a15a094..75a74dac9ec 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -6,9 +6,9 @@ #include "caffe/common.hpp" #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/syncedmem.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index efa1aaa2ab1..6f3a7205091 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -5,8 +5,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/power_layer.cpp b/src/caffe/layers/power_layer.cpp index 55ace207b7a..86cb3d76291 100644 --- a/src/caffe/layers/power_layer.cpp +++ b/src/caffe/layers/power_layer.cpp @@ -4,8 +4,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/power_layer.cu b/src/caffe/layers/power_layer.cu index 0aa00272eea..db88fee8f3b 100644 --- a/src/caffe/layers/power_layer.cu +++ b/src/caffe/layers/power_layer.cu @@ -4,8 +4,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index 31522dd1fe6..2bf931d004b 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -5,8 +5,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu index 1d1f8cd51ff..698ec1dbde1 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu @@ -5,8 +5,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp index e8231e357d9..fc86a2d4307 100644 --- a/src/caffe/layers/slice_layer.cpp +++ b/src/caffe/layers/slice_layer.cpp @@ -1,11 +1,11 @@ // Copyright 2014 BVLC and contributors. -#include #include +#include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/slice_layer.cu b/src/caffe/layers/slice_layer.cu index 3ea8d57659d..70702148f5d 100644 --- a/src/caffe/layers/slice_layer.cu +++ b/src/caffe/layers/slice_layer.cu @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 0de1403585a..6a98b320208 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -4,8 +4,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index d471ba51cd0..6d65fbce957 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -7,8 +7,8 @@ #include "thrust/device_vector.h" #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 4e957cee9b4..43e8fcac44c 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -5,8 +5,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/softmax_loss_layer.cu b/src/caffe/layers/softmax_loss_layer.cu index ae7060d90bd..f55b8c7adf3 100644 --- a/src/caffe/layers/softmax_loss_layer.cu +++ b/src/caffe/layers/softmax_loss_layer.cu @@ -5,8 +5,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index 6bae4ef22fb..d13b8d12358 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/split_layer.cu b/src/caffe/layers/split_layer.cu index 4c921d39f17..a89c5d61883 100644 --- a/src/caffe/layers/split_layer.cu +++ b/src/caffe/layers/split_layer.cu @@ -3,8 +3,8 @@ #include #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index fe7f61c91df..cbd269685ce 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -5,11 +5,11 @@ #include #include -#include -#include -#include #include // NOLINT(readability/streams) +#include +#include #include +#include #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" diff --git a/src/caffe/layers/window_data_layer.cu b/src/caffe/layers/window_data_layer.cu index d95e5b20e88..5efcc3f4adc 100644 --- a/src/caffe/layers/window_data_layer.cu +++ b/src/caffe/layers/window_data_layer.cu @@ -2,8 +2,8 @@ // // Based on data_layer.cpp by Yangqing Jia. -#include #include +#include #include #include diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index b80bbba8479..6fab0e3a6b4 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -7,14 +7,15 @@ #include #include "caffe/common.hpp" -#include "caffe/proto/caffe.pb.h" #include "caffe/layer.hpp" #include "caffe/net.hpp" -#include "caffe/util/io.hpp" +#include "caffe/proto/caffe.pb.h" #include "caffe/util/insert_splits.hpp" +#include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/upgrade_proto.hpp" +#include "caffe/test/test_caffe_main.hpp" namespace caffe { diff --git a/src/caffe/test/test_accuracy_layer.cpp b/src/caffe/test/test_accuracy_layer.cpp index 5023a809d17..95217df3f1f 100644 --- a/src/caffe/test/test_accuracy_layer.cpp +++ b/src/caffe/test/test_accuracy_layer.cpp @@ -1,11 +1,12 @@ // Copyright 2014 BVLC and contributors. +#include #include #include -#include #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index 51d68c42f9a..3f55edaac22 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -4,11 +4,11 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" diff --git a/src/caffe/test/test_benchmark.cpp b/src/caffe/test/test_benchmark.cpp index fe0cc82a1d8..e6d9ebf9a05 100644 --- a/src/caffe/test/test_benchmark.cpp +++ b/src/caffe/test/test_benchmark.cpp @@ -1,10 +1,12 @@ // Copyright 2014 BVLC and contributors. #include // for usleep -#include + +#include "gtest/gtest.h" #include "caffe/common.hpp" #include "caffe/util/benchmark.hpp" + #include "caffe/test/test_caffe_main.hpp" namespace caffe { diff --git a/src/caffe/test/test_blob.cpp b/src/caffe/test/test_blob.cpp index aec88f322e6..89f4a161c9c 100644 --- a/src/caffe/test/test_blob.cpp +++ b/src/caffe/test/test_blob.cpp @@ -3,8 +3,9 @@ #include #include "gtest/gtest.h" -#include "caffe/common.hpp" + #include "caffe/blob.hpp" +#include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/test/test_caffe_main.hpp" diff --git a/src/caffe/test/test_common.cpp b/src/caffe/test/test_common.cpp index a8e2eb15270..455f5d8a32d 100644 --- a/src/caffe/test/test_common.cpp +++ b/src/caffe/test/test_common.cpp @@ -3,9 +3,11 @@ #include #include "gtest/gtest.h" + #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" #include "caffe/util/math_functions.hpp" + #include "caffe/test/test_caffe_main.hpp" namespace caffe { diff --git a/src/caffe/test/test_concat_layer.cpp b/src/caffe/test/test_concat_layer.cpp index 4cb28b1e24e..b07c5727a79 100644 --- a/src/caffe/test/test_concat_layer.cpp +++ b/src/caffe/test/test_concat_layer.cpp @@ -4,13 +4,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index f3cfb680990..41951cfb940 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -4,13 +4,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index ed7337c5eca..be478b2746c 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -4,12 +4,15 @@ #include #include "leveldb/db.h" + #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/vision_layers.hpp" + #include "caffe/test/test_caffe_main.hpp" using std::string; diff --git a/src/caffe/test/test_dummy_data_layer.cpp b/src/caffe/test/test_dummy_data_layer.cpp index 5b5f2025737..aa6cc55364e 100644 --- a/src/caffe/test/test_dummy_data_layer.cpp +++ b/src/caffe/test/test_dummy_data_layer.cpp @@ -4,10 +4,12 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/vision_layers.hpp" + #include "caffe/test/test_caffe_main.hpp" using std::string; diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index 53bff96ed6d..fe3269bb3a2 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -3,13 +3,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_euclidean_loss_layer.cpp b/src/caffe/test/test_euclidean_loss_layer.cpp index dd27670da13..6dd631e55e8 100644 --- a/src/caffe/test/test_euclidean_loss_layer.cpp +++ b/src/caffe/test/test_euclidean_loss_layer.cpp @@ -6,13 +6,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_filler.cpp b/src/caffe/test/test_filler.cpp index 1b145f2418e..d0d750fff47 100644 --- a/src/caffe/test/test_filler.cpp +++ b/src/caffe/test/test_filler.cpp @@ -3,6 +3,7 @@ #include #include "gtest/gtest.h" + #include "caffe/filler.hpp" #include "caffe/test/test_caffe_main.hpp" diff --git a/src/caffe/test/test_flatten_layer.cpp b/src/caffe/test/test_flatten_layer.cpp index bea099b1f92..928db849296 100644 --- a/src/caffe/test/test_flatten_layer.cpp +++ b/src/caffe/test/test_flatten_layer.cpp @@ -4,13 +4,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index ec48fc4fc32..a36a8cbd9a8 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -4,11 +4,13 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/proto/caffe.pb.h" + #include "caffe/test/test_caffe_main.hpp" using std::string; diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index f3d7c8c6974..1f3bf9f3cd0 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -6,11 +6,13 @@ #include "leveldb/db.h" #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/vision_layers.hpp" + #include "caffe/test/test_caffe_main.hpp" using std::string; diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index 84374e9579a..c6be1d73262 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -6,13 +6,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_im2col_kernel.cu b/src/caffe/test/test_im2col_kernel.cu index 37d1a1523af..89008ac7e39 100644 --- a/src/caffe/test/test_im2col_kernel.cu +++ b/src/caffe/test/test_im2col_kernel.cu @@ -4,11 +4,12 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/im2col.hpp" +#include "caffe/vision_layers.hpp" #include "caffe/test/test_caffe_main.hpp" diff --git a/src/caffe/test/test_im2col_layer.cpp b/src/caffe/test/test_im2col_layer.cpp index aaee3d81bf7..6884b059fde 100644 --- a/src/caffe/test/test_im2col_layer.cpp +++ b/src/caffe/test/test_im2col_layer.cpp @@ -4,13 +4,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index ae9a2dbc17d..bbeedb8dce5 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -1,17 +1,19 @@ // Copyright 2014 BVLC and contributors. -#include // NOLINT(readability/streams) #include // NOLINT(readability/streams) +#include // NOLINT(readability/streams) #include #include #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/vision_layers.hpp" + #include "caffe/test/test_caffe_main.hpp" using std::map; diff --git a/src/caffe/test/test_infogain_loss_layer.cpp b/src/caffe/test/test_infogain_loss_layer.cpp index 99bad263e88..7b3705084a5 100644 --- a/src/caffe/test/test_infogain_loss_layer.cpp +++ b/src/caffe/test/test_infogain_loss_layer.cpp @@ -6,13 +6,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/loss_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_inner_product_layer.cpp b/src/caffe/test/test_inner_product_layer.cpp index de194f2d63f..31d87afc7ce 100644 --- a/src/caffe/test/test_inner_product_layer.cpp +++ b/src/caffe/test/test_inner_product_layer.cpp @@ -4,13 +4,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_lrn_layer.cpp b/src/caffe/test/test_lrn_layer.cpp index 5bd5533f955..fbb03dfecb5 100644 --- a/src/caffe/test/test_lrn_layer.cpp +++ b/src/caffe/test/test_lrn_layer.cpp @@ -5,13 +5,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" using std::min; using std::max; diff --git a/src/caffe/test/test_math_functions.cpp b/src/caffe/test/test_math_functions.cpp index 502b77e07a8..c89ca027adf 100644 --- a/src/caffe/test/test_math_functions.cpp +++ b/src/caffe/test/test_math_functions.cpp @@ -7,6 +7,7 @@ #include // for rand_r #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp index 733bbf4ad1f..e939d0c6e11 100644 --- a/src/caffe/test/test_maxpool_dropout_layers.cpp +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -4,13 +4,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index c9d588986c2..60e75ebbc1a 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -4,6 +4,7 @@ #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" + #include "caffe/test/test_caffe_main.hpp" namespace caffe { diff --git a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp index ec53d40e53e..9b6bb067805 100644 --- a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp +++ b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp @@ -6,13 +6,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index a0a387929be..6787ba956ec 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -7,14 +7,13 @@ #include "google/protobuf/text_format.h" #include "gtest/gtest.h" + #include "caffe/common.hpp" #include "caffe/net.hpp" #include "caffe/util/math_functions.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" - -using std::ostringstream; +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index b3a536a7bfd..59c9b3d34f5 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -4,13 +4,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_platform.cpp b/src/caffe/test/test_platform.cpp index e1c4dafc7bb..a4f4b4260c4 100644 --- a/src/caffe/test/test_platform.cpp +++ b/src/caffe/test/test_platform.cpp @@ -2,11 +2,12 @@ #ifndef CPU_ONLY -#include #include +#include #include "glog/logging.h" #include "gtest/gtest.h" + #include "caffe/test/test_caffe_main.hpp" namespace caffe { diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index b9cec54af39..4636dd773a4 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -4,13 +4,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_power_layer.cpp b/src/caffe/test/test_power_layer.cpp index 44fcbd9117c..e35d539b776 100644 --- a/src/caffe/test/test_power_layer.cpp +++ b/src/caffe/test/test_power_layer.cpp @@ -9,9 +9,9 @@ #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_protobuf.cpp b/src/caffe/test/test_protobuf.cpp index 182af2e4611..da1a0d3f5eb 100644 --- a/src/caffe/test/test_protobuf.cpp +++ b/src/caffe/test/test_protobuf.cpp @@ -6,9 +6,11 @@ #include "google/protobuf/text_format.h" #include "gtest/gtest.h" -#include "caffe/test/test_caffe_main.hpp" + #include "caffe/proto/caffe.pb.h" +#include "caffe/test/test_caffe_main.hpp" + namespace caffe { class ProtoTest : public ::testing::Test {}; diff --git a/src/caffe/test/test_random_number_generator.cpp b/src/caffe/test/test_random_number_generator.cpp index abe21c2523e..8e3919157af 100644 --- a/src/caffe/test/test_random_number_generator.cpp +++ b/src/caffe/test/test_random_number_generator.cpp @@ -4,9 +4,11 @@ #include #include "gtest/gtest.h" + #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" #include "caffe/util/math_functions.hpp" + #include "caffe/test/test_caffe_main.hpp" namespace caffe { diff --git a/src/caffe/test/test_sgd_solver.cpp b/src/caffe/test/test_sgd_solver.cpp index a28ed7b1817..14dcac25e8e 100644 --- a/src/caffe/test/test_sgd_solver.cpp +++ b/src/caffe/test/test_sgd_solver.cpp @@ -8,6 +8,7 @@ #include "google/protobuf/text_format.h" #include "gtest/gtest.h" + #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/solver.hpp" diff --git a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp index a5388db092f..7205ce9311b 100644 --- a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp @@ -6,13 +6,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_slice_layer.cpp b/src/caffe/test/test_slice_layer.cpp index 59f6a8d4c66..e61f3e4f2c9 100644 --- a/src/caffe/test/test_slice_layer.cpp +++ b/src/caffe/test/test_slice_layer.cpp @@ -4,13 +4,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index fa899f92db3..a305c647585 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -5,13 +5,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_softmax_with_loss_layer.cpp b/src/caffe/test/test_softmax_with_loss_layer.cpp index 6f45c3889c2..2994a9117af 100644 --- a/src/caffe/test/test_softmax_with_loss_layer.cpp +++ b/src/caffe/test/test_softmax_with_loss_layer.cpp @@ -6,13 +6,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_solver.cpp b/src/caffe/test/test_solver.cpp index feefb51210a..133d01c5446 100644 --- a/src/caffe/test/test_solver.cpp +++ b/src/caffe/test/test_solver.cpp @@ -5,8 +5,8 @@ #include #include "google/protobuf/text_format.h" - #include "gtest/gtest.h" + #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/solver.hpp" diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index bbee6d28855..a4e5857877e 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -6,14 +6,15 @@ #include "google/protobuf/text_format.h" #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" -#include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/util/insert_splits.hpp" +#include "caffe/vision_layers.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_stochastic_pooling.cpp b/src/caffe/test/test_stochastic_pooling.cpp index 66e9b2d7d88..600b909a638 100644 --- a/src/caffe/test/test_stochastic_pooling.cpp +++ b/src/caffe/test/test_stochastic_pooling.cpp @@ -5,13 +5,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" using std::min; diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index f07682a2aa5..5ccc480112d 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -4,6 +4,7 @@ #include #include "gtest/gtest.h" + #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" #include "caffe/util/device_alternate.hpp" diff --git a/src/caffe/test/test_tanh_layer.cpp b/src/caffe/test/test_tanh_layer.cpp index 7fc443f6d6d..1dac5a57043 100644 --- a/src/caffe/test/test_tanh_layer.cpp +++ b/src/caffe/test/test_tanh_layer.cpp @@ -6,13 +6,14 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 7006dd11880..b06d697ab0b 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -3,11 +3,11 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" #include "caffe/test/test_caffe_main.hpp" diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index 72ee838931d..a16b835f864 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -6,6 +6,7 @@ #include "google/protobuf/text_format.h" #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/util/upgrade_proto.hpp" diff --git a/src/caffe/test/test_util_blas.cpp b/src/caffe/test/test_util_blas.cpp index d74f9f017ee..841edefc66c 100644 --- a/src/caffe/test/test_util_blas.cpp +++ b/src/caffe/test/test_util_blas.cpp @@ -5,6 +5,7 @@ #include #include "gtest/gtest.h" + #include "caffe/blob.hpp" #include "caffe/util/device_alternate.hpp" #include "caffe/util/math_functions.hpp" diff --git a/src/caffe/util/insert_splits.cpp b/src/caffe/util/insert_splits.cpp index 4de546810e5..b88b320ff3d 100644 --- a/src/caffe/util/insert_splits.cpp +++ b/src/caffe/util/insert_splits.cpp @@ -1,8 +1,8 @@ // Copyright 2014 BVLC and contributors. #include -#include #include +#include #include #include "caffe/common.hpp" diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 4f200474459..575ea3d63c2 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -1,23 +1,23 @@ // Copyright 2014 BVLC and contributors. -#include #include -#include -#include #include +#include +#include #include #include #include #include +#include #include +#include // NOLINT(readability/streams) #include #include -#include // NOLINT(readability/streams) #include "caffe/common.hpp" -#include "caffe/util/io.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/io.hpp" namespace caffe { diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index e1a48f194e1..a6e9c404df7 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -1,16 +1,16 @@ // Copyright 2014 BVLC and contributors. -#include -#include #include +#include +#include #include #include #include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" #include "caffe/util/upgrade_proto.hpp" -#include "caffe/proto/caffe.pb.h" namespace caffe { diff --git a/tools/dump_network.cpp b/tools/dump_network.cpp index c5aac604079..8984016916a 100644 --- a/tools/dump_network.cpp +++ b/tools/dump_network.cpp @@ -18,11 +18,11 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" -#include "caffe/net.hpp" #include "caffe/filler.hpp" +#include "caffe/net.hpp" #include "caffe/proto/caffe.pb.h" -#include "caffe/util/io.hpp" #include "caffe/solver.hpp" +#include "caffe/util/io.hpp" using namespace caffe; // NOLINT(build/namespaces) diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 22b0e61e227..06e07fe6cba 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -1,19 +1,20 @@ // Copyright 2014 BVLC and contributors. #include // for snprintf -#include -#include -#include -#include #include #include +#include "boost/algorithm/string.hpp" +#include "google/protobuf/text_format.h" +#include "leveldb/db.h" +#include "leveldb/write_batch.h" + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/net.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" +#include "caffe/vision_layers.hpp" using namespace caffe; // NOLINT(build/namespaces) diff --git a/tools/test_net.cpp b/tools/test_net.cpp index 9d37536c758..b6f827e6285 100644 --- a/tools/test_net.cpp +++ b/tools/test_net.cpp @@ -6,8 +6,8 @@ // Usage: // test_net net_proto pretrained_net_proto iterations [CPU/GPU] -#include #include +#include #include #include "caffe/caffe.hpp" diff --git a/tools/upgrade_net_proto_binary.cpp b/tools/upgrade_net_proto_binary.cpp index 928fc52dc27..ed703f027cd 100644 --- a/tools/upgrade_net_proto_binary.cpp +++ b/tools/upgrade_net_proto_binary.cpp @@ -5,8 +5,8 @@ // upgrade_net_proto_binary v0_net_proto_file_in net_proto_file_out #include -#include // NOLINT(readability/streams) #include // NOLINT(readability/streams) +#include // NOLINT(readability/streams) #include "caffe/caffe.hpp" #include "caffe/util/io.hpp" diff --git a/tools/upgrade_net_proto_text.cpp b/tools/upgrade_net_proto_text.cpp index 8a77f752cc2..d05d1ac5883 100644 --- a/tools/upgrade_net_proto_text.cpp +++ b/tools/upgrade_net_proto_text.cpp @@ -5,8 +5,8 @@ // upgrade_net_proto_text v0_net_proto_file_in net_proto_file_out #include -#include // NOLINT(readability/streams) #include // NOLINT(readability/streams) +#include // NOLINT(readability/streams) #include "caffe/caffe.hpp" #include "caffe/util/io.hpp" From c1faaa36ca76d15c078f6873c507b499429280db Mon Sep 17 00:00:00 2001 From: Seiya Tokui Date: Tue, 5 Aug 2014 18:07:19 +0900 Subject: [PATCH 0384/2053] Fix conflict on setting of LRN layers between train/test net and deploy net --- examples/cifar10/cifar10_full.prototxt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/cifar10/cifar10_full.prototxt b/examples/cifar10/cifar10_full.prototxt index 237a7a0a0ed..9e7016362fc 100644 --- a/examples/cifar10/cifar10_full.prototxt +++ b/examples/cifar10/cifar10_full.prototxt @@ -43,6 +43,7 @@ layers { bottom: "pool1" top: "norm1" lrn_param { + norm_region: WITHIN_CHANNEL local_size: 3 alpha: 5e-05 beta: 0.75 @@ -74,6 +75,7 @@ layers { bottom: "conv2" top: "pool2" pooling_param { + norm_region: WITHIN_CHANNEL pool: AVE kernel_size: 3 stride: 2 From 99f27fc082612745c8d8cc932be42fdfd035e789 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 28 Jul 2014 14:55:13 -0700 Subject: [PATCH 0385/2053] define caffe.Net input preprocessing members by boost::python define `Net.{mean, input_scale, channel_swap}` on the boost::python side so that the members always exist. drop ugly initialization logic. --- python/caffe/_caffe.cpp | 34 +++++++++++++++++++++------------- python/caffe/pycaffe.py | 16 ++++++---------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 10fc23b7974..30c86aeb384 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -25,6 +25,7 @@ using namespace caffe; // NOLINT(build/namespaces) +using boost::python::dict; using boost::python::extract; using boost::python::len; using boost::python::list; @@ -274,6 +275,10 @@ struct CaffeNet { // The pointer to the internal caffe::Net instant. shared_ptr > net_; + // Input preprocessing configuration attributes. + dict mean_; + dict input_scale_; + dict channel_swap_; // if taking input from an ndarray, we need to hold references object input_data_; object input_labels_; @@ -311,19 +316,22 @@ BOOST_PYTHON_MODULE(_caffe) { boost::python::class_ >( "Net", boost::python::init()) .def(boost::python::init()) - .def("_forward", &CaffeNet::Forward) - .def("_backward", &CaffeNet::Backward) - .def("set_mode_cpu", &CaffeNet::set_mode_cpu) - .def("set_mode_gpu", &CaffeNet::set_mode_gpu) - .def("set_phase_train", &CaffeNet::set_phase_train) - .def("set_phase_test", &CaffeNet::set_phase_test) - .def("set_device", &CaffeNet::set_device) - .add_property("_blobs", &CaffeNet::blobs) - .add_property("layers", &CaffeNet::layers) - .add_property("inputs", &CaffeNet::inputs) - .add_property("outputs", &CaffeNet::outputs) - .def("_set_input_arrays", &CaffeNet::set_input_arrays) - .def("save", &CaffeNet::save); + .def("_forward", &CaffeNet::Forward) + .def("_backward", &CaffeNet::Backward) + .def("set_mode_cpu", &CaffeNet::set_mode_cpu) + .def("set_mode_gpu", &CaffeNet::set_mode_gpu) + .def("set_phase_train", &CaffeNet::set_phase_train) + .def("set_phase_test", &CaffeNet::set_phase_test) + .def("set_device", &CaffeNet::set_device) + .add_property("_blobs", &CaffeNet::blobs) + .add_property("layers", &CaffeNet::layers) + .add_property("inputs", &CaffeNet::inputs) + .add_property("outputs", &CaffeNet::outputs) + .add_property("mean", &CaffeNet::mean_) + .add_property("input_scale", &CaffeNet::input_scale_) + .add_property("channel_swap", &CaffeNet::channel_swap_) + .def("_set_input_arrays", &CaffeNet::set_input_arrays) + .def("save", &CaffeNet::save); boost::python::class_( "Blob", boost::python::no_init) diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 870dec4f45e..64747f30483 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -211,8 +211,6 @@ def _Net_set_mean(self, input_, mean_f, mode='elementwise'): mode: elementwise = use the whole mean (and check dimensions) channel = channel constant (e.g. mean pixel instead of mean image) """ - if not hasattr(self, 'mean'): - self.mean = {} if input_ not in self.inputs: raise Exception('Input not in {}'.format(self.inputs)) in_shape = self.blobs[input_].data.shape @@ -240,8 +238,6 @@ def _Net_set_input_scale(self, input_, scale): input_: which input to assign this scale factor scale: scale coefficient """ - if not hasattr(self, 'input_scale'): - self.input_scale = {} if input_ not in self.inputs: raise Exception('Input not in {}'.format(self.inputs)) self.input_scale[input_] = scale @@ -257,8 +253,6 @@ def _Net_set_channel_swap(self, input_, order): order: the order to take the channels. (2,1,0) maps RGB to BGR for example. """ - if not hasattr(self, 'channel_swap'): - self.channel_swap = {} if input_ not in self.inputs: raise Exception('Input not in {}'.format(self.inputs)) self.channel_swap[input_] = order @@ -282,6 +276,7 @@ def _Net_preprocess(self, input_name, input_): caffe_inputs: (K x H x W) ndarray """ caffe_in = input_.astype(np.float32) + mean = self.mean.get(input_name) input_scale = self.input_scale.get(input_name) channel_order = self.channel_swap.get(input_name) in_size = self.blobs[input_name].data.shape[2:] @@ -292,8 +287,8 @@ def _Net_preprocess(self, input_name, input_): if channel_order is not None: caffe_in = caffe_in[:, :, channel_order] caffe_in = caffe_in.transpose((2, 0, 1)) - if hasattr(self, 'mean'): - caffe_in -= self.mean.get(input_name, 0) + if mean is not None: + caffe_in -= mean return caffe_in @@ -302,10 +297,11 @@ def _Net_deprocess(self, input_name, input_): Invert Caffe formatting; see Net.preprocess(). """ decaf_in = input_.copy().squeeze() + mean = self.mean.get(input_name) input_scale = self.input_scale.get(input_name) channel_order = self.channel_swap.get(input_name) - if hasattr(self, 'mean'): - decaf_in += self.mean.get(input_name, 0) + if mean is not None: + decaf_in += mean decaf_in = decaf_in.transpose((1,2,0)) if channel_order is not None: channel_order_inverse = [channel_order.index(i) From 6c87b92c76931e0b0aa4e2af135812112306e89b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 28 Jul 2014 20:10:16 -0700 Subject: [PATCH 0386/2053] [example] add caffe to pythonpath in all examples --- examples/imagenet_classification.ipynb | 7 +++++-- examples/net_surgery.ipynb | 7 ++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/examples/imagenet_classification.ipynb b/examples/imagenet_classification.ipynb index e7fe9f84677..40e69aea138 100644 --- a/examples/imagenet_classification.ipynb +++ b/examples/imagenet_classification.ipynb @@ -31,9 +31,12 @@ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", - "import caffe\n", - "\n", + "# Make sure that caffe is on the python path:\n", "caffe_root = '../' # this file is expected to be in {caffe_root}/examples\n", + "import sys\n", + "sys.path.insert(0, caffe_root + 'python')\n", + "\n", + "import caffe\n", "\n", "# Set the right path to your model definition file, pretrained model weights,\n", "# and the image you would like to classify.\n", diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 0a6e208f6d7..d64ae853ace 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -135,6 +135,11 @@ "cell_type": "code", "collapsed": false, "input": [ + "# Make sure that caffe is on the python path:\n", + "caffe_root = '../' # this file is expected to be in {caffe_root}/examples\n", + "import sys\n", + "sys.path.insert(0, caffe_root + 'python')\n", + "\n", "import caffe\n", "\n", "# Load the original network and extract the fully-connected layers' parameters.\n", @@ -326,4 +331,4 @@ "metadata": {} } ] -} +} \ No newline at end of file From 943b98ea4927db22c6aad821972aa5c2d20b4af1 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 28 Jul 2014 16:08:44 -0700 Subject: [PATCH 0387/2053] [example] fix example outputs With the right input processing, the actual image classification output is sensible. - filter visualization example's top prediction is "tabby cat" - net surgery fully-convolutional output map is better Fix incorrect class names too. --- examples/filter_visualization.ipynb | 75 +++++++++++++---------------- examples/net_surgery.ipynb | 20 ++++---- 2 files changed, 44 insertions(+), 51 deletions(-) diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index 56f6b8d30e4..0fe863bc7e5 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -1,8 +1,8 @@ { "metadata": { - "name": "Filter visualization", "description": "Extracting features and visualizing trained filters with an example image, viewed layer-by-layer.", - "include_in_docs": true + "include_in_docs": true, + "name": "" }, "nbformat": 3, "nbformat_minor": 0, @@ -229,9 +229,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAJOCAYAAAB8y+mTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvVuvbUl6JfTN+1xr7cu5570yqXJ1uXwpqavLxt1WG9lq\n2SpAAlmIdksgHvyGUEvAD0BC8GBekMBPSDyBZPkJWY2EAdMS0ICw3U2bbptul123rKzKPHlOnrNv\n6zKvPMQYESPOXFVuNlm9wYrvZa8da645I2JGxJwxvvGNL5vnebZkyZIlS5YsWbJk/48tv+sKJEuW\nLFmyZMmS/f/V0otUsmTJkiVLlizZLS29SCVLlixZsmTJkt3S0otUsmTJkiVLlizZLS29SCVLlixZ\nsmTJkt3S0otUsmTJkiVLlizZLe2H8iL127/92/ajP/qj9vnPf95+7dd+7YdxiWTJkiVLlixZsju3\n7NPWkRrH0b7whS/Y7/zO79hbb71lP/VTP2W/8Ru/YV/84hc/zcskS5YsWbJkyZLduX3qiNTv/u7v\n2o/8yI/Ye++9Z1VV2a/8yq/Yb/3Wb33al0mWLFmyZMmSJbtz+9RfpD744AN75513/P9vv/22ffDB\nB5/2ZZIlS5YsWbJkye7cyk/7hFmW/ZnHNGdn1l1dfdqXTpYsWbJkyZIl+9Tt5PHGrp5eH/3uU3+R\neuutt+z999/3/7///vv29ttvR8d0V1fWnJ1afXJqZu7FanXvnpmZKWUrz5eAGb+d5KusKNyHIpSN\nxejOUYbConLNHabe/U5e+vzn/EiZ1GkaJ3eucZSLDfgz+KJyct/PUyhjTfLMnSOfJ//d4D8v2z9P\n4TjWKRulTrhWUYS2+n7Mwm/NN23G75Qe5z53h1Df/d7106TtH9huPS8/h75jXYqisusPb+zk9Y0V\nhWtPXYdhV1buuKrKcXz4rmma6Dszs6Zt3TnKypdVlftcyngZ+gFt2PuyFxduEtzsQtl+59o4DO5v\nWYZzZKhKVoT2z5n7POv4K137sywcV2Os5UXopzJ3ZbPc935wv9ntXX2Heeu/ywseH8ZahlGUydRl\n9+uQ5GgrC70nc1QP95kNwd8+tIHnOxzCifvO1bOX4/rO/Z2nyfbPd9Y+XFlZueu2q3CfispVtFzJ\nnER/Z5m7xjTKGJ5QT5nsw8C5E9rFcZznuolzn+dFidkk8ym6keY4nv4rjPuyDP0144yzrJw8X0Q3\n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\npZdeko997GNhbf8Y9q6/SLHSeLCfPvve974nL730knznO9+RP/iDP5C//du/LX0eRVGYAz+l9qPG\nNoz7e9t+7dd+Td544w35x3/8R7lw4YL85m/+5g/9bhjr9571ej157rnn5Gtf+1pJ/VskrO0fZe/6\ni9SlS5dKUvLXr18vvd0Ge2/bBc2mvbW1Jb/4i78oL7zwguzs7Mjt2y7z9q1bt2R7e/udbhHsPWQ/\nbGzvXedvv/22XLp06VzqGOw/x7a3t/0D9Vd/9Ve9OyeM9XvfptOpPPfcc/K5z31OPv3pT4tIWNs/\njr3rL1If+chH5NVXX5Vr/397d4yiMBRFYfhauAjBLqigxJc9iO2ztbFyA25Cd6GQTis7FVuXIaid\nNmIhWKQ500UYmAEfzITA/5UhxYXDg1Pk5V4ulmWZrVYr897/9xj4A6/Xy57P946//X5vcRyb997S\nNDUzszRN84OK8vspW++9LZdLy7LMzuezHY/H/BYnyul6fe/3W6/X+Y0+si43STYej63dbttkMsmf\nc7Y/UMQX7pvNRs1mU1EUaTabFTEC/sDpdJJzTs45dTqdPNv7/a5er6dGo6F+v6/H41HwpAgxHA5V\nq9VUrVZVr9e1WCx+zXY6nSqKIrVaLe12uwInx6e+Zz2fzzUajRTHsbrdrgaDgW63W/4+WZfX4XBQ\npVKRc05JkihJEm23W872B1gRAwAAEIg/mwMAAASiSAEAAASiSAEAAASiSAEAAASiSAEAAASiSAEA\nAASiSAEAAASiSAEAAAT6AoIkxbPQ11/CAAAAAElFTkSuQmCC\n", + "png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAJOCAYAAAB8y+mTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvUmwbll6HfSd9m9u997Ll01lZmWqVFUulShs2S4ZN2CB\nJGMKg4PAxiGHAxg4gjEOIhgyYeSJTQQaMWNAVIgJaECgMG7AgZsQ7gLbQq1VqlRVKjPfy9fce//m\ntAz2Wvtb+51f5fAly9fA/gbvv2//5z9nn92ds9e3vvUV8zzPli1btmzZsmXLlu2f2cr7rkC2bNmy\nZcuWLdv/Wy2/SGXLli1btmzZst3R8otUtmzZsmXLli3bHS2/SGXLli1btmzZst3R8otUtmzZsmXL\nli3bHS2/SGXLli1btmzZst3Rvi8vUj/3cz9nP/RDP2Rf/vKX7c//+T///bhEtmzZsmXLli3bvVvx\nWetIjeNoX/nKV+wv/+W/bO+884796I/+qH3zm9+0r371q5/lZbJly5YtW7Zs2e7dPnNE6ud//uft\nS1/6kv3AD/yANU1jP/VTP2U/+7M/+1lfJlu2bNmyZcuW7d7tM3+R+s53vmOf//zn4//fffdd+853\nvvNZXyZbtmzZsmXLlu3erf6sT1gUxT/1mPbiwvqbm8/60tmyZcuWLVu2bJ+5nT3e2s0ntye/+8xf\npN555x374IMP4v8/+OADe/fdd5Nj+psba84vrL04N7PwYrW5ujIzs0koW0WJl7JTLK7KX9iKqgq/\nrf3AqZxwDgHd6gLH2+K8c2HL42Gl+bXGYQjHjaP/djiGMjlfxeNsMvlxOB8uUUsFhvinnHeW38L4\nolpOsxy3bCB/ofVzxPbEdafJv5umcN1h8LLjgWW938KIdpWbnYz36m1XlaGR67qx3cd7276xiXVq\nVz7sVqsmHI/+XK1W8bumCcet1q2UhePbulmUVdJ3Qx/qtNvtYtnL64OZmV3f+mQ4Hgd8HnF9r1tR\n4R6rWGRzEe5/ljIrQzvJkLSmDedpZIZxbE3TIPVEPTq09dz5aXHCufAxUc7hXicvshljYZ68UkUR\nLlyV8lvUr2287VjngkuBD0Qbh/Bld/T6dv2IMhm7uIdpmqx/drTm4crYPeu1N0C9Cudrtl5WluE8\nBT55TTOzecRxcl8z5mIhYzcO//nEJk42dnFGyLxiO3JsjoPMP8yTqtJOxHfSriPH/SydwuuOMjc7\n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\nAABJRU5ErkJggg==\n", "text": [ - "" + "" ] } ], @@ -260,7 +260,7 @@ "output_type": "display_data", "png": "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\nRK5CYII=\n", "text": [ - "" + "" ] } ], @@ -286,9 +286,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAJOCAYAAAB8y+mTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvWmMZGd1Bnxqr+qu6mV6pnumZ2s845nxPthjY7CDsQ02\nKAFsRWADghBZCPEzUn5EUaRApEREikR+JMqPECUmQraTKIEYxWZJbIMN48HG+4KX8XgWd8/Se1dX\nd1VX1fejvufUc9/31K3qHjvDl+99/kxPVd173/2e85wt0Ww2mxIQEBAQEBAQELBuJC90AwICAgIC\nAgIC/r+KIEgFBAQEBAQEBGwQQZAKCAgICAgICNgggiAVEBAQEBAQELBBBEEqICAgICAgIGCDCIJU\nQEBAQEBAQMAG8Z4IUg8//LAcOHBALr74YvnLv/zL9+IRAQEBAQEBAQEXHIl3O49UvV6X/fv3y09+\n8hPZvn27XHvttXLffffJJZdc8m4+JiAgICAgICDgguNdZ6SOHDkie/fulYmJCclkMnL33XfL97//\n/Xf7MQEBAQEBAQEBFxzvuiB16tQp2blzp/5/x44dcurUqXf7MQEBAQEBAQEBFxzpd/uGiUTiXflN\nQEBAQEBAQMBvAm666SZ59NFHze/edUFq+/btcuLECf3/iRMnZMeOHed1z1KpJEtLSyIiwi5dfX19\nIiKSTLaItWq1KtVqdV33npiYEJEWk1ar1USkLeglEglpNBreNfjeci/LZDL6G6stqVRKRCRy37j7\n4Lu1tTXtp9UmIJlMmvfGtdazksmkd++4Z3A/6vW6912hUNAxqlQqHZ+7HqTT0aW6trbm/aZUKsmm\nTZtEROTkyZMi0poH97epVErbw/1Mp9NSr9cjbbX6mcvlItcmEgm9Bmuo2Wz2rDDgfujj6uqqbNmy\nRURE3ve+94mIyMLCgszMzIhIe0xXV1dldXXVax/aPDQ0JCIit912m67F//iP/9A2j4yMiIjodwsL\nC3oP9IfHAu3r7++XUqkkIu1xtvqzurqqbcFYNBoN2b59e6Sdx44d8+6xbds22b17t4iIvPrqqyIi\nMjc35/2uWCzq/V599VVzf7nt7+vr074ODg6KiEg2m5WzZ89Gfv+BD3xAisWiiIg89thjIhJdd5df\nfrmIiExPT8vp06e952JP/fu//7uIiPzVX/2VPP744177cbYBmUxG11EcCoWCroVrrrlGREQOHDgg\n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\n2dxfsD+cusFncmerTbnE0A/OWA4mRIUXKwuN3Tg+E7pHzp1mFndHqKz8Ofh7w4wUf+fZTLNmIAP3\nncW67A72x/l+mc0/I0qO4NmHbrfbGLdOpxPaxQwnF1j37Uu5Hk8DJQRWUK4uzjSfEgIz26JqRubE\n2SWIuQpT7BTXV1T3vVTcnLpGLFRfHZ86LueeKw3OUlIL3/dYpvTUeVPf8Wect0/NnZL5pPrPbCb3\n58/+7M+ibTVbkpH63d/9Xfv6179uZmZf//rX7fd+7/fC53/7t39r4/HY3nvvPfvRj35kv/IrvyLP\nsbq6GooMl+RpqKioqKioqKj4aaLVamU3UtkdzFe/+lX71re+Zffv37cbN27Yn//5n9uf/umf2u//\n/u/bX//1X4f0B2Zmr732mv3+7/++vfbaa9bpdOyv/uqvopYBNB3eOllZWQnpBcDesAaK4XebSvMT\n+20psLPFeRZN/sk4KzcnrPEXXnihkRJhf38/7LQ5maLyZTOUf9mHsd+8edN+8IMfzH128eLFwEgx\nK+KtbKVbaLfbDU3bYDCQVhHYJE55kQqLBpgBBLvDob/cFs9cTCaTMNb4jNuGsVdCfgVlAY3H4zDO\nYGKZhVJzhoMRwBb5BKP8d84yRJ+uXr3aYKTW19eTCe9YJ4S/VTZzTi3A4nazefYJx7VazdpjKpOz\nSh/hfwOkLNajo6PGnGi1Wo0q8jlLmRlMr/VTz0BO+8IaKG9Jc12wlI5Dhaufho2KtRlQ7JRaf9A3\nJbhmKM0Q692UYNh/tqjOy7c5lf4A11IsY+x8Z4GYCNu/U2Pz3msZj46OiqPs/XHsceBgCID77uvq\ntVqt8Nmi+t/YupZaO9S4qTYDJferNTtLfrcQn1TdlC/fYHbygsLLq91uz0URmemM3woXLlwIriZM\nYs6ojNxC7L7kxcZP/FRqfCAVbcJuC+WSwGdwp81ms0YOndFoFNqhon/4xaiyP/sJv7W1FcaDN8bs\nlgOUeweRdPiONxa5yEoVUedLdKg280aFc/fA1cnRlt7tolxxLARFBNyDBw8aUUwxtxZHE6Y+4/ab\nHY+xNzzW19cbglF+keL5GI/Hob8sfAcwD7rd7lw+GrP5AAhgbW0t3LtUSSMuKcQvvNKIH+XuUxGY\nOVFtKVJuCPXSV8ensqJzBvQUOIoJUIEjOUE259fyn8WE5T6PVMy4S7VPubzUWndWr7ez3gSlrsH/\n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\n/5ufn6/VZX5+nt5r50TsPttG7HM2D1g7vGuvxn+sju122+1L7B8dL2yvnTt2TjT5j/UL1hn7HOdB\nznilyt7Pf6z/cH3YPY3VGedg0/ql5hPWRccLx81b/7i/sHlurw0Gg+x2aL/l7j/6H+4FTZ9l48X6\nPqfPW63W1H6BfWH7xfa5V6bd0/G/ubk5Oob2P1YvNg6457J91hvr/d6XO0/Yf8vLy9Xy8jL9Ds3y\nn/Z3DK5pr9fryV/8xV/IU089JV/60pfkr//6r+Vb3/qWfOxjH5P3vve98t3vflfe8573yMc+9jER\nEXn66aflU5/6lDz99NPy+OOPy4c//OEDD7ZVUFBQUFBQUPCagaeRsviN3/iN6t/+7d+qhx56qLp0\n6VJVVVX18ssvVw899FDQRn3sYx8L9//qr/5q9cQTT1CNVOx0iad/lAzm5+enTtFWq6P32/KYBISn\ndJR69JpKiL1er6YJYf+lJB7vBD43N1fTeohIdd9991X33XffVBv1b09DYP+z0gs+p6f1VqsV6oDt\nPX36dHX69OmpsbFSDkooKLHY+1BCQimB9a9tH5MoYlIGatRifcTGk11j7zh+/Hh0HOfm5moSjO0L\nOxdimr8cSTp3DuAYYT2t9tS23ZPk7O/4PNNw5K4LT5JOlROT0u19uRqKWTQ+qXHztMC570j1R9M6\n41pB7URMe4L/Me0I03Cw9ZjSYHt9iZp9e43t+ey/mLaraV3Ys6idze17+66YllKB2l/7fcT/UlYI\nVq/BYFANBoOq0+kEqxHu357WS9/R7Xbp3NY662+sXxcXF2t7amo8tLzl5eXa/Wx9xb4T9r2qBcS+\nb6SRQjz77LPy1a9+Vd7xjnfI5cuX5dSpUyIicurUKbl8+bKIiLz00kty/vz58Mz58+flxRdfzH1F\nQUFBQUFBQcEPFbICct65c0fe//73y8c//vEQvVTRatVzLNnfGSaTCSVuYoRkJZEdOXJErl+/PnVf\nVVWuS6oCXbUZUZoR4/B3G2xyMplMuR+LpINgeuZNJAEqcfDYsWPy/PPPT903GAzCeyogeLI2e2RJ\nDApYAZFR/1aX/uPHj8ulS5dqz9v3YdtZcEZGJkfifizQHGI8HtfaFHNr1b89wiNzxWUu/fgOHZu1\ntTXq0u+RObHPvCjbeJ/+7ZFvY/PKPoPzAOvpEcZTJGb9nZFDY0EXvfp7azhWB72f9YMXoTk3qnOK\n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\nSUVORK5CYII=\n", + "png": "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\n", "text": [ - "" + "" ] } ], @@ -318,7 +318,7 @@ "output_type": "display_data", "png": "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\nIqIb+upwfU7EnNLtAIqW6LIF1113XURErFy5cqB9WVKCPjkZZyGTfI6lAeuINU4nE0VjgYay6CJA\n6ygThZZ0ArQ5xmueZknv+B4hq30p/51IEmTlU2jnciyMwQ7NLphr2tGCyr7gMRo18+kkhowTXt96\n660D399xxx0H2mcJ3cbHx5s+gMeB5ozc3H///QOf22rG3ELT1ltvHX1YtmxZ853f/va3ERGx2267\nDbRx8WFbJhz+Dl+QJ3if+QhMTU018jss+auteRS3Zf49TjRz5o55RybLNco4oQGekrbA4wR8Tt/I\njR3ava623377gbGUewC8Y/xr166NiIgddthh4H0Ajxk/37/pppsiop0rgHzZgXxqaqoTuMFag054\njSx6XC4IjYbuAAhQav0REVdeeWUjg6b7wQcfjIh23bLG4LXXhdNd7LTTThHR8sX7TpkcknEwL06C\nzDOdWJU+PE4X8YU/yJn5uHHjxmb/d3ob86VMsBvRFitmzngGYH3BZwoz33jjjRERseeee3b6Ri4Y\nL+/b0uj0QrwyZx4nY4NWaGOuynQc8JS5gKY1a9ZERMQee+wx0Ld/05Fd5IbC2+6fMTHGVatWpeuf\nfXGm8mMzoVqkKioqKioqKirmiHmzSD3wwAOx9957R0TE+973voiI+Na3vhUR7ckUcArmVHv//fc3\nGgYaIchC6bNCqWha9MOzeEVbBmhFDz30UHP6tvZuWoDDfW3B4JRvDYZTva0pGzZsaPqErlWrVkVE\nN6zbPmD77bdfRET87Gc/i4iupoamhXYMzXfccUdEtFpBRDfZncPbPRfwHA0cywI8z4p5wl98Afba\na6+IaDVceFK22XbbbSMi4pWvfGVEtNoaYNwveclLIiLi0EMPjYiISy65JCIifv3rXw+0p38nSR0Z\nGen446FxMo/QmYX9k5COfvbdd9+IiMb6evvttw+0L62xaHH0TZJYYJ8IeA/PswKiWHb4PnPghI9T\nU1MdqyUyaL4gg/vss09ERLzmNa+JiIj/+q//6qWdcWKJRHavvfbaiBhMkskaYt1i3dh5550jIk/f\ngJy4LIct3ryPfEErVqZy3bEusLC/4hWviIiIK664IiK61i60ZfYVvofFzRZv7z/Im+cmop1nngEN\nzMF222030J41iMzZtw5LFkBOnv/850dExMtf/vJmfmwFQO5vueWWiGgtL/SBvAMXFGfc/H7YglWm\n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\noqKioqKiYo6YN4tUmRmcUyCnXWfw5US5YsWKiHjmZJnleXA+GPq29Qug1VvzBD6RoomvX7++sRRk\nJT9cANe5fKw1Qgsnb5dAsAaz+eabN+OxZcraS2aByIrXctr3qd95U8r3XCIkO80zDqxEAM3z1ltv\nHXjfuZ1crqK0BNm3ie+gMTEeo8wKHdHNWA3s54JcLV++PM0mj/aPVQfrEFYzwHpwpm/GaxnFQvHY\nY4+l1gmApSrLk2TrGGuNdjfffHNEtJqbLRj33Xdf8x6WZeTYFkZkE2sIMgzPSx/I8llo/ba+lhYs\n+8Ix31n5HWv7nl+vUVuJXAGhXHfInC2M0Oi9yFaQrJQScK43MD093ZlPLChY/e68886IaPlUWlYj\nutnj2ZucdR24nMno6GjHugcYP33ax8cWSdYN7W+//faIyLNvsyZHR0ebcfUVz41o93PGhdwzN7bU\n7L///hHR8hFavP5KWjILm2kp/S3L8bkMjceJfDHWvuoWe+yxx8B70M13LUPe983rrJA8a9g55Up5\ncX456EUu+ip4RLQ+kYzbmdwBc9dXLNptGT9t2bvMy2GoFqmKioqKioqKijli3ixSm2++eXOqtQ+M\nT6ScXO+5556IeOb0y4nZp3ROqS4YygnZ969Zvacsc2tZUNg1nbJTemb18WmXk7a13Cyz85NPPtmp\nsZYVI0abc/2mbLy0QwvglM9rSYstUs4Sm/lTMFeOgPP8ozXAPxfCLLUpPsOfwlEm5iHjwRrkiDrz\n0bX2wMTERMfy4uzBaL/24wO2xKCh8X0/k7GsXLmyE21ii4ELhKLloS27Jh3rBKsRcwCf+jKI4z/H\nuKDbfUMjssU6cr0uj5N+Xe+xHGtWzLxPViK6ma1Ni+HIQct6KS+ev6z4LmActuRl1QccWQTt9qWK\naP3KHKWX7XPsn2jm9nfymsZqVEbiZfsioK1rlnqfxAqKFQX+IVee09Iq4kz+XkPIPzz3nmXaoRU+\n8sre7d+XpUuXduYdntMX6MuOX9Ls3wv7Flp2S0sYvCM6j9+NzP+Kv22ZyQpFuyh4Vuw8ol0XtHFl\nC8+nrb+2uGVzCkoaskzl3I7gS5ZVH8lQLVIVFRUVFRUVFXPEvFmkFi5c2Jz+0ExcSRtgqShfs9pZ\n1s6yGkvAGizt0chMC/1PTU11NKjMquPq1lmtNecA8im/D9ak4ZH79p23eW1NCiuhtWqsAaXm7Qra\n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\niTvvvDPOOeecuOyyy+Iv//Iv48Ybb4wbb7wx7r777vjHf/zHuPvuu+OJJ56I3/qt34p77713sIDW\n/v37eyfGoRocyBExOnnOzs72rDrgE6WtHZ/yOdVyksYayKgkWuvC/bJl7boYfr9q2fne1BJZ7Z7F\nxcVe9kiWbcLnzpDK6ArsechoYIaQFeb095bNBJnGpDozrZzozNadf+uMKsbKdVCA6xS1GSSZR873\nor8uPOcsR9dy8fxp74c87RppwVyyF9i1jYAzRSeFUu7ataune9cuA4yBvWNZnST6wrzgPkNFcz0G\nHv8sg5Df8T3rw2PkdWEanzbLLys4mq1n95+9yfcEjBFj29a+yvbWrKaT23ZmmQubeh1Z9v3793dt\nZGsO2PtnWfD+IGtGig4YA2cutt9ln5uc2x485qD324z25/nnn+8VkkRXWV045g16yfZo5qYzKe35\nbuG9xW9iDM8PE1EDk8I7u7u93pRQkwqP0n/Ww6R90Zm5YGZmJt2jTfGEbC9JHakjjzwyzjzzzIh4\nwQ33qle9Kp544on44he/GO94xzsiIuId73hH/NM//VNERHzhC1+It771rTE7OxvHH398vOIVr+g4\niAqFQqFQKBT+/4YXHSP18MMPx7e+9a143eteF08//XRXOfyII47o6uM8+eST8frXv777zdatW7sq\n3cbatWt7Fib/9+nYsTQLCwspkSmnW96NU1uFOlGZNWhrkZO1ZWnpGmz5ZDVKXIMjq5fj98+O87Cn\nZseOHT1rhdO4rTGsAF7Dog+svawSNid1/qLfVu++ty1LW6DIknls7AWgfcYmI7Fsv7MllXkwHQPk\nelPZ+EPjwDzZsmVLj2aBd/605UrEWS0WrKFJljd45plnesTW9oYw99A93zP+Q9Z7xPiai+h7BcDj\njz/e8yzYYnabXO+2s/gNZCd+cahqMm23RKXt5x5/e1oZE9eIA8T9OD7S92mvsecsi08jxoX1z5gi\nQ0adZC/a6tWre3J7TvGbLGaG+c1853rG1B4JYlF5Lhx88MFp5WnqxnksaNufZ4TDQ8wG7pOJa90G\nNftM0sw+Z53TF8ekIrvXdBvPa0+U1wVtueaXK38D9iqev8wXe3pauKp+RsuU/T/z7MII4jp2zItW\nLzA2UE2e75B7ktfQzxfPRfTseTE/P9/bt6CGQsf28r7YOlIv6iC1c+fOePOb3xy33nprj6l5amrq\n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\nubnB+vXrB2vXrh0899xzSyL3iwnjxuCyyy4bXHvttb1rawz2PJ544onBvffeOxgMBoPNmzcPjjvu\nuMEDDzxQ62AvIhuDWgd7DnvVI3XPPffEunXrYs2aNTE9PR1vectb4itf+creFOGXGgPlFfzDP/xD\nvP3tb4+IiLe//e3x93//90sh1osWr33ta+OlL33pyGeZzr/yla/EW9/61pieno41a9bEunXr4p57\n7tnrMr/YMG4MIsbXg6kx2PM49NBD4/TTT4+IXZX4TzjhhNi4cWOtg72IbAwiah3sKezVg9TGjRtH\nytCvXr26qtruJUxMTMQb3vCGOPPMM+PWW2+NiF30GJARH3LIIR1dSOGFQ6bzxx9/PFavXt1dV2vj\nhcWNN94Yp512Wpx33nnda6UagxcWjzzySNx7773x6le/utbBEoExeM1rXhMRtQ72FPbqQaoqmi8d\n7r777rj33nvjzjvvjJtuuim+8Y1vjPx9YmKixmcvYyGd13i8MLjgggti/fr1cd9998Vhhx0WH/jA\nB9Jrawz2DGZmZuKNb3xjXH/99R2fHah1sHcwMzMTb3rTm+L666+Pl7zkJbUO9iD26kHqiCOOGOG2\n2rBhw8jJt/DCAYLogw46KH7/938/7rnnnjjkkEPiySefjIhdxKGQoxZeOGQ699r46U9/GkccccSS\nyPhix8EHH9w9vN/1rnd1ry1qDF4Y7NixI974xjfG2972tvi93/u9iKh1sLfBGPzhH/5hNwa1DvYc\n9upB6swzz4yHHnooHnnkkZibm4s77rgjzj333L0pwi8ltm7dGps3b46IXSzwd911V5xyyilx7rnn\nxu233x4REbfffnu3wAovHDKdn3vuufGlL30p5ubmYv369fHQQw912ZWFPYsnnnii+/+Xv/zlLqOv\nxmDPYzAYxHnnnRcnnnhiXHTRRd3ntQ72HrIxqHWwB7G3o9u/+tWvDo477rjB2rVrB5/4xCf29u1/\nKfGTn/xkcNpppw1OO+20wUknndTp/Zlnnhm8/vWvHxx77LGDs88+e7Bp06YllvTFhbe85S2Dww47\nbDA9PT1YvXr14K//+q93q/Mrr7xysHbt2sGrXvWqwde+9rUllPzFA4/BbbfdNnjb2942OOWUUwan\nnnrq4Hd/93cHTz75ZHd9jcGexTe+8Y3BxMTE4LTTThucfvrpg9NPP31w55131jrYixg3Bl/96ldr\nHexBFEVMoVAoFAqFwiJ6dsjvAAAAYElEQVRRlc0LhUKhUCgUFok6SBUKhUKhUCgsEnWQKhQKhUKh\nUFgk6iBVKBQKhUKhsEjUQapQKBQKhUJhkaiDVKFQKBQKhcIiUQepQqFQKBQKhUWiDlKFQqFQKBQK\ni8T/A2aklexSCttuAAAAAElFTkSuQmCC\n", "text": [ - "" + "" ] } ], @@ -344,9 +344,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "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\nnA4bAACgXKOuiRocHLS2tjYzM2tra3P1LEePHrX169e7/RYsWGD9/f0jPgfTxMeey5cvR7Z3797t\nYk0J+6OXCxYsGPFnoW0gMHZo64KpU6eOGJuZnTx5srBjypN+r7a2trr4+PHjqR5PDRQwejXNzmtq\narKmpqbEnwMAADSiUY9EtbW12bFjx6y9vd0GBgbc/3g6Ozutr6/P7XfkyJHImmjqypUrgYcLAACQ\nvyeeeOKW+zTdvHnzZtIOhw8fto997GP25ptvmpnZX/3VX9ncuXPty1/+sj355JN25swZe/LJJ23X\nrl32mc98xrZu3Wr9/f328MMP2/79+98zGtXU1GSzZs0yM7OzZ88G/mq4FX1bqzgiOHv2bBfr1Gw/\ntaKdzvV3quIU36qf80aU9pyPGzfOxXQor43/J6MK1/qECRNc3IiLglfxnI8Fw+e9qanpPe/BsMSR\nqMcff9w2bdpkJ0+etIULF9rf/u3f2l//9V/bY489Zt/97netq6vLfvCDH5iZ2erVq+2xxx6z1atX\n2/jx4+3b3/42bzQAAGhYtxyJyvwFGYkqRNVHRRiJQhYYiSpeFUdFGIlCHmoeicpLGTdPusgt/avK\nN2PGDBfPnTvXxXpzZWbW09Pj4iK/HPmjW38WLVoU2dbFq3kPG9vwf8zNGme2JeoDa+cBAAAE4CYK\nAAAgADdRAAAAAUqpiSpDPdVBaT2OWXw9h18D4q/CXmVxHcenTJkS2Z4+fbqL9T28ePFiZL9au+D7\ntVjNzc0uPnjwYE3PjWJoDRTS0YJs/3umnr4zx1odlBaWFzw3DB5GogAAAAJwEwUAABCglD5Rw+0G\nyhou1t5DZtH02aVLlwo7Dp3ar0vkaArLzGz//v0uTlpMVPstaTuAqvcU0dSZtj4wi743AwMDLvYX\nNA5pSaDn2W+fcPXq1VTPoegTVTzOefH8PxktLS0uPnXqVNGHMybQJ6ocafpEMRIFAAAQgJsoAACA\nAKWk8+6//34zMzty5EjkZzrjSrua+6mWiRMnulg71SalusaaekpzaHo1JI1mFv0ddaadXh9m0ZSn\nXi/nzp0Lel1VT+e8Ueg592d2XrlypejDGRP8PxnLli1zMTNZ80E6rxyk8wAAAHLCTRQAAEAAbqIA\nAAAClNKxfLizdkdHR+TfdZr6G2+84eJdu3ZF9tO6Geqg6l/aVhczZ850sV/DpLVP06ZNc7HfCmFw\n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\n", + "png": "iVBORw0KGgoAAAANSUhEUgAAAlEAAAJNCAYAAAARaCA+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3VmQHWd5//FnbO37OqPRaKSRtXgsy0tsAQJMGeMFXAES\nEuLEkISCcBOqcoFTgRQ3mFQlOBdJqkKKqn8BqSJcEKiQ4FAE4TLBAhvLWizZ1jraRtKMZkbLaN8X\n/y+cefXrV9Otnvf0ds58P1dP6/Tp7tOnT0/rfd73eZvefvvttw0AAAAjclvZBwAAAFCPeIgCAAAI\nwEMUAABAAB6iAAAAAvAQBQAAEICHKAAAgACZP0StWbPGOjs7bdmyZfb3f//3WW8eAACgEpqyrBN1\n7do1u/POO+3FF1+0trY2e9e73mXf//737a677spqFwAAAJWQaUvU+vXrbenSpdbR0WFjx461P/qj\nP7Lnn38+y10AAABUwpgsN9bb22vt7e1uecGCBfbaa69F1mlqaspylwAAALl5+OGH7aWXXhr2tUwf\nosp+QOrs7IwsHzlyxMWDg4Ox75s2bZqLly9f7uLdu3dH1jt16lRNx7do0aLIck9Pj4uvXbsW+74F\nCxYM+54kmqUt63uZM2eOi/1zN2bMjUtv0qRJLvazy/q+pHM0a9asYbd38uTJyHpnz54d9v3jxo0z\nM7OrV6/amDFjbMqUKcO+Z8KECZH36fLAwICLsz7nEydOjCxfuHAh0+3XK71e9DszMzt//ryLW1tb\nXTxz5szIepcuXXLxnj17Uu23ubnZxXrtmZnt3Lkz1TbU2LFjXXz77bdHXrt48WKqbcyYMcPFei78\ne4beh06fPu3iEydOpNqP/xut9Vr3P6/eN/Q35dPP6//Old7f9fPqfcLsxj3A355+Nz69J12/fj12\nvdmzZ7tY7+dmZm+88caw75k+ffqwx2NmdtttN5JIzNyWn69+9atmZva1r30tdp1M+0StW7fOnn32\nWVuzZo2ZmX3961+32267zb785S/f2GGOf9DHjx8fWdabY1r6Az527FjNx1SWoh6i9OZgFr0h6kPs\naBByzvVh0szsox/9qIt//OMf13xMn/70p128a9cuF2/cuLHmbSdZsmSJi/WPweuvv57pfvSc+30v\nr1y54mL943nu3LnIevqwldZHPvIRF585cyby2iuvvDLi7RXp7rvvdvG2bdtG/P6sH6KqSB9C/f+w\nJP1nLo7eJ48fPz7i94+Gc15FQ+e9qakp9mE10z5Rq1atst27d1t3d7ddvnzZfvCDH9jHP/7xLHcB\nAABQCZmm88aMGWP/8i//Yh/+8Ift2rVr9md/9meMzAMAAA0p04coM7Mnn3zSnnzyyaw3CwAAUCmZ\nP0SVKaQPlK+e+0EVRTvf+50zt2zZUvTh1LWrV69Glnfs2JHp9rWP3+HDhzPddhL9LWb9meJ0dHRE\nlrXT///8z/+4+PLlyzXvS+8T/ndYdSH9oBpFS0uLi5M6rWvfzpA+UGbRe2NIPyjUB6Z9AQAACMBD\nFAAAQICGSudVnQ77NjPbu3dvSUcycvPnz3ex1sh58803yzicytOis2Zmhw4dSvU+LUOQln4fflmJ\nb3/72y7+0Ic+NOJth0pbzywtHdIdN9TYrwGmw8pDUzJxNG3t1zmqGv/4sj4XWsNMayppWYlQmhLz\n6wBu3rzZxWkr9WiKV1PdZmYrV6508bp161Jt75FHHnGxXyrDLzSNxkRLFAAAQAAeogAAAAKQzitQ\n1s3oRdKRXUWO8krrsccec/GLL75Y2H790YlD/PRd2ikqQiRVhtfq3HFT3pRJ0yG//OUvY9fTdM3k\nyZOHXae7uzv2/Vn89jRtpVWsqz46L+/7jl7bWU9HpFP0+OmykMk2Dhw44OKlS5dGXtNRi2mn2km6\nZhHOn8mhqN+Yv980aIkCAAAIwEMUAABAAB6iAAAAAjS9HZJYrmWHo3j26XHjxkWWs6icHEe/1kY8\n5+95z3siy9u3b3fxmTNnij4cM0t/zn/7t3/bxT/96U9zPSY1fvx4F2dR3T8Ln/nMZ1z83e9+d8Tv\n13Pu/750WfuGhWptbXVxX19fzdurV/6fDC1rkHXflZDK4X4/Rb8vVZXFXWP+OW/Ee7p+b/51lOff\nyiRD572pqSm2Dx4tUQAAAAF4iAIAAAhQSjpvqGps2mGkGLmqp/NWr17tYi0H0NvbG/ueNFWry5T2\nnOtEuX5arVHSRNo0n2c6pcjrXL+3pHIKWgm7ESc09397OpuBVikvMoWq1cz9c16178BPO3/wgx90\n8caNG108ODjo4kZN52nZEJ15QUtRlIl0HgAAQE54iAIAAAhQSjrvgQceMLObJ6+teuXfWs2aNSuy\nrM21WYtLc2jzqVn2FYbTqvpIJ61cm/a6DEktTZs2LbKsKe6yRqTUEz3n/rUd113An8h2586dqfY1\nb948F/f396c9xEq74447XLxv375U7/H/ZOhI2U2bNrnYH02n5+/UqVMuTroH6fEdPXo08lpZo3Dj\n6OhXs+gk5EmpzTT3v0ZN582dO9fF/vdbBaTzAAAAcsJDFAAAQAAeogAAAAKMfMriDAwNZfQry+rw\n2Ebkzz6fZ5+oOGX1gfJVsR+UKqp/nn/Na785/a7K+t5mz54dWT5+/Hgpx6G0hIDyZ2DXStpXrlxx\n8f79+4P2q31eiirhkLcs7rl6H0uqKj5jxgwX63e4devW2Pfo8fn9B9P2ibrtthttBdevX0/1nrTu\nvPNOF/t9erR0S1VmCKiaKvaDGilaogAAAALwEAUAABCglHTeUPN3o6fvfJpSAIajqRGdfLUs06dP\njyynTecNzUpglv3MBH5afMjZs2cjy1OmTHGx/vZCUytTp0518eHDh4O2UTVp08SaEvP5Kd8h/pBw\nLdmhJQ6SZFFtPOsUnl7bu3fvzm0/qA+0RAEAAATgIQoAACBAKem8MkalVYGfbsDoNHPmTBefOHEi\ndr2kkU5FSVvF2pfn5OJpJyfVCuZZ/PZ6enpcnJSar3o1fpU2tZmUqtJq3JrC27t3b/iBlUyvHT/l\nmee1jfpDSxQAAEAAHqIAAAAC8BAFAAAQoOntuKmJ89phU5ObubkRqpWa3TwMPG747rhx4yLLOuQ3\na/q1NsqM32np0PYi+6HV0znXc2RWvf56Wm3cLL4PUhXOeVtbW2RZSyHs3LnTxUuWLImsp5XOq953\nSvl/MvI871qlPO+SOB/5yEdcvGbNmlz3NVJFnnPcMHTem5qabvoOhtASBQAAEICHKAAAgAClpPOQ\nvyqkOYr0vve9z8Vvvvmmi+s5nffII4+4eMOGDZHXqpZ+K0uR17mmlhYvXuxiv4q7HpOWqfjTP/3T\nyHqvvfaai9euXZvZceYt69SSTrptFk3dasoztOSHTnys+2pubo6st23bNhenndy4KFVJ5+kk31r2\nolGrtZPOAwAAyAkPUQAAAAFKqViOd2gz88mTJ0s8kvqzfPnyyPKOHTtc3Ciprl/+8pcu9kerjWb+\nKNei6IjG+fPnu/jIkSOR9R588EEXf/SjHx32PWZmv/jFL7I+xErxRy3HVfrOegaLT3ziE5Fl/e1o\nFfV169Zlut/R4OrVq2UfQuXQEgUAABCAhygAAIAAPEQBAAAEoE9UiZJmgsc74oYkHz58OLJe3tWM\nR2ry5MmRZZ3pPgTXyg2TJk0qZb/aF0urkmsfKDOzD33oQy7WfkHf/e53I+tt2rQp60OsFH9GhkuX\nLtW0vY6OjsiyliHQ72Pz5s2R9bq7u2vaL5CEligAAIAAPEQBAAAEIJ1XolpTPKNBa2vrsP9etfSd\nb9WqVZHleqpInTU9Fxs3bgzaxsyZM7M6nGCaWh4/fryLb7/99sh6J06ccPH69etd/KMf/SjHo6ue\nCxcuZLq9pLScXzU+S/73G1o5HY2JligAAIAAPEQBAAAEIJ1XIp1EsuB5oOvGqVOnXNzX11fikYzM\nnj17yj6Eyujq6nLxypUrI69t3bo11TY0fVtWOmVgYMDFOvLMr6Cuk+a+8MILmR7DHXfc4eJ9+/Zl\nuu3Rxp8F4LbbbrQp6EjCrK83v4tCPd3XcDNaogAAAALwEAUAABCAhygAAIAApfSJGhqurEOBRyOt\nZqzDaPMcrltv9Bqpp6HFvb29he1r/vz5sa/5ld3LoP2Z0vaB8k2cONHFZ8+erfmYQuh3evLkSRff\nddddkfW0enbWw/ynTZuW6fZGM+1fZma2a9eu3Pa1aNEiFw8ODua2HxSPligAAIAAPEQBAAAEKCWd\n51eAHa20qV9TALihXqu6+8Pe/clYs6QpT3/YdqNoaWlxcVnpPKXXpV9N/erVq7ntN8/rqEialixy\n9oG5c+e6WMunJPG/35BuKAcOHBjxe1AfaIkCAAAIwEMUAABAgFLSeceOHStjt5WjKbxGaabHO4r8\nPjUtnPVosKqoclrXP+da2TyLtJVOfFzkqM88hZwLPQ9m0WtCK4wn0fdoZfkkzCYxctqdodH/ttES\nBQAAEICHKAAAgAA8RAEAAAQopU8U3rFgwQIXaz+KIof8oj6sWrUqsrxx48aSjqQc/f39ZR9CrL17\n90aWx4y5cVvV4fGhv+sPfOADLn7++eeDttEIsqj0nbYflJo0aVJkWavV49a0pFE9zTqRFi1RAAAA\nAXiIAgAACEA6r0Q6NLqvr6/EI2lcfnV8Ha58/fr1og8n2IQJEzLdnn9eGrGZvSj+hOGTJ0928ZUr\nV0a8PU3zm5nNmTMn7MBGkbvvvtvF/m9l06ZNI97ekiVLXBw6ibdOmq0TEPsVz7UrR6No9LIGipYo\nAACAADxEAQAABCCdV6Jdu3aVfQgNr97SVM3NzS4+cuSIi19++eVM9+OfFx2BFDKCCTeETFCrfv/3\nfz/T7VWFpjm1cviUKVMi6+lvYN++fbHbW758uYv1HIWm35TOJhE6C4C+b+fOnTUfE6qJligAAIAA\nPEQBAAAE4CEKAAAgQCl9om677Z1nt7yHmDc1Nbl47NixLh5Nwy9RX7QfVJE6OjpcvH379lKOoVba\nl8YsOtRd+8ycOXOm5n0N3cPMsrmfzJs3z8XTp0+PvPajH/0o1Ta0OrpWTT969GiNR5fetGnTXDxj\nxozIa34piCFnz56NLMf1QdJzbmbW1dUVcoixVqxY4eKsS4qgcdESBQAAEICHKAAAgAClpPOKqhSt\nQ2d1SO1oM3v2bBfHNaljdKvXFJ7ySwPs37/fxb/61a8y3VfW97B77rnHxYcOHYq81tPTk2obOjGu\nn/rKk1ZU1xkB/HuNVsmfO3eui/10Y1xZkrz/bujnCLletCyCWXzaWO/HZtHyIv53j+qjJQoAACAA\nD1EAAAABGqpiuY4MMYs2H2fRFNze3u7iLJpd4yr4Zu3ixYuZbu/BBx90sT+SphHSQmgM+hutehX2\ne++918U/+clPgrYxfvx4F+to5CxGIybRkYD9/f2x6+mEvKdPn871mELUmvK9dOlSqvX8NGetXSw0\nDekfQ97fPWiJAgAACMJDFAAAQAAeogAAAALUfZ+ocePGubi1tTXymlb+1WGzb775ZmS9K1euDLvt\nBQsWRJa1n0Fa2k/LH7qrw3y16nHc8YRK299Kj9X/7PqaVld+7bXXajy6arr77rtdfODAARf71ZWr\nTvsFxg0drzd+38chP/vZzyLL3d3dBRzNzZYuXeriPXv2pHrPW2+95eLQStxLlixx8dWrV128a9eu\noO2lldQPSsVVIm8URc6E0dbW5mL93v2+v1u3bnWxlsCoCi1DVNa9VWc20fOaFi1RAAAAAXiIAgAA\nCND0tpaYLWKHTU1W8C4BAACCJD230BIFAAAQgIcoAACAAKWMzuvs7DQzs7vuuivy7zox47Fjx4aN\nzaKjjGbMmOHi++67L7Le2rVrXbxu3boRH6dW5jYzmzVrlot10kitxGsWHf23d+9eF/vVZFeuXDls\nrJXMzaIVgXWSS39UjI6+0KrHOvoA+dHm3rLOuV6XZtWv1B0i7j4xYcKEyHo68kdHq506dSp22zry\nr8iq2jryN3R0rt6HdKRY1qMy/bRG3LWuI6f9Y9LvKu2MCv7IKR0lvGnTplTbyIJ+3vnz57t4YGAg\nsp5ec7VKe87zpr8prbKvs3mYRauw68wBu3fvjqyX9aTS+rcyi/OfpusRLVEAAAABeIgCAAAIwEMU\nAABAgFL6RA31afD7/mj/jaNHj7p4x44dkfU016lVybU6s5nZtm3bajpOv9Kv9lvS/Pfg4GBkvZ6e\nnlTb12qyfX19Lvbzy5qH1kri2j/KrNiKuUg2fvz4yHLaGd5rVWQfKO1/lfd+tQp4XAV+v++P9stI\nK+t+UIsWLXKx349FK+HPnDnTxUeOHAnal1YEb2lpcbHfVydr2i9Iv5szZ87EvidtPyjt4/KhD30o\n8pre78vqE6XXXJZ9oKpKq4rrdZrUF1Pfk3UfKF8Z3wEtUQAAAAF4iAIAAAhQSjpvqMnXT3HEDdv0\nhxlq2kpTZ3PmzImsl9ScnIY/IaI2FWqKMYsJgzX14JdM0OPQFF5zc3NkPS33gHIVlb4rU5GpwzQT\n+WpKzCzaJaAsK1ascLGm5c2i5RmyPlZN4fkTp2c9wfnhw4cz3Z7SlJ2WNDAz279/f277TUpVa0oq\nafJl/XvWiLN0aDrPT7Hr32i93vwuPHqfrNd0KC1RAAAAAXiIAgAACFBKOm+oGdYfTaejPLTp20/T\naepLR2/cdlu+z4RdXV0uzrpJXJt+tTK6WfRzaYrSP39+GhColZ8ivv/++1380ksvxb5Pm+31uvRn\nH8iSPyJSj12r+RdJj8k/l353gbxkfa9KknXFaK1s7n+Hed7vsjj2hQsXulhHYjYKHclaZHX/qqEl\nCgAAIAAPUQAAAAFKSecNNf3pRL1m0SZUTe1pQU2zaJOxpgf03/OQZ5OlFuVbtmxZ5DWdMFXTeTqx\no9nNE7CiPP53kba4YAgdtZQ0Wkj5qSVNlWgq7rHHHous9x//8R+ptq+jc+KKY+ZNP6MWoixy5KTe\nn/zfa1n03qrXSxaFEDWFtW/fvpq3p5NN+2lJ/buQ9Ui4LAoXN2IKDzejJQoAACAAD1EAAAABeIgC\nAAAIUEqfqCH+MFKd8FeH9fsVY3XSR10v78kN86QlHfw+G3GVYf0+YH41WJTHrxKdZ5+otP2gVNKQ\nf73G0vaB8uU5rN6v/D3En/hbvwPto+ZX+s+6r5KWNdB+QWWVWfBlXWFcS634k0DXSvsm+aVutBSM\nftdMxI4i0RIFAAAQgIcoAACAAKWm83yaxtqyZUvsenEpvDxTJnnTY/eb23WiTT1HfsooLs2B4tU6\n+fVoNHfuXBe3trZGXnvrrbdcnLbSt6YUNc77u9FuCnlOzptEU/t5l5jQFF7aYf06kXrS96H3NP/+\nrqlSTdH6ad1GpJNtnzhxosQjAS1RAAAAAXiIAgAACFBKOm/atGlmdnMzc9qRHXGj8Op5EsSBgQEX\nDw4ORl6La+72R/ssWbIk+wNDkEmTJkWWdcRQyOSmfgV0rcYdMjov1IIFC1ycRdpk3LhxLj569Oiw\ncb3JeoRaCH9y8qppaWlxsf93QO/vmqrasGFDZD2d5aGzs9PF9ZbO03OhfweSPProoy7We4GO5Pa3\n19fX52L/nqG/w6Imxq6KWifNpiUKAAAgAA9RAAAAAXiIAgAACFBKn6ihYfpV6DtQFSHDro8fPx5Z\nzrNKNEbGr7JfK394d5H9oFRIfxMdfu732aC6dHa0greWgSlS2tIFBw8edHHSTBNJfbve/e53u1j7\nIL744ou3PM4iaOV6/W60b5JZ2L3i7rvvdnFHR4eL/XIHu3fvdrGWCUmaBaQK2traIst6PWvf5/b2\n9sh62p9Lz7M/C4iWU9H+YL29vSM+VlqiAAAAAvAQBQAAEKDUdJ7f5FzPEwiXwU/f+akSIE/aJJ5U\nkqAK16VW92/UtLemdbRMyrFjxwo7Bk2/+WU+NIWUNo2rfyP8lJMOR09bEuPhhx928dq1a1O9J5Re\nZ9OnT3exn84L6cqh29BzuX379sh6e/fudfHWrVtHvJ8izZs3z8X+ZNOaptR0Xuhn0meNWmf6oCUK\nAAAgAA9RAAAAAUqdgJj0XbbqeQJm5GPlypUu3rFjh4uzGI1TT1XFGzGF50/SrDMY+KORinLhwgUX\nJ6Xz0tJ7mv/3QiuYb968OdX2dIRa3jQV6afwarVp0yYXa8X3nTt3ZrqfrGkXALPo71JT7n4Ve628\n/vbbb9d8HDqy3R/lPlK0RAEAAATgIQoAACAAD1EAAAABSu0ThWzpbNSAWfWHNWcpqb+F9hdKS4dc\nm5VXJT6O38fo1KlTsa8VRftiJfXLmjx5sov9/i9qxowZLp49e3bkNe3Lcvjw4VTHp6Uf8tbU1ORi\n/W6y8Oabb7q4nvr7+d+1Xqchv9EqoCUKAAAgAA9RAAAAAcj/VJAO9TRL31xbT826QNb863/BggUu\nDkkVVC1958s6RVSkpBSe0rSfP7muVkcva8LlJHnej8u61+t51u9GY7Po96vlVMpKM+epelceAABA\nHeAhCgAAIMCoSeeNGzfOxWknv/QtWrTIxdpcmTTBpzZ/pq3QHtpUqxMzAo1KRz0pv5KxTuyq6QZ/\nvUZMMWQh7jwX6Y033nCxP1pSRyPzHRajra3NxTqpsk//htVaEbzqaIkCAAAIwEMUAABAAB6iAAAA\nAoyaPlGh/aCUDpPW/hZJdBhu2j5RoZL6ZgETJkxw8cWLF0s8ktrEzeI+derUyHJPT4+LdZi137dm\n4cKFLt65c2cWh1iK9vZ2Fy9evNjFfl/JLVu2pNqenme/7EqW0pZ08fs9hfQB1b6x/nVEiZhbO3To\nkIuvXr3qYv9vW6P3g1K0RAEAAATgIQoAACDAqEnnZUGbk5NSczo0uMgmYpqjkSQkhTd+/PjIctKk\nsmXzr39N4Sm/Ermmk2bOnOliP2Wv5Uqy6B6QNe1u0NnZ6WK/mrR2Mdi0aVOqbVeh+rb/fejniPuu\nfZrOO3v2bKr3ZG3ixImR5QsXLpRyHLXq6+sr+xAqgZYoAACAADxEAQAABCCdNwJpm501BaLvSdvk\njOFNmzbNxVRnz49Wgq5i+m7+/PnD/rufYk97vWhaQkcc1RtNd23fvt3F/mjEgYGBwo6pVpp+87/f\nGTNmuDjtyOSyUnhKR4Oame3ataukI0EWaIkCAAAIwEMUAABAAB6iAAAAAjS9HVf+N68dVmBm8Lzp\nENayhq/q1zoaznkVVPGchwwD12PP+/agv5UHHnjAxTt27IisNzg4OOz7k8659k1M6ts1a9asW+6n\nnmVdpsK/JuKu9enTp0eWT506VdN+G4XfR80vuTGctOcc2Ro6701NTbH3QlqiAAAAAvAQBQAAEIB0\nXg50ItS0ExVnrYqppUbHOb+1jo6OyHJ3d3dN2ws5562trZFlrVh++PBhF9dzuYOsaakBPx1Yr9e6\nVqA3Sz9B/KJFi1x84MCBTI8pDum8cpDOAwAAyAkPUQAAAAGoWJ4DnfCzrHQe6sPcuXMjy0uWLHFx\nV1eXixtl1Fit6TszsylTptT0fiZOTUdTRlWccFmFzGagFc/N0v/Gar3+0FhoiQIAAAjAQxQAAEAA\nHqIAAAAC0CcqQdaVfgHf0aNHE5dxszlz5qT6d+3Hk7afjNJSJf72GvFe0NLSElkeGBioaXt+KYk8\n+6KFfL+h1X1CyhrMnj3bxcePHw/ab1H0Orhy5UrktUbpm5klWqIAAAAC8BAFAAAQgHRegtAm+zQT\nSuZBSysAvgkTJrj44sWLqd6jk/OahTXn6zYWLlwYeU2rRmu6rL29PbLeq6++6uJDhw4Nux//99rc\n3OxiHa6fdiJcv6L14sWLXbxz585U70tbBbsKak3f+caMqfafl9AJkc+ePTvi92gpkyqm8/S70omj\ndYJws+iE5nQ9eEfwVd7R0WHTpk2z22+/3caOHWvr16+3wcFB+8M//EM7cOCAdXR02A9/+MObanEA\nAAA0guB0XlNTk7300ku2efNmW79+vZmZPffcc/b4449bV1eXPfroo/bcc89ldqAAAABVEjwB8eLF\ni23jxo2RUQednZ22du1aa2lpsf7+fvvgBz94U7M3EyfmZ8WKFS7etm2biznnxch6AmJ/dKhKm2rW\nbaR9j45yO3bsWOx6mj5euXJl5LW9e/em2katmPS5eGknw9X0sVn6FHLVaZr4yJEjhewz7wmINQWt\nFdn9e5Cup6l9fxRfo8h1AuKmpiZ77LHHbNWqVfatb33LzN7JqQ8Nj2xpack8xw4AAFAVwX2iXnnl\nFWttbbWjR4/a448/bp2dnZHXm5qa+J8hAABoWMEPUUOF1ObOnWuf+MQnbP369S6NN2/ePOvr64s0\newIAANSLZ5999pbrBPWJOn/+vF27ds2mTp1q586dsyeeeMK++tWv2osvvmizZ8+2L3/5y/bcc8/Z\nyZMnb+pcTutUfu69914Xv/HGGy7mnN9w3333uViHyp87dy6yXlyO3x+yrsOBT5486WK/NMDq1auH\n3ZffT+m1116LPXa8Y968eS7WKthc58UI7Z8zbtw4F2s5i6rz+/vpse/fv9/FefYLSjrneq/xyzZc\nu3Ytt2MaDdL0iQpqiRoYGLBPfOITZmZ29epV+/SnP21PPPGErVq1yp566in7zne+40ocAAAANKKg\nh6jFixfbli1bbvr3WbNm2YsvvljzQQEAAFRdtUvKYkS0aRnv8Iu9alrtnnvucXF3d3dkPa06f/Xq\nVRf7E53Onz9/2P1qms/M7Gc/+1m6A66Y97///ZHlV155paQjuaGsGQFQmyqk8LQC94ULF2LXW7p0\nqYv91PzGjRtdrGUcxo4dG1nv/Pnzwcd5K0uWLBn2GE6cOJHbPjE85s4DAAAIwEMUAABAANJ5DSRk\nYsyZM2e6WJu6Dx8+HHQMkyZNcnGezdlp+aPfurq6XKyjaXp6eiLr6Ui7BQsWuNgfnacV+5WfHozj\np/1CJ0WNo6N4QiYnyDt9p1XP/RGSqD86QW0WI8NCJs1OkpTCU9oNwL8udRuBE37UTGcE0CriZR3P\naEZLFADlD3hmAAAgAElEQVQAQAAeogAAAALwEAUAABCg1D5R/rQw2ocmpH9PFrSPUNJw0ba2Nhdr\nXyIzsz179mR/YCn4w/mH6Kzc/nmdO3eui/X78Kv0aq5dh/zPmTMnsp7O+t3b2+vizZs3R9bTPkd5\n0pIGZtGhwdpv6e67746sp+ds0aJFLj548GBkPT1/yp/BXod3ax+GLPpAab8q3bZZ/DXsnxf93tau\nXRu7L50jUz+jP5u99ofRod967ZiFlSvwZ5ZHuRYuXOjiadOmuXjMmOifF+2PmNRfUu/BKqlP1IoV\nK1y8ffv2+IMVfukC/e3ofdIvzTB16lQX+yVPyuD308ySfz/RqvNZ9FFLS68lvYf71fL1mNL2S60V\nLVEAAAABeIgCAAAIEDQBcU07TJjIDwAAoEqSnltoiQIAAAjAQxQAAECAUkbn+T3qkQ2trH3o0CEX\nZ3G+Ozo6XHzgwAEXp03N/tM//VNk+ec//7mL16xZU9vBJZg3b15kudbJa5MqjOu5yPsa15GY+hl3\n7tyZ6v06isosbJSRjpjxR90VpaxzrtXuR0Olda0s74/w1RFbWrHc/63oejp6078WdeSzjuz0f7s6\nckxHivqjvpcvX+5iHRXoT9iuv+Wka1tH7ir/Xqij+rTKuT+6VK+fY8eOufi3fuu3XPyf//mfkffw\nN7QYaf6+0RIFAAAQgIcoAACAADxEAQAABCi1Yjmydc8994z4Pdp/QPs6+BWFa63++sUvfjGy/Lu/\n+7up3qd9MUL6nvj9KLT6uPZT8Cuo+1WKh/gVxuOqxGtfDrNoH5oQfnVl/a527do14u35leZD+kSV\n1Q+qLFopeevWrSUeSfGSfnvab0QrRvsVrbUfj/aP8q8j/a3o76unpyeynvYf0m3rb9wseq3r/UT7\nZfnHoZ/pzJkzFkfvi37/Ge2npb+vSZMmxe5XZ3mI63uFaqElCgAAIAAPUQAAAAFI5zWQkHSeP3Fs\nUX784x+nWk/TCKtWrXLxli1bIuvpJNBJze9ankH5w441JRD3HrP4iZRrTd/5/Mlc49KNae3bt6+m\n948GfkpWly9dulT04VSWpsiSJtTWdFdLS4uL/cm/BwcHXawpQT/9FrdtTfOZRScNv/POO1189OjR\nyHp79+51sd5P/Anm9d6gaXX/XqDXiL8vpek9vcbiJg/Pwr333htZfvPNN3PbV6OjJQoAACAAD1EA\nAAABSOc1EL/ZuV78xV/8hYu/8Y1vxK63cePG2Nc0haepubRpF389TeHpSKJa02gjoVXis04P4tb8\n9FFc6rZR6e8oqUK2jqCLq9JtFq1mriPX9Do3i45K01Tc7NmzI+tp6kv35Y+Se/nll4c9Bv9+6R9v\nHJ0NYvHixS7W+4SZ2YYNG1JtT0dC6znXc5S3ou5xmsY1MxsYGMhtX2m9//3vd3HIiGNaogAAAALw\nEAUAABCAhygAAIAA9IlqIP6s6VnS/LxfibhW3/rWt1z8j//4j5HXtF/KX/3VX6XanvZvuu+++yKv\nvfHGGyM+vpA+AqEVy7W6clwl4yJpWQkzs507d7pYh3cn0SHhU6dOjbyWtvK39mVJGuqepevXr0eW\n0/aZaRRp+xPqta59XvxyB/ob0Nf84f/aV0l/D36ZD63if/jw4djj00rnv/71r108f/78yHq6L60w\n7vex0uteP7vfxyqpH1kcPed+2ZU0pk2bFlnWe4j2vSqrpEGRfaD0u0m6/77yyis17YeWKAAAgAA8\nRAEAAAQgnddA4tJOWaRCsk7hxW37mWeeiV1vwYIFLvYnI40Tkr7LQtr0nZ+C1bRp0mfUKsf+ZNFZ\n2rRpU2TZT23EaW9vd7EeX1L19yRFpfCS+Ok93EzTef5EwPodakkSf4YB/e3o0Hv/2tPK5nrva21t\njaynvyNNxXV1dcV8imgqra2tLfKafkbdr59S1HSSHpOfJtXPoXbs2BF7fHGefPLJyLKmFP/93/99\nxNtLa+nSpZFl/U6LTOHp/VOrsj/++OOR9f72b/82s33SEgUAABCAhygAAIAApPMaiE7Wq7QZ3R/h\nElKhNURodWCVNoVXRZqW0IrMftN+2s+YZwpPpU3f+bSqcxIdYaXiUhxlSvuZRpvbbrvxf3G91/i/\neU2DHT9+3MV9fX2R9XQbWhHcv+b1fXof8+9xOkGyHqt/fDoZu/4um5ubI+vpNavpI39EbtqK4zqi\nrru728Uhv71XX301shwyKX2IPXv2FLKfW9GuIevXr3exPyl1lmiJAgAACMBDFAAAQAAeogAAAALQ\nJ6qBLFu27JbrZNEH6oEHHnDx66+/nuo9eZZIqCKtfmwW7QOSRX+fPCvI50lLM5hF+7/4Fa5RHUnV\ntxcuXOhi7Rfk/wZ0Pa1cf/Lkych62vdMywv4fZO0/5D2B02qXq6lN5L6RCm/3572b9R4xowZkfW0\nb5b2AfX7gGXp4MGDicuNTs+5/q3bt29fbvukJQoAACAAD1EAAAABSOc1kNmzZxeyH03h+RNe6sSd\nKnSofNb0eDVFEZpK8tNTQ/IcUmtWXyk8VVRpBmQr6fervyNNM/sTVOvk1Zqa6+joiKyn14j+Lv2S\nAWlLCCithp62krZ/zfqTaA/xP69WuNf37N69O7Je3L0n7t6CeEWV7FG0RAEAAATgIQoAACAA6bwG\nEjfqSytk+03OSifDTZveikvfZUVH0IRUOffp8Wr14lB+deRaFTXqbv78+ZFlHSFFyg0joSkyTZf7\n1fi1qrWmu/3Rb3H3IT8NFjKxbX9/f6r1dNJ2fz9639DRef79V0fk6mfUyY397SmttI7qoiUKAAAg\nAA9RAAAAAXiIAgAACECfqAaiOXiV1A9KVbFidJ5DVnUIsj+cOG2/oLg+YX515bhqyL4FCxa4WCsb\na0XmLCRVdQZGQn9HJ06ccLH/G1Baldy/trXqufY5yvo3kET7kfr77erqGnY93+XLl12sFbO1v5W/\nDb3vZPF5s+5TWjX++U/7ty5LtEQBAAAE4CEKAAAgAOm8BqLN4PXKnxS0qCborIf1p03f+TQlW2T6\nAgilaStNE/uVvbV8h6a0/N+KVkfX+4FfoTzP1I2WIfBLEmgKX2O/qrumIvW8+J9j7ty5LtZ7eFxl\n9JH44Ac/6OINGza4OO8ZFYriT3JNOg8AAKBO8BAFAAAQgHReHdOJP80aY/RF0mcIqaheb3R0E1AP\ndAStpsWvXbsWWU9HUmnaSiuem0UreGuqr8j0tu7XH02ny5rO0/SdmVlbW5uLdQTj0aNHI+vp549L\nZYb62c9+VvM20vCrzut3mGfqsLu7O7dtp0VLFAAAQAAeogAAAALwEAUAABCAPlF1zB9S2+iy6AdV\nVAVff2Z2Xc6zCnvW/OHdly5dGvE29LP7ZThCtodqGRgYcLH292lpaYmsp0P7x4y58afH/x36fYuG\n+NdO2t/vzJkzXRzS59Dvi6W/icHBwdj36fB7nYnAL3Ggv4HJkye72J9FocqSzkOjoyUKAAAgAA9R\nAAAAAUjnNZBam3+1Qu6ZM2dqPZxKunjxootXrVrl4o0bN2a6Hx3SPNxylc2bN8/F/f39NW9PPzvp\nu8ajpQz093XgwIHIegsXLnSxprT8EgdadVqHx6edkWHatGmRZd2XVgfXYzWLpgc15R43yfitaOpw\n0aJFLvbv0/oZtfp7Pd0z0vJLIWj6Uielrie0RAEAAATgIQoAACAA6bw6piNczG5uKh2pRk3hKR3R\nqCk8HcFjln4Uj181Pg1NN4SmCtIKSdEy8TFGIm60aW9vb2RZf1N6Xfqj1TSlFVLt2h9RqsuaEvRH\n0CpNKYaOgtZRi5ra9O/Tev40pdjc3By036rRkYn+iMp6TeEpWqIAAAAC8BAFAAAQgIcoAACAAPSJ\nqmN+X4TRXDW2ViGVjM3C+kvk3Q9Kad+OtEZD3zhkR0scKL+chS7rdTllypTIerfffruLtd9n2kr/\nfskE3YbGWlHczKyrq8vFWc8Gof3DDh48GHkt7n4we/bsVNueMWOGi0+ePBlwdNnTqvP6Xed9fNrf\nrKi/h7REAQAABOAhCgAAIADpvAaS54S6GJ42pVfRaJukGsULue9oyi1tKt0v6aLpPS1doJOMm0VT\nS/oef3vnz59PdRxp6b40jZX2N5n2eKqSwlNa+qXI4yujSwstUQAAAAF4iAIAAAhAOq+B6KiWeuVP\nMuqPtEF986tJ6yTQx48fd/HOnTsLO6aq8Staa1rHnzR3NPGvHZ3UV0f++VXO9R6iqT2/Yrm+lvV5\nDkmrVzFNl9ZommicligAAIAAPEQBAAAE4CEKAAAgAH2iGkgj5KHrrQ9UPfdbKMPkyZMjy3v37nVx\nf39/0YdTSX7fxqr3g8q6NID2i9T7gV/ZXNfTqtj++dLh9lrWwK/mP2nSpNhtlMHvs4V8aL/My5cv\nj/j9fEsAAAABeIgCAAAIQDqvjiUN0UV2dCi1P3z63Llzme7r4YcfdvG2bdti95s1TXNoyu3UqVOZ\n7odJsm/t6NGjZR9CqeJS+v7E2Jp60XuhP4uATuSrKUD/WtQyBJoCLKvqf0hqqSz+ZM7ataTqE5pv\n3LixpvfTEgUAABCAhygAAIAApPPq2PXr1yPLBw8eLOlIGtuBAwdc/Cd/8ieR1w4fPpzpvtauXZvp\n9tLSyVInTJjg4qzTeUAofxSgLuukw5p+NzNrbW11sV7bmuYzM+vp6Rl2v3466tq1ay7OM9WXxUjl\nmTNnuli7HmSdKvS7G7S3t7v4ve99r4tfeOGFTPdbBbREAQAABOAhCgAAIAAPUQAAAAHoE9VA/Iq+\nQ7QCsubzq2jatGmR5dOnT2e6fR2Kq9XGW1paIutp9Ww9Z9/73vdit9cosq5AnZZ+90nfe3NzcxGH\ngzpy4cIFF/vXjt4XtZ+Rfx0dP3582NgvJaP9B8uifZ1OnDgRu17Sa3k6dOjQsHEjoiUKAAAgAA9R\nAAAAAUjnNZC2trZh/33+/Pku9ofkp03vaUXrPJuzs07f+eIqf/f29ma6vSSaHvDLVNRq6tSpkWWd\nSDXtkOmyKgyn/e71ekYx6mkyXP8eFzeTgz8BsV73mtLO+jeahbLSdI1IZ2gImYGifn4ZAAAAFcJD\nFAAAQADSeQ1k0qRJw/57yOiIvEfJqeXLl7u4q6srt/1URdbpAZ1wVUccZkEnbDXLpopyrbL+jLg1\nTXnUm+7u7rIPoRJ0RJ9OEGxW3ojcKqh1EnlaogAAAALwEAUAABCAhygAAIAA9IkqkJYJMIuWCtCq\nulp91yy+DMH9998fWc5y6HfepQZUnv2g/HPS19fn4jxnYE+yYMECF8fNHO9L6puUZx+hKvSB8tEn\nqnhVn+kAt0ZZhHzQEgUAABCAhygAAIAApaTzHnnkETMze+ihhyL/PnfuXBefOnXKxUlpqqTh4po+\n0+ZoPx2gqavW1lYX79u3L7Kevm/ixIku9ssBaCXcpqYmF/uT1eoxzZ4928Xjx4+PrKdpJ03r+MOO\nH330USva9OnTI8s6jFYrBS9cuDCynp7zTZs2uVjPq1m0/MHrr78eexz6HWia1K9erNu7fPmyi/Me\nBv3YY4+5WNN5/jW2ZcsWF+s5yjqt1tnZGVnW7/G1116Lfd/73vc+F//mN78Z8X7nzZsXWdZr5L77\n7nPxW2+9FVlPv58iU814hz8kHuV6z3ve42L9e/GrX/2qjMOxj370o5HlxYsXu/gb3/hG7Pv+4A/+\nwMV6L9S/CXnTv01pu1coWqIAAAAC8BAFAAAQoOntgocoNTU1lTYqCgAAYCSSnltoiQIAAAjAQxQA\nAEAAHqIAAAAClFLiQIf9Ix+av9XSCn7l6yNHjrg4qVxEnKQSB4sWLXLxoUOHIuv5Q/uHaOV2f/s6\n27ZfVkKX9bP7VXr9kgdxJk2a5OKpU6e6+MyZM5H1brvttmFfq/o17pfRmDBhgotvv/12F/v9ALT0\nSMj14tMyHRcvXozddlx/BP33qp/zqtDzlNQ/NW49/z2c9/z551zv6cePHy/6cEaNNP23aYkCAAAI\nwEMUAABAACYgHgU0daNpKjOz/v7+mrad1Mys+4pL3/m02vtwy0M09WMWrXytzduhk26eP39+2Nin\nqb564legLqsitaZos6bpZP2e/IrnBw8erGk/msI2S3/NPfzwwy7Wavx+yjhkwuokmtLXqv36G/Jf\nQ7X43xXKQ0sUAABAAB6iAAAAApSSzlu6dKmZ3Txiq9aUwqxZsyLLOuIo7aisRqQTHWfdDKyT/ZpF\nUyU6ci1rfjpvcHDQxXmmiHx+6gXVceDAARfrde+PKK1V2vSdTjJuZrZ27dpU74tL4d1///2RZZ28\nOklcmo70Xf3Q0ch6D4rr/oD80BIFAAAQgIcoAACAAKWk88aMeWe3fvN2SMptxYoVLh5KEw63vdGc\nztPRZX76LW3hvTh+amRgYMDFaUfkhVi1alVk+Y477nDxm2++6eKdO3fmdgyoH1pANG1xwoULF0aW\nJ06c6OJdu3aN+BiS9qv3rj179qTaHqmb0UtHWOrIU38kcRYFcZGMligAAIAAPEQBAAAE4CEKAAAg\nQCl9oob63viVfrU/jQ7LT7J9+3YX+0ON+/r6Qg+xLjU3Nw/773ous56s0v+erly54mK//1WWlixZ\nElletmyZi7VPVBItgeGXTEhrxowZw/67P9GznhcU78KFCyN+j07OnWSoj+eQzs5OF2/dujXVNtL2\ngwp5j3+Nnjx5csT7QrXobBB6n/XLymhf4JA+r7g1WqIAAAAC8BAFAAAQoJR03tBQYa26amb2yU9+\n0sU6NPN///d/I+vFpaTyTB/lbcqUKS72Uz9pK7mnTT9kyd+nlkzIWltbm4tbWloir+k1kbasQRbH\nGreNBx98MLK8Y8cOF586darm/WaRikSytOfVL4WQZ6X+tDo6OlysEzGbpa+UrrS8A8qn15hOMO+X\nNNAuMzqrQ5Jay96MNuX/2gEAAOoQD1EAAAABSknnDVXa9dNvOoFwa2uri/2JNn/xi18Mu12/2Vqb\nPHXkX1n0M5lFP69W/vYn0D169KiLQyqv63n2JyDOetLRrJt/tTn6/e9/v4u1ArWZ2UsvvTTibYeM\n2PLFpXw03ZYHUnj50JRxf39/5LW4EcN5VuZPoik7M7Pu7m4X6/1O/30kdIRpFr8VZEfvs9r9wx95\nGVLVnhTeyNASBQAAEICHKAAAgAA8RAEAAAQopU/UwYMHzezm/jha3VeH/OsQziQbN27M4Oiypf0K\n/GH5mr/Waut+f5e0Q1Pj6PDkuXPnRl7TvkUhM9On5Vd1TluOQvu5aR+3DRs2RNZLWxk6TtI1ptep\n318grq+I308mi7IGyJ9W9+7t7a15e1rqYtOmTTVvTyX1dcqiD1N7e7uLh+7ZqAbtn6clCfyZEnQ5\n6/6veActUQAAAAF4iAIAAAhQSjovTbOiDs0MGaZZFTr8dMuWLaUcg1Y891ODRVVXDq0mf+DAARdr\n+sKvzBvHr7Qcl+ZIWxU+LdIf1bVq1arIsqbttm3bVvP2P/vZz7rYL5MQ5x//8R9d/Mwzz9R8DGlp\nGttPad95550uDimtgvxo94/Tp0+7+MyZM5H1KIWSP1qiAAAAAvAQBQAAEKDp7YLLk+Y5QS1u0K91\nNJxzHf1X1kTUo+2cV0HIOZ88eXJkWVO8adPEWfj85z/v4rvvvtvFX/ziF1O9P6lieZ78Pxlc6/nz\nz/m8efNcXIXZOBrV0HlvamqKreROSxQAAEAAHqIAAAAC8BAFAAAQgD5RDapq/XO0Ar1ZdDj18ePH\nR7w9rbTu02q+RaraOR8NqnDOJ02aFFk+f/78sOv5JQSyLqtRFPpEFc8/51pZn9kQ8kOfKAAAgJzw\nEAUAABCglIrltZo+fbqLacqsrtWrV7tYh+SaRVMeL7zwwoi3XVbKDvD56TudBUBLJvgp7XpN56F8\nRZbiQDJaogAAAALwEAUAABCgLtN5jZjCa29vd/HRo0cjr6WdRNIfJVQ2Hc3Q1tYWeU2bo5cuXeri\nPXv21LxfHS1U8OBTVIiOhktKnTU3N7v4yJEjNe83LtUSMgoVGA73teqgJQoAACAAD1EAAAABeIgC\nAAAIQMXyCvL7D2l17mPHjrnYH1o9ZsyNLm5XrlxxcRXOufZ7MjN74IEHXKyX4Ouvvx5Zb+/evfke\n2Aj5VacvX77sYu0LU4VzPhokVSyfO3eui/1+hghHxfLi+edc+79euHCh6MMZNahYDgAAkBMeogAA\nAAKUUuKgtbXVzMz6+vrK2H3l9fb2Br3v6tWrGR9Jdg4ePBhZvueee1ysTdMzZ86MrDdx4kQXV6HZ\nmirT9SPrqs5xlciBonH9VQctUQAAAAF4iAIAAAhQSjpPR45hdPCrqetIwv7+fhf7o/GqkMJDfTp7\n9mym22v0FMr8+fMjy4cPHy7pSHArdCuojsSWqM997nPW0tIS6b8yODhojz/+uC1fvtyeeOIJO3ny\npHvt61//ui1btsw6OzvthRdeyO+oAQAASpb4EPXZz37W1qxZE/m35557zh5//HHr6uqyRx991J57\n7jkzM9u+fbv94Ac/sO3bt9uaNWvsC1/4QsP/zw0AAIxeiQ9RH/jAB24aLfXf//3f9pnPfMbMzD7z\nmc/Yj3/8YzMze/755+3pp5+2sWPHWkdHhy1dutTWr1+f02EDAACUa8R9ogYGBqylpcXMzFpaWmxg\nYMDM3smfr1692q23YMGC2KH6VR6Kj3xo2tfM7NChQy4eHBx08YkTJwo7JjQ27TeiVf9nzZoVWa8R\nq5lPmzbNxadPn071HvpAASNX0+i8pqamxJL/TAcAAAAa1YhbolpaWqy/v9/mzZtnfX191tzcbGbv\nzPemrQs9PT03zQE3hBFXAACgyp599tlbrnPLCYi7u7vtYx/7mL311ltmZvalL33JZs+ebV/+8pft\nueees5MnT9pzzz1n27dvt0996lO2fv166+3ttccee8z27NlzU2tUU1OTzZ4928zMjh8/HvjRcCtJ\nE7NWgU5IrOUPduzYEVmvnsphVP2cN6K051xfK3jO9YbDBMTF45yXI80ExIktUU8//bStXbvWjh07\nZu3t7fY3f/M39td//df21FNP2Xe+8x3r6OiwH/7wh2ZmtmLFCnvqqadsxYoVNmbMGPvmN7/JFw0A\nABrWLVuiMt8hLVGFqHqrCC1RyAItUcWjVaR4nPNy1NwSlZeiHp50wlC96K5du1bI/hFvwoQJLp4y\nZYqLly1bFllv3759Lr548WL+B/Z/qjbxMW5t0aJFkeUDBw64mAenxjZ58mQXnzt3rsQjwWjD3HkA\nAAABeIgCAAAIwEMUAABAgFI6liOZVlc2i+/D1dHREVmeM2eOizds2ODiKp7zqVOnuri1tdXF2snc\nLFrp/OzZsy72K5vX2s+tvb09sqzHsWvXrlTboGN58TjntdHr/Pz586neQyfn4nHOy5GmYzktUQAA\nAAF4iAIAAAhQSjpvqPTA9evXi9y146fLtBRCkXWJhuplmb0zYfMQHa5rZrZ7924XJ02WOm7cOBfr\n5KtVb/rV8zB37tzIa+PHj3fxwYMHXZzFRMWa/vTTgSHbJ7VUPM558fw/Gfr71cnEUZuxY8e6+PLl\ny5HXuNaLQToPAAAgJzxEAQAABCglnffQQw+ZmVlPT0/kNa00q6Oy/BSbVruePn26iwcGBjI91npW\nT2mOMWNuFM6/evVqzdvTEUczZ86MvKbXjqbsskhD1NM5bxR6zrXKvFmxFe5HE/9PxpIlS1ysMwwg\nO4zOKwfpPAAAgJzwEAUAABCAhygAAIAAY269SvaGhrG3tLRE/l1LD7zxxhsu9itGa18H+j3Uv7T5\n/RkzZrhY+8yZRYcDJ1Vh7u3tDTlE1IGFCxdGlru6ulK9T0uKaL9MpNPX11f2IQCloSUKAAAgAA9R\nAAAAAUpJ5+3fv9/MzLZs2VLG7lEBd999t4u1WrhfpkKrySdVGNcyGMeOHcvsOFE/QlNx9ZrC04m7\nzcpLq124cKGU/QJVQEsUAABAAB6iAAAAApRSsRz5S1s9W0dE+imyPGml+VOnTqV6T3t7u4uPHz8e\nec0fhVcGKpYXbzSfc3+i8qLSklTPLh7nvBxULAcAAMgJD1EAAAABeIgCAAAIUEqJA5Rn3rx5keXZ\ns2e7WPsZ9ff353ocaftBqcHBQRdXoQ+UmdnEiRPLPgRUzKxZs1y8bNkyF7/22ms1b3vChAkurtfS\nDEAjoSUKAAAgAA9RAAAAAUpJ540fP97MzC5duhT0fm3STjsBsU5Qq1WwfdOmTXOxP+Rf3zdmzI1T\n5w991FRV1hMk6yS8mjYwM7t+/fqw79HKxlop3OzGZNBm0c9x4sSJyHpaSfzQoUMu9ksN5EnLMeRN\nr7EpU6bErtfc3FzE4aCOaNo561kZipxwfebMmS727wcA3kFLFAAAQAAeogAAAAKUUrG84F0CAAAE\noWI5AABAxniIAgAACMBDFAAAQIBSShyMdAbqSZMmRZZrrVbtz37e2dnpYh3O3tvbG1mvr6/PxSHV\ngh966KHIsg7Z17IB/rD5TZs2ufjKlSsu1mrjZmZz5sxx8c6dO13MjN/F0Jw557wYWZxz/R1duHDB\nxVlXxQ+9j40bN27Y+OzZsyN+v5nZ5cuXXbxw4UIX+9X3d+3aNez2/L4hXOv588+5lp84efJkqm1M\nnz7dxSEzRphFryW9jhqFlrYxi94P4tASBQAAEICHKAAAgAB1MQFx1s3qfipO02VpLV++3MVdXV2p\n3vPyyy+nWs+vPK7V1jWd51cLr8qkvMg+BY1b02r+ZunTHDpJsP721q9fn82B/Z/Qa0BTKDrjgF9F\nXO9Dev0l7VdnjfBnQNDUhs7QgPLp95v2Og9N4Sn9jR05cqTm7VVNyIwAtEQBAAAE4CEKAAAgAG20\ngdKm8EJ0d3cHvS/NSIKhyZ+H6Mikw4cPj3ifS5YsiSzrCEZNI/gjf9Ica950Qum4yZtD3XHHHZFl\nTSo+yQwAACAASURBVIfs37/fxVk0seMdK1eujCzrKNwDBw64WEeumpmtW7fOxS0tLTkd3c1Wr17t\n4j179rj42LFjkfX0t6MpfH/0sEqbOtSJxTU2M1u1apWLSedViz+KrCgf/vCHXfy9732vsP0uXbrU\nxfpbyZr+TUj9nhyOAwAAoOHxEAUAABCAhygAAIAAJLo98+bNc7HfP+KNN96oadsdHR2R5dC+TyOl\n+XO/GvrBgwdHvD3NT6cts5C2D9SiRYsiy7r9tBWa08qiH5Q/rH6I3/dMvwO9xrRqvVm0hIV+3rgZ\nxHHDjh07Ist33XWXiz/5yU+6+Cc/+UlkPf1d+/2C8qT9jJKuxWvXrrk4i/4gbW1tLk7qV9XT0zPs\nMaB8ZX0fZfWN09IeefaJCvmbQEsUAABAAB6iAAAAAjRUOm/q1KmRZU2NpK1E2t/fP2xsFp3AMW7Y\nsb9fVVT6znffffe5OG5S0VvRUghaqfb06dPhBzYMHYo+EjqRqn5vfvOzVn9OW+lX6TWQtA1/v9Om\nTXOxpvD8dJ5W09cJPrWyNIbn/w51hoD29nYXVyU1mnYGA72v6fWWlHpYsWKFi/0JiDXNuWHDBhf7\naRL//ofqiPsbk7ek9G+WOjs7I8t+df68hJSOoCUKAAAgAA9RAAAAARoqnXfmzJlct6/Vpeup0rSm\nOfxJRvVzaLVWTd+ZVW+ySb869datW4ddT1NiZtHRg/p5k0bJKZ0M2sysqalp2PUOHToUWdY0nY5U\n9NOBekxlNdk3oldffdXFWsncLPodpk316fWS90gpvXbSjh7S9MfVq1djXwtNn6NcOgFx2msx5Dr3\n7du3L+h9I3XPPfdEll9//fVC9ssExAAAAAXhIQoAACAAD1EAAAABGqpPlN/fZ3BwMNX7FixY4GKt\n0lt1frVsHeavDh8+7GK/ovjy5cuHfU/aWeDT8r8bXU5bgVbLSsT1gRoJ7V/i94mK62dw7NixVNvW\ncz7cMoqVVF7kwQcfdPHmzZtdnNT/SPuk5N0XM+01p/r6+nI4ElSF9mlK2ycvi9IeeVYLV1OmTIks\np53xogy0RAEAAATgIQoAACBApdJ5Wpk3ZFhvaDqv1hSeppnMimt69IfHx1XPTkrNdXV1ZXpMcfzv\nIu13o9KeV01R+uckrlQD5QRGr71797o47b0m7xReGbS8hllyuhvlam1tdbGWsAmZhaEe6PNA1dAS\nBQAAEICHKAAAgACVSudpE7lWzPbTOHHpqaJGDviySN/phLV+hWGMjDZvV7kZGNVQ9RSITooaUlE5\nraRUZt5V2TEyM2fOdHHVU63z5s1zcdpJrf37dpVnCKElCgAAIAAPUQAAAAF4iAIAAAhQqT5RSvu1\nzJkzJ/Ja1tW0lfbF0mPIG/2gslPk96bV7oE8pL03tLW1uViHwG/cuDHzY0K59G9i1furhfTjq/pn\nUrREAQAABOAhCgAAIEBl03kqZALOUEWmgoqildz9Ssu1VurWKvPDbb9eafVmbTr3K57HDS8OrZ6P\nfHR0dLj40KFDkdeqnjrQdJ6m7Hp7eyPr6W+5yhO2onbNzc0urnqJjpDj86/tKqMlCgAAIAAPUQAA\nAAHqIp2H2qRNJWllWT/NpyMiNYVXZPpu7ty5Lj569GjsetrUHTfh8K1oReCkbRw4cGDYf+/s7Iws\n6yTXBw8eDDqmRuBPcjtu3DgXjx071sVawd/M7MSJEzXtV1N4VU/fJfHT50qv09DrHqgCvV9WHS1R\nAAAAAXiIAgAACMBDFAAAQIC67BPV1NTk4rffftvFkydPjqyny/QRuLW0M2xnMXxaK8Mrv8SEfodJ\n/aBUFt91raUutGK0WfSaTRryq32EdObyWktRVMX169cjy1rNWPtE+SUi9JprlArI+nm1VEbS5+vq\n6sr1mFAf0l7PSSUxqsyfpaTKfaRoiQIAAAjAQxQAAECASqXzVq1a5eKkSTM1hafOnTsXWb506VKq\n/WpTug5tz7tSug5X1nRNSLoirenTp0eWNWWUp/Hjx0eWtblWU3Z+mi/P9IV+1/7xpU1txpk2bVpk\nWatO62v+ZNq6nqYARwNN9fm/Af1+8vx95Mn/Pn/v937Pxd3d3S7esGFDZD09L346FKPT2bNnU613\n+vTpnI8EtEQBAAAE4CEKAAAgQKXSeUkpvBA60knTJD4d6VDkZMdFVfueP3++iw8fPlzIPs2iaTo/\n1bpr166atj1hwoTIsqbI0o7Oq7UKdhK/MreOxJo0aVLsepqC1tTN5cuXsz7ESvM/byOMTly2bFlk\nedu2bS7eunXriLen15RZY5wjpON3F4hTrxPC19P9jpYoAACAADxEAQAABOAhCgAAIECl+kSllbaP\njz98fLQqsh+U8vtB1WrixIku1v5uZtWrSO/3ddJh+Zrv1zILZvGlLvzt6XpZn+eyaFVyv89bI/T3\n8X+HaYepx9G+dWbFlStB+apefVzvVyFlOdL2+aoCWqIAAAAC8BAFAAAQoC7TeWWlp6rOn4C5CFrt\n3az2iV797S1ZssTFOqnvr3/965r2cytaUT2p7IU/zHyI34StzduahtEUpVm0orxWuJ47d25kPS2F\nsGXLltjjqydJlbmrOIHwSNWavvP51f3j0nlZ/0ZRPj+9XzW1Vtb3J3Cvsmp/EwAAABXFQxQAAECA\nukznpaXN2NqEPWZM9GMnVTOvJ2WM0mpubo4s9/X1pXqfpiKOHz/uYj/VoCO2Dhw44OKsJ2L1R/ul\nrVwfN2rMHzmlo02mTJniYj+dp59XR5f616yO3NOUYhVHsekIRP+3puddz5mfmtbvezSPQtPz5f/2\n9u3bN+x7ykrfJV3bqE1HR0fZh5CrgYGBsg8hNVqiAAAAAvAQBQAAEICHKAAAgAAN3Scqri9A1n2g\n/OGmWffXKYr2IfMrRmt/K+2fk7YPlE/7QSU5dOhQ0PZHKutZw/3zp+dW+7UkVeZOGvL/9ttvu3j8\n+PHDvr8q9Pehx20W/Y3qa/6w/Hrtt6i/lSw+g16nJ06cqHl7eaIPVH788haNZseOHWUfQmq0RAEA\nAATgIQoAACBAXabzpk6d6uIzZ86UeCTvqNf0nU9TK0nlEkLSErNmzYosDw4ODrueXwG8rPTUvHnz\nXKznxW9Gj/vu29vbI8uahtHP6KcRT5486WI9R37JBP0Oql69WMsx+JOCa1V2LWtw+vTpyHr1Osly\n1uUF9Pqr+iS0yE9/f3/ZhxDELyUT142i6qlqVe27LwAAQEXxEAUAABCgLtN5VUjhVYFWgjbLfoRZ\nluLSd74i03dJaeG45vKjR49Glv2qzEO0QnnSev5+u7u7XawT1vppRE19xU2CXEV+6lFH4Wlqr1FS\n5DricPXq1ZHXdFTl2rVrU21PJ6LeuXNnjUdXX5hI+YaXX3657EMIUuR3ppO55znLAS1RAAAAAXiI\nAgAACMBDFAAAQIC67BMVQvtilNXfYsqUKZHlJUuWuLi1tdXFflXnV1991cU69Fv7R5jdPKt7I8iz\nnEUW/a/iqjL7fcDihvn7Q/kvXbrkYh0O7Pd7SiobUDVJ5Qm0j0RPT08Rh1OadevWRZb9avVpVLEK\nuPb/0+866ZoN4d8/8+znUnXbtm0r+xCCFNknSvuh0icKAACgYniIAgAACND0tp87ynuHMow5iTbd\n6lBvs+hwb20e1GrPo51+rWnPeT3xUyG1pgqyoOf8i1/8YuS1ffv2ufi1115zsd+8fezYMRdrOs+v\n+K5pHU1zNkppgLQa/TrPg5YK0FScn1qOS734fzK0mn4W6UadLUCPyd92wX+6SuV/Vq71W9N0cmjX\njaHz3tTUFHu90RIFAAAQgIcoAACAAJUdneen8NTx48cLPJL6oc3gRfErUGvaSVNTSTo7O12cVIW5\npaXFxf7IxK1bt6baV1H8z7Fnzx4XDwwMpNqGVqD3R5foa6MthYfaaJoui4lesx4xWK+T6/rGjBkz\nbOyPWtQ00YwZM1xcxv28KubMmRNZTvu3RBU1+wUtUQAAAAF4iAIAAAjAQxQAAECAypY4qCc6G7tZ\ntOp0kXTWai330IjnvIr0p7Rs2bLIa9onCtmpYokDvR/oMYWW4Zg8ebKLk6q/F4Xh9uloPyi9Jvy/\nF3r+9LvWvo6HDh2KfU9ZtF/q0aNHM932qlWrIssbN27MdPtpUeIAAAAgJzxEAQAABKhsiYN6Ulb6\nzteIE3JqZfIqVCVPS6s4m0Wr7GuJDk3BmkUnXNYyBn5Tsg6T1mb/pOHhOmzYn8w55BrWY9Wh2f7x\n6VBjTVf479MK7T6d0DltOQstt+FPCJ0nPZerV692sT8BcZwHHnggsrxjx45sDqwOaXV1v5RH1SqW\n+yUJ9Hi1ZI+fktW0n6bpkn4PWVTjrlWe57+szxSCligAAIAAPEQBAAAEIJ2HSvEroIek8DQFEDeJ\n6q3UOiJq4cKFkWVN72nl9fnz50fWmzhxoouTUmx6njQF4E8iq/S8+KlfrVyt+/Wb7HXC2sWLF7v4\n6tWrkfW0OV7366c5NZ3pTyqtNDWXNJuBKjKFFyfp+1D6fba1tUVee/311zM9pqL4o9A0vZWUttLJ\n5/Xa8VM8R44cyeQ4s6Lpd7P015/+3vR+5/9WlN6fdCR23vT7uOOOO1ycVFFc7xn+OYq7v/tV3bOm\n15x/TCNFSxQAAEAAHqIAAAAC8BAFAAAQoJSK5VUbmgoAADAcKpYDAABkjIcoAACAAKWUOChj8kSt\njHz//fdHXnvppZdcrMPPBwYGgvalwyd1X+vXr091fP6QVa00nTSUtLOz08Va5XjmzJkuXrp0aeQ9\n2kS5e/duF6cdmu3TIftawbe7uzuyXtrhv4888oiLt23b5mJ/eLOe846Ojtj10g4H1uHF58+fj11P\nvzctE1DWBKE6KahZdLj8li1bYt+npRUuXLgw4v22t7dHlv0JU9O48847Xbxr167Y9R5++GEX62+3\nCpOyjgZ+WkPvL3od+eVF9BrRcgV+JfK0FenT0nuSlsrYv39/ZL2QUiZ6b/ar9uusAKF/S4YkTfoc\nN4GxWbQkgfLLRWhJAS0hkrZEjM5eYBb9O6rH5N+P9e9MyPn3S+L411Kt0nQ9oiUKAAAgAA9RAAAA\nAUZNxfIVK1a4eM+ePbHr1drsamb25JNPulgnl0xK5yWlmdJOLPzQQw8N+++a6vKbP7V5NTSFpw4f\nPjxsHOqXv/xlqvW06mxXV1fN+01K4akiqwWnoc3oZmaLFi1ycVI6LySFp9XGe3t7R/x+X1IKTyVN\nsoziNTc3u1jTPzrRtln03lrk72bBggUu1qr4aa+3JEmfo6iJ6TXllLaaf9b8Cc395bxknb4LQUsU\nAABAAB6iAAAAAtRlOi9kclhtWg1JXZjFj2DS0WBm0dESP/rRj4L2pfyRFHG+/e1vu/hb3/qWi7UJ\n2x/dV7VJPDE8fzLSuHSjn0JZtmxZbseUNs2ctSzSMLg1TddqtwSfjgDV67Snpyeyno7IzTPtpOlF\ns2h3Bh2tlkUqSCfe1ol2zaIpraLSWygeLVEAAAABeIgCAAAIwEMUAABAgLrsExVS2VT7Ufn9RuJo\nLt0s2g9Kq9N+6Utfiqz3hS98IdX2tSTByy+/nOo9IbSPlt8nKu1QfoyMVgA2S9+vTWk/lLSVg/2+\nK1q5HtWlfXXSftd5076U/r1QabXq8ePHu1j7VJkVV9bALy2gsyWEVONOy69YrudMS7D4ZWZ0pgPU\nH1qiAAAAAvAQBQAAEKBS6bysm7R1qKsOw01Lm2B9H/vYx1ysk6CORNYpPL+ZeIgOw61KqqAK8kyh\nhKTvfPq9aezTFJ5OsGpm9sYbb9R8HGrlypUuDpkoNnTCUB0+rhNb50kn1jUzmz17touTZj0IUcXf\npVYY18r3Ph2+r9+n3+0ipBtGCL/0RlGlOPxuIvqd6mwQaSa1Rf2gJQoAACAAD1EAAAABmt4uuG1R\nR4rlTavnJo1C00lbs5iAuAr0a9VRNv7oraKa2EcDPedFXuc6OspPQdc6CerDDz8cWV67dm1N20tL\nU61m0fOpqT1NoeR9zvW3k5RebRQ6Q4Om8/wRn4sXL3axfjf+tRdX9fzQoUOR5SwmQi+DpnvNotej\njsALSd36f6bjrnU/Ba2pzCpM1ltvhs57U1NTbBqWligAAIAAPEQBAAAE4CEKAAAgQKVKHGQtbsi/\nr1H6QcXRvgl+VV2tKqzVzJPKO+CGIvs+xcl6hviOjg4X9/T0pHqPfx5q7Wqp/RnNop9xcHCwpm2H\nGg39oJT2tdO+Tj6tCK4Vy/336KwR2n/IL8tRr32ipkyZElnu7+93cVElLPzfHf2g8kdLFAAAQAAe\nogAAAALURTpP0wtm0eZj5Tcfv/e973WxDvVct25dqv0uWbIksrx3795U78uzZMLSpUtdHFI12T8e\nHRJ7xx13uHjnzp0BR9eYQiqb+8O5V61a5eK0119Z5s+f7+Lf/OY3qd4zd+7cyPKRI0dqOoasU5RZ\n0HSNTmRbbzT1mpR21e8wadJ2/X1o+igp1a2prno+l3PmzHFxa2tr5DX9XDqDQZ4ptqImeW5U+n2m\nRUsUAABAAB6iAAAAApSSzhtKdaQd7ZK2ad8f1fHzn//cxX4F5DiPP/64i19//fVU7/FlncLTUYZZ\nT3yqlXQ1xg1JKby4dIifgk4a3VQ1aVN4mrLUFKBZ7em8KqrntJMKGTkZV23cLPr7iJt01yx6v9cR\nljqjQr3Rvyv+aHBN/+po5yqmqvEOHaGeFi1RAAAAAXiIAgAACMBDFAAAQIDEPlGf+9zn7Kc//ak1\nNzfbW2+9ZWZmzz77rH372992Q5r/7u/+zp588kkzM/v6179u//qv/2q33367/fM//7M98cQTw253\n3LhxZpa+T5Q/vFZzz2mHi6Ydmr5169bY/ap7773XxW+++WaqbYdK+xm1WjDKpeUizPK/Rsqgn7Gv\nr6/EI0He2tvbY1/T6vJ6T584cWJkPb1vh5QNqSI99osXL0Ze88t+DKFPVGNJbIn67Gc/a2vWrIn8\nW1NTkz3zzDO2efNm27x5s3uA2r59u/3gBz+w7du325o1a+wLX/gCJecBAEDDSnyI+sAHPhApxjhk\nuNEdzz//vD399NM2duxY6+josKVLl9r69euzO1IAAIAKCSpx8I1vfMP+7d/+zVatWmX/8A//YDNm\nzLDDhw/b6tWr3ToLFiyw3t7eYd9//vz5sKP9P1m3cD300EMufvnll2PXW7BggYuT0jM6ZNdv4s2T\nTjSMcvnXuFZobhQLFy508YsvvljikSBv+/bti31Ny3cklS4YO3asi7VkQj2XVtHSBX5JB51k2U9t\nonGMuGP5n//5n9v+/ftty5Yt1traan/5l38Zu24VZrgHAADIw4hbopqbm138+c9/3j72sY+ZmVlb\nW5sdOnTIvdbT02NtbW0ZHCIAAECxnn322VuuM+KHqL6+PjfR4n/913/ZPffcY2ZmH//4x+1Tn/qU\nPfPMM9bb22u7d++2d7/73SPdfCH8ptW4FN7UqVMjyz09PcOuN2PGjMgyk0Bi9+7dZR9CLrQS++TJ\nk13sjwwltdxYkrpQaDpP01vTp0+PXU/T3foesxujt82iVeJDKq3nQUcWaorSH22ukw4zcro++Nmz\noYeor33ta7HvSXyIevrpp23t2rV27Ngxa29vt6997Wv20ksv2ZYtW6ypqckWL15s/+///T8zM1ux\nYoU99dRTtmLFChszZox985vfJJ0HAAAaVuJD1Pe///2b/u1zn/tc7Ppf+cpX7Ctf+UrtRwUAAFBx\nVCwHAAAIEFTioEpCyglcuHAh1Xrve9/7Iss///nPh12PPlDVon11zp07V8oxDAwMlLLfvM2bN8/F\n+/fvd7HOWG9Gn6jRRPuYat8f7TtkFu0/tGzZMhf7fUq1L9HBgwddXJWq+Pq5tFp7UuV1/Ux+X1sq\nmFdHSL87WqIAAAAC8BAFAAAQoO7TeTqpZRbuv/9+F7/00kuZbhvFKCuFV0/8atJpU+E7duxw8alT\np2K3h9FD01M6S4VfpV/TVlruwE/naSq4iqUBNG2npR/8Ug36Wtzky6h/tEQBAAAE4CEKAAAgQN2n\n82qdzNi3ZcuWTLcHVIWmFNKOnktbjV8nlMXooteIFlg+fvx4ZD1d1lTXihUrIuvpteRff1WgqWut\nyu5XLNdj11SmP2MGo7vrGy1RAAAAAXiIAgAACMBDFAAAQIBSOjIM9c1ImhkcQLYWLlzo4u7u7lTv\n0T4fZvH9Nzo6OiLLW7duHdGx+dra2iLLOnQe1aKVyLW/z7hx4yLraT+8np4eF8+ZMyeynvYl0m34\n5Q6qUBVf+zr5pQu0+rXOojBr1qzIeidOnHBx2lIjqA5aogAAAALwEAUAABCglHTe0KSNZ8+eLWP3\nwKh0+vTpVOstWrTIxUklRDRFoROxZoH0Xf3QCd21erk/m0RcCtlPEc+dO9fFmk5ub2+PrLdnz54R\n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\n", "text": [ - "" + "" ] } ], @@ -372,9 +372,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "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\n/nh9y5cvl9SsJqmD1Dd4XcS4LFq0SFKzeo0yVCaNZ2VFRMoG3mVUt8iPj3KCV4OXw/Ny/l7rbfJ5\n4ijaZjItFGrjBbw9Ue6IsQLsn9dSFWtA2aNdPauyVvHj+6gXHKcUF9M1zgW1ZyHWj4JhY5uwETx0\n4sC8DlPkkWML3oee8VhSGlAGSvs0Mk/T9/QNMUQeH0lGMHi8H3MN9901Fok5me9jk6W5bNKMOt7W\n7dP71+eotooUx0ORquWuu+6SFGct0p8lSnNPCd9DkKdPjMeu/ZOKVJIkSZIkSUcWdNYe3tfmzZsl\nSbfeequk0dcZ4nk+ypfvVbbQQMlpm3lQ61X4c33ag+fjXj0Xr7U2XgMFEC91oSp/feHeF/8ntgyv\nETWgrReGtxVVR671ulA9iFXkeni/78yzhaxEQV+KlFd0riVSExlrUQxJFItVW0Ebj53jcB0oYRyX\n64iukxgp5qyusWYeV+ixZwuVcds4/UD7eKxQW7h++q32ONhH9CSK35hRx8cy12InPKUZtj5bKlJJ\nkiRJkiQdWdCKFDETrBp53o43M+rYJbw1Yk54/t9XNdS+aLsvE+DVtY0n8HpR0R5stUoe2VnLli2T\ntO3U2HFqqxa7EoiXRsYKdu0KUK3XRNwIypPXXqnNHOL8nJfjbqv90wfDquEoUihRrkx19Yy5LuZG\nPG5iQlasWCGpySwt1ToDvs/3GPv83+eeSHFgLmDuJH6SOj5t4bfBd3XoOheOi3FfH2OVOcT7x2Pc\nSkQ1BIdlXPXD+M3iN+/222+XNHy/pCKVJEmSJEnSkQWtSJG95V4LHv2oMzNYdaOILZR9oJyuz5VL\nz+vxIj0TB6/Z4ztQpugvvJwvf/nLWz0P+3etXr265rIXLLUxYa5o4o3hXaOwYue1cSR4+WSbRrFV\n9E9tBfW+qhI/Ehi27hGKFPFwePi1FadLqjgZlmSvYUOct+0+pXwPxYdXxjY2Fs0lzAnMJWSeEn/q\nVffbQvstdCVqXHhlc37DsC+PoUMRrVWZfS/LYffaGzfEEXMfXXeRcFKRSpIkSZIk6ciCVqTAs9Ha\n7AbfBwtViQL3UslkGfa5M96reyvr1q2TJO21116SGmUQpWO33XaT1CgpVNq+8847B46Dt/ubv/mb\nkqS1a9cOHG9bo+t+TXjreNUofsRK0Y5R5hXQnihH999//8D3oW1lc7+uEvT/IxEqdne1UVR2Yplo\n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\nqalxPs4kbNmyRdu2bdOmTZt0yy23aPPmzX1/n5qacltNiFLdu11Gz3ve8x7t2rVL27dv12GHHaYN\nGzakn3V7jIaXX35ZF154oW666Sa98Y1v7Pubx8h4efnll3XRRRfppptu0kEHHeTxMQtjXUgdccQR\n2r1798z/d+/e3beCNePhsMMOk/TqYdEXXHCBtm7dqkMOOUTf/va3JUl79uyZOaDZjJ6s7uN4eeGF\nF3TEEUdMpIyvJ9785jfPfFlfddVVM9sTbo/x8IMf/EAXXnihLrvsMp1//vmSPEYmBW1x6aWXzrSF\nx8e+jHUhddJJJ+mZZ57R888/r1deeUWf+9zndN55542zCK97/vu//1vf+973JEn/9V//pXvuuUcr\nVqzQeeedp9tvv12SdPvtt88MGjN6sro/77zz9Nd//dd65ZVXtGvXLj3zzDMzUZZmdOzZs2fm33fe\needMRJ/bY/T0ej1deeWVOu644/T+979/5vceI+MnawuPj1kYt3f7XXfd1Vu2bFlv8eLFveuuu27c\nj3/d881vfrO3atWq3qpVq3rLly+faYPvfve7vbe//e29pUuX9tavX9/793//9wmX9LXJxRdf3Dvs\nsMN6CxYs6C1cuLB32223zVn3H/nIR3qLFy/uHX300b277757giV/bRLb41Of+lTvsssu661YsaK3\ncuXK3rve9a7et7/97ZnPuz1Gy+bNm3tTU1O9VatW9VavXt1bvXp1b9OmTR4jE2C2trjrrrs8PmbB\nR8QYY4wxxnTEmc2NMcYYYzrihZQxxhhjTEe8kDLGGGOM6YgXUsYYY4wxHfFCyhhjjDGmI15IGWOM\nMcZ0xAspY4wxxpiOeCFljDHGGNOR/wM+hTPIf67+9QAAAABJRU5ErkJggg==\n", + "png": "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\nifbAG46ULhTQWvC2a/eZm6tqoMxwre75YnN4nr73GX2I8uDZS33jNUtKFIxrTuP+du7cKal/xjN9\n7bEmXn+LuYXr94xZstLoB2y4tQ5ThCtvtWDjKDl+PHDFL6pIXwI7YEzxVoB2JT7U3xbwVoEMY+JR\nmWtQjaMsOt8zsTV+NSJSiyN7p7+jfm9tV+agW2+9VVJ5rj/++OMldXaI/fozulUpTUUqSZIkSZKk\nJ8t+Oq5Nf1pOumyZZmZmFvu0SZIkSZIkzczMzIRZq6lIJUmSJEmS9GRqMVJ7UqR4T+w1YCJ4L+yx\nR5zDz8V71db36RG8777gggskSZ/4xCck1cdFlOB9LrFSvL8/55xzJEnvfe97JdXHG6xfv16SdO+9\n90qa/16ZulG8pyeegXYke4z4C+IiduzYIUl6+ctfLknasGGDJOmVr3zlyHXTv2RzsY8Sx+V8tKf3\nHxXQiX/xGKojjzxSUvfee+vWrQu2AzVCeC9/1llnSZI++MEPSipndvF57pusRWLEjjnmGEldLBXx\nNcQnRPY5KTjPxRdfLKmLAyK+Ajsr3bfvfbnvvvtK6uJiuM83vvGNkqS/+Iu/GPk87U1G3IoVKyR1\n49erepMBFFV95rxvf/vbZ8/lmZJ9Y1oivO+8fhXnX7dunaQuFosxg2fLmCamiTbiJ8f7vd/7vZHv\ng9fVwaaZ26iq7/s+EvdH7BJtfu6550rqKmRP2jaZC8477zxJ0t///d9Lmh+Xh216Zim2QPYVsVrM\nEdwXY5B4zAsvvFDS5O+P633zm98sSXr/+98vqbNDj7kjs5pn2k033TTyf9oliodlTnzLW94iafj9\nlfbEw35f9apXSZI+/elPS+rmYOyM2ET2qyVW65nPfKakLkaMmCvGE3MUP8nOO/PMMyUt/twZkYpU\nkiRJkiRJT5Zk1h41JaKdyt0rac2Cw4MelyLldX3GlYkCKEYoNu6Ftp7v9ttv3+P/adcoO+yGG26Q\nFNfb+shHPiKpqx3iXhNK41133SWp83pWrVolaX4dqQiUDBQezx6L6nlxPqoLu0pRW2X3iiuukNQp\nT4CXyXH4HW9x2vuSeS0c7LdUK+hFL3qRJOnzn//8yN89I8yzSr2+mdeewb7JZnRF6oQTTpDU2Y0r\nUnPvxxUhmPRuAxzfz0Nfu9IEXqvtG9/4xsj/vS0/97nPjemKFwYlpDZjcii+zyW2RDYaY5yK8P55\n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\n", "text": [ - "" + "" ] } ], @@ -400,9 +400,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "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\nfnMq53NaFbalttdaRchBqSKDvC/Mz6ifuBcyP0pKFPe8WmV60SecXXbZZesGrM9//vO1995766mn\nntJ3vvMdvelNb5IkvelNb9K3vvUtSb82rpNOOkk77bSTVq5cqdWrVzd3TJIkSZIkyXKn2lV97LHH\ndMcdd+glL3mJnn766a1e4s4777zVO/n5z3++NeNM+rWyUMpCqeH444+XJB1xxBGSYkWqllIMVO1T\nPPEDpZiZEpyvpERFEHPFzvGMh9eRKuExZnih7vUSy4Z3WooX6PuePvJ2++651wr9gPLk2Zb8rPUS\no33cYNqbC7TuBemwx10JlEzwLNO+kIlF9qgreNvai/elz2W+y/+/5CUvkdRdG3+PlJux+rIV3zvQ\n8QzkoXul0R+sBZ5hDX0VO1TaKC4Wm2EOljKdSzDnqF/UF9ZSMpuJeVsqRWpHATtpvSeydvSNUfS3\nMtwrsF/estTGRPVVNquy9n75y1/qta99rS699NKtRfFgbm5uUTmvVepLkiRJkiSZNddee+2ify8q\nUv/zP/+j1772tXrjG9+oE044QdKvVah///d/1y677KJf/OIXW2NyVqxYMeEBPfnkk1U1bLzWi3sf\nxDmgbkVZYF7hfOtFDoxv4LjUa0LR4qGyVHNjbCUlejh1Jadv9iHeH0/txAD59fH/pYdkr59VS9Sf\nYytRqKrufeAtu3rh7aptDyqJ7ywP/H/kdQ/NxCrFKLZSO76RilGLx0S5KrRtv3kfRfGJjOnmzZsl\n1dvo2PWI+sJ6OlYWYAnGmP6K1pSha2t03rGy74aqvjfeeKOkLkvthhtuGNymFsZ6C+Lss88+krp7\nHLUAS/cQV/iGKlLr16+XJN18881N348yo4G1F4WRe2ZpLT/66KN1/fXXh39fdIV95pln9La3vU0b\nNmzYumWAJL3mNa/RFVdcIUm64oortj5gveY1r9HXv/51/epXv9Kjjz6qBx98UIcccsiiDUySJEmS\nJNlRWVSRuvHGG/WVr3xF++2339b6DhdccIFOP/10nXjiifrCF76glStX6hvf+IakX78/PvHEE7Vh\nwwY95znP0WWXXVb1aq+U1fXDH/5QkrTnnntK6qra3n///ROf4/2qV3ElAr+2wrLDU67v1wQlj7uv\nkoJCwXnc24uO58pdqxdGzBVP7a7wET9SygCiv1Du+u6rVAuKC3WGUNRK7cPb9f7kevH+yHosqRZc\n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\najtMAAAAAElFTkSuQmCC\n", + "png": "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\nvr3lllskzc168rWAPqfN9BXqF1lokQrGWPN9zsdYczxsiTWBSsqsRYwV30eZ8L4cq0L4pMFmmfuR\n8uFjXFI0+saatYKd8LNVffaYnigO0eEewFrrGdjEf7JGcDzfp3ShGTsrkOuOlKgoltCzXbFH5iMx\nUvRnpLLT/yVSkUqSJEmSJGlkyTNTKCixZMkSzczMLPRpkyRJkiRJejMzMxMqbalIJUmSJEmSNDK1\nGKmPf/zjE88iQ/Xqq361Zo5wns9//vOSpN13311SFw9xzz33SJJ+/vOfS+re6+69996zficmjPfr\nZBIRe3T//fdLkl7/+tfPOu+k4TznnXeepK5ydimWq7Y/iX8gjuDtb3/7rPNOGrcX4laIO/AYpZ12\n2kmS9NBDD0nqrp8YJ7wXst74yThznosvvnjW8YmD4Xdin4ibieIrqE1D3AkxS8QLvO1tb5t13knj\n/UlcArFjVE5nHcDeuQ7iF7zGDvOJ8aFfjz76aF100UWSujGgL8j8ow85V1SdntgIzkHMCm0+7bTT\nZl0btss1MnbRWGHjxC9yfjKKOS/tP/744yVJn/vc52b1AbZCVhx73QHHIZbEM4WpOE57iGs8+uij\nZ12fQ+atxzkydtT64/9R1h5z65RTTpEkffGLX5TUxY3S7h/96Eeb/D7jQj945XBqkrFW8X/Wlksv\nvVTS3LnHeGBHDz/8sKQu1oY5RfsYN85DPzN36c+1a9dKimN/1qxZI6mzU89spj2MU5QRy7idc845\ns9rtRBnlEXye/sG+fD5MGs5zySWXSOrmmfcn9k173Q6JNeN7xClH54tIRSpJkiRJkqSRqSlS8+0h\nteeee0qS7rjjjk3+/9BDD5XUeYcoPTA0Ow0vyRUUvCQycHga96dgvNk99thDUudFkBngNT3IMnMv\nBe+WekyrV6+WNNfrXGjw4vFi8coi77tW2RurUvhYMA5RthzKoBP1Q2TzeLHYAf2FV//Sl75UknTj\njTdu8vivfe1rJXVKJzVoUKTYK68vkX33BfugH5mfnl2J4kpGHZ+nP/DS+R7H3XhPQZQBV5o8Oyyq\nVM5c9UxXbD2yTdqCohHtIsDxSvVpUHw8C8vr6eBBR550aexQU10BKuFKFLALBf140003zXsc3w+S\nvc8OPPBASd043nrrrZLmKjCMn++7yjhh+zvuuKOkrgYh+Pe8H6PrpF2s2axdnk3oa0epUjZzN9pH\n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\n/vz5euGFF6q45UnNaPXR39+vnp4eLV++XMuXL9fOnTvr37k+2suxY8d04403atGiRVq8eLEef/xx\nSe4jVRCrC/ePUcg6yH//+99s9uzZ2dDQUHb+/Pmsr68vGxwc7OQtmCzLent7s9OnTw/77MEHH8we\ne+yxLMuy7Pvf/372jW98o4pbm/S8/PLL2f79+7PFixfXP4uV/euvv5719fVl58+fz4aGhrLZs2dn\n//vf/yq578nKaPXR39+f/fCHPxxxrOuj/Zw8eTI7cOBAlmVZdvbs2WzevHnZ4OCg+0gFxOrC/WMk\nHVWkBgYGNGfOHPX29mrKlCm67bbbtGPHjk7egvl/siDG4He/+502bdokSdq0aZN++9vfVnFbk57r\nr79eV1555bDPYmW/Y8cO3X777ZoyZYp6e3s1Z84cDQwMdPyeJzOj1Yc0sn9Iro9OMH36dC1btkyS\n1NXVpQULFujEiRPuIxUQqwvJ/SOkoxOpEydO6Jprrqn/v6enp14xpnPUajWtWbNGK1eu1C9+8QtJ\nF7aJ6e7uliR1d3fr1KlTVd7iJUWs7N966y319PTUj3N/6Rzbtm1TX1+fNm/eXF9Gcn10lqNHj+rA\ngQP69Kc/7T5SMdTF6tWrJbl/hHR0IlWr1Tp5ORNhz549OnDggHbu3Kmf/OQneuWVV4Z9X6vVXFcV\nkSp710v7ueeeezQ0NKSDBw9qxowZeuCBB6LHuj7aw7lz57R+/Xpt3bpVH/nIR4Z95z7SWc6dO6cN\nGzZo69at6urqcv8YhY5OpGbOnKljx47V/3/s2LFhM1jTGWbMmCHpwqbPX/jCFzQwMKDu7m69/fbb\nkqSTJ09q2rRpVd7iJUWs7MP+cvz48REbZJvWM23atPrL+q677qovT7g+OsMHH3yg9evX64477tCt\nt94qyX2kKqiLjRs31uvC/WMkHZ1IrVy5Um+88YaOHj2q8+fP69lnn9W6des6eQuXPP/5z3909uxZ\nSdK///1vvfDCC1qyZInWrVun7du3S5K2b99e7zSm/cTKft26dfr1r3+t8+fPa2hoSG+88UY9ytK0\nj5MnT9b//Zvf/KYe0ef6aD9Zlmnz5s1auHCh7rvvvvrn7iOdJ1YX7h+j0Gnv9ueffz6bN29eNnv2\n7OyRRx7p9OUveY4cOZL19fVlfX192aJFi+p1cPr06eymm27K5s6dm61duzZ77733Kr7Tycltt92W\nzZgxI5syZUrW09OTPfXUU2OW/cMPP5zNnj07u+6667Jdu+tes7EAAACgSURBVHZVeOeTk7A+nnzy\nyeyOO+7IlixZki1dujS75ZZbsrfffrt+vOujvbzyyitZrVbL+vr6smXLlmXLli3Ldu7c6T5SAaPV\nxfPPP+/+MQreIsYYY4wxpiTObG6MMcYYUxJPpIwxxhhjSuKJlDHGGGNMSTyRMsYYY4wpiSdSxhhj\njDEl8UTKGGOMMaYknkgZY4wxxpTEEyljjDHGmJL8HyFOTlbukMv2AAAAAElFTkSuQmCC\n", "text": [ - "" + "" ] } ], @@ -428,9 +428,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "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\n6Ycxn16m03hnMpm8Sf1EpAAAADzFEpFat26dLl68GHWzAAAAk7Z27VpduHAh9O9imUgBAABU9FKE\niAAABA9JREFUA5b2AAAAPDGRAgAA8BTLROrs2bNqaWlRU1OTjh49GkcXUGKNjY1as2aN2tvb9eWX\nX0qSnj59qk2bNqm5uVmbN2/W8+fPY+4lpmLPnj1KJpNqbW0Nzn1qjH/44Qc1NTWppaVFPT09cXQZ\nUxA23plMRg0NDWpvb1d7e7u6u7uDv2O8K9vg4KDWr1+vVatWafXq1Tp+/LgkrvFQJmL//fefSaVS\nZmBgwGSzWZNOp82NGzei7gZKrLGx0YyOjuac6+rqMkePHjXGGPPjjz+a77//Po6uoUguXbpk/vnn\nH7N69ergXL4xvn79ukmn0yabzZqBgQGTSqXM27dvY+k3/ISNdyaTMT/99NNHr2W8K9/w8LDp6+sz\nxhgzNjZmmpubzY0bN7jGQ0Qekert7dXy5cvV2Niompoa7dixQ6dPn466G4iA+eA5hr///lu7d++W\nJO3evVt//fVXHN1CkXzzzTeaN29ezrl8Y3z69Gnt3LlTNTU1amxs1PLly9Xb2xt5n+EvbLyl8A1z\nGe/KV1tbq7a2NknvthVauXKlhoaGuMZDRD6RGhoa0pIlS4I/NzQ0aGhoKOpuoMQSiYQ2btyojo4O\n/frrr5Le7Z+WTCYlSclkMthPDdUj3xg/ePBADQ0Nweu47qvHiRMnlE6ntXfv3mCZh/GuLvfu3VNf\nX5+++uorrvEQkU+kEolE1E0iBleuXFFfX5+6u7v1yy+/6PLlyzl/n0gk+FmochONMeNf+fbv36+B\ngQH9+++/qqur03fffZf3tYx3ZRofH9f27dv1888/B5skW1zj70Q+kaqvr9fg4GDw58HBwZxZLKpD\nXV2dJGnhwoXatm2bent7lUwmgx3Wh4eHgx3iUT3yjfGH1/39+/dVX18fSx9RPIsWLQp+me7bty9Y\nymG8q8ObN2+0fft27dq1S1u3bpXENR4m8olUR0eH+vv7de/ePWWzWf3xxx/q7OyMuhsooVevXmls\nbEyS9PLlS/X09Ki1tVWdnZ06deqUJOnUqVPBhYnqkW+MOzs79fvvvyubzWpgYED9/f3B05yoXMPD\nw8Hxn3/+GTzRx3hXPmOM9u7dqy+++EIHDx4MznONh4gjw/3MmTOmubnZpFIpc+TIkTi6gBK6e/eu\nSafTJp1Om1WrVgVjPDo6ajZs2GCamprMpk2bzLNnz2LuKaZix44dpq6uztTU1JiGhgZz8uTJT47x\n4cOHTSqVMitWrDBnz56Nsefw8eF4//bbb2bXrl2mtbXVrFmzxmzZssWMjIwEr2e8K9vly5dNIpEw\n6XTatLW1mba2NtPd3c01HoItYgAAADxR2RwAAMATEykAAABPTKQAAAA8MZECAADwxEQKAADAExMp\nAAAAT0ykAAAAPDGRAgAA8PQ/lmdbw7Uf8/AAAAAASUVORK5CYII=\n", + "png": "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\nCyXVb4j7xBNPZD6HVvn+Sr3QJ2l8fPy8Y58ets1puz30XQR7f/i0qaXhLe2N7mfdt/M4J/eagYGB\ncGyLrvyYdTv36b6nn35aUnft4EBECgAAIFJhEakL3R2UMQrlTU5OnndcVJTl0UcfDceLFi2SVOvo\nLqWzzDTt360XolCeb31hCxF+/vOfhzFrl2H/RXv86z8p4k0kqnX+ObVjf/5uJ7Jg5xd/XrBIov+5\n1s4mpq2NXwyEdB07diwc/+IXv5Ak9ff3hzGLUnX7XqJEpAAAACJxIQUAABCpcq6AXEulUlG1Ws37\nYQEAAFpWrVYvWJpCRAoAACBSYVV4RUak/GMXHRnLci5WZOm7axc1l1a1M5e0W2h0y/OStjLOpdl5\nXHnlleHY3h979uw57/v83pr2Wmr0fmp1LllKmou1cMmy6NeKyK2ztST9/d///XlzmU2z72NrbyDV\nfqdGiwrK/jcqis1hx44dYayothFlfF4uhIgUAABAJC6kAAAAItFgo0krVqyQVN83o4x8Z3MrjMtj\nA+UsJfWaSdJqvxjfHyemPw06l0852Ubf/n1i7/OtW7eGMUtx7N69O48pZiaPPj72XvW7PrTKb8A+\nNjZ2we/bsmVLOLa/4fDwcPTjlp3tYiFJZ86cyeQxmk3n+T6D9p5q52/eqYhIAQAARCIi1aRO6Yjs\nu5lbV9lOj0g126Gj2aJ6i1z5uynkw/bemp6eLnQev/71r2f9ut1dWzd6KZ/9EK243e/HaNGxbuwI\nPZtGOzNYZMbvOZrGbg5ll1UUKobfe9ayNn5+nf7Z0ywiUgAAAJG4kAIAAIhEaq9Jp0+fLnoKLTt6\n9Gjmj2HpMV/waamI8fHxzB8/RrMpwDSsXLkyHM/MzOT2uJ6l03wBqR3nnS76wz/8Q0nSc889F8Z+\n9atfSaptvC1JV199tSTpN7/5TRjLs4jVUvnPPPNMbo8p1X7Hdn5Xv4giiaUNfdqyTOyc0qgHnKWQ\n/EbynZLa8z2yOpn/G9n5ftWqVWEsj55lZUBECgAAIBIRqS6Wx5L+q666SpL0yU9+MozZHeL27dvD\nWBodxjtRUVEoXwS6dOlSSfULJuwOcdmyZWHM7pKznLO9DtavXx/GLCLlX6+ttrIouzzvzBstzrCI\nQZYRKSsAP3XqVMv/1ubf7GKQvXv3tvwYRevm8+HU1FTRU9Db3vY2SfVd7y1ilrSDQbuISAEAAETi\n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\n", "text": [ - "" + "" ] } ], @@ -456,9 +456,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "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\n", + "png": "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\nSF9ciQIAAHBAEQUAAOCAIgoAAMABRRQAAICDWDSWL1pk1nJZWVlGbGpqKox0gLQUZBJ5ENr0Zq2h\ndqLs8QcAAAYuSURBVHJy0mp92k0CPT09H/g6rdnX9jMjyGs19fX1Rmx2dtaInTlzxmp92jR67ekA\nmoKCAiOmTf8OQrtpIAjtaQO254+t2tpaI2Z7PGz3X2Vl5bxy+iBFRUVGTNsvfFeGhytRAAAADiii\nAAAAHFBEAQAAOKCIAgAAcJBIJpPJUDeYSEjImwQAAHByqbol0itRra2tUW4eF+F4xAfHIl44HvHC\n8YiPhX4sKKJwHscjPjgW8cLxiBeOR3ws9GNBTxQAAIADiigAAAAHoTeWb968Wfbt2xfmJgEAAJzc\neOONc/7ZMvQiCgAAIBPw5zwAAAAHFFEAAAAOKKIAAAAcRFJE7dmzR5qammTVqlXyxBNPRJHCgtbe\n3i433XSTrF27VtatWyff/OY3RUSkt7dXWlpaZPXq1bJ161bp7++PONOFY2ZmRjZs2CB33HGHiHAs\notTf3y933323XHHFFdLc3CyvvfYaxyNCO3bskLVr18qVV14pn/3sZ2ViYoLjEaL77rtP6urq5Mor\nrzwfu9T+37Fjh6xatUqamprk5ZdfjiLlUIVeRM3MzMif//mfy549e+TQoUPyzDPPyOHDh8NOY0HL\nycmRr3/96/LOO+/Iq6++Kv/0T/8khw8flp07d0pLS4scPXpUtmzZIjt37ow61QXjySeflObmZkkk\nEiIiHIsIfelLX5LbbrtNDh8+LAcPHpSmpiaOR0Ta2trkn//5n+XNN9+U3/zmNzIzMyPPPvssxyNE\n9957r+zZs+eC2Fz7/9ChQ/Lcc8/JoUOHZM+ePfLAAw/I7OxsFGmHJxmy/fv3J2+55ZbzP+/YsSO5\nY8eOsNPA7/n4xz+e/NGPfpRcs2ZNsqurK5lMJpOdnZ3JNWvWRJzZwtDe3p7csmVL8ic/+Uny9ttv\nTyaTSY5FRPr7+5OXX365Eed4RKOnpye5evXqZG9vb3Jqaip5++23J19++WWOR8hOnDiRXLdu3fmf\n59r/X/3qV5M7d+48v9wtt9yS/MUvfhFusiEL/UpUR0eHLFu27PzPDQ0N0tHREXYa+D9tbW3yq1/9\nSj784Q9Ld3e31NXViYhIXV2ddHd3R5zdwvDQQw/J1772NVm06P+/HTkW0Thx4oTU1NTIvffeKxs3\nbpQvfvGLMjIywvGISGVlpXz5y1+W5cuXy5IlS6S8vFxaWlo4HhGba/+fPn1aGhoazi+3EL7fQy+i\nfvfnCkRveHhY7rrrLnnyySelpKTkgv+WSCQ4ViF46aWXpLa2VjZs2DDnU8I5FuGZnp6WN998Ux54\n4AF58803paioyPhTEccjPO+995584xvfkLa2Njl9+rQMDw/L9773vQuW4XhE64P2f6Yfm9CLqKVL\nl0p7e/v5n9vb2y+oXBGOqakpueuuu+Tzn/+83HnnnSLyv/+i6OrqEhGRzs5Oqa2tjTLFBWH//v2y\ne/duufzyy+Uzn/mM/OQnP5HPf/7zHIuINDQ0SENDg1x77bUiInL33XfLm2++KfX19RyPCBw4cEBu\nuOEGqaqqkuzsbPnkJz8pv/jFLzgeEZvr8+ni7/dTp07J0qVLI8kxLKEXUZs2bZJjx45JW1ubTE5O\nynPPPSfbtm0LO40FLZlMyv333y/Nzc3y4IMPno9v27ZNdu3aJSIiu3btOl9cIXW++tWvSnt7u5w4\ncUKeffZZufnmm+W73/0uxyIi9fX1smzZMjl69KiIiOzdu1fWrl0rd9xxB8cjAk1NTfLqq6/K2NiY\nJJNJ2bt3rzQ3N3M8IjbX59O2bdvk2WeflcnJSTlx4oQcO3ZMrrvuuihTTb0oGrF+8IMfJFevXp1c\nsWJF8qtf/WoUKSxoP//5z5OJRCJ59dVXJ9evX59cv3598oc//GGyp6cnuWXLluSqVauSLS0tyb6+\nvqhTXVBaW1uTd9xxRzKZTHIsIvTWW28lN23alLzqqquSn/jEJ5L9/f0cjwg98cQTyebm5uS6deuS\nX/jCF5KTk5McjxB9+tOfTi5evDiZk5OTbGhoSP7Lv/zLJff/V77yleSKFSuSa9asSe7ZsyfCzMPB\ns/MAAAAcMLEcAADAAUUUAACAA4ooAAAABxRRAAAADiiiAAAAHFBEAQAAOKCIAgAAcPD/ADWWZox7\nIqDoAAAAAElFTkSuQmCC\n", "text": [ - "" + "" ] } ], @@ -489,9 +489,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "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\nnULet3dR/+VOZHt7hh08eNAbO3ast2nTJm///v3elClTvOeff950NakaM2aMt2PHjj6fffnLX/au\nvcezGPcAABuTSURBVPZaz/M8r7m52bvqqqs8z/O85557zpsyZYq3f/9+b9OmTd7YsWO97u7uxGOO\n4pe//KX31FNPeZMmTTr0WZjl7Onp8TzP8/70T//Ue/zxxz3P87yPfOQj3j333JPwkoTjt9wLFizw\nvv/97w+YNk/L3dra6q1du9bzPM/btWuXN378eO/555/P/TYvt9y1sM13797teZ7nHThwwJs2bZr3\n8MMP5357e57/ctfC9vY8z/v+97/vXXzxxd6sWbM8z6uNY7rnDVzuJLa38StYtgYgdY3X787q0qVL\n1dTUJElqamrSkiVLJEl33XWX5syZo8GDB2vMmDE64YQTtGbNmsTjjeLMM8/UsGHD+nwWZjkff/xx\ntba2ateuXYeu9H3qU586NI+r/JZbGrjNpXwt98iRIzV16lRJ0lFHHaWTTz5Z27Zty/02L7fcUv63\n+Tvf+U5J0v79+9Xd3a1hw4blfntL/sst5X97b926VcuXL9dll112aFlrYXv7Lbfneda3t/EEy28A\n0uLBKi8KhYLOOussnXrqqYfGAWtvb1ddXZ0kqa6uTu2/GzH0tdde6zN8RdbXR9jl7P/5sccem9nl\nv+GGGzRlyhTNmzfv0GX0vC735s2btXbtWk2bNq2mtnlxuU8//XRJ+d/mPT09mjp1qurq6g7dJq2F\n7e233FL+t/fnP/95ffe739URRxw+9dfC9vZb7kKhYH17G0+wCjUwlOvq1au1du1a3XPPPbrpppv0\n8MMP9/m+UChUXA95WUfVljNPPv3pT2vTpk1at26dRo0apS9+8Ytph2RNV1eXZs+ereuvv15D+r1V\nPc/bvKurSx//+Md1/fXX66ijjqqJbX7EEUdo3bp12rp1q375y19q1apVfb7P6/buv9wtLS25397L\nli3TiBEjVF9f73vlRsrn9i633Elsb+MJVpABSLNu1KhRkqT3vOc9Ov/887VmzRrV1dWpra1NktTa\n2qoRI0ZIGrg+tm7dqmOPPTb5oA0Js5yjR4/Wscceq61bt/b5PIvLP2LEiEMHn8suu+zQbd68LfeB\nAwc0e/ZszZ07V+edd56k2tjmxeX+y7/8y0PLXSvbXJLe9a536ZxzztGTTz5ZE9u7qLjcTzzxRO63\n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\nFO7/RF8068UAAAAASUVORK5CYII=\n", + "png": "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\nOvLII3XBBRf0f37yySdr/vz5uvTSSzV//vz+wGuweZKkK66Qvve9wX91vX/bb2JQm1zdDyVZeALJ\nlX1osxzX87ezAAAgAElEQVQ339w3WPXcc+3lEUati2/5fvjRj6QdO6Tm5r7fd+yone7ZZ9fP2+/m\nWf7zJZfUTyOItOpuGvmWzvMvfEG66KJg64QRNGhM81zu6Ukn3zAD/SdMkN73Puk//7N2mq5cE13U\n0tKilrLWhSuvvNJY2nW7CJctW6a77rpLDz74oJqbm9Xc3KzFixfrsssu0wMPPKCJEydq6dKluuyy\nyyIVIO6BNzHYsdZyzc3pV84stKZloYzlkhrkbmu/XHKJVH7KLV0afN1qYzxqLVtvPwVtwbrwwuo3\nbJNsnrNJXg/++7/7/iWttI0HHjjwd9PpB/28ks3rzbJlfcHV44/bzXPIEOlf/mXw52H2zYsv9r2C\nCW6q24J13HHHqbfKgIYlS5YYK0jUypt28JOELGxjvS4Zk4PcX3ml9t+THphba7mkjt2jjwYfg2Vj\n/0TtIjQpzuuaqqWTtMpyf+5z9ZcJK8pTpLa5dI077jjpF7+Q3nqGy4jvflc66yzpXe/a91lPj/TE\nE8HTiBOUZu0LcF4EGoOVBFdP5KRP/PITIU8nhcn9WBp0akKYffzFL5rLN6qlS6XOTv9B3GmOwQrL\nxnllKrB16WafFr9uqkJBKhbDtZaaFnUsVdj1THcPfvObffvviisG/+211/qeFB092myeSF/q7yJM\nYv6lri7p5JMHliPoIPekmsbjLot90v5GZ/O4zZkjnXnmvhcbR8krrXr17W9X/5uJYQ+2AyyT++36\n6/2f3K0XDJsQJ80rrpC+8x1zZaknT18yq5k1SxozZt/vYSdbzdvkz3nizLsIbXYRrlwZfiLEtOYe\nSXqOnbBsTAXgUpeMSbfcEn36AhuqPTlpay6tys/++MfqX3AivghiQD6mugiD5hdn3a1bw3UPJSXK\n+DwT+UTJP6jly+OnYVNnZ7DlbN+LXLrP5EXqAVbSgUzakXyUSpx2mcNKqrzjxknr1g3+PKlvdH/6\nU+3A4qKLpD//OX4+Ut+4s02bBn+e1pNOcQVpqYnzUtqsnTMlSbRgRZHV/Vli60uEDUm0oCIZqQdY\ncWVhlvOoablycS0X9eS3sS0vvij94Q/hy1IuTrkmTZIefDD6+mHMmCGNHTv481tuCZ9Wtf3j99qV\n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\nipZKMphbLVjFQEvNmRM2XX9hugjjXPTrz29XHPSJX4C1cWP0MqSlXoC1bFmwdLLeRThQsWbeWQww\ngp3wnLAAAB85SURBVAZYQbaNLsLqIgdYK1eu1OGHH65x48Zp6NChOv3003XPPfeYLJtVJiqFjYoV\n9GSNmnfcACuKMF2ELgRYaTI9TUNSkihXUi1YUR668AuwsnjjcamL0Oa5ELe+ZvHYlgtafptPLTeC\nyE8Rbtq0SYceemj/72PHjtWKFSuMFMqUWt1Ntbq6qj3CW/l5tTRqBQn1+t4rB69XWz5IH/7OnYM/\nCzrT9LZt0l//dd/P9Z7mqade7/H27ft+7u4euJ/j5B31UexSnrt27Uvj9df9l6lUvi3VyuQ30WHp\nuNfb3iA3wPK6EWYflM4Xv3pTz549/nnFfRy+ZPv2fcegsu77nQs7d/bV9aefDl+W8rFTQcdR+b0X\n9PXXzW2/tC+tIOdE0DE+leUrf+I0yIScpWV27hyYlonxZ/Xq4fbt1c/PesqXL6UR5sGh8uPtV84w\n2x/2Gld+XfLj97dt2wZem7ZuDVY3/Zap3E+l3z0v3XFzLip4XrT48+c//7kWL16s2267TZJ01113\nacWKFbr55pv7lzn88MP1QtwZ3QAAABIwfvx4Pf/880bSityCdcghh2jDhg39v2/YsEFjx44dsIyp\nQgIAAGRJ5DFYxxxzjP785z9r/fr12r17t372s5/p5JNPNlk2AACATIrcgjVkyBD94Ac/0Ec/+lH1\n9PTo3HPP1RFHHGGybAAAAJkUeQwWAAAA/FmZyT3NCUiTMG7cOB111FFqbm7W+9//fklSd3e3Wltb\nNXHiRM2aNUtbyh6/uPrqqzVhwgRNmjRJv/71r9MqdmjnnHOOmpqaNHXq1P7PomznE088oalTp2rC\nhAn6apLvg4jIb7vnzZunsWPHqrm5Wc3Nzbrvvvv6/5aX7d6wYYNmzJihyZMna8qUKbrpppsk5f+Y\nV9vuvB/zXbt26dhjj9X06dN15JFH6vK33qmU9+NdbbvzfrxLenp61NzcrJNOOklS/o93SeV2J3K8\nPcP27t3rjR8/3lu3bp23e/dub9q0ad4zzzxjOptUjRs3znv11VcHfHbxxRd711xzjed5ntfe3u5d\neumlnud53tNPP+1NmzbN2717t7du3Tpv/PjxXk9PT+JljuLhhx/2nnzySW/KlCn9n4XZzt7eXs/z\nPO9973uft2LFCs/zPO/jH/+4d9999yW8JeH4bfe8efO86667btCyedrujo4Ob9WqVZ7ned62bdu8\niRMnes8880zuj3m17W6EY75jxw7P8zxvz5493rHHHus98sgjuT/enue/3Y1wvD3P86677jrvs5/9\nrHfSSSd5ntcY13TPG7zdSRxv4y1YWZ+ANCivomd10aJFamtrkyS1tbVp4cKFkqR77rlHZ5xxhoYO\nHapx48bp8MMP18qVKxMvbxTHH3+8RowYMeCzMNu5YsUKdXR0aNu2bf0tfWeddVb/Oq7y225p8DGX\n8rXdo0eP1vTp0yVJBxxwgI444ght2rQp98e82nZL+T/mb3/72yVJu3fvVk9Pj0aMGJH74y35b7eU\n/+O9ceNG3XvvvTrvvPP6t7URjrffdnueZ/14Gw+w/CYgLV2s8qJQKOjEE0/UMccc0z8PWFdXl5qa\nmiRJTU1N6nrrZYEvv/zygOkrsr4/wm5n5eeHHHJIZrf/5ptv1rRp03Tuuef2N6PndbvXr1+vVatW\n6dhjj22oY17a7g984AOS8n/Me3t7NX36dDU1NfV3kzbC8fbbbin/x/vCCy/Utddeq/3223frb4Tj\n7bfdhULB+vE2HmAVGmAq12XLlmnVqlW67777dMstt+iRRx4Z8PdCoVBzP+RlH9Xbzjw5//zztW7d\nOq1evVpjxozR1772tbSLZM327ds1Z84c3XjjjRo2bNiAv+X5mG/fvl2nnnqqbrzxRh1wwAENccz3\n228/rV69Whs3btTDDz+sBx98cMDf83q8K7e7WCzm/nj/6le/0qhRo9Tc3OzbciPl83hX2+4kjrfx\nACvIBKRZN2bMGEnSwQcfrFNOOUUrV65UU1OTOjs7JUkdHR0aNWqUpMH7Y+PGjTrkkEOSL7QhYbZz\n7NixOuSQQ7Sx7K23Wd3+UaNG9V98zjvvvP5u3rxt9549ezRnzhzNnTtXs2fPltQYx7y03Z/73Of6\nt7tRjrkkHXjggfrkJz+pJ554oiGOd0lpu3/3u9/l/ng/9thjWrRokQ477DCdccYZWrp0qebOnZv7\n4+233WeddVYyx9vI6LEye/bs8d797nd769at8958883cDXLfsWOHt3XrVs/zPG/79u3eBz/4Qe/+\n++/3Lr74Yq+9vd3zPM+7+uqrBw0UfPPNN721a9d67373u/sHzGXBunXrBg1yD7ud73//+73ly5d7\nvb29mRkQWbndL7/8cv/P119/vXfGGWd4npev7e7t7fXmzp3rXXDBBQM+z/sxr7bdeT/mmzdv9l57\n7TXP8zxv586d3vHHH+8tWbIk98e72nZ3dHT0L5PH412uWCx6n/rUpzzPy//5Xa58u5M4v40HWJ7n\neffee683ceJEb/z48d5VV11lI4vUrF271ps2bZo3bdo0b/Lkyf3b9+qrr3ozZ870JkyY4LW2tvaf\nwJ7ned/73ve88ePHe+95z3u8xYsXp1X00E4//XRvzJgx3tChQ72xY8d6P/7xjyNt5+9+9ztvypQp\n3vjx470vf/nLaWxKKJXbffvtt3tz5871pk6d6h111FHepz/9aa+zs7N/+bxs9yOPPOIVCgVv2rRp\n3vTp073p06d79913X+6Pud9233vvvbk/5n/4wx+85uZmb9q0ad7UqVO973//+57nRbuW5WG78368\nyxWLxf6n6fJ+vMs9+OCD/dv9uc99zvrxZqJRAAAAw6xMNAoAANDICLAAAAAMI8ACAAAwjAALAADA\nMAIsAAAAwwiwAAAADCPAAgAAMIwACwAAwDACLAAAAMMIsAAAAAwjwAIAADCMAAsAAMAwAiwAAADD\nCLAAAAAMI8ACAAAwjAALAADAMAIsAAAAwwiwAAAADCPAAgAAMIwACwAAwDACLAAAAMMIsAAAAAwj\nwAIAADCMAAsAAMAwAiwAAADDCLAAAAAMI8ACAAAwjAALAADAMAIsAAAAwwiwAAAADCPAAgAAMIwA\nCwAAwDACLAAAAMPqBlgbNmzQjBkzNHnyZE2ZMkU33XSTJGnevHkaO3asmpub1dzcrMWLF1svLAAA\nQBYUPM/zai3Q2dmpzs5OTZ8+Xdu3b9fRRx+thQsXasGCBRo2bJguuuiipMoKAACQCUPqLTB69GiN\nHj1aknTAAQfoiCOO0KZNmyRJdWIzAACAhhRqDNb69eu1atUqfeADH5Ak3XzzzZo2bZrOPfdcbdmy\nxUoBAQAAMscLaNu2bd7RRx/t/eIXv/A8z/O6urq83t5er7e317viiiu8c845Z9A648eP9yTxj3/8\n4x//+Mc//jn/b/z48UHDoroCBVi7d+/2Zs2a5d1www2+f1+3bp03ZcqUwYlrcPJ9G+H5/Asc66GG\nb33rW2kXoeGwz5PHPk8e+zx57PPkmYxF6nYRep6nc889V0ceeaQuuOCC/s87Ojr6f/7FL36hqVOn\n1ksKAACgIdQd5L5s2TLdddddOuqoo9Tc3CxJuuqqq3T33Xdr9erVKhQKOuyww3TrrbdaLywAAEAW\n1A2wjjvuOPX29g76/OMf/7iVAiGelpaWtIvQcNjnyWOfJ499njz2ebbVnQcrVuKFwqCpHAqFgvrG\nkg1ammkfAABAavzilqh4VQ4AAIBhBFgAAACGEWABAAAYRoAFAABgGAEWAACAYQRYAAAAhhFgAQAA\nGEaABQAAYBgBFgAAgGEEWAAAAIYRYAEAABhGgAUAAGAYARYAAIBhBFgAAACGEWABAAAYRoAFAABg\nGAEWAACAYQRYAAAAhhFgAQAAGEaABQAAYBgBFgAAgGEEWAAAAIYRYAEAABhGgAUAAGAYARYAAIBh\nBFgAAACGEWABAAAYRoAFAABgGAEWAACAYQRYAAAAhhFgAQAAGEaABQAAYBgBFgAAgGEEWAAAAIYR\nYAEAABhGgCVp+PCRKhQKA/4NHz4y0HJhlvVbDgAA5E/B8zzPWuKFgiqTLxQKkvyyHLxsUvzLFK/s\nQdMEAABu8ItboqIFCwAAwDACLAAAAMMIsAAAAAyrG2Bt2LBBM2bM0OTJkzVlyhTddNNNkqTu7m61\ntrZq4sSJmjVrlrZs2WK9sAAAAFlQd5B7Z2enOjs7NX36dG3fvl1HH320Fi5cqDvuuEPvfOc7dckl\nl+iaa67Ra6+9pvb29oGJM8i97nIAAMANiQ5yHz16tKZPny5JOuCAA3TEEUdo06ZNWrRokdra2iRJ\nbW1tWrhwoZECAQAAZF2oMVjr16/XqlWrdOyxx6qrq0tNTU2SpKamJnV1dVkpIAAAQNYEDrC2b9+u\nOXPm6MYbb9SwYcMG/K00kSYAAACkIUEW2rNnj+bMmaO5c+dq9uzZkvparTo7OzV69Gh1dHRo1KhR\nvuvOmzev/+eWlpbYBU7OEILGiIYPH6lt214b8NmwYSO0dWt3SiUCAGCwYrGoYrFoJe26g9w9z1Nb\nW5sOOugg3XDDDf2fX3LJJTrooIN06aWXqr29XVu2bMndIPdgn/V9ziD3fRp52wEA2WVykHvdAOvR\nRx/VCSecoKOOOqq/Refqq6/W+9//fp122ml66aWXNG7cOC1YsEDveMc76haUACv/QUYjbzsAILsS\nDbBiJU6AVXe5PGrkbQcAZBfvIgQAAHAYARYAAIBhBFgAAACGEWABAAAYRoAFAABgGAEWAACAYQ4F\nWEP6X7lT+jd8+Mi0CwUAABBaoFflJGOvKudO2raNV9UAAIDscagFCwAAIB8IsAAAAAwjwAIAADCM\nAAsAAMAwAiwAAADDCLAAAAAMI8ACAAAwjAALAADAsMwFWMOHj8zVjO9xtydv+wMAgDwoeJ7n1V8s\nYuKFgiqTLxQKqpyx/a2/+HwedP3By4Utp1+awT6LV86422Njf8TlYpkAAKjHL26JKnMtWAAAAK4j\nwAIAADCMAAsAAMAwAiwAAADDCLAAAAAMI8ACAAAwjAALAADAMAIsAAAAw3IbYPnNcM4s54MxEzwA\nAObldib3WvkETbMRZnJPcmZ8ZnIHALiMmdwBAAAcRoAFAABgGAEWAACAYQRYAAAAhhFgAQAAGEaA\nBQAAYBgBFgAAgGEEWAAAAIYNSbsAtQ15a9JKU8ulLSvlBAAAcTgeYO2V/2zqUZdLW1bKCQAA4qCL\nEAAAwDACLAAAAMMIsAAAAAwjwAIAADCsboB1zjnnqKmpSVOnTu3/bN68eRo7dqyam5vV3NysxYsX\nWy0kAABAltQNsM4+++xBAVShUNBFF12kVatWadWqVfrYxz5mrYAAAABZUzfAOv744zVixIhBn3te\n5XQDAAAAkGKMwbr55ps1bdo0nXvuudqyZYvJMgEAAGRapADr/PPP17p167R69WqNGTNGX/va10yX\nCwAAILMizeQ+atSo/p/PO+88nXTSSVWXnTdvXv/PLS0tUbJDTg0fPlLbtr024LNhw0Zo69buRNYH\nADS2YrGoYrFoJe2CF2Aw1fr163XSSSfpqaeekiR1dHRozJgxkqQbbrhBjz/+uH7yk58MTrxQGDRW\nq+9dfH5Z+n1u+rO+z4OVKc00B6dXTbV8klo/Tpoulh0A0Lj84pao6rZgnXHGGXrooYf0yiuv6NBD\nD9WVV16pYrGo1atXq1Ao6LDDDtOtt95qpDAAAAB5EKgFK3LitGBFLjstWObyAQAgCJMtWMzkDgAA\nYBgBFgAAgGEEWAAAAIYRYAEAABhGgAUAAGAYARYAAIBhkWZyh+uGvDWFQbmhkvakURgAABoOAVYu\n7VWYObwAAIBZdBECAAAYRoAFAABgGAEWAACAYQRYAAAAhhFgAQAAGEaABQAAYBgBFgAAgGHW58Fq\nazvfdhYAAABOsR5g/cd/HFX22wbb2QXgN8u5a2lWSy/Ls7Hb2O8AALip4Hme3/TeZhIvVM4evkrS\ne1V9RvEgs4/H+SwraaZf9jjVYvBxD1Om4HlXy8dilQYA5FihYO4ewhgsAAAAwwiwAAAADCPAAgAA\nMIwACwAAwDACLAAAAMMIsAAAAAwjwAIAADCMAAsAAMAwAiygzPDhI1UoFAb8Gz58ZNrFAgBkjPVX\n5QBZsm3ba6qcHX7bNl7xAwAIhxYsAAAAwwiwAAAADCPAAgAAMIwACwAAwDACLAAAAMMIsAAAAAwj\nwAIAADCMAAsAAMAwAiygriHM7g4ACIWZ3IG69orZ3QEAYdCCBQAAYBgBFgAAgGEEWAAAAIYRYAEA\nABhWN8A655xz1NTUpKlTp/Z/1t3drdbWVk2cOFGzZs3Sli1brBYSAAAgS+oGWGeffbYWL1484LP2\n9na1trZqzZo1mjlzptrb260VEAAAIGvqBljHH3+8RowYMeCzRYsWqa2tTZLU1tamhQsX2ikdAABA\nBkUag9XV1aWmpiZJUlNTk7q6uowWCgAAIMtiTzRamtm6unllPx8SNzskYsigYzps2Aht3dqdUnnC\nGFx2aaikPQM+ib895vfR8OEjtW3ba0bTBABUVywWVSwWraRd8DzPq7fQ+vXrddJJJ+mpp56SJE2a\nNEnFYlGjR49WR0eHZsyYoeeee25w4oWCBs6AvUrSe1U5K/ZbS/t8bvqzrKTpZtkDVJW+JQcd9+zk\nk1TZ/VTLO06aAIDgCgVz19xIXYQnn3yy5s+fL0maP3++Zs+ebaQwAAAAeVC3BeuMM87QQw89pFde\neUVNTU369re/rU9/+tM67bTT9NJLL2ncuHFasGCB3vGOdwxOnBYsx/MJtz4tWNHSDIoWLABIl8kW\nrEBdhJETJ8ByPJ9w6xNgRUszKAIsAEhX6l2EAAAAqI4ACwAAwDACLAAAAMMIsAAAAAwjwAIAADCM\nAAvOGz58ZP8bA8r/xTPEQpqAPX7nwfDhI9MuFoAqYr8qB7Ct7/Ux1aaYiGqvhTQBe/zOg23bqK+A\nq2jBAgAAMIwACwAAwDACLAAAAMMIsAAAAAwjwAIAADCMAAsAAMAwAiwAAADDCLAAAAAMI8ACAAAw\njAALAQ1+tQyv6QiGV5y4g2MBICm8KgcBDX61DK/pCIZXnLiDYwEgKbRgAQAAGEaABQAAYBgBFgAA\ngGEEWAAAAIYRYAEAABhGgAUAAGAYARYAAIBhBFgAAACGEWAhhsGzuxcKcSdtHJwmBvKbjbzajORB\nZy4PkyYAoD5mckcMg2d37xMnKPJLkyCrnN9s5H2fD95PQWcuD5MmAKA+WrAAAAAMI8ACAAAwjAAL\nAADAMAIsAAAAwwiwAAAADCPAAgAAMIwACwAAwDACLAAAAMMIsABkGrPQA3ARM7kDyDRmoQfgIlqw\nAAAADCPAAgAAMIwACwAAwLBYY7DGjRun4cOHa//999fQoUO1cuVKU+UCAADIrFgBVqFQULFY1MiR\nPK0DAABQEruL0PMGP70DAADQyGIFWIVCQSeeeKKOOeYY3XbbbabKBAAAkGmxugiXLVumMWPGaPPm\nzWptbdWkSZN0/PHHmyobAABAJsUKsMaMGSNJOvjgg3XKKado5cqVPgHWvLKfD4mTHeC4ISoUsjC5\nZXrlHD585FsTg1YaKmnPgE+GDRuhrVu7EylXEvy2PW/bCGRNsVhUsVi0knbBiziIaufOnerp6dGw\nYcO0Y8cOzZo1S9/61rc0a9asfYkXCho4w/IqSe+V36zLUuWyNj7LSppZLruNNLNc9urLVp56g8+X\nMMuFSzNM2U2Os6xV9iDbHjbNqPvYhrh5p1l2oFEUCubOqcgtWF1dXTrllFMkSXv37tWZZ545ILgC\nAABoVJEDrMMOO0yrV682WRYAAIBcYCZ3AAAAwwiwAAAADCPAAgAAMIwACwAAwDACLAAAAMMIsAAA\nAAwjwAKc1jfrevk/2Dd8+MhB+71QKGj48JEBl/2rhI7b4PrhV0YAyYv1qhwAtu2V/6zrsKnvlTaD\nZ3Petm3wvvdfttps+aYNrh9+ZQSQPFqwAAAADCPAAgAAMIwACwAAwDACLAAAAMMIsAAAAAwjwAIA\nADCMAAsAAMAwAiwAAADDCLCA3Ehv1ne/2czTn1E8C7PgDy5jsjPBm+dmXQCSx0zuQG6kN+u732zm\n6c8onoVZ8P3KKCU3E7x5btYFIHm0YAEAABhGgAUAAGAYARYAAIBhBFgAAACGEWABAAAYRoAFAABg\nGAEWAACAYQRYAAAAhhFgAQAAGEaABaQiC69xkfzKGfy1J3G30e81MjZeIROmnFk4bv6v3/E7bkFf\naxP/9Tdx6lG6knr1D68Yyp+C53l+72kwk3ih8nUPqyS9V+FeDWHys6ykmeWy20gzy2W3kWb6Za+8\nbAw+183kk/80ky170OMWdblaywZd3zVhtj0L+aC2QsHcPqcFCwAAwDACLAAAAMMIsAAAAAwjwAIA\nADCMAAsAAMAwAiwAAADDCLAAAAAMI8ACAAAwjAALQEhZmM0cg5k+bv4zxsdZv9rM5WnOph5n3Wpv\nH2iEmeDT3h8uYCZ3J9PMctltpJnlsttIk7LnJ003yx59pv645Qw3O3xSs6lH30dx1w++ja7NBB93\nf6SFmdwBAAAcRoAFAABgGAEWAACAYbECrMWLF2vSpEmaMGGCrrnmGlNlAgAAyLTIAVZPT4++9KUv\nafHixXrmmWd0991369lnnzVZNkRSTLsADaiYdgEaUDHtAjSgYtoFADIlcoC1cuVKHX744Ro3bpyG\nDh2q008/Xffcc4/JsiGSYtoFaEDFtAvQgIppF6ABFdMuAJApkQOsTZs26dBDD+3/fezYsdq0aZOR\nQgEAAGTZkKgrBp2Abfjwk/p/7u19Xdu3R80RAAAgGyIHWIcccog2bNjQ//uGDRs0duzYAcuMHz9e\nL7zwK5+1qwVnfp+b/iwraWa57DbSdL3sV1pIM+xnWUnTVD5X1lkubpmytj/Mpen/BfpKDdzn8fMJ\nnvf/b+cOXpr+4ziOvyYKQYQn/WoscEhON+f2jaXnXEuoZg095MGDShcv6tF/QKUOsWinIBAP1TUi\nI8tJpqjQNoYiGDRhggqag5pKqe8OP9gPqd+Pys9n+/309bjt+xW/H58D92bb9/O7P3sUR1nnUdd+\n1L8xV41+Vb6fy99XWVmp7Hf98U7ue3t7sNvtePPmDc6ePYv6+no8fvwYNTU1yhZHRERE9H/0x+9g\nFRYW4sGDB2hqasL+/j66uro4XBERERHhCO9gEREREdHPadnJnRuQ6tfZ2QnDMOByubLHPn36BL/f\nj6qqKly5cgXpdDqPKzx+UqkULl26BKfTidraWty/fx8Au+u0u7uLhoYGeDweOBwO9Pf3A2DzXNjf\n34dpmggE/rpRic31qqioQF1dHUzTRH19PQA21y2dTqO1tRU1NTVwOByYnZ1V2lz5gMUNSHOjo6MD\nL1++PHRsaGgIfr8fS0tL8Pl8GBoaytPqjqeioiLcu3cPCwsLmJmZQTgcxuLiIrtrdOrUKUQiEcTj\ncSQSCUQiEbx7947NcyAUCsHhcGS/fMzmelksFkxMTCAWi2Fubg4Am+vW09ODq1evYnFxEYlEAtXV\n1Wqbi2LT09PS1NSUfTw4OCiDg4OqL0Mikkwmpba2NvvYbrfL2tqaiIisrq6K3W7P19JOhBs3bsjY\n2Bi750gmkxGv1yvz8/NsrlkqlRKfzyfj4+Ny/fp1EeH/F90qKipkY2Pj0DE21yedTovNZvvhuMrm\nyt/B4gak+bO+vg7DMAAAhmFgfX09zys6vpaXlxGLxdDQ0MDumh0cHMDj8cAwjOxHtGyuV19fH+7e\nvYuCgr9fIthcL4vFgsuXL8Pr9eLhw4cA2FynZDKJkpISdHR04MKFC7h9+zYymYzS5soHrP/KXhYn\nncVi4XOhyZcvX9DS0oJQKIQzZ84cOsfu6hUUFCAej2NlZQVv375FJBI5dJ7N1Xr+/DlKS0thmibk\nH+6BYnP1pqamEIvFMDo6inA4jMnJyUPn2Vytvb09RKNRdHd3IxqN4vTp0z98HHjU5soHrF/ZgJT0\nMAwDa2trAIDV1VWUlpbmeUXHz7dv39DS0oL29nbcvHkTALvnSnFxMa5du4b379+zuUbT09N49uwZ\nbDYb2traMD4+jvb2djbXrLy8HABQUlKCYDCIubk5NtfIarXCarXi4sWLAIDW1lZEo1GUlZUpa658\nwPJ6vfjw4QOWl5fx9etXPH36FM3NzaovQz/R3NyM4eFhAMDw8HB2ACA1RARdXV1wOBzo7e3NHmd3\nfTY2NrJ38ezs7GBsbAymabK5RgMDA0ilUkgmk3jy5AkaGxsxMjLC5hptb2/j8+fPAIBMJoNXr17B\n5XKxuUZlZWU4d+4clpaWAACvX7+G0+lEIBBQ1/yPv731L168eCFVVVVSWVkpAwMDOi5x4t26dUvK\ny8ulqKhIrFarPHr0SDY3N8Xn88n58+fF7/fL1tZWvpd5rExOTorFYhG32y0ej0c8Ho+Mjo6yu0aJ\nREJM0xS32y0ul0vu3LkjIsLmOTIxMSGBQEBE2Fynjx8/itvtFrfbLU6nM/u6yeZ6xeNx8Xq9UldX\nJ8FgUNLptNLm3GiUiIiISDEtG40SERERnWQcsIiIiIgU44BFREREpBgHLCIiIiLFOGARERERKcYB\ni4iIiEgxDlhEREREinHAIiIiIlLsO5hP7FaK+KtUAAAAAElFTkSuQmCC\n", "text": [ - "" + "" ] } ], @@ -520,9 +520,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "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\nP4W9gaXhaUGTLZVxHB8b9qlN97j8bvzcOFSCq+ISDa7KVZw0HrgoTwYbTrQgZSj1tKAXppuzd+7M\nPo0VtaiPV/4+dHuFUZgBqHGce17GXAW9aUXRErR8ecfWwSj4+UIT9qZ+4on+5hsrxYbrU1h+rlHl\nHrjyUwd37bJv6oZS633hC9n/03iPjosVY67KfdNJ6pUdfiqjLZUsjoGefrm9pT5ot6DXLsJKuND7\nsffeHT8L22UU9T7Mnxy2GJM3hLDjkg45ROoc4IoZ5bUhyDUqf52//lXatk3ad99kylTIy75atar8\na3T8PCyRW95vWcrVMT+tcMXe0xr1ORg0/dZWs+WoRNZMxRDVunFJQxmDKNyucts5caL5MkQxELNQ\nXMGx14uS3/rUpUvpNHIX78J0//Qn6Zvf9JeXH6b2q5fWnGJ5/epX3stTbr8HaeUJe22w5YubLf74\nx/Ln0Ve/Wvrv5abk8KtSr/8SY66CsqJb0NaKGebx5ii2KWiXXJz79957S5fF7edygoy5snVA+86d\n0qxZ4dMp5La9bkFp4XIzZ0offugtPdP8tC6ce27Hdb2aMmXPOl5bypK8JoVtYQuyjpfJfP2m+/Wv\nS0uW7Pk9zhvxqlWl/x5mXFjhckFaq7yyKbAJM8ygGiU6Q7uJinjQQdK8eeHTcWNDt2DYsSZ+m8fj\nEvQGkpabXinLlpVfxu8A+7ATtUal3Hghr8HOo4+aK5OX/Gzx059m3zNZjKnydu1avGvKq8LA9IUX\npLlzg6URt3L5vvOOdPLJwdcPk3cUeZrKx8Z7iy1S0S1Yyvvvh5vlWsoOUn3ttXBpxPHkTZQnU1wt\nFUF4GZsTVtovErnZpMvVF69fdkztj6jmuQraquwlsC2VbxBbtrT/fe1a7+n/+tfmylFOqTL9/e/R\n5m3L+VfsHHj6aemJJ9z/Vmx90+WJQhRzsCGLbkFJp50mDR7c8XNTTe5h+E3PbWxKUgPAi6XZ1OTe\nFeUlnaTrSo7pi0rQLt8cr8GVDeXO2b073vmdPvoomnT9OuAA6c9/NpNWXNcoE2MpvQT2Nt2svX4x\n8PqQTVrRchWMFU8LJm3HDvNpeq10t99uPu98prsFTRyzI47wn6ctdSUnyad4vA7mtm2fFTJRvvz6\nXa6ee3lHZFxf+D7+uP3vYSbYtYUtX5aDMFX2IGO28v32t8HSC5NnmPUJrooL3HK1cuVKHXfccRo0\n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\n0Xnnnde2rdVwvN2223GcyI+38eDKbYLR1UFntbNUTU2NTjjhBB155JFtc32tX79edXV1kqS6ujqt\nX17AlYAAABrdSURBVL9ekrRmzZp201SkfX/43c7Czw888MDUbv/06dM1dOhQTZw4sa35vBK3e8WK\nFWpqatIxxxxTVcc7t93HHnuspMo/3rt379awYcNUV1fX1jVaDcfbbbulyj/eF198sW688UZ16rTn\ntl8Nx9ttu2tqaiI/3saDq5oqmAf/+eefV1NTk5544gndfvvtmjdvXru/19TUlNwPlbKPym1nJfnx\nj3+s5cuXa/HixerZs6cuvfTSpIsUia1bt+r000/Xrbfeqn1y02x/ppKP99atW3XGGWfo1ltv1d57\n710Vx7tTp05avHixVq1apeeee05z585t9/dKPd6F253JZCr+eD/++OPq3r276uvrXVtspMo83sW2\nO47jbTy48jLBaNr17NlTkrT//vvre9/7nhYuXKi6ujqt++zdFGvXrlX37t0lddwfq1at0oEHHhh/\noQ3xs529evXSgQceqFWrVrX7PI3b371797aLz3nnndfWtVtJ271r1y6dfvrpOuecczRmzBhJ1XG8\nc9v9gx/8oG27q+F45+y77776zne+o5dffrkqjndObrtfeumlij/eL7zwgmbPnq2DDz5YY8eO1TPP\nPKNzzjmn4o+323afe+658RxvI6PF8uzatcs55JBDnOXLlzuffvppxQ1o37Ztm7N582bHcRxn69at\nzogRI5y//OUvzmWXXeZMnTrVcRzHmTJlSoeBgZ9++qnz7rvvOoccckjbALk0WL58eYcB7X638+ij\nj3bmz5/v7N69OzUDIAu3e82aNW0/33zzzc7YsWMdx6mc7d69e7dzzjnnOBdddFG7zyv9eBfb7ko/\n3h9++KHz8ccfO47jONu3b3dGjhzpPPXUUxV/vItt99q1a9uWqcTjnS+TyTjf/e53Hcep/PM7X/52\nx3F+Gw+uHMdx5syZ4/Tr18/p27evc91110WRRWLeffddZ+jQoc7QoUOdQYMGtW3fhg0bnOOPP945\n7LDDnFGjRrWdwI7jONdee63Tt29f52tf+5rT2NiYVNF9O/PMM52ePXs6Xbp0cXr16uXce++9gbbz\npZdecgYPHuz07dvXueCCC5LYFF8Kt/uee+5xzjnnHGfIkCHO4Ycf7vzzP/+zs27durblK2G7582b\n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\nAElFTkSuQmCC\n", + "png": "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\n53/2nTc/36xZ3uIp9sYbh96IUezll8sPB1Qu/nwd55FcOQs9uWpttf/cKWlobfU+CnRQJsbysWtF\ncLucUn8rdYHcs8f5QPLCywFi+jaQm2Z4PwmAZYV74JeKw82o80GsXJn7/777+v6t3LbyeksozHGu\ngtSRn9swSbrol7rN5qUPj9c+MnacWq5KvarHbUtO3CO0O8X59NNSZ2fuBeaF07m9LVi8DK/7o9v3\nAnqty3POkU46qXxZv/qVdPnl3mMofpcsyZWz0JMrp28zhUlD4c+zZ0vHHht2VOExvbOVSq6uv97M\nMgrr5te/dn9Amxql28s0fjtBOy3n+utzyVCYF1677XT22b1/97L8pibn8sttq1Itel6SMVPJlYlp\n8kwde24HBg2rf0rYtwXDrNOgTMdQrry9e80sP2jcXm5H+l1W4X7xgx/Y9wUtV/YnP9n7d5IrZ7H1\nuXrjjUM/F1a66RebulG8Q/nplF58W/DgQWnnTu/llIotigN/9uzwRh33e6Lwsw3cHvT/+I+5gUUL\n90evvL6dXsp9cywUxj5ios9VmIIsO0gftUL5W1+F+8uQIe46sAeJwW+LoZsYysXu9EXXVGJjV05Y\nF2FTr09yWy/lzmF+9wkvyZVffr/MFG6bfv16/y3/dDxJVl+xJVeF4jzBm1J8W/CnP5UOOyx4uVFs\nmzhvC/rtfOt1Wdmst+V4UXwb0MQJ0WtfELtl222rUrcF3VwUTT4N6+b2l5e/u4mpuJtCvhN98cXV\n73G3b1/pW6luLuJubws6TRNFh3a3D+6E1brnltfl+01ygrT+lZrHLlEO80u23/oiueorES9utjsZ\nFD51FTaT/Ur87mRO42P5HeSxUFg7vokTV1QtV4891vv3NWvcleO2/KDCaDUI42QadD7TZRQqVyfv\nvZfrZ1NK/mJWfE5yu+9+8pN9OyzbzVMuuXJy7bXS3/5t6Wm9tlw5xZSE24RBmWohLDW926TZKa5S\nybTdtbHcE7pulullmsLPnL5skVz11a/8JOGzOxkMGhR9HMWC3Ba0+1spbpIrv5LyYmYTyZXb7fHx\nj5f+e/7Fo3kmt1Fjo/cyTdz+LZ43zNffmE6u7r/f/nUy5VoSSp34i7lpDQyaXEnOt4kzmeC3BX/8\n40O37QvLK+S1z5VTy5XXVk67v8U9OKvXZMdpetOvvXF7HrOb7oc/9LasPBPbleTKvUQkV3HfFjR5\n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\nC1RTU6OJEyf2fOZnPZ999llNnDhRxxxzjL7p9PhQgtitd2Njo0aOHKm6ujrV1dVpY8HofpWw3tu2\nbdP06dM1fvx4TZgwQbfccoukyq9vp/Wu9Pr+8MMPNXXqVNXW1ur444/XNddcI6ny69tpvSu9vvO6\nurpUV1ens846S1Ll13de8XpHUt+WYQcPHrTGjBljbdmyxdq/f781efJk64UXXjC9mFiNGjXKeu+9\n93p9duWVV1pLly61LMuylixZYl111VWWZVnWn/70J2vy5MnW/v37rS1btlhjxoyxurq6Io/Zj8ce\ne8z6wx/+YE2YMKHnMy/r2d3dbVmWZX3uc5+znn76acuyLGvWrFnWxo0bI14Tb+zWu7Gx0fr+97/f\nZ9pKWe+WlharubnZsizL6ujosMaOHWu98MILFV/fTutd6fVtWZa1Z88ey7Is68CBA9bUqVOtxx9/\nvOLr27Ls17sa6tuyLOv73/++9eUvf9k666yzLMuqjvO5ZfVd7yjq23jLlekBRpPKKrqbumHDBjV8\nNBR6Q0OD1q9fL0m65557NG/ePPXv31+jRo3S0UcfrU2bNkUerx/Tpk3T4MGDe33mZT2ffvpptbS0\nqKOjo6eF7ytf+UrPPEllt95S3zqXKme9hw0bptraWknSgAEDNG7cOG3fvr3i69tpvaXKrm9J+m//\n7b9Jkvbv36+uri4NHjy44utbsl9vqfLr+6233tJ9992niy++uGddq6G+7dbbsqzQ69t4cmU3wGj+\nZFUpMpmMTj/9dJ144ok9Y321tbWppqZGklRTU6O2j972/Pbbb/capiLt28PrehZ/PmLEiNSu//Ll\nyzV58mQtXLiwp/m8Etd769atam5u1tSpU6uqvvPrfdJJJ0mq/Pru7u5WbW2tampqem6NVkN92623\nVPn1/a1vfUs33XSTPlYwwnM11LfdemcymdDr23hylamCcfCffPJJNTc3a+PGjbrtttv0+OOP9/p7\nJpMpuR0qZRuVW89Kcskll2jLli3avHmzhg8friuuuCLukELR2dmpuXPnatmyZRqYH2b7I5Vc352d\nnTrvvPO0bNkyDRgwoCrq+2Mf+5g2b96st956S4899pgeeeSRXn+v1PouXu9sNlvx9X3vvfdq6NCh\nqqurs22xkSqzvp3WO4r6Np5cuRlgNO2GDx8uSTriiCM0Z84cbdq0STU1NWr96OWFLS0tGjp0qKS+\n2+Ott97SiBEjog/aEC/rOXLkSI0YMUJvvfVWr8/TuP5Dhw7tOflcfPHFPbd2K2m9Dxw4oLlz52r+\n/Pk699xzJVVHfefX+8ILL+xZ72qo77zPfOYzOvPMM/Xss89WRX3n5df7mWeeqfj6/u1vf6sNGzZo\n9OjRmjdvnh5++GHNnz+/4uvbbr2/8pWvRFPfRnqLFThw4IB11FFHWVu2bLH27dtXcR3a9+zZY+3e\nvduyLMvq7Oy0Tj75ZOv++++3rrzySmvJkiWWZVnWjTfe2Kdj4L59+6w33njDOuqoo3o6yKXBli1b\n+nRo97qeU6ZMsZ566imru7s7NR0gi9f77bff7vn5X//1X6158+ZZllU5693d3W3Nnz/fuuyyy3p9\nXun17bTelV7f7777rrVr1y7Lsixr79691rRp06yHHnqo4uvbab1bWlp6pqnE+i6UzWat2bNnW5ZV\n+cd3ocL1juL4Np5cWZZl3XfffdbYsWOtMWPGWDfccEMYi4jNG2+8YU2ePNmaPHmyNX78+J71e++9\n96zTTjvNOuaYY6wZM2b0HMCWZVnXX3+9NWbMGOvYY4+1mpqa4grdsy996UvW8OHDrf79+1sjR460\n7rzzTl/r+cwzz1gTJkywxowZY33961+PY1U8KV7vH/3oR9b8+fOtiRMnWpMmTbLOOeccq7W1tWf6\nSljvxx9/3MpkMtbkyZOt2tpaq7a21tq4cWPF17fdet93330VX9//+Z//adXV1VmTJ0+2Jk6caP3z\nP/+zZVn+zmOVsN6VXt+Fstlsz1NzlV7fhR555JGe9b7wwgtDr28GEQUAADAolEFEAQAAqhXJFQAA\ngEEkVwAAAAaRXAEAABhEcgUAAGAQyRUAAIBBJFcAAAAGkVwBAAAYRHIFAABgEMkVAACAQSRXAAAA\nBpFcAQAAGERyBQAAYBDJFQAAgEEkVwAAAAaRXAEAABhEcgUAAGAQyRUAAIBBJFcAAAAGkVwBAAAY\nRHIFAABgEMkVAACAQSRXAAAABpFcAQAAGERyBQAAYBDJFQAAgEEkVwAAAAaRXAEAABhEcgUAAGAQ\nyRUAAIBBJFcAAAAGkVwBAAAYRHIFAABgUMnkatu2bZo+fbrGjx+vCRMm6JZbbpEkNTY2auTIkaqr\nq1NdXZ2ampoiCRYAACDpMpZlWU5/bG1tVWtrq2pra9XZ2akTTjhB69ev19q1azVw4EBdfvnlUcYK\n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\n", "text": [ - "" + "" ] } ], @@ -550,15 +550,15 @@ "output_type": "pyout", "prompt_number": 18, "text": [ - "[]" + "[]" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\nftz5m6v2vf766zF37tw455xz4rLLLotdg16G+LWvfS1aWlqitbU1HnzwwbyGzm+Uy+WYOXNmXHnl\nlRHh2I0nu3btis985jPR1tYW5557bjz++OOO3zjyta99Lc4777y44IIL4vOf/3y89957jl+ivvCF\nL8QZZ5wRF1xwwcD7juZYPfnkk3HBBRdES0tL/Nmf/dnIPvionV12hPr6+rKpU6dmW7duzfbu3ZvN\nmDEj27hxY17D4SBefvnl7KmnnsqyLMvefvvt7Jxzzsk2btyY/fVf/3W2bNmyLMuy7Lbbbsv+5m/+\nJsuyLHv22WezGTNmZHv37s22bt2aTZ06NSuXy7mNnyy7/fbbs89//vPZlVdemWVZ5tiNI9dee212\n9913Z1mWZe+//362a9cux2+c2Lp1a3bWWWdlv/71r7Msy7LPfvaz2T/8wz84fol6+OGHs/Xr12fn\nn3/+wPuO5Fjt27cvy7IsmzVrVvb4449nWZZll19+efajH/3osB87t5kwF3NN35lnnhkXXnhhRESc\neOKJ0dbWFr29vQdcoPe6666L+++/PyIiVq9eHZ/73Oeivr4+mpqaorm5Obq7u3Mbf63bvn17rFmz\nJv7kT/5k4DIyjt348Oabb8YjjzwSX/jCFyKico7tKaec4viNEyeffHLU19fHnj17oq+vL/bs2ROT\nJ092/BI1Z86cOG3I75g7kmP1+OOPx8svvxxvv/12zJ49OyIirr322oF9qsktwkZyIVjSsW3btnjq\nqafioosuildeeSXOOOOMiIg444wz4pXfXIX2pZdeisZBFyNyTPP1F3/xF/H1r389jht00SLHbnzY\nunVrTJw4Mf74j/84fu/3fi+uv/762L17t+M3Tpx++unxl3/5l/HRj340Jk+eHKeeemrMnTvX8RtH\njvRYDX1/Q0PDiI5hbhE20gvBkr933nknPv3pT8cdd9wRJw25Sl+pVKp6LB3nfPzwhz+Mj3zkIzFz\n5sxDXkzZsUtXX19frF+/Pm688cZYv359nHDCCXHbbbcdsI3jl64tW7bEN77xjdi2bVu89NJL8c47\n78S99957wDaO3/hxuGP1QeQWYQ0NDdEz6Df29vT0HFCRpOH999+PT3/603HNNdfEVVddFRGV/xXs\n+M3vI3n55ZfjI7+5fPjQY7p9+/ZoaGg49oMmfvazn8UDDzwQZ511Vnzuc5+Lhx56KK655hrHbpxo\nbGyMxsbGmDVrVkREfOYzn4n169fHmWee6fiNA0888UT8wR/8QUyYMCHq6upi4cKF8eijjzp+48iR\nfK9sbGyMhoaG2D7olyuP9BjmFmGDLwS7d+/eWLVqVcyfPz+v4XAQWZbF4sWL49xzz40///M/H3j/\n/Pnz4zvf+U5ERHznO98ZiLP58+fHfffdF3v37o2tW7fGpk2bBtbHObZuvfXW6Onpia1bt8Z9990X\nn/zkJ+N73/ueYzdOnHnmmTFlypR44YUXIiJi7dq1cd5558WVV17p+I0Dra2t8dhjj8W7774bWZbF\n2rVr49xzz3X8xpEj/V555plnxsknnxyPP/54ZFkW3/ve9wb2qWoUX2BwxNasWZOdc8452dSpU7Nb\nb701z6FwEI888khWKpWyGTNmZBdeeGF24YUXZj/60Y+y1157LfvUpz6VtbS0ZHPnzs3eeOONgX2+\n+tWvZlOnTs2mTZuWdXZ25jh6+nV1dQ28OtKxGz+efvrprL29PZs+fXq2YMGCbNeuXY7fOLJs2bLs\n3HPPzc4///zs2muvzfbu3ev4JWrRokXZpEmTsvr6+qyxsTG75557jupYPfHEE9n555+fTZ06NfvT\nP/3TEX1sF2sFAMhBrhdrBQCoVSIMACAHIgwAIAciDAAgByIMACAHIgwAIAciDAAgByIMACAH/x/d\nQzeSSiDvWgAAAABJRU5ErkJggg==\n", + "png": "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\nXqudx56e2uczym/Do/bEE7VjHK1qtfY5DH89MFD7+n7HOyLmzRvdY73+eu3C3SlTal+3Z54Z8Z3v\n1I7njTciNm6MmDu39m8xZUrErl21Hxb//t/XPu5IL297W+1xTvr9r5bDv7Z37Kh9Xwz/9//Zz2rv\nb2kZ+Vj/5V9q38MLFtSmiBsbI84559DtHn20tt1vfxvR0FA7juM5d48/XvuBdvnlBz+hZPDzeuKJ\niP/7f+t/Dw8+K/jll2vHdOaZx348R2vnztq/x3veU/t+3Lev9kPwne888r7PPx9xyilH/l4Z9PTT\nta+Vwem1P/iDiD//89r/K8Nt21b7Wrj88vrnZ+PG2v5/8RcRM2cefN+bb9Z+qF9ySe3fNaJ2Hp56\nKuLcc9/6Ghy0d2/tuNra3nrfSN9/v/517f+o005767yO1euI2tduQ0Pt8+7vjzj99Ij/+T9Hvi6s\nWq390vq2t0X8h/9Qe/3ii7VzMtIvs48+WjvuRYsiLrig9oSks8+u/d+6a9eh29cz/Lxs2VL7Zf2S\nS47ucQ60eXPteD784dq/cVEc28uYK+r45S9/WSxatGjo9le/+tXi9ttvP2ib5cuXF6tXrx66PWvW\nrGL37t2j2rcoimLmzJlFRHjx4sWLFy9evJT+ZebMmfXS6ajUHQnr7OyMrVu3xs6dO2P69OmxZs2a\nWL169UHbLF68OFauXBlLly6NDRs2xBlnnBHnnHNOTJky5Yj7RkRss5IbAJChuhHW0NAQK1eujEWL\nFkW1Wo1ly5ZFR0dHrFq1KiIili9fHldddVWsW7cuWltb4+STT45vf/vbdfcFACCiUhQT+bJPAICJ\nKemK+RZzLbe+vr543/veF+9617vioosuim984xsREfH888/HwoUL44ILLogrrrgi9hzwtJWvfe1r\n0dbWFu3t7XHfffelOnR+r1qtxty5c+Pq3z/7xbmbOPbs2RMf/OAHo6OjIy688MLYuHGj8zeBfO1r\nX4t3vetdcfHFF8dHP/rReP31152/kvr4xz8e55xzTlx88cVD7zuWc/WrX/0qLr744mhra4vPfOYz\no/vgY3Z12VEaGBgoZs6cWezYsaPYv39/MWfOnGLLli2pDocRPPXUU8UjjzxSFEVRvPzyy8UFF1xQ\nbNmypfibv/mbYsWKFUVRFMXtt99efOELXyiKoij++Z//uZgzZ06xf//+YseOHcXMmTOLarWa7Pgp\niq9//evFRz/60eLqq68uiqJw7iaQG264ofjWt75VFEVRvPHGG8WePXucvwlix44dxXnnnVe89tpr\nRVEUxYc//OHiH//xH52/knrggQeKTZs2FRdddNHQ+47mXL355ptFURTFvHnzio0bNxZFURRXXnll\n8eMf//iIHzvZSJjFXMvv3HPPjUt+/5zgU045JTo6OqK/v/+gBXpvvPHGuOeeeyIiYu3atfGRj3wk\nGhsbo6WlJVpbW6O3tzfZ8edu165dsW7duvjEJz4xtIyMczcxvPjii/Hggw/Gxz/+8YioXWN7+umn\nO38TxGmnnRaNjY2xb9++GBgYiH379sX06dOdv5JasGBBnDls/ZajOVcbN26Mp556Kl5++eWYP39+\nRETccMMNQ/vUkyzCRrMQLOWxc+fOeOSRR+LSSy+Np59+Os75/UJJ55xzTjz99NMREfHkk09Gc3Pz\n0D7OaVqf/exn42//9m/jpAMWLXLuJoYdO3bE1KlT42Mf+1j80R/9Udx0002xd+9e52+COOuss+Kv\n//qv4w//8A9j+vTpccYZZ8TChQudvwnkaM/V8Pc3NTWN6hwmi7DRLgRLeq+88kp84AMfiDvuuCNO\nPfXUg+6rVCp1z6XznMY//dM/xTvf+c6YO3fuYRdTdu7Ka2BgIDZt2hR/+Zd/GZs2bYqTTz45br/9\n9oO2cf7Ka/v27fH3f//3sXPnznjyySfjlVdeie9///sHbeP8TRxHOlfHI1mENTU1Rd8Bf6G4r6/v\noIqkHN544434wAc+ENdff31cc801EVH7rWD37t0REfHUU0/FO3+/BPbwc7pr165oamo68QdN/OIX\nv4h77703zjvvvPjIRz4SP/3pT+P666937iaI5ubmaG5ujnm//xMEH/zgB2PTpk1x7rnnOn8TwMMP\nPxx//Md/HFOmTImGhoa49tpr45e//KXzN4Eczf+Vzc3N0dTUFLsO+NMAoz2HySLswIVg9+/fH2vW\nrInFixenOhxGUBRFLFu2LC688ML4q7/6q6H3L168OL7zne9ERMR3vvOdoThbvHhx3H333bF///7Y\nsWNHbN26dWh+nBPrq1/9avT19cWOHTvi7rvvjve///3xve99z7mbIM4999yYMWNGPPHEExERsX79\n+njXu94VV199tfM3AbS3t8eGDRvi1VdfjaIoYv369XHhhRc6fxPI0f5fee6558Zpp50WGzdujKIo\n4nvf+97QPnWN4RMMjtq6deuKCy64oJg5c2bx1a9+NeWhMIIHH3ywqFQqxZw5c4pLLrmkuOSSS4of\n//jHxXPPPVf8yZ/8SdHW1lYsXLiweOGFF4b2+cpXvlLMnDmzmDVrVtHd3Z3w6BnU09Mz9OxI527i\n+PWvf110dnYWs2fPLpYsWVLs2bPH+ZtAVqxYUVx44YXFRRddVNxwww3F/v37nb+SWrp0aTFt2rSi\nsbGxaG5uLu66665jOlcPP/xwcdFFFxUzZ84sPvWpT43qY1usFQAggaSLtQIA5EqEAQAkIMIAABIQ\nYQAACYgwAIAERBgAQAIiDAAgAREGAJDA/wckYxa5Es1/mgAAAABJRU5ErkJggg==\n", "text": [ - "" + "" ] } ], @@ -575,22 +575,15 @@ "cell_type": "code", "collapsed": false, "input": [ + "# load labels\n", "imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'\n", "try:\n", " labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\\t')\n", "except:\n", " !../data/ilsvrc12/get_ilsvrc_aux.sh\n", - " labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\\t')" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 19 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ + " labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\\t')\n", + "\n", + "# sort top k predictions from softmax output\n", "top_k = net.blobs['prob'].data[4].flatten().argsort()[-1:-6:-1]\n", "print labels[top_k]" ], @@ -601,16 +594,16 @@ "output_type": "stream", "stream": "stdout", "text": [ - "['n02115913 dhole, Cuon alpinus' 'n02119022 red fox, Vulpes vulpes'\n", - " 'n02119789 kit fox, Vulpes macrotis' 'n02123159 tiger cat'\n", - " 'n02123045 tabby, tabby cat']\n" + "['n02123045 tabby, tabby cat' 'n02123159 tiger cat'\n", + " 'n02124075 Egyptian cat' 'n02119022 red fox, Vulpes vulpes'\n", + " 'n02127052 lynx, catamount']\n" ] } ], - "prompt_number": 20 + "prompt_number": 19 } ], "metadata": {} } ] -} +} \ No newline at end of file diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index d64ae853ace..bf3d1140559 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -290,14 +290,14 @@ "output_type": "pyout", "prompt_number": 7, "text": [ - "array([[278, 151, 259, 281, 282, 259, 282, 282],\n", - " [283, 259, 283, 282, 283, 281, 259, 277],\n", - " [283, 283, 283, 287, 287, 287, 287, 282],\n", - " [283, 283, 283, 281, 281, 259, 259, 333],\n", - " [283, 283, 283, 283, 283, 283, 283, 283],\n", - " [283, 283, 283, 283, 283, 259, 283, 333],\n", - " [283, 356, 359, 371, 368, 368, 259, 852],\n", - " [356, 335, 358, 151, 283, 263, 277, 744]])" + "array([[282, 281, 281, 281, 281, 282, 282, 278],\n", + " [281, 283, 281, 283, 281, 287, 281, 282],\n", + " [283, 283, 283, 281, 283, 283, 283, 259],\n", + " [283, 283, 281, 281, 283, 283, 287, 259],\n", + " [283, 283, 285, 283, 283, 283, 283, 283],\n", + " [283, 283, 333, 283, 283, 283, 283, 282],\n", + " [905, 358, 259, 283, 371, 259, 259, 852],\n", + " [335, 335, 371, 185, 186, 263, 185, 356]])" ] }, { @@ -305,7 +305,7 @@ "output_type": "display_data", "png": "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\nnridj/C6Y3t7+xVF8/z58+LWrVtCCFlgzp8/L4QQ4vHHHxcf//jHZ1/3yCOPiG984xu392FfB/zC\nL/yC+MpXvvKmWncQBOKBBx4Qzz777Jti3Ts7O+Khhx4SX/3qV8W73vUuIcSb631+W6/ne3t7bGxs\nzP79qtZxdwgODw+l+zewvLzM4eEhAPv7+6yvr8++7k74Wdy8eZNr167x4IMPvinWXZYlV65cYXl5\nedaieDOs+9d//df5vd/7vVeYi78Z1j3FbS2aP06H/mbBy+OAf9zn/7ViMpnwnve8hz/4gz+gVqu9\n4nN36rqntom7u7t8/etf52tf+9orPn8nrvsLX/gCS0tLXL169cfKDO/Edb8ct7Vo/lPruJ2dnVfs\nQncilpeXuXXrFiANUKZqg9dio/f/O7Is4z3veQ+PPfYYv/iLvwi8OdY9xdQ28Zlnnrnj1/3000/z\n+c9/nq2tLd773vfy1a9+lccee+yOX/fLcVuL5gMPPMDzzz8/E/d/7nOf49FHH72dj3Db8eijj/Lp\nT38agE9/+tOzovLoo4/y2c9+ljSVphfPP/88b33rW9/IR/0XQQjBr/zKr3Dx4kV+7dd+bfbxO33d\nJycnswlxFEV85Stf4erVq3f8uh9//HF2dnbY3t7ms5/9LO94xzv4sz/7szt+3a/A7W6ifvGLXxTn\nzp0TZ86cEY8//vjtfvnXFb/8y78sTp06JQzDEOvr6+JP//RPRbfbFQ899JA4e/asePjhh0W/3599\n/e/8zu+IM2fOiPPnz4svf/nLb+CT/8vx1FNPCUVRxOXLl8WVK1fElStXxJe+9KU7ft3f+973xNWr\nV8Xly5fF/fffL373d39XCCHu+HW/HE8++eRsev5mWvdcRjnHHHPM8RowVwTNMcccc7wGzIvmHHPM\nMcdrwLxozjHHHHO8BsyL5hxzzDHHa8C8aM4xxxxzvAbMi+Ycc8wxx2vAvGjOMcccc7wGzIvmHHPM\nMcdrwP8F7/c7xJLyUh8AAAAASUVORK5CYII=\n", "text": [ - "" + "" ] } ], @@ -315,7 +315,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The classifications include various cats -- 282 = tabby, 283 = tiger, 281 = persian -- and foxes and other mammals.\n", + "The classifications include various cats -- 282 = tiger cat, 281 = tabby, 283 = persian -- and foxes and other mammals.\n", "\n", "In this way the fully-connected layers can be extracted as dense features across an image (see `net_full_conv.blobs['fc6'].data` for instance), which is perhaps more useful than the classification map itself." ] From f1eb9821ba717a55b684d42ef8c87125e855b402 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 28 Jul 2014 20:16:52 -0700 Subject: [PATCH 0388/2053] [example] include prediction in classification, time on GTX 770 --- examples/imagenet_classification.ipynb | 66 +++++++++++--------------- 1 file changed, 28 insertions(+), 38 deletions(-) diff --git a/examples/imagenet_classification.ipynb b/examples/imagenet_classification.ipynb index 40e69aea138..8ab65fda02f 100644 --- a/examples/imagenet_classification.ipynb +++ b/examples/imagenet_classification.ipynb @@ -112,15 +112,15 @@ "output_type": "pyout", "prompt_number": 4, "text": [ - "" + "" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\nRK5CYII=\n", + "png": "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\nnridj/C6Y3t7+xVF8/z58+LWrVtCCFlgzp8/L4QQ4vHHHxcf//jHZ1/3yCOPiG984xu392FfB/zC\nL/yC+MpXvvKmWncQBOKBBx4Qzz777Jti3Ts7O+Khhx4SX/3qV8W73vUuIcSb631+W6/ne3t7bGxs\nzP79qtZxdwgODw+l+zewvLzM4eEhAPv7+6yvr8++7k74Wdy8eZNr167x4IMPvinWXZYlV65cYXl5\nedaieDOs+9d//df5vd/7vVeYi78Z1j3FbS2aP06H/mbBy+OAf9zn/7ViMpnwnve8hz/4gz+gVqu9\n4nN36rqntom7u7t8/etf52tf+9orPn8nrvsLX/gCS0tLXL169cfKDO/Edb8ct7Vo/lPruJ2dnVfs\nQncilpeXuXXrFiANUKZqg9dio/f/O7Is4z3veQ+PPfYYv/iLvwi8OdY9xdQ28Zlnnrnj1/3000/z\n+c9/nq2tLd773vfy1a9+lccee+yOX/fLcVuL5gMPPMDzzz8/E/d/7nOf49FHH72dj3Db8eijj/Lp\nT38agE9/+tOzovLoo4/y2c9+ljSVphfPP/88b33rW9/IR/0XQQjBr/zKr3Dx4kV+7dd+bfbxO33d\nJycnswlxFEV85Stf4erVq3f8uh9//HF2dnbY3t7ms5/9LO94xzv4sz/7szt+3a/A7W6ifvGLXxTn\nzp0TZ86cEY8//vjtfvnXFb/8y78sTp06JQzDEOvr6+JP//RPRbfbFQ899JA4e/asePjhh0W/3599\n/e/8zu+IM2fOiPPnz4svf/nLb+CT/8vx1FNPCUVRxOXLl8WVK1fElStXxJe+9KU7ft3f+973xNWr\nV8Xly5fF/fffL373d39XCCHu+HW/HE8++eRsev5mWvdcRjnHHHPM8RowVwTNMcccc7wGzIvmHHPM\nMcdrwLxozjHHHHO8BsyL5hxzzDHHa8C8aM4xxxxzvAbMi+Ycc8wxx2vAvGjOMcccc7wGzIvmHHPM\nMcdrwP8F7/c7xJLyUh8AAAAASUVORK5CYII=\n", "text": [ - "" + "" ] } ], @@ -139,7 +139,8 @@ "input": [ "prediction = net.predict([input_image]) # predict takes any number of images, and formats them for the Caffe net automatically\n", "print 'prediction shape:', prediction[0].shape\n", - "plt.plot(prediction[0])" + "plt.plot(prediction[0])\n", + "print 'predicted class:', prediction[0].argmax()" ], "language": "python", "metadata": {}, @@ -148,23 +149,16 @@ "output_type": "stream", "stream": "stdout", "text": [ - "prediction shape: (1000,)\n" - ] - }, - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 5, - "text": [ - "[]" + "prediction shape: (1000,)\n", + "predicted class: 281\n" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\nwBfrr33tyv3u7tSPL8WmhubOvbJ9rSDoa+N4mR764x+lm28e+DiXwGbG559nugWxF/tXX+3/2Icf\nSm1t0vHjg9dP9eq5ofyOZeqKvKRXDTkpXtJiRvjXVF4ee9f69a9LWRm6jqnvnevKlf1fJFPRd/qN\njdKePbEX1vz82C+aMbFb4v2TJ2Pl/+M/pHfekWbOlEpKpP/5n9h2Mh0d0n//t/Rv/5b8XX7iL/Kq\nVbHASfTHP0o/+EHs/ve/L/3Lv8SCadKk2Ogmme5uyeWS8vJifzgPPyzdcEP/MseOxX7ef7+UnZ18\nf9c6jw8+kA4dSl5vKA4dkk6divXFmTPSjTdKXV1SKCTddVcsYHt7Y3+Iffev3k68n5c38JyvZox0\n4kSsntsdO8++25c5eTL2piLxW2MH+73o+7261u9aKrfjxyWPJ9YnQ3XxYuyNgOPE2j1linT99f3P\nJzu7/1VlxkivvCLdcUfsmEO5ci6Vv5FUnT8v7d0rVVTEfp8l6f/+L/bzgQekadP6l49GY7+XBQWx\n7X37pLvvHvw4R45IN90kJbwvvqZ//lN66y3pX/819hrU97rS9+909f20Mkns37/fVFRUxLefeuop\n8/TTT/crU1NTYxobG+PbBQUFprOzM6W6xhiTl5dnJHHjxo0btyHc8vLykr18D0nS99/FxcVqbW1V\nR0eHZs+erZ07d6qxsbFfmcrKStXX16uqqkoHDhzQjTfeqJkzZ2rGjBmD1pWktra2ZE0AAIyypEGQ\nlZWl+vp6VVRUKBqNqrq6Wn6/Xw0NDZKkmpoarVy5Unv27FF+fr4mT56s559/PmldAMD44hjDchkA\n2Cyjnyz+Kn3gbKTC4bC++93v6tZbb9WCBQv07LPPSpJOnz6t8vJyzZs3T8uXL1dXV1e8zqZNm+T1\neuXz+fTaa69lqumjJhqNqqioSKtWrZJkb190dXXpvvvuk9/v1/z583Xw4EFr+2LTpk269dZbtXDh\nQj3wwAO6ePGiNX3x4x//WDNnztTChQvjjw3n3N955x0tXLhQXq9XP/vZz1I7eNpWG4aot7fX5OXl\nmfb2dtPT02MKCwtNS0tLppoz6j7++GNz5MgRY4wxn332mZk3b55paWkxv/zlL01dXZ0xxpinn37a\n/OpXvzLGGPOPf/zDFBYWmp6eHtPe3m7y8vJMNBrNWPtHw+bNm80DDzxgVq1aZYwx1vbFgw8+aLZu\n3WqMMebSpUumq6vLyr5ob283c+bMMRcuXDDGGHP//feb3//+99b0xRtvvGEOHz5sFixYEH9sKOd+\n+fJlY4wxJSUl5uDBg8YYY1asWGFeffXVQY+dsSB4++23+11VtGnTJrNp06ZMNWfMfe973zN//etf\n41dZGRMLi4KCAmPMwKusKioqzP79+zPS1tEQDofNXXfdZfbu3WvuvvtuY4yxsi+6urrMnDlzBjxu\nY198+umnZt68eeb06dPm0qVL5u677zavvfaaVX3R3t7eLwiGeu4nTpwwPp8v/nhjY6OpqakZ9LgZ\nmxpK5cNqE1VHR4eOHDmi0tJSnTx5UjNnzpQkzZw5Uye/+JDBiRMn5PF44nUmWv/84he/0G9+8xtN\nSrjA3Ma+aG9vV3Z2tn70ox/pm9/8ptavX6/u7m4r+2L69Ol69NFH9Y1vfEOzZ8/WjTfeqPLyciv7\nos9Qz/3qx91ud0p9krEgSPXDahPNuXPndO+99+qZZ57RlClT+j3nOE7Sfpkoffbyyy/r5ptvVlFR\n0Zd+GNGWvujt7dXhw4f1k5/8RIcPH9bkyZP19NNP9ytjS198+OGH+u1vf6uOjg6dOHFC586d0/bt\n2/uVsaUvrmWwcx+JjAWB2+1WOOFbm8LhcL8km4guXbqke++9V+vWrdM999wjKZbynZ2dkqSPP/5Y\nN3/xPQhX98/x48fldrvHvtGj4O2339bu3bs1Z84c/fCHP9TevXu1bt06K/vC4/HI4/GopKREknTf\nfffp8OHDuuWWW6zri0OHDun222/XjBkzlJWVpTVr1mj//v1W9kWfofxNeDweud1uHU/4WoFU+yRj\nQZD4YbWenh7t3LlTlZWVmWrOqDPGqLq6WvPnz9fPf/7z+OOVlZV64Yv/LOCFF16IB0RlZaV27Nih\nnp4etbe3q7W1VYsXL85I29PtqaeeUjgcVnt7u3bs2KE777xTL774opV9ccsttygnJ0cffPCBJKm5\nuVm33nqrVq1aZV1f+Hw+HThwQJ9//rmMMWpubtb8+fOt7Is+Q/2buOWWW3TDDTfo4MGDMsboxRdf\njNdJKh0LHMO1Z88eM2/ePJOXl2eeeuqpTDZl1L355pvGcRxTWFhobrvtNnPbbbeZV1991Xz66afm\nrrvuMl6v15SXl5szZ87E6/z61782eXl5pqCgwAQCgQy2fvQEg8H4VUO29sXf//53U1xcbBYtWmRW\nr15turq6rO2Luro6M3/+fLNgwQLz4IMPmp6eHmv6oqqqysyaNcu4XC7j8XjMtm3bhnXuhw4dMgsW\nLDB5eXnmpz/9aUrH5gNlAGA5/qtKALAcQQAAliMIAMByBAEAWI4gAADLEQQAYDmCAAAsRxAAgOX+\nH+ygAhcPtOtaAAAAAElFTkSuQmCC\n", + "png": "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\nyl98MTRNuHu3dN110tKl37Sho0NavHho38OGD6b/+I+S2/3NPhwOacqU9K+V+B3p75euuUa6aoKX\nvPzlL0N/V68e2o8kffLJ0N8HHxz61Z/oxImh91NVNbTc0SHddtvor3PihPS3fzvUx+l0dw+VXbVq\n6D0lTj+lPs84k8Zbb71lqqqq4ssPP/yweeSRR5LK1NfXm+bm5vjyvHnzTF9f35jqGmNMYWGhkcSD\nBw8ePMbxKCwsTHf4Hpe0IwK/36+uri719vZq1qxZamlpUXNzc1KZQCCgxsZG1dbWas+ePbr22ms1\nc+ZM5ebmjlpXkrov13EwAFwh0gZBTk6OGhsbVVVVpVgsprq6Ovl8PjU1NUmS6uvrtWrVKm3fvl0e\nj0dTp07V008/nbYuAODS4jDmSroICgAwXlm9s9imG84ikYhuueUWLViwQAsXLtSWLVskScePH1dl\nZaXmzp2rFStWqL+/P15n8+bNKioqktfrVVtbW7aaPmlisZjKysq0+uuztbb2RX9/v+644w75fD7N\nnz9fe/futbYvNm/erAULFqi4uFh33nmnvvzyS2v64ic/+Ylmzpyp4uLi+LqJvPd33nlHxcXFKioq\n0k8TLxVMJ2NnG8ZpcHDQFBYWmp6eHjMwMGBKS0tNZ2dntpoz6T755BOzf/9+Y4wxJ0+eNHPnzjWd\nnZ3mV7/6lWloaDDGGPPII4+YX//618YYY9577z1TWlpqBgYGTE9PjyksLDSxWCxr7Z8Mjz32mLnz\nzjvN6tWrjTHG2r646667zJNPPmmMMebs2bOmv7/fyr7o6ekxs2fPNl988YUxxpgf/vCH5plnnrGm\nL3bu3Gn27dtnFi5cGF83nvf+1VdfGWOMKS8vN3v37jXGGLNy5Urz2muvjfraWQuCN998M+mqos2b\nN5vNmzdnqzkX3Q9+8APz+uuvx6+yMmYoLObNm2eMGXmVVVVVlXnrrbey0tbJEIlEzK233mp27Nhh\nbrvtNmOMsbIv+vv7zezZs0est7Evjh07ZubOnWuOHz9uzp49a2677TbT1tZmVV/09PQkBcF43/uR\nI0eM1+uNr29ubjb19fWjvm7WpobGcrPalaq3t1f79+/X4sWL9emnn2rmzJmSpJkzZ+rTTz+VJB05\nckTu4YusdeX1z89//nM9+uijuirhInAb+6Knp0czZszQj3/8Y33nO9/RPffco9OnT1vZF9OnT9cv\nfvELffvb39asWbN07bXXqrKy0sq+GDbe95663uVyjalPshYEY71Z7Upz6tQp3X777Xr88cf1rW99\nK2mbw+FI2y9XSp+9+uqruuGGG1RWVnbemxFt6YvBwUHt27dP9913n/bt26epU6fqkUceSSpjS18c\nOnRIv//979Xb26sjR47o1KlTeiHl34S2pS/OZbT3fiGyFgQul0uRhHvvI5FIUpJdic6ePavbb79d\n69at05o1ayQNpXzf1/9ozyeffKIbvr6dMbV/Dh8+LJfLdfEbPQnefPNNvfLKK5o9e7Z+9KMfaceO\nHVq3bp2VfeF2u+V2u1VeXi5JuuOOO7Rv3z7deOON1vXF22+/re9+97vKzc1VTk6Oampq9NZbb1nZ\nF8PG851wu91yuVw6fPhw0vqx9EnWgiDxZrWBgQG1tLQoEAhkqzmTzhijuro6zZ8/Xz/72c/i6wOB\ngJ599llJ0rPPPhsPiEAgoG3btmlgYEA9PT3q6urSokWLstL2THv44YcViUTU09Ojbdu26fvf/76e\nf/55K/vixhtvVH5+vj766CNJUnt7uxYsWKDVq1db1xder1d79uzR559/LmOM2tvbNX/+fCv7Yth4\nvxM33nijrrnmGu3du1fGGD3//PPxOmll4gTHRG3fvt3MnTvXFBYWmocffjibTZl0u3btMg6Hw5SW\nlpqbbrrJ3HTTTea1114zx44dM7feeqspKioylZWV5sSJE/E6v/vd70xhYaGZN2+eCQaDWWz95AmF\nQvGrhmztiwMHDhi/329KSkpMdXW16e/vt7YvGhoazPz5883ChQvNXXfdZQYGBqzpi9raWpOXl2ec\nTqdxu93mqaeemtB7f/vtt83ChQtNYWGhuf/++8f02txQBgCW439VCQCWIwgAwHIEAQBYjiAAAMsR\nBABgOYIAACxHEACA5QgCALDc/wN1ylfVql6MNwAAAABJRU5ErkJggg==\n", "text": [ - "" + "" ] } ], @@ -174,6 +168,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "You can see that the prediction is 1000-dimensional, and is pretty sparse.\n", + "\n", + "The predicted class 281 is \"Tabby cat.\" Our pretrained model uses the synset ID ordering of the classes, as listed in `../data/ilsvrc12/synset_words.txt` if you fetch the auxiliary imagenet data by `../data/ilsvrc12/get_ilsvrc_aux.sh`. If you look at the top indices that maximize the prediction score, they are cats, foxes, and other cute mammals. Not unreasonable predictions, right?\n", + "\n", "Now let's classify by the center crop alone by turning off oversampling. Note that this makes a single input, although if you inspect the model definition prototxt you'll see the network has a batch size of 10. The python wrapper handles batching and padding for you!" ] }, @@ -183,7 +181,8 @@ "input": [ "prediction = net.predict([input_image], oversample=False)\n", "print 'prediction shape:', prediction[0].shape\n", - "plt.plot(prediction[0])" + "plt.plot(prediction[0])\n", + "print 'predicted class:', prediction[0].argmax()" ], "language": "python", "metadata": {}, @@ -192,23 +191,16 @@ "output_type": "stream", "stream": "stdout", "text": [ - "prediction shape: (1000,)\n" - ] - }, - { - "metadata": {}, - "output_type": "pyout", - "prompt_number": 6, - "text": [ - "[]" + "prediction shape: (1000,)\n", + "predicted class: 281\n" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\nHo9nXH2SsSAY781q15q+vj7dc8892rZtm7454i4sl8uVsl+ulT57/fXXdfPNN6usrOySNyPa0heD\ng4Nqb2/XT37yE7W3t2vGjBnaunXrsDK29MXRo0f19NNPq7u7W8ePH1dfX59eeumlYWVs6YuLGWvb\nJyNjQeDxeBSNRpPT0Wh0WJJdi86fP6977rlH69ev19q1ayUlUr6np0eS9Pnnn+vmf96GO7J/jh07\nJo/Hc+UbPQXeeecdvfbaa5o3b55+9KMfae/evVq/fr2VfeH1euX1elVeXi5Juvfee9Xe3q5bbrnF\nur547733dMcddyg7O1tZWVmqqanRu+++a2VfDJnI34TX65XH49Gxof/4qPH3ScaCwHmz2sDAgFpa\nWhQMBjPVnClnjFFdXZ0WLVqkn/3sZ8n5wWBQL7zwgiTphRdeSAZEMBjUrl27NDAwoK6uLnV2dmrJ\nkiUZaXu6Pfnkk4pGo+rq6tKuXbv0ve99Ty+++KKVfXHLLbcoLy9Pn3zyiSSpra1Nt956q9asWWNd\nX/h8Pu3fv19///vfZYxRW1ubFi1aZGVfDJno38Qtt9yib33rWzpw4ICMMXrxxReTdVJKxwmOy7V7\n926zYMECU1BQYJ588slMNmXKvf3228blcpnS0lJz2223mdtuu8288cYb5uTJk+auu+4yRUVFprKy\n0pw+fTpZ57e//a0pKCgwCxcuNKFQKIOtnzrhcDh51ZCtffHBBx+YQCBgSkpKTHV1tent7bW2Lxoa\nGsyiRYvM4sWLzf33328GBgas6Yva2lqTm5tr3G638Xq95rnnnrusbX/vvffM4sWLTUFBgfnpT386\nrvfmhjIAsBxfVQkAliMIAMByBAEAWI4gAADLEQQAYDmCAAAsRxAAgOUIAgCw3P8Dvi5mjwJzDc4A\nAAAASUVORK5CYII=\n", + "png": "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\n", "text": [ - "" + "" ] } ], @@ -218,9 +210,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "You can see that the prediction is 1000-dimensional, and is pretty sparse.\n", "\n", - "Our pretrained model uses the synset ID ordering of the classes, as listed in `../data/ilsvrc12/synset_words.txt` if you fetch the auxiliary imagenet data by `../data/ilsvrc12/get_ilsvrc_aux.sh`. If you look at the top indices that maximize the prediction score, they are foxes, cats, and other cute mammals. Not unreasonable predictions, right?\n", "\n", "Now, why don't we see how long it takes to perform the classification end to end? This result is run from an Intel i5 CPU, so you may observe some performance differences." ] @@ -238,7 +228,7 @@ "output_type": "stream", "stream": "stdout", "text": [ - "1 loops, best of 3: 492 ms per loop\n" + "1 loops, best of 3: 355 ms per loop\n" ] } ], @@ -271,7 +261,7 @@ "output_type": "stream", "stream": "stdout", "text": [ - "1 loops, best of 3: 327 ms per loop\n" + "1 loops, best of 3: 210 ms per loop\n" ] } ], @@ -325,15 +315,15 @@ "output_type": "pyout", "prompt_number": 10, "text": [ - "[]" + "[]" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\n+LICF1LUgWkAAAAASUVORK5CYII=\n", + "png": "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\n8Ytf6Fvf+pZmzpyp6667TpWVlVb2xbDxvvfU9S6Xa0x9krUgGOvNaleaU6dO6bbbbtNjjz2mb37z\nm0nbHA5H2n65UvrslVde0Y033qiysrLz3oxoS18MDg5q3759uvfee7Vv3z5NmTJFDz/8cFIZW/ri\n0KFD+v3vf6/e3l4dOXJEp06d0vMp/ya0LX1xLqO99wuRtSBwuVyKJNx7H4lEkpLsSnT27Fnddttt\nWrdundasWSNpKOX7vvpHez7++GPd+NXtjKn9c/jwYblcrovf6Enwxhtv6OWXX9asWbP0ox/9SDt2\n7NC6deus7Au32y23263y8nJJ0u233659+/bppptusq4v3nrrLX3nO99Rbm6ucnJyVFNTozfffNPK\nvhg2nu+E2+2Wy+XS4cOHk9aPpU+yFgSJN6sNDAyopaVFgUAgW82ZdMYY1dXVad68efrZz34WXx8I\nBPTMM89Ikp555pl4QAQCAW3btk0DAwPq6elRV1eXFi5cmJW2Z9pDDz2kSCSinp4ebdu2Td///vf1\n3HPPWdkXN910k/Lz8/Xhhx9Kktrb2zV//nytXr3aur7wer3as2ePPvvsMxlj1N7ernnz5lnZF8PG\n+5246aabdO2112rv3r0yxui5556L10krEyc4Jmr79u1mzpw5prCw0Dz00EPZbMqk27Vrl3E4HKa0\ntNTcfPPN5uabbzavvvqqOXbsmLn11ltNUVGRqaysNCdOnIjX+d3vfmcKCwvN3LlzTTAYzGLrJ08o\nFIpfNWRrXxw4cMD4/X5TUlJiqqurTX9/v7V90dDQYObNm2cWLFhg7rzzTjMwMGBNX9TW1pq8vDzj\ndDqN2+02Tz755ITe+1tvvWUWLFhgCgsLzX333Tem1+aGMgCwHP+rSgCwHEEAAJYjCADAcgQBAFiO\nIAAAyxEEAGA5ggAALEcQAIDl/h+B3FfVQOwSzQAAAABJRU5ErkJggg==\n", "text": [ - "" + "" ] } ], @@ -343,7 +333,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Good, everything is the same. And how about time consumption? The following benchmark is obtained on the same machine with a K20 GPU:" + "Good, everything is the same. And how about time consumption? The following benchmark is obtained on the same machine with a GTX 770 GPU:" ] }, { @@ -360,7 +350,7 @@ "output_type": "stream", "stream": "stdout", "text": [ - "10 loops, best of 3: 192 ms per loop\n" + "10 loops, best of 3: 174 ms per loop\n" ] } ], @@ -380,7 +370,7 @@ "output_type": "stream", "stream": "stdout", "text": [ - "10 loops, best of 3: 25.2 ms per loop\n" + "10 loops, best of 3: 34.2 ms per loop\n" ] } ], @@ -390,7 +380,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Pretty fast right? Not as fast as you expected? Indeed, in this python demo you are seeing only 4 times speedup. But remember - the GPU code is actually very fast, and the data loading, transformation and interfacing actually start to take **more** time than the actual convnet computation itself!\n", + "Pretty fast right? Not as fast as you expected? Indeed, in this python demo you are seeing only 4 times speedup. But remember - the GPU code is actually very fast, and the data loading, transformation and interfacing actually start to take **more** time than the actual conv. net computation itself!\n", "\n", "To fully utilize the power of GPUs, you really want to:\n", "\n", From a0a5bb180f1b8d9fec5a8dd9523743bc088b47a4 Mon Sep 17 00:00:00 2001 From: netheril96 Date: Tue, 5 Aug 2014 12:57:03 +0800 Subject: [PATCH 0389/2053] convert_imageset now uses gflags; optional arguments can be positioned arbitrarily now --- tools/convert_imageset.cpp | 61 +++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 21ff0d38104..bfbd2a1d542 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -15,6 +15,7 @@ // converted to color. #include +#include #include #include #include @@ -34,53 +35,47 @@ using namespace caffe; // NOLINT(build/namespaces) using std::pair; using std::string; +DEFINE_bool(gray, false, "When this option is on, treat images as grayscale ones; otherwise colored"); +DEFINE_bool(shuffle, false, "Randomly shuffle the order of images and their labels"); +DEFINE_string(backend, "leveldb", "The backend for storing the result"); +DEFINE_int32(resize_width, 0, "Width images are resized to"); +DEFINE_int32(resize_height, 0, "Height images are resized to"); + int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); - if (argc < 4 || argc > 9) { - printf("Convert a set of images to the leveldb format used\n" + gflags::SetUsageMessage("Convert a set of images to the leveldb/lmdb format used\n" "as input for Caffe.\n" "Usage:\n" - " convert_imageset [-g] ROOTFOLDER/ LISTFILE DB_NAME" - " RANDOM_SHUFFLE_DATA[0 or 1] DB_BACKEND[leveldb or lmdb]" - " [resize_height] [resize_width]\n" + " convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME\n" "The ImageNet dataset for the training demo is at\n" " http://www.image-net.org/download-images\n"); + gflags::ParseCommandLineFlags(&argc, &argv, true); + + if (argc != 4) { + fputs("Use --help to see detailed description of usage\n", stdout); return 1; } - // Test whether argv[1] == "-g" - bool is_color= !(string("-g") == string(argv[1])); - int arg_offset = (is_color ? 0 : 1); - std::ifstream infile(argv[arg_offset+2]); + bool is_color = !FLAGS_gray; + std::ifstream infile(argv[2]); std::vector > lines; string filename; int label; while (infile >> filename >> label) { lines.push_back(std::make_pair(filename, label)); } - if (argc >= (arg_offset+5) && argv[arg_offset+4][0] == '1') { + if (FLAGS_shuffle) { // randomly shuffle data LOG(INFO) << "Shuffling data"; shuffle(lines.begin(), lines.end()); } LOG(INFO) << "A total of " << lines.size() << " images."; - string db_backend = "leveldb"; - if (argc >= (arg_offset+6)) { - db_backend = string(argv[arg_offset+5]); - if (!(db_backend == "leveldb") && !(db_backend == "lmdb")) { - LOG(FATAL) << "Unknown db backend " << db_backend; - } - } + const string& db_backend = FLAGS_backend; + const char* db_path = argv[3]; - int resize_height = 0; - int resize_width = 0; - if (argc >= (arg_offset+7)) { - resize_height = atoi(argv[arg_offset+6]); - } - if (argc >= (arg_offset+8)) { - resize_width = atoi(argv[arg_offset+7]); - } + int resize_height = FLAGS_resize_height; + int resize_width = FLAGS_resize_width; // Open new db // lmdb @@ -98,19 +93,19 @@ int main(int argc, char** argv) { // Open db if (db_backend == "leveldb") { // leveldb - LOG(INFO) << "Opening leveldb " << argv[arg_offset+3]; + LOG(INFO) << "Opening leveldb " << db_path; leveldb::Status status = leveldb::DB::Open( - options, argv[arg_offset+3], &db); - CHECK(status.ok()) << "Failed to open leveldb " << argv[arg_offset+3]; + options, db_path, &db); + CHECK(status.ok()) << "Failed to open leveldb " << db_path; batch = new leveldb::WriteBatch(); } else if (db_backend == "lmdb") { // lmdb - LOG(INFO) << "Opening lmdb " << argv[arg_offset+3]; - CHECK_EQ(mkdir(argv[arg_offset+3], 0744), 0) - << "mkdir " << argv[arg_offset+3] << "failed"; + LOG(INFO) << "Opening lmdb " << db_path; + CHECK_EQ(mkdir(db_path, 0744), 0) + << "mkdir " << db_path << "failed"; CHECK_EQ(mdb_env_create(&mdb_env), MDB_SUCCESS) << "mdb_env_create failed"; CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS) // 1TB << "mdb_env_set_mapsize failed"; - CHECK_EQ(mdb_env_open(mdb_env, argv[3], 0, 0664), MDB_SUCCESS) + CHECK_EQ(mdb_env_open(mdb_env, db_path, 0, 0664), MDB_SUCCESS) << "mdb_env_open failed"; CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) << "mdb_txn_begin failed"; @@ -121,7 +116,7 @@ int main(int argc, char** argv) { } // Storing to db - string root_folder(argv[arg_offset+1]); + string root_folder(argv[1]); Datum datum; int count = 0; const int kMaxKeyLength = 256; From 42ebee599ba39884342e472f0355c0fc78e22d5c Mon Sep 17 00:00:00 2001 From: netheril96 Date: Tue, 5 Aug 2014 13:07:28 +0800 Subject: [PATCH 0390/2053] Handles gflags's change of namespace --- tools/convert_imageset.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index bfbd2a1d542..976f1b546c7 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -43,6 +43,11 @@ DEFINE_int32(resize_height, 0, "Height images are resized to"); int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); + +#ifndef GFLAGS_GFLAGS_H_ + namespace gflags = google; +#endif + gflags::SetUsageMessage("Convert a set of images to the leveldb/lmdb format used\n" "as input for Caffe.\n" "Usage:\n" @@ -74,8 +79,8 @@ int main(int argc, char** argv) { const string& db_backend = FLAGS_backend; const char* db_path = argv[3]; - int resize_height = FLAGS_resize_height; - int resize_width = FLAGS_resize_width; + int resize_height = std::max(0, FLAGS_resize_height); + int resize_width = std::max(0, FLAGS_resize_width); // Open new db // lmdb From e1d6655480714f8d381ad9b38aabe2e264dcfb3d Mon Sep 17 00:00:00 2001 From: netheril96 Date: Tue, 5 Aug 2014 13:15:22 +0800 Subject: [PATCH 0391/2053] Fix lint errors --- tools/convert_imageset.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 976f1b546c7..70f57d6ec6a 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -35,8 +35,10 @@ using namespace caffe; // NOLINT(build/namespaces) using std::pair; using std::string; -DEFINE_bool(gray, false, "When this option is on, treat images as grayscale ones; otherwise colored"); -DEFINE_bool(shuffle, false, "Randomly shuffle the order of images and their labels"); +DEFINE_bool(gray, false, + "When this option is on, treat images as grayscale ones"); +DEFINE_bool(shuffle, false, + "Randomly shuffle the order of images and their labels"); DEFINE_string(backend, "leveldb", "The backend for storing the result"); DEFINE_int32(resize_width, 0, "Width images are resized to"); DEFINE_int32(resize_height, 0, "Height images are resized to"); @@ -47,9 +49,9 @@ int main(int argc, char** argv) { #ifndef GFLAGS_GFLAGS_H_ namespace gflags = google; #endif - - gflags::SetUsageMessage("Convert a set of images to the leveldb/lmdb format used\n" - "as input for Caffe.\n" + + gflags::SetUsageMessage("Convert a set of images to the leveldb/lmdb\n" + "format used as input for Caffe.\n" "Usage:\n" " convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME\n" "The ImageNet dataset for the training demo is at\n" From 75f293871213b705df027d4a16d3584df92bd137 Mon Sep 17 00:00:00 2001 From: netheril96 Date: Wed, 6 Aug 2014 10:38:26 +0800 Subject: [PATCH 0392/2053] Reordering of header includes for convert_imageset.cpp --- tools/convert_imageset.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 70f57d6ec6a..b628a357185 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -14,8 +14,8 @@ // single-channel grayscale. If omitted, grayscale images will be // converted to color. -#include #include +#include #include #include #include From d5c3cef47155b5c2aad146465187364a2b41fd99 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 31 Jul 2014 16:19:20 -0700 Subject: [PATCH 0393/2053] fix pycaffe input processing - load an image as [0,1] single / np.float32 according to Python convention - fix input scaling during preprocessing: - scale input for preprocessing by `raw_scale` e.g. to map an image to [0, 255] for the CaffeNet and AlexNet ImageNet models - scale feature space by `input_scale` after mean subtraction - switch examples to raw scale for ImageNet models - fix #525 - preserve type after resizing. - resize 1, 3, or K channel images with special casing between skimage.transform (1 and 3) and scipy.ndimage (K) for speed --- examples/detection.ipynb | 2 +- examples/filter_visualization.ipynb | 19 +++------ examples/imagenet_classification.ipynb | 4 +- examples/net_surgery.ipynb | 4 +- python/caffe/_caffe.cpp | 2 + python/caffe/classifier.py | 15 +++++--- python/caffe/detector.py | 17 +++++---- python/caffe/io.py | 18 +++++++-- python/caffe/pycaffe.py | 53 ++++++++++++++++++-------- python/classify.py | 8 +++- python/detect.py | 11 ++++-- 11 files changed, 98 insertions(+), 55 deletions(-) diff --git a/examples/detection.ipynb b/examples/detection.ipynb index 3f2cf71ac57..3b0a5b2e705 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -36,7 +36,7 @@ "input": [ "!mkdir -p _temp\n", "!echo `pwd`/images/fish-bike.jpg > _temp/det_input.txt\n", - "!../python/detect.py --crop_mode=selective_search --pretrained_model=imagenet/caffe_rcnn_imagenet_model --model_def=imagenet/rcnn_imagenet_deploy.prototxt --gpu _temp/det_input.txt _temp/det_output.h5" + "!../python/detect.py --crop_mode=selective_search --pretrained_model=imagenet/caffe_rcnn_imagenet_model --model_def=imagenet/rcnn_imagenet_deploy.prototxt --gpu --raw_scale=255 _temp/det_input.txt _temp/det_output.h5" ], "language": "python", "metadata": {}, diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index 0fe863bc7e5..ea99f06b148 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -66,8 +66,8 @@ "net.set_mode_cpu()\n", "# input preprocessing: 'data' is the name of the input blob == net.inputs[0]\n", "net.set_mean('data', caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy') # ImageNet mean\n", - "net.set_channel_swap('data', (2,1,0)) # the reference model has channels in BGR order instead of RGB\n", - "net.set_input_scale('data', 255) # the reference model operates on images in [0,255] range instead of [0,1]" + "net.set_raw_scale('data', 255) # the reference model operates on images in [0,255] range instead of [0,1]\n", + "net.set_channel_swap('data', (2,1,0)) # the reference model has channels in BGR order instead of RGB" ], "language": "python", "metadata": {}, @@ -178,12 +178,6 @@ "cell_type": "code", "collapsed": false, "input": [ - "# our network takes BGR images, so we need to switch color channels\n", - "def showimage(im):\n", - " if im.ndim == 3:\n", - " im = im[:, :, ::-1]\n", - " plt.imshow(im)\n", - " \n", "# take an array of shape (n, height, width) or (n, height, width, channels)\n", "# and visualize each (height, width) thing in a grid of size approx. sqrt(n) by sqrt(n)\n", "def vis_square(data, padsize=1, padval=0):\n", @@ -199,7 +193,7 @@ " data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))\n", " data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])\n", " \n", - " showimage(data)" + " imshow(data)" ], "language": "python", "metadata": {}, @@ -218,10 +212,7 @@ "collapsed": false, "input": [ "# index four is the center crop\n", - "image = net.blobs['data'].data[4].copy()\n", - "image -= image.min()\n", - "image /= image.max()\n", - "showimage(image.transpose(1, 2, 0))" + "imshow(net.deprocess('data', net.blobs['data'].data[4]))" ], "language": "python", "metadata": {}, @@ -606,4 +597,4 @@ "metadata": {} } ] -} \ No newline at end of file +} diff --git a/examples/imagenet_classification.ipynb b/examples/imagenet_classification.ipynb index 8ab65fda02f..60e8bd070fb 100644 --- a/examples/imagenet_classification.ipynb +++ b/examples/imagenet_classification.ipynb @@ -53,7 +53,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Loading a network is easy. `caffe.Classifier` takes care of everything. Note the arguments for configuring input preprocessing: mean subtraction switched on by giving a mean file, input channel swapping takes care of mapping RGB into the reference ImageNet model's BGR order, and input scaling multiplies the feature scale from the input [0,1] to [0,255]." + "Loading a network is easy. `caffe.Classifier` takes care of everything. Note the arguments for configuring input preprocessing: mean subtraction switched on by giving a mean file, input channel swapping takes care of mapping RGB into the reference ImageNet model's BGR order, and raw scaling multiplies the feature scale from the input [0,1] to the ImageNet model's [0,255]." ] }, { @@ -63,7 +63,7 @@ "net = caffe.Classifier(MODEL_FILE, PRETRAINED,\n", " mean_file=caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy',\n", " channel_swap=(2,1,0),\n", - " input_scale=255,\n", + " raw_scale=255,\n", " image_dims=(256, 256))" ], "language": "python", diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index bf3d1140559..31847b2418e 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -277,7 +277,7 @@ "plt.imshow(im)\n", "net_full_conv.set_mean('data', '../python/caffe/imagenet/ilsvrc_2012_mean.npy')\n", "net_full_conv.set_channel_swap('data', (2,1,0))\n", - "net_full_conv.set_input_scale('data', 255.0)\n", + "net_full_conv.set_raw_scale('data', 255.0)\n", "# make classification map by forward pass and show top prediction index per location\n", "out = net_full_conv.forward_all(data=np.asarray([net_full_conv.preprocess('data', im)]))\n", "out['prob'][0].argmax(axis=0)" @@ -331,4 +331,4 @@ "metadata": {} } ] -} \ No newline at end of file +} diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 30c86aeb384..59317727914 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -278,6 +278,7 @@ struct CaffeNet { // Input preprocessing configuration attributes. dict mean_; dict input_scale_; + dict raw_scale_; dict channel_swap_; // if taking input from an ndarray, we need to hold references object input_data_; @@ -329,6 +330,7 @@ BOOST_PYTHON_MODULE(_caffe) { .add_property("outputs", &CaffeNet::outputs) .add_property("mean", &CaffeNet::mean_) .add_property("input_scale", &CaffeNet::input_scale_) + .add_property("raw_scale", &CaffeNet::raw_scale_) .add_property("channel_swap", &CaffeNet::channel_swap_) .def("_set_input_arrays", &CaffeNet::set_input_arrays) .def("save", &CaffeNet::save); diff --git a/python/caffe/classifier.py b/python/caffe/classifier.py index f347be42a93..48835bab842 100644 --- a/python/caffe/classifier.py +++ b/python/caffe/classifier.py @@ -14,13 +14,14 @@ class Classifier(caffe.Net): by scaling, center cropping, or oversampling. """ def __init__(self, model_file, pretrained_file, image_dims=None, - gpu=False, mean_file=None, input_scale=None, channel_swap=None): + gpu=False, mean_file=None, input_scale=None, raw_scale=None, + channel_swap=None): """ Take image_dims: dimensions to scale input for cropping/sampling. - Default is to scale to net input size for whole-image crop. - gpu, mean_file, input_scale, channel_swap: convenience params for - setting mode, mean, input scale, and channel order. + Default is to scale to net input size for whole-image crop. + gpu, mean_file, input_scale, raw_scale, channel_swap: params for + preprocessing options. """ caffe.Net.__init__(self, model_file, pretrained_file) self.set_phase_test() @@ -32,9 +33,11 @@ def __init__(self, model_file, pretrained_file, image_dims=None, if mean_file: self.set_mean(self.inputs[0], mean_file) - if input_scale: + if input_scale is not None: self.set_input_scale(self.inputs[0], input_scale) - if channel_swap: + if raw_scale is not None: + self.set_raw_scale(self.inputs[0], raw_scale) + if channel_swap is not None: self.set_channel_swap(self.inputs[0], channel_swap) self.crop_dims = np.array(self.blobs[self.inputs[0]].data.shape[2:]) diff --git a/python/caffe/detector.py b/python/caffe/detector.py index 56c26aefd45..a9b06cd17c7 100644 --- a/python/caffe/detector.py +++ b/python/caffe/detector.py @@ -25,11 +25,12 @@ class Detector(caffe.Net): selective search proposals. """ def __init__(self, model_file, pretrained_file, gpu=False, mean_file=None, - input_scale=None, channel_swap=None, context_pad=None): + input_scale=None, raw_scale=None, channel_swap=None, + context_pad=None): """ Take - gpu, mean_file, input_scale, channel_swap: convenience params for - setting mode, mean, input scale, and channel order. + gpu, mean_file, input_scale, raw_scale, channel_swap: params for + preprocessing options. context_pad: amount of surrounding context to take s.t. a `context_pad` sized border of pixels in the network input image is context, as in R-CNN feature extraction. @@ -44,9 +45,11 @@ def __init__(self, model_file, pretrained_file, gpu=False, mean_file=None, if mean_file: self.set_mean(self.inputs[0], mean_file) - if input_scale: + if input_scale is not None: self.set_input_scale(self.inputs[0], input_scale) - if channel_swap: + if raw_scale is not None: + self.set_raw_scale(self.inputs[0], raw_scale) + if channel_swap is not None: self.set_channel_swap(self.inputs[0], channel_swap) self.configure_crop(context_pad) @@ -180,7 +183,7 @@ def configure_crop(self, context_pad): """ self.context_pad = context_pad if self.context_pad: - input_scale = self.input_scale.get(self.inputs[0]) + raw_scale = self.raw_scale.get(self.inputs[0]) channel_order = self.channel_swap.get(self.inputs[0]) # Padding context crops needs the mean in unprocessed input space. self.crop_mean = self.mean[self.inputs[0]].copy() @@ -188,4 +191,4 @@ def configure_crop(self, context_pad): channel_order_inverse = [channel_order.index(i) for i in range(self.crop_mean.shape[2])] self.crop_mean = self.crop_mean[:,:, channel_order_inverse] - self.crop_mean /= input_scale + self.crop_mean /= raw_scale diff --git a/python/caffe/io.py b/python/caffe/io.py index 1fc97231ca6..aabcfddbbeb 100644 --- a/python/caffe/io.py +++ b/python/caffe/io.py @@ -1,6 +1,7 @@ import numpy as np import skimage.io -import skimage.transform +from scipy.ndimage import zoom +from skimage.transform import resize from caffe.proto import caffe_pb2 @@ -15,7 +16,8 @@ def load_image(filename, color=True): loads as intensity (if image is already grayscale). Give - image: an image with type np.float32 of size (H x W x 3) in RGB or + image: an image with type np.float32 in range [0, 1] + of size (H x W x 3) in RGB or of size (H x W x 1) in grayscale. """ img = skimage.img_as_float(skimage.io.imread(filename)).astype(np.float32) @@ -40,7 +42,17 @@ def resize_image(im, new_dims, interp_order=1): Give im: resized ndarray with shape (new_dims[0], new_dims[1], K) """ - return skimage.transform.resize(im, new_dims, order=interp_order) + if im.shape[-1] == 1 or im.shape[-1] == 3: + # skimage is fast but only understands {1,3} channel images in [0, 1]. + im_min, im_max = im.min(), im.max() + im_std = (im - im_min) / (im_max - im_min) + resized_std = resize(im_std, new_dims, order=interp_order) + resized_im = resized_std * (im_max - im_min) + im_min + else: + # ndimage interpolates anything but more slowly. + scale = tuple(np.array(new_dims) / np.array(im.shape[:2])) + resized_im = zoom(im, scale + (1,), order=interp_order) + return resized_im.astype(np.float32) def oversample(images, crop_dims): diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 64747f30483..43648d0af34 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -216,12 +216,10 @@ def _Net_set_mean(self, input_, mean_f, mode='elementwise'): in_shape = self.blobs[input_].data.shape mean = np.load(mean_f) if mode == 'elementwise': - if mean.shape != in_shape[1:]: - # Resize mean (which requires H x W x K input in range [0,1]). - m_min, m_max = mean.min(), mean.max() - normal_mean = (mean - m_min) / (m_max - m_min) - mean = caffe.io.resize_image(normal_mean.transpose((1,2,0)), - in_shape[2:]).transpose((2,0,1)) * (m_max - m_min) + m_min + if mean.shape[1:] != in_shape[2:]: + # Resize mean (which requires H x W x K input). + mean = caffe.io.resize_image(mean.transpose((1,2,0)), + in_shape[2:]).transpose((2,0,1)) self.mean[input_] = mean elif mode == 'channel': self.mean[input_] = mean.mean(1).mean(1).reshape((in_shape[1], 1, 1)) @@ -229,10 +227,11 @@ def _Net_set_mean(self, input_, mean_f, mode='elementwise'): raise Exception('Mode not in {}'.format(['elementwise', 'channel'])) - def _Net_set_input_scale(self, input_, scale): """ - Set the input feature scaling factor s.t. input blob = input * scale. + Set the scale of preprocessed inputs s.t. the blob = blob * scale. + N.B. input_scale is done AFTER mean subtraction and other preprocessing + while raw_scale is done BEFORE. Take input_: which input to assign this scale factor @@ -243,6 +242,22 @@ def _Net_set_input_scale(self, input_, scale): self.input_scale[input_] = scale +def _Net_set_raw_scale(self, input_, scale): + """ + Set the scale of raw features s.t. the input blob = input * scale. + While Python represents images in [0, 1], certain Caffe models + like CaffeNet and AlexNet represent images in [0, 255] so the raw_scale + of these models must be 255. + + Take + input_: which input to assign this scale factor + scale: scale coefficient + """ + if input_ not in self.inputs: + raise Exception('Input not in {}'.format(self.inputs)) + self.raw_scale[input_] = scale + + def _Net_set_channel_swap(self, input_, order): """ Set the input channel order for e.g. RGB to BGR conversion @@ -263,10 +278,11 @@ def _Net_preprocess(self, input_name, input_): Format input for Caffe: - convert to single - resize to input dimensions (preserving number of channels) - - scale feature - reorder channels (for instance color to BGR) - - subtract mean + - scale raw input (e.g. from [0, 1] to [0, 255] for ImageNet models) - transpose dimensions to K x H x W + - subtract mean + - scale feature Take input_name: name of input blob to preprocess for @@ -275,20 +291,23 @@ def _Net_preprocess(self, input_name, input_): Give caffe_inputs: (K x H x W) ndarray """ - caffe_in = input_.astype(np.float32) + caffe_in = input_.astype(np.float32, copy=False) mean = self.mean.get(input_name) input_scale = self.input_scale.get(input_name) + raw_scale = self.raw_scale.get(input_name) channel_order = self.channel_swap.get(input_name) in_size = self.blobs[input_name].data.shape[2:] if caffe_in.shape[:2] != in_size: caffe_in = caffe.io.resize_image(caffe_in, in_size) - if input_scale is not None: - caffe_in *= input_scale if channel_order is not None: caffe_in = caffe_in[:, :, channel_order] caffe_in = caffe_in.transpose((2, 0, 1)) + if raw_scale is not None: + caffe_in *= raw_scale if mean is not None: caffe_in -= mean + if input_scale is not None: + caffe_in *= input_scale return caffe_in @@ -299,16 +318,19 @@ def _Net_deprocess(self, input_name, input_): decaf_in = input_.copy().squeeze() mean = self.mean.get(input_name) input_scale = self.input_scale.get(input_name) + raw_scale = self.raw_scale.get(input_name) channel_order = self.channel_swap.get(input_name) + if input_scale is not None: + decaf_in /= input_scale if mean is not None: decaf_in += mean + if raw_scale is not None: + decaf_in /= raw_scale decaf_in = decaf_in.transpose((1,2,0)) if channel_order is not None: channel_order_inverse = [channel_order.index(i) for i in range(decaf_in.shape[2])] decaf_in = decaf_in[:, :, channel_order_inverse] - if input_scale is not None: - decaf_in /= input_scale return decaf_in @@ -364,6 +386,7 @@ def _Net_batch(self, blobs): Net.forward_backward_all = _Net_forward_backward_all Net.set_mean = _Net_set_mean Net.set_input_scale = _Net_set_input_scale +Net.set_raw_scale = _Net_set_raw_scale Net.set_channel_swap = _Net_set_channel_swap Net.preprocess = _Net_preprocess Net.deprocess = _Net_deprocess diff --git a/python/classify.py b/python/classify.py index fdaeeb01be4..417f8b5442c 100755 --- a/python/classify.py +++ b/python/classify.py @@ -66,8 +66,12 @@ def main(argv): parser.add_argument( "--input_scale", type=float, - default=255, - help="Multiply input features by this scale before input to net" + help="Multiply input features by this scale to finish input preprocessing." + ) + parser.add_argument( + "--raw_scale", + type=float, + help="Multiply raw input by this scale before preprocessing." ) parser.add_argument( "--channel_swap", diff --git a/python/detect.py b/python/detect.py index a3bee5c5cf8..4cfe0825dd9 100755 --- a/python/detect.py +++ b/python/detect.py @@ -76,8 +76,12 @@ def main(argv): parser.add_argument( "--input_scale", type=float, - default=255, - help="Multiply input features by this scale before input to net" + help="Multiply input features by this scale to finish input preprocessing." + ) + parser.add_argument( + "--raw_scale", + type=float, + help="Multiply raw input by this scale before preprocessing." ) parser.add_argument( "--channel_swap", @@ -99,7 +103,8 @@ def main(argv): # Make detector. detector = caffe.Detector(args.model_def, args.pretrained_model, gpu=args.gpu, mean_file=args.mean_file, - input_scale=args.input_scale, channel_swap=channel_swap, + input_scale=args.input_scale, raw_scale=args.raw_scale, + channel_swap=channel_swap, context_pad=args.context_pad) if args.gpu: From e1b3413708ffc51f5ccc07f9c81f748fc36864c0 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 1 Aug 2014 17:55:30 -0700 Subject: [PATCH 0394/2053] take array in pycaffe `Net.set_mean()` instead of file path --- examples/filter_visualization.ipynb | 2 +- examples/imagenet_classification.ipynb | 4 ++-- examples/net_surgery.ipynb | 2 +- python/caffe/classifier.py | 8 ++++---- python/caffe/detector.py | 8 ++++---- python/caffe/pycaffe.py | 5 ++--- python/classify.py | 13 +++++++++---- python/detect.py | 8 ++++++-- 8 files changed, 29 insertions(+), 21 deletions(-) diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index ea99f06b148..bbc919ba68b 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -65,7 +65,7 @@ "net.set_phase_test()\n", "net.set_mode_cpu()\n", "# input preprocessing: 'data' is the name of the input blob == net.inputs[0]\n", - "net.set_mean('data', caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy') # ImageNet mean\n", + "net.set_mean('data', np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy')) # ImageNet mean\n", "net.set_raw_scale('data', 255) # the reference model operates on images in [0,255] range instead of [0,1]\n", "net.set_channel_swap('data', (2,1,0)) # the reference model has channels in BGR order instead of RGB" ], diff --git a/examples/imagenet_classification.ipynb b/examples/imagenet_classification.ipynb index 60e8bd070fb..fc08c743093 100644 --- a/examples/imagenet_classification.ipynb +++ b/examples/imagenet_classification.ipynb @@ -53,7 +53,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Loading a network is easy. `caffe.Classifier` takes care of everything. Note the arguments for configuring input preprocessing: mean subtraction switched on by giving a mean file, input channel swapping takes care of mapping RGB into the reference ImageNet model's BGR order, and raw scaling multiplies the feature scale from the input [0,1] to the ImageNet model's [0,255]." + "Loading a network is easy. `caffe.Classifier` takes care of everything. Note the arguments for configuring input preprocessing: mean subtraction switched on by giving a mean array, input channel swapping takes care of mapping RGB into the reference ImageNet model's BGR order, and raw scaling multiplies the feature scale from the input [0,1] to the ImageNet model's [0,255]." ] }, { @@ -61,7 +61,7 @@ "collapsed": false, "input": [ "net = caffe.Classifier(MODEL_FILE, PRETRAINED,\n", - " mean_file=caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy',\n", + " mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy'),\n", " channel_swap=(2,1,0),\n", " raw_scale=255,\n", " image_dims=(256, 256))" diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 31847b2418e..5f151e4be3a 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -275,7 +275,7 @@ "# load input and configure preprocessing\n", "im = caffe.io.load_image('images/cat.jpg')\n", "plt.imshow(im)\n", - "net_full_conv.set_mean('data', '../python/caffe/imagenet/ilsvrc_2012_mean.npy')\n", + "net_full_conv.set_mean('data', np.load('../python/caffe/imagenet/ilsvrc_2012_mean.npy'))\n", "net_full_conv.set_channel_swap('data', (2,1,0))\n", "net_full_conv.set_raw_scale('data', 255.0)\n", "# make classification map by forward pass and show top prediction index per location\n", diff --git a/python/caffe/classifier.py b/python/caffe/classifier.py index 48835bab842..61e916ccb44 100644 --- a/python/caffe/classifier.py +++ b/python/caffe/classifier.py @@ -14,13 +14,13 @@ class Classifier(caffe.Net): by scaling, center cropping, or oversampling. """ def __init__(self, model_file, pretrained_file, image_dims=None, - gpu=False, mean_file=None, input_scale=None, raw_scale=None, + gpu=False, mean=None, input_scale=None, raw_scale=None, channel_swap=None): """ Take image_dims: dimensions to scale input for cropping/sampling. Default is to scale to net input size for whole-image crop. - gpu, mean_file, input_scale, raw_scale, channel_swap: params for + gpu, mean, input_scale, raw_scale, channel_swap: params for preprocessing options. """ caffe.Net.__init__(self, model_file, pretrained_file) @@ -31,8 +31,8 @@ def __init__(self, model_file, pretrained_file, image_dims=None, else: self.set_mode_cpu() - if mean_file: - self.set_mean(self.inputs[0], mean_file) + if mean is not None: + self.set_mean(self.inputs[0], mean) if input_scale is not None: self.set_input_scale(self.inputs[0], input_scale) if raw_scale is not None: diff --git a/python/caffe/detector.py b/python/caffe/detector.py index a9b06cd17c7..ccb5a1f24f2 100644 --- a/python/caffe/detector.py +++ b/python/caffe/detector.py @@ -24,12 +24,12 @@ class Detector(caffe.Net): Detector extends Net for windowed detection by a list of crops or selective search proposals. """ - def __init__(self, model_file, pretrained_file, gpu=False, mean_file=None, + def __init__(self, model_file, pretrained_file, gpu=False, mean=None, input_scale=None, raw_scale=None, channel_swap=None, context_pad=None): """ Take - gpu, mean_file, input_scale, raw_scale, channel_swap: params for + gpu, mean, input_scale, raw_scale, channel_swap: params for preprocessing options. context_pad: amount of surrounding context to take s.t. a `context_pad` sized border of pixels in the network input image is context, as in @@ -43,8 +43,8 @@ def __init__(self, model_file, pretrained_file, gpu=False, mean_file=None, else: self.set_mode_cpu() - if mean_file: - self.set_mean(self.inputs[0], mean_file) + if mean is not None: + self.set_mean(self.inputs[0], mean) if input_scale is not None: self.set_input_scale(self.inputs[0], input_scale) if raw_scale is not None: diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 43648d0af34..9a230a72b3c 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -201,20 +201,19 @@ def _Net_forward_backward_all(self, blobs=None, diffs=None, **kwargs): return all_outs, all_diffs -def _Net_set_mean(self, input_, mean_f, mode='elementwise'): +def _Net_set_mean(self, input_, mean, mode='elementwise'): """ Set the mean to subtract for data centering. Take input_: which input to assign this mean. - mean_f: path to mean .npy with ndarray (input dimensional or broadcastable) + mean: mean K x H x W ndarray (input dimensional or broadcastable) mode: elementwise = use the whole mean (and check dimensions) channel = channel constant (e.g. mean pixel instead of mean image) """ if input_ not in self.inputs: raise Exception('Input not in {}'.format(self.inputs)) in_shape = self.blobs[input_].data.shape - mean = np.load(mean_f) if mode == 'elementwise': if mean.shape[1:] != in_shape[2:]: # Resize mean (which requires H x W x K input). diff --git a/python/classify.py b/python/classify.py index 417f8b5442c..d3d239cbb7d 100755 --- a/python/classify.py +++ b/python/classify.py @@ -78,7 +78,6 @@ def main(argv): default='2,1,0', help="Order to permute input channels. The default converts " + "RGB -> BGR since BGR is the Caffe default by way of OpenCV." - ) parser.add_argument( "--ext", @@ -89,12 +88,18 @@ def main(argv): args = parser.parse_args() image_dims = [int(s) for s in args.images_dim.split(',')] - channel_swap = [int(s) for s in args.channel_swap.split(',')] + + mean, channel_swap = None, None + if args.mean_file: + mean = np.load(args.mean_file) + if args.channel_swap: + channel_swap = [int(s) for s in args.channel_swap.split(',')] # Make classifier. classifier = caffe.Classifier(args.model_def, args.pretrained_model, - image_dims=image_dims, gpu=args.gpu, mean_file=args.mean_file, - input_scale=args.input_scale, channel_swap=channel_swap) + image_dims=image_dims, gpu=args.gpu, mean=mean, + input_scale=args.input_scale, raw_scale=args.raw_scale, + channel_swap=channel_swap) if args.gpu: print 'GPU mode' diff --git a/python/detect.py b/python/detect.py index 4cfe0825dd9..77f4676aec1 100755 --- a/python/detect.py +++ b/python/detect.py @@ -98,11 +98,15 @@ def main(argv): ) args = parser.parse_args() - channel_swap = [int(s) for s in args.channel_swap.split(',')] + mean, channel_swap = None, None + if args.mean_file: + mean = np.load(args.mean_file) + if args.channel_swap: + channel_swap = [int(s) for s in args.channel_swap.split(',')] # Make detector. detector = caffe.Detector(args.model_def, args.pretrained_model, - gpu=args.gpu, mean_file=args.mean_file, + gpu=args.gpu, mean=mean, input_scale=args.input_scale, raw_scale=args.raw_scale, channel_swap=channel_swap, context_pad=args.context_pad) From 4f7726916cb965c79975c44e833e71347fa1822c Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 1 Aug 2014 18:46:17 -0700 Subject: [PATCH 0395/2053] fix pycaffe context cropping with or without mean --- python/caffe/detector.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/python/caffe/detector.py b/python/caffe/detector.py index ccb5a1f24f2..2fc23db0c04 100644 --- a/python/caffe/detector.py +++ b/python/caffe/detector.py @@ -186,9 +186,16 @@ def configure_crop(self, context_pad): raw_scale = self.raw_scale.get(self.inputs[0]) channel_order = self.channel_swap.get(self.inputs[0]) # Padding context crops needs the mean in unprocessed input space. - self.crop_mean = self.mean[self.inputs[0]].copy() - self.crop_mean = self.crop_mean.transpose((1,2,0)) - channel_order_inverse = [channel_order.index(i) - for i in range(self.crop_mean.shape[2])] - self.crop_mean = self.crop_mean[:,:, channel_order_inverse] - self.crop_mean /= raw_scale + mean = self.mean.get(self.inputs[0]) + if mean is not None: + crop_mean = mean.copy().transpose((1,2,0)) + if channel_order is not None: + channel_order_inverse = [channel_order.index(i) + for i in range(crop_mean.shape[2])] + crop_mean = crop_mean[:,:, channel_order_inverse] + if raw_scale is not None: + crop_mean /= raw_scale + self.crop_mean = crop_mean + else: + self.crop_mean = np.zeros(self.blobs[self.inputs[0]].data.shape, + dtype=np.float32) From 0db94786a7a463fed49825811fac903f1f1fc3c8 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 5 Aug 2014 10:14:35 -0700 Subject: [PATCH 0396/2053] drop np.asarray() in favor of declaration (~1.75x speedup) --- python/caffe/classifier.py | 17 +++++++++++------ python/caffe/detector.py | 7 +++++-- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/python/caffe/classifier.py b/python/caffe/classifier.py index 61e916ccb44..fe471ca13b1 100644 --- a/python/caffe/classifier.py +++ b/python/caffe/classifier.py @@ -60,12 +60,15 @@ def predict(self, inputs, oversample=True): for N images and C classes. """ # Scale to standardize input dimensions. - inputs = np.asarray([caffe.io.resize_image(im, self.image_dims) - for im in inputs]) + input_ = np.zeros((len(inputs), + self.image_dims[0], self.image_dims[1], inputs[0].shape[2]), + dtype=np.float32) + for ix, in_ in enumerate(inputs): + input_[ix] = caffe.io.resize_image(in_, self.image_dims) if oversample: # Generate center, corner, and mirrored crops. - inputs = caffe.io.oversample(inputs, self.crop_dims) + input_ = caffe.io.oversample(input_, self.crop_dims) else: # Take center crop. center = np.array(self.image_dims) / 2.0 @@ -73,11 +76,13 @@ def predict(self, inputs, oversample=True): -self.crop_dims / 2.0, self.crop_dims / 2.0 ]) - inputs = inputs[:, crop[0]:crop[2], crop[1]:crop[3], :] + input_ = input_[:, crop[0]:crop[2], crop[1]:crop[3], :] # Classify - caffe_in = np.asarray([self.preprocess(self.inputs[0], in_) - for in_ in inputs]) + caffe_in = np.zeros(np.array(input_.shape)[[0,3,1,2]], + dtype=np.float32) + for ix, in_ in enumerate(input_): + caffe_in[ix] = self.preprocess(self.inputs[0], in_) out = self.forward_all(**{self.inputs[0]: caffe_in}) predictions = out[self.outputs[0]].squeeze(axis=(2,3)) diff --git a/python/caffe/detector.py b/python/caffe/detector.py index 2fc23db0c04..f219b6105e1 100644 --- a/python/caffe/detector.py +++ b/python/caffe/detector.py @@ -76,8 +76,11 @@ def detect_windows(self, images_windows): window_inputs.append(self.crop(image, window)) # Run through the net (warping windows to input dimensions). - caffe_in = np.asarray([self.preprocess(self.inputs[0], window_in) - for window_in in window_inputs]) + caffe_in = np.zeros((len(window_inputs), window_inputs[0].shape[2]) + + self.blobs[self.inputs[0]].data.shape[2:], + dtype=np.float32) + for ix, window_in in enumerate(window_inputs): + caffe_in[ix] = self.preprocess(self.inputs[0], window_in) out = self.forward_all(**{self.inputs[0]: caffe_in}) predictions = out[self.outputs[0]].squeeze(axis=(2,3)) From 9410e93480f232e9bcce052414b268d8b8b6af3a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 00:16:36 -0700 Subject: [PATCH 0397/2053] clarify the license and copyright terms of the project As has been the case, contributions are copyright their respective contributors and the project is BSD-2 licensed. By contributing to the project, contributors release their contributions under these copyright and license terms as declared in LICENSE. --- CONTRIBUTORS.md | 2 ++ LICENSE | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 2de2a717eff..8db66ea82c6 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -15,3 +15,5 @@ to see line-by-line credits and to see the change log even across renames and rewrites. Please refer to the [acknowledgements](http://caffe.berkeleyvision.org/#acknowledgements) on the Caffe site for further details. + +**Copyright** is held by the original contributor according to the versioning history; see LICENSE. diff --git a/LICENSE b/LICENSE index bac9c99fd41..efcc5c5b6b0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,22 @@ +COPYRIGHT + +All contributions by the University of California: Copyright (c) 2014, The Regents of the University of California (Regents) All rights reserved. +All other contributions: +Copyright (c) 2014, the respective contributors +All rights reserved. + +Caffe uses a shared copyright model: each contributor holds copyright over +their contributions to Caffe. The project versioning records all such +contribution and copyright details. If a contributor wants to further mark +their specific copyright on a particular contribution, they should indicate +their copyright solely in the commit message of the change when it is +committed. + +LICENSE + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -20,3 +36,9 @@ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +CONTRIBUTION AGREEMENT + +By contributing to the BVLC/caffe repository through pull-request, comment, +or otherwise, the contributor releases their content to the +license and copyright terms herein. From b97b88f0c2b7e32ab9e17d4325ef6bc4251c0cc8 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 00:43:17 -0700 Subject: [PATCH 0398/2053] LICENSE governs the whole project so strip file headers --- examples/cifar10/convert_cifar_data.cpp | 1 - examples/mnist/convert_mnist_data.cpp | 1 - include/caffe/blob.hpp | 2 -- include/caffe/caffe.hpp | 1 - include/caffe/common.hpp | 2 -- include/caffe/common_layers.hpp | 2 -- include/caffe/data_layers.hpp | 2 -- include/caffe/filler.hpp | 2 -- include/caffe/internal_thread.hpp | 4 +--- include/caffe/layer.hpp | 2 -- include/caffe/loss_layers.hpp | 2 -- include/caffe/net.hpp | 2 -- include/caffe/neuron_layers.hpp | 6 ++---- include/caffe/solver.hpp | 2 -- include/caffe/syncedmem.hpp | 2 -- include/caffe/test/test_caffe_main.hpp | 2 -- include/caffe/test/test_gradient_check_util.hpp | 2 -- include/caffe/util/benchmark.hpp | 2 -- include/caffe/util/device_alternate.hpp | 2 -- include/caffe/util/im2col.hpp | 2 -- include/caffe/util/insert_splits.hpp | 2 -- include/caffe/util/io.hpp | 2 -- include/caffe/util/math_functions.hpp | 2 -- include/caffe/util/mkl_alternate.hpp | 2 -- include/caffe/util/rng.hpp | 2 -- include/caffe/util/upgrade_proto.hpp | 2 -- include/caffe/vision_layers.hpp | 2 -- matlab/caffe/matcaffe.cpp | 1 - python/caffe/_caffe.cpp | 1 - src/caffe/blob.cpp | 2 -- src/caffe/common.cpp | 2 -- src/caffe/layer_factory.cpp | 2 -- src/caffe/layers/accuracy_layer.cpp | 2 -- src/caffe/layers/argmax_layer.cpp | 2 -- src/caffe/layers/bnll_layer.cpp | 2 -- src/caffe/layers/bnll_layer.cu | 2 -- src/caffe/layers/concat_layer.cpp | 2 -- src/caffe/layers/concat_layer.cu | 2 -- src/caffe/layers/conv_layer.cpp | 2 -- src/caffe/layers/conv_layer.cu | 2 -- src/caffe/layers/data_layer.cpp | 2 -- src/caffe/layers/data_layer.cu | 2 -- src/caffe/layers/dropout_layer.cpp | 2 -- src/caffe/layers/dropout_layer.cu | 2 -- src/caffe/layers/dummy_data_layer.cpp | 2 -- src/caffe/layers/eltwise_layer.cpp | 2 -- src/caffe/layers/eltwise_layer.cu | 2 -- src/caffe/layers/euclidean_loss_layer.cpp | 2 -- src/caffe/layers/euclidean_loss_layer.cu | 2 -- src/caffe/layers/flatten_layer.cpp | 2 -- src/caffe/layers/flatten_layer.cu | 2 -- src/caffe/layers/hdf5_data_layer.cpp | 1 - src/caffe/layers/hdf5_data_layer.cu | 1 - src/caffe/layers/hdf5_output_layer.cpp | 2 -- src/caffe/layers/hdf5_output_layer.cu | 2 -- src/caffe/layers/hinge_loss_layer.cpp | 2 -- src/caffe/layers/im2col_layer.cpp | 2 -- src/caffe/layers/im2col_layer.cu | 2 -- src/caffe/layers/image_data_layer.cpp | 2 -- src/caffe/layers/image_data_layer.cu | 2 -- src/caffe/layers/infogain_loss_layer.cpp | 2 -- src/caffe/layers/inner_product_layer.cpp | 2 -- src/caffe/layers/inner_product_layer.cu | 2 -- src/caffe/layers/loss_layer.cpp | 2 -- src/caffe/layers/lrn_layer.cpp | 2 -- src/caffe/layers/lrn_layer.cu | 2 -- src/caffe/layers/memory_data_layer.cpp | 2 -- src/caffe/layers/multinomial_logistic_loss_layer.cpp | 2 -- src/caffe/layers/neuron_layer.cpp | 2 -- src/caffe/layers/pooling_layer.cpp | 2 -- src/caffe/layers/pooling_layer.cu | 2 -- src/caffe/layers/power_layer.cpp | 2 -- src/caffe/layers/power_layer.cu | 2 -- src/caffe/layers/relu_layer.cpp | 2 -- src/caffe/layers/relu_layer.cu | 2 -- src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp | 2 -- src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu | 2 -- src/caffe/layers/sigmoid_layer.cpp | 2 -- src/caffe/layers/sigmoid_layer.cu | 2 -- src/caffe/layers/slice_layer.cpp | 2 -- src/caffe/layers/slice_layer.cu | 2 -- src/caffe/layers/softmax_layer.cpp | 1 - src/caffe/layers/softmax_layer.cu | 2 -- src/caffe/layers/softmax_loss_layer.cpp | 2 -- src/caffe/layers/softmax_loss_layer.cu | 2 -- src/caffe/layers/split_layer.cpp | 2 -- src/caffe/layers/split_layer.cu | 2 -- src/caffe/layers/tanh_layer.cpp | 1 - src/caffe/layers/tanh_layer.cu | 1 - src/caffe/layers/threshold_layer.cpp | 2 -- src/caffe/layers/threshold_layer.cu | 2 -- src/caffe/layers/window_data_layer.cpp | 1 - src/caffe/layers/window_data_layer.cu | 1 - src/caffe/net.cpp | 2 -- src/caffe/proto/caffe.proto | 2 -- src/caffe/proto/caffe_pretty_print.proto | 2 -- src/caffe/solver.cpp | 2 -- src/caffe/syncedmem.cpp | 2 -- src/caffe/test/test_accuracy_layer.cpp | 2 -- src/caffe/test/test_argmax_layer.cpp | 2 -- src/caffe/test/test_benchmark.cpp | 2 -- src/caffe/test/test_blob.cpp | 2 -- src/caffe/test/test_caffe_main.cpp | 2 -- src/caffe/test/test_common.cpp | 2 -- src/caffe/test/test_concat_layer.cpp | 2 -- src/caffe/test/test_convolution_layer.cpp | 2 -- src/caffe/test/test_data_layer.cpp | 2 -- src/caffe/test/test_dummy_data_layer.cpp | 2 -- src/caffe/test/test_eltwise_layer.cpp | 2 -- src/caffe/test/test_euclidean_loss_layer.cpp | 2 -- src/caffe/test/test_filler.cpp | 2 -- src/caffe/test/test_flatten_layer.cpp | 2 -- src/caffe/test/test_hdf5_output_layer.cpp | 2 -- src/caffe/test/test_hdf5data_layer.cpp | 2 -- src/caffe/test/test_hinge_loss_layer.cpp | 2 -- src/caffe/test/test_im2col_kernel.cu | 2 -- src/caffe/test/test_im2col_layer.cpp | 2 -- src/caffe/test/test_image_data_layer.cpp | 2 -- src/caffe/test/test_infogain_loss_layer.cpp | 2 -- src/caffe/test/test_inner_product_layer.cpp | 2 -- src/caffe/test/test_lrn_layer.cpp | 2 -- src/caffe/test/test_math_functions.cpp | 2 -- src/caffe/test/test_maxpool_dropout_layers.cpp | 2 -- src/caffe/test/test_memory_data_layer.cpp | 2 -- src/caffe/test/test_multinomial_logistic_loss_layer.cpp | 2 -- src/caffe/test/test_net.cpp | 2 -- src/caffe/test/test_neuron_layer.cpp | 2 -- src/caffe/test/test_platform.cpp | 2 -- src/caffe/test/test_pooling_layer.cpp | 2 -- src/caffe/test/test_power_layer.cpp | 2 -- src/caffe/test/test_protobuf.cpp | 2 -- src/caffe/test/test_random_number_generator.cpp | 2 -- src/caffe/test/test_sgd_solver.cpp | 2 -- src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp | 2 -- src/caffe/test/test_slice_layer.cpp | 2 -- src/caffe/test/test_softmax_layer.cpp | 2 -- src/caffe/test/test_softmax_with_loss_layer.cpp | 2 -- src/caffe/test/test_solver.cpp | 2 -- src/caffe/test/test_split_layer.cpp | 2 -- src/caffe/test/test_stochastic_pooling.cpp | 2 -- src/caffe/test/test_syncedmem.cpp | 2 -- src/caffe/test/test_tanh_layer.cpp | 1 - src/caffe/test/test_threshold_layer.cpp | 2 -- src/caffe/test/test_upgrade_proto.cpp | 2 -- src/caffe/test/test_util_blas.cpp | 2 -- src/caffe/util/benchmark.cpp | 2 -- src/caffe/util/im2col.cpp | 2 -- src/caffe/util/im2col.cu | 2 -- src/caffe/util/insert_splits.cpp | 2 -- src/caffe/util/io.cpp | 2 -- src/caffe/util/math_functions.cpp | 2 -- src/caffe/util/math_functions.cu | 2 -- src/caffe/util/upgrade_proto.cpp | 2 -- tools/caffe.cpp | 1 - tools/compute_image_mean.cpp | 2 -- tools/convert_imageset.cpp | 1 - tools/device_query.cpp | 2 -- tools/dump_network.cpp | 2 -- tools/extract_features.cpp | 2 -- tools/finetune_net.cpp | 2 -- tools/net_speed_benchmark.cpp | 2 -- tools/test_net.cpp | 2 -- tools/train_net.cpp | 2 -- tools/upgrade_net_proto_binary.cpp | 2 -- tools/upgrade_net_proto_text.cpp | 2 -- 165 files changed, 3 insertions(+), 318 deletions(-) diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index d1f3f3e0e9f..2d5589bd30a 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // // This script converts the CIFAR dataset to the leveldb format used // by caffe to perform classification. diff --git a/examples/mnist/convert_mnist_data.cpp b/examples/mnist/convert_mnist_data.cpp index c2cf4b3af33..a97a9285a19 100644 --- a/examples/mnist/convert_mnist_data.cpp +++ b/examples/mnist/convert_mnist_data.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // // This script converts the MNIST dataset to the leveldb format used // by caffe to perform classification. diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index 2086c5119bc..eb0c25ba394 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_BLOB_HPP_ #define CAFFE_BLOB_HPP_ diff --git a/include/caffe/caffe.hpp b/include/caffe/caffe.hpp index 172fc5f3bf7..0af9ef04c43 100644 --- a/include/caffe/caffe.hpp +++ b/include/caffe/caffe.hpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // caffe.hpp is the header file that you need to include in your code. It wraps // all the internal caffe header files into one for simpler inclusion. diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index d3dbd471e67..97a34962c63 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_COMMON_HPP_ #define CAFFE_COMMON_HPP_ diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index ed11487c6f3..1e282d33d7a 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_COMMON_LAYERS_HPP_ #define CAFFE_COMMON_LAYERS_HPP_ diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index f868b2869da..31774828a69 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_DATA_LAYERS_HPP_ #define CAFFE_DATA_LAYERS_HPP_ diff --git a/include/caffe/filler.hpp b/include/caffe/filler.hpp index beeee01dcb9..a8366801132 100644 --- a/include/caffe/filler.hpp +++ b/include/caffe/filler.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - // Fillers are random number generators that fills a blob using the specified // algorithm. The expectation is that they are only going to be used during // initialization time and will not involve any GPUs. diff --git a/include/caffe/internal_thread.hpp b/include/caffe/internal_thread.hpp index 46f67360f0c..8520899ada6 100644 --- a/include/caffe/internal_thread.hpp +++ b/include/caffe/internal_thread.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_INTERNAL_THREAD_HPP_ #define CAFFE_INTERNAL_THREAD_HPP_ @@ -28,7 +26,7 @@ class InternalThread { } protected: - /* Implement this method in your subclass + /* Implement this method in your subclass with the code you want your thread to run. */ virtual void InternalThreadEntry() = 0; diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index aac82447a41..dca5f8709af 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_LAYER_H_ #define CAFFE_LAYER_H_ diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 73a677b624a..bd2618d6d36 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_LOSS_LAYERS_HPP_ #define CAFFE_LOSS_LAYERS_HPP_ diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 808b244e47d..8c22137e514 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_NET_HPP_ #define CAFFE_NET_HPP_ diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 4b3f6f4394d..6fe425229e8 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_NEURON_LAYERS_HPP_ #define CAFFE_NEURON_LAYERS_HPP_ @@ -233,12 +231,12 @@ class TanHLayer : public NeuronLayer { /* ThresholdLayer Outputs 1 if value in input is above threshold, 0 otherwise. - The defult threshold = 0, which means positive values would become 1 and + The defult threshold = 0, which means positive values would become 1 and negative or 0, would become 0 y = 1 if x > threshold y = 0 if x <= threshold - + y' = don't differenciable */ template diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 811d70372a4..cdf583a1429 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_OPTIMIZATION_SOLVER_HPP_ #define CAFFE_OPTIMIZATION_SOLVER_HPP_ diff --git a/include/caffe/syncedmem.hpp b/include/caffe/syncedmem.hpp index 2b7f349025a..b2fc287b23e 100644 --- a/include/caffe/syncedmem.hpp +++ b/include/caffe/syncedmem.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_SYNCEDMEM_HPP_ #define CAFFE_SYNCEDMEM_HPP_ diff --git a/include/caffe/test/test_caffe_main.hpp b/include/caffe/test/test_caffe_main.hpp index 759e01a2629..40b9effc5f1 100644 --- a/include/caffe/test/test_caffe_main.hpp +++ b/include/caffe/test/test_caffe_main.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - // The main caffe test code. Your test cpp code should include this hpp // to allow a main function to be compiled into the binary. #ifndef CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ diff --git a/include/caffe/test/test_gradient_check_util.hpp b/include/caffe/test/test_gradient_check_util.hpp index 034aeccb90b..4cf2cbc9dc8 100644 --- a/include/caffe/test/test_gradient_check_util.hpp +++ b/include/caffe/test/test_gradient_check_util.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_TEST_GRADIENT_CHECK_UTIL_H_ #define CAFFE_TEST_GRADIENT_CHECK_UTIL_H_ diff --git a/include/caffe/util/benchmark.hpp b/include/caffe/util/benchmark.hpp index 8ee76140d9a..f7ef8eaf3ee 100644 --- a/include/caffe/util/benchmark.hpp +++ b/include/caffe/util/benchmark.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_UTIL_BENCHMARK_H_ #define CAFFE_UTIL_BENCHMARK_H_ diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index abee4f57dd1..cf1aef759cc 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_UTIL_DEVICE_ALTERNATE_H_ #define CAFFE_UTIL_DEVICE_ALTERNATE_H_ diff --git a/include/caffe/util/im2col.hpp b/include/caffe/util/im2col.hpp index c263997ae66..0051e2fa067 100644 --- a/include/caffe/util/im2col.hpp +++ b/include/caffe/util/im2col.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef _CAFFE_UTIL_IM2COL_HPP_ #define _CAFFE_UTIL_IM2COL_HPP_ diff --git a/include/caffe/util/insert_splits.hpp b/include/caffe/util/insert_splits.hpp index 4da1ea81502..4ca933b9203 100644 --- a/include/caffe/util/insert_splits.hpp +++ b/include/caffe/util/insert_splits.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef _CAFFE_UTIL_INSERT_SPLITS_HPP_ #define _CAFFE_UTIL_INSERT_SPLITS_HPP_ diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 4f517ff1d71..cdf4d9e724e 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_UTIL_IO_H_ #define CAFFE_UTIL_IO_H_ diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 001950113a1..744dc849b94 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_UTIL_MATH_FUNCTIONS_H_ #define CAFFE_UTIL_MATH_FUNCTIONS_H_ diff --git a/include/caffe/util/mkl_alternate.hpp b/include/caffe/util/mkl_alternate.hpp index c30eab8d3d4..d72bcd2814d 100644 --- a/include/caffe/util/mkl_alternate.hpp +++ b/include/caffe/util/mkl_alternate.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_UTIL_MKL_ALTERNATE_H_ #define CAFFE_UTIL_MKL_ALTERNATE_H_ diff --git a/include/caffe/util/rng.hpp b/include/caffe/util/rng.hpp index f774d704569..8f1cf0d17c2 100644 --- a/include/caffe/util/rng.hpp +++ b/include/caffe/util/rng.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_RNG_CPP_HPP_ #define CAFFE_RNG_CPP_HPP_ diff --git a/include/caffe/util/upgrade_proto.hpp b/include/caffe/util/upgrade_proto.hpp index 39e4f4ce22c..1ee184a34e9 100644 --- a/include/caffe/util/upgrade_proto.hpp +++ b/include/caffe/util/upgrade_proto.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_UTIL_UPGRADE_PROTO_H_ #define CAFFE_UTIL_UPGRADE_PROTO_H_ diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 80dc37543ee..0797065081f 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_VISION_LAYERS_HPP_ #define CAFFE_VISION_LAYERS_HPP_ diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index d0e98f8319d..70652e26e49 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // // matcaffe.cpp provides a wrapper of the caffe::Net class as well as some // caffe::Caffe functions so that one could easily call it from matlab. diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 59317727914..3103d0267be 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // pycaffe provides a wrapper of the caffe::Net class as well as some // caffe::Caffe functions so that one could easily call it from Python. // Note that for Python, we will simply use float as the data type. diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index 738b549e10c..9fd1232a9ad 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/syncedmem.hpp" diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 019370b1dd7..99b2292461e 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 1165abc6da8..118929fbff5 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CAFFE_LAYER_FACTORY_HPP_ #define CAFFE_LAYER_FACTORY_HPP_ diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index f99b01dc105..76889d8b70a 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index 732f7bf15d1..b2ef91eab67 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/bnll_layer.cpp b/src/caffe/layers/bnll_layer.cpp index 9b7a0642779..4cb852031af 100644 --- a/src/caffe/layers/bnll_layer.cpp +++ b/src/caffe/layers/bnll_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/layers/bnll_layer.cu b/src/caffe/layers/bnll_layer.cu index bc6a201e9b4..9895a06107a 100644 --- a/src/caffe/layers/bnll_layer.cu +++ b/src/caffe/layers/bnll_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index 32203a8d980..b76d4b2ca14 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/concat_layer.cu b/src/caffe/layers/concat_layer.cu index 1a97f02a62a..aea8b77e37f 100644 --- a/src/caffe/layers/concat_layer.cu +++ b/src/caffe/layers/concat_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index ca63e976e80..df3e31ba84a 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/filler.hpp" diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 616a81a1388..04ae13932d9 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/filler.hpp" diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index ddc7f770b46..c089c9ba5df 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/layers/data_layer.cu b/src/caffe/layers/data_layer.cu index fcbf2346840..2ae1a640319 100644 --- a/src/caffe/layers/data_layer.cu +++ b/src/caffe/layers/data_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index 605aa151196..0621b56ec6e 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - // TODO (sergeyk): effect should not be dependent on phase. wasted memcpy. #include diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 8befa4d87fb..9bcd687bb5d 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/dummy_data_layer.cpp b/src/caffe/layers/dummy_data_layer.cpp index 58044f4c952..98b437eea98 100644 --- a/src/caffe/layers/dummy_data_layer.cpp +++ b/src/caffe/layers/dummy_data_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/filler.hpp" diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 09ca66f38e8..8085b4644cc 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index d47d24afad7..eec8857c577 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/euclidean_loss_layer.cpp b/src/caffe/layers/euclidean_loss_layer.cpp index 2a814f0150a..17180d40b69 100644 --- a/src/caffe/layers/euclidean_loss_layer.cpp +++ b/src/caffe/layers/euclidean_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/euclidean_loss_layer.cu b/src/caffe/layers/euclidean_loss_layer.cu index e1358f0fb51..dd14f1995c8 100644 --- a/src/caffe/layers/euclidean_loss_layer.cu +++ b/src/caffe/layers/euclidean_loss_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index f1fdd322eb4..81a506a8177 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/flatten_layer.cu b/src/caffe/layers/flatten_layer.cu index 60b67f06e05..7233afb3718 100644 --- a/src/caffe/layers/flatten_layer.cu +++ b/src/caffe/layers/flatten_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 38b2b8d23f3..5bad5f6a1f0 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. /* TODO: - load file in a separate thread ("prefetch") diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu index d50d9616771..1f682d5726d 100644 --- a/src/caffe/layers/hdf5_data_layer.cu +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. /* TODO: - only load parts of the file, in accordance with a prototxt param "max_mem" diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index 30e4997854b..0d7590b1b12 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "hdf5.h" diff --git a/src/caffe/layers/hdf5_output_layer.cu b/src/caffe/layers/hdf5_output_layer.cu index 9b3dd135841..d2f20b3fc79 100644 --- a/src/caffe/layers/hdf5_output_layer.cu +++ b/src/caffe/layers/hdf5_output_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "hdf5.h" diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index a7ec061eb28..bc3a593c769 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index fb3dad43844..2dd7476237a 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/common.hpp" diff --git a/src/caffe/layers/im2col_layer.cu b/src/caffe/layers/im2col_layer.cu index c9802541aaa..6b4c701073e 100644 --- a/src/caffe/layers/im2col_layer.cu +++ b/src/caffe/layers/im2col_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/common.hpp" diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index a10f02c37a8..a0f03a8266d 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include // NOLINT(readability/streams) #include // NOLINT(readability/streams) #include diff --git a/src/caffe/layers/image_data_layer.cu b/src/caffe/layers/image_data_layer.cu index 8a449d010e2..f61409cc38a 100644 --- a/src/caffe/layers/image_data_layer.cu +++ b/src/caffe/layers/image_data_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/blob.hpp" diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index c972c032607..fa01116ee36 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index 6493d0bd497..a9e0f353e9e 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/blob.hpp" diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu index 4b670d644c2..e02107200cf 100644 --- a/src/caffe/layers/inner_product_layer.cu +++ b/src/caffe/layers/inner_product_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/blob.hpp" diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index 656e85a75d8..48665221f1d 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index 50ad6464449..e77f6857c85 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/lrn_layer.cu b/src/caffe/layers/lrn_layer.cu index 7a19350549c..eee12e66cec 100644 --- a/src/caffe/layers/lrn_layer.cu +++ b/src/caffe/layers/lrn_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 15eedb317e3..d1717fd4258 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index e5eafd65078..a9c7de6595d 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/neuron_layer.cpp b/src/caffe/layers/neuron_layer.cpp index 1b8fcecd482..3343b26cfc5 100644 --- a/src/caffe/layers/neuron_layer.cpp +++ b/src/caffe/layers/neuron_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 75a74dac9ec..30657b6c804 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 6f3a7205091..58f1997c38e 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/power_layer.cpp b/src/caffe/layers/power_layer.cpp index 86cb3d76291..8b5d8d16bd4 100644 --- a/src/caffe/layers/power_layer.cpp +++ b/src/caffe/layers/power_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/layers/power_layer.cu b/src/caffe/layers/power_layer.cu index db88fee8f3b..0950b78b4ce 100644 --- a/src/caffe/layers/power_layer.cu +++ b/src/caffe/layers/power_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index b94086df98c..fca10a5aad3 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index e0d6aa1b5c3..a74428bfce1 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index 2bf931d004b..24ab6a85c6a 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu index 698ec1dbde1..0e4dab76b79 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/sigmoid_layer.cpp b/src/caffe/layers/sigmoid_layer.cpp index e25db04c42a..0f8b582da2f 100644 --- a/src/caffe/layers/sigmoid_layer.cpp +++ b/src/caffe/layers/sigmoid_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/sigmoid_layer.cu b/src/caffe/layers/sigmoid_layer.cu index 28cc7f1daa6..039796e1b22 100644 --- a/src/caffe/layers/sigmoid_layer.cu +++ b/src/caffe/layers/sigmoid_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp index fc86a2d4307..e182837c3aa 100644 --- a/src/caffe/layers/slice_layer.cpp +++ b/src/caffe/layers/slice_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/layers/slice_layer.cu b/src/caffe/layers/slice_layer.cu index 70702148f5d..8e01131ec01 100644 --- a/src/caffe/layers/slice_layer.cu +++ b/src/caffe/layers/slice_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 6a98b320208..61990ed9d97 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // #include #include diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index 6d65fbce957..65b0e229d1a 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 43e8fcac44c..98cf14c4a28 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/softmax_loss_layer.cu b/src/caffe/layers/softmax_loss_layer.cu index f55b8c7adf3..32f3e670f48 100644 --- a/src/caffe/layers/softmax_loss_layer.cu +++ b/src/caffe/layers/softmax_loss_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index d13b8d12358..2786d3f7694 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/split_layer.cu b/src/caffe/layers/split_layer.cu index a89c5d61883..1cf15a79314 100644 --- a/src/caffe/layers/split_layer.cu +++ b/src/caffe/layers/split_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp index 0a6ec68d1f9..0c8be3fac60 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // TanH neuron activation function layer. // Adapted from ReLU layer code written by Yangqing Jia diff --git a/src/caffe/layers/tanh_layer.cu b/src/caffe/layers/tanh_layer.cu index 9307cab2ec5..b3daad1e638 100644 --- a/src/caffe/layers/tanh_layer.cu +++ b/src/caffe/layers/tanh_layer.cu @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // TanH neuron activation function layer. // Adapted from ReLU layer code written by Yangqing Jia diff --git a/src/caffe/layers/threshold_layer.cpp b/src/caffe/layers/threshold_layer.cpp index 2c8546c957a..c932356019b 100644 --- a/src/caffe/layers/threshold_layer.cpp +++ b/src/caffe/layers/threshold_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/layer.hpp" diff --git a/src/caffe/layers/threshold_layer.cu b/src/caffe/layers/threshold_layer.cu index fb973b2ba82..398d56e8765 100644 --- a/src/caffe/layers/threshold_layer.cu +++ b/src/caffe/layers/threshold_layer.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index cbd269685ce..ddff5555417 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // // Based on data_layer.cpp by Yangqing Jia. diff --git a/src/caffe/layers/window_data_layer.cu b/src/caffe/layers/window_data_layer.cu index 5efcc3f4adc..6e8fa8b349a 100644 --- a/src/caffe/layers/window_data_layer.cu +++ b/src/caffe/layers/window_data_layer.cu @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // // Based on data_layer.cpp by Yangqing Jia. diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 6fab0e3a6b4..db6b4ffefc4 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 4e77863e7e6..44bfb631a22 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - syntax = "proto2"; package caffe; diff --git a/src/caffe/proto/caffe_pretty_print.proto b/src/caffe/proto/caffe_pretty_print.proto index f34988c9645..225138a4274 100644 --- a/src/caffe/proto/caffe_pretty_print.proto +++ b/src/caffe/proto/caffe_pretty_print.proto @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - syntax = "proto2"; package caffe; diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 6049ddfec7c..d96d03942f3 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/syncedmem.cpp b/src/caffe/syncedmem.cpp index 844f639e013..7d25183701d 100644 --- a/src/caffe/syncedmem.cpp +++ b/src/caffe/syncedmem.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/common.hpp" diff --git a/src/caffe/test/test_accuracy_layer.cpp b/src/caffe/test/test_accuracy_layer.cpp index 95217df3f1f..e11e3f2a981 100644 --- a/src/caffe/test/test_accuracy_layer.cpp +++ b/src/caffe/test/test_accuracy_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index 3f55edaac22..fb3951c3098 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_benchmark.cpp b/src/caffe/test/test_benchmark.cpp index e6d9ebf9a05..dbbee08d667 100644 --- a/src/caffe/test/test_benchmark.cpp +++ b/src/caffe/test/test_benchmark.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include // for usleep #include "gtest/gtest.h" diff --git a/src/caffe/test/test_blob.cpp b/src/caffe/test/test_blob.cpp index 89f4a161c9c..adf7a4d38e9 100644 --- a/src/caffe/test/test_blob.cpp +++ b/src/caffe/test/test_blob.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "gtest/gtest.h" diff --git a/src/caffe/test/test_caffe_main.cpp b/src/caffe/test/test_caffe_main.cpp index bb5e6b46afb..df188fd319b 100644 --- a/src/caffe/test/test_caffe_main.cpp +++ b/src/caffe/test/test_caffe_main.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - // The main caffe test code. Your test cpp code should include this hpp // to allow a main function to be compiled into the binary. diff --git a/src/caffe/test/test_common.cpp b/src/caffe/test/test_common.cpp index 455f5d8a32d..0b3639c7706 100644 --- a/src/caffe/test/test_common.cpp +++ b/src/caffe/test/test_common.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "gtest/gtest.h" diff --git a/src/caffe/test/test_concat_layer.cpp b/src/caffe/test/test_concat_layer.cpp index b07c5727a79..c60b7f744cc 100644 --- a/src/caffe/test/test_concat_layer.cpp +++ b/src/caffe/test/test_concat_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index 41951cfb940..5a7ea80467e 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index be478b2746c..208beed91d1 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_dummy_data_layer.cpp b/src/caffe/test/test_dummy_data_layer.cpp index aa6cc55364e..4188bb68c9e 100644 --- a/src/caffe/test/test_dummy_data_layer.cpp +++ b/src/caffe/test/test_dummy_data_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index fe3269bb3a2..4c17dfd341c 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "gtest/gtest.h" diff --git a/src/caffe/test/test_euclidean_loss_layer.cpp b/src/caffe/test/test_euclidean_loss_layer.cpp index 6dd631e55e8..511d38ccab5 100644 --- a/src/caffe/test/test_euclidean_loss_layer.cpp +++ b/src/caffe/test/test_euclidean_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_filler.cpp b/src/caffe/test/test_filler.cpp index d0d750fff47..e04b0fd22af 100644 --- a/src/caffe/test/test_filler.cpp +++ b/src/caffe/test/test_filler.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "gtest/gtest.h" diff --git a/src/caffe/test/test_flatten_layer.cpp b/src/caffe/test/test_flatten_layer.cpp index 928db849296..cbd01f245f2 100644 --- a/src/caffe/test/test_flatten_layer.cpp +++ b/src/caffe/test/test_flatten_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index a36a8cbd9a8..696165cdaa2 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index 1f3bf9f3cd0..f903afb736f 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index c6be1d73262..8f6f6f78cf1 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_im2col_kernel.cu b/src/caffe/test/test_im2col_kernel.cu index 89008ac7e39..ee684c00255 100644 --- a/src/caffe/test/test_im2col_kernel.cu +++ b/src/caffe/test/test_im2col_kernel.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_im2col_layer.cpp b/src/caffe/test/test_im2col_layer.cpp index 6884b059fde..32cf6369361 100644 --- a/src/caffe/test/test_im2col_layer.cpp +++ b/src/caffe/test/test_im2col_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index bbeedb8dce5..5232c1187c1 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include // NOLINT(readability/streams) #include // NOLINT(readability/streams) #include diff --git a/src/caffe/test/test_infogain_loss_layer.cpp b/src/caffe/test/test_infogain_loss_layer.cpp index 7b3705084a5..162d0e6c589 100644 --- a/src/caffe/test/test_infogain_loss_layer.cpp +++ b/src/caffe/test/test_infogain_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_inner_product_layer.cpp b/src/caffe/test/test_inner_product_layer.cpp index 31d87afc7ce..5f9729c4f90 100644 --- a/src/caffe/test/test_inner_product_layer.cpp +++ b/src/caffe/test/test_inner_product_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_lrn_layer.cpp b/src/caffe/test/test_lrn_layer.cpp index fbb03dfecb5..3bd62fd9e18 100644 --- a/src/caffe/test/test_lrn_layer.cpp +++ b/src/caffe/test/test_lrn_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_math_functions.cpp b/src/caffe/test/test_math_functions.cpp index c89ca027adf..d10e702e79a 100644 --- a/src/caffe/test/test_math_functions.cpp +++ b/src/caffe/test/test_math_functions.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include // for uint32_t & uint64_t #include #include diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp index e939d0c6e11..311c7781be5 100644 --- a/src/caffe/test/test_maxpool_dropout_layers.cpp +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index 60e75ebbc1a..f401bb0f4f2 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/filler.hpp" diff --git a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp index 9b6bb067805..3d1037baed0 100644 --- a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp +++ b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 6787ba956ec..18bc9ad7838 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 59c9b3d34f5..649f8f626d9 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_platform.cpp b/src/caffe/test/test_platform.cpp index a4f4b4260c4..f3513e08814 100644 --- a/src/caffe/test/test_platform.cpp +++ b/src/caffe/test/test_platform.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CPU_ONLY #include diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index 4636dd773a4..5be01f77b32 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_power_layer.cpp b/src/caffe/test/test_power_layer.cpp index e35d539b776..0c104c20b7c 100644 --- a/src/caffe/test/test_power_layer.cpp +++ b/src/caffe/test/test_power_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_protobuf.cpp b/src/caffe/test/test_protobuf.cpp index da1a0d3f5eb..0c502d6dd36 100644 --- a/src/caffe/test/test_protobuf.cpp +++ b/src/caffe/test/test_protobuf.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - // This is simply a script that tries serializing protocol buffer in text // format. Nothing special here and no actual code is being tested. #include diff --git a/src/caffe/test/test_random_number_generator.cpp b/src/caffe/test/test_random_number_generator.cpp index 8e3919157af..98424c06bfc 100644 --- a/src/caffe/test/test_random_number_generator.cpp +++ b/src/caffe/test/test_random_number_generator.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_sgd_solver.cpp b/src/caffe/test/test_sgd_solver.cpp index 14dcac25e8e..1ec24b134c6 100644 --- a/src/caffe/test/test_sgd_solver.cpp +++ b/src/caffe/test/test_sgd_solver.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp index 7205ce9311b..f5716c9e9a7 100644 --- a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_slice_layer.cpp b/src/caffe/test/test_slice_layer.cpp index e61f3e4f2c9..ee8818781f5 100644 --- a/src/caffe/test/test_slice_layer.cpp +++ b/src/caffe/test/test_slice_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index a305c647585..37685af6b12 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_softmax_with_loss_layer.cpp b/src/caffe/test/test_softmax_with_loss_layer.cpp index 2994a9117af..bd39bd4420b 100644 --- a/src/caffe/test/test_softmax_with_loss_layer.cpp +++ b/src/caffe/test/test_softmax_with_loss_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_solver.cpp b/src/caffe/test/test_solver.cpp index 133d01c5446..a7dbf77fd95 100644 --- a/src/caffe/test/test_solver.cpp +++ b/src/caffe/test/test_solver.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index a4e5857877e..711669bacb8 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_stochastic_pooling.cpp b/src/caffe/test/test_stochastic_pooling.cpp index 600b909a638..4f13981bd82 100644 --- a/src/caffe/test/test_stochastic_pooling.cpp +++ b/src/caffe/test/test_stochastic_pooling.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index 5ccc480112d..b658871b3ee 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/test/test_tanh_layer.cpp b/src/caffe/test/test_tanh_layer.cpp index 1dac5a57043..9b8e745b8a7 100644 --- a/src/caffe/test/test_tanh_layer.cpp +++ b/src/caffe/test/test_tanh_layer.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // Adapted from other test files #include diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index b06d697ab0b..32dfbeeac92 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "gtest/gtest.h" diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index a16b835f864..2abcadc0862 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/test/test_util_blas.cpp b/src/caffe/test/test_util_blas.cpp index 841edefc66c..8770f309951 100644 --- a/src/caffe/test/test_util_blas.cpp +++ b/src/caffe/test/test_util_blas.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #ifndef CPU_ONLY // CPU-GPU test #include diff --git a/src/caffe/util/benchmark.cpp b/src/caffe/util/benchmark.cpp index 009b118a35a..566d06a8f5f 100644 --- a/src/caffe/util/benchmark.cpp +++ b/src/caffe/util/benchmark.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include "caffe/common.hpp" diff --git a/src/caffe/util/im2col.cpp b/src/caffe/util/im2col.cpp index 01df8c89182..c48f31f35d4 100644 --- a/src/caffe/util/im2col.cpp +++ b/src/caffe/util/im2col.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/util/im2col.cu b/src/caffe/util/im2col.cu index 653ce49e7f8..c90f93eb67b 100644 --- a/src/caffe/util/im2col.cu +++ b/src/caffe/util/im2col.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/util/insert_splits.cpp b/src/caffe/util/insert_splits.cpp index b88b320ff3d..270568cb5dc 100644 --- a/src/caffe/util/insert_splits.cpp +++ b/src/caffe/util/insert_splits.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 575ea3d63c2..fd7454d4f98 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index 2fdcf91b34b..974adf55e7d 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index 1e934931462..cec051e6bef 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include // CUDA's, not caffe's, for fabs, signbit #include #include // thrust::plus diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index a6e9c404df7..5415ca83b60 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/tools/caffe.cpp b/tools/caffe.cpp index ec414298ea4..ee12bca8c36 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. #include #include diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 79bfdc7c4bb..fe3497fa87d 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 21ff0d38104..0ddafa0c5fe 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -1,4 +1,3 @@ -// Copyright 2014 BVLC and contributors. // This program converts a set of images to a leveldb by storing them as Datum // proto buffers. // Usage: diff --git a/tools/device_query.cpp b/tools/device_query.cpp index efdbbbbc90e..2678154cbb4 100644 --- a/tools/device_query.cpp +++ b/tools/device_query.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include "caffe/common.hpp" int main(int argc, char** argv) { diff --git a/tools/dump_network.cpp b/tools/dump_network.cpp index 8984016916a..90895fdc969 100644 --- a/tools/dump_network.cpp +++ b/tools/dump_network.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. -// // This program takes in a trained network and an input blob, and then dumps // all the intermediate blobs produced by the net to individual binary // files stored in protobuffer binary formats. diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 06e07fe6cba..49e8f98971c 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include // for snprintf #include #include diff --git a/tools/finetune_net.cpp b/tools/finetune_net.cpp index 213ff01702a..2966de48d17 100644 --- a/tools/finetune_net.cpp +++ b/tools/finetune_net.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include "caffe/caffe.hpp" int main(int argc, char** argv) { diff --git a/tools/net_speed_benchmark.cpp b/tools/net_speed_benchmark.cpp index f520e1d7785..ff112bdff55 100644 --- a/tools/net_speed_benchmark.cpp +++ b/tools/net_speed_benchmark.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include "caffe/caffe.hpp" int main(int argc, char** argv) { diff --git a/tools/test_net.cpp b/tools/test_net.cpp index b6f827e6285..de97ab8924c 100644 --- a/tools/test_net.cpp +++ b/tools/test_net.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. -// // This is a simple script that allows one to quickly test a network whose // structure is specified by text format protocol buffers, and whose parameter // are loaded from a pre-trained network. diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 08602d4a7ca..26aeb40bd05 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. - #include "caffe/caffe.hpp" int main(int argc, char** argv) { diff --git a/tools/upgrade_net_proto_binary.cpp b/tools/upgrade_net_proto_binary.cpp index ed703f027cd..d7a62e32441 100644 --- a/tools/upgrade_net_proto_binary.cpp +++ b/tools/upgrade_net_proto_binary.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. -// // This is a script to upgrade "V0" network prototxts to the new format. // Usage: // upgrade_net_proto_binary v0_net_proto_file_in net_proto_file_out diff --git a/tools/upgrade_net_proto_text.cpp b/tools/upgrade_net_proto_text.cpp index d05d1ac5883..1176585b02a 100644 --- a/tools/upgrade_net_proto_text.cpp +++ b/tools/upgrade_net_proto_text.cpp @@ -1,5 +1,3 @@ -// Copyright 2014 BVLC and contributors. -// // This is a script to upgrade "V0" network prototxts to the new format. // Usage: // upgrade_net_proto_text v0_net_proto_file_in net_proto_file_out From 72effc037f60c4acdbc2f172064fc6bef6820009 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 00:34:05 -0700 Subject: [PATCH 0399/2053] [docs] detail attribution, license, and copyright for development --- docs/development.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/docs/development.md b/docs/development.md index ff734d17219..d586a2b1c30 100644 --- a/docs/development.md +++ b/docs/development.md @@ -7,6 +7,19 @@ title: Development Caffe is developed with active participation of the community.
    The [BVLC](http://bvlc.eecs.berkeley.edu/) maintainers welcome all contributions! +The exact details of contributions are recorded by versioning and cited in our [acknowledgements](http://caffe.berkeleyvision.org/#acknowledgements). +This method is impartial and always up-to-date. + +## License + +Caffe is licensed under the terms in [LICENSE](https://github.com/BVLC/caffe/blob/master/LICENSE). By contributing to the project, you agree to the license and copyright terms therein and release your contribution under these terms. + +## Copyright + +Caffe uses a shared copyright model: each contributor holds copyright over their contributions to Caffe. The project versioning records all such contribution and copyright details. + +If a contributor wants to further mark their specific copyright on a particular contribution, they should indicate their copyright solely in the commit message of the change when it is committed. Do not include copyright notices in files for this purpose. + ### Documentation This website, written with [Jekyll](http://jekyllrb.com/), functions as the official Caffe documentation -- simply run `scripts/build_docs.sh` and view the website at `http://0.0.0.0:4000`. @@ -109,12 +122,3 @@ To get a list of all options `googletest` provides, simply pass the `--help` fla - Wrap lines at 80 chars. - Remember that “a foolish consistency is the hobgoblin of little minds,” so use your best judgement to write the clearest code for your particular case. - **Run `make lint` to check C++ code.** - -### Copyright - -Assign copyright jointly to BVLC and contributors like so: - - // Copyright 2014 BVLC and contributors. - -The exact details of contributions are recorded by versioning and cited in our [acknowledgements](http://caffe.berkeleyvision.org/#acknowledgements). -This method is impartial and always up-to-date. From e788eae37e746c512a5618c673b04eacaa3fff6a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 00:36:00 -0700 Subject: [PATCH 0400/2053] lint for copyright --- scripts/cpp_lint.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/scripts/cpp_lint.py b/scripts/cpp_lint.py index 3f0ca1c3527..3f80e723643 100755 --- a/scripts/cpp_lint.py +++ b/scripts/cpp_lint.py @@ -445,7 +445,7 @@ _error_suppressions = {} # Finds Copyright. -_RE_COPYRIGHT = re.compile(r'Copyright \d\d\d\d BVLC and contributors.') +_RE_COPYRIGHT = re.compile(r'Copyright') # The root directory used for deriving header guard CPP variable. # This is set by --root flag. @@ -1368,16 +1368,15 @@ def ReverseCloseExpression(clean_lines, linenum, pos): def CheckForCopyright(filename, lines, error): - """Logs an error if no Copyright message appears at the top of the file.""" + """Logs an error if a Copyright message appears at the top of the file.""" - # We'll say it should occur by line 10. Don't forget there's a + # We'll check up to line 10. Don't forget there's a # dummy line at the front. for line in xrange(1, min(len(lines), 11)): - if _RE_COPYRIGHT.search(lines[line], re.I): break - else: # means no copyright line was found - error(filename, 0, 'legal/copyright', 5, - 'BVLC copyright message not found. ' - 'You should have a line: "Copyright [year] BVLC and contributors."') + if _RE_COPYRIGHT.search(lines[line], re.I): + error(filename, 0, 'legal/copyright', 5, + 'Copyright message found. ' + 'You should not include a copyright line.') def GetHeaderGuardCPPVariable(filename): From 51074e91d25659764148ccd02646d24b3b96ddf5 Mon Sep 17 00:00:00 2001 From: Alireza Shafaei Date: Tue, 5 Aug 2014 21:34:45 -0700 Subject: [PATCH 0401/2053] Painless binary mean conversion to matlab matrices. --- matlab/caffe/matcaffe.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index 70652e26e49..5888676c744 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -311,6 +311,31 @@ static void is_initialized(MEX_ARGS) { } } +static void read_mean(MEX_ARGS) { + if (nrhs != 1) { + mexErrMsgTxt("Usage: caffe('read_mean', 'path_to_binary_mean_file'"); + return; + } + const string& mean_file = mxArrayToString(prhs[0]); + Blob data_mean; + LOG(INFO) << "Loading mean file from" << mean_file; + BlobProto blob_proto; + bool result = ReadProtoFromBinaryFile(mean_file.c_str(), &blob_proto); + if (!result) { + mexErrMsgTxt("Couldn't read the file"); + return; + } + data_mean.FromProto(blob_proto); + mwSize dims[4] = {data_mean.width(), data_mean.height(), + data_mean.channels(), data_mean.num() }; + mxArray* mx_blob = mxCreateNumericArray(4, dims, mxSINGLE_CLASS, mxREAL); + float* data_ptr = reinterpret_cast(mxGetPr(mx_blob)); + caffe_copy(data_mean.count(), data_mean.cpu_data(), data_ptr); + mexWarnMsgTxt("Remember that Caffe saves in [width, height, channels]" + " format and channels are also BGR!"); + plhs[0] = mx_blob; +} + /** ----------------------------------------------------------------- ** Available commands. **/ @@ -333,6 +358,7 @@ static handler_registry handlers[] = { { "get_weights", get_weights }, { "get_init_key", get_init_key }, { "reset", reset }, + { "read_mean", read_mean }, // The end. { "END", NULL }, }; From de6123c4f4f0e24220a874247971d452ae43874e Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 19:22:58 -0700 Subject: [PATCH 0402/2053] rename tools --- tools/caffe.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index ee12bca8c36..1672b600d74 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -19,21 +19,21 @@ using caffe::vector; // Used in device query DEFINE_int32(device_id, 0, - "[devicequery,speedtest] The device id to use."); + "[device_query,time] The device id to use."); // Used in training DEFINE_string(solver_proto_file, "", "[train] The protobuf containing the solver definition."); DEFINE_string(net_proto_file, "", - "[speedtest] The net proto file to use."); + "[time] The net proto file to use."); DEFINE_string(resume_point_file, "", "[train] (optional) The snapshot from which to resume training."); DEFINE_string(pretrained_net_file, "", "[train] (optional) A pretrained network to run finetune from. " "Cannot be set simultaneously with resume_point_file."); DEFINE_int32(run_iterations, 50, - "[speedtest] The number of iterations to run."); -DEFINE_bool(speedtest_with_gpu, false, - "[speedtest] Test the model with GPU."); + "[time] The number of iterations to run."); +DEFINE_bool(time_with_gpu, false, + "[time] Test the model with GPU."); // A simple registry for caffe commands. typedef int (*BrewFunction)(); @@ -70,13 +70,13 @@ static BrewFunction GetBrewFunction(const caffe::string& name) { // To do so, define actions as "int action()" functions, and register it with // RegisterBrewFunction(action); -int devicequery() { +int device_query() { LOG(INFO) << "Querying device_id = " << FLAGS_device_id; caffe::Caffe::SetDevice(FLAGS_device_id); caffe::Caffe::DeviceQuery(); return 0; } -RegisterBrewFunction(devicequery); +RegisterBrewFunction(device_query); int train() { CHECK_GT(FLAGS_solver_proto_file.size(), 0); @@ -101,9 +101,9 @@ int train() { } RegisterBrewFunction(train); -int speedtest() { +int time() { // Set device id and mode - if (FLAGS_speedtest_with_gpu) { + if (FLAGS_time_with_gpu) { LOG(INFO) << "Use GPU with device id " << FLAGS_device_id; Caffe::SetDevice(FLAGS_device_id); Caffe::set_mode(Caffe::GPU); @@ -168,7 +168,7 @@ int speedtest() { LOG(INFO) << "*** Benchmark ends ***"; return 0; } -RegisterBrewFunction(speedtest); +RegisterBrewFunction(time); int main(int argc, char** argv) { caffe::GlobalInit(&argc, &argv); From 8eb05e1f47860cc18b8af2ed5ebc8d5169c03eaf Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 19:45:05 -0700 Subject: [PATCH 0403/2053] consolidaet GPU flag for caffe cli --- tools/caffe.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 1672b600d74..26db1785a28 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -32,8 +32,8 @@ DEFINE_string(pretrained_net_file, "", "Cannot be set simultaneously with resume_point_file."); DEFINE_int32(run_iterations, 50, "[time] The number of iterations to run."); -DEFINE_bool(time_with_gpu, false, - "[time] Test the model with GPU."); +DEFINE_bool(gpu, false, + "[time] Run in GPU mode when true."); // A simple registry for caffe commands. typedef int (*BrewFunction)(); @@ -103,7 +103,7 @@ RegisterBrewFunction(train); int time() { // Set device id and mode - if (FLAGS_time_with_gpu) { + if (FLAGS_gpu) { LOG(INFO) << "Use GPU with device id " << FLAGS_device_id; Caffe::SetDevice(FLAGS_device_id); Caffe::set_mode(Caffe::GPU); From fa084945d43eed3d2942f4c28def2e87bbe1c92d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 20:10:27 -0700 Subject: [PATCH 0404/2053] output INFO from caffe cli to stderr by default --- tools/caffe.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 26db1785a28..b201f8ecaff 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -171,6 +171,9 @@ int time() { RegisterBrewFunction(time); int main(int argc, char** argv) { + // Print output to stderr (while still logging). + FLAGS_alsologtostderr = 1; + caffe::GlobalInit(&argc, &argv); CHECK_EQ(argc, 2); return GetBrewFunction(caffe::string(argv[1]))(); From 3655aa93952c470b2fc04ca622b03f7a956be9cb Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 20:17:00 -0700 Subject: [PATCH 0405/2053] give usage message for caffe cli - call format - commands - flags --- tools/caffe.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index b201f8ecaff..3bf18650b4d 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -173,8 +173,18 @@ RegisterBrewFunction(time); int main(int argc, char** argv) { // Print output to stderr (while still logging). FLAGS_alsologtostderr = 1; - + // Usage message. + gflags::SetUsageMessage("command line brew\n" + "usage: caffe \n\n" + "commands:\n" + " train train or finetune a model\n" + " device_query show GPU diagnostic information\n" + " time benchmark model execution time"); + // Run tool or show usage. caffe::GlobalInit(&argc, &argv); - CHECK_EQ(argc, 2); - return GetBrewFunction(caffe::string(argv[1]))(); + if (argc == 2) { + return GetBrewFunction(caffe::string(argv[1]))(); + } else { + gflags::ShowUsageWithFlagsRestrict(argv[0], "tools/caffe"); + } } From 8634885d83dabfb38e8ca5f0d0d037335127cfba Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 23:22:13 -0700 Subject: [PATCH 0406/2053] rename caffe cli args and revise text --- tools/caffe.cpp | 52 ++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 3bf18650b4d..1320b7a5e25 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -17,23 +17,21 @@ using caffe::Timer; using caffe::vector; -// Used in device query DEFINE_int32(device_id, 0, - "[device_query,time] The device id to use."); -// Used in training -DEFINE_string(solver_proto_file, "", - "[train] The protobuf containing the solver definition."); -DEFINE_string(net_proto_file, "", - "[time] The net proto file to use."); -DEFINE_string(resume_point_file, "", - "[train] (optional) The snapshot from which to resume training."); -DEFINE_string(pretrained_net_file, "", - "[train] (optional) A pretrained network to run finetune from. " - "Cannot be set simultaneously with resume_point_file."); -DEFINE_int32(run_iterations, 50, - "[time] The number of iterations to run."); + "The GPU device ID to use."); DEFINE_bool(gpu, false, - "[time] Run in GPU mode when true."); + "Run in GPU mode when true."); +DEFINE_string(solver, "", + "The solver definition protocol buffer text file."); +DEFINE_string(model, "", + "The model definition protocol buffer text file.."); +DEFINE_string(snapshot, "", + "Optional; the snapshot solver state to resume training."); +DEFINE_string(weights, "", + "Optional; the pretrained weights to initialize finetuning. " + "Cannot be set simultaneously with snapshot."); +DEFINE_int32(iterations, 50, + "The number of iterations to run."); // A simple registry for caffe commands. typedef int (*BrewFunction)(); @@ -79,19 +77,19 @@ int device_query() { RegisterBrewFunction(device_query); int train() { - CHECK_GT(FLAGS_solver_proto_file.size(), 0); + CHECK_GT(FLAGS_solver.size(), 0); caffe::SolverParameter solver_param; - caffe::ReadProtoFromTextFileOrDie(FLAGS_solver_proto_file, &solver_param); + caffe::ReadProtoFromTextFileOrDie(FLAGS_solver, &solver_param); LOG(INFO) << "Starting Optimization"; caffe::SGDSolver solver(solver_param); - if (FLAGS_resume_point_file.size()) { - LOG(INFO) << "Resuming from " << FLAGS_resume_point_file; - solver.Solve(FLAGS_resume_point_file); - } else if (FLAGS_pretrained_net_file.size()) { - LOG(INFO) << "Finetuning from " << FLAGS_pretrained_net_file; - solver.net()->CopyTrainedLayersFrom(FLAGS_pretrained_net_file); + if (FLAGS_snapshot.size()) { + LOG(INFO) << "Resuming from " << FLAGS_snapshot; + solver.Solve(FLAGS_snapshot); + } else if (FLAGS_weights.size()) { + LOG(INFO) << "Finetuning from " << FLAGS_weights; + solver.net()->CopyTrainedLayersFrom(FLAGS_weights); solver.Solve(); } else { solver.Solve(); @@ -113,7 +111,7 @@ int time() { } // Instantiate the caffe net. Caffe::set_phase(Caffe::TRAIN); - Net caffe_net(FLAGS_net_proto_file); + Net caffe_net(FLAGS_model); // Do a clean forward and backward pass, so that memory allocation are done // and future iterations will be more stable. @@ -132,7 +130,7 @@ int time() { const vector >& bottom_need_backward = caffe_net.bottom_need_backward(); LOG(INFO) << "*** Benchmark begins ***"; - LOG(INFO) << "Testing for " << FLAGS_run_iterations << " iterations."; + LOG(INFO) << "Testing for " << FLAGS_iterations << " iterations."; Timer total_timer; total_timer.Start(); Timer forward_timer; @@ -141,7 +139,7 @@ int time() { for (int i = 0; i < layers.size(); ++i) { const caffe::string& layername = layers[i]->layer_param().name(); timer.Start(); - for (int j = 0; j < FLAGS_run_iterations; ++j) { + for (int j = 0; j < FLAGS_iterations; ++j) { layers[i]->Forward(bottom_vecs[i], &top_vecs[i]); } LOG(INFO) << layername << "\tforward: " << timer.MilliSeconds() << @@ -154,7 +152,7 @@ int time() { for (int i = layers.size() - 1; i >= 0; --i) { const caffe::string& layername = layers[i]->layer_param().name(); timer.Start(); - for (int j = 0; j < FLAGS_run_iterations; ++j) { + for (int j = 0; j < FLAGS_iterations; ++j) { layers[i]->Backward(top_vecs[i], bottom_need_backward[i], &bottom_vecs[i]); } From 5c46d79da98cc5a090bffd489cfbaca1b6f9e35d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 23:22:40 -0700 Subject: [PATCH 0407/2053] check required caffe cli args --- tools/caffe.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 1320b7a5e25..089fef39e1b 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -77,7 +77,10 @@ int device_query() { RegisterBrewFunction(device_query); int train() { - CHECK_GT(FLAGS_solver.size(), 0); + CHECK_GT(FLAGS_solver.size(), 0) << "Need a solver definition to train."; + CHECK(!FLAGS_snapshot.size() || !FLAGS_weights.size()) + << "Give a snapshot to resume training or weights to finetune " + "but not both."; caffe::SolverParameter solver_param; caffe::ReadProtoFromTextFileOrDie(FLAGS_solver, &solver_param); @@ -100,6 +103,8 @@ int train() { RegisterBrewFunction(train); int time() { + CHECK_GT(FLAGS_model.size(), 0) << "Need a model definition to time."; + // Set device id and mode if (FLAGS_gpu) { LOG(INFO) << "Use GPU with device id " << FLAGS_device_id; From 7dcf592a506754ea5faed1cf510410b41ef19f61 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 23:22:56 -0700 Subject: [PATCH 0408/2053] comment caffe cli --- tools/caffe.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 089fef39e1b..57e7a5ebdae 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -63,11 +63,13 @@ static BrewFunction GetBrewFunction(const caffe::string& name) { } } -// caffe actions that could be called in the form -// caffe.bin action -// To do so, define actions as "int action()" functions, and register it with +// caffe commands to call by +// caffe +// +// To add a command, define a function "int command()" and register it with // RegisterBrewFunction(action); +// Device Query: show diagnostic information for a GPU device. int device_query() { LOG(INFO) << "Querying device_id = " << FLAGS_device_id; caffe::Caffe::SetDevice(FLAGS_device_id); @@ -76,6 +78,8 @@ int device_query() { } RegisterBrewFunction(device_query); + +// Train / Finetune a model. int train() { CHECK_GT(FLAGS_solver.size(), 0) << "Need a solver definition to train."; CHECK(!FLAGS_snapshot.size() || !FLAGS_weights.size()) @@ -102,6 +106,8 @@ int train() { } RegisterBrewFunction(train); + +// Time: benchmark the execution time of a model. int time() { CHECK_GT(FLAGS_model.size(), 0) << "Need a model definition to time."; From 76633d335142741d99f24fa326f774ecbeaf311b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 23:38:17 -0700 Subject: [PATCH 0409/2053] consolidate test into caffe cli --- tools/caffe.cpp | 35 ++++++++++++++++++++++++++++++++ tools/test_net.cpp | 50 ++-------------------------------------------- 2 files changed, 37 insertions(+), 48 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 57e7a5ebdae..313803da654 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -107,6 +107,40 @@ int train() { RegisterBrewFunction(train); +// Test: score a model. +int test() { + CHECK_GT(FLAGS_model.size(), 0) << "Need a model definition to score."; + CHECK_GT(FLAGS_weights.size(), 0) << "Need model weights to score."; + + // Set device id and mode + if (FLAGS_gpu) { + LOG(INFO) << "Use GPU with device id " << FLAGS_device_id; + Caffe::SetDevice(FLAGS_device_id); + Caffe::set_mode(Caffe::GPU); + } else { + LOG(INFO) << "Use CPU."; + Caffe::set_mode(Caffe::CPU); + } + // Instantiate the caffe net. + Caffe::set_phase(Caffe::TEST); + Net caffe_net(FLAGS_model); + caffe_net.CopyTrainedLayersFrom(FLAGS_weights); + LOG(INFO) << "Running for " << FLAGS_iterations << " iterations."; + + double test_score = 0; + for (int i = 0; i < FLAGS_iterations; ++i) { + const vector*>& result = caffe_net.ForwardPrefilled(); + test_score += result[0]->cpu_data()[0]; + LOG(INFO) << "Batch " << i << ", score: " << result[0]->cpu_data()[0]; + } + test_score /= FLAGS_iterations; + LOG(INFO) << "Score: " << test_score; + + return 0; +} +RegisterBrewFunction(test); + + // Time: benchmark the execution time of a model. int time() { CHECK_GT(FLAGS_model.size(), 0) << "Need a model definition to time."; @@ -187,6 +221,7 @@ int main(int argc, char** argv) { "usage: caffe \n\n" "commands:\n" " train train or finetune a model\n" + " test score a model\n" " device_query show GPU diagnostic information\n" " time benchmark model execution time"); // Run tool or show usage. diff --git a/tools/test_net.cpp b/tools/test_net.cpp index de97ab8924c..cebbc4b1efc 100644 --- a/tools/test_net.cpp +++ b/tools/test_net.cpp @@ -1,53 +1,7 @@ -// This is a simple script that allows one to quickly test a network whose -// structure is specified by text format protocol buffers, and whose parameter -// are loaded from a pre-trained network. -// Usage: -// test_net net_proto pretrained_net_proto iterations [CPU/GPU] - -#include -#include -#include - #include "caffe/caffe.hpp" -using namespace caffe; // NOLINT(build/namespaces) - int main(int argc, char** argv) { - if (argc < 4 || argc > 6) { - LOG(ERROR) << "test_net net_proto pretrained_net_proto iterations " - << "[CPU/GPU] [Device ID]"; - return 1; - } - - Caffe::set_phase(Caffe::TEST); - - if (argc >= 5 && strcmp(argv[4], "GPU") == 0) { - Caffe::set_mode(Caffe::GPU); - int device_id = 0; - if (argc == 6) { - device_id = atoi(argv[5]); - } - Caffe::SetDevice(device_id); - LOG(ERROR) << "Using GPU #" << device_id; - } else { - LOG(ERROR) << "Using CPU"; - Caffe::set_mode(Caffe::CPU); - } - - Net caffe_test_net(argv[1]); - caffe_test_net.CopyTrainedLayersFrom(argv[2]); - - int total_iter = atoi(argv[3]); - LOG(ERROR) << "Running " << total_iter << " iterations."; - - double test_accuracy = 0; - for (int i = 0; i < total_iter; ++i) { - const vector*>& result = caffe_test_net.ForwardPrefilled(); - test_accuracy += result[0]->cpu_data()[0]; - LOG(ERROR) << "Batch " << i << ", accuracy: " << result[0]->cpu_data()[0]; - } - test_accuracy /= total_iter; - LOG(ERROR) << "Test accuracy: " << test_accuracy; - + LOG(FATAL) << "Deprecated. Use caffe.bin test --model=... " + "--weights=... instead."; return 0; } From e3de3d55de460e440c514cf3ac33dc406101ab3e Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 23:48:29 -0700 Subject: [PATCH 0410/2053] fix deprecation warnings --- tools/device_query.cpp | 2 +- tools/finetune_net.cpp | 4 ++-- tools/net_speed_benchmark.cpp | 4 ++-- tools/test_net.cpp | 2 +- tools/train_net.cpp | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tools/device_query.cpp b/tools/device_query.cpp index 2678154cbb4..03799e52b53 100644 --- a/tools/device_query.cpp +++ b/tools/device_query.cpp @@ -1,7 +1,7 @@ #include "caffe/common.hpp" int main(int argc, char** argv) { - LOG(FATAL) << "Deprecated. Use caffe.bin devicequery " + LOG(FATAL) << "Deprecated. Use caffe device_query " "[--device_id=0] instead."; return 0; } diff --git a/tools/finetune_net.cpp b/tools/finetune_net.cpp index 2966de48d17..81c0c354dbf 100644 --- a/tools/finetune_net.cpp +++ b/tools/finetune_net.cpp @@ -1,7 +1,7 @@ #include "caffe/caffe.hpp" int main(int argc, char** argv) { - LOG(FATAL) << "Deprecated. Use caffe.bin train --solver_proto_file=... " - "[--pretrained_net_file=...] instead."; + LOG(FATAL) << "Deprecated. Use caffe train --solver=... " + "[--weights=...] instead."; return 0; } diff --git a/tools/net_speed_benchmark.cpp b/tools/net_speed_benchmark.cpp index ff112bdff55..cd16e8d0984 100644 --- a/tools/net_speed_benchmark.cpp +++ b/tools/net_speed_benchmark.cpp @@ -1,7 +1,7 @@ #include "caffe/caffe.hpp" int main(int argc, char** argv) { - LOG(FATAL) << "Deprecated. Use caffe.bin speedtest --net_proto_file=... " - "[--run_iterations=50] [--speedtest_with_gpu] [--device_id=0]"; + LOG(FATAL) << "Deprecated. Use caffe time --model=... " + "[--iterations=50] [--gpu] [--device_id=0]"; return 0; } diff --git a/tools/test_net.cpp b/tools/test_net.cpp index cebbc4b1efc..92e14eeebaf 100644 --- a/tools/test_net.cpp +++ b/tools/test_net.cpp @@ -1,7 +1,7 @@ #include "caffe/caffe.hpp" int main(int argc, char** argv) { - LOG(FATAL) << "Deprecated. Use caffe.bin test --model=... " + LOG(FATAL) << "Deprecated. Use caffe test --model=... " "--weights=... instead."; return 0; } diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 26aeb40bd05..622bca311c8 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -1,7 +1,7 @@ #include "caffe/caffe.hpp" int main(int argc, char** argv) { - LOG(FATAL) << "Deprecated. Use caffe.bin train --solver_proto_file=... " - "[--resume_point_file=...] instead."; + LOG(FATAL) << "Deprecated. Use caffe train --solver=... " + "[--snapshot=...] instead."; return 0; } From 13d625b556ab473f98bd70ac1b13087c50fedddf Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 6 Aug 2014 23:56:06 -0700 Subject: [PATCH 0411/2053] update cli usage in examples --- examples/cifar10/train_full.sh | 19 +++++++++---------- examples/cifar10/train_quick.sh | 11 +++++------ examples/imagenet/resume_training.sh | 6 +++--- ...speedtest_imagenet.sh => time_imagenet.sh} | 6 +++--- examples/imagenet/train_alexnet.sh | 3 +-- examples/imagenet/train_imagenet.sh | 3 +-- examples/mnist/train_lenet.sh | 3 +-- examples/mnist/train_lenet_consolidated.sh | 3 +-- examples/mnist/train_mnist_autoencoder.sh | 3 +-- 9 files changed, 25 insertions(+), 32 deletions(-) rename examples/imagenet/{speedtest_imagenet.sh => time_imagenet.sh} (73%) diff --git a/examples/cifar10/train_full.sh b/examples/cifar10/train_full.sh index 930b27a1a32..9dd9ad79822 100755 --- a/examples/cifar10/train_full.sh +++ b/examples/cifar10/train_full.sh @@ -2,15 +2,14 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/caffe.bin train \ - --solver_proto_file=cifar10_full_solver.prototxt +$TOOLS/caffe train --solver=cifar10_full_solver.prototxt -#reduce learning rate by factor of 10 -GLOG_logtostderr=1 $TOOLS/caffe.bin train \ - --solver_proto_file=cifar10_full_solver_lr1.prototxt \ - --resume_point_file=cifar10_full_iter_60000.solverstate +# reduce learning rate by factor of 10 +$TOOLS/caffe train \ + --solver=cifar10_full_solver_lr1.prototxt \ + --snapshot=cifar10_full_iter_60000.solverstate -#reduce learning rate by factor of 10 -GLOG_logtostderr=1 $TOOLS/caffe.bin train \ - --solver_proto_file=cifar10_full_solver_lr2.prototxt \ - --resume_point_file=cifar10_full_iter_65000.solverstate +# reduce learning rate by factor of 10 +$TOOLS/caffe train \ + --solver=cifar10_full_solver_lr2.prototxt \ + --snapshot=cifar10_full_iter_65000.solverstate diff --git a/examples/cifar10/train_quick.sh b/examples/cifar10/train_quick.sh index 5e8fffccd48..e348e12fd94 100755 --- a/examples/cifar10/train_quick.sh +++ b/examples/cifar10/train_quick.sh @@ -2,10 +2,9 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/caffe.bin train \ - --solver_proto_file=cifar10_quick_solver.prototxt +$TOOLS/caffe.bin train --solver=cifar10_quick_solver.prototxt -#reduce learning rate by fctor of 10 after 8 epochs -GLOG_logtostderr=1 $TOOLS/caffe.bin train \ - --solver_proto_file=cifar10_quick_solver_lr1.prototxt \ - --resume_point_file=cifar10_quick_iter_4000.solverstate +# reduce learning rate by fctor of 10 after 8 epochs +$TOOLS/caffe.bin train \ + --solver=cifar10_quick_solver_lr1.prototxt \ + --snapshot=cifar10_quick_iter_4000.solverstate diff --git a/examples/imagenet/resume_training.sh b/examples/imagenet/resume_training.sh index b43a9b1bf7c..9e00d93c469 100755 --- a/examples/imagenet/resume_training.sh +++ b/examples/imagenet/resume_training.sh @@ -2,8 +2,8 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/caffe.bin train\ - --solver_proto_file=imagenet_solver.prototxt \ - --resume_point_file=caffe_imagenet_train_10000.solverstate +$TOOLS/caffe train\ + --solver=imagenet_solver.prototxt \ + --snapshot=caffe_imagenet_train_10000.solverstate echo "Done." diff --git a/examples/imagenet/speedtest_imagenet.sh b/examples/imagenet/time_imagenet.sh similarity index 73% rename from examples/imagenet/speedtest_imagenet.sh rename to examples/imagenet/time_imagenet.sh index c790d835c14..c83b0c021c7 100755 --- a/examples/imagenet/speedtest_imagenet.sh +++ b/examples/imagenet/time_imagenet.sh @@ -14,9 +14,9 @@ else DEVICE_ID=$1 fi -GLOG_logtostderr=1 $TOOLS/caffe.bin speedtest \ - --net_proto_file=imagenet_train_val.prototxt \ - --speedtest_with_gpu=${WITH_GPU} \ +$TOOLS/caffe time \ + --model=imagenet_train_val.prototxt \ + --gpu=${WITH_GPU} \ --device_id=${DEVICE_ID} echo "Done." diff --git a/examples/imagenet/train_alexnet.sh b/examples/imagenet/train_alexnet.sh index d43a235dba1..6a7c0577413 100755 --- a/examples/imagenet/train_alexnet.sh +++ b/examples/imagenet/train_alexnet.sh @@ -2,7 +2,6 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/caffe.bin train \ - --solver_proto_file=alexnet_solver.prototxt +$TOOLS/caffe train --solver=alexnet_solver.prototxt echo "Done." diff --git a/examples/imagenet/train_imagenet.sh b/examples/imagenet/train_imagenet.sh index 90dcdfaddb8..008b96c01a1 100755 --- a/examples/imagenet/train_imagenet.sh +++ b/examples/imagenet/train_imagenet.sh @@ -2,7 +2,6 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/caffe.bin train \ - --solver_proto_file=imagenet_solver.prototxt +$TOOLS/caffe train --solver=imagenet_solver.prototxt echo "Done." diff --git a/examples/mnist/train_lenet.sh b/examples/mnist/train_lenet.sh index 4d0f1eea051..b93e48fb629 100755 --- a/examples/mnist/train_lenet.sh +++ b/examples/mnist/train_lenet.sh @@ -2,5 +2,4 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/caffe.bin train \ - --solver_proto_file=lenet_solver.prototxt +$TOOLS/caffe train --solver=lenet_solver.prototxt diff --git a/examples/mnist/train_lenet_consolidated.sh b/examples/mnist/train_lenet_consolidated.sh index 802c801e31f..83fe895ba0b 100755 --- a/examples/mnist/train_lenet_consolidated.sh +++ b/examples/mnist/train_lenet_consolidated.sh @@ -2,5 +2,4 @@ TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/caffe.bin train \ - --solver_proto_file=lenet_consolidated_solver.prototxt +$TOOLS/caffe train --solver=lenet_consolidated_solver.prototxt diff --git a/examples/mnist/train_mnist_autoencoder.sh b/examples/mnist/train_mnist_autoencoder.sh index 3fb493534db..628c74b969a 100755 --- a/examples/mnist/train_mnist_autoencoder.sh +++ b/examples/mnist/train_mnist_autoencoder.sh @@ -1,5 +1,4 @@ #!/bin/bash TOOLS=../../build/tools -GLOG_logtostderr=1 $TOOLS/caffe.bin train \ - --solver_proto_file=mnist_autoencoder_solver.prototxt +$TOOLS/caffe.bin train --solver=mnist_autoencoder_solver.prototxt From 3b07be06a459f655b8cfa3e9d87bd534be5247d4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 7 Aug 2014 11:56:45 -0700 Subject: [PATCH 0412/2053] consolidate gpu and device_id args in caffe tool --- examples/imagenet/time_imagenet.sh | 17 ++++++----------- tools/caffe.cpp | 23 +++++++++++------------ 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/examples/imagenet/time_imagenet.sh b/examples/imagenet/time_imagenet.sh index c83b0c021c7..c448b4977ce 100755 --- a/examples/imagenet/time_imagenet.sh +++ b/examples/imagenet/time_imagenet.sh @@ -3,20 +3,15 @@ TOOLS=../../build/tools if [ -z "$1" ]; then - echo "Using CPU! To run GPU speedtest, use:" - echo " ./speedtest_imagenet.sh " - echo "(Try ./speedtest_imagenet.sh 0 if you have just one GPU.)" + echo "Using CPU! To time GPU mode, use:" + echo " ./time_imagenet.sh " + echo "(Try ./time_imagenet.sh 0 if you have just one GPU.)" sleep 3 # Let the user read - WITH_GPU=false - DEVICE_ID=0 + GPU="" else - WITH_GPU=true - DEVICE_ID=$1 + GPU="--gpu=$1" fi -$TOOLS/caffe time \ - --model=imagenet_train_val.prototxt \ - --gpu=${WITH_GPU} \ - --device_id=${DEVICE_ID} +$TOOLS/caffe time --model=imagenet_train_val.prototxt ${GPU} echo "Done." diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 313803da654..22d9eb19912 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -17,10 +17,8 @@ using caffe::Timer; using caffe::vector; -DEFINE_int32(device_id, 0, - "The GPU device ID to use."); -DEFINE_bool(gpu, false, - "Run in GPU mode when true."); +DEFINE_int32(gpu, -1, + "Run in GPU mode on given device ID."); DEFINE_string(solver, "", "The solver definition protocol buffer text file."); DEFINE_string(model, "", @@ -71,8 +69,9 @@ static BrewFunction GetBrewFunction(const caffe::string& name) { // Device Query: show diagnostic information for a GPU device. int device_query() { - LOG(INFO) << "Querying device_id = " << FLAGS_device_id; - caffe::Caffe::SetDevice(FLAGS_device_id); + CHECK_GT(FLAGS_gpu, -1) << "Need a device ID to query."; + LOG(INFO) << "Querying device ID = " << FLAGS_gpu; + caffe::Caffe::SetDevice(FLAGS_gpu); caffe::Caffe::DeviceQuery(); return 0; } @@ -113,9 +112,9 @@ int test() { CHECK_GT(FLAGS_weights.size(), 0) << "Need model weights to score."; // Set device id and mode - if (FLAGS_gpu) { - LOG(INFO) << "Use GPU with device id " << FLAGS_device_id; - Caffe::SetDevice(FLAGS_device_id); + if (FLAGS_gpu >= 0) { + LOG(INFO) << "Use GPU with device ID " << FLAGS_gpu; + Caffe::SetDevice(FLAGS_gpu); Caffe::set_mode(Caffe::GPU); } else { LOG(INFO) << "Use CPU."; @@ -146,9 +145,9 @@ int time() { CHECK_GT(FLAGS_model.size(), 0) << "Need a model definition to time."; // Set device id and mode - if (FLAGS_gpu) { - LOG(INFO) << "Use GPU with device id " << FLAGS_device_id; - Caffe::SetDevice(FLAGS_device_id); + if (FLAGS_gpu >= 0) { + LOG(INFO) << "Use GPU with device ID " << FLAGS_gpu; + Caffe::SetDevice(FLAGS_gpu); Caffe::set_mode(Caffe::GPU); } else { LOG(INFO) << "Use CPU."; From c9fd6608095348feb20f2a7fbfdcbe1a2353d57d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 8 Aug 2014 11:18:46 -0700 Subject: [PATCH 0413/2053] [example] fix broken links in ImageNet recipe --- examples/imagenet/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index ec2a39bfd23..883e09272f1 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -12,7 +12,7 @@ Yangqing's Recipe on Brewing ImageNet "All your braincells are belong to us." - Caffeine -We are going to describe a reference implementation for the approach first proposed by Krizhevsky, Sutskever, and Hinton in their [NIPS 2012 paper](http://books.nips.cc/papers/files/nips25/NIPS2012_0534.pdf). Since training the whole model takes some time and energy, we provide a model, trained in the same way as we describe here, to help fight global warming. If you would like to simply use the pretrained model, check out the [Pretrained ImageNet](getting_pretrained_models.html) page. *Note that the pretrained model is for academic research / non-commercial use only*. +We are going to describe a reference implementation for the approach first proposed by Krizhevsky, Sutskever, and Hinton in their [NIPS 2012 paper](http://books.nips.cc/papers/files/nips25/NIPS2012_0534.pdf). Since training the whole model takes some time and energy, we provide a model, trained in the same way as we describe here, to help fight global warming. If you would like to simply use the pretrained model, check out the [Pretrained ImageNet](../../getting_pretrained_models.html) page. *Note that the pretrained model is for academic research / non-commercial use only*. To clarify, by ImageNet we actually mean the ILSVRC12 challenge, but you can easily train on the whole of ImageNet as well, just with more disk space, and a little longer training time. @@ -102,4 +102,4 @@ Parting Words Hope you liked this recipe! Many researchers have gone further since the ILSVRC 2012 challenge, changing the network architecture and/or finetuning the various parameters in the network. The recent ILSVRC 2013 challenge suggests that there are quite some room for improvement. **Caffe allows one to explore different network choices more easily, by simply writing different prototxt files** - isn't that exciting? -And since now you have a trained network, check out how to use it: [Running Pretrained ImageNet](getting_pretrained_models.html). This time we will use Python, but if you have wrappers for other languages, please kindly send a pull request! +And since now you have a trained network, check out how to use it: [Running Pretrained ImageNet](../../getting_pretrained_models.html). This time we will use Python, but if you have wrappers for other languages, please kindly send a pull request! From 70a6b0b71d2ec894689c85291bae5e64d44b0584 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 8 Aug 2014 12:01:39 -0700 Subject: [PATCH 0414/2053] [docs] fix find complaint in example gathering script --- scripts/gather_examples.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/gather_examples.sh b/scripts/gather_examples.sh index dd6cef0df1b..3fc726065ba 100755 --- a/scripts/gather_examples.sh +++ b/scripts/gather_examples.sh @@ -22,7 +22,7 @@ for README_FILENAME in $(find examples -iname "readme.md"); do done # Gather docs from examples/*.ipynb and add YAML front-matter. -for NOTEBOOK_FILENAME in $(find examples -d 1 -iname "*.ipynb"); do +for NOTEBOOK_FILENAME in $(find examples -depth -iname "*.ipynb"); do DOCS_FILENAME=$GATHERED_DIR/$NOTEBOOK_FILENAME mkdir -p `dirname $DOCS_FILENAME` python scripts/copy_notebook.py $NOTEBOOK_FILENAME $DOCS_FILENAME From 2243aa5007cf92acf44bb995f796653490caec5e Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 8 Aug 2014 12:40:42 -0700 Subject: [PATCH 0415/2053] [example] fix example names --- .../{imagenet_classification.ipynb => classification.ipynb} | 2 +- examples/filter_visualization.ipynb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename examples/{imagenet_classification.ipynb => classification.ipynb} (99%) diff --git a/examples/imagenet_classification.ipynb b/examples/classification.ipynb similarity index 99% rename from examples/imagenet_classification.ipynb rename to examples/classification.ipynb index fc08c743093..302bdea0e00 100644 --- a/examples/imagenet_classification.ipynb +++ b/examples/classification.ipynb @@ -1,7 +1,7 @@ { "metadata": { + "name": "ImageNet classification", "description": "Use the pre-trained ImageNet model to classify images with the Python interface.", - "name": "ImageNet Classification", "include_in_docs": true }, "nbformat": 3, diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index bbc919ba68b..5165d840b7b 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -1,8 +1,8 @@ { "metadata": { + "name": "Filter visualization", "description": "Extracting features and visualizing trained filters with an example image, viewed layer-by-layer.", - "include_in_docs": true, - "name": "" + "include_in_docs": true }, "nbformat": 3, "nbformat_minor": 0, From c5a1aa51a5737bfac41f521df2decb67ab71f6b4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 8 Aug 2014 12:40:42 -0700 Subject: [PATCH 0416/2053] [example] fix example names --- .../{imagenet_classification.ipynb => classification.ipynb} | 2 +- examples/filter_visualization.ipynb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename examples/{imagenet_classification.ipynb => classification.ipynb} (99%) diff --git a/examples/imagenet_classification.ipynb b/examples/classification.ipynb similarity index 99% rename from examples/imagenet_classification.ipynb rename to examples/classification.ipynb index fc08c743093..302bdea0e00 100644 --- a/examples/imagenet_classification.ipynb +++ b/examples/classification.ipynb @@ -1,7 +1,7 @@ { "metadata": { + "name": "ImageNet classification", "description": "Use the pre-trained ImageNet model to classify images with the Python interface.", - "name": "ImageNet Classification", "include_in_docs": true }, "nbformat": 3, diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index bbc919ba68b..5165d840b7b 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -1,8 +1,8 @@ { "metadata": { + "name": "Filter visualization", "description": "Extracting features and visualizing trained filters with an example image, viewed layer-by-layer.", - "include_in_docs": true, - "name": "" + "include_in_docs": true }, "nbformat": 3, "nbformat_minor": 0, From c8b6457de5b9ba194c5539c81a05591bca6b3e1b Mon Sep 17 00:00:00 2001 From: Ronghang Hu Date: Fri, 8 Aug 2014 15:47:23 -0700 Subject: [PATCH 0417/2053] add necessary input checks for matcaffe --- matlab/caffe/matcaffe.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index 957ebea008e..f4a2425c6c1 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -50,6 +50,10 @@ static mxArray* do_forward(const mxArray* const bottom) { input_blobs.size()); for (unsigned int i = 0; i < input_blobs.size(); ++i) { const mxArray* const elem = mxGetCell(bottom, i); + CHECK(mxIsSingle(elem)) + << "MatCaffe require single-precision float point data"; + CHECK_EQ(mxGetNumberOfElements(elem), input_blobs[i]->count()) + << "MatCaffe input size does not match the input size of the network"; const float* const data_ptr = reinterpret_cast(mxGetPr(elem)); switch (Caffe::mode()) { From 148eb67d66e584041c499b6ef4ae9e47916dd12b Mon Sep 17 00:00:00 2001 From: Kai Li Date: Sat, 9 Aug 2014 20:11:38 +0800 Subject: [PATCH 0418/2053] Fix the gflags namespace issue --- include/caffe/common.hpp | 10 ++++++++++ src/caffe/common.cpp | 14 +------------- tools/caffe.cpp | 1 - 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 97a34962c63..9008eae02bf 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -2,6 +2,7 @@ #define CAFFE_COMMON_HPP_ #include +#include #include #include @@ -11,6 +12,15 @@ #include "caffe/util/device_alternate.hpp" +// gflags 2.1 issue: namespace google was changed to gflags without warning. +// Luckily we will be able to use GFLAGS_GFAGS_H_ to detect if it is version +// 2.1. If yes , we will add a temporary solution to redirect the namespace. +// TODO(Yangqing): Once gflags solves the problem in a more elegant way, let's +// remove the following hack. +#ifndef GFLAGS_GFLAGS_H_ +namespace gflags = google; +#endif // GFLAGS_GFLAGS_H_ + // Disable the copy and assignment operator for a class. #define DISABLE_COPY_AND_ASSIGN(classname) \ private:\ diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 99b2292461e..e6c0a4f56a3 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -6,17 +5,6 @@ #include "caffe/common.hpp" #include "caffe/util/rng.hpp" -// gflags 2.1 issue: namespace google was changed to gflags without warning. -// Luckily we will be able to use GFLAGS_GFAGS_H_ to detect if it is version -// 2.1. If yes , we will add a temporary solution to redirect the namespace. -// TODO(Yangqing): Once gflags solves the problem in a more elegant way, let's -// remove the following hack. -#ifdef GFLAGS_GFLAGS_H_ -namespace google { -using ::gflags::ParseCommandLineFlags; -} // namespace google -#endif // GFLAGS_GFLAGS_H_ - namespace caffe { shared_ptr Caffe::singleton_; @@ -44,7 +32,7 @@ int64_t cluster_seedgen(void) { void GlobalInit(int* pargc, char*** pargv) { // Google flags. - ::google::ParseCommandLineFlags(pargc, pargv, true); + ::gflags::ParseCommandLineFlags(pargc, pargv, true); // Google logging. ::google::InitGoogleLogging(*(pargv)[0]); } diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 22d9eb19912..13398ae8577 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -1,4 +1,3 @@ -#include #include #include From e114edf205dbec65653b45cef14c1ee4b7a47081 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Sat, 9 Aug 2014 20:41:58 +0800 Subject: [PATCH 0419/2053] Distribute the generated proto header files --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 84f8db26abb..2c071c8a8ce 100644 --- a/Makefile +++ b/Makefile @@ -558,6 +558,8 @@ $(DIST_ALIASES): $(DISTRIBUTE_DIR) $(DISTRIBUTE_DIR): all py $(HXX_SRCS) | $(DISTRIBUTE_SUBDIRS) # add include cp -r include $(DISTRIBUTE_DIR)/ + mkdir -p $(DISTRIBUTE_DIR)/include/caffe/proto + cp $(PROTO_GEN_HEADER_SRCS) $(DISTRIBUTE_DIR)/include/caffe/proto # add tool and example binaries cp $(TOOL_BINS) $(DISTRIBUTE_DIR)/bin cp $(EXAMPLE_BINS) $(DISTRIBUTE_DIR)/bin From 7dc646398064cdf7ca1e636edd285f73ea69592f Mon Sep 17 00:00:00 2001 From: Kai Li Date: Sat, 9 Aug 2014 20:11:38 +0800 Subject: [PATCH 0420/2053] Fix the gflags namespace issue --- include/caffe/common.hpp | 10 ++++++++++ src/caffe/common.cpp | 14 +------------- tools/caffe.cpp | 1 - 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 97a34962c63..9008eae02bf 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -2,6 +2,7 @@ #define CAFFE_COMMON_HPP_ #include +#include #include #include @@ -11,6 +12,15 @@ #include "caffe/util/device_alternate.hpp" +// gflags 2.1 issue: namespace google was changed to gflags without warning. +// Luckily we will be able to use GFLAGS_GFAGS_H_ to detect if it is version +// 2.1. If yes , we will add a temporary solution to redirect the namespace. +// TODO(Yangqing): Once gflags solves the problem in a more elegant way, let's +// remove the following hack. +#ifndef GFLAGS_GFLAGS_H_ +namespace gflags = google; +#endif // GFLAGS_GFLAGS_H_ + // Disable the copy and assignment operator for a class. #define DISABLE_COPY_AND_ASSIGN(classname) \ private:\ diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 99b2292461e..e6c0a4f56a3 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -1,4 +1,3 @@ -#include #include #include #include @@ -6,17 +5,6 @@ #include "caffe/common.hpp" #include "caffe/util/rng.hpp" -// gflags 2.1 issue: namespace google was changed to gflags without warning. -// Luckily we will be able to use GFLAGS_GFAGS_H_ to detect if it is version -// 2.1. If yes , we will add a temporary solution to redirect the namespace. -// TODO(Yangqing): Once gflags solves the problem in a more elegant way, let's -// remove the following hack. -#ifdef GFLAGS_GFLAGS_H_ -namespace google { -using ::gflags::ParseCommandLineFlags; -} // namespace google -#endif // GFLAGS_GFLAGS_H_ - namespace caffe { shared_ptr Caffe::singleton_; @@ -44,7 +32,7 @@ int64_t cluster_seedgen(void) { void GlobalInit(int* pargc, char*** pargv) { // Google flags. - ::google::ParseCommandLineFlags(pargc, pargv, true); + ::gflags::ParseCommandLineFlags(pargc, pargv, true); // Google logging. ::google::InitGoogleLogging(*(pargv)[0]); } diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 22d9eb19912..13398ae8577 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -1,4 +1,3 @@ -#include #include #include From f8b612d8cdfae97c004db307ab84df78d25e679b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 9 Aug 2014 20:43:40 -0700 Subject: [PATCH 0421/2053] default raw_scale in python scripts to ImageNet model value --- python/classify.py | 3 ++- python/detect.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/python/classify.py b/python/classify.py index d3d239cbb7d..ddc5429feac 100755 --- a/python/classify.py +++ b/python/classify.py @@ -66,11 +66,12 @@ def main(argv): parser.add_argument( "--input_scale", type=float, - help="Multiply input features by this scale to finish input preprocessing." + help="Multiply input features by this scale to finish preprocessing." ) parser.add_argument( "--raw_scale", type=float, + default=255.0, help="Multiply raw input by this scale before preprocessing." ) parser.add_argument( diff --git a/python/detect.py b/python/detect.py index 77f4676aec1..4598fc7a327 100755 --- a/python/detect.py +++ b/python/detect.py @@ -76,11 +76,12 @@ def main(argv): parser.add_argument( "--input_scale", type=float, - help="Multiply input features by this scale to finish input preprocessing." + help="Multiply input features by this scale to finish preprocessing." ) parser.add_argument( "--raw_scale", type=float, + default=255.0, help="Multiply raw input by this scale before preprocessing." ) parser.add_argument( From b123fcc635317853cc9861f57c71d2f5e70ea8bc Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 9 Aug 2014 22:24:15 -0700 Subject: [PATCH 0422/2053] output loss for caffenet and alexnet train/val models --- examples/imagenet/alexnet_train_val.prototxt | 1 + examples/imagenet/imagenet_train_val.prototxt | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/imagenet/alexnet_train_val.prototxt b/examples/imagenet/alexnet_train_val.prototxt index f65f3e7f87e..8d7977d981e 100644 --- a/examples/imagenet/alexnet_train_val.prototxt +++ b/examples/imagenet/alexnet_train_val.prototxt @@ -336,4 +336,5 @@ layers { type: SOFTMAX_LOSS bottom: "fc8" bottom: "label" + top: "loss" } diff --git a/examples/imagenet/imagenet_train_val.prototxt b/examples/imagenet/imagenet_train_val.prototxt index af28c1495e5..ea1f907f00d 100644 --- a/examples/imagenet/imagenet_train_val.prototxt +++ b/examples/imagenet/imagenet_train_val.prototxt @@ -336,4 +336,5 @@ layers { type: SOFTMAX_LOSS bottom: "fc8" bottom: "label" + top: "loss" } From 6c4dd5aa989cee6793233552b872ff199c451c77 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 9 Aug 2014 22:24:15 -0700 Subject: [PATCH 0423/2053] output loss for caffenet and alexnet train/val models --- examples/imagenet/alexnet_train_val.prototxt | 1 + examples/imagenet/imagenet_train_val.prototxt | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/imagenet/alexnet_train_val.prototxt b/examples/imagenet/alexnet_train_val.prototxt index f65f3e7f87e..8d7977d981e 100644 --- a/examples/imagenet/alexnet_train_val.prototxt +++ b/examples/imagenet/alexnet_train_val.prototxt @@ -336,4 +336,5 @@ layers { type: SOFTMAX_LOSS bottom: "fc8" bottom: "label" + top: "loss" } diff --git a/examples/imagenet/imagenet_train_val.prototxt b/examples/imagenet/imagenet_train_val.prototxt index af28c1495e5..ea1f907f00d 100644 --- a/examples/imagenet/imagenet_train_val.prototxt +++ b/examples/imagenet/imagenet_train_val.prototxt @@ -336,4 +336,5 @@ layers { type: SOFTMAX_LOSS bottom: "fc8" bottom: "label" + top: "loss" } From 2288d282fbf63ede3c6fd0fc590aafed3ecb4e39 Mon Sep 17 00:00:00 2001 From: netheril96 Date: Sun, 10 Aug 2014 23:31:29 +0800 Subject: [PATCH 0424/2053] Use gflags to show help when the arguments not correct --- tools/convert_imageset.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index b628a357185..0f122ea57cc 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -59,7 +59,7 @@ int main(int argc, char** argv) { gflags::ParseCommandLineFlags(&argc, &argv, true); if (argc != 4) { - fputs("Use --help to see detailed description of usage\n", stdout); + gflags::ShowUsageWithFlagsRestrict(argv[0], "tools/convert_imageset"); return 1; } From 1d4d1d668a3f3714c514b9cabad8b97375609c97 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sun, 10 Aug 2014 21:23:34 -0700 Subject: [PATCH 0425/2053] fix formatting error in blob.hpp --- include/caffe/blob.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index eb0c25ba394..69600290858 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -23,7 +23,7 @@ class Blob { inline int channels() const { return channels_; } inline int height() const { return height_; } inline int width() const { return width_; } - inline int count() const {return count_; } + inline int count() const { return count_; } inline int offset(const int n, const int c = 0, const int h = 0, const int w = 0) const { CHECK_GE(n, 0); From f072600bb1ae60cd9dc97ad4b8deb829a62cfdc4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 11 Aug 2014 00:27:38 -0700 Subject: [PATCH 0426/2053] [docs] fix example links from install guide --- docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index ff0760dd060..73a35395c4e 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -208,7 +208,7 @@ Be sure to set your MATLAB and Python paths in `Makefile.config` first! *Speed*: for a faster build, compile in parallel by doing `make all -j8` where 8 is the number of parallel threads for compilation (a good choice for the number of threads is the number of cores in your machine). -Now that you have installed Caffe, check out the [MNIST demo](mnist.html) and the pretrained [ImageNet example](imagenet.html). +Now that you have installed Caffe, check out the [MNIST tutorial](gathered/examples/mnist.html) and the [reference ImageNet model tutorial](gathered/examples/imagenet.html). ## Hardware Questions From b1d6da5740a3031a633d7fa6e4c0f7fa4dc77ebf Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Mon, 11 Aug 2014 09:16:51 -0700 Subject: [PATCH 0427/2053] Add a leveldb option function in io.hpp/cpp --- include/caffe/util/io.hpp | 6 ++++++ src/caffe/layers/data_layer.cpp | 3 +-- src/caffe/util/io.cpp | 9 +++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index cdf4d9e724e..8ff8b0c25ae 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -12,6 +12,11 @@ #define HDF5_NUM_DIMS 4 +namespace leveldb { +// Forward declaration for leveldb::Options to be used in GetlevelDBOptions(). +class Options; +} + namespace caffe { using ::google::protobuf::Message; @@ -70,6 +75,7 @@ inline bool ReadImageToDatum(const string& filename, const int label, return ReadImageToDatum(filename, label, 0, 0, datum); } +leveldb::Options GetLevelDBOptions(); template void hdf5_load_nd_dataset_helper( diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index c089c9ba5df..8f17c45e5f6 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -173,9 +173,8 @@ void DataLayer::SetUp(const vector*>& bottom, case DataParameter_DB_LEVELDB: { leveldb::DB* db_temp; - leveldb::Options options; + leveldb::Options options = GetLevelDBOptions(); options.create_if_missing = false; - options.max_open_files = 100; LOG(INFO) << "Opening leveldb " << this->layer_param_.data_param().source(); leveldb::Status status = leveldb::DB::Open( options, this->layer_param_.data_param().source(), &db_temp); diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index fd7454d4f98..48952a53f96 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -108,6 +109,14 @@ bool ReadImageToDatum(const string& filename, const int label, return true; } +leveldb::Options GetLevelDBOptions() { + // In default, we will return the leveldb option and set the max open files + // in order to avoid using up the operating system's limit. + leveldb::Options options; + options.max_open_files = 100; + return options; +} + // Verifies format of data stored in HDF5 file and reshapes blob accordingly. template void hdf5_load_nd_dataset_helper( From b04aa0036979d0c34ef96c150abb34e21bdf1a7b Mon Sep 17 00:00:00 2001 From: qipeng Date: Sun, 3 Aug 2014 18:19:58 -0700 Subject: [PATCH 0428/2053] mean-variance normalization layer --- include/caffe/vision_layers.hpp | 33 +++++++ src/caffe/layers/mvn_layer.cpp | 151 ++++++++++++++++++++++++++++++ src/caffe/layers/mvn_layer.cu | 129 +++++++++++++++++++++++++ src/caffe/proto/caffe.proto | 3 +- src/caffe/test/test_mvn_layer.cpp | 85 +++++++++++++++++ 5 files changed, 400 insertions(+), 1 deletion(-) create mode 100644 src/caffe/layers/mvn_layer.cpp create mode 100644 src/caffe/layers/mvn_layer.cu create mode 100644 src/caffe/test/test_mvn_layer.cpp diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 0797065081f..a6844cd6930 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -234,6 +234,39 @@ class LRNLayer : public Layer { vector*> product_bottom_vec_; }; +/* MVNLayer + */ +template +class MVNLayer : public Layer { + public: + explicit MVNLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_MVN; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + + Blob mean_, variance_, temp_; + + // sum_multiplier is just used to carry out sum using blas + Blob sum_multiplier_; +}; + + /* PoolingLayer */ template diff --git a/src/caffe/layers/mvn_layer.cpp b/src/caffe/layers/mvn_layer.cpp new file mode 100644 index 00000000000..7e6a97c16dd --- /dev/null +++ b/src/caffe/layers/mvn_layer.cpp @@ -0,0 +1,151 @@ +// Copyright 2014 BVLC and contributors. +// +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void MVNLayer::SetUp(const vector*>& bottom, + vector*>* top) { + Layer::SetUp(bottom, top); + (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); + mean_.Reshape(bottom[0]->num(), bottom[0]->channels(), + 1, 1); + variance_.Reshape(bottom[0]->num(), bottom[0]->channels(), + 1, 1); + temp_.Reshape(bottom[0]->num(), bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); + sum_multiplier_.Reshape(1, 1, + bottom[0]->height(), bottom[0]->width()); + Dtype* multiplier_data = sum_multiplier_.mutable_cpu_data(); + for (int i = 0; i < sum_multiplier_.count(); ++i) { + multiplier_data[i] = 1.; + } +} + +template +Dtype MVNLayer::Forward_cpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + int num = bottom[0]->num() * bottom[0]->channels(); + int dim = bottom[0]->count() / num; + Dtype eps = 1e-10; + + // put the squares of bottom into temp_ + caffe_powx(bottom[0]->count(), bottom_data, Dtype(2), + temp_.mutable_cpu_data()); + + // computes variance using var(X) = E(X^2) - (EX)^2 + caffe_cpu_gemv(CblasNoTrans, num, dim, 1., bottom_data, + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); + caffe_cpu_gemv(CblasNoTrans, num, dim, 1., temp_.cpu_data(), + sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); + caffe_cpu_scale(mean_.count(), Dtype(1. / dim), mean_.cpu_data(), + mean_.mutable_cpu_data()); // EX + caffe_cpu_scale(mean_.count(), Dtype(1. / dim), variance_.cpu_data(), + variance_.mutable_cpu_data()); // E(X^2) + caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), + temp_.mutable_cpu_data()); // (EX)^2 + caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), + variance_.mutable_cpu_data()); // variance + + // do mean and variance normalization + // subtract mean + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., + mean_.cpu_data(), sum_multiplier_.cpu_data(), 0., + temp_.mutable_cpu_data()); + + caffe_add(temp_.count(), bottom_data, temp_.cpu_data(), top_data); + + // normalize variance + caffe_powx(variance_.count(), variance_.cpu_data(), Dtype(0.5), + variance_.mutable_cpu_data()); + + caffe_add_scalar(variance_.count(), eps, variance_.mutable_cpu_data()); + + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + variance_.cpu_data(), sum_multiplier_.cpu_data(), 0., + temp_.mutable_cpu_data()); + + caffe_div(temp_.count(), top_data, temp_.cpu_data(), top_data); + + return Dtype(0); +} + +template +void MVNLayer::Backward_cpu(const vector*>& top, + const vector& propagate_down, + vector*>* bottom) { + const Dtype* top_diff = top[0]->cpu_diff(); + const Dtype* top_data = top[0]->cpu_data(); + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + + int num = (*bottom)[0]->num() * (*bottom)[0]->channels(); + int dim = (*bottom)[0]->count() / num; + Dtype eps = 1e-10; + + caffe_mul(temp_.count(), top_data, top_diff, bottom_diff); + caffe_cpu_gemv(CblasNoTrans, num, dim, 1., bottom_diff, + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + mean_.cpu_data(), sum_multiplier_.cpu_data(), 0., + bottom_diff); + caffe_mul(temp_.count(), top_data, bottom_diff, bottom_diff); + + caffe_cpu_gemv(CblasNoTrans, num, dim, 1., top_diff, + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + mean_.cpu_data(), sum_multiplier_.cpu_data(), 1., + bottom_diff); + + caffe_cpu_axpby(temp_.count(), Dtype(1), top_diff, Dtype(-1. / dim), + bottom_diff); + + // put the squares of bottom into temp_ + caffe_powx(temp_.count(), bottom_data, Dtype(2), + temp_.mutable_cpu_data()); + + // computes variance using var(X) = E(X^2) - (EX)^2 + caffe_cpu_gemv(CblasNoTrans, num, dim, 1., bottom_data, + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); + caffe_cpu_gemv(CblasNoTrans, num, dim, 1., temp_.cpu_data(), + sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); + caffe_cpu_scale(mean_.count(), Dtype(1. / dim), mean_.cpu_data(), + mean_.mutable_cpu_data()); // EX + caffe_cpu_scale(mean_.count(), Dtype(1. / dim), variance_.cpu_data(), + variance_.mutable_cpu_data()); // E(X^2) + caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), + temp_.mutable_cpu_data()); // (EX)^2 + caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), + variance_.mutable_cpu_data()); // variance + + // normalize variance + caffe_powx(variance_.count(), variance_.cpu_data(), Dtype(0.5), + variance_.mutable_cpu_data()); + + caffe_add_scalar(variance_.count(), eps, variance_.mutable_cpu_data()); + + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + variance_.cpu_data(), sum_multiplier_.cpu_data(), 0., + temp_.mutable_cpu_data()); + + caffe_div(temp_.count(), bottom_diff, temp_.cpu_data(), bottom_diff); +} + + +#ifdef CPU_ONLY +STUB_GPU(MVNLayer); +#endif + +INSTANTIATE_CLASS(MVNLayer); + + +} // namespace caffe diff --git a/src/caffe/layers/mvn_layer.cu b/src/caffe/layers/mvn_layer.cu new file mode 100644 index 00000000000..3714d49f2b1 --- /dev/null +++ b/src/caffe/layers/mvn_layer.cu @@ -0,0 +1,129 @@ +// Copyright 2014 BVLC and contributors. +// +#include +#include + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +Dtype MVNLayer::Forward_gpu(const vector*>& bottom, + vector*>* top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + int num = bottom[0]->num() * bottom[0]->channels(); + int dim = bottom[0]->count() / num; + + // put the squares of bottom into temp_ + caffe_gpu_powx(bottom[0]->count(), bottom_data, Dtype(2), + temp_.mutable_gpu_data()); + + // computes variance using var(X) = E(X^2) - (EX)^2 + caffe_gpu_gemv(CblasNoTrans, num, dim, 1., bottom_data, + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); + caffe_gpu_gemv(CblasNoTrans, num, dim, 1., temp_.gpu_data(), + sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); + caffe_gpu_scale(mean_.count(), Dtype(1. / dim), mean_.gpu_data(), + mean_.mutable_gpu_data()); // EX + caffe_gpu_scale(mean_.count(), Dtype(1. / dim), variance_.gpu_data(), + variance_.mutable_gpu_data()); // E(X^2) + caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), + temp_.mutable_gpu_data()); // (EX)^2 + caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), + variance_.mutable_gpu_data()); // variance + + Dtype eps = 1e-10; + + // do mean and variance normalization + // subtract mean + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., + mean_.gpu_data(), sum_multiplier_.gpu_data(), 0., + temp_.mutable_gpu_data()); + + caffe_gpu_add(temp_.count(), bottom_data, temp_.gpu_data(), top_data); + + // normalize variance + caffe_gpu_powx(variance_.count(), variance_.gpu_data(), Dtype(0.5), + variance_.mutable_gpu_data()); + + caffe_gpu_add_scalar(variance_.count(), eps, variance_.mutable_gpu_data()); + + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + variance_.gpu_data(), sum_multiplier_.gpu_data(), 0., + temp_.mutable_gpu_data()); + + caffe_gpu_div(temp_.count(), top_data, temp_.gpu_data(), top_data); + + return Dtype(0); +} + +template +void MVNLayer::Backward_gpu(const vector*>& top, + const vector& propagate_down, + vector*>* bottom) { + const Dtype* top_diff = top[0]->gpu_diff(); + const Dtype* top_data = top[0]->gpu_data(); + const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + + int num = (*bottom)[0]->num() * (*bottom)[0]->channels(); + int dim = (*bottom)[0]->count() / num; + + Dtype eps = 1e-10; + + caffe_gpu_mul(temp_.count(), top_data, top_diff, bottom_diff); + caffe_gpu_gemv(CblasNoTrans, num, dim, 1., bottom_diff, + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + mean_.gpu_data(), sum_multiplier_.gpu_data(), 0., + bottom_diff); + caffe_gpu_mul(temp_.count(), top_data, bottom_diff, bottom_diff); + + caffe_gpu_gemv(CblasNoTrans, num, dim, 1., top_diff, + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + mean_.gpu_data(), sum_multiplier_.gpu_data(), 1., + bottom_diff); + + caffe_gpu_axpby(temp_.count(), Dtype(1), top_diff, Dtype(-1. / dim), + bottom_diff); + + // put the squares of bottom into temp_ + caffe_gpu_powx(temp_.count(), bottom_data, Dtype(2), + temp_.mutable_gpu_data()); + + // computes variance using var(X) = E(X^2) - (EX)^2 + caffe_gpu_gemv(CblasNoTrans, num, dim, 1., bottom_data, + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); + caffe_gpu_gemv(CblasNoTrans, num, dim, 1., temp_.gpu_data(), + sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); + caffe_gpu_scale(mean_.count(), Dtype(1. / dim), mean_.gpu_data(), + mean_.mutable_gpu_data()); // EX + caffe_gpu_scale(mean_.count(), Dtype(1. / dim), variance_.gpu_data(), + variance_.mutable_gpu_data()); // E(X^2) + caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), + temp_.mutable_gpu_data()); // (EX)^2 + caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), + variance_.mutable_gpu_data()); // variance + + // normalize variance + caffe_gpu_powx(variance_.count(), variance_.gpu_data(), Dtype(0.5), + variance_.mutable_gpu_data()); + + caffe_gpu_add_scalar(variance_.count(), eps, variance_.mutable_gpu_data()); + + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + variance_.gpu_data(), sum_multiplier_.gpu_data(), 0., + temp_.mutable_gpu_data()); + + caffe_gpu_div(temp_.count(), bottom_diff, temp_.gpu_data(), bottom_diff); +} + + +INSTANTIATE_CLASS(MVNLayer); + + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 44bfb631a22..fce56945bb3 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -201,7 +201,7 @@ message LayerParameter { // line above the enum. Update the next available ID when you add a new // LayerType. // - // LayerType next available ID: 34 (last added: SLICE) + // LayerType next available ID: 35 (last added: MVN) enum LayerType { // "NONE" layer type is 0th enum element so that we don't cause confusion // by defaulting to an existent LayerType (instead, should usually error if @@ -228,6 +228,7 @@ message LayerParameter { LRN = 15; MEMORY_DATA = 29; MULTINOMIAL_LOGISTIC_LOSS = 16; + MVN = 34; POOLING = 17; POWER = 26; RELU = 18; diff --git a/src/caffe/test/test_mvn_layer.cpp b/src/caffe/test/test_mvn_layer.cpp new file mode 100644 index 00000000000..d5bea3f952c --- /dev/null +++ b/src/caffe/test/test_mvn_layer.cpp @@ -0,0 +1,85 @@ +// Copyright 2014 BVLC and contributors. + +#include +#include +#include + +#include "gtest/gtest.h" +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +template +class MVNLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: + MVNLayerTest() + : blob_bottom_(new Blob(2, 3, 4, 5)), + blob_top_(new Blob()) { + // fill the values + FillerParameter filler_param; + GaussianFiller filler(filler_param); + filler.Fill(this->blob_bottom_); + blob_bottom_vec_.push_back(blob_bottom_); + blob_top_vec_.push_back(blob_top_); + } + virtual ~MVNLayerTest() { delete blob_bottom_; delete blob_top_; } + Blob* const blob_bottom_; + Blob* const blob_top_; + vector*> blob_bottom_vec_; + vector*> blob_top_vec_; +}; + +TYPED_TEST_CASE(MVNLayerTest, TestDtypesAndDevices); + +TYPED_TEST(MVNLayerTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + MVNLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Test mean + int num = this->blob_bottom_->num(); + int channels = this->blob_bottom_->channels(); + int height = this->blob_bottom_->height(); + int width = this->blob_bottom_->width(); + + for (int i = 0; i < num; ++i) { + for (int j = 0; j < channels; ++j) { + Dtype sum = 0, var = 0; + for (int k = 0; k < height; ++k) { + for (int l = 0; l < width; ++l) { + Dtype data = this->blob_top_->data_at(i, j, k, l); + sum += data; + var += data * data; + } + } + sum /= height * width; + var /= height * width; + + // expect zero mean + EXPECT_GE(sum, -0.001); + EXPECT_LE(sum, 0.001); + // expect unit variance + EXPECT_GE(var, 0.999); + EXPECT_LE(var, 1.001); + } + } +} + +TYPED_TEST(MVNLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + MVNLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +} // namespace caffe From e7c11e1992cfbb6e654ee81bedcb0d5a1dc999b9 Mon Sep 17 00:00:00 2001 From: qipeng Date: Mon, 4 Aug 2014 09:03:34 -0700 Subject: [PATCH 0429/2053] reduced blas calls --- src/caffe/layers/mvn_layer.cpp | 24 ++++++++---------------- src/caffe/layers/mvn_layer.cu | 24 ++++++++---------------- 2 files changed, 16 insertions(+), 32 deletions(-) diff --git a/src/caffe/layers/mvn_layer.cpp b/src/caffe/layers/mvn_layer.cpp index 7e6a97c16dd..c9c075c4cda 100644 --- a/src/caffe/layers/mvn_layer.cpp +++ b/src/caffe/layers/mvn_layer.cpp @@ -43,14 +43,10 @@ Dtype MVNLayer::Forward_cpu(const vector*>& bottom, temp_.mutable_cpu_data()); // computes variance using var(X) = E(X^2) - (EX)^2 - caffe_cpu_gemv(CblasNoTrans, num, dim, 1., bottom_data, - sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); - caffe_cpu_gemv(CblasNoTrans, num, dim, 1., temp_.cpu_data(), - sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); - caffe_cpu_scale(mean_.count(), Dtype(1. / dim), mean_.cpu_data(), - mean_.mutable_cpu_data()); // EX - caffe_cpu_scale(mean_.count(), Dtype(1. / dim), variance_.cpu_data(), - variance_.mutable_cpu_data()); // E(X^2) + caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX + caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.cpu_data(), + sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), temp_.mutable_cpu_data()); // (EX)^2 caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), @@ -114,14 +110,10 @@ void MVNLayer::Backward_cpu(const vector*>& top, temp_.mutable_cpu_data()); // computes variance using var(X) = E(X^2) - (EX)^2 - caffe_cpu_gemv(CblasNoTrans, num, dim, 1., bottom_data, - sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); - caffe_cpu_gemv(CblasNoTrans, num, dim, 1., temp_.cpu_data(), - sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); - caffe_cpu_scale(mean_.count(), Dtype(1. / dim), mean_.cpu_data(), - mean_.mutable_cpu_data()); // EX - caffe_cpu_scale(mean_.count(), Dtype(1. / dim), variance_.cpu_data(), - variance_.mutable_cpu_data()); // E(X^2) + caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX + caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.cpu_data(), + sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), temp_.mutable_cpu_data()); // (EX)^2 caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), diff --git a/src/caffe/layers/mvn_layer.cu b/src/caffe/layers/mvn_layer.cu index 3714d49f2b1..be5f25bdf0d 100644 --- a/src/caffe/layers/mvn_layer.cu +++ b/src/caffe/layers/mvn_layer.cu @@ -22,14 +22,10 @@ Dtype MVNLayer::Forward_gpu(const vector*>& bottom, temp_.mutable_gpu_data()); // computes variance using var(X) = E(X^2) - (EX)^2 - caffe_gpu_gemv(CblasNoTrans, num, dim, 1., bottom_data, - sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); - caffe_gpu_gemv(CblasNoTrans, num, dim, 1., temp_.gpu_data(), - sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); - caffe_gpu_scale(mean_.count(), Dtype(1. / dim), mean_.gpu_data(), - mean_.mutable_gpu_data()); // EX - caffe_gpu_scale(mean_.count(), Dtype(1. / dim), variance_.gpu_data(), - variance_.mutable_gpu_data()); // E(X^2) + caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX + caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.gpu_data(), + sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), temp_.mutable_gpu_data()); // (EX)^2 caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), @@ -96,14 +92,10 @@ void MVNLayer::Backward_gpu(const vector*>& top, temp_.mutable_gpu_data()); // computes variance using var(X) = E(X^2) - (EX)^2 - caffe_gpu_gemv(CblasNoTrans, num, dim, 1., bottom_data, - sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); - caffe_gpu_gemv(CblasNoTrans, num, dim, 1., temp_.gpu_data(), - sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); - caffe_gpu_scale(mean_.count(), Dtype(1. / dim), mean_.gpu_data(), - mean_.mutable_gpu_data()); // EX - caffe_gpu_scale(mean_.count(), Dtype(1. / dim), variance_.gpu_data(), - variance_.mutable_gpu_data()); // E(X^2) + caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX + caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.gpu_data(), + sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), temp_.mutable_gpu_data()); // (EX)^2 caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), From cc352bfcaf4af04fd0efd2cf44dc7a9e8b09839a Mon Sep 17 00:00:00 2001 From: qipeng Date: Mon, 4 Aug 2014 09:27:14 -0700 Subject: [PATCH 0430/2053] lint --- src/caffe/layers/mvn_layer.cpp | 8 ++++---- src/caffe/layers/mvn_layer.cu | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/caffe/layers/mvn_layer.cpp b/src/caffe/layers/mvn_layer.cpp index c9c075c4cda..e0360b6cd1e 100644 --- a/src/caffe/layers/mvn_layer.cpp +++ b/src/caffe/layers/mvn_layer.cpp @@ -44,9 +44,9 @@ Dtype MVNLayer::Forward_cpu(const vector*>& bottom, // computes variance using var(X) = E(X^2) - (EX)^2 caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, - sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.cpu_data(), - sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) + sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), temp_.mutable_cpu_data()); // (EX)^2 caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), @@ -111,9 +111,9 @@ void MVNLayer::Backward_cpu(const vector*>& top, // computes variance using var(X) = E(X^2) - (EX)^2 caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, - sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.cpu_data(), - sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) + sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), temp_.mutable_cpu_data()); // (EX)^2 caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), diff --git a/src/caffe/layers/mvn_layer.cu b/src/caffe/layers/mvn_layer.cu index be5f25bdf0d..fb2380c176c 100644 --- a/src/caffe/layers/mvn_layer.cu +++ b/src/caffe/layers/mvn_layer.cu @@ -23,9 +23,9 @@ Dtype MVNLayer::Forward_gpu(const vector*>& bottom, // computes variance using var(X) = E(X^2) - (EX)^2 caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, - sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.gpu_data(), - sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) + sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), temp_.mutable_gpu_data()); // (EX)^2 caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), @@ -93,9 +93,9 @@ void MVNLayer::Backward_gpu(const vector*>& top, // computes variance using var(X) = E(X^2) - (EX)^2 caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, - sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.gpu_data(), - sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) + sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), temp_.mutable_gpu_data()); // (EX)^2 caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), From 1e11ef71369fc7b579a10eda04f2ed4310d485e6 Mon Sep 17 00:00:00 2001 From: qipeng Date: Mon, 4 Aug 2014 11:29:54 -0700 Subject: [PATCH 0431/2053] addressed Jeff's comment --- src/caffe/test/test_mvn_layer.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/caffe/test/test_mvn_layer.cpp b/src/caffe/test/test_mvn_layer.cpp index d5bea3f952c..ded7fd5d361 100644 --- a/src/caffe/test/test_mvn_layer.cpp +++ b/src/caffe/test/test_mvn_layer.cpp @@ -63,12 +63,11 @@ TYPED_TEST(MVNLayerTest, TestForward) { sum /= height * width; var /= height * width; + const Dtype kErrorBound = 0.001; // expect zero mean - EXPECT_GE(sum, -0.001); - EXPECT_LE(sum, 0.001); + EXPECT_NEAR(0, sum, kErrorBound); // expect unit variance - EXPECT_GE(var, 0.999); - EXPECT_LE(var, 1.001); + EXPECT_NEAR(1, var, kErrorBound); } } } From 978c81a4abf0fc35d37c92bd40cb023f1e523a5b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 9 Aug 2014 20:43:40 -0700 Subject: [PATCH 0432/2053] default raw_scale in python scripts to ImageNet model value --- python/classify.py | 3 ++- python/detect.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/python/classify.py b/python/classify.py index d3d239cbb7d..ddc5429feac 100755 --- a/python/classify.py +++ b/python/classify.py @@ -66,11 +66,12 @@ def main(argv): parser.add_argument( "--input_scale", type=float, - help="Multiply input features by this scale to finish input preprocessing." + help="Multiply input features by this scale to finish preprocessing." ) parser.add_argument( "--raw_scale", type=float, + default=255.0, help="Multiply raw input by this scale before preprocessing." ) parser.add_argument( diff --git a/python/detect.py b/python/detect.py index 77f4676aec1..4598fc7a327 100755 --- a/python/detect.py +++ b/python/detect.py @@ -76,11 +76,12 @@ def main(argv): parser.add_argument( "--input_scale", type=float, - help="Multiply input features by this scale to finish input preprocessing." + help="Multiply input features by this scale to finish preprocessing." ) parser.add_argument( "--raw_scale", type=float, + default=255.0, help="Multiply raw input by this scale before preprocessing." ) parser.add_argument( From 9e903ef67544d6892ffc907ab945bba4e3182fa8 Mon Sep 17 00:00:00 2001 From: qipeng Date: Mon, 11 Aug 2014 10:44:27 -0700 Subject: [PATCH 0433/2053] added cross-channel MVN, Mean-only normalization, added to layer factory, moved to common_layers --- include/caffe/common_layers.hpp | 32 ++++++ include/caffe/vision_layers.hpp | 32 ------ src/caffe/layer_factory.cpp | 2 + src/caffe/layers/mvn_layer.cpp | 160 +++++++++++++++----------- src/caffe/layers/mvn_layer.cu | 182 +++++++++++++++++------------- src/caffe/proto/caffe.proto | 12 +- src/caffe/test/test_mvn_layer.cpp | 95 +++++++++++++++- 7 files changed, 329 insertions(+), 186 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 1e282d33d7a..5d7c21db622 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -115,6 +115,38 @@ class FlattenLayer : public Layer { int count_; }; +/* MVNLayer + */ +template +class MVNLayer : public Layer { + public: + explicit MVNLayer(const LayerParameter& param) + : Layer(param) {} + virtual void SetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_MVN; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual Dtype Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual Dtype Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + + Blob mean_, variance_, temp_; + + // sum_multiplier is just used to carry out sum using blas + Blob sum_multiplier_; +}; + /* SoftmaxLayer */ template diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index a6844cd6930..76b9f245643 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -234,38 +234,6 @@ class LRNLayer : public Layer { vector*> product_bottom_vec_; }; -/* MVNLayer - */ -template -class MVNLayer : public Layer { - public: - explicit MVNLayer(const LayerParameter& param) - : Layer(param) {} - virtual void SetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_MVN; - } - virtual inline int ExactNumBottomBlobs() const { return 1; } - virtual inline int ExactNumTopBlobs() const { return 1; } - - protected: - virtual Dtype Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - - Blob mean_, variance_, temp_; - - // sum_multiplier is just used to carry out sum using blas - Blob sum_multiplier_; -}; - /* PoolingLayer */ diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 118929fbff5..0d5b19d92a6 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -57,6 +57,8 @@ Layer* GetLayer(const LayerParameter& param) { return new LRNLayer(param); case LayerParameter_LayerType_MEMORY_DATA: return new MemoryDataLayer(param); + case LayerParameter_LayerType_MVN: + return new MVNLayer(param); case LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS: return new MultinomialLogisticLossLayer(param); case LayerParameter_LayerType_POOLING: diff --git a/src/caffe/layers/mvn_layer.cpp b/src/caffe/layers/mvn_layer.cpp index e0360b6cd1e..2686ba6d275 100644 --- a/src/caffe/layers/mvn_layer.cpp +++ b/src/caffe/layers/mvn_layer.cpp @@ -1,10 +1,8 @@ -// Copyright 2014 BVLC and contributors. -// #include #include +#include "caffe/common_layers.hpp" #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" namespace caffe { @@ -24,9 +22,7 @@ void MVNLayer::SetUp(const vector*>& bottom, sum_multiplier_.Reshape(1, 1, bottom[0]->height(), bottom[0]->width()); Dtype* multiplier_data = sum_multiplier_.mutable_cpu_data(); - for (int i = 0; i < sum_multiplier_.count(); ++i) { - multiplier_data[i] = 1.; - } + caffe_set(sum_multiplier_.count(), Dtype(1), multiplier_data); } template @@ -34,43 +30,60 @@ Dtype MVNLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); - int num = bottom[0]->num() * bottom[0]->channels(); + int num; + if (this->layer_param_.mvn_param().across_channels()) + num = bottom[0]->num(); + else + num = bottom[0]->num() * bottom[0]->channels(); + int dim = bottom[0]->count() / num; Dtype eps = 1e-10; - // put the squares of bottom into temp_ - caffe_powx(bottom[0]->count(), bottom_data, Dtype(2), - temp_.mutable_cpu_data()); - - // computes variance using var(X) = E(X^2) - (EX)^2 - caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, - sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX - caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.cpu_data(), - sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) - caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), - temp_.mutable_cpu_data()); // (EX)^2 - caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), - variance_.mutable_cpu_data()); // variance - - // do mean and variance normalization - // subtract mean - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., - mean_.cpu_data(), sum_multiplier_.cpu_data(), 0., - temp_.mutable_cpu_data()); + if (this->layer_param_.mvn_param().normalize_variance()) { + // put the squares of bottom into temp_ + caffe_powx(bottom[0]->count(), bottom_data, Dtype(2), + temp_.mutable_cpu_data()); - caffe_add(temp_.count(), bottom_data, temp_.cpu_data(), top_data); + // computes variance using var(X) = E(X^2) - (EX)^2 + caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX + caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.cpu_data(), + sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) + caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), + temp_.mutable_cpu_data()); // (EX)^2 + caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), + variance_.mutable_cpu_data()); // variance - // normalize variance - caffe_powx(variance_.count(), variance_.cpu_data(), Dtype(0.5), - variance_.mutable_cpu_data()); + // do mean and variance normalization + // subtract mean + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., + mean_.cpu_data(), sum_multiplier_.cpu_data(), 0., + temp_.mutable_cpu_data()); - caffe_add_scalar(variance_.count(), eps, variance_.mutable_cpu_data()); + caffe_add(temp_.count(), bottom_data, temp_.cpu_data(), top_data); - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., - variance_.cpu_data(), sum_multiplier_.cpu_data(), 0., - temp_.mutable_cpu_data()); + // normalize variance + caffe_powx(variance_.count(), variance_.cpu_data(), Dtype(0.5), + variance_.mutable_cpu_data()); + + caffe_add_scalar(variance_.count(), eps, variance_.mutable_cpu_data()); + + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + variance_.cpu_data(), sum_multiplier_.cpu_data(), 0., + temp_.mutable_cpu_data()); + + caffe_div(temp_.count(), top_data, temp_.cpu_data(), top_data); + } else { + caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX - caffe_div(temp_.count(), top_data, temp_.cpu_data(), top_data); + // subtract mean + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., + mean_.cpu_data(), sum_multiplier_.cpu_data(), 0., + temp_.mutable_cpu_data()); + + caffe_add(temp_.count(), bottom_data, temp_.cpu_data(), top_data); + } return Dtype(0); } @@ -84,52 +97,61 @@ void MVNLayer::Backward_cpu(const vector*>& top, const Dtype* bottom_data = (*bottom)[0]->cpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - int num = (*bottom)[0]->num() * (*bottom)[0]->channels(); + int num; + if (this->layer_param_.mvn_param().across_channels()) + num = (*bottom)[0]->num(); + else + num = (*bottom)[0]->num() * (*bottom)[0]->channels(); + int dim = (*bottom)[0]->count() / num; Dtype eps = 1e-10; - caffe_mul(temp_.count(), top_data, top_diff, bottom_diff); - caffe_cpu_gemv(CblasNoTrans, num, dim, 1., bottom_diff, - sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., - mean_.cpu_data(), sum_multiplier_.cpu_data(), 0., - bottom_diff); - caffe_mul(temp_.count(), top_data, bottom_diff, bottom_diff); - - caffe_cpu_gemv(CblasNoTrans, num, dim, 1., top_diff, + if (this->layer_param_.mvn_param().normalize_variance()) { + caffe_mul(temp_.count(), top_data, top_diff, bottom_diff); + caffe_cpu_gemv(CblasNoTrans, num, dim, 1., bottom_diff, sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., - mean_.cpu_data(), sum_multiplier_.cpu_data(), 1., + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + mean_.cpu_data(), sum_multiplier_.cpu_data(), 0., bottom_diff); + caffe_mul(temp_.count(), top_data, bottom_diff, bottom_diff); - caffe_cpu_axpby(temp_.count(), Dtype(1), top_diff, Dtype(-1. / dim), - bottom_diff); + caffe_cpu_gemv(CblasNoTrans, num, dim, 1., top_diff, + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + mean_.cpu_data(), sum_multiplier_.cpu_data(), 1., + bottom_diff); - // put the squares of bottom into temp_ - caffe_powx(temp_.count(), bottom_data, Dtype(2), - temp_.mutable_cpu_data()); + caffe_cpu_axpby(temp_.count(), Dtype(1), top_diff, Dtype(-1. / dim), + bottom_diff); - // computes variance using var(X) = E(X^2) - (EX)^2 - caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, - sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX - caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.cpu_data(), - sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) - caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), - temp_.mutable_cpu_data()); // (EX)^2 - caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), - variance_.mutable_cpu_data()); // variance + // put the squares of bottom into temp_ + caffe_powx(temp_.count(), bottom_data, Dtype(2), + temp_.mutable_cpu_data()); - // normalize variance - caffe_powx(variance_.count(), variance_.cpu_data(), Dtype(0.5), - variance_.mutable_cpu_data()); + // computes variance using var(X) = E(X^2) - (EX)^2 + caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, + sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX + caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.cpu_data(), + sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) + caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), + temp_.mutable_cpu_data()); // (EX)^2 + caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), + variance_.mutable_cpu_data()); // variance - caffe_add_scalar(variance_.count(), eps, variance_.mutable_cpu_data()); + // normalize variance + caffe_powx(variance_.count(), variance_.cpu_data(), Dtype(0.5), + variance_.mutable_cpu_data()); - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., - variance_.cpu_data(), sum_multiplier_.cpu_data(), 0., - temp_.mutable_cpu_data()); + caffe_add_scalar(variance_.count(), eps, variance_.mutable_cpu_data()); - caffe_div(temp_.count(), bottom_diff, temp_.cpu_data(), bottom_diff); + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + variance_.cpu_data(), sum_multiplier_.cpu_data(), 0., + temp_.mutable_cpu_data()); + + caffe_div(temp_.count(), bottom_diff, temp_.cpu_data(), bottom_diff); + } else { + caffe_copy(temp_.count(), top_diff, bottom_diff); + } } diff --git a/src/caffe/layers/mvn_layer.cu b/src/caffe/layers/mvn_layer.cu index fb2380c176c..6d1d71570fb 100644 --- a/src/caffe/layers/mvn_layer.cu +++ b/src/caffe/layers/mvn_layer.cu @@ -1,10 +1,8 @@ -// Copyright 2014 BVLC and contributors. -// #include #include +#include "caffe/common_layers.hpp" #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/util/math_functions.hpp" namespace caffe { @@ -14,44 +12,61 @@ Dtype MVNLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); - int num = bottom[0]->num() * bottom[0]->channels(); - int dim = bottom[0]->count() / num; - - // put the squares of bottom into temp_ - caffe_gpu_powx(bottom[0]->count(), bottom_data, Dtype(2), - temp_.mutable_gpu_data()); - - // computes variance using var(X) = E(X^2) - (EX)^2 - caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, - sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX - caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.gpu_data(), - sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) - caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), - temp_.mutable_gpu_data()); // (EX)^2 - caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), - variance_.mutable_gpu_data()); // variance - - Dtype eps = 1e-10; - - // do mean and variance normalization - // subtract mean - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., - mean_.gpu_data(), sum_multiplier_.gpu_data(), 0., - temp_.mutable_gpu_data()); + int num; + if (this->layer_param_.mvn_param().across_channels()) + num = bottom[0]->num(); + else + num = bottom[0]->num() * bottom[0]->channels(); - caffe_gpu_add(temp_.count(), bottom_data, temp_.gpu_data(), top_data); - - // normalize variance - caffe_gpu_powx(variance_.count(), variance_.gpu_data(), Dtype(0.5), - variance_.mutable_gpu_data()); - - caffe_gpu_add_scalar(variance_.count(), eps, variance_.mutable_gpu_data()); + int dim = bottom[0]->count() / num; - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., - variance_.gpu_data(), sum_multiplier_.gpu_data(), 0., + if (this->layer_param_.mvn_param().normalize_variance()) { + // put the squares of bottom into temp_ + caffe_gpu_powx(bottom[0]->count(), bottom_data, Dtype(2), temp_.mutable_gpu_data()); - - caffe_gpu_div(temp_.count(), top_data, temp_.gpu_data(), top_data); + + // computes variance using var(X) = E(X^2) - (EX)^2 + caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX + caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.gpu_data(), + sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) + caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), + temp_.mutable_gpu_data()); // (EX)^2 + caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), + variance_.mutable_gpu_data()); // variance + + Dtype eps = 1e-10; + + // do mean and variance normalization + // subtract mean + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., + mean_.gpu_data(), sum_multiplier_.gpu_data(), 0., + temp_.mutable_gpu_data()); + + caffe_gpu_add(temp_.count(), bottom_data, temp_.gpu_data(), top_data); + + // normalize variance + caffe_gpu_powx(variance_.count(), variance_.gpu_data(), Dtype(0.5), + variance_.mutable_gpu_data()); + + caffe_gpu_add_scalar(variance_.count(), eps, variance_.mutable_gpu_data()); + + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + variance_.gpu_data(), sum_multiplier_.gpu_data(), 0., + temp_.mutable_gpu_data()); + + caffe_gpu_div(temp_.count(), top_data, temp_.gpu_data(), top_data); + } else { + caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX + + // subtract mean + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., + mean_.gpu_data(), sum_multiplier_.gpu_data(), 0., + temp_.mutable_gpu_data()); + + caffe_gpu_add(temp_.count(), bottom_data, temp_.gpu_data(), top_data); + } return Dtype(0); } @@ -65,53 +80,62 @@ void MVNLayer::Backward_gpu(const vector*>& top, const Dtype* bottom_data = (*bottom)[0]->gpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - int num = (*bottom)[0]->num() * (*bottom)[0]->channels(); + int num; + if (this->layer_param_.mvn_param().across_channels()) + num = (*bottom)[0]->num(); + else + num = (*bottom)[0]->num() * (*bottom)[0]->channels(); + int dim = (*bottom)[0]->count() / num; Dtype eps = 1e-10; - caffe_gpu_mul(temp_.count(), top_data, top_diff, bottom_diff); - caffe_gpu_gemv(CblasNoTrans, num, dim, 1., bottom_diff, - sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., - mean_.gpu_data(), sum_multiplier_.gpu_data(), 0., - bottom_diff); - caffe_gpu_mul(temp_.count(), top_data, bottom_diff, bottom_diff); - - caffe_gpu_gemv(CblasNoTrans, num, dim, 1., top_diff, + if (this->layer_param_.mvn_param().normalize_variance()) { + caffe_gpu_mul(temp_.count(), top_data, top_diff, bottom_diff); + caffe_gpu_gemv(CblasNoTrans, num, dim, 1., bottom_diff, sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., - mean_.gpu_data(), sum_multiplier_.gpu_data(), 1., + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + mean_.gpu_data(), sum_multiplier_.gpu_data(), 0., bottom_diff); - - caffe_gpu_axpby(temp_.count(), Dtype(1), top_diff, Dtype(-1. / dim), - bottom_diff); - - // put the squares of bottom into temp_ - caffe_gpu_powx(temp_.count(), bottom_data, Dtype(2), - temp_.mutable_gpu_data()); - - // computes variance using var(X) = E(X^2) - (EX)^2 - caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, - sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX - caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.gpu_data(), - sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) - caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), - temp_.mutable_gpu_data()); // (EX)^2 - caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), - variance_.mutable_gpu_data()); // variance - - // normalize variance - caffe_gpu_powx(variance_.count(), variance_.gpu_data(), Dtype(0.5), - variance_.mutable_gpu_data()); - - caffe_gpu_add_scalar(variance_.count(), eps, variance_.mutable_gpu_data()); - - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., - variance_.gpu_data(), sum_multiplier_.gpu_data(), 0., - temp_.mutable_gpu_data()); - - caffe_gpu_div(temp_.count(), bottom_diff, temp_.gpu_data(), bottom_diff); + caffe_gpu_mul(temp_.count(), top_data, bottom_diff, bottom_diff); + + caffe_gpu_gemv(CblasNoTrans, num, dim, 1., top_diff, + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + mean_.gpu_data(), sum_multiplier_.gpu_data(), 1., + bottom_diff); + + caffe_gpu_axpby(temp_.count(), Dtype(1), top_diff, Dtype(-1. / dim), + bottom_diff); + + // put the squares of bottom into temp_ + caffe_gpu_powx(temp_.count(), bottom_data, Dtype(2), + temp_.mutable_gpu_data()); + + // computes variance using var(X) = E(X^2) - (EX)^2 + caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, + sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX + caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.gpu_data(), + sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) + caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), + temp_.mutable_gpu_data()); // (EX)^2 + caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), + variance_.mutable_gpu_data()); // variance + + // normalize variance + caffe_gpu_powx(variance_.count(), variance_.gpu_data(), Dtype(0.5), + variance_.mutable_gpu_data()); + + caffe_gpu_add_scalar(variance_.count(), eps, variance_.mutable_gpu_data()); + + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., + variance_.gpu_data(), sum_multiplier_.gpu_data(), 0., + temp_.mutable_gpu_data()); + + caffe_gpu_div(temp_.count(), bottom_diff, temp_.gpu_data(), bottom_diff); + } else { + caffe_copy(temp_.count(), top_diff, bottom_diff); + } } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index fce56945bb3..acc038326b3 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -180,7 +180,7 @@ message NetStateRule { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 34 (last added: exclude) +// LayerParameter next available ID: 35 (last added: mvn_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs @@ -286,6 +286,7 @@ message LayerParameter { optional ThresholdParameter threshold_param = 25; optional HingeLossParameter hinge_loss_param = 29; optional SliceParameter slice_param = 31; + optional MVNParameter mvn_param = 34; // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new @@ -484,6 +485,15 @@ message MemoryDataParameter { optional uint32 width = 4; } +// Message that stores parameters used by MVNLayer +message MVNParameter { + // This parameter can be set to false to normalize mean only + optional bool normalize_variance = 1 [default = true]; + + // This parameter can be set to true to perform DNN-like MVN + optional bool across_channels = 2 [default = false]; +} + // Message that stores parameters used by PoolingLayer message PoolingParameter { enum PoolMethod { diff --git a/src/caffe/test/test_mvn_layer.cpp b/src/caffe/test/test_mvn_layer.cpp index ded7fd5d361..d3d8012f09f 100644 --- a/src/caffe/test/test_mvn_layer.cpp +++ b/src/caffe/test/test_mvn_layer.cpp @@ -1,17 +1,15 @@ -// Copyright 2014 BVLC and contributors. - #include #include #include -#include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" +#include "caffe/common_layers.hpp" #include "caffe/filler.hpp" -#include "caffe/vision_layers.hpp" -#include "caffe/test/test_gradient_check_util.hpp" +#include "gtest/gtest.h" #include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" namespace caffe { @@ -72,6 +70,73 @@ TYPED_TEST(MVNLayerTest, TestForward) { } } +TYPED_TEST(MVNLayerTest, TestForwardMeanOnly) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.ParseFromString("mvn_param{normalize_variance: false}"); + MVNLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Test mean + int num = this->blob_bottom_->num(); + int channels = this->blob_bottom_->channels(); + int height = this->blob_bottom_->height(); + int width = this->blob_bottom_->width(); + + for (int i = 0; i < num; ++i) { + for (int j = 0; j < channels; ++j) { + Dtype sum = 0, var = 0; + for (int k = 0; k < height; ++k) { + for (int l = 0; l < width; ++l) { + Dtype data = this->blob_top_->data_at(i, j, k, l); + sum += data; + var += data * data; + } + } + sum /= height * width; + + const Dtype kErrorBound = 0.001; + // expect zero mean + EXPECT_NEAR(0, sum, kErrorBound); + } + } +} + +TYPED_TEST(MVNLayerTest, TestForwardAcrossChannels) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.ParseFromString("mvn_param{across_channels: true}"); + MVNLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Test mean + int num = this->blob_bottom_->num(); + int channels = this->blob_bottom_->channels(); + int height = this->blob_bottom_->height(); + int width = this->blob_bottom_->width(); + + for (int i = 0; i < num; ++i) { + Dtype sum = 0, var = 0; + for (int j = 0; j < channels; ++j) { + for (int k = 0; k < height; ++k) { + for (int l = 0; l < width; ++l) { + Dtype data = this->blob_top_->data_at(i, j, k, l); + sum += data; + var += data * data; + } + } + } + sum /= height * width * channels; + var /= height * width * channels; + + const Dtype kErrorBound = 0.001; + // expect zero mean + EXPECT_NEAR(0, sum, kErrorBound); + // expect unit variance + EXPECT_NEAR(1, var, kErrorBound); + } +} + TYPED_TEST(MVNLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; @@ -81,4 +146,24 @@ TYPED_TEST(MVNLayerTest, TestGradient) { &(this->blob_top_vec_)); } +TYPED_TEST(MVNLayerTest, TestGradientMeanOnly) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.ParseFromString("mvn_param{normalize_variance: false}"); + MVNLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +TYPED_TEST(MVNLayerTest, TestGradientAcrossChannels) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.ParseFromString("mvn_param{across_channels: true}"); + MVNLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + } // namespace caffe From a5f49623c19e4d453ff3073491b4bdb1ff592f90 Mon Sep 17 00:00:00 2001 From: qipeng Date: Mon, 11 Aug 2014 10:48:57 -0700 Subject: [PATCH 0434/2053] minor fix for layer factory --- src/caffe/layer_factory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 0d5b19d92a6..2170c19f539 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -58,7 +58,7 @@ Layer* GetLayer(const LayerParameter& param) { case LayerParameter_LayerType_MEMORY_DATA: return new MemoryDataLayer(param); case LayerParameter_LayerType_MVN: - return new MVNLayer(param); + return new MVNLayer(param); case LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS: return new MultinomialLogisticLossLayer(param); case LayerParameter_LayerType_POOLING: From a3083f82acf2232f2286f6aa58be01dd0f89787c Mon Sep 17 00:00:00 2001 From: qipeng Date: Mon, 11 Aug 2014 11:09:57 -0700 Subject: [PATCH 0435/2053] lint --- src/caffe/layers/mvn_layer.cpp | 6 +++-- src/caffe/layers/mvn_layer.cu | 42 ++++++++++++++++++---------------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/caffe/layers/mvn_layer.cpp b/src/caffe/layers/mvn_layer.cpp index 2686ba6d275..30235b3f467 100644 --- a/src/caffe/layers/mvn_layer.cpp +++ b/src/caffe/layers/mvn_layer.cpp @@ -48,7 +48,8 @@ Dtype MVNLayer::Forward_cpu(const vector*>& bottom, caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.cpu_data(), - sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) + sum_multiplier_.cpu_data(), 0., + variance_.mutable_cpu_data()); // E(X^2) caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), temp_.mutable_cpu_data()); // (EX)^2 caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), @@ -132,7 +133,8 @@ void MVNLayer::Backward_cpu(const vector*>& top, caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, sum_multiplier_.cpu_data(), 0., mean_.mutable_cpu_data()); // EX caffe_cpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.cpu_data(), - sum_multiplier_.cpu_data(), 0., variance_.mutable_cpu_data()); // E(X^2) + sum_multiplier_.cpu_data(), 0., + variance_.mutable_cpu_data()); // E(X^2) caffe_powx(mean_.count(), mean_.cpu_data(), Dtype(2), temp_.mutable_cpu_data()); // (EX)^2 caffe_sub(mean_.count(), variance_.cpu_data(), temp_.cpu_data(), diff --git a/src/caffe/layers/mvn_layer.cu b/src/caffe/layers/mvn_layer.cu index 6d1d71570fb..dd823984dd2 100644 --- a/src/caffe/layers/mvn_layer.cu +++ b/src/caffe/layers/mvn_layer.cu @@ -24,47 +24,48 @@ Dtype MVNLayer::Forward_gpu(const vector*>& bottom, // put the squares of bottom into temp_ caffe_gpu_powx(bottom[0]->count(), bottom_data, Dtype(2), temp_.mutable_gpu_data()); - + // computes variance using var(X) = E(X^2) - (EX)^2 caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.gpu_data(), - sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) + sum_multiplier_.gpu_data(), 0., + variance_.mutable_gpu_data()); // E(X^2) caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), temp_.mutable_gpu_data()); // (EX)^2 caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), variance_.mutable_gpu_data()); // variance - + Dtype eps = 1e-10; - + // do mean and variance normalization // subtract mean caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., mean_.gpu_data(), sum_multiplier_.gpu_data(), 0., temp_.mutable_gpu_data()); - + caffe_gpu_add(temp_.count(), bottom_data, temp_.gpu_data(), top_data); - + // normalize variance caffe_gpu_powx(variance_.count(), variance_.gpu_data(), Dtype(0.5), variance_.mutable_gpu_data()); - + caffe_gpu_add_scalar(variance_.count(), eps, variance_.mutable_gpu_data()); - + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., variance_.gpu_data(), sum_multiplier_.gpu_data(), 0., temp_.mutable_gpu_data()); - + caffe_gpu_div(temp_.count(), top_data, temp_.gpu_data(), top_data); } else { caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX - + // subtract mean caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., mean_.gpu_data(), sum_multiplier_.gpu_data(), 0., temp_.mutable_gpu_data()); - + caffe_gpu_add(temp_.count(), bottom_data, temp_.gpu_data(), top_data); } @@ -98,40 +99,41 @@ void MVNLayer::Backward_gpu(const vector*>& top, mean_.gpu_data(), sum_multiplier_.gpu_data(), 0., bottom_diff); caffe_gpu_mul(temp_.count(), top_data, bottom_diff, bottom_diff); - + caffe_gpu_gemv(CblasNoTrans, num, dim, 1., top_diff, sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., mean_.gpu_data(), sum_multiplier_.gpu_data(), 1., bottom_diff); - + caffe_gpu_axpby(temp_.count(), Dtype(1), top_diff, Dtype(-1. / dim), bottom_diff); - + // put the squares of bottom into temp_ caffe_gpu_powx(temp_.count(), bottom_data, Dtype(2), temp_.mutable_gpu_data()); - + // computes variance using var(X) = E(X^2) - (EX)^2 caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, bottom_data, sum_multiplier_.gpu_data(), 0., mean_.mutable_gpu_data()); // EX caffe_gpu_gemv(CblasNoTrans, num, dim, 1. / dim, temp_.gpu_data(), - sum_multiplier_.gpu_data(), 0., variance_.mutable_gpu_data()); // E(X^2) + sum_multiplier_.gpu_data(), 0., + variance_.mutable_gpu_data()); // E(X^2) caffe_gpu_powx(mean_.count(), mean_.gpu_data(), Dtype(2), temp_.mutable_gpu_data()); // (EX)^2 caffe_gpu_sub(mean_.count(), variance_.gpu_data(), temp_.gpu_data(), variance_.mutable_gpu_data()); // variance - + // normalize variance caffe_gpu_powx(variance_.count(), variance_.gpu_data(), Dtype(0.5), variance_.mutable_gpu_data()); - + caffe_gpu_add_scalar(variance_.count(), eps, variance_.mutable_gpu_data()); - + caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, 1., variance_.gpu_data(), sum_multiplier_.gpu_data(), 0., temp_.mutable_gpu_data()); - + caffe_gpu_div(temp_.count(), bottom_diff, temp_.gpu_data(), bottom_diff); } else { caffe_copy(temp_.count(), top_diff, bottom_diff); From 9c3710eddbcb42175e71e759554f618b3e5d9009 Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Mon, 11 Aug 2014 15:09:53 -0700 Subject: [PATCH 0436/2053] =?UTF-8?q?[docs]=20sorting=20of=20examples.=20i?= =?UTF-8?q?f=20doesn=E2=80=99t=20work=20for=20you,=20update=20jekyll.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/index.md | 10 ++++------ examples/cifar10/readme.md | 1 + examples/feature_extraction/readme.md | 1 + examples/imagenet/readme.md | 1 + examples/mnist/readme.md | 1 + examples/web_demo/readme.md | 1 + 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/index.md b/docs/index.md index 0450edea6ee..e7a819824de 100644 --- a/docs/index.md +++ b/docs/index.md @@ -46,18 +46,16 @@ Guidelines for development and contributing to Caffe. ### Examples -{% for page in site.pages %} -{% if page.category == 'example' %} +{% assign examples = site.pages | where:'category','example' | sort: 'priority' %} +{% for page in examples %} -

    -{% endif %} {% endfor %} ### Notebook examples -{% for page in site.pages %} -{% if page.category == 'notebook' %} +{% assign notebooks = site.pages | where:'category','notebook' %} +{% for page in notebooks %} -
    {{page.title}}
    {{page.description}}
    -{% endif %} {% endfor %} ## Citing Caffe diff --git a/examples/cifar10/readme.md b/examples/cifar10/readme.md index 315713f7022..d0b0b766217 100644 --- a/examples/cifar10/readme.md +++ b/examples/cifar10/readme.md @@ -4,6 +4,7 @@ category: example description: Train and test Caffe on CIFAR-10 data. include_in_docs: true layout: default +priority: 5 --- Alex's CIFAR-10 tutorial, Caffe style diff --git a/examples/feature_extraction/readme.md b/examples/feature_extraction/readme.md index c336e71855f..357f31daed5 100644 --- a/examples/feature_extraction/readme.md +++ b/examples/feature_extraction/readme.md @@ -4,6 +4,7 @@ description: Extract AlexNet features using the Caffe binary. category: example include_in_docs: true layout: default +priority: 10 --- Extracting Features diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index 883e09272f1..d139ad84af8 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -4,6 +4,7 @@ description: Train and test "CaffeNet" on ImageNet challenge data. category: example include_in_docs: true layout: default +priority: 1 --- Yangqing's Recipe on Brewing ImageNet diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 65a780714ae..266ff4c9689 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -4,6 +4,7 @@ description: Train and test "LeNet" on MNIST data. category: example include_in_docs: true layout: default +priority: 1 --- # Training MNIST with Caffe diff --git a/examples/web_demo/readme.md b/examples/web_demo/readme.md index 559c41e049c..873b4fd210d 100644 --- a/examples/web_demo/readme.md +++ b/examples/web_demo/readme.md @@ -4,6 +4,7 @@ description: Image classification demo running as a Flask web server. category: example layout: default include_in_docs: true +priority: 10 --- # Web Demo From 8f47e7dc14555357ec341f0520e69cdf180cad3c Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Mon, 11 Aug 2014 15:09:53 -0700 Subject: [PATCH 0437/2053] =?UTF-8?q?[docs]=20sorting=20of=20examples.=20i?= =?UTF-8?q?f=20doesn=E2=80=99t=20work=20for=20you,=20update=20jekyll.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/index.md | 10 ++++------ examples/cifar10/readme.md | 1 + examples/feature_extraction/readme.md | 1 + examples/imagenet/readme.md | 1 + examples/mnist/readme.md | 1 + examples/web_demo/readme.md | 1 + 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/index.md b/docs/index.md index 0450edea6ee..e7a819824de 100644 --- a/docs/index.md +++ b/docs/index.md @@ -46,18 +46,16 @@ Guidelines for development and contributing to Caffe. ### Examples -{% for page in site.pages %} -{% if page.category == 'example' %} +{% assign examples = site.pages | where:'category','example' | sort: 'priority' %} +{% for page in examples %} -
    {{page.title}}
    {{page.description}}
    -{% endif %} {% endfor %} ### Notebook examples -{% for page in site.pages %} -{% if page.category == 'notebook' %} +{% assign notebooks = site.pages | where:'category','notebook' %} +{% for page in notebooks %} -
    {{page.title}}
    {{page.description}}
    -{% endif %} {% endfor %} ## Citing Caffe diff --git a/examples/cifar10/readme.md b/examples/cifar10/readme.md index 315713f7022..d0b0b766217 100644 --- a/examples/cifar10/readme.md +++ b/examples/cifar10/readme.md @@ -4,6 +4,7 @@ category: example description: Train and test Caffe on CIFAR-10 data. include_in_docs: true layout: default +priority: 5 --- Alex's CIFAR-10 tutorial, Caffe style diff --git a/examples/feature_extraction/readme.md b/examples/feature_extraction/readme.md index c336e71855f..357f31daed5 100644 --- a/examples/feature_extraction/readme.md +++ b/examples/feature_extraction/readme.md @@ -4,6 +4,7 @@ description: Extract AlexNet features using the Caffe binary. category: example include_in_docs: true layout: default +priority: 10 --- Extracting Features diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index 883e09272f1..d139ad84af8 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -4,6 +4,7 @@ description: Train and test "CaffeNet" on ImageNet challenge data. category: example include_in_docs: true layout: default +priority: 1 --- Yangqing's Recipe on Brewing ImageNet diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 65a780714ae..266ff4c9689 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -4,6 +4,7 @@ description: Train and test "LeNet" on MNIST data. category: example include_in_docs: true layout: default +priority: 1 --- # Training MNIST with Caffe diff --git a/examples/web_demo/readme.md b/examples/web_demo/readme.md index 559c41e049c..873b4fd210d 100644 --- a/examples/web_demo/readme.md +++ b/examples/web_demo/readme.md @@ -4,6 +4,7 @@ description: Image classification demo running as a Flask web server. category: example layout: default include_in_docs: true +priority: 10 --- # Web Demo From 91b2e3cedb5a5b9fbaefa00bf75a4aad3c618635 Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Mon, 11 Aug 2014 15:52:56 -0700 Subject: [PATCH 0438/2053] [docs] [fix] closes #899 --- examples/web_demo/app.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/examples/web_demo/app.py b/examples/web_demo/app.py index 9bc4ed5c673..f7f46ce6c02 100644 --- a/examples/web_demo/app.py +++ b/examples/web_demo/app.py @@ -113,15 +113,16 @@ class ImagenetClassifier(object): raise Exception( "File for {} is missing. Should be at: {}".format(key, val)) default_args['image_dim'] = 227 - default_args['gpu_mode'] = True + default_args['raw_scale'] = 255. + default_args['gpu_mode'] = False def __init__(self, model_def_file, pretrained_model_file, mean_file, - class_labels_file, bet_file, image_dim, gpu_mode=False): + raw_scale, class_labels_file, bet_file, image_dim, gpu_mode): logging.info('Loading net and associated files...') self.net = caffe.Classifier( - model_def_file, pretrained_model_file, input_scale=255, - image_dims=(image_dim, image_dim), gpu=gpu_mode, - mean_file=mean_file, channel_swap=(2, 1, 0) + model_def_file, pretrained_model_file, + image_dims=(image_dim, image_dim), raw_scale=raw_scale, + mean=np.load(mean_file), channel_swap=(2, 1, 0), gpu=gpu_mode ) with open(class_labels_file) as f: @@ -197,7 +198,13 @@ def start_from_terminal(app): '-p', '--port', help="which port to serve content on", type='int', default=5000) + parser.add_option( + '-g', '--gpu', + help="use gpu mode", + action='store_true', default=False) + opts, args = parser.parse_args() + ImagenetClassifier.default_args.update({'gpu_mode': opts.gpu}) # Initialize classifier app.clf = ImagenetClassifier(**ImagenetClassifier.default_args) From aaad9e43425cf16bc6db22e92c58de2a1f7b45f5 Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Mon, 11 Aug 2014 15:59:48 -0700 Subject: [PATCH 0439/2053] =?UTF-8?q?[docs]=20=E2=80=98maximally=20accurat?= =?UTF-8?q?e=E2=80=99=20in=20the=20web=20demo=20explanation.=20closes=20#9?= =?UTF-8?q?05?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/web_demo/readme.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/web_demo/readme.md b/examples/web_demo/readme.md index 873b4fd210d..b0c14e379b2 100644 --- a/examples/web_demo/readme.md +++ b/examples/web_demo/readme.md @@ -29,3 +29,10 @@ You can enable debug mode of the web server, or switch to a different port: -h, --help show this help message and exit -d, --debug enable debug mode -p PORT, --port=PORT which port to serve content on + +## How are the "maximally accurate" results generated? + +In a nutshell: ImageNet predictions are made at the leaf nodes, but the organization of the project allows leaf nodes to be united via more general parent nodes, with 'entity' at the very top. +To give "maximally accurate" results, we "back off" from maximally specific predictions to maintain a high accuracy. +The `bet_file` that is loaded in the demo provides the graph structure and names of all relevant ImageNet nodes as well as measures of information gain between them. +Please see the "Hedging your bets" paper from [CVPR 2012](http://www.image-net.org/projects/hedging/) for further information. From fc27faf81f98b15e31350271aafb806a6b1cde78 Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Mon, 11 Aug 2014 15:52:56 -0700 Subject: [PATCH 0440/2053] [docs] [fix] closes #899 --- examples/web_demo/app.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/examples/web_demo/app.py b/examples/web_demo/app.py index 9bc4ed5c673..f7f46ce6c02 100644 --- a/examples/web_demo/app.py +++ b/examples/web_demo/app.py @@ -113,15 +113,16 @@ class ImagenetClassifier(object): raise Exception( "File for {} is missing. Should be at: {}".format(key, val)) default_args['image_dim'] = 227 - default_args['gpu_mode'] = True + default_args['raw_scale'] = 255. + default_args['gpu_mode'] = False def __init__(self, model_def_file, pretrained_model_file, mean_file, - class_labels_file, bet_file, image_dim, gpu_mode=False): + raw_scale, class_labels_file, bet_file, image_dim, gpu_mode): logging.info('Loading net and associated files...') self.net = caffe.Classifier( - model_def_file, pretrained_model_file, input_scale=255, - image_dims=(image_dim, image_dim), gpu=gpu_mode, - mean_file=mean_file, channel_swap=(2, 1, 0) + model_def_file, pretrained_model_file, + image_dims=(image_dim, image_dim), raw_scale=raw_scale, + mean=np.load(mean_file), channel_swap=(2, 1, 0), gpu=gpu_mode ) with open(class_labels_file) as f: @@ -197,7 +198,13 @@ def start_from_terminal(app): '-p', '--port', help="which port to serve content on", type='int', default=5000) + parser.add_option( + '-g', '--gpu', + help="use gpu mode", + action='store_true', default=False) + opts, args = parser.parse_args() + ImagenetClassifier.default_args.update({'gpu_mode': opts.gpu}) # Initialize classifier app.clf = ImagenetClassifier(**ImagenetClassifier.default_args) From 39d1e340126955d98fb76d6377ad65e6596b9eb8 Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Mon, 11 Aug 2014 15:59:48 -0700 Subject: [PATCH 0441/2053] =?UTF-8?q?[docs]=20=E2=80=98maximally=20accurat?= =?UTF-8?q?e=E2=80=99=20in=20the=20web=20demo=20explanation.=20closes=20#9?= =?UTF-8?q?05?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/web_demo/readme.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/web_demo/readme.md b/examples/web_demo/readme.md index 873b4fd210d..b0c14e379b2 100644 --- a/examples/web_demo/readme.md +++ b/examples/web_demo/readme.md @@ -29,3 +29,10 @@ You can enable debug mode of the web server, or switch to a different port: -h, --help show this help message and exit -d, --debug enable debug mode -p PORT, --port=PORT which port to serve content on + +## How are the "maximally accurate" results generated? + +In a nutshell: ImageNet predictions are made at the leaf nodes, but the organization of the project allows leaf nodes to be united via more general parent nodes, with 'entity' at the very top. +To give "maximally accurate" results, we "back off" from maximally specific predictions to maintain a high accuracy. +The `bet_file` that is loaded in the demo provides the graph structure and names of all relevant ImageNet nodes as well as measures of information gain between them. +Please see the "Hedging your bets" paper from [CVPR 2012](http://www.image-net.org/projects/hedging/) for further information. From 2d2055a4b2708045b15a0ef637eae95c2a202d43 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 11 Aug 2014 16:40:02 -0700 Subject: [PATCH 0442/2053] [examples] fix links in feature extraction --- examples/feature_extraction/readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/feature_extraction/readme.md b/examples/feature_extraction/readme.md index 357f31daed5..4aab26c941e 100644 --- a/examples/feature_extraction/readme.md +++ b/examples/feature_extraction/readme.md @@ -1,6 +1,6 @@ --- title: Feature extraction with Caffe C++ code. -description: Extract AlexNet features using the Caffe binary. +description: Extract CaffeNet / AlexNet features using the Caffe utility. category: example include_in_docs: true layout: default @@ -10,8 +10,8 @@ priority: 10 Extracting Features =================== -In this tutorial, we will extract features using a pre-trained model. -Follow instructions for [setting up caffe](installation.html) and for [getting](getting_pretrained_models.html) the pre-trained ImageNet model. +In this tutorial, we will extract features using a pre-trained model with the included C++ utility. +Follow instructions for [installing Caffe](../../installation.html) and for [downloading the reference model](../../getting_pretrained_models.html) for ImageNet. If you need detailed information about the tools below, please consult their source code, in which additional documentation is usually provided. Select data to run on From b445d4830eb531c18cf0251fd10d6d163181e203 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Mon, 11 Aug 2014 16:40:02 -0700 Subject: [PATCH 0443/2053] [examples] fix links in feature extraction --- examples/feature_extraction/readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/feature_extraction/readme.md b/examples/feature_extraction/readme.md index 357f31daed5..4aab26c941e 100644 --- a/examples/feature_extraction/readme.md +++ b/examples/feature_extraction/readme.md @@ -1,6 +1,6 @@ --- title: Feature extraction with Caffe C++ code. -description: Extract AlexNet features using the Caffe binary. +description: Extract CaffeNet / AlexNet features using the Caffe utility. category: example include_in_docs: true layout: default @@ -10,8 +10,8 @@ priority: 10 Extracting Features =================== -In this tutorial, we will extract features using a pre-trained model. -Follow instructions for [setting up caffe](installation.html) and for [getting](getting_pretrained_models.html) the pre-trained ImageNet model. +In this tutorial, we will extract features using a pre-trained model with the included C++ utility. +Follow instructions for [installing Caffe](../../installation.html) and for [downloading the reference model](../../getting_pretrained_models.html) for ImageNet. If you need detailed information about the tools below, please consult their source code, in which additional documentation is usually provided. Select data to run on From dd883bdda70c11101badf194661770d7f358577c Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 5 Aug 2014 16:19:31 -0700 Subject: [PATCH 0444/2053] lint targets should depend on the lint script itself --- Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 2c071c8a8ce..287120a5d22 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,7 @@ NONGEN_CXX_SRCS := $(shell find \ examples \ tools \ -name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh") +LINT_SCRIPT := scripts/cpp_lint.py LINT_OUTPUT_DIR := $(BUILD_DIR)/.lint LINT_EXT := lint.txt LINT_OUTPUTS := $(addsuffix .$(LINT_EXT), $(addprefix $(LINT_OUTPUT_DIR)/, $(NONGEN_CXX_SRCS))) @@ -322,9 +323,9 @@ $(EMPTY_LINT_REPORT): $(LINT_OUTPUTS) | $(BUILD_DIR) $(RM) $(NONEMPTY_LINT_REPORT); \ echo "No lint errors!"; -$(LINT_OUTPUTS): $(LINT_OUTPUT_DIR)/%.lint.txt : % | $(LINT_OUTPUT_DIR) +$(LINT_OUTPUTS): $(LINT_OUTPUT_DIR)/%.lint.txt : % $(LINT_SCRIPT) | $(LINT_OUTPUT_DIR) @ mkdir -p $(dir $@) - @ python ./scripts/cpp_lint.py $< 2>&1 \ + @ python $(LINT_SCRIPT) $< 2>&1 \ | grep -v "^Done processing " \ | grep -v "^Total errors found: 0" \ > $@ \ From 9572a68b8832a09f716017742fbd3b4f1da3d131 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 5 Aug 2014 16:01:11 -0700 Subject: [PATCH 0445/2053] Add caffe/alt_fn rule to lint checks to check for functions (like memset & memcpy) with caffe_* alternatives that should be used instead. --- scripts/cpp_lint.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/scripts/cpp_lint.py b/scripts/cpp_lint.py index 3f80e723643..61b8b0cd320 100755 --- a/scripts/cpp_lint.py +++ b/scripts/cpp_lint.py @@ -154,6 +154,7 @@ 'build/namespaces', 'build/printf_format', 'build/storage_class', + 'caffe/alt_fn', 'caffe/random_fn', 'legal/copyright', 'readability/alt_tokens', @@ -1559,6 +1560,37 @@ def CheckForMultilineCommentsAndStrings(filename, clean_lines, linenum, error): 'Use C++11 raw strings or concatenation instead.') +caffe_alt_function_list = ( + ('memset', ['caffe_set', 'caffe_memset']), + ('cudaMemset', ['caffe_gpu_set', 'caffe_gpu_memset']), + ('memcpy', ['caffe_copy', 'caffe_memcpy']), + ('cudaMemcpy', ['caffe_copy', 'caffe_gpu_memcpy']), + ) + + +def CheckCaffeAlternatives(filename, clean_lines, linenum, error): + """Checks for C(++) functions for which a Caffe substitute should be used. + + For certain native C functions (memset, memcpy), there is a Caffe alternative + which should be used instead. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + for function, alts in caffe_alt_function_list: + ix = line.find(function + '(') + if ix >= 0 and (ix == 0 or (not line[ix - 1].isalnum() and + line[ix - 1] not in ('_', '.', '>'))): + disp_alts = ['%s(...)' % alt for alt in alts] + error(filename, linenum, 'caffe/alt_fn', 2, + 'Use Caffe function %s instead of %s(...).' % + (' or '.join(disp_alts), function)) + + c_random_function_list = ( 'rand(', 'rand_r(', @@ -4560,6 +4592,7 @@ def ProcessLine(filename, file_extension, clean_lines, line, CheckForNonStandardConstructs(filename, clean_lines, line, nesting_state, error) CheckVlogArguments(filename, clean_lines, line, error) + CheckCaffeAlternatives(filename, clean_lines, line, error) CheckCaffeRandom(filename, clean_lines, line, error) CheckPosixThreading(filename, clean_lines, line, error) CheckInvalidIncrement(filename, clean_lines, line, error) From b8be6b1ba425acaf540d23160cb364e3c9d9974e Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 5 Aug 2014 16:59:14 -0700 Subject: [PATCH 0446/2053] Create caffe_{,gpu_}memset functions to replace {m,cudaM}emset's. --- include/caffe/util/math_functions.hpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 744dc849b94..6004e93f2e8 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -6,6 +6,7 @@ #include "glog/logging.h" +#include "caffe/common.hpp" #include "caffe/util/device_alternate.hpp" #include "caffe/util/mkl_alternate.hpp" @@ -38,6 +39,10 @@ void caffe_copy(const int N, const Dtype *X, Dtype *Y); template void caffe_set(const int N, const Dtype alpha, Dtype *X); +inline void caffe_memset(const size_t N, const int alpha, void* X) { + memset(X, alpha, N); +} + template void caffe_add_scalar(const int N, const Dtype alpha, Dtype *X); @@ -165,6 +170,14 @@ void caffe_gpu_memcpy(const size_t N, const void *X, void *Y); template void caffe_gpu_set(const int N, const Dtype alpha, Dtype *X); +inline void caffe_gpu_memset(const size_t N, const int alpha, void* X) { +#ifndef CPU_ONLY + CUDA_CHECK(cudaMemset(X, alpha, N)); // NOLINT(caffe/alt_fn) +#else + NO_GPU; +#endif +} + template void caffe_gpu_add_scalar(const int N, const Dtype alpha, Dtype *X); From b2b1ee63171e09b430297f419e9f38cb518da0aa Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Tue, 5 Aug 2014 17:33:19 -0700 Subject: [PATCH 0447/2053] Fix caffe/alt_fn lint errors. --- include/caffe/util/math_functions.hpp | 2 +- src/caffe/layers/hdf5_data_layer.cpp | 11 +++++------ src/caffe/syncedmem.cpp | 4 ++-- src/caffe/test/test_syncedmem.cpp | 12 ++++++------ src/caffe/util/math_functions.cpp | 5 +++-- src/caffe/util/math_functions.cu | 4 ++-- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 6004e93f2e8..90a1a86d8e8 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -40,7 +40,7 @@ template void caffe_set(const int N, const Dtype alpha, Dtype *X); inline void caffe_memset(const size_t N, const int alpha, void* X) { - memset(X, alpha, N); + memset(X, alpha, N); // NOLINT(caffe/alt_fn) } template diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 5bad5f6a1f0..938d8435f08 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -103,12 +103,11 @@ Dtype HDF5DataLayer::Forward_cpu(const vector*>& bottom, } current_row_ = 0; } - memcpy(&(*top)[0]->mutable_cpu_data()[i * data_count], - &data_blob_.cpu_data()[current_row_ * data_count], - sizeof(Dtype) * data_count); - memcpy(&(*top)[1]->mutable_cpu_data()[i * label_data_count], - &label_blob_.cpu_data()[current_row_ * label_data_count], - sizeof(Dtype) * label_data_count); + caffe_copy(data_count, &data_blob_.cpu_data()[current_row_ * data_count], + &(*top)[0]->mutable_cpu_data()[i * data_count]); + caffe_copy(label_data_count, + &label_blob_.cpu_data()[current_row_ * label_data_count], + &(*top)[1]->mutable_cpu_data()[i * label_data_count]); } return Dtype(0.); } diff --git a/src/caffe/syncedmem.cpp b/src/caffe/syncedmem.cpp index 7d25183701d..7617ccfb27f 100644 --- a/src/caffe/syncedmem.cpp +++ b/src/caffe/syncedmem.cpp @@ -22,7 +22,7 @@ inline void SyncedMemory::to_cpu() { switch (head_) { case UNINITIALIZED: CaffeMallocHost(&cpu_ptr_, size_); - memset(cpu_ptr_, 0, size_); + caffe_memset(size_, 0, cpu_ptr_); head_ = HEAD_AT_CPU; own_cpu_data_ = true; break; @@ -49,7 +49,7 @@ inline void SyncedMemory::to_gpu() { switch (head_) { case UNINITIALIZED: CUDA_CHECK(cudaMalloc(&gpu_ptr_, size_)); - CUDA_CHECK(cudaMemset(gpu_ptr_, 0, size_)); + caffe_gpu_memset(size_, 0, gpu_ptr_); head_ = HEAD_AT_GPU; break; case HEAD_AT_CPU: diff --git a/src/caffe/test/test_syncedmem.cpp b/src/caffe/test/test_syncedmem.cpp index b658871b3ee..b946233d07c 100644 --- a/src/caffe/test/test_syncedmem.cpp +++ b/src/caffe/test/test_syncedmem.cpp @@ -55,14 +55,14 @@ TEST_F(SyncedMemoryTest, TestCPUWrite) { SyncedMemory mem(10); void* cpu_data = mem.mutable_cpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); - memset(cpu_data, 1, mem.size()); + caffe_memset(mem.size(), 1, cpu_data); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((static_cast(cpu_data))[i], 1); } // do another round cpu_data = mem.mutable_cpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); - memset(cpu_data, 2, mem.size()); + caffe_memset(mem.size(), 2, cpu_data); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((static_cast(cpu_data))[i], 2); } @@ -74,7 +74,7 @@ TEST_F(SyncedMemoryTest, TestGPURead) { SyncedMemory mem(10); void* cpu_data = mem.mutable_cpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); - memset(cpu_data, 1, mem.size()); + caffe_memset(mem.size(), 1, cpu_data); const void* gpu_data = mem.gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::SYNCED); // check if values are the same @@ -86,7 +86,7 @@ TEST_F(SyncedMemoryTest, TestGPURead) { // do another round cpu_data = mem.mutable_cpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_CPU); - memset(cpu_data, 2, mem.size()); + caffe_memset(mem.size(), 2, cpu_data); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((static_cast(cpu_data))[i], 2); } @@ -104,7 +104,7 @@ TEST_F(SyncedMemoryTest, TestGPUWrite) { SyncedMemory mem(10); void* gpu_data = mem.mutable_gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_GPU); - CUDA_CHECK(cudaMemset(gpu_data, 1, mem.size())); + caffe_gpu_memset(mem.size(), 1, gpu_data); const void* cpu_data = mem.cpu_data(); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((static_cast(cpu_data))[i], 1); @@ -113,7 +113,7 @@ TEST_F(SyncedMemoryTest, TestGPUWrite) { gpu_data = mem.mutable_gpu_data(); EXPECT_EQ(mem.head(), SyncedMemory::HEAD_AT_GPU); - CUDA_CHECK(cudaMemset(gpu_data, 2, mem.size())); + caffe_gpu_memset(mem.size(), 2, gpu_data); cpu_data = mem.cpu_data(); for (int i = 0; i < mem.size(); ++i) { EXPECT_EQ((static_cast(cpu_data))[i], 2); diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index 974adf55e7d..e10f0191362 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -56,7 +56,7 @@ void caffe_axpy(const int N, const double alpha, const double* X, template void caffe_set(const int N, const Dtype alpha, Dtype* Y) { if (alpha == 0) { - memset(Y, 0, sizeof(Dtype) * N); + memset(Y, 0, sizeof(Dtype) * N); // NOLINT(caffe/alt_fn) return; } for (int i = 0; i < N; ++i) { @@ -87,12 +87,13 @@ void caffe_copy(const int N, const Dtype* X, Dtype* Y) { if (X != Y) { if (Caffe::mode() == Caffe::GPU) { #ifndef CPU_ONLY + // NOLINT_NEXT_LINE(caffe/alt_fn) CUDA_CHECK(cudaMemcpy(Y, X, sizeof(Dtype) * N, cudaMemcpyDefault)); #else NO_GPU; #endif } else { - memcpy(Y, X, sizeof(Dtype) * N); + memcpy(Y, X, sizeof(Dtype) * N); // NOLINT(caffe/alt_fn) } } } diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index cec051e6bef..eacbb4728dd 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -78,7 +78,7 @@ void caffe_gpu_axpy(const int N, const double alpha, const double* X, void caffe_gpu_memcpy(const size_t N, const void* X, void* Y) { if (X != Y) { - CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); + CUDA_CHECK(cudaMemcpy(Y, X, N, cudaMemcpyDefault)); // NOLINT(caffe/alt_fn) } } @@ -152,7 +152,7 @@ __global__ void set_kernel(const int n, const Dtype alpha, Dtype* y) { template void caffe_gpu_set(const int N, const Dtype alpha, Dtype* Y) { if (alpha == 0) { - CUDA_CHECK(cudaMemset(Y, 0, sizeof(Dtype) * N)); + CUDA_CHECK(cudaMemset(Y, 0, sizeof(Dtype) * N)); // NOLINT(caffe/alt_fn) return; } // NOLINT_NEXT_LINE(whitespace/operators) From eea74c30e6f85634f6cbb47528b05f640db97155 Mon Sep 17 00:00:00 2001 From: Alireza Shafaei Date: Tue, 12 Aug 2014 13:54:51 -0700 Subject: [PATCH 0448/2053] Fixed the GPU implementation of EuclideanLoss to report the loss to the top layer --- src/caffe/layers/euclidean_loss_layer.cu | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/caffe/layers/euclidean_loss_layer.cu b/src/caffe/layers/euclidean_loss_layer.cu index dd14f1995c8..f4dfd0b5883 100644 --- a/src/caffe/layers/euclidean_loss_layer.cu +++ b/src/caffe/layers/euclidean_loss_layer.cu @@ -19,6 +19,9 @@ Dtype EuclideanLossLayer::Forward_gpu(const vector*>& bottom, Dtype dot; caffe_gpu_dot(count, diff_.gpu_data(), diff_.gpu_data(), &dot); Dtype loss = dot / bottom[0]->num() / Dtype(2); + if (top->size() == 1) { + (*top)[0]->mutable_cpu_data()[0] = loss; + } return loss; } From b8c03e368b7833284dd7f963bd6d4dba1adcaa7a Mon Sep 17 00:00:00 2001 From: Alireza Shafaei Date: Tue, 12 Aug 2014 13:54:51 -0700 Subject: [PATCH 0449/2053] Fixed the GPU implementation of EuclideanLoss to report the loss to the top layer --- src/caffe/layers/euclidean_loss_layer.cu | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/caffe/layers/euclidean_loss_layer.cu b/src/caffe/layers/euclidean_loss_layer.cu index dd14f1995c8..f4dfd0b5883 100644 --- a/src/caffe/layers/euclidean_loss_layer.cu +++ b/src/caffe/layers/euclidean_loss_layer.cu @@ -19,6 +19,9 @@ Dtype EuclideanLossLayer::Forward_gpu(const vector*>& bottom, Dtype dot; caffe_gpu_dot(count, diff_.gpu_data(), diff_.gpu_data(), &dot); Dtype loss = dot / bottom[0]->num() / Dtype(2); + if (top->size() == 1) { + (*top)[0]->mutable_cpu_data()[0] = loss; + } return loss; } From da2138c75d2253b0982bee11179a58b968dd4d72 Mon Sep 17 00:00:00 2001 From: Clemens Korner Date: Wed, 13 Aug 2014 12:05:30 +0200 Subject: [PATCH 0450/2053] use plt namespace for imshow in filter_visualization.ipynb --- examples/filter_visualization.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index 5165d840b7b..765aab52228 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -193,7 +193,7 @@ " data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))\n", " data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])\n", " \n", - " imshow(data)" + " plt.imshow(data)" ], "language": "python", "metadata": {}, @@ -212,7 +212,7 @@ "collapsed": false, "input": [ "# index four is the center crop\n", - "imshow(net.deprocess('data', net.blobs['data'].data[4]))" + "plt.imshow(net.deprocess('data', net.blobs['data'].data[4]))" ], "language": "python", "metadata": {}, From bb903025df83450dd09d1ddd077aa99b74bac5da Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 13 Aug 2014 09:22:42 -0700 Subject: [PATCH 0451/2053] [example] fix plt commands in detection --- examples/detection.ipynb | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/examples/detection.ipynb b/examples/detection.ipynb index 3b0a5b2e705..1f6af25ff42 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -414,7 +414,10 @@ "cell_type": "code", "collapsed": false, "input": [ + "import numpy as np\n", "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", "\n", "df = pd.read_hdf('_temp/det_output.h5', 'df')\n", "print(df.shape)\n", @@ -525,10 +528,10 @@ "cell_type": "code", "collapsed": false, "input": [ - "gray()\n", - "matshow(predictions_df.values)\n", - "xlabel('Classes')\n", - "ylabel('Windows')" + "plt.gray()\n", + "plt.matshow(predictions_df.values)\n", + "plt.xlabel('Classes')\n", + "plt.ylabel('Windows')" ], "language": "python", "metadata": {}, @@ -626,17 +629,17 @@ "print(f.order(ascending=False)[:5])\n", "\n", "# Show top detection in red, second-best top detection in blue.\n", - "im = imread('images/fish-bike.jpg')\n", - "imshow(im)\n", + "im = plt.imread('images/fish-bike.jpg')\n", + "plt.imshow(im)\n", "currentAxis = plt.gca()\n", "\n", "det = df.iloc[i]\n", "coords = (det['xmin'], det['ymin']), det['xmax'] - det['xmin'], det['ymax'] - det['ymin']\n", - "currentAxis.add_patch(Rectangle(*coords, fill=False, edgecolor='r', linewidth=5))\n", + "currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor='r', linewidth=5))\n", "\n", "det = df.iloc[j]\n", "coords = (det['xmin'], det['ymin']), det['xmax'] - det['xmin'], det['ymax'] - det['ymin']\n", - "currentAxis.add_patch(Rectangle(*coords, fill=False, edgecolor='b', linewidth=5))" + "currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor='b', linewidth=5))" ], "language": "python", "metadata": {}, @@ -776,12 +779,12 @@ "cell_type": "code", "collapsed": false, "input": [ - "imshow(im)\n", + "plt.imshow(im)\n", "currentAxis = plt.gca()\n", "colors = ['r', 'b', 'y']\n", "for c, det in zip(colors, nms_dets[:3]):\n", " currentAxis.add_patch(\n", - " Rectangle((det[0], det[1]), det[2]-det[0], det[3]-det[1],\n", + " plt.Rectangle((det[0], det[1]), det[2]-det[0], det[3]-det[1],\n", " fill=False, edgecolor=c, linewidth=5)\n", " )\n", "print 'scores:', nms_dets[:3, 4]" From 944361e27e8269634343e9e947185102b15e746d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 13 Aug 2014 09:27:56 -0700 Subject: [PATCH 0452/2053] [example] change notebook name metadata to avoid conflict see https://github.com/ipython/ipython/issues/5686 --- examples/classification.ipynb | 7 ++++--- examples/detection.ipynb | 5 +++-- examples/filter_visualization.ipynb | 7 ++++--- examples/net_surgery.ipynb | 7 ++++--- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/examples/classification.ipynb b/examples/classification.ipynb index 302bdea0e00..4d4a738a9f3 100644 --- a/examples/classification.ipynb +++ b/examples/classification.ipynb @@ -1,8 +1,9 @@ { "metadata": { - "name": "ImageNet classification", "description": "Use the pre-trained ImageNet model to classify images with the Python interface.", - "include_in_docs": true + "example_name": "ImageNet classification", + "include_in_docs": true, + "signature": "sha256:4f8d4c079c30d20ef4b6818e9672b1741fd1377354e5b83e291710736cecd24f" }, "nbformat": 3, "nbformat_minor": 0, @@ -403,4 +404,4 @@ "metadata": {} } ] -} +} \ No newline at end of file diff --git a/examples/detection.ipynb b/examples/detection.ipynb index 1f6af25ff42..beae000a11b 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -1,8 +1,9 @@ { "metadata": { - "name": "ImageNet detection", "description": "Run a pretrained model as a detector in Python.", - "include_in_docs": true + "example_name": "R-CNN detection", + "include_in_docs": true, + "signature": "sha256:8a744fbbb9ed80acab471247eaf50c27dcbd652105404df9feca599939f0c0ee" }, "nbformat": 3, "nbformat_minor": 0, diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index 765aab52228..5fdcbe25fb4 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -1,8 +1,9 @@ { "metadata": { - "name": "Filter visualization", "description": "Extracting features and visualizing trained filters with an example image, viewed layer-by-layer.", - "include_in_docs": true + "example_name": "Filter visualization", + "include_in_docs": true, + "signature": "sha256:b1b0457e2b10110aca847a718a3fe631ebcfce63a61cbc33653244f52b1ff4af" }, "nbformat": 3, "nbformat_minor": 0, @@ -597,4 +598,4 @@ "metadata": {} } ] -} +} \ No newline at end of file diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 5f151e4be3a..dc9c7e84954 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -1,8 +1,9 @@ { "metadata": { - "name": "Editing model parameters", "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", - "include_in_docs": true + "example_name": "Editing model parameters", + "include_in_docs": true, + "signature": "sha256:0b2ad61622122fa34a40c250be2c0799a85fb65c149b802ce844c46eceba066e" }, "nbformat": 3, "nbformat_minor": 0, @@ -331,4 +332,4 @@ "metadata": {} } ] -} +} \ No newline at end of file From 41986fbcffd6c51eb46a7f72e197021ca13f0600 Mon Sep 17 00:00:00 2001 From: Clemens Korner Date: Wed, 13 Aug 2014 12:05:30 +0200 Subject: [PATCH 0453/2053] use plt namespace for imshow in filter_visualization.ipynb --- examples/filter_visualization.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index 5165d840b7b..765aab52228 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -193,7 +193,7 @@ " data = data.reshape((n, n) + data.shape[1:]).transpose((0, 2, 1, 3) + tuple(range(4, data.ndim + 1)))\n", " data = data.reshape((n * data.shape[1], n * data.shape[3]) + data.shape[4:])\n", " \n", - " imshow(data)" + " plt.imshow(data)" ], "language": "python", "metadata": {}, @@ -212,7 +212,7 @@ "collapsed": false, "input": [ "# index four is the center crop\n", - "imshow(net.deprocess('data', net.blobs['data'].data[4]))" + "plt.imshow(net.deprocess('data', net.blobs['data'].data[4]))" ], "language": "python", "metadata": {}, From 20adacb5d164fed0f463e538e1591141359aedf1 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 13 Aug 2014 09:22:42 -0700 Subject: [PATCH 0454/2053] [example] fix plt commands in detection --- examples/detection.ipynb | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/examples/detection.ipynb b/examples/detection.ipynb index 3b0a5b2e705..1f6af25ff42 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -414,7 +414,10 @@ "cell_type": "code", "collapsed": false, "input": [ + "import numpy as np\n", "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", "\n", "df = pd.read_hdf('_temp/det_output.h5', 'df')\n", "print(df.shape)\n", @@ -525,10 +528,10 @@ "cell_type": "code", "collapsed": false, "input": [ - "gray()\n", - "matshow(predictions_df.values)\n", - "xlabel('Classes')\n", - "ylabel('Windows')" + "plt.gray()\n", + "plt.matshow(predictions_df.values)\n", + "plt.xlabel('Classes')\n", + "plt.ylabel('Windows')" ], "language": "python", "metadata": {}, @@ -626,17 +629,17 @@ "print(f.order(ascending=False)[:5])\n", "\n", "# Show top detection in red, second-best top detection in blue.\n", - "im = imread('images/fish-bike.jpg')\n", - "imshow(im)\n", + "im = plt.imread('images/fish-bike.jpg')\n", + "plt.imshow(im)\n", "currentAxis = plt.gca()\n", "\n", "det = df.iloc[i]\n", "coords = (det['xmin'], det['ymin']), det['xmax'] - det['xmin'], det['ymax'] - det['ymin']\n", - "currentAxis.add_patch(Rectangle(*coords, fill=False, edgecolor='r', linewidth=5))\n", + "currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor='r', linewidth=5))\n", "\n", "det = df.iloc[j]\n", "coords = (det['xmin'], det['ymin']), det['xmax'] - det['xmin'], det['ymax'] - det['ymin']\n", - "currentAxis.add_patch(Rectangle(*coords, fill=False, edgecolor='b', linewidth=5))" + "currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor='b', linewidth=5))" ], "language": "python", "metadata": {}, @@ -776,12 +779,12 @@ "cell_type": "code", "collapsed": false, "input": [ - "imshow(im)\n", + "plt.imshow(im)\n", "currentAxis = plt.gca()\n", "colors = ['r', 'b', 'y']\n", "for c, det in zip(colors, nms_dets[:3]):\n", " currentAxis.add_patch(\n", - " Rectangle((det[0], det[1]), det[2]-det[0], det[3]-det[1],\n", + " plt.Rectangle((det[0], det[1]), det[2]-det[0], det[3]-det[1],\n", " fill=False, edgecolor=c, linewidth=5)\n", " )\n", "print 'scores:', nms_dets[:3, 4]" From 445ad1fd7972ab7edd0a1452d0d7eecbd2d93e95 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 13 Aug 2014 09:27:56 -0700 Subject: [PATCH 0455/2053] [example] change notebook name metadata to avoid conflict see https://github.com/ipython/ipython/issues/5686 --- examples/classification.ipynb | 7 ++++--- examples/detection.ipynb | 5 +++-- examples/filter_visualization.ipynb | 7 ++++--- examples/net_surgery.ipynb | 7 ++++--- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/examples/classification.ipynb b/examples/classification.ipynb index 302bdea0e00..4d4a738a9f3 100644 --- a/examples/classification.ipynb +++ b/examples/classification.ipynb @@ -1,8 +1,9 @@ { "metadata": { - "name": "ImageNet classification", "description": "Use the pre-trained ImageNet model to classify images with the Python interface.", - "include_in_docs": true + "example_name": "ImageNet classification", + "include_in_docs": true, + "signature": "sha256:4f8d4c079c30d20ef4b6818e9672b1741fd1377354e5b83e291710736cecd24f" }, "nbformat": 3, "nbformat_minor": 0, @@ -403,4 +404,4 @@ "metadata": {} } ] -} +} \ No newline at end of file diff --git a/examples/detection.ipynb b/examples/detection.ipynb index 1f6af25ff42..beae000a11b 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -1,8 +1,9 @@ { "metadata": { - "name": "ImageNet detection", "description": "Run a pretrained model as a detector in Python.", - "include_in_docs": true + "example_name": "R-CNN detection", + "include_in_docs": true, + "signature": "sha256:8a744fbbb9ed80acab471247eaf50c27dcbd652105404df9feca599939f0c0ee" }, "nbformat": 3, "nbformat_minor": 0, diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index 765aab52228..5fdcbe25fb4 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -1,8 +1,9 @@ { "metadata": { - "name": "Filter visualization", "description": "Extracting features and visualizing trained filters with an example image, viewed layer-by-layer.", - "include_in_docs": true + "example_name": "Filter visualization", + "include_in_docs": true, + "signature": "sha256:b1b0457e2b10110aca847a718a3fe631ebcfce63a61cbc33653244f52b1ff4af" }, "nbformat": 3, "nbformat_minor": 0, @@ -597,4 +598,4 @@ "metadata": {} } ] -} +} \ No newline at end of file diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 5f151e4be3a..dc9c7e84954 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -1,8 +1,9 @@ { "metadata": { - "name": "Editing model parameters", "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", - "include_in_docs": true + "example_name": "Editing model parameters", + "include_in_docs": true, + "signature": "sha256:0b2ad61622122fa34a40c250be2c0799a85fb65c149b802ce844c46eceba066e" }, "nbformat": 3, "nbformat_minor": 0, @@ -331,4 +332,4 @@ "metadata": {} } ] -} +} \ No newline at end of file From cb6144a8dde71b64846e6bab13755cae241f6183 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 13 Aug 2014 10:42:30 -0700 Subject: [PATCH 0456/2053] [docs] update docs generation for notebook metadata --- scripts/copy_notebook.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_notebook.py b/scripts/copy_notebook.py index 4f60cfd0e68..e4c6385bef8 100755 --- a/scripts/copy_notebook.py +++ b/scripts/copy_notebook.py @@ -19,7 +19,7 @@ if 'include_in_docs' in content['metadata'] and content['metadata']['include_in_docs']: yaml_frontmatter = ['---'] for key, val in content['metadata'].iteritems(): - if key == 'name': + if key == 'example_name': key = 'title' if val == '': val = os.path.basename(filename) From e32496aaad00438fb2c9926aad96a37e7394a0b0 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 13 Aug 2014 10:42:30 -0700 Subject: [PATCH 0457/2053] [docs] update docs generation for notebook metadata --- scripts/copy_notebook.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/copy_notebook.py b/scripts/copy_notebook.py index 4f60cfd0e68..e4c6385bef8 100755 --- a/scripts/copy_notebook.py +++ b/scripts/copy_notebook.py @@ -19,7 +19,7 @@ if 'include_in_docs' in content['metadata'] and content['metadata']['include_in_docs']: yaml_frontmatter = ['---'] for key, val in content['metadata'].iteritems(): - if key == 'name': + if key == 'example_name': key = 'title' if val == '': val = os.path.basename(filename) From d0cae53dd5291331ca7da0dfef0e7ff54e8e0bac Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 11 Jul 2014 01:44:49 -0700 Subject: [PATCH 0458/2053] Add loss_weight to proto, specifying coefficients for each top blob in the objective function. --- src/caffe/proto/caffe.proto | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index acc038326b3..971a291cad4 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -180,10 +180,14 @@ message NetStateRule { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 35 (last added: mvn_param) +// LayerParameter next available ID: 36 (last added: loss_weight) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs + // The amount of weight to assign each top blob in the objective. + // Each layer assigns a default value, usually of either 0 or 1, + // to each top blob. + repeated float loss_weight = 35; optional string name = 4; // the layer name // Rules controlling whether and when a layer is included in the network, From 7a3ed9b8edf43895770b63cb4d9f5cacf0dba047 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 11 Jul 2014 01:48:36 -0700 Subject: [PATCH 0459/2053] Add net tests for loss_weight. Check that the loss and gradients throughout the net are appropriately scaled for a few loss_weight values, assuming a default weight of 1 in the loss layer only. Also modify test_gradient_check_util to associate a loss of 2 rather than 1 with the top blob, so that loss layer tests fail if they don't scale their diffs. --- .../caffe/test/test_gradient_check_util.hpp | 37 ++-- src/caffe/test/test_net.cpp | 166 ++++++++++++++++-- 2 files changed, 176 insertions(+), 27 deletions(-) diff --git a/include/caffe/test/test_gradient_check_util.hpp b/include/caffe/test/test_gradient_check_util.hpp index 4cf2cbc9dc8..5a8d382ff26 100644 --- a/include/caffe/test/test_gradient_check_util.hpp +++ b/include/caffe/test/test_gradient_check_util.hpp @@ -57,8 +57,8 @@ class GradientChecker { const vector*>& input); protected: - Dtype GetObjAndGradient(vector*>* top, int top_id = -1, - int top_data_id = -1); + Dtype GetObjAndGradient(const Layer& layer, vector*>* top, + int top_id = -1, int top_data_id = -1); Dtype stepsize_; Dtype threshold_; unsigned int seed_; @@ -97,10 +97,11 @@ void GradientChecker::CheckGradientSingle(Layer* layer, } // Compute the gradient analytically using Backward Caffe::set_random_seed(seed_); - // Get any loss from the layer - Dtype computed_objective = layer->Forward(*bottom, top); + // Ignore the loss from the layer (it's just the weighted sum of the losses + // from the top blobs, whose gradients we may want to test individually). + layer->Forward(*bottom, top); // Get additional loss from the objective - computed_objective += GetObjAndGradient(top, top_id, top_data_id); + GetObjAndGradient(*layer, top, top_id, top_data_id); layer->Backward(*top, propagate_down, bottom); // Store computed gradients for all checked blobs vector > > @@ -131,18 +132,22 @@ void GradientChecker::CheckGradientSingle(Layer* layer, // i != top_data_id, we know the derivative is 0 by definition, and simply // check that that's true. Dtype estimated_gradient = 0; + Dtype positive_objective = 0; + Dtype negative_objective = 0; if (!element_wise || (feat_id == top_data_id)) { // Do finite differencing. // Compute loss with stepsize_ added to input. current_blob->mutable_cpu_data()[feat_id] += stepsize_; Caffe::set_random_seed(seed_); - Dtype positive_objective = layer->Forward(*bottom, top); - positive_objective += GetObjAndGradient(top, top_id, top_data_id); + layer->Forward(*bottom, top); + positive_objective = + GetObjAndGradient(*layer, top, top_id, top_data_id); // Compute loss with stepsize_ subtracted from input. current_blob->mutable_cpu_data()[feat_id] -= stepsize_ * 2; Caffe::set_random_seed(seed_); - Dtype negative_objective = layer->Forward(*bottom, top); - negative_objective += GetObjAndGradient(top, top_id, top_data_id); + layer->Forward(*bottom, top); + negative_objective = + GetObjAndGradient(*layer, top, top_id, top_data_id); // Recover original input value. current_blob->mutable_cpu_data()[feat_id] += stepsize_; estimated_gradient = (positive_objective - negative_objective) / @@ -160,7 +165,10 @@ void GradientChecker::CheckGradientSingle(Layer* layer, std::max(fabs(computed_gradient), fabs(estimated_gradient)), 1.); EXPECT_NEAR(computed_gradient, estimated_gradient, threshold_ * scale) << "debug: (top_id, top_data_id, blob_id, feat_id)=" - << top_id << "," << top_data_id << "," << blob_id << "," << feat_id; + << top_id << "," << top_data_id << "," << blob_id << "," << feat_id + << "; feat = " << feature + << "; objective+ = " << positive_objective + << "; objective- = " << negative_objective; } // LOG(ERROR) << "Feature: " << current_blob->cpu_data()[feat_id]; // LOG(ERROR) << "computed gradient: " << computed_gradient @@ -212,8 +220,8 @@ void GradientChecker::CheckGradientNet( } template -Dtype GradientChecker::GetObjAndGradient(vector*>* top, - int top_id, int top_data_id) { +Dtype GradientChecker::GetObjAndGradient(const Layer& layer, + vector*>* top, int top_id, int top_data_id) { Dtype loss = 0; if (top_id < 0) { // the loss will be half of the sum of squares of all outputs @@ -236,8 +244,9 @@ Dtype GradientChecker::GetObjAndGradient(vector*>* top, Dtype* top_blob_diff = top_blob->mutable_cpu_diff(); caffe_set(top_blob->count(), Dtype(0), top_blob_diff); } - loss = (*top)[top_id]->cpu_data()[top_data_id]; - (*top)[top_id]->mutable_cpu_diff()[top_data_id] = 1.; + const Dtype loss_weight = 2; + loss = (*top)[top_id]->cpu_data()[top_data_id] * loss_weight; + (*top)[top_id]->mutable_cpu_diff()[top_data_id] = loss_weight; } return loss; } diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 18bc9ad7838..acd3bcdd8eb 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -141,7 +141,11 @@ class NetTest : public MultiDeviceTest { InitNetFromProtoString(proto); } - virtual void InitTrickyNet() { + virtual void InitTrickyNet(Dtype* loss_weight = NULL) { + ostringstream loss_weight_stream; + if (loss_weight) { + loss_weight_stream << " top_loss_weight: " << *loss_weight << " "; + } const string& proto = "name: 'TrickyTestNetwork' " "layers: { " @@ -208,19 +212,27 @@ class NetTest : public MultiDeviceTest { "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: SOFTMAX_LOSS " + + loss_weight_stream.str() + " bottom: 'transformed_data' " " bottom: 'transformed_label' " "} "; InitNetFromProtoString(proto); } - virtual void InitUnsharedWeightsNet(const bool bias_term = false, + virtual void InitUnsharedWeightsNet(Dtype* loss_weight, + const bool force_backward = false, const bool bias_term = false, const Dtype blobs_lr_w1 = 1, const Dtype blobs_lr_b1 = 2, const Dtype blobs_lr_w2 = 1, const Dtype blobs_lr_b2 = 2) { ostringstream proto; + if (loss_weight) { + loss_weight_stream << " top_loss_weight: " << *loss_weight << " "; + } + proto << "name: 'UnsharedWeightsNetwork' "; + if (force_backward) { + proto << "force_backward: true "; + } proto << - "name: 'UnsharedWeightsNetwork' " "layers: { " " name: 'data' " " type: DUMMY_DATA " @@ -286,7 +298,11 @@ class NetTest : public MultiDeviceTest { "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: EUCLIDEAN_LOSS "; + if (loss_weight) { + proto << " top_loss_weight: " << *loss_weight << " "; + } + proto << " bottom: 'innerproduct1' " " bottom: 'innerproduct2' " "} "; @@ -575,6 +591,128 @@ TYPED_TEST(NetTest, TestBottomNeedBackwardTricky) { EXPECT_EQ(true, bottom_need_backward[3][1]); } +TYPED_TEST(NetTest, TestLossWeightCPU) { + Caffe::set_mode(Caffe::CPU); + // First, compute the loss and gradients with no top_loss_weight specified. + // In this case, the loss weight for the EUCLIDEAN_LOSS layer should default + // to 1. + vector*> bottom; + Caffe::set_random_seed(this->seed_); + const bool kForceBackward = true; + this->InitUnsharedWeightsNet(NULL, kForceBackward); + const TypeParam loss = this->net_->ForwardBackward(bottom); + const bool kCopyDiff = true; + const bool kReshape = true; + const vector > >& net_blobs = this->net_->blobs(); + vector > > blob_grads(net_blobs.size()); + for (int i = 0; i < net_blobs.size(); ++i) { + blob_grads[i].reset(new Blob()); + blob_grads[i]->CopyFrom(*net_blobs[i], kCopyDiff, kReshape); + } + const vector > >& net_params = + this->net_->params(); + vector > > param_grads(net_params.size()); + for (int i = 0; i < net_params.size(); ++i) { + param_grads[i].reset(new Blob()); + param_grads[i]->CopyFrom(*net_params[i], kCopyDiff, kReshape); + } + // Check that the loss is non-trivial, otherwise the test doesn't prove much. + const TypeParam kMinLossAbsValue = 1e-2; + ASSERT_GE(fabs(loss), kMinLossAbsValue); + const TypeParam kErrorMargin = 1e-5; + const int kNumLossWeights = 6; + TypeParam kLossWeights[kNumLossWeights] = {2, 0, 1, -1, -2.5, 3.7}; + for (int i = 0; i < kNumLossWeights; ++i) { + Caffe::set_random_seed(this->seed_); + this->InitUnsharedWeightsNet(&kLossWeights[i], kForceBackward); + const TypeParam weighted_loss = this->net_->ForwardBackward(bottom); + const TypeParam error_margin = kErrorMargin * fabs(kLossWeights[i]); + EXPECT_NEAR(loss * kLossWeights[i], weighted_loss, error_margin) + << "loss weight = " << kLossWeights[i]; + const vector > >& weighted_blobs = + this->net_->blobs(); + ASSERT_EQ(blob_grads.size(), weighted_blobs.size()); + for (int j = 0; j < blob_grads.size(); ++j) { + ASSERT_EQ(blob_grads[j]->count(), weighted_blobs[j]->count()); + for (int k = 0; k < blob_grads[j]->count(); ++k) { + EXPECT_NEAR(blob_grads[j]->cpu_diff()[k] * kLossWeights[i], + weighted_blobs[j]->cpu_diff()[k], error_margin); + } + } + const vector > >& weighted_params = + this->net_->params(); + ASSERT_EQ(param_grads.size(), weighted_params.size()); + for (int j = 0; j < param_grads.size(); ++j) { + ASSERT_EQ(param_grads[j]->count(), weighted_params[j]->count()); + for (int k = 0; k < param_grads[j]->count(); ++k) { + EXPECT_NEAR(param_grads[j]->cpu_diff()[k] * kLossWeights[i], + weighted_params[j]->cpu_diff()[k], error_margin); + } + } + } +} + +TYPED_TEST(NetTest, TestLossWeightGPU) { + Caffe::set_mode(Caffe::GPU); + // First, compute the loss and gradients with no top_loss_weight specified. + // In this case, the loss weight for the EUCLIDEAN_LOSS layer should default + // to 1. + vector*> bottom; + Caffe::set_random_seed(this->seed_); + const bool kForceBackward = true; + this->InitUnsharedWeightsNet(NULL, kForceBackward); + const TypeParam loss = this->net_->ForwardBackward(bottom); + const bool kCopyDiff = true; + const bool kReshape = true; + const vector > >& net_blobs = this->net_->blobs(); + vector > > blob_grads(net_blobs.size()); + for (int i = 0; i < net_blobs.size(); ++i) { + blob_grads[i].reset(new Blob()); + blob_grads[i]->CopyFrom(*net_blobs[i], kCopyDiff, kReshape); + } + const vector > >& net_params = + this->net_->params(); + vector > > param_grads(net_params.size()); + for (int i = 0; i < net_params.size(); ++i) { + param_grads[i].reset(new Blob()); + param_grads[i]->CopyFrom(*net_params[i], kCopyDiff, kReshape); + } + // Check that the loss is non-trivial, otherwise the test doesn't prove much. + const TypeParam kMinLossAbsValue = 1e-2; + ASSERT_GE(fabs(loss), kMinLossAbsValue); + const Dtype kErrorMargin = 1e-4; + const int kNumLossWeights = 6; + TypeParam kLossWeights[kNumLossWeights] = {2, 0, 1, -1, -2.5, 3.7}; + for (int i = 0; i < kNumLossWeights; ++i) { + Caffe::set_random_seed(this->seed_); + this->InitUnsharedWeightsNet(&kLossWeights[i], kForceBackward); + const TypeParam weighted_loss = this->net_->ForwardBackward(bottom); + const TypeParam error_margin = kErrorMargin * fabs(kLossWeights[i]); + EXPECT_NEAR(loss * kLossWeights[i], weighted_loss, error_margin) + << "loss weight = " << kLossWeights[i]; + const vector > >& weighted_blobs = + this->net_->blobs(); + ASSERT_EQ(blob_grads.size(), weighted_blobs.size()); + for (int j = 0; j < blob_grads.size(); ++j) { + ASSERT_EQ(blob_grads[j]->count(), weighted_blobs[j]->count()); + for (int k = 0; k < blob_grads[j]->count(); ++k) { + EXPECT_NEAR(blob_grads[j]->cpu_diff()[k] * kLossWeights[i], + weighted_blobs[j]->cpu_diff()[k], error_margin); + } + } + const vector > >& weighted_params = + this->net_->params(); + ASSERT_EQ(param_grads.size(), weighted_params.size()); + for (int j = 0; j < param_grads.size(); ++j) { + ASSERT_EQ(param_grads[j]->count(), weighted_params[j]->count()); + for (int k = 0; k < param_grads[j]->count(); ++k) { + EXPECT_NEAR(param_grads[j]->cpu_diff()[k] * kLossWeights[i], + weighted_params[j]->cpu_diff()[k], error_margin); + } + } + } +} + TYPED_TEST(NetTest, TestUnsharedWeightsDataNet) { typedef typename TypeParam::Dtype Dtype; this->InitUnsharedWeightsNet(); @@ -722,12 +860,14 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { typedef typename TypeParam::Dtype Dtype; vector*> bottom; const bool kBiasTerm = true; + const bool kForceBackward = false; + const Dtype* kLossWeight = NULL; // Run the net with all params learned; check that gradients are non-zero. Caffe::set_random_seed(this->seed_); Dtype blobs_lr_w1 = 1, blobs_lr_w2 = 1, blobs_lr_b1 = 2, blobs_lr_b2 = 2; - this->InitUnsharedWeightsNet(kBiasTerm, blobs_lr_w1, blobs_lr_w2, - blobs_lr_b1, blobs_lr_b2); + this->InitUnsharedWeightsNet(kLossWeight, kForceBackward, kBiasTerm + blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); this->net_->Forward(bottom); this->net_->Backward(); const vector > >& params = this->net_->params(); @@ -746,8 +886,8 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { // gradients. Caffe::set_random_seed(this->seed_); blobs_lr_w1 *= 2, blobs_lr_w2 *= 2, blobs_lr_b1 *= 2, blobs_lr_b2 *= 2; - this->InitUnsharedWeightsNet(kBiasTerm, blobs_lr_w1, blobs_lr_w2, - blobs_lr_b1, blobs_lr_b2); + this->InitUnsharedWeightsNet(kLossWeight, kForceBackward, kBiasTerm + blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); this->net_->Forward(bottom); this->net_->Backward(); const vector > >& params2 = this->net_->params(); @@ -762,8 +902,8 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { // gradients for those. Caffe::set_random_seed(this->seed_); blobs_lr_w1 = 1, blobs_lr_w2 = 0, blobs_lr_b1 = 0, blobs_lr_b2 = 1; - this->InitUnsharedWeightsNet(kBiasTerm, blobs_lr_w1, blobs_lr_w2, - blobs_lr_b1, blobs_lr_b2); + this->InitUnsharedWeightsNet(kLossWeight, kForceBackward, kBiasTerm + blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); this->net_->Forward(bottom); this->net_->Backward(); const vector > >& params3 = this->net_->params(); @@ -781,8 +921,8 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { // Change the opposite subset of the learning rates to zero. Caffe::set_random_seed(this->seed_); blobs_lr_w1 = 0, blobs_lr_w2 = 1, blobs_lr_b1 = 1, blobs_lr_b2 = 0; - this->InitUnsharedWeightsNet(kBiasTerm, blobs_lr_w1, blobs_lr_w2, - blobs_lr_b1, blobs_lr_b2); + this->InitUnsharedWeightsNet(kLossWeight, kForceBackward, kBiasTerm + blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); this->net_->Forward(bottom); this->net_->Backward(); const vector > >& params4 = this->net_->params(); From 512a626fc71c69ed4460024b31c5fe8dff1e668c Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 11 Jul 2014 01:55:17 -0700 Subject: [PATCH 0460/2053] Generalize loss by allowing any top blob to be used as a loss in which its elements are summed with a scalar coefficient. Forward for layers no longer returns a loss; instead all loss layers must have top blobs. Existing loss layers are given a top blob automatically by Net::Init, with an associated top_loss_weight of 1 (set in LossLayer::FurtherSetUp). Due to the increased amount of common SetUp logic, the SetUp interface is modified such that all subclasses should normally override FurtherSetUp only, which is called by SetUp. --- include/caffe/common_layers.hpp | 40 ++--- include/caffe/data_layers.hpp | 38 ++--- include/caffe/layer.hpp | 83 ++++++++-- include/caffe/loss_layers.hpp | 64 ++++---- include/caffe/neuron_layers.hpp | 36 ++--- include/caffe/util/device_alternate.hpp | 4 +- include/caffe/vision_layers.hpp | 50 +++--- src/caffe/layers/accuracy_layer.cpp | 7 +- src/caffe/layers/argmax_layer.cpp | 6 +- src/caffe/layers/bnll_layer.cpp | 3 +- src/caffe/layers/bnll_layer.cu | 3 +- src/caffe/layers/concat_layer.cpp | 10 +- src/caffe/layers/concat_layer.cu | 3 +- src/caffe/layers/conv_layer.cpp | 6 +- src/caffe/layers/conv_layer.cu | 3 +- src/caffe/layers/data_layer.cpp | 6 +- src/caffe/layers/data_layer.cu | 3 +- src/caffe/layers/dropout_layer.cpp | 7 +- src/caffe/layers/dropout_layer.cu | 3 +- src/caffe/layers/dummy_data_layer.cpp | 7 +- src/caffe/layers/eltwise_layer.cpp | 6 +- src/caffe/layers/eltwise_layer.cu | 3 +- src/caffe/layers/euclidean_loss_layer.cpp | 13 +- src/caffe/layers/euclidean_loss_layer.cu | 10 +- src/caffe/layers/flatten_layer.cpp | 6 +- src/caffe/layers/flatten_layer.cu | 3 +- src/caffe/layers/hdf5_data_layer.cpp | 6 +- src/caffe/layers/hdf5_data_layer.cu | 3 +- src/caffe/layers/hdf5_output_layer.cpp | 3 +- src/caffe/layers/hdf5_output_layer.cu | 3 +- src/caffe/layers/hinge_loss_layer.cpp | 14 +- src/caffe/layers/im2col_layer.cpp | 6 +- src/caffe/layers/im2col_layer.cu | 3 +- src/caffe/layers/image_data_layer.cpp | 8 +- src/caffe/layers/image_data_layer.cu | 3 +- src/caffe/layers/infogain_loss_layer.cpp | 16 +- src/caffe/layers/inner_product_layer.cpp | 6 +- src/caffe/layers/inner_product_layer.cu | 3 +- src/caffe/layers/loss_layer.cpp | 11 +- src/caffe/layers/lrn_layer.cpp | 19 +-- src/caffe/layers/lrn_layer.cu | 12 +- src/caffe/layers/memory_data_layer.cpp | 6 +- .../multinomial_logistic_loss_layer.cpp | 13 +- src/caffe/layers/mvn_layer.cpp | 7 +- src/caffe/layers/mvn_layer.cu | 4 +- src/caffe/layers/neuron_layer.cpp | 6 +- src/caffe/layers/pooling_layer.cpp | 15 +- src/caffe/layers/pooling_layer.cu | 3 +- src/caffe/layers/power_layer.cpp | 8 +- src/caffe/layers/power_layer.cu | 4 +- src/caffe/layers/relu_layer.cpp | 3 +- src/caffe/layers/relu_layer.cu | 3 +- .../sigmoid_cross_entropy_loss_layer.cpp | 13 +- .../sigmoid_cross_entropy_loss_layer.cu | 10 +- src/caffe/layers/sigmoid_layer.cpp | 3 +- src/caffe/layers/sigmoid_layer.cu | 3 +- src/caffe/layers/slice_layer.cpp | 6 +- src/caffe/layers/slice_layer.cu | 3 +- src/caffe/layers/softmax_layer.cpp | 6 +- src/caffe/layers/softmax_layer.cu | 3 +- src/caffe/layers/softmax_loss_layer.cpp | 28 ++-- src/caffe/layers/softmax_loss_layer.cu | 5 +- src/caffe/layers/split_layer.cpp | 6 +- src/caffe/layers/split_layer.cu | 3 +- src/caffe/layers/tanh_layer.cpp | 3 +- src/caffe/layers/tanh_layer.cu | 3 +- src/caffe/layers/threshold_layer.cpp | 7 +- src/caffe/layers/threshold_layer.cu | 4 +- src/caffe/layers/window_data_layer.cpp | 8 +- src/caffe/layers/window_data_layer.cu | 3 +- src/caffe/net.cpp | 32 +++- src/caffe/test/test_euclidean_loss_layer.cpp | 42 ++++- src/caffe/test/test_hinge_loss_layer.cpp | 21 +-- src/caffe/test/test_infogain_loss_layer.cpp | 10 +- .../test_multinomial_logistic_loss_layer.cpp | 10 +- src/caffe/test/test_net.cpp | 143 ++++++------------ .../test_sigmoid_cross_entropy_loss_layer.cpp | 16 +- .../test/test_softmax_with_loss_layer.cpp | 12 +- src/caffe/test/test_split_layer.cpp | 1 + 79 files changed, 504 insertions(+), 511 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 5d7c21db622..979fd9a6dae 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -29,7 +29,7 @@ class ArgMaxLayer : public Layer { public: explicit ArgMaxLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -39,7 +39,7 @@ class ArgMaxLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { @@ -58,7 +58,7 @@ class ConcatLayer : public Layer { public: explicit ConcatLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -68,9 +68,9 @@ class ConcatLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -93,7 +93,7 @@ class FlattenLayer : public Layer { public: explicit FlattenLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -103,9 +103,9 @@ class FlattenLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -122,7 +122,7 @@ class MVNLayer : public Layer { public: explicit MVNLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -132,9 +132,9 @@ class MVNLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -154,7 +154,7 @@ class SoftmaxLayer : public Layer { public: explicit SoftmaxLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -164,9 +164,9 @@ class SoftmaxLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -186,7 +186,7 @@ class SplitLayer : public Layer { public: explicit SplitLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -196,9 +196,9 @@ class SplitLayer : public Layer { virtual inline int MinTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -217,7 +217,7 @@ class SliceLayer : public Layer { public: explicit SliceLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -227,9 +227,9 @@ class SliceLayer : public Layer { virtual inline int MinTopBlobs() const { return 2; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 31774828a69..8ab92bfc0a5 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -31,7 +31,7 @@ class DataLayer : public Layer, public InternalThread { explicit DataLayer(const LayerParameter& param) : Layer(param) {} virtual ~DataLayer(); - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -42,9 +42,9 @@ class DataLayer : public Layer, public InternalThread { virtual inline int MaxTopBlobs() const { return 2; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) {} @@ -85,7 +85,7 @@ class DummyDataLayer : public Layer { public: explicit DummyDataLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -95,7 +95,7 @@ class DummyDataLayer : public Layer { virtual inline int MinTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) {} @@ -112,7 +112,7 @@ class HDF5DataLayer : public Layer { explicit HDF5DataLayer(const LayerParameter& param) : Layer(param) {} virtual ~HDF5DataLayer(); - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -122,9 +122,9 @@ class HDF5DataLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 2; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) {} @@ -145,7 +145,7 @@ class HDF5OutputLayer : public Layer { public: explicit HDF5OutputLayer(const LayerParameter& param); virtual ~HDF5OutputLayer(); - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top) {} virtual inline LayerParameter_LayerType type() const { @@ -158,9 +158,9 @@ class HDF5OutputLayer : public Layer { inline std::string file_name() const { return file_name_; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -180,7 +180,7 @@ class ImageDataLayer : public Layer, public InternalThread { explicit ImageDataLayer(const LayerParameter& param) : Layer(param) {} virtual ~ImageDataLayer(); - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -190,9 +190,9 @@ class ImageDataLayer : public Layer, public InternalThread { virtual inline int ExactNumTopBlobs() const { return 2; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) {} @@ -226,7 +226,7 @@ class MemoryDataLayer : public Layer { public: explicit MemoryDataLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -244,7 +244,7 @@ class MemoryDataLayer : public Layer { int batch_size() { return batch_size_; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) {} @@ -268,7 +268,7 @@ class WindowDataLayer : public Layer, public InternalThread { explicit WindowDataLayer(const LayerParameter& param) : Layer(param) {} virtual ~WindowDataLayer(); - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -278,9 +278,9 @@ class WindowDataLayer : public Layer, public InternalThread { virtual inline int ExactNumTopBlobs() const { return 2; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) {} diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index dca5f8709af..2881fe25807 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -1,6 +1,7 @@ #ifndef CAFFE_LAYER_H_ #define CAFFE_LAYER_H_ +#include #include #include @@ -29,12 +30,17 @@ class Layer { } } virtual ~Layer() {} - // SetUp: your function should implement this, and call Layer::SetUp for - // common SetUp functionality. - virtual void SetUp(const vector*>& bottom, - vector*>* top) { + // SetUp: implements common layer setup functionality, and calls + // LayerSetUp to do special layer setup for individual layer types. + // This method may not be overridden. + void SetUp(const vector*>& bottom, vector*>* top) { CheckBlobCounts(bottom, *top); + LayerSetUp(bottom, top); + SetLossWeights(top); } + // LayerSetUp: your layer should implement this. + virtual void LayerSetUp(const vector*>& bottom, + vector*>* top) { NOT_IMPLEMENTED; } // Forward and backward wrappers. You should implement the cpu and // gpu specific implementations instead, and should not change these @@ -51,10 +57,37 @@ class Layer { } // Returns the layer parameter - const LayerParameter& layer_param() { return layer_param_; } + const LayerParameter& layer_param() const { return layer_param_; } // Writes the layer parameter to a protocol buffer virtual void ToProto(LayerParameter* param, bool write_diff = false); + inline Dtype loss(const int top_index) const { + return (loss_.size() > top_index) ? loss_[top_index] : Dtype(0); + } + inline void set_loss(const int top_index, const Dtype value) { + if (loss_.size() <= top_index) { + loss_.resize(top_index + 1, Dtype(0)); + } + loss_[top_index] = value; + } + // Setup the weights associated with each top blob in the loss function. + // Store non-zero loss weights in the diff blob. + inline void SetLossWeights(vector*>* top) { + const int num_loss_weights = layer_param_.loss_weight_size(); + if (num_loss_weights) { + CHECK_EQ(top->size(), num_loss_weights) << "loss_weight must be " + "unspecified or specified once per top blob."; + for (int top_id = 0; top_id < top->size(); ++top_id) { + const Dtype loss_weight = layer_param_.loss_weight(top_id); + if (loss_weight == Dtype(0)) { continue; } + this->set_loss(top_id, loss_weight); + const int count = (*top)[top_id]->count(); + Dtype* loss_multiplier = (*top)[top_id]->mutable_cpu_diff(); + caffe_set(count, loss_weight, loss_multiplier); + } + } + } + // Returns the layer type as an enum value. virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_NONE; @@ -80,6 +113,11 @@ class Layer { virtual inline int MinTopBlobs() const { return -1; } virtual inline int MaxTopBlobs() const { return -1; } + // AutoTopBlobs may be overridden with a positive integer to automatically + // create enough "anonymous" top blobs to fulfill the requirement specified + // by ExactNumTopBlobs() or MinTopBlobs(). + virtual inline bool AutoTopBlobs() const { return false; } + // EqualNumBottomTopBlobs should return true for layers requiring an equal // number of bottom and top blobs. virtual inline bool EqualNumBottomTopBlobs() const { return false; } @@ -115,12 +153,16 @@ class Layer { // Vector indicating whether to compute the diff of each param blob. vector param_propagate_down_; + // The vector that indicates whether each top blob has a non-zero weight in + // the objective function. + vector loss_; + // Forward functions: compute the layer output // (and loss layers return the loss; other layers return the dummy value 0.) - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top) = 0; // If no gpu code is provided, we will simply use cpu code. - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top) { // LOG(WARNING) << "Using CPU code as backup."; return Forward_cpu(bottom, top); @@ -189,15 +231,36 @@ class Layer { template inline Dtype Layer::Forward(const vector*>& bottom, vector*>* top) { + Dtype loss = 0; switch (Caffe::mode()) { case Caffe::CPU: - return Forward_cpu(bottom, top); + Forward_cpu(bottom, top); + for (int top_id = 0; top_id < top->size(); ++top_id) { + if (!this->loss(top_id)) { continue; } + const int count = (*top)[top_id]->count(); + const Dtype* data = (*top)[top_id]->cpu_data(); + const Dtype* loss_weights = (*top)[top_id]->cpu_diff(); + loss += caffe_cpu_dot(count, data, loss_weights); + } + break; case Caffe::GPU: - return Forward_gpu(bottom, top); + Forward_gpu(bottom, top); +#ifndef CPU_ONLY + for (int top_id = 0; top_id < top->size(); ++top_id) { + if (!this->loss(top_id)) { continue; } + const int count = (*top)[top_id]->count(); + const Dtype* data = (*top)[top_id]->gpu_data(); + const Dtype* loss_weights = (*top)[top_id]->gpu_diff(); + Dtype blob_loss = 0; + caffe_gpu_dot(count, data, loss_weights, &blob_loss); + loss += blob_loss; + } +#endif + break; default: LOG(FATAL) << "Unknown caffe mode."; - return Dtype(0); } + return loss; } template diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index bd2618d6d36..937da0ecda5 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -29,7 +29,7 @@ class AccuracyLayer : public Layer { public: explicit AccuracyLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -40,7 +40,7 @@ class AccuracyLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { @@ -59,13 +59,15 @@ class LossLayer : public Layer { public: explicit LossLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp( + virtual void LayerSetUp( const vector*>& bottom, vector*>* top); - virtual void FurtherSetUp( - const vector*>& bottom, vector*>* top) {} virtual inline int ExactNumBottomBlobs() const { return 2; } - virtual inline int MaxTopBlobs() const { return 1; } + // For convenience and backwards compatibility, LossLayer's automatically + // allocate a singleton top blob into which they output their singleton loss, + // (even if the user didn't specify one in the prototxt, etc.). + virtual inline bool AutoTopBlobs() const { return true; } + virtual inline int ExactNumTopBlobs() const { return 1; } // We usually cannot backpropagate to the labels; ignore force_backward for // these inputs. virtual inline bool AllowForceBackward(const int bottom_index) const { @@ -84,7 +86,7 @@ class EuclideanLossLayer : public LossLayer { public: explicit EuclideanLossLayer(const LayerParameter& param) : LossLayer(param), diff_() {} - virtual void FurtherSetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -97,9 +99,9 @@ class EuclideanLossLayer : public LossLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -122,7 +124,7 @@ class HingeLossLayer : public LossLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -135,15 +137,22 @@ class InfogainLossLayer : public LossLayer { public: explicit InfogainLossLayer(const LayerParameter& param) : LossLayer(param), infogain_() {} - virtual void FurtherSetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); + // InfogainLossLayer takes 2-3 bottom blobs; if there are 3 the third should + // be the infogain matrix. (Otherwise the infogain matrix is loaded from a + // file specified by LayerParameter.) + virtual inline int ExactNumBottomBlobs() const { return -1; } + virtual inline int MinBottomBlobs() const { return 2; } + virtual inline int MaxBottomBlobs() const { return 3; } + virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_INFOGAIN_LOSS; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -158,7 +167,7 @@ class MultinomialLogisticLossLayer : public LossLayer { public: explicit MultinomialLogisticLossLayer(const LayerParameter& param) : LossLayer(param) {} - virtual void FurtherSetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -166,7 +175,7 @@ class MultinomialLogisticLossLayer : public LossLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -181,7 +190,7 @@ class SigmoidCrossEntropyLossLayer : public LossLayer { : LossLayer(param), sigmoid_layer_(new SigmoidLayer(param)), sigmoid_output_(new Blob()) {} - virtual void FurtherSetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -189,9 +198,9 @@ class SigmoidCrossEntropyLossLayer : public LossLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -218,27 +227,28 @@ template class SoftmaxLayer; In test, this layer could be replaced by simple softmax layer. */ template -class SoftmaxWithLossLayer : public Layer { +class SoftmaxWithLossLayer : public LossLayer { public: explicit SoftmaxWithLossLayer(const LayerParameter& param) - : Layer(param), softmax_layer_(new SoftmaxLayer(param)) {} - virtual void SetUp(const vector*>& bottom, + : LossLayer(param), + softmax_layer_(new SoftmaxLayer(param)) {} + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SOFTMAX_LOSS; } + virtual inline int ExactNumBottomBlobs() const { return -1; } + virtual inline int MinBottomBlobs() const { return 2; } + virtual inline int MaxBottomBlobs() const { return 3; } + virtual inline int ExactNumTopBlobs() const { return -1; } + virtual inline int MinTopBlobs() const { return 1; } virtual inline int MaxTopBlobs() const { return 2; } - // We cannot backpropagate to the labels; ignore force_backward for these - // inputs. - virtual inline bool AllowForceBackward(const int bottom_index) const { - return bottom_index != 1; - } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 6fe425229e8..20f7f6d58e8 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -28,7 +28,7 @@ class NeuronLayer : public Layer { public: explicit NeuronLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -56,9 +56,9 @@ class BNLLLayer : public NeuronLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -81,7 +81,7 @@ class DropoutLayer : public NeuronLayer { public: explicit DropoutLayer(const LayerParameter& param) : NeuronLayer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -89,9 +89,9 @@ class DropoutLayer : public NeuronLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -115,7 +115,7 @@ class PowerLayer : public NeuronLayer { public: explicit PowerLayer(const LayerParameter& param) : NeuronLayer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -123,9 +123,9 @@ class PowerLayer : public NeuronLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -158,9 +158,9 @@ class ReLULayer : public NeuronLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, @@ -191,9 +191,9 @@ class SigmoidLayer : public NeuronLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -219,9 +219,9 @@ class TanHLayer : public NeuronLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -244,7 +244,7 @@ class ThresholdLayer : public NeuronLayer { public: explicit ThresholdLayer(const LayerParameter& param) : NeuronLayer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -252,9 +252,9 @@ class ThresholdLayer : public NeuronLayer { } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index cf1aef759cc..4141c3d60a3 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -11,7 +11,7 @@ #define STUB_GPU(classname) \ template \ -Dtype classname::Forward_gpu(const vector*>& bottom, \ +void classname::Forward_gpu(const vector*>& bottom, \ vector*>* top) { NO_GPU; } \ template \ void classname::Backward_gpu(const vector*>& top, \ @@ -20,7 +20,7 @@ void classname::Backward_gpu(const vector*>& top, \ #define STUB_GPU_FORWARD(classname, funcname) \ template \ -Dtype classname::funcname##_##gpu(const vector*>& bottom, \ +void classname::funcname##_##gpu(const vector*>& bottom, \ vector*>* top) { NO_GPU; } \ #define STUB_GPU_BACKWARD(classname, funcname) \ diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 76b9f245643..31df136af9b 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -23,7 +23,7 @@ class ConvolutionLayer : public Layer { public: explicit ConvolutionLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -34,9 +34,9 @@ class ConvolutionLayer : public Layer { virtual inline bool EqualNumBottomTopBlobs() const { return true; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -68,7 +68,7 @@ class EltwiseLayer : public Layer { public: explicit EltwiseLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -78,9 +78,9 @@ class EltwiseLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -98,7 +98,7 @@ class Im2colLayer : public Layer { public: explicit Im2colLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -108,9 +108,9 @@ class Im2colLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -132,7 +132,7 @@ class InnerProductLayer : public Layer { public: explicit InnerProductLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -142,9 +142,9 @@ class InnerProductLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -170,7 +170,7 @@ class LRNLayer : public Layer { public: explicit LRNLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -180,20 +180,20 @@ class LRNLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); - virtual Dtype CrossChannelForward_cpu(const vector*>& bottom, + virtual void CrossChannelForward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype CrossChannelForward_gpu(const vector*>& bottom, + virtual void CrossChannelForward_gpu(const vector*>& bottom, vector*>* top); - virtual Dtype WithinChannelForward(const vector*>& bottom, + virtual void WithinChannelForward(const vector*>& bottom, vector*>* top); virtual void CrossChannelBackward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); @@ -242,7 +242,7 @@ class PoolingLayer : public Layer { public: explicit PoolingLayer(const LayerParameter& param) : Layer(param) {} - virtual void SetUp(const vector*>& bottom, + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -250,19 +250,23 @@ class PoolingLayer : public Layer { } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int MinTopBlobs() const { return 1; } - virtual inline int MaxTopBlobs() const { return max_top_blobs_; } + // MAX POOL layers can output an extra top blob for the mask; + // others can only output the pooled inputs. + virtual inline int MaxTopBlobs() const { + return (this->layer_param_.pooling_param().pool() == + PoolingParameter_PoolMethod_MAX) ? 2 : 1; + } protected: - virtual Dtype Forward_cpu(const vector*>& bottom, + virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual Dtype Forward_gpu(const vector*>& bottom, + virtual void Forward_gpu(const vector*>& bottom, vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom); - int max_top_blobs_; int kernel_h_, kernel_w_; int stride_h_, stride_w_; int pad_h_, pad_w_; diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 76889d8b70a..062e927183b 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -11,9 +11,8 @@ namespace caffe { template -void AccuracyLayer::SetUp( +void AccuracyLayer::LayerSetUp( const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); top_k_ = this->layer_param_.accuracy_param().top_k(); CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; @@ -26,7 +25,7 @@ void AccuracyLayer::SetUp( } template -Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, +void AccuracyLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { Dtype accuracy = 0; const Dtype* bottom_data = bottom[0]->cpu_data(); @@ -56,9 +55,7 @@ Dtype AccuracyLayer::Forward_cpu(const vector*>& bottom, // LOG(INFO) << "Accuracy: " << accuracy; (*top)[0]->mutable_cpu_data()[0] = accuracy / num; - // Accuracy layer should not be used as a loss function. - return Dtype(0); } INSTANTIATE_CLASS(AccuracyLayer); diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index b2ef91eab67..4b67f24cb9a 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -9,9 +9,8 @@ namespace caffe { template -void ArgMaxLayer::SetUp(const vector*>& bottom, +void ArgMaxLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); out_max_val_ = this->layer_param_.argmax_param().out_max_val(); top_k_ = this->layer_param_.argmax_param().top_k(); CHECK_GE(top_k_, 1) << " top k must not be less than 1."; @@ -27,7 +26,7 @@ void ArgMaxLayer::SetUp(const vector*>& bottom, } template -Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, +void ArgMaxLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -51,7 +50,6 @@ Dtype ArgMaxLayer::Forward_cpu(const vector*>& bottom, } } } - return Dtype(0); } INSTANTIATE_CLASS(ArgMaxLayer); diff --git a/src/caffe/layers/bnll_layer.cpp b/src/caffe/layers/bnll_layer.cpp index 4cb852031af..ef98326a23e 100644 --- a/src/caffe/layers/bnll_layer.cpp +++ b/src/caffe/layers/bnll_layer.cpp @@ -9,7 +9,7 @@ namespace caffe { const float kBNLL_THRESHOLD = 50.; template -Dtype BNLLLayer::Forward_cpu(const vector*>& bottom, +void BNLLLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -19,7 +19,6 @@ Dtype BNLLLayer::Forward_cpu(const vector*>& bottom, bottom_data[i] + log(1. + exp(-bottom_data[i])) : log(1. + exp(bottom_data[i])); } - return Dtype(0); } template diff --git a/src/caffe/layers/bnll_layer.cu b/src/caffe/layers/bnll_layer.cu index 9895a06107a..b940133b4b3 100644 --- a/src/caffe/layers/bnll_layer.cu +++ b/src/caffe/layers/bnll_layer.cu @@ -18,7 +18,7 @@ __global__ void BNLLForward(const int n, const Dtype* in, Dtype* out) { } template -Dtype BNLLLayer::Forward_gpu(const vector*>& bottom, +void BNLLLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -27,7 +27,6 @@ Dtype BNLLLayer::Forward_gpu(const vector*>& bottom, BNLLForward<<>>( count, bottom_data, top_data); CUDA_POST_KERNEL_CHECK; - return Dtype(0); } template diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index b76d4b2ca14..73d28b17850 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -7,9 +7,8 @@ namespace caffe { template -void ConcatLayer::SetUp(const vector*>& bottom, +void ConcatLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); concat_dim_ = this->layer_param_.concat_param().concat_dim(); CHECK_GE(concat_dim_, 0) << "concat_dim should be >= 0"; @@ -39,7 +38,7 @@ void ConcatLayer::SetUp(const vector*>& bottom, } template -Dtype ConcatLayer::Forward_cpu(const vector*>& bottom, +void ConcatLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { Dtype* top_data = (*top)[0]->mutable_cpu_data(); if (concat_dim_== 0) { @@ -61,9 +60,8 @@ Dtype ConcatLayer::Forward_cpu(const vector*>& bottom, top_data+(*top)[0]->offset(n, offset_channel)); } offset_channel += bottom[i]->channels(); - } // concat_dim_ is guaranteed to be 0 or 1 by SetUp. + } // concat_dim_ is guaranteed to be 0 or 1 by LayerSetUp. } - return Dtype(0.); } template @@ -95,7 +93,7 @@ void ConcatLayer::Backward_cpu(const vector*>& top, } offset_channel += blob->channels(); } - } // concat_dim_ is guaranteed to be 0 or 1 by SetUp. + } // concat_dim_ is guaranteed to be 0 or 1 by LayerSetUp. } #ifdef CPU_ONLY diff --git a/src/caffe/layers/concat_layer.cu b/src/caffe/layers/concat_layer.cu index aea8b77e37f..99c55da25cb 100644 --- a/src/caffe/layers/concat_layer.cu +++ b/src/caffe/layers/concat_layer.cu @@ -7,7 +7,7 @@ namespace caffe { template -Dtype ConcatLayer::Forward_gpu(const vector*>& bottom, +void ConcatLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { Dtype* top_data = (*top)[0]->mutable_gpu_data(); if (concat_dim_ == 0) { @@ -34,7 +34,6 @@ Dtype ConcatLayer::Forward_gpu(const vector*>& bottom, LOG(FATAL) << "concat_dim along dim" << concat_dim_ << " not implemented yet"; } - return Dtype(0.); } template diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index df3e31ba84a..1a1248f3dda 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -9,9 +9,8 @@ namespace caffe { template -void ConvolutionLayer::SetUp(const vector*>& bottom, +void ConvolutionLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); ConvolutionParameter conv_param = this->layer_param_.convolution_param(); CHECK(!conv_param.has_kernel_size() != !(conv_param.has_kernel_h() && conv_param.has_kernel_w())) @@ -117,7 +116,7 @@ void ConvolutionLayer::SetUp(const vector*>& bottom, template -Dtype ConvolutionLayer::Forward_cpu(const vector*>& bottom, +void ConvolutionLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->cpu_data(); @@ -147,7 +146,6 @@ Dtype ConvolutionLayer::Forward_cpu(const vector*>& bottom, } } } - return Dtype(0.); } template diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 04ae13932d9..f7f393badba 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -9,7 +9,7 @@ namespace caffe { template -Dtype ConvolutionLayer::Forward_gpu(const vector*>& bottom, +void ConvolutionLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); @@ -39,7 +39,6 @@ Dtype ConvolutionLayer::Forward_gpu(const vector*>& bottom, } } } - return Dtype(0.); } template diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 8f17c45e5f6..c2b0c73a53b 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -160,9 +160,8 @@ DataLayer::~DataLayer() { } template -void DataLayer::SetUp(const vector*>& bottom, +void DataLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); if (top->size() == 1) { output_labels_ = false; } else { @@ -332,7 +331,7 @@ unsigned int DataLayer::PrefetchRand() { } template -Dtype DataLayer::Forward_cpu(const vector*>& bottom, +void DataLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { // First, join the thread JoinPrefetchThread(); @@ -345,7 +344,6 @@ Dtype DataLayer::Forward_cpu(const vector*>& bottom, } // Start a new prefetch thread CreatePrefetchThread(); - return Dtype(0.); } #ifdef CPU_ONLY diff --git a/src/caffe/layers/data_layer.cu b/src/caffe/layers/data_layer.cu index 2ae1a640319..467b146fa1f 100644 --- a/src/caffe/layers/data_layer.cu +++ b/src/caffe/layers/data_layer.cu @@ -12,7 +12,7 @@ namespace caffe { template -Dtype DataLayer::Forward_gpu(const vector*>& bottom, +void DataLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { // First, join the thread JoinPrefetchThread(); @@ -25,7 +25,6 @@ Dtype DataLayer::Forward_gpu(const vector*>& bottom, } // Start a new prefetch thread CreatePrefetchThread(); - return Dtype(0.); } INSTANTIATE_CLASS(DataLayer); diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index 0621b56ec6e..52537d1aba9 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -11,9 +11,9 @@ namespace caffe { template -void DropoutLayer::SetUp(const vector*>& bottom, +void DropoutLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - NeuronLayer::SetUp(bottom, top); + NeuronLayer::LayerSetUp(bottom, top); // Set up the cache for random number generation rand_vec_.Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); @@ -25,7 +25,7 @@ void DropoutLayer::SetUp(const vector*>& bottom, } template -Dtype DropoutLayer::Forward_cpu(const vector*>& bottom, +void DropoutLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -40,7 +40,6 @@ Dtype DropoutLayer::Forward_cpu(const vector*>& bottom, } else { caffe_copy(bottom[0]->count(), bottom_data, top_data); } - return Dtype(0); } template diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 9bcd687bb5d..9756c862183 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -21,7 +21,7 @@ __global__ void DropoutForward(const int n, const Dtype* in, } template -Dtype DropoutLayer::Forward_gpu(const vector*>& bottom, +void DropoutLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -38,7 +38,6 @@ Dtype DropoutLayer::Forward_gpu(const vector*>& bottom, } else { caffe_copy(count, bottom_data, top_data); } - return Dtype(0); } template diff --git a/src/caffe/layers/dummy_data_layer.cpp b/src/caffe/layers/dummy_data_layer.cpp index 98b437eea98..883f2528ef8 100644 --- a/src/caffe/layers/dummy_data_layer.cpp +++ b/src/caffe/layers/dummy_data_layer.cpp @@ -7,7 +7,7 @@ namespace caffe { template -void DummyDataLayer::SetUp(const vector*>& bottom, +void DummyDataLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { const int num_top = top->size(); const DummyDataParameter& param = this->layer_param_.dummy_data_param(); @@ -32,7 +32,7 @@ void DummyDataLayer::SetUp(const vector*>& bottom, // If refill_[i] is false, Forward does nothing for Blob i. We use this to // avoid wastefully refilling "constant" Blobs in every forward pass. // We first fill refill_ in with the INVERSE of its final values. - // The first time we run Forward from the SetUp method, we'll fill only the + // The first time we run Forward from the LayerSetUp method, we'll fill only // Blobs for which refill_ is normally false. These Blobs will never be // filled again. refill_.clear(); @@ -82,7 +82,7 @@ void DummyDataLayer::SetUp(const vector*>& bottom, } template -Dtype DummyDataLayer::Forward_cpu(const vector*>& bottom, +void DummyDataLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { for (int i = 0; i < top->size(); ++i) { const int filler_id = (fillers_.size() > 1) ? i : 0; @@ -90,7 +90,6 @@ Dtype DummyDataLayer::Forward_cpu(const vector*>& bottom, fillers_[filler_id]->Fill((*top)[i]); } } - return Dtype(0.); } INSTANTIATE_CLASS(DummyDataLayer); diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 8085b4644cc..ec6a46ff8f5 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -7,9 +7,8 @@ namespace caffe { template -void EltwiseLayer::SetUp(const vector*>& bottom, +void EltwiseLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); CHECK(this->layer_param().eltwise_param().coeff_size() == 0 || this->layer_param().eltwise_param().coeff_size() == bottom.size()) << "Eltwise Layer takes one coefficient per bottom blob."; @@ -39,7 +38,7 @@ void EltwiseLayer::SetUp(const vector*>& bottom, } template -Dtype EltwiseLayer::Forward_cpu( +void EltwiseLayer::Forward_cpu( const vector*>& bottom, vector*>* top) { const int count = (*top)[0]->count(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -60,7 +59,6 @@ Dtype EltwiseLayer::Forward_cpu( default: LOG(FATAL) << "Unknown elementwise operation."; } - return Dtype(0.); } template diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index eec8857c577..4b38949da09 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -7,7 +7,7 @@ namespace caffe { template -Dtype EltwiseLayer::Forward_gpu( +void EltwiseLayer::Forward_gpu( const vector*>& bottom, vector*>* top) { const int count = (*top)[0]->count(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -29,7 +29,6 @@ Dtype EltwiseLayer::Forward_gpu( default: LOG(FATAL) << "Unknown elementwise operation."; } - return Dtype(0.); } template diff --git a/src/caffe/layers/euclidean_loss_layer.cpp b/src/caffe/layers/euclidean_loss_layer.cpp index 17180d40b69..be83601f5a1 100644 --- a/src/caffe/layers/euclidean_loss_layer.cpp +++ b/src/caffe/layers/euclidean_loss_layer.cpp @@ -8,8 +8,9 @@ namespace caffe { template -void EuclideanLossLayer::FurtherSetUp( +void EuclideanLossLayer::LayerSetUp( const vector*>& bottom, vector*>* top) { + LossLayer::LayerSetUp(bottom, top); CHECK_EQ(bottom[0]->channels(), bottom[1]->channels()); CHECK_EQ(bottom[0]->height(), bottom[1]->height()); CHECK_EQ(bottom[0]->width(), bottom[1]->width()); @@ -18,7 +19,7 @@ void EuclideanLossLayer::FurtherSetUp( } template -Dtype EuclideanLossLayer::Forward_cpu(const vector*>& bottom, +void EuclideanLossLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { int count = bottom[0]->count(); caffe_sub( @@ -28,10 +29,7 @@ Dtype EuclideanLossLayer::Forward_cpu(const vector*>& bottom, diff_.mutable_cpu_data()); Dtype dot = caffe_cpu_dot(count, diff_.cpu_data(), diff_.cpu_data()); Dtype loss = dot / bottom[0]->num() / Dtype(2); - if (top->size() == 1) { - (*top)[0]->mutable_cpu_data()[0] = loss; - } - return loss; + (*top)[0]->mutable_cpu_data()[0] = loss; } template @@ -40,9 +38,10 @@ void EuclideanLossLayer::Backward_cpu(const vector*>& top, for (int i = 0; i < 2; ++i) { if (propagate_down[i]) { const Dtype sign = (i == 0) ? 1 : -1; + const Dtype alpha = sign * top[0]->cpu_diff()[0] / (*bottom)[i]->num(); caffe_cpu_axpby( (*bottom)[i]->count(), // count - sign / (*bottom)[i]->num(), // alpha + alpha, // alpha diff_.cpu_data(), // a Dtype(0), // beta (*bottom)[i]->mutable_cpu_diff()); // b diff --git a/src/caffe/layers/euclidean_loss_layer.cu b/src/caffe/layers/euclidean_loss_layer.cu index f4dfd0b5883..70b1b9ee9ea 100644 --- a/src/caffe/layers/euclidean_loss_layer.cu +++ b/src/caffe/layers/euclidean_loss_layer.cu @@ -8,7 +8,7 @@ namespace caffe { template -Dtype EuclideanLossLayer::Forward_gpu(const vector*>& bottom, +void EuclideanLossLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { int count = bottom[0]->count(); caffe_gpu_sub( @@ -19,10 +19,7 @@ Dtype EuclideanLossLayer::Forward_gpu(const vector*>& bottom, Dtype dot; caffe_gpu_dot(count, diff_.gpu_data(), diff_.gpu_data(), &dot); Dtype loss = dot / bottom[0]->num() / Dtype(2); - if (top->size() == 1) { - (*top)[0]->mutable_cpu_data()[0] = loss; - } - return loss; + (*top)[0]->mutable_cpu_data()[0] = loss; } template @@ -31,9 +28,10 @@ void EuclideanLossLayer::Backward_gpu(const vector*>& top, for (int i = 0; i < 2; ++i) { if (propagate_down[i]) { const Dtype sign = (i == 0) ? 1 : -1; + const Dtype alpha = sign * top[0]->cpu_diff()[0] / (*bottom)[i]->num(); caffe_gpu_axpby( (*bottom)[i]->count(), // count - sign / (*bottom)[i]->num(), // alpha + alpha, // alpha diff_.gpu_data(), // a Dtype(0), // beta (*bottom)[i]->mutable_gpu_diff()); // b diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index 81a506a8177..8c1fc74e159 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -7,9 +7,8 @@ namespace caffe { template -void FlattenLayer::SetUp(const vector*>& bottom, +void FlattenLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); int channels_out = bottom[0]->channels() * bottom[0]->height() * bottom[0]->width(); (*top)[0]->Reshape(bottom[0]->num(), channels_out, 1, 1); @@ -19,10 +18,9 @@ void FlattenLayer::SetUp(const vector*>& bottom, } template -Dtype FlattenLayer::Forward_cpu(const vector*>& bottom, +void FlattenLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { (*top)[0]->ShareData(*bottom[0]); - return Dtype(0.); } template diff --git a/src/caffe/layers/flatten_layer.cu b/src/caffe/layers/flatten_layer.cu index 7233afb3718..ff23f523fee 100644 --- a/src/caffe/layers/flatten_layer.cu +++ b/src/caffe/layers/flatten_layer.cu @@ -7,10 +7,9 @@ namespace caffe { template -Dtype FlattenLayer::Forward_gpu(const vector*>& bottom, +void FlattenLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { (*top)[0]->ShareData(*bottom[0]); - return Dtype(0.); } template diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 938d8435f08..1f2a83582f2 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -50,9 +50,8 @@ void HDF5DataLayer::LoadHDF5FileData(const char* filename) { } template -void HDF5DataLayer::SetUp(const vector*>& bottom, +void HDF5DataLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); // Read the source to parse the filenames. const string& source = this->layer_param_.hdf5_data_param().source(); LOG(INFO) << "Loading filename from " << source; @@ -85,7 +84,7 @@ void HDF5DataLayer::SetUp(const vector*>& bottom, } template -Dtype HDF5DataLayer::Forward_cpu(const vector*>& bottom, +void HDF5DataLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const int batch_size = this->layer_param_.hdf5_data_param().batch_size(); const int data_count = (*top)[0]->count() / (*top)[0]->num(); @@ -109,7 +108,6 @@ Dtype HDF5DataLayer::Forward_cpu(const vector*>& bottom, &label_blob_.cpu_data()[current_row_ * label_data_count], &(*top)[1]->mutable_cpu_data()[i * label_data_count]); } - return Dtype(0.); } #ifdef CPU_ONLY diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu index 1f682d5726d..79cc536eb28 100644 --- a/src/caffe/layers/hdf5_data_layer.cu +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -17,7 +17,7 @@ TODO: namespace caffe { template -Dtype HDF5DataLayer::Forward_gpu(const vector*>& bottom, +void HDF5DataLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const int batch_size = this->layer_param_.hdf5_data_param().batch_size(); const int data_count = (*top)[0]->count() / (*top)[0]->num(); @@ -44,7 +44,6 @@ Dtype HDF5DataLayer::Forward_gpu(const vector*>& bottom, &label_blob_.cpu_data()[current_row_ * label_data_count], &(*top)[1]->mutable_gpu_data()[i * label_data_count]); } - return Dtype(0.); } INSTANTIATE_CLASS(HDF5DataLayer); diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index 0d7590b1b12..3cdbbb31a6a 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -39,7 +39,7 @@ void HDF5OutputLayer::SaveBlobs() { } template -Dtype HDF5OutputLayer::Forward_cpu(const vector*>& bottom, +void HDF5OutputLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { CHECK_GE(bottom.size(), 2); CHECK_EQ(bottom[0]->num(), bottom[1]->num()); @@ -57,7 +57,6 @@ Dtype HDF5OutputLayer::Forward_cpu(const vector*>& bottom, &label_blob_.mutable_cpu_data()[i * label_datum_dim]); } SaveBlobs(); - return Dtype(0.); } template diff --git a/src/caffe/layers/hdf5_output_layer.cu b/src/caffe/layers/hdf5_output_layer.cu index d2f20b3fc79..0813c02a440 100644 --- a/src/caffe/layers/hdf5_output_layer.cu +++ b/src/caffe/layers/hdf5_output_layer.cu @@ -12,7 +12,7 @@ namespace caffe { template -Dtype HDF5OutputLayer::Forward_gpu(const vector*>& bottom, +void HDF5OutputLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { CHECK_GE(bottom.size(), 2); CHECK_EQ(bottom[0]->num(), bottom[1]->num()); @@ -30,7 +30,6 @@ Dtype HDF5OutputLayer::Forward_gpu(const vector*>& bottom, &label_blob_.mutable_cpu_data()[i * label_datum_dim]); } SaveBlobs(); - return Dtype(0.); } template diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index bc3a593c769..8022aae279c 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -11,7 +11,7 @@ namespace caffe { template -Dtype HingeLossLayer::Forward_cpu(const vector*>& bottom, +void HingeLossLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); @@ -30,11 +30,14 @@ Dtype HingeLossLayer::Forward_cpu(const vector*>& bottom, Dtype(0), 1 + bottom_diff[i * dim + j]); } } + Dtype* loss = (*top)[0]->mutable_cpu_data(); switch (this->layer_param_.hinge_loss_param().norm()) { case HingeLossParameter_Norm_L1: - return caffe_cpu_asum(count, bottom_diff) / num; + loss[0] = caffe_cpu_asum(count, bottom_diff) / num; + break; case HingeLossParameter_Norm_L2: - return caffe_cpu_dot(count, bottom_diff, bottom_diff) / num; + loss[0] = caffe_cpu_dot(count, bottom_diff, bottom_diff) / num; + break; default: LOG(FATAL) << "Unknown Norm"; } @@ -58,13 +61,14 @@ void HingeLossLayer::Backward_cpu(const vector*>& top, bottom_diff[i * dim + static_cast(label[i])] *= -1; } + const Dtype loss_weight = top[0]->cpu_diff()[0]; switch (this->layer_param_.hinge_loss_param().norm()) { case HingeLossParameter_Norm_L1: caffe_cpu_sign(count, bottom_diff, bottom_diff); - caffe_scal(count, Dtype(1. / num), bottom_diff); + caffe_scal(count, loss_weight / num, bottom_diff); break; case HingeLossParameter_Norm_L2: - caffe_scal(count, Dtype(2. / num), bottom_diff); + caffe_scal(count, loss_weight * 2 / num, bottom_diff); break; default: LOG(FATAL) << "Unknown Norm"; diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index 2dd7476237a..02f33f1cff4 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -8,9 +8,8 @@ namespace caffe { template -void Im2colLayer::SetUp(const vector*>& bottom, +void Im2colLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); ConvolutionParameter conv_param = this->layer_param_.convolution_param(); CHECK(!conv_param.has_kernel_size() != !(conv_param.has_kernel_h() && conv_param.has_kernel_w())) @@ -56,7 +55,7 @@ void Im2colLayer::SetUp(const vector*>& bottom, } template -Dtype Im2colLayer::Forward_cpu(const vector*>& bottom, +void Im2colLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -65,7 +64,6 @@ Dtype Im2colLayer::Forward_cpu(const vector*>& bottom, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, top_data + (*top)[0]->offset(n)); } - return Dtype(0.); } template diff --git a/src/caffe/layers/im2col_layer.cu b/src/caffe/layers/im2col_layer.cu index 6b4c701073e..8df061d88e1 100644 --- a/src/caffe/layers/im2col_layer.cu +++ b/src/caffe/layers/im2col_layer.cu @@ -8,7 +8,7 @@ namespace caffe { template -Dtype Im2colLayer::Forward_gpu(const vector*>& bottom, +void Im2colLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -17,7 +17,6 @@ Dtype Im2colLayer::Forward_gpu(const vector*>& bottom, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, top_data + (*top)[0]->offset(n)); } - return Dtype(0.); } template diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index a0f03a8266d..c72bf9c036f 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -123,10 +123,9 @@ ImageDataLayer::~ImageDataLayer() { } template -void ImageDataLayer::SetUp(const vector*>& bottom, +void ImageDataLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); - const int new_height = this->layer_param_.image_data_param().new_height(); + const int new_height = this->layer_param_.image_data_param().new_height(); const int new_width = this->layer_param_.image_data_param().new_width(); CHECK((new_height == 0 && new_width == 0) || (new_height > 0 && new_width > 0)) << "Current implementation requires " @@ -252,7 +251,7 @@ unsigned int ImageDataLayer::PrefetchRand() { } template -Dtype ImageDataLayer::Forward_cpu(const vector*>& bottom, +void ImageDataLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { // First, join the thread JoinPrefetchThread(); @@ -263,7 +262,6 @@ Dtype ImageDataLayer::Forward_cpu(const vector*>& bottom, (*top)[1]->mutable_cpu_data()); // Start a new prefetch thread CreatePrefetchThread(); - return Dtype(0.); } #ifdef CPU_ONLY diff --git a/src/caffe/layers/image_data_layer.cu b/src/caffe/layers/image_data_layer.cu index f61409cc38a..30a22100dc3 100644 --- a/src/caffe/layers/image_data_layer.cu +++ b/src/caffe/layers/image_data_layer.cu @@ -9,7 +9,7 @@ namespace caffe { template -Dtype ImageDataLayer::Forward_gpu(const vector*>& bottom, +void ImageDataLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { // First, join the thread JoinPrefetchThread(); @@ -20,7 +20,6 @@ Dtype ImageDataLayer::Forward_gpu(const vector*>& bottom, (*top)[1]->mutable_gpu_data()); // Start a new prefetch thread CreatePrefetchThread(); - return Dtype(0.); } INSTANTIATE_CLASS(ImageDataLayer); diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index fa01116ee36..91dd89240e4 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -11,8 +11,9 @@ namespace caffe { template -void InfogainLossLayer::FurtherSetUp( +void InfogainLossLayer::LayerSetUp( const vector*>& bottom, vector*>* top) { + LossLayer::LayerSetUp(bottom, top); CHECK_EQ(bottom[1]->channels(), 1); CHECK_EQ(bottom[1]->height(), 1); CHECK_EQ(bottom[1]->width(), 1); @@ -38,7 +39,7 @@ void InfogainLossLayer::FurtherSetUp( template -Dtype InfogainLossLayer::Forward_cpu(const vector*>& bottom, +void InfogainLossLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); const Dtype* bottom_label = bottom[1]->cpu_data(); @@ -58,11 +59,7 @@ Dtype InfogainLossLayer::Forward_cpu(const vector*>& bottom, loss -= infogain_mat[label * dim + j] * log(prob); } } - loss /= num; - if (top->size() == 1) { - (*top)[0]->mutable_cpu_data()[0] = loss; - } - return loss; + (*top)[0]->mutable_cpu_data()[0] = loss / num; } template @@ -89,11 +86,12 @@ void InfogainLossLayer::Backward_cpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); int num = (*bottom)[0]->num(); int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); + const Dtype scale = - top[0]->cpu_diff()[0] / num; for (int i = 0; i < num; ++i) { - int label = static_cast(bottom_label[i]); + const int label = static_cast(bottom_label[i]); for (int j = 0; j < dim; ++j) { Dtype prob = std::max(bottom_data[i * dim + j], Dtype(kLOG_THRESHOLD)); - bottom_diff[i * dim + j] = - infogain_mat[label * dim + j] / prob / num; + bottom_diff[i * dim + j] = scale * infogain_mat[label * dim + j] / prob; } } } diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index a9e0f353e9e..3ba0e1f29f6 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -10,9 +10,8 @@ namespace caffe { template -void InnerProductLayer::SetUp(const vector*>& bottom, +void InnerProductLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); const int num_output = this->layer_param_.inner_product_param().num_output(); bias_term_ = this->layer_param_.inner_product_param().bias_term(); // Figure out the dimensions @@ -52,7 +51,7 @@ void InnerProductLayer::SetUp(const vector*>& bottom, } template -Dtype InnerProductLayer::Forward_cpu(const vector*>& bottom, +void InnerProductLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -64,7 +63,6 @@ Dtype InnerProductLayer::Forward_cpu(const vector*>& bottom, bias_multiplier_.cpu_data(), this->blobs_[1]->cpu_data(), (Dtype)1., top_data); } - return Dtype(0); } template diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu index e02107200cf..3a0d4388352 100644 --- a/src/caffe/layers/inner_product_layer.cu +++ b/src/caffe/layers/inner_product_layer.cu @@ -10,7 +10,7 @@ namespace caffe { template -Dtype InnerProductLayer::Forward_gpu(const vector*>& bottom, +void InnerProductLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -22,7 +22,6 @@ Dtype InnerProductLayer::Forward_gpu(const vector*>& bottom, bias_multiplier_.gpu_data(), this->blobs_[1]->gpu_data(), (Dtype)1., top_data); } - return Dtype(0); } template diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index 48665221f1d..89d8c91e342 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -11,16 +11,15 @@ namespace caffe { template -void LossLayer::SetUp( +void LossLayer::LayerSetUp( const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; - if (top->size() == 1) { - // Layers should copy the loss in the top blob - (*top)[0]->Reshape(1, 1, 1, 1); + (*top)[0]->Reshape(1, 1, 1, 1); + // LossLayers have a non-zero (1) loss by default. + if (this->layer_param_.loss_weight_size() == 0) { + this->layer_param_.add_loss_weight(Dtype(1)); } - FurtherSetUp(bottom, top); } INSTANTIATE_CLASS(LossLayer); diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index e77f6857c85..c76ca95dfcd 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -7,9 +7,8 @@ namespace caffe { template -void LRNLayer::SetUp(const vector*>& bottom, +void LRNLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); @@ -96,21 +95,22 @@ void LRNLayer::SetUp(const vector*>& bottom, } template -Dtype LRNLayer::Forward_cpu(const vector*>& bottom, +void LRNLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { switch (this->layer_param_.lrn_param().norm_region()) { case LRNParameter_NormRegion_ACROSS_CHANNELS: - return CrossChannelForward_cpu(bottom, top); + CrossChannelForward_cpu(bottom, top); + break; case LRNParameter_NormRegion_WITHIN_CHANNEL: - return WithinChannelForward(bottom, top); + WithinChannelForward(bottom, top); + break; default: LOG(FATAL) << "Unknown normalization region."; - return Dtype(0); } } template -Dtype LRNLayer::CrossChannelForward_cpu( +void LRNLayer::CrossChannelForward_cpu( const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -154,19 +154,16 @@ Dtype LRNLayer::CrossChannelForward_cpu( // In the end, compute output caffe_powx(scale_.count(), scale_data, -beta_, top_data); caffe_mul(scale_.count(), top_data, bottom_data, top_data); - - return Dtype(0.); } template -Dtype LRNLayer::WithinChannelForward( +void LRNLayer::WithinChannelForward( const vector*>& bottom, vector*>* top) { split_layer_->Forward(bottom, &split_top_vec_); square_layer_->Forward(square_bottom_vec_, &square_top_vec_); pool_layer_->Forward(square_top_vec_, &pool_top_vec_); power_layer_->Forward(pool_top_vec_, &power_top_vec_); product_layer_->Forward(product_bottom_vec_, top); - return Dtype(0.); } template diff --git a/src/caffe/layers/lrn_layer.cu b/src/caffe/layers/lrn_layer.cu index eee12e66cec..d6cb23bf245 100644 --- a/src/caffe/layers/lrn_layer.cu +++ b/src/caffe/layers/lrn_layer.cu @@ -54,16 +54,17 @@ __global__ void LRNFillScale(const int nthreads, const Dtype* in, template -Dtype LRNLayer::Forward_gpu(const vector*>& bottom, +void LRNLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { switch (this->layer_param_.lrn_param().norm_region()) { case LRNParameter_NormRegion_ACROSS_CHANNELS: - return CrossChannelForward_gpu(bottom, top); + CrossChannelForward_gpu(bottom, top); + break; case LRNParameter_NormRegion_WITHIN_CHANNEL: - return WithinChannelForward(bottom, top); + WithinChannelForward(bottom, top); + break; default: LOG(FATAL) << "Unknown normalization region."; - return Dtype(0); } } @@ -77,7 +78,7 @@ __global__ void LRNComputeOutput(const int nthreads, const Dtype* in, } template -Dtype LRNLayer::CrossChannelForward_gpu( +void LRNLayer::CrossChannelForward_gpu( const vector*>& bottom, vector*>* top) { // First, compute scale const Dtype* bottom_data = bottom[0]->gpu_data(); @@ -96,7 +97,6 @@ Dtype LRNLayer::CrossChannelForward_gpu( LRNComputeOutput<<>>( n_threads, bottom_data, scale_data, -beta_, top_data); CUDA_POST_KERNEL_CHECK; - return Dtype(0.); } diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index d1717fd4258..fda92976c49 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -6,9 +6,8 @@ namespace caffe { template -void MemoryDataLayer::SetUp(const vector*>& bottom, +void MemoryDataLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); batch_size_ = this->layer_param_.memory_data_param().batch_size(); datum_channels_ = this->layer_param_.memory_data_param().channels(); datum_height_ = this->layer_param_.memory_data_param().height(); @@ -34,13 +33,12 @@ void MemoryDataLayer::Reset(Dtype* data, Dtype* labels, int n) { } template -Dtype MemoryDataLayer::Forward_cpu(const vector*>& bottom, +void MemoryDataLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { CHECK(data_) << "MemoryDataLayer needs to be initalized by calling Reset"; (*top)[0]->set_cpu_data(data_ + pos_ * datum_size_); (*top)[1]->set_cpu_data(labels_ + pos_); pos_ = (pos_ + batch_size_) % n_; - return Dtype(0.); } INSTANTIATE_CLASS(MemoryDataLayer); diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index a9c7de6595d..cf96bfe73ed 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -11,15 +11,16 @@ namespace caffe { template -void MultinomialLogisticLossLayer::FurtherSetUp( +void MultinomialLogisticLossLayer::LayerSetUp( const vector*>& bottom, vector*>* top) { + LossLayer::LayerSetUp(bottom, top); CHECK_EQ(bottom[1]->channels(), 1); CHECK_EQ(bottom[1]->height(), 1); CHECK_EQ(bottom[1]->width(), 1); } template -Dtype MultinomialLogisticLossLayer::Forward_cpu( +void MultinomialLogisticLossLayer::Forward_cpu( const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); const Dtype* bottom_label = bottom[1]->cpu_data(); @@ -32,10 +33,7 @@ Dtype MultinomialLogisticLossLayer::Forward_cpu( bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); loss -= log(prob); } - if (top->size() == 1) { - (*top)[0]->mutable_cpu_data()[0] = loss / num; - } - return loss / num; + (*top)[0]->mutable_cpu_data()[0] = loss / num; } template @@ -53,11 +51,12 @@ void MultinomialLogisticLossLayer::Backward_cpu( int num = (*bottom)[0]->num(); int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); + const Dtype scale = - top[0]->cpu_diff()[0] / num; for (int i = 0; i < num; ++i) { int label = static_cast(bottom_label[i]); Dtype prob = std::max( bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); - bottom_diff[i * dim + label] = -1. / prob / num; + bottom_diff[i * dim + label] = scale / prob; } } } diff --git a/src/caffe/layers/mvn_layer.cpp b/src/caffe/layers/mvn_layer.cpp index 30235b3f467..4d90702fd55 100644 --- a/src/caffe/layers/mvn_layer.cpp +++ b/src/caffe/layers/mvn_layer.cpp @@ -8,9 +8,8 @@ namespace caffe { template -void MVNLayer::SetUp(const vector*>& bottom, +void MVNLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); mean_.Reshape(bottom[0]->num(), bottom[0]->channels(), @@ -26,7 +25,7 @@ void MVNLayer::SetUp(const vector*>& bottom, } template -Dtype MVNLayer::Forward_cpu(const vector*>& bottom, +void MVNLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -85,8 +84,6 @@ Dtype MVNLayer::Forward_cpu(const vector*>& bottom, caffe_add(temp_.count(), bottom_data, temp_.cpu_data(), top_data); } - - return Dtype(0); } template diff --git a/src/caffe/layers/mvn_layer.cu b/src/caffe/layers/mvn_layer.cu index dd823984dd2..2c02dfe1ddc 100644 --- a/src/caffe/layers/mvn_layer.cu +++ b/src/caffe/layers/mvn_layer.cu @@ -8,7 +8,7 @@ namespace caffe { template -Dtype MVNLayer::Forward_gpu(const vector*>& bottom, +void MVNLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -68,8 +68,6 @@ Dtype MVNLayer::Forward_gpu(const vector*>& bottom, caffe_gpu_add(temp_.count(), bottom_data, temp_.gpu_data(), top_data); } - - return Dtype(0); } template diff --git a/src/caffe/layers/neuron_layer.cpp b/src/caffe/layers/neuron_layer.cpp index 3343b26cfc5..eff7948a616 100644 --- a/src/caffe/layers/neuron_layer.cpp +++ b/src/caffe/layers/neuron_layer.cpp @@ -6,14 +6,12 @@ namespace caffe { template -void NeuronLayer::SetUp(const vector*>& bottom, +void NeuronLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); // NeuronLayer allows in-place computations. If the computation is not // in-place, we will need to initialize the top blob. if ((*top)[0] != bottom[0]) { - (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), - bottom[0]->height(), bottom[0]->width()); + (*top)[0]->ReshapeLike(*bottom[0]); } } diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 30657b6c804..9e77fa28a45 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -14,18 +14,8 @@ using std::min; using std::max; template -void PoolingLayer::SetUp(const vector*>& bottom, +void PoolingLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - // Set the max number of top blobs before calling base Layer::SetUp. - // If doing MAX pooling, we can optionally output an extra top Blob - // for the mask. Otherwise, we only have one top Blob. - if (this->layer_param_.pooling_param().pool() == - PoolingParameter_PoolMethod_MAX) { - max_top_blobs_ = 2; - } else { - max_top_blobs_ = 1; - } - Layer::SetUp(bottom, top); PoolingParameter pool_param = this->layer_param_.pooling_param(); CHECK(!pool_param.has_kernel_size() != !(pool_param.has_kernel_h() && pool_param.has_kernel_w())) @@ -111,7 +101,7 @@ void PoolingLayer::SetUp(const vector*>& bottom, // TODO(Yangqing): Is there a faster way to do pooling in the channel-first // case? template -Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, +void PoolingLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -210,7 +200,6 @@ Dtype PoolingLayer::Forward_cpu(const vector*>& bottom, default: LOG(FATAL) << "Unknown pooling method."; } - return Dtype(0.); } template diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index 58f1997c38e..e64128b87f2 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -151,7 +151,7 @@ __global__ void StoPoolForwardTest(const int nthreads, template -Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, +void PoolingLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -206,7 +206,6 @@ Dtype PoolingLayer::Forward_gpu(const vector*>& bottom, LOG(FATAL) << "Unknown pooling method."; } CUDA_POST_KERNEL_CHECK; - return Dtype(0.); } diff --git a/src/caffe/layers/power_layer.cpp b/src/caffe/layers/power_layer.cpp index 8b5d8d16bd4..a332c4d272a 100644 --- a/src/caffe/layers/power_layer.cpp +++ b/src/caffe/layers/power_layer.cpp @@ -8,9 +8,9 @@ namespace caffe { template -void PowerLayer::SetUp(const vector*>& bottom, +void PowerLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - NeuronLayer::SetUp(bottom, top); + NeuronLayer::LayerSetUp(bottom, top); power_ = this->layer_param_.power_param().power(); scale_ = this->layer_param_.power_param().scale(); shift_ = this->layer_param_.power_param().shift(); @@ -19,7 +19,7 @@ void PowerLayer::SetUp(const vector*>& bottom, // Compute y = (shift + scale * x)^power template -Dtype PowerLayer::Forward_cpu(const vector*>& bottom, +void PowerLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { Dtype* top_data = (*top)[0]->mutable_cpu_data(); const int count = bottom[0]->count(); @@ -27,7 +27,6 @@ Dtype PowerLayer::Forward_cpu(const vector*>& bottom, if (diff_scale_ == Dtype(0)) { Dtype value = (power_ == 0) ? Dtype(1) : pow(shift_, power_); caffe_set(count, value, top_data); - return Dtype(0); } const Dtype* bottom_data = bottom[0]->cpu_data(); caffe_copy(count, bottom_data, top_data); @@ -40,7 +39,6 @@ Dtype PowerLayer::Forward_cpu(const vector*>& bottom, if (power_ != Dtype(1)) { caffe_powx(count, top_data, power_, top_data); } - return Dtype(0); } template diff --git a/src/caffe/layers/power_layer.cu b/src/caffe/layers/power_layer.cu index 0950b78b4ce..eaf63c1f48a 100644 --- a/src/caffe/layers/power_layer.cu +++ b/src/caffe/layers/power_layer.cu @@ -8,7 +8,7 @@ namespace caffe { template -Dtype PowerLayer::Forward_gpu(const vector*>& bottom, +void PowerLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { Dtype* top_data = (*top)[0]->mutable_gpu_data(); const int count = bottom[0]->count(); @@ -16,7 +16,6 @@ Dtype PowerLayer::Forward_gpu(const vector*>& bottom, if (diff_scale_ == Dtype(0)) { Dtype value = (power_ == 0) ? Dtype(1) : pow(shift_, power_); caffe_gpu_set(count, value, top_data); - return Dtype(0); } const Dtype* bottom_data = bottom[0]->gpu_data(); caffe_copy(count, bottom_data, top_data); @@ -29,7 +28,6 @@ Dtype PowerLayer::Forward_gpu(const vector*>& bottom, if (power_ != Dtype(1)) { caffe_gpu_powx(count, top_data, power_, top_data); } - return Dtype(0); } template diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index fca10a5aad3..b50352f8526 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -7,7 +7,7 @@ namespace caffe { template -Dtype ReLULayer::Forward_cpu(const vector*>& bottom, +void ReLULayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -17,7 +17,6 @@ Dtype ReLULayer::Forward_cpu(const vector*>& bottom, top_data[i] = std::max(bottom_data[i], Dtype(0)) + negative_slope * std::min(bottom_data[i], Dtype(0)); } - return Dtype(0); } template diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index a74428bfce1..def2bbcd7b9 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -15,7 +15,7 @@ __global__ void ReLUForward(const int n, const Dtype* in, Dtype* out, } template -Dtype ReLULayer::Forward_gpu(const vector*>& bottom, +void ReLULayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -30,7 +30,6 @@ Dtype ReLULayer::Forward_gpu(const vector*>& bottom, // << " top_data: " << (unsigned long)top_data // << " blocks: " << CAFFE_GET_BLOCKS(count) // << " threads: " << CAFFE_CUDA_NUM_THREADS; - return Dtype(0); } template diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index 24ab6a85c6a..6e440a820c4 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -9,8 +9,9 @@ namespace caffe { template -void SigmoidCrossEntropyLossLayer::FurtherSetUp( +void SigmoidCrossEntropyLossLayer::LayerSetUp( const vector*>& bottom, vector*>* top) { + LossLayer::LayerSetUp(bottom, top); CHECK_EQ(bottom[0]->count(), bottom[1]->count()) << "SIGMOID_CROSS_ENTROPY_LOSS layer inputs must have the same count."; sigmoid_bottom_vec_.clear(); @@ -21,7 +22,7 @@ void SigmoidCrossEntropyLossLayer::FurtherSetUp( } template -Dtype SigmoidCrossEntropyLossLayer::Forward_cpu( +void SigmoidCrossEntropyLossLayer::Forward_cpu( const vector*>& bottom, vector*>* top) { // The forward pass computes the sigmoid outputs. sigmoid_bottom_vec_[0] = bottom[0]; @@ -37,10 +38,7 @@ Dtype SigmoidCrossEntropyLossLayer::Forward_cpu( loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) - log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0))); } - if (top->size() == 1) { - (*top)[0]->mutable_cpu_data()[0] = loss / num; - } - return loss / num; + (*top)[0]->mutable_cpu_data()[0] = loss / num; } template @@ -60,7 +58,8 @@ void SigmoidCrossEntropyLossLayer::Backward_cpu( Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); caffe_sub(count, sigmoid_output_data, target, bottom_diff); // Scale down gradient - caffe_scal(count, Dtype(1) / num, bottom_diff); + const Dtype loss_weight = top[0]->cpu_diff()[0]; + caffe_scal(count, loss_weight / num, bottom_diff); } } diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu index 0e4dab76b79..8d0fdc6fac4 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu @@ -9,7 +9,7 @@ namespace caffe { template -Dtype SigmoidCrossEntropyLossLayer::Forward_gpu( +void SigmoidCrossEntropyLossLayer::Forward_gpu( const vector*>& bottom, vector*>* top) { // The forward pass computes the sigmoid outputs. sigmoid_bottom_vec_[0] = bottom[0]; @@ -25,10 +25,7 @@ Dtype SigmoidCrossEntropyLossLayer::Forward_gpu( loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) - log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0))); } - if (top->size() == 1) { - (*top)[0]->mutable_cpu_data()[0] = loss / num; - } - return loss / num; + (*top)[0]->mutable_cpu_data()[0] = loss / num; } template @@ -49,7 +46,8 @@ void SigmoidCrossEntropyLossLayer::Backward_gpu( caffe_copy(count, sigmoid_output_data, bottom_diff); caffe_gpu_axpy(count, Dtype(-1), target, bottom_diff); // Scale down gradient - caffe_gpu_scal(count, Dtype(1) / num, bottom_diff); + const Dtype loss_weight = top[0]->cpu_diff()[0]; + caffe_gpu_scal(count, loss_weight / num, bottom_diff); } } diff --git a/src/caffe/layers/sigmoid_layer.cpp b/src/caffe/layers/sigmoid_layer.cpp index 0f8b582da2f..d7bba7fbfc3 100644 --- a/src/caffe/layers/sigmoid_layer.cpp +++ b/src/caffe/layers/sigmoid_layer.cpp @@ -13,7 +13,7 @@ inline Dtype sigmoid(Dtype x) { } template -Dtype SigmoidLayer::Forward_cpu(const vector*>& bottom, +void SigmoidLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -21,7 +21,6 @@ Dtype SigmoidLayer::Forward_cpu(const vector*>& bottom, for (int i = 0; i < count; ++i) { top_data[i] = sigmoid(bottom_data[i]); } - return Dtype(0); } template diff --git a/src/caffe/layers/sigmoid_layer.cu b/src/caffe/layers/sigmoid_layer.cu index 039796e1b22..e1ebb1f6c41 100644 --- a/src/caffe/layers/sigmoid_layer.cu +++ b/src/caffe/layers/sigmoid_layer.cu @@ -15,7 +15,7 @@ __global__ void SigmoidForward(const int n, const Dtype* in, Dtype* out) { } template -Dtype SigmoidLayer::Forward_gpu(const vector*>& bottom, +void SigmoidLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -29,7 +29,6 @@ Dtype SigmoidLayer::Forward_gpu(const vector*>& bottom, // << " top_data: " << (unsigned long)top_data // << " blocks: " << CAFFE_GET_BLOCKS(count) // << " threads: " << CAFFE_CUDA_NUM_THREADS; - return Dtype(0); } template diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp index e182837c3aa..9fa127528a0 100644 --- a/src/caffe/layers/slice_layer.cpp +++ b/src/caffe/layers/slice_layer.cpp @@ -8,9 +8,8 @@ namespace caffe { template -void SliceLayer::SetUp(const vector*>& bottom, +void SliceLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); const SliceParameter& slice_param = this->layer_param_.slice_param(); slice_dim_ = slice_param.slice_dim(); CHECK_GE(slice_dim_, 0); @@ -73,7 +72,7 @@ void SliceLayer::SetUp(const vector*>& bottom, } template -Dtype SliceLayer::Forward_cpu(const vector*>& bottom, +void SliceLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->mutable_cpu_data(); if (slice_dim_ == 0) { @@ -98,7 +97,6 @@ Dtype SliceLayer::Forward_cpu(const vector*>& bottom, offset_channel += blob->channels(); } } // slice_dim_ is guaranteed to be 0 or 1 by SetUp. - return Dtype(0.); } template diff --git a/src/caffe/layers/slice_layer.cu b/src/caffe/layers/slice_layer.cu index 8e01131ec01..f64e5754890 100644 --- a/src/caffe/layers/slice_layer.cu +++ b/src/caffe/layers/slice_layer.cu @@ -7,7 +7,7 @@ namespace caffe { template -Dtype SliceLayer::Forward_gpu(const vector*>& bottom, +void SliceLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->mutable_gpu_data(); if (slice_dim_ == 0) { @@ -32,7 +32,6 @@ Dtype SliceLayer::Forward_gpu(const vector*>& bottom, offset_channel += blob->channels(); } } // slice_dim_ is guaranteed to be 0 or 1 by SetUp. - return Dtype(0.); } template diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 61990ed9d97..fa2ba17a151 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -9,9 +9,8 @@ namespace caffe { template -void SoftmaxLayer::SetUp(const vector*>& bottom, +void SoftmaxLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); sum_multiplier_.Reshape(1, bottom[0]->channels(), @@ -24,7 +23,7 @@ void SoftmaxLayer::SetUp(const vector*>& bottom, } template -Dtype SoftmaxLayer::Forward_cpu(const vector*>& bottom, +void SoftmaxLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -52,7 +51,6 @@ Dtype SoftmaxLayer::Forward_cpu(const vector*>& bottom, for (int i = 0; i < num; ++i) { caffe_scal(dim, Dtype(1.) / scale_data[i], top_data + i * dim); } - return Dtype(0); } template diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index 65b0e229d1a..6b853099a3f 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -39,7 +39,7 @@ __global__ void kernel_exp(const int num, const Dtype* data, Dtype* out) { } template -Dtype SoftmaxLayer::Forward_gpu(const vector*>& bottom, +void SoftmaxLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -68,7 +68,6 @@ Dtype SoftmaxLayer::Forward_gpu(const vector*>& bottom, kernel_softmax_div<<>>( num, dim, scale_data, top_data); - return Dtype(0); } // TODO(Yangqing): implement the GPU version of softmax. diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 98cf14c4a28..0fa83ccddac 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -9,26 +9,22 @@ namespace caffe { template -void SoftmaxWithLossLayer::SetUp(const vector*>& bottom, - vector*>* top) { - Layer::SetUp(bottom, top); +void SoftmaxWithLossLayer::LayerSetUp( + const vector*>& bottom, vector*>* top) { + LossLayer::LayerSetUp(bottom, top); softmax_bottom_vec_.clear(); softmax_bottom_vec_.push_back(bottom[0]); + softmax_top_vec_.clear(); softmax_top_vec_.push_back(&prob_); softmax_layer_->SetUp(softmax_bottom_vec_, &softmax_top_vec_); - if (top->size() >= 1) { - // softmax loss (averaged across batch) - (*top)[0]->Reshape(1, 1, 1, 1); - } - if (top->size() == 2) { + if (top->size() >= 2) { // softmax output - (*top)[1]->Reshape(bottom[0]->num(), bottom[0]->channels(), - bottom[0]->height(), bottom[0]->width()); + (*top)[1]->ReshapeLike(*bottom[0]); } } template -Dtype SoftmaxWithLossLayer::Forward_cpu( +void SoftmaxWithLossLayer::Forward_cpu( const vector*>& bottom, vector*>* top) { // The forward pass computes the softmax prob values. softmax_bottom_vec_[0] = bottom[0]; @@ -42,13 +38,10 @@ Dtype SoftmaxWithLossLayer::Forward_cpu( loss += -log(std::max(prob_data[i * dim + static_cast(label[i])], Dtype(FLT_MIN))); } - if (top->size() >= 1) { - (*top)[0]->mutable_cpu_data()[0] = loss / num; - } + (*top)[0]->mutable_cpu_data()[0] = loss / num; if (top->size() == 2) { (*top)[1]->ShareData(prob_); } - return loss / num; } template @@ -69,8 +62,9 @@ void SoftmaxWithLossLayer::Backward_cpu(const vector*>& top, for (int i = 0; i < num; ++i) { bottom_diff[i * dim + static_cast(label[i])] -= 1; } - // Scale down gradient - caffe_scal(prob_.count(), Dtype(1) / num, bottom_diff); + // Scale gradient + const Dtype loss_weight = top[0]->cpu_diff()[0]; + caffe_scal(prob_.count(), loss_weight / num, bottom_diff); } } diff --git a/src/caffe/layers/softmax_loss_layer.cu b/src/caffe/layers/softmax_loss_layer.cu index 32f3e670f48..9ef8dd23615 100644 --- a/src/caffe/layers/softmax_loss_layer.cu +++ b/src/caffe/layers/softmax_loss_layer.cu @@ -9,10 +9,9 @@ namespace caffe { template -Dtype SoftmaxWithLossLayer::Forward_gpu( +void SoftmaxWithLossLayer::Forward_gpu( const vector*>& bottom, vector*>* top) { - // The forward pass computes the softmax prob values. - return Forward_cpu(bottom, top); + Forward_cpu(bottom, top); } template diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index 2786d3f7694..c223d475917 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -7,9 +7,8 @@ namespace caffe { template -void SplitLayer::SetUp(const vector*>& bottom, +void SplitLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); count_ = bottom[0]->count(); for (int i = 0; i < top->size(); ++i) { // Allow the 0th top blob to be 'in-place', but no others. @@ -25,12 +24,11 @@ void SplitLayer::SetUp(const vector*>& bottom, } template -Dtype SplitLayer::Forward_cpu(const vector*>& bottom, +void SplitLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { for (int i = 0; i < top->size(); ++i) { (*top)[i]->ShareData(*bottom[0]); } - return Dtype(0.); } template diff --git a/src/caffe/layers/split_layer.cu b/src/caffe/layers/split_layer.cu index 1cf15a79314..2d2b3c2b089 100644 --- a/src/caffe/layers/split_layer.cu +++ b/src/caffe/layers/split_layer.cu @@ -7,12 +7,11 @@ namespace caffe { template -Dtype SplitLayer::Forward_gpu(const vector*>& bottom, +void SplitLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { for (int i = 0; i < top->size(); ++i) { (*top)[i]->ShareData(*bottom[0]); } - return Dtype(0.); } template diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp index 0c8be3fac60..8dae0054aed 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -10,7 +10,7 @@ namespace caffe { template -Dtype TanHLayer::Forward_cpu(const vector*>& bottom, +void TanHLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -20,7 +20,6 @@ Dtype TanHLayer::Forward_cpu(const vector*>& bottom, exp2x = exp(2 * bottom_data[i]); top_data[i] = (exp2x - Dtype(1)) / (exp2x + Dtype(1)); } - return Dtype(0); } template diff --git a/src/caffe/layers/tanh_layer.cu b/src/caffe/layers/tanh_layer.cu index b3daad1e638..bdb7a94978e 100644 --- a/src/caffe/layers/tanh_layer.cu +++ b/src/caffe/layers/tanh_layer.cu @@ -18,7 +18,7 @@ __global__ void TanHForward(const int n, const Dtype* in, Dtype* out) { } template -Dtype TanHLayer::Forward_gpu(const vector*>& bottom, +void TanHLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -27,7 +27,6 @@ Dtype TanHLayer::Forward_gpu(const vector*>& bottom, TanHForward<<>>( count, bottom_data, top_data); CUDA_POST_KERNEL_CHECK; - return Dtype(0); } template diff --git a/src/caffe/layers/threshold_layer.cpp b/src/caffe/layers/threshold_layer.cpp index c932356019b..180ea6a322b 100644 --- a/src/caffe/layers/threshold_layer.cpp +++ b/src/caffe/layers/threshold_layer.cpp @@ -7,14 +7,14 @@ namespace caffe { template -void ThresholdLayer::SetUp(const vector*>& bottom, +void ThresholdLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - NeuronLayer::SetUp(bottom, top); + NeuronLayer::LayerSetUp(bottom, top); threshold_ = this->layer_param_.threshold_param().threshold(); } template -Dtype ThresholdLayer::Forward_cpu(const vector*>& bottom, +void ThresholdLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -22,7 +22,6 @@ Dtype ThresholdLayer::Forward_cpu(const vector*>& bottom, for (int i = 0; i < count; ++i) { top_data[i] = (bottom_data[i] > threshold_) ? Dtype(1) : Dtype(0); } - return Dtype(0); } #ifdef CPU_ONLY diff --git a/src/caffe/layers/threshold_layer.cu b/src/caffe/layers/threshold_layer.cu index 398d56e8765..93430815900 100644 --- a/src/caffe/layers/threshold_layer.cu +++ b/src/caffe/layers/threshold_layer.cu @@ -15,7 +15,7 @@ __global__ void ThresholdForward(const int n, const Dtype threshold, } template -Dtype ThresholdLayer::Forward_gpu(const vector*>& bottom, +void ThresholdLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -24,8 +24,6 @@ Dtype ThresholdLayer::Forward_gpu(const vector*>& bottom, ThresholdForward<<>>( count, threshold_, bottom_data, top_data); CUDA_POST_KERNEL_CHECK; - - return Dtype(0); } diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index ddff5555417..8138234ebee 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -246,10 +246,9 @@ WindowDataLayer::~WindowDataLayer() { } template -void WindowDataLayer::SetUp(const vector*>& bottom, +void WindowDataLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { - Layer::SetUp(bottom, top); - // SetUp runs through the window_file and creates two structures + // LayerSetUp runs through the window_file and creates two structures // that hold windows: one for foreground (object) windows and one // for background (non-object) windows. We use an overlap threshold // to decide which is which. @@ -426,7 +425,7 @@ unsigned int WindowDataLayer::PrefetchRand() { } template -Dtype WindowDataLayer::Forward_cpu(const vector*>& bottom, +void WindowDataLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { // First, join the thread JoinPrefetchThread(); @@ -437,7 +436,6 @@ Dtype WindowDataLayer::Forward_cpu(const vector*>& bottom, (*top)[1]->mutable_cpu_data()); // Start a new prefetch thread CreatePrefetchThread(); - return Dtype(0.); } #ifdef CPU_ONLY diff --git a/src/caffe/layers/window_data_layer.cu b/src/caffe/layers/window_data_layer.cu index 6e8fa8b349a..475ec265a6b 100644 --- a/src/caffe/layers/window_data_layer.cu +++ b/src/caffe/layers/window_data_layer.cu @@ -18,7 +18,7 @@ namespace caffe { template -Dtype WindowDataLayer::Forward_gpu(const vector*>& bottom, +void WindowDataLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { // First, join the thread JoinPrefetchThread(); @@ -29,7 +29,6 @@ Dtype WindowDataLayer::Forward_gpu(const vector*>& bottom, (*top)[1]->mutable_gpu_data()); // Start a new prefetch thread CreatePrefetchThread(); - return Dtype(0.); } INSTANTIATE_CLASS(WindowDataLayer); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index db6b4ffefc4..68a80261e32 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -73,11 +74,26 @@ void Net::Init(const NetParameter& in_param) { // If a blob needs backward, this layer should provide it. need_backward |= blob_need_backward_[blob_id]; } - for (int top_id = 0; top_id < layer_param.top_size(); ++top_id) { + int num_top = layer_param.top_size(); + for (int top_id = 0; top_id < num_top; ++top_id) { AppendTop(param, layer_id, top_id, &available_blobs, &blob_name_to_idx); } + // If the layer specifies that AutoTopBlobs() -> true and the LayerParameter + // specified fewer than the required number (as specified by + // ExactNumTopBlobs() or MinTopBlobs()), allocate them here. + Layer* layer = layers_[layer_id].get(); + if (layer->AutoTopBlobs()) { + const int needed_num_top = + std::max(layer->MinTopBlobs(), layer->ExactNumTopBlobs()); + for (; num_top < needed_num_top; ++num_top) { + // Add "anonymous" top blobs -- do not modify available_blobs or + // blob_name_to_idx as we don't want these blobs to be usable as input + // to other layers. + AppendTop(param, layer_id, num_top, NULL, NULL); + } + } // After this layer is connected, set it up. - // LOG(INFO) << "Setting up " << layer_names_[layer_id]; + LOG(INFO) << "Setting up " << layer_names_[layer_id]; layers_[layer_id]->SetUp(bottom_vecs_[layer_id], &top_vecs_[layer_id]); for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { LOG(INFO) << "Top shape: " << top_vecs_[layer_id][top_id]->num() << " " @@ -272,15 +288,17 @@ void Net::AppendTop(const NetParameter& param, const int layer_id, shared_ptr layer_param((layer_id >= 0) ? (new LayerParameter(param.layers(layer_id))) : NULL); const string& blob_name = layer_param ? - layer_param->top(top_id) : param.input(top_id); + (layer_param->top_size() > top_id ? + layer_param->top(top_id) : "(automatic)") : param.input(top_id); // Check if we are doing in-place computation - if (layer_param && layer_param->bottom_size() > top_id && + if (blob_name_to_idx && layer_param && layer_param->bottom_size() > top_id && blob_name == layer_param->bottom(top_id)) { // In-place computation LOG(INFO) << layer_param->name() << " -> " << blob_name << " (in-place)"; top_vecs_[layer_id].push_back(blobs_[(*blob_name_to_idx)[blob_name]].get()); top_id_vecs_[layer_id].push_back((*blob_name_to_idx)[blob_name]); - } else if (blob_name_to_idx->find(blob_name) != blob_name_to_idx->end()) { + } else if (blob_name_to_idx && + blob_name_to_idx->find(blob_name) != blob_name_to_idx->end()) { // If we are not doing in-place computation but have duplicated blobs, // raise an error. LOG(FATAL) << "Duplicate blobs produced by multiple sources."; @@ -296,7 +314,7 @@ void Net::AppendTop(const NetParameter& param, const int layer_id, blobs_.push_back(blob_pointer); blob_names_.push_back(blob_name); blob_need_backward_.push_back(false); - (*blob_name_to_idx)[blob_name] = blob_id; + if (blob_name_to_idx) { (*blob_name_to_idx)[blob_name] = blob_id; } if (layer_id == -1) { // Set the (explicitly specified) dimensions of the input blob. blob_pointer->Reshape(param.input_dim(top_id * 4), @@ -311,7 +329,7 @@ void Net::AppendTop(const NetParameter& param, const int layer_id, } memory_used_ += blob_pointer->count(); } - available_blobs->insert(blob_name); + if (available_blobs) { available_blobs->insert(blob_name); } } // Helper for Net::Init: add a new bottom blob to the net. diff --git a/src/caffe/test/test_euclidean_loss_layer.cpp b/src/caffe/test/test_euclidean_loss_layer.cpp index 511d38ccab5..d7d2de7e9d4 100644 --- a/src/caffe/test/test_euclidean_loss_layer.cpp +++ b/src/caffe/test/test_euclidean_loss_layer.cpp @@ -22,7 +22,8 @@ class EuclideanLossLayerTest : public MultiDeviceTest { protected: EuclideanLossLayerTest() : blob_bottom_data_(new Blob(10, 5, 1, 1)), - blob_bottom_label_(new Blob(10, 5, 1, 1)) { + blob_bottom_label_(new Blob(10, 5, 1, 1)), + blob_top_loss_(new Blob()) { // fill the values FillerParameter filler_param; GaussianFiller filler(filler_param); @@ -30,28 +31,61 @@ class EuclideanLossLayerTest : public MultiDeviceTest { blob_bottom_vec_.push_back(blob_bottom_data_); filler.Fill(this->blob_bottom_label_); blob_bottom_vec_.push_back(blob_bottom_label_); + blob_top_vec_.push_back(blob_top_loss_); } virtual ~EuclideanLossLayerTest() { delete blob_bottom_data_; delete blob_bottom_label_; + delete blob_top_loss_; } + + void TestForward() { + // Get the loss without a specified objective weight -- should be + // equivalent to explicitly specifiying a weight of 1. + LayerParameter layer_param; + EuclideanLossLayer layer_weight_1(layer_param); + layer_weight_1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + const Dtype loss_weight_1 = + layer_weight_1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + + // Get the loss again with a different objective weight; check that it is + // scaled appropriately. + const Dtype kLossWeight = 3.7; + layer_param.add_loss_weight(kLossWeight); + EuclideanLossLayer layer_weight_2(layer_param); + layer_weight_2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + const Dtype loss_weight_2 = + layer_weight_2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + const Dtype kErrorMargin = 1e-5; + EXPECT_NEAR(loss_weight_1 * kLossWeight, loss_weight_2, kErrorMargin); + // Make sure the loss is non-trivial. + const Dtype kNonTrivialAbsThresh = 1e-1; + EXPECT_GE(fabs(loss_weight_1), kNonTrivialAbsThresh); + } + Blob* const blob_bottom_data_; Blob* const blob_bottom_label_; + Blob* const blob_top_loss_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; }; TYPED_TEST_CASE(EuclideanLossLayerTest, TestDtypesAndDevices); +TYPED_TEST(EuclideanLossLayerTest, TestForward) { + this->TestForward(); +} + TYPED_TEST(EuclideanLossLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; + const Dtype kLossWeight = 3.7; + layer_param.add_loss_weight(kLossWeight); EuclideanLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); GradientChecker checker(1e-2, 1e-2, 1701); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), -1, -1, -1); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); } - } // namespace caffe diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index 8f6f6f78cf1..3c11b9ac491 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -22,7 +22,8 @@ class HingeLossLayerTest : public MultiDeviceTest { protected: HingeLossLayerTest() : blob_bottom_data_(new Blob(10, 5, 1, 1)), - blob_bottom_label_(new Blob(10, 1, 1, 1)) { + blob_bottom_label_(new Blob(10, 1, 1, 1)), + blob_top_loss_(new Blob()) { // fill the values Caffe::set_random_seed(1701); FillerParameter filler_param; @@ -34,13 +35,16 @@ class HingeLossLayerTest : public MultiDeviceTest { blob_bottom_label_->mutable_cpu_data()[i] = caffe_rng_rand() % 5; } blob_bottom_vec_.push_back(blob_bottom_label_); + blob_top_vec_.push_back(blob_top_loss_); } virtual ~HingeLossLayerTest() { delete blob_bottom_data_; delete blob_bottom_label_; + delete blob_top_loss_; } Blob* const blob_bottom_data_; Blob* const blob_bottom_label_; + Blob* const blob_top_loss_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; }; @@ -52,10 +56,9 @@ TYPED_TEST(HingeLossLayerTest, TestGradientL1) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; HingeLossLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 1e-3, 1701, 1, 0.01); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); + GradientChecker checker(1e-2, 2e-3, 1701, 1, 0.01); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0); } TYPED_TEST(HingeLossLayerTest, TestGradientL2) { @@ -65,11 +68,9 @@ TYPED_TEST(HingeLossLayerTest, TestGradientL2) { HingeLossParameter* hinge_loss_param = layer_param.mutable_hinge_loss_param(); hinge_loss_param->set_norm(HingeLossParameter_Norm_L2); HingeLossLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - GradientChecker checker(1e-2, 2e-3, 1701); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); + GradientChecker checker(1e-2, 1e-2, 1701); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0); } - } // namespace caffe diff --git a/src/caffe/test/test_infogain_loss_layer.cpp b/src/caffe/test/test_infogain_loss_layer.cpp index 162d0e6c589..de2f901af31 100644 --- a/src/caffe/test/test_infogain_loss_layer.cpp +++ b/src/caffe/test/test_infogain_loss_layer.cpp @@ -23,7 +23,8 @@ class InfogainLossLayerTest : public MultiDeviceTest { InfogainLossLayerTest() : blob_bottom_data_(new Blob(10, 5, 1, 1)), blob_bottom_label_(new Blob(10, 1, 1, 1)), - blob_bottom_infogain_(new Blob(1, 1, 5, 5)) { + blob_bottom_infogain_(new Blob(1, 1, 5, 5)), + blob_top_loss_(new Blob()) { Caffe::set_random_seed(1701); FillerParameter filler_param; PositiveUnitballFiller filler(filler_param); @@ -38,15 +39,18 @@ class InfogainLossLayerTest : public MultiDeviceTest { UniformFiller infogain_filler(filler_param); infogain_filler.Fill(this->blob_bottom_infogain_); blob_bottom_vec_.push_back(blob_bottom_infogain_); + blob_top_vec_.push_back(blob_top_loss_); } virtual ~InfogainLossLayerTest() { delete blob_bottom_data_; delete blob_bottom_label_; delete blob_bottom_infogain_; + delete blob_top_loss_; } Blob* const blob_bottom_data_; Blob* const blob_bottom_label_; Blob* const blob_bottom_infogain_; + Blob* const blob_top_loss_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; }; @@ -59,8 +63,8 @@ TYPED_TEST(InfogainLossLayerTest, TestGradient) { LayerParameter layer_param; InfogainLossLayer layer(layer_param); GradientChecker checker(1e-4, 2e-2, 1701, 1, 0.01); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0); } } // namespace caffe diff --git a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp index 3d1037baed0..1fc4c42f0f4 100644 --- a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp +++ b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp @@ -20,7 +20,8 @@ class MultinomialLogisticLossLayerTest : public ::testing::Test { protected: MultinomialLogisticLossLayerTest() : blob_bottom_data_(new Blob(10, 5, 1, 1)), - blob_bottom_label_(new Blob(10, 1, 1, 1)) { + blob_bottom_label_(new Blob(10, 1, 1, 1)), + blob_top_loss_(new Blob()) { Caffe::set_random_seed(1701); // fill the values FillerParameter filler_param; @@ -31,13 +32,16 @@ class MultinomialLogisticLossLayerTest : public ::testing::Test { blob_bottom_label_->mutable_cpu_data()[i] = caffe_rng_rand() % 5; } blob_bottom_vec_.push_back(blob_bottom_label_); + blob_top_vec_.push_back(blob_top_loss_); } virtual ~MultinomialLogisticLossLayerTest() { delete blob_bottom_data_; delete blob_bottom_label_; + delete blob_top_loss_; } Blob* const blob_bottom_data_; Blob* const blob_bottom_label_; + Blob* const blob_top_loss_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; }; @@ -51,8 +55,8 @@ TYPED_TEST(MultinomialLogisticLossLayerTest, TestGradientCPU) { MultinomialLogisticLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); GradientChecker checker(1e-2, 2*1e-2, 1701, 0, 0.05); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0); } } // namespace caffe diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index acd3bcdd8eb..497f11d4ac5 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -144,7 +144,7 @@ class NetTest : public MultiDeviceTest { virtual void InitTrickyNet(Dtype* loss_weight = NULL) { ostringstream loss_weight_stream; if (loss_weight) { - loss_weight_stream << " top_loss_weight: " << *loss_weight << " "; + loss_weight_stream << " loss_weight: " << *loss_weight << " "; } const string& proto = "name: 'TrickyTestNetwork' " @@ -220,14 +220,16 @@ class NetTest : public MultiDeviceTest { InitNetFromProtoString(proto); } - virtual void InitUnsharedWeightsNet(Dtype* loss_weight, + // loss_weight is the loss weight for the EUCLIDEAN_LOSS layer output. + // midnet_loss_weight is the loss weight for the first INNER_PRODUCT layer + // output. Should both default to 0.0 if unspecified (i.e., if NULL is + // passed to this function). + virtual void InitUnsharedWeightsNet(const Dtype* loss_weight = NULL, + const Dtype* midnet_loss_weight = NULL, const bool force_backward = false, const bool bias_term = false, const Dtype blobs_lr_w1 = 1, const Dtype blobs_lr_b1 = 2, const Dtype blobs_lr_w2 = 1, const Dtype blobs_lr_b2 = 2) { ostringstream proto; - if (loss_weight) { - loss_weight_stream << " top_loss_weight: " << *loss_weight << " "; - } proto << "name: 'UnsharedWeightsNetwork' "; if (force_backward) { proto << "force_backward: true "; @@ -270,7 +272,11 @@ class NetTest : public MultiDeviceTest { } proto << " bottom: 'data' " - " top: 'innerproduct1' " + " top: 'innerproduct1' "; + if (midnet_loss_weight) { + proto << " loss_weight: " << *midnet_loss_weight << " "; + } + proto << "} " "layers: { " " name: 'innerproduct2' " @@ -300,7 +306,7 @@ class NetTest : public MultiDeviceTest { " name: 'loss' " " type: EUCLIDEAN_LOSS "; if (loss_weight) { - proto << " top_loss_weight: " << *loss_weight << " "; + proto << " loss_weight: " << *loss_weight << " "; } proto << " bottom: 'innerproduct1' " @@ -544,7 +550,6 @@ TYPED_TEST(NetTest, TestBottomNeedBackward) { } TYPED_TEST(NetTest, TestBottomNeedBackwardForce) { - typedef typename TypeParam::Dtype Dtype; const bool force_backward = true; this->InitTinyNet(force_backward); const vector >& bottom_need_backward = @@ -559,7 +564,6 @@ TYPED_TEST(NetTest, TestBottomNeedBackwardForce) { } TYPED_TEST(NetTest, TestBottomNeedBackwardEuclideanForce) { - typedef typename TypeParam::Dtype Dtype; const bool force_backward = true; this->InitTinyNetEuclidean(force_backward); const vector >& bottom_need_backward = @@ -591,106 +595,45 @@ TYPED_TEST(NetTest, TestBottomNeedBackwardTricky) { EXPECT_EQ(true, bottom_need_backward[3][1]); } -TYPED_TEST(NetTest, TestLossWeightCPU) { - Caffe::set_mode(Caffe::CPU); - // First, compute the loss and gradients with no top_loss_weight specified. - // In this case, the loss weight for the EUCLIDEAN_LOSS layer should default - // to 1. - vector*> bottom; - Caffe::set_random_seed(this->seed_); - const bool kForceBackward = true; - this->InitUnsharedWeightsNet(NULL, kForceBackward); - const TypeParam loss = this->net_->ForwardBackward(bottom); - const bool kCopyDiff = true; - const bool kReshape = true; - const vector > >& net_blobs = this->net_->blobs(); - vector > > blob_grads(net_blobs.size()); - for (int i = 0; i < net_blobs.size(); ++i) { - blob_grads[i].reset(new Blob()); - blob_grads[i]->CopyFrom(*net_blobs[i], kCopyDiff, kReshape); - } - const vector > >& net_params = - this->net_->params(); - vector > > param_grads(net_params.size()); - for (int i = 0; i < net_params.size(); ++i) { - param_grads[i].reset(new Blob()); - param_grads[i]->CopyFrom(*net_params[i], kCopyDiff, kReshape); - } - // Check that the loss is non-trivial, otherwise the test doesn't prove much. - const TypeParam kMinLossAbsValue = 1e-2; - ASSERT_GE(fabs(loss), kMinLossAbsValue); - const TypeParam kErrorMargin = 1e-5; - const int kNumLossWeights = 6; - TypeParam kLossWeights[kNumLossWeights] = {2, 0, 1, -1, -2.5, 3.7}; - for (int i = 0; i < kNumLossWeights; ++i) { - Caffe::set_random_seed(this->seed_); - this->InitUnsharedWeightsNet(&kLossWeights[i], kForceBackward); - const TypeParam weighted_loss = this->net_->ForwardBackward(bottom); - const TypeParam error_margin = kErrorMargin * fabs(kLossWeights[i]); - EXPECT_NEAR(loss * kLossWeights[i], weighted_loss, error_margin) - << "loss weight = " << kLossWeights[i]; - const vector > >& weighted_blobs = - this->net_->blobs(); - ASSERT_EQ(blob_grads.size(), weighted_blobs.size()); - for (int j = 0; j < blob_grads.size(); ++j) { - ASSERT_EQ(blob_grads[j]->count(), weighted_blobs[j]->count()); - for (int k = 0; k < blob_grads[j]->count(); ++k) { - EXPECT_NEAR(blob_grads[j]->cpu_diff()[k] * kLossWeights[i], - weighted_blobs[j]->cpu_diff()[k], error_margin); - } - } - const vector > >& weighted_params = - this->net_->params(); - ASSERT_EQ(param_grads.size(), weighted_params.size()); - for (int j = 0; j < param_grads.size(); ++j) { - ASSERT_EQ(param_grads[j]->count(), weighted_params[j]->count()); - for (int k = 0; k < param_grads[j]->count(); ++k) { - EXPECT_NEAR(param_grads[j]->cpu_diff()[k] * kLossWeights[i], - weighted_params[j]->cpu_diff()[k], error_margin); - } - } - } -} - -TYPED_TEST(NetTest, TestLossWeightGPU) { - Caffe::set_mode(Caffe::GPU); - // First, compute the loss and gradients with no top_loss_weight specified. +TYPED_TEST(NetTest, TestLossWeight) { + typedef typename TypeParam::Dtype Dtype; + // First, compute the loss and gradients with no loss_weight specified. // In this case, the loss weight for the EUCLIDEAN_LOSS layer should default // to 1. - vector*> bottom; + vector*> bottom; Caffe::set_random_seed(this->seed_); const bool kForceBackward = true; - this->InitUnsharedWeightsNet(NULL, kForceBackward); - const TypeParam loss = this->net_->ForwardBackward(bottom); + this->InitUnsharedWeightsNet(NULL, NULL, kForceBackward); + const Dtype loss = this->net_->ForwardBackward(bottom); const bool kCopyDiff = true; const bool kReshape = true; - const vector > >& net_blobs = this->net_->blobs(); - vector > > blob_grads(net_blobs.size()); + const vector > >& net_blobs = this->net_->blobs(); + vector > > blob_grads(net_blobs.size()); for (int i = 0; i < net_blobs.size(); ++i) { - blob_grads[i].reset(new Blob()); + blob_grads[i].reset(new Blob()); blob_grads[i]->CopyFrom(*net_blobs[i], kCopyDiff, kReshape); } - const vector > >& net_params = + const vector > >& net_params = this->net_->params(); - vector > > param_grads(net_params.size()); + vector > > param_grads(net_params.size()); for (int i = 0; i < net_params.size(); ++i) { - param_grads[i].reset(new Blob()); + param_grads[i].reset(new Blob()); param_grads[i]->CopyFrom(*net_params[i], kCopyDiff, kReshape); } // Check that the loss is non-trivial, otherwise the test doesn't prove much. - const TypeParam kMinLossAbsValue = 1e-2; + const Dtype kMinLossAbsValue = 1e-2; ASSERT_GE(fabs(loss), kMinLossAbsValue); const Dtype kErrorMargin = 1e-4; const int kNumLossWeights = 6; - TypeParam kLossWeights[kNumLossWeights] = {2, 0, 1, -1, -2.5, 3.7}; + Dtype kLossWeights[kNumLossWeights] = {2, 0, 1, -1, -2.5, 3.7}; for (int i = 0; i < kNumLossWeights; ++i) { Caffe::set_random_seed(this->seed_); - this->InitUnsharedWeightsNet(&kLossWeights[i], kForceBackward); - const TypeParam weighted_loss = this->net_->ForwardBackward(bottom); - const TypeParam error_margin = kErrorMargin * fabs(kLossWeights[i]); + this->InitUnsharedWeightsNet(&kLossWeights[i], NULL, kForceBackward); + const Dtype weighted_loss = this->net_->ForwardBackward(bottom); + const Dtype error_margin = kErrorMargin * fabs(kLossWeights[i]); EXPECT_NEAR(loss * kLossWeights[i], weighted_loss, error_margin) << "loss weight = " << kLossWeights[i]; - const vector > >& weighted_blobs = + const vector > >& weighted_blobs = this->net_->blobs(); ASSERT_EQ(blob_grads.size(), weighted_blobs.size()); for (int j = 0; j < blob_grads.size(); ++j) { @@ -700,7 +643,7 @@ TYPED_TEST(NetTest, TestLossWeightGPU) { weighted_blobs[j]->cpu_diff()[k], error_margin); } } - const vector > >& weighted_params = + const vector > >& weighted_params = this->net_->params(); ASSERT_EQ(param_grads.size(), weighted_params.size()); for (int j = 0; j < param_grads.size(); ++j) { @@ -859,15 +802,15 @@ TYPED_TEST(NetTest, TestSharedWeightsUpdate) { TYPED_TEST(NetTest, TestParamPropagateDown) { typedef typename TypeParam::Dtype Dtype; vector*> bottom; - const bool kBiasTerm = true; - const bool kForceBackward = false; - const Dtype* kLossWeight = NULL; + const bool kBiasTerm = true, kForceBackward = false; + const Dtype* kLossWeight1 = NULL; + const Dtype* kLossWeight2 = NULL; // Run the net with all params learned; check that gradients are non-zero. Caffe::set_random_seed(this->seed_); Dtype blobs_lr_w1 = 1, blobs_lr_w2 = 1, blobs_lr_b1 = 2, blobs_lr_b2 = 2; - this->InitUnsharedWeightsNet(kLossWeight, kForceBackward, kBiasTerm - blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); + this->InitUnsharedWeightsNet(kLossWeight1, kLossWeight2, kForceBackward, + kBiasTerm, blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); this->net_->Forward(bottom); this->net_->Backward(); const vector > >& params = this->net_->params(); @@ -886,8 +829,8 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { // gradients. Caffe::set_random_seed(this->seed_); blobs_lr_w1 *= 2, blobs_lr_w2 *= 2, blobs_lr_b1 *= 2, blobs_lr_b2 *= 2; - this->InitUnsharedWeightsNet(kLossWeight, kForceBackward, kBiasTerm - blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); + this->InitUnsharedWeightsNet(kLossWeight1, kLossWeight2, kForceBackward, + kBiasTerm, blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); this->net_->Forward(bottom); this->net_->Backward(); const vector > >& params2 = this->net_->params(); @@ -902,8 +845,8 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { // gradients for those. Caffe::set_random_seed(this->seed_); blobs_lr_w1 = 1, blobs_lr_w2 = 0, blobs_lr_b1 = 0, blobs_lr_b2 = 1; - this->InitUnsharedWeightsNet(kLossWeight, kForceBackward, kBiasTerm - blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); + this->InitUnsharedWeightsNet(kLossWeight1, kLossWeight2, kForceBackward, + kBiasTerm, blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); this->net_->Forward(bottom); this->net_->Backward(); const vector > >& params3 = this->net_->params(); @@ -921,8 +864,8 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { // Change the opposite subset of the learning rates to zero. Caffe::set_random_seed(this->seed_); blobs_lr_w1 = 0, blobs_lr_w2 = 1, blobs_lr_b1 = 1, blobs_lr_b2 = 0; - this->InitUnsharedWeightsNet(kLossWeight, kForceBackward, kBiasTerm - blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); + this->InitUnsharedWeightsNet(kLossWeight1, kLossWeight2, kForceBackward, + kBiasTerm, blobs_lr_w1, blobs_lr_w2, blobs_lr_b1, blobs_lr_b2); this->net_->Forward(bottom); this->net_->Backward(); const vector > >& params4 = this->net_->params(); diff --git a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp index f5716c9e9a7..47ccdea1538 100644 --- a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp @@ -22,7 +22,8 @@ class SigmoidCrossEntropyLossLayerTest : public MultiDeviceTest { protected: SigmoidCrossEntropyLossLayerTest() : blob_bottom_data_(new Blob(10, 5, 1, 1)), - blob_bottom_targets_(new Blob(10, 5, 1, 1)) { + blob_bottom_targets_(new Blob(10, 5, 1, 1)), + blob_top_loss_(new Blob()) { // Fill the data vector FillerParameter data_filler_param; data_filler_param.set_std(1); @@ -36,10 +37,12 @@ class SigmoidCrossEntropyLossLayerTest : public MultiDeviceTest { UniformFiller targets_filler(targets_filler_param); targets_filler.Fill(blob_bottom_targets_); blob_bottom_vec_.push_back(blob_bottom_targets_); + blob_top_vec_.push_back(blob_top_loss_); } virtual ~SigmoidCrossEntropyLossLayerTest() { delete blob_bottom_data_; delete blob_bottom_targets_; + delete blob_top_loss_; } Dtype SigmoidCrossEntropyLossReference(const int count, const int num, @@ -60,6 +63,8 @@ class SigmoidCrossEntropyLossLayerTest : public MultiDeviceTest { void TestForward() { LayerParameter layer_param; + const Dtype kLossWeight = 3.7; + layer_param.add_loss_weight(kLossWeight); FillerParameter data_filler_param; data_filler_param.set_std(1); GaussianFiller data_filler(data_filler_param); @@ -82,7 +87,7 @@ class SigmoidCrossEntropyLossLayerTest : public MultiDeviceTest { const Dtype* blob_bottom_data = this->blob_bottom_data_->cpu_data(); const Dtype* blob_bottom_targets = this->blob_bottom_targets_->cpu_data(); - Dtype reference_loss = this->SigmoidCrossEntropyLossReference( + Dtype reference_loss = kLossWeight * SigmoidCrossEntropyLossReference( count, num, blob_bottom_data, blob_bottom_targets); EXPECT_NEAR(reference_loss, layer_loss, eps) << "debug: trial #" << i; } @@ -90,6 +95,7 @@ class SigmoidCrossEntropyLossLayerTest : public MultiDeviceTest { Blob* const blob_bottom_data_; Blob* const blob_bottom_targets_; + Blob* const blob_top_loss_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; }; @@ -103,11 +109,13 @@ TYPED_TEST(SigmoidCrossEntropyLossLayerTest, TestSigmoidCrossEntropyLoss) { TYPED_TEST(SigmoidCrossEntropyLossLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; + const Dtype kLossWeight = 3.7; + layer_param.add_loss_weight(kLossWeight); SigmoidCrossEntropyLossLayer layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); GradientChecker checker(1e-2, 1e-2, 1701); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0); } diff --git a/src/caffe/test/test_softmax_with_loss_layer.cpp b/src/caffe/test/test_softmax_with_loss_layer.cpp index bd39bd4420b..0f0adbba621 100644 --- a/src/caffe/test/test_softmax_with_loss_layer.cpp +++ b/src/caffe/test/test_softmax_with_loss_layer.cpp @@ -22,7 +22,8 @@ class SoftmaxWithLossLayerTest : public MultiDeviceTest { protected: SoftmaxWithLossLayerTest() : blob_bottom_data_(new Blob(10, 5, 1, 1)), - blob_bottom_label_(new Blob(10, 1, 1, 1)) { + blob_bottom_label_(new Blob(10, 1, 1, 1)), + blob_top_loss_(new Blob()) { // fill the values FillerParameter filler_param; filler_param.set_std(10); @@ -33,13 +34,16 @@ class SoftmaxWithLossLayerTest : public MultiDeviceTest { blob_bottom_label_->mutable_cpu_data()[i] = caffe_rng_rand() % 5; } blob_bottom_vec_.push_back(blob_bottom_label_); + blob_top_vec_.push_back(blob_top_loss_); } virtual ~SoftmaxWithLossLayerTest() { delete blob_bottom_data_; delete blob_bottom_label_; + delete blob_top_loss_; } Blob* const blob_bottom_data_; Blob* const blob_bottom_label_; + Blob* const blob_top_loss_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; }; @@ -50,11 +54,11 @@ TYPED_TEST_CASE(SoftmaxWithLossLayerTest, TestDtypesAndDevices); TYPED_TEST(SoftmaxWithLossLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; + layer_param.add_loss_weight(3); SoftmaxWithLossLayer layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); GradientChecker checker(1e-2, 1e-2, 1701); - checker.CheckGradientSingle(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0, -1, -1); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0); } } // namespace caffe diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index 711669bacb8..bf634f58a19 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -8,6 +8,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/filler.hpp" +#include "caffe/proto/caffe.pb.h" #include "caffe/util/insert_splits.hpp" #include "caffe/vision_layers.hpp" From 6176f5bad668deda6bae32a772aa8775603e9a27 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 11 Jul 2014 03:17:53 -0700 Subject: [PATCH 0461/2053] Make multiple losses work by inserting split layers and add some tests for it. Test that we can call backward with an ACCURACY layer. This currently fails, but should be possible now that we explicitly associate a loss weight with each top blob. --- include/caffe/util/insert_splits.hpp | 2 +- src/caffe/test/test_net.cpp | 236 +++++++++++++++++++++++++-- src/caffe/test/test_split_layer.cpp | 133 ++++++++++++++- src/caffe/util/insert_splits.cpp | 36 +++- 4 files changed, 385 insertions(+), 22 deletions(-) diff --git a/include/caffe/util/insert_splits.hpp b/include/caffe/util/insert_splits.hpp index 4ca933b9203..446abb817be 100644 --- a/include/caffe/util/insert_splits.hpp +++ b/include/caffe/util/insert_splits.hpp @@ -12,7 +12,7 @@ namespace caffe { void InsertSplits(const NetParameter& param, NetParameter* param_split); void ConfigureSplitLayer(const string& layer_name, const string& blob_name, - const int blob_idx, const int split_count, + const int blob_idx, const int split_count, const float loss_weight, LayerParameter* split_layer_param); string SplitLayerName(const string& layer_name, const string& blob_name, diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 497f11d4ac5..fa5735f2a2d 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -28,7 +28,34 @@ class NetTest : public MultiDeviceTest { net_.reset(new Net(param)); } - virtual void InitTinyNet(const bool force_backward = false) { + virtual void CopyNetBlobs(const bool copy_diff, + vector > >* blobs_copy) { + CHECK(net_); + const vector > >& net_blobs = net_->blobs(); + blobs_copy->clear(); + blobs_copy->resize(net_blobs.size()); + const bool kReshape = true; + for (int i = 0; i < net_blobs.size(); ++i) { + (*blobs_copy)[i].reset(new Blob()); + (*blobs_copy)[i]->CopyFrom(*net_blobs[i], copy_diff, kReshape); + } + } + + virtual void CopyNetParams(const bool copy_diff, + vector > >* params_copy) { + CHECK(net_); + const vector > >& net_params = net_->params(); + params_copy->clear(); + params_copy->resize(net_params.size()); + const bool kReshape = true; + for (int i = 0; i < net_params.size(); ++i) { + (*params_copy)[i].reset(new Blob()); + (*params_copy)[i]->CopyFrom(*net_params[i], copy_diff, kReshape); + } + } + + virtual void InitTinyNet(const bool force_backward = false, + const bool accuracy_layer = false) { string proto = "name: 'TinyTestNetwork' " "layers: { " @@ -79,6 +106,16 @@ class NetTest : public MultiDeviceTest { " bottom: 'label' " " top: 'top_loss' " "} "; + if (accuracy_layer) { + proto += + "layers: { " + " name: 'loss' " + " type: ACCURACY " + " bottom: 'innerproduct' " + " bottom: 'label' " + " top: 'accuracy' " + "} "; + } if (force_backward) { proto += "force_backward: true "; } @@ -606,20 +643,10 @@ TYPED_TEST(NetTest, TestLossWeight) { this->InitUnsharedWeightsNet(NULL, NULL, kForceBackward); const Dtype loss = this->net_->ForwardBackward(bottom); const bool kCopyDiff = true; - const bool kReshape = true; - const vector > >& net_blobs = this->net_->blobs(); - vector > > blob_grads(net_blobs.size()); - for (int i = 0; i < net_blobs.size(); ++i) { - blob_grads[i].reset(new Blob()); - blob_grads[i]->CopyFrom(*net_blobs[i], kCopyDiff, kReshape); - } - const vector > >& net_params = - this->net_->params(); - vector > > param_grads(net_params.size()); - for (int i = 0; i < net_params.size(); ++i) { - param_grads[i].reset(new Blob()); - param_grads[i]->CopyFrom(*net_params[i], kCopyDiff, kReshape); - } + vector > > blob_grads; + this->CopyNetBlobs(kCopyDiff, &blob_grads); + vector > > param_grads; + this->CopyNetParams(kCopyDiff, ¶m_grads); // Check that the loss is non-trivial, otherwise the test doesn't prove much. const Dtype kMinLossAbsValue = 1e-2; ASSERT_GE(fabs(loss), kMinLossAbsValue); @@ -656,6 +683,185 @@ TYPED_TEST(NetTest, TestLossWeight) { } } +TYPED_TEST(NetTest, TestLossWeightMidNet) { + typedef typename TypeParam::Dtype Dtype; + vector*> bottom; + Caffe::set_random_seed(this->seed_); + const bool kForceBackward = true; + Dtype loss_weight = 0; + Dtype midnet_loss_weight = 1; + this->InitUnsharedWeightsNet(&loss_weight, &midnet_loss_weight, + kForceBackward); + const Dtype loss = this->net_->ForwardBackward(bottom); + const bool kCopyDiff = true; + const bool kReshape = true; + Blob data_grad; + data_grad.CopyFrom(*this->net_->blob_by_name("data"), kCopyDiff, kReshape); + // Check that the loss is non-trivial, otherwise the test doesn't prove much. + const Dtype kMinLossAbsValue = 1e-2; + ASSERT_GE(fabs(loss), kMinLossAbsValue); + const Dtype kErrorMargin = 1e-4; + const int kNumLossWeights = 6; + Dtype kLossWeights[kNumLossWeights] = {2, 0, 1, -1, -2.5, 3.7}; + for (int i = 0; i < kNumLossWeights; ++i) { + Caffe::set_random_seed(this->seed_); + this->InitUnsharedWeightsNet(&loss_weight, &kLossWeights[i], + kForceBackward); + const Dtype weighted_loss = this->net_->ForwardBackward(bottom); + const Dtype error_margin = kErrorMargin * fabs(kLossWeights[i]); + EXPECT_NEAR(loss * kLossWeights[i], weighted_loss, error_margin) + << "loss weight = " << kLossWeights[i]; + const shared_ptr >& weighted_blob = + this->net_->blob_by_name("data"); + ASSERT_EQ(data_grad.count(), weighted_blob->count()); + for (int j = 0; j < data_grad.count(); ++j) { + EXPECT_NEAR(data_grad.cpu_diff()[j] * kLossWeights[i], + weighted_blob->cpu_diff()[j], error_margin); + } + } +} + +TYPED_TEST(NetTest, TestComboLossWeight) { + typedef typename TypeParam::Dtype Dtype; + vector*> bottom; + Dtype loss_weight; + Dtype midnet_loss_weight; + const bool kForceBackward = true; + const Dtype kErrorMargin = 1e-4; + + // Get the loss and gradients with EUCLIDEAN_LOSS weight 1, + // INNER_PRODUCT weight 1. + loss_weight = 1; + midnet_loss_weight = 1; + Caffe::set_random_seed(this->seed_); + this->InitUnsharedWeightsNet(&loss_weight, &midnet_loss_weight, + kForceBackward); + const Dtype loss = this->net_->ForwardBackward(bottom); + const bool kCopyDiff = true; + vector > > blob_grads; + this->CopyNetBlobs(kCopyDiff, &blob_grads); + vector > > param_grads; + this->CopyNetParams(kCopyDiff, ¶m_grads); + + loss_weight = 2; + midnet_loss_weight = 1; + Caffe::set_random_seed(this->seed_); + this->InitUnsharedWeightsNet(&loss_weight, &midnet_loss_weight, + kForceBackward); + const Dtype loss_main_2 = this->net_->ForwardBackward(bottom); + vector > > blob_grads_loss_2; + this->CopyNetBlobs(kCopyDiff, &blob_grads_loss_2); + vector > > param_grads_loss_2; + this->CopyNetParams(kCopyDiff, ¶m_grads_loss_2); + + loss_weight = 3; + midnet_loss_weight = 1; + Caffe::set_random_seed(this->seed_); + this->InitUnsharedWeightsNet(&loss_weight, &midnet_loss_weight, + kForceBackward); + const Dtype loss_main_3 = this->net_->ForwardBackward(bottom); + const vector > >& blob_grads_loss_3 = + this->net_->blobs(); + ASSERT_EQ(blob_grads.size(), blob_grads_loss_3.size()); + ASSERT_EQ(blob_grads_loss_2.size(), blob_grads_loss_3.size()); + for (int j = 0; j < blob_grads.size(); ++j) { + const string& blob_name = this->net_->blob_names()[j]; + bool grad_should_change = true; + if (blob_name == "innerproduct1_innerproduct1_0_split_0") { + grad_should_change = false; + } + ASSERT_EQ(blob_grads[j]->count(), blob_grads_loss_3[j]->count()); + ASSERT_EQ(blob_grads_loss_2[j]->count(), blob_grads_loss_3[j]->count()); + for (int k = 0; k < blob_grads[j]->count(); ++k) { + const Dtype grad_diff_2 = blob_grads_loss_2[j]->cpu_diff()[k] - + blob_grads[j]->cpu_diff()[k]; + const Dtype grad_diff_3 = blob_grads_loss_3[j]->cpu_diff()[k] - + blob_grads[j]->cpu_diff()[k]; + if (grad_should_change) { + // Test non-triviality. + const Dtype kMinGradDiffAbsValue = 1e-4; + EXPECT_GT(fabs(grad_diff_2), kMinGradDiffAbsValue) << blob_name; + EXPECT_NEAR(2 * grad_diff_2, grad_diff_3, kErrorMargin) << blob_name; + } else { + EXPECT_EQ(0, grad_diff_2) << blob_name; + EXPECT_EQ(0, grad_diff_3) << blob_name; + } + } + } + + loss_weight = 1; + midnet_loss_weight = 2; + Caffe::set_random_seed(this->seed_); + this->InitUnsharedWeightsNet(&loss_weight, &midnet_loss_weight, + kForceBackward); + const Dtype loss_midnet_2 = this->net_->ForwardBackward(bottom); + this->CopyNetBlobs(kCopyDiff, &blob_grads_loss_2); + this->CopyNetParams(kCopyDiff, ¶m_grads_loss_2); + + loss_weight = 1; + midnet_loss_weight = 3; + Caffe::set_random_seed(this->seed_); + this->InitUnsharedWeightsNet(&loss_weight, &midnet_loss_weight, + kForceBackward); + const Dtype loss_midnet_3 = this->net_->ForwardBackward(bottom); + const vector > >& blob_grads_midnet_loss_3 = + this->net_->blobs(); + ASSERT_EQ(blob_grads.size(), blob_grads_midnet_loss_3.size()); + ASSERT_EQ(blob_grads_loss_2.size(), blob_grads_midnet_loss_3.size()); + const vector& blob_names = this->net_->blob_names(); + for (int j = 0; j < blob_grads.size(); ++j) { + const string& blob_name = blob_names[j]; + bool grad_should_change = false; + if (blob_name == "innerproduct1" || + blob_name == "innerproduct1_innerproduct1_0_split_0" || + blob_name == "data_data_0_split_0" || blob_name == "data") { + grad_should_change = true; + } + ASSERT_EQ(blob_grads[j]->count(), blob_grads_midnet_loss_3[j]->count()); + ASSERT_EQ(blob_grads[j]->count(), blob_grads_loss_2[j]->count()); + for (int k = 0; k < blob_grads[j]->count(); ++k) { + const Dtype grad_diff_2 = blob_grads_loss_2[j]->cpu_diff()[k] - + blob_grads[j]->cpu_diff()[k]; + const Dtype grad_diff_3 = blob_grads_midnet_loss_3[j]->cpu_diff()[k] - + blob_grads[j]->cpu_diff()[k]; + if (grad_should_change) { + // Test non-triviality. + const Dtype kMinGradDiffAbsValue = 1e-4; + EXPECT_GT(fabs(grad_diff_2), kMinGradDiffAbsValue) << blob_name; + EXPECT_NEAR(2 * grad_diff_2, grad_diff_3, kErrorMargin) << blob_name; + } else { + EXPECT_EQ(0, grad_diff_2) << blob_name; + EXPECT_EQ(0, grad_diff_3) << blob_name; + } + } + } + + const Dtype kMinLossDiffAbsValue = 1e-4; + + Dtype loss_diff_2 = loss_main_2 - loss; + // Test non-triviality. + EXPECT_GT(fabs(loss_diff_2), kMinLossDiffAbsValue); + Dtype loss_diff_3 = loss_main_3 - loss; + EXPECT_NEAR(2 * loss_diff_2, loss_diff_3, kErrorMargin); + + loss_diff_2 = loss_midnet_2 - loss; + // Test non-triviality. + EXPECT_GT(fabs(loss_diff_2), kMinLossDiffAbsValue); + loss_diff_3 = loss_midnet_3 - loss; + EXPECT_NEAR(2 * loss_diff_2, loss_diff_3, kErrorMargin); +} + +TYPED_TEST(NetTest, TestBackwardWithAccuracyLayer) { + typedef typename TypeParam::Dtype Dtype; + const bool kForceBackward = false; + const bool kAccuracyLayer = true; + this->InitTinyNet(kForceBackward, kAccuracyLayer); + EXPECT_TRUE(this->net_->has_blob("accuracy")); + vector*> bottom; + // Test that we can do Backward even though we have an ACCURACY layer. + this->net_->ForwardBackward(bottom); +} + TYPED_TEST(NetTest, TestUnsharedWeightsDataNet) { typedef typename TypeParam::Dtype Dtype; this->InitUnsharedWeightsNet(); diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index bf634f58a19..448e13c5924 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -124,12 +124,12 @@ class SplitLayerInsertionTest : public ::testing::Test { output_param_string, &expected_output_param)); NetParameter actual_output_param; InsertSplits(input_param, &actual_output_param); - EXPECT_EQ(expected_output_param.DebugString(), + CHECK_EQ(expected_output_param.DebugString(), actual_output_param.DebugString()); // Also test idempotence. NetParameter double_split_insert_param; InsertSplits(actual_output_param, &double_split_insert_param); - EXPECT_EQ(actual_output_param.DebugString(), + CHECK_EQ(actual_output_param.DebugString(), double_split_insert_param.DebugString()); } }; @@ -546,6 +546,135 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionWithInPlace) { this->RunInsertionTest(input_proto, input_proto); } +TEST_F(SplitLayerInsertionTest, TestLossInsertion) { + const string& input_proto = + "name: 'UnsharedWeightsNetwork' " + "force_backward: true " + "layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: 5 " + " channels: 2 " + " height: 3 " + " width: 4 " + " data_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " } " + " top: 'data' " + "} " + "layers: { " + " name: 'innerproduct1' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'gaussian' " + " std: 10 " + " } " + " } " + " param: 'unsharedweights1' " + " bottom: 'data' " + " top: 'innerproduct1' " + " loss_weight: 2.5 " + "} " + "layers: { " + " name: 'innerproduct2' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'gaussian' " + " std: 10 " + " } " + " } " + " param: 'unsharedweights2' " + " bottom: 'data' " + " top: 'innerproduct2' " + "} " + "layers: { " + " name: 'loss' " + " type: EUCLIDEAN_LOSS " + " bottom: 'innerproduct1' " + " bottom: 'innerproduct2' " + "} "; + const string& expected_output_proto = + "name: 'UnsharedWeightsNetwork' " + "force_backward: true " + "layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: 5 " + " channels: 2 " + " height: 3 " + " width: 4 " + " data_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " } " + " top: 'data' " + "} " + "layers: { " + " name: 'data_data_0_split' " + " type: SPLIT " + " bottom: 'data' " + " top: 'data' " + " top: 'data_data_0_split_1' " + "} " + "layers: { " + " name: 'innerproduct1' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'gaussian' " + " std: 10 " + " } " + " } " + " param: 'unsharedweights1' " + " bottom: 'data' " + " top: 'innerproduct1' " + "} " + "layers: { " + " name: 'innerproduct1_innerproduct1_0_split' " + " type: SPLIT " + " bottom: 'innerproduct1' " + " top: 'innerproduct1' " + " top: 'innerproduct1_innerproduct1_0_split_1' " + " loss_weight: 2.5 " + " loss_weight: 0 " + "} " + "layers: { " + " name: 'innerproduct2' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 10 " + " bias_term: false " + " weight_filler { " + " type: 'gaussian' " + " std: 10 " + " } " + " } " + " param: 'unsharedweights2' " + " bottom: 'data_data_0_split_1' " + " top: 'innerproduct2' " + "} " + "layers: { " + " name: 'loss' " + " type: EUCLIDEAN_LOSS " + " bottom: 'innerproduct1_innerproduct1_0_split_1' " + " bottom: 'innerproduct2' " + "} "; + this->RunInsertionTest(input_proto, expected_output_proto); +} + TEST_F(SplitLayerInsertionTest, TestInsertion) { const string& input_proto = "name: 'TestNetwork' " diff --git a/src/caffe/util/insert_splits.cpp b/src/caffe/util/insert_splits.cpp index 270568cb5dc..e917e356f95 100644 --- a/src/caffe/util/insert_splits.cpp +++ b/src/caffe/util/insert_splits.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -15,6 +16,7 @@ void InsertSplits(const NetParameter& param, NetParameter* param_split) { map > blob_name_to_last_top_idx; map, pair > bottom_idx_to_source_top_idx; map, int> top_idx_to_bottom_count; + map, float> top_idx_to_loss_weight; map, int> top_idx_to_bottom_split_idx; map layer_idx_to_layer_name; layer_idx_to_layer_name[-1] = "input"; @@ -41,6 +43,18 @@ void InsertSplits(const NetParameter& param, NetParameter* param_split) { const string& blob_name = layer_param.top(j); blob_name_to_last_top_idx[blob_name] = make_pair(i, j); } + // A use of a top blob as a loss should be handled similarly to the use of + // a top blob as an input (bottom) blob to another layer. + const int last_loss = + std::min(layer_param.loss_weight_size(), layer_param.top_size()); + for (int j = 0; j < last_loss; ++j) { + const string& blob_name = layer_param.top(j); + const pair& top_idx = blob_name_to_last_top_idx[blob_name]; + top_idx_to_loss_weight[top_idx] = layer_param.loss_weight(j); + if (top_idx_to_loss_weight[top_idx]) { + ++top_idx_to_bottom_count[top_idx]; + } + } } // Create split layer for any input blobs used by other layers as bottom // blobs more than once. @@ -50,8 +64,9 @@ void InsertSplits(const NetParameter& param, NetParameter* param_split) { const string& layer_name = layer_idx_to_layer_name[-1]; const string& blob_name = param.input(i); LayerParameter* split_layer_param = param_split->add_layers(); + const float kZeroLossWeight = 0; ConfigureSplitLayer(layer_name, blob_name, i, split_count, - split_layer_param); + kZeroLossWeight, split_layer_param); } } for (int i = 0; i < param.layers_size(); ++i) { @@ -72,20 +87,26 @@ void InsertSplits(const NetParameter& param, NetParameter* param_split) { // Create split layer for any top blobs used by other layers as bottom // blobs more than once. for (int j = 0; j < layer_param->top_size(); ++j) { - const int split_count = top_idx_to_bottom_count[make_pair(i, j)]; + const pair& top_idx = make_pair(i, j); + const int split_count = top_idx_to_bottom_count[top_idx]; if (split_count > 1) { const string& layer_name = layer_idx_to_layer_name[i]; const string& blob_name = layer_param->top(j); LayerParameter* split_layer_param = param_split->add_layers(); + const float loss_weight = top_idx_to_loss_weight[top_idx]; ConfigureSplitLayer(layer_name, blob_name, j, split_count, - split_layer_param); + loss_weight, split_layer_param); + if (loss_weight) { + layer_param->clear_loss_weight(); + top_idx_to_bottom_split_idx[top_idx]++; + } } } } } void ConfigureSplitLayer(const string& layer_name, const string& blob_name, - const int blob_idx, const int split_count, + const int blob_idx, const int split_count, const float loss_weight, LayerParameter* split_layer_param) { split_layer_param->Clear(); split_layer_param->add_bottom(blob_name); @@ -94,6 +115,13 @@ void ConfigureSplitLayer(const string& layer_name, const string& blob_name, for (int k = 0; k < split_count; ++k) { split_layer_param->add_top( SplitBlobName(layer_name, blob_name, blob_idx, k)); + if (loss_weight) { + if (k == 0) { + split_layer_param->add_loss_weight(loss_weight); + } else { + split_layer_param->add_loss_weight(0); + } + } } } From e01c867af8ad1038bf4a53e4e4993c4edd8be128 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 11 Jul 2014 17:19:17 -0700 Subject: [PATCH 0462/2053] Net::Init can determine that layers don't need backward if they are not used to compute the loss. --- src/caffe/net.cpp | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 68a80261e32..e70c23bec0a 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -138,14 +138,42 @@ void Net::Init(const NetParameter& in_param) { // Finally, set the backward flag layer_need_backward_.push_back(need_backward); if (need_backward) { - LOG(INFO) << layer_names_[layer_id] << " needs backward computation."; for (int top_id = 0; top_id < top_id_vecs_[layer_id].size(); ++top_id) { blob_need_backward_[top_id_vecs_[layer_id][top_id]] = true; } + } + } + // Go through the net backwards to determine which blobs contribute to the + // loss. We can skip backward computation for blobs that don't contribute + // to the loss. + set blobs_under_loss; + for (int layer_id = layers_.size() - 1; layer_id >= 0; --layer_id) { + bool layer_contributes_loss = false; + for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { + const string& blob_name = blob_names_[top_id_vecs_[layer_id][top_id]]; + if (layers_[layer_id]->has_loss(top_id) || + (blobs_under_loss.find(blob_name) != blobs_under_loss.end())) { + layer_contributes_loss = true; + break; + } + } + if (!layer_contributes_loss) { layer_need_backward_[layer_id] = false; } + if (layer_need_backward_[layer_id]) { + LOG(INFO) << layer_names_[layer_id] << " needs backward computation."; } else { LOG(INFO) << layer_names_[layer_id] << " does not need backward computation."; } + for (int bottom_id = 0; bottom_id < bottom_vecs_[layer_id].size(); + ++bottom_id) { + if (layer_contributes_loss) { + const string& blob_name = + blob_names_[bottom_id_vecs_[layer_id][bottom_id]]; + blobs_under_loss.insert(blob_name); + } else { + bottom_need_backward_[layer_id][bottom_id] = false; + } + } } // Handle force_backward if needed. if (param.force_backward()) { From 7c5dc2091f24306a5379cc67b737acde2c3be7bb Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 11 Jul 2014 17:21:27 -0700 Subject: [PATCH 0463/2053] AccuracyLayer only dies when necessary. --- include/caffe/loss_layers.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 937da0ecda5..f24b1b749f3 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -44,7 +44,9 @@ class AccuracyLayer : public Layer { vector*>* top); virtual void Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - NOT_IMPLEMENTED; + for (int i = 0; i < propagate_down.size(); ++i) { + if (propagate_down[i]) { NOT_IMPLEMENTED; } + } } int top_k_; From f50b233a2607cac2472c1799c332eabf0093c4ae Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 11 Jul 2014 22:52:02 -0700 Subject: [PATCH 0464/2053] Disallow in-place computation in SPLIT layer -- has strange effects in backward pass when input into a loss. --- include/caffe/vision_layers.hpp | 2 +- src/caffe/layers/lrn_layer.cpp | 4 +- src/caffe/layers/split_layer.cpp | 31 +++++++++------ src/caffe/layers/split_layer.cu | 18 +++++---- src/caffe/test/test_split_layer.cpp | 61 +++++++++-------------------- src/caffe/util/insert_splits.cpp | 5 --- 6 files changed, 51 insertions(+), 70 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 31df136af9b..d2d9ab3f783 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -230,7 +230,7 @@ class LRNLayer : public Layer { Blob power_output_; vector*> power_top_vec_; shared_ptr > product_layer_; - Blob product_data_input_; + Blob product_input_; vector*> product_bottom_vec_; }; diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index c76ca95dfcd..e81a32ba84f 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -26,7 +26,7 @@ void LRNLayer::LayerSetUp(const vector*>& bottom, { // Set up split_layer_ to use inputs in the numerator and denominator. split_top_vec_.clear(); - split_top_vec_.push_back(bottom[0]); + split_top_vec_.push_back(&product_input_); split_top_vec_.push_back(&square_input_); LayerParameter split_param; split_layer_.reset(new SplitLayer(split_param)); @@ -76,7 +76,7 @@ void LRNLayer::LayerSetUp(const vector*>& bottom, // Set up a product_layer_ to compute outputs by multiplying inputs by the // inverse demoninator computed by the power layer. product_bottom_vec_.clear(); - product_bottom_vec_.push_back(bottom[0]); + product_bottom_vec_.push_back(&product_input_); product_bottom_vec_.push_back(&power_output_); LayerParameter product_param; EltwiseParameter* eltwise_param = product_param.mutable_eltwise_param(); diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index c223d475917..3bed347ea6c 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -11,12 +11,13 @@ void SplitLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { count_ = bottom[0]->count(); for (int i = 0; i < top->size(); ++i) { - // Allow the 0th top blob to be 'in-place', but no others. - if (i == 0 && (*top)[i] == bottom[0]) { - continue; - } else { - CHECK_NE((*top)[i], bottom[0]) << "Only 0th top blob may be in place."; - } + // Do not allow in-place computation in the SplitLayer. Instead, share data + // by reference in the forward pass, and keep separate diff allocations in + // the backward pass. (Technically, it should be possible to share the diff + // blob of the first split output with the input, but this seems to cause + // some strange effects in practice...) + CHECK_NE((*top)[i], bottom[0]) << this->type_name() << " Layer does not " + "allow in-place computation."; (*top)[i]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); CHECK_EQ(count_, (*top)[i]->count()); @@ -34,14 +35,18 @@ void SplitLayer::Forward_cpu(const vector*>& bottom, template void SplitLayer::Backward_cpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - if (propagate_down[0]) { - (*bottom)[0]->ShareDiff(*top[0]); - // Add remaining top blob diffs. + if (!propagate_down[0]) { return; } + if (top.size() == 1) { + caffe_copy(count_, top[0]->cpu_diff(), (*bottom)[0]->mutable_cpu_diff()); + return; + } + caffe_add(count_, top[0]->cpu_diff(), top[1]->cpu_diff(), + (*bottom)[0]->mutable_cpu_diff()); + // Add remaining top blob diffs. + for (int i = 2; i < top.size(); ++i) { + const Dtype* top_diff = top[i]->cpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - for (int i = 1; i < top.size(); ++i) { - const Dtype* top_diff = top[i]->cpu_diff(); - caffe_axpy(count_, Dtype(1.), top_diff, bottom_diff); - } + caffe_axpy(count_, Dtype(1.), top_diff, bottom_diff); } } diff --git a/src/caffe/layers/split_layer.cu b/src/caffe/layers/split_layer.cu index 2d2b3c2b089..fcc0917e67d 100644 --- a/src/caffe/layers/split_layer.cu +++ b/src/caffe/layers/split_layer.cu @@ -17,14 +17,18 @@ void SplitLayer::Forward_gpu(const vector*>& bottom, template void SplitLayer::Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { - if (propagate_down[0]) { - (*bottom)[0]->ShareDiff(*top[0]); - // Add remaining top blob diffs. + if (!propagate_down[0]) { return; } + if (top.size() == 1) { + caffe_copy(count_, top[0]->gpu_diff(), (*bottom)[0]->mutable_gpu_diff()); + return; + } + caffe_gpu_add(count_, top[0]->gpu_diff(), top[1]->gpu_diff(), + (*bottom)[0]->mutable_gpu_diff()); + // Add remaining top blob diffs. + for (int i = 2; i < top.size(); ++i) { + const Dtype* top_diff = top[i]->gpu_diff(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - for (int i = 1; i < top.size(); ++i) { - const Dtype* top_diff = top[i]->gpu_diff(); - caffe_gpu_axpy(count_, Dtype(1.), top_diff, bottom_diff); - } + caffe_gpu_axpy(count_, Dtype(1.), top_diff, bottom_diff); } } diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index 448e13c5924..92a3ec77b93 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -76,19 +76,6 @@ TYPED_TEST(SplitLayerTest, Test) { } } -TYPED_TEST(SplitLayerTest, TestInPlace) { - typedef typename TypeParam::Dtype Dtype; - LayerParameter layer_param; - SplitLayer layer(layer_param); - this->blob_top_vec_[0] = this->blob_bottom_vec_[0]; - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - for (int i = 0; i < this->blob_bottom_->count(); ++i) { - Dtype bottom_value = this->blob_bottom_->cpu_data()[i]; - EXPECT_EQ(bottom_value, this->blob_top_b_->cpu_data()[i]); - } -} - TYPED_TEST(SplitLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; @@ -98,16 +85,6 @@ TYPED_TEST(SplitLayerTest, TestGradient) { &(this->blob_top_vec_)); } -TYPED_TEST(SplitLayerTest, TestGradientInPlace) { - typedef typename TypeParam::Dtype Dtype; - LayerParameter layer_param; - SplitLayer layer(layer_param); - GradientChecker checker(1e-2, 1e-2); - this->blob_top_vec_[0] = this->blob_bottom_vec_[0]; - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - class SplitLayerInsertionTest : public ::testing::Test { protected: @@ -124,12 +101,12 @@ class SplitLayerInsertionTest : public ::testing::Test { output_param_string, &expected_output_param)); NetParameter actual_output_param; InsertSplits(input_param, &actual_output_param); - CHECK_EQ(expected_output_param.DebugString(), + EXPECT_EQ(expected_output_param.DebugString(), actual_output_param.DebugString()); // Also test idempotence. NetParameter double_split_insert_param; InsertSplits(actual_output_param, &double_split_insert_param); - CHECK_EQ(actual_output_param.DebugString(), + EXPECT_EQ(actual_output_param.DebugString(), double_split_insert_param.DebugString()); } }; @@ -624,7 +601,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { " name: 'data_data_0_split' " " type: SPLIT " " bottom: 'data' " - " top: 'data' " + " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " "} " "layers: { " @@ -639,14 +616,14 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { " } " " } " " param: 'unsharedweights1' " - " bottom: 'data' " + " bottom: 'data_data_0_split_0' " " top: 'innerproduct1' " "} " "layers: { " " name: 'innerproduct1_innerproduct1_0_split' " " type: SPLIT " " bottom: 'innerproduct1' " - " top: 'innerproduct1' " + " top: 'innerproduct1_innerproduct1_0_split_0' " " top: 'innerproduct1_innerproduct1_0_split_1' " " loss_weight: 2.5 " " loss_weight: 0 " @@ -726,14 +703,14 @@ TEST_F(SplitLayerInsertionTest, TestInsertion) { " name: 'data_data_0_split' " " type: SPLIT " " bottom: 'data' " - " top: 'data' " + " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " " top: 'data_data_0_split_2' " "} " "layers: { " " name: 'innerprod1' " " type: INNER_PRODUCT " - " bottom: 'data' " + " bottom: 'data_data_0_split_0' " " top: 'innerprod1' " "} " "layers: { " @@ -746,7 +723,7 @@ TEST_F(SplitLayerInsertionTest, TestInsertion) { " name: 'innerprod2_innerprod2_0_split' " " type: SPLIT " " bottom: 'innerprod2' " - " top: 'innerprod2' " + " top: 'innerprod2_innerprod2_0_split_0' " " top: 'innerprod2_innerprod2_0_split_1' " "} " "layers: { " @@ -759,7 +736,7 @@ TEST_F(SplitLayerInsertionTest, TestInsertion) { " name: 'loss1' " " type: EUCLIDEAN_LOSS " " bottom: 'innerprod1' " - " bottom: 'innerprod2' " + " bottom: 'innerprod2_innerprod2_0_split_0' " "} " "layers: { " " name: 'loss2' " @@ -827,26 +804,26 @@ TEST_F(SplitLayerInsertionTest, TestInsertionTwoTop) { " name: 'data_data_0_split' " " type: SPLIT " " bottom: 'data' " - " top: 'data' " + " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " "} " "layers: { " " name: 'label_data_1_split' " " type: SPLIT " " bottom: 'label' " - " top: 'label' " + " top: 'label_data_1_split_0' " " top: 'label_data_1_split_1' " "} " "layers: { " " name: 'innerprod1' " " type: INNER_PRODUCT " - " bottom: 'data' " + " bottom: 'data_data_0_split_0' " " top: 'innerprod1' " "} " "layers: { " " name: 'innerprod2' " " type: INNER_PRODUCT " - " bottom: 'label' " + " bottom: 'label_data_1_split_0' " " top: 'innerprod2' " "} " "layers: { " @@ -913,13 +890,13 @@ TEST_F(SplitLayerInsertionTest, TestInputInsertion) { " name: 'data_input_0_split' " " type: SPLIT " " bottom: 'data' " - " top: 'data' " + " top: 'data_input_0_split_0' " " top: 'data_input_0_split_1' " "} " "layers: { " " name: 'innerprod1' " " type: INNER_PRODUCT " - " bottom: 'data' " + " bottom: 'data_input_0_split_0' " " top: 'innerprod1' " "} " "layers: { " @@ -988,13 +965,13 @@ TEST_F(SplitLayerInsertionTest, TestWithInPlace) { " name: 'data_data_0_split' " " type: SPLIT " " bottom: 'data' " - " top: 'data' " + " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " "} " "layers: { " " name: 'innerprod1' " " type: INNER_PRODUCT " - " bottom: 'data' " + " bottom: 'data_data_0_split_0' " " top: 'innerprod1' " "} " "layers: { " @@ -1007,13 +984,13 @@ TEST_F(SplitLayerInsertionTest, TestWithInPlace) { " name: 'innerprod1_relu1_0_split' " " type: SPLIT " " bottom: 'innerprod1' " - " top: 'innerprod1' " + " top: 'innerprod1_relu1_0_split_0' " " top: 'innerprod1_relu1_0_split_1' " "} " "layers: { " " name: 'innerprod2' " " type: INNER_PRODUCT " - " bottom: 'innerprod1' " + " bottom: 'innerprod1_relu1_0_split_0' " " top: 'innerprod2' " "} " "layers: { " diff --git a/src/caffe/util/insert_splits.cpp b/src/caffe/util/insert_splits.cpp index e917e356f95..f20efdae8c6 100644 --- a/src/caffe/util/insert_splits.cpp +++ b/src/caffe/util/insert_splits.cpp @@ -135,11 +135,6 @@ string SplitLayerName(const string& layer_name, const string& blob_name, string SplitBlobName(const string& layer_name, const string& blob_name, const int blob_idx, const int split_idx) { - // 0th split top blob is given the same name as the bottom blob so that - // computation is done 'in-place', saving a bit of time and memory. - if (split_idx == 0) { - return blob_name; - } ostringstream split_blob_name; split_blob_name << blob_name << "_" << layer_name << "_" << blob_idx << "_split_" << split_idx; From 7d590a8de82233db763fed2e487add5a2491f230 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 11 Jul 2014 23:06:41 -0700 Subject: [PATCH 0465/2053] Also display outputs in the train net. (Otherwise, why have them?) --- src/caffe/solver.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index d96d03942f3..18269b0a2dc 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -193,6 +193,17 @@ void Solver::Solve(const char* resume_file) { Dtype loss = net_->ForwardBackward(bottom_vec); if (display) { LOG(INFO) << "Iteration " << iter_ << ", loss = " << loss; + const vector*>& result = net_->output_blobs(); + vector score; + for (int j = 0; j < result.size(); ++j) { + const Dtype* result_vec = result[j]->cpu_data(); + for (int k = 0; k < result[j]->count(); ++k) { + score.push_back(result_vec[k]); + } + } + for (int i = 0; i < score.size(); ++i) { + LOG(INFO) << " Training score #" << i << ": " << score[i]; + } } ComputeUpdateValue(); @@ -267,7 +278,7 @@ void Solver::Test(const int test_net_id) { LOG(INFO) << "Test loss: " << loss; } for (int i = 0; i < test_score.size(); ++i) { - LOG(INFO) << "Test score #" << i << ": " + LOG(INFO) << " Test score #" << i << ": " << test_score[i] / param_.test_iter(test_net_id); } Caffe::set_phase(Caffe::TRAIN); From f7b4507314258590e805eb974cdf8a8020f35ab2 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 11 Jul 2014 23:22:21 -0700 Subject: [PATCH 0466/2053] Add ACCURACY layer and softmax_error output to lenet_consolidated_solver example. --- examples/mnist/lenet_consolidated_solver.prototxt | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/mnist/lenet_consolidated_solver.prototxt b/examples/mnist/lenet_consolidated_solver.prototxt index 980f9382066..42f54e4e93a 100644 --- a/examples/mnist/lenet_consolidated_solver.prototxt +++ b/examples/mnist/lenet_consolidated_solver.prototxt @@ -192,7 +192,6 @@ net_param { bottom: "ip2" bottom: "label" top: "accuracy" - include: { phase: TEST } } layers { name: "loss" From 415123b7ba93550d940faed92297aec5f4a65825 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 13 Jul 2014 16:56:42 -0700 Subject: [PATCH 0467/2053] Store loss coefficients in layer; use for prettier training output. --- include/caffe/net.hpp | 6 ++++++ include/caffe/solver.hpp | 1 + src/caffe/net.cpp | 9 ++++++++- src/caffe/solver.cpp | 39 ++++++++++++++++++++++++++++++--------- 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 8c22137e514..cc238e721b6 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -90,6 +90,9 @@ class Net { inline vector >& bottom_need_backward() { return bottom_need_backward_; } + inline vector& blob_loss_weights() { + return blob_loss_weights_; + } // returns the parameters inline vector > >& params() { return params_; } // returns the parameter learning rate multipliers @@ -163,6 +166,9 @@ class Net { // top_vecs stores the vectors containing the output for each layer vector*> > top_vecs_; vector > top_id_vecs_; + // Vector of weight in the loss (or objective) function of each net blob, + // indexed by blob_id. + vector blob_loss_weights_; vector param_owners_; vector param_display_names_; vector > param_layer_indices_; diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index cdf583a1429..9012c5d50d9 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -46,6 +46,7 @@ class Solver { // function that restores the state from a SolverState protocol buffer. void Restore(const char* resume_file); virtual void RestoreSolverState(const SolverState& state) = 0; + void DisplayOutputBlobs(const int net_id); SolverParameter param_; int iter_; diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index e70c23bec0a..5a49a23e8f4 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -96,11 +96,18 @@ void Net::Init(const NetParameter& in_param) { LOG(INFO) << "Setting up " << layer_names_[layer_id]; layers_[layer_id]->SetUp(bottom_vecs_[layer_id], &top_vecs_[layer_id]); for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { + if (blob_loss_weights_.size() <= top_id_vecs_[layer_id][top_id]) { + blob_loss_weights_.resize(top_id_vecs_[layer_id][top_id] + 1, Dtype(0)); + } + blob_loss_weights_[top_id_vecs_[layer_id][top_id]] = layer->loss(top_id); LOG(INFO) << "Top shape: " << top_vecs_[layer_id][top_id]->num() << " " << top_vecs_[layer_id][top_id]->channels() << " " << top_vecs_[layer_id][top_id]->height() << " " << top_vecs_[layer_id][top_id]->width() << " (" << top_vecs_[layer_id][top_id]->count() << ")"; + if (layer->loss(top_id)) { + LOG(INFO) << " with loss weight " << layer->loss(top_id); + } } DLOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); const int blobs_lr_size = layer_param.blobs_lr_size(); @@ -151,7 +158,7 @@ void Net::Init(const NetParameter& in_param) { bool layer_contributes_loss = false; for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { const string& blob_name = blob_names_[top_id_vecs_[layer_id][top_id]]; - if (layers_[layer_id]->has_loss(top_id) || + if (layers_[layer_id]->loss(top_id) || (blobs_under_loss.find(blob_name) != blobs_under_loss.end())) { layer_contributes_loss = true; break; diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 18269b0a2dc..80582b312fe 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -154,7 +154,7 @@ void Solver::InitTestNets() { } net_params[i].mutable_state()->CopyFrom(net_state); LOG(INFO) - << "Creating testing net (#" << i << ") specified by " << sources[i]; + << "Creating test net (#" << i << ") specified by " << sources[i]; test_nets_[i].reset(new Net(net_params[i])); } } @@ -194,16 +194,24 @@ void Solver::Solve(const char* resume_file) { if (display) { LOG(INFO) << "Iteration " << iter_ << ", loss = " << loss; const vector*>& result = net_->output_blobs(); - vector score; + int score_index = 0; for (int j = 0; j < result.size(); ++j) { const Dtype* result_vec = result[j]->cpu_data(); + const string& output_name = + net_->blob_names()[net_->output_blob_indices()[j]]; + const Dtype loss_weight = + net_->blob_loss_weights()[net_->output_blob_indices()[j]]; for (int k = 0; k < result[j]->count(); ++k) { - score.push_back(result_vec[k]); + ostringstream loss_msg_stream; + if (loss_weight) { + loss_msg_stream << " (* " << loss_weight + << " = " << loss_weight * result_vec[k] << " loss)"; + } + LOG(INFO) << " Train net output #" + << score_index++ << ": " << output_name << " = " + << result_vec[k] << loss_msg_stream.str(); } } - for (int i = 0; i < score.size(); ++i) { - LOG(INFO) << " Training score #" << i << ": " << score[i]; - } } ComputeUpdateValue(); @@ -247,12 +255,14 @@ void Solver::Test(const int test_net_id) { CHECK_NOTNULL(test_nets_[test_net_id].get())-> ShareTrainedLayersWith(net_.get()); vector test_score; + vector test_score_output_id; vector*> bottom_vec; + const shared_ptr >& test_net = test_nets_[test_net_id]; Dtype loss = 0; for (int i = 0; i < param_.test_iter(test_net_id); ++i) { Dtype iter_loss; const vector*>& result = - test_nets_[test_net_id]->Forward(bottom_vec, &iter_loss); + test_net->Forward(bottom_vec, &iter_loss); if (param_.test_compute_loss()) { loss += iter_loss; } @@ -261,6 +271,7 @@ void Solver::Test(const int test_net_id) { const Dtype* result_vec = result[j]->cpu_data(); for (int k = 0; k < result[j]->count(); ++k) { test_score.push_back(result_vec[k]); + test_score_output_id.push_back(j); } } } else { @@ -278,8 +289,18 @@ void Solver::Test(const int test_net_id) { LOG(INFO) << "Test loss: " << loss; } for (int i = 0; i < test_score.size(); ++i) { - LOG(INFO) << " Test score #" << i << ": " - << test_score[i] / param_.test_iter(test_net_id); + const string& output_name = test_net->blob_names()[ + test_net->output_blob_indices()[test_score_output_id[i]]]; + const Dtype loss_weight = + test_net->blob_loss_weights()[test_net->output_blob_indices()[i]]; + ostringstream loss_msg_stream; + const Dtype mean_score = test_score[i] / param_.test_iter(test_net_id); + if (loss_weight) { + loss_msg_stream << " (* " << loss_weight + << " = " << loss_weight * mean_score << " loss)"; + } + LOG(INFO) << " Test net output #" << i << ": " << output_name << " = " + << mean_score << loss_msg_stream.str(); } Caffe::set_phase(Caffe::TRAIN); } From f3083f55c42c7a97e2c4a5bf0baa941c1fa94354 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Wed, 13 Aug 2014 14:54:59 -0700 Subject: [PATCH 0468/2053] Fix from loss-generalization: accidentally removed mid-Forward return from PowerLayer (caused bad performance for trivial PowerLayer cases...) --- src/caffe/layers/power_layer.cpp | 1 + src/caffe/layers/power_layer.cu | 1 + 2 files changed, 2 insertions(+) diff --git a/src/caffe/layers/power_layer.cpp b/src/caffe/layers/power_layer.cpp index a332c4d272a..bf61955d065 100644 --- a/src/caffe/layers/power_layer.cpp +++ b/src/caffe/layers/power_layer.cpp @@ -27,6 +27,7 @@ void PowerLayer::Forward_cpu(const vector*>& bottom, if (diff_scale_ == Dtype(0)) { Dtype value = (power_ == 0) ? Dtype(1) : pow(shift_, power_); caffe_set(count, value, top_data); + return; } const Dtype* bottom_data = bottom[0]->cpu_data(); caffe_copy(count, bottom_data, top_data); diff --git a/src/caffe/layers/power_layer.cu b/src/caffe/layers/power_layer.cu index eaf63c1f48a..a40bc75829d 100644 --- a/src/caffe/layers/power_layer.cu +++ b/src/caffe/layers/power_layer.cu @@ -16,6 +16,7 @@ void PowerLayer::Forward_gpu(const vector*>& bottom, if (diff_scale_ == Dtype(0)) { Dtype value = (power_ == 0) ? Dtype(1) : pow(shift_, power_); caffe_gpu_set(count, value, top_data); + return; } const Dtype* bottom_data = bottom[0]->gpu_data(); caffe_copy(count, bottom_data, top_data); From b5added8327eebb36b6bf1b3eb885e4752ec0916 Mon Sep 17 00:00:00 2001 From: Jason Yosinski Date: Wed, 13 Aug 2014 17:58:04 -0600 Subject: [PATCH 0469/2053] Updated ImageNet Tutorial to reflect new merged train+val prototxt format. Also corrected 4,500,000 iterations -> 450,000 iterations. --- examples/imagenet/readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index d139ad84af8..dc607e6846e 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -57,17 +57,17 @@ which will make `data/ilsvrc12/imagenet_mean.binaryproto`. Network Definition ------------------ -The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet_train.prototxt`. Note the paths in the data layer - if you have not followed the exact paths in this guide you will need to change the following lines: +The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet_train_val.prototxt`. Note the paths in the data layer - if you have not followed the exact paths in this guide you will need to change the following lines: source: "ilvsrc12_train_leveldb" mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" -to point to your own leveldb and image mean. Likewise, do the same for `examples/imagenet/imagenet_val.prototxt`. +to point to your own leveldb and image mean. -If you look carefully at `imagenet_train.prototxt` and `imagenet_val.prototxt`, you will notice that they are largely the same, with the only difference being the data layer sources, and the last layer: in training, we will be using a `softmax_loss` layer to compute the loss function and to initialize the backpropagation, while in validation we will be using an `accuracy` layer to inspect how well we do in terms of accuracy. +If you look carefully at `imagenet_train_val.prototxt`, you will notice several `include: { phase: TRAIN }` and `include: { phase: TEST }` sections. These sections allow us to define two related networks in one file: the network used for training and the network used for testing. These two networks are almost identical, sharing all layers except for the input and output layers. The `TRAIN` network has an input layer, `data`, which randomly mirrors input images, whereas the `TEST` network's `data` layer does not. Both networks output the softmax loss, but only the `TEST` network also outputs accuracy. In training, the `softmax_loss` layer is used to compute the loss function and to initialize the backpropagation, while in validation we will be using an `accuracy` layer to inspect how well we do in terms of accuracy. We will also lay out a protocol buffer for running the solver. Let's make a few plans: -* We will run in batches of 256, and run a total of 4,500,000 iterations (about 90 epochs). +* We will run in batches of 256, and run a total of 450,000 iterations (about 90 epochs). * For every 1,000 iterations, we test the learned net on the validation data. * We set the initial learning rate to 0.01, and decrease it every 100,000 iterations (about 20 epochs). * Information will be displayed every 20 epochs. From 1d322ad6ab741b60ef5e383f3648907dea039cd3 Mon Sep 17 00:00:00 2001 From: Jason Yosinski Date: Wed, 13 Aug 2014 17:32:48 -0700 Subject: [PATCH 0470/2053] Tried to clarify function of `include' lines and train vs. test network differences --- examples/imagenet/readme.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index dc607e6846e..4c716d9ce0b 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -57,16 +57,21 @@ which will make `data/ilsvrc12/imagenet_mean.binaryproto`. Network Definition ------------------ -The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet_train_val.prototxt`. Note the paths in the data layer - if you have not followed the exact paths in this guide you will need to change the following lines: +The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet_train_val.prototxt`. Note the paths in the data layer --- if you have not followed the exact paths in this guide you will need to change the following lines: source: "ilvsrc12_train_leveldb" mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" to point to your own leveldb and image mean. -If you look carefully at `imagenet_train_val.prototxt`, you will notice several `include: { phase: TRAIN }` and `include: { phase: TEST }` sections. These sections allow us to define two related networks in one file: the network used for training and the network used for testing. These two networks are almost identical, sharing all layers except for the input and output layers. The `TRAIN` network has an input layer, `data`, which randomly mirrors input images, whereas the `TEST` network's `data` layer does not. Both networks output the softmax loss, but only the `TEST` network also outputs accuracy. In training, the `softmax_loss` layer is used to compute the loss function and to initialize the backpropagation, while in validation we will be using an `accuracy` layer to inspect how well we do in terms of accuracy. +If you look carefully at `imagenet_train_val.prototxt`, you will notice several `include` sections specifying either `phase: TRAIN` or `phase: TEST`. These sections allow us to define two closely related networks in one file: the network used for training and the network used for testing. These two networks are almost identical, sharing all layers except for those marked with `include { phase: TRAIN }` or `include { phase: TEST }`. In this case, only the input layers and one output layer are different. + +**Input layer differences:** The training network's `data` input layer draws its data from `ilsvrc12_train_leveldb` and randomly mirrors the input image. The testing network's `data` layer takes data from `ilsvrc12_val_leveldb` and does not perform random mirroring. + +**Output layer differences:** Both networks output the `softmax_loss` layer, which in training is used to compute the loss function and to initialize the backpropagation, while in validation this loss is simply reported. The testing network also has a second output layer, `accuracy`, which is used to report the accuracy on the test set. In the process of training, the test network will occasionally be instantiated and tested on the test set, producing lines like `Test score #0: xxx` and `Test score #1: xxx`. In this case score 0 is the accuracy (which will start around 1/1000 = 0.001 for an untrained network) and score 1 is the loss (which will start around 7 for an untrained network). We will also lay out a protocol buffer for running the solver. Let's make a few plans: + * We will run in batches of 256, and run a total of 450,000 iterations (about 90 epochs). * For every 1,000 iterations, we test the learned net on the validation data. * We set the initial learning rate to 0.01, and decrease it every 100,000 iterations (about 20 epochs). From d9f2d6cbcddcf3a2ae35751ec1cafe586d28c457 Mon Sep 17 00:00:00 2001 From: Jason Yosinski Date: Wed, 13 Aug 2014 17:58:04 -0600 Subject: [PATCH 0471/2053] Updated ImageNet Tutorial to reflect new merged train+val prototxt format. Also corrected 4,500,000 iterations -> 450,000 iterations. --- examples/imagenet/readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index d139ad84af8..dc607e6846e 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -57,17 +57,17 @@ which will make `data/ilsvrc12/imagenet_mean.binaryproto`. Network Definition ------------------ -The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet_train.prototxt`. Note the paths in the data layer - if you have not followed the exact paths in this guide you will need to change the following lines: +The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet_train_val.prototxt`. Note the paths in the data layer - if you have not followed the exact paths in this guide you will need to change the following lines: source: "ilvsrc12_train_leveldb" mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" -to point to your own leveldb and image mean. Likewise, do the same for `examples/imagenet/imagenet_val.prototxt`. +to point to your own leveldb and image mean. -If you look carefully at `imagenet_train.prototxt` and `imagenet_val.prototxt`, you will notice that they are largely the same, with the only difference being the data layer sources, and the last layer: in training, we will be using a `softmax_loss` layer to compute the loss function and to initialize the backpropagation, while in validation we will be using an `accuracy` layer to inspect how well we do in terms of accuracy. +If you look carefully at `imagenet_train_val.prototxt`, you will notice several `include: { phase: TRAIN }` and `include: { phase: TEST }` sections. These sections allow us to define two related networks in one file: the network used for training and the network used for testing. These two networks are almost identical, sharing all layers except for the input and output layers. The `TRAIN` network has an input layer, `data`, which randomly mirrors input images, whereas the `TEST` network's `data` layer does not. Both networks output the softmax loss, but only the `TEST` network also outputs accuracy. In training, the `softmax_loss` layer is used to compute the loss function and to initialize the backpropagation, while in validation we will be using an `accuracy` layer to inspect how well we do in terms of accuracy. We will also lay out a protocol buffer for running the solver. Let's make a few plans: -* We will run in batches of 256, and run a total of 4,500,000 iterations (about 90 epochs). +* We will run in batches of 256, and run a total of 450,000 iterations (about 90 epochs). * For every 1,000 iterations, we test the learned net on the validation data. * We set the initial learning rate to 0.01, and decrease it every 100,000 iterations (about 20 epochs). * Information will be displayed every 20 epochs. From d2566dd40a180ec6fcc02c7e48e2e8f3a26e3e72 Mon Sep 17 00:00:00 2001 From: Jason Yosinski Date: Wed, 13 Aug 2014 17:32:48 -0700 Subject: [PATCH 0472/2053] Tried to clarify function of `include' lines and train vs. test network differences --- examples/imagenet/readme.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index dc607e6846e..4c716d9ce0b 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -57,16 +57,21 @@ which will make `data/ilsvrc12/imagenet_mean.binaryproto`. Network Definition ------------------ -The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet_train_val.prototxt`. Note the paths in the data layer - if you have not followed the exact paths in this guide you will need to change the following lines: +The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet_train_val.prototxt`. Note the paths in the data layer --- if you have not followed the exact paths in this guide you will need to change the following lines: source: "ilvsrc12_train_leveldb" mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" to point to your own leveldb and image mean. -If you look carefully at `imagenet_train_val.prototxt`, you will notice several `include: { phase: TRAIN }` and `include: { phase: TEST }` sections. These sections allow us to define two related networks in one file: the network used for training and the network used for testing. These two networks are almost identical, sharing all layers except for the input and output layers. The `TRAIN` network has an input layer, `data`, which randomly mirrors input images, whereas the `TEST` network's `data` layer does not. Both networks output the softmax loss, but only the `TEST` network also outputs accuracy. In training, the `softmax_loss` layer is used to compute the loss function and to initialize the backpropagation, while in validation we will be using an `accuracy` layer to inspect how well we do in terms of accuracy. +If you look carefully at `imagenet_train_val.prototxt`, you will notice several `include` sections specifying either `phase: TRAIN` or `phase: TEST`. These sections allow us to define two closely related networks in one file: the network used for training and the network used for testing. These two networks are almost identical, sharing all layers except for those marked with `include { phase: TRAIN }` or `include { phase: TEST }`. In this case, only the input layers and one output layer are different. + +**Input layer differences:** The training network's `data` input layer draws its data from `ilsvrc12_train_leveldb` and randomly mirrors the input image. The testing network's `data` layer takes data from `ilsvrc12_val_leveldb` and does not perform random mirroring. + +**Output layer differences:** Both networks output the `softmax_loss` layer, which in training is used to compute the loss function and to initialize the backpropagation, while in validation this loss is simply reported. The testing network also has a second output layer, `accuracy`, which is used to report the accuracy on the test set. In the process of training, the test network will occasionally be instantiated and tested on the test set, producing lines like `Test score #0: xxx` and `Test score #1: xxx`. In this case score 0 is the accuracy (which will start around 1/1000 = 0.001 for an untrained network) and score 1 is the loss (which will start around 7 for an untrained network). We will also lay out a protocol buffer for running the solver. Let's make a few plans: + * We will run in batches of 256, and run a total of 450,000 iterations (about 90 epochs). * For every 1,000 iterations, we test the learned net on the validation data. * We set the initial learning rate to 0.01, and decrease it every 100,000 iterations (about 20 epochs). From 1991826a79e7f6a4bc99a8ecc85878cacac92a53 Mon Sep 17 00:00:00 2001 From: Alireza Shafaei Date: Sat, 9 Aug 2014 22:44:12 -0700 Subject: [PATCH 0473/2053] Added absolute value layer, useful for implementation of siamese networks! This commit also replaces the default caffe_fabs with MKL/non-MKL implementation of Abs. --- include/caffe/neuron_layers.hpp | 30 +++++++++++++++++ include/caffe/util/math_functions.hpp | 6 ++++ include/caffe/util/mkl_alternate.hpp | 1 + src/caffe/layer_factory.cpp | 2 ++ src/caffe/layers/absval_layer.cpp | 46 ++++++++++++++++++++++++++ src/caffe/layers/absval_layer.cu | 34 +++++++++++++++++++ src/caffe/proto/caffe.proto | 3 +- src/caffe/test/test_math_functions.cpp | 4 +-- src/caffe/test/test_neuron_layer.cpp | 23 +++++++++++++ src/caffe/util/math_functions.cpp | 11 +++++- src/caffe/util/math_functions.cu | 23 ++++++++++++- 11 files changed, 178 insertions(+), 5 deletions(-) create mode 100644 src/caffe/layers/absval_layer.cpp create mode 100644 src/caffe/layers/absval_layer.cu diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 20f7f6d58e8..d17120fa73a 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -38,6 +38,36 @@ class NeuronLayer : public Layer { virtual inline int ExactNumTopBlobs() const { return 1; } }; +/* AbsVal Layer + y = |x| + + y' = 1 if x > 0 + = -1 if x < 0 +*/ +template +class AbsValLayer : public NeuronLayer { + public: + explicit AbsValLayer(const LayerParameter& param) + : NeuronLayer(param) {} + virtual void LayerSetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_ABSVAL; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: + virtual void Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); +}; + /* BNLLLayer y = x + log(1 + exp(-x)) if x > 0 diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 90a1a86d8e8..6a608d5cfa3 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -88,6 +88,9 @@ void caffe_rng_bernoulli(const int n, const Dtype p, unsigned int* r); template void caffe_exp(const int n, const Dtype* a, Dtype* y); +template +void caffe_abs(const int n, const Dtype* a, Dtype* y); + template Dtype caffe_cpu_dot(const int n, const Dtype* x, const Dtype* y); @@ -196,6 +199,9 @@ void caffe_gpu_mul(const int N, const Dtype* a, const Dtype* b, Dtype* y); template void caffe_gpu_div(const int N, const Dtype* a, const Dtype* b, Dtype* y); +template +void caffe_gpu_abs(const int n, const Dtype* a, Dtype* y); + template void caffe_gpu_powx(const int n, const Dtype* a, const Dtype b, Dtype* y); diff --git a/include/caffe/util/mkl_alternate.hpp b/include/caffe/util/mkl_alternate.hpp index d72bcd2814d..32fdbf79932 100644 --- a/include/caffe/util/mkl_alternate.hpp +++ b/include/caffe/util/mkl_alternate.hpp @@ -33,6 +33,7 @@ extern "C" { DEFINE_VSL_UNARY_FUNC(Sqr, y[i] = a[i] * a[i]); DEFINE_VSL_UNARY_FUNC(Exp, y[i] = exp(a[i])); +DEFINE_VSL_UNARY_FUNC(Abs, y[i] = fabs(a[i])); // A simple way to define the vsl unary functions with singular parameter b. // The operation should be in the form e.g. y[i] = pow(a[i], b) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 2170c19f539..d18d24627a9 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -19,6 +19,8 @@ Layer* GetLayer(const LayerParameter& param) { switch (type) { case LayerParameter_LayerType_ACCURACY: return new AccuracyLayer(param); + case LayerParameter_LayerType_ABSVAL: + return new AbsValLayer(param); case LayerParameter_LayerType_ARGMAX: return new ArgMaxLayer(param); case LayerParameter_LayerType_BNLL: diff --git a/src/caffe/layers/absval_layer.cpp b/src/caffe/layers/absval_layer.cpp new file mode 100644 index 00000000000..ce9d05cc764 --- /dev/null +++ b/src/caffe/layers/absval_layer.cpp @@ -0,0 +1,46 @@ +#include + +#include "caffe/layer.hpp" +#include "caffe/neuron_layers.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template +void AbsValLayer::LayerSetUp(const vector*>& bottom, + vector*>* top) { + NeuronLayer::LayerSetUp(bottom, top); + CHECK_NE((*top)[0], bottom[0]) << this->type_name() << " Layer does not " + "allow in-place computation."; +} + +template +void AbsValLayer::Forward_cpu( + const vector*>& bottom, vector*>* top) { + const int count = (*top)[0]->count(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + caffe_abs(count, bottom[0]->cpu_data(), top_data); +} + +template +void AbsValLayer::Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) { + const int count = top[0]->count(); + const Dtype* top_data = top[0]->cpu_data(); + const Dtype* top_diff = top[0]->cpu_diff(); + if (propagate_down[0]) { + const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + caffe_div(count, top_data, bottom_data, bottom_diff); + caffe_mul(count, bottom_diff, top_diff, bottom_diff); + } +} + +#ifdef CPU_ONLY +STUB_GPU(AbsValLayer); +#endif + +INSTANTIATE_CLASS(AbsValLayer); + + +} // namespace caffe diff --git a/src/caffe/layers/absval_layer.cu b/src/caffe/layers/absval_layer.cu new file mode 100644 index 00000000000..46778aa79b1 --- /dev/null +++ b/src/caffe/layers/absval_layer.cu @@ -0,0 +1,34 @@ +#include + +#include "caffe/layer.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template +void AbsValLayer::Forward_gpu( + const vector*>& bottom, vector*>* top) { + const int count = (*top)[0]->count(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + caffe_gpu_abs(count, bottom[0]->gpu_data(), top_data); +} + +template +void AbsValLayer::Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) { + const int count = top[0]->count(); + const Dtype* top_data = top[0]->gpu_data(); + const Dtype* top_diff = top[0]->gpu_diff(); + if (propagate_down[0]) { + const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + caffe_gpu_div(count, top_data, bottom_data, bottom_diff); + caffe_gpu_mul(count, bottom_diff, top_diff, bottom_diff); + } +} + +INSTANTIATE_CLASS(AbsValLayer); + + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 971a291cad4..9cc0de9fe9b 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -205,12 +205,13 @@ message LayerParameter { // line above the enum. Update the next available ID when you add a new // LayerType. // - // LayerType next available ID: 35 (last added: MVN) + // LayerType next available ID: 36 (last added: ABSVAL) enum LayerType { // "NONE" layer type is 0th enum element so that we don't cause confusion // by defaulting to an existent LayerType (instead, should usually error if // the type is unspecified). NONE = 0; + ABSVAL = 35; ACCURACY = 1; ARGMAX = 30; BNLL = 2; diff --git a/src/caffe/test/test_math_functions.cpp b/src/caffe/test/test_math_functions.cpp index d10e702e79a..667f744bdd7 100644 --- a/src/caffe/test/test_math_functions.cpp +++ b/src/caffe/test/test_math_functions.cpp @@ -113,7 +113,7 @@ TYPED_TEST(MathFunctionsTest, TestSgnbitCPU) { TYPED_TEST(MathFunctionsTest, TestFabsCPU) { int n = this->blob_bottom_->count(); const TypeParam* x = this->blob_bottom_->cpu_data(); - caffe_cpu_fabs(n, x, this->blob_bottom_->mutable_cpu_diff()); + caffe_abs(n, x, this->blob_bottom_->mutable_cpu_diff()); const TypeParam* abs_val = this->blob_bottom_->cpu_diff(); for (int i = 0; i < n; ++i) { EXPECT_EQ(abs_val[i], x[i] > 0 ? x[i] : -x[i]); @@ -194,7 +194,7 @@ TYPED_TEST(MathFunctionsTest, TestSgnbitGPU) { TYPED_TEST(MathFunctionsTest, TestFabsGPU) { int n = this->blob_bottom_->count(); - caffe_gpu_fabs(n, this->blob_bottom_->gpu_data(), + caffe_gpu_abs(n, this->blob_bottom_->gpu_data(), this->blob_bottom_->mutable_gpu_diff()); const TypeParam* abs_val = this->blob_bottom_->cpu_diff(); const TypeParam* x = this->blob_bottom_->cpu_data(); diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 649f8f626d9..29dcec5d889 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -70,6 +70,29 @@ class NeuronLayerTest : public MultiDeviceTest { TYPED_TEST_CASE(NeuronLayerTest, TestDtypesAndDevices); +TYPED_TEST(NeuronLayerTest, TestAbsVal) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + AbsValLayer layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); + const int count = this->blob_bottom_->count(); + for (int i = 0; i < count; ++i) { + EXPECT_EQ(top_data[i], fabs(bottom_data[i])); + } +} + +TYPED_TEST(NeuronLayerTest, TestAbsGradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + AbsValLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3, 1701, 0., 0.01); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + TYPED_TEST(NeuronLayerTest, TestReLU) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index e10f0191362..bac06f8d025 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -206,6 +206,16 @@ void caffe_exp(const int n, const double* a, double* y) { vdExp(n, a, y); } +template <> +void caffe_abs(const int n, const float* a, float* y) { + vsAbs(n, a, y); +} + +template <> +void caffe_abs(const int n, const double* a, double* y) { + vdAbs(n, a, y); +} + unsigned int caffe_rng_rand() { return (*caffe_rng())(); } @@ -349,7 +359,6 @@ double caffe_cpu_asum(const int n, const double* x) { INSTANTIATE_CAFFE_CPU_UNARY_FUNC(sign); INSTANTIATE_CAFFE_CPU_UNARY_FUNC(sgnbit); -INSTANTIATE_CAFFE_CPU_UNARY_FUNC(fabs); template <> void caffe_cpu_scale(const int n, const float alpha, const float *x, diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index eacbb4728dd..4ae4bba6029 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -281,6 +281,28 @@ void caffe_gpu_div(const int N, const double* a, N, a, b, y); } +template +__global__ void abs_kernel(const int n, const Dtype* a, Dtype* y) { + CUDA_KERNEL_LOOP(index, n) { + y[index] = abs(a[index]); + } +} + +template <> +void caffe_gpu_abs(const int N, const float* a, float* y) { + // NOLINT_NEXT_LINE(whitespace/operators) + abs_kernel<<>>( + N, a, y); +} + +template <> +void caffe_gpu_abs(const int N, const double* a, double* y) { + // NOLINT_NEXT_LINE(whitespace/operators) + abs_kernel<<>>( + N, a, y); +} + + template __global__ void powx_kernel(const int n, const Dtype* a, const Dtype alpha, Dtype* y) { @@ -308,7 +330,6 @@ void caffe_gpu_powx(const int N, const double* a, DEFINE_AND_INSTANTIATE_GPU_UNARY_FUNC(sign, y[index] = (Dtype(0) < x[index]) - (x[index] < Dtype(0))); DEFINE_AND_INSTANTIATE_GPU_UNARY_FUNC(sgnbit, y[index] = signbit(x[index])); -DEFINE_AND_INSTANTIATE_GPU_UNARY_FUNC(fabs, y[index] = fabs(x[index])); __global__ void popc_kernel(const int n, const float* a, const float* b, uint8_t* y) { From 16f23eb95a123885f818f76f7475d4eaccc6ce19 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 15 Aug 2014 14:04:59 -0700 Subject: [PATCH 0474/2053] [example] include imports in net surgery --- examples/net_surgery.ipynb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index dc9c7e84954..2b5a8611d33 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -3,7 +3,7 @@ "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "example_name": "Editing model parameters", "include_in_docs": true, - "signature": "sha256:0b2ad61622122fa34a40c250be2c0799a85fb65c149b802ce844c46eceba066e" + "signature": "sha256:de67ad69a180b5a6b350d897042fe0bd424f7db63112ca3b7faba259ccbb9be6" }, "nbformat": 3, "nbformat_minor": 0, @@ -273,6 +273,10 @@ "cell_type": "code", "collapsed": false, "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", "# load input and configure preprocessing\n", "im = caffe.io.load_image('images/cat.jpg')\n", "plt.imshow(im)\n", From d41be0b39ae8bca576b826175ef876984c8ea165 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 15 Aug 2014 14:04:59 -0700 Subject: [PATCH 0475/2053] [example] include imports in net surgery --- examples/net_surgery.ipynb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index dc9c7e84954..2b5a8611d33 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -3,7 +3,7 @@ "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "example_name": "Editing model parameters", "include_in_docs": true, - "signature": "sha256:0b2ad61622122fa34a40c250be2c0799a85fb65c149b802ce844c46eceba066e" + "signature": "sha256:de67ad69a180b5a6b350d897042fe0bd424f7db63112ca3b7faba259ccbb9be6" }, "nbformat": 3, "nbformat_minor": 0, @@ -273,6 +273,10 @@ "cell_type": "code", "collapsed": false, "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", "# load input and configure preprocessing\n", "im = caffe.io.load_image('images/cat.jpg')\n", "plt.imshow(im)\n", From 02aadf0576f432ba985de0ed4a81e80ce722f895 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 15 Aug 2014 14:13:22 -0700 Subject: [PATCH 0476/2053] [example] set phase test for fully-convolutional model --- examples/net_surgery.ipynb | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 2b5a8611d33..4710236c6e9 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -3,7 +3,7 @@ "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "example_name": "Editing model parameters", "include_in_docs": true, - "signature": "sha256:de67ad69a180b5a6b350d897042fe0bd424f7db63112ca3b7faba259ccbb9be6" + "signature": "sha256:742fe1bbeabccae59725a5fd6e97a0a0b2b90842d1dd5953aecd353b2d87cab3" }, "nbformat": 3, "nbformat_minor": 0, @@ -280,6 +280,7 @@ "# load input and configure preprocessing\n", "im = caffe.io.load_image('images/cat.jpg')\n", "plt.imshow(im)\n", + "net_full_conv.set_phase_test()\n", "net_full_conv.set_mean('data', np.load('../python/caffe/imagenet/ilsvrc_2012_mean.npy'))\n", "net_full_conv.set_channel_swap('data', (2,1,0))\n", "net_full_conv.set_raw_scale('data', 255.0)\n", @@ -295,22 +296,22 @@ "output_type": "pyout", "prompt_number": 7, "text": [ - "array([[282, 281, 281, 281, 281, 282, 282, 278],\n", - " [281, 283, 281, 283, 281, 287, 281, 282],\n", - " [283, 283, 283, 281, 283, 283, 283, 259],\n", - " [283, 283, 281, 281, 283, 283, 287, 259],\n", - " [283, 283, 285, 283, 283, 283, 283, 283],\n", - " [283, 283, 333, 283, 283, 283, 283, 282],\n", - " [905, 358, 259, 283, 371, 259, 259, 852],\n", - " [335, 335, 371, 185, 186, 263, 185, 356]])" + "array([[282, 281, 281, 281, 281, 281, 281, 282],\n", + " [283, 283, 283, 281, 281, 281, 281, 282],\n", + " [283, 283, 283, 283, 283, 283, 287, 282],\n", + " [283, 283, 283, 281, 283, 283, 283, 283],\n", + " [283, 283, 283, 283, 283, 283, 283, 283],\n", + " [283, 283, 283, 283, 283, 283, 283, 259],\n", + " [283, 283, 283, 283, 283, 259, 259, 852],\n", + " [335, 335, 283, 283, 283, 263, 263, 331]])" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\nnridj/C6Y3t7+xVF8/z58+LWrVtCCFlgzp8/L4QQ4vHHHxcf//jHZ1/3yCOPiG984xu392FfB/zC\nL/yC+MpXvvKmWncQBOKBBx4Qzz777Jti3Ts7O+Khhx4SX/3qV8W73vUuIcSb631+W6/ne3t7bGxs\nzP79qtZxdwgODw+l+zewvLzM4eEhAPv7+6yvr8++7k74Wdy8eZNr167x4IMPvinWXZYlV65cYXl5\nedaieDOs+9d//df5vd/7vVeYi78Z1j3FbS2aP06H/mbBy+OAf9zn/7ViMpnwnve8hz/4gz+gVqu9\n4nN36rqntom7u7t8/etf52tf+9orPn8nrvsLX/gCS0tLXL169cfKDO/Edb8ct7Vo/lPruJ2dnVfs\nQncilpeXuXXrFiANUKZqg9dio/f/O7Is4z3veQ+PPfYYv/iLvwi8OdY9xdQ28Zlnnrnj1/3000/z\n+c9/nq2tLd773vfy1a9+lccee+yOX/fLcVuL5gMPPMDzzz8/E/d/7nOf49FHH72dj3Db8eijj/Lp\nT38agE9/+tOzovLoo4/y2c9+ljSVphfPP/88b33rW9/IR/0XQQjBr/zKr3Dx4kV+7dd+bfbxO33d\nJycnswlxFEV85Stf4erVq3f8uh9//HF2dnbY3t7ms5/9LO94xzv4sz/7szt+3a/A7W6ifvGLXxTn\nzp0TZ86cEY8//vjtfvnXFb/8y78sTp06JQzDEOvr6+JP//RPRbfbFQ899JA4e/asePjhh0W/3599\n/e/8zu+IM2fOiPPnz4svf/nLb+CT/8vx1FNPCUVRxOXLl8WVK1fElStXxJe+9KU7ft3f+973xNWr\nV8Xly5fF/fffL373d39XCCHu+HW/HE8++eRsev5mWvdcRjnHHHPM8RowVwTNMcccc7wGzIvmHHPM\nMcdrwLxozjHHHHO8BsyL5hxzzDHHa8C8aM4xxxxzvAbMi+Ycc8wxx2vAvGjOMcccc7wGzIvmHHPM\nMcdrwP8F7/c7xJLyUh8AAAAASUVORK5CYII=\n", + "png": "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\n", "text": [ - "" + "" ] } ], From 4288b2b5fc1fea600a336fc56fbaacaae5c94877 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 15 Aug 2014 14:13:22 -0700 Subject: [PATCH 0477/2053] [example] set phase test for fully-convolutional model --- examples/net_surgery.ipynb | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 2b5a8611d33..4710236c6e9 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -3,7 +3,7 @@ "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "example_name": "Editing model parameters", "include_in_docs": true, - "signature": "sha256:de67ad69a180b5a6b350d897042fe0bd424f7db63112ca3b7faba259ccbb9be6" + "signature": "sha256:742fe1bbeabccae59725a5fd6e97a0a0b2b90842d1dd5953aecd353b2d87cab3" }, "nbformat": 3, "nbformat_minor": 0, @@ -280,6 +280,7 @@ "# load input and configure preprocessing\n", "im = caffe.io.load_image('images/cat.jpg')\n", "plt.imshow(im)\n", + "net_full_conv.set_phase_test()\n", "net_full_conv.set_mean('data', np.load('../python/caffe/imagenet/ilsvrc_2012_mean.npy'))\n", "net_full_conv.set_channel_swap('data', (2,1,0))\n", "net_full_conv.set_raw_scale('data', 255.0)\n", @@ -295,22 +296,22 @@ "output_type": "pyout", "prompt_number": 7, "text": [ - "array([[282, 281, 281, 281, 281, 282, 282, 278],\n", - " [281, 283, 281, 283, 281, 287, 281, 282],\n", - " [283, 283, 283, 281, 283, 283, 283, 259],\n", - " [283, 283, 281, 281, 283, 283, 287, 259],\n", - " [283, 283, 285, 283, 283, 283, 283, 283],\n", - " [283, 283, 333, 283, 283, 283, 283, 282],\n", - " [905, 358, 259, 283, 371, 259, 259, 852],\n", - " [335, 335, 371, 185, 186, 263, 185, 356]])" + "array([[282, 281, 281, 281, 281, 281, 281, 282],\n", + " [283, 283, 283, 281, 281, 281, 281, 282],\n", + " [283, 283, 283, 283, 283, 283, 287, 282],\n", + " [283, 283, 283, 281, 283, 283, 283, 283],\n", + " [283, 283, 283, 283, 283, 283, 283, 283],\n", + " [283, 283, 283, 283, 283, 283, 283, 259],\n", + " [283, 283, 283, 283, 283, 259, 259, 852],\n", + " [335, 335, 283, 283, 283, 263, 263, 331]])" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\nnridj/C6Y3t7+xVF8/z58+LWrVtCCFlgzp8/L4QQ4vHHHxcf//jHZ1/3yCOPiG984xu392FfB/zC\nL/yC+MpXvvKmWncQBOKBBx4Qzz777Jti3Ts7O+Khhx4SX/3qV8W73vUuIcSb631+W6/ne3t7bGxs\nzP79qtZxdwgODw+l+zewvLzM4eEhAPv7+6yvr8++7k74Wdy8eZNr167x4IMPvinWXZYlV65cYXl5\nedaieDOs+9d//df5vd/7vVeYi78Z1j3FbS2aP06H/mbBy+OAf9zn/7ViMpnwnve8hz/4gz+gVqu9\n4nN36rqntom7u7t8/etf52tf+9orPn8nrvsLX/gCS0tLXL169cfKDO/Edb8ct7Vo/lPruJ2dnVfs\nQncilpeXuXXrFiANUKZqg9dio/f/O7Is4z3veQ+PPfYYv/iLvwi8OdY9xdQ28Zlnnrnj1/3000/z\n+c9/nq2tLd773vfy1a9+lccee+yOX/fLcVuL5gMPPMDzzz8/E/d/7nOf49FHH72dj3Db8eijj/Lp\nT38agE9/+tOzovLoo4/y2c9+ljSVphfPP/88b33rW9/IR/0XQQjBr/zKr3Dx4kV+7dd+bfbxO33d\nJycnswlxFEV85Stf4erVq3f8uh9//HF2dnbY3t7ms5/9LO94xzv4sz/7szt+3a/A7W6ifvGLXxTn\nzp0TZ86cEY8//vjtfvnXFb/8y78sTp06JQzDEOvr6+JP//RPRbfbFQ899JA4e/asePjhh0W/3599\n/e/8zu+IM2fOiPPnz4svf/nLb+CT/8vx1FNPCUVRxOXLl8WVK1fElStXxJe+9KU7ft3f+973xNWr\nV8Xly5fF/fffL373d39XCCHu+HW/HE8++eRsev5mWvdcRjnHHHPM8RowVwTNMcccc7wGzIvmHHPM\nMcdrwLxozjHHHHO8BsyL5hxzzDHHa8C8aM4xxxxzvAbMi+Ycc8wxx2vAvGjOMcccc7wGzIvmHHPM\nMcdrwP8F7/c7xJLyUh8AAAAASUVORK5CYII=\n", + "png": "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\n", "text": [ - "" + "" ] } ], From c6e9c592a1305ebf993500131825eb8cd83b341a Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 15 Aug 2014 14:29:39 -0700 Subject: [PATCH 0478/2053] Add "not_stage" to NetStateRule to exclude NetStates with certain stages. --- src/caffe/net.cpp | 44 ++++++++++++++++---------- src/caffe/proto/caffe.proto | 6 ++-- src/caffe/test/test_net.cpp | 63 +++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 18 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 5a49a23e8f4..1ee60bfe5e3 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -282,7 +282,7 @@ bool Net::StateMeetsRule(const NetState& state, if (state.level() < rule.min_level()) { LOG(INFO) << "The NetState level (" << state.level() << ") is above the min_level (" << rule.min_level() - << " specified by a rule in layer " << layer_name; + << ") specified by a rule in layer " << layer_name; return false; } } @@ -291,24 +291,36 @@ bool Net::StateMeetsRule(const NetState& state, if (state.level() > rule.max_level()) { LOG(INFO) << "The NetState level (" << state.level() << ") is above the max_level (" << rule.max_level() - << " specified by a rule in layer " << layer_name; + << ") specified by a rule in layer " << layer_name; return false; } } - // Check whether the rule is broken due to stage. If stage is specified, - // the NetState must contain ALL of the rule's stages to meet it. - if (rule.stage_size()) { - for (int i = 0; i < rule.stage_size(); ++i) { - // Check that the NetState contains the rule's ith stage. - bool has_stage = false; - for (int j = 0; !has_stage && j < state.stage_size(); ++j) { - if (rule.stage(i) == state.stage(j)) { has_stage = true; } - } - if (!has_stage) { - LOG(INFO) << "The NetState did not contain stage '" << rule.stage(i) - << "' specified by a rule in layer " << layer_name; - return false; - } + // Check whether the rule is broken due to stage. The NetState must + // contain ALL of the rule's stages to meet it. + for (int i = 0; i < rule.stage_size(); ++i) { + // Check that the NetState contains the rule's ith stage. + bool has_stage = false; + for (int j = 0; !has_stage && j < state.stage_size(); ++j) { + if (rule.stage(i) == state.stage(j)) { has_stage = true; } + } + if (!has_stage) { + LOG(INFO) << "The NetState did not contain stage '" << rule.stage(i) + << "' specified by a rule in layer " << layer_name; + return false; + } + } + // Check whether the rule is broken due to not_stage. The NetState must + // contain NONE of the rule's not_stages to meet it. + for (int i = 0; i < rule.not_stage_size(); ++i) { + // Check that the NetState contains the rule's ith not_stage. + bool has_stage = false; + for (int j = 0; !has_stage && j < state.stage_size(); ++j) { + if (rule.not_stage(i) == state.stage(j)) { has_stage = true; } + } + if (has_stage) { + LOG(INFO) << "The NetState contained a not_stage '" << rule.not_stage(i) + << "' specified by a rule in layer " << layer_name; + return false; } } return true; diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 9cc0de9fe9b..428ba2b406d 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -171,10 +171,12 @@ message NetStateRule { optional int32 min_level = 2; optional int32 max_level = 3; - // A customizable set of stages. - // The net must have ALL of the specified stages to meet the rule. + // Customizable sets of stages to include or exclude. + // The net must have ALL of the specified stages and NONE of the specified + // "not_stage"s to meet the rule. // (Use multiple NetStateRules to specify conjunctions of stages.) repeated string stage = 4; + repeated string not_stage = 5; } // NOTE diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index fa5735f2a2d..395e3523418 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -1618,6 +1618,69 @@ TEST_F(FilterNetTest, TestFilterInByMultipleStage2) { this->RunFilterNetTest(input_proto, input_proto); } +TEST_F(FilterNetTest, TestFilterInByNotStage) { + const string& input_proto = + "state: { stage: 'mystage' } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { not_stage: 'myotherstage' } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " include: { not_stage: 'myotherstage' } " + "} "; + this->RunFilterNetTest(input_proto, input_proto); +} + +TEST_F(FilterNetTest, TestFilterOutByNotStage) { + const string& input_proto = + "state: { stage: 'mystage' } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} " + "layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " bottom: 'data' " + " top: 'innerprod' " + " include: { not_stage: 'mystage' } " + "} " + "layers: { " + " name: 'loss' " + " type: SOFTMAX_LOSS " + " bottom: 'innerprod' " + " bottom: 'label' " + " include: { not_stage: 'mystage' } " + "} "; + const string& output_proto = + "state: { stage: 'mystage' } " + "name: 'TestNetwork' " + "layers: { " + " name: 'data' " + " type: DATA " + " top: 'data' " + " top: 'label' " + "} "; + this->RunFilterNetTest(input_proto, output_proto); +} + TEST_F(FilterNetTest, TestFilterOutByMinLevel) { const string& input_proto = "name: 'TestNetwork' " From da3e9b1e51671b8350d6b8909da4bb608688ddbc Mon Sep 17 00:00:00 2001 From: Jason Yosinski Date: Sat, 16 Aug 2014 23:18:12 -0700 Subject: [PATCH 0479/2053] Updated documentation to include instructions to install protobuf with Python support on Mac OS X --- docs/installation.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index ff0760dd060..bc36f7ebb89 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -135,7 +135,8 @@ In other `ENV` settings, things may not work as expected. Simply run the following: brew install --build-from-source --with-python boost - for x in snappy leveldb protobuf gflags glog szip lmdb homebrew/science/opencv; do brew install $x; done + brew install --with-python protobuf + for x in snappy leveldb gflags glog szip lmdb homebrew/science/opencv; do brew install $x; done Building boost from source is needed to link against your local Python (exceptions might be raised during some OS X installs, but **ignore** these and continue). If you do not need the Python wrapper, simply doing `brew install boost` is fine. From 5e8e19b1387de73c1de01b80a052c71c4195b317 Mon Sep 17 00:00:00 2001 From: Jason Yosinski Date: Sat, 16 Aug 2014 23:41:52 -0700 Subject: [PATCH 0480/2053] Updated installation docs for OS X 10.9 brew install protobuf as well --- docs/installation.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index bc36f7ebb89..e13f02add4c 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -173,7 +173,8 @@ To edit the formulae in turn, run After this, run - for x in snappy leveldb protobuf gflags glog szip lmdb homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; done + for x in snappy leveldb gflags glog szip lmdb homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; done + brew uninstall protobuf; brew install --build-from-source --with-python --fresh -vd protobuf brew install --build-from-source --with-python --fresh -vd boost **Note** that `brew install --build-from-source --fresh -vd boost` is fine if you do not need the Caffe Python wrapper. From ececfc0c0ca98e242ef3b7634f1bfcb431028bd8 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Tue, 1 Jul 2014 09:56:20 +0200 Subject: [PATCH 0481/2053] cmake build system --- .gitignore | 6 + CMakeLists.txt | 72 +++++++ CMakeScripts/FindAtlas.cmake | 61 ++++++ CMakeScripts/FindGlog.cmake | 48 +++++ CMakeScripts/FindLAPACK.cmake | 190 ++++++++++++++++++ CMakeScripts/FindLMDB.cmake | 28 +++ CMakeScripts/FindLevelDB.cmake | 37 ++++ CMakeScripts/FindMKL.cmake | 113 +++++++++++ CMakeScripts/FindOpenBLAS.cmake | 62 ++++++ Makefile | 4 +- matlab/CMakeLists.txt | 1 + python/CMakeLists.txt | 20 ++ src/caffe/CMakeLists.txt | 105 ++++++++++ src/caffe/proto/CMakeLists.txt | 35 ++++ src/caffe/proto/caffe_pretty_print.proto | 2 +- src/caffe/test/CMakeLists.txt | 46 +++++ src/caffe/test/cmake_test_defines.hpp.in | 5 + src/caffe/test/test_caffe_main.cpp | 4 + src/caffe/test/test_caffe_main.hpp | 29 +++ .../test/test_data/sample_data_list.txt.in | 2 + src/caffe/test/test_hdf5_output_layer.cpp | 2 +- src/caffe/test/test_hdf5data_layer.cpp | 2 +- src/caffe/test/test_image_data_layer.cpp | 2 +- src/gtest/CMakeLists.txt | 6 + tools/CMakeLists.txt | 18 ++ 25 files changed, 894 insertions(+), 6 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 CMakeScripts/FindAtlas.cmake create mode 100644 CMakeScripts/FindGlog.cmake create mode 100644 CMakeScripts/FindLAPACK.cmake create mode 100644 CMakeScripts/FindLMDB.cmake create mode 100644 CMakeScripts/FindLevelDB.cmake create mode 100644 CMakeScripts/FindMKL.cmake create mode 100644 CMakeScripts/FindOpenBLAS.cmake create mode 100644 matlab/CMakeLists.txt create mode 100644 python/CMakeLists.txt create mode 100644 src/caffe/CMakeLists.txt create mode 100644 src/caffe/proto/CMakeLists.txt create mode 100644 src/caffe/test/CMakeLists.txt create mode 100644 src/caffe/test/cmake_test_defines.hpp.in create mode 100644 src/caffe/test/test_caffe_main.hpp create mode 100644 src/caffe/test/test_data/sample_data_list.txt.in create mode 100644 src/gtest/CMakeLists.txt create mode 100644 tools/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 7a10d94bafd..c1989306c27 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,9 @@ _site *.sublime-workspace *.sublime-project +# Eclipse Project settings +*.*project + + +# CMake generated files +*.gen.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000000..cc50a3a141d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,72 @@ +cmake_minimum_required(VERSION 2.8) +project( Caffe ) + +### Build Options ########################################################################## + +option(BUILD_PYTHON "Build Python wrapper" OFF) +option(BUILD_MATLAB "Build Matlab wrapper" OFF) +option(BUILD_EXAMPLES "Build examples" ON) +option(BUILD_SHARED_LIBS "Build SHARED libs if ON and STATIC otherwise" OFF) + +if(NOT BLAS) + set(BLAS atlas) +endif() + +if(NOT CUDA_TEST_DEVICE) + set(CUDA_TEST_DEVICE -1) +endif() + +# Install Prefix +if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Default install path" FORCE ) +endif() + +### Configuration ########################################################################### + +# Enable CTest from top build directory +enable_testing() + +# Compiler Flags +set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall) +set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC) +set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} -O3) + +# Include Directories +set(${PROJECT_NAME}_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include) +include_directories(${${PROJECT_NAME}_INCLUDE_DIRS}) +include_directories(${CMAKE_SOURCE_DIR}/src) + +# CMake module path for custom module finding +set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeScripts) + +# CUDA is required globally +find_package(CUDA 5.5 REQUIRED) +include_directories(${CUDA_INCLUDE_DIRS}) + + +### Subdirectories ########################################################################## + +add_subdirectory(src/gtest) +add_subdirectory(src/caffe) +add_subdirectory(tools) + +if(BUILD_EXAMPLES) + message(STATUS "Examples enabled") + add_subdirectory(examples) +endif() + +if(BUILD_PYTHON) + message(STATUS "Python enabled") + add_subdirectory(python) +endif() + +if(BUILD_MATLAB) + message(STATUS "Matlab enabled") + add_subdirectory(matlab) +endif() + +### Install ################################################################################# + +# Install Includes +file(GLOB folders ${${PROJECT_NAME}_INCLUDE_DIRS}/*) +install(DIRECTORY ${folders} DESTINATION include) diff --git a/CMakeScripts/FindAtlas.cmake b/CMakeScripts/FindAtlas.cmake new file mode 100644 index 00000000000..27657a6c7d7 --- /dev/null +++ b/CMakeScripts/FindAtlas.cmake @@ -0,0 +1,61 @@ +# Find the Atlas (and Lapack) libraries +# +# The following variables are optionally searched for defaults +# Atlas_ROOT_DIR: Base directory where all Atlas components are found +# +# The following are set after configuration is done: +# Atlas_FOUND +# Atlas_INCLUDE_DIRS +# Atlas_LIBRARIES +# Atlas_LIBRARYRARY_DIRS + +set(Atlas_INCLUDE_SEARCH_PATHS + /usr/include/atlas + /usr/include/atlas-base + $ENV{Atlas_ROOT_DIR} + $ENV{Atlas_ROOT_DIR}/include +) + +set(Atlas_LIB_SEARCH_PATHS + /usr/lib/atlas + /usr/lib/atlas-base + $ENV{Atlas_ROOT_DIR} + $ENV{Atlas_ROOT_DIR}/lib +) + +find_path(Atlas_CBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) +find_path(Atlas_CLAPACK_INCLUDE_DIR NAMES clapack.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) +find_library(Atlas_CBLAS_LIBRARY NAMES ptcblas_r ptcblas cblas_r cblas PATHS ${Atlas_LIB_SEARCH_PATHS}) +find_library(Atlas_BLAS_LIBRARY NAMES atlas_r atlas PATHS ${Atlas_LIB_SEARCH_PATHS}) +find_library(Atlas_LAPACK_LIBRARY NAMES alapack_r alapack lapack_atlas PATHS ${Atlas_LIB_SEARCH_PATHS}) + +set(LOOKED_FOR + + Atlas_CBLAS_INCLUDE_DIR + Atlas_CLAPACK_INCLUDE_DIR + + Atlas_CBLAS_LIBRARY + Atlas_BLAS_LIBRARY + Atlas_LAPACK_LIBRARY +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Atlas DEFAULT_MSG ${LOOKED_FOR}) + +if(ATLAS_FOUND) + + mark_as_advanced(${LOOKED_FOR}) + + set(Atlas_INCLUDE_DIR + ${Atlas_CBLAS_INCLUDE_DIR} + ${Atlas_CLAPACK_INCLUDE_DIR} + ) + + set(Atlas_LIBRARIES + ${Atlas_LAPACK_LIBRARY} + ${Atlas_CBLAS_LIBRARY} + ${Atlas_BLAS_LIBRARY} + ) + +endif(ATLAS_FOUND) + diff --git a/CMakeScripts/FindGlog.cmake b/CMakeScripts/FindGlog.cmake new file mode 100644 index 00000000000..0dc30abdbf5 --- /dev/null +++ b/CMakeScripts/FindGlog.cmake @@ -0,0 +1,48 @@ +# - Try to find Glog +# +# The following variables are optionally searched for defaults +# GLOG_ROOT_DIR: Base directory where all GLOG components are found +# +# The following are set after configuration is done: +# GLOG_FOUND +# GLOG_INCLUDE_DIRS +# GLOG_LIBRARIES +# GLOG_LIBRARYRARY_DIRS + +include(FindPackageHandleStandardArgs) + +set(GLOG_ROOT_DIR "" CACHE PATH "Folder contains Google glog") + +if(WIN32) + find_path(GLOG_INCLUDE_DIR glog/logging.h + PATHS ${GLOG_ROOT_DIR}/src/windows) +else() + find_path(GLOG_INCLUDE_DIR glog/logging.h + PATHS ${GLOG_ROOT_DIR}) +endif() + +if(MSVC) + find_library(GLOG_LIBRARY_RELEASE libglog_static + PATHS ${GLOG_ROOT_DIR} + PATH_SUFFIXES Release) + + find_library(GLOG_LIBRARY_DEBUG libglog_static + PATHS ${GLOG_ROOT_DIR} + PATH_SUFFIXES Debug) + + set(GLOG_LIBRARY optimized ${GLOG_LIBRARY_RELEASE} debug ${GLOG_LIBRARY_DEBUG}) +else() + find_library(GLOG_LIBRARY glog + PATHS ${GLOG_ROOT_DIR} + PATH_SUFFIXES + lib + lib64) +endif() + +find_package_handle_standard_args(GLOG DEFAULT_MSG + GLOG_INCLUDE_DIR GLOG_LIBRARY) + +if(GLOG_FOUND) + set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR}) + set(GLOG_LIBRARIES ${GLOG_LIBRARY}) +endif() diff --git a/CMakeScripts/FindLAPACK.cmake b/CMakeScripts/FindLAPACK.cmake new file mode 100644 index 00000000000..9641c45d196 --- /dev/null +++ b/CMakeScripts/FindLAPACK.cmake @@ -0,0 +1,190 @@ +# - Find LAPACK library +# This module finds an installed fortran library that implements the LAPACK +# linear-algebra interface (see http://www.netlib.org/lapack/). +# +# The approach follows that taken for the autoconf macro file, acx_lapack.m4 +# (distributed at http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html). +# +# This module sets the following variables: +# LAPACK_FOUND - set to true if a library implementing the LAPACK interface is found +# LAPACK_LIBRARIES - list of libraries (using full path name) for LAPACK + +# Note: I do not think it is a good idea to mixup different BLAS/LAPACK versions +# Hence, this script wants to find a Lapack library matching your Blas library + +# Do nothing if LAPACK was found before +IF(NOT LAPACK_FOUND) + +SET(LAPACK_LIBRARIES) +SET(LAPACK_INFO) + +IF(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) + FIND_PACKAGE(BLAS) +ELSE(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) + FIND_PACKAGE(BLAS REQUIRED) +ENDIF(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED) + +# Old search lapack script +include(CheckFortranFunctionExists) + +macro(Check_Lapack_Libraries LIBRARIES _prefix _name _flags _list _blas) + # This macro checks for the existence of the combination of fortran libraries + # given by _list. If the combination is found, this macro checks (using the + # Check_Fortran_Function_Exists macro) whether can link against that library + # combination using the name of a routine given by _name using the linker + # flags given by _flags. If the combination of libraries is found and passes + # the link test, LIBRARIES is set to the list of complete library paths that + # have been found. Otherwise, LIBRARIES is set to FALSE. + # N.B. _prefix is the prefix applied to the names of all cached variables that + # are generated internally and marked advanced by this macro. + set(_libraries_work TRUE) + set(${LIBRARIES}) + set(_combined_name) + foreach(_library ${_list}) + set(_combined_name ${_combined_name}_${_library}) + if(_libraries_work) + if (WIN32) + find_library(${_prefix}_${_library}_LIBRARY + NAMES ${_library} PATHS ENV LIB PATHS ENV PATH) + else (WIN32) + if(APPLE) + find_library(${_prefix}_${_library}_LIBRARY + NAMES ${_library} + PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 + ENV DYLD_LIBRARY_PATH) + else(APPLE) + find_library(${_prefix}_${_library}_LIBRARY + NAMES ${_library} + PATHS /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 + ENV LD_LIBRARY_PATH) + endif(APPLE) + endif(WIN32) + mark_as_advanced(${_prefix}_${_library}_LIBRARY) + set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY}) + set(_libraries_work ${${_prefix}_${_library}_LIBRARY}) + endif(_libraries_work) + endforeach(_library ${_list}) + if(_libraries_work) + # Test this combination of libraries. + set(CMAKE_REQUIRED_LIBRARIES ${_flags} ${${LIBRARIES}} ${_blas}) + if (CMAKE_Fortran_COMPILER_WORKS) + check_fortran_function_exists(${_name} ${_prefix}${_combined_name}_WORKS) + else (CMAKE_Fortran_COMPILER_WORKS) + check_function_exists("${_name}_" ${_prefix}${_combined_name}_WORKS) + endif (CMAKE_Fortran_COMPILER_WORKS) + set(CMAKE_REQUIRED_LIBRARIES) + mark_as_advanced(${_prefix}${_combined_name}_WORKS) + set(_libraries_work ${${_prefix}${_combined_name}_WORKS}) + endif(_libraries_work) + if(NOT _libraries_work) + set(${LIBRARIES} FALSE) + endif(NOT _libraries_work) +endmacro(Check_Lapack_Libraries) + + +if(BLAS_FOUND) + + # Intel MKL + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "mkl")) + IF(MKL_LAPACK_LIBRARIES) + SET(LAPACK_LIBRARIES ${MKL_LAPACK_LIBRARIES} ${MKL_LIBRARIES}) + ELSE(MKL_LAPACK_LIBRARIES) + SET(LAPACK_LIBRARIES ${MKL_LIBRARIES}) + ENDIF(MKL_LAPACK_LIBRARIES) + SET(LAPACK_INCLUDE_DIR ${MKL_INCLUDE_DIR}) + SET(LAPACK_INFO "mkl") + ENDIF() + + # OpenBlas + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "open")) + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + check_function_exists("cheev_" OPEN_LAPACK_WORKS) + if(OPEN_LAPACK_WORKS) + SET(LAPACK_INFO "open") + else() + message(STATUS "It seems OpenBlas has not been compiled with Lapack support") + endif() + endif() + + # GotoBlas + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "goto")) + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + check_function_exists("cheev_" GOTO_LAPACK_WORKS) + if(GOTO_LAPACK_WORKS) + SET(LAPACK_INFO "goto") + else() + message(STATUS "It seems GotoBlas has not been compiled with Lapack support") + endif() + endif() + + # ACML + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "acml")) + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + check_function_exists("cheev_" ACML_LAPACK_WORKS) + if(ACML_LAPACK_WORKS) + SET(LAPACK_INFO "acml") + else() + message(STATUS "Strangely, this ACML library does not support Lapack?!") + endif() + endif() + + # Accelerate + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "accelerate")) + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + check_function_exists("cheev_" ACCELERATE_LAPACK_WORKS) + if(ACCELERATE_LAPACK_WORKS) + SET(LAPACK_INFO "accelerate") + else() + message(STATUS "Strangely, this Accelerate library does not support Lapack?!") + endif() + endif() + + # vecLib + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "veclib")) + SET(CMAKE_REQUIRED_LIBRARIES ${BLAS_LIBRARIES}) + check_function_exists("cheev_" VECLIB_LAPACK_WORKS) + if(VECLIB_LAPACK_WORKS) + SET(LAPACK_INFO "veclib") + else() + message(STATUS "Strangely, this vecLib library does not support Lapack?!") + endif() + endif() + + # Generic LAPACK library? + IF((NOT LAPACK_INFO) AND (BLAS_INFO STREQUAL "generic")) + check_lapack_libraries( + LAPACK_LIBRARIES + LAPACK + cheev + "" + "lapack" + "${BLAS_LIBRARIES}" + ) + if(LAPACK_LIBRARIES) + SET(LAPACK_INFO "generic") + endif(LAPACK_LIBRARIES) + endif() + +else(BLAS_FOUND) + message(STATUS "LAPACK requires BLAS") +endif(BLAS_FOUND) + +if(LAPACK_INFO) + set(LAPACK_FOUND TRUE) +else(LAPACK_INFO) + set(LAPACK_FOUND FALSE) +endif(LAPACK_INFO) + +IF (NOT LAPACK_FOUND AND LAPACK_FIND_REQUIRED) + message(FATAL_ERROR "Cannot find a library with LAPACK API. Please specify library location.") +ENDIF (NOT LAPACK_FOUND AND LAPACK_FIND_REQUIRED) +IF(NOT LAPACK_FIND_QUIETLY) + IF(LAPACK_FOUND) + MESSAGE(STATUS "Found a library with LAPACK API. (${LAPACK_INFO})") + ELSE(LAPACK_FOUND) + MESSAGE(STATUS "Cannot find a library with LAPACK API. Not using LAPACK.") + ENDIF(LAPACK_FOUND) +ENDIF(NOT LAPACK_FIND_QUIETLY) + +# Do nothing if LAPACK was found before +ENDIF(NOT LAPACK_FOUND) diff --git a/CMakeScripts/FindLMDB.cmake b/CMakeScripts/FindLMDB.cmake new file mode 100644 index 00000000000..e615f542335 --- /dev/null +++ b/CMakeScripts/FindLMDB.cmake @@ -0,0 +1,28 @@ +# Try to find the LMBD libraries and headers +# LMDB_FOUND - system has LMDB lib +# LMDB_INCLUDE_DIR - the LMDB include directory +# LMDB_LIBRARIES - Libraries needed to use LMDB + +# FindCWD based on FindGMP by: +# Copyright (c) 2006, Laurent Montel, +# +# Redistribution and use is allowed according to the terms of the BSD license. + +# Adapted from FindCWD by: +# Copyright 2013 Conrad Steenberg +# Aug 31, 2013 + +if (LMDB_INCLUDE_DIR AND LMDB_LIBRARIES) + # Already in cache, be silent + set(LMDB_FIND_QUIETLY TRUE) +endif (LMDB_INCLUDE_DIR AND LMDB_LIBRARIES) + +find_path(LMDB_INCLUDE_DIR NAMES "lmdb.h" HINTS "$ENV{LMDB_DIR}/include") +find_library(LMDB_LIBRARIES NAMES lmdb HINTS $ENV{LMDB_DIR}/lib ) +MESSAGE(STATUS "LMDB lib: " ${LMDB_LIBRARIES} ) +MESSAGE(STATUS "LMDB include: " ${LMDB_INCLUDE} ) + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LMDB DEFAULT_MSG LMDB_INCLUDE_DIR LMDB_LIBRARIES) + +mark_as_advanced(LMDB_INCLUDE_DIR LMDB_LIBRARIES) diff --git a/CMakeScripts/FindLevelDB.cmake b/CMakeScripts/FindLevelDB.cmake new file mode 100644 index 00000000000..f3386f26dbf --- /dev/null +++ b/CMakeScripts/FindLevelDB.cmake @@ -0,0 +1,37 @@ +# - Find LevelDB +# +# LEVELDB_INCLUDE - Where to find leveldb/db.h +# LEVELDB_LIBS - List of libraries when using LevelDB. +# LEVELDB_FOUND - True if LevelDB found. + +get_filename_component(module_file_path ${CMAKE_CURRENT_LIST_FILE} PATH) + +# Look for the header file. +find_path(LEVELDB_INCLUDE NAMES leveldb/db.h PATHS $ENV{LEVELDB_ROOT}/include /opt/local/include /usr/local/include /usr/include DOC "Path in which the file leveldb/db.h is located." ) +mark_as_advanced(LEVELDB_INCLUDE) + +# Look for the library. +# Does this work on UNIX systems? (LINUX) +find_library(LEVELDB_LIBS NAMES leveldb PATHS /usr/lib $ENV{LEVELDB_ROOT}/lib DOC "Path to leveldb library." ) +mark_as_advanced(LEVELDB_LIBS) + +# Copy the results to the output variables. +if (LEVELDB_INCLUDE AND LEVELDB_LIBS) + message(STATUS "Found leveldb in ${LEVELDB_INCLUDE} ${LEVELDB_LIBS}") + set(LEVELDB_FOUND 1) + include(CheckCXXSourceCompiles) + set(CMAKE_REQUIRED_LIBRARY ${LEVELDB_LIBS} pthread) + set(CMAKE_REQUIRED_INCLUDES ${LEVELDB_INCLUDE}) + else () + set(LEVELDB_FOUND 0) + endif () + + # Report the results. + if (NOT LEVELDB_FOUND) + set(LEVELDB_DIR_MESSAGE "LEVELDB was not found. Make sure LEVELDB_LIBS and LEVELDB_INCLUDE are set.") + if (LEVELDB_FIND_REQUIRED) + message(FATAL_ERROR "${LEVELDB_DIR_MESSAGE}") + elseif (NOT LEVELDB_FIND_QUIETLY) + message(STATUS "${LEVELDB_DIR_MESSAGE}") + endif () + endif () \ No newline at end of file diff --git a/CMakeScripts/FindMKL.cmake b/CMakeScripts/FindMKL.cmake new file mode 100644 index 00000000000..eb2d9f8868b --- /dev/null +++ b/CMakeScripts/FindMKL.cmake @@ -0,0 +1,113 @@ +# - Find Intel MKL +# Find the MKL libraries +# +# Options: +# +# MKL_STATAIC : use static linking +# MKL_MULTI_THREADED: use multi-threading +# MKL_SDL : Single Dynamic Library interface +# +# This module defines the following variables: +# +# MKL_FOUND : True if MKL_INCLUDE_DIR are found +# MKL_INCLUDE_DIR : where to find mkl.h, etc. +# MKL_INCLUDE_DIRS : set when MKL_INCLUDE_DIR found +# MKL_LIBRARIES : the library to link against. + + +include(FindPackageHandleStandardArgs) + +set(INTEL_ROOT "/opt/intel" CACHE PATH "Folder contains intel libs") +set(MKL_ROOT ${INTEL_ROOT}/mkl CACHE PATH "Folder contains MKL") + +# Find include dir +find_path(MKL_INCLUDE_DIR mkl.h + PATHS ${MKL_ROOT}/include) + +# Find include directory +# There is no include folder under linux +if(WIN32) + find_path(INTEL_INCLUDE_DIR omp.h + PATHS ${INTEL_ROOT}/include) + set(MKL_INCLUDE_DIR ${MKL_INCLUDE_DIR} ${INTEL_INCLUDE_DIR}) +endif() + +# Find libraries + +# Handle suffix +set(_MKL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + +if(WIN32) + if(MKL_STATAIC) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES _dll.lib) + endif() +else() + if(MKL_STATAIC) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .so) + endif() +endif() + + +# MKL is composed by four layers: Interface, Threading, Computational and RTL + +if(MKL_SDL) + find_library(MKL_LIBRARY mkl_rt + PATHS ${MKL_ROOT}/lib/ia32/) + + set(MKL_MINIMAL_LIBRARY ${MKL_LIBRARY}) +else() + ######################### Interface layer ####################### + if(WIN32) + set(MKL_INTERFACE_LIBNAME mkl_intel_c) + else() + set(MKL_INTERFACE_LIBNAME mkl_intel) + endif() + + find_library(MKL_INTERFACE_LIBRARY ${MKL_INTERFACE_LIBNAME} + PATHS ${MKL_ROOT}/lib/ia32/) + + ######################## Threading layer ######################## + if(MKL_MULTI_THREADED) + set(MKL_THREADING_LIBNAME mkl_intel_thread) + else() + set(MKL_THREADING_LIBNAME mkl_sequential) + endif() + + find_library(MKL_THREADING_LIBRARY ${MKL_THREADING_LIBNAME} + PATHS ${MKL_ROOT}/lib/ia32/) + + ####################### Computational layer ##################### + find_library(MKL_CORE_LIBRARY mkl_core + PATHS ${MKL_ROOT}/lib/ia32/) + find_library(MKL_FFT_LIBRARY mkl_cdft_core + PATHS ${MKL_ROOT}/lib/ia32/) + find_library(MKL_SCALAPACK_LIBRARY mkl_scalapack_core + PATHS ${MKL_ROOT}/lib/ia32/) + + ############################ RTL layer ########################## + if(WIN32) + set(MKL_RTL_LIBNAME libiomp5md) + else() + set(MKL_RTL_LIBNAME libiomp5) + endif() + find_library(MKL_RTL_LIBRARY ${MKL_RTL_LIBNAME} + PATHS ${INTEL_RTL_ROOT}/lib) + + set(MKL_LIBRARY ${MKL_INTERFACE_LIBRARY} ${MKL_THREADING_LIBRARY} ${MKL_CORE_LIBRARY} ${MKL_FFT_LIBRARY} ${MKL_SCALAPACK_LIBRARY} ${MKL_RTL_LIBRARY}) + set(MKL_MINIMAL_LIBRARY ${MKL_INTERFACE_LIBRARY} ${MKL_THREADING_LIBRARY} ${MKL_CORE_LIBRARY} ${MKL_RTL_LIBRARY}) +endif() + +set(CMAKE_FIND_LIBRARY_SUFFIXES ${_MKL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) + +find_package_handle_standard_args(MKL DEFAULT_MSG + MKL_INCLUDE_DIR MKL_LIBRARY MKL_MINIMAL_LIBRARY) + +if(MKL_FOUND) + set(MKL_INCLUDE_DIRS ${MKL_INCLUDE_DIR}) + set(MKL_LIBRARIES ${MKL_LIBRARY}) + set(MKL_MINIMAL_LIBRARIES ${MKL_LIBRARY}) +endif() diff --git a/CMakeScripts/FindOpenBLAS.cmake b/CMakeScripts/FindOpenBLAS.cmake new file mode 100644 index 00000000000..297a7b6bc43 --- /dev/null +++ b/CMakeScripts/FindOpenBLAS.cmake @@ -0,0 +1,62 @@ + + +SET(Open_BLAS_INCLUDE_SEARCH_PATHS + /usr/include + /usr/include/openblas-base + /usr/local/include + /usr/local/include/openblas-base + /opt/OpenBLAS/include + $ENV{OpenBLAS_HOME} + $ENV{OpenBLAS_HOME}/include +) + +SET(Open_BLAS_LIB_SEARCH_PATHS + /lib/ + /lib/openblas-base + /lib64/ + /usr/lib + /usr/lib/openblas-base + /usr/lib64 + /usr/local/lib + /usr/local/lib64 + /opt/OpenBLAS/lib + $ENV{OpenBLAS}cd + $ENV{OpenBLAS}/lib + $ENV{OpenBLAS_HOME} + $ENV{OpenBLAS_HOME}/lib + ) + +FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${ATLAS_POSSIBLE_INCLUDE_PATHS}) +FIND_LIBRARY(OpenBLAS_LIB NAMES openblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS}) + +SET(OpenBLAS_FOUND ON) + +# Check include files +IF(NOT OpenBLAS_INCLUDE_DIR) + SET(OpenBLAS_FOUND OFF) + MESSAGE(STATUS "Could not find OpenBLAS include. Turning OpenBLAS_FOUND off") +ENDIF() + +# Check libraries +IF(NOT OpenBLAS_LIB) + SET(OpenBLAS_FOUND OFF) + MESSAGE(STATUS "Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off") +ENDIF() + +IF (OpenBLAS_FOUND) + IF (NOT OpenBLAS_FIND_QUIETLY) + MESSAGE(STATUS "Found OpenBLAS libraries: ${OpenBLAS_LIB}") + MESSAGE(STATUS "Found OpenBLAS include: ${OpenBLAS_INCLUDE_DIR}") + ENDIF (NOT OpenBLAS_FIND_QUIETLY) +ELSE (OpenBLAS_FOUND) + IF (OpenBLAS_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find OpenBLAS") + ENDIF (OpenBLAS_FIND_REQUIRED) +ENDIF (OpenBLAS_FOUND) + +MARK_AS_ADVANCED( + OpenBLAS_INCLUDE_DIR + OpenBLAS_LIB + OpenBLAS +) + diff --git a/Makefile b/Makefile index 287120a5d22..2c3ce5415bd 100644 --- a/Makefile +++ b/Makefile @@ -512,12 +512,12 @@ proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER) $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_BUILD_DIR)/%.pb.h : \ $(PROTO_SRC_DIR)/%.proto | $(PROTO_BUILD_DIR) - protoc --proto_path=src --cpp_out=$(BUILD_DIR)/src $< + protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $< @ echo $(PY_PROTO_BUILD_DIR)/%_pb2.py : $(PROTO_SRC_DIR)/%.proto \ $(PY_PROTO_INIT) | $(PY_PROTO_BUILD_DIR) - protoc --proto_path=src --python_out=python $< + protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $< @ echo $(PY_PROTO_INIT): | $(PY_PROTO_BUILD_DIR) diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt new file mode 100644 index 00000000000..f6a03ee4625 --- /dev/null +++ b/matlab/CMakeLists.txt @@ -0,0 +1 @@ +project( Matlab ) \ No newline at end of file diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt new file mode 100644 index 00000000000..e09257c5d7a --- /dev/null +++ b/python/CMakeLists.txt @@ -0,0 +1,20 @@ +project( Python ) + +# Python +find_package(PythonLibs REQUIRED) +include_directories(${PYTHON_INCLUDE_DIRS}) + +# Boost.Python +find_package(Boost 1.49 COMPONENTS python REQUIRED) +include_directories(${Boost_INCLUDE_DIRS}) + +file(GLOB_RECURSE Python_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + +add_library(pycaffe SHARED ${Python_SOURCES}) +target_link_libraries(pycaffe caffe ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}) + +### Install ################################################################################# + +install(DIRECTORY caffe DESTINATION python) +install(FILES requirements.txt DESTINATION python) +install(TARGETS pycaffe DESTINATION python/caffe) \ No newline at end of file diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt new file mode 100644 index 00000000000..d953d0b2c10 --- /dev/null +++ b/src/caffe/CMakeLists.txt @@ -0,0 +1,105 @@ +project( CaffeSrc ) + +# Threads +find_package(Threads REQUIRED) + +# Google-glog +find_package(Glog REQUIRED) +include_directories(${GLOG_INCLUDE_DIRS}) + +# CUDA +set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} + -gencode arch=compute_20,code=sm_20 + -gencode arch=compute_20,code=sm_21 + -gencode arch=compute_30,code=sm_30 + -gencode arch=compute_35,code=sm_35 +) + +# BLAS +if(BLAS STREQUAL "atlas") + + find_package(Atlas REQUIRED) + include_directories(${Atlas_INCLUDE_DIR}) + set(BLAS_LIBRARIES ${Atlas_LIBRARIES}) + +elseif(BLAS STREQUAL "open") + + find_package(OpenBLAS REQUIRED) + include_directories(${OpenBLAS_INCLUDE_DIR}) + set(BLAS_LIBRARIES ${OpenBLAS_LIB}) + +elseif(BLAS STREQUAL "mkl") + + find_package(MKL REQUIRED) + include_directories(${MKL_INCLUDE_DIR}) + set(BLAS_LIBRARIES ${MKL_LIBRARIES}) + +endif() + +# HDF5 +find_package(HDF5 COMPONENTS HL REQUIRED) +include_directories(${HDF5_INCLUDE_DIRS}) + +# OpenCV +find_package(OpenCV COMPONENTS core highgui imgproc REQUIRED) +include_directories(${OpenCV_INCLUDE_DIRS}) + +# LevelDB +find_package(LevelDB REQUIRED) +include_directories(${LEVELDB_INCLUDE}) + +# LMDB +find_package(LMDB REQUIRED) +include_directories(${LMDB_INCLUDE_DIR}) + +# Boost +find_package(Boost 1.46 COMPONENTS system REQUIRED) +include_directories( ${Boost_INCLUDE_DIR} ) +link_directories( ${Boost_LIBRARY_DIRS} ) + +add_subdirectory(proto) + +# Recursively find source files + +# cuda sources +file(GLOB_RECURSE CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cu) + +# test sources +file(GLOB_RECURSE TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cpp) + +# all cpp sources +file(GLOB_RECURSE CPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + +# remove test sources from cpp sources +list(REMOVE_ITEM CPP_SOURCES ${TEST_SOURCES}) + +add_library(caffe ${CPP_SOURCES}) +cuda_add_library(caffe_cu ${CU_SOURCES}) + +# both depend on proto +add_dependencies(caffe proto) +add_dependencies(caffe_cu proto) + +target_link_libraries(caffe caffe_cu proto + ${GLOG_LIBRARIES} + ${CUDA_curand_LIBRARY} + ${HDF5_LIBRARIES} + ${OpenCV_LIBS} + ${LEVELDB_LIBS} + ${LMDB_LIBRARIES} + ${CUDA_CUBLAS_LIBRARIES} + ${BLAS_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) + +#set output directory +set_target_properties(caffe PROPERTIES + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib +) + +add_subdirectory(test) + +### Install ################################################################################# + +install(TARGETS caffe DESTINATION lib) diff --git a/src/caffe/proto/CMakeLists.txt b/src/caffe/proto/CMakeLists.txt new file mode 100644 index 00000000000..a4b2c00e393 --- /dev/null +++ b/src/caffe/proto/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 2.8) +project( Proto ) + +# Google Protocol Buffers +find_package( Protobuf REQUIRED ) + +# As of Ubuntu 14.04 protoc is no longer a part of libprotobuf-dev package and should be installed +# separately as in: sudo apt-get install protobuf-compiler +if(PROTOBUF_PROTOC_EXECUTABLE) + message(STATUS "Found PROTOBUF Compiler: ${PROTOBUF_PROTOC_EXECUTABLE}") +else() + message(FATAL_ERROR "Could not find PROTOBUF Compiler") +endif() + +include_directories(${PROTOBUF_INCLUDE_DIR}) +file(GLOB ProtoFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.proto") +PROTOBUF_GENERATE_CPP(ProtoSources ProtoHeaders ${ProtoFiles}) + +add_library(proto + ${ProtoSources} + ${ProtoHeaders} +) + +target_link_libraries(proto ${PROTOBUF_LIBRARIES}) + +# Copy proto headers to include/caffe/proto/ +foreach(header ${ProtoHeaders}) + + ADD_CUSTOM_COMMAND(TARGET proto + COMMAND cmake -E copy ${header} + ${Caffe_INCLUDE_DIRS}/caffe/proto/ + DEPENDS ${header} +) + +endforeach(header) diff --git a/src/caffe/proto/caffe_pretty_print.proto b/src/caffe/proto/caffe_pretty_print.proto index 225138a4274..6f0a5f6b8df 100644 --- a/src/caffe/proto/caffe_pretty_print.proto +++ b/src/caffe/proto/caffe_pretty_print.proto @@ -2,7 +2,7 @@ syntax = "proto2"; package caffe; -import "caffe/proto/caffe.proto"; +import "caffe.proto"; // A near-duplicate of NetParameter with fields re-numbered to beautify // automatic prototext dumps. The main practical purpose is to print inputs diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt new file mode 100644 index 00000000000..721df27d0f4 --- /dev/null +++ b/src/caffe/test/CMakeLists.txt @@ -0,0 +1,46 @@ +# +# +# All test files' names must begin with a "test_" prefix +# +# +cmake_minimum_required(VERSION 2.8) +project( Test ) + +# Set CUDA Device number and CMAKE_SOURCE_DIR +add_definitions(-DCMAKE_BUILD) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.in + ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.gen.cmake +) + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.in + ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.gen.cmake +) + +include_directories( + ${Caffe_SOURCE_DIR} +) + +set(TEST_MAIN test_caffe_main.cpp) +list(REMOVE_ITEM TEST_SOURCES ${TEST_MAIN}) + + +foreach(source ${TEST_SOURCES}) + + get_filename_component(name ${source} NAME_WE) + add_executable(${name}.test ${TEST_MAIN} ${source} ../blob.cpp) + target_link_libraries(${name}.test gtest caffe) + add_test(${name} ${name}.test) + + # output dir + set_target_properties(${name}.test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) + +endforeach() + +add_executable(test_all.test ${TEST_SOURCES} ${TEST_MAIN}) +target_link_libraries(test_all.test gtest caffe) + +# output dir +set_target_properties(test_all.test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) + diff --git a/src/caffe/test/cmake_test_defines.hpp.in b/src/caffe/test/cmake_test_defines.hpp.in new file mode 100644 index 00000000000..617968dfa9c --- /dev/null +++ b/src/caffe/test/cmake_test_defines.hpp.in @@ -0,0 +1,5 @@ + +#define CUDA_TEST_DEVICE @CUDA_TEST_DEVICE@ +#define CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@/src/" +#define Examples_SOURCE_DIR "@Examples_SOURCE_DIR@/" +#define CMAKE_EXT ".gen.cmake" \ No newline at end of file diff --git a/src/caffe/test/test_caffe_main.cpp b/src/caffe/test/test_caffe_main.cpp index df188fd319b..ad6e189a657 100644 --- a/src/caffe/test/test_caffe_main.cpp +++ b/src/caffe/test/test_caffe_main.cpp @@ -26,6 +26,10 @@ int main(int argc, char** argv) { device = atoi(argv[1]); cudaSetDevice(device); cout << "Setting to use device " << device << endl; + } else if (CUDA_TEST_DEVICE >= 0) { + + // Use the device assigned in build configuration; but with a lower priority + device = CUDA_TEST_DEVICE; } cudaGetDevice(&device); cout << "Current device id: " << device << endl; diff --git a/src/caffe/test/test_caffe_main.hpp b/src/caffe/test/test_caffe_main.hpp new file mode 100644 index 00000000000..76f50be83c0 --- /dev/null +++ b/src/caffe/test/test_caffe_main.hpp @@ -0,0 +1,29 @@ +// Copyright 2014 BVLC and contributors. + +// The main caffe test code. Your test cpp code should include this hpp +// to allow a main function to be compiled into the binary. +#ifndef CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ +#define CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ + +#include +#include +#include + +#include +#include + +using std::cout; +using std::endl; + +#ifdef CMAKE_BUILD + #include "cmake_test_defines.hpp.gen.cmake" +#else + #define CUDA_TEST_DEVICE -1 + #define CMAKE_SOURCE_DIR "src/" + #define Examples_SOURCE_DIR "examples/" + #define CMAKE_EXT "" +#endif + +int main(int argc, char** argv); + +#endif // CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ diff --git a/src/caffe/test/test_data/sample_data_list.txt.in b/src/caffe/test/test_data/sample_data_list.txt.in new file mode 100644 index 00000000000..9860ef583ab --- /dev/null +++ b/src/caffe/test/test_data/sample_data_list.txt.in @@ -0,0 +1,2 @@ +@CMAKE_SOURCE_DIR@/src/caffe/test/test_data/sample_data.h5 +@CMAKE_SOURCE_DIR@/src/caffe/test/test_data/sample_data_2_gzip.h5 \ No newline at end of file diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index 696165cdaa2..f3ddfcd9625 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -23,7 +23,7 @@ class HDF5OutputLayerTest : public MultiDeviceTest { protected: HDF5OutputLayerTest() : output_file_name_(tmpnam(NULL)), - input_file_name_("src/caffe/test/test_data/sample_data.h5"), + input_file_name_(CMAKE_SOURCE_DIR "caffe/test/test_data/sample_data.h5"), blob_data_(new Blob()), blob_label_(new Blob()), num_(5), diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index f903afb736f..1de82330b79 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -31,7 +31,7 @@ class HDF5DataLayerTest : public MultiDeviceTest { blob_top_vec_.push_back(blob_top_label_); // Check out generate_sample_data.py in the same directory. - filename = new string("src/caffe/test/test_data/sample_data_list.txt"); + filename = new string(CMAKE_SOURCE_DIR "caffe/test/test_data/sample_data_list.txt" CMAKE_EXT); LOG(INFO) << "Using sample HDF5 data file " << filename; } diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index 5232c1187c1..17d67bd13b3 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -37,7 +37,7 @@ class ImageDataLayerTest : public MultiDeviceTest { std::ofstream outfile(filename_->c_str(), std::ofstream::out); LOG(INFO) << "Using temporary file " << *filename_; for (int i = 0; i < 5; ++i) { - outfile << "examples/images/cat.jpg " << i; + outfile << Examples_SOURCE_DIR "images/cat.jpg " << i; } outfile.close(); } diff --git a/src/gtest/CMakeLists.txt b/src/gtest/CMakeLists.txt new file mode 100644 index 00000000000..82a4120ca3f --- /dev/null +++ b/src/gtest/CMakeLists.txt @@ -0,0 +1,6 @@ +project(gtest CXX C) +cmake_minimum_required(VERSION 2.6.2) + +add_library(gtest gtest-all.cpp) +add_library(gtest_main gtest_main.cc) +target_link_libraries(gtest_main gtest) \ No newline at end of file diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 00000000000..81ecf7cd41a --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,18 @@ +project( Tools ) + +# Find all source files +file(GLOB_RECURSE Tools_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + +# Build each source file independently +foreach(source ${Tools_SOURCES}) + get_filename_component(name ${source} NAME_WE) + add_executable(${name} ${source}) + target_link_libraries(${name} caffe) + +### Install ################################################################################# + + install(TARGETS ${name} DESTINATION tools) + + +endforeach(source) + From ed39454b8decee5b9278b94e25e4aedf147ee70d Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Tue, 1 Jul 2014 11:42:24 +0200 Subject: [PATCH 0482/2053] examples CMake lists --- examples/CMakeLists.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 examples/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 00000000000..1f13a0d9c75 --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,17 @@ +project( Examples ) + +file(GLOB_RECURSE Examples_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + +# message(${Examples_SOURCES}) +foreach(source ${Examples_SOURCES}) + # get file name + get_filename_component(name ${source} NAME_WE) + + #get folder name + get_filename_component(path ${source} PATH) + get_filename_component(folder ${path} NAME_WE) + + add_executable(${name} ${source}) + target_link_libraries(${name} caffe) + set_target_properties(${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${folder}) +endforeach(source) From bf55cb9a56bf707908e047c5a4bce33442b7224f Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Tue, 22 Jul 2014 14:44:19 +0200 Subject: [PATCH 0483/2053] fixed CMake dependant header file generation --- include/caffe/test/test_caffe_main.hpp | 9 +++++++ src/caffe/test/CMakeLists.txt | 37 +++++++++++++++++++++----- src/caffe/test/test_caffe_main.hpp | 29 -------------------- 3 files changed, 39 insertions(+), 36 deletions(-) delete mode 100644 src/caffe/test/test_caffe_main.hpp diff --git a/include/caffe/test/test_caffe_main.hpp b/include/caffe/test/test_caffe_main.hpp index 40b9effc5f1..e02e67ece98 100644 --- a/include/caffe/test/test_caffe_main.hpp +++ b/include/caffe/test/test_caffe_main.hpp @@ -14,6 +14,15 @@ using std::cout; using std::endl; +#ifdef CMAKE_BUILD + #include +#else + #define CUDA_TEST_DEVICE -1 + #define CMAKE_SOURCE_DIR "src/" + #define Examples_SOURCE_DIR "examples/" + #define CMAKE_EXT "" +#endif + int main(int argc, char** argv); namespace caffe { diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index 721df27d0f4..f64d5da0c8d 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -8,18 +8,41 @@ project( Test ) # Set CUDA Device number and CMAKE_SOURCE_DIR add_definitions(-DCMAKE_BUILD) -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.in - ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.gen.cmake -) -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.in - ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.gen.cmake +# Generate config files +set(IN_EXT .in) +set(GEN_EXT .gen.cmake) +set(TEST_DEFINES_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp) +set(TEST_DATA_FILE ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt) + +set(IN_FILES + ${TEST_DEFINES_FILE} + ${TEST_DATA_FILE} ) +foreach(in_file ${IN_FILES}) + + configure_file( + ${in_file}${IN_EXT} + ${in_file}${GEN_EXT} + ) + +endforeach() + + +#configure_file( +# ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.in +# ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.gen.cmake +#) +# +#configure_file( +# ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.in +# ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.gen.cmake +#) + include_directories( ${Caffe_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} ) set(TEST_MAIN test_caffe_main.cpp) diff --git a/src/caffe/test/test_caffe_main.hpp b/src/caffe/test/test_caffe_main.hpp deleted file mode 100644 index 76f50be83c0..00000000000 --- a/src/caffe/test/test_caffe_main.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 BVLC and contributors. - -// The main caffe test code. Your test cpp code should include this hpp -// to allow a main function to be compiled into the binary. -#ifndef CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ -#define CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ - -#include -#include -#include - -#include -#include - -using std::cout; -using std::endl; - -#ifdef CMAKE_BUILD - #include "cmake_test_defines.hpp.gen.cmake" -#else - #define CUDA_TEST_DEVICE -1 - #define CMAKE_SOURCE_DIR "src/" - #define Examples_SOURCE_DIR "examples/" - #define CMAKE_EXT "" -#endif - -int main(int argc, char** argv); - -#endif // CAFFE_TEST_TEST_CAFFE_MAIN_HPP_ From c357810c2eed2f677c2a9b22416460a4bca14470 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Wed, 23 Jul 2014 09:12:44 +0200 Subject: [PATCH 0484/2053] fixed lint issues --- src/caffe/test/test_caffe_main.cpp | 5 ++--- src/caffe/test/test_hdf5_output_layer.cpp | 3 ++- src/caffe/test/test_hdf5data_layer.cpp | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/caffe/test/test_caffe_main.cpp b/src/caffe/test/test_caffe_main.cpp index ad6e189a657..bff0c4ed20e 100644 --- a/src/caffe/test/test_caffe_main.cpp +++ b/src/caffe/test/test_caffe_main.cpp @@ -27,9 +27,8 @@ int main(int argc, char** argv) { cudaSetDevice(device); cout << "Setting to use device " << device << endl; } else if (CUDA_TEST_DEVICE >= 0) { - - // Use the device assigned in build configuration; but with a lower priority - device = CUDA_TEST_DEVICE; + // Use the device assigned in build configuration; but with a lower priority + device = CUDA_TEST_DEVICE; } cudaGetDevice(&device); cout << "Current device id: " << device << endl; diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index f3ddfcd9625..b2a511d1d09 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -23,7 +23,8 @@ class HDF5OutputLayerTest : public MultiDeviceTest { protected: HDF5OutputLayerTest() : output_file_name_(tmpnam(NULL)), - input_file_name_(CMAKE_SOURCE_DIR "caffe/test/test_data/sample_data.h5"), + input_file_name_( + CMAKE_SOURCE_DIR "caffe/test/test_data/sample_data.h5"), blob_data_(new Blob()), blob_label_(new Blob()), num_(5), diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index 1de82330b79..acca75b19b1 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -31,8 +31,9 @@ class HDF5DataLayerTest : public MultiDeviceTest { blob_top_vec_.push_back(blob_top_label_); // Check out generate_sample_data.py in the same directory. - filename = new string(CMAKE_SOURCE_DIR "caffe/test/test_data/sample_data_list.txt" CMAKE_EXT); - LOG(INFO) << "Using sample HDF5 data file " << filename; + filename = new string( + CMAKE_SOURCE_DIR "caffe/test/test_data/sample_data_list.txt" CMAKE_EXT); + LOG(INFO)<< "Using sample HDF5 data file " << filename; } virtual ~HDF5DataLayerTest() { From a2a4d636c9cb4a8f071b1703acfe0aeb6f8d7771 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Wed, 23 Jul 2014 09:41:36 +0200 Subject: [PATCH 0485/2053] cmake build configuration for travis-ci --- .travis.yml | 47 ++++++++++++++++++++++++---------- CMakeLists.txt | 5 ++-- CMakeScripts/FindSnappy.cmake | 33 ++++++++++++++++++++++++ python/CMakeLists.txt | 2 +- src/caffe/CMakeLists.txt | 10 +++++++- src/caffe/proto/CMakeLists.txt | 4 ++- src/caffe/test/CMakeLists.txt | 1 - 7 files changed, 81 insertions(+), 21 deletions(-) create mode 100644 CMakeScripts/FindSnappy.cmake diff --git a/.travis.yml b/.travis.yml index 7721de112e3..e5969764564 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,8 +17,12 @@ before_install: - sudo apt-get -y install wget git curl python-dev python-numpy libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc install: + # CMake 2.8.12 + - wget http://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz -O /tmp/cmake.tar.gz && tar -C /tmp -xvf /tmp/cmake.tar.gz && rm /tmp/cmake.tar.gz + - cd /tmp/cmake-2.8.12 && ./bootstrap --prefix=/usr && make -j4 && sudo make install -j4 && cd - #&& rm -r /tmp/cmake-2.8.12 + # - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - + - cd /tmp/glog-0.3.3 && ./configure && make -j4 && sudo make install -j4 && cd - - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1 && sudo make install && popd - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb - sudo apt-get -y update @@ -30,7 +34,7 @@ install: # manually since we did a partial installation.) - sudo ln -s /usr/local/cuda-6.0 /usr/local/cuda - curl https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -o /tmp/mdb.tar.gz && tar -C /tmp -xzvf /tmp/mdb.tar.gz && rm /tmp/mdb.tar.gz - - cd /tmp/mdb-mdb/libraries/liblmdb/ && make && sudo make install && cd - + - cd /tmp/mdb-mdb/libraries/liblmdb/ && make -j4 && sudo make install -j4 && cd - before_script: - mv Makefile.config.example Makefile.config @@ -38,19 +42,34 @@ before_script: - export NUM_THREADS=4 script: - # CPU-GPU: build only. - - export CPU_ONLY=0 - - make --keep-going --jobs=$NUM_THREADS all + # CMake build. + - mkdir build + - cd build + ## CPU-only build + #- cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. + #- make --keep-going --jobs=$NUM_THREADS + #- make clean + #- rm -rf * + ## GPU + CPU build + - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release .. + - make --keep-going --jobs=$NUM_THREADS - make clean - # CPU-only: comprehensive. - - export CPU_ONLY=1 - - make --keep-going --jobs=$NUM_THREADS all test warn lint - - make runtest - - make --jobs=$NUM_THREADS all - - make --jobs=$NUM_THREADS test - - make --jobs=$NUM_THREADS warn - - make --jobs=$NUM_THREADS lint - - make --jobs=$NUM_THREADS pycaffe + - cd .. + - rm -r build + +# # CPU-GPU: build only. +# - export CPU_ONLY=0 +# - make --keep-going --jobs=$NUM_THREADS all +# - make clean +# # CPU-only: comprehensive. +# - export CPU_ONLY=1 +# - make --keep-going --jobs=$NUM_THREADS all test warn lint +# - make runtest +# - make --jobs=$NUM_THREADS all +# - make --jobs=$NUM_THREADS test +# - make --jobs=$NUM_THREADS warn +# - make --jobs=$NUM_THREADS lint +# - make --jobs=$NUM_THREADS pycaffe notifications: # Emails are sent to the committer's git-configured email address by default, diff --git a/CMakeLists.txt b/CMakeLists.txt index cc50a3a141d..f65046d6998 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 2.8.8) project( Caffe ) ### Build Options ########################################################################## @@ -29,7 +29,7 @@ enable_testing() # Compiler Flags set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC) -set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} -O3) +set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} )#-O3) # Include Directories set(${PROJECT_NAME}_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include) @@ -43,7 +43,6 @@ set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeScripts) find_package(CUDA 5.5 REQUIRED) include_directories(${CUDA_INCLUDE_DIRS}) - ### Subdirectories ########################################################################## add_subdirectory(src/gtest) diff --git a/CMakeScripts/FindSnappy.cmake b/CMakeScripts/FindSnappy.cmake new file mode 100644 index 00000000000..d769b442812 --- /dev/null +++ b/CMakeScripts/FindSnappy.cmake @@ -0,0 +1,33 @@ +# Find the Snappy libraries +# +# The following variables are optionally searched for defaults +# Snappy_ROOT_DIR: Base directory where all Snappy components are found +# +# The following are set after configuration is done: +# Snappy_FOUND +# Snappy_INCLUDE_DIRS +# Snappy_LIBS + +find_path(SNAPPY_INCLUDE_DIR + NAMES snappy.h + HINTS ${SNAPPY_ROOT_DIR} + ${SNAPPY_ROOT_DIR}/include +) + +find_library(SNAPPY_LIBS + NAMES snappy + HINTS ${SNAPPY_ROOT_DIR} + ${SNAPPY_ROOT_DIR}/lib +) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Snappy + DEFAULT_MSG + SNAPPY_LIBS + SNAPPY_INCLUDE_DIR +) + +mark_as_advanced( + SNAPPY_LIBS + SNAPPY_INCLUDE_DIR +) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index e09257c5d7a..8642c39367a 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -5,7 +5,7 @@ find_package(PythonLibs REQUIRED) include_directories(${PYTHON_INCLUDE_DIRS}) # Boost.Python -find_package(Boost 1.49 COMPONENTS python REQUIRED) +find_package(Boost 1.46 COMPONENTS python REQUIRED) include_directories(${Boost_INCLUDE_DIRS}) file(GLOB_RECURSE Python_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index d953d0b2c10..300188e5b83 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -47,6 +47,14 @@ include_directories(${OpenCV_INCLUDE_DIRS}) # LevelDB find_package(LevelDB REQUIRED) include_directories(${LEVELDB_INCLUDE}) +if(LEVELDB_FOUND) + find_package(Snappy REQUIRED) + include_directories(${SNAPPY_INCLUDE_DIR}) + set(LEVELDB_LIBS + ${LEVELDB_LIBS} + ${SNAPPY_LIBS} + ) +endif() # LMDB find_package(LMDB REQUIRED) @@ -82,12 +90,12 @@ add_dependencies(caffe_cu proto) target_link_libraries(caffe caffe_cu proto ${GLOG_LIBRARIES} - ${CUDA_curand_LIBRARY} ${HDF5_LIBRARIES} ${OpenCV_LIBS} ${LEVELDB_LIBS} ${LMDB_LIBRARIES} ${CUDA_CUBLAS_LIBRARIES} + ${CUDA_curand_LIBRARY} ${BLAS_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ) diff --git a/src/caffe/proto/CMakeLists.txt b/src/caffe/proto/CMakeLists.txt index a4b2c00e393..186a856509b 100644 --- a/src/caffe/proto/CMakeLists.txt +++ b/src/caffe/proto/CMakeLists.txt @@ -1,4 +1,3 @@ -cmake_minimum_required(VERSION 2.8) project( Proto ) # Google Protocol Buffers @@ -23,6 +22,9 @@ add_library(proto target_link_libraries(proto ${PROTOBUF_LIBRARIES}) +# Create proto include directory +file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/include/caffe/proto) + # Copy proto headers to include/caffe/proto/ foreach(header ${ProtoHeaders}) diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index f64d5da0c8d..4eb9aa30119 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -3,7 +3,6 @@ # All test files' names must begin with a "test_" prefix # # -cmake_minimum_required(VERSION 2.8) project( Test ) # Set CUDA Device number and CMAKE_SOURCE_DIR From 68ae1ab7f2f486d82c9d683d9e1db21ecd329505 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Thu, 24 Jul 2014 13:44:05 +0200 Subject: [PATCH 0486/2053] cmake from binaries --- .travis.yml | 5 +++++ CMakeLists.txt | 1 + 2 files changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index e5969764564..f6b21136cf9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,13 @@ before_install: install: # CMake 2.8.12 +<<<<<<< HEAD - wget http://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz -O /tmp/cmake.tar.gz && tar -C /tmp -xvf /tmp/cmake.tar.gz && rm /tmp/cmake.tar.gz - cd /tmp/cmake-2.8.12 && ./bootstrap --prefix=/usr && make -j4 && sudo make install -j4 && cd - #&& rm -r /tmp/cmake-2.8.12 +======= + - wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2-Linux-i386.tar.gz -O /tmp/cmake.tar.gz && tar -C /tmp -xvf /tmp/cmake.tar.gz && rm /tmp/cmake.tar.gz + - cd /tmp/cmake-2.8.12.2-Linux-i386 && sudo cp * /usr/ -r && cd - && rm -r /tmp/cmake-2.8.12.2-Linux-i386 +>>>>>>> cmake from binaries # - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - cd /tmp/glog-0.3.3 && ./configure && make -j4 && sudo make install -j4 && cd - diff --git a/CMakeLists.txt b/CMakeLists.txt index f65046d6998..b7db2c98fc7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,7 @@ project( Caffe ) ### Build Options ########################################################################## +option(CPU_ONLY "Build Caffe without GPU support" OFF) option(BUILD_PYTHON "Build Python wrapper" OFF) option(BUILD_MATLAB "Build Matlab wrapper" OFF) option(BUILD_EXAMPLES "Build examples" ON) From 75e3f56b98bbe6480277ad8ee24a99df8a9f56f0 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Thu, 24 Jul 2014 14:31:52 +0200 Subject: [PATCH 0487/2053] restoring travis.yml --- .travis.yml | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index f6b21136cf9..da60258fae8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,31 +50,25 @@ script: # CMake build. - mkdir build - cd build - ## CPU-only build - #- cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. - #- make --keep-going --jobs=$NUM_THREADS - #- make clean - #- rm -rf * - ## GPU + CPU build - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release .. - make --keep-going --jobs=$NUM_THREADS - make clean - cd .. - rm -r build -# # CPU-GPU: build only. -# - export CPU_ONLY=0 -# - make --keep-going --jobs=$NUM_THREADS all -# - make clean -# # CPU-only: comprehensive. -# - export CPU_ONLY=1 -# - make --keep-going --jobs=$NUM_THREADS all test warn lint -# - make runtest -# - make --jobs=$NUM_THREADS all -# - make --jobs=$NUM_THREADS test -# - make --jobs=$NUM_THREADS warn -# - make --jobs=$NUM_THREADS lint -# - make --jobs=$NUM_THREADS pycaffe + # CPU-GPU: build only. + - export CPU_ONLY=0 + - make --keep-going --jobs=$NUM_THREADS all + - make clean + # CPU-only: comprehensive. + - export CPU_ONLY=1 + - make --keep-going --jobs=$NUM_THREADS all test warn lint + - make runtest + - make --jobs=$NUM_THREADS all + - make --jobs=$NUM_THREADS test + - make --jobs=$NUM_THREADS warn + - make --jobs=$NUM_THREADS lint + - make --jobs=$NUM_THREADS pycaffe notifications: # Emails are sent to the committer's git-configured email address by default, From edc493a3e4b221c7114c9c64e94bfc3b8c85e435 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Thu, 24 Jul 2014 13:58:37 +0200 Subject: [PATCH 0488/2053] cpu only --- CMakeLists.txt | 11 ++++++++-- src/caffe/CMakeLists.txt | 46 +++++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b7db2c98fc7..3158cfff2b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,11 @@ set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC) set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} )#-O3) +# Global Definitions +if(CPU_ONLY) + add_definitions(-DCPU_ONLY) +endif() + # Include Directories set(${PROJECT_NAME}_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include) include_directories(${${PROJECT_NAME}_INCLUDE_DIRS}) @@ -41,8 +46,10 @@ include_directories(${CMAKE_SOURCE_DIR}/src) set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeScripts) # CUDA is required globally -find_package(CUDA 5.5 REQUIRED) -include_directories(${CUDA_INCLUDE_DIRS}) +if(NOT CPU_ONLY) + find_package(CUDA 5.5 REQUIRED) + include_directories(${CUDA_INCLUDE_DIRS}) +endif() ### Subdirectories ########################################################################## diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index 300188e5b83..8b8542d8d30 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -7,14 +7,6 @@ find_package(Threads REQUIRED) find_package(Glog REQUIRED) include_directories(${GLOG_INCLUDE_DIRS}) -# CUDA -set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} - -gencode arch=compute_20,code=sm_20 - -gencode arch=compute_20,code=sm_21 - -gencode arch=compute_30,code=sm_30 - -gencode arch=compute_35,code=sm_35 -) - # BLAS if(BLAS STREQUAL "atlas") @@ -68,34 +60,44 @@ link_directories( ${Boost_LIBRARY_DIRS} ) add_subdirectory(proto) # Recursively find source files - -# cuda sources -file(GLOB_RECURSE CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cu) - -# test sources +## test sources file(GLOB_RECURSE TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cpp) -# all cpp sources +## all cpp sources file(GLOB_RECURSE CPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) -# remove test sources from cpp sources +## remove test sources from cpp sources list(REMOVE_ITEM CPP_SOURCES ${TEST_SOURCES}) add_library(caffe ${CPP_SOURCES}) -cuda_add_library(caffe_cu ${CU_SOURCES}) - # both depend on proto add_dependencies(caffe proto) -add_dependencies(caffe_cu proto) -target_link_libraries(caffe caffe_cu proto +# CUDA +if(NOT CPU_ONLY) + set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} + -gencode arch=compute_20,code=sm_20 + -gencode arch=compute_20,code=sm_21 + -gencode arch=compute_30,code=sm_30 + -gencode arch=compute_35,code=sm_35 + ) + + # cuda sources + file(GLOB_RECURSE CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cu) + cuda_add_library(caffe_cu ${CU_SOURCES}) + add_dependencies(caffe_cu proto) + target_link_libraries(caffe caffe_cu + ${CUDA_CUBLAS_LIBRARIES} + ${CUDA_curand_LIBRARY} + ) +endif() + +target_link_libraries(caffe proto ${GLOG_LIBRARIES} ${HDF5_LIBRARIES} ${OpenCV_LIBS} ${LEVELDB_LIBS} - ${LMDB_LIBRARIES} - ${CUDA_CUBLAS_LIBRARIES} - ${CUDA_curand_LIBRARY} + ${LMDB_LIBRARIES} ${BLAS_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ) From f83407d4c0abc8b9cc4180be8947cdd03ebd3926 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Thu, 24 Jul 2014 15:27:53 +0200 Subject: [PATCH 0489/2053] cpu only build works --- CMakeLists.txt | 5 ++++- examples/CMakeLists.txt | 1 - src/caffe/test/CMakeLists.txt | 26 +++++++++++--------------- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3158cfff2b3..5d8e82daee0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,8 @@ endif() ### Configuration ########################################################################### # Enable CTest from top build directory -enable_testing() +#disable ctest +#enable_testing() # Compiler Flags set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall) @@ -60,6 +61,8 @@ add_subdirectory(tools) if(BUILD_EXAMPLES) message(STATUS "Examples enabled") add_subdirectory(examples) +else() + set(Examples_SOURCE_DIR ${CMAKE_SOURCE_DIR}/examples) endif() if(BUILD_PYTHON) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 1f13a0d9c75..ec3cc470fb4 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -2,7 +2,6 @@ project( Examples ) file(GLOB_RECURSE Examples_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) -# message(${Examples_SOURCES}) foreach(source ${Examples_SOURCES}) # get file name get_filename_component(name ${source} NAME_WE) diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index 4eb9aa30119..52c146f5f89 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -28,17 +28,6 @@ foreach(in_file ${IN_FILES}) endforeach() - -#configure_file( -# ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.in -# ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp.gen.cmake -#) -# -#configure_file( -# ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.in -# ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt.gen.cmake -#) - include_directories( ${Caffe_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} @@ -53,16 +42,23 @@ foreach(source ${TEST_SOURCES}) get_filename_component(name ${source} NAME_WE) add_executable(${name}.test ${TEST_MAIN} ${source} ../blob.cpp) target_link_libraries(${name}.test gtest caffe) - add_test(${name} ${name}.test) + #disable ctest + #add_test(${name} ${name}.test) # output dir set_target_properties(${name}.test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) endforeach() -add_executable(test_all.test ${TEST_SOURCES} ${TEST_MAIN}) -target_link_libraries(test_all.test gtest caffe) +add_executable(test ${TEST_SOURCES} ${TEST_MAIN}) +target_link_libraries(test gtest caffe) +# Test command +set(TEST_ARGS --gtest_shuffle) +if(CPU_ONLY) + set(TEST_ARGS ${TEST_ARGS} --gtest_filter="-*GPU*") +endif() +add_custom_command(TARGET test POSTBUILD COMMAND test ${TEST_ARGS}) # output dir -set_target_properties(test_all.test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) +set_target_properties(test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) From d69b0be45b33d82d622c58afd2d0e0ff993ca626 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Thu, 24 Jul 2014 15:37:26 +0200 Subject: [PATCH 0490/2053] enable both GPU and CPU builds + testing in travis --- .travis.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index da60258fae8..1883c086da4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,9 +50,16 @@ script: # CMake build. - mkdir build - cd build + ## CPU-GPU build - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release .. - make --keep-going --jobs=$NUM_THREADS - - make clean + - make clean && rm -rf * + ## CPU-only build + - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. + - make --keep-going --jobs=$NUM_THREADS + - cd test && ./test --gtest_shuffle --gtest_filter="-*GPU*" && cd - + - make clean && rm -rf * + ## Cleaning - cd .. - rm -r build From 15f0a5ed52a7f6858ba9b7817b229c493e7b12f4 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Fri, 25 Jul 2014 09:38:42 +0200 Subject: [PATCH 0491/2053] Examples_SOURCE_DIR cmake variable bugfix * it was set only when BUILD_EXAMPLES==OFF --- .travis.yml | 11 ++++++----- CMakeLists.txt | 2 -- src/caffe/test/cmake_test_defines.hpp.in | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1883c086da4..26d435b28f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -50,11 +50,11 @@ script: # CMake build. - mkdir build - cd build - ## CPU-GPU build + ## CPU-GPU: build only. - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release .. - make --keep-going --jobs=$NUM_THREADS - make clean && rm -rf * - ## CPU-only build + ## CPU-only: comprehensive - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. - make --keep-going --jobs=$NUM_THREADS - cd test && ./test --gtest_shuffle --gtest_filter="-*GPU*" && cd - @@ -62,12 +62,13 @@ script: ## Cleaning - cd .. - rm -r build - - # CPU-GPU: build only. + + # Make build + ## CPU-GPU: build only. - export CPU_ONLY=0 - make --keep-going --jobs=$NUM_THREADS all - make clean - # CPU-only: comprehensive. + ## CPU-only: comprehensive. - export CPU_ONLY=1 - make --keep-going --jobs=$NUM_THREADS all test warn lint - make runtest diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d8e82daee0..0cf08fe0900 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,8 +61,6 @@ add_subdirectory(tools) if(BUILD_EXAMPLES) message(STATUS "Examples enabled") add_subdirectory(examples) -else() - set(Examples_SOURCE_DIR ${CMAKE_SOURCE_DIR}/examples) endif() if(BUILD_PYTHON) diff --git a/src/caffe/test/cmake_test_defines.hpp.in b/src/caffe/test/cmake_test_defines.hpp.in index 617968dfa9c..2d67df4ac39 100644 --- a/src/caffe/test/cmake_test_defines.hpp.in +++ b/src/caffe/test/cmake_test_defines.hpp.in @@ -1,5 +1,5 @@ #define CUDA_TEST_DEVICE @CUDA_TEST_DEVICE@ #define CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@/src/" -#define Examples_SOURCE_DIR "@Examples_SOURCE_DIR@/" +#define Examples_SOURCE_DIR "@CMAKE_SOURCE_DIR@/examples/" #define CMAKE_EXT ".gen.cmake" \ No newline at end of file From bad9d1ea0dddf2d639ca98d93a57692b92976de5 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Fri, 25 Jul 2014 12:22:00 +0200 Subject: [PATCH 0492/2053] added proper 'runtest' target --- .travis.yml | 2 +- CMakeLists.txt | 5 ---- src/caffe/test/CMakeLists.txt | 48 +++++++++++++++++------------------ 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/.travis.yml b/.travis.yml index 26d435b28f2..e8e9c8a3526 100644 --- a/.travis.yml +++ b/.travis.yml @@ -57,7 +57,7 @@ script: ## CPU-only: comprehensive - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. - make --keep-going --jobs=$NUM_THREADS - - cd test && ./test --gtest_shuffle --gtest_filter="-*GPU*" && cd - + - make runtest --keep-going --jobs=$NUM_THREADS - make clean && rm -rf * ## Cleaning - cd .. diff --git a/CMakeLists.txt b/CMakeLists.txt index 0cf08fe0900..7bc6d07bc2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,11 +23,6 @@ if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) endif() ### Configuration ########################################################################### - -# Enable CTest from top build directory -#disable ctest -#enable_testing() - # Compiler Flags set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC) diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index 52c146f5f89..f916ac0b0dd 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -5,27 +5,29 @@ # project( Test ) -# Set CUDA Device number and CMAKE_SOURCE_DIR -add_definitions(-DCMAKE_BUILD) +# Configuration +set(TEST_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) # test executables are going to be placed there +set(TEST_EXT .bin) # test executable extension +set(ALL_TEST test${TEST_EXT}) # name of an executable comprising of all tests +set(RUN_TEST runtest) # dummy target for running tests # Generate config files -set(IN_EXT .in) -set(GEN_EXT .gen.cmake) +add_definitions(-DCMAKE_BUILD) # definition needed in order to include CMake's generated files +set(IN_EXT .in) # generator input file extension +set(GEN_EXT .gen.cmake) # generated output file extension set(TEST_DEFINES_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp) set(TEST_DATA_FILE ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt) -set(IN_FILES +set(IN_FILES # generator input files ${TEST_DEFINES_FILE} ${TEST_DATA_FILE} ) -foreach(in_file ${IN_FILES}) - +foreach(in_file ${IN_FILES}) configure_file( ${in_file}${IN_EXT} ${in_file}${GEN_EXT} - ) - + ) endforeach() include_directories( @@ -36,29 +38,27 @@ include_directories( set(TEST_MAIN test_caffe_main.cpp) list(REMOVE_ITEM TEST_SOURCES ${TEST_MAIN}) - +# Build each test separately foreach(source ${TEST_SOURCES}) - get_filename_component(name ${source} NAME_WE) - add_executable(${name}.test ${TEST_MAIN} ${source} ../blob.cpp) - target_link_libraries(${name}.test gtest caffe) - #disable ctest - #add_test(${name} ${name}.test) - + set(TEST_NAME ${name}${TEST_EXT}) + add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_MAIN} ${source} ../blob.cpp) + target_link_libraries(${TEST_NAME} gtest caffe) # output dir - set_target_properties(${name}.test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) - + set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) + set(TEST_TARGETS ${TEST_TARGETS} ${TEST_NAME}) endforeach() -add_executable(test ${TEST_SOURCES} ${TEST_MAIN}) -target_link_libraries(test gtest caffe) +# Build a compound test excluded from the ALL target +add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_SOURCES} ${TEST_MAIN}) +target_link_libraries(${ALL_TEST} gtest caffe) +add_dependencies(${ALL_TEST} ${TEST_TARGETS}) +# output dir +set_target_properties(${ALL_TEST} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIRECTORY}) # Test command set(TEST_ARGS --gtest_shuffle) if(CPU_ONLY) set(TEST_ARGS ${TEST_ARGS} --gtest_filter="-*GPU*") endif() -add_custom_command(TARGET test POSTBUILD COMMAND test ${TEST_ARGS}) - -# output dir -set_target_properties(test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) +add_custom_target(${RUN_TEST} COMMAND ${ALL_TEST} ${TEST_ARGS}) From f2f3b4c71210958125d4945442641e0305fbeba9 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Mon, 28 Jul 2014 14:01:45 +0200 Subject: [PATCH 0493/2053] Added lint target --- .travis.yml | 1 + CMakeLists.txt | 16 +++++++++++++- CMakeScripts/lint.cmake | 48 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 CMakeScripts/lint.cmake diff --git a/.travis.yml b/.travis.yml index e8e9c8a3526..c94d9cdebc1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -58,6 +58,7 @@ script: - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. - make --keep-going --jobs=$NUM_THREADS - make runtest --keep-going --jobs=$NUM_THREADS + - make lint --jobs=$NUM_THREADS - make clean && rm -rf * ## Cleaning - cd .. diff --git a/CMakeLists.txt b/CMakeLists.txt index 7bc6d07bc2f..8df7412b2cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,8 +38,11 @@ set(${PROJECT_NAME}_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include) include_directories(${${PROJECT_NAME}_INCLUDE_DIRS}) include_directories(${CMAKE_SOURCE_DIR}/src) +# CMake Scripts dir +set(CMAKE_SCRIPT_DIR ${CMAKE_SOURCE_DIR}/CMakeScripts) + # CMake module path for custom module finding -set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/CMakeScripts) +set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SCRIPT_DIR}) # CUDA is required globally if(NOT CPU_ONLY) @@ -68,8 +71,19 @@ if(BUILD_MATLAB) add_subdirectory(matlab) endif() +### Lint Target Setup ########################################################################## + +set(LINT_TARGET lint) +set(LINT_SCRIPT ${CMAKE_SCRIPT_DIR}/lint.cmake) +add_custom_target( + ${LINT_TARGET} + COMMAND ${CMAKE_COMMAND} -P ${LINT_SCRIPT} +) + ### Install ################################################################################# # Install Includes file(GLOB folders ${${PROJECT_NAME}_INCLUDE_DIRS}/*) install(DIRECTORY ${folders} DESTINATION include) + + diff --git a/CMakeScripts/lint.cmake b/CMakeScripts/lint.cmake new file mode 100644 index 00000000000..04df3409e84 --- /dev/null +++ b/CMakeScripts/lint.cmake @@ -0,0 +1,48 @@ + +set(CMAKE_SOURCE_DIR ../) +set(LINT_COMMAND ${CMAKE_SOURCE_DIR}/scripts/cpp_lint.py) +set(SRC_FILE_EXTENSIONS h hpp hu c cpp cu cc) +set(EXCLUDE_FILE_EXTENSTIONS pb.h pb.cc) +set(LINT_DIRS include src/caffe examples tools python matlab) + +# find all files of interest +foreach(ext ${SRC_FILE_EXTENSIONS}) + foreach(dir ${LINT_DIRS}) + file(GLOB_RECURSE FOUND_FILES ${CMAKE_SOURCE_DIR}/${dir}/*.${ext}) + set(LINT_SOURCES ${LINT_SOURCES} ${FOUND_FILES}) + endforeach() +endforeach() + +# find all files that should be excluded +foreach(ext ${EXCLUDE_FILE_EXTENSTIONS}) + file(GLOB_RECURSE FOUND_FILES ${CMAKE_SOURCE_DIR}/*.${ext}) + set(EXCLUDED_FILES ${EXCLUDED_FILES} ${FOUND_FILES}) +endforeach() + +# exclude generated pb files +list(REMOVE_ITEM LINT_SOURCES ${EXCLUDED_FILES}) + +execute_process( + COMMAND ${LINT_COMMAND} ${LINT_SOURCES} + ERROR_VARIABLE LINT_OUTPUT + ERROR_STRIP_TRAILING_WHITESPACE +) + +string(REPLACE "\n" ";" LINT_OUTPUT ${LINT_OUTPUT}) + +list(GET LINT_OUTPUT -1 LINT_RESULT) +list(REMOVE_AT LINT_OUTPUT -1) +string(REPLACE " " ";" LINT_RESULT ${LINT_RESULT}) +list(GET LINT_RESULT -1 NUM_ERRORS) +if(NUM_ERRORS GREATER 0) + foreach(msg ${LINT_OUTPUT}) + string(FIND ${msg} "Done" result) + if(result LESS 0) + message(STATUS ${msg}) + endif() + endforeach() + message(FATAL_ERROR "Lint found ${NUM_ERRORS} errors!") +else() + message(STATUS "Lint did not find any errors!") +endif() + From 9f9b013813dc02c0ab86043e0b7a385c69e1b4f7 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek Date: Tue, 29 Jul 2014 10:40:40 +0200 Subject: [PATCH 0494/2053] added gflags + bugfixes + rebase on bvlc/caffe * added gflags requirement in CMake * fixed a bug that linked some tests into caffe lib * renamed tools/caffe due to conflicting target names with caffe lib * rebased onto bvlc/caffe --- .travis.yml | 9 ++---- CMakeLists.txt | 5 +-- CMakeScripts/FindGFlags.cmake | 48 +++++++++++++++++++++++++++++ src/caffe/CMakeLists.txt | 11 +++++-- src/caffe/test/CMakeLists.txt | 10 ++++-- tools/{caffe.cpp => caffe_tool.cpp} | 0 6 files changed, 69 insertions(+), 14 deletions(-) create mode 100644 CMakeScripts/FindGFlags.cmake rename tools/{caffe.cpp => caffe_tool.cpp} (100%) diff --git a/.travis.yml b/.travis.yml index c94d9cdebc1..fd82c99f308 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,13 +18,8 @@ before_install: install: # CMake 2.8.12 -<<<<<<< HEAD - - wget http://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz -O /tmp/cmake.tar.gz && tar -C /tmp -xvf /tmp/cmake.tar.gz && rm /tmp/cmake.tar.gz - - cd /tmp/cmake-2.8.12 && ./bootstrap --prefix=/usr && make -j4 && sudo make install -j4 && cd - #&& rm -r /tmp/cmake-2.8.12 -======= - - wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2-Linux-i386.tar.gz -O /tmp/cmake.tar.gz && tar -C /tmp -xvf /tmp/cmake.tar.gz && rm /tmp/cmake.tar.gz + - wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2-Linux-i386.tar.gz -O /tmp/cmake.tar.gz && tar -C /tmp -xvf /tmp/cmake.tar.gz && rm /tmp/cmake.tar.gz - cd /tmp/cmake-2.8.12.2-Linux-i386 && sudo cp * /usr/ -r && cd - && rm -r /tmp/cmake-2.8.12.2-Linux-i386 ->>>>>>> cmake from binaries # - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - cd /tmp/glog-0.3.3 && ./configure && make -j4 && sudo make install -j4 && cd - @@ -63,7 +58,7 @@ script: ## Cleaning - cd .. - rm -r build - + # Make build ## CPU-GPU: build only. - export CPU_ONLY=0 diff --git a/CMakeLists.txt b/CMakeLists.txt index 8df7412b2cd..64250eea0f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,8 +25,9 @@ endif() ### Configuration ########################################################################### # Compiler Flags set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall) -set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC) -set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} )#-O3) +set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} )#set global flags here) +set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} )#set debug flags here) +set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} )#set release flags here) # Global Definitions if(CPU_ONLY) diff --git a/CMakeScripts/FindGFlags.cmake b/CMakeScripts/FindGFlags.cmake new file mode 100644 index 00000000000..f93c57136a1 --- /dev/null +++ b/CMakeScripts/FindGFlags.cmake @@ -0,0 +1,48 @@ +# - Try to find GFLAGS +# +# The following variables are optionally searched for defaults +# GFLAGS_ROOT_DIR: Base directory where all GFLAGS components are found +# +# The following are set after configuration is done: +# GFLAGS_FOUND +# GFLAGS_INCLUDE_DIRS +# GFLAGS_LIBRARIES +# GFLAGS_LIBRARYRARY_DIRS + +include(FindPackageHandleStandardArgs) + +set(GFLAGS_ROOT_DIR "" CACHE PATH "Folder contains Gflags") + +# We are testing only a couple of files in the include directories +if(WIN32) + find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h + PATHS ${GFLAGS_ROOT_DIR}/src/windows) +else() + find_path(GFLAGS_INCLUDE_DIR gflags/gflags.h + PATHS ${GFLAGS_ROOT_DIR}) +endif() + +if(MSVC) + find_library(GFLAGS_LIBRARY_RELEASE + NAMES libgflags + PATHS ${GFLAGS_ROOT_DIR} + PATH_SUFFIXES Release) + + find_library(GFLAGS_LIBRARY_DEBUG + NAMES libgflags-debug + PATHS ${GFLAGS_ROOT_DIR} + PATH_SUFFIXES Debug) + + set(GFLAGS_LIBRARY optimized ${GFLAGS_LIBRARY_RELEASE} debug ${GFLAGS_LIBRARY_DEBUG}) +else() + find_library(GFLAGS_LIBRARY gflags) +endif() + +find_package_handle_standard_args(GFLAGS DEFAULT_MSG + GFLAGS_INCLUDE_DIR GFLAGS_LIBRARY) + + +if(GFLAGS_FOUND) + set(GFLAGS_INCLUDE_DIRS ${GFLAGS_INCLUDE_DIR}) + set(GFLAGS_LIBRARIES ${GFLAGS_LIBRARY}) +endif() diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index 8b8542d8d30..4fd170a24db 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -7,6 +7,10 @@ find_package(Threads REQUIRED) find_package(Glog REQUIRED) include_directories(${GLOG_INCLUDE_DIRS}) +# Google-gflags +find_package(GFlags REQUIRED) +include_directories(${GFLAGS_INCLUDE_DIRS}) + # BLAS if(BLAS STREQUAL "atlas") @@ -61,13 +65,13 @@ add_subdirectory(proto) # Recursively find source files ## test sources -file(GLOB_RECURSE TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cpp) +file(GLOB_RECURSE TEST_CPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cpp) ## all cpp sources file(GLOB_RECURSE CPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) ## remove test sources from cpp sources -list(REMOVE_ITEM CPP_SOURCES ${TEST_SOURCES}) +list(REMOVE_ITEM CPP_SOURCES ${TEST_CPP_SOURCES}) add_library(caffe ${CPP_SOURCES}) # both depend on proto @@ -84,6 +88,8 @@ if(NOT CPU_ONLY) # cuda sources file(GLOB_RECURSE CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cu) + file(GLOB_RECURSE TEST_CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cu) + list(REMOVE_ITEM CU_SOURCES ${TEST_CU_SOURCES}) cuda_add_library(caffe_cu ${CU_SOURCES}) add_dependencies(caffe_cu proto) target_link_libraries(caffe caffe_cu @@ -94,6 +100,7 @@ endif() target_link_libraries(caffe proto ${GLOG_LIBRARIES} + ${GFLAGS_LIBRARIES} ${HDF5_LIBRARIES} ${OpenCV_LIBS} ${LEVELDB_LIBS} diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index f916ac0b0dd..cbad0ccdeee 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -36,10 +36,14 @@ include_directories( ) set(TEST_MAIN test_caffe_main.cpp) -list(REMOVE_ITEM TEST_SOURCES ${TEST_MAIN}) +list(REMOVE_ITEM TEST_CPP_SOURCES ${TEST_MAIN}) + +if(NOT CPU_ONLY) + set(TEST_CPP_SOURCES ${TEST_CPP_SOURCES} ${TEST_CU_SOURCES}) +endif() # Build each test separately -foreach(source ${TEST_SOURCES}) +foreach(source ${TEST_CPP_SOURCES}) get_filename_component(name ${source} NAME_WE) set(TEST_NAME ${name}${TEST_EXT}) add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_MAIN} ${source} ../blob.cpp) @@ -50,7 +54,7 @@ foreach(source ${TEST_SOURCES}) endforeach() # Build a compound test excluded from the ALL target -add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_SOURCES} ${TEST_MAIN}) +add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_CPP_SOURCES} ${TEST_MAIN}) target_link_libraries(${ALL_TEST} gtest caffe) add_dependencies(${ALL_TEST} ${TEST_TARGETS}) # output dir diff --git a/tools/caffe.cpp b/tools/caffe_tool.cpp similarity index 100% rename from tools/caffe.cpp rename to tools/caffe_tool.cpp From fca1e623023b4b8396e5de44c9bd115f6fc0f307 Mon Sep 17 00:00:00 2001 From: bhack Date: Tue, 29 Jul 2014 20:25:50 +0200 Subject: [PATCH 0495/2053] Add ppa for CMake for fix 32bit precompiled cmake on 64bit --- .travis.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index fd82c99f308..37864c16423 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,17 +10,15 @@ compiler: # building on Linux.) # - clang + before_install: - echo $LANG - echo $LC_ALL + - sudo add-apt-repository ppa:ubuntu-sdk-team/ppa -y - sudo apt-get -y update - - sudo apt-get -y install wget git curl python-dev python-numpy libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc + - sudo apt-get -y install wget git curl python-dev python-numpy libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc cmake install: - # CMake 2.8.12 - - wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2-Linux-i386.tar.gz -O /tmp/cmake.tar.gz && tar -C /tmp -xvf /tmp/cmake.tar.gz && rm /tmp/cmake.tar.gz - - cd /tmp/cmake-2.8.12.2-Linux-i386 && sudo cp * /usr/ -r && cd - && rm -r /tmp/cmake-2.8.12.2-Linux-i386 - # - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - cd /tmp/glog-0.3.3 && ./configure && make -j4 && sudo make install -j4 && cd - - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1 && sudo make install && popd From db211a27fd811f827ffb684f5f4e4d3f8c94a262 Mon Sep 17 00:00:00 2001 From: bhack Date: Wed, 30 Jul 2014 01:15:39 +0200 Subject: [PATCH 0496/2053] Reduce packages --- .travis.yml | 2 +- src/caffe/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 37864c16423..baed23ccc40 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,7 +16,7 @@ before_install: - echo $LC_ALL - sudo add-apt-repository ppa:ubuntu-sdk-team/ppa -y - sudo apt-get -y update - - sudo apt-get -y install wget git curl python-dev python-numpy libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc cmake + - sudo apt-get -y install wget git curl python-dev python-numpy libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-dev libboost-system-dev libboost-python-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc cmake install: - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index 4fd170a24db..ec756bede71 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -37,7 +37,7 @@ find_package(HDF5 COMPONENTS HL REQUIRED) include_directories(${HDF5_INCLUDE_DIRS}) # OpenCV -find_package(OpenCV COMPONENTS core highgui imgproc REQUIRED) +find_package(OpenCV REQUIRED core highgui imgproc) include_directories(${OpenCV_INCLUDE_DIRS}) # LevelDB From f135665a205490540721471dc4c5ea54cb3dc22f Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sat, 16 Aug 2014 23:47:25 -0700 Subject: [PATCH 0497/2053] [docs] CMake build steps and Ubuntu 12.04 install instructions --- docs/installation.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/installation.md b/docs/installation.md index ff0760dd060..c2bd64d866e 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -210,6 +210,27 @@ Be sure to set your MATLAB and Python paths in `Makefile.config` first! Now that you have installed Caffe, check out the [MNIST demo](mnist.html) and the pretrained [ImageNet example](imagenet.html). +### Compilation using CMake (beta) + +In lieu of manually editing `Makefile.config` to tell Caffe where dependencies are located, Caffe also provides a CMake-based build system (currently in "beta"). +It requires CMake version >= 2.8.8. +The basic installation steps are as follows: + + mkdir build + cd build + cmake .. + make all + make runtest + +#### Ubuntu 12.04 + +Note that in Ubuntu 12.04, Aptitude will install version CMake 2.8.7 by default, which is not supported by Caffe's CMake build (requires at least 2.8.8). +As a workaround, if you are using Ubuntu 12.04 you can try the following steps to install (or upgrade to) CMake 2.8.9: + + sudo add-apt-repository ppa:ubuntu-sdk-team/ppa -y + sudo apt-get -y update + sudo apt-get install cmake + ## Hardware Questions **Laboratory Tested Hardware**: Berkeley Vision runs Caffe with K40s, K20s, and Titans including models at ImageNet/ILSVRC scale. We also run on GTX series cards and GPU-equipped MacBook Pros. We have not encountered any trouble in-house with devices with CUDA capability >= 3.0. All reported hardware issues thus-far have been due to GPU configuration, overheating, and the like. From f923a242733733a159be2d46e1e94e77419b763e Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 17 Aug 2014 00:03:28 -0700 Subject: [PATCH 0498/2053] .travis.yml and .gitignore: various minor cleanup --- .gitignore | 1 - .travis.yml | 44 ++++++++++++++++++++++---------------------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index c1989306c27..d162cb42bb0 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,5 @@ _site # Eclipse Project settings *.*project - # CMake generated files *.gen.cmake diff --git a/.travis.yml b/.travis.yml index baed23ccc40..ed021b61fda 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,17 +10,18 @@ compiler: # building on Linux.) # - clang - before_install: - echo $LANG - echo $LC_ALL + - export NUM_THREADS=4 + - alias make="make --jobs=$NUM_THREADS" - sudo add-apt-repository ppa:ubuntu-sdk-team/ppa -y - sudo apt-get -y update - sudo apt-get -y install wget git curl python-dev python-numpy libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-dev libboost-system-dev libboost-python-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc cmake install: - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - - cd /tmp/glog-0.3.3 && ./configure && make -j4 && sudo make install -j4 && cd - + - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1 && sudo make install && popd - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb - sudo apt-get -y update @@ -32,45 +33,44 @@ install: # manually since we did a partial installation.) - sudo ln -s /usr/local/cuda-6.0 /usr/local/cuda - curl https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -o /tmp/mdb.tar.gz && tar -C /tmp -xzvf /tmp/mdb.tar.gz && rm /tmp/mdb.tar.gz - - cd /tmp/mdb-mdb/libraries/liblmdb/ && make -j4 && sudo make install -j4 && cd - + - cd /tmp/mdb-mdb/libraries/liblmdb/ && make && sudo make install && cd - before_script: - mv Makefile.config.example Makefile.config - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib - - export NUM_THREADS=4 script: - # CMake build. + # CMake build - mkdir build - cd build - ## CPU-GPU: build only. + ## CPU-GPU: build only - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release .. - - make --keep-going --jobs=$NUM_THREADS + - make --keep-going - make clean && rm -rf * ## CPU-only: comprehensive - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. - - make --keep-going --jobs=$NUM_THREADS - - make runtest --keep-going --jobs=$NUM_THREADS - - make lint --jobs=$NUM_THREADS - - make clean && rm -rf * - ## Cleaning + - make --keep-going + - make runtest + - make lint + - make clean + ## Cleanup CMake build - cd .. - - rm -r build + - rm -rf build # Make build - ## CPU-GPU: build only. + ## CPU-GPU: build only - export CPU_ONLY=0 - - make --keep-going --jobs=$NUM_THREADS all + - make --keep-going all - make clean - ## CPU-only: comprehensive. + ## CPU-only: comprehensive - export CPU_ONLY=1 - - make --keep-going --jobs=$NUM_THREADS all test warn lint + - make --keep-going all test warn lint - make runtest - - make --jobs=$NUM_THREADS all - - make --jobs=$NUM_THREADS test - - make --jobs=$NUM_THREADS warn - - make --jobs=$NUM_THREADS lint - - make --jobs=$NUM_THREADS pycaffe + - make all + - make test + - make warn + - make lint + - make pycaffe notifications: # Emails are sent to the committer's git-configured email address by default, From ac1bb6c98e1f9e2b5dba07d06a3805e9aa6d88e2 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 17 Aug 2014 00:26:35 -0700 Subject: [PATCH 0499/2053] use all caps for global preprocess vars (e.g. EXAMPLES_SOURCE_DIR), and other minor cleanup --- examples/CMakeLists.txt | 4 ++-- include/caffe/test/test_caffe_main.hpp | 2 +- src/caffe/test/cmake_test_defines.hpp.in | 5 ++--- src/caffe/test/test_image_data_layer.cpp | 2 +- tools/CMakeLists.txt | 4 ++-- 5 files changed, 8 insertions(+), 9 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index ec3cc470fb4..055f4ef0d35 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,8 +1,8 @@ project( Examples ) -file(GLOB_RECURSE Examples_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +file(GLOB_RECURSE EXAMPLES_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) -foreach(source ${Examples_SOURCES}) +foreach(source ${EXAMPLES_SOURCES}) # get file name get_filename_component(name ${source} NAME_WE) diff --git a/include/caffe/test/test_caffe_main.hpp b/include/caffe/test/test_caffe_main.hpp index e02e67ece98..438acf2bf17 100644 --- a/include/caffe/test/test_caffe_main.hpp +++ b/include/caffe/test/test_caffe_main.hpp @@ -19,7 +19,7 @@ using std::endl; #else #define CUDA_TEST_DEVICE -1 #define CMAKE_SOURCE_DIR "src/" - #define Examples_SOURCE_DIR "examples/" + #define EXAMPLES_SOURCE_DIR "examples/" #define CMAKE_EXT "" #endif diff --git a/src/caffe/test/cmake_test_defines.hpp.in b/src/caffe/test/cmake_test_defines.hpp.in index 2d67df4ac39..870eaf5c26e 100644 --- a/src/caffe/test/cmake_test_defines.hpp.in +++ b/src/caffe/test/cmake_test_defines.hpp.in @@ -1,5 +1,4 @@ - #define CUDA_TEST_DEVICE @CUDA_TEST_DEVICE@ #define CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@/src/" -#define Examples_SOURCE_DIR "@CMAKE_SOURCE_DIR@/examples/" -#define CMAKE_EXT ".gen.cmake" \ No newline at end of file +#define EXAMPLES_SOURCE_DIR "@CMAKE_SOURCE_DIR@/examples/" +#define CMAKE_EXT ".gen.cmake" diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index 17d67bd13b3..73be5da7b23 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -37,7 +37,7 @@ class ImageDataLayerTest : public MultiDeviceTest { std::ofstream outfile(filename_->c_str(), std::ofstream::out); LOG(INFO) << "Using temporary file " << *filename_; for (int i = 0; i < 5; ++i) { - outfile << Examples_SOURCE_DIR "images/cat.jpg " << i; + outfile << EXAMPLES_SOURCE_DIR "images/cat.jpg " << i; } outfile.close(); } diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 81ecf7cd41a..bb88cfa44b0 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,10 +1,10 @@ project( Tools ) # Find all source files -file(GLOB_RECURSE Tools_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +file(GLOB_RECURSE TOOLS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) # Build each source file independently -foreach(source ${Tools_SOURCES}) +foreach(source ${TOOLS_SOURCES}) get_filename_component(name ${source} NAME_WE) add_executable(${name} ${source}) target_link_libraries(${name} caffe) From 246f510d4e04424bdba501dba4dd8606f52d8cfe Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 17 Aug 2014 00:28:14 -0700 Subject: [PATCH 0500/2053] restore .testbin extension, and move caffe_tool back to "caffe". (Required as I had to change the tool target names to '.bin' but give them an OUTPUT_NAME, but the .bin made the test_net tool collide with the test_net unit test.) --- src/caffe/test/CMakeLists.txt | 2 +- tools/CMakeLists.txt | 7 ++++--- tools/{caffe_tool.cpp => caffe.cpp} | 0 3 files changed, 5 insertions(+), 4 deletions(-) rename tools/{caffe_tool.cpp => caffe.cpp} (100%) diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index cbad0ccdeee..ffcc58f5463 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -7,7 +7,7 @@ project( Test ) # Configuration set(TEST_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) # test executables are going to be placed there -set(TEST_EXT .bin) # test executable extension +set(TEST_EXT .testbin) # test executable extension set(ALL_TEST test${TEST_EXT}) # name of an executable comprising of all tests set(RUN_TEST runtest) # dummy target for running tests diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index bb88cfa44b0..0da19fbadc8 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -6,12 +6,13 @@ file(GLOB_RECURSE TOOLS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) # Build each source file independently foreach(source ${TOOLS_SOURCES}) get_filename_component(name ${source} NAME_WE) - add_executable(${name} ${source}) - target_link_libraries(${name} caffe) + add_executable(${name}.bin ${source}) + set_target_properties(${name}.bin PROPERTIES OUTPUT_NAME ${name}) + target_link_libraries(${name}.bin caffe) ### Install ################################################################################# - install(TARGETS ${name} DESTINATION tools) + install(TARGETS ${name}.bin DESTINATION tools) endforeach(source) diff --git a/tools/caffe_tool.cpp b/tools/caffe.cpp similarity index 100% rename from tools/caffe_tool.cpp rename to tools/caffe.cpp From a909f916e2e9e89674498459f83b0e851a5d1e15 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Sun, 17 Aug 2014 03:11:59 -0700 Subject: [PATCH 0501/2053] Travis build matrix to do parallel builds for make and CMake; CUDA-less and CUDA-ful. Move bits of functionality into scripts under scripts/travis for readability. Only generate CUDA compute_50 for perfomance. --- .travis.yml | 72 ++++------------- scripts/travis/travis_build.sh | 18 +++++ scripts/travis/travis_build_and_test.sh | 22 ++++++ scripts/travis/travis_install.sh | 79 +++++++++++++++++++ .../travis/travis_setup_makefile_config.sh | 12 +++ 5 files changed, 146 insertions(+), 57 deletions(-) create mode 100755 scripts/travis/travis_build.sh create mode 100755 scripts/travis/travis_build_and_test.sh create mode 100755 scripts/travis/travis_install.sh create mode 100755 scripts/travis/travis_setup_makefile_config.sh diff --git a/.travis.yml b/.travis.yml index ed021b61fda..46dfc117975 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,76 +1,34 @@ +# Use a build matrix to do two builds in parallel: +# one using CMake, and one using make. +env: + matrix: + - WITH_CUDA=false WITH_CMAKE=false + - WITH_CUDA=false WITH_CMAKE=true + - WITH_CUDA=true WITH_CMAKE=false + - WITH_CUDA=true WITH_CMAKE=true + language: cpp # Cache Ubuntu apt packages. cache: apt -compiler: - - gcc -# Disable clang build: doesn't seem to work on Linux. -# (@jeffdonahue: Travis buildbot's failure behavior is similar to what I see -# building on Linux.) -# - clang +compiler: gcc before_install: - - echo $LANG - - echo $LC_ALL - export NUM_THREADS=4 - alias make="make --jobs=$NUM_THREADS" - - sudo add-apt-repository ppa:ubuntu-sdk-team/ppa -y - - sudo apt-get -y update - - sudo apt-get -y install wget git curl python-dev python-numpy libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-dev libboost-system-dev libboost-python-dev libhdf5-serial-dev protobuf-compiler libatlas-dev libatlas-base-dev bc cmake + - export SCRIPTS=./scripts/travis + - set -e # fail when a script fails install: - - wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -O /tmp/glog-0.3.3.tar.gz && tar -C /tmp -xzvf /tmp/glog-0.3.3.tar.gz && rm /tmp/glog-0.3.3.tar.gz - - cd /tmp/glog-0.3.3 && ./configure && make && sudo make install && cd - - - wget https://github.com/schuhschuh/gflags/archive/master.zip -O /tmp/gflags-master.zip && pushd /tmp/ && unzip gflags-master.zip && cd gflags-master && mkdir build && cd build && export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1 && sudo make install && popd - - curl http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -o /tmp/cuda_install.deb && sudo dpkg -i /tmp/cuda_install.deb && rm /tmp/cuda_install.deb - - sudo apt-get -y update - # Install the minimal CUDA subpackages required to test Caffe build. - # For a full CUDA installation, add 'cuda' to the list of packages. - - sudo apt-get -y install cuda-core-6-0 cuda-extra-libs-6-0 - # Create CUDA symlink at /usr/local/cuda - # (This would normally be created by the CUDA installer, but we create it - # manually since we did a partial installation.) - - sudo ln -s /usr/local/cuda-6.0 /usr/local/cuda - - curl https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -o /tmp/mdb.tar.gz && tar -C /tmp -xzvf /tmp/mdb.tar.gz && rm /tmp/mdb.tar.gz - - cd /tmp/mdb-mdb/libraries/liblmdb/ && make && sudo make install && cd - + - source $SCRIPTS/travis_install.sh before_script: - - mv Makefile.config.example Makefile.config - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib + - if ! $WITH_CMAKE; then source $SCRIPTS/travis_setup_makefile_config.sh; fi script: - # CMake build - - mkdir build - - cd build - ## CPU-GPU: build only - - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release .. - - make --keep-going - - make clean && rm -rf * - ## CPU-only: comprehensive - - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. - - make --keep-going - - make runtest - - make lint - - make clean - ## Cleanup CMake build - - cd .. - - rm -rf build - - # Make build - ## CPU-GPU: build only - - export CPU_ONLY=0 - - make --keep-going all - - make clean - ## CPU-only: comprehensive - - export CPU_ONLY=1 - - make --keep-going all test warn lint - - make runtest - - make all - - make test - - make warn - - make lint - - make pycaffe + - if $WITH_CUDA; then source $SCRIPTS/travis_build.sh; else source $SCRIPTS/travis_build_and_test.sh; fi notifications: # Emails are sent to the committer's git-configured email address by default, diff --git a/scripts/travis/travis_build.sh b/scripts/travis/travis_build.sh new file mode 100755 index 00000000000..06b4e24bb98 --- /dev/null +++ b/scripts/travis/travis_build.sh @@ -0,0 +1,18 @@ +#!/bin/bash +# Script called by Travis to do a full build of Caffe, +# including CUDA functionality. + +if $WITH_CMAKE; then + mkdir build + cd build + cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release .. + make --keep-going + cd - +else + export CPU_ONLY=0 + make --keep-going all test pycaffe warn + make all + make test + make pycaffe + make warn +fi diff --git a/scripts/travis/travis_build_and_test.sh b/scripts/travis/travis_build_and_test.sh new file mode 100755 index 00000000000..6b7c85e9d2d --- /dev/null +++ b/scripts/travis/travis_build_and_test.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# Script called by Travis to do a CPU-only build of and test Caffe. + +if $WITH_CMAKE; then + mkdir build + cd build + cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. + make --keep-going + make runtest + make lint + make clean + cd - +else + export CPU_ONLY=1 + make --keep-going all test pycaffe warn lint + make runtest + make all + make test + make pycaffe + make warn + make lint +fi diff --git a/scripts/travis/travis_install.sh b/scripts/travis/travis_install.sh new file mode 100755 index 00000000000..f6a357b5c57 --- /dev/null +++ b/scripts/travis/travis_install.sh @@ -0,0 +1,79 @@ +#!/bin/bash + +# Install apt packages where the Ubuntu 12.04 default works for Caffe +sudo apt-get -y update +sudo apt-get install \ + wget git curl \ + python-dev python-numpy \ + libleveldb-dev libsnappy-dev libopencv-dev \ + libboost-dev libboost-system-dev libboost-python-dev \ + libprotobuf-dev protobuf-compiler \ + libatlas-dev libatlas-base-dev \ + libhdf5-serial-dev \ + bc + +# Add a special apt-repository to install CMake 2.8.9 for CMake Caffe build, +# if needed. By default, Aptitude in Ubuntu 12.04 installs CMake 2.8.7, but +# Caffe requires a minimum CMake version of 2.8.8. +if $WITH_CMAKE; then + sudo add-apt-repository -y ppa:ubuntu-sdk-team/ppa + sudo apt-get -y update + sudo apt-get -y install cmake || (echo "CMake install failed"; exit 1) +fi + +# Install glog +GLOG_URL=https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz +GLOG_FILE=/tmp/glog-0.3.3.tar.gz +pushd . +wget $GLOG_URL -O $GLOG_FILE && \ + tar -C /tmp -xzvf $GLOG_FILE && \ + rm $GLOG_FILE && \ + cd /tmp/glog-0.3.3 && \ + ./configure && make && sudo make install || \ + (echo "glog install failed"; exit 1) +popd + +# Install gflags +GFLAGS_URL=https://github.com/schuhschuh/gflags/archive/master.zip +GFLAGS_FILE=/tmp/gflags-master.zip +pushd . +wget $GFLAGS_URL -O $GFLAGS_FILE && \ + cd /tmp/ && unzip gflags-master.zip && \ + cd gflags-master && \ + mkdir build && \ + cd build && \ + export CXXFLAGS="-fPIC" && \ + cmake .. && make VERBOSE=1 && sudo make install || \ + (echo "gflags install failed"; exit 1) +popd + +# Install CUDA, if needed +CUDA_URL=http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb +CUDA_FILE=/tmp/cuda_install.deb +if $WITH_CUDA; then + curl $CUDA_URL -o $CUDA_FILE && \ + sudo dpkg -i $CUDA_FILE || + (echo "CUDA install failed"; exit 1) + rm -f $CUDA_FILE + sudo apt-get -y update + # Install the minimal CUDA subpackages required to test Caffe build. + # For a full CUDA installation, add 'cuda' to the list of packages. + sudo apt-get -y install cuda-core-6-0 cuda-extra-libs-6-0 + # Create CUDA symlink at /usr/local/cuda + # (This would normally be created by the CUDA installer, but we create it + # manually since we did a partial installation.) + sudo ln -s /usr/local/cuda-6.0 /usr/local/cuda || + (echo "CUDA symlink creation failed"; exit 1) +fi + +# Install LMDB +LMDB_URL=https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz +LMDB_FILE=/tmp/mdb.tar.gz +pushd . +curl $LMDB_URL -o $LMDB_FILE && \ + tar -C /tmp -xzvf $LMDB_FILE && \ + cd /tmp/mdb-mdb/libraries/liblmdb/ && \ + make && sudo make install || \ + (echo "LMDB install failed"; exit 1) +popd +rm -f $LMDB_FILE diff --git a/scripts/travis/travis_setup_makefile_config.sh b/scripts/travis/travis_setup_makefile_config.sh new file mode 100755 index 00000000000..fa86e92a131 --- /dev/null +++ b/scripts/travis/travis_setup_makefile_config.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +mv Makefile.config.example Makefile.config + +if $WITH_CUDA; then + # Remove default gencode set; only generate compute_50. + sed -i 's/-gencode arch=.*\\//' Makefile.config + sed -i 's/CUDA_ARCH :=//' Makefile.config + GENCODE="-gencode arch=compute_50,code=sm_50" + GENCODE="$GENCODE -gencode arch=compute_50,code=compute_50" + echo "CUDA_ARCH := $GENCODE" >> Makefile.config +fi From bf61d4f957e7a0a5af00f9bc70089b58ea40873a Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sun, 17 Aug 2014 22:01:24 -0700 Subject: [PATCH 0502/2053] milliseconds is a word --- tools/caffe.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 13398ae8577..bc404d3b318 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -186,10 +186,10 @@ int time() { layers[i]->Forward(bottom_vecs[i], &top_vecs[i]); } LOG(INFO) << layername << "\tforward: " << timer.MilliSeconds() << - " milli seconds."; + " milliseconds."; } LOG(INFO) << "Forward pass: " << forward_timer.MilliSeconds() << - " milli seconds."; + " milliseconds."; Timer backward_timer; backward_timer.Start(); for (int i = layers.size() - 1; i >= 0; --i) { @@ -200,12 +200,12 @@ int time() { &bottom_vecs[i]); } LOG(INFO) << layername << "\tbackward: " - << timer.MilliSeconds() << " milli seconds."; + << timer.MilliSeconds() << " milliseconds."; } LOG(INFO) << "Backward pass: " << backward_timer.MilliSeconds() << - " milli seconds."; + " milliseconds."; LOG(INFO) << "Total Time: " << total_timer.MilliSeconds() << - " milli seconds."; + " milliseconds."; LOG(INFO) << "*** Benchmark ends ***"; return 0; } From e957bbc2f7b14134a27a5587352e4cc8e77f8a39 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sun, 17 Aug 2014 23:15:03 -0700 Subject: [PATCH 0503/2053] add caffe_cpu_strided_dot for strided dot products This provides a more direct interface to the cblas_?dot functions. This is useful, for example, for taking dot products across channels. --- include/caffe/util/math_functions.hpp | 4 ++++ src/caffe/util/math_functions.cpp | 21 +++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 6a608d5cfa3..f4310bf4417 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -94,6 +94,10 @@ void caffe_abs(const int n, const Dtype* a, Dtype* y); template Dtype caffe_cpu_dot(const int n, const Dtype* x, const Dtype* y); +template +Dtype caffe_cpu_strided_dot(const int n, const Dtype* x, const int incx, + const Dtype* y, const int incy); + template int caffe_cpu_hamming_distance(const int n, const Dtype* x, const Dtype* y); diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index bac06f8d025..7016e635318 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -315,14 +315,27 @@ void caffe_rng_bernoulli(const int n, const double p, unsigned int* r); template void caffe_rng_bernoulli(const int n, const float p, unsigned int* r); +template +Dtype caffe_cpu_dot(const int n, const Dtype* x, const Dtype* y) { + return caffe_cpu_strided_dot(n, x, 1, y, 1); +} + +template +float caffe_cpu_dot(const int n, const float* x, const float* y); + +template +double caffe_cpu_dot(const int n, const double* x, const double* y); + template <> -float caffe_cpu_dot(const int n, const float* x, const float* y) { - return cblas_sdot(n, x, 1, y, 1); +float caffe_cpu_strided_dot(const int n, const float* x, const int incx, + const float* y, const int incy) { + return cblas_sdot(n, x, incx, y, incy); } template <> -double caffe_cpu_dot(const int n, const double* x, const double* y) { - return cblas_ddot(n, x, 1, y, 1); +double caffe_cpu_strided_dot(const int n, const double* x, + const int incx, const double* y, const int incy) { + return cblas_ddot(n, x, incx, y, incy); } template <> From cf42598d60a121404105fadb1e8d097df1f65beb Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Thu, 14 Aug 2014 19:20:30 -0700 Subject: [PATCH 0504/2053] softmax and softmax loss layers work across channels --- src/caffe/layers/softmax_layer.cpp | 63 +++++++++++++++---------- src/caffe/layers/softmax_loss_layer.cpp | 19 +++++--- 2 files changed, 50 insertions(+), 32 deletions(-) diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index fa2ba17a151..ab74dc7cfbf 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -13,13 +13,12 @@ void SoftmaxLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); - sum_multiplier_.Reshape(1, bottom[0]->channels(), - bottom[0]->height(), bottom[0]->width()); + sum_multiplier_.Reshape(1, bottom[0]->channels(), 1, 1); Dtype* multiplier_data = sum_multiplier_.mutable_cpu_data(); for (int i = 0; i < sum_multiplier_.count(); ++i) { multiplier_data[i] = 1.; } - scale_.Reshape(bottom[0]->num(), 1, 1, 1); + scale_.Reshape(1, 1, bottom[0]->height(), bottom[0]->width()); } template @@ -29,27 +28,34 @@ void SoftmaxLayer::Forward_cpu(const vector*>& bottom, Dtype* top_data = (*top)[0]->mutable_cpu_data(); Dtype* scale_data = scale_.mutable_cpu_data(); int num = bottom[0]->num(); + int channels = bottom[0]->channels(); int dim = bottom[0]->count() / bottom[0]->num(); + int spatial_dim = bottom[0]->height() * bottom[0]->width(); caffe_copy(bottom[0]->count(), bottom_data, top_data); - // we need to subtract the max to avoid numerical issues, compute the exp, + // We need to subtract the max to avoid numerical issues, compute the exp, // and then normalize. for (int i = 0; i < num; ++i) { - scale_data[i] = bottom_data[i*dim]; - for (int j = 0; j < dim; ++j) { - scale_data[i] = std::max(scale_data[i], bottom_data[i * dim + j]); + // initialize scale_data to the first plane + caffe_copy(spatial_dim, bottom_data + i * dim, scale_data); + for (int j = 0; j < channels; j++) { + for (int k = 0; k < spatial_dim; k++) { + scale_data[k] = std::max(scale_data[k], + bottom_data[i * dim + j * spatial_dim + k]); + } + } + // subtraction + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, channels, spatial_dim, + 1, -1., sum_multiplier_.cpu_data(), scale_data, 1., top_data + i * dim); + // exponentiation + caffe_exp(dim, top_data + i * dim, top_data + i * dim); + // sum after exp + caffe_cpu_gemv(CblasTrans, channels, spatial_dim, 1., + top_data + i * dim, sum_multiplier_.cpu_data(), 0., scale_data); + // division + for (int j = 0; j < channels; j++) { + caffe_div(spatial_dim, top_data + (*top)[0]->offset(i, j), scale_data, + top_data + (*top)[0]->offset(i, j)); } - } - // subtraction - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., - scale_data, sum_multiplier_.cpu_data(), 1., top_data); - // Perform exponentiation - caffe_exp(num * dim, top_data, top_data); - // sum after exp - caffe_cpu_gemv(CblasNoTrans, num, dim, 1., top_data, - sum_multiplier_.cpu_data(), 0., scale_data); - // Do division - for (int i = 0; i < num; ++i) { - caffe_scal(dim, Dtype(1.) / scale_data[i], top_data + i * dim); } } @@ -62,18 +68,23 @@ void SoftmaxLayer::Backward_cpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); Dtype* scale_data = scale_.mutable_cpu_data(); int num = top[0]->num(); + int channels = top[0]->channels(); int dim = top[0]->count() / top[0]->num(); + int spatial_dim = top[0]->height() * top[0]->width(); caffe_copy(top[0]->count(), top_diff, bottom_diff); - // Compute inner1d(top_diff, top_data) and subtract them from the bottom diff for (int i = 0; i < num; ++i) { - scale_data[i] = caffe_cpu_dot(dim, top_diff + i * dim, - top_data + i * dim); + // compute dot(top_diff, top_data) and subtract them from the bottom diff + for (int k = 0; k < spatial_dim; ++k) { + scale_data[k] = caffe_cpu_strided_dot(channels, + bottom_diff + i * dim + k, spatial_dim, + top_data + i * dim + k, spatial_dim); + } + // subtraction + caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, channels, spatial_dim, 1, + -1., sum_multiplier_.cpu_data(), scale_data, 1., bottom_diff + i * dim); } - // subtraction - caffe_cpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., - scale_data, sum_multiplier_.cpu_data(), 1., bottom_diff); // elementwise multiplication - caffe_mul(top[0]->count(), bottom_diff, top_data, bottom_diff); + caffe_mul(top[0]->count(), bottom_diff, top_data, bottom_diff); } diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 0fa83ccddac..e07c8dc9df9 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -27,18 +27,21 @@ template void SoftmaxWithLossLayer::Forward_cpu( const vector*>& bottom, vector*>* top) { // The forward pass computes the softmax prob values. - softmax_bottom_vec_[0] = bottom[0]; softmax_layer_->Forward(softmax_bottom_vec_, &softmax_top_vec_); const Dtype* prob_data = prob_.cpu_data(); const Dtype* label = bottom[1]->cpu_data(); int num = prob_.num(); int dim = prob_.count() / num; + int spatial_dim = prob_.height() * prob_.width(); Dtype loss = 0; for (int i = 0; i < num; ++i) { - loss += -log(std::max(prob_data[i * dim + static_cast(label[i])], - Dtype(FLT_MIN))); + for (int j = 0; j < spatial_dim; j++) { + loss -= log(std::max(prob_data[i * dim + + static_cast(label[i * spatial_dim + j]) * spatial_dim + j], + Dtype(FLT_MIN))); + } } - (*top)[0]->mutable_cpu_data()[0] = loss / num; + (*top)[0]->mutable_cpu_data()[0] = loss / num / spatial_dim; if (top->size() == 2) { (*top)[1]->ShareData(prob_); } @@ -59,12 +62,16 @@ void SoftmaxWithLossLayer::Backward_cpu(const vector*>& top, const Dtype* label = (*bottom)[1]->cpu_data(); int num = prob_.num(); int dim = prob_.count() / num; + int spatial_dim = prob_.height() * prob_.width(); for (int i = 0; i < num; ++i) { - bottom_diff[i * dim + static_cast(label[i])] -= 1; + for (int j = 0; j < spatial_dim; ++j) { + bottom_diff[i * dim + static_cast(label[i * spatial_dim + j]) + * spatial_dim + j] -= 1; + } } // Scale gradient const Dtype loss_weight = top[0]->cpu_diff()[0]; - caffe_scal(prob_.count(), loss_weight / num, bottom_diff); + caffe_scal(prob_.count(), loss_weight / num / spatial_dim, bottom_diff); } } From 7f3ebcb8a8756675c197f40b0a3c100ad2acf593 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Thu, 14 Aug 2014 19:21:28 -0700 Subject: [PATCH 0505/2053] test softmax and softmax with loss across channels --- src/caffe/test/test_softmax_layer.cpp | 44 ++++++++++--------- .../test/test_softmax_with_loss_layer.cpp | 4 +- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index 37685af6b12..9f45f762cdb 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -19,7 +19,7 @@ class SoftmaxLayerTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; protected: SoftmaxLayerTest() - : blob_bottom_(new Blob(2, 10, 1, 1)), + : blob_bottom_(new Blob(2, 10, 2, 3)), blob_top_(new Blob()) { // fill the values FillerParameter filler_param; @@ -45,26 +45,28 @@ TYPED_TEST(SoftmaxLayerTest, TestForward) { layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Test sum for (int i = 0; i < this->blob_bottom_->num(); ++i) { - Dtype sum = 0; - for (int j = 0; j < this->blob_top_->channels(); ++j) { - sum += this->blob_top_->data_at(i, j, 0, 0); - } - EXPECT_GE(sum, 0.999); - EXPECT_LE(sum, 1.001); - } - // Test exact values - for (int i = 0; i < this->blob_bottom_->num(); ++i) { - Dtype scale = 0; - for (int j = 0; j < this->blob_bottom_->channels(); ++j) { - scale += exp(this->blob_bottom_->data_at(i, j, 0, 0)); - } - for (int j = 0; j < this->blob_bottom_->channels(); ++j) { - EXPECT_GE(this->blob_top_->data_at(i, j, 0, 0) + 1e-4, - exp(this->blob_bottom_->data_at(i, j, 0, 0)) / scale) - << "debug: " << i << " " << j; - EXPECT_LE(this->blob_top_->data_at(i, j, 0, 0) - 1e-4, - exp(this->blob_bottom_->data_at(i, j, 0, 0)) / scale) - << "debug: " << i << " " << j; + for (int k = 0; k < this->blob_bottom_->height(); ++k) { + for (int l = 0; l < this->blob_bottom_->width(); ++l) { + Dtype sum = 0; + for (int j = 0; j < this->blob_top_->channels(); ++j) { + sum += this->blob_top_->data_at(i, j, k, l); + } + EXPECT_GE(sum, 0.999); + EXPECT_LE(sum, 1.001); + // Test exact values + Dtype scale = 0; + for (int j = 0; j < this->blob_bottom_->channels(); ++j) { + scale += exp(this->blob_bottom_->data_at(i, j, k, l)); + } + for (int j = 0; j < this->blob_bottom_->channels(); ++j) { + EXPECT_GE(this->blob_top_->data_at(i, j, k, l) + 1e-4, + exp(this->blob_bottom_->data_at(i, j, k, l)) / scale) + << "debug: " << i << " " << j; + EXPECT_LE(this->blob_top_->data_at(i, j, k, l) - 1e-4, + exp(this->blob_bottom_->data_at(i, j, k, l)) / scale) + << "debug: " << i << " " << j; + } + } } } } diff --git a/src/caffe/test/test_softmax_with_loss_layer.cpp b/src/caffe/test/test_softmax_with_loss_layer.cpp index 0f0adbba621..246d64e116a 100644 --- a/src/caffe/test/test_softmax_with_loss_layer.cpp +++ b/src/caffe/test/test_softmax_with_loss_layer.cpp @@ -21,8 +21,8 @@ class SoftmaxWithLossLayerTest : public MultiDeviceTest { protected: SoftmaxWithLossLayerTest() - : blob_bottom_data_(new Blob(10, 5, 1, 1)), - blob_bottom_label_(new Blob(10, 1, 1, 1)), + : blob_bottom_data_(new Blob(10, 5, 2, 3)), + blob_bottom_label_(new Blob(10, 1, 2, 3)), blob_top_loss_(new Blob()) { // fill the values FillerParameter filler_param; From 5528fa932747af96dffbe03860266ae597f6e90a Mon Sep 17 00:00:00 2001 From: Ronghang Hu Date: Sat, 16 Aug 2014 14:52:19 -0700 Subject: [PATCH 0506/2053] implement GPU version of Softmax --- src/caffe/layers/softmax_layer.cpp | 2 +- src/caffe/layers/softmax_layer.cu | 141 +++++++++++++++++++---------- 2 files changed, 96 insertions(+), 47 deletions(-) diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index ab74dc7cfbf..29767ac775c 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -18,7 +18,7 @@ void SoftmaxLayer::LayerSetUp(const vector*>& bottom, for (int i = 0; i < sum_multiplier_.count(); ++i) { multiplier_data[i] = 1.; } - scale_.Reshape(1, 1, bottom[0]->height(), bottom[0]->width()); + scale_.Reshape(bottom[0]->num(), 1, bottom[0]->height(), bottom[0]->width()); } template diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index 6b853099a3f..f97eafcedb0 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -11,33 +11,80 @@ namespace caffe { template -__global__ void kernel_get_max(const int num, const int dim, - const Dtype* data, Dtype* out) { - CUDA_KERNEL_LOOP(index, num) { +__global__ void kernel_channel_max(const int num, const int channels, + const int spatial_dim, const Dtype* data, Dtype* out) { + CUDA_KERNEL_LOOP(index, num * spatial_dim) { + int n = index / spatial_dim; + int s = index % spatial_dim; Dtype maxval = -FLT_MAX; - for (int i = 0; i < dim; ++i) { - maxval = max(data[index * dim + i], maxval); + for (int c = 0; c < channels; ++c) { + maxval = max(data[(n * channels + c) * spatial_dim + s], maxval); } out[index] = maxval; } } template -__global__ void kernel_softmax_div(const int num, const int dim, - const Dtype* scale, Dtype* data) { - CUDA_KERNEL_LOOP(index, num * dim) { - int n = index / dim; - data[index] /= scale[n]; +__global__ void kernel_channel_subtract(const int num, const int channels, + const int spatial_dim, Dtype* data, const Dtype* channel_max) { + CUDA_KERNEL_LOOP(index, num * spatial_dim) { + int n = index / spatial_dim; + int s = index % spatial_dim; + for (int c = 0; c < channels; ++c) { + data[(n * channels + c) * spatial_dim + s] -= channel_max[index]; + } } } template -__global__ void kernel_exp(const int num, const Dtype* data, Dtype* out) { - CUDA_KERNEL_LOOP(index, num) { +__global__ void kernel_exp(const int count, const Dtype* data, Dtype* out) { + CUDA_KERNEL_LOOP(index, count) { out[index] = exp(data[index]); } } +template +__global__ void kernel_channel_sum(const int num, const int channels, + const int spatial_dim, const Dtype* data, Dtype* channel_sum) { + CUDA_KERNEL_LOOP(index, num * spatial_dim) { + int n = index / spatial_dim; + int s = index % spatial_dim; + Dtype sum = 0; + for (int c = 0; c < channels; ++c) { + sum += data[(n * channels + c) * spatial_dim + s]; + } + channel_sum[index] = sum; + } +} + +template +__global__ void kernel_channel_div(const int num, const int channels, + const int spatial_dim, Dtype* data, const Dtype* channel_sum) { + CUDA_KERNEL_LOOP(index, num * spatial_dim) { + int n = index / spatial_dim; + int s = index % spatial_dim; + for (int c = 0; c < channels; ++c) { + data[(n * channels + c) * spatial_dim + s] /= channel_sum[index]; + } + } +} + +template +__global__ void kernel_channel_dot(const int num, const int channels, + const int spatial_dim, const Dtype* data_1, const Dtype* data_2, + Dtype* channel_dot) { + CUDA_KERNEL_LOOP(index, num * spatial_dim) { + int n = index / spatial_dim; + int s = index % spatial_dim; + Dtype dot = 0; + for (int c = 0; c < channels; ++c) { + dot += (data_1[(n * channels + c) * spatial_dim + s] + * data_2[(n * channels + c) * spatial_dim + s]); + } + channel_dot[index] = dot; + } +} + template void SoftmaxLayer::Forward_gpu(const vector*>& bottom, vector*>* top) { @@ -45,56 +92,58 @@ void SoftmaxLayer::Forward_gpu(const vector*>& bottom, Dtype* top_data = (*top)[0]->mutable_gpu_data(); Dtype* scale_data = scale_.mutable_gpu_data(); int num = bottom[0]->num(); - int dim = bottom[0]->count() / bottom[0]->num(); + int channels = bottom[0]->channels(); + int spatial_dim = bottom[0]->height() * bottom[0]->width(); caffe_copy(bottom[0]->count(), bottom_data, top_data); - // we need to subtract the max to avoid numerical issues, compute the exp, + // We need to subtract the max to avoid numerical issues, compute the exp, // and then normalize. - // Compute max + // compute max + // NOLINT_NEXT_LINE(whitespace/operators) + kernel_channel_max<<>>(num, channels, spatial_dim, top_data, + scale_data); + // subtract // NOLINT_NEXT_LINE(whitespace/operators) - kernel_get_max<<>>( - num, dim, bottom_data, scale_data); - // subtraction - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., - scale_data, sum_multiplier_.gpu_data(), 1., top_data); - // Perform exponentiation + kernel_channel_subtract<<>>(num, channels, spatial_dim, top_data, + scale_data); + // exponentiate // NOLINT_NEXT_LINE(whitespace/operators) - kernel_exp<<>>( - num * dim, top_data, top_data); + kernel_exp<<>>(num * channels * spatial_dim, top_data, + top_data); // sum after exp - caffe_gpu_gemv(CblasNoTrans, num, dim, 1., top_data, - sum_multiplier_.gpu_data(), 0., scale_data); - // Do division // NOLINT_NEXT_LINE(whitespace/operators) - kernel_softmax_div<<>>( - num, dim, scale_data, top_data); + kernel_channel_sum<<>>(num, channels, spatial_dim, top_data, + scale_data); + // divide + // NOLINT_NEXT_LINE(whitespace/operators) + kernel_channel_div<<>>(num, channels, spatial_dim, top_data, + scale_data); } -// TODO(Yangqing): implement the GPU version of softmax. template void SoftmaxLayer::Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) { const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* top_data = top[0]->gpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + Dtype* scale_data = scale_.mutable_gpu_data(); int num = top[0]->num(); - int dim = top[0]->count() / top[0]->num(); + int channels = top[0]->channels(); + int spatial_dim = top[0]->height() * top[0]->width(); caffe_copy(top[0]->count(), top_diff, bottom_diff); - // Compute inner1d(top_diff, top_data) and subtract them from the bottom diff - // cuda dot returns the result to cpu, so we temporarily change the pointer - // mode - CUBLAS_CHECK(cublasSetPointerMode(Caffe::cublas_handle(), - CUBLAS_POINTER_MODE_DEVICE)); - Dtype* scale_data = scale_.mutable_gpu_data(); - for (int i = 0; i < num; ++i) { - caffe_gpu_dot(dim, top_diff + i * dim, - top_data + i * dim, scale_data + i); - } - CUBLAS_CHECK(cublasSetPointerMode(Caffe::cublas_handle(), - CUBLAS_POINTER_MODE_HOST)); - // subtraction - caffe_gpu_gemm(CblasNoTrans, CblasNoTrans, num, dim, 1, -1., - scale_.gpu_data(), sum_multiplier_.gpu_data(), 1., bottom_diff); + // Compute inner1d(top_diff, top_data) and subtract them from the bottom diff. + // NOLINT_NEXT_LINE(whitespace/operators) + kernel_channel_dot<<>>(num, channels, spatial_dim, top_diff, top_data, + scale_data); + // NOLINT_NEXT_LINE(whitespace/operators) + kernel_channel_subtract<<>>(num, channels, spatial_dim, bottom_diff, + scale_data); // elementwise multiplication caffe_gpu_mul(top[0]->count(), bottom_diff, top_data, bottom_diff); } From 1b5ef7402d9e486f1c00af5e7f0e735633d94118 Mon Sep 17 00:00:00 2001 From: "R. Gokberk Cinbis" Date: Wed, 20 Aug 2014 07:53:31 +0300 Subject: [PATCH 0507/2053] Lock the mex file to avoid Matlab crashes. Commands like "clear all" and "clear function" causes segmentation faults or errors like these (especially after an 'init'): libprotobuf ERROR google/protobuf/descriptor_database.cc:57] File already exists in database: caffe/proto/caffe.proto libprotobuf FATAL google/protobuf/descriptor.cc:862] CHECK failed: generated_database_->Add(encoded_file_descriptor, size): [libprotobuf ERROR google/protobuf/message.cc:333] Type appears to be in generated pool but wasn't registered: caffe.LayerParameter Attempt to restart MATLAB? To avoid these, lock the the mex file. --- matlab/caffe/matcaffe.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index 83786caed0d..db8896da6ae 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -372,6 +372,7 @@ static handler_registry handlers[] = { ** matlab entry point: caffe(api_command, arg1, arg2, ...) **/ void mexFunction(MEX_ARGS) { + mexLock(); // Avoid clearing the mex file. if (nrhs == 0) { LOG(ERROR) << "No API command given"; mexErrMsgTxt("An API command is requires"); From f6ffd8ef0f14c6889c09efe2423c56118b0c3539 Mon Sep 17 00:00:00 2001 From: TANGUY Arnaud Date: Wed, 20 Aug 2014 18:37:54 +0200 Subject: [PATCH 0508/2053] Refactor DataLayer using a new DataTransformer Start the refactoring of the datalayers to avoid data transformation code duplication. So far, only DataLayer has been done. --- include/caffe/data_layers.hpp | 8 +- include/caffe/data_transformer.hpp | 55 +++++++++++++ src/caffe/data_transformer.cpp | 114 ++++++++++++++++++++++++++ src/caffe/layers/data_layer.cpp | 98 +++------------------- src/caffe/proto/caffe.proto | 33 +++++--- src/caffe/test/test_data_layer.cpp | 29 +++++-- src/caffe/test/test_net.cpp | 16 +++- src/caffe/test/test_split_layer.cpp | 8 +- src/caffe/test/test_upgrade_proto.cpp | 26 +++--- src/caffe/util/upgrade_proto.cpp | 14 ++-- 10 files changed, 267 insertions(+), 134 deletions(-) create mode 100644 include/caffe/data_transformer.hpp create mode 100644 src/caffe/data_transformer.cpp diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 8ab92bfc0a5..06508eabf57 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -12,6 +12,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" +#include "caffe/data_transformer.hpp" #include "caffe/filler.hpp" #include "caffe/internal_thread.hpp" #include "caffe/layer.hpp" @@ -24,12 +25,12 @@ namespace caffe { // TODO: DataLayer, ImageDataLayer, and WindowDataLayer all have the // same basic structure and a lot of duplicated code. - template class DataLayer : public Layer, public InternalThread { public: explicit DataLayer(const LayerParameter& param) - : Layer(param) {} + : Layer(param), + data_transformer_(param.data_param().transform_param()) {} virtual ~DataLayer(); virtual void LayerSetUp(const vector*>& bottom, vector*>* top); @@ -53,11 +54,10 @@ class DataLayer : public Layer, public InternalThread { virtual void CreatePrefetchThread(); virtual void JoinPrefetchThread(); - virtual unsigned int PrefetchRand(); // The thread's function virtual void InternalThreadEntry(); - shared_ptr prefetch_rng_; + DataTransformer data_transformer_; // LEVELDB shared_ptr db_; diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp new file mode 100644 index 00000000000..302bf70e606 --- /dev/null +++ b/include/caffe/data_transformer.hpp @@ -0,0 +1,55 @@ +#ifndef CAFFE_DATA_TRANSFORMER_HPP +#define CAFFE_DATA_TRANSFORMER_HPP + +#include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +/** + * @brief Applies common transformations to the input data, such as + * scaling, mirroring, substracting the image mean... + */ +template +class DataTransformer { + public: + explicit DataTransformer(const TransformationParameter& param) + : param_(param) { + phase_ = Caffe::phase(); + } + virtual ~DataTransformer() {} + + void InitRand(); + + /** + * @brief Applies the transformation defined in the data layer's + * transform_param block to the data. + * + * @param batch_item_id + * Datum position within the batch. This is used to compute the + * writing position in the top blob's data + * @param datum + * Datum containing the data to be transformed. + * @param mean + * @param top_data + * This is meant to be the top blob's data. The transformed data will be + * written at the appropriate place within the blob's data. + */ + void Transform(const int batch_item_id, const Datum& datum, + const Dtype* mean, Dtype* transformed_data); + + protected: + virtual unsigned int Rand(); + + // Tranformation parameters + TransformationParameter param_; + + + shared_ptr rng_; + Caffe::Phase phase_; +}; + +} // namespace caffe + +#endif // CAFFE_DATA_TRANSFORMER_HPP_ + diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp new file mode 100644 index 00000000000..609c06d6c31 --- /dev/null +++ b/src/caffe/data_transformer.cpp @@ -0,0 +1,114 @@ +#include + +#include "caffe/data_transformer.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/util/rng.hpp" + +namespace caffe { + +template +void DataTransformer::Transform(const int batch_item_id, + const Datum& datum, + const Dtype* mean, + Dtype* transformed_data) { + + const string& data = datum.data(); + const int channels = datum.channels(); + const int height = datum.height(); + const int width = datum.width(); + const int size = datum.channels() * datum.height() * datum.width(); + + const int crop_size = param_.crop_size(); + const bool mirror = param_.mirror(); + const Dtype scale = param_.scale(); + + + + if (mirror && crop_size == 0) { + LOG(FATAL) << "Current implementation requires mirror and crop_size to be " + << "set at the same time."; + } + + if (crop_size) { + CHECK(data.size()) << "Image cropping only support uint8 data"; + int h_off, w_off; + // We only do random crop when we do training. + if (phase_ == Caffe::TRAIN) { + h_off = Rand() % (height - crop_size); + w_off = Rand() % (width - crop_size); + } else { + h_off = (height - crop_size) / 2; + w_off = (width - crop_size) / 2; + } + if (mirror && Rand() % 2) { + // Copy mirrored version + for (int c = 0; c < channels; ++c) { + for (int h = 0; h < crop_size; ++h) { + for (int w = 0; w < crop_size; ++w) { + int data_index = (c * height + h + h_off) * width + w + w_off; + int top_index = ((batch_item_id * channels + c) * crop_size + h) + * crop_size + (crop_size - 1 - w); + Dtype datum_element = + static_cast(static_cast(data[data_index])); + transformed_data[top_index] = + (datum_element - mean[data_index]) * scale; + } + } + } + } else { + // Normal copy + for (int c = 0; c < channels; ++c) { + for (int h = 0; h < crop_size; ++h) { + for (int w = 0; w < crop_size; ++w) { + int top_index = ((batch_item_id * channels + c) * crop_size + h) + * crop_size + w; + int data_index = (c * height + h + h_off) * width + w + w_off; + Dtype datum_element = + static_cast(static_cast(data[data_index])); + transformed_data[top_index] = + (datum_element - mean[data_index]) * scale; + } + } + } + } + } else { + // we will prefer to use data() first, and then try float_data() + if (data.size()) { + for (int j = 0; j < size; ++j) { + Dtype datum_element = + static_cast(static_cast(data[j])); + transformed_data[j + batch_item_id * size] = + (datum_element - mean[j]) * scale; + } + } else { + for (int j = 0; j < size; ++j) { + transformed_data[j + batch_item_id * size] = + (datum.float_data(j) - mean[j]) * scale; + } + } + } +} + +template +void DataTransformer::InitRand() { + const bool needs_rand = (phase_ == Caffe::TRAIN) && + (param_.mirror() || param_.crop_size()); + if (needs_rand) { + const unsigned int rng_seed = caffe_rng_rand(); + rng_.reset(new Caffe::RNG(rng_seed)); + } else { + rng_.reset(); + } +} + +template +unsigned int DataTransformer::Rand() { + CHECK(rng_); + caffe::rng_t* rng = + static_cast(rng_->generator()); + return (*rng)(); +} + +INSTANTIATE_CLASS(DataTransformer); + +} // namespace caffe diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index c2b0c73a53b..b6ac5d6b351 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -23,20 +23,8 @@ void DataLayer::InternalThreadEntry() { if (output_labels_) { top_label = prefetch_label_.mutable_cpu_data(); } - const Dtype scale = this->layer_param_.data_param().scale(); const int batch_size = this->layer_param_.data_param().batch_size(); - const int crop_size = this->layer_param_.data_param().crop_size(); - const bool mirror = this->layer_param_.data_param().mirror(); - if (mirror && crop_size == 0) { - LOG(FATAL) << "Current implementation requires mirror and crop_size to be " - << "set at the same time."; - } - // datum scales - const int channels = datum_channels_; - const int height = datum_height_; - const int width = datum_width_; - const int size = datum_size_; const Dtype* mean = data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob @@ -56,66 +44,13 @@ void DataLayer::InternalThreadEntry() { LOG(FATAL) << "Unknown database backend"; } - const string& data = datum.data(); - if (crop_size) { - CHECK(data.size()) << "Image cropping only support uint8 data"; - int h_off, w_off; - // We only do random crop when we do training. - if (phase_ == Caffe::TRAIN) { - h_off = PrefetchRand() % (height - crop_size); - w_off = PrefetchRand() % (width - crop_size); - } else { - h_off = (height - crop_size) / 2; - w_off = (width - crop_size) / 2; - } - if (mirror && PrefetchRand() % 2) { - // Copy mirrored version - for (int c = 0; c < channels; ++c) { - for (int h = 0; h < crop_size; ++h) { - for (int w = 0; w < crop_size; ++w) { - int top_index = ((item_id * channels + c) * crop_size + h) - * crop_size + (crop_size - 1 - w); - int data_index = (c * height + h + h_off) * width + w + w_off; - Dtype datum_element = - static_cast(static_cast(data[data_index])); - top_data[top_index] = (datum_element - mean[data_index]) * scale; - } - } - } - } else { - // Normal copy - for (int c = 0; c < channels; ++c) { - for (int h = 0; h < crop_size; ++h) { - for (int w = 0; w < crop_size; ++w) { - int top_index = ((item_id * channels + c) * crop_size + h) - * crop_size + w; - int data_index = (c * height + h + h_off) * width + w + w_off; - Dtype datum_element = - static_cast(static_cast(data[data_index])); - top_data[top_index] = (datum_element - mean[data_index]) * scale; - } - } - } - } - } else { - // we will prefer to use data() first, and then try float_data() - if (data.size()) { - for (int j = 0; j < size; ++j) { - Dtype datum_element = - static_cast(static_cast(data[j])); - top_data[item_id * size + j] = (datum_element - mean[j]) * scale; - } - } else { - for (int j = 0; j < size; ++j) { - top_data[item_id * size + j] = - (datum.float_data(j) - mean[j]) * scale; - } - } - } + // Apply data transformations (mirror, scale, crop...) + data_transformer_.Transform(item_id, datum, mean, top_data); if (output_labels_) { top_label[item_id] = datum.label(); } + // go to the next iter switch (this->layer_param_.data_param().backend()) { case DataParameter_DB_LEVELDB: @@ -244,7 +179,7 @@ void DataLayer::LayerSetUp(const vector*>& bottom, } // image - int crop_size = this->layer_param_.data_param().crop_size(); + int crop_size = this->layer_param_.data_param().transform_param().crop_size(); if (crop_size > 0) { (*top)[0]->Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), crop_size, crop_size); @@ -274,8 +209,9 @@ void DataLayer::LayerSetUp(const vector*>& bottom, CHECK_GT(datum_height_, crop_size); CHECK_GT(datum_width_, crop_size); // check if we want to have mean - if (this->layer_param_.data_param().has_mean_file()) { - const string& mean_file = this->layer_param_.data_param().mean_file(); + if (this->layer_param_.data_param().transform_param().has_mean_file()) { + const string& mean_file = + this->layer_param_.data_param().transform_param().mean_file(); LOG(INFO) << "Loading mean file from" << mean_file; BlobProto blob_proto; ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); @@ -305,15 +241,9 @@ void DataLayer::LayerSetUp(const vector*>& bottom, template void DataLayer::CreatePrefetchThread() { phase_ = Caffe::phase(); - const bool prefetch_needs_rand = (phase_ == Caffe::TRAIN) && - (this->layer_param_.data_param().mirror() || - this->layer_param_.data_param().crop_size()); - if (prefetch_needs_rand) { - const unsigned int prefetch_rng_seed = caffe_rng_rand(); - prefetch_rng_.reset(new Caffe::RNG(prefetch_rng_seed)); - } else { - prefetch_rng_.reset(); - } + + data_transformer_.InitRand(); + CHECK(!StartInternalThread()) << "Pthread execution failed"; } @@ -322,14 +252,6 @@ void DataLayer::JoinPrefetchThread() { CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed"; } -template -unsigned int DataLayer::PrefetchRand() { - CHECK(prefetch_rng_); - caffe::rng_t* prefetch_rng = - static_cast(prefetch_rng_->generator()); - return (*prefetch_rng)(); -} - template void DataLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 428ba2b406d..b7c6bca8194 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -344,6 +344,20 @@ message ConvolutionParameter { optional FillerParameter bias_filler = 8; // The filler for the bias } +// Message that stores parameters used to apply transformation +// to the data layer's data +message TransformationParameter { + // For data pre-processing, we can do simple scaling and subtracting the + // data mean, if provided. Note that the mean subtraction is always carried + // out before scaling. + optional float scale = 1 [default = 1]; + // Specify if we want to randomly mirror data. + optional bool mirror = 2 [default = false]; + // Specify if we would like to randomly crop an image. + optional uint32 crop_size = 3 [default = 0]; + optional string mean_file = 4; +} + // Message that stores parameters used by DataLayer message DataParameter { enum DB { @@ -352,23 +366,18 @@ message DataParameter { } // Specify the data source. optional string source = 1; - // For data pre-processing, we can do simple scaling and subtracting the - // data mean, if provided. Note that the mean subtraction is always carried - // out before scaling. - optional float scale = 2 [default = 1]; - optional string mean_file = 3; // Specify the batch size. - optional uint32 batch_size = 4; - // Specify if we would like to randomly crop an image. - optional uint32 crop_size = 5 [default = 0]; - // Specify if we want to randomly mirror data. - optional bool mirror = 6 [default = false]; + optional uint32 batch_size = 3; // The rand_skip variable is for the data layer to skip a few data points // to avoid all asynchronous sgd clients to start at the same point. The skip // point would be set as rand_skip * rand(0,1). Note that rand_skip should not // be larger than the number of keys in the leveldb. - optional uint32 rand_skip = 7 [default = 0]; - optional DB backend = 8 [default = LEVELDB]; + optional uint32 rand_skip = 4 [default = 0]; + + // Parameters for data pre-processing. + optional TransformationParameter transform_param = 5; + + optional DB backend = 6 [default = LEVELDB]; } // Message that stores parameters used by DropoutLayer diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 208beed91d1..5c21f2e745d 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -118,9 +118,13 @@ class DataLayerTest : public MultiDeviceTest { LayerParameter param; DataParameter* data_param = param.mutable_data_param(); data_param->set_batch_size(5); - data_param->set_scale(scale); data_param->set_source(filename_->c_str()); data_param->set_backend(backend_); + + TransformationParameter* transform_param = + data_param->mutable_transform_param(); + transform_param->set_scale(scale); + DataLayer layer(param); layer.SetUp(blob_bottom_vec_, &blob_top_vec_); EXPECT_EQ(blob_top_data_->num(), 5); @@ -150,12 +154,17 @@ class DataLayerTest : public MultiDeviceTest { const Dtype scale = 3; LayerParameter param; Caffe::set_random_seed(1701); + DataParameter* data_param = param.mutable_data_param(); data_param->set_batch_size(5); - data_param->set_scale(scale); - data_param->set_crop_size(1); data_param->set_source(filename_->c_str()); data_param->set_backend(backend_); + + TransformationParameter* transform_param = + data_param->mutable_transform_param(); + transform_param->set_scale(scale); + transform_param->set_crop_size(1); + DataLayer layer(param); layer.SetUp(blob_bottom_vec_, &blob_top_vec_); EXPECT_EQ(blob_top_data_->num(), 5); @@ -198,11 +207,14 @@ class DataLayerTest : public MultiDeviceTest { LayerParameter param; DataParameter* data_param = param.mutable_data_param(); data_param->set_batch_size(5); - data_param->set_crop_size(1); - data_param->set_mirror(true); data_param->set_source(filename_->c_str()); data_param->set_backend(backend_); + TransformationParameter* transform_param = + data_param->mutable_transform_param(); + transform_param->set_crop_size(1); + transform_param->set_mirror(true); + // Get crop sequence with Caffe seed 1701. Caffe::set_random_seed(seed_); vector > crop_sequence; @@ -249,11 +261,14 @@ class DataLayerTest : public MultiDeviceTest { LayerParameter param; DataParameter* data_param = param.mutable_data_param(); data_param->set_batch_size(5); - data_param->set_crop_size(1); - data_param->set_mirror(true); data_param->set_source(filename_->c_str()); data_param->set_backend(backend_); + TransformationParameter* transform_param = + data_param->mutable_transform_param(); + transform_param->set_crop_size(1); + transform_param->set_mirror(true); + // Get crop sequence with Caffe seed 1701, srand seed 1701. Caffe::set_random_seed(seed_); srand(seed_); diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 395e3523418..f0a368245a5 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -1177,7 +1177,9 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'label' " " data_param { " " source: 'mnist-train-leveldb' " - " scale: 0.00390625 " + " transform_param { " + " scale: 0.00390625 " + " } " " batch_size: 64 " " } " " include: { phase: TRAIN } " @@ -1189,7 +1191,9 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'label' " " data_param { " " source: 'mnist-test-leveldb' " - " scale: 0.00390625 " + " transform_param { " + " scale: 0.00390625 " + " } " " batch_size: 100 " " } " " include: { phase: TEST } " @@ -1256,7 +1260,9 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'label' " " data_param { " " source: 'mnist-train-leveldb' " - " scale: 0.00390625 " + " transform_param { " + " scale: 0.00390625 " + " } " " batch_size: 64 " " } " " include: { phase: TRAIN } " @@ -1313,7 +1319,9 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'label' " " data_param { " " source: 'mnist-test-leveldb' " - " scale: 0.00390625 " + " transform_param { " + " scale: 0.00390625 " + " } " " batch_size: 100 " " } " " include: { phase: TEST } " diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index 92a3ec77b93..bee73f64568 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -180,10 +180,12 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " type: DATA " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " " batch_size: 256 " - " crop_size: 227 " - " mirror: true " + " transform_param { " + " crop_size: 227 " + " mirror: true " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " + " } " " } " " top: 'data' " " top: 'label' " diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index 2abcadc0862..3e9ab2194ee 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -1189,10 +1189,12 @@ TEST_F(V0UpgradeTest, TestSimple) { " type: DATA " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " " batch_size: 256 " - " crop_size: 227 " - " mirror: true " + " transform_param { " + " crop_size: 227 " + " mirror: true " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " + " } " " } " " top: 'data' " " top: 'label' " @@ -1523,11 +1525,13 @@ TEST_F(V0UpgradeTest, TestAllParams) { " type: DATA " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " " batch_size: 256 " - " crop_size: 227 " - " mirror: true " - " scale: 0.25 " + " transform_param { " + " crop_size: 227 " + " mirror: true " + " scale: 0.25 " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " + " } " " rand_skip: 73 " " } " " top: 'data' " @@ -2119,10 +2123,12 @@ TEST_F(V0UpgradeTest, TestImageNet) { " type: DATA " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " " batch_size: 256 " - " crop_size: 227 " - " mirror: true " + " transform_param { " + " crop_size: 227 " + " mirror: true " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " + " } " " } " " top: 'data' " " top: 'label' " diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index 5415ca83b60..48eb579fe00 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -307,7 +307,8 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, } if (v0_layer_param.has_scale()) { if (type == "data") { - layer_param->mutable_data_param()->set_scale(v0_layer_param.scale()); + layer_param->mutable_data_param()->mutable_transform_param()-> + set_scale(v0_layer_param.scale()); } else if (type == "images") { layer_param->mutable_image_data_param()->set_scale( v0_layer_param.scale()); @@ -318,8 +319,8 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, } if (v0_layer_param.has_meanfile()) { if (type == "data") { - layer_param->mutable_data_param()->set_mean_file( - v0_layer_param.meanfile()); + layer_param->mutable_data_param()->mutable_transform_param()-> + set_mean_file(v0_layer_param.meanfile()); } else if (type == "images") { layer_param->mutable_image_data_param()->set_mean_file( v0_layer_param.meanfile()); @@ -351,8 +352,8 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, } if (v0_layer_param.has_cropsize()) { if (type == "data") { - layer_param->mutable_data_param()->set_crop_size( - v0_layer_param.cropsize()); + layer_param->mutable_data_param()->mutable_transform_param()-> + set_crop_size(v0_layer_param.cropsize()); } else if (type == "images") { layer_param->mutable_image_data_param()->set_crop_size( v0_layer_param.cropsize()); @@ -366,7 +367,8 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, } if (v0_layer_param.has_mirror()) { if (type == "data") { - layer_param->mutable_data_param()->set_mirror(v0_layer_param.mirror()); + layer_param->mutable_data_param()->mutable_transform_param()-> + set_mirror(v0_layer_param.mirror()); } else if (type == "images") { layer_param->mutable_image_data_param()->set_mirror( v0_layer_param.mirror()); From 0ac0f20413ea44847af7c8c7bcca655f499b0b60 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Wed, 20 Aug 2014 20:06:11 -0700 Subject: [PATCH 0509/2053] clean up cpu signbit definition The redundant "caffe_signbit" function was used as a circumlocution around CUDA's signbit macro; we can just add extra parens to prevent macro expansion. --- include/caffe/util/math_functions.hpp | 9 ++++----- src/caffe/util/math_functions.cpp | 12 ------------ 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index f4310bf4417..62467fb5c52 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -137,11 +137,10 @@ inline char caffe_sign(Dtype val) { DEFINE_CAFFE_CPU_UNARY_FUNC(sign, y[i] = caffe_sign(x[i])); // This returns a nonzero value if the input has its sign bit set. -// The name sngbit is meant to avoid conflicts with std::signbit in the macro -bool caffe_signbit(float arg); -bool caffe_signbit(double arg); -bool caffe_signbit(long double arg); -DEFINE_CAFFE_CPU_UNARY_FUNC(sgnbit, y[i] = caffe_signbit(x[i])); +// The name sngbit is meant to avoid conflicts with std::signbit in the macro. +// The extra parens are needed because CUDA < 6.5 defines signbit as a macro, +// and we don't want that to expand here when CUDA headers are also included. +DEFINE_CAFFE_CPU_UNARY_FUNC(sgnbit, y[i] = (std::signbit)(x[i])); DEFINE_CAFFE_CPU_UNARY_FUNC(fabs, y[i] = std::fabs(x[i])); diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index 7016e635318..0338155e1f3 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -387,16 +387,4 @@ void caffe_cpu_scale(const int n, const double alpha, const double *x, cblas_dscal(n, alpha, y, 1); } - -using std::signbit; -bool caffe_signbit(float arg) { - return signbit(arg); -} -bool caffe_signbit(double arg) { - return signbit(arg); -} -bool caffe_signbit(long double arg) { - return signbit(arg); -} - } // namespace caffe From ac64a7b3d35a0c52468fbf9725a8517a389d7a47 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 20 Aug 2014 20:38:29 -0700 Subject: [PATCH 0510/2053] specialize cpu_strided_dot before instantiation to fix clang++ build --- src/caffe/util/math_functions.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index 7016e635318..86b7e866fd3 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -315,17 +315,6 @@ void caffe_rng_bernoulli(const int n, const double p, unsigned int* r); template void caffe_rng_bernoulli(const int n, const float p, unsigned int* r); -template -Dtype caffe_cpu_dot(const int n, const Dtype* x, const Dtype* y) { - return caffe_cpu_strided_dot(n, x, 1, y, 1); -} - -template -float caffe_cpu_dot(const int n, const float* x, const float* y); - -template -double caffe_cpu_dot(const int n, const double* x, const double* y); - template <> float caffe_cpu_strided_dot(const int n, const float* x, const int incx, const float* y, const int incy) { @@ -338,6 +327,17 @@ double caffe_cpu_strided_dot(const int n, const double* x, return cblas_ddot(n, x, incx, y, incy); } +template +Dtype caffe_cpu_dot(const int n, const Dtype* x, const Dtype* y) { + return caffe_cpu_strided_dot(n, x, 1, y, 1); +} + +template +float caffe_cpu_dot(const int n, const float* x, const float* y); + +template +double caffe_cpu_dot(const int n, const double* x, const double* y); + template <> int caffe_cpu_hamming_distance(const int n, const float* x, const float* y) { From a4460972333507aec0c42db7f7cbaebcf16edcdf Mon Sep 17 00:00:00 2001 From: TANGUY Arnaud Date: Thu, 21 Aug 2014 15:50:39 +0200 Subject: [PATCH 0511/2053] Refactor ImageDataLayer to use DataTransformer --- include/caffe/data_layers.hpp | 6 +- src/caffe/data_transformer.cpp | 1 - src/caffe/layers/image_data_layer.cpp | 97 +++------------------------ src/caffe/proto/caffe.proto | 25 +++---- src/caffe/test/test_upgrade_proto.cpp | 10 +-- src/caffe/util/upgrade_proto.cpp | 16 ++--- 6 files changed, 38 insertions(+), 117 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 06508eabf57..bc29429832e 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -178,7 +178,8 @@ template class ImageDataLayer : public Layer, public InternalThread { public: explicit ImageDataLayer(const LayerParameter& param) - : Layer(param) {} + : Layer(param), + data_transformer_(param.data_param().transform_param()) {} virtual ~ImageDataLayer(); virtual void LayerSetUp(const vector*>& bottom, vector*>* top); @@ -203,10 +204,11 @@ class ImageDataLayer : public Layer, public InternalThread { virtual void CreatePrefetchThread(); virtual void JoinPrefetchThread(); - virtual unsigned int PrefetchRand(); virtual void InternalThreadEntry(); + DataTransformer data_transformer_; shared_ptr prefetch_rng_; + vector > lines_; int lines_id_; int datum_channels_; diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 609c06d6c31..bdde028435b 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -11,7 +11,6 @@ void DataTransformer::Transform(const int batch_item_id, const Datum& datum, const Dtype* mean, Dtype* transformed_data) { - const string& data = datum.data(); const int channels = datum.channels(); const int height = datum.height(); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index c72bf9c036f..85ee9885b5c 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -20,22 +20,11 @@ void ImageDataLayer::InternalThreadEntry() { Dtype* top_data = prefetch_data_.mutable_cpu_data(); Dtype* top_label = prefetch_label_.mutable_cpu_data(); ImageDataParameter image_data_param = this->layer_param_.image_data_param(); - const Dtype scale = image_data_param.scale(); const int batch_size = image_data_param.batch_size(); - const int crop_size = image_data_param.crop_size(); - const bool mirror = image_data_param.mirror(); const int new_height = image_data_param.new_height(); const int new_width = image_data_param.new_width(); - if (mirror && crop_size == 0) { - LOG(FATAL) << "Current implementation requires mirror and crop_size to be " - << "set at the same time."; - } // datum scales - const int channels = datum_channels_; - const int height = datum_height_; - const int width = datum_width_; - const int size = datum_size_; const int lines_size = lines_.size(); const Dtype* mean = data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { @@ -46,62 +35,9 @@ void ImageDataLayer::InternalThreadEntry() { new_height, new_width, &datum)) { continue; } - const string& data = datum.data(); - if (crop_size) { - CHECK(data.size()) << "Image cropping only support uint8 data"; - int h_off, w_off; - // We only do random crop when we do training. - if (phase_ == Caffe::TRAIN) { - h_off = PrefetchRand() % (height - crop_size); - w_off = PrefetchRand() % (width - crop_size); - } else { - h_off = (height - crop_size) / 2; - w_off = (width - crop_size) / 2; - } - if (mirror && PrefetchRand() % 2) { - // Copy mirrored version - for (int c = 0; c < channels; ++c) { - for (int h = 0; h < crop_size; ++h) { - for (int w = 0; w < crop_size; ++w) { - int top_index = ((item_id * channels + c) * crop_size + h) - * crop_size + (crop_size - 1 - w); - int data_index = (c * height + h + h_off) * width + w + w_off; - Dtype datum_element = - static_cast(static_cast(data[data_index])); - top_data[top_index] = (datum_element - mean[data_index]) * scale; - } - } - } - } else { - // Normal copy - for (int c = 0; c < channels; ++c) { - for (int h = 0; h < crop_size; ++h) { - for (int w = 0; w < crop_size; ++w) { - int top_index = ((item_id * channels + c) * crop_size + h) - * crop_size + w; - int data_index = (c * height + h + h_off) * width + w + w_off; - Dtype datum_element = - static_cast(static_cast(data[data_index])); - top_data[top_index] = (datum_element - mean[data_index]) * scale; - } - } - } - } - } else { - // Just copy the whole data - if (data.size()) { - for (int j = 0; j < size; ++j) { - Dtype datum_element = - static_cast(static_cast(data[j])); - top_data[item_id * size + j] = (datum_element - mean[j]) * scale; - } - } else { - for (int j = 0; j < size; ++j) { - top_data[item_id * size + j] = - (datum.float_data(j) - mean[j]) * scale; - } - } - } + + // Apply transformations (mirror, crop...) to the data + data_transformer_.Transform(item_id, datum, mean, top_data); top_label[item_id] = datum.label(); // go to the next iter @@ -163,9 +99,11 @@ void ImageDataLayer::LayerSetUp(const vector*>& bottom, CHECK(ReadImageToDatum(lines_[lines_id_].first, lines_[lines_id_].second, new_height, new_width, &datum)); // image - const int crop_size = this->layer_param_.image_data_param().crop_size(); + const int crop_size = this->layer_param_.image_data_param() + .transform_param().crop_size(); const int batch_size = this->layer_param_.image_data_param().batch_size(); - const string& mean_file = this->layer_param_.image_data_param().mean_file(); + const string& mean_file = this->layer_param_.image_data_param() + .transform_param().mean_file(); if (crop_size > 0) { (*top)[0]->Reshape(batch_size, datum.channels(), crop_size, crop_size); prefetch_data_.Reshape(batch_size, datum.channels(), crop_size, crop_size); @@ -189,7 +127,7 @@ void ImageDataLayer::LayerSetUp(const vector*>& bottom, CHECK_GT(datum_height_, crop_size); CHECK_GT(datum_width_, crop_size); // check if we want to have mean - if (this->layer_param_.image_data_param().has_mean_file()) { + if (this->layer_param_.image_data_param().transform_param().has_mean_file()) { BlobProto blob_proto; LOG(INFO) << "Loading mean file from" << mean_file; ReadProtoFromBinaryFile(mean_file.c_str(), &blob_proto); @@ -217,15 +155,9 @@ void ImageDataLayer::LayerSetUp(const vector*>& bottom, template void ImageDataLayer::CreatePrefetchThread() { phase_ = Caffe::phase(); - const bool prefetch_needs_rand = - this->layer_param_.image_data_param().shuffle() || - this->layer_param_.image_data_param().crop_size(); - if (prefetch_needs_rand) { - const unsigned int prefetch_rng_seed = caffe_rng_rand(); - prefetch_rng_.reset(new Caffe::RNG(prefetch_rng_seed)); - } else { - prefetch_rng_.reset(); - } + + data_transformer_.InitRand(); + // Create the thread. CHECK(!StartInternalThread()) << "Pthread execution failed"; } @@ -243,13 +175,6 @@ void ImageDataLayer::JoinPrefetchThread() { CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed"; } -template -unsigned int ImageDataLayer::PrefetchRand() { - caffe::rng_t* prefetch_rng = - static_cast(prefetch_rng_->generator()); - return (*prefetch_rng)(); -} - template void ImageDataLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index b7c6bca8194..75f4b2862b0 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -345,7 +345,7 @@ message ConvolutionParameter { } // Message that stores parameters used to apply transformation -// to the data layer's data +// to the data layer's data message TransformationParameter { // For data pre-processing, we can do simple scaling and subtracting the // data mean, if provided. Note that the mean subtraction is always carried @@ -444,27 +444,20 @@ message HingeLossParameter { message ImageDataParameter { // Specify the data source. optional string source = 1; - // For data pre-processing, we can do simple scaling and subtracting the - // data mean, if provided. Note that the mean subtraction is always carried - // out before scaling. - optional float scale = 2 [default = 1]; - optional string mean_file = 3; // Specify the batch size. - optional uint32 batch_size = 4; - // Specify if we would like to randomly crop an image. - optional uint32 crop_size = 5 [default = 0]; - // Specify if we want to randomly mirror data. - optional bool mirror = 6 [default = false]; + optional uint32 batch_size = 2; // The rand_skip variable is for the data layer to skip a few data points // to avoid all asynchronous sgd clients to start at the same point. The skip // point would be set as rand_skip * rand(0,1). Note that rand_skip should not // be larger than the number of keys in the leveldb. - optional uint32 rand_skip = 7 [default = 0]; + optional uint32 rand_skip = 3 [default = 0]; // Whether or not ImageLayer should shuffle the list of files at every epoch. - optional bool shuffle = 8 [default = false]; + optional bool shuffle = 4 [default = false]; // It will also resize images if new_height or new_width are not zero. - optional uint32 new_height = 9 [default = 0]; - optional uint32 new_width = 10 [default = 0]; + optional uint32 new_height = 5 [default = 0]; + optional uint32 new_width = 6 [default = 0]; + // Parameters for data pre-processing. + optional TransformationParameter transform_param = 7; } // Message that stores parameters InfogainLossLayer @@ -505,7 +498,7 @@ message MemoryDataParameter { message MVNParameter { // This parameter can be set to false to normalize mean only optional bool normalize_variance = 1 [default = true]; - + // This parameter can be set to true to perform DNN-like MVN optional bool across_channels = 2 [default = false]; } diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index 3e9ab2194ee..9d0cd58d84c 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -1542,11 +1542,13 @@ TEST_F(V0UpgradeTest, TestAllParams) { " type: IMAGE_DATA " " image_data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-images' " - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " " batch_size: 256 " - " crop_size: 227 " - " mirror: true " - " scale: 0.25 " + " transform_param {" + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " + " crop_size: 227 " + " mirror: true " + " scale: 0.25 " + " } " " rand_skip: 73 " " shuffle: true " " new_height: 40 " diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index 48eb579fe00..21fc038a15d 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -310,8 +310,8 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, layer_param->mutable_data_param()->mutable_transform_param()-> set_scale(v0_layer_param.scale()); } else if (type == "images") { - layer_param->mutable_image_data_param()->set_scale( - v0_layer_param.scale()); + layer_param->mutable_image_data_param()->mutable_transform_param()-> + set_scale(v0_layer_param.scale()); } else { LOG(ERROR) << "Unknown parameter scale for layer type " << type; is_fully_compatible = false; @@ -322,8 +322,8 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, layer_param->mutable_data_param()->mutable_transform_param()-> set_mean_file(v0_layer_param.meanfile()); } else if (type == "images") { - layer_param->mutable_image_data_param()->set_mean_file( - v0_layer_param.meanfile()); + layer_param->mutable_image_data_param()->mutable_transform_param()-> + set_mean_file(v0_layer_param.meanfile()); } else if (type == "window_data") { layer_param->mutable_window_data_param()->set_mean_file( v0_layer_param.meanfile()); @@ -355,8 +355,8 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, layer_param->mutable_data_param()->mutable_transform_param()-> set_crop_size(v0_layer_param.cropsize()); } else if (type == "images") { - layer_param->mutable_image_data_param()->set_crop_size( - v0_layer_param.cropsize()); + layer_param->mutable_image_data_param()->mutable_transform_param()-> + set_crop_size(v0_layer_param.cropsize()); } else if (type == "window_data") { layer_param->mutable_window_data_param()->set_crop_size( v0_layer_param.cropsize()); @@ -370,8 +370,8 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, layer_param->mutable_data_param()->mutable_transform_param()-> set_mirror(v0_layer_param.mirror()); } else if (type == "images") { - layer_param->mutable_image_data_param()->set_mirror( - v0_layer_param.mirror()); + layer_param->mutable_image_data_param()->mutable_transform_param()-> + set_mirror(v0_layer_param.mirror()); } else if (type == "window_data") { layer_param->mutable_window_data_param()->set_mirror( v0_layer_param.mirror()); From 3b0f7a57f0ad6cd33ded7d148c7ad7e8f2a29e4d Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 21 Aug 2014 12:53:43 -0700 Subject: [PATCH 0512/2053] If specified, --gpu flag overrides SolverParameter solver_mode. --- tools/caffe.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index bc404d3b318..77e031ef3c1 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -89,6 +89,17 @@ int train() { LOG(INFO) << "Starting Optimization"; caffe::SGDSolver solver(solver_param); + + // Set device id and mode + if (FLAGS_gpu >= 0) { + LOG(INFO) << "Use GPU with device ID " << FLAGS_gpu; + Caffe::SetDevice(FLAGS_gpu); + Caffe::set_mode(Caffe::GPU); + } else if (!solver_param.has_solver_mode()) { + LOG(INFO) << "Use CPU."; + Caffe::set_mode(Caffe::CPU); + } + if (FLAGS_snapshot.size()) { LOG(INFO) << "Resuming from " << FLAGS_snapshot; solver.Solve(FLAGS_snapshot); From 3e20ca98888aa1e47acc3e6100a7a66095e04183 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 21 Aug 2014 14:19:33 -0700 Subject: [PATCH 0513/2053] [docs] fix citation bibtex --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index e7a819824de..27ca28d2753 100644 --- a/docs/index.md +++ b/docs/index.md @@ -66,7 +66,7 @@ Please cite Caffe in your publications if it helps your research: Author = {Yangqing Jia}, Title = { {Caffe}: An Open Source Convolutional Architecture for Fast Feature Embedding}, Year = {2013}, - Howpublished = {\url{http://caffe.berkeleyvision.org/} + Howpublished = {\url{http://caffe.berkeleyvision.org/}} } If you do publish a paper where Caffe helped your research, we encourage you to update the [publications wiki](https://github.com/BVLC/caffe/wiki/Publications). From b497475e2958a2ce79621da2978b885e88bf109e Mon Sep 17 00:00:00 2001 From: Jason Yosinski Date: Sat, 16 Aug 2014 23:18:12 -0700 Subject: [PATCH 0514/2053] Updated documentation to include instructions to install protobuf with Python support on Mac OS X --- docs/installation.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index 73a35395c4e..863800f77dd 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -135,7 +135,8 @@ In other `ENV` settings, things may not work as expected. Simply run the following: brew install --build-from-source --with-python boost - for x in snappy leveldb protobuf gflags glog szip lmdb homebrew/science/opencv; do brew install $x; done + brew install --with-python protobuf + for x in snappy leveldb gflags glog szip lmdb homebrew/science/opencv; do brew install $x; done Building boost from source is needed to link against your local Python (exceptions might be raised during some OS X installs, but **ignore** these and continue). If you do not need the Python wrapper, simply doing `brew install boost` is fine. From b84f2d255e9bbda6939cd96ac7e338a2671ab6ad Mon Sep 17 00:00:00 2001 From: Jason Yosinski Date: Sat, 16 Aug 2014 23:41:52 -0700 Subject: [PATCH 0515/2053] Updated installation docs for OS X 10.9 brew install protobuf as well --- docs/installation.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index 863800f77dd..6306f6338e4 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -173,7 +173,8 @@ To edit the formulae in turn, run After this, run - for x in snappy leveldb protobuf gflags glog szip lmdb homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; done + for x in snappy leveldb gflags glog szip lmdb homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; done + brew uninstall protobuf; brew install --build-from-source --with-python --fresh -vd protobuf brew install --build-from-source --with-python --fresh -vd boost **Note** that `brew install --build-from-source --fresh -vd boost` is fine if you do not need the Caffe Python wrapper. From ac85f8136b287f231ea495ecba5a72341018a1ae Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Thu, 21 Aug 2014 12:53:43 -0700 Subject: [PATCH 0516/2053] If specified, --gpu flag overrides SolverParameter solver_mode. --- tools/caffe.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 13398ae8577..eb32128351e 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -89,6 +89,17 @@ int train() { LOG(INFO) << "Starting Optimization"; caffe::SGDSolver solver(solver_param); + + // Set device id and mode + if (FLAGS_gpu >= 0) { + LOG(INFO) << "Use GPU with device ID " << FLAGS_gpu; + Caffe::SetDevice(FLAGS_gpu); + Caffe::set_mode(Caffe::GPU); + } else if (!solver_param.has_solver_mode()) { + LOG(INFO) << "Use CPU."; + Caffe::set_mode(Caffe::CPU); + } + if (FLAGS_snapshot.size()) { LOG(INFO) << "Resuming from " << FLAGS_snapshot; solver.Solve(FLAGS_snapshot); From 3141e719443353e84a56538732d1688a81cffa24 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 21 Aug 2014 19:03:09 -0700 Subject: [PATCH 0517/2053] restore old data transformation parameters for compatibility --- src/caffe/proto/caffe.proto | 44 +++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 75f4b2862b0..9c0825284d8 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -367,17 +367,26 @@ message DataParameter { // Specify the data source. optional string source = 1; // Specify the batch size. - optional uint32 batch_size = 3; + optional uint32 batch_size = 4; // The rand_skip variable is for the data layer to skip a few data points // to avoid all asynchronous sgd clients to start at the same point. The skip // point would be set as rand_skip * rand(0,1). Note that rand_skip should not // be larger than the number of keys in the leveldb. - optional uint32 rand_skip = 4 [default = 0]; - + optional uint32 rand_skip = 7 [default = 0]; + optional DB backend = 8 [default = LEVELDB]; // Parameters for data pre-processing. - optional TransformationParameter transform_param = 5; - - optional DB backend = 6 [default = LEVELDB]; + optional TransformationParameter transform_param = 9; + // DEPRECATED. See TransformParameter. For data pre-processing, we can do + // simple scaling and subtracting the data mean, if provided. Note that the + // mean subtraction is always carried out before scaling. + optional float scale = 2 [default = 1]; + optional string mean_file = 3; + // DEPRECATED. See TransformParameter. Specify if we would like to randomly + // crop an image. + optional uint32 crop_size = 5 [default = 0]; + // DEPRECATED. See TransformParameter. Specify if we want to randomly mirror + // data. + optional bool mirror = 6 [default = false]; } // Message that stores parameters used by DropoutLayer @@ -445,19 +454,30 @@ message ImageDataParameter { // Specify the data source. optional string source = 1; // Specify the batch size. - optional uint32 batch_size = 2; + optional uint32 batch_size = 4; // The rand_skip variable is for the data layer to skip a few data points // to avoid all asynchronous sgd clients to start at the same point. The skip // point would be set as rand_skip * rand(0,1). Note that rand_skip should not // be larger than the number of keys in the leveldb. - optional uint32 rand_skip = 3 [default = 0]; + optional uint32 rand_skip = 7 [default = 0]; // Whether or not ImageLayer should shuffle the list of files at every epoch. - optional bool shuffle = 4 [default = false]; + optional bool shuffle = 8 [default = false]; // It will also resize images if new_height or new_width are not zero. - optional uint32 new_height = 5 [default = 0]; - optional uint32 new_width = 6 [default = 0]; + optional uint32 new_height = 9 [default = 0]; + optional uint32 new_width = 10 [default = 0]; // Parameters for data pre-processing. - optional TransformationParameter transform_param = 7; + optional TransformationParameter transform_param = 11; + // DEPRECATED. See TransformParameter. For data pre-processing, we can do + // simple scaling and subtracting the data mean, if provided. Note that the + // mean subtraction is always carried out before scaling. + optional float scale = 2 [default = 1]; + optional string mean_file = 3; + // DEPRECATED. See TransformParameter. Specify if we would like to randomly + // crop an image. + optional uint32 crop_size = 5 [default = 0]; + // DEPRECATED. See TransformParameter. Specify if we want to randomly mirror + // data. + optional bool mirror = 6 [default = false]; } // Message that stores parameters InfogainLossLayer From af1d065a4ffa42e6c60812d2e90ddeb65acd447f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 21 Aug 2014 19:02:41 -0700 Subject: [PATCH 0518/2053] compact net parameter upgrade --- include/caffe/util/upgrade_proto.hpp | 3 +++ src/caffe/util/upgrade_proto.cpp | 35 ++++++++++------------------ 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/include/caffe/util/upgrade_proto.hpp b/include/caffe/util/upgrade_proto.hpp index 1ee184a34e9..3b1062479f2 100644 --- a/include/caffe/util/upgrade_proto.hpp +++ b/include/caffe/util/upgrade_proto.hpp @@ -34,6 +34,9 @@ LayerParameter_LayerType UpgradeV0LayerType(const string& type); void NetParameterToPrettyPrint(const NetParameter& param, NetParameterPrettyPrint* pretty_param); +// Check for deprecations and upgrade the NetParameter as needed. +void UpgradeNetAsNeeded(NetParameter* param); + // Read parameters from a file into a NetParameter proto message. void ReadNetParamsFromTextFileOrDie(const string& param_file, NetParameter* param); diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index 21fc038a15d..c9c57a21eef 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -567,10 +567,7 @@ void NetParameterToPrettyPrint(const NetParameter& param, } } -void ReadNetParamsFromTextFileOrDie(const string& param_file, - NetParameter* param) { - CHECK(ReadProtoFromTextFile(param_file, param)) - << "Failed to parse NetParameter file: " << param_file; +void UpgradeNetAsNeeded(const string& param_file, NetParameter* param) { if (NetNeedsUpgrade(*param)) { // NetParameter was specified using the old style (V0LayerParameter); try to // upgrade it. @@ -585,32 +582,24 @@ void ReadNetParamsFromTextFileOrDie(const string& param_file, << "V0LayerParameter"; } LOG(ERROR) << "Note that future Caffe releases will not support " - << "V0NetParameter; use ./build/tools/upgrade_net_proto_text.bin to " - << "upgrade this and any other network proto files to the new format."; + << "V0NetParameter; use ./build/tools/upgrade_net_proto_text for " + << "prototxt and ./build/tools/upgrade_net_proto_binary for model " + << "weights upgrade this and any other net protos to the new format."; } } +void ReadNetParamsFromTextFileOrDie(const string& param_file, + NetParameter* param) { + CHECK(ReadProtoFromTextFile(param_file, param)) + << "Failed to parse NetParameter file: " << param_file; + UpgradeNetAsNeeded(param_file, param); +} + void ReadNetParamsFromBinaryFileOrDie(const string& param_file, NetParameter* param) { CHECK(ReadProtoFromBinaryFile(param_file, param)) << "Failed to parse NetParameter file: " << param_file; - if (NetNeedsUpgrade(*param)) { - // NetParameter was specified using the old style (V0LayerParameter); try to - // upgrade it. - LOG(ERROR) << "Attempting to upgrade input file specified using deprecated " - << "V0LayerParameter: " << param_file; - NetParameter original_param(*param); - if (!UpgradeV0Net(original_param, param)) { - LOG(ERROR) << "Warning: had one or more problems upgrading " - << "V0NetParameter to NetParameter (see above); continuing anyway."; - } else { - LOG(INFO) << "Successfully upgraded file specified using deprecated " - << "V0LayerParameter"; - } - LOG(ERROR) << "Note that future Caffe releases will not support " - << "V0NetParameter; use ./build/tools/upgrade_net_proto_binary.bin to " - << "upgrade this and any other network proto files to the new format."; - } + UpgradeNetAsNeeded(param_file, param); } } // namespace caffe From c14c8be5f123ab650922750976f380d461a6d5cd Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 21 Aug 2014 21:22:44 -0700 Subject: [PATCH 0519/2053] upgrade net parameter data transformation fields automagically Convert DataParameter and ImageDataParameter data transformation fields into a TransformationParameter. --- include/caffe/util/upgrade_proto.hpp | 7 +++ src/caffe/util/upgrade_proto.cpp | 79 ++++++++++++++++++++++++++++ tools/upgrade_net_proto_text.cpp | 5 ++ 3 files changed, 91 insertions(+) diff --git a/include/caffe/util/upgrade_proto.hpp b/include/caffe/util/upgrade_proto.hpp index 3b1062479f2..45483685133 100644 --- a/include/caffe/util/upgrade_proto.hpp +++ b/include/caffe/util/upgrade_proto.hpp @@ -29,6 +29,13 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, LayerParameter_LayerType UpgradeV0LayerType(const string& type); +// Return true iff any layer contains deprecated data transformation parameters. +bool NetNeedsDataUpgrade(const NetParameter& net_param); + +// Perform all necessary transformations to upgrade old transformation fields +// into a TransformationParameter. +void UpgradeNetDataTransformation(NetParameter* net_param); + // Convert a NetParameter to NetParameterPrettyPrint used for dumping to // proto text files. void NetParameterToPrettyPrint(const NetParameter& param, diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index c9c57a21eef..9045abbe17d 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -547,6 +547,75 @@ LayerParameter_LayerType UpgradeV0LayerType(const string& type) { } } +bool NetNeedsDataUpgrade(const NetParameter& net_param) { + for (int i = 0; i < net_param.layers_size(); ++i) { + if (net_param.layers(i).type() == LayerParameter_LayerType_DATA) { + DataParameter layer_param = net_param.layers(i).data_param(); + if (layer_param.has_scale()) { return true; } + if (layer_param.has_mean_file()) { return true; } + if (layer_param.has_crop_size()) { return true; } + if (layer_param.has_mirror()) { return true; } + } + if (net_param.layers(i).type() == LayerParameter_LayerType_IMAGE_DATA) { + ImageDataParameter layer_param = net_param.layers(i).image_data_param(); + if (layer_param.has_scale()) { return true; } + if (layer_param.has_mean_file()) { return true; } + if (layer_param.has_crop_size()) { return true; } + if (layer_param.has_mirror()) { return true; } + } + } + return false; +} + +void UpgradeNetDataTransformation(NetParameter* net_param) { + for (int i = 0; i < net_param->layers_size(); ++i) { + if (net_param->layers(i).type() == LayerParameter_LayerType_DATA) { + DataParameter* layer_param = + net_param->mutable_layers(i)->mutable_data_param(); + TransformationParameter* transform_param = + layer_param->mutable_transform_param(); + if (layer_param->has_scale()) { + transform_param->set_scale(layer_param->scale()); + layer_param->clear_scale(); + } + if (layer_param->has_mean_file()) { + transform_param->set_mean_file(layer_param->mean_file()); + layer_param->clear_mean_file(); + } + if (layer_param->has_crop_size()) { + transform_param->set_crop_size(layer_param->crop_size()); + layer_param->clear_crop_size(); + } + if (layer_param->has_mirror()) { + transform_param->set_mirror(layer_param->mirror()); + layer_param->clear_mirror(); + } + } + if (net_param->layers(i).type() == LayerParameter_LayerType_IMAGE_DATA) { + ImageDataParameter* layer_param = + net_param->mutable_layers(i)->mutable_image_data_param(); + TransformationParameter* transform_param = + layer_param->mutable_transform_param(); + if (layer_param->has_scale()) { + transform_param->set_scale(layer_param->scale()); + layer_param->clear_scale(); + } + if (layer_param->has_mean_file()) { + transform_param->set_mean_file(layer_param->mean_file()); + layer_param->clear_mean_file(); + } + if (layer_param->has_crop_size()) { + transform_param->set_crop_size(layer_param->crop_size()); + layer_param->clear_crop_size(); + } + if (layer_param->has_mirror()) { + transform_param->set_mirror(layer_param->mirror()); + layer_param->clear_mirror(); + } + } + } +} + void NetParameterToPrettyPrint(const NetParameter& param, NetParameterPrettyPrint* pretty_param) { pretty_param->Clear(); @@ -586,6 +655,16 @@ void UpgradeNetAsNeeded(const string& param_file, NetParameter* param) { << "prototxt and ./build/tools/upgrade_net_proto_binary for model " << "weights upgrade this and any other net protos to the new format."; } + // NetParameter uses old style data transformation fields; try to upgrade it. + if (NetNeedsDataUpgrade(*param)) { + LOG(ERROR) << "Attempting to upgrade input file specified using deprecated " + << "transformation parameters: " << param_file; + UpgradeNetDataTransformation(param); + LOG(INFO) << "Successfully upgraded file specified using deprecated " + << "data transformation parameters."; + LOG(ERROR) << "Note that future Caffe releases will only support " + << "transform_param messages for transformation fields."; + } } void ReadNetParamsFromTextFileOrDie(const string& param_file, diff --git a/tools/upgrade_net_proto_text.cpp b/tools/upgrade_net_proto_text.cpp index 1176585b02a..2f290fc5e14 100644 --- a/tools/upgrade_net_proto_text.cpp +++ b/tools/upgrade_net_proto_text.cpp @@ -29,6 +29,7 @@ int main(int argc, char** argv) { return 2; } bool need_upgrade = NetNeedsUpgrade(net_param); + bool need_data_upgrade = NetNeedsDataUpgrade(net_param); bool success = true; if (need_upgrade) { NetParameter v0_net_param(net_param); @@ -37,6 +38,10 @@ int main(int argc, char** argv) { LOG(ERROR) << "File already in V1 proto format: " << argv[1]; } + if (need_data_upgrade) { + UpgradeNetDataTransformation(&net_param); + } + // Convert to a NetParameterPrettyPrint to print fields in desired // order. NetParameterPrettyPrint net_param_pretty; From 45262c8099e6d0265f7e3d8d13d5045a4679b2c1 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 21 Aug 2014 22:19:09 -0700 Subject: [PATCH 0520/2053] upgrade model definitions for transformation params --- .../cifar10/cifar10_full_train_test.prototxt | 8 ++++++-- .../cifar10/cifar10_quick_train_test.prototxt | 8 ++++++-- .../feature_extraction/imagenet_val.prototxt | 8 +++++--- examples/imagenet/alexnet_train_val.prototxt | 16 ++++++++++------ examples/imagenet/imagenet_train_val.prototxt | 16 ++++++++++------ .../mnist/lenet_consolidated_solver.prototxt | 12 +++++++++--- examples/mnist/lenet_train_test.prototxt | 8 ++++++-- examples/mnist/mnist_autoencoder.prototxt | 8 ++++++-- 8 files changed, 58 insertions(+), 26 deletions(-) diff --git a/examples/cifar10/cifar10_full_train_test.prototxt b/examples/cifar10/cifar10_full_train_test.prototxt index 4fd52fec133..c01fef46ac0 100644 --- a/examples/cifar10/cifar10_full_train_test.prototxt +++ b/examples/cifar10/cifar10_full_train_test.prototxt @@ -6,8 +6,10 @@ layers { top: "label" data_param { source: "cifar10-leveldb/cifar-train-leveldb" - mean_file: "mean.binaryproto" batch_size: 100 + transform_param { + mean_file: "mean.binaryproto" + } } include: { phase: TRAIN } } @@ -18,8 +20,10 @@ layers { top: "label" data_param { source: "cifar10-leveldb/cifar-test-leveldb" - mean_file: "mean.binaryproto" batch_size: 100 + transform_param { + mean_file: "mean.binaryproto" + } } include: { phase: TEST } } diff --git a/examples/cifar10/cifar10_quick_train_test.prototxt b/examples/cifar10/cifar10_quick_train_test.prototxt index b34d1cd2fcb..779dacf6758 100644 --- a/examples/cifar10/cifar10_quick_train_test.prototxt +++ b/examples/cifar10/cifar10_quick_train_test.prototxt @@ -6,8 +6,10 @@ layers { top: "label" data_param { source: "cifar10-leveldb/cifar-train-leveldb" - mean_file: "mean.binaryproto" batch_size: 100 + transform_param { + mean_file: "mean.binaryproto" + } } include: { phase: TRAIN } } @@ -18,8 +20,10 @@ layers { top: "label" data_param { source: "cifar10-leveldb/cifar-test-leveldb" - mean_file: "mean.binaryproto" batch_size: 100 + transform_param { + mean_file: "mean.binaryproto" + } } include: { phase: TEST } } diff --git a/examples/feature_extraction/imagenet_val.prototxt b/examples/feature_extraction/imagenet_val.prototxt index b0451a1a114..8d5b07626b5 100644 --- a/examples/feature_extraction/imagenet_val.prototxt +++ b/examples/feature_extraction/imagenet_val.prototxt @@ -6,12 +6,14 @@ layers { top: "label" image_data_param { source: "$CAFFE_DIR/examples/_temp/file_list.txt" - mean_file: "$CAFFE_DIR/data/ilsvrc12/imagenet_mean.binaryproto" batch_size: 50 - crop_size: 227 - mirror: false new_height: 256 new_width: 256 + transform_param { + crop_size: 227 + mean_file: "$CAFFE_DIR/data/ilsvrc12/imagenet_mean.binaryproto" + mirror: false + } } } layers { diff --git a/examples/imagenet/alexnet_train_val.prototxt b/examples/imagenet/alexnet_train_val.prototxt index 8d7977d981e..8ffdb7a8f69 100644 --- a/examples/imagenet/alexnet_train_val.prototxt +++ b/examples/imagenet/alexnet_train_val.prototxt @@ -6,10 +6,12 @@ layers { top: "label" data_param { source: "ilsvrc12_train_leveldb" - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" batch_size: 256 - crop_size: 227 - mirror: true + transform_param { + crop_size: 227 + mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + mirror: true + } } include: { phase: TRAIN } } @@ -20,10 +22,12 @@ layers { top: "label" data_param { source: "ilsvrc12_val_leveldb" - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" batch_size: 50 - crop_size: 227 - mirror: false + transform_param { + crop_size: 227 + mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + mirror: false + } } include: { phase: TEST } } diff --git a/examples/imagenet/imagenet_train_val.prototxt b/examples/imagenet/imagenet_train_val.prototxt index ea1f907f00d..5f9c83949f5 100644 --- a/examples/imagenet/imagenet_train_val.prototxt +++ b/examples/imagenet/imagenet_train_val.prototxt @@ -6,10 +6,12 @@ layers { top: "label" data_param { source: "ilsvrc12_train_leveldb" - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" batch_size: 256 - crop_size: 227 - mirror: true + transform_param { + crop_size: 227 + mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + mirror: true + } } include: { phase: TRAIN } } @@ -20,10 +22,12 @@ layers { top: "label" data_param { source: "ilsvrc12_val_leveldb" - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" batch_size: 50 - crop_size: 227 - mirror: false + transform_param { + crop_size: 227 + mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + mirror: false + } } include: { phase: TEST } } diff --git a/examples/mnist/lenet_consolidated_solver.prototxt b/examples/mnist/lenet_consolidated_solver.prototxt index 42f54e4e93a..2e69589c67f 100644 --- a/examples/mnist/lenet_consolidated_solver.prototxt +++ b/examples/mnist/lenet_consolidated_solver.prototxt @@ -51,8 +51,10 @@ net_param { top: "label" data_param { source: "mnist-train-leveldb" - scale: 0.00390625 batch_size: 64 + transform_param { + scale: 0.00390625 + } } include: { phase: TRAIN } } @@ -63,8 +65,10 @@ net_param { top: "label" data_param { source: "mnist-test-leveldb" - scale: 0.00390625 batch_size: 100 + transform_param { + scale: 0.00390625 + } } include: { phase: TEST @@ -78,8 +82,10 @@ net_param { top: "label" data_param { source: "mnist-train-leveldb" - scale: 0.00390625 batch_size: 100 + transform_param { + scale: 0.00390625 + } } include: { phase: TEST diff --git a/examples/mnist/lenet_train_test.prototxt b/examples/mnist/lenet_train_test.prototxt index 3c77452130c..578641d5b2d 100644 --- a/examples/mnist/lenet_train_test.prototxt +++ b/examples/mnist/lenet_train_test.prototxt @@ -6,8 +6,10 @@ layers { top: "label" data_param { source: "mnist-train-leveldb" - scale: 0.00390625 batch_size: 64 + transform_param { + scale: 0.00390625 + } } include: { phase: TRAIN } } @@ -18,8 +20,10 @@ layers { top: "label" data_param { source: "mnist-test-leveldb" - scale: 0.00390625 batch_size: 100 + transform_param { + scale: 0.00390625 + } } include: { phase: TEST } } diff --git a/examples/mnist/mnist_autoencoder.prototxt b/examples/mnist/mnist_autoencoder.prototxt index ad1e7665bf2..3af6b7afcb3 100644 --- a/examples/mnist/mnist_autoencoder.prototxt +++ b/examples/mnist/mnist_autoencoder.prototxt @@ -5,8 +5,10 @@ layers { type: DATA data_param { source: "mnist-train-leveldb" - scale: 0.0039215684 batch_size: 100 + transform_param { + scale: 0.0039215684 + } } include: { phase: TRAIN } } @@ -16,8 +18,10 @@ layers { type: DATA data_param { source: "mnist-test-leveldb" - scale: 0.0039215684 batch_size: 100 + transform_param { + scale: 0.0039215684 + } } include: { phase: TEST } } From 27555cdc403698134a729fa74d5b3d45d26090ec Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Fri, 22 Aug 2014 00:02:17 -0700 Subject: [PATCH 0521/2053] fix parameter for transformation in ImageDataLayer constructor --- include/caffe/data_layers.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index bc29429832e..f972965b45b 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -179,7 +179,7 @@ class ImageDataLayer : public Layer, public InternalThread { public: explicit ImageDataLayer(const LayerParameter& param) : Layer(param), - data_transformer_(param.data_param().transform_param()) {} + data_transformer_(param.image_data_param().transform_param()) {} virtual ~ImageDataLayer(); virtual void LayerSetUp(const vector*>& bottom, vector*>* top); From 3aa2fc0e3eaa75e254ed49eb848093bbd31cf4d0 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 23 Aug 2014 19:25:56 -0700 Subject: [PATCH 0522/2053] move {InnerProduct,Eltwise}Layer to common instead of vision --- include/caffe/common_layers.hpp | 64 +++++++++++++++++++++++++++++++++ include/caffe/vision_layers.hpp | 64 --------------------------------- 2 files changed, 64 insertions(+), 64 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 979fd9a6dae..ed47dbc2620 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -86,6 +86,37 @@ class ConcatLayer : public Layer { int concat_dim_; }; +/* EltwiseLayer + Compute elementwise operations like product or sum. +*/ +template +class EltwiseLayer : public Layer { + public: + explicit EltwiseLayer(const LayerParameter& param) + : Layer(param) {} + virtual void LayerSetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_ELTWISE; + } + virtual inline int MinBottomBlobs() const { return 2; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual void Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + + EltwiseParameter_EltwiseOp op_; + vector coeffs_; +}; + /* FlattenLayer */ template @@ -115,6 +146,39 @@ class FlattenLayer : public Layer { int count_; }; +/* InnerProductLayer +*/ +template +class InnerProductLayer : public Layer { + public: + explicit InnerProductLayer(const LayerParameter& param) + : Layer(param) {} + virtual void LayerSetUp(const vector*>& bottom, + vector*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_INNER_PRODUCT; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + + protected: + virtual void Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom); + + int M_; + int K_; + int N_; + bool bias_term_; + Blob bias_multiplier_; +}; + /* MVNLayer */ template diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index d2d9ab3f783..02f9e43b6d9 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -60,37 +60,6 @@ class ConvolutionLayer : public Layer { int N_; }; -/* EltwiseLayer - Compute elementwise operations like product or sum. -*/ -template -class EltwiseLayer : public Layer { - public: - explicit EltwiseLayer(const LayerParameter& param) - : Layer(param) {} - virtual void LayerSetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_ELTWISE; - } - virtual inline int MinBottomBlobs() const { return 2; } - virtual inline int ExactNumTopBlobs() const { return 1; } - - protected: - virtual void Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual void Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - - EltwiseParameter_EltwiseOp op_; - vector coeffs_; -}; - /* Im2colLayer */ template @@ -125,39 +94,6 @@ class Im2colLayer : public Layer { int pad_h_, pad_w_; }; -/* InnerProductLayer -*/ -template -class InnerProductLayer : public Layer { - public: - explicit InnerProductLayer(const LayerParameter& param) - : Layer(param) {} - virtual void LayerSetUp(const vector*>& bottom, - vector*>* top); - - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_INNER_PRODUCT; - } - virtual inline int ExactNumBottomBlobs() const { return 1; } - virtual inline int ExactNumTopBlobs() const { return 1; } - - protected: - virtual void Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual void Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom); - - int M_; - int K_; - int N_; - bool bias_term_; - Blob bias_multiplier_; -}; - // Forward declare PoolingLayer and SplitLayer for use in LRNLayer. template class PoolingLayer; template class SplitLayer; From 76fd37263aa844a92b5f2fdde29c294c1e87a810 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 23 Aug 2014 22:41:30 -0700 Subject: [PATCH 0523/2053] fix internal thread interface confusion thanks @ronghanghu for pointing this out in #964 --- include/caffe/internal_thread.hpp | 4 ++-- src/caffe/layers/data_layer.cpp | 2 +- src/caffe/layers/image_data_layer.cpp | 2 +- src/caffe/layers/window_data_layer.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/caffe/internal_thread.hpp b/include/caffe/internal_thread.hpp index 8520899ada6..bb0f932566d 100644 --- a/include/caffe/internal_thread.hpp +++ b/include/caffe/internal_thread.hpp @@ -15,9 +15,9 @@ class InternalThread { InternalThread() {} virtual ~InternalThread() {} - /** Returns true if the thread was successfully started **/ + /** Returns true if the thread was successfully started. **/ bool StartInternalThread() { - return pthread_create(&_thread, NULL, InternalThreadEntryFunc, this); + return (pthread_create(&_thread, NULL, InternalThreadEntryFunc, this) == 0); } /** Will not return until the internal thread has exited. */ diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index b6ac5d6b351..0cc2769bfc9 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -244,7 +244,7 @@ void DataLayer::CreatePrefetchThread() { data_transformer_.InitRand(); - CHECK(!StartInternalThread()) << "Pthread execution failed"; + CHECK(StartInternalThread()) << "Pthread execution failed"; } template diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 85ee9885b5c..dc39e694bbb 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -159,7 +159,7 @@ void ImageDataLayer::CreatePrefetchThread() { data_transformer_.InitRand(); // Create the thread. - CHECK(!StartInternalThread()) << "Pthread execution failed"; + CHECK(StartInternalThread()) << "Pthread execution failed"; } template diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 8138234ebee..bed03d8e8d2 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -408,7 +408,7 @@ void WindowDataLayer::CreatePrefetchThread() { prefetch_rng_.reset(); } // Create the thread. - CHECK(!StartInternalThread()) << "Pthread execution failed."; + CHECK(StartInternalThread()) << "Pthread execution failed."; } template From 113a21ab70180b4be7b7087f72421cff3b1047c7 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 24 Aug 2014 15:36:52 -0700 Subject: [PATCH 0524/2053] [example] add fully-convolutional efficiency note + confidence map - spell out fully-convolutional efficiency - add confidence map - fix input size: 451 x 451 is correct for an 8 x 8 output map by the equation input size = 227 + 32(d-1) for output map dimension of d --- examples/imagenet/imagenet_full_conv.prototxt | 4 +- examples/net_surgery.ipynb | 57 ++++++++++++------- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/examples/imagenet/imagenet_full_conv.prototxt b/examples/imagenet/imagenet_full_conv.prototxt index 6473c1f78fc..570efae5901 100644 --- a/examples/imagenet/imagenet_full_conv.prototxt +++ b/examples/imagenet/imagenet_full_conv.prototxt @@ -2,8 +2,8 @@ name: "CaffeNetConv" input: "data" input_dim: 1 input_dim: 3 -input_dim: 454 -input_dim: 454 +input_dim: 451 +input_dim: 451 layers { name: "conv1" type: CONVOLUTION diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 4710236c6e9..2d8bbb106be 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -3,7 +3,7 @@ "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "example_name": "Editing model parameters", "include_in_docs": true, - "signature": "sha256:742fe1bbeabccae59725a5fd6e97a0a0b2b90842d1dd5953aecd353b2d87cab3" + "signature": "sha256:10c551b31a64c2210f6094dbb603f26c206a7b72cd99032f475cb5023edcdc43" }, "nbformat": 3, "nbformat_minor": 0, @@ -14,11 +14,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Net Surgery\n", + "## Net Surgery for a Fully-Convolutional Model\n", "\n", - "Caffe models can be transformed to your particular needs by editing the network parameters. In this example, we translate the inner product classifier layers of the Caffe Reference ImageNet model into convolutional layers. This yields a fully-convolutional model that generates a classification map for any given input size instead of a single classification. In particular, a classification will be made for every 6 $\\times$ 6 region of the `pool5` layer, giving a 8 $\\times$ 8 classification map for our example 454 $\\times$ 454 input dimensions.\n", + "Caffe models can be transformed to your particular needs by editing the network parameters. In this example, we take the standard Caffe Reference ImageNet model \"CaffeNet\" and transform it into a fully-convolutional model for efficient, dense inference on large inputs. This model generates a classification map that covers a given input size instead of a single classification. In particular a 8 $\\times$ 8 classification map on a 451 $\\times$ 451 input gives 64x the output in only 3x the time. The computation exploits a natural efficiency of convolutional neural network (CNN) structure by dynamic programming in the forward pass from shallow to deep layers.\n", "\n", - "Note that this model isn't totally appropriate for sliding-window detection since it was trained for whole-image classification. Sliding-window training and finetuning can be done by defining a sliding-window ground truth and loss such that a loss map is made for every location and solving as usual. (While planned, this is currently an exercise for the reader.)\n", + "To do so we translate the inner product classifier layers of CaffeNet into convolutional layers. This is the only change: the other layer types are agnostic to spatial size. Convolution is translation-invariant, activations are elementwise operations, and so on. The `fc6` inner product when carried out as convolution by `fc6-conv` turns into a 6 \\times 6 filter with stride 1 on `pool5`. Back in image space this gives a classification for each 227 $\\times$ 227 box with stride 32 in pixels. Remember the equation for output map / receptive field size, output = (input - kernel_size) / stride + 1, and work out the indexing details for a clear understanding.\n", "\n", "Roll up your sleeves for net surgery with pycaffe!" ] @@ -45,8 +45,8 @@ "---\r\n", "> input_dim: 10\r\n", "5,6c5,6\r\n", - "< input_dim: 454\r\n", - "< input_dim: 454\r\n", + "< input_dim: 451\r\n", + "< input_dim: 451\r\n", "---\r\n", "> input_dim: 227\r\n", "> input_dim: 227\r\n", @@ -266,12 +266,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To conclude, let's make a classification map from the example cat image. This gives an 8-by-8 labeling of overlapping image regions." + "To conclude, let's make a classification map from the example cat image and visualize the confidence as a probability heatmap. This gives an 8-by-8 prediction on overlapping regions of the 451 $\\times$ 451 input." ] }, { "cell_type": "code", - "collapsed": false, + "collapsed": true, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", @@ -279,39 +279,50 @@ "\n", "# load input and configure preprocessing\n", "im = caffe.io.load_image('images/cat.jpg')\n", - "plt.imshow(im)\n", "net_full_conv.set_phase_test()\n", "net_full_conv.set_mean('data', np.load('../python/caffe/imagenet/ilsvrc_2012_mean.npy'))\n", "net_full_conv.set_channel_swap('data', (2,1,0))\n", "net_full_conv.set_raw_scale('data', 255.0)\n", - "# make classification map by forward pass and show top prediction index per location\n", + "# make classification map by forward and print prediction indices at each location\n", "out = net_full_conv.forward_all(data=np.asarray([net_full_conv.preprocess('data', im)]))\n", - "out['prob'][0].argmax(axis=0)" + "print out['prob'][0].argmax(axis=0)\n", + "# show net input and confidence map (probability of the top prediction at each location)\n", + "plt.subplot(1, 2, 1)\n", + "plt.imshow(net_full_conv.deprocess('data', net_full_conv.blobs['data'].data[0]))\n", + "plt.subplot(1, 2, 2)\n", + "plt.imshow(out['prob'][0].max(axis=0))" ], "language": "python", "metadata": {}, "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[[282 282 281 281 281 281 277 282]\n", + " [281 283 281 281 281 281 281 282]\n", + " [283 283 283 283 283 283 281 282]\n", + " [283 283 283 281 283 283 283 259]\n", + " [283 283 283 283 283 283 283 259]\n", + " [283 283 283 283 283 283 259 259]\n", + " [283 283 283 283 259 259 259 277]\n", + " [335 335 283 283 263 263 263 277]]\n" + ] + }, { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ - "array([[282, 281, 281, 281, 281, 281, 281, 282],\n", - " [283, 283, 283, 281, 281, 281, 281, 282],\n", - " [283, 283, 283, 283, 283, 283, 287, 282],\n", - " [283, 283, 283, 281, 283, 283, 283, 283],\n", - " [283, 283, 283, 283, 283, 283, 283, 283],\n", - " [283, 283, 283, 283, 283, 283, 283, 259],\n", - " [283, 283, 283, 283, 283, 259, 259, 852],\n", - " [335, 335, 283, 283, 283, 263, 263, 331]])" + "" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\n", + "png": "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\n", "text": [ - "" + "" ] } ], @@ -323,7 +334,9 @@ "source": [ "The classifications include various cats -- 282 = tiger cat, 281 = tabby, 283 = persian -- and foxes and other mammals.\n", "\n", - "In this way the fully-connected layers can be extracted as dense features across an image (see `net_full_conv.blobs['fc6'].data` for instance), which is perhaps more useful than the classification map itself." + "In this way the fully-connected layers can be extracted as dense features across an image (see `net_full_conv.blobs['fc6'].data` for instance), which is perhaps more useful than the classification map itself.\n", + "\n", + "Note that this model isn't totally appropriate for sliding-window detection since it was trained for whole-image classification. Nevertheless it can work just fine. Sliding-window training and finetuning can be done by defining a sliding-window ground truth and loss such that a loss map is made for every location and solving as usual. (This is an exercise for the reader.)" ] }, { From 99bea71ce48eba5a4cd30d7f6b68b30fc9a97f92 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 24 Aug 2014 15:36:52 -0700 Subject: [PATCH 0525/2053] [example] add fully-convolutional efficiency note + confidence map - spell out fully-convolutional efficiency - add confidence map - fix input size: 451 x 451 is correct for an 8 x 8 output map by the equation input size = 227 + 32(d-1) for output map dimension of d --- examples/imagenet/imagenet_full_conv.prototxt | 4 +- examples/net_surgery.ipynb | 57 ++++++++++++------- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/examples/imagenet/imagenet_full_conv.prototxt b/examples/imagenet/imagenet_full_conv.prototxt index 6473c1f78fc..570efae5901 100644 --- a/examples/imagenet/imagenet_full_conv.prototxt +++ b/examples/imagenet/imagenet_full_conv.prototxt @@ -2,8 +2,8 @@ name: "CaffeNetConv" input: "data" input_dim: 1 input_dim: 3 -input_dim: 454 -input_dim: 454 +input_dim: 451 +input_dim: 451 layers { name: "conv1" type: CONVOLUTION diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 4710236c6e9..2d8bbb106be 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -3,7 +3,7 @@ "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "example_name": "Editing model parameters", "include_in_docs": true, - "signature": "sha256:742fe1bbeabccae59725a5fd6e97a0a0b2b90842d1dd5953aecd353b2d87cab3" + "signature": "sha256:10c551b31a64c2210f6094dbb603f26c206a7b72cd99032f475cb5023edcdc43" }, "nbformat": 3, "nbformat_minor": 0, @@ -14,11 +14,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Net Surgery\n", + "## Net Surgery for a Fully-Convolutional Model\n", "\n", - "Caffe models can be transformed to your particular needs by editing the network parameters. In this example, we translate the inner product classifier layers of the Caffe Reference ImageNet model into convolutional layers. This yields a fully-convolutional model that generates a classification map for any given input size instead of a single classification. In particular, a classification will be made for every 6 $\\times$ 6 region of the `pool5` layer, giving a 8 $\\times$ 8 classification map for our example 454 $\\times$ 454 input dimensions.\n", + "Caffe models can be transformed to your particular needs by editing the network parameters. In this example, we take the standard Caffe Reference ImageNet model \"CaffeNet\" and transform it into a fully-convolutional model for efficient, dense inference on large inputs. This model generates a classification map that covers a given input size instead of a single classification. In particular a 8 $\\times$ 8 classification map on a 451 $\\times$ 451 input gives 64x the output in only 3x the time. The computation exploits a natural efficiency of convolutional neural network (CNN) structure by dynamic programming in the forward pass from shallow to deep layers.\n", "\n", - "Note that this model isn't totally appropriate for sliding-window detection since it was trained for whole-image classification. Sliding-window training and finetuning can be done by defining a sliding-window ground truth and loss such that a loss map is made for every location and solving as usual. (While planned, this is currently an exercise for the reader.)\n", + "To do so we translate the inner product classifier layers of CaffeNet into convolutional layers. This is the only change: the other layer types are agnostic to spatial size. Convolution is translation-invariant, activations are elementwise operations, and so on. The `fc6` inner product when carried out as convolution by `fc6-conv` turns into a 6 \\times 6 filter with stride 1 on `pool5`. Back in image space this gives a classification for each 227 $\\times$ 227 box with stride 32 in pixels. Remember the equation for output map / receptive field size, output = (input - kernel_size) / stride + 1, and work out the indexing details for a clear understanding.\n", "\n", "Roll up your sleeves for net surgery with pycaffe!" ] @@ -45,8 +45,8 @@ "---\r\n", "> input_dim: 10\r\n", "5,6c5,6\r\n", - "< input_dim: 454\r\n", - "< input_dim: 454\r\n", + "< input_dim: 451\r\n", + "< input_dim: 451\r\n", "---\r\n", "> input_dim: 227\r\n", "> input_dim: 227\r\n", @@ -266,12 +266,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To conclude, let's make a classification map from the example cat image. This gives an 8-by-8 labeling of overlapping image regions." + "To conclude, let's make a classification map from the example cat image and visualize the confidence as a probability heatmap. This gives an 8-by-8 prediction on overlapping regions of the 451 $\\times$ 451 input." ] }, { "cell_type": "code", - "collapsed": false, + "collapsed": true, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", @@ -279,39 +279,50 @@ "\n", "# load input and configure preprocessing\n", "im = caffe.io.load_image('images/cat.jpg')\n", - "plt.imshow(im)\n", "net_full_conv.set_phase_test()\n", "net_full_conv.set_mean('data', np.load('../python/caffe/imagenet/ilsvrc_2012_mean.npy'))\n", "net_full_conv.set_channel_swap('data', (2,1,0))\n", "net_full_conv.set_raw_scale('data', 255.0)\n", - "# make classification map by forward pass and show top prediction index per location\n", + "# make classification map by forward and print prediction indices at each location\n", "out = net_full_conv.forward_all(data=np.asarray([net_full_conv.preprocess('data', im)]))\n", - "out['prob'][0].argmax(axis=0)" + "print out['prob'][0].argmax(axis=0)\n", + "# show net input and confidence map (probability of the top prediction at each location)\n", + "plt.subplot(1, 2, 1)\n", + "plt.imshow(net_full_conv.deprocess('data', net_full_conv.blobs['data'].data[0]))\n", + "plt.subplot(1, 2, 2)\n", + "plt.imshow(out['prob'][0].max(axis=0))" ], "language": "python", "metadata": {}, "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "[[282 282 281 281 281 281 277 282]\n", + " [281 283 281 281 281 281 281 282]\n", + " [283 283 283 283 283 283 281 282]\n", + " [283 283 283 281 283 283 283 259]\n", + " [283 283 283 283 283 283 283 259]\n", + " [283 283 283 283 283 283 259 259]\n", + " [283 283 283 283 259 259 259 277]\n", + " [335 335 283 283 263 263 263 277]]\n" + ] + }, { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ - "array([[282, 281, 281, 281, 281, 281, 281, 282],\n", - " [283, 283, 283, 281, 281, 281, 281, 282],\n", - " [283, 283, 283, 283, 283, 283, 287, 282],\n", - " [283, 283, 283, 281, 283, 283, 283, 283],\n", - " [283, 283, 283, 283, 283, 283, 283, 283],\n", - " [283, 283, 283, 283, 283, 283, 283, 259],\n", - " [283, 283, 283, 283, 283, 259, 259, 852],\n", - " [335, 335, 283, 283, 283, 263, 263, 331]])" + "" ] }, { "metadata": {}, "output_type": "display_data", - "png": "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\n", + "png": "iVBORw0KGgoAAAANSUhEUgAAAXMAAAC5CAYAAADavt/0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvVusLVt63/X7vjFGVc3Luu3bubbdbcdOupMYbIidODE+\nIjdbIJnEyImDxHsQL0gIJAhgQBYOT0ggRSjcZKSQvEQRoAQeiEniRJhEYAvbiS9Ju7vdp885e++1\n12VeqmpcPh5GzbXmWmefPrv7nM1OzPqkWjXqsmrWnLPmf/zH/7sMuLM7u7M7u7M7u7M7u7M7u7M7\nu7M7u7M7u7M7u7M7u7M7u7M7u7M7u7M7u7M7u7M7u7M7u7M7u7M7u7M7+8fefgj4B8CvAf/2K76X\nO7uzO7uzO/smzAG/DnwWCMDPA59/lTd0Z3d2Z3f2W930JVzze6lg/htABP4i8CMv4XXu7M7u7M7u\nbLKXAeZvAV/Z2/7Nad+d3dmd3dmdvSR7GWBuL+Gad3Znd3Znd/Z1zL+Ea34V+Mze9meo7PzKtA1W\nhvgSXvrO7gxmJ4Htsyiv4rUf/ODvsCd/4x+8ipe+s/9f2PcDf+e5z/bLeOA98CvAHwTeBf5P4MeB\nv793jr3xe78HRevYQEE80CkWQIKgohPFF0QTbck0IsTtmtxHvIBKxjRjGJghsQCGCTjnUFXMjJwj\n42BsN5mUV0A9tv5a5PDtGa4VlvM5i0VgOT9m3s4J3jOOA0+ePeODx08pxehmQpgprlNMEi541BuW\noe8TORlIRoBcCqUIpWQODjvmR4KNEJ85Ls4i23UhjYaoMjzreevzS3wXEFVSclhRSlHEwMwwyzgR\nSim4JiDOUK9YUygkJBTimEnFKAPkFbApIMLxG8c8+swx3/Fdb/PgrTc4fLDEB89qvebx+1/jS198\nlw++9oQv/sx7LD6zYPWkx9YeSkZFCBRUDR8KTefxDrzUexxjImWlPe7wJ4EHry1o5wV19f6HTeaD\n39wwPDO2zyLDusesoMEhviAevDpOvvUB3/adb/NrP/cP+d1/+LczDJHT957x/pcfV8ahQtHdZ6EY\nmbYT5i7jGk9ocn30TPjrf/5XX9az/SJmP2r//dc94Zd/4i/zHf/unyDFQIqBmPxVO6VAjNfbcdp3\n3fZ1vTv+F38S/yf+DC4kQog4P61DwoeIDwnvp/Vun987trf9j37yL/CF//CPE4h40o3l9r6P2/6r\nP/F/8SM/8bvJOAp6Y/lG9/2tn/jf+b5/748wppZxbKZ1y5gaxtgwxvaF1kNs6f/ST2H/4n8EW6Dn\nev1R7a93fPUTUH6CKkZ80uWngH/rBR6vB/ARz/bLYOYJ+NeB/5Ua2fJfcxPIAXCiYPVtqICJYWaI\nuvqDFTAMp4oATgUvsDyak9rIenWJA0oBFSWWVMHfwEwogKqhouAc3hfaWQ+xxZLhVBA1nPeIGjFG\nxgG2ssWbkL0nxjp6ODiYM8aBg4MZvoPsEklKvUdnlFLwXrGcIQtFFDMFG1ksHEePtpjzFGlYUdhs\nMmlQRAXvlUEAhJINNRDx5JIQHCL1TYko2Yxm0WE6PQCu1GsEwxqjnYPGQm4KqkoMimw8Tx+fEu45\nohfc3OEWDWKCcw4chANotobrjOPPdJgKl1/cVtD24KwQvBKcx0tBDZwTUi54L0hQUixIKVgslKKo\nClbq8ab1RDeirlB7J0BAvBC8Y9HOOFgc0nYzmtBweHjEZrNhO1uzPFyQS6aUjCOTChQrlFwYBqN0\nSpsU84pzjm7xEp7oV2KfZl8kX3fzzn5r2MsAc4C/Ni0faRocVgxk99veMVpDVDCrQJxSYu4dwRmt\nV0rpca7QzQNxGJECKSaEytoQgQIlG4mCOjAc7UI4OjwkZWFzOVCSsX6SCI3UvtGMfozkvEbVMfeK\ntsJRM+dYl6gKhcRoI31ZVQbsYgUlcUCB6LEcAcP5graB2aNEd1+RXriMMKQRy4YqiDNcAypCouBw\ngCGAqiebVHaMAnlixUICzKAUjys94hVcJLuEC4p5AVWkgSSFmQ8cHC/IJRGHkfWzNbEY62enrM5X\nxHhGOy+4zmjvF2Y5YmtHPC8EB86U4B1qI5YV8YIZeIwhQtFMmHk8Qm+RVjtyKhhCiYWgHudHVECl\nUETqZxAF13rcskEcuOBw3tEGT+lausWMdrkmbgtmSilAyqRcEFEMQXJ9n845mlYIIbykR/r/a/s0\nXU/2dTfv7LeGvSww/3gTKCqTB3Z6ukQwASmCqZDNoGRiyhVcKWSglEyKkZIT3jn8rKHf9hWUi1SW\nTyElpRElNIX5QcPBg47lgafvC6dPRtIg+M4REzgDK0YsiVQyiNC2LbN5g3MO5zwpjTzrnzKOBlkx\nEuomuSALzhVMFVNhcTynaYy3HyTciePZ+RnH4zGP87Pa8Qj4oDhnLO41iAiWAVGyA5EAMaGqUAoh\n6NTJRUQbSskIBaKQNwkakJki84wTUA+jA81CuwzIXBli4fxsxfmzFc9O12wuH2O6pfiEC4mHv3NG\nWBSaY7A3DHJGR4cUMDIi9TMSUWLMuOIxM0oG0ZbF8ZzFMuC9YDkTR+i3I+t1JMYRo468KIYI5JzJ\n/UgpM5rO44LwLb/rM2jbEMxogmM+79jkRClCTkJKCQxSSpQCIlpHNG7OfNHSNP/4g/nDdz7FtIvP\nv/OpXer+O7/zU7vWb3/ntU/tWp9553Of2rXk8z/46fVl+g6UT+tiv/8TX+GVgbmKwywjIiQExMgl\ngwV0khxc1TEoeaQXCF2GXEgpkVPGSgYnNE1DNzvi4mxFTAkQigmI0seRsGxol8bhgXJ8f46J0s62\nhBC4eNaTLgdEasdixer1c0+hQ7WrbNdGslYmXooxWE+SDYE5rXicN/AOnNHMAsu5sjz2/LPf+d08\nGz7gXnOff3D6DE0topnGKd5D8I7m2ChIZeMaqvxhICZYNASDSZbCBVQhjj02FGIGawztDC+GNuBn\nghRQlKKFbhkQTfT9ig+eZFZPNqw+OCXrQJiN0K3JM+P4OzxmmfmRYVFJ54qegxYjx4xJS7FSR0AJ\nhmhkc+QWtA10bcPhbIE0mXEciXkgtA5vA32hfsepUIpRhyaGFKNPCalvmTe+8yEpj2Qiow2IRMwi\nWIFcIGfiOBCHQomKZKHtGkJQ2tDg3csI0LphPwT8Z1QJ8b8C/uw3eoGH73ye+LH+/xfUQr7wDlXZ\n/Aau9RGXrmD+cdd6Matg/unA5re88zlS/lQuhX7+Bynjp3Mt9J1P6UIAf4BP+nm9OmZu4NSRS0YQ\nBCqwZyOrIWZgBbOMFWOIAy4JYglLkZwSYgVBES3M5y2z2Qmn52vW656SFCioKNvtyH13RDMLzA5a\nZgcL2sWS7fCYMUa6xRLLVkG6H+mHiO8ha6FpFQsBVSPmyDau2YxbMgOuKzifEGnAC9o6TDOuc8wW\nDd/7ue+glSX/xh/61/i5/+dnWP3G/8IH+pTUFoqA9w5RcN7IJSDe0bYtOKEkQ4uQKQiClYy6AMVI\nKcPoUau6fU6ZPBSkrw7RMGnmOs+ErkM7MMlcXvRs1hc8e3cF20RoBpaPHBIEVxJNOCDMFXEj42C0\nJ0bfJ2TlyaZoSTjnSMkoWUhFSWQODo/p2o6SCzFGgldUFSdCdp6wWND1jrGsqt5thk9C9oY2injo\n08B23OKGgveelCJ5+gWLamXxKWOAD56cI2qCWSKEBW3boqKIvFQwd8B/AfwhatTW3wX+R57jE/rk\ndiez3Nk3Zq8MzAvx6pkSVQzFcnVMWi5QqpNLxDCDjHJ5tkWtZ9yugMxs5mm7iHctokrTdrzWdpxf\nrtluei77kZIzFgubTUKc4jvhaHHC0aKlXwlOntGGlu0wsl4NgHK5PacfM+qF8+GcRWgwZ2y2Pet+\nyxAHtFWEFhGPOEEIWDG8Nngc86Zh2Bo/+nt/jOai8Ed/z7/CuL7H+Zf+O74oA6u4xmkFalwdjYTO\nMVt6ci5ElDRWuYdc/YY5G0WMkg1TMFFKyhAFS44YEs1cwTLeC2qGkvGNZ8hb+lXh9IM1q/d6vDoW\nB0bJGTHj3uJ1Ht17hJ87HvMu64un+M7jVEmSsKyYM+rNKKUUcjJiylyeb1iczMnFk8h0zjMWo6jH\nJNMEYdOBOIdTj1ehOOhmDd2iIbQTAJsRx5Gc68hrTAMmBfUKoyBSRxySwDsHKNlGfHAslnPmjXvZ\nj+1+djNcZze/BDC/szv7xuyVgblYoXoPHWJGRlGBnApIoaSMKwYuo1SmXijEVJ1hsU9YjLShgQNw\nzgOC08J80eKc0rSO7aZnGCOnT1fcO53x4KFHtaNp5rzxxpu4tiPnzHwckdNzNustKUXOhp4+r9CU\nmBfQ1pF6IwEaAiEUXKeoaNWIAZxDxZNL5v78AQfumHd/6Yu8/+V/iFnhe77/D/LGn/4z/Cd/7s/y\nxbN+irhRsqtO3+XhnHbWkMYEZvQ2hVyKkGMmFwBDvMOcVLmC+jmWVLAsWHEUM0BxaqhTVArZlH4Y\n6S+2aBKSJVLnGTaZg3tLHh6/xVuvfQvNvKXxcy7PM6fLc/K8wEqnyCBjdtDhloEUM/lrI2b1vcc0\nchACgpJzwahRPjHGGvViimsc4cCDgFOlWQZcK/hG0WAMcYP1nhACKWVSzqSUKSkBSvANJUdizNjk\nRJ0tlsxmMw4WB3TBkeOnIxN8hD0vu/n7Xs5L3UWz3Nk3Zq9OZkkRcw5VMLRKCjIxUTPUMh7wKqhW\nh5loIIkxSqKkTBlGLi82zBYtbRsJruqwVjJYAgo+NBhKzCNP3tvw9tuOsYfglZN7JyRnrNbnzKVj\ntd6gCmNJ5HHEdcayE8IsIy4j6pGhxVvBNR2hBXV1JFGESROOtE3HdnXB93/hR/jKL/wyLsw4Wh7w\ni3/zr/PP/fif5nv/qe/hg5//WQaLoKBJUC/M5oqGjBNHPybMpDJyq/KCK9VpXB1/gAkinmQjZXKY\n5jHjkpJLnmQcI+aROFbgzluHlYFSlNwr4xBprOHegzd4+OhN1AspJ+4fn5F7QVYrLrcbdOMJTpg/\naFjcOyAjzO4VTk+3SPQUjTUiKK0ZtjLF+bsaoSMFnOEaoRWHOI94oe080gjiQnVqp4INkZwLKUa8\nKqgQzTASOTtKcZWVJyNLoekCR4s5jQt0bUsKLzUZ7YUEil/8D/7KVfvBD36BB+984UPnZPPV34BS\nzNWRKVJjmaT6kFBD1BAtqMu4orXzLMIUuwsYzuUaK+5qnLnzCe8SXjNOM85Na82olGkxRKZXFJtC\nYG+aTHeklBvt/cVRQ0b327tY8901bsePK6W27XqfI19d8frcPMWbK2qlvmeY1ns3LFKj4kQwBbQG\nUJgTrExBEVPIMgZSCnipaQme57Y/tO2oUWJuajvATdsvYt9smk/5WbC/fb39dZ7AVwfmpbKtIoZQ\nKJpRU5IlnBrBG0EyPhScVwRBW8hJ8aPDmbLNyvY8cioXYMr8IOG9RwqQEhYTKVZNWXxmvdrw+P1z\nXnv0JmWEg8WCeFQY4xacxyQSLSFSuPdggZ+NHN4Dv/BkM+LgKVrjwH0bmHUtzjuwxKBxisTxOIu8\nNnud/v2n+KZl1gVSyRwe3+OX/qef5t/80/8xf+/f+WHeHwpRCmkozJqWphFElOQcMa5r+CGVtQs1\nusdEoViVPKoCM3WABYtQtp7YF0Kb67drhmQjp6E6Lr1gfXWojjkSeiH4JceH93n99Tfo45YxjiyX\nB/SHAwffcsTXto85/UdnzJdzZgcNYeY4PDzk4GFifs+xuRgwa0gy4KaQ0JhBrT7pViLmDN86pBGc\nF5wP+MZjFMTV3IKUEyXWSJU4DpQhIimBZkIjxDwiqqgTvNb3Npu33Lt3xMHBHOcUVz618ILn2cdm\nNwP8tn//x29sp+f8AFOpYF5sD7xEr3FqwnRVQ7VgO0DfDcYMxGoXoD7hfa4g7hPOVTC/WmvCuYxq\nqYuU2kFIuQJ0rrqS5y+3QXwH3ru1J31oDVDqHU7gLc+5Sl3MbgJ4mbqQ3f9HK4jVPq7616bO5noD\nVBCdYgVqlO/0We13AlRfUxLIgiWwLJDkCryv11Pb1bU4uQZ0LxOgP+cpkQ81nnMMrpFZPvJ0+IFp\nmWz7nz7vJOBVauYxgdMqEugUG66Gk0KjhbYxfFNoGiUoqE69ag70fUODoCr0l5H1KmKcs101NRa7\ndZRipGSksQK09wEj8d6TU9784Awnc0Qv0VbREFitzhnHLSKR114/wrnC8sTTLBODbWtGaKxJQrg6\n5FfnaNsOr54urInbEdFCk4XjRUd/eUnjW1TAiUGOyPyA3/z5v8qf+qN/ij/3Mz+NDIlcBtq5oprB\nHCll8jiBUg2Up5jRzlvefusNnp4+5dmzZxgOLCNapSopDoqiMWHZ1c4gFazUZCQTY3kciD6wPevJ\nvWEWaNsZ8+WSguFDAIGuaTlYHhGJ3H/zkHKesWFL8Yd0y47usMWFOdo2+MWGtInkAhJ6WudJuVSn\ncjC64wOavjDOCiXnClQIpdT4fAPGVcTEaOYeAVI/MA4DkuooTIXKVJuEoOCMtvHcv3/E8mBJ21XH\nMcNLlVn+HvAd1PLO7wJ/gprdfMNS+fjwyGzuarkCtCtmzgRKEytXwVyeoruovwPsmmVPzNz5jJtA\n3Lm8t86o7i97QD4h5G0cuQbyD7PyHYjvs/H9ZZ+Z2wTIxfZAHbm1Xd/7PlO//X/OSn3GuYWVu45P\n7SqbvKZr1FFtxcv6H2ZT6PMOzNMOsAULgqVp8TvQntj9DWA3bGLk4qjt/fu50bAPA/Rzh0DGRyD5\nN2SvkJkXzFJNHHKOIg7RjPoqsThnzDroWsG7+oA7CTXZxAWclzpUd57V5Ui/qT/ys7MeVGjbXRed\nMRVoR8wKm4tL/v4Xf42jwwO2sbA4XJDHnvVqTc5CaOHo3pwuFPw8U9yWHOsQTp3iFDKZTELoUPUg\nwrzrYFYzHA984NsffSvx17e0xy0lDbhmRhFh6HvKB2t++J0/zk//jZ9mCEIjnmXXVv08wjgkSjKs\ngFiNL3fe8fC1+5zcO+D1Ryd86atf5ctfeRewSbe2CnKjkbaK6xqcS+AL2IiIY37Y8vCN+5Rxxge/\n+ZR3v3aGWyr37t9HUMYUyTlydn4GNrBczNgWR/P6Q4bHhcv3tqRVxr0eaGct4j0PFi3NecPF+bqG\nSxaPiEBRRGHmF9WJ7TtOfAVcJ1VXvzi/5OJiO0liwtCPJKmgFfuIpvoDNiu1bEOofZtIxgscHhyy\nPG5oZp7QtSBG6l/qU/tC2c2xfPzPqhR3zcztGsBqrkWVWWSSWdRNEoNLE6hWiUml4CYwdxMzd1Nb\n97d1f9kB+W7ZSSw7lniTqe/B6h5X/vogvlt2Ektl3VN3sN9Grhj57lVunnvdhTirjvorZo6hcHX/\nItSyIFMnWAHd9mSJqTiI2BUzr4tiWShJMK/XoO6VEgSLE5A7rX4qL1V6cZMMk7mFw5NEtrd5k3nv\nsXHh1nmfzF6dAzRDkfpVGb4+QNPQ2YVMECEEI4SMOsFpPUed4J0Hb4ivGYpFBuaLExofGGLh8ftn\nrE7HaVjpkMZwTQsqpGFgvVmzSWuCeoZxxebynPVmhYoyWzbMF4Guy2gD26SIOXK0ynC9kMbCMES8\ni4ShpW0LzgvdrEVl5K2TexzFh1jzPpSqazfzJePqHOccz/oNh3//7/KHPv8D/KVf+Bk676uzUoQB\nY4gJDaCmlVmbo1k4HpwcMm8DB8sZsTzi/fce16gbSZVFYBQ8OtZIIKjDdBBmBA6PHvLGwzdYhCO+\n5fU3+PUvf5GwNE4ePkJdYdz0XFxe8v7X3ufZ5SkHi2PUCVGE45MDLp+esnq64vLRAf5wTnMIs6Zh\nduiJ2RPPyvTsCk0j+NwgBNS1BOfAwsQEBe8L9+8f07QNz85WpBwpyWq255gYtiOuZGYdLJczZvNm\nCmFMWI6EoNw/useDB/fp5i3ee4xMLi+VmcMLZDe/CDMvtgM2dyUl7KATmBCrSizVYQL7UoiKUqRQ\nJF+B+TWoT21XUE04V6pePgG5akbFbunm1y979fI3AP2j5JY8VVH5MKgLNjHrm+C8Y+HXAH4T3J+3\nv4J5vbMPM3MBrakIO2ZuttOz5eozNSZmjlGSYkmu10GxqBQ/AbkviFOK1ytWXnwldMXZpJtPr7F/\nQzsgvwHizwHwfTZ+BfKfDNFfbZw5kFOq6YoFcNXZV3L9MgTDJNd0eclgkEWwAK34Gv1iynz5kNls\nyXw+p3Ez7t17yq//2hfZnCcsC06NPCbEK9J4ZrOGbXpKe3hMXzaMOZKGEStKCIp2UxieKNuYiEUZ\nk8OZIMUTrDD2kXVa46UhuBZaR84jzaJl9eyCPFwiOHT6AjcXFzTdgmHcMpPM4/ff5cf/4L/K//x3\n/zfCoqtgZIo4qRpoywTOBsXY9iNt1zGbtzRdw8NHhzx644ivfuUDrHgUKFNihZWCxCozhcYjAm3j\nOHlwwFtvvcXxyT0uPrggHCqjRDofKCnx7INTPnj/a5w9fZ9nq8eksTAPc5LCoJlsSu6FD750zuxo\nSTtvQcG5htl8ZLv1DJtEzhmVjGjA2yQTqFZNe4p+yRmMwmIxI0vhybNnNXJlzPSbgdQXmuCYBY93\nc+6fPOTg4IihrMhpjTpl3nXM5h1+5hCvpO2GPm1f2SO9sxcC8zIBl10Dm12x8kkGVpuCAWrHvIPC\nMo3DTJQigrqJnbuM+lLXk0Z+JbFcAXqepJuJmVPZ+ZV+w77E8jwQvym3uKk72gfyfafobfepIVPt\npB1YT/tNboC5XbH2er6zcoV5Yrv7vMZM2WnmxjSKuf6sd0qLTaAv1KS4EpQyrS1N20koXhGvmDfE\nG8UpxYM4rSTS2Q1n6I0ekP2bug3ixs1ec297//+/SXuFYF6TR8SUYkPNgDRHHgrZKaVLtR2qtz6X\njOLYFdMK4mi6huQSzs85PrzH4cEh3rWEriWmwrtferdGqASPZSGPNcri+HjB1gaWsmEYB5giKcZx\nRL2rei+JnDYVWMRhWVFzlS1HITjHdkisLrc0GghNRsWz3RY+49+icYaft+RcEFXGYSThODlastkO\nACzjyO98+G18lTM0GM4pIxltM96MnD0ksKyUGHlycc6br5/QzB3jpvDg0RGDjcQxk3Mk9tXxmLIn\npkjA1QqFojXeG8+9z9zncLEgNA1RI/PG8brr2Jxu2PQb1qfPOHv6mMvhjM22597xG9ig9CVSxJGG\nSP9k5PzJlm7pyH5G0wKhxo4nMlhBaDAxstbqliod/ZBwsutgDDfpnPN5yz2OOT07YztEygAaIZgj\nnMy4d/SIWXuEdw3L5SFNC0O5xKsxO2hoQy1MNsaRPH5a6X3fvMUXAPMaWSHXgGY1qusKobRKCmgN\nPXVXAF5QqdEa5LpWLRXQfb4C9rrea++Y+Q2Zxa6AfJ+/wm1Av5ZXburmOzaePiSzBCI78W8HzDsg\nv17rre2P3p9KRq80c7si5DLpLqLTrdtNb/MNB+lOiqFQgqPkHYC7a2D3Sgl1JF68XUW2VKcnFCfI\nBOhXoH71QvZhIH/e/ucNg/bX36S9MjA3TVAqz6CAiKOkWv9jHGDohdAZ2hScqw7QaPWx3r3r4AXB\n0wbl8HDOw0cP8S7g25Z+NbJZr9BWa3gSuYbw5Y6D+QmHiw6VzHY7sN0kiIXNdkPTOtxWEV2TcmaI\nU+hY9gQa0iZiGVIxVGr336dIiC1taJi7Yx7c/074aiSOQtt1lBLpupblyX3GYUsILZvVmq/83/8H\nf/KH/jh//m/+RZKLFDPUJVyjkDNjX+qPXEDF8+X3vsLnPveQsMlky7SHjvuyRNST4kjKmc0qsd2M\nbMsuRG+KU8+Fpm0I85bFckYYYNkc8IXykNdlTi+F98Yn/A+nv0IcImnIDHlN2J6hKZAEokS2GWzI\nfPVX36M7fpsZBQ5nmEXazjP2Hkh4UWTiZuvNhpx7xrFAKrTzhuUs0DjHmCLOOeadIy+WbM4HbEik\nPqNOSRHEGsgNjkDQBrOIqic0npQKkUQphXGIjP2rB/NkL/CzMqmywOTUvOaaXLNzraBluyG4XB+j\nMAE6qCvIDrx3wH57346N78stN5ygXN3BTjPf181va+d6g5Hf1NB37Lx++9ddAs8FboF9oN87xt45\nbopmuZac9294+mz0+vgVpMv0TqR+XpavwTxPIJ5ToSSleEcODkm1NIfsg7mvoYniy3VI4n40y41h\nwh6Qy/V3d8XEn7vvBR6sj7FXB+aWK5ATEAqWS3X2SdW+8iikVEgj1WkTqlaWLdWiVNQEHRFPUaNb\ntiyPF7TdjKEY3cGMxcEBeaolUgRiGpg1B0iZE/QAykiKT9lcDKwv18TtAKp470gWa11xaRgHI/WR\nbYyQofEBGsBqXRjnA213RNPeYybHdPkBsVziNJNyJLiOTb8mnp6R8ohqYtm2bFPke978AvMusVFh\nHHuSjahkxpLJBrXYQWG2FNqu5ctPvsKj+/fwzjg4XiBd9Sc0YQaWGfrM2dkl55uWVXqG2bqOglSJ\nMbI+PWNWlM9/bUHzeMnZ2Vf5VRFKHvn8d30X3/r+Ie+XwFmpWv359hmlD/SXMGRl2Ga8CasnhfX5\niLZU3Va1RihNeq5ZZeAqjuVsydBnLlc9Y8k8Oz+lj54HDx8QnCcPNSa+dQ3z0HK5voRB2UqPvR84\nmq9oZEYXjOQFS4USjOxg6HtScKQUuXi2Yr35lIp4fAJ7EWYuU3jh1fZuQ66XWpmgXGPE3jHU6jWU\nCtpq07o8f9uV6kyd5JW6nnRz7Pr1AdhnwOVq/TydXD/C+blj5teAzF77JrCzNzp5/n7BTw7QGx/R\nzvmpcKM7nP7IrtObKqmy+7zEyMHhUgV0TWUCdkOSkf0kp3h3E8yn6BaZ5BduO0D3v58bLHwfsJ8D\n6P+kM3OozrmS09TJytUTXkyICcZtInglSy2Q66U6E6X+MyVOIYsiqBhWelSbWsCqdTjnCKHBewXv\n2PSeo+UxeRDSWiiDY3tu5NHYrvta6S8aWwrOe3IspFjZ4bipunvbNKzHEW+C62p8tHOKc57l7Ahx\nDYumwRCEBMymAAAgAElEQVSGPpFcQWZG17XgA0eLY9KwwYYNxeDivX/EF+59Bz93+iv0JRGTkbeF\ncZUZL+tPeT4LNbU+ZC6fneNVmS89Czfn+OSEVBJijrZdcHCkzBYLZpcNzy6UIQmp9Egp5GHALguf\neTdhH/wm6yw4P4OUkJz5lV/4Zb777e/ib7z3i2CBlEdccUhTs16TRFKu3n40szq/pD0+YFDDi1Jy\nwUqNSDBxtIsZh8sDnHpSMg76yJMnT9CxwXkFjSyP7jGsRsZNj3OG98Zs1rIde0yMcXPB4/fexSuM\n8YDFsmd26PCzhBcQMpvNwDhGNqsNm/XLDWd5EXsRzbxGZtiVBnzlhLTJKalWR6w6bU+FykQNKZME\nU+o1rhOL6lqugPz62NU5Mm2L3ZJa4JqNf1hmuXbR7hj5bXb+4WUKPJ6k0T0hZ49111HJteT0oe3p\n/Gz5mmJzi3nLbi01YWh3fBrV2kQQy5RwJWKk4CjJIdEjvqC+kLzBrmDeHhuv0SxSfW6TxMLkBL0S\nCj4O0G+D93PP/2T2SsHcEETrjDw18bMOy1QKZTTSWBh7UOfrMM8XnCreBYwK8MUS8zCvvS0jfb8h\npZ5UBgojwTmcD0ijtCnTzmaQPOMGYhm4fJq4PDsnDYmMYT0QDYJAFobeyGMhDTDGQowjIoWDrkNK\nrW0yxrq40LKcnbD94BzZDFPmWUZoKOLYrFaQjDFHWjUQz+rpJf/SD/4Yv/xXfoqL0RjWA9t1Zrs2\nUqyZplkLxTJFHEMqPD19guUFXmE5O8C5lu1QoAXxynzZEWYPCI3w5HTkfLNl7uc4nfGFd+EkRUbX\nEJoGJw2SI7F3rPo1JWZcycSSUGo0TdFCdjW5R7QOSxvnUKsdBI2ivqkTR6T6gwxtQzPr6BZzVIx5\n8BjK8mHD6bMzSs54q7Vb2oVHSuDy4gIs4zw4LzRtILTCdljzxS/+Ot3C8/C1+xzHOYtlw2LW4hsl\npchmPbBerUnbfzIcoDLFTVcdeM9FuGNvVCBXs3qu2FUHoFqu2mITKOuk434IwG8v1wAue6z8Sntm\n9/r7zs8PSywvEp64c9xeqdy2a3OFstftaz8CcAXsu07gCsyvPp7pZo0Klrr/GhOw78BcZfotyhXK\nq/dkX5BgdUKXiWnfYN1ewOXrWHNXKE4nvZxrQL8eKuyBtt0E6hsM/WMA/pu0VxeaOD209bsoU8sQ\n0av3mbMSU4beEbKQPbRTmVlz0DShJtpgFMtst2tSiJyvzjhfPWazXeHKbIpQUkLjWW8uWSwWrC8S\nxcHqYkOMVZ5QVUoysha8B8ORByNuM+OQyLnKPe3M1ZKwZsRuBFU2zYrzizOO/JIuNmDGMCZKW1ht\nzmnaOccnD8kl4QuMY+TxkyfMGsebaeBhOeZXV08Y19TaLKWAKFaEEgM5CsU1xJKIlz3LZkZZGOM6\nkgqs+h4pC2ZLEBfQLHgXePjgDfr3NxzNHvADdsLbesxFWtO5OaoB7xrMDL/oGNLIzB8g1OSjDEim\nJkdYuYoGsAztvMF1hjipWbcqpBRRcXgf8L4W4yoamR0sCJMcFuyQMAukPBC3CY3Q+Tmn40jRzMFJ\nU19DC93cEbwScyYOhWyRy/UF7UJBIkKmpSGnSBxGUkqszodX9Uhf2YvILEqp8c5W0ElKU8oUOld/\n+BXA63lCjWpRK1f/K1NbxKYY64nR78WoX5UE2Ekz+/v3kobgNlncB/LnAXr+EKBXrfwazN2kQdy4\n+hWg7kB7b9/esZv7qx9ip5lf36fdzMGZQpuR3XXrvl37ah9GajKaPBILGnzVySeZhQgWpBaw84L6\ngnmheEN9oexkmMkp+pHgfQXaPF9yed7yCeyVgbnTMg2fbh+53mEpk0YlW6IkhwbD/DSpQxOIcaRp\nlFQSl9tzaArab9hszun7S1LuKcXQvMDFWphqtb5gebCkjAUJifXQk7eJnGvWZI3Xhr6nVgaMkMaI\nFcNKnSUHanlXJJOGkWEY8Xge8y5+dHxP+21cppGx7xGFdn7CsLlEfMfi6ITXH32Wi2dP2Jy9TyyB\n9XuP+dEf+FH++n/5kyzaBfSGtP3k+KxD6tRnct8zDlssjrSN48HRfYbNQD8kfvO9U9r5Ew5Plhzf\nO6RtA86UUoS3j97i28MJ333vuxg2F8z9Ag0NTj3OKeoaFM+8ixzM7zEUIzhPJIJonaxD6wxD2axO\nOdd6XOdR73GlTs1nU1JH/WwKMQ8M0dPEhmYZ8M5hpdA1gZKFGDIkQWMt4DU/6uh9zyIUwnw+TcUH\ncYwM/YjkBrOaZet9Wye6QKAIaexJsUB+9ZNTpBdIGnIUjHylJ++yz41cv3d2YFUB3e2BqLNrMFUr\newBOBY1JF67gfXsf1wAu7DHya6fnh6WW50Wz3I5o2QF6vgnmto9Qe+09oL4J5LeP1fbOAXqbnMNu\nDDGdekN3ryeWSYcpV9KNodFIwZA9AL+SVgJXyUI6LeYVvWLmTMycW8ycPca91/564H67/Qns1U1O\nASBGcYaliY1L/QJ0AkoMYixTDLUhSciN0JgQSIg25AyQ2A4bynnCa9V6m9bTzj3jZSSmLUimiJHT\nyNOz97FQww/77YbUbxFzpCQwFgzHECMURy42yUAZpCBaa20EBfWJVAb6bSENp8SNcZAWNJ/97SQC\n6hLDZkPfbolWaC1xcXHBdtvTOENcw3pzyeMnkd/2z3wf3374iC+dP6FrmzrZhUvEWMh5ZNikWupX\nCqETNpstJSqDFVLKXJxecPmlU45PlizvLXj7rbdJkplReNDc48de+31sVxeIBtpuhrmGzgfECaQe\ni4XgApYKQRu6VnFlxUiqSVuN4GcJaaB4T3vkCV2o36EBpeClQbyvsz85T+sDcQ2n41MWizldM6dz\nRtKOYbtFSyJaZNxuKRYJMyEWaKYJRyxTJ722ydGVO9qZUcqI9wtECzkPpKIUAttNz3b10pOGPtaS\nvUBoIhlFJva6+73bla6M7BjxHojf0KN3USSp/vMVSLPrCa6BZH9bJ4K4zySnO9rZTSC/1spvJuCX\nvXu4GZ7objBzJr/AbfC+xrx9IJdb5+zS8pPVJKSbzHzvM9tdbLfaI4m7dtndi+xAvMosEg0CdYns\n1WWpIG6+UFyZJiC3qqs7u+kAfS4r32vrrr377D+CnX8Ce3XRLFRnp5venDHNPKSCSZ2JHZm+yDSx\nA6eUXGPC5+JZHhuLZQCFGCMlF5wbUbRmSY6Z87gmxcSQypWEMw5rxn7AtLJvwVOyIpk6IbPVWWzi\nmJFcMG+4UOoUbmSKJbLWDDzLA3mEvBXcsGZ+Xxm2PR4hIog6UhaOj98kAfdP7jOMI6XUmizDZsWD\nowP07Jw/9v1/mL/wt/8az+IGZ4Y6x+V6YOwTnW85ebAgdKsa6RIjfexhrJqxWCb1I6fvnXF2tsLl\nlrBQ3uge8mPf+U9zuT5DzNO0HUUDTjwqHssjIorzgeAdkjOH8xNKWbFJI8nKNG9nxoqiQQjHSrME\nVNBGKWqM25GZzkGM4AOHBwcUhX67QWLDxdOe+eyEEDyzpqb0b8qWNCTUeZyf5v+cCY1vak33bWXl\n/ZixJHShSjpd12GW6qhLHaUk4pApI3VKv1dsLxRnjuBE9n7/OxlD2GkHu/3KlLq/Y7+SrgFU8kcM\n8a8dg7eXj9zPDk927Hyfld/sWG4C+c2QRL/XhmuMei5Ht1vtHdAXboC+u4Kq6Q7lWqa5aiM32895\nJ/UcrkHccwvEmSQVmTJBtZaRnoB8F1/+Yc18D8D11vaNOPfbQH5r+xPYqyu0JeAq556cnzZlfQqm\nBZHrL22qfA7ZKERycXRLT9u1PLh/hJmx2W4oxQjOEZqA84XZQST3mfXlSCxGjMPUO2dMM0KtoS7e\nYSaknJFSZ/BxuabVS7FJigB1dYKLokKWiNMBESW0gbwWNpsVbCIxxim1uGrwxaoEfvLgIZeXl8Rx\ny70HDzh98ozFfMH55YpnTx/z+77n9/Ozv/B3mKeWbCMXvsdLgGHFW68/IDYXHB3P2SCsL9Zs4jPy\npqGYMcYeqHVrxtXI5mtPmR04/uU/8sO0gzGUCqAFx7xbkFOiWERL7UC9c7gQoHHo0Zz5aJQ+0W9H\nyFXbFXGIh6OjJd3SQyPVUWwF75UWx+FswaxbYsGqBj+bk1Oh34xsVlsO2iVSjG7eMQ4joQ2UaDgZ\nEQHvhWKOftySciH2I3mAMho5gPMeH/w0f2otqJZHmypDBlJZvczH9r8B/gXgA+B3f9RJLyKzUEf7\ne45IRVFMCuxG3FPEiVJrsDjZAXjC75aJmdsEGjerxMpetdjrtu2DPddBiVda/dWyz9BvSi3u1mjB\nP8cB6sgfAvIrBX2fnV+t7aoy4u1jVyz/Fpjv3s+1OFT3Fa731eMTmO9i+EPVyK+APHBdcGuXPOQV\n9Q6dol10x86dXWvm+zKL7rV3IL6Tua7OeQ6Q7//fJ7BXmAG6S1avYFBjzKcnfHJWlGLTl1WdgYhM\nvYAQupYmNKhTFvMO55XLyzWqjhACOSe6pmXoRnToKdtILJmYDYfhG0ENGjd5SJzUSZvVanXebGgW\nSkm1BK0qoat6musSzlEzGItRnGBqEIUHBye03Zxnj1dYGhGUdr7EtQ0pRZpZy3bY8Bu/9it085Zx\ne0mat/T9yNvHh/yOkwf0uXBvecDPffkf8tuOGn5p/ArbdMqb91o+8+abfHX9RSw7hn5L2uQ67JvC\nKUsyXPIcmeNP/q4fZAEMcQR1uGZGM5uTpkk9nBqWqoThg2K94WaBb3n0Nl+9fIp64WLYkPOIUCNZ\nmjk0C8HNBBcKxRlpKByGGSftnGU3x/uWIUeiCEMcq1SmPWnTkw/nmBSaxrNYHGCjMUqtYS5WZZU4\nDsRxZFw7hnVh3ERmszlNq2jYEQCllEyORr8ZWF0ObPtSi76/PPtvgf8c+Omvd9KLRLPsfrz7YGnT\nqNSmH/ouDrwm+GScZLxUZh4kToAeJ1YtN4FtCko3ucVYRa7OqfkaE6Awta9u77bMYreA/MOAfjui\nZQfmV0GJxlWxrKvXuAHa07Fy3d6BvDd/HWfPnigk+8Au18dvgH09v8hOa59klp20MgH6DsgrM98B\nep7Yubtm5lfhidTlCoxlj31zi6XzHPlLbp338Y/N17NXKLPAjguI1DosuQiqilEr5dVUf6sVC5Fa\n6EqVnMGpRyXAlPrbNR2DHwnqa5pzFrx6VF0tteugxIxJ1cDTWJBGCU2dpci8oqUmL42xzmakOCwU\ntBV8V6AD1xWaUL3ZJg5LCsmhCXxoOZgf47xDqCX2jg5PmB/cQ31gs63ToC3nS7YXZywXC778la8R\n/AlDGsibC37gs5/lbEjcbxryesvWw1thyalsmR03vP3obeRsQPt36e2QJ3LOZhw5aB3OOrabzKNu\nzh/73j/Ad7/9Odbn55gIXhosBFIpzJu2xu+nWOcgFaUfexrn8Ys5rd3nMEVyP9C6OUMZGcdIjpnQ\nBKSp5XUjhRQ3eHN03uMxcsp1xOKMGHvGcSDGkZRH/GmAzjM7bAgzz+HhIZqFtC5E3yPmSbGQooF5\nckzEPILr8DMlNELja/x0ja5xjGON5slJKQw0By916ri/BXz24056odDEqUaITsz7GjJ3J0ys/Spb\ns9ZVcZLwGvESCRIJGq/A+wp+99u3t6/a14AP1yz9+ujzWPl+RMuHpZZ9EL8Gc9vDrz22P4E33ATu\n67Zds/VSK5XCteNzt74elXAdUy5Q9jq1MnVguzXKtaNzF0se9gG8ViktXskTK5crZr4H5DXZ+RqI\n90H9lp/iQ+D+oX1XX8U3ba8wznwnn8ikn9f3uGtf6YZWlTyzCvrF6jQ7Z6crHj1a1PC3XCeH9upw\nEqCA4nF5qqlcMsUySTI4RYBcCi4Z5l2dVFiENPWWMkk/IuCCwzUFPy9oVzU1uoxz1MJYY0vcVnno\nzdcfcu/gHoYnl8I4Fs7PLwlN4P69h3Tzlvms48u/8WVQ5YPTJ9x/7TMcLmtNcU3Cw5PXmF9eUMaB\n3/Ntn2UUJQ+J0+0Wf9DwcPEaeXXJw8NHyJHjV/JX2G57HsyOeLzuee/0knc+93n++c9/FxeXp0jb\nYmOimS2ZzZdTh5UpJUPJ5BIpJmiAUjIaWo6Ojxg2G9YXG5wGyAK5SmEuKL6x/5e5d4u1LcvPu37j\nOm9rrb323udWVaeq2477krax3YE4MlGDLQLkARGQEC9EiggKSEgkQkIiSIhLAgGigJKIhxDkByRE\nFBIkFAukJJZoy0Gy46STttPtbqq6qrvrds4+Z599Wbc557jxMOZcl33OqTru6vLxkIbmmGPOvfbe\na831zf/8xvf//vQpEn1CRE9MHm8cQfUID0JHXPK0fkEXrmnblnXneXx9xobfwz1uISw0ZUNV1VRl\nx4JLhNSkKAnO0bcOtKaeloggsGW+kSBD5kmjxHc93gfW6zVt6wGP1J/wG/FDaO4FFkBFzECtUl6P\nGKFyvPByZuMoK0womY2yMpiP3WFEfwDW4+sc8sRybyxIYtzftXQDSW7cDp6pNX9ewtCOatkD8y2o\nDwva2/EI7ukZYJ6BPJeVzGUht08c46uKG10eAneS7MBc7ubSaG9rxHacHRIzoCsdCFoN3jZqy5nL\nkTMfF0H3I/NnbsVHHONpUP8E7aWCeSIXXWD4QPOjZb6oZALIqfgZvwU+paFIhWC56Hjw4VW+Sx4L\n6tJSFQUxJFyfbxPe50VLo0uECIjksj+JVIQQiKknBkEIAZEMosiyOu0kXRfyh1bGLbemjCRqjzQC\nlRSdS2gKlIIf+8wr3L/zBqVNKKHQ1iL7DZvrJe8trjh/8B6mbrh15x59DFwvFsjo+PwXfy9VWLBe\nXtJePEQpgZKCZddz//X7hJRQybD2HUaCEpo/dOvHeVQ+5u0Pz3jtjS+Q+o5mMufNB2d0dwL/2pe/\nQlgvM9+dQOuKJOTwJRKUxhB8SwiOSEQlCC7gQmRaVpRJY2x2Z7S2wHQKjxgStjQxh0qkXhCcx2vJ\nlWiRKWCUxS8v2IQly25FSjnhyneezcIh5PvMZjVNM2W92lBXJWVlgVzCbrjH4J1HSYGyBq0C1hq0\nAaHIXHmK+BDou6x6soXCJ0U9+9SLOn9sU3/xP92N/8BXUH/gn3vqHCN7bHQYekzqMdJh98dpGKce\nI4b9uHdsGBvRgzgE6l0C/j5w741Ha1mxg+pxbHAY3FPuh1uqZA/eR5JlhG6H2QK9IOEHMJfp5s2B\nfHMQO2CX2/GgXBqqKI2JTQGNFzudzPYZIA06GqG2+we3lqgJQhGkIsR8XoyKGOXQb+ynIYM5im2i\n0ViqL8VhwTUNdO+4SDta7+5vd4sEH31s3D4vBjn7Kjz66gtddy8C5s9a9DkB/jrwGXKl8n8TuByO\n/SfAHyeLdv4k8Hee98IpJUYxVozkLK7h0QqRH0UT5DdSDo9PQzgRY+LDDxagMy/np5ba2FxdyHuk\n1JlzjyCRGCmRVYW1lqaoiCmxWF/T+w4ZZS4wrA1eeHwA2UlccvkmYHKpsyjjcJfJNQwlJc4lZs2E\nN159g7vzW5SlQTrJrbu3eYynlwalJc20RhnFo4fnvPraK7j1Gmg5//D7vHZSU0+mXJ89pNKJom44\nf+e73H/9dVbLJT4K1strbp2c0BzV9N2GL772WU7NlIfX55gY0FXFxFT4VmCtY7HsECGvSkRPvnmF\nQFHUpJhvkr3rSAg2XUtVlxhT4FXACI2qJOXEcrSeAi2PVuc4kWudbpxD94IQe5KUNFhW/QYVHFIt\nidrj8IToiQGCz+b/wiWun1zz5PySaTPDSJUtb1cbpNC4PuBd7lpphJQokbBKY6xAm6wsgGyeZpTG\nSdAGZB0RpcbYT5Uzf6F2+h/8ycOJtHjqHBMzEBuGbXK5i3445jAyA7kR/ZZS2Y73jmdOWO6i0b1x\nRG6j1nG8BXGxd17Kx8zgqzJC5ihJHInRhNgSLA69B/Rpa2MbkXh0vhGktAf/I4Cze34Qw3zaG5Of\nSGQcfw48ik5YOgo6Ctph21HQpYIuWjpRHHYKOmHphaWPwxZLHyy9tzhv8c7gvMZ7Q/Ca4BR+8GyJ\n2y6HIhZyW8wiDcq3rTRxlAKNoL0/HgH8edTKR9Esxz+X+9i++V8+97p7ETB/1qLPnwb+LvDngf94\n2P/TwJfIpbS+RK5k/kvA54d/56kmhMh0R0xEYRAxgczWZylmmBcygoSQsvrFJ49SiiQEzkUuHq+Z\nFIaYLKKucqQYgCQJwSNSLmBRlBpIlEVBJUu00QQBcXnNuKDmZYAUqGpDcI4QNFGErN+NBlyOSGNQ\nRJONf7QIFLXi9q0JzdGELrVIjmhEzWYy4+F738ZtrrGFZXo85/5nfoTNasW9z7yGiT1WOTyJsw8f\noG1e+IwhUE+PObtcIFzHxeUFfcg3rSQCrXOUseLkeEbdlDx48D7HdcP19SV3X3kF1yVizHdCWeQs\nT6MN9IEQWlRV5PUJYVguFyA8facxheGaHudabCGo64LJpGTTGsqiItUOv8mOG6HPKh1lFcSED5GF\n92AjSjrQAW0lYZ3XQoJLBCeQoed7b3+fqmgIDqRYIkNis1mCiAiV6zgW1iJR+Ys9yEdDSPlzIuVr\nIEJMgYQnSUlZKpSyL3BJf7ptlq4/9hyDQ28BfODA49542/th32PoD46N432aIQpJkiPNsAfw+8A9\n7G+ph73IXBPy08JedD7G/aM6JCaJRyExB/M7Q1xDj0WlsAXnvRIVBwC+nRcfcR6JgBrAuaDD7kAc\nS0dJh6VNBf14fADzfrwBiIJ+2O99gXMmd2/wbugjqDtN2AL6YJG7D+Qe8AOQj2C+D9jj+CZQv8j+\nJ2gvAubPWvT5V4F/fhj/L8BXyWD+R4C/Rhb7fBd4C/gZ4Fef9cIpZUoCEYbFTQgx+wQCyJQrleTM\nr8yXjzJGISQpRtZXPauZQ0iPjIEUhqyzmGVsiJyEpEXmxQtjmFQNUkuCCHifCKHH9X22BhACoRJF\nBX0n2aRc4qxdpxwtqkBUWdEicFhtiKrFTBRmIghXicZWmInBO7D1e/Tdmhih3XQ8OHvIUdNwfDql\nf/SQ1fKa4vSEJAztZsET9wTvAkkIGh9QViGVyU8aSYDQNFXJBx+8T6ELJtMJGsn14pqT+ZTbJ8c8\nevwY5wNFMyEkgUgKiUZLja2nhG6F7x2r9Yq23WALgxACbQrea694dPGItl/jfIs2iaq2KK0Irid0\nCWTEC49GD9yuQjpJsh6VJEJICJ4QsncN3pBiVp8IFJtFx/vffw9CxGhN9JHV8oqQ3GC8JgjR5QxG\nJEYNtFgccwUEvesRSW3jQlMYhByM1z699teG6/4UeBf4z8jBzkGbxqcj8ZttBGg9gjl+C9CaZ80N\nY9xTcyNXHLfbPUCXe6A9AvresRiH/SFqV4QtkOsDmgVIDJG3IhDxe9F62lsSdRgMbhvVj9H7oZXu\nLhJ/3nEpB8BPkZDULhLfRuiWPuUovU8ZwPsB4HsK+gH0e5HH/TgfLM4ZvN8DdK+HrghB5Sg9DIAe\nZAb10WRuG5nzdNLQfmS+D/LPAvrfJQugd4GHw/jhsA/wKofA/R45Qn+6javnMW1T+kMcFjsZA/SA\n8IagQ66oMixgkBIqJnwMhF5w/WRNchK3ajGVRaGySiP4wRQ/5htFCFhrsVZhC0uyiY13XF30BJfw\nMWLqiBQgC5WLB7ca0WZppEMipUeUEYVGmoC1AWU6fOrouyV3wylet1yfX3F1scFtlngXqZo5pimY\nTQtunzQ8+M7/x2tf+Az92xdcPHnMUTXPj7rKslo8JgKN63nt+DYXj6+pSsv51SVR5KeWJ48e8JM/\n9dO8//77We2jNNYK2nZFCjn5pGs7rK2zUZmyJBQxQtHMIEW87+i7Da53yEZhreX9Dx/w8OxDTKHY\n+DU+OpRQTKopm8LjLjuS1uAkxoBOCtxwE1aCpBLBZ+oshYhwueyeiAKjBGL4G1arlvPzcwppkBK6\nfkXft0QB0uTkLp1y9D0CeZQC8BmcYkTECFGTi0InlPzUl4CeKt78rDZ9Bq2S2/g8DjqNOvEBOIXD\ncLg/WsmOevKbxzKw+xy7yAHAh6pOW9A+mB+OsUe7yIFDH7j2MatUDzH2aBkw8ggj1AbU8N+ILcB7\nFD6NLLo9APMDkN5un54TZGfHQ5CPRNQuImcH2F3aAXuXcvS9i9ztIYgPAO+8HSJyvYvMBzAP2+0Q\nlW+BfKhGNCjlDgD9Jjg/D7CfNX+zf4L2w7j6d4Ta848/3YTIShU5/Kc+DWm3eQEkRTEcCyivkCo/\nUuvB2CYr1LPy5OLRirDRFBNJ3aT8uK0VToCQOYJPQ0TfO0eaJKQRNKZkWZWsFh2bq462zyn/1kYC\nufaoTJG4AYhIoelSpIwSpESpSCRRFZJFd0mF5f7RPRZnjzh7/4zF9YrgHe16Td0UTJoJ09mUR4/f\nozKGx9/5DovNGtE5Tn70VWBDSvD48Rnz47uAZO06jLVUZYk1CltMubp8Qj2dsnEdi+WCGAPTozmE\nQLu4Yr1ckWSB1hYhVDaicg4pIiZqXJ8omwmbboVQgsIUkKCZz/n6//t3+O7195nMakLRoa2g8x0+\neoqipNWe1nuUTBihqKyCBC55epdziJTI2asxCYwqQYTsPaI0KUBZWGpb49cOT49SOaHLOZ8lYSn7\nm4sYiR5SJJeUG4yU0iBUjmG4aYz7Mddifdlt9lww3zWNQ6U9D/C9sdoH7hv9Wcf2wTrKofDwuK9u\ngLzKC3pRDtApxK50XRIDkO5MtLKx106umI8mQO+APan8fcFsI/nxJvC0DcCY0fqsUnQjgD89F4Xa\nAnefDsE6g7jd0i6Hx3fbftjuqBU9ROga7/QW1INTezTLjjPPkXmuGZoCmWrJtcg/vu/ryJ9KLuKl\ngvlD4B7wAHiFvDgK8D7w+t5594e5p9rlB1eAyEqE2mIqm3OChuhckhBBEmSmHESQoCQpBJTKypYY\nIv8k8DwAACAASURBVMRI3Hg2IeBTNmKKwVIU5ASSXK4bABGhW65J0yMkAiUUZaEprGEtBG4ZCcGR\nZpqkBk5YCGKfF2b75EloQiEgSrTQaKHwQtJ3lyT9Ov16zbSe8cRecv7gzeFLElgul7xh7/Phg/eo\nC8H55RMenW34/Be/wOrJFQ8ffpeT+ZzQbbKxWAJdWJbXa6Lr6LusfV1ulkilObp1j4DAu0DnNtT1\nhN4kri8fIawmRlCmZNX1KBIhRmKhUMIihWd5taYsSmKUNJMZnW+pqorvv/Mhb37wXcojQ33LUM8N\nulQ4Jyh1wcONIwiQGowM1DqB0Cy7ljYALpCSAqXQFJlRFZLMeGlcCkihkFHgg0erhHOJtvO51J3J\nfDhe42POCwjJk8gePiiF9xGlJDEJBIHLBy3X318dFCl4me35kfmubYE8+Z2vSdoD7LS/DQfnavzw\n8wGVfLZolSIDtRI5ilTDfpS7+VHFMkbYYqxBups/lCEeCBp3nPmARjGNQdVhFH2gd0mjjHEPvEVE\nphv7N0Bf3dgPqAGw7Y4+GYE73QDuYa4fI/NxnApcsvRDVB4GjnxHseS54HecedhG52Jv8VM8zZl/\nXI83xjznvE/QflAw/1vAHwP+u2H7f+7N/2/A/0CmVz4H/P1nvcD81SkIkVP0Y46ydr7mKUfUKZHC\nkPE3VCeXUmTXvkHSGHwAkRUTLCObFIneE3zCFCZTJjJz7M7HHAX6XFItiYQVBi0kUghc5xBB5IzU\n0uGdgRSIId90tJXY0lA0EWMtRieUyrKlTZ8oS8OtZs5ydcHR0ZTpfM6js8dopdHGsF6vCX5F6zQh\n5IIRb37nLe6e3KauJlxcXjGrimHBJbG+XhOTRyaPcz1Iw/n5FXdv30Zqw/n5EzbdmtksV1Ty3jE5\nnnN19ghVa4QIHM3nrK87los1J/qU6wcfoJSmKjTrLqJVgQue46NjZFnyW997j+V1pOs6QloTpGVe\nnlCVBcJX3Du5y9sP3ifKiLEVQnSUVuGTJoQ+fz4qLxRLEdCUKK3xydMFTyEtWmtC71FCEIKk9x19\nF1BCZBdG5FAfFnoXiGHwxRHZckEi8ueKJiXFnTdqbr1S0cxqtIJv/coHP+Bl/cNps/jxC6Aq7QBc\nDdSESuEApFUKWzA/3B/PDbvIfARvlZNeUhTEKHcgnoYofQvPNxZE05YZBwayc5QMs8OZDNMqfz75\neWt7bDyXUW54A9D3s0f3gVylQ1DfnZO2x0OShyAeR9DegfXBeDi+D+wj0Dtns2rFaYLTA7CrISrf\nB/Ucme8ol8yZ58j8GWAOHw3oL3L8E7QXAfNx0ecWu0Wf/xb434F/h500EeCbw/w3yQ8g/z7PCZWy\nxjxzcQkypRJHf3NB9EOVkr1HaAlILwkqgYh50TRCigkfHD7GfNNLiRQ8MYItsn4UAkIoXAfBJ3zw\nSARGGQqpqcqCsrSsN5Fuk61ZhXRoKZE2RzimltRTjbYKpRNFpdBlRBeC9SaySEu64w6REn3boqsS\nqQV9GyB52m6DCA6fVsyP5iyXTzi2BZOjGYUReJcLUSehWG2uef+DNZPZKZMCrp8sOJrPEYAuCvpu\nw/XFw8HPRlFOJkghuLq8YjKfEESBtiV9F6mbUybT2/huidQWkRy9kyyulsyPj1m3C159xXJN4sni\nMUVZoFV+n3rnuV4tmdeCQlUUtsCgaBeevg1UShCtQ2qPitkMjSTQUmCVxUhLxBCNQnSKvvdZ1w/4\nIPAu4kKLEqCrImftDrawQihKawgx4J1HGpWT52R2ABciuzZenF2ilaGZbFPOXmp7sch8B9AqBeQA\n1HLY34L1/lwMT/2cSrviCVGJnPQSx/EA6Dei731FS5SHx0ZIHiH6cDskGu2XgdtuxeDEsTtfpLSX\n+h+eCd4q7YP4QO+kp4E9Ig8i85H/3s4lSx8L+mTo4wDge4DeR4tLBS4OfLlXNyJw/dTcIZDv1Cwj\nX37AmcOLgffHzX2C9iJg/rxFnz/0nPk/N/SPbYksN4wyS+nEsLiX/zFxeBdIZD8OIiSRo2UvUEnT\nxQ6VJMkHYgutD9AUGJGIUmWb1yEm0UqTosC1DqUMMgoKW3J6JLm4WLK67nAORKEpm4CUCmFzAUFT\nSaRNSB0oKqjKAt0EhJG0mzWb2LNar3GrBWVliQTKqmQ6LYl+g0qBtmspTOL64jHz4xNiiFyePeH4\n1oz5/HUuz7/L8a3bGGk4O3vAnbs1m+U1znU8fvSEk9unXJyfUxclH77/AbfvvIouG9o+QN+iUmDd\necpGYaylnh9x9WTFZhEImw1S9ATXsVhtODm+w+Lykr5f47nHd978FnZWUAiJ1IkYNckn2n7NUidq\ndUpZCKwqWW86Fmee6r7Ahm5YDA2EFLFFSREVlbTg8/WO0EgZ0UoRXcJ3Pa5PdJseZKKeWmLKNxBl\nbabQJBRGo2Si144+xHxTFybXGQ0RrTWnt0/QOqBkgRAv3wJ3BPNRejyO2duXcQfGh+O4A+oYDoBc\nHgD67txMrYzgPWQyxjEi36dVdhH5doE07cD+cJlyP5s0y1ETQwLNTVIl3VziHP0f0w6gb4C62gJ5\n2IF3ymZi+9ml43gL5sLu6BMOwXofzPPY0keTx3EP1J3JvPjIjTtFdDtQD1tFy6BkOdCX7xZAtzrz\n8YN9HmDz2zj2CdrLywCV2egqZJxFAklJpMhceH70yxmhWZImCD4iNTmpaGDxfPTkstyKFBOui5go\n8Sabz8syYEWW9Skt0FoRgsN7i+sDxlq0UQgqjmZHLB6d4VJCFgJbWmKM2aRKKuRgoUuSCK2QtURb\nQZI9WhiOqFgul7TXV7g+UBYFvhRIOopJiRAOH9ZIJSl0jXMdt+68RhKB2eQWq/YCpWuqZgrGMOtX\ndD7Sx0BEsLi64PjOXc7e/z6nd17FaI22NfV0zmqzwMfsh6KU4frqgnW7Zk6J1oIuetarFSH1CNfT\n+5xs0qVAM59ibMXZk2vqkqzrluRMz5gXode+ZyOvIWhmhWW5MFyuHfXCoBVYrTEm12nVPvvp+CQR\nkZwF6iIhhvxZxYDrezoXs1xRJoTKi7AxZcDOstWA1gKtZX7vnaJ3ibHqgFa5IpI2BlsUQ7T+Uish\nAjB9AZ35FozjsMgYw3asYj6WQX48FrdgLrfjfCxpsVVZxDAAuX4GRz6OZQb9LBcdovi9pceAIqbR\neWWoOIUipnEBdA+Wk9rbV9sF0Qzm5L/zAJj3wFqELYDvTLv2AT9sAT8lmQGZZwD5XndxAPYwAvxh\nd9Hi3B6F4nLkHfwO0KOXW6CPN1Qt2wXQ7B5xuADKx4w/7vhL4sw/cYvkL6UQaoi2RzVLplm2Frgp\nm2uloUBBjAIE+OhJyJy9idg6sSk0yUHoPcEaYp+140nkC1SpbHfbtWHQPZfEkIHa2oJmpll2Lhdk\nyGbr+N4TZfZxCV4SRUT2CaU0thQgJrTLC76zepvX6jtYFNoE6kowq07wrmO5uiQGqKqKqpzQTKY0\n9YzLq3NOT2/hXK5vutgskWqCtg31ZELoV6QEXd8ii5qrJ5cILZjdOuXy4ohmOufhw3OaCjabJUbX\nbNoORaBsTvBuyWYZuL5a0fc9sc3KFFNXJBWo5lOKpsBMJlymd3nl7l0Wy3O8CyAkIgqCByd7NvqK\nqpwyO1FcrQQRjQuSPmlUr9CVIIqU10FCoPMd0msIEhf9VhseXEAkMEKx8husVUPWblbGeO9zKToS\nRSGQylMUAtqENgUpBYxR+C4hpcEYhZCR3gnM7wI1y4vozDMQZzCWzxirp47dPL4bZxAfAHpQpmx5\n8jFS3kbjA/c7APrNyHwrMSS//35UraQsItiXJvo0ChiHJdq0c2YZpYs7V8Wdj0umV8IW0HNy0Q7U\n920ExnFE4hiyOMUO0F0yh1TKHpC7aHagHvbA3GuiU0QnBypF7pKDRmAPkhjGY4OiJYw3TXZR+bNo\nFp6zfZFjn6C9ZKMtgUh5DV0MqodcqGKQnA3mWlsnxe0NQCKHZJ7cJChIDnyMICMqWlrnUV1Bl0Cb\nTLHopAhekKLPHi5xk3XrgEZQViV9DKQYcS4hokDE/AXwElzMafFJWDabSFGV+akhWS7jkrbdgBBM\ny4qqqOn7BSkYYoq0mw3z6YzVcklTV8jUMZ0dcXpyF1lPaC/PKHRFSoGjacN13wAB59ZcXl7yhS/8\nFG+9+U/4p3//H6S0mtdevc+mbzHS8+T8Els3rNorgosU9RGX19ccm4aiqtGFo5nNePDWO+i6JKWE\nD4FKC6Z1wwfB87UPv46oDRN9ymrZ4vs1SkWQOTV76ToaWzKpBbOZ5nwR6QL5SYZEhSbFQCAQO49M\njtCFLI2MgUREiUQK2egspcFQCoFLDklCKUsUgSAcRheUjaYoBFpbqo0i+Gx7nFJOKGqaGh8CkC16\npXz53iwvkgGao/Ghh4iIKYN1SDfmd+On5oe5pAXRDPz4ll4ZQH1vkXObTCRvcOlpF7UHNHIA8pGc\nTOP3kz1NedoXSRpcGlXywzaZgWbJ0K+3KUV7IM5AGe2D+Hb/EOwjEifMDsSHyNxhDiPyaLaA7sJA\ns4zjkAHeOUN0MvuW73e/15063PdjZC620sRncub722fNfdz2E7SX+kyaq6pknlQLATJAHLI7Q9ou\ndiU8UgzRBmN1IIDBYU0ltIEkE77NGnWlBUJE2o3PNrpRUVbZzVCGgJKaruvw/YqiKEm+x/sx8SQv\n5tAKnA94l1U0MQS8yFGnkJ7VpccWES0kOEttpyijaYoSKxTO9RhtaF2LkpLpZELfe+7duU8Mkfnx\nKdPphEdnD/mpH/08b12eZ6fGYsKkabh6HJGyRqkNVTOnrhtO7rzK0fEJwXVoZSkKxfnyQ2bH97i+\nPCemiNEV6/Wa+UlNiJHgVlS1xRqNtJariwuOTuZ0qxXN8YTju/f4tSff5YolZVmxSQFpNAoLqYMo\n0KKgjAJtHUWlmM4VV30u8tF1CWMNzkWMkgQXCFHgeo9bRdpNIKbst14UxUCjeHyIGCNBZMWRMhJb\nZz8WZQyzpqCoPZNGItC5cIXPpfNSTFhboERe3C5sQVEaQnAv8YrO7UUWQGVMO6COCTEAswhpD6yf\nP7+9AYSYo8WbvHc6TOnfRuWj5lyJwVhqBPP8s55cIB32EoKSQuzPpZ3BlsNkuR8DsA7RsiM7Rz7P\nWXHbxa6wxSGQH56T4gDmYgBy9oA8Wfo0/B0jmA+RuRt9WKLJ22DxTm+lhjuQzvLDnaZ8J0d8Fm+O\nfwZnvr991txHHbs5/gHay/MzT2mIrkBqgd+ueyaiFKihZIqQmX6IMX+gYnDf8gMrJ2RAaY0ygUJl\nbtYKgykiUgX6jdiuVbgYKJOFIDJYCUO3bgmdoO3WdJsVQkREBNcLQvLQ5d8XtcgyxShyav5FYjHx\naBUoCrCioqprmukpssuSQlMo/LrHO09VVdTVlN55qqZkOplyND+hqics255v/OZvUlWKZbdmPjki\nxEBSFUUhuL5wtN2G1WbFa699Bl2UrFdP6HtPGzec3r1Pt74mSk30JQ5HVVbEEOnaNSTByb17nL1z\nznJ9hdGZs/Y6sDw/Z/KHv8B77/w9ZMqValOQSCnQFoQyED2lMAgCRimUXCO1QOiIV4pWCGwK6B68\nEVntEMG3Cdd7iImQIkYqRBBoKcFYlILgPEklJpOaujFUpcAaibUWrSRahyHtuycGRe97lBCkmAuM\nMKyxCJmtZMP22/Xy2jR9fLUjGTMYizAAdUy5JmVIGaT9cNzfOB4T0g8/FxPCp+zFfQOUd9SK3CUQ\n+b2korjHm2/VLoIeO2D5Pu0Shyj9aaMtl8wgGRx13juVCbAD5HRYkUhtbwfPAfYb50SRwdyJvZvG\nHs3i0gjieeuCxQVDH8wwzvpyFyze62x/6yXR7RKBottF3mMUnkFcHCQNPZXOn9+uXfsk40/QXh6Y\nB0EiIqTcVlRJMRMuW9dEBNqInCASBGHI+08CclqRpygMpoo5TVBqunVEKT/YqgralcsfSJIEF1FK\noI0mpsB0OsFIxYcPzoltP5hqRXwX8MvhMZSIIlfmnk40qzayWSh8hNVZQsSOZma4NZ/xE7c+hw49\n63bBUVOjpcIlMEajtcWHXLNSlUdUs2NcSLz7rW9w53TOSim+/s1f5/bpPVRR4SKUdUV0gcura964\n/2MEn9U1PgRIJaoInNhjgrVcXTyBviWknqqcEZNntXiCKRzz01uEbs3F+UPaxYLJ8Zx+s4LJnNOT\nU2RzTPKK6/WSTbvBeYcPHiGhjZ4YPHUsscmiRfYvlzLLApUGgaPz5Ci7MwgM3gWCz74wkP1qtDSk\nFCFCVRhi8CRtUI2iqi1NbdEmZV96JMILYq/woqewJUYqVq3DC0WMASfWWKNJybHpEioafmjfjGe3\n18mGc3fI2PZXgb9886QX0Zlnr+7BRGwAZRH2ur+x/YhxvEmtjAueI5jvpfbHMGrQb/LlOwUKsOPF\nB+56G60PypXMkZttlNxR0qWCljK7GqYS2IG5HuqV6mcA+b7d7n4d0QMwlyKDNDtAd2kPzEcQjwa3\nBfDsu5IjcnOQxp+c2AL6bry3PeijwZbYbgkiL37ejB1uXn6/3f1P0F4amAvIQC5H7lSCyHdgISJB\nCIyGyWywpXQRpTqElMQILibQimoimcwU16uAELnCe/KSogQvIuJaZb47RgQObRxCWrQumE8q/LTi\nerXifLPEWEjOoaIgulzIQolM10xmiuYIpiczLj6MLC/XuOtArzUywq2TiujA6RYtBVJY2uWStu3Q\nuqCsKrwPiKRoF1e8/fiM777zPd7+3rvoJPi9P/F5MFO6WOGMwW06YgpURnF8PCUSOb11h8n8FKUk\nLlmulw957Y07lGXNpX6XTjmOJ3Ni0KzbVY6ijaVvHa6/onVr6iOFNhXNkaQ6OmJ+OoXQ8+DBIy7O\nL1heL3Bdh1GCVA6GV07hfE+pLTIJhLQYK6CQqABJC4IPWU8u8hMXnvx4LgVSDIubQqJVvlGXlUUm\nhSkNfQoQPWEjmBRHSJFfrwsglcJLhUmJbu25WgaWXYvre5RSKJ3NvpSCuimpyk/1knbAfwj8Y2AC\n/EOye+hv7Z/0IjSLiNlEipgQIe8TUi7uERL4EbDZG+f3dTfO5488+ehZHrccudim8Ec/qFaC3C2W\nxt1i6RiZ5xBrR6OotLO5ZbxJ7MHsGCWPQL6hok0lLSU5rWgEZv/RW5G3NysV5RuAz3LivcjcMW53\noO62oD5G53vA7s3Qc8LQFrhdBuURuBmUKgf7g1PiSK/s5Ik8DebbD/gF5z5q/rfZXiLNMsgREdlU\ni5iBYLhohAg0zZRmkkuCrZYbjFdEEkLmxVLX9zQnmqqJLNsOIROm0LgAQgWUDJlzH2hApSTIDoRm\nOp0zm02pqwKjBL8RF/RpgfCJMmWjLpckSQaUkRy9rpmfSMJa0y88wSsKo5iWx0gZSb3mev2YubxF\nrQuuri5w6xVFUeQ1AO+wWtF7wZOrjrPrjr//rTN8qnj/0UPeefQb/Ms//zM8ulrQLE4oK8FpM6fr\nr5AIpk2D0AZbVGAMy/YJHkk5nbI8f4RVcHL7NWISOB+pZSIE6NfXpNBilOXOq7dJ/W0ePnyCrI45\nOp2z9pD6S1rXsbpYsllsiNFjJsVwkUWSSLQBKjqkbhBeonRCa4kqBKIQyCTwwSFRe+LqQYmkJMoI\nwCOEIiWHVJFCC8oS8BHnQUo1uGaWdOtEu/F0G8982hPlmmUruXjSs2pzRqhVhuA7Hl9eEULP0bxk\nMm0+zcv2wdABlmQQf5UfBMxT9tonjkA+gPgWvPe3z5rbAXtMh4qVg4VONWR+Dlr0DORyLzoXu59P\nebF0jJEdfptWL2CbFDTKD7dgPnihtJRsUsWG3HdgflhObgviYh/QPVrswH1razCCuRjAfATxNCy6\nbimWvch8iM79XnQ+ArlzhuAVuFFeKEiOrc/Kdu7GdgR8wgjqu+0LgfEP65yPaC8VzGPMHPlYhUIg\nt2CtpKRsHPW0wgXJupfYlAYFixx8JTxFI1GVQ5Qg+4QpwXc5WrTGUM0U/dINlYQSqIAPGxKRZlIz\nm84o64qz1UM+OL/CSokgMjnJPiAhGoJIzO4KJqWgTWAnihLB6cldmqIk6YSzWQK58QHJhtXikuQ2\n+FDR9QuKwVe9md7h5N6X+aV/8Lf5zE/8M/yzX/kX+Ct/9RdYXD/iF3/pV/kj//q/xP37P8qTh29z\nFHtC75BJUpSWsqooJ1N6r9gEwd1XX+fiekPVHHFSzwluzWaxxF88QqIwlYTUYlSiqDS3ZxO+/eYH\nlJXl5HRKYRNNo0AVvPW9d1g8viZ5wa3bJ5hSsRHXCJHwUhKjI4iGJKAsgD4vMqNzIpCSAuGGBbXO\n4/rsfClSQmsBQuTFUR9wTrBpV9RzTSAghSaFgEgS3WuMtKSo6FjRrQKtaWmqAqlaFB7fJkCC7ihU\nxb2juyw2HZcXT1i369+pS/izwJeBX7t54EVolhHIx+hujLq33d0c7wH7jWMxjhHzwHPvlUmL46Ln\n6M+i5U6TnnaLoGNkngZFi8MNzoeHfuYRQRj8zB2aPpnsJU7BJlWsqXNPNQmBFv4A0LfALvbmxB7Y\nC39j/gaYi7F8Ru5+4MpHQPd7NIvfA/Jsd5sj9ODU7n10u/dxH9Sf6sPnlMbjNznzF22fIgv4EsFc\nIJBZjShEVpwMSUIpJYzVFHWknCaMg8WVQpEIIVMyUWS6RemsST6aNawvHCpFbBEpa4nRgnQKG6lI\nMVAWecFsvVpyJVe88RqUjcWUmrt377GO7xG6nvKOoW4EwlqW64SyFfVkSYweWStEs6IqFfVUc3o0\noxM9Ia6HN1TSdx0SQY9itV7hfc9m09FMSz73uZ/k7XPN8f1X+LVf/xp2dpdvvvUmKq15dX6M6DVC\naSSgdF74ffX+PermiHrSIJtb0Dk+/8Uv8PZvfYMP3/1NhIL7r3+Gu3deY3qkKa3l4vIx3nUYpTHG\nMD0+obYTvvRPzXj4/gOqSkEKNNMTHn3vbfrFiiN9RFSBiW04ns95fxNIcZXVLNFibEKlrDRROmKs\nQBUJREBFSIOdQiQNiVggh6cckTxWZ4vU5ATtpiceZ+gA2Kw6pBeoWjIpSirT4KPnsl/R9S1abwix\nBxKbVcTqI2bNjFJZ6mLKjxyXrGLLW2dv/U5cvhPgbwJ/ihyhH7T/+hd2ipqf+3LuT7X4ET1wAPQH\nY7+3HcYi5AU7ocXAw+dkoFx9BYYKx6QkcwSVJDFxo8gysJUg7lwSx7aftp/ELhN03/twvwfUnqSR\nbfk3QcoB3PhqYu93CZ46J8+n4YlhUJ4P3/+03YqndNxCpCxmEEN26VAUW+VK2tuei0ELkEPuody9\n1nZfjueKzApISOP8zbqd6anB4e5Nc5P0rMn99lXglz/i+K69NDA3Nmf7KSEIxJ2efEgOMqVAmYQ0\nPQiDGkyugnODtE0iqLE2YSw0U81qETEyQJNQQjCpNUhJwiF9Q2EMWkDbOx6+f8Zn3rjL8a0TAKqJ\nwRSKRjcIYWmOCspqSrnYZNN+2yI7uFRrZBkptKKoJKU2YB2qN3RiQ+c3iNWGEDxaKpb9NUTF0fEp\nX/jiT3B05w2+94//AbePjzl78pj/6a/8z8TY84u/+Lf4C//Vn+PBk3OsEpmW6A2FLfCup6hqRFlQ\nNlN82PCr/89XefPbD3l0tUC4DW+/ecbv+/1P+OKXfhLne6QQKCT19IQkPDIKOn+NLmte+8w9+j47\nM1bHUx49+IA37tznfPVdYgqU2lJXmioUzNyEleiQaU2igGSzVpyUeU5hAIUUkAiECEZZpApokasx\npagQIlFUiRQCnfeI5PFeomRWD/UrT7daU9kGWQqUDNSFIYiCPnWkaAbDpp7oA0ZalOiZHp1wVN0i\nhsREzVE68Q/51qd66QL/B/C/sjOYO2j/xR+7MfGs6O2jwDzd2D5rLj09zoWuxV7tSrnbslscjUO8\nnZIk7GnMRxDeqbzlFrBHL8UDJCTfEbY3BbHnkjgUqd430JLEPVCPTwH8Pqhv283xIJYYAVrJMPi0\nDwCr8tOgjLmohUxxq6TJy7mOkNQNTpyDhc20pVT2Fj2HRKGbfHmKW07xBmA/Y39v8xSIPxfUvzL0\nsf2ZZ5yT20sD8zuvNDx+vCZlroWcip2jcq0SZRUxRmFtIplIXStEkqi6xvtcjWa5ECjdYW2RZXNW\nEnpJVWuUCngpKCqFKRSFrNDaAj2xiyzOOs4ePeH0zjUgkQKaaoJ1FiUqZrXF1IKQEm3fY4QkKY0y\nkaJyiEpidAQTsZVgUpZE72ldPxghgQ8h84ZKoYuSajJjPp8jZWS18nSbkJU1UVLVNfPTu5jSoJPE\ndx2xnFJXE7QRNLMTbDPHK03oHf/kW+d8Z91z9/6PkmLLm98/Y/btSyazB8yaAlvWJGuynWyErr9m\nZk+RUtP3PYLAZD7HVBN++Wu/wgcP3uf27Bbn1w/RVlJYxaQsWQeDCp5CNsgYsUpSlzXHDh4tFyjv\nsjxQSELIGbhKS5oyoZWnax3RFTktH4dWCe8TRml88CgvSDGijSD6irbXpCTwRJRS1LrAcIw0l9BH\naqup6kRTCJTdsOkecmt+G+1KRGE5FbNP87IVwC+QjeT+4nPPehG3r48C84/rN4E8DnkRY/Fh2BYi\njux48UimVEKSBwA+gvt+Qv1hpL0fke+9E3tyYrlXgHkEdOAQyDmsKjQCeX65w+3Y9k2/xt819hxp\niyFKFqDEUJlokHemuPW20YQtGx+SJGlJMoMMMYihvucA3mZfijgcC6NkUUCQO848Dn/l+Jnsj8c3\nK+0De3oGkKft+7mbF88ZP7/dfEj4HWt379zhzp0ZWutcI5lESlnPOpkW3DptsNbkauwmUk0SRRUp\nmkg9tUwmEyYzQ1VN0SZzsspAEpp6ZjCFQQmN1YKj4wJdeXSRXQBdm1A6cvlow9nZIy6vHrFewL+w\nOwAAIABJREFUL6nthLIwFHaKFhO0KYAOKSRSGZQyFMLSNAVHVYOSElSP0ZBEYmYaCiWx5IzVdnWF\nxNBMKqZNAb4nug2f++wbiCh5/dVjCA6RPP/9f/NneevNb6NR6EIym8wQOuBjj9Il0ijU0QwRNd/6\nze/yzvWGP/pv/wm+/c4Vf/1v/t/c/ZFXeLer0PYeKalsQiVNXszUJVbXOO+wUmG1YFLXzI+Ouby8\n5r0Hb3Pv1h2a0jCfz2jdOa1fUhuBlYapLpCip2GKNYa6KXjl3gk//tnPMZ/eBhSESG0qGjtjNp0x\naSqmtaUqisyFp4CSkbIsuTOfMbFFjsr1mmxINqGpb+McXG88IUWEcWiTqKuKpsyl/nQVOZpAdSSp\nKlC2552H30DYSIgbjP1U45M/CPxR4OeBfzT0P/zUWZ8EqD8OuJ8XrQ+Red6OoD5G53KnWhmhNe0n\nyx9G5AcuKmIfgvfhdwyaDyPr/Uh8NM3adrEH6PtR+XM5iN1v2e0NS7AiImVEyix0UNKjpUNLj1YO\no3qs7ih0T6E7Ct1S6pZSb6hMS2k2FKalMB2Fyeda02OMw5isetPGo01AGY80AWki0iSEiQiT8jPa\nQU85PNZp19XYc2b6QReRQcrEIacWP2L8/PbSIvOjeU1TVaT0Pc4eLrKcDYGxinoSKZuAtZnzEtJR\nVZrNylGWmr53WGWYqoqy8mht6NoWgUFKR91YtNmgdUKpmsJKtBSk2NF3LTEmcgm1rENPAXq3QhiN\n1QpEgZYlJjgUDiMjjanpYo/AUxQNk2pKaDOPLHWHRCOjovWO1LXE3hOTZFJPUMawXrd88OHbeF3y\ne1495W//ygN+9md+H2X5De6/fp+mOeZrv/517tz6OfzGo5XOEsTFhuru68QIPhms0Pzyr32du6+8\nwh//d/8UXdtSGMPX/tFv8LM/+/N4fRvhL+hWV7SxYz4/BSkI3hH6Hu8btLIIGale/zH81RXTosLY\ngnLZY+OUx/0CIVaURmY6SVmkqCmkZFJaqolB2QlFM2V6NOHs/JhHDx9RKcm0OaKZGoRcQ1BEf0l3\nDSCJdFTFFB1rIhOk3GBMJMVAMzEIX3B8dMLGtSx9R2WhLBNagxl8X3xS3LpboITCGoGkIgg4u3qP\nk6M5IWw+zcv27/EiAdAPIzJPH7H/LIolil1kvvVo2UXnW5pl7Iw1O+UNUy1FEGovej8E8lxwYABY\nsc+7p63z4QjcaZA0fBTVwt6NQAyveRPUx8g8/7IhKpdxqEaWP5Fs1pajcYUazL4UIT/j5bFQRDHc\npA5qe459Z6qVi1LkfRFk1vNvFz5lrnIVEykNT0VxjMiHu2p8znjc34Xyu7vwJ2wvDcznkwm+gHuv\n3GLd9SwvIglHSj1FVVBVAmsVQYKQAVsHuk7gfEsia9LrylKVUFpN8hVP9IKoDbaQKFUgLRgEpalp\nU8cmLIm4rDONLffvvUKZDDE6ohdURfbOFnENaYJULXWpaB2kCEIYBFDpmqOyJsoKW4BUEh82LLtr\nSq+RmyVKGoIEKT0yges6WjwP07cJ5YQ/8W/8i/yN/+vv8uNf+jEWj6959903+Y/+vX8LHT3L60eU\nBoRWNEczhFDYokTZgg9/612++rWv89Nf/mn85pKYNH/5L/2P/KW/8OfpXc/1eoXxSz54+xuoomC1\nWvPqa59ltbzk6OgWq9UTbt95NWv8jSb0G96YnfDOxQPuHN+hW60oKZBKoJWgMImiKCmszokuytNM\nKqrJKdNYUK+PwTRMiprQbTBKMZlCpIBYsFpYOufp1j1z65nNSpyuOZm9RhvnePV9LsM1dTPHbwSz\naU0tLO89fpe4EdjjTGMVlSLJgKSg0jWCKSlpZGxQQiFjS0od6XeBBe4Lg/l+wPWigP4RoJ4iA7iI\nXXQ+2uAegPPOGXEH6oe+hQclIoTc8u5PQY7IAHXAfaex5LPcgvhNbny3P1Iru4XXjxJ8bF9DxFxV\nUrAD85SyDDNFlApP00VCZeEEcueaaAYzLa0IWhGNJASF9IoQYj4nqJ3aaFS0jDLSg89qD6xl2u2L\ncX6PYol7j1PiGdTLD9BeGphnwE3UjaaeaPAdi0VCqoQtE7boKUrBYu0otEWILtuq+gLnOoLznJzO\n0MYyaY6QSG7Nb3H2+AprQWuTZXNUGF0SUmDjPLYKmEIyPznlaD4lhYAXgVJn7w/nIiH2uLCmwOeM\n0eRJvUQKizWSwhhKXZBkTVk2RPGI3q1ZRUelC4qiZLPeYOsJMQgcPc45VqsrPjudcasueOut3+Bf\n+cqXMVLS+YRrr2k3nvXGsbh6TK8FalrRNBVOJGTnKc/POHtyiVI109mMqioJi5b//M/8WV6/c5Qz\nNSvNG3c/R3f5PmePHnC9XFE+eUxZViyXlzTTGSFGJmUFXY9cX9FMGpoWHnSPUFpyVNZ4taKZNJzI\n/IVTWqKJIFo8Fc1RCXqOvlzTB0MhGkKvESlSlIEQl/hNRMuICOB8wFiBVD13734WjST1FZPJbfp+\nRYgXVJOKkJaoQjKdSDZumSFBe6TsaCYKgUCpnhRbpJjnaEnl8n4IR2k/1QzQF2svAubPAvKb4L0P\n2M8C8WFuG9gNUeI+kO+SgvbpltHidqzfubfd0i4DkG+3exC8x++OYhCRdjSL2gPwmzTL4f4+Z/60\nam//39wKVQQ7IM++fLlO7wDiuSi6OPzbt4U4BgVMkngzeJYHPWx3XYb/n7o3ibUtS++8fqvb3Wlu\n99p40WWkM9OZttO98aCwXaY8KFMqBkggJAQCZgxgSNUMJggYMGXCBJUEooRUgFQITCFlUaaqMJCU\n0850pp2R0b8XL957tzndblbzMVj7NPe+F5mRkRUV5JKW1m7OOffce87972//v//3/ywxJFQ0xCDX\nZIkSFSqMbSyfA/PtHMF6C+jqALy3xzk4J4e/6acfnxuYaxXwKlKURdY6R42QS7z1WFSirUGbEm1A\nqUA9Kdgse4Yh0kVNPV0zPzW4qmKmG26fQkhQNwPabVBpjtMTUspWqU1T4/2G+Znw+ksPKMrcQXy9\nGWjqGZEOpXrazRJna4bQARGrhGgErS1lmVuuiRacdTRugjctaRVxqaT3EastSRdMjucYShwe9IZN\nv2GxeEYzm/PFsynKRox1fO1Xf5nv/skfkx69x8On73M6fx1tGqrC0K575lXPELJhmLOaX/u5n2G1\nWfPrv/R1/tdv/CHJL3jplV/EILz68n2a2YYHX3iDdb9GRLFeL3IysamwtmAYetTZKSn2+NWC+fyY\nW/1tdDVwFQeehAFpjpk3d5gdw5OrDxBxDKsFRRmy10c5ZT6bkui4hUOLo9u0DK1HiDgXkUFR2ILK\npXyHrJaIXpPMR8AD6nqKci1NU7FZ9VjXExC0F46nBXptgYGkCvRYdaqmnqEIpEEjKRBJBAkYVaPo\nifK5pYH24yehWW4C9486d40n57mIfMebHyQ793Mfgd/kzm8mQNMu+TnC7kix5CMj9UGmWbYg/iKa\nZU/6PD93L3htbH/eKFdUkpVTKo2MT5Ytap0Qc3jRGbeV2oH5djuhc2s4awk2EK0lurHTkLPZdmPr\nk3NDYy5bGehopfAcgN+cSkZO/ACwd8fHc+oQ1D/9+NzA3MeWrt+gVKRuIPQKiYaYAsYqtGGMgi1a\nRyQpikIzWJV5VmtI4nNvTHLXnzt3XmbanBL1O6AMWk+x+gRPy7prKVyibgyzVyxHsyYXobiCoW1p\nijnGaNrhKX26YggNy4XHlC1xMBhToY2gfHaw0BIpCo1zFVqd4MqCk9M7lCnhl2uaaUBE4eqKxeWC\n2K6ZHx9hixnPrp5RFxWl2jCZNLz9J/8X3eUz2m7BpFZcPP2Q+v5dnn64pplMURfP0MbSPzrH2Dv8\n63/9N/jv/ud/xOyrX+H2vWPOzu5itOaNcsLtr9zHv///Ero1x8enPL1a07U9s2OLtjVKG4w1mGKO\nPPsQm4Q7usHNzpDlE2IRGXTEzu5xNLuNsxXWljz+6E2MLlivLonREZOlDwNNXTO0G05PCi5jAWEJ\nacDoDq3WlFWinhri0qJMQhjw/inW1SR64vCMybSiKU7oWjB2IKUBVxQc1RV9bDGpoS6mlNUZEp+g\nyxavsme9LRUiCWsCJDd6wXzO458WZ/6jQP25uaVYbkTnL+LLJfPi15OfN2mWQ3ni9VQlMGLsTdpk\nr2YR1AvULC+QJe4oFrgWnY7h+HMM+hbfddzTSiiQcf9AfUNkx/Vv9egZzB0hWkywhBiJMaKDIxx4\n32z1/Fvpog4aiXpvp7CLzOWANpNMwWwB+kV82I5eGYH82rlPPz43MN+0V6z7BcoY6lqIg6O0EWdP\nKaoWbTvECEVlITUkQ+6HqB2usGgpKCxjm7msU6/KmombE03BcvgzmvIeUNENkc0wIGKo6khpGorp\nOX1vaDdPUaIodAVW5QIY7dB6dE0MQu97KlXibEFRKJwDTMIZmy0IVM/D4TssVle8ZO5igyf4SFEU\n9F1LiBqlHY8fP+P27cBUnbDpBq5WK67WG0K3gmToNj2XG4+Rlru37mDqCqUMw9AxbHourzbcvr2h\nqO/zr/3VX+LtD1Z8c7VArTrunk35vb/2m/DkHT5687ssVmuMq5jNHYX1XF2dM5lUaDNFG4ccnyAP\nn5FioLJC7Wrq5hirLpmqE1ZywdH0axhtmE3PuHr6GJynHWBolwxE7LBGYsSkK9pBYbWjKmas2g8y\nmFtN2VhOz0qiXBBCwvvIMjyjVZqqqrAO6qYimYizc1IUjDlj8E+oqmOkv8Ka/A9raCitpx08Rits\nNUFiQUwdKQSqckboPwmSfsbjk1QF/rhqlsP/9+cep3Z0y3NAvqVXDlQs++TmDzOnvZkAHYtz5Aao\nb0FZDmJ/tefMn3sl9Rxps+POD1Kd2xc/IGHGI7skqNrx5WzvGGT3NLZ3D7t5kCxNSuNDIESbK0Oj\ny43CQxpdLFO2SxgBe98uTpOSRkchbQFc2AtR9AjwW1oljmAdb3x4IlnNIuO++ikH877vSXQQE85a\nyspgqwKrC6oqURkwqccyJYhCbCDZJbYYiNHhtKFusn+ID2sG33J7/ktYSormFvHqPtY0aFXgk8K6\nSBharANtPKIHWv+Irl9j7Rxtb2NshS0idaNIukOLpRsUvhesFo7mJXoI1KWlD5cM4iBZlF2jlKYs\nStZ9S5EChIDvB4ahY7G6wBUlD+7dY7G4YrF4l/Vqw6uvv46xBc3JLfrNirj0GG04mp9QT+9CCgQx\nbK4uWS7OqadTuuUlpw/ucevLv4Tob/Ly/a9RzY64deeE1eW7/PEf/xGkSDOf0fuAcwY7NVwu1zRN\nAxI5ufcqlDVaFKXVDAmauuGOgpQSlxislPSx5XRym7Ka8stf/R2+9+Y/YGme0Q2P6JdfQB/NcKIJ\noUalDoeFdMRJY1lu3gTd4rRjMhNEjlmuB6IHLx6rNmht0EZDspRlQUgNMSm0iUzUyyjdYao7FC6S\nJDKENW2/JiahcBOIDqVKVFWyWXeI7rGm/ry+0vvxTyMy/2EJ0RdE5YeJz73e/IaqRa5TLbu2b/IC\nIFfbBOkNVbhS1zBnz2Vvteb7nwDcULAcAvmebtlGp3vIvhmLH+Bzls/sVpSg9MF7UdsLA2MEPz5+\n/BsqDQmFcXEs90+5yUdMYzQuN5KdmuT0aFC2fVzaPy4xXiQOgFwxAvgLrsKyvepu6ZWbV+iDIqTd\nb3XtKvWx4/Mr5x8/HasNaKFuDI4SZwyuLNASkFSjtBrNmRxWg7HgisS0tMxKl02g+mfU7oz18Jij\n+lVQgrMFvW8xZSCZFldkT+MkgURLYGA6O0NUj/dXOANJD8yaM5I8RlMyxCE3eFUepXSOtk1O0hWF\nJnJF3x9jU0vDlHl5hNUGmzzL5YeErmdxuWHwA1LDo3fezVRO13K12HB8esIXXn6Jo+MZH30UqOo5\nPZ7TO6/QHJ0R+wFbaKIMyOoSrR1adUycYfP+m5wdlfjOc37+Ft//4DsoSRTNhIuP3sE5TRSHa0qe\nfPQURDh//CGv/cxXUKen0C5JIoSuQ7ynLBxTDEd6Qh8UrQtcLt6jaWrO7Cn65B4P7v8CTxcDbXqP\nYXVOURaIKoipxq8vYKgQAWcq5sWrXHVvk8SjdcWkEUin9KHH+w2u0SQP0SaGocXoI0R1aDVh6AO3\nTqd0myH72ocNooRBhJQCEmuKagZGSEFhU4PSHcvVE+b1K5/XV3o/PgswvxmZvxDQeQ7Idw2YbyRA\no5hd/84bPYC4pmS5IU3cJ0APSvUPKBbFnmbZyRUPXm3rIHP9OXvN+g64dri1P3Pt5ynJCpbDn89+\nHzLIZ3uD7cz7gsaEiLcxa8bHaHzrUqlu8ONb6aKOZgf6e5pFduX+HFxg9jTL9sM5APKURorlANB3\noP7px+cG5qUrsczRJpJSIiqfKQyrUNqSKBAfiCKgHKbsQVcY3SOmxLlsYyt6hbBhiOB7TeUmmKAJ\nKTL0ayAR0kBZzFDk/pNBeqytKVTBydkdPnz65yS1ABqsqXCFIg4dgsEoS9IVWkW8jyircM6htB8b\nQ7fZkncI9DZ7coh42k1Pv16x2fQkbbBKszEWq0DXFlGGYnqLVMx5+/GKl1/+Emse8u1/9E+4fPwm\nj8qaV9/4eVxzRDU9pqhPqCvQTGhX50y+8LOcf/sdEpHYdjit+fDho1Gnf4wyBdK3OCbcOj1iCB6S\n0EznpH6DaZeQoK4rVkswEpg6R/AeUSUqKj6KHU/Pv8XZ5A5ON9TVhFN1m2ebNX7zlK6Y45Qn+EA0\nicXmPSb2Fko7RAJGJkRWWbU0neH7FZtuQKuGwtZolf3NV+tLtJ4icUJqNVoMw6bHOUtMhughhIGk\nI2I3aFXkxt7R4NOafmhR2qP1mmX/F5/XV3o/flIwfxFgvwjQn3vOdb58F4nLi5KfN/nybcH7QTn/\nqPw4BPQ81A5sD1UsN5Od1xKg1y4PslOyPA/E1+PPPc0yyhgPdOYqja+jxwvFrjI0ofTY0EPL2NFJ\ndmX+SSl0KDAx7qLyDNI8n+yMemx8rYkxoqLZWxMfRuZbyudFIH4zItfj/hbUr32In358ft4srqRQ\nBdr2+LBhSBFVDmiT6ydD9CgKjLaI2DEDXOCcQscplSswLnNPulD4PhHCgsXqEcadkFLPkHpCv8Zo\nqHSDLY4Qa2i7Fi0FqIC2imbqWPslBUJM2fdDFwbpDcFYtFJoLYhEwhDQCKlKxCioGGn7lj72RO1o\niiOivqCezEgSmOiSJIoQB7Rr2IQBY2p+8Wtf5eXXvsD0aMbrX76FaNgEw+z0A77197/Db/zCXX7w\np/8nt196lQ7N3Qc/Q1kLx0cNrjCUR3POvvx1Hn33W8xOjulWS+aTKUkUSmu8UtTzUzrfU5YTSGvK\n2lKVNco1yNPHRN/SdS2TyhFCxClNL4FjNM4es5aey/YD3vngz2iKuwQ/EKPG0dCtWkzRM6gVGsdq\ntSamZ1z2l8zNFGdGU6cI2lpMUdDMKwIKUqKuarxPII6YhL5rUUqI3uOouLxYMz+Z4+OSpDxKBcIg\nmLLGlBZFj7EzBr1BENAeV2mE7vP6Su/HTwLmP5Qb54VAv/NkucGXX1O1yPNJ0MNE5/W2yzchOMM1\n1wB9HKNO/Cao73Tm115lLAK8AeLXIvLxNWFPr+R1C+j7aH8L6rtCJdl7tmhJ+2SsTrk9n+R9UQod\nUm7LFwRl8xSndsnONHYZynLFmIF/fM5O6bJNgL4oEr9+u7QH8i2YX4vODz/gTz8+NzC32oCyKKVw\nNqFDT0wD4iKFPUIGj1IQhoBIjzWKwlQELXjtAJujMacw1uB7AXqCXND1NheQCFntYhp0VZCSYE2F\nIjB0A6qKWFUynx1xefEBidOcrTYGZ7PncwhC6QxK9wzDkuB7alXiVCIJWBIxJgJr1v4xE6UpK4c2\nlmp2wumdOXU95+T0Dl2Ao7Pb1LOGymrK2YSnlys+ePQ2tqx47Ytf4Vd/U/P+997i6eUF92/P+Qd/\n9Ba/+pu/RTWb8PLrd1leLZjcfQPKBxQPFPV7H/L++3+BVQLNnGG5gBQ4ufUK2jlq45AUMaaiKBSh\ntth2QRwGNus11mjYdnvSilpbQuxZDlcUOuKs4qL9LhfLJ6ihwZYaTYPElu7qEdoZJLmce8BQlBA5\np7AlroTBa8KgiGZAqZ5JY8cuRvl+NomiKCxdv8bogRBn9FEoK0vbPwHlcEWFUpHWf4QWC6MVsg9r\nYvREGVA4jLEY7T6vr/R+fFY0y8cB/Q471I3ofEutHHizcKgv3ypa9s0mwjVw19mVEL2nbm4oWp6j\nWEjXaJadZJE9+/4C4mZPj3ysPHEPkFv+3WyBXEbrgJQwsgXzuDtvJO4aaJtrYJ52bfmIsjPQkrE9\n3BbM0wjou+fEMcF5SHPrg7f63JVW9iX8cgDgOuYkKT/lYF64zMspawhRmNVT+rjBOUNdTXJ7tPSM\nFB0pJAxTrOkpnEMlhTEOLUJMAadKjIkMkhOOQ7HMbctSRKJmiJ5NWmHtBOUCxiTaNtCGc06LOxxP\nv0q/+T7rtqWwNWa8XXPW0OuItRZlE0MvrLuOqAoqAU0FpiepHpGOoNfYWc1ZdZ9Zc8rb3/sWHz16\nyPHdgWV7RdsGhre+A8rxi1//OpPiZY6P79I8mHFy9x5Pz5/x4I0v8mu/9Vv84A//J64uPL//L/8b\n9HLFF7/0GvVrr6Eu1gR3TNHcRTbPiPMZm3aBv/yQqj6hns8ZVKJbPKPvO5rZDGsMzjjKqia2kSQd\nCkNdTVkvnqBTACX4GFGiMEmYSuS202yweN2zDhfoEFG6RNsJffcUHRaj6ZkhDAMi2T5BlSuiWVNW\nE9reovxYTScdqBrrEhI8fuiwZYGWgihXBG+wdgIJ/CYwmIKi0hRFSZKBafMyUR4ShewAqc4IMVfw\nGrONpKrP8mtbkf1IS6AA/gfgbz73qE8L5j8qGn8hgPMcblxXsxzEyzcjc3meZkm79QY5Mtre5nEz\nSccOyA95ckFdP84hX77tXnQgSdyxNzcvF3LgICDXLgq730BlQDeynWlnspVdE9NuW5QCdyPRuTXb\nGqmVXPmpiTEQo8XEdKB2kd0FICc9uQ7icrCdthH59gIwgrqOB9F5PIjOP/34JGD+cX0PT4H/FngN\neBv4V4DL8Tl/E/i385+Jfw/4g5sv6lxJHzzOOLS22OSJaAo7QytHWRhit0KrQFFMKYs5Rd1hTEun\nc1Pg4AM+OgozwRnNoJcEP3C5OAfASyAGwfsAVrBlZBgS2iiyXaumMCdIamnKMxbL97ObWnQksx67\n3iRQgaKoWK83hDAgEUJIWF0wyCV1XXL/7Kuo4S7DAp6tH8OQcLO7HJ3Bm3/xFxir+Plf/ufxQeMl\ncnLnJb731lvU1TmFayjfe5d7dx/Qr1d85Vf+Od753reRKLhZyd3jW6QIP/iztzFFyZ0H91HKYGyF\n6T3LTU8xOWXZrlhddKgIm7KiKBwn5R0Krbm6esYbX/s10kmNXgwEG+jXLcMwUJsSozuSQFmWRCO0\nfUCLUMsJnVwiskAoiNGCKvPfNC3xfUfwiqQsTmkCwq2mwhYD2m44MXdZPqtQytHLmhCXROmJoWDT\nC40RXKGxriL0uaGFdQUJYRgCtihJ0QKJGC8ICaxJ9EMgmQUiU+riBBHofI+kz7RoqCObbG3I/zt/\nCPylcd2PTyNN/GGA/SLwvnY+K1ieU7PcmHvufJ/8TNd8TG7KEs31+Fkd0CzbXN+NCPvwEnATzA/V\nLDtVizqM95+PyrdUy3bkitPR71HlSHvripjBOhxsjx2Lts2kx/OiVO7SNFIrO2vboEluDArGMv4Q\nIyYGdLToEHeR+Y5m2YH5+N6v0SojeG9X8wJ6ZcfVbNdPPz4JmH9c38N/a1z/M+A/AP7GOL8G/Kvj\n+gD4e8CXb75TZ2swGm08TjVIinSxxyiHcyUxeVRISNBYXVO4GmOE2dQjsgHRrDdCiHYsoTcY3bIe\negZZ41NH4UoQzRA0Xd9RBoMrsrVu73Pv0fPLh9w6fQ0RYVaeEKPHh4RoD5K7q2iVsDTZlc0MRLWh\nVAUhrrl79jM4l7i4esrMNTTzY1TrGHTP6b0HvPfmX/CzP/91Pnr8jG/8wd/ht3//X+Tpkyu+8fe/\nwe/+7u9iVIEfhKou+cH330Sh2VytOH31K0gY2ETPqW64WC6whWUYYHW1pJhcoErL7S/+LF+Wge7i\nKSEGku959vgh6+UVejaj2yww0xn3X34FTMCtOoZnT+n7BW3fMTm+T4gt2hsc2bvd+ZapsazFMNEV\n56FE/JJNu+RocoSKmok7ow8DUVpSjPTBE7DQRapqQj2tcVaB10yaCX1fgCzo+iusy4mpECI+KGrA\nWQtRqIoGHR2DCEqVLBZPSWoY/e83+BApyimOkhRbtDY4WxMGhbGR5D9zb5ZtK6MCMMD5c4/4JP+T\nP64vyw87fxD8cZM3P4jId9tbWeLHJT4/Ljo/JEUOEPY5ID/wZnleV/68znwbnT8flTMeUePP4Tqd\nw9gjVEaSSLZdiuJue398f0y02vda3VErjDpylWmVYHNPgpj16CbGHJ2nA6plx5lv36js3vEezMcP\nJ26pFjlwTDwE9H82YP6ivocPgL8O/PZ4/L8it8T4G8C/BPw35IvA28D3gd8A/vHhixpbEEIAEbTR\nOGfRmw1+CFAlRAKSCiI92lhc4VC6QBeOYpboVwMxKfpNxVBAWeqxl2hJaTUyZC6VpOn7SAiRhCVI\npB3A9wqrK1arBUX5HpaK0s0ZhsC661G2x7iBhCLGguAznVCXU46OT/HyjPnkZZ5cvM1xXTOZ3CVF\nTxtXFO4Ot6Zn9F3LK1/4Ih+8812S7/nN3/49/u9/+H9Qz+/zl//KX2W92YBsiF5xcRnwg0cCpBh4\n83vf56VXX+HRh09o24qmiFhXcOf+EZPZnBQ7bF+gZ3Puv/5VPio+4Ol73yMMA6e3T7lzSW9sAAAg\nAElEQVRMEesMF0/PMSjuvfwaKEv0G4rbp/SP1vj1gs2wpCon2HJGtDVEj06J0IVcjq8ctRzxpL3i\navmQxj0AF5kU97C6Jsb3cfaC5foChaMqT1leJkrXcOuOzxa+usRRMy1ew/cQ5FG20q1qrHMovf0e\nRERtcEWNUVOUFDBErhYfUDYt2kaa6iQrjlyFUGfVjBEkJUwUkvF8xkMD3wS+CPwXZG/z6+Mn5cxf\nxIl/kmj9ZiTOXmN+COTXqkB3FMxNuuVjQPzGeJ773tMsHEbgL5zpGqA/D+Q3NNY7PfrhHcC2GXSe\nbuxMugXu3f7Btii1S3ambYPrbTRux5L+YLHRYmLYA3lI2QL3pprl2vve0ik35jYqv2aBe9P29p8t\nZ/46+76Hd4HH4/HH4z7kBreHwP0+GfyvjZB6SAoPVEXWkzfVXS43j3DdeZYdpkDwiV632K6gmRQo\nCkqXPRWsswwpuykWfgkktG1IUaiLCYPa5FsqPILk8v8g+CGwWnrqMmLVjOXiipPJMc45hk4zdJFU\n9ExsNtcafM6IK+WYVI7Sddw9/gW+//Z3kFgRi55hWFAVR6A2LNYfcTSd8vSDj2jsjLM7r9N3a95/\n6885Ob7NX/oX/hrf+e6fMp+eYQvNyfExMSY+fPSIzXrD5nKBc44PH37A/OSrxKCRWlPNbqFNxdNn\nH3GijqmKgNbZt3x6coRWX+Lqne/Rd0uO5scsl5dMK8XR6SmumCCFkCjprq7YrJZIGHLT55QgDWjr\niBJQzlCEkokkUkyUHqJXDEPBanXF0fwMVxakXqFCiVZgC0UIiRCXhNWE2aRicSX4YU1qNzRuTmlK\nanuLjVwhCE1TESJoE4hR0CaR0hXazpnOjyh0w8VFJLZrxA9oHUmpQ9sTjM3+98MQCNKz3vS063Ns\n+ZmngRLwS8AR8L8Av0MOZHbjPzzoP/Q7X4bf+crHvMoYEfKCKYf/5zeP3ZghQowQQ17TOGVsUJwi\npCA5+tw1LeaFDaNzV7Xr9MeOFrkWFV/3Lt8RMyqNMXlCjTTLdarlOpBfA3u5eWz/nG0fUbcFZrkO\n0NdAW64fOwR4hx8pJzO+q/HCpQxRG5LOazCWaMbVWoK1WGexKYO8TRYrdswn3ATmvApxr2BJCVIO\nOnKULruKVNE7zur5If8PmQz50ePH+eZPye2y/n3gZvvxFxNe189fG3/wd76JcxYfer729Vf5yi+8\nwdGkoh2u6MMlSs0Z/EDvO7S6wCRB2ymlSVm1YCV3vSlsplD8Aq0NlbMMlMTUo5XFy/a226OoMVrR\nxh4/DGgqhjpiPWz8Oc6VuNIwa2acd4ZERNtEDJF+6AlRKOtj5rNbXK3+DKePaMOadevpGTDxhLq4\nxYMHb/DRux9wfHSGXyeUVYjumJ894PZLr/GNb/w9Xn79VZIMPHu6pO9a2rbjw4ePefXl16mMxZmS\nhOKdt97m9u0TvJwituP0tqaoTFaEqIohJhbLC4bNFReX59z58q/y6Hv/mMunb1MUDkxDUU0ozl4i\nXXyA7jfQelaLS8QPmDKrPxIaoxRGG1h7XIzEbkk0isFvMKlHiWa52uSLWjxBUdG2Gm8V1gq5K66l\nLCZYdQbe4/vHDP0TDHNINVppJAlWG4q6pOsDSMLoipSWxDQQpcM5oVCOogQzJPoI0vWI9tRSEdOc\nEFuGruS9P3/Km3/6lOCHgyTdZz6ugL8L/Bo3wfz3bzzyBRy67BJvL1jDwflwsB9efD54CAaCE4IX\ngk1Ek2eyCTEjX2siSiu00WitMGOjZ6sY+13mdcuNi9qbVSWlsdttNEkFzGgnm1Qu209KE4mYnQrm\nRgJU0vX9F62yLy46XLf89x6UD2gVOQTxjzkm++cSFWHwRG8J3o7OiZaQLFHGyTAC/EDSJjfCdiY3\nwE57+2CFIDohI3WyW8dIW2S/ioyAbnJEL5Gxx6jOf/8XfXXVrwO/vt9P/+XHfiE/KZhv+x7+LfZ9\nDx8D98gUzH3go/H4B+Sk6Xa8PB67Nn7lL9+idCVrv+R4IjhToa3BMaMbnqDUavQTTgRZM4jB9gZX\napRJQEAbTV1p+ihEiRRGSCoQgs98vNYQLAqNpJ7k8xVRAdYWpJCrxJaLFSF2OEqm5W16pynjDIkX\n2CKiUvbyDjHSDkueLs6xxoIOKJ1Y9lc0nNK6p9yZvMTTx+9TVVMW51cocegoHB3fIgZhvVrzc1//\nOZ48fgqFomka2naDMZa7d04oS5hNTphPJsQYCbePeefddzi6excBNpsNR/M5zlpC9GjnKJzj8dOH\nqM2a7/+Ttzk6m3Pvy19luHjGK69/mdMHXyL1K8L0Lu35t1meP8MoQxybaIcQsGUaaSpNPW2wXnO3\nNLBZc+IMV8UJa2fwCdpuQQg9kizrzYJUXVHWCqUTKXaUVaIPa8pkEARlO9btQ6w9ow1LlFYkiYhO\nFEWDNhakx9ieGDTaKBbLjziZl4jpUQboDes2YumAt6iqiqQKZLjHq186494bhrbdEH3NP/y7Dz/h\n1/rHHrfIcewlUAO/B/xHzz3qkyRAdzwtO1Deze25GyAuNx83ngsGYshAHo0QbF6TEZLJACMHnW6U\njqisSMVsmxVrcvm7UQcOgwf2sSqM+5qkMnDbcU3KjD0/DYZIVGaXAD2UKj7n3Sg3yZybxw45+JQB\n+RCcJWBGYDeSgdvcOH/z8VYCkhRuCIQh4ELIjVuiJSab7YF3RVNjtG40yejsd57UCOb574KSEcAF\nUSm7OJLIXXK3IJ4jckkyzhysK6PGlne5ybSonywQ+SRgrnhx38P/Efg3gf90XP/7g+P/NfCfk+mV\nLwF/dPNFjVYIPbNmwrodeVJdjKqRRDB99tHGEL1mHVdgLLavsAR879HGUFZC3waGGCnRxBRypD5R\nGG0p9RRTQKOnJFpIfZbS+YTTJUZNKBvHprviXF8wmRxhKw9dJAaLKSqM03RdT+gts+IYwgfEBNYU\nWWKkBGMKogycX55zx73M5uoZt45eyc+ThMJwfDLh4cMPee+dh8znM9abK0IQjuZHbDYbGqsZ/Jo7\np3OMUcxdg3KGsnyNnpb57D7TyQQRwQ8DWEtdFwzDhvsPfobV47eY1rkoqiwnPPjV36KpStTZCSpa\nUtrQnDzg/L0foFJHVUyBUXqpFW2bbQ9SEhBLGAIzLGfO8L6aYIsNCmG9XKDrM9p2jSssgxaUStnn\nRXcEuaQ0Bd47hmFA6wKllmy8p48bFEOuMUCjZIZJEdFZ6WL1hM064NTAk/MfoG0gSZerbINC95rO\nBCQJ2ilUELq4QZQnpHVW2Xx24z45P7Tty/63gP/tuUd9QjDnBQCebgB2Cs8DeArXgT16IRqIFpLJ\nQB61EHUimUTSCTERtBrtMTJ+iMpReU4sgkbAjKCiRzDXB6Cu85p0jryTjtgR6I3WRBXRegR0DKi9\nN8uOhZd4/djh/g7IR9b+ANiNxGsAbsf9w22bbuxLuPa87b5ERfSB6HN0vlWuxGhGoB67EmlN1BnI\nk81VoDIqgrYNpJVOJC2IltGOdw/lIkIaAyaRbM4lY0SejEIMYDQSJUfoL9TYf/LxScB82/fwW+Se\nh5Clh/8J8LeBf4e9NBEy6P/tcQ3Av8sLaBZlNNZAigrFdLzS5yKiEHx2IxSTI9BB0/YDuAVqnWhS\nT/BDjrxtSZKe2EWScSQJxJiVKrU5padAJOAKITHQJ4uNFcZYrJpSmJrCOhQ13SawXFwxOSqpXcFm\niMQAxhpEOm6dvEa/uWA2uYXnHKU6rBaUq0nJc/fO12jPL+lTzaR6icXqCqKmnExwRUXfD9y//xKb\nzZoQAilFlFL0QzsqZwaQQEwDVkeOTo/p+57XvvAybjpjMpkxmUyZzo9yJay2qLDm9htf4eIH32H+\nyuusnzxkfvs1qukElSzVnTeQJERZoxZLbDHn6OQeV8/ew4cue7pbR1GUmKpBa82qXSMqYZxDotCG\ngRgNs8kduuRZXD2m7yeZftE9SAZzEIyBJEvWLWyWClf1WLXElif0V0u6VigbjTaBENcU+ojoI0OI\niB2IcYIES+87rNMUlaB0iQ8erWuM7lHREEQYVp5pHfAExGyI4ZOg6E80/gT4lR/5qE/wNiRen+kA\nqNMNIP/YcxGSh6RHELfbaDxH5DmiHG/9jdol3XJUft1VUOkRzO0WtHUGbZ33M4AHkta7nptGRopF\nm6yB0VkOGFUGdEHlgp1trCuHQH1Qbyr7lOtWRrhVxOyObaWGEjBpC9ARk8JOcmhTHJupxxHY4+7Y\n4WMlKYL3OG+yr3kYm1Qkf810LClN1Cb7pCeVAX1L/IyNpJVO2bRSMcbijAC+zX3KSJnnpKmknL/A\n5LuhpMdG9kp+4o7MnwTMf1jfw7/yMcf/43F+7IhRIboce+kpDA6R3PBBks5FU6oceThwtmEYNmzw\nqKiAAqwBq0kS6dqB0lpC3ICR0QKgpK5m4NcYFxFdIDEwJItzGoLCUnM6P2GxukTCiqH3TIJl2tQs\n2pbkZxgTaJoZz84fclzdprAlKQ0UNqGwOPUqVTHn2YfvUjhHS8vpdML64gOCKlHe0fWBtltQlhVF\nkRtEpATGaPq+p6knENf0nSeEAa0si+UVWsOd+cuc3LmPdo6qKinrCYmA1gpdnOC7NUf3XiMNPdZN\nKJWimJ2hUyJeXuDu3kMNA2Yz8NZ3/3cmVYkPIdsUuFzQE0LClJa279HakGLEKoOyGmscp+WEoFZE\nFE0z5fLynChZg0upiLYgmQFFjR8gDktC8MxEM5kpMEtiTAxeYXwFaLReovUSCZGh6wk24fQCGRSS\nCqybEOJATAZUrkdQFiRGkiSulp6Ylhgb0CoSvEXC51YHtx8/Js2SDubN/S2AX9u+CfBm3Pd7MBcj\nY0SuRppFZSBX+fZeq7gDcq1kdNEVCCp37RkBXEYwj0ZjdY7Gk475QiF5ewd/yux031FlX/md2FGy\nE4zdgfeNYh4Oj73gnERMOgDttD+2BW6TDsD94DE2hYPHByTpkV4ZaZYYSNFnH6CdAdmeZhE9RuaY\nkWbK3YzEKNDbvx0j0N8Qsmyl5VGhxs8Umz//ZFROOGtQWvOTpns+v05DOtG1+RY/SaJdrUEbjHE4\ne0Tv12iTMNpRqBLjLMpY+hAZNhVKR8xEZV45wmLd0kwrrIaUOvquRtUOnRzdEHGpQxcDyiSSBJwr\nAU1KBZaawvRYE9i0ayaD4ExJXRZoOUbkEmMGjCNHqxicPkaLpymPAMOt49dZCNSDwfV3+Ojd99Gi\nqCcl08mEzkeOju+TkpBSJIRAWdbEGHBOY4yhcBP6fsNytaAuK4qywlqFLgxKm1z9qjQigi1cvuVN\nDuMC4kpMXGFu3SKuzvG+o2jOMEe3iI/fJJkCv3zEvXsv8fjdH1AWuTBHK41SCu97tM53e8ZYjFI4\nq3FmYPBLniRBUsTHNfPpHfxmwcMnjzBugwk2GxvZhFaOoTMkCSgsm81AWVXABmuPaNcBJTXVRFEU\niba7xChHUoFST0jS5rsTX2GbAmscXegpXM9mUEgsUAgpRvwQaU1HVW/QydGvzYHW93McPw6Y36BP\ntjP+kP1r5/yYtDTjHNUReY7dd1TcmUHtKBa2Pic7dhdIKJujRTE5OSo6g3tKI8CbTD0Y0RhzAL4q\ng6dWESM5Mgd1rRRpV8zDCLhso+1R6X5Y/DPqwndAfgjQHzNtiuib25J9VbZRuk4jzRItKWWufOuK\nGJMZqZR91WvSI3BvtTUq0yskEAvKJKLKnZgSEMfirLxCTIqUFDFuAV1BUDkyNwo1AvroIvYTfe0+\nNzA/qe/QW0FFzzIMPL14mMu2UwCpKVwkJg8uUusCEZcbJ6cNEl0GgCQo7TDaoJVFa50bEHeKoU30\nved4UnI0P6Ft11jjiNIRw4ASSz90xBi5ulpQTWpgCUlzuVhx5/Q1jmZC6guSNWA8TV2BCsRY4Iop\nxERpTmmKKesnz5i4E4YQuHN2zDqs8Sk7LS4ur7B1RdclJpMp6/WKlFIuanIFSXIiVrmaSV1igLKp\nESXU8zN8gk3XobSCYUAphdIua99Ng1WSPSeqmuDPwU3oPnwHfb/GDgvS2RfQ734TPzvl6tt/iDaK\noR+wVYmPQuMcxihiynI/bR1K54TNMAQqVzIvSoarK5RRODvheGK5uFpyvlpTRsHaAh8HlBqwzmCd\nJQZBc0LsDTF05I5Amk3rEZ0dKbWOKFNhlaEuJ6w3nhA3VHVJ00xQSpBYEMIGUHStUGhLgnx7bxLa\nJMQ7JFZI/P9B27hPSLNsE5vpxowHgB1fdGy77fOKEcRLXnVeMWlMrqUc8ekx2abU3v97LBwFwYyg\nLjbTCWI0yRiSCXsFh4lECViTlV6RAyDfTsnHNdvIfF+hmcF5y2nvQd2yTVzGPc+9A/wbkfYWpGO6\nfuzGvomjV8u4vXteSkhS2dMnGVzypGQyxbJTqYyc+ZZqQu0j8vHilpOYCmWEqBQRRRSNGYFcJ0VM\nGhVVppKtItrcNzRz5Wq861GjouWnGMwdNWU5YbF+TGEt51ePcbVi6s6o3THazCjqyLJ7n6oeCK1D\nlMUaIUkEPUdJQI+ewPWkRiWfO9fUBe1K6HtPrANVowi+QNGRUiSmrGuWELi4fMakfJX1pqUqCnRZ\ns95YjKm4NTvl6UePEAxKQ1lZLA4Z81/OzrF2TlEdsV5fMPQDLkFaKZIkoheUgRADsRuo6gqlFMMI\nyHkoJk0NKlEWNdYayspSlg2z2ZzJ/Ih+iLi+Y9LUiAht15IAFT3JKCDiVI4C+mcbVCNMmgY7dEQD\navEu3aaFOLBKwr1bcz581KJjxDhN8D1JCqq6xDlL6QrabkOIiaIoeba+4qpbYYGrrsUZA0Q02frA\noBm6kqhz0toVEZUSjTsl9I7LzjObliQJFMYy+IgfFK0WyiJSV4qoPSkFvG8JKWCrKU3d0LV9vmgr\nxaSsOb/q8KJQWnC2oigGrJrRTF/NjaOHz7xo6EePTxKZHypU4vWoOx6AdwwQ/Q/Z9+zSscqM+mWT\ncrJTpREk2K0KYPQQ33YJyrq4XKmoHEjQiM1RuFiVgd3mqDUmnXsCyJb9HkF9C+Z6n8jc68O3ssKb\nVZp+X5n5QhVKPudGgN+Csd5VY15ftwCu4xbQR3OtGMdj+ZwkTZRAEr+XGY4+73LgXbOLzMdbGtFq\n51CZN0DFRFS5e1MUTRCFTno/oyZEBdsG0FHnvERQKENOSGuN2t4W78tJx/VG4dQPGZ8bmIcUqW1B\nWc3xq3Mm9TEX6/eYHdcUdk5MEU3AaAX6Kab0bNaOmDza5i9R7xOT0jCtJgzDhlJblOTnKAVtf0WS\no5xYdRqtNFZmlEXEiMUERfIbnB0QFVC2wJk5lTuhcDOaokH09+n9JUWxpqmPiV2Oovu+pbQzrJ0z\ntB06DSgfSUNBUBuMNsSwYRg8rp6gUmK5XFLXuROO1tkf2RhD23bMZlPKssIYQwyRVGoWqzUJRVmU\nOOu4urqiLAsYNK4oCT4RVucE4/AKhr4DowhPn2Jv3Uf7Ner0FnLhKZsJ5997k1u37/LsySPKskQA\nqzVIQity+bJ2ePFUZYUuHMurBSKKk6Mz3nz4Pn3bo3hG2y7RZcfpyfYrZFG6AX2JEo1TE5KvCH2J\n9wNR1hRFpmOKwmKtoSpA8KzaD7DWsV4KXd9RFYqqMqD6fCEMA9pZnDEUG89mIzhTIETCMDCb3EKp\ngqPpMX1/swTicxifgmY55MgPAT3c3A7Pb6PJvt1mu8ooQcwJOqUyaOyTnWMBkDJj9aUeC4I0RJUl\neFETRwVHsoYogZg0dgTx5yLyFEc72r1LehbHbOmUgyrNHWD7nV58rwf3B+cP9OQp7ErpdwA97t/0\nJTdpdDhM189tt1PSOHKy0+HzRUm264FYctTUi9lX1ArsaxlEQRTCDsgNOmlCzKuKetSN6iwFsQox\nghjQJtM1aQvkW/L8JxifY0PnRKGFEARrGpwr8OEWQwj4sKSpjgg+IjERdI+za4wrkeQItAzeoZUj\nRENZZE151yWSeHofEQNRWtpwSaOnKJ2o6xlqKDGmoF0HNhIpcchwCWWNHyz3H7xCU9Ws2iuMarDl\njHb1BFeAKgZINcvVBqMC1Atcv6DQFl2AH3qaVIAIxhoIPaEHMQW1LRhS4uLiAoDJZA/qq9Wasmww\nxmCdI3jQKLwPtG1HXdWsViuIGXQlwUJfUZc1m8tzju++QuzXOCMs28AUz+L8IWeFw617fNcyCBxN\nS7rBU9XF2FDDo3T+ChhrsMailWCdBa1wYqiaGjusWX/4CCWJoe358PIH2UuFDabwGDOn0AWD9CSp\n8kU1ThhaQ9d1xOhpQ2I2N5TO4oqsoLEmEmKi9+dsBkW7sjmirxpEbViunrBeObre0xwVJB2YTTRK\nWYaNRStNig5NTVUcEVAEfjoi88MioXQQnR/SKuEAxEN4wbbP20pncFA+e95ovff93urJ0eyaN2Rb\n2m2VpUaPYK5Fg1OZNx4bMqRkSCmMkec+Eo/qOphvrWZzAjTt/cQP+HIrcQTqDOJuWwC0BXC223nf\nyb5qM9Mke28Uk/bgrQ9av+2PxRccy6uMFySHz0lO/K74aVevOm6nrSzzkDPfgroCYsKIyUAeDSGZ\n0VnRoKLJhl5RwCuwabzTEbQZE6BmTGJo89ML5u3wEXV1hNEO5XJ4cjY543LzmN73DH6DLRNVPSXF\nnqg8ZVmixDMMATEX6HSK1Zl60Bj6rgdlGPrcRKFqhN5v0GLGK6FQVQ02aoibrKQJiqQ6sjArMWlq\nJtWMkAKIUMkt5qXH92+xThsMDcvlgLYdqpzgLz9kVk2pyorSRGbTO0gscmSihWkzIdlMRSilcuQd\nI9YWDMOAc5b5fEZZOqoq0zBlURBjpC4rjo6P0dpQuCJHWgJKKQrjUNEznx9nZ7fUcvX0CcaVbNo1\ny6dvo2+/zHF3gbn/Ck56LoPQLxdYZ1BKMCYnDEMUtPcgBqU0Nil0M0EJOO+plUFbSx+EXhlK3bDp\nLmgKwVhHXVqsrghDh1INwXtsKNEpN4vwoUNrg4RE1ZQEnSgLDQmULbi8yJ+BH6YUpQYVCH1LOyxY\nLrMe/eoqcXJSEfSa2VSz6AuSRKycoMSgJeSqPf3TAea7QqH44uTndvoDEPcjreJHII8BvN8WEcpz\nU/4/6t7lV7Y0PfP6fbd1jdu+nEuezMqsqqyyG7uNobtFSy2LNkKipRYtZiAmDPgDQEIgaCSEGDBh\nwpAxTBATpB4waLCQLVqy225s2qa66KpyZVZmnjzXvXdc1+27MfjWioh9MrMq7XI5O5f0aa1YEXHO\n2XFiP+tZz/u8zyumRrCT2sIRxBOgK05j3mRIUkDwkmBGSSXIU1RudMkFLlSSFkTSlrVMcdN+LDhO\nAswks0xJ6andfgTyI2hbsun4jfPnzyeZZZwu9CaIj5nk54+n8W6f97oYxNFHHkZtfOpyTd76SSdP\nK8lUI3hPpvzpwhhiKvhGhQwaGRTSJ1IiQhwHQ2ui8Wl6kY4EnbBbKnGSWYSE0QH0592+MjDf9y+p\nu8cYfcXd7hllXpHJnELl7NsDnW2Z6RIlCmK4QMQBZSwmCrKgCRFMEGihGIJCUOClpesCzg34IUMW\nJcFJeteASVfhwii0uCCqnmgalNTsekeue8oqZ9/ekZs5Shvu1k/RsUCHjK2bE7wn+AP71lIUgcGv\nyRH0nWGeF8yKArcdUGGgH/pRAlPkmcYLyXK+IBKSxBEDWWawdqAoSpbLJcNgKYqcLMs57PcURUFd\n10ghyYwm14Y8zyiKMkkkBDo3oKUiOEewHftnP+TBW99hdfEEuZzj9mviJz+kHzxaOmYPr7h5+Rpj\ndHI5QOoCtQMmL5GmSuxsGOi7Hm8982rGrz76Lr0zbPbf55XbUGaXaNGSSUcMnhCG5GTxW4xwWH8g\nBIP3KRdnGrTbDS1Sa0QmMKaisxkxFrhBIDDMSkVmwHnPbn9LP1QIkZPrGcJfUBclbXdDPRNsNj2C\nOX4Q9GJLEH0a9PtVb39Gn/m94qf/rJRizxi5PWPk0/kE3gIlQcmIGoE80fKQQFwCRISQSDEBeUCS\ninYKmZh5SLklCcRHm150I79OAH7Sx8d15hyRIzuX+ATmU7Fz3J+Y+AnEsziMYG7JwriPFhOH42t0\nSHUY6eNxPw2XSBODAtLF42PpwheeC0FipB199Pbopw9SJekjJnfK5CU/X4zNQnHKVgkRGTUy6JGR\n6zEnfcy9MRCtSNHaOnn/pToR8aSXC44nf47tKwPzvpe0eUeeebK84DDc4WNBns8phx58JPMaEQ1a\nCaz1WNcitWVWX9C2knZoMW6FUhlalewPB7Ry2D7iBknoDVV5ya57TQwDfejJVYWLgKjw3AKRKHKy\nGHB2z6fPPqDMHtC5Ha/ufkRVXjGEbRolJypCTIA7XygIHVoFSiHJhGZwAxpFbhTO51ilcWLABU9W\nFkQfqOYVznkgUpYl+73n8vKK2WzGfn9gNptRljUxBsq8oKoq8izncNhRVwVZloYmSyXxQ4vAMvQe\nt36JjAPGSD69ecU7D+e0rz9G9AP16gJiR1le0W4/4vFbb7Pd3KAzTTv0aAG5LpAChn4HMcdkOXlV\nEVxGs3tN4zpKCY9WlxyGAbSgymcoHbndvSBTA1FlxKixoU1SWGuRWhJkQOmBpvcEmZiL1AO6VGgp\nWObvcNPcUBioTEmRB5qmx3nJ4D1S9VzXb9G3lrm+xNnnKA1ZoXFWcNhbAo4oPeJfBGui+3KviWfs\n/Nxy+HkSixtZuHWn5eyJmWsRCaPnOYqAStOMQQgkpKaUNIkZgRgn9Eh0DEcwVzF5oX0YmXlUx8Ke\nF5P67Y6M3EuPlw6v1OjjDkcgP3V5TjLLKcXQYMc1kGHJpn2YgD2BeHa2V8EnVh5GFu7jaVCEG4Ha\nnh27zzm26TjEyakzdnce7YenIRzH/HY5dmrKyYWSNG+hxtpEDMho0r/PJzYuXH6BKxgAACAASURB\nVDwNvbCCaGRi5lYSdExLicTMJ5nl68zMZXbgMLymdAuUMvShRQSPtxkiFlSZhtDj9h5RSAgGGwXS\nQzU3GLlECUnbvWI1X1GVNbtdh7O3eK+QCJS4IMacIr/gbv8xOsBW3JHrjPbgGYaBLEu+6hgNMkqM\nBGsbrGvZtB+y6T9ASEFdPMLIVETN8gyjNVpHRN+jpSULRRqGESzdcEAbw2J5QWsjURXkuaYfHENv\nubq+Yrfb0vc9lxdX43DqjKqC+XxBluVstxvmizlZlrFYLKjqEhUidhzMLL2gzDLwA83+wP7VR7im\nZbZYUNaaw/7A0O9Rpma72zFfzNndvEQIQ9M2FGVNxOMHO0otA3KA+ewKmWu0KdJts4BFXiGM4cO7\n56wPW7qwp9JLVst3yLXh0YN/mRfPXrLpn1Llj9k0HVIoHILQC/oe8mvw0dP0AqVbtFOEQyDLluBW\nyDCA7Ilj1MLQRQQGIQJKKZp2x6p8iO0GFNcgbskyRdtD04APHXVtUObr0zTEefv+uQXx84D8zTUC\n++BSc2eQoOU4kUcCIiCESHUFAlIkjSAVOgUyirEDU6AQ6JjkNRHEsXHGMM0IdScwFwo3MXLvk9fc\ne5Q+83WP3ZsnmeXM0TIVNkdmfloDGQN5HEYQPwF5HgdUTGA+yRfTgAg5AvW9ZRMbPx1HpD09n4q6\npzb9qE/6eJgA/B4zB3TylaPicY9OmeWT7IOLoz4OuORYSUA+/n064HXSy4Vi9JiL0cnyNQZzIXqc\nO9D2a5RWCKnZdy1aaJQvyXSN9Aa33+IGTb2cM/Q9ShWEIFnOLnh08Zhts2XXPCMKS1XWvLrZIP2M\nuc7p9hvyQmMyjR1ypOzZtRtcITg0PS6AMR1ZPqPMZyjvyLJIcA2KjIAj+ENy1OgFWuRI7fE0mFii\nJQyhYVAde7tBO89y9oCKJeVyTntoCPsDRTXHC8Xg4yinpPmkjx8/Js+q1NrvJXVdo7VGa01VlQgp\nCSEF9eRZQa4VdnBs16/x9sBu6KHbI/ICEVqMERACi7Ki2azRViOvlrib19zd3lDnBfttS50ptNYg\nJCY3KZaTdDvuhUebOn25ggUCeV5wt224KJesypJP947gHb11vPXgu7z96Lu883DDR8+/z4vbHzKY\nh+zaV+RFjhskzmpc5ykqQ5ZVqCAI7YGDPGBdDcGSaU2eR5wX+AaczSAqtBIMQ8s+vkZGQwg9QkeU\nFChjyfKCtvekm7kt1xfv/qK/ugr4J6Ro57/3ua/488gsk2b+hqPF+c8C+vDGsRqDspKmO/YsTA1C\nYgTyMyusSKk4aUWBjmIsTibj+QTiZ32ZaJGKnl46tEqDG45DG9Sp23KcMHovf+Wom8dzdj7JLcMR\nsNO+v/84pL0OLg2NTp05Z9N+7gM5lhOI23j/2CbGnMKypq7O01TSY8fr5FwRI5CrtKImIaYBxiHQ\nMF5gphF0bmTjThxZeTAKpVPcglLgxwJoIuSTZj4i/BdaEn/2HedXCOaCIezYdq/I8yK1HktY71+x\nMt/g6vIxzW7Lq91rajVDhYKHF3OaYYvtPMw0dV2RmyUu7IlhgzUOozSFKcnxHG6e09YFyhRcL56w\nbj5CqsCueU2UObiCEBxaF0ipgYgPDYEWrWveffAb/Onz3wIv6Ps9SheYvMG7BsESESWdG1AcKOWS\nWlb0rcMYS9ztkVIwm9U4JFIILi8viDFgreXRw8fkWbIizmYzIFLXs5SZARRFiZSpM9RaS/AeQ47S\nitxkbPc3yZa4v8OrjNA26LzCS89+vYbomK0WuCGF8Sug61vqWZ00bjTtbs9gB6QQx47YGGBoW1Se\nqvLTxUQpw8XyMrV0+wHvW17dvOCX3vtXefToEd969z3a4QWvt548n+GCBW/JpAEfECJZTWtZUeYz\nrK1Zu9c4IhmSi9WCKPcMg6UPoMQCFSVGQ9cf8AZa9wrpKwQOYVLAWRAHtMkYOocSPbvmJ7/or+5/\nTModmn/hK/4sBdA3GofOi5+fx8wHm9b5sYYx5Iljl2ci6DExzZjEFRgL6AhEFMjACORgosCMISNh\nlFb0BOZCouUkrSi0crhpH9S91vlJalFjc/ux+HkE8rPCJvYMuHvykMA8jwN5GPfjYxVcGpU5Tvg5\n16UTiEeE5bgXNn7uMTbJLDGq4xi9o6SiRLLbw/hBxhOY68TEhYmQxTRD1HwBmLsTmIdBEYxPS2uC\njsixACqUQB495qOj5esI5gFN73s8r7ChRhuDNAFhBrJMcHnxgKpacNs/TxOD/JJcFwilaYcDHz/9\nkFyvyMwc70CoAal31EVFZXJEu0MKz+ubZ8wX3+Vy9ggtAxv7FKn3SUYQ0A+S3bZFzysyU4KwbHYf\n8uTRX2M5/2Ve3P5/bNqPIXbMLkiWyd0AQuCDI2rBbbdDxudI9YCVzIgCuq6jaTaUZYUqDYvVJV7o\nFOsbInlWYa3j4mKJ1or9YYvRGc55pJEYk5FlBhGha1uKoqBtW2IExcDu1TP84TWuP/DwyTdp+hVB\neHzfk+sKrQzW9aByDrsdhRFoY+icpTTZMdrUO0dnLVUtKco5JktJjTrPsG2Hi6lwmemanTvgjaHp\nB7r2lsVc88nzP+bb3/wu7z1+wnfe/5f40Ud/jI+vMVrhXUQrjZ5Lglc09gaTV8hOUag52jVEn1HM\nS7LCEWVBvwHbHChnc6q8QoocLSva8DEChSNd2GQQKCXp7MCYpo3UGq27X+TX9h3g7wL/LfCffOGr\n/gwyy7Fh6Gzv/X2p5TMSy8jIBwe9g5AsTqPtUKQCp4hIIcbOTsZ2TxKIM/YWxXSRVxOgByCK0ban\n8MKdOVbcOLRBpZA65XHeo73Hjc08KoRjEVRGn2Z0nneAnuWKfx6g56PMkseeIvYjkPcUoUfF5FsX\nIWWBH8e2eY4adRq0MbJzO+2BYTwe96eJS2fWQ5na7mM418w5Fj2P8oqJxAwwAZGlhsV0dwCMjDxY\nSbSSOAG59kle0QE5yiwTmAslTnr519WaGL1G0OFtS2BA6jkiKrR2KN0lJ8dsjnppiH7NEBYcdoJi\nWaCxDD7wzz78PR5cvI0ROW1/h9KRR48eEzvJYTgQZcT2TQqLA+b1ima7TsUMUhEyWEPnIjYPEEFm\ngV33nHezv06RV7y1+hvsmlu6rklRlV4h4gwhKhB7FvMKUcwphiWVWpLJkhggyzKuHn6X9XqLyTL6\nvgcN+/2Bi8tLlBZstju8v0BrxWKxZLNZUxQl1gb6vmc2q2kPB7TWDEOPj4Ki0Gy2G+YXK7bdHXkx\nZ39omF9c0ux3uG7H9uYZeWmoqwXBB5bzir5r8MFxMb9MXbAotDJIqShLSVEkXT8SEGQgFCYvMVme\ndEU7cBEky/ljrmYVr7e3BAb+9OPv8ejxNykKxTy7YLl6wIvt96lUCWWNb8BaS6ZyhKnZ7F4z0xes\niiXX6m1uRotons9oulus64hOYvcNcVagi5pH9SWNL9h1L3DRkueavNA0+5bgJdb1SB3QJqLMz5lW\n9NO3/x74z4DFT33VnyM1Mbo3JJbP8ZbfA3J72iewPskrSoAXoI4jEkZmPpI7wTjoJpJklsBxgbgH\n4GY6VhonPVr6xMi1PrbJqzMny5Q9fl9iOcksZmwamhj6qdA5svMRyIvYJTAPA0Xs0MFzTLHynAb7\nTGsE8SSzpD3DtJ/APJ0LcfKRn4WJjUOdJ0Sc7nKi4KSPGxIbNyDygMiTSws/BpTZUVrJJHGQhCyN\noPMmoExA6YjSEakiUgnkFEk86eZfV828lA9Qekfv7/BOsB8ceZHGoK2bl7TuwDK/ZjZfsjvccrt7\nStctuTYPUvKYFzTDS/qDoUGg45y33v4WuIy7l7dsjUaUgkUueb1+islmKO3ItYaY0dmkMXvvsFay\nb9ZcXF2lPBI/8HL9Kd998hClch5f/hV+8vIfM7QdnYiIYIgxgZ+pAnmcMdwqCmVo+w7tA/XyET/+\n4Ed84+1vY0dfatvtMcZwffmYu81L6rqmaRryPMfonP1uj9KSQzNQ1zWvX78i+sDq4iKxc6W42T6j\nNoa7Q0MgUOgC6x3b3Rqja0LcU9YzXN8SvCPaSOcHqrrmdrtmSSCSYvZcDAyDh9DirMcOfbr7yPP0\nS5PnxDjgDg3BO4xM8o8uFHETGGxHZgr+4A9/hyePv8Oj+opfeuvX+NHHf8h8sSRGwdbdpQRGHTGy\nogsHOhwIwapaoOOMWM4oJNhg6Zs7XKvoVcNtcFxkMwpdczn7FbSZ8+ruewiZgraGAYiBEAVKO6yz\n5Cb/RX1l/23SAJY/An7zp73wv/6j0/FvvgW/+dZnLzCjPM00oit8Zp8YdUg1tnv7KYkv+NP+6IyR\np/Fwkz86SebxZJHmFMiuGFk6Yz0PmYYkiwTcTpwAXEuFVwrtNNo5tFZ4p9Baob3DeIX3bsw8UUh8\nYuDBYsII4mEE8TDaEMfns+O5EdjHc3lIurnyfiwscnSKHI+nx/7s/JtgP61Aauo7ykI+hYaRQsKk\nUCksbLJeqtSlrZRHKo/UHmXS3bM0HiUSUEvjj8xb6IAYQVvo5HoRMl1skWfduHJi5ccnPvtl6n8b\nht/+aV+34/YVZrNcI6WmaQdsGAhe4KwnywV9v+F2/4q+H8hzzd2u49B2gGC7q1jOlvTdn5JlFxAN\nMXqePHqH99/+FbyXfPLp/0Vre8y8RviWKAPb9lX64KVHhRRMpbKcwe8o1AJjAsFvcDKjzC6JYmDb\n7zBGU5oF17Nf5Xb9ESLmSCHQWYGMl5RZGqvmZMQ5i9E5RTHn9cvnICI//uAHPH7rXVRZ03UDv/xL\n38ZkCoFgPp8zDAN1PUMI2O62XF1fHtv89/s983pG33XIGPAhAW7b7lIWvMrT4IzDAN5hrSevF/jD\nmuXyAhcHijLj9vWWqwdXzF1g6C3GpKKn9+nbbYwmxEieF2NXZUgDIQ4blNKYTLFdr+kOlnlR8fDq\nHV69XmOHjugFIfN8/0e/z/Kv/h0eP36PX//uv8Wr1x/y5O13uMme8cmz79F2d9RljUCzO+x5VF+T\nG4PUBuoKP/QpvtYZ+rZhcXlFYzs+evpjTL5iNX9Ivag5bF8yhB37w4Gub1EiR+kMpQAhCf4X9pX+\nW6Qh5n8XKEjs/H8C/oM3X/hf/a37DOvziHqQacWxeMk4B3LqS5FRjDEr8UgMjwCuSGxwfH82LiNS\nbc4kSXeSeafcrWlyXLrF92MBzo0AP6UqqrMCok4hZtKl9nilPMp5tHMYm4A9KEWwY46LEgQn0oVE\ngZT+CMZZGDBh9JOH1J4/rVM8bTg2Bk0rXcE4gbY9W9O582HXcMaox/PnX4mpEz8TxxVMsmImx4kc\nZ3+OS2qc1FhhsNJghWFITniGmNGLtB9iNhouNS4aXBwTaKYxdHG8XxmzX2KUo6TD/Sv6m5v5zbSm\n7fDffM6L0vbV+bh88lLHkNwqfkjBQM3WE1Xgg6f/D29ff4vGbxicZQge0a25qr+B7Qyz4hFRbokU\nzGclVbliMbuiax11OeNgZuA6gjFIEWn6LSEMlApMZhG6xmQZ1+WM9WGDksmzXFUVUgXaww1ddSDP\nM9ZbwdX8XYzI6PufMK80dtii6vcp8wU2fozSaV6pioq+6zjs17z97rfZbnZ4b7l98ZyrB+8c42ar\nqqZtW7JsbBI6HJBSIYSgKAq895gsgW70nv1uw3yWE53HS7DtAedd0kZjl6INhgYfGowsE7PzghgC\nVxdXHPYtZVUjpaRpDgjvid6jlabpB+rS4L3HDz2D2lFUS2RRgUmdmsvVA17sP6bfbMmKJavlit1d\nk9IVfeSf/vH/yVuX7/Pk4Tf41tvfoipnCOl5+8mctr/hbutobYsUBUYPvGpvyWSZmEufdFcfHEor\nLq8ec7X8K1S24YOX3+eTpx9yXV2idaA0V+OUmA5iYkc+pHtrZWJKuPzFbP/luAD+NvCf8jlADuDL\nn/1v8IqUPS5HMJ+anc5Y9EnbThJIUKRsD8+opSRANxIyTsuMS/NTAP0sDkRMfxmMgV3JRy1tRMqA\nUgnItfLps1cKryTGySQtjCCOFTDZ7mR67wTmR1D3NoF6sOhg7wH6MUgrhJNnewLqc9b9BiOPR8Y9\nrjdvPaZzUycngphDyMS4Rl+9UXg9LY1TaVk5LjGCuUjO+IE8AfnklI/TGv06UeOiGv36p6z0BOij\nNn9cfJka50/dvjIwPxx6Vlc1F+qCjz+5QwlD1+/xUSLo2LVrNt0zel4z2D3EnIgjqB7vHZleMoSB\n1eIdEJGmbbi7W7Ned4BnNa8YhgwvAzpT3KzT7b4TAestgojuDfk8p6oyolf4QVJSkGUlm+45frjD\nB5DCYtSMWfmETVijdIazM3wIxKGklG/R5zf4YGltw0JVvPX4G2w2O7TIefHsKfOrR1RVRQiRfujY\nbjasVqvxXBg7QXOapqEsS5yz5EXB5uaOx48eYrTC9Qek8Bz2W4wQOG/RSmGqFX3fpIamoKmuZkQl\nqIqSoekI3lJVFTEEAoKLyytePnvBenugKjOyMRcmryp0USOEBikRMRIGm+4IrE/xuEGQq5wnjx5x\nK7a4xtJIRxYVv/N7/yv/5m/8+1zOL3lw9YCb169wYqCaX3Donyf5svcgA02wfGrXXLgZijRe7jA0\nqCLjav5NVvMLimHGJ7cfkxm42X+A0oDRqFgz7J9TlDUSMf42W3y06C/TsPMXs33hr54vfnYhKxlH\n4kluEZOHIqYiZYzIEXwnWUX7OA5FGHXjEYj1OTvns0CuwwnI5bQmQJ9ci9PnpkgukXvMPKCcR9kk\nO2jn8PbUeJOaYZJYP80lFSplw2QjK8/CgPFnkotPQyb0WUTtFGUrj52e8aiR3wP0s+Lxffnk7AOe\nAF1NNYXTuSh4g5UL/MjMvU6zPhMz10dm7iZWPgE69wHdxlMrlEOPQJ7WcXpRPDHzNwGdrzOYN7st\n33j7ffK84bA6sF4HYtTkOSgjyDKdXAsmYrSiLCRlMeP55sesygGtM+qqRkZFVS/58NN/ygcf/4B5\n8RAvDgRjx/Q+jSCyqGta5Qn0ON8RvaOPFbIzZKZkZ2/R4ZJDfyArNUJEdodPCE4S+x5RVUQrqKtv\nUFYzRIi8fP0UF3rKeomSOb08UOUrVCzonWU+m/PRT35ECBYjJM6nARDe97y+ecbFxYqyrPA+jY+b\n/jOHYSCGQK4MOM9uv6E2hueffsTFrEDFSN/u0TIn+HSfmecFwij80CGCJ8/KNACjLtgfHE3fEDzM\n53P2mx15WVA2OU3XMMtzFqtLqsWDcVi2QWiDPezTnUTb0gKHIXA4rDmEHVU9Qz6C1y874n7LQIbf\n7vhH/+Qf8q//jb9HlgtMoXnx4in1fIaNbzO8+CFR9ojCEnykHwRd1GQ+4pqOQ7OlWNZU8xlFPef1\n5gMymTHLVzTtAHJHXc+J3kOoka5iUVfsw45+sLgoMOovJc/8d8b1uZsvfjYzD2Jk5WOOeNIG4mgb\njMggkOEE6HEEclQcw1iSc0WImOSVCcg/R2qZWPkxHdefybVndkYA1OjNnpi5Ckh7xs6tJyifcs6d\nJE6DFizjhSA5SU5gbsn8kFawR0BPGrtLk4HGeFp1DuQjmItzIA+nFc+OPwPmk8wiT4+PLN2Pz2eC\nmI17MzFzeWLmSp3klpGZHwGd7IydH/tXE6BHfdy7qMfS79kEo3OZZZRajqldX1cwJwT6bqBeXrNc\nrjkcGoKV1EVNVgZc32IWmkwu2Q0OJTUhOPIyI6gNOp9h7YCQFmcHtoctt5ufUBYf8ejyXaIvaPo7\niBqBR0nBvMqIoiJEQT8cyMwB6StCHNC+5NDuObSOLm7IC8V69wlSVBR6xu3mY/xQUcwqtMjIdEZZ\nDPzk0w+4Wr7FvCp5OLsGm9HuNxx2B5b1iovlAqmylOp42PP0wx8jMkNmMkJMGvZms+by8oL5YkGM\nqeOxHyxd35LnOYfDHplrZnnF5u4V0vVUuQSpiVEiREArkLKgqJdE32GtRSgJRvHg8RNefvoxDy+v\nWW+3zKua/WGHEILlYkGuFFIIYhgQZEQZkWVFpjNC3+F9oN+vmeU5GoHxCQFCHlD5QDxIXGfxDn7w\nw+8xr694/53vMNBhYsA2kSq/YLV8xC7e0Q07Wh/QJpBphWhbRPSUucLHAaU8xAGpoGm22IuMUifn\nsgsNzgVkXOHbiNMiTcrxOd1BEvSX8QX+Yjdf/uwLih/BPBBPHvGRnok4AnoEFUSa6H7ORFU8piHK\nFI99H9AZmTln7PwcyOUJ0EepPG3x3CU3WunsSStXVqJHEA82DWlIs0XTXybsyMjHC4AUEePHoqZP\nQJ6AfQJ0mwDd+2Pm+ImZh2NTED7ek1HieaX47PieVDH9YFNNIpJuh/TEzCEYkdbE0CdmrhROq5PM\nogxOTqw8w54BeR9P8soR1Cd2zsTM9ZnM8llWHoM4XZx+ju2rY+aHT3j16oKsWmLMisVC04selSmE\nSF7h3vXkOieEktubLZeXFbkWVIXCe4sNB15tnrKoIiJmDK2n0IqHF9/gvbf+Jr/1u/+A7f4VXd8w\nrzzffOd9irLEx5rGHsgI+OHAfusZYknnWiIdftewpKaqJE13h0XQtT273YbaXeH6htViySpfcSt2\nvHj5guyddwlURG3Z92u0rpBaUZYrpJA8e/GU1eoxq6vHdENPPZsRfGB/2KW7kOjQWqKUYbtdH9l6\nUVc0r3bs+o5FmWJxZ1qw3x+4vLpKVjbrCMqi8wrnPTJCWRR0+z3EiB/g8dvvs1vfsFgu2W032O7A\nfFGxXq9ZXV8jshykBq1RKiO6QCgK1MWKbL0mCwPPPn3KoW+JTtP1e1QuyauM8KqltZGhSemTf/Qn\nv0ug53q1oqhmxBjpO9BujrQdtg807Y68DFhnUVJgo0dlis42tMMdVXlNVcx5dH1F12+QRYnSirZv\nkTrHRE/TDygTMcbg+wO2ldjwc9Kbv4DtSzFz4ji0fGTmo3VlKvxNUog6B3EXj3ZkKQVSRtQosxwb\nE6f9GyB+XOKMmfuTzHIE9LEAKlWSWqRKmSZSeZSSBCvR2iW5x4kkzyhSQXJ678joxQTmI5Abb8nc\ndDwy8tGrrqaBE/6zQH5k53AC6zf29yJ5piLnZN9543VRCqI5rQTk4oyZS7zS9wugZ4XQ4Z7McgLw\nc0Y+FUE/C+RqBHL5Wb3868rMV4sl0W+w3Yq6eAyzDdJ07Owd9fw9Xtx9QNt1qEyitMYGz7Y9sCpy\nhq5GZpHDoWEdN2gxpy4uIJb0Xc/l4jt4a3n/0V/le8MfYHsH0WCHwGpV0Q9bqiIipUMXEPycw11D\nDAq0pW0Ds+ISZzuyLNJ3A9Z7ml3D0Djuqg7CI967+C4LmbHub9g3N+iH76NDhRUHijwDZXj+4iMW\n84dcrJ7QdDv86+fk5QyZmTTENXqEMHRdhzEmOU0ixBipqpJmd0BEhzHw+uaG6B3b/Ya8qHBD6tCs\n6lT2SvG5BucCu+2O1eqSED32sKfbOLJqRrtbs1xd8Kq3fPr8ObOi4G5zx1WWo4ocoTMQMt34r9fE\noUTgmBcV77/zhJfblrbviJSg1sznOcuLjhcvn+JaTfRw9WjJxy9+QF39GnleUFczumZLDFn6MlsD\noUp3W9riBmhcj84EWkba/o7bzU/IRMVqmdE4UFITsYQoETGglERnkRAHkIYYcqAjK35h1sQvvX2h\nZn7WyOdHME8WxDNAH/XyECLKR6KPaD+6TtQpXM/LiJJp7sER0N8A9c8DdCnGAqi4R15PYDJWXMWo\nlScgDygXiNanmaL2FEA1FUuTA2Z8rfIom3J1jE9Dk40fpZUzMDcunVPeJeY/AroY42vFBOTu9Lkd\nhx6fuT3fPBdhnNrzxrnpdRKiIY3IOwPyoBXBJFbuz5n5OYjLk8zSk9OTp77WaLAxw8U3Qf1MN4/n\nurk4snO+7pr5fFnjVMSzx/UzZuWcduiZVddoWZKbCzaHj1CF5WIxp+tLDs2O7ToiigGpB1CS3nZs\ndq+os5qyKNhuO37y8R/z9uNfxfkDVRkJUaeurD7QbFtQAygFwqIyw9tPvsXt7gcIu2foBUZF+m6P\nESArjcl7mn1OaTRlFtkF2Oy23LhPIAqC8MTQcbt5yturbzFbrRheHWh3z3hw/YSm7ZCho55VCJEx\n9APLqyvy3IwDduWYbW6IMZJlOev1gbIo8EODlgG7O1DmOW3bQJanDk87UJQ5EUOIAeeHBHbCMFvM\n2e/3aBWZry4Y7IDqDgzW4dYbLlcrrGvp2uSLt4PDh4AaBihnCJOBGwiHNZQ1+fwS9eol71+vGDYH\nPhkCuCUX13OiV7y8W3P7iWO5uuB6eYUqLC9ePuNi9pihGchVZBNbvIhkeU4dJXnmKVSNWvRIWdG6\nHUpluKFl3X1CUSwwBSz0Q1Se44aB7faGSI/WERUcJk9zQoW05HNDVQxf1Vf6uIUv4WYJhATkMa3J\nRD45OOTIxpUbG2T0CJrqJK8cm4POgHwCcXUO5OduFnHGyjlbI5jcsyaOkomygaB8cq1YQRyLnceu\ny/G16QIQUSOoSyL6COIuWRp92ut7+yTjnLLH4zF7nCmBEN74B/NGxvj545PHM8r774mCNPhaC8Jx\njRKLuV8A9WfM/LwIasUp83EYAdydFT/vySz39HJ1rwB6zs6/1pp50IbLy0vW2zWD33M5v6YXIWWQ\naGialsFKur5nuTB880nN+k7TbCNd35CjwQlmxQPyosJkkbIq6RrBH/3JH/L0xceozFIYycUiMPSB\nu+4wXuR78ipQVUvmy2+Qm4Jf/tZf4//+/u8gMGgNWe6RcokyAUEPoqcsCx4Uirm6xIaMzWFDGzy5\nSjasZ+sPqOpLSir6/jWPr9+i63psvyfPHvDpJ0+ZzZZcPnwHO/R478mKFGnroyMEjxCMw54LvPPk\nUrPreoQfGG5ukMWMbtdRz2ZEBM4l1l6WBdZ2JINvoG0ixhRI4dlut1S5UQ6qxQAAIABJREFUSXKM\n9wyuQ0aPVjmzOkeEHmJEmzK1L8cISkK1QpgS4XsiETW/ZHvzjCo3yAYWi3dZFSvMo8jt/hW12vPo\n6j3KcsEw9HT2BX/64R9wMbtCSI8QnqIwWNehTQB6HA1VUeEHT+8FyqSh3pkC166RpUGpGikLSnNJ\nqHdYtyEqB7KnCQFcYFHMEMpTVvuv6it93L6UmyUmrT/GMN77nyQW4UMC8zEPW4zukKBEyj+T6b9n\nirxVZ0szNgBN+xHEJ/ydHHufy8oj962JbzJzlwB9siDeK3aOEbNKnzR2QbwP3KNH/c1zaloTmJ/F\n1t5j5vL+im8+huMUjs8898Zx1AnQoxYEdQbo94qf+uhosedA/kbx0x0dLOYeGz/KLGMPbHiz+Hnm\nZDnWAX6O7SsD86IsQHpaN7Bbr5lXcywD1jp8hN4HgjN0hz1u1VBncy7qGTWSRjgG6+jajln1kEIq\nMiN4+/oBcx35+ONP+PjjVyyvJFeXhmWVUWUZTSPYtAMyOoYoyfOcl68+4fHVY2DHvFripEPlO4qS\nVOjxKg09UA4bPZGSZf2A3Fyx3zxl/fIjqloDASFatvtPyKv3Ka/nrPc7hAgcWksIOy4uVkgM+80d\ni9US2w8UeUWWGYa9TBkzaGZVjXAOa3uMEbhuT6FhP3RcVDXMlkgfUTpNJRr6njzL0KpASmi7FqUc\ny8WCzeaOMtc0hw5tclRRIgfJertJHmWVUVQ1OtNEoUAbhI8EUyBEiu0LzZ4QHLWSLC8f89HTp7go\n6V0Aryjzax7MZ2TfduD68W4j4MOAkiUvbp8To6Wuc/reMfQdQcQUQewadKcJQlNkj8jLgA89wvU4\nr7jZ3jGrK1aZJsYeZSDLHnDYPUfojNBE6rxCU+Cco3f9V/WVPm5fSjOPSWAJIUlqMUTwYcwdkQnQ\nJ5ufiUgnCDr5zJPfnKNHXU5gzn1AP2fjxz0niUXGxMjFsUBIAvM3mLm0HqVOud5o7rPxiYkrhbKp\nMU8rlyJwnT+CuLq3/+w55fyxQekYWTtFyjL9UG+sKZ4Wjvr4ka1P1sSz10/BWWl828jMx1zzpJVP\nBdCkmVuZCqAnMM8YONPMY34C7mMmZALxyWd+9Jpzzs6TzMJYAJ06U3+e7WeBeUGyYOWkfoR/APx9\n4BL4X4D3gA+BfxdYj+/5+8B/SCrZ/EfA//55f3CJZ5EtOeSSTvwYjUTbFPUahGRmNAcryILBNQUy\nW6Cw1CaNXOuySDeAkiXffOdv8uzlHzKba5azJavqAb//z36f/W5gXknUsiBEiZISYwKDVwxuzs1d\nj1QD3v8zgpUsMkWnDSbTGB2QpmBwLdY5TNly2AnWzvIwOEoTiLpABUUmC5RQoDP2+5csy29weXHB\n7fopCPCxoygv2GxuKYoLrh5cIaVktVqx3mzHZiFJVdUM1lLmhqKeoXqZbtqMYbt9yeLiAU3bs1zO\ncENHJjPyvEaInr7vyYxh3/VoJSnyilevXqK1phk887LE+p7DrmFoDkRn6ds9ZV0QKXn06FcQWuN7\ni1zNiHG8ny8LVJzR3Kx5vn3BcOhY1As+Xu/xvcd7T99FLq7eo7vd0cU7XLBYBsraQ2yQYsmr29e4\nCCE42tajswKhIm4AtGGwjoiiMEtUFml2W3Z9w751aNPQNM+RSpBnj9FiSSYLilmgcy8YBkVWKGL0\ndLvs5/qF+IvYvgwzn+oi0ZOA/Jg5EsEFpJNEFxCW0VsOUo0+c5nS/FLudkxgzhlYcyatxFPjkQpn\nZHUCcsb9xMqPmnli5tGJBOTOo86KnW/q5MmLrnDOj0PJ07BoZf0RvI9e9fFYnx1PQK7syMzHQRJM\n0baMoDxqSTHxp6M7BcSJnZ9LLON77r1XjUCuTkCe1omVp6VTIVSe2PkwNQ2Jc2Y+AvlRG3+z+1O/\noZe/KbPwl6KZd8C/ATTja/8R8Buktub/A/jvgP8c+C/G9SvAvzfu3wZ+C/glPucGYpYJilInW102\no206urZHectqcYVfXtCGAyE4ZCjwtsTFiB8sxsg0FzOPzMuSYAM2RITbslo+pjbXXD2/YrP7lL4V\n3Lz0rGYlBYJOHijIiTGj6yJW7Ng2P6BUJbkoyc0lgpLoI33Ypnb+4oIQl/jVlsPO8mz9Q2zwSeNU\ninl1iRSWXu0QZsbOvSIbrokZdOsdi8U16+0NRpe4YFEqgferl8+pF/PEzHtH3yXbXSYVmZJAoGsb\njCm4WF4SvCPPMvp+QGuJD47e9mRVYrxt31AUGc4KttsddZ2idZvDAREl3kdm8xmbfqD3HlUUDIOj\nrjRDdyB/8ja0DdFG5EWNb/eoTYdvW/LFgkcx8jpumLmMKn9O3zWsu+c414MOSFIU797fQZjhA1xe\nzPFKMrMGZz2h6ym9wMdAVBatJV2/Y73v0OKKB5eeGBx97+lCaqQymcEJi47XXM+/y+XsCf2w5+NP\n/znXJfTmDq0Mfe+5O3w9CqAxCghh7F6MKVPeyRQX7CW4gLBizNAWRxBKTDP5zCcGKsWJbR/BnLMO\n0jMQP57nDWZ+tqZY2cmZElVAOTGC+Pi8jWP+SJJgvAt4OwL52OIvSBeEBODhCOTSnjUhuZH5u6TN\nSzuOejsOk+DEzA33PeVHX/kI5GdgGM9+4KjSe+NYGY56lFomUJcJ1L0cGbo895iffOaf0cvJ6Mnw\nUROiGkFdncD7+HgC8nOpZbIl8pdaAG3GfZY+Gu5IYP63x/P/I/DbJDD/d4D/mfTxfwj8CPjXgN/7\n7B8babY3SV8zsG/2fPrsObO6Qhc5QUSMypEqo+l3GLOkyGasb27xLiNqxeAzPn39AbPqIc3hgNQN\n+35NaB3vPXrIM2Xpmg1t03KRX5LnCuN22NjhrWZWXyPlgkP/HBkHJA4f75DM6A4hNfssS7wPlGXJ\nkwcZa9XQ7RSbdmCwA7406DwjEwFnW2Iuef36E1aX1/iokg7tA4vZBa9vPuXb3/41mrajdA6l0/AJ\nEGRZRt8dqIoSES1uaMi0wEvIM01rA+2hpagyhJC0bQsmTSey1lIVJbYLqYO0mKNUTte1WGtZzOc8\ne/oT5vM529ue1XJO0x7QOkNlmiAFfXeg6IaUlKqBoQUbiFIgs4K267jZ31KZgv3QUGc9+/ApN+uI\n0A5l53TrOXd3A8PQEsKGuloyFJqstJjcMQwDuVI406OMJ6iIjo62gcHmvPPWr3CxXPD09R+xG16R\nVwV5JjHK4JynLBdc1G/xcPUOP/jgT+htg9ANIlikyqjqjNp/ccz4X9b2Zdr5iWFsehFjiycJwCcg\nNyL16ZswTnZnpN5xBN0E6MgzMBf3gXoaUzkBupiOJxAf/4hpXKgY63DTSDQ5ajNTQ5BQEX+UX2QC\nZSkJyo85LRLv5JjVkoaFq1F3VzaBeALyEbSPYH7/NWKSWcYccizpH+9IKHTuOT+TU+6dE3wWyE16\nfwLzNHgiqDSUwks57tUx6veolUuNO89mESeP+RDzcXz1Wds++ljwPBU/p3yWzwH0OF3cf77v3ZcB\ncwn8IfA+8D8A3wMeAS/G51+MjwGecB+4PyEx9M9sfci4ffEMWVSs5ku2W7jbBfbNGit75osSACE1\nh6Zn137Ku0++yeL6CXebO7zL2G0tmo5nr/45TrbsW4v3T2m2mkIXXF885E5GBt/goiV6j4xplNUQ\nHHleUWVLZsWM9fYH9LEnF5rgW4RQ7Pc9pY6sLpb09o6siNSzBfN8wXY3cPBbyAMHt6EfOnrjkOI5\nTtVs+htW5ZKqWhEj3L56waMH73FoOh4+eYc8z1AyY14vcPaA7V1K09QOURRkmeBwt0YLSbO7SZNR\nGJAYqqIkN5rgEkAKmybGOOsxusLagdl8hm8sXdvgneXB9Vvs9ju0gPXrGw6HPVpL6nqGUgVFuUAE\nSxQZQpWEdo+qF9BKmC2oixllu+fZ3TPa0KGyA4ftU9qNRbCiEILbu47bO5eiPZHYvqHMM0LcEMJr\n0DP6TiBFgRM9oXfsfUmQguvlu3znm7/Ot957h2+99et88PQf8/Ll7+JDRh9y5vVjDts1ebni4fIh\nN7Mr/vTDHbraI3WL8w6LIC/+RfCZ/2yZRYxALnw4RbpaEC6AkQhDyswePYdCxRFQk0AuRqQWkzvl\nDMgnfBuzu46gLsKZJTGO7wtnbxCjzOJSQTPFyobRP34qdgYXCU4i3ShPOIFy/hi4FUY/uiAegVra\n8+Mko3zRc9PzYsojn8D8vDnoqIuPdyvTc9MHPBU9J0BPYanpYjAx83FIcxiXlxIvErB7ObFyhRMT\nMz9j52de81TcnABdnh2PQH4WsHXeAXqvnf/NOII/x/ZlwDwA/wqwBP4hSXY5337WDcLnPrfH0amS\nXDjeWr6HwaH0/0uwsL7t08DeHGaUtCy42W5oLw5cLB6gVc2zzUdoWTOLERfWRHIEBTZKtu2GmCvm\n1SOGmUfaLYiMKBQ2aiQDRBi6jkIbjJqjs0vwO7S6AAkhNiiZo6Km30p6JF27pS5TaqLJA7WJWNfT\nWWj6W3Q2UBlPNA27/TOuZpdoNadtbtFG0bQtDx9fMrQtdZGTZYLB9tRVhXSOpusJUVIVK+5u9zS7\nWy4XD1KQlsrIzIzNZo11A2VRgRAE78nyHDuknyk1gSg2mw2zqk6Z6Pstg5XkWcbt7R4ZLcbkeN+j\njQEBQafPh7wAo5H5JX6zRuoIXZta6JVAmoznr76H1hnsKz55+pSL+QVmoUAOKB0wusIojQ+e5jDQ\nDluc8LjYEJVB6ZyrskIVc6yTtH1GZMuL1z/g+vIKo9Odh3SCzMCqfA+yOaKwvN7/hO88/iYPry6Y\nV4KejBgt+8Oeg3MI8wsPZ/kQ2JJu+C3pzvPe9mWYuQgiTaiZrIejlzzZ/ZLEIoxAGoHQZ2vs/ry3\nuA/qIp5AXUDK8xdnr4mnx8dsFn96gxirp0KFNPzmWOwUSBsJKoyac5pqH5UkqHHvRMpqUeNUoxGs\nxTCx7RPrlkM47u8/F5DD2ai3gfQDfVHLvv7i5+4x8wxiPjYLCUEQiZUHIcf9yMpFAnAvNU6cWRLl\nSS/v0ygNevJx2IU67Sfw5rxR6L7MEqIgBvmV+cw3wP8G/HUSG///uXuTGNu2NL/rt7rdni66G3Hv\nffc1mVmZWVWmqrKMoYxBWMiFhBgwMANmSDCzkBCMGCGBEIgJgqEFkpEoQCohYUqWYYDBZVSm7HI1\nWeVMsnn9e7eJG91pd7c6BnufiBPx4r53M1+lH8WSltbaa69z7om4J37nO9/6vu9/ArwAHtLXeQZ4\nCjzZecwbw9pn2u/+9rskaoSzLfzKJcleQlka2rVHiYiKOYlq0T7ycHpEnh4zX33EowfvcDA64cXm\nPZJUMM5nvdJ4EsnzhNXmghAFNkCUmkxmiMTRuBbT5YyyY5abT4g0rJuKxeaKB5MTcIYim6HFCOs9\nRTZiIT9g3SyZpRmVF7SbDa6zpNJiveDxg28QY+DFiw+RoaStGpSOZCXIrCHqwNXFh8hBJuDg4Ajn\nLEeHM85Pn3H81tcJqyXYhjwxGNVXLXzx/GOmZc5GB4SKKJ3SWUeaakIo+vTuEDBpilAS7y1S9vBc\nLtbMygItE5wPlKNxLxPXebQS7E8K1hvL/PI5ZZJQb5aUZYmUQ0UiAaQJgRxVtAgbiImmW17y7PwZ\nFR7rExKl0MxYV59wPB2jScl1xkLVSC1JEkMpJwThqDpNHSNCWQ7KCb/6+C0eHBScb1o+Ottwsb5k\nM3/Kcn2Jc5dE1fDDT/9vDnLFYWKw7oKynKCzlh/88H/n8fgxXbUgKknnWp6/W/Hxuxe9xSN/5un8\nkb6e+eWrNryOZS4Ha1xabkBuYw9x20NcDgCXulekkYMAsLzOAr0VUn1/3z3kFDv775n3L4xr5R7p\nINrB1eL61xZVQG5l0dxu2dtBmGHwQ0fbP+GN/uYW6sP1nVG+Yp2uf47d84ZbtVY011UTtz7zOPwc\ntyxzA9GIHuhm4OcA9H4cLPJBjMMPQL/pt2PMd+PMA4Olzdbq3oH2Z+7Je/3m/yRCEw/pPVVzIAd+\nHfiPgN8C/k3gPx/Gvzns/y3gfwD+C3r3ys8B//C+J/61X39Ero8RIeEXv/7P8Yfv/T6TfUubeJpK\n4WzEdQmkitloTJpnLNqWzeaK2f4jvnn8F/lR9zskymHyEW4oLB98SggdbbdCesj0BNs1uLYhSfsC\nTdPRm1yuzoi0VJuGNgssqhUn2SGj/IDLzUcYccI7j77Dxfw9lpxTN45N0yGiovJnEHPEXkGepXzz\n8YQfvv8POJ97Vp3AKA95xdKeMS6PoPPsTw6o6oo3nrzJcrlACMN6M6eQkOqE6DvaumJU7veFraoO\nHVPqpkYIyXQ6wTlLCJYYIsFZ1s2GPOstg8lkRlaOcCEyXyw42H/ApqmJAkxacrZ4zsH+HqurFttu\nmM326Jp1ry8aAtJ3QCDmY0JQKAkiyYltAzqQjsYc75/w8vwF0/KbTNKG6ahGqYSqWULsCNoyznJM\n0mt3plGTpjPybEyc/wljAj+XTzgZZajgaDYVl8sL1leX4CymENT+Oc2mReC5apbIRPNgClJVCCq0\nsPzxD34XlaaMJm8RVjmP30z52uN9bIjUquKP/t7Fl/ur+OImPu/m64QmxgGW2C00I9LKa6kz2cVr\noF/3bQao7FVqtn7y7YvZAnkLcuLOnCFiZQf+d+fADcy3hbNURA2JQlFxozpvtweyW4gP10M9862e\n5o2gMtBtIU0v4bYz7yXdIqLbubcF+dYyH17fDcjFjRDFnRK423rm1y6WLcgHV0sUW2m4HuSB3kL3\nQvbFscTQ2bpX+mSg2yVw+x6voS2IW2izC+zb8eXb9dsZoOJnbpk/pD/g3P4K/zvg79Crrfwm8G9z\nE5oIvdDtbw6jA/4ar3iJy/mcThvyZJ+3H/055o3l2Yv/k4nK2BhF2zmiHPeHb1VFPpnQxJK23VA3\nHbGFIp3hg0d4R+MDaSYpTM5GtoNYQYWRhthZMhmx9pSs6P3YuVF8dHWGSXJiTKkaS2MjM9mhpEOr\niFIFJyff5OXZ9xn5hroCXU7xcsPqasnHT9/n57/+y6TGMs1ynte9f2x2oEkySbARLTXB9jqeR4fH\nff3wuqLIJ0yKks3yis1yQessRaJxdYUWjmpZ96FowMVyzqE+xncdTV1DCBitKEZjog8kqUJoSWdr\njJKMD4+x1iGAelMRI+RZweWLM3QmadsaQSQd7zHem/VVIMtRfxAnFCrNYLEhiI44mSHmc7pqjc5K\nCpkTXYvKUtLUkKqE86tTlBKkuaHII8QEKTPWQZDne+RdzpP9b1L6p2zWHd9/70MaL3h/PmfeLhgZ\nxYN9Q3EQ6NoldWuJXUKQFZerlsO9iBEeIwJIw8fPf8zDh99iks7ALZFdRDlFK2rq8DNPnYj0UVoe\n+OvAf313w+sU2mLHtRJ3ZM+2IBdGIg1I3ecTSA1K9WGCUvVJQ1IK1BAjfvfTRez+1d13/xXXQvTh\nj9vQQ7bQtgxuC3ETsz3oXt6dX8dzR3qpti3I70i5iXaYtzv32gHgwz3RDfPt5+OWRLshiv5+n/l1\nNIsWvWWeAGk/RkQvOS16UWdPD/JbQndCX2dy3rLIbxXaSvsPhQHk947xVeM/2dosfwL86j3rl8Bf\necVj/tOhf24TYURVrSnkjOlkitEZMSpSlZHmGXJvRusdPioaAWF5RWMbsrLk7PIco0py+YBl9wGd\nEyAkra3J0xmPxxNO64/ZNFfgJ8hEDXWcDa07ZSy+xRtv/AoX9e+zbGuQksw84KOnn5AISVlkLFY/\nIM++TsGUNw/+PJ+e/x8cpTOmkydcdB9h/ZJPP3kPQ+TxoyOidCQyp7Ub3Hqf0DqEmjNvSzJSpsWI\nqmtx8yuatiXPIovFiv3pjKcfv8v+wRGIQNNumBQl0BfVUkpx/OBxH+kyHtFYR7AdKkvwMZKXJTEq\nnHPYuo8xr7uGRCcszs8waITWZEVG1IJqU6GTFKENWZYSupb08CEmK+hC6P8fbEDsHSKa3gUkHjzm\n6o8/5ntP3+P7n37E++cv+cW33mLTLjFZSxSWrgEaj3OCoggIClLTsuo+YWweQfB4qbioW16erxFJ\njkOgpEBryWgcEcazWWxYLgKtN4Rg0C7l2YsfYo4WSNfgaonrPBcXH1OlNev6JcdGoLqOCkciH3zR\nW+/Ltr8EPAeO6MNzfwD8X7sb/vp/cnY9/86/OOJX//JnI2yi6hNxGNLkGeZIMQj9+j4bVzGICu/c\nl/TuFtlnhN4LgnjPZXz19XW7T2ptKwShd+b2xrd+d34d/xi5o8V5z7wDOkHcuY6d6AG+3TvA/NrK\n1tvoFHFdhGzX1bL92fqYc3EdphgHH7pXQ1naXpkUdz3eneub9Pyob1L2g76pXe7NIAIzaIgOY9wZ\nCVtVIXFd8vY68TfEAebxFTD/u3xOteVb7avTAE1KVl2DE4KLxUsu5h9TVQGZCMblDGkCETBIREyp\nu47zy5dM5Zvsl5oskSh9zNX8E3LhsGlk1S2Y5GOOHn+Ni/dOuZh/jNGPKEcRlXmaCmJXc7H+lP3y\nTQ4nh7TrHxBCx2R8QN0942y+pHEW7xrOzv8Bb7/9z5OrPd54+1/ie9/9bY7LnELOaLvn0ETOz89w\n5hKhV4yPBHppECKjqQI+P2PEGG0e0TYdLjQkaU6ejUjLbFBiD9jOkxcFAk+a5bjoSTND10WKsqSR\nDiH6r2VZVhCzkhAsTggWG4vSFh0lWIsoC8ZpgYuOMslZzJ9RlnvEmJFkIxKTgBBY14GQlEUJIeDq\nBn1wDLF/c4noIRsjhILNJcff+EV+/4Mf8sEnP2YZrviTDy7oOocPHlNAWY6IrUZphdEG4RVW1SRx\nztJGRBDUomAeVtROYEzER49JBDqFpRSEdcP5C89i0aK1JCkLOtHQVA1X86fkakpiM6LvaOoFy/WC\nIpN4YbF5xLaWNP2ZH4A+H8Yz4H+mPwC9BfN/499759YDNsvPPonaBOQmoIYu64CqA6rtu+z6BBrl\nbup8q0EsWQm/owAUbkPgVfMvut7Otxbt3X1bn+5dyNudx4g7jwncA+7PWbsrCber58lg/W/B7W6+\nDWwFMaLtO90Ae0v/IWGGbxTDB4GLmjUjNpRsYklFSU1BHQtqcpqY0ZINwhPpDbiHLM8+9HBwrThB\nXENcAxXEKhJriDV9lk4biV3sP6A6rt1UDDrGN4efuw6x3fYXh75t//E9e/r2lcG863pfsHOWl5ef\nMr98jjEZVfT4eEUua+oGRLJHrkpE9LS+wvsFHkETWkTImU7eRtSfIrOGTXSsu3O+dvIXeHLy5/jB\nj3+nT0CpLGLsEWmLpQ9/fPf0HyPECqMNjVuQmYLJZMTV1YKq9qSJo3Pwgw/+Ad/59r9CqmfsPfkF\n2uAwMaOrFXYT2RtnaDullRUi69DCU2bHTFTB0n2fzrbUfkOuDEpqjDGkWYoxGav2iufPz5jNZiQm\nQUjoPGgpcU2Hj5HNpiGGDqkUIUZcjBR5f2AptKZuHa5pcEQ8CaFr8V2fRWol7B8+Qpu8D1aQAtt6\n6mpNlmXYtiWMRv3hp/cIG0AZpJnh5+9jpg9w6QiuLqgufszR/iOiVAivWXYVwc54dPAdsgzKIsFu\nCpI0oV1/wqpacjH3eNeQlc+ZFN+gqy2rzRmb2mO8ZTwtKHJBjDUQaduOzbrXMjWZIBIQJFzOl8RQ\nMhm11IDWAmfBOYuTgkpELH10RT5a/SzftgW93bkCSuBfpj9DutWqVfaFTySrgKriLZDLa5DHa5BL\nF66l1HqYRyQBJcM10F8L5q873w2D2b1/Vwximw16d//2Mbsw/zzr/D5Nz/uEmRlcKX4H6tdj7waK\nw/NEzQ3I9TCqwW+uwEbdQzwWVPRjD/OcJua0ZLQxvdH1vC6mtavlqXp3iRPEDQPItxCP0EBs4843\njOFDx9IDfVds40/BXw5fIczXizOE2cPHyPnFJcTAZHTMYnNBjAvm1RzZHhISiYsN0WScHJ5QhxVK\njbCxI4TIXvmIS1sj4zk6JtTtkpYl40mCzANY2FQerRJIA6nyiCTj4uoZkzwDKXurVzQ8PH6T4z34\n4Y//HwwpdWNJC8l7n/4ej/d+iVxGHh+9xenFOdEqbNdytVgy289wDkLqcMKi8kDrW7CeqANCeKrK\nY5IM7TrOzxqaeoNSgtA1pNMDlqsVaZoyGo3xrkOlJTI4TGogQNM4jNZMxns4BDorECiEq5EGrs5O\nKYqE0ASE8lgFSZINWeIBKTXOOS6vTgm1pVaeSTlCB0ehE4rxBFJDJEB9iRof4us5Ki/gwQkXzz7k\nvFpR+5aoUoiOLBljZI5SBo0hHU1wNrCfn1CtrvBtg809RrRYv6SqDetNzbpqKETKfqZJ8hRaT1XX\neCdItYDSoHOD8JJ2bVmvHND2OqdtgDjBhN6na5ctp6q3xMbHkmz0JUMCPr8d01vj0P/t/PfcU67i\ntWBexx7iVUDWsYd5E29g3g0g93EQbOhFyCUBJXoVHykjSofPulninfFV81dZ5p8H513Qqp29XwTz\nu1B/Vb+j73l9uAm3XSpba/x6FNfWOWYY9Q7Qd9L6XdRUsaSK+c1ID/ImZrRxC/MbSbi79cnjEKUS\nnYDNAPKKHup1JDY9yGPLjQvJbj+A4u2f7U/pLfuVwbxeVaiihLHg/OoTYoSD8SOsW+O4JPU5ra3B\nSnRR0IUVWk8ZSYl3LXle4qWC0HE+n5Pmjqg9gsDTi++Ryn2SFLxviDaj2nhEq0kSgykK8rRBSUFr\na0ReIZVGmZzcJLz11gnPPr3AItnL9khj5Ecf/y7H6SH7s7/EfF3hkhZlBJ1bM18IVBEIDtJyj8p+\nwqoRpFlCYVY4NSH6iOgEzVqQ5mNs11G7jrJM2TQ1eZ4RQhxk5BIgslouiFJjNEySAqShrhsylSCS\nhBgkSjsWiyWXyzWj8pjOtygp0UGilLgOO1sul0ilaKqGXOfkY42KhfllAAAgAElEQVSSCh8D3nuq\nasmk2Qdjib5CCIXIR7hmidxYvEx4cXlGkZQ8mz8nxo6WyFqm1M8ss3GCljnT0QSiQ4qWzIAIjuha\nWrGmsyUAvrV0RtB1ljyVtFVL5RzBRhK1R5IYatvgg2C16FivYTzNaBtPu+4l8aaZRKk1LxaCy2Vg\n77FknKb4pvlZvm0/oM+5+Ny2WeZf+ESyicgmoOp4PZd1RDUR2W4TaYYMSh93YB57EW8ZUSogVfx8\nOL9qfNW9z3OZbLvjJjyQO/t2ob/1mb8K2q8Ddb/zXLfgzQ28r61x8VmAq+HezuiC7q3xmFOHvB+H\n3sScJtwGuo0JNtwAPURFGGLEoxPX7pVrkNeDZT4AnTYOrzMOP1cEHwd1oeH/70sW2YKvEOYyV/ho\nuTi/xOiCxp1iZI5UgizJ8S4SbWBTdUhdoVWDFBJfGVrnQKzxHjZ2wbI+I+88SRbwUbDaXNCqDiEc\nytRIk2AliOChSUCsIWo6YWilYHX1jPEoY/7RikezE9548JDZ7AHf/dGf4F1gPD5iefEhlVyzrlfM\nV8/Z39eIg/5TuZgc07VX2I0lK2eMi5xnq4/YbDKEOEOokpE5xLYbqtWayQy0iUynM5IkoShHCNGL\nbdgAyD7NX5iE/os1tN6TpwnKBtAJSVJQ1xYfJKv1kjQ1nF9dkmeGNJP4GHvZON9HqAgh+eT9H7C3\n/4BEScajETrJMBKCkuikIFhLePEh6uQhoWqR2QlSdzi34YPnH9OGDRVzGntJtAVKtSgCbbPkRd2R\nFZpqbThIS7wO6CSy3nRoo9HRo6Um0wWZqRCyj/AxShG9oFpFmgr2S0lOwtp3hCDRWpGkKQRPXXua\nJiMxgTLvqNuOpgWpLTrTeN/R1l99oa3XsszbAeK7YxtRbR9zfZ0Z6eM1zGWMqDjAfAC61JFblvmX\nHXct821s911Ib4F/93hiu28XwHfB7b5g7S7Ed9wsuyLO91rnFtDi2s1yHe3S3VjmPcxV7x8PWQ/w\nkFPHjDrsWOdhAHkYLPNgeqs8DJmdoY8lx4ke5PXgL6/o50289pcz9DiUJ4gDzHs5vAhbtakv6Wv5\nymCeTkZon7E3OkFJzcv5KVkyIk9ybNeiU01UKy7mn1D5C/ZHe71F1wIxoFcdgYY8kwgV6byDLkEK\nwXrpmU4D0/GUZtWii4Q6BIRwvTi0kaxWNVompNqQmSfEdp95dcX76/d449G3+PnHDzi7eEH0kSQt\nKGd7+NhxcfUUFwJppsgyT7I/YZbOWF45onOwNlidM9Hf5tPLDzBZpCxaihhomwYpDN5XmKSAqPAO\nFstLtDLM9h7QejBC4VzAJCkoSVQJWguEytCpRKgMoRO0kXi/pKpaCK7/e3OOLFFsmjVSlMxGI9br\nFW3TIoDESNJiDIkmm8xIEsP06IS8mBClRhpBPH+KevsbxOYSmY4xLBDKUVUX7BcPqMoXzBeCJMlQ\naOo6p20tSoMcl1RR9oW0kITWYFeGRKXY0CFwpNqQTwS5UQhSZKLIUsl6vqLVkUQIREwIoSPN0t5V\n5ANNHbGdQBnHJrbM144qeiZ7KZmxtC209jXCAn/GbfMaMFddRAzwFt0QVz4AXW6vh7T6rbCzjLG3\nzBlAPlRSfG2Yv86eL3KzbIF+357d+3dhvhMF85n53T33AZ3+ueOOm+f2QSi9e2V7KHodJ39joW9D\nJn1Q1CGnDekA8Iwm3PQ2ZnQhpQsJXRj85UHjgsaHHcs8DD7z4bCzh/rgYmnCDtDDUGMmXFvlfbnj\nHuQ3WUN/RmFeZhOilxgDWifUc0t2BEqVLNYLEtvQdh0mFwTR0YgWosCLyHrlac4uEAh05oiqj4ow\n5Dg6LhctIW44nJYcHpVk5msUacmHL75HmSWExtJuGoIL5EWB6RRZ9iaT9IQPF1e4LsUYw8nhEefr\nBSo1JKUhxEiMniwU4KcItxwK3XdMUkmZnPDp2YKmrijKI/YnJ4SmRmayT96RkrbZMG8rjp98E4+i\nTErWm3Nm+0dkZYltWorxmBgDVV2j84SAQGlF6wM6LXrNSyfwIeBjBKXp2orMpHTdmm5jSJSgWVeE\nYoJ3LfiO45MnKCUos16ZqJ2fYaYTunpFahK8yEnzHOEFYTMn6hT77IdEmdCuKharDbk+Yn/6AGSD\ndxYtM/ZnJVeLJUYbpMlYVBWxbSjzFKNSvDXYShPYILBkqSMvFEpFsnREmWdkJmW9athUgVQbxgnM\nXUWW7DE2CXV7TmsXeO8JEuZtx/MLhxkXZJM+Br2qIHyFGuXbVi1fBfObNEY5xFDLjt4CHwAu7HC9\nHR0IvwtzBqucXnRZ8frgfp21V0Wz3AX5q+4NqkjXha/ug/RP2rcw3wH4rkW+e+h5De/toed1pUmu\nD2x9UDQhpQ0Zje/HNqQ9yEN6fa8NvWXehcHNEgbLPOzCXEI9gLthcLHsAL0NvVXehb5wnevFVKKP\nfdXMELhRc/4zCnPo9S/XbY1dbZjNDvsoDW1JE8N6syRJDMJ0xGhpuzmT4pCRzFB6Q7oa0TWeutvg\nsEQ/ImI5zmf8q3/lr7J/NON8/hSTWPYmh+hkwuZ3Lnn+7H2868hQdC6wqVoO9R5RbOjiirEZk6V7\niDAhFY5qs2acFRzuv4W1l1TtBVHnKFLiaoJPHRt1yYFOySZjriycPXtJkJfkedEfQvoUZRTCpDRV\nPYQGtiyW51xdveTBg4d4L3E2EPB0tiMSsM6zqjqKoiRLEmIA2wW0knRdS9dZvAfvBaenFzw42KNM\nJOt6jQkdwTmUClSLS4iS6WxCkqSDTBmYIiMIgxAKJzKy0QxbzzGjEtG2MH6boCr+1t/+X3m6/iHL\nzRUQsUKRjF8S2j20zBE6p+pGEBWuCzjn6AJIGdFZTmJSXGhooyWfKHKzjxrn+NhLyD1+/E0yfYht\n/h4vns5BCVrX0TUN48KgYkqDoakiyaCRut44kIFJ3jHWgq6NELbCaV9t27pZIp8NCrlOzhkyP6Xt\nk2Ru5jcwF65P+5c+9vVW4mA4DzXMpQKhue0K4Z75fWuvmt8XzbJrmQtu4MrOeqCH5e7h6Bbmu7Hq\nd69fNb/PMt+1yHet8l2g6535AO+4U+w9SghB0oSUzqe0Yeg+oQ0ZXUhoh/UupHR+C3KD94NlHhTB\nqz523Alo+rj42LDjK489yNst0HuYYz240FvmPgwVM7dfOb7cSehX9s5v6jXBS4pxSToKvZpPlFjb\nMipyrFWs3Tlap71rQAaMcTyYvoXgKUbXdE1O6ktWqwVNu8L5AqLhsDzgYLqHp+H09BPa5iUhrjk9\nvWS+7JBtINWKdXNBVDkr3yLd+9Qm0K3WLC7OmZRwOHnCjz75lHWz5tHRN6iarhdDiA3FWKNrg/Ud\ntoWXOnLs1hw9yBDigHZ9jpQSJSb4EEAphBQonYLwLE5POTh5TNt12CDwLnK1WJAXBZuqpihybOvQ\nuaHaNIzKKdY70izF+8hms7kuhbvaLIgEruZXUGjoVoOob8NCgU4Ns+mMGB11XeN9QpnlCJGiM4PS\nBW2zIQrIsxLhPRQl+CuKoyfoQvPjH/4R59UC6xOquuadnzuCkSc2GpUX5M2Iruuw0bNZV7gYEXiy\nQpNoxXpd4UJDOppQ7B0hpaJt5gitGI+fEB2cHD5mud7QWYtWBiUylosLpCzx0RO9QOUSbwP1OqC1\npsg0QgZSo0hUTt39f8DN8hoHoFtQC9dD/dZ4d93TVzzclrEVO7VZlPgsmD8P2l90b/cAdBfou5y5\nz+1yt5C64ra1fjdu/CdZ24W53wH4fRb6XVWhndfU64EKgpe0vre4O98Du4f4dm1YH+Z2C3S/Bboi\neEkIg8+8BVrRw7zdBfkwdr63ygeQR+fB+QHkOxlPtz4lf/L21fnMhaCzgq7t0CEgfMtydYGNgv2D\nMaNizPryChEiqdK4qqUtNoxHI9Ztyen8I2TMIE77qA1S8jzn+ekF/+Nv/SbTowllOcKGNfPVh6zO\nPat2w+HBAdkIfNvSdRHfrgm152t7OVYaLuSU50/fpRwZ3jiZsV/ssa4a1FCHqqk7gk3pXIvTCqEC\nOsuIHcytJU01KgetR3Rti4sXpHKf2jeY4Ai2wlqHSQPzy3MiCuscq8WSl2dnvPO1d7jYrBHs45wj\nhEAI0HUdIYRBVKO9zg5t25a6rnDBU6YJJk1oKst4kmFiiZCRshhzdXaGVKCNBpsivSNGy8HBqK/l\nrsZ9dUQDUeUgQl8/Yn3OxcWC+VXL1ZXDxo6jvcdM4iM6/SfY4gzaESbNCEJQVzWbbkP0kaauKcuc\nUEiq1YY6biiykqrZEOhw4Qy3avnej2seHn6LurugKBNCUIDDWsVq1aHQSBVJVIaIkvXG0jSBLHOY\nRBJMR5rmNHXFZmW/6K33M2/V+ot95sKBCGJwowywdqKvLe5v5tL190QQO4wVA8i5LqL1Sli/DtB3\nr+8LNdzd67kN/jCMuwejcufefRml92WYft79bSi9F/cDfQvxIUN1119+7WLZgbr3ErsDbusNnTf9\n2vV1P9phdMHgvMb7wSr3su9O9BmsQzx5P+74ygerPHZ+sMo9w9fpvhLpFubXXzd++vbV+cxzgUaw\nXL/g4fHXOL94Qds0LJoaITqyTCE6SeUtwglc3Vt3i8MzXLdCqjWeNW1dIeMErQJpOUIhePfjj7n4\nowu+851v8/jkmMYa0rL/cVMRiVqDKRmLpP/apcGmfdREZqFya+brK77OCSezx3z/0z9itfwAgkXb\nCcHDyf7b6HzCYvEJedS0uWC5OKe1l6RlQaoUraT397ua2rfoGIiuw9sWhaANgrSYsFnOEVIRnOP5\n02ckaYK3niRJqZsGrc1QECtyevqSJEnYbDYkScJ6vUYg6NqGfG+KBpI8pcgKRAjE6OjaDVpLzl6+\ny3h6iG9S2loi/JR2PSYpDlltVhSpwtcBiUDuTxEu8P6P3uX5/AW+TVDOUOQ5bx6foAaoJqklsiDL\nR0SgWq3BR2zlsY2HBpSLdE2DSCJVe4nKFwSx7isvxsDV5XNG5iF7BydcrVdM9voC2tFnVKs1Co0i\nJ0kNPtFUTYVODLNZIEhLjILVekPbGpBfvZvldQ5ApRfXkL6G9fba37ne7omir1EuhpBT2QP+C8H9\nqrX71u/CfNcKh9sRLndqod+a78L8Pqj/hGs9zOmBPsD/Mxb6F0A8DnHxQUusMwOs73TXW+Cd3xnd\njlXuda8L7NVQOVL0B663yhHEHuh2cLPYAeTWDda5B+8GkO8eBPwZdbMYJXBKkSpBrqcczN7hRx/8\nHoWSnL88J8sLmiYitKSOFhklvhWcnj4jTXOMDxgVaEOFFGOi7fBth85yjh4ck2YFF2fPeXywh3IG\naRTlpCNUDo/CiISiHKNloFKWdXAoa4l5ToJj1a5YVQuKLEWqGhvP2Ru93V9LSTmegtDYzQXK1zS+\nYV0tqdYr9sKax4dHfHTZYL3l5PgNVJDYEDGm1+J0zmKUQstIs5njPIxGE549e86TJ0+4urqiKAqO\njh9gkpT1pkIpRd00bKqKarOhKAqapsG5DpMYQvC0bUWWFTgUs/GYxcVLkrQlSTMm4z2C69BpjlKS\nLkiEKVDZBG2XBA8qSRFFTjQF4WrB8/MLLs8WBPrQw3fefoKUkXc/+hEhixwcSnR6RZ8/7QjWobuA\n0hqlAonUaKlwRiETgWNNYxV5FijSvK8Xj6AcpcRoOXlYsLFPSfWYJHfsHaZ0VX/wp5VkTYvwgSwH\nlWfY0NCsPUJqUlWQjL7cIdKfRqtex80ywPlWD0MN8FvX2z6AHdHDXIqhPvkr3CyvC/P7/Ov3RarA\n7SiWsLPn7gfAbljjLqS/zMgO8zS9e0NxOzJmF+A77qK4+wEDBC9xTmO9HkCth2uDcxrn9QB1fc8+\n1Vvnbscyt9wA/VodKfTlg3ddLNaDc+Ac0bveQg+Dn2ibzvol2lcGc7cJ2OBYLq443KvYLBdMs5zx\nKOKvPISEk/1HlPsl0iiW83M2qyuacA5+hLcajcc3Ehur4XDQopVGyoSjg0MIY7pGcjJ9m2eXn9I0\nkv3ZCVJcMp2uSaLirHtJUUq8ajBqhIg5q0XLqrnk/dNPSLOEx289QSeeKE+RqiBGwaY5Z1UH1osl\nZSYoxjWjmcTkCdMihaQjMRWrRYI+1ozGE4KySKmQGoIP+OiItBTJPhfzc1w6IstKbAysFwuUUmhl\naOoGYwwhBJqmoWka/OCC8d4hAygpsV1NUQ7iGSbBxsjs4AAhe7/y/sGbg+KShRg4fviEYnpEpN+v\nRECYAkwK1hI8/N0/+Ee8WL2HD57OW9LU8PJ8Tlg4Yj1hqSpG+xVGrgkxQ3lLZgzWeWIWKcuMQima\nNiCkRLkMu9aUPhKQZCPNeDxi03zI3uwEH1KqxvDp81NSkTFKoIsKi6IEEqFYJApjFG1n6fBkhSJL\nJCFUrBdfPcxfxzIXcQAz4mZ+Z21wqNxe38J8B+qfC+mfBurXL/LOfvE5e171uC2M75YD+EnX4NbB\nZw91ceMz34L9urojt8vlbottCYheXEPbux7Qzg1zvzN36hrofrvHa4LrYR6cvKm1ch1mOcSTuwHq\nbhfkg3Xu3WCZOwiWeOsrxk/fvjKYn6+WCKEIoeHdd/+Azm7IswQjChLjCcIwSyWjUYJJp0hn8I1k\ntZ4jpjWYBqEzuuColhtG+ZQ0k0xnMz599iHjyZi98T6N7/BVhWslWmfoZMzV6l1M2pInCbm2eH1G\nrhPSJNB2inxzzmVwfPDyJdPxG8z2RpgkkJqc508/RquWy8WCqoMZJxSqwGnP0dGIs1ON85I2GLJR\nwVh0nNbn5ONDyjRBOEtWltTrNalMSCW4ZolBUK0XmGxEtVzivO11PmNESomUkq7rALDWUtcViU5Y\nrVf9AasQFEWOwNG0G2ajkvXyikQKpuMxaZJispJRoodEqBGzo0cU4wfMVxuUjBSjKSiNGE+JXeC9\nH79LmmZs6sBqVfH1rz1CiMhqsWGaTalCzeXLQJJb0skGqRxkAVcJNm2ftJRISahaTHBoZTBiRCpG\n2Msldt3im5ZNGjE6JbgXzKZjHkwfkHUT5hdn5GlBenQIEdy64WrTkbuM9XqJLqEcBZQU+LqjnivC\nvPiq3tLX7dWhibtN7kC5Nx1798nOfNjzmb3iZq/gJ4T5XaiHnfl9Vvru/O4h6N353bXdQ9Ld/qr1\nz7sPt5KGdq3xW+V5XwFw4PpDJiqBd+oz3dl+DP5m7p3GO7kzH/Y41YtzOMG2hjuDqEc/BqIfIlj8\nAHI35KI4B972fQB67yP6MwrzNmpiW4Nsse0SKSSrtiasEtrGE7FURtMuWoqyResUYopbj1i6BpMW\nWO+RWpJNJLbdkJiCPM159PAxHz57n816wXg0onMdb73xdVKzx6OHb/PJsz/g6ccb3pqdkk0lXXaA\nEBFlJKswJ9eKInYs3Aa3OqWzLQ95yJPH3+GXfu1f47f/0W+wXm5w0WFSRx5TLl0fMnh0cMRitWJV\nBZTKeXAo6RpH1a7JzZQiy6mXDWmSYOuKKCJSdpRJQdSR6V7Bcr1mOjpgvlwyXywwSUJdVQgUVVMR\nY6RtWlpqvG0JviPVGoHAeU8mE6qqghhx9YZWg1EGPdIkWZ9lKwKkRU7TVaxWL9mbHiKkhDQnoHDr\nJS+XF/zo6ffQec5YjhkXhsuzc7wXdFkvQB2cptlE8nJJlk9YJhGhILaWNMnQDmQQZEYhEkNiMpIu\n0jZQNRYhCpbVmmY958k7h/iw5tHBAaOjnG89+WcYHZ2QZIHFcsEnH3+KXBjWp1eYqaHMYL1oWDfQ\nNQqxMhwlo5/1W3cG/DfAL9Jj59/ijmD5a1nmQvZWtZA9oOUAZ7mF9SvWBoDfWoPbMA58Psjv+sh/\nEgv+Veuv6uGe8adZg9uHn0Md8+swyF2o34rIEbf9+AKiFL3wtJN421vZ3qlew9SpQZR6Ow737uwJ\nTvaiHE4MB7PDt4RtZqeLN+GHfohgGQ4+cfbaMo+h47omwZ9VmEexT8wqvJ0TpSHJCmLdsG5anIOO\nyPvPFpSrhIPjgNYGFxzRC0KT09QOkVqKsj9Ob6oamc7RScdUH5DIj7g4v+Tq8oKI5O2Tf4qf/9Zf\nQKcaI0t8t+KP//EZ3357j/JwyoWt2D88IAqB9xXj4jFV9QFaejq7YTVvuCgu+Wd/+df5q4f/Pr/x\nN/8z3v3oI65cxWzfE6uCeag4nB7QZR2Ly4YyZuR6BjISYyBogWscidZ03vHg+IjV4gohPKNcE4Rm\nmkhi4khlzbQ0zK/OkDpFS8VoNOqzSKWkqjYgHCH2mZ9aSowEvKOqVsCY2ThHiD7MwHuLIaKEJEuy\n/m8terwN5OmItm2JxiBGJaFucBF+57t/n/nyDCklb765hxOeH33wCSFMEAeaDsgySbWEtIiUZUVi\nBEmI7E9KVAvSW2IIpFrjo0FagepqJrOMVEuuVjXNqWHhLeXqkqw2nJ53nJTvEISmsktkknB4eMJs\n9pB33/2ITajJJwdUi5rzp55qqdA+ZaQNaTb9Wb91/yvgbwP/Ov3fT3l3w+uk8wvZxxYKNYxSDjXL\n5c09KfvruHPN7gfA8Pi7AN0ePv6kwN29hs/CO9wz/6LxdedfdG8b3z7AO+5CfLffjai5Dknk2mfe\ny9rJAcySYMUwyn7dbe+Je9aG/VYOljn3HOD2QI9hC/QhamXXveK37s5t31Yg++nbVwZz28B4tE/s\nDELUpCYjM1Mq2WE7Rx46VlZx9nKF85G9gzFEjUgCdWMpTaBrJTHxBO0oJoaYrLlav0/inrA/fshq\nteHqbIOICS/PTxFR41qHSSOPH+/zw9MOV9XshwOeriEdaw72H3N19sfkSrKXv83eZMTF+pxN3fHd\n7/8eo3Kfb7z9Td568ktcLi6pFy0hNkzyEy4v32e9WdG0HoEEnTBfWYgCPe1YdWuC82QODmYHSDqy\nLCfLM7TSfe1wv6aUNetlRWNTnAs4nSHps8XqugIE1jX44AdFIYmQgRg22HZNUy053JuRZiWdawnB\nErylWl1hsoSMksl0hhCaqm6IEUaZRghD9B6lEz758EdkoiAnMp0KUmU4vbqiDQrlLGGIMJEGlDY0\ntUNJj4gWlERKQWoSdJBE2Yc5CqvwRpHNpuS5QXQN8QJMInhymLF/lCBCSleXbDhmtRZcvPuc6Szj\nna+VHB4e8HPvfJsHR29DKLC14dtHnmmek6U5RZJijOJv/MbvftHb76dtU+BfoJdKhB4ti7ubXivO\nXPWgRg9AVoN8kBqu9Rbkwzpbq1wOQebq5jngs/CTfLGVvr13N0Jl+3y7PvLPc4t8kcvky3R2xl0X\nyw684y68xZ35PWGWUQ5Sd7d6D+lba04QOnmjb3rfXhchiJ2fOQ493OkD0IMjbl0roev7blnFL9G+\nOjdLd0l3lWHrmrbdgAdlWrrGEtFEF5mYFJe3tLVjs6jJ0hlZmmHtCpnDfqpZX6peoKFoaIh0cYl0\nz0GNMVojSfE+8NHTD/jBB39MXuS4UDNORhwfzBAYnFsyDR4j93h88k0WL37A5fk5STlBTQpGyZiN\n9yAkf+fv/y/8w++mPHljn+OTx5zaj/ExYmTGyd7PocWCTFmsDqzqBqECsbNUwaN8QIgRaZr2LhHn\nCTEymUy5PD9lMioo0hSZH2Hqmvc/fU4iJY1d4/DUm/paXKJt++qA1jkSI5mOJ2Sqo16siD6yXl5S\n5iXZeIp0FussoqnZXF1R5iNE6CNOskyzWi0xegSmfzu05xf87nf/kB89/wP2jwwhOs6fXtBIGI2m\njJKS470Doo/sHR8gVMR6x8nhPqU+IP2VkmDh4uxTnHeMRiWrzYYkzZlM95mOSvKiwHtYLzY422Hy\nlOm+JgaNCIY8LSmyjBgjzluC9IyLMdOjMW1d01lPqkcUZoQuJCHEviSB/3LhXV/Q3qEXpfgbwC8D\nvw/8u0C1u+l1LHO0RGjVQ1tLuJ73owjD9VaVeAA4UfYf+tusIa0+3xq/z43yKojvwvNVGaD3hRve\nNw/3POdPM99es/Nv7EL9jn/882B+7TuX3NRv6baA3lm7jky5c6+7s2frHdlqeF5/K4lDlvUA8bgb\nT+5uIliC+/+HZZ6nkvlyyeXZajj5PSXI0PsRVUpsFBrBaJSi8xThW7RosV6xPz1kNM7IVWRmz1BX\nNeeXgtrUSNMS3SldXGGkZP9oQrNeMRoZfvzR93FxQ2SBNJEiSQjOsmwNozLw1uOv887xN/kgpgTf\nIhqJbTXFaIIIK+rWMS41p88/wNqnPDp+h7IwWLsgSUak4iFQMxaG1fyUw6OE+WVNrT12E/FBcnJ4\nhAmKSMC7jgdHD3n+/FPGmcFIRZGNycuC0cjROcnHp5dcLWpUlrJerlBaUpZjrLPDGz1yeHDI4axg\nfv6M8WSCTwWJimBb0mIPHwXONkTnqOZnVIXh4OgQ6zw20JcFTgswCqlLPnj3D5Ey4Wsnv0AUDusE\n+1mHIOK94mB6RJZmTKf7HB8cIIVEKUWRFZhUM5lMIQZenL4kxMBkNKWqK7RW5HmOsx6hJUbrvvxt\nvWEynjGajAgOnG0IMZAkhjTLsRHquuqTLLxkNnkAApI0xWhN09Sslmu8d2TZ6xw+/tRN08so/jvA\n7wH/JfAfAP/h7qZ6/d/uXP154J/+7DMZNfQByNt5UBCuc9BvIL67trsutyEa3IQMXoNwIOG1mk3k\nOsnnriW+u3ZfwtAuyF838ec+65rXXIvis/fu/nu75QPugzp8NmRyO94nmnG33vrr3HNh5/e7+/rj\nTg/cKve4DUW8lkbafdK77cOhf3H7ymA+GhUE6YndhGpRU7UO5yVaRbKRQKea3GhG+xlEj1072mpF\n6ypkWeAzQ+0lE2l5eOh48YHCiBJPS72JOF9DmlGMFOOy4M23v8Ev/8Kv8b/99t+i3hTURrI/nSGb\njrOLK6YPBVpbzs6vuHq5QuWB/aOSLEnxrmOcj9mbvcHT8/xNrgcAACAASURBVI+ZlhnNesWmfEmR\n58QQ2axPUcke072vUXUfkpqCg70xJmR8/HLJfjkhNCnBif5rnpCUxYzF/Jw8SynKjDwfkeZ9JmuS\nek6Ojlg3HWeXK+pFR5pmeBvJsrKvuhgCWkORpDx78QllllFXLUVa4l2Fjx0ET1GM0VISbceoLFBS\nkig5RLUKtNAIY0AlxKYmG+1zvL8hN4ZHj0+YlHssL6+onaWqa5QKbJYboohcnL7g4PCIMs2Ig2BF\nnuas10tOjo6o6pY0MaSJIcZIVfUC0+N8hBACPS4oy4IkzUjzFO8cQhhM0lvZnbP4EDBGodKEEPo0\nfmMM3ju6tkPQfyChJPFLxup+Qft06L83XP9P9DC/3eRf++JnkoO7hP4g85o6kRs4hAG+PnJdnEWE\nO3Aa6HGfVf4qN8fn7b3l9+W2xf257pT4WUt6d35tHt/zu4h3Pz3uedzuc0Z2fld3foZbLo+d17+T\nPXrtf/+in+/u7+ren+tn3d4e+rb99it3fmUwDx38v+y9WawlSXrf94uMyD3Pfs7d6tbS1dt0z0zP\nxsWkLZKWBFmUZenNy4MhyIZfbFgEBMukDBgQYHgRH0zYD/aDARu0bFOSZWhgQbAgUeIMRYKkOZzu\nIWfptaprv+tZc9/CD3nurXNv3Vq61hZdfyCRkZGZceLkifOPL7/vi+8TQuKaEhmYzNIE2xQ4roll\nNn9OJQ2iecosjDEijZYlUkkW4VXCRYfAcUklGHZMXmnIXQZWD01CVFfEaYkWmqCV8+rrX+DNi2/x\nbv9dPp4cUFkSy7GIkoTZtEBaNYeHN7ixv8OcGUHZJoxC0rqZ+jd6QzZ7Q3Ym1xit+xR5SVlNcL02\nKvBYTEPqaMJwuIVlDqmlQlcSXWaoGnqej2EHeGYLz7TRRUwaRSAk/V6HKoswTRvHsjGMo3yfJoHv\n0wo8dvYOMC2nIcJ2F9cP0GWFNAR1mVLmFaVVE7T7iDLGEDVVWbGYH2BZGziuh9Xu4rk+6+fOYbaH\nFLGmyiLavRaGVM1q2DhHKhPT0Iz6fUxM0jii0+twLgjQGizL4vDwgDCMmE4n5HlB4aYow8R1HZSS\nGIZoVtvVFWlWL0MR6CZIlCHIsgxlmgRBgKWsxvBcVw05G42knxZ5o0EQAtM0MZcrYdM0pizUck2B\ngbQa46eQjQvnM8QOcAN4A/iQJqn5D+65ypD3VN2DpWfKMaEj7r6unyAofXer6lM64OVFj0riq23e\n79w9hjzOILv73H/EcveQ32kiFyfPnyD608R+n+OjSe+YdFcnwFVCF3f7fLR69Cj8wOnvdXS8+iZy\n5vd8VnjQpPZwvLgcoElKTYYhbGpRYlmCWtQoS1BVKVleUtYG01spO+OYbtvFcQ0KXRMlMdEiJHLa\njfQ+chgMExYHFdLysDxFGo0RpSKJSqTSXNx8jcLQSBVT1Bll5aNsGzGQBCIAXXMwzcjLmwi/Iicl\nUIqsOiRMasJ5Qh5HOI6JMgNqb5mjsgoQwscz+8TzEjMxsewtLAZ4lYl0EoZbNp5tkmQlpiHJ8gTy\nhFpW2GYbwzBZZBlbXkBe5JimpMxydJXjOza+61IUBXHcLOE3pMI1LUqpEXVBNE/odfrUlKTRgmEv\nwJQOqizQaLIkJeg0Komg38b0ArSQ6DrDFJqySDHtHjpNyOKSKAxRyqLdbrOzswvUdDpt5vMZnudz\n8eJFoMdoNCBNNxmPx0BNWRZcvfoJnU4Hy2qSREgp0Fo3C6CUiW1bSKnQWjeJJ5YhCQxDIpVCCEFZ\nFGRZimGZKGVRFjllUZDHCRpQjoXWmiSOGkndMgFwLLsxCj5b/Mc06eIs4BPgL99zhXiEPpwg89PK\nXU4S55FkviqVH1/4AGJelZbvS/Cn7j8mtVNEfkTsJwx9q+3qewnvLEI/QeRH5dUvdVonckbdahLk\nYyLXK+S9JPQT0rdovsPRIquzVEWf1Xj7WDhrqezTwYtbzq9t8DRxkTLbX+B5DnGYkoc1wqiwnAJT\nCjzTxjGalZOVrqmrGlFAXTmMsxgpDEaFQ6dvkdopyrZpGz32d/eRssZUDroWUFV8cuUjDmdXMUTJ\nIk4QUrHVv0Amr6HTClSJrA2CbpfZbIrWFVK7tA0LzxniygFdy0GLEtMysaWDUSs8s0XiZRTdCFm6\nuNLEc5ookFvr5zGlySJekIcHGK5FIUqiOKHtOkipqABpOk1C5yzFtRRxNEOaNo4lsRT4nsdsPscw\nWmRpxkF+iO3YOKaJZUuKOsNAI+qcLAkJugMMZWGaCoyaqiqwnC5pVmE6HnWtmYULzKpCYqA7A5hn\nXL/2IQezmIqaJImodQVCEEUxpa6h1nzwwY8wpIHnuaAlSRKRZQVB4KO15vDwsIlo6HkEQYBpmvh+\nq8meJARKmWRZRpqmhGFInMTUVY0ftMiylBqYzqa4rsfW1jlM22F/f58kTen1upg1aCqKMscybQyt\nuX37Fmma4LrPfNHQ94Aff+AVjySZi7tEvkroq5L5ESmJI6n8yMpJc4E27iXRs4j1tPT8IFI/Tear\nx2cSub63DZbleyyPp8j7M9WvEPjRNaukfkTkJyZCcVcir5b71ZgxDyPys0j9sfAopP3kpP7CyNxr\nSXKng2sr9u4sqPMaTyqmYYwhJJ5j4VgW0jcZqi5pVhKXEaOWRyEt4jBDSYusyBlPCxASt2eiqBDK\npEw0tSkwqVhvj7h664/Y340YjxMczyRZhNzZO+Sicw6lXdygy2ZrDVmPUEpRtUBJDxMTpSWtdg/b\ndYnDOZ7tEscxcRrjByaWq3A6FnnhkGcZta6bBR3AdDpFCIEhJY5joZSi1haeP0AZFe1Wi6tX3+fc\n5iZVrVks5thL42AT7ljjuCZlkaGrGmVIXC+gFXhUVUmRJETzQwatNnUZIZeqhqJICPyAuq7xvQBl\nKGrDoOU5SMdFGx79vkVVpTj9HjU2eB0mqeCTT68yHI7IssZ1UkhJYAdgNe6GcRJiOy6GUAhDsL6+\nQVbk6Kqm1WqRJAmW1ei3oyhGCEjSFAQUWUGrFbC+sUW4CJFmCYZmZ2eHJItxfR+E4HBySKssCOYB\neZqwv7/f2BkCD8e2EELgeU7zW1UVfsslaHmU1ZMtvHgqeBQyNwTHCVpPkBV3yUnQkNHRJdVR5fIa\nrU+qMO5L5Ksk+5BrV4m60nfJ+5jwVupW7zndHpozyfi+lsmHWSxX31xOT3wr5dNqloqloXQpqR/N\nm49iD3iYVP7Y5H4aT0c6f3GuiaVBEZcErYq339rkD353j0HPZLgZIAqN0hrf9hHKYDGOiGYJltB4\nKKqgGcThLKOqDKRZkxbQNtv0W2ucH73GT775DpbpUOka13fw24o2GU7l0PJsFDaOqej3+nzFMHFM\no5Esq8btr8hSoiKjzCvQUFcFWZxj2QoUhFnc6IURy3FcM5tOEctl91mRM+j2yIuiEQjKgrysMKRE\nWS5VlpPlU65dv4oyHUxlkqUlRZFR1RopLbQGQYkyJI5lEcmMTreP5zoIoZDSYBbvU5UFeZ7jWCYt\n32niEFUa0zRJs4R4PqPTGyC0RgnQroP2N7D7PhoNlochBHk0ptUKeOXSq+R51vRV2Wg0uU4QicTx\nXVpmF0eZRFGEYRjYjokjmrylaZ7TGwwY9AcsFgvSNGE2nXL7zh2EEAyHA5TT6NYDv/GDPzg8oN3p\nUNcFUgkW4YIsjTAQ7InbgMa2FX6nhWlBtnz2SRxjmiatdgfbspt46vnngMwfSc1ymszhHslcL0l0\nFcceEmJJWmKlnlNkc5qszyL1M645IYmf3p9Rd9zGWaR+mshXiHj1O59J3GfU6dWNk8/heOMucRsr\nJF6yNCSL+4fdfZARlJX9Q/E4kviTkfqjkrkEvkNjyf83gD7wd4CLNH4z/yYwXV7712mWOFfAXwH+\n8VkN7t3Zw23V1KXL1nrAK68HhFGOtmp6noNvWhzOm/gjRprhV2C4JkkWYWHj+XaT7GGegFfiDzu8\ntfHjXL7wBr4bYLkW/W4fpRSGgCLP6VoJ51stiqpGSOi0OphKYihJlqZYlotlKcrSI44jzDQjT3Py\nsqQoc9I0IbBsirwAAwLfx5SKOI5xHIckTbl5+zZBK6Db7VKiEUriWA625RBoTV3XlHlOJjVlXVBW\nOYZuVvSlWYjr+pQ1+IHLZD4HaFRLosZxPaTtsr9/SIXAsS2qssCx3EYvbRjUZY2QJsLS5GWONBS2\nbWEqE9Mx8YIuwmtTRzmiO8AQ9nIM1dy+fpOD8YRwMafWJd1uH8duAnyVFRyMx9i2j+1I0qpGmSZp\nmtKSkslkwu7uLm7gs7a1QV2WCKDdaeO4Dq7vYRgGjmNj2xa3b93EsmyUKVHSYDjogdaUVUWZ5Wys\nrVNXGsexsSxFuFgwmYzZ2cnwXR/TMqGssGybqq6Zz+dorXGchy/YeeZ4JDULSyJf2R9LnNwlEWgI\nqLngpERusEJq+viSM1UeJ4j+AcR/TNL3IXN9xn6VxI87sfJF9SmCPkHyp889gMjvIfVTq1/vJ2Ef\nEzv36swfJpWfpWZZLX8mPH0CX8WjkvkvAD8EWsvjXwL+CfDLwC8uj38JeBv4t5b7c8Cv01j+61Pt\n4SuPjmtitRx0pXjzCxf54cfXqPOSrEo5t9GhqgS6zGGo6PQ8Ku3h+gGjTo9Rfw0tIU5TiiLDkHBu\n6xKWKylESp0XzBYaXde0gi6WZdHr90hik2TRkGRVZkihcJwAw/UwjCaAkZSCXr/PbDqlFbSZzmbc\nvnKbXq9LGEVIKREayroGXeLYNmVVYTsO2+fP4TgOWZazu7/H9vZFep0BdaUpykbyzuqcuoJFGGKJ\nmm6rh2FIXMeiKjKUKSmKHCkVNTmGISlLTeB1kMohLWom4wMMITm/EVBkGUqD1+6TxBFuOyBPYwol\nabXa1GWB1hpTKqzhgEJbqP4FSObgmqAbdclwY5tSa753sMPtWzf56JMrtNselrLpBi0s32f/8BaW\naeN5PsIQ1FVNHIVYpsnbb71FXhaUWc7O3j6mZeIHHnmaY5kmjuNQFjlpGJHmGRpNHGYkUYyhJHme\nYzkO0jA4v3WOvCip6+Yf1e+P0MogXCzAMOh0OrjKhOWEaS/7Yy6NoS8Uj6RmYYWzVv7Qq6oLBMes\ncUSYhribku30QqHV61bLn+XcsSFxZX+i7pQ0fk/dqnT+IKJ+jO2YwI/K+u7xCcncOEXk4tGSZjyq\nquWJcVqNdLr8eHgUMt8G/hzwXwJ/dVn3F4CfXZZ/FfgWDZn/ReDXaDzgPwU+Bn6CU4GIAJRZ4ak1\nbLNm7zBmNHLY6I64fuM2rrLQVYvLGxcR2NhegGE4mKaDZXsYAnzPpdcfUpQlhwcH7I93qOuCNFlG\nmBOCLI7RNH7YbuBimgZmy8exTYpimUJNG024Vg1pWlBWJb7fIlmEzBcLkiSh0+nR7w9wPAsTn/Fy\nMijLgqLWpHmG67o4nks5T8nzhMUiJghadNtDXNdjMZ9hCIjCiDCck4YxluXT8y1cyybPciQGSkBd\nQVrnUIMhKixT0+m1sZ0en1y7TpoUvHr5MuPxAfNZySiwMMgB0bjv1UBVUeQ5UKFMC8u1sSwLYQUY\n3hDSMfNbe5j+Ie7GJdAmrbUN/MEau/vXmUymOFTYtsV8Nm0STO/eBgGeG9DutKnqCs9x2d25hWna\n+L6PlM3CIMc2qfKM2zcOl/ptl3AxQxgwmUxwXRevKjA0VLqmKjTtbh/PO5LgHfI8b3zTowixjE2y\nMVzH83y8VgBo8jzHMExMy0PYakU6fIF4JDXLyraKVcm61mecOyL15b2GPnlutY1VCfxRy8dS9+ny\nCnmvkvsJ8l6V0I8mo7OI3Dij7uj4tHfP0bmj+hUCP2H4XF6zOhEdEfmRzv+I1AVPR2f+SDj9Az87\n6fxRyPxXgL8GtFfq1oHdZXl3eQywxUnivkkjod+DMJnTdbbJqoRkHnE7Kxh01+j5A86PXmW0dpGe\n20Eqjee2KKuCstaYliDLmpVSZRlTVyW+byHNdfI8J4oilFJkeY6oKuqqou+3CGwHMwhwPBdDmEiZ\no5RCCkkYxcRxTNDrHE8EeZ5hGAa9Xo/FYkFd5ZRJTZimlLpCa02RZiglEUISzhfUaJI0pCproImx\n4ftBkwgizzGMZtn50d42TeI0wcSg02pR5imGMijyFMdWIBWWMFCGxDBqTNMijlPCRcLOzg5lVVD4\nDkUlsB2boqyRyqAsCnrtLkpalJVo/PcdH7/dQg/Xqe7cwXDb/ODKB1ze2MLtbiA8q+EIQ/Laq+8Q\nTRbkeY5tGvRaHaaLBevrXWpdswhnuI5LHDdeLL7vM53OmE6nrK2t8cEHH7J/uEuv36XX6bG1eY4f\n/ugHWJai2+0d5y6NogXtoIPrNBEwkyRdujA2qivXdRtylxJpSKoipa5K4nBBGscIIXBdl1xkVEUG\niYHxKFLxs8Yjq1lOqSX0su7o9f7YeUWfcU6fbGOVmOFeKfy+dWeUVwn7iKTvIfMzrjluf1l+KImv\nevEcleu7507cq1eu03fPa5akbtAkRl7ua6Mh+SN3xKOPO03mNfeS+hFhP8ib5ZnIDE9G6g8j8z8P\n7AHvAj93n2seNledec6SHbTQpGFKHieEs5RR+xKvnP8y50YXMaWirHKUsKjqvIlkKQ0s08Z1vcaL\noa5AC3qDDrZpkeUZi3BBGIbkeY40myTKu/t7BK0AVdnoVFDVJUI0/s/TxZQsz5nOpiyiOUEQoMsC\nIQRhGOG4JUkaU1U1cd0QuTIaclSGgWkq6rrR9VqmTZK5WI7N4eGUdruNZd997bcsC9u2CMMZSpoU\nRYxn2Qy6XebzA9peG8e1CGf7tN1t5kmMUja27RPYDrMwatLBIUmzDFMJXNtEKontBcR5hG2UOMqg\n1jZlXeBio7WmKnOktKgLhVo7R7y7QziZUYzW0JTHsSRqQxN0R1RlSRjPSaXB9vYFOv0BcRRSVRXz\n2Yw0zWi1u7SDDqal2NjYpKoq6romCAJms03KomJjc528yEFIbt3ew/fbvHr5AhoYTyZMpnPoK7qd\nDoZhLBNON5OlYRhIJcmLCseW2G6bsiop8gzLsknTlMUixLItlBLkdQ36Ho3e88cjkblebsvy0d9I\nr6hW6uU5vXJtfeq+YzI/i9TvQ+gPuu5Y2l4h7NMkf/rcav3RdvwZq5L2EUE/Qt3xbLZC5kfP5lhX\nfkTmRvO718aKVK6bCe+oLMRyAhT3SuZnxZR5kN78vmz3ICn8fueen878p2lUKn8OcGik879FI41v\n0KyI26QhfIBbwPmV+7eXdffgg/cPuMIcTcFw3WPUG0GuGK2vY1uKNM1QUlJXNUVVUlUVpulgWkdL\nuSsEAtdzgZo4jSmKgn6vT57nuK6DAeRlQZQkfHL1Kt1OB6Vkk1VnKQHOwwW2oZZudM0ilL3dXdRy\nuXgchcDdRS91XYEhcE0FhqSqGuuKIQS2ZTLsnSOMQ7J2m831C9R1yXSpVqjqZiWkMi3yusZz2/Q7\nDkneBM2q6oosyzBEozOvqwplGpRlEzY3WkxZLObEaUaeZyg0r5/7Ar7XIksWWMIgTmL8fpc4ivAd\nlyRcMNrYQCkLGWwgTCjHh1RVSp6nTGYTtqq8EXqqCuoCv9ul2x8QJwvGkwlKKQadPsPhkA/f/wDK\niiov6AUtaiVI05R+v4fWirKssG2bIPBJkpitrW2yLMP329zu7XDl048I05hXLrzC9tYFpt6MPE9Z\nLBYEQYBS5nLSswGYzxf0BwPSNAOtGY/HmKaJlE1MFiEE/+zb/5zf/f33UGbzO75wPJKaRa+Q+ApW\n1UTHJL68Ttzn+DQxH+/OOHc/kj9Wt5wi5fo+9afJ/ZjEV8ur0rhx8viB9fWp/Yo0zt3u3nVHpCFy\nrVekcn2SxI/8zY/mhvsR+INULSuP957yA3E/wn6+OvP/bLlBoyP/T4B/l8bw+ZeAv7ncf3N5zf8N\n/B/Af0ujXnkd+H/Panj9NYNO7WHkOUHQRno9AtdD65wsSzAMA9drouZpQ2Aqm3YroKoKhGi8QizL\noSxLomiBspqFKHVZUOYZlmU2QZ3yAsOtyMtmBaXW+tgH2jRNZrM5lmURBAE1NVIKOp1OQy6+j207\ngMZ1XbSuUEpRFCVHD7+udeNHnWSkWcbB+JA0TbCDNmmWotHMplN83yfLcg4Px3iew6XLl1kfdWm7\nHsqSjG/+kHC8j65LpPKI8hxTKrIiw3YtMCRZESOkQJkCkPQCB8uxKfMMkcVY7YCyAGV7lEWGsNsE\nLZe81AStASLwEAwwWym7N2/yxS9+hRs3PmJ6sMcgWEMYBtn+PvbaBYRSRFFCrzdASsGd/R2MscTz\nHUyzcUfMy4yiLMiXRmgpDba3LxKGIWmaopTiRz/6EZubm/T6fTrdDmujHkWR0261kbJZASqExrZt\nTNPEsk3KqkRJgyKvcF0X0BhokqRxhTw8PMQ0TcqyxDAMfuonvsGX336D8XifPC/57/7HX32sP8NT\nwyOpejSIU+KfXjl3xIVHBClWRESxcs+R5L563ypZn0Xk8IB7lsS3SsqfdTvxlnFav7EavuCsMIfL\n8vFkcPS9jTP6dJY3y5F0vrKtkvgqmT+KAfSZe7M8qP6z4bP6mR99hf8G+LvAv89d10RoPF7+7nJf\nAv8h9/naVSUQniSva6KiYmT5SGWSFzWmqVFKUFVV4zkiBJ12gOd55HmGZVlNSjU41ptWdfNqnmQp\nWmtsx8FzPfYWeyitcW0HbYjl/6OJW1KVjW/5EbkHVuP7rIXG99dptVrkeUGeZ/R6PbSumgUxSjGZ\nLUizlDxr/LGjuMBzLWohUJZJXVXM5zNc12MyHpMmKVmeUtYJtukx7HcRwiSuNZfXthkMh0z2d9j5\n9AqLcI8iSbFNC2k2ahphOZiWy8bAxpCCNA3p+DaBbYOusFyPrDARVhe7dY6W52PLmixPWW8PKBAY\ndkCtJcXigG5/wP7uLkWeES7mDKhAGEQHM+xhTRD0WVsfEUUxQdDlyiffRSrJcLiGY1tL+0SItCxc\nN6DT7lIUJVEUYhiC4XDE/v4O7XZjavmj9/6Aoip4/dVX2d7a4tNrnzIeH6DkctIta6BsJok0o5Tq\n+BnmiYdlW+R5M5Hbjsnu7g5SSnzf586d29S1Jmj1ONftfsYh/QzwSGR+9AaxSlZL5jhWJ5xmjxVC\nP71/GFGfdXwmoZ8hYZ8pedePcO1pMj8K6Xuq7rQErh8gkZ9+HMePRZxB4vrk28wRZ94vNstTM34+\njJyfDal/FjL/NndDdo1pggydhf9quT0QgeyRJ5pagGE5KNUEV3JtD9Ns/uBH0fGOJLckibFtG6UU\nQRBQVY1eVeuKrMhJshRq8H2/Ua9EIZbRrKZsd9oErRZlVRHNp5idDoEXYDpNrJM0z6iylCzLlkNQ\nE4ZzpJTYts10OqMsM4RhEEcR48NDhGFQ1BU7d3Zw3ICpkrTbbaRq4pKE0RRDKKqqZuf2VdKyxHE8\nhDIIw5D1rU3WhptkpSZLQsoy5e13vkKY5Fz54I+gzprkEqVBVYtG6vYllqFwgjUCUxEWOb5lY7QG\nnL/0Jlpr3nj9DfxWm2QR4gc+ZplhVBnakBiipk5LxtMpeR6zP57xSpGhkWSLMX7bBAFtT3Jx+zz7\n4wMc2+TrX/kav/fd72BZFo7rQV2iq4osLWi32sRxQrvdpaoz+r0+k8mMw/E+W5sXEMIgaLcoy4L3\nP/yQn93cxJQW0+kU23FQpkTKitu375BmCRsbmwyHI9IkYzKZkGZJo36xrUZtXFVUVUVeNLaNwXAN\n23Gw3WfuY/4m8LdXji8D/znw35+46lHULEfQK0R+LMmekqyPCa4+VT6yETyIvFcnBB6N6I/aPIvA\n70f4nCL341eLIwn8YdvyOehVEj+1rerjVx5NQyL1vaQujkj9qCvLe1fdFp+7a+LT05GfxgtbAfqF\nr32ZDz/4kMnBIW3PBMNokjD3+nh+oy81DLAsm7qujklVSklRFLiuS1Ek+C2fLMlo2RZhFGKIxpsj\nCyM21kZo32+i+y3G2JYiTptQsutra1i2gzQVjuNxeHgArkNZFNR1Ta31sb44yzKqqmKxmDEPF8wW\nc0whl7r8GkGNKZv8m0mSLF3xPBaLOYZQHI4P+fSTq7S6LdY3bbq9HmvDPptbF/BcD3RNns6I5gvG\nxYzO8BW2Lr+OQBAv5ly7+jFJVhKlMRZQWxa2YeF12nQ6Af3hBq+//jp1LSiyBNv18fwmxGynN4BO\nD7IURAwYlFpTJBk379xmsoyjQrFgsnsbXRVsAaNhn8P9G7TbLZRSDIcD3im+ykcf/5BuZ0i37SMN\ng+l0glIG3V6Pvf0bhGHIwcEOk8mMujKIOzFJktDrdZlMxriuyze/+U0uX36NOIkpqpyyyrBtG9sJ\naHdGuK0WO7uHDAc9Rmsj0jRjNBogpdnYMLRibeMcldZYlo2lFLquKamxlhPpM8IHwNeWZYPGHvT3\n77nqUSTz1VWP+siDQ5zxKn+aPGua2NhLIterjHN0PQ+oWzl3Tx2cIOzjff2Yx6cl8AdsxyQum/uP\nnenPYNITEjlL90MaIhf1XS8WcUTkK4QO9+rMH2QAfapqllWcNoA+e535M4Nt+pzbPkehCyzps742\nYm19k06nhWM55Hm6NHoq+v016rqmWBKtYTRGwVrXjX3DNAijkDwvsE0Tgcb3HSxTEScJW1sblEXJ\nIo7Y3bvFue1LVLpifXODyWRMHM+pioSy1riex3QyI8tSHMchjo+8K+rmzcFx8YOAuqoJ4whL2ty6\nfR3Ltmg7LrNFiBCC+XzOeDxlMY+4dutTrl67RmfWZ/v8ZXrdPkI1CZE7rYB2p4uSFXYdM7n5Qw5v\nfoLV6oA7xO0oLK9FWdyiLAt01hgCbctESBNp+7iuR1VpsjTH9VzCJKEChqMRwm8jDAucFmCgRYXj\n9Tg8/AFXPrpGVdbcurODZX/I9RvXcRyTIg1JkxDXBPIQ5wAAF8pJREFUaZGWGUmSYEh49bVLjSGS\nCt/3m2BarTbj2ZSvv3KJGzc/JctS9vb2mEzmDPoDvvvu7/P2W+/Q6/VI01sYhiAIAq5cvULbDzBi\nQeUFeOsdBv0Otu1g2zbDTh8hYL5Y0OkOieIQ1zEZdtfJqZDLxAyO7RLGC7Iso+V6p1/InyX+NE3U\nxBv3nHkkMuck6Z4OLqXhhCfJsWpjdatOke+Jhk/uH3Ren65bIecT5RXp/JHKq2R+RoLOEwS+ypir\n6pXVc6vdXHFL1Mu3mrpeEnvdGD5XiRy95Et999yDDKD6jP3q59+DxyHjp+vR8sLIvCxqBq0Nqk2b\nrgi4fPF1Oi0PanBsG6UMsrTxO87znKqqcBznWFLOsox2u0We5yRxSJHmWFJRFwVFlnFxe5s0Tdg6\nd469vT2+/MV3sGybazevc3PnDn4rIE0TxpO9Rh0jHfYO9xgOB5RlRVk2HjSu65KmCVobZFmGFII8\nSrADj0F/yOHBIb1eH9/3KcsKy7KoqqrxrOn3MaRk+9w2QjchA9IsJIwWCNFid3cX3/dJswRbmbQH\na/zovd/mlddeoT0coW1JmgQYqkVdFwgkQsD+/j6j4Rq+32Z78zxSKrK0QAO24yzjlbRRpg3KBGwQ\nFaAR2qBQDr/x7X/KLFzgWYr33v0ON29f5fz2RVqtHkkW83vf/T2+8ZWv4/tNaIL3vvcHaF1x6dJ5\nxuNDwvmctbU1zl+4xM3d2/zgB+/jujaO0wIdk2UZOzt3sB136bdfYJk+RZkxGo24fKFNdzgkK4tl\nRqkWnucSJ8nSzzzk5s3rmJbFm+vvoEyH69euMLNsBoMBlc4xlAJpNT7oZXnsEfOc8G/TGPvvxSOp\nWU4TqT5JUMfcqE+5BK4SedUcnyk6Lvf3JfEHlPVZTLZK0qcNt/pU/aru/yy9+Gli16fOPUQUPhG/\nRtyVyI8WCK3qyauVe8+SzB9G6Pfb7ov7SdyPQtjPT2f+VPHJ9U9o+T6e59P3+3R8n7IoQGvyNMG2\nbUpDUpYlZVEgaBIUKCmbSICBh640WZxQZgVpHEOt8VyX4bltqDXSLEnjhLW1NWzXYjqdUGQp22vr\nzCYz6qIgizNMw6KuK1zXYz4P0Vofe2OYlqQsCzwvaF7z4whDKvKsoMhLer0udV0QJyl5VaOEgec7\nREnaREC0bUaDPt12i7Js0pplSYFr10hRo9FYsgmaZXs9zl36El5/C7vVxrZd4nQPw7bIsoowCpGp\nQkmDOF5gWzZCSLTWhFFIr9dBaE0cRwx6feKDAzzLAdsGLZchQARe0OFP/9m/yPfe+11MU6CUYmN9\nm9FojTRNCVo+3/j6T6BMk6JM+ejj9/HcFr7vIaXBcDAEXbO2tsnHVz5qPFNaPvP5vGlrY30ZgqBg\nNFpjfX0dx3EZDke4rtuonwwDrTUqV7RaAaYyuXHzBmkaMxgMiBYhk/GUr37jxxAVWMrADwL2d/dI\ns4wg8DFNkzxvJnYhBLfu3CSKFs9j+Fo0MYp+8cyzs//ibtn5OXB/7t5rjuyfYlVXLk4SVc1dMj8i\n8aMEwcflkkcm6Ucq34fI7yuu3m9/WjI/InN5qnyazM+SyOW9XTyWyle2WjfPU4iTPvhi5eajbt3P\n8Ln6Nc4i9aeCz0LaV4Crj3TlCyPz69c+pi40a4MuG2+O2D/YwXN9BoMBQatJFiGEwFDq+GctiwLK\nnCovmU0nFHkGNY3u25BsbK4TBI3Xy+2dOwTdDq7lIASMDw+ZLxZ0uz2iKFr6lJfH+vCqqih1kw3H\n8zwMIYnikMlkgmlaTCYTyrJoVo1KRVkmlHVFVdcURcZ4MqXfHyDQYEDQ8rBsxWw6J45jDKMJTZtl\nGWEY4vs+htn8gQ8OD9ncXEcIi/VX3kQbFloqsqWEnxU1u/tzwjCirits22F39w6O6yz93yWLcEG1\njMq4tbXF9HDM1sULaMtFaE2dz8EOltK9QVWXbKytk5cFF86fJwhaS/tETTSfY0lFnqYcTA4QwsBU\nNvv7+wz6feqiwFAWH1/7CM+xSbMItKTT6dBkExIMBmso06TX7QAgpcK2beI4OlaXeZ6HMhubQlEU\nSCnJ8oz3P/g+ptGsNZhPp4TTCXWh8QIfqoqrVz/h+vVrrK2tMRqN8P0Wtm3jum1Gw/MPGnZPCz9P\nk8x5/8yzvb/xPPrwEv+/wOXldoTfuO+VL05nLg2SNMeoTeJ8wY2dW7z1+psoy0BoTbZc/m4azSt6\nmqYkSUxVNZJImmb4vo/X9pmMp03YBUNQlgV37tyhrirqoqQQjX95lqbkecZsPqEsGv17lIQopRrp\n2HWQJcxmc3zPxHEs0iyj3Q5QymJn5zb9/pDbd26TpCllXmDbNlVRUtU1gR9wuL9PVlaYpkm73SbP\n86X0mB+rilzXJc2bmOdxlBIu5rTbHeIoxnEshDKxbZubN2/T6/Uo8pzxbEZeZBiGwDBUs6jGMTFN\nk8lsvDQa+wghuXr1Kptb55iECzapGsm9KhCmQCwlgjhekOULTKXwA58kSdjePk+eZyRJhmmaHEwO\n8b2ATqdLlmaUZUWn06EoS7SGr3/16/z27/8OulYcjKe0Wi22traZTCbEcURZ6sZYu1RVlmWJEBz7\nlsdxzGw2I45jpBTYjkO4CFGGRScYkJUlo/URiyhlMTvAd7tUBjiuQ6/XY/vcBaSSaF03WYqkRJk2\n0nwuWvN/hyYG0Uu8xOcGL4zMt1/bII1rhHZIkoQ8ralerYnjmCxNME2bsiw5OIio6hqBoK4rDKNx\nPex0eiipcDwXaUiSJCbLUrIsZ2trizzPKLKcGzdvYttm82KnFIbR2KeUVli2PNaP7+/vIaXF1uYm\nWZ6TJClVWXHn5l5D9MJujGytFt1en/l0QlFWbKyvYygDgSCMFtzZ3W+W9js2QcsnihqV0WK+wLZt\niqJg984Ovu8hiow4ThgMhhzu7GLZClOZhMtl85PxhIPDw0b9kKS4rodpqsYovFzpWlQ57XYXx7Ea\ntQtgSoXvOgjTB1JAoKvmjcEQjU3iygcfcO78BfqDAUpKZsvMPlIauI7L4LW3ODzYI0lqEIqyKsgW\nIVVVc/HSK7z33Xc5d+4cnuXzxhtvUlca07QQKNKkxPNdHN9bkrhYEnqx9EYqKcsmhMBsNieKIoqy\npNftIqXCsh2KZMHa1ggpJDXQCUZsrg2J0wlRGJGlJYtoiu8H+L7XGE4dnzRNn/XQ9WmMn//Bs/6g\nl/gseGo6kOeAZ9PXF5hpaIAwSrzCbIyejiIOQ2zTxLIU4/EhUZRiWk0uSgGYpkLKpe5cGRha8Mn1\nKwSWR6vlYxhNHJEP3v+AIo+xfQdhaPK8QNlWoxbJ8kbF4dho3azkbLfbBEFAlhTs7x8wmc8Y9fso\nU+K2fCgqdqZjJJqLFy9QlgVBO8C2mljbQeChpMI2Faa0ODw8pNtqoWuNrZrQA912izAKAUFR1/zo\nR9+nriqCbpciT9nb30erRqpMkozaEHzw/Q94/+P3+f733qOoSmzXwpEmRVVRa0mWp3Q6HSazCW0d\n4Dg2tdYkaUR3MKCqElSSo5WFjnNE26NGossFg+EIdM34YBfPayPQKClptQIODvcoq5Jut7fM5SlY\nG40wLZMojJgcThmuryEQFHnKzZtjbMc9tmeM1vpIaSBlk9MzjmO0bsIllGUTrbIsSzzPY21tDc/z\nsKxmIVKapvR6PabTOY5ykKbBzRsLbu/c5uOPBePxmFdfe41oNmc42uDwYMLhYaOm2T/c48KFi896\n6EbA8Fl/yEt8Vjw7/+2nj2fT1xdG5sXhAlFIihKMbqOKiJeZYwzRuBQ6tofnO9iWTbnMpjMY9Miy\njIODMZsba+Rpid/1cRwH23a4evUqpmOTVinhfEGr3SWOEhQCQ5ksspQ0TYmimKrUtFoeSZw2+tko\nYTgcceHSgN2dHS5dusRsOqXOEl7Z3iZOE2azGZZtYhgGwTKcbhhGBEGLoNXGcX183+f6zRu0Wj62\nbdLtDppwsTMbx7LJ64JB1+eDjz7hn//Ot9la2yZeRBwczBoVEDlKWXz68Yfc3rlDu9vCMU3sdoCh\nNZbtYFBx/cY1WpMOrW6HMJxjK5PD8SE7O7sM+j1uXm3CCJiWxcdXPqXf63LpSz9JHh7y41//MZI8\np6obVcxwsE5Z5ORlxqULr2KYZuOxMlxHCEEUR5TzBdPFnLWNDfI4xrIsut0RUknm8zHpkqSLsqTf\n71NrmE2n2LbNeHxIkiRIKWm1WriuRxD4FEVJXddMp1M8z1+mvCtoBT4HB2PQFa4lGa1dwnNsirJk\nMQ8xTZOiaFRXs/mEt956i/5gxHh8+KKG9Eu8xAvFCyPzax/dwfAVnvLoul0KQ1AvrdKub2O7JnVV\n0263qcoaXdcIYRBFEdPpnKqqGE/mnFtfb/TKadIkS6gr6hqi6QJt1BTlAUIIWu0hs9kMpRRJEqNr\nuL23z5f6b6BUY+KO04x+r8t4NqPd7RBGEe1eCyW7eI7L3sGERThFKYFnOXie2/i9WybXbt5gMYt4\n443LnL+4heUobty4jmlKtIZW4LN7e4+tc+vUVYE2+rz9xhuMp1N+63e+w4WLFxiPD7CUotAVs9kO\ng/U1Wv0uZVUgDYP14YgwjAiTkDzTjKcH3Lx+q4lhY0g+eP8j1ocb/MD5Eb1Oh/39XVzPRxoKjeDq\nlQ8ZDHtEsxAEtFwLLQyyoqIoE77z7h/y0z/5Y8TxgnQxJ8tyFrMZRqUpdMVobQPf9Ti4s8Pm1ibT\n6RTHdZGFxrFtrn36KeXSPvC9996l3+8RtNqURcHu7i6vvvoqnueilMWtW7e4evVT3n77LaIoalbt\nZgXf+e4f8ebrl1DKwvYcwmhBELQQVc1k74C9g12iKOFgf8rmuQ3efvtttrfPc+P6dYSCbudzsJz/\nYUi+BfafeEqNvQt89Sm19YfAl59SWx8AX3hKbX2Xh+XQfmTVxfxb0PmTT9ifJYpvgfyZx7jxjL7q\nT4ALT9SdF0bme2FGq85RgYVtWWxdOE+306Hb6aFFRZ436pCiKKiqEqkkVFBVNRsba9y5s0uaJo0O\n2XVwpcP4YJ+6biIctjoetu1S182qzN3dXVqtFr7vU1Ulnuvw/d/4Hd55+y3qumIwGJAVJVmW4nse\n3W6Puq6pdI6tmtRpna7P+kafnZ0dwkWI47o4jsssXLC2NsRUkuFwxHQ6pdNt0e2+w+3btyjLkvls\nTp5lOI6NlB5ZlnF75xaDwYCd/Sn/+r/2M+R5ibJM0rRkMY+I45hWt818Pmc+mXHp0nmiKKEWNMZj\n8QazeUgUxbRaAZPJnLLKORgfMJvP0AKCTpet9Q02traxPUWZZLi+2wTxSmKEIRn1+lDX/LNv/xbf\n+OpbZHlOXWu01tS1pqhKzl+8wCdXPmkSXZgm80VIGIfc/sNb5HnJK5dfAaDQgqDTw3Jctra2KIqC\nyeSQjY0NJpMJURSxWCy4cP4yVWlw5/Yug36H3d0dsjzjn/7mb/Haq+fJo5jZdMz3v/8D1je3cDwb\n07SwAh+v3WXr/CVGgz7j8ZgoilhbW8dQjaH1c4/0Wy/J/DPhUcj8YVi6fs6//Tkg87NwhX9hyVwa\nOXEm6Lo169tbbI22cD0LqSDPK1zXaaLrtduEYUEcxYwGQ8IkQmvBaDQiTVOqqqSKIsZRiG3b6Dqn\nKkss26UoUqbTkG6viyFNlFRUeYZtO8RxRp5lFFnEPE6PM+R4noeQCk2BpsTzfYosxVQmnvKZz6eN\nS51SLMKIPCtR2sA0FIEfcHCwz2hthBA1VXn0XVzm85BWt0NZ1ziui2EYvPH660RJE++lLBv1SV4k\nFHmBpG5UTGbTZ8uSjRtlmSOVwjYFdV3zxisXcb0AqSRxOMEwbOIkwXd9zp3bptvtcnB4SJUXvPf9\n93jr7S+xdeFVqvkYJRXG0leb5dL4Mi+Pjatog8V8gu35fPTxRxjCZbh2jsVsTJyWmLaDHQjWu12q\nqmT7/DZ39nY5f+EiOzdvs7O3gzIEo9GQJEn5zne+w/b2NufPX2C+OGRjc8B4POHdd99jMOwRRiF1\nVXP10xt87atfQ9cVphtg2x6b6xsUecqNG1cp0hQv8MmKFNsx0cLFdBTT+Zyqqh8++F7ijyEepod+\nqo7iT4g/Zjpzv2uRxhVffO1LXD53CW1UTKdNTmglJcRNMocwDFHKJMmmXLl+DddpvFyUqRFGY3Cb\nz+cMBgPCMKQ2JIIm1kVRlIxGG2R5htZQ1JpSSKQwCHwbkGyfv8AsaZJPBGbzedK0msQIUmKaJUo1\n4VbrumY0WmM6a1zxqCFLM6qyJM8Tzm9vEycJlmlS1SWGVeG6NoaUVHXOG2++jlKSoi7RQpOk6TK+\nuslwtEaRl8hM4jpw/dPrDDc3uHPzFmmacvny5cZdU0oMw2Ct32djY53dvTvE8ZyyqvFsn0uvXMZ1\nXWzLwrIsoihiNBiyu7/Dm1/4IoP1LeLxAabtUBQpRqGxLauJKCkNOsMei+mCMFwwn8/QZY4MPTY3\nt7hx4waGWZJUOf1WAFoShjGG0ORa8Mn1m2yMNpHS5cLFixwe7tMfrHHr2nUGwzV+7mf/FFmWYkiB\n4zi8//4HfPmdd/gH/88/5Ke6P81orZmYOq0unfaA+WLO1nqbWTjD8x32oymm6TOdx0S7h5y/cIFO\nt8PIa/TvprOPIf5FMoS9xNPD54WoHwXPpq8vauS/B3zlBX32S/zxx7e5f2asZ41vcTc/7ku8xNPG\nixzbL/ESL/ESL/ESL/ESL/ESL/ESL/ESL/ESL/Fs8GeB94GPuF/UuaeD/5km8fQfrdT1gX8CfAj8\nY2DVKfmvL/v0PvBnnmI/ztNEx/kB8H3gr7ygvjjA79HYK34I/NcvqB/QhMF7F/gHL7APLwpPa/yf\nNb4fF/cbo4+D+42zJ8Hp8fK4+JTG//Jd7pOb+DOgC/w94Ec03/Nfesx23lz252ib8WTP/7lBAh8D\nlwCT5gd/6xl91p+gyQqzOth/GfhPl+VfpMllCvD2si/msm8fc0/iwcfGBncdgQMaB9y3XlBfvOVe\nAb8L/CsvqB9/FfjfaRKA84L68CLwNMf/WeP7cXG/Mfq4OGucPQlOj5fHxVUaweFp4FeBf29ZVkDn\nKbRpAHdoJtfPPX4K+Ecrx7+03J4VLnFysL8PrC/LG8tjaKS/VSnpH/H4M+3D8E2aQE0vsi8e8PvA\nF19AP7aBXwf+Ve5KWp+H3+V54GmP/0s8HTI/jW8Cf+optHM0zt5+gjbOGi+Pi6vA4AnbgIa4rzyF\ndk7jzwC/9bg3P28p5xwn02zdXNY9L6zTvJqy3B8RyNayL8+6X5dopKnfe0F9MWikwV3uvlY/7378\nCvDXuJuegRfQhxeFFz3+HwWXuDtGHxenx9kPn6Cts8bL40LTTAzf4cmiXr5CE8v+f6FZnvo/cfdt\n5Elw/+xVj4DnTeafJ8/+hy0Je9p9DYD/C/gF4HQ6nOfVl5rmdXob+Bkaaed59uPPA3s0usH7rXF4\n3r/L88Tnve8BjR74F4DwCdo5Pc5+7jHbeZTx8lnwL9NMVD8P/Ec0qqrHgQK+DvwPy33Ek2sYjrJX\n/Z+P28DzJvNbnNQHneek5PWssUvzGg+wSTNQzurX9rLuacGkIfK/RfMK+yL7Ao2R5R8C33jO/fhp\n4C/QvO7+GvAnaZ7Ji3wWzxMvevw/CEdj9H/j7hh9UhyNsx97zPvPGi//6xP0585yvw/8feAnHrOd\nm8vt95fHf4+G1J8ED85e9TmEoslofolmJnqWBlC4V6f4y9zVwf4S9xraLJpXqE94eqtjBc0A/JVT\n9c+7L0Pueom4wG/S6EVfxDOBZpXkkQ70RfXheeNpj/9LPB2d+f3G6OPgfuPsSbE6Xh4HHtBaln3g\nt3ky76jfBN5Ylv8G8DefoC2Avw38pSds47nj52ms5R/TGLieFX4NuA3kNHrKv0xjyf51/r927d4G\nQSiMAujtncIBjAvY60I2DuUs2DmEC9BZfBAspOGRvOackuqGXH5z/0/gHlOmd5Lrjjkuqc/OIcv8\n6NYhyyn1f29IzbPu0/Ee5ySpi3NeJ/TK0MNe/Z/7PWbp91ZrHd1irWetfvuyxTGVaUjNL1vvPefU\nm/kryTNta5ZDkk+Whw0AAAAAAAAAAAAAAABA8gUCSawI/1yNXAAAAABJRU5ErkJggg==\n", "text": [ - "" + "" ] } ], @@ -323,7 +334,9 @@ "source": [ "The classifications include various cats -- 282 = tiger cat, 281 = tabby, 283 = persian -- and foxes and other mammals.\n", "\n", - "In this way the fully-connected layers can be extracted as dense features across an image (see `net_full_conv.blobs['fc6'].data` for instance), which is perhaps more useful than the classification map itself." + "In this way the fully-connected layers can be extracted as dense features across an image (see `net_full_conv.blobs['fc6'].data` for instance), which is perhaps more useful than the classification map itself.\n", + "\n", + "Note that this model isn't totally appropriate for sliding-window detection since it was trained for whole-image classification. Nevertheless it can work just fine. Sliding-window training and finetuning can be done by defining a sliding-window ground truth and loss such that a loss map is made for every location and solving as usual. (This is an exercise for the reader.)" ] }, { From fab0c2867594cea4fa7f0c3aafa32704e4e3704e Mon Sep 17 00:00:00 2001 From: alfredtofu Date: Mon, 25 Aug 2014 16:22:52 +0800 Subject: [PATCH 0526/2053] fix bug for resizing images. --- src/caffe/util/io.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 4f200474459..07c0b05ac58 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -74,7 +74,7 @@ bool ReadImageToDatum(const string& filename, const int label, CV_LOAD_IMAGE_GRAYSCALE); if (height > 0 && width > 0) { cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); - cv::resize(cv_img_origin, cv_img, cv::Size(height, width)); + cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); } else { cv_img = cv::imread(filename, cv_read_flag); } From e0c855063ecfad63d1f21c8b276a99e609d41b5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20=C3=87a=C4=9Flayan?= Date: Mon, 25 Aug 2014 15:16:34 +0300 Subject: [PATCH 0527/2053] [docs] Update installation docs to include Fedora - All the instructions mentioned for CentOS/RHEL are also valid for Fedora Linux so add it. - The package name for atlas is atlas-devel not libatlas-devel for CentOS/RHEL/Fedora so fix it. - Add 'sudo' prefix to missing places to be consistent with the rest of the document. - Add instructions for installing python headers in Fedora into the python support section. - Update Linux installation section to reflect Fedora, refactor a bit. --- docs/installation.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 6306f6338e4..1ac6c08b6ca 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -39,7 +39,7 @@ The choice is yours: * [ATLAS](http://math-atlas.sourceforge.net/): free, open source, and so the default for Caffe. + Ubuntu: `sudo apt-get install libatlas-base-dev` - + CentOS/RHEL: `sudo yum install libatlas-devel` + + CentOS/RHEL/Fedora: `sudo yum install atlas-devel` + OS X: already installed as the [Accelerate / vecLib Framework](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man7/Accelerate.7.html). * [Intel MKL](http://software.intel.com/en-us/intel-mkl): commercial and optimized for Intel CPUs, with a free trial and [student](http://software.intel.com/en-us/intel-education-offerings) licenses. 1. Install MKL. @@ -60,7 +60,9 @@ You can install the dependencies with but we highly recommend first installing the [Anaconda](https://store.continuum.io/cshop/anaconda/) Python distribution, which provides most of the necessary packages, as well as the `hdf5` library dependency. -For **Ubuntu**, if you use the default Python you will need to `apt-get install` the `python-dev` package to have the Python headers for building the wrapper. +For **Ubuntu**, if you use the default Python you will need to `sudo apt-get install` the `python-dev` package to have the Python headers for building the wrapper. + +For **Fedora**, if you use the default Python you will need to `sudo yum install` the `python-devel` package to have the Python headers for building the wrapper. For **OS X**, Anaconda is the preferred Python. If you decide against it, please use Homebrew -- but beware of potential linking errors! @@ -82,15 +84,21 @@ On **Ubuntu**, most of the dependencies can be installed with sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev -And on **CentOS / RHEL**, you can install via yum with - - sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel - and for **Ubuntu 14.04** the rest of the dependencies can be installed with sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler -For **Ubuntu 12.04 and CentOS / RHEL** the only exceptions to package installation are the Google flags library, Google logging library, and LMDB. To install these, do: +Keep reading to find out how to manually build and install the Google flags library, Google logging library and LMDB on **Ubuntu 12.04**. + +On **CentOS / RHEL / Fedora**, most of the dependencies can be installed with + + sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel + +The Google flags library, Google logging library and LMDB already made their ways into newer versions of **CentOS / RHEL / Fedora** so it is better to first attempt to install them using `yum` + + sudo yum install gflags-devel glog-devel lmdb + +**Finally** in case you couldn't find those 3 libraries in your distribution's repositories, here are the instructions to follow for manually building and installing them on **Ubuntu 12.04 / CentOS / RHEL / Fedora** # glog wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz From 870f13a3ba0d60a6e8df1c138c1bf8f3f0a35b58 Mon Sep 17 00:00:00 2001 From: alfredtofu Date: Mon, 25 Aug 2014 16:22:52 +0800 Subject: [PATCH 0528/2053] fix bug for resizing images. --- src/caffe/util/io.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index fd7454d4f98..7758557a950 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -72,7 +72,7 @@ bool ReadImageToDatum(const string& filename, const int label, CV_LOAD_IMAGE_GRAYSCALE); if (height > 0 && width > 0) { cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); - cv::resize(cv_img_origin, cv_img, cv::Size(height, width)); + cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); } else { cv_img = cv::imread(filename, cv_read_flag); } From b6161e3469436f5906237ff8aebb0e01bfdd76f8 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 25 Aug 2014 11:59:20 -0700 Subject: [PATCH 0529/2053] 'caffe test' prints all scores and their names --- tools/caffe.cpp | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 77e031ef3c1..5b3ad0b4691 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -136,14 +136,47 @@ int test() { caffe_net.CopyTrainedLayersFrom(FLAGS_weights); LOG(INFO) << "Running for " << FLAGS_iterations << " iterations."; - double test_score = 0; + vector* > bottom_vec; + vector test_score_output_id; + vector test_score; + float loss = 0; for (int i = 0; i < FLAGS_iterations; ++i) { - const vector*>& result = caffe_net.ForwardPrefilled(); - test_score += result[0]->cpu_data()[0]; - LOG(INFO) << "Batch " << i << ", score: " << result[0]->cpu_data()[0]; + float iter_loss; + const vector*>& result = + caffe_net.Forward(bottom_vec, &iter_loss); + loss += iter_loss; + int idx = 0; + for (int j = 0; j < result.size(); ++j) { + const float* result_vec = result[j]->cpu_data(); + for (int k = 0; k < result[j]->count(); ++k, ++idx) { + const float score = result_vec[k]; + if (i == 0) { + test_score.push_back(score); + test_score_output_id.push_back(j); + } else { + test_score[idx] += score; + } + const std::string& output_name = caffe_net.blob_names()[ + caffe_net.output_blob_indices()[j]]; + LOG(INFO) << "Batch " << i << ", " << output_name << " = " << score; + } + } + } + loss /= FLAGS_iterations; + LOG(INFO) << "Loss: " << loss; + for (int i = 0; i < test_score.size(); ++i) { + const std::string& output_name = caffe_net.blob_names()[ + caffe_net.output_blob_indices()[test_score_output_id[i]]]; + const float loss_weight = + caffe_net.blob_loss_weights()[caffe_net.output_blob_indices()[i]]; + std::ostringstream loss_msg_stream; + const float mean_score = test_score[i] / FLAGS_iterations; + if (loss_weight) { + loss_msg_stream << " (* " << loss_weight + << " = " << loss_weight * mean_score << " loss)"; + } + LOG(INFO) << output_name << " = " << mean_score << loss_msg_stream.str(); } - test_score /= FLAGS_iterations; - LOG(INFO) << "Score: " << test_score; return 0; } From 0cc2e94a7f13116757a529ce173b52398cc17c94 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 25 Aug 2014 12:47:50 -0700 Subject: [PATCH 0530/2053] fix memory_used_ by computing after SetUp --- src/caffe/net.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 1ee60bfe5e3..a3e7122c2c4 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -108,6 +108,7 @@ void Net::Init(const NetParameter& in_param) { if (layer->loss(top_id)) { LOG(INFO) << " with loss weight " << layer->loss(top_id); } + memory_used_ += top_vecs_[layer_id][top_id]->count(); } DLOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); const int blobs_lr_size = layer_param.blobs_lr_size(); @@ -374,7 +375,6 @@ void Net::AppendTop(const NetParameter& param, const int layer_id, top_id_vecs_[layer_id].push_back(blob_id); top_vecs_[layer_id].push_back(blob_pointer.get()); } - memory_used_ += blob_pointer->count(); } if (available_blobs) { available_blobs->insert(blob_name); } } From 910db9796d936b40f245ce9a008531da8d38e570 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 25 Aug 2014 16:10:22 -0700 Subject: [PATCH 0531/2053] Add "stable_prod_grad" option (on by default) to ELTWISE layer to compute the eltwise product gradient using a slower but stabler formula. --- include/caffe/common_layers.hpp | 2 ++ src/caffe/layers/eltwise_layer.cpp | 17 ++++++++++++++++- src/caffe/layers/eltwise_layer.cu | 16 +++++++++++++++- src/caffe/proto/caffe.proto | 4 ++++ src/caffe/test/test_eltwise_layer.cpp | 15 ++++++++++++++- 5 files changed, 51 insertions(+), 3 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index ed47dbc2620..1b50e9563ca 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -115,6 +115,8 @@ class EltwiseLayer : public Layer { EltwiseParameter_EltwiseOp op_; vector coeffs_; + + bool stable_prod_grad_; }; /* FlattenLayer diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index ec6a46ff8f5..56a1920e32f 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -35,6 +35,7 @@ void EltwiseLayer::LayerSetUp(const vector*>& bottom, coeffs_[i] = this->layer_param().eltwise_param().coeff(i); } } + stable_prod_grad_ = this->layer_param_.eltwise_param().stable_prod_grad(); } template @@ -73,7 +74,21 @@ void EltwiseLayer::Backward_cpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); switch (op_) { case EltwiseParameter_EltwiseOp_PROD: - caffe_div(count, top_data, bottom_data, bottom_diff); + if (stable_prod_grad_) { + bool initialized = false; + for (int j = 0; j < bottom->size(); ++j) { + if (i == j) { continue; } + if (!initialized) { + caffe_copy(count, (*bottom)[j]->cpu_data(), bottom_diff); + initialized = true; + } else { + caffe_mul(count, (*bottom)[j]->cpu_data(), bottom_diff, + bottom_diff); + } + } + } else { + caffe_div(count, top_data, bottom_data, bottom_diff); + } caffe_mul(count, bottom_diff, top_diff, bottom_diff); break; case EltwiseParameter_EltwiseOp_SUM: diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index 4b38949da09..e005cb91122 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -43,7 +43,21 @@ void EltwiseLayer::Backward_gpu(const vector*>& top, Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); switch (op_) { case EltwiseParameter_EltwiseOp_PROD: - caffe_gpu_div(count, top_data, bottom_data, bottom_diff); + if (stable_prod_grad_) { + bool initialized = false; + for (int j = 0; j < bottom->size(); ++j) { + if (i == j) { continue; } + if (!initialized) { + caffe_copy(count, (*bottom)[j]->gpu_data(), bottom_diff); + initialized = true; + } else { + caffe_gpu_mul(count, (*bottom)[j]->gpu_data(), bottom_diff, + bottom_diff); + } + } + } else { + caffe_gpu_div(count, top_data, bottom_data, bottom_diff); + } caffe_gpu_mul(count, bottom_diff, top_diff, bottom_diff); break; case EltwiseParameter_EltwiseOp_SUM: diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 9c0825284d8..49a6e142fcd 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -420,6 +420,10 @@ message EltwiseParameter { } optional EltwiseOp operation = 1 [default = SUM]; // element-wise operation repeated float coeff = 2; // blob-wise coefficient for SUM operation + + // Whether to use an asymptotically slower (for >2 inputs) but stabler method + // of computing the gradient for the PROD operation. (No effect for SUM op.) + optional bool stable_prod_grad = 3 [default = true]; } // Message that stores parameters used by ThresholdLayer diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index 4c17dfd341c..da5e3538131 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -124,11 +124,24 @@ TYPED_TEST(EltwiseLayerTest, TestSumCoeff) { } } -TYPED_TEST(EltwiseLayerTest, TestProdGradient) { +TYPED_TEST(EltwiseLayerTest, TestStableProdGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); + eltwise_param->set_stable_prod_grad(true); + EltwiseLayer layer(layer_param); + GradientChecker checker(1e-2, 1e-3); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +TYPED_TEST(EltwiseLayerTest, TestUnstableProdGradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); + eltwise_param->set_stable_prod_grad(false); EltwiseLayer layer(layer_param); GradientChecker checker(1e-2, 1e-3); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), From 0063028c8371ceba477f4278041a326eb32d94cc Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 25 Aug 2014 16:12:33 -0700 Subject: [PATCH 0532/2053] remove warning about LRN layers in CPU mode --- examples/cifar10/cifar10_full_solver.prototxt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/examples/cifar10/cifar10_full_solver.prototxt b/examples/cifar10/cifar10_full_solver.prototxt index 49de3f58803..d8e0bb27c44 100644 --- a/examples/cifar10/cifar10_full_solver.prototxt +++ b/examples/cifar10/cifar10_full_solver.prototxt @@ -23,9 +23,4 @@ max_iter: 60000 snapshot: 10000 snapshot_prefix: "cifar10_full" # solver mode: CPU or GPU -# Note: there seems to be a bug with CPU computation in the pooling layers, -# and changing to solver_mode: CPU may result in NaNs on this example. -# If you want to train a variant of this architecture on the -# CPU, try changing the pooling regions from WITHIN_CHANNEL to ACROSS_CHANNELS -# in both cifar_full_train.prototxt and cifar_full_test.prototxt. solver_mode: GPU From 7014bfb976524e95b6e13eb44cf62401568bff1a Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Tue, 26 Aug 2014 00:44:56 -0700 Subject: [PATCH 0533/2053] FIX web_demo upload was not processing grayscale correctly --- examples/web_demo/exifutil.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/web_demo/exifutil.py b/examples/web_demo/exifutil.py index 8c07aa887b2..01918b2a491 100644 --- a/examples/web_demo/exifutil.py +++ b/examples/web_demo/exifutil.py @@ -23,7 +23,13 @@ def open_oriented_im(im_path): if exif is not None and 274 in exif: orientation = exif[274] im = apply_orientation(im, orientation) - return np.asarray(im).astype(np.float32) / 255. + img = np.asarray(im).astype(np.float32) / 255. + if img.ndim == 2: + img = img[:, :, np.newaxis] + img = np.tile(img, (1, 1, 3)) + elif img.shape[2] == 4: + img = img[:, :, :3] + return img def apply_orientation(im, orientation): From 9516115f722fb3f95882553d8077bf1ab4a670ef Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Tue, 26 Aug 2014 00:44:56 -0700 Subject: [PATCH 0534/2053] FIX web_demo upload was not processing grayscale correctly --- examples/web_demo/exifutil.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/examples/web_demo/exifutil.py b/examples/web_demo/exifutil.py index 8c07aa887b2..01918b2a491 100644 --- a/examples/web_demo/exifutil.py +++ b/examples/web_demo/exifutil.py @@ -23,7 +23,13 @@ def open_oriented_im(im_path): if exif is not None and 274 in exif: orientation = exif[274] im = apply_orientation(im, orientation) - return np.asarray(im).astype(np.float32) / 255. + img = np.asarray(im).astype(np.float32) / 255. + if img.ndim == 2: + img = img[:, :, np.newaxis] + img = np.tile(img, (1, 1, 3)) + elif img.shape[2] == 4: + img = img[:, :, :3] + return img def apply_orientation(im, orientation): From f6536b50d2ba1fb69b8f3a61f9079923b282771f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 26 Aug 2014 09:51:19 -0700 Subject: [PATCH 0535/2053] clarify project origin --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 27ca28d2753..67b424ceefd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,7 +4,7 @@ layout: default # Caffe Caffe is a deep learning framework developed with cleanliness, readability, and speed in mind. -It was created by [Yangqing Jia](http://daggerfs.com), and is in active development by the Berkeley Vision and Learning Center ([BVLC](http://bvlc.eecs.berkeley.edu)) and by community contributors. +It was created by [Yangqing Jia](http://daggerfs.com) during his PhD at UC Berkeley, and is in active development by the Berkeley Vision and Learning Center ([BVLC](http://bvlc.eecs.berkeley.edu)) and by community contributors. Caffe is released under the [BSD 2-Clause license](https://github.com/BVLC/caffe/blob/master/LICENSE). Check out our web image classification [demo](http://demo.caffe.berkeleyvision.org)! From 8880a7a4158cf0a80eb9650bd4fe77dffb518177 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Tue, 26 Aug 2014 14:01:20 -0700 Subject: [PATCH 0536/2053] FIX drop obsolete CURAND reset for CUDA 6.5 compatibility Drop the legacy CURAND initialization steps; these are unnecessary and cause dramatic slowdowns for CUDA 6.5. This does no harm for K20 usage counter to the note at least for CUDA 6.5 and 5.0. --- src/caffe/common.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index e6c0a4f56a3..a900d6f0198 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -108,15 +108,11 @@ Caffe::~Caffe() { void Caffe::set_random_seed(const unsigned int seed) { // Curand seed - // Yangqing's note: simply setting the generator seed does not seem to - // work on the tesla K20s, so I wrote the ugly reset thing below. static bool g_curand_availability_logged = false; if (Get().curand_generator_) { - CURAND_CHECK(curandDestroyGenerator(curand_generator())); - CURAND_CHECK(curandCreateGenerator(&Get().curand_generator_, - CURAND_RNG_PSEUDO_DEFAULT)); CURAND_CHECK(curandSetPseudoRandomGeneratorSeed(curand_generator(), seed)); + CURAND_CHECK(curandSetGeneratorOffset(curand_generator(), 0)); } else { if (!g_curand_availability_logged) { LOG(ERROR) << From 4947c91f7353d7aff3d0d08bc0a4ef4e4fbb1212 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 26 Aug 2014 14:32:14 -0700 Subject: [PATCH 0537/2053] default ilsvrc solving to GPU --- examples/imagenet/alexnet_solver.prototxt | 1 + examples/imagenet/imagenet_solver.prototxt | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/imagenet/alexnet_solver.prototxt b/examples/imagenet/alexnet_solver.prototxt index 8581e99c6a7..a3aeae07dc7 100644 --- a/examples/imagenet/alexnet_solver.prototxt +++ b/examples/imagenet/alexnet_solver.prototxt @@ -11,3 +11,4 @@ momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "caffe_alexnet_train" +solver_mode: GPU diff --git a/examples/imagenet/imagenet_solver.prototxt b/examples/imagenet/imagenet_solver.prototxt index aedec4104a6..1ad40fe71e7 100644 --- a/examples/imagenet/imagenet_solver.prototxt +++ b/examples/imagenet/imagenet_solver.prototxt @@ -11,3 +11,4 @@ momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "caffe_imagenet_train" +solver_mode: GPU From c349b3c173838ad841c92602992f404783181b88 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 26 Aug 2014 14:32:14 -0700 Subject: [PATCH 0538/2053] default ilsvrc solving to GPU --- examples/imagenet/alexnet_solver.prototxt | 1 + examples/imagenet/imagenet_solver.prototxt | 1 + 2 files changed, 2 insertions(+) diff --git a/examples/imagenet/alexnet_solver.prototxt b/examples/imagenet/alexnet_solver.prototxt index 8581e99c6a7..a3aeae07dc7 100644 --- a/examples/imagenet/alexnet_solver.prototxt +++ b/examples/imagenet/alexnet_solver.prototxt @@ -11,3 +11,4 @@ momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "caffe_alexnet_train" +solver_mode: GPU diff --git a/examples/imagenet/imagenet_solver.prototxt b/examples/imagenet/imagenet_solver.prototxt index aedec4104a6..1ad40fe71e7 100644 --- a/examples/imagenet/imagenet_solver.prototxt +++ b/examples/imagenet/imagenet_solver.prototxt @@ -11,3 +11,4 @@ momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "caffe_imagenet_train" +solver_mode: GPU From cd40ec5974194f21197621a8f26fd6996be56fcf Mon Sep 17 00:00:00 2001 From: Yangqing Jia Date: Wed, 27 Aug 2014 15:40:14 -0700 Subject: [PATCH 0539/2053] fix layer_factory.cpp bug: there should be no ifdefs --- src/caffe/layer_factory.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index d18d24627a9..1b34702c0c4 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -1,6 +1,3 @@ -#ifndef CAFFE_LAYER_FACTORY_HPP_ -#define CAFFE_LAYER_FACTORY_HPP_ - #include #include "caffe/layer.hpp" @@ -98,5 +95,3 @@ template Layer* GetLayer(const LayerParameter& param); template Layer* GetLayer(const LayerParameter& param); } // namespace caffe - -#endif // CAFFE_LAYER_FACTORY_HPP_ From df7fe6f581d5de66dc5196fef53852eb9f20ff37 Mon Sep 17 00:00:00 2001 From: netheril96 Date: Thu, 28 Aug 2014 11:39:28 +0800 Subject: [PATCH 0540/2053] create_imagenet.sh updated to new syntax --- examples/imagenet/create_imagenet.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/examples/imagenet/create_imagenet.sh b/examples/imagenet/create_imagenet.sh index 24f961bee4c..79cb17c4692 100755 --- a/examples/imagenet/create_imagenet.sh +++ b/examples/imagenet/create_imagenet.sh @@ -36,17 +36,21 @@ fi echo "Creating train leveldb..." GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \ + --resize_height=$RESIZE_HEIGHT \ + --resize_width=$RESIZE_WIDTH \ + --shuffle \ $TRAIN_DATA_ROOT \ $DATA/train.txt \ - ilsvrc12_train_leveldb 1 - $RESIZE_HEIGHT $RESIZE_WIDTH + ilsvrc12_train_leveldb echo "Creating val leveldb..." GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \ + --resize_height=$RESIZE_HEIGHT \ + --resize_width=$RESIZE_WIDTH \ + --shuffle \ $VAL_DATA_ROOT \ $DATA/val.txt \ - ilsvrc12_val_leveldb 1 - $RESIZE_HEIGHT $RESIZE_WIDTH + ilsvrc12_val_leveldb echo "Done." From 6249d3e2c51578821131ef4bc683640f6d3390f8 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Tue, 26 Aug 2014 09:51:19 -0700 Subject: [PATCH 0541/2053] clarify project origin --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index e7a819824de..c86116d9f54 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,7 +4,7 @@ layout: default # Caffe Caffe is a deep learning framework developed with cleanliness, readability, and speed in mind. -It was created by [Yangqing Jia](http://daggerfs.com), and is in active development by the Berkeley Vision and Learning Center ([BVLC](http://bvlc.eecs.berkeley.edu)) and by community contributors. +It was created by [Yangqing Jia](http://daggerfs.com) during his PhD at UC Berkeley, and is in active development by the Berkeley Vision and Learning Center ([BVLC](http://bvlc.eecs.berkeley.edu)) and by community contributors. Caffe is released under the [BSD 2-Clause license](https://github.com/BVLC/caffe/blob/master/LICENSE). Check out our web image classification [demo](http://demo.caffe.berkeleyvision.org)! From c01f07a9362a8726046267fe22ad97fbe5fae5a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20=C3=87a=C4=9Flayan?= Date: Mon, 25 Aug 2014 15:16:34 +0300 Subject: [PATCH 0542/2053] [docs] Update installation docs to include Fedora - All the instructions mentioned for CentOS/RHEL are also valid for Fedora Linux so add it. - The package name for atlas is atlas-devel not libatlas-devel for CentOS/RHEL/Fedora so fix it. - Add 'sudo' prefix to missing places to be consistent with the rest of the document. - Add instructions for installing python headers in Fedora into the python support section. - Update Linux installation section to reflect Fedora, refactor a bit. --- docs/installation.md | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index f9731f8fb7f..b9360a9c631 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -39,7 +39,7 @@ The choice is yours: * [ATLAS](http://math-atlas.sourceforge.net/): free, open source, and so the default for Caffe. + Ubuntu: `sudo apt-get install libatlas-base-dev` - + CentOS/RHEL: `sudo yum install libatlas-devel` + + CentOS/RHEL/Fedora: `sudo yum install atlas-devel` + OS X: already installed as the [Accelerate / vecLib Framework](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man7/Accelerate.7.html). * [Intel MKL](http://software.intel.com/en-us/intel-mkl): commercial and optimized for Intel CPUs, with a free trial and [student](http://software.intel.com/en-us/intel-education-offerings) licenses. 1. Install MKL. @@ -60,7 +60,9 @@ You can install the dependencies with but we highly recommend first installing the [Anaconda](https://store.continuum.io/cshop/anaconda/) Python distribution, which provides most of the necessary packages, as well as the `hdf5` library dependency. -For **Ubuntu**, if you use the default Python you will need to `apt-get install` the `python-dev` package to have the Python headers for building the wrapper. +For **Ubuntu**, if you use the default Python you will need to `sudo apt-get install` the `python-dev` package to have the Python headers for building the wrapper. + +For **Fedora**, if you use the default Python you will need to `sudo yum install` the `python-devel` package to have the Python headers for building the wrapper. For **OS X**, Anaconda is the preferred Python. If you decide against it, please use Homebrew -- but beware of potential linking errors! @@ -82,15 +84,21 @@ On **Ubuntu**, most of the dependencies can be installed with sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev -And on **CentOS / RHEL**, you can install via yum with - - sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel - and for **Ubuntu 14.04** the rest of the dependencies can be installed with sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler -For **Ubuntu 12.04 and CentOS / RHEL** the only exceptions to package installation are the Google flags library, Google logging library, and LMDB. To install these, do: +Keep reading to find out how to manually build and install the Google flags library, Google logging library and LMDB on **Ubuntu 12.04**. + +On **CentOS / RHEL / Fedora**, most of the dependencies can be installed with + + sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel + +The Google flags library, Google logging library and LMDB already made their ways into newer versions of **CentOS / RHEL / Fedora** so it is better to first attempt to install them using `yum` + + sudo yum install gflags-devel glog-devel lmdb + +**Finally** in case you couldn't find those 3 libraries in your distribution's repositories, here are the instructions to follow for manually building and installing them on **Ubuntu 12.04 / CentOS / RHEL / Fedora** # glog wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz From 46cbb649b498bc49cc1fc73aab75ae4c9ba10419 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 28 Aug 2014 19:17:07 +0800 Subject: [PATCH 0543/2053] Replace pthread with boost::thread --- Makefile | 2 +- include/caffe/internal_thread.hpp | 32 +++++++++------------- src/caffe/CMakeLists.txt | 2 +- src/caffe/internal_thread.cpp | 36 +++++++++++++++++++++++++ src/caffe/layers/data_layer.cpp | 4 +-- src/caffe/layers/image_data_layer.cpp | 4 +-- src/caffe/layers/window_data_layer.cpp | 4 +-- src/caffe/test/test_internal_thread.cpp | 23 ++++++++++++++++ 8 files changed, 80 insertions(+), 27 deletions(-) create mode 100644 src/caffe/internal_thread.cpp create mode 100644 src/caffe/test/test_internal_thread.cpp diff --git a/Makefile b/Makefile index 2c3ce5415bd..9c420249887 100644 --- a/Makefile +++ b/Makefile @@ -161,7 +161,7 @@ endif LIBRARIES += \ glog gflags pthread protobuf leveldb snappy \ lmdb \ - boost_system \ + boost_system boost_thread \ hdf5_hl hdf5 \ opencv_core opencv_highgui opencv_imgproc PYTHON_LIBRARIES := boost_python python2.7 diff --git a/include/caffe/internal_thread.hpp b/include/caffe/internal_thread.hpp index bb0f932566d..9989936e519 100644 --- a/include/caffe/internal_thread.hpp +++ b/include/caffe/internal_thread.hpp @@ -1,42 +1,36 @@ #ifndef CAFFE_INTERNAL_THREAD_HPP_ #define CAFFE_INTERNAL_THREAD_HPP_ -#include +#include + +#include "caffe/common.hpp" namespace caffe { /** - * Virutal class encapsulate pthread for use in base class - * The child class will acquire the ability to run a single pthread, + * Virutal class encapsulate boost::thread for use in base class + * The child class will acquire the ability to run a single thread, * by reimplementing the virutal function InternalThreadEntry. */ class InternalThread { public: - InternalThread() {} - virtual ~InternalThread() {} + InternalThread() : thread_(NULL) {} + virtual ~InternalThread(); /** Returns true if the thread was successfully started. **/ - bool StartInternalThread() { - return (pthread_create(&_thread, NULL, InternalThreadEntryFunc, this) == 0); - } + bool StartInternalThread(); /** Will not return until the internal thread has exited. */ - bool WaitForInternalThreadToExit() { - return pthread_join(_thread, NULL); - } + bool WaitForInternalThreadToExit(); + + bool is_started() const { return thread_ != NULL && thread_->joinable(); } protected: /* Implement this method in your subclass with the code you want your thread to run. */ - virtual void InternalThreadEntry() = 0; - - private: - static void * InternalThreadEntryFunc(void * This) { - reinterpret_cast(This)->InternalThreadEntry(); - return NULL; - } + virtual void InternalThreadEntry() {} - pthread_t _thread; + boost::thread* thread_; }; } // namespace caffe diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index ec756bede71..fa30eb5870f 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -57,7 +57,7 @@ find_package(LMDB REQUIRED) include_directories(${LMDB_INCLUDE_DIR}) # Boost -find_package(Boost 1.46 COMPONENTS system REQUIRED) +find_package(Boost 1.46 COMPONENTS system thread REQUIRED) include_directories( ${Boost_INCLUDE_DIR} ) link_directories( ${Boost_LIBRARY_DIRS} ) diff --git a/src/caffe/internal_thread.cpp b/src/caffe/internal_thread.cpp new file mode 100644 index 00000000000..99342090882 --- /dev/null +++ b/src/caffe/internal_thread.cpp @@ -0,0 +1,36 @@ +#include + +#include "caffe/internal_thread.hpp" + +namespace caffe { +using namespace std; + +InternalThread::~InternalThread() { + WaitForInternalThreadToExit(); + if (thread_ != NULL) { + delete thread_; + } +} + +bool InternalThread::StartInternalThread() { + try { + thread_ = new boost::thread(&InternalThread::InternalThreadEntry, this); + } catch (...) { + return false; + } + return true; +} + +/** Will not return until the internal thread has exited. */ +bool InternalThread::WaitForInternalThreadToExit() { + if (is_started()) { + try { + thread_->join(); + } catch (...) { + return false; + } + } + return true; +} + +} // namespace caffe diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 0cc2769bfc9..a09eb34e1cf 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -244,12 +244,12 @@ void DataLayer::CreatePrefetchThread() { data_transformer_.InitRand(); - CHECK(StartInternalThread()) << "Pthread execution failed"; + CHECK(StartInternalThread()) << "Thread execution failed"; } template void DataLayer::JoinPrefetchThread() { - CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed"; + CHECK(!WaitForInternalThreadToExit()) << "Thread joining failed"; } template diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index dc39e694bbb..8810a381f7f 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -159,7 +159,7 @@ void ImageDataLayer::CreatePrefetchThread() { data_transformer_.InitRand(); // Create the thread. - CHECK(StartInternalThread()) << "Pthread execution failed"; + CHECK(StartInternalThread()) << "Thread execution failed"; } template @@ -172,7 +172,7 @@ void ImageDataLayer::ShuffleImages() { template void ImageDataLayer::JoinPrefetchThread() { - CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed"; + CHECK(!WaitForInternalThreadToExit()) << "Thread joining failed"; } template diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index bed03d8e8d2..ebd855d48b7 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -408,12 +408,12 @@ void WindowDataLayer::CreatePrefetchThread() { prefetch_rng_.reset(); } // Create the thread. - CHECK(StartInternalThread()) << "Pthread execution failed."; + CHECK(StartInternalThread()) << "Thread execution failed."; } template void WindowDataLayer::JoinPrefetchThread() { - CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed."; + CHECK(!WaitForInternalThreadToExit()) << "Thread joining failed."; } template diff --git a/src/caffe/test/test_internal_thread.cpp b/src/caffe/test/test_internal_thread.cpp new file mode 100644 index 00000000000..31882b6db1d --- /dev/null +++ b/src/caffe/test/test_internal_thread.cpp @@ -0,0 +1,23 @@ +#include "glog/logging.h" +#include "gtest/gtest.h" + +#include "caffe/internal_thread.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + + +class InternalThreadTest : public ::testing::Test {}; + +TEST_F(InternalThreadTest, TestStartAndExit) { + InternalThread thread; + EXPECT_FALSE(thread.is_started()); + EXPECT_TRUE(thread.StartInternalThread()); + EXPECT_TRUE(thread.is_started()); + EXPECT_TRUE(thread.WaitForInternalThreadToExit()); + EXPECT_FALSE(thread.is_started()); +} + +} // namespace caffe + From 425f69ff5bf8c87c7a52bbee2904e9cf6b22d39e Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 29 Aug 2014 00:05:49 +0800 Subject: [PATCH 0544/2053] Add boost thread in the travis install script --- scripts/travis/travis_install.sh | 2 +- src/caffe/CMakeLists.txt | 9 +++++---- src/caffe/internal_thread.cpp | 3 --- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/scripts/travis/travis_install.sh b/scripts/travis/travis_install.sh index f6a357b5c57..753bae879af 100755 --- a/scripts/travis/travis_install.sh +++ b/scripts/travis/travis_install.sh @@ -6,7 +6,7 @@ sudo apt-get install \ wget git curl \ python-dev python-numpy \ libleveldb-dev libsnappy-dev libopencv-dev \ - libboost-dev libboost-system-dev libboost-python-dev \ + libboost-dev libboost-system-dev libboost-python-dev libboost-thread-dev \ libprotobuf-dev protobuf-compiler \ libatlas-dev libatlas-base-dev \ libhdf5-serial-dev \ diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index fa30eb5870f..139185b52dc 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -99,14 +99,15 @@ if(NOT CPU_ONLY) endif() target_link_libraries(caffe proto - ${GLOG_LIBRARIES} + ${BLAS_LIBRARIES} + ${Boost_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} ${GFLAGS_LIBRARIES} + ${GLOG_LIBRARIES} ${HDF5_LIBRARIES} - ${OpenCV_LIBS} ${LEVELDB_LIBS} ${LMDB_LIBRARIES} - ${BLAS_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT} + ${OpenCV_LIBS} ) #set output directory diff --git a/src/caffe/internal_thread.cpp b/src/caffe/internal_thread.cpp index 99342090882..b89aa2ef061 100644 --- a/src/caffe/internal_thread.cpp +++ b/src/caffe/internal_thread.cpp @@ -1,9 +1,6 @@ -#include - #include "caffe/internal_thread.hpp" namespace caffe { -using namespace std; InternalThread::~InternalThread() { WaitForInternalThreadToExit(); From f2a291c0e92fbde0e1b29d01ffc62b0a35e1fbea Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 29 Aug 2014 00:16:13 +0800 Subject: [PATCH 0545/2053] The return value of WaitForInternalThreadToExit has reversed --- src/caffe/layers/data_layer.cpp | 2 +- src/caffe/layers/image_data_layer.cpp | 2 +- src/caffe/layers/window_data_layer.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index a09eb34e1cf..a815c4a6a16 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -249,7 +249,7 @@ void DataLayer::CreatePrefetchThread() { template void DataLayer::JoinPrefetchThread() { - CHECK(!WaitForInternalThreadToExit()) << "Thread joining failed"; + CHECK(WaitForInternalThreadToExit()) << "Thread joining failed"; } template diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 8810a381f7f..ce8338bc028 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -172,7 +172,7 @@ void ImageDataLayer::ShuffleImages() { template void ImageDataLayer::JoinPrefetchThread() { - CHECK(!WaitForInternalThreadToExit()) << "Thread joining failed"; + CHECK(WaitForInternalThreadToExit()) << "Thread joining failed"; } template diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index ebd855d48b7..82bee0ecd19 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -413,7 +413,7 @@ void WindowDataLayer::CreatePrefetchThread() { template void WindowDataLayer::JoinPrefetchThread() { - CHECK(!WaitForInternalThreadToExit()) << "Thread joining failed."; + CHECK(WaitForInternalThreadToExit()) << "Thread joining failed."; } template From eafe24961d9178ce5a4df4042b7a7a4b8476e524 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 28 Aug 2014 16:12:01 -0700 Subject: [PATCH 0546/2053] ignore caffe generated files and stop ignoring examples - ignore models and snapshots, means, and input databases - excluding exceptions to commits is easier than including exhaustively --- .gitignore | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index d162cb42bb0..07eebe34591 100644 --- a/.gitignore +++ b/.gitignore @@ -47,11 +47,16 @@ python/caffe/proto/ # User's build configuration Makefile.config -# Data and examples are either +# Data and models are either # 1. reference, and not casually committed # 2. custom, and live on their own unless they're deliberated contributed data/* -examples/* +*model +*_iter_* +*.solverstate +*.binaryproto +*leveldb +*lmdb # Generated documentation docs/_site From e79380631f036722c890430eef4eb6ebafb2a477 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 28 Aug 2014 16:34:57 -0700 Subject: [PATCH 0547/2053] set examples paths relative to root --- examples/cifar10/cifar10_full_solver.prototxt | 4 ++-- examples/cifar10/cifar10_full_solver_lr1.prototxt | 4 ++-- examples/cifar10/cifar10_full_solver_lr2.prototxt | 4 ++-- examples/cifar10/cifar10_full_train_test.prototxt | 8 ++++---- examples/cifar10/cifar10_quick_solver.prototxt | 4 ++-- .../cifar10/cifar10_quick_solver_lr1.prototxt | 4 ++-- .../cifar10/cifar10_quick_train_test.prototxt | 8 ++++---- examples/cifar10/convert_cifar_data.cpp | 4 ++-- examples/cifar10/create_cifar10.sh | 13 ++++++------- .../pascal_finetune_solver.prototxt | 14 ++++++++++++++ .../pascal_finetune_train.prototxt | 4 ++-- .../pascal_finetune_val.prototxt | 4 ++-- examples/imagenet/alexnet_solver.prototxt | 4 ++-- examples/imagenet/alexnet_train_val.prototxt | 8 ++++---- examples/imagenet/create_imagenet.sh | 13 +++++++------ examples/imagenet/get_caffe_alexnet_model.sh | 2 +- .../imagenet/get_caffe_rcnn_imagenet_model.sh | 3 ++- .../get_caffe_reference_imagenet_model.sh | 2 +- examples/imagenet/imagenet_solver.prototxt | 4 ++-- examples/imagenet/imagenet_train_val.prototxt | 8 ++++---- examples/imagenet/make_imagenet_mean.sh | 6 ++---- examples/imagenet/resume_training.sh | 8 +++----- examples/imagenet/time_imagenet.sh | 6 +++--- examples/imagenet/train_alexnet.sh | 4 +--- examples/imagenet/train_imagenet.sh | 4 +--- examples/mnist/create_mnist.sh | 15 +++++++++------ examples/mnist/lenet_consolidated_solver.prototxt | 8 ++++---- examples/mnist/lenet_solver.prototxt | 4 ++-- examples/mnist/lenet_train_test.prototxt | 4 ++-- examples/mnist/mnist_autoencoder.prototxt | 4 ++-- examples/mnist/mnist_autoencoder_solver.prototxt | 4 ++-- examples/mnist/train_lenet.sh | 4 +--- examples/mnist/train_lenet_consolidated.sh | 5 ++--- examples/mnist/train_mnist_autoencoder.sh | 6 +++--- .../pascal_finetune_solver.prototxt | 14 -------------- 35 files changed, 104 insertions(+), 111 deletions(-) create mode 100644 examples/finetune_pascal_detection/pascal_finetune_solver.prototxt rename examples/{pascal-finetuning => finetune_pascal_detection}/pascal_finetune_train.prototxt (97%) rename examples/{pascal-finetuning => finetune_pascal_detection}/pascal_finetune_val.prototxt (97%) delete mode 100644 examples/pascal-finetuning/pascal_finetune_solver.prototxt diff --git a/examples/cifar10/cifar10_full_solver.prototxt b/examples/cifar10/cifar10_full_solver.prototxt index d8e0bb27c44..f30b3986142 100644 --- a/examples/cifar10/cifar10_full_solver.prototxt +++ b/examples/cifar10/cifar10_full_solver.prototxt @@ -2,7 +2,7 @@ # then another factor of 10 after 10 more epochs (5000 iters) # The train/test net protocol buffer definition -net: "cifar10_full_train_test.prototxt" +net: "examples/cifar10/cifar10_full_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of CIFAR10, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. @@ -21,6 +21,6 @@ display: 200 max_iter: 60000 # snapshot intermediate results snapshot: 10000 -snapshot_prefix: "cifar10_full" +snapshot_prefix: "examples/cifar10/cifar10_full" # solver mode: CPU or GPU solver_mode: GPU diff --git a/examples/cifar10/cifar10_full_solver_lr1.prototxt b/examples/cifar10/cifar10_full_solver_lr1.prototxt index 746f4fba15a..59bc5721f4c 100644 --- a/examples/cifar10/cifar10_full_solver_lr1.prototxt +++ b/examples/cifar10/cifar10_full_solver_lr1.prototxt @@ -2,7 +2,7 @@ # then another factor of 10 after 10 more epochs (5000 iters) # The train/test net protocol buffer definition -net: "cifar10_full_train_test.prototxt" +net: "examples/cifar10/cifar10_full_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of CIFAR10, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. @@ -21,6 +21,6 @@ display: 200 max_iter: 65000 # snapshot intermediate results snapshot: 5000 -snapshot_prefix: "cifar10_full" +snapshot_prefix: "examples/cifar10/cifar10_full" # solver mode: CPU or GPU solver_mode: GPU diff --git a/examples/cifar10/cifar10_full_solver_lr2.prototxt b/examples/cifar10/cifar10_full_solver_lr2.prototxt index 5a549ffc96d..d4ed5d8e041 100644 --- a/examples/cifar10/cifar10_full_solver_lr2.prototxt +++ b/examples/cifar10/cifar10_full_solver_lr2.prototxt @@ -2,7 +2,7 @@ # then another factor of 10 after 10 more epochs (5000 iters) # The train/test net protocol buffer definition -net: "cifar10_full_train_test.prototxt" +net: "examples/cifar10/cifar10_full_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of CIFAR10, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. @@ -21,6 +21,6 @@ display: 200 max_iter: 70000 # snapshot intermediate results snapshot: 5000 -snapshot_prefix: "cifar10_full" +snapshot_prefix: "examples/cifar10/cifar10_full" # solver mode: CPU or GPU solver_mode: GPU diff --git a/examples/cifar10/cifar10_full_train_test.prototxt b/examples/cifar10/cifar10_full_train_test.prototxt index c01fef46ac0..ffecceb2a39 100644 --- a/examples/cifar10/cifar10_full_train_test.prototxt +++ b/examples/cifar10/cifar10_full_train_test.prototxt @@ -5,10 +5,10 @@ layers { top: "data" top: "label" data_param { - source: "cifar10-leveldb/cifar-train-leveldb" + source: "examples/cifar10/cifar10_train_leveldb" batch_size: 100 transform_param { - mean_file: "mean.binaryproto" + mean_file: "examples/cifar10/mean.binaryproto" } } include: { phase: TRAIN } @@ -19,10 +19,10 @@ layers { top: "data" top: "label" data_param { - source: "cifar10-leveldb/cifar-test-leveldb" + source: "examples/cifar10/cifar10_test_leveldb" batch_size: 100 transform_param { - mean_file: "mean.binaryproto" + mean_file: "examples/cifar10/mean.binaryproto" } } include: { phase: TEST } diff --git a/examples/cifar10/cifar10_quick_solver.prototxt b/examples/cifar10/cifar10_quick_solver.prototxt index cdd0722b3a0..14b4401ba16 100644 --- a/examples/cifar10/cifar10_quick_solver.prototxt +++ b/examples/cifar10/cifar10_quick_solver.prototxt @@ -1,7 +1,7 @@ # reduce the learning rate after 8 epochs (4000 iters) by a factor of 10 # The train/test net protocol buffer definition -net: "cifar10_quick_train_test.prototxt" +net: "examples/cifar10/cifar10_quick_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. @@ -20,6 +20,6 @@ display: 100 max_iter: 4000 # snapshot intermediate results snapshot: 4000 -snapshot_prefix: "cifar10_quick" +snapshot_prefix: "examples/cifar10/cifar10_quick" # solver mode: CPU or GPU solver_mode: GPU diff --git a/examples/cifar10/cifar10_quick_solver_lr1.prototxt b/examples/cifar10/cifar10_quick_solver_lr1.prototxt index 2ed54ad980f..d3af70c05e7 100644 --- a/examples/cifar10/cifar10_quick_solver_lr1.prototxt +++ b/examples/cifar10/cifar10_quick_solver_lr1.prototxt @@ -1,7 +1,7 @@ # reduce the learning rate after 8 epochs (4000 iters) by a factor of 10 # The train/test net protocol buffer definition -net: "cifar10_quick_train_test.prototxt" +net: "examples/cifar10/cifar10_quick_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. @@ -20,6 +20,6 @@ display: 100 max_iter: 5000 # snapshot intermediate results snapshot: 5000 -snapshot_prefix: "cifar10_quick" +snapshot_prefix: "examples/cifar10/cifar10_quick" # solver mode: CPU or GPU solver_mode: GPU diff --git a/examples/cifar10/cifar10_quick_train_test.prototxt b/examples/cifar10/cifar10_quick_train_test.prototxt index 779dacf6758..f708798c71c 100644 --- a/examples/cifar10/cifar10_quick_train_test.prototxt +++ b/examples/cifar10/cifar10_quick_train_test.prototxt @@ -5,10 +5,10 @@ layers { top: "data" top: "label" data_param { - source: "cifar10-leveldb/cifar-train-leveldb" + source: "examples/cifar10/cifar10_train_leveldb" batch_size: 100 transform_param { - mean_file: "mean.binaryproto" + mean_file: "examples/cifar10/mean.binaryproto" } } include: { phase: TRAIN } @@ -19,10 +19,10 @@ layers { top: "data" top: "label" data_param { - source: "cifar10-leveldb/cifar-test-leveldb" + source: "examples/cifar10/cifar10_test_leveldb" batch_size: 100 transform_param { - mean_file: "mean.binaryproto" + mean_file: "examples/cifar10/mean.binaryproto" } } include: { phase: TEST } diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index 2d5589bd30a..90ecb6d9a88 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -48,7 +48,7 @@ void convert_dataset(const string& input_folder, const string& output_folder) { LOG(INFO) << "Writing Training data"; leveldb::DB* train_db; leveldb::Status status; - status = leveldb::DB::Open(options, output_folder + "/cifar-train-leveldb", + status = leveldb::DB::Open(options, output_folder + "/cifar10_train_leveldb", &train_db); CHECK(status.ok()) << "Failed to open leveldb."; for (int fileid = 0; fileid < kCIFARTrainBatches; ++fileid) { @@ -71,7 +71,7 @@ void convert_dataset(const string& input_folder, const string& output_folder) { LOG(INFO) << "Writing Testing data"; leveldb::DB* test_db; - CHECK(leveldb::DB::Open(options, output_folder + "/cifar-test-leveldb", + CHECK(leveldb::DB::Open(options, output_folder + "/cifar10_test_leveldb", &test_db).ok()) << "Failed to open leveldb."; // Open files std::ifstream data_file((input_folder + "/test_batch.bin").c_str(), diff --git a/examples/cifar10/create_cifar10.sh b/examples/cifar10/create_cifar10.sh index 85757f345ef..ad5038e0c3e 100755 --- a/examples/cifar10/create_cifar10.sh +++ b/examples/cifar10/create_cifar10.sh @@ -1,19 +1,18 @@ #!/usr/bin/env sh # This script converts the cifar data into leveldb format. -EXAMPLES=../../build/examples/cifar10 -DATA=../../data/cifar10 -TOOLS=../../build/tools +EXAMPLE=examples/cifar10 +DATA=data/cifar10 echo "Creating leveldb..." -rm -rf cifar10-leveldb -mkdir cifar10-leveldb +rm -rf $EXAMPLE/cifar10_train_leveldb $EXAMPLE/cifar10_test_leveldb -$EXAMPLES/convert_cifar_data.bin $DATA ./cifar10-leveldb +./build/examples/cifar10/convert_cifar_data.bin $DATA $EXAMPLE echo "Computing image mean..." -$TOOLS/compute_image_mean.bin ./cifar10-leveldb/cifar-train-leveldb mean.binaryproto +./build/tools/compute_image_mean $EXAMPLE/cifar10_train_leveldb \ + $EXAMPLE/mean.binaryproto echo "Done." diff --git a/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt b/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt new file mode 100644 index 00000000000..54ba6350448 --- /dev/null +++ b/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt @@ -0,0 +1,14 @@ +train_net: "examples/finetuning_pascal_detection/pascal_finetune_train.prototxt" +test_net: "examples/finetuning_pascal_detection/pascal_finetune_val.prototxt" +test_iter: 100 +test_interval: 1000 +base_lr: 0.001 +lr_policy: "step" +gamma: 0.1 +stepsize: 20000 +display: 20 +max_iter: 100000 +momentum: 0.9 +weight_decay: 0.0005 +snapshot: 10000 +snapshot_prefix: "examples/finetuning_pascal_detection/pascal_det_finetune" diff --git a/examples/pascal-finetuning/pascal_finetune_train.prototxt b/examples/finetune_pascal_detection/pascal_finetune_train.prototxt similarity index 97% rename from examples/pascal-finetuning/pascal_finetune_train.prototxt rename to examples/finetune_pascal_detection/pascal_finetune_train.prototxt index dfc60fe4b8a..ae7ee4ccf88 100644 --- a/examples/pascal-finetuning/pascal_finetune_train.prototxt +++ b/examples/finetune_pascal_detection/pascal_finetune_train.prototxt @@ -5,8 +5,8 @@ layers { top: "data" top: "label" window_data_param { - source: "window_file_2007_trainval.txt" - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + source: "examples/finetune_pascal_detection/window_file_2007_trainval.txt" + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" batch_size: 128 crop_size: 227 mirror: true diff --git a/examples/pascal-finetuning/pascal_finetune_val.prototxt b/examples/finetune_pascal_detection/pascal_finetune_val.prototxt similarity index 97% rename from examples/pascal-finetuning/pascal_finetune_val.prototxt rename to examples/finetune_pascal_detection/pascal_finetune_val.prototxt index 91ded585d85..30dd164c4fa 100644 --- a/examples/pascal-finetuning/pascal_finetune_val.prototxt +++ b/examples/finetune_pascal_detection/pascal_finetune_val.prototxt @@ -5,8 +5,8 @@ layers { top: "data" top: "label" window_data_param { - source: "window_file_2007_test.txt" - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + source: "examples/finetune_pascal_detection/window_file_2007_test.txt" + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" batch_size: 128 crop_size: 227 mirror: true diff --git a/examples/imagenet/alexnet_solver.prototxt b/examples/imagenet/alexnet_solver.prototxt index a3aeae07dc7..94bda7f36a5 100644 --- a/examples/imagenet/alexnet_solver.prototxt +++ b/examples/imagenet/alexnet_solver.prototxt @@ -1,4 +1,4 @@ -net: "alexnet_train_val.prototxt" +net: "examples/imagenet/alexnet_train_val.prototxt" test_iter: 1000 test_interval: 1000 base_lr: 0.01 @@ -10,5 +10,5 @@ max_iter: 450000 momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 -snapshot_prefix: "caffe_alexnet_train" +snapshot_prefix: "examples/imagenet/caffe_alexnet" solver_mode: GPU diff --git a/examples/imagenet/alexnet_train_val.prototxt b/examples/imagenet/alexnet_train_val.prototxt index 8ffdb7a8f69..b0f5815e007 100644 --- a/examples/imagenet/alexnet_train_val.prototxt +++ b/examples/imagenet/alexnet_train_val.prototxt @@ -5,11 +5,11 @@ layers { top: "data" top: "label" data_param { - source: "ilsvrc12_train_leveldb" + source: "examples/imagenet/ilsvrc12_train_leveldb" batch_size: 256 transform_param { crop_size: 227 - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" mirror: true } } @@ -21,11 +21,11 @@ layers { top: "data" top: "label" data_param { - source: "ilsvrc12_val_leveldb" + source: "examples/imagenet/ilsvrc12_val_leveldb" batch_size: 50 transform_param { crop_size: 227 - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" mirror: false } } diff --git a/examples/imagenet/create_imagenet.sh b/examples/imagenet/create_imagenet.sh index 79cb17c4692..a286b8fe74c 100755 --- a/examples/imagenet/create_imagenet.sh +++ b/examples/imagenet/create_imagenet.sh @@ -2,8 +2,9 @@ # Create the imagenet leveldb inputs # N.B. set the path to the imagenet train + val data dirs -TOOLS=../../build/tools -DATA=../../data/ilsvrc12 +EXAMPLE=examples/imagenet +DATA=data/ilsvrc12 +TOOLS=build/tools TRAIN_DATA_ROOT=/path/to/imagenet/train/ VAL_DATA_ROOT=/path/to/imagenet/val/ @@ -35,22 +36,22 @@ fi echo "Creating train leveldb..." -GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \ +GLOG_logtostderr=1 $TOOLS/convert_imageset \ --resize_height=$RESIZE_HEIGHT \ --resize_width=$RESIZE_WIDTH \ --shuffle \ $TRAIN_DATA_ROOT \ $DATA/train.txt \ - ilsvrc12_train_leveldb + $EXAMPLE/ilsvrc12_train_leveldb echo "Creating val leveldb..." -GLOG_logtostderr=1 $TOOLS/convert_imageset.bin \ +GLOG_logtostderr=1 $TOOLS/convert_imageset \ --resize_height=$RESIZE_HEIGHT \ --resize_width=$RESIZE_WIDTH \ --shuffle \ $VAL_DATA_ROOT \ $DATA/val.txt \ - ilsvrc12_val_leveldb + $EXAMPLE/ilsvrc12_val_leveldb echo "Done." diff --git a/examples/imagenet/get_caffe_alexnet_model.sh b/examples/imagenet/get_caffe_alexnet_model.sh index b680a32d1cc..7312ed93070 100755 --- a/examples/imagenet/get_caffe_alexnet_model.sh +++ b/examples/imagenet/get_caffe_alexnet_model.sh @@ -23,6 +23,6 @@ fi echo "Downloading..." -wget http://dl.caffe.berkeleyvision.org/caffe_alexnet_model +wget http://dl.caffe.berkeleyvision.org/$MODEL examples/imagenet/$MODEL echo "Done. Please run this command again to verify that checksum = $CHECKSUM." diff --git a/examples/imagenet/get_caffe_rcnn_imagenet_model.sh b/examples/imagenet/get_caffe_rcnn_imagenet_model.sh index c7f36edcbf0..9a8d0a155a0 100755 --- a/examples/imagenet/get_caffe_rcnn_imagenet_model.sh +++ b/examples/imagenet/get_caffe_rcnn_imagenet_model.sh @@ -23,5 +23,6 @@ fi echo "Downloading..." -wget http://dl.caffe.berkeleyvision.org/$MODEL +wget http://dl.caffe.berkeleyvision.org/$MODEL examples/imagenet/$MODEL + echo "Done. Please run this command again to verify that checksum = $CHECKSUM." diff --git a/examples/imagenet/get_caffe_reference_imagenet_model.sh b/examples/imagenet/get_caffe_reference_imagenet_model.sh index 85007994051..f687ebfa79e 100755 --- a/examples/imagenet/get_caffe_reference_imagenet_model.sh +++ b/examples/imagenet/get_caffe_reference_imagenet_model.sh @@ -23,6 +23,6 @@ fi echo "Downloading..." -wget http://dl.caffe.berkeleyvision.org/$MODEL +wget http://dl.caffe.berkeleyvision.org/$MODEL examples/imagenet/$MODEL echo "Done. Please run this command again to verify that checksum = $CHECKSUM." diff --git a/examples/imagenet/imagenet_solver.prototxt b/examples/imagenet/imagenet_solver.prototxt index 1ad40fe71e7..5b5be4bb8a9 100644 --- a/examples/imagenet/imagenet_solver.prototxt +++ b/examples/imagenet/imagenet_solver.prototxt @@ -1,4 +1,4 @@ -net: "imagenet_train_val.prototxt" +net: "examples/imagenet/imagenet_train_val.prototxt" test_iter: 1000 test_interval: 1000 base_lr: 0.01 @@ -10,5 +10,5 @@ max_iter: 450000 momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 -snapshot_prefix: "caffe_imagenet_train" +snapshot_prefix: "examples/imagenet/caffe_imagenet" solver_mode: GPU diff --git a/examples/imagenet/imagenet_train_val.prototxt b/examples/imagenet/imagenet_train_val.prototxt index 5f9c83949f5..766d546a385 100644 --- a/examples/imagenet/imagenet_train_val.prototxt +++ b/examples/imagenet/imagenet_train_val.prototxt @@ -5,11 +5,11 @@ layers { top: "data" top: "label" data_param { - source: "ilsvrc12_train_leveldb" + source: "examples/imagenet/ilsvrc12_train_leveldb" batch_size: 256 transform_param { crop_size: 227 - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" mirror: true } } @@ -21,11 +21,11 @@ layers { top: "data" top: "label" data_param { - source: "ilsvrc12_val_leveldb" + source: "examples/imagenet/ilsvrc12_val_leveldb" batch_size: 50 transform_param { crop_size: 227 - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" mirror: false } } diff --git a/examples/imagenet/make_imagenet_mean.sh b/examples/imagenet/make_imagenet_mean.sh index f3d69cf2f64..d3d0c9af5d2 100755 --- a/examples/imagenet/make_imagenet_mean.sh +++ b/examples/imagenet/make_imagenet_mean.sh @@ -2,9 +2,7 @@ # Compute the mean image from the imagenet training leveldb # N.B. this is available in data/ilsvrc12 -TOOLS=../../build/tools -DATA=../../data/ilsvrc12 - -$TOOLS/compute_image_mean.bin ilsvrc12_train_leveldb $DATA/imagenet_mean.binaryproto +./build/tools/compute_image_mean examples/imagenet/ilsvrc12_train_leveldb \ + data/ilsvrc12/imagenet_mean.binaryproto echo "Done." diff --git a/examples/imagenet/resume_training.sh b/examples/imagenet/resume_training.sh index 9e00d93c469..3c964b56ffc 100755 --- a/examples/imagenet/resume_training.sh +++ b/examples/imagenet/resume_training.sh @@ -1,9 +1,7 @@ #!/usr/bin/env sh -TOOLS=../../build/tools - -$TOOLS/caffe train\ - --solver=imagenet_solver.prototxt \ - --snapshot=caffe_imagenet_train_10000.solverstate +./build/tools/caffe train \ + --solver=examples/imagenet/imagenet_solver.prototxt \ + --snapshot=examples/imagenet/caffe_imagenet_10000.solverstate echo "Done." diff --git a/examples/imagenet/time_imagenet.sh b/examples/imagenet/time_imagenet.sh index c448b4977ce..3f46e0e0f97 100755 --- a/examples/imagenet/time_imagenet.sh +++ b/examples/imagenet/time_imagenet.sh @@ -1,7 +1,5 @@ #!/usr/bin/env sh -TOOLS=../../build/tools - if [ -z "$1" ]; then echo "Using CPU! To time GPU mode, use:" echo " ./time_imagenet.sh " @@ -12,6 +10,8 @@ else GPU="--gpu=$1" fi -$TOOLS/caffe time --model=imagenet_train_val.prototxt ${GPU} +./build/tools/caffe time \ + --model=examples/imagenet/imagenet_train_val.prototxt \ + ${GPU} echo "Done." diff --git a/examples/imagenet/train_alexnet.sh b/examples/imagenet/train_alexnet.sh index 6a7c0577413..1ddcbeee4b0 100755 --- a/examples/imagenet/train_alexnet.sh +++ b/examples/imagenet/train_alexnet.sh @@ -1,7 +1,5 @@ #!/usr/bin/env sh -TOOLS=../../build/tools - -$TOOLS/caffe train --solver=alexnet_solver.prototxt +./build/tools/caffe train --solver=examples/imagenet/alexnet_solver.prototxt echo "Done." diff --git a/examples/imagenet/train_imagenet.sh b/examples/imagenet/train_imagenet.sh index 008b96c01a1..cba2ad59581 100755 --- a/examples/imagenet/train_imagenet.sh +++ b/examples/imagenet/train_imagenet.sh @@ -1,7 +1,5 @@ #!/usr/bin/env sh -TOOLS=../../build/tools - -$TOOLS/caffe train --solver=imagenet_solver.prototxt +./build/tools/caffe train --solver=examples/imagenet/imagenet_solver.prototxt echo "Done." diff --git a/examples/mnist/create_mnist.sh b/examples/mnist/create_mnist.sh index ae75bec2ab2..ed6e36903c2 100755 --- a/examples/mnist/create_mnist.sh +++ b/examples/mnist/create_mnist.sh @@ -1,15 +1,18 @@ #!/usr/bin/env sh # This script converts the mnist data into leveldb format. -EXAMPLES=../../build/examples/mnist -DATA=../../data/mnist +EXAMPLE=examples/mnist +DATA=data/mnist +BUILD=build/examples/mnist echo "Creating leveldb..." -rm -rf mnist-train-leveldb -rm -rf mnist-test-leveldb +rm -rf mnist_train_leveldb +rm -rf mnist_test_leveldb -$EXAMPLES/convert_mnist_data.bin $DATA/train-images-idx3-ubyte $DATA/train-labels-idx1-ubyte mnist-train-leveldb -$EXAMPLES/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte $DATA/t10k-labels-idx1-ubyte mnist-test-leveldb +$BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \ + $DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_leveldb +$BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \ + $DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_leveldb echo "Done." diff --git a/examples/mnist/lenet_consolidated_solver.prototxt b/examples/mnist/lenet_consolidated_solver.prototxt index 2e69589c67f..8ff593f2781 100644 --- a/examples/mnist/lenet_consolidated_solver.prototxt +++ b/examples/mnist/lenet_consolidated_solver.prototxt @@ -22,7 +22,7 @@ display: 100 max_iter: 10000 # snapshot intermediate results snapshot: 5000 -snapshot_prefix: "lenet" +snapshot_prefix: "examples/mnist/lenet" # Set a random_seed for repeatable results. # (For results that vary due to random initialization, comment out the below # line, or set to a negative integer -- e.g. "random_seed: -1") @@ -50,7 +50,7 @@ net_param { top: "data" top: "label" data_param { - source: "mnist-train-leveldb" + source: "examples/mnist/mnist_train_leveldb" batch_size: 64 transform_param { scale: 0.00390625 @@ -64,7 +64,7 @@ net_param { top: "data" top: "label" data_param { - source: "mnist-test-leveldb" + source: "examples/mnist/mnist_test_leveldb" batch_size: 100 transform_param { scale: 0.00390625 @@ -81,7 +81,7 @@ net_param { top: "data" top: "label" data_param { - source: "mnist-train-leveldb" + source: "examples/mnist/mnist_train_leveldb" batch_size: 100 transform_param { scale: 0.00390625 diff --git a/examples/mnist/lenet_solver.prototxt b/examples/mnist/lenet_solver.prototxt index a3b33090472..2dfbc834f41 100644 --- a/examples/mnist/lenet_solver.prototxt +++ b/examples/mnist/lenet_solver.prototxt @@ -1,5 +1,5 @@ # The train/test net protocol buffer definition -net: "lenet_train_test.prototxt" +net: "examples/mnist/lenet_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. @@ -20,6 +20,6 @@ display: 100 max_iter: 10000 # snapshot intermediate results snapshot: 5000 -snapshot_prefix: "lenet" +snapshot_prefix: "examples/mnist/lenet" # solver mode: CPU or GPU solver_mode: GPU diff --git a/examples/mnist/lenet_train_test.prototxt b/examples/mnist/lenet_train_test.prototxt index 578641d5b2d..8369af1daa0 100644 --- a/examples/mnist/lenet_train_test.prototxt +++ b/examples/mnist/lenet_train_test.prototxt @@ -5,7 +5,7 @@ layers { top: "data" top: "label" data_param { - source: "mnist-train-leveldb" + source: "examples/mnist/mnist_train_leveldb" batch_size: 64 transform_param { scale: 0.00390625 @@ -19,7 +19,7 @@ layers { top: "data" top: "label" data_param { - source: "mnist-test-leveldb" + source: "examples/mnist/mnist_test_leveldb" batch_size: 100 transform_param { scale: 0.00390625 diff --git a/examples/mnist/mnist_autoencoder.prototxt b/examples/mnist/mnist_autoencoder.prototxt index 3af6b7afcb3..d0abc685f0b 100644 --- a/examples/mnist/mnist_autoencoder.prototxt +++ b/examples/mnist/mnist_autoencoder.prototxt @@ -4,7 +4,7 @@ layers { name: "data" type: DATA data_param { - source: "mnist-train-leveldb" + source: "examples/mnist/mnist_train_leveldb" batch_size: 100 transform_param { scale: 0.0039215684 @@ -17,7 +17,7 @@ layers { name: "data" type: DATA data_param { - source: "mnist-test-leveldb" + source: "examples/mnist/mnist_test_leveldb" batch_size: 100 transform_param { scale: 0.0039215684 diff --git a/examples/mnist/mnist_autoencoder_solver.prototxt b/examples/mnist/mnist_autoencoder_solver.prototxt index ae1ddebccd2..af1202fc1fd 100644 --- a/examples/mnist/mnist_autoencoder_solver.prototxt +++ b/examples/mnist/mnist_autoencoder_solver.prototxt @@ -1,4 +1,4 @@ -net: "mnist_autoencoder.prototxt" +net: "examples/mnist/mnist_autoencoder.prototxt" test_iter: 50 test_interval: 100 test_compute_loss: true @@ -8,7 +8,7 @@ display: 20 max_iter: 4000000 weight_decay: 0.0005 snapshot: 10000 -snapshot_prefix: "mnist_autoencoder_train" +snapshot_prefix: "examples/mnist/mnist_autoencoder" momentum: 0.9 # solver mode: CPU or GPU solver_mode: GPU diff --git a/examples/mnist/train_lenet.sh b/examples/mnist/train_lenet.sh index b93e48fb629..1b6bf7d978d 100755 --- a/examples/mnist/train_lenet.sh +++ b/examples/mnist/train_lenet.sh @@ -1,5 +1,3 @@ #!/usr/bin/env sh -TOOLS=../../build/tools - -$TOOLS/caffe train --solver=lenet_solver.prototxt +./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt diff --git a/examples/mnist/train_lenet_consolidated.sh b/examples/mnist/train_lenet_consolidated.sh index 83fe895ba0b..c855467897e 100755 --- a/examples/mnist/train_lenet_consolidated.sh +++ b/examples/mnist/train_lenet_consolidated.sh @@ -1,5 +1,4 @@ #!/usr/bin/env sh -TOOLS=../../build/tools - -$TOOLS/caffe train --solver=lenet_consolidated_solver.prototxt +./build/tools/caffe train \ + --solver=examples/mnist/lenet_consolidated_solver.prototxt diff --git a/examples/mnist/train_mnist_autoencoder.sh b/examples/mnist/train_mnist_autoencoder.sh index 628c74b969a..cfd67e82fda 100755 --- a/examples/mnist/train_mnist_autoencoder.sh +++ b/examples/mnist/train_mnist_autoencoder.sh @@ -1,4 +1,4 @@ -#!/bin/bash -TOOLS=../../build/tools +#!/usr/bin/env sh -$TOOLS/caffe.bin train --solver=mnist_autoencoder_solver.prototxt +./build/tools/caffe train \ + --solver=examples/mnist/mnist_autoencoder_solver.prototxt diff --git a/examples/pascal-finetuning/pascal_finetune_solver.prototxt b/examples/pascal-finetuning/pascal_finetune_solver.prototxt deleted file mode 100644 index f2b80111e2f..00000000000 --- a/examples/pascal-finetuning/pascal_finetune_solver.prototxt +++ /dev/null @@ -1,14 +0,0 @@ -train_net: "pascal_finetune_train.prototxt" -test_net: "pascal_finetune_val.prototxt" -test_iter: 100 -test_interval: 1000 -base_lr: 0.001 -lr_policy: "step" -gamma: 0.1 -stepsize: 20000 -display: 20 -max_iter: 100000 -momentum: 0.9 -weight_decay: 0.0005 -snapshot: 10000 -snapshot_prefix: "pascal_finetune_train" From 400411bf4893c97ca5371c26ecdaccc278fcf3a4 Mon Sep 17 00:00:00 2001 From: Sergey Karayev Date: Fri, 22 Aug 2014 19:30:07 -0700 Subject: [PATCH 0548/2053] [example] finetuning CaffeNet on Flickr Style data --- .../assemble_data.py | 89 +++++ .../flickr_style.csv.gz | Bin 0 -> 2178982 bytes .../models/.gitignore | 0 examples/finetuning_on_flickr_style/readme.md | 100 +++++ .../solver.prototxt | 15 + .../train_val.prototxt | 349 ++++++++++++++++++ 6 files changed, 553 insertions(+) create mode 100644 examples/finetuning_on_flickr_style/assemble_data.py create mode 100644 examples/finetuning_on_flickr_style/flickr_style.csv.gz create mode 100644 examples/finetuning_on_flickr_style/models/.gitignore create mode 100644 examples/finetuning_on_flickr_style/readme.md create mode 100644 examples/finetuning_on_flickr_style/solver.prototxt create mode 100644 examples/finetuning_on_flickr_style/train_val.prototxt diff --git a/examples/finetuning_on_flickr_style/assemble_data.py b/examples/finetuning_on_flickr_style/assemble_data.py new file mode 100644 index 00000000000..d8770e92914 --- /dev/null +++ b/examples/finetuning_on_flickr_style/assemble_data.py @@ -0,0 +1,89 @@ +""" +Form a subset of the Flickr Style data, download images to dirname, and write +Caffe ImagesDataLayer training file. +""" +import os +import urllib +import hashlib +import argparse +import numpy as np +import pandas as pd +import multiprocessing + +# Flickr returns a special image if the request is unavailable. +MISSING_IMAGE_SHA1 = '6a92790b1c2a301c6e7ddef645dca1f53ea97ac2' + +example_dirname = os.path.abspath(os.path.dirname(__file__)) +caffe_dirname = os.path.abspath(os.path.join(example_dirname, '../..')) +training_dirname = os.path.join(caffe_dirname, 'data/flickr_style') + + +def download_image(args_tuple): + "For use with multiprocessing map. Returns filename on fail." + try: + url, filename = args_tuple + if not os.path.exists(filename): + urllib.urlretrieve(url, filename) + with open(filename) as f: + assert hashlib.sha1(f.read()).hexdigest() != MISSING_IMAGE_SHA1 + return True + except KeyboardInterrupt: + raise Exception() # multiprocessing doesn't catch keyboard exceptions + except: + return False + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='Download a subset of Flickr Style to a directory') + parser.add_argument( + '-s', '--seed', type=int, default=0, + help="random seed") + parser.add_argument( + '-i', '--images', type=int, default=-1, + help="number of images to use (-1 for all [default])", + ) + parser.add_argument( + '-w', '--workers', type=int, default=-1, + help="num workers used to download images. -x uses (all - x) cores [-1 default]." + ) + + args = parser.parse_args() + np.random.seed(args.seed) + + # Read data, shuffle order, and subsample. + csv_filename = os.path.join(example_dirname, 'flickr_style.csv.gz') + df = pd.read_csv(csv_filename, index_col=0, compression='gzip') + df = df.iloc[np.random.permutation(df.shape[0])] + if args.images > 0 and args.images < df.shape[0]: + df = df.iloc[:args.images] + + # Make directory for images and get local filenames. + if training_dirname is None: + training_dirname = os.path.join(caffe_dirname, 'data/flickr_style') + images_dirname = os.path.join(training_dirname, 'images') + if not os.path.exists(images_dirname): + os.makedirs(images_dirname) + df['image_filename'] = [ + os.path.join(images_dirname, _.split('/')[-1]) for _ in df['image_url'] + ] + + # Download images. + num_workers = args.workers + if num_workers <= 0: + num_workers = multiprocessing.cpu_count() + num_workers + print('Downloading {} images with {} workers...'.format( + df.shape[0], num_workers)) + pool = multiprocessing.Pool(processes=num_workers) + map_args = zip(df['image_url'], df['image_filename']) + results = pool.map(download_image, map_args) + + # Only keep rows with valid images, and write out training file lists. + df = df[results] + for split in ['train', 'test']: + split_df = df[df['_split'] == split] + filename = os.path.join(training_dirname, '{}.txt'.format(split)) + split_df[['image_filename', 'label']].to_csv( + filename, sep=' ', header=None, index=None) + print('Writing train/val for {} successfully downloaded images.'.format( + df.shape[0])) diff --git a/examples/finetuning_on_flickr_style/flickr_style.csv.gz b/examples/finetuning_on_flickr_style/flickr_style.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..5a84f88a05871ac7bdb7be4cc33fcd4cb53fc939 GIT binary patch literal 2178982 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

    }D|fOLT)-%S7F>u?h?YJ= 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

    m5G8v7= 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

    GaS=A2NN4V0bYO+N?H~ze@)6sqZ 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

    FC$z12&~p*epVu>GIV+GJzv%KO@l zO#`KCNtZ~KNr$;`Ta|UZ1`W-!**zvErqQLQzSlVYQ>w>!EQKB%{4#3-^6+!A9=1Cr ztDYLy6|wOtHoxHU_(+5zt|V$rod>y}p7CrLAIL_&^tbNU?TNlS`W+&YZlE_Oam!cx$A5%a-iT0qF180*pImv! zsw1_}2em8x#PtFZrOW9?jRWc>Q02RDPZO0tCYTnMVngOQQA@XhhPt4$uO&`>L-#Uv zL&Yga{^lYBt#15T6wP6vYH&Q>ok=G|0J5zTHDUtMmv}%6v$?)DWygl0s@<@+;!1pR)5$62`H)QjH!xm;@WY!N7NR!`Rx_LNPt|2=-#H-62re)tLY-tTEfc#+H!BVFn~;yKfJGnA z(TnhIc$aLL3C~*60akhrnITtGOdfZS?{a*~&Pm%#Alg7eO$*IA%QN-trVL2SlQcGS zrn*q<13w}`i!Dukd*WiyxC)0?l-NRxmnQ~#W`M%fJ+fo{Q02MZ2V-+{F*gS_J!dcO zE8>mb`gL<}E+I?%RD4KS7yi`7h+$i$^3n6{-=7n(OOZNmZyZ8aG`v*&S}^4v%(&IK ze@fx)wVghb5rab`wZ}o1$&J=s0_PXA%ri*D@y}9B z$_$V%$P$d!oSLFz&uzx*9m^^SJ#Y715}U|y>O)b~RZhfL=h7)ML-~)Y&KpGtXnn%~ z2oRu^8bd1CI#^_3%QQLdUD!^C2zB2-#$dt@f*;3L>ef@AjE{%193{)Xtj z^mgUUr=>1Dw$z`=$UV~KlqSbe`8!3{bjc`2YWz2g7iI5|`B-!S*R|1abreyFt`+4~ z;0OHOt_q*%@BVJc1Vwa@R>zzBVZB}`EdV*qs)6&J@z!H)N~l@A^X>k)gokDEdecPt zFVXJ}Z=uH)z&!Tz78vDsp)XRq>;1(Jb^Gu9dvGII<+aiMF=vChS7ExFJ3iX?w+%%~ z!GB6iQaG@wTCEsH*dSMX(ckyY5%X#lHHHI&n+tN&3<-&)cubn>lp5gd%|G>m_!L-Lsk*6rWapjy^Y>zCcJbN<}(*j;*e%|EgJ57NE+r8lvA^%^t`I9Ij@ zBV$ZZ&IAwD>9HfvEEqX z>M3N0Eb&=An|ZcZ7sMc}eiGu&WlSoYoxw0d*^{kSMuc_s!_=``?wuU^z63QFU)z1=D$#E|WX^U-R_psx!{% zW*SVg_N498r?Lqs-wIyTrOW)m#*=5PcoDhq!b^q2rSBju^M^xwl6CUnney+ z#3!qdZhY7zNL@2{ycxgwPa*LnUz;yA#Ryc$!Xl_$KesM-40#bwJ7x8aJPz2xuObe{ ziY7Jqg!DcvXf=Q<)zbnBJv-O1@c zc)@s1yq9vb_Ue@*5c%VGs+YuTacnO!WC^vfu`cf`)>$EU|2}JTBhUAxh4BxIaHLi& zOc`l4CNiz)1Klc;4UXPrtS-HcpS;RSEvq+5#mF_E-md+MawfLzhE=LndwuL;9~rqo zvzvQYKIZ`eZH>JHC*?vF+MiL9dn!(ajP>Rv{e2E8^$$<)wbPgsg4T&i6tv)Gcx{g) zvA0*P65PMNyGG4~-D5|U{Nho})p@pOg}f{A!Zq5XI_>NbYxd&?}JG%q#9j@ckxCF8`rNptE) zQ}w{gSS`re!*VAv9Y0njRT9W_{dak=77g^ z3y5IETf@t~y{A#d(7r7Pb=xU-OiT7azf!7jDJAz68_r21e?)B{+tbrlrHi6eovP=4 zn7T3z$aV3)%skwz{d$QH6XC-|hDc_`Oh8&}K{HtZxpP2WGY{O8VvuumVqYnu4_@`~ zoNr57%&$p=w?zoYHh5AooS^&TzYSV}rxBl40KlS7Vjp@B`5SwPPYR% z9A%5XZS$_$kN=)>I|E_32h)=q@*UmO_85|hT8@Y>dp9g3E2-DEsFIyNw}`ukzM3MX zJJ7`Ec0?amyTdM(%uW;&Z@XpxdVyG7{wN=`EGR;36FOl^8 z05)kt=EEHH{*i1U&^;o3%^)^WX`+F_+;Z(>Oyr;W=gX{nG|-Hwg9ILZ)^x5+5uk(c zD~eLt{Snti)=D;7%@UkIu2 z46{8%!eUyl$X%Vkur}jesdLJ6dEBCEFLC52A8Pqa)1z;pF|3`f9Q)oLZ?r@)9N{2y zcY{U%+Pas<=Exjw`0vdV@FlrrDHoZ$Un#Zb=6*Tz(C^$ocex-6Hl;Ochcf-GDjL2_ z9>KX9W;lTIt&$$0B}<W?3*i?CoCBz^CQr?fRYH;IcX$%E|*@q7cn#GpUSUP9r0a zNTFp42p=*%WTqYh2OLU^MNwumJjZ16pfl-wK%%Rq>7c+kQZmj=KzZ6=2>WmNv+pxQ zpJvTyo4cWkFx!RNV4>wI7EH~%4yJ^MmO+XyuOKPnMR_?rgh$B}Pi8*fj&eWm6bEze zC1Ssm-WDSRSA>Nux`J4pY9!G-CpZ5@JV0p(ov5cAZ=FP#MeD+_v}*ag39zF(smHg7 zr}-%M6)gonV+u87!o+nLKMP-?mE4%9ZfQu65%z$@R?{&kyf!obdIhptrLTST0Fl#O z3}gZPEkiQnbGlP9@}o~DH<#zmx!}A6(TB_b zJ*Q*r&RnksFn*x-vz!T5F4}ik9O0=)P z-l~f`^e8_95|AaQc!DcqDmY_|=&pTgq@g!u;+cE2QPm>5;O1bT2fG9p*E0K}v(Z=r ztm7%8G$ZU{%qtIR6PP>y?E%;Pd@(f6DGp<=@TCu|Txvwpa7V#B)1@k-A{qvk=Zpv( zil9$IQ#brF`Lj6p*w=KL!L%=fyyPDFl7ZB*UT!u?b4zE;RBH~Ij7!y@4bqnHN@FPq zg$`-K$M9+Hg`p`Tc76@W&dsMS+-``42SMD!X;lTK?eHG_@^2|&k-y^5(>Ooaop?8A zH@_H;%)vfW{VR@928-(vwHY0}Pz}1|*wi*Ry3FVF-&C!R1TpBFPqlZp8_cfjMqVcW zcFR72P*tzI!NF)1iQpU2ik+3F9cwVL2*`xSQ@=n3FFdm1*ikO^TzCvTPF8le_Q|y+ zB1jwks`_vr=C>WChc`HQcJ*t`{V2>QD7A&d#M+@Z+t`{>ZQ2f5#{~iCC$0CKIqb(QDM=&@Sl@o zs)u_@x8WL-3SHdl+DCSNB;o7U_Kv7k4)4u>K!aI{wp+-TMMpE24)P~>a4`}lOV-DS zSMkqDkr5Wq-sg**P!A~>(!!^Gs%=rzyGnR8xqvhniU;|RKgMPgWjNyuOA(0InJJfB zxi@k|>EQ543aFElR6nZRnenJr2&W_$mk~+!!Uj{`rhl67ST+gsJd_duek`O?{KThx1OWZ`^aUmI$O&tqpUoiMlvQYkOKq)kQDQTwG8!BHNQQW>E>eNuFUn%~YM8zlr2|Vr z2}`>~`qRHJ)tO?*>iNk1eCf36Pe5T)_7B{(4Ql8L}12w;59%OIA7IS0RdP zPdOd_EMiX?qkw2DH7{MS;O_#;JS0WV*fWkCc&(=GgNr$k1dm>+j&IS8Xllk&aWXp@ zAi_s;J`I8oZXiBLJUZKy)YehVP{RTNfrdyvg!FP7%apjwi z*#F92`MGqvOwYjLFX8MK85KD5?Te8E=k=`?TOkJ;HKS^*SuuB6M~ckQg~M%+-yu5( zDc#8X-BjA+c=HB5omRyO<`|6&x*pg0cspfN*!|!R^=?OAxR;z089`jYfv4omBNoO9 zi@f}#+VmP?kXmi}r_OSf#sYMNYT(tuFW2@swvkR|B#a|PFrp4#M54>zD*xSt5dj3? zm7gLFrs74an{nBZgY;cc!$5-~?VaUDQzpWFa`zeYybZ!quQ=dEtLyrD%8SgT;e*7p zoKG<`GHyIblEAvxolI()33RkLTYU-~9eM*q>X)CmJU*ch;8pTz3FF1NuFwhGSG1xz z#vI;FzH;?a|6PB9gU=Vs$Q#R*sfg?lZLGZ~B@@UW_c^;)4)n;fnsJ;iGUi#R%g1q9 zOx#|bn(!p3kIDn_{i0#Lh&)#+(K-ArsJP&DF1U)4yCQ#^24}m4Gewye!-Ni?Qe3{_ z$~mynA`G^B+qhcQVBuzw%lrjUI*64TcK&^TSMc@Ysprl>mhyQe-O+WwvfKztaywL( zxK&|_fNkv_4vv6R>W`+}+(-*%pbHPM`zp;}7_RBleOY3b`4&-y)co{)(eZ5YDhp&; z5zmy}9ElCdtHn*EVcWI`6&m_^DeBInFOzfS)z)9dsvh*0uK){2YLP0={(SuK3Zz;~ zT}9lfswZcxd(H^rNhxMVx>T`O_ajdrXyA;D2Z+B{Ad1J6k~*sAchn~noPMo7o|{yxmL-H+1sQa8@zBg>VS5L$LBcDy+wiVr%ng4r}~v_~*V{nNPgZY?eb#-C{sbp^l5 zMHQ;R(Vc!KVpian5AaWzdg=6}H~UZ}(5N}%g07=#RO49wC@o-@o)pUoyIaM5D20%( zWhhM_B7I*yJT4oo-xBCi8r`{pdkU;iyz&ZU6E{oC+EprZ-Z=;x+xd|>BlN3_FNw7cD2wJOI`CK3B{ zy4#mvYCh-7AO-=EV3;a)_$))64;tN|9@fr~lRcjE>BpSWSB3iiTT^@4&G;@Ik%hNX zFB+Z42kwSUOWOel#z3#14eim?$EWdE(56m0**jjSsuHn;ON8UUbc?g6KAF-|mBM|< zUA3m`g2_(CcZZE*eskuvSU16P&RS|KPP4!{ST_YK^O&FDbN{^bBgscQCY&s0?VJf= zmMal;nOrQVcviyD;MT9nK&$3~DsP1|l znEj+uR%~yJoAqB(kf1t)^;@??c}s{d@oev2b`v)Q043|HIzdd0xJ3DGNr8w}ZHjG(}+@O*`47e15f(gXzEfcl}o=Fhav z_{-#bt)cnK$ok2q|D~anK_{UdTMQk-m2?mtU!{4(W4)_-xY&ZC#OEbV{6{?=gE^~i!C~=Z=9~2Sw(UT9 zT9IUWwllYJHH4`ES%XF#Y9{KY`I{JEZGygHoR}b%X692?Nr!%ybMn#B)AO|#@|?SO zjoV4oZY@-G7*R{vA#40(4id~>F|K)&=4BP!B{kbW$fePqTULmA+kVlrvbG~1DOX1^ z?{_;C)usmEPQ^R>so+GX@8|N7Ds|z3zoKq-=$S|{VVfU@^&PeG6m0Xj2*C*1`JJ^B z%;r_$N!s{Rq9)j2DvgC=`&+ySSWCbB zcDN#U(>{Q~RsufPMlAd8jYMC5dom3KjQv|&(Q%BumZ~>1n|C71*^-dfh;q)A?GFca zTXF615d5N;*M`f47xe>PB%0|dqUMZdfj8muF?QSjrC%8OYD}=6xFSWvgPzQ0w)wIH z*U{3|UwO+Jlx860#P0}3TZE2S^B`R}pPxL~Y!!@ddaaf0#0Yd|pzM1JBW^s%w4_p{ zOu~;6pT2O#LPxMxjk|u70Z;T&AeM9Y9~UmskP{^NF4IwFrsoxuYt4P6v9G8} zNpig7XUVKE5#aUXQJ_=OK-l@ToQ;3DdWPIBM+&(X4~w$KIejKkzhleL z_xy~94x&H**6r#1Q@q!mNaCHDhHTs^!{meH!iZ-@VltMoqbKLZ5I{m{dy1QPK5Fbh zX`piT!_#~-kd^-&Xy6sXQ9joWo2t~lCqqi zqEnINh}*a>0K7^Ixi!qCi+Im}cUGHl<&1Qjz9@>~_Z?vVK0PV>$fltg|Es#5Tf!$! zeOn0_b>R)!LI2QOZf!Y*$l<#%AuU^zPYW+16~zM*4Yg3e`<; zD6UlACJx?~{RwY;F;|axcBYo@D-AY0?jD@j0mwD{M&6U(CgG@!fw>#&OVNEQf>0y( z+`+a|(LE(SIJegm;WD)|5PrU<83$LNT_2PsKBlX$jB|Fv(% zaj=NaSru?KZee&wCO!X^C(iz!`}qDxvO~Vb_SQ`}_<$sUT>YwIM2s-7xWhWFnjK5j zs(6~nGV)=?_vSu$v8I~cGUKJxrOVm4!DJ_K>wPUZv9-00mqdbHK#9>l9ZN>OVXo&= z=1T*+or_oXzPBDLPc_x@n5o@R=bOmPTpG0QjOnIyA22wT_?LweCl-akS~CPVgRzIWP9>qidJ1g2dA6Ix_tI9xD|?w3+*%ThITlRaQxC*5OBAhx@g8ey>RHjgRl z@dokqJW75&-kQgMcJ9d*d6$3g#gHqJWn~$(GAA{Pl`q1{rf#C8CzJ33Ao@CbEm0&g zHjUzGPlI!&JW;1Psi;qt&wLae;>)b6P_g#EsUcQl%FjNtbR4F6+Il)9{f2YFb+&y_ zIj$}>ERgsoG;5)StD;$_c~bV;Z-_QdY0cP0TFGwXhk4FRSZib!WxUOzj^*Y%7b*+?j-oMJ-)Ay z4kEmOH}liOcFz#cBLo`zknZS&<8#q>I>={tt6Gur&58@)@0(DaB@yJKf4AMLW0w!zP z`IblosxuH{e&i#VUv;?py9N5HM$p#lGwxbm=bb3Jtop!c5uqjC+-BJVZES8QOw;cc z^}@?dhqluwz?e!T-Q+hZis6M8dZ+q1AOdlzCzF7g@v(F{H6lCPEHtoZ29SSzDXww2 ztM=@Pg=!GhSwcF{jMrcje8{*Wwv?j-3;bY=Z)Nu%k^a!DyM`Sa$rE&_VcSyx7euCYUtEzO`aw4hY0G8cEruOyycEC*GdF3isHLai70rV<^7&rwfaZhiz& zWN+%3ra8We@1PG(fBK}DS6Q(-SL;SK4zF6HNOS(cf0trLQ}sPfrZ&GBMfcX*soBIg zz9cF3v39obpiu9baEX*5jXrnXnFqV;9=2l@rP%0BY# zZnfG~Sm_Zq2Hr*5c9n0S34+^tu~Snxk{LS168)^p@iMB>rqHQKf=o>F73u!U8{d|t zt`>;CaH#h4N3#Qz?{e%2Mjb60Uk}guf8U{jYH(#}3AqlJhMF&(X_ymH_$J$-%Y?xg zfG?3cak6WjwXs@cBYKV*r>9X7(5PQe4zHUL3FHsq_oVm@``#Sq#5#l0)3yplOKE$z zs}9U6zSywqWS$fb!}_Jw9Snksk5Sf3w)O(A-^X;}@k;+q>c>V<3c`nlx~FpJ0m2GX&(GsPf0^qE(-?P3Y)0`=du`$M{GZ(= z(IN2BIiw2OG;5c>;A|!lJqa+`04-^qchb;O8ogvj2a3NzyGoC!3nvm zelypV48dJBNja?b`!luUy?0d{1T@Y@1^y#-GX?e+FpDJasgQ)Bz`x9Qrr|kwL7}HO z3bit|P06vHD&{EX`M;-r7}w#jDy0%^fwm3{BBHec z;Mss{=trgWneQejb5xfljQ=f86>4+dR!9rg&%^etJ}Li!ymi#w2smplrZ+WLU~wdk zgY(Hw(HOmN!zasbrro4qJs`8pDQSQA%^|rtxaH*TGLex{a??B6$pz>LHzlr;N|jSx zkiBm}H^LCn4Q@_f)6%C@9ovTHJkp0nu6D4U+nZ-SN6P(u@Q2zg#uZevRlIg)Iz$pJK@euW_3g4^a*9oo z9_*MuN;tUh2PNHwk^Xx?fepm{)iL|Wa@7bRh+OqS9K-;rWiMm5Nlp;HtHYhDxj8)S zX*h?J61tCOe(6$^NIA4Dcxbl-4EMXbNBgYBm(-cT;*F)6hAAujZcOlg)wM&Be++wX9w z`2(`=?Tss)iapA2AH3D@lW$M9)Ot&ITxJ!Nu_5v^4KSJM_ly%Z;sd}DU{%r@5I46& zcm7s9UcrXwTXns&_YD8^OwNB2$ zzWJd8d&HP6l87&Ji{sy#i^hWTY#{#jy=Ogn#Rs722=J_NHjIvf=@4rl`Ly8I|7u|- z!=|86v8sS~Y~kiNsVjH{BTX$vPSfYKoZW#lf%EradLfc{gXl?Iw@E8;Ggv{peAkHg z>3hVQlhTbGxZm79kwvLMhkeHWC{6XPdGsrK#_U|j_r%VNHrWV&cP}W%-vSOXu!a8j zyI4k?kkvWRvezg4*#3;;3gmGL>vX);OFt}a!&ErsyJU3mC$^S3L-muRg&yX2BXdX_ zKl`c!t^#8Wc7jF~J58yci`Buch@8URd|LIMV-`&0ct$+{5KmHkPq)y{W z0I2W0QC&VA0(Dv+8fgGs1hM=&$**guEt+&-95%`P2>@!leKOc1Ps66W1D{NCcXYM%8osSltHex+V_FtT6s~8hQx}S;x#>CaZBBh zqGmQJvJnOa^3s$Hs_ZlLw;5QD@d@Xv^`SJ|4_X+^wXV#uk2zusHEkQW8rChWh=4s< zE1R)_ult)0CX?|K&ASJ6)X=Rf1chUhL!ukDQhG*qGOhL4%df?dW>wC)^;vP+mv?9G z)Nju_L1vfZg*cmKBU1nuS+bg)@Yobfe|LiAFZs!?6^K7N`;)>mOx+>Yn9Rw!)Ja1e z@8oH%(=tG|!_w=+x}f7twv(Y;cvYq+{d0*n`-3GO;d`&Uf9k;$xbsfZf6iZkn+8Y$ z>wM2f@0)y+Rn2T1!^`kgECojhq;ljvEH2C`jzsEm%Xk&Bvf6rTet^xHuef~7r-X+N z`JPPJ_V7SXdDF-OvJ|>^Rejm~-7up{Wq=y+$E<#uPp|EN!atFTlbv#%GhCwL`e;WD zU5hPeNV&Imi05*47KKS#L1u)=`gcmZ?1JmYs+Nh5WYDhIKGfqOKQ?zG&ZAxoC#+g3 z6BY@=I>nWk4JTFk(yPqSdAev#%ePDKRn#3w&w~DE4$sUO6s#se&twUkM?U;BJZ>j) ztb50N0-m!mKkzsP8egVr=O-UtT_a$}ieMMA+);Hc(D(nx-h&)x(0n9f!rOz?fz9z0 zO<703@`J-Hv8(uJASAPEkWntYZhBV>>Wb?o|BRqxSCV0;m`2lWmp%)(mn+gzx4dQt zN9gqCmW7RY87iXT2g}mVJD~T6)v8Zq)gVEOFBgZ)T$8gigEOAwA_k!$XR8%XMUx6w zN8{cbt_VOElYJkDTacas)Xu+v&pZ4h{m3ZJEf1_##HOCO!|=A=9Yi+mW$?yp^quey zQgTMW+6pgLpd(0h4L`3Pe;E|E;Ti!wZ8y}!)frt+mQIAno>|Hc)Y3$~4v*skr-SCr z=XW&4a(hK|53QJdt_EhO(L|%jRY# z?u;^EtxS9YY2NM@l9F`We(IY`pBrr8q=U`ulX$GD7XGe9TJQ{4P9Jyprzgo19+%PJ zV=N6$q&xI>m=Qi#x-8<{j1G6v7zkLuxD4_#fp1G@AQZ^{CO}pxvF#q9@dq6FF#R}# zqO|Pqhjftm_c>u!*`?i0^LLsr_7}3jD`CTwVsG;~SJT2I<6)ll=8O9U$K8W4F8HU8 zAqix6Q{%$moK=cRZqnAt>x0@yjik+={xR?IW|uWZ#Y7sDSNvE>iPUPj!gc$L9N47z ze2gW`$(Uu>_?5S}p*@rd`hxt}kJmih*7l0C`L8oG;+0JEyT!2aUG$b|SQokuWNAdB7UDzz`E6D9M5 z=O1HGB_&PL5FlJ#JpLi-peXz2+FcnN{9J*OImwq@VKsF6(Bkw||7|19fC1Qs&XD_w06)M-dLE zS$mgVeRO)9OS2J>QyMLoaW%jAA1W|GGkT;YdEO$jhx+#%2}bQL+Hvb=m~lh({1%+# z^$A&ZcZQ;G?`!(9wDa|R3rEe>E(0Kc39gzPo#U&Z?AAm}h z?r-@nDKV}mD<>bP;A25TLhJN_l%P%?@UF#rZ-qlX4v`TK{XRm@f!2gTq{=3rwTJEt8z1?{R?JuN`mZNU{};Wx#d~CWt=3n=Z%Uz)H^(>vyxzh9oLiH z&EgIt9-rAcBwv!_v;-oCba+9WY|xMmI64!gw|7~Yw<#BWoB=+qzbAo91*cMQ3Q977 ziq#V_pc#HI02l=yqh0CpS0k(c!j+bc+T}Cpf4Vh%^Cn9AK}0n4Q}b9rA;O;@f1|7OKN>VLSc3(7W$Z(v+~SnSI$#Cl%@)b-xh zQf^XJGY{^vTC*XTxAf}VK^5)Ys-LR951QnQku@}4+$%%KvXS$?=Xj%bk`cSu(2m-B zN`55bJt;;m2A;LyKaR{+qXYj{u%V@WE2g;ErYlgW8{X_-($baW5G>~9+3&#Gr5vBYXYt=>tI*uh~1PWB6Q$mw4vL-?zV%tTwya#6sz z-B(D5E6SH=v@$`Lz10cPgfFW#oI9Vku4EJQJ>NQILH^gl2=I6tnMFh7GaFxA%#-Vc zSmV&0Yzq>Gp_Aqwsz@8|T@6>C*Q!0$*E9%5U)!vV>O-+)-m1u&>4yh)FO!Wi+shQk z_8_t-Kq_)!UjqtzKy!2QB~SX^?!2c3U{0-|_vM{9bP9b?J8Pz($<4r}Y#P#fMlXxjNxk1Zd#U6Y(5Vw>Z96fE&Zxg1#YPanBYRP@9BCf#1YZ2~;GHv5Srf zEU}hVw>I`;*vQ**wWF2G+W_Dtw-L`_q+?O31#W~Ab^s?ui0O9Qh7ImFD}Xpi;%TZV zWT(BE$pp=94JqM4&c_V!Dh22qoa6#eGceqDkGre$QW-bUDQQGV3OJrPW;}>fc=Xn$ zd80LNO?X5{aGWu->WDQuH0=`kiUNYoC@Q@*_6LT0oT*jD5h5h|=;+ndy{3m0Av<6ZS-`LL&d+Kp3lDAFDSa@iG0nj76u!dy9aM|h4?l~wb@NOY}l&1FH z8Q8^;tI)8mi1KZlwXc#M{#zO36y4HMUHSJsdZ01Y3aM=6-m@1SJTgNaFTy*F8bx4@ zAqQXkT^0SD_7uI)u()~pKYE|F<%KmUW7op?$N>F&aJxK|g7!%I%X^qcVsm!$o0ktS z4d~oz93f-H#y~&cr#^vnayS*Y;J)0~xmBplptVqAr{<9Z1??l<8Zr;t!&*+Jh+9Qf zeN*CL^nyP5FWU~IrNGP!-dTjv0y{NnUEP8c_s&TFa*IoLTJu$;^-X$=QzxDz?$$O+ zpu=z{vxP^CH`8+ozEuTdt#C|=kOC+OS#ysrX{!I)8Bpmt{b@JiH*3zLGgZ?lbwSk! z7Rv@O+&n}rS8wVEkQ_TMr$}o$fhIl}(zz<~8?m-;qvzVDYO{>2DeB1UAcPF%%WBhb zj9@|Cf3c)y(eaMsMBOh}G)w~>qVnetdOO%ET;+nZ_uoJE7-%k6Hqys2>eQf%1tN4` z;UE*P|B3dC>Ih9f7(R@a=czD-U*VtmuLDBvW_U)iK-KYm#6iy@M1TQw6h74$Pc@^R zNK;3{zHl$lEU>^v2zj`oK`BwINPb_^fE2C;Hsa{b)5oz(H}B^N_nOM`T9loYnVH1VD|&pX}A0P!4p${rH|V})X-^`{;RSK*hj^5JuF8hWi~94!BwNFdek z<7MLB8mI72TFhe?HO$+Y6{$&%yfSc?j4e|8dldXl#7vZUW=pOMd7DSK!1F^gz`ooH zRS9S_9pdC~3NR4pz@Lx_}jyLdeFR#YqqBo|YBmZBgS+u{?Sx@e7j><8CI z-hjEOdacP+)fx;=KXs4sZtKna=hF^fjbM5KbA-U}TR(oy&?~uo%jE}K`=W1X?zr1k zSl@7UZV>7=2Ey{~&}EI*L1>N^i%xabLRQ%cqI*mQIyk$FhF2DynuW6hx2{_w2f8wf zJ{OLmZBPh-c4tRWw-KG$?eZOT^f$>MgZ9HL5JpFZ$Iph6;sSMb_| z%?CMAk;iR3GJUamR51Yd!>%)??xl&c~01fRHnP_fW~ax#UyN_ZxFqfBDQcfpzJ| zxo>_F0I(c?UVc-~8)~p-Y?Z)Cvns^54Jxibz#m}sL(U@YtpMs3{p`L z+0MIHqhh9?(QT7Mh3zN5jC8H62LCb7QZWUOqdykVPV;5=>+t9k#Ww^7t0&BJrMY+X z)&69}j1G^M(Y#>}S$2FM_LtWF)U+Xij7hcZNTK)MONZD+{P%7Cu%J@N)2!eg*I~hl zDL*8YsDZCoiUaL%=a;aL6ICy>?2p?;Z=~Fc{xp#z%Xs`mUcT=CIJ)j|xVo?V3nD~~ zZuH(ll)>nX7QIJFkf@{g5`tHa-b?hE(S`&egs9PjU`FpW|Ya(eT{TjG>H`L3dUjT|lyXjkRM)1Y{=HgO?e z7H*G4{o9h;*0&H`P=OMHuG4GSp9hCBu=2es`9^Zs)Bh#A&dIrLS;G~I$ae*@WvVOV zj@rD--N#fpdC*jdVuSh#3Nr?5q9ip5wK9ltS}bdUBDWtsxixhsBxy7E=^WzlQI?Ua z;;=yMNqY7e{v-bHx<%%ko!^x)Ri$mblWxk~A#F&OrI-OlzL6vIqY-3}QPnbMuMjb= z48(0dSj~Ujh=J&c^U3VSPueFd&ZJc)ugTX)p;Bs? z8T^xetzdrTZXfn5ONUmp(8@$~OW3I_zY6Nz%Yri_4GpMgz&|B@0&;FLCxnfCWj$GR z+$$m9>Yk32XEKA$%X>74hh_H3D?+}tJm1srU4*N%S!Co+$JF45a&jy0Z=WrQ+)=VF zb4uZYTv_(r3ntx1{WisdfrVvtw9Pw&?hos_^a!Do3q%m_j%l=0B{Gr;e7rQ{eY|uL zob%5M)vwR12~`{e3Bh@*$i?O?+b(On6DdIp;YkRblp1^5J@1Rbp?l z=zU`T$TZcITw{O*6l7U-Ap1TA>Fu?Kdx$Zr^>jkY%?JN{qSUZg9DnSRah-nV%XKgmN? zoSGFD_>`2p@>~1uwe$Q_UgB#slI4&l)DXNY_u_tEF2#a#{Rf)}(>xeW4@o*4RGtLJ zLz>R>ZZd6c^Civv3ImaUo=gKiN!jRsoqFlWSJIzo=9=m{kv=TQX=0^lAk5V+RHphX zlo-noTE{r(J+1y?hxRho_frOQ;n?DlfYJEDyL|I`W;Bz^>M=anLNp&qaa+Ak0f&!0 zUIrH=^Yg|d%(L{~Ggnh!JY^;rtZ^H$MsfFt1`M0+VIIu=)eXUa_k5yj_9^0F!r>x2`a4jmEOP#MSNr!e zdF?_Gx-6^TeLR{4GCGN7F^3Q@%e!Y^xb~GTiF?)X=4BI$IAB`d;HsEn>qZei=82+r zm5cu~7YVW^>wNN*MR;yI`Pqb$>e?UOEUN9AJU%5}4<4uTgP0l@;>gU%lHJAD3giq7 zCJhnDBFnkSn|r2cgxB&J8$;VCZ?cj8&G++*1QHjOvjao4uMy=hjy2cCk_ zEA-E4I&vF~_vz=)`zPuJW8=g3+H_#7V*k%39w+BwOP*Ix zT-DwgY62G2eU8Z7zO-F`dK&oz6)^_NYdb@&iQG`GOQrmd>lWt$-= zJ}lOiql^#1JltoGt)M{+4u*FSBxet7rY0JUIwzS3!#DY`s*X8p9e0{1<-SgT5wB|W&x?bjGZj1*Rbksa@mJ!+6#)N`3PAEEDM1A9w9mCLm zBrOozFKgUB5LE!6=RZccMnfyn=8S{ht8m~U<Kctzn}hJaj-XZ!3i^ zs+Z94wP?lhxu}pfl*any_FvU7UsXlmn_GBxoYNf>b_i#$oeBPiUTE-B<=adadf;p9 z`j;DWl9FOD_tg(;D|#qIxR-WTU($~d{6=;i zxYSBb6HY2^N@4V=4P&opz#=C7qyd{H3;@kTi08#NgT0Y}-^~Ny(YBPmMBLt%Wc0}! zR5^BL_#R(>Gu`~)0p;oxz!oi-gz>v&aa?Ny86gHHgSrcFdOHm250Avu5Fp&YJq6c& zZ|L{-f}oSX^!o*{mp#9fqzm`>jeEx2;8^%b{z3^mfi0yv4*YoS+Ed7$vzH~J6M>|b zn0)CChIr(T^>Rb@#NAKBKW}b!Pe-`xVO%1;Znkx=X<$E34E~5X_B-J6VK%|_oDb`Y zmnlp>QNaJMN-=t*(0HNeE6WnDMI>Dd6VNO7>pI*9Uhun!;CFs~_v-D$8@->r8G6o@O z+pcpQqE#B$;g;3M2-PQCU)3FB*Y&D1KhfOC<2^;`I<<6V=1asBYe)3=O083XM|yn!v%T_dO_4>T56`F6gn-K_ z7MzDQ{V2Q8}wBrc$|R@ICJ<(CgI`_EvjA6R(Bm-N`yT_|Edh$JJY) zwr&XU87`;ym;-Cj+>~y!>fbuzuB#2irW(hsv>8PENtRb44nfUfQV%ym|39SZD2y;ONjN*@iBW$st!=~X5)F^W;ldz;$gTJw zF=ub?(&<6CyPqG}WG!OUes!Fqv|?c#gxnhFfZ$>!knyTC8&79Oz+iP{sGo^L^bG`B zJIf_JLF*3%s`IA78rw}61ajrqKJ|Ccxc^*1A0Nbwu7hiI2W5!N=3^6G$qt>o$uwwv zG(lF9YPjnw_&wB}1*ZuzS4ca`h)pyq*C8kDDa=J_-lJs9Yo`-$&HMomOKa-3Hr+qK z7aXAxsL}cnLgY&7kl+TCmye_<;X};@@vqe0|9ruX?8xSC>*LuI14>K0OIq>fczoqs zCtN@G8b~1w3`FDK5BozWvc}+3k-0_MeQ*ClY5w&^tNZZbxPG;UcW^&r^o#mv@FZJ+ zFp`fp4A^uWqwCSRNHuCDY$De3ICbPA;WyWM{wHhf5h@wv*v8SZQDZhwQ3IiA=(wox z?;Kv!$QeX9)ka5Wv`G9r1((*d{@uziPnhyT^u}zmo3fn+kN+^arU2*sG0Z*S^5)2Lg zI+D-YrioX?3#hy(#NusN?F53mQD|7hBHO5s16jdqRM>Nxz=Fd7D9G!*oWt}U3|c-# zgjVb6aA&%Op1&pjYBo(XY2zZdlh=y~WOGJh)J<=HtJWWzo9YI#@R}W7x(w9}(1kD@ zACM^0S>#E9gk_sQeEn^3&F!qM{t748yz6eOEIvM_fqm6cZ^STat8CS>a`rN+Djm^1 z9m;e0+ERB8K#H;M(Rhki075zLT(kc)2X79dyWtQj8I&7Weso9&dr912k4Iu3h}4Rd z8l}p0w4y&U+(}TGFWX!#1n|ClqrUD~EH7GBQK0a|2;gp!hmEhx&;Pe3X%5Jf2H~t` z?wGt2Vmf!)ag7)N)>rb5GhP38F}4B#l1DEb+Qd+eP0;iKL2;N1RAbnk0pGdHKrV87 z3kF<8ElL@jy>`AF@bf;?;uRo2ujknzU-xR0ecZHU%7JIR?iav)T40k*%;Kf&G}5kNdl*7j2?iru|M@^3%f|gLA@E9U;Rz2xND?g6)pypRh6U<$tyhSQH-UEH$VozjOJCcr-#1Wk-c%~ zIWfS~V8fu{+}yOcJla3>D$@}HGq#erfNE3Pm2ScbsO4M%k+^^30TF^|Z~PqDC{`#S2dnKgO<7>|E+f2l#W8o3Pn+ zB6)Q+%Gi#F3{~nDAIkiMvflq~1pAu2H+bC}VZ6tvotq_Yx;SNW6$2zhW)xa>KN1fp zjCc~$^d+nF3Cr5>z|++;O(1>;CMf({4pgzuY*n#+oIQ?@5)HVcr5WC7yqy8crtUKm zkpcG^*F@5!(9#OX0A7*k=2OZfKFg;jv)gn*=DcM3rZqzbRJ}kn9K~ervrC-y*uZn5 z+lq6w;%{rz0@Y}B9bemFn*)TeV^&p{RJQEfeys$c_DFG!8a;eN!bVefV1`-ytcBre zB5z&b>>#7`?zi-OSR-T~Kd!toh>`y`gH9gj;m`1R2cg$E{0$5$c^Ey^9wTMMfu?1G z1zg9eTV`9&U<~{TOJ^G&03em6*Ci7Et2Q)>0xO4H{PP)xtV2YIm?eIyv3F`7S;&T% z7eX5%u04)0d8CiRs~WjY*MhHm*>N&Pd%Nah|;HTuUY|W5!%03_W86 zU`-)|uEb(ZCnOPv|92v8VbQDEr92c&O;2idh<|iUoRbBmj&tU=P>nBn4+0H4cL(*d zOBfps9*NS}v#?KqrmJK8*g-k!6||e>r%&xA>32$}HVz-2+uDzvo`2#S>-M0dTXxVks4JsA|4Z& zsRlif?trXBS&G*Q@4Q-tu6fraCei@;yWy6b(Fpm7N;MSIqAmn5=i9UNr13QO>d(?a zaKxj^p!?~+kQl#3+B$BhpcR0>cVg-drm1d73u1%7V7&LUT8ivQfJPyf3KYk5lL3h%_;B+Ku?&e>i?+-umJl-2WO$hc}26f~X*UtDR{zgzj`*ew`D5mFga(A`vt^aTYmO9E`W zNef)4x>6|o@;xD#J0|gKLdx1D>}eF0$`s{;0M+f2=Ur%L!UI@*-l|a2aEt+ju$8bW zmit!gL3l-Gwz$vj*h;oR4Z-yZE#>^SHrsz2m_uU73W4ZE1v=V5x`1Nh9i`QRD&tl( zUwy9}qjhk*p#$p1Hpt+e4u2!=WKXQZvanbV6DSgq7Riukg8dFFO+)Y}B^ zlgAbfnqYme-GFl%TuJC6_JEsz1^(UK;RHnjQl8uQv9WYnfvAt1Skw7^K2Q;egIL@y zdJeVVmH=)ReBe89)3y|0+7h@;kfazB@6DhUeL{H}+!h$Eq_|E4d%1a%3AI-Kq*pzt zUooJy^hpIu3&tB?WTB2NEkdwJsg<~cRgHO)0wtm=UOWN(EcAQ3b6Rca>iG_gbjDUc zD9^RRKO!JDxytEb*zQBR%9%l%o_W)NALI8+L?R0!uI!!dc0`gXDn!G@vXws_b4%;^ zTL?{29HhsxcUkTC;)%AAV|Pq$GwyH1sYP?fAK(G-oDf_55|Xu0XF{- znjBKdK-BqB!*pl>^4je&uC>&!ZCou$%5!^E83zXaHqD(xAU5};ThJI&K+`7=;d;(^ z5g!UzE#VpVVi1nJ3NCL6+medOJHX@l+R>BL`Ojs&tsRNf(}KT;|Mv14#|daNd|i`g z8Se26in~n%1^mQE4B5#@agws)e6p?g17<;9g2PY~jR~s;=rlkhbf*lYV+6D@wqi#lWXEIBm%zHJ$SZ%xJe6wiGe_bE`idC3|xrrRGICZw!c7Sk^ZA6P$TmT zLn?s_Y9X;$(3AV3#7CLF2Y7i$|5K&RsGqs0sxM$10fByRFx~#jC2tBH#((;5uz9Q- zq7r6C67#FEf$bxr=!noKM$@umATqu{(v`Z*T9BAUmoBhLX7+#>G!Uh7F&J=#Gs45A zYV@-FcaZs~{F;1vSi@^Y%)dbX(B{uY3Txu!|B04;`j3PnXCXeOWBLhntVW=Iu3#YhHB;Nd}sIBDM{ zN&#`+l~Eqn{*}6qXd;_KRM8x#|LPa&a(e{|y=egB%RyqVxQ~@N3 zHWUXK@zN~*v7!{{jla!@ZlBsJRg_SiK!@~$>?;0McKZ_ILkN!UyHVXr8@qZd`WY7> z;C=03vq{~}f^;CHQI_{qk?9NI3i>=CIJv)aRO}sX3|6CH-j9~POm#~r@)%;PBD=q8 z0+!Pjl^)yw{=75Dq~pKe~$(5&9;OtVJ-5)11-GJkgQfzkNKX_ic-24!i4ZUgS@X)s4kzV}MJ34W+;N;AQrx=!#ia zN4%&)gqVdJiM5w-+XMzP5D_&VZEU34=EJ?2Ts2$gnSkYel$G$VMX(W2M!4fYg_SuV zPMx}Ybk%d--T=@ldJNxCVHW!Uk9#AHb_xolPZuV z1-ihU6+W)ZJLmr8P%mE6vfK@^f%B?r{}s)c00NV8%Zjz{V~yNYb4tfFHO}KS-RFIa zjpGkK9*6mwY|7f1Zb9z%y~pl?=b`RLE(@)e>BTmZpyO;5t@kLQLE*rW{y$xY=wYB3 zxr9(kker_1$}3}2VuxsVRh-LRnC9Yf(Z&~#LIQ6lBLGgwO(LYShe{^qFsnYT&0-8j7nJm-C;k%z7B^f+@vv|H)7aJ_Eh#je7 zkk6}4J87gt+$(@BFw-#k^Hr3e5P&#YFOz-=yFaat{%>E|g-})~apFHSOS2I)2}KnK zv#hIVv451etaGz?Cg$WQs104dQm8-v&ZZ{|xU6>nnzO{Y+K3#&jri5y0Y936{etG@ z{CV{CiHM+O@xx_5Xt{b*K~h5J912xwSBCHZwLZTE-1SoC1B%oQ@XGg56+=(+sDbGx zSTcG$q;2h7B9G+I7*eKxqFjm3Hzm#C493EFe;Q`+CBtkwiyv%gETI1MH67-v&F;K0)9Iv<>_W64W@BV|AU2?gYe|P@hkP!Mm zVU((JnFQthA9$4l#OCXG1j|-sllLjjJcjgJP*vUwZRw2OeE5Jt8eq#^L>YFD&D}4K z!7s-Wad(1v&q^Snwo!Sxsr)h_)*!rpehNH4s%@yZRl#7%!gFi4;0nT*P#Ns(;wrLm!>ex`ozMr5?-A;mQ0_`iHU&VS0)h**mZyeP#(bW{LU{F z>kCa%3So~1UQJX37>E|W8t1+%FW=HHF6vl+4K%C6(w@XzKO^~~I|;CUD8#XapLV#6 z0;qucO_*a@US&GEoJJuaDh7WV}`G6s*9+`RYN&~W^KZ_xy2%sw? zC$V=+*5(#&+@>3orwP!yY58$GPiLd<4K~fn3L^YmPR&R*X=X_VeejC>>omY4=O3w+ z+5Nz?*VjKj^gizUfu4HhH1%D@{%?V0w;nXVEs5Bj6VP^BXXar|^|coAMMPD^-9UIK z@H7`HRTn-=x}!uQSH2r-Li0DzQX1Qi>!9`GT)gNMSu<9FrK6vv@S3RqhA8-enmUZUV`t+E!g3~ zX0Q9(Dl{kP1I_|UO19?YHNLpD))vinf?)b|c87@%C1qhT9#&1(iV-;x(TG<-$?$J{ z)?>rUI^WC!yfP2cOP_|2z`6lo0g^`4^ZYZvf#l$|WQ$X+560KiAsuhLhVKy*V8Fwd zEwx!qGs(b-@Ik?qD3K!P{XdKJoNDA0wpHH3S3cCfe74}BO`nE<{b%BMqzRa6>vVm! z4fc7gS`%netpTc@ulE7A;tyJ+nXzPHiLOnu8KEGz6PzBOC;MuU1L)G>heomSqFvUW zSX;92g0$`bDl&+fO1@UJ3=>#*NcUO36|aoj*J|i}N7&DL-_jFI<`~v9TT#rcB-w+> zgx;7~-1Dd|b%Z&-p|eK%F6D)Hk=IvBHUoqcT8w`G?7PFjt5scJZ~($gGQ5hq51H-t zg|pWbk12o6Mkk$w0^CimgMhnfSAhdK$2I?+MR0YpgqQ99e*0bANDOG4vLIT6=Pti` zGGpLp&CKBQ(Y@&1y<@_HeJ*oC?AFT3heuhv4O3lRpN2YW;GaeND z?q3qb5{(FQ;S~?EE+9P0j9IWm>o$icMrl@>S&x3H-9M!{aNO+xOoNqQy_k15-7AE* zu~AWcP64JFc}OM5z1b6t3KA%f&c)K6KSJzNPy$jQ#$B89O%90#1^%<#O7q1BpB|Gw zS`(5amI#=0$=@_Au0Ng#w&yg4*HmlNHBk6uEDT4Lv|`Z7YaFNLWL#64NDI%c>rCqp zf{CHYi)w5CUcJtF8C!u^=@^1mDoB(JqGrB`4@}H#0Z~u&gsbT`NGv;wfv7CxZ+4~C z#vg(256}U}RJDKur}##7#lZ8I6Pw_DD-$C_@=wAO59XhAw+b)W%G%xP;ZTzkOqXQg z+ised!nYP&op=}XYZ#BQSM|4{8~S;4^2mpq=K`-TJ~n6@ohUq6OMav}^RhTVb$nLUPt1Q+suY-2 zhTAkM5ZjnRt`NB}137*(2fg^F=Tboa1_Tt%Gg8@ zWAtZ~wR0(ge;&}n#p+*#s$kV1drsZ=^~$+zx^JYg_XNGWSTe0d;7FyyN!rYN)icvN zo*!WH6?SY6Z>i>x!jKCU#kG|Ux0Ej%N>Tzw6`Z|1dZ5ax<@0KS^Mw^6BB6pLLxsFA z^tNDjt0BDtnj2iBgC@~HgRn1yiKT%-Zs=j#i41pQ^Wg^M;=cq3=JW~P##SGPC5{R7 ze{8&~k+^c3z1n)rDUP&j`5v)0$hH#oJrZKtq|hjWc2NBk7Z(~m2e+Z%|5PqC41M{L z_@}HHYa`Gs%+yI8PtTgDpG1sVn^Pl&fx2BC+ItXa)pk(^i2gdY+}(HetB2tD3L?Oe z6GoTT-^jBn0f<7vXtDX8_7yzX-7s`~q7pz9!a8?M{F3GFM{9Vf)!yUxA;0Bs9h|&- z+nC>wK5|KI^y?`Xhp8&+>PT7>=KWS2_|7*}zjqp=hO4vj+IzYXRLmv`QUW(*Zr8S; zsxVj&&4%PB5w6?cdx7h_&JuC!;;ZsL*k!z_+1f;jxAAK(ZSk$TJhx?Mi~rRG%;ZN& zyQ`r=Uf?tDTIY5hCIF+JXIFK&6^gqX0~YeQ5O>~;SF9^8FZ`m(-1WMf6}yV8pzw1)_oBw{inFIfFpAz!S0o5_O}4_{c!ctt*=f3|#CjvFxW(R_8xM#_3pvKMgT0L_}&GsE32H_fT`9lWMg z6BxG{b@&}{V(jB2fu{yEudRjlL*?a|Y{^Z0Y<@onv#aC%2ue%;a~m-&)GJDgd&adt zSA~_hPYYM0o(eO>=dCku!bXzzg^*2 z&!;I+GV>t+G|FuISR)kbcZvB8)o#ZQ61wf?q1?051N7C(c}0{$7Om@ zZ=uF?$>KclSHA7=^9+}KBVwc@(7NU3v2Kla9U#k)@^L$(>xE?D)Ta*^3hjJhTXic! zTzZOE9KX=b+`220p!=BLPJ1B_XUeqpwoh>Baw|Ie2R^FF8oIw4a2KfxjW&!iRNMKq zxunu%uFE_o+{ zSWAL2@@M|t9IVl~Us5KCopcJR_tGKcV5Oe60cbj8KliuRGuO}rzu_@1Qg=)pq^+}+ z2J8rixReB(Yk69k?le-=Q7|1*?*i!drM=BYGqxkDoRf-;4nJLw!^d!zvu8;q-1E=y zQ5$=f2w|e9oZ8oW)27g}R9op>P1x&G_(M;wj7Za1~Zl2q~!eRZU>FLKvE8IkN zDgW!67+gP5>sD2AWA8w9o=E7qh>yEVDVub?a;Ih=fmz93%z{vI5I=rt(@&ievlumdI@` z{xzQTdWPq@^Iv;ONlwt-puQEqP8vlHm@}|)%p@z$g8;!@%(k)S4d*$XgGDDbX&#vp zP?d5v2fQM%j@Q6*jD4rZ!K4}{`xU*+WO;Py*?Ao69VEH$F3v^{Eo#_5#T*=+UN!)) z^hEdSCnTXn%hYU)+SqDne~?l{^Z17rXSAY8kJ{yu)KdqdDCVf=QOtcb4W#}RxC|qr z{+h$>3Ao26bWM>)`s{J_!gdi%wCU>m&KvrtzoFsh<1kzXLA6H`gNuq>%(hH_nf9-Z-Vj z-yw3?KREEUhze)Kc8C3@SJ(Lr&`a@aJBz&gx_-FY(+NC>b>Vaxwk=pE&IyV?GHy;t zpKozu%NJm9NjhSId{pXOqieho%{$yGL0SR`8Ww zJj)C|y&dlc?61NTN1i~j+B3JJ@;gVpsY(usfmz4OwJ%3Cv@`OjVv@ku-)HYRK~>Yx z5$zP5%&Yi0smK~$YBp-D1ObNO8-t4!dKg&1C&rJvLCMxh!}ZjV444RlvLu{oibLSf zl8U0EnI*MZd@5B*ud3ULSyoyKK`3sNlw4h7l`SV|KYngM=9PXL{+^IqJVT9UZVCaS ze6jm#`7nqZc%RM#k$q|snu(WgnQ8xX&2Bz7{JPD7uesa|)<}8vvw^In_Cx){79vn0 z%Ces;PJ@?~u_gJ3vr7}$=}xOj!#$p26kE7S4z}EN1M3r_=8(vN9^;OQV0}ZGe?b;+ zBLbP7k5T=@6%}$2e()O!i!JQe{njIep(gQf@TB!HWwOIj2JHz^>5fgGFH&pIy=#~j zZ=Ac@IwHT0-~VY5z=YhofDNTP^IgubMzXSUQ}6+OR{L#~_;mIgTKB-tEkTiG+gtuX zYB4@K0f1gOE>x)CfM~nk9l zp;k$Nc`DX@BW_T%=?fOzHC4PKBU!1=cX${KDON?xE_6yil_^h{kungl!3&7$1PEi_ z%PKg0)B#I(7^b~WtNU=-cIFHem(Wz&`76#JmUP8Rp%wJn~Ea$Bq18Y1rE8sA1|Nbz||j#D$fYf9VQC zb@78zzme9w7z~XXMfX-sMmrw=dC4dAd*%~>w*%=!NAuHvTlEWJhoz4VTPD=()&e60 zR5+F7CvtJBElx?B&}emC3%Lok+H_I#Pd`#*YJg0#IP0!IdA1Wwmr%i5+>Ayhx1iJ1 z(*A7M(`1uU+?Cb@$!IWCrBqHn70ma4Mi_^1jLYYY#o`U~u`#V&( zG`1j*3RLi+{uM)jNU9gTDr-f9BaO8UR9EVW&-Xnr&+kZFr~Os^AjbY%4qJr)DZ<~t zR>E6iPgr&qMTOA1$j^(&<`)C%%6m3l<3@2Qrr^W?$$U$R5AE5XV9^&D^?oI4>NtD{ z3{6eEy|D{RVlCpojUVD~|1VhCJhFMP$}E#cB6C7-MiuZ6A}2Z8P*!6HR87 z$q7b}!5S4qX<|4(n?;e0qfJ z(D!<79AE4ynq%l_+%W^-&b+h=1Erm17C{13dRTUws@@ji8y?KC4secVip88GVM7WG zH=LlMATS2Kdx#{}W#nlC@_s(aV^}l{v>#k9Wy}s?irJHid83{^P3YsOQ65XR)?IDm1$nMb0SoSb7%M?!UvU zq4`0&Wzg)ECr<-y0a|4zFT7ssZP$*J{Is)y7QYOQw)auf;U`GAYb+uR=5uINRai0I zeOCWKV;&hBL!@MH=?h^m`8R#bp7VvP3m5+YXdrdx2F0*KN9+7L)Ib|`zA=ilC(gGz zZQWF`T3Uwc7H5pv^G%(R5P~UgDbAGi-dm98_Z1dydTRoC0~)&eOL)OZLqIev8kqfx zJ(xQu)KJTvKnNJ;09{bx|9lYDe*w|v!eL#XX=qyP2z@EVnkK%cZxq@>%He-dbCBeZ zfqzgoP&4A2LG+$+>N_#xveDsz5!+(h+)7(aG%!KheDvm1m1EYMAKHsRpz9EQ7@mXI4PNY=0JoEzuUq=>&4~`n*3k|?{?ar=_2tXE z_Yi+t-)Z&P0BIVNdl)zh3~Ai9)-PIns)5`tXWPO_Nlb3 z85abtY)X$EE@2O1(YM=aX@3*{1{W+hqH`)hNGl1d(o}JsOr_^aAo$54QZ*sYmP_a; zzdXWYe^9cZguU}oKeyRU4QW(*{>MVcNE84i0pM^1ZvO+skSGR?CLtNg2uBg9Ae&r@ zRL1Szd{Zc4PLQ{6rv{S~ZP$zw7Dvb029YH8{KCabdVi|%Snmd$N=_tJGWVuZjcmHz z_$Ds7e>uOaH8>OTVlW0b3&ozSmkNa}`OgnEa)tArgA`hn zWwmeOU*kHevZ&J^U`wFURzw`1d^PsV?|uo=HV~%6-G)gz4_fb(!hfJsF{WyQv$sC?MA$@4>~YpB?DaYAIyJc|N!U+m=idu^E|~xZ zomn=tmHkS~P#e=*5JEF8o=Ga;==mgH=3>2Appt;d-((s0n~HuUrKyOF;2C8HO`o%_ zF3I)S{`|R4QTsOxX@RbDOw#)Q#I=i(L|D&h*Fbo4Y>>P3>&uH!IOhO4QMy}P9D$sG zgmfU*mNP>O%~UF0qdZbL)xFDN(-FR+#(x^&9aFH=8esgcxTo=jd--f-!)D{4>pLAV z_l}G2rmDt(k8;syE>GpOxNIOce^uTH-FOS#sj?zBOa=9dJ!4OWD2!-Q$*R zqMdQ(R(F=8GdwrXcmYaE@RkU-Yv67ox-}Oc8BzY#*TEBODBJFPRw;_s4I9ZyNMaYu z-N|3&9rg;;RuPDJrCnGQy?C(|6SeB9B{NsQ9?J32*;phMpqTRf`<)W4+oJZIpbxQI zK^3n@o44l-okfIMwj?JCz70jC(!jW9%1!i>4drjIrQ(tY<()Ki9gAq67J#xl zgLaktrE~?Ka>$fymkRur^vw0(!{6XR+5V&XhNOspheO=-dPMSrt!yF?UK<6g3(1&p|2e8`*6+UKd^hl zsc1X9oZz7aTv%pgDyey&(G|g7U!-q(Ey!?*==Vl8D4c=3%c*!x{Ga!CgR>(BMB)FEZQ%KZko@vLgeXDy^KQ{hxq58yV$HaUcfjwL0;;65c1q^yr9rpFlDz5rNr zW6L2PWJ#~wIGUPB@^jhc2aNy|<))Z^K20lt`=Dkc$XakN3_c(c=C}zJZ@+b8m*5V2 zaJD>@6QkavO`of%3@z}d(VRfTMvjc^FI^?DvWo_Q8RGWw;ujP(+lph{*J2z+?&Q@< zPcN2Dfcm5*&@XX+7_^=Z6HMZVkg2b_+nnN~bk8WPg!hLODuY^=>p$ntkQ0?|?0jqG zc-I&*zYL%n^1}aoQ!vKZoEThZH(oix&oiVXs%_|g(&;MX%7Su;O-lVmD+%EQxsH=D zUNmjFtnJ3V0H`=}v3E0BK;tnb6=*A}M{ZIwbdxe4Q<^osTsX}KRdwv}OC&zX-=_lQ z1Lwxa%`&`v#Q{Rh3|H3B%s_PWANg231Nwl7m6%JCruUdf*F67f0qU~FC8fZFJr&Nt z1u_fvJVK~TzZgjS&a0K{DCEgvSnRu{%5vQygn=s>T&X2xMhJ0aq>ecO<%Sw-PsK|c zIIye28OgH1kGK<0C4IbGPPrN2`5IW6&HCC+u~#q}z~}l9Evq6u@YsxX?5y5Yb<1iU zI-Q4eCV;U5%qEyipy@t0z8;!ociK{(?FM%ak+?rS_TK!@#epTb7-gn^t&a@0Xo;J! zTgO&77(4&KpK|ku28L407`$dxcZJFk?ERFX0~o3T!tCzf^<^)q7I?m7)NUk|@a}J= z%97t6y8oAICl23B8u_z-b1>=NlM;fQn=pWtx-|G77QX&`(7P_O}$?_q=+jCK%=y9{KAaw1~+ zPwG68H>A|#2Mu738mk)TBDv6!Dzt}(N5uDvU!Pk~&g{O20qIS8+EhNwmG!-v6j;Bb z3LCJOvaxL)p)qRh!5Ij<2xBh2`z?ZzXNXB_sw*D0IrXL$DKw#Cp?hL2Ot~$gqcR0( zxVEcF-3?%(vY@NQ{XGfV3&_^X5kVkDTo<&#@E%7k4+YNveZio~V7sJ;|J=%76_#l( zTxiONxvS6kI&j5k-Fv|_p#tH%rrCY{TiICTTFUR&5@sza>W+#2n8h=(psdT7EB0lQmnS_IN%(s?BKrG*%ey|b5$XcYo>8mY7LLaLX*>QWV7(RgmdAel zm#4AcfLV5q;g#Le!OsL*Steq(pCaDiR&4U422P2)yn z03*Xx*xJ|&#TL-Wt=dePpG4^YZ2z{l=qcjKQY(HmfAh7yO90&Cm`+wvjeN4b=mdSR z42+|hxvMaW_JGdXZ9|pR6@Oj1kPQMJK`qT*;Z8MOV7~wzFEqWrdil3Wr!oyFI(XxQ zM=gRk;ZxA?a!M`QK(*&FZhQNH@WPA90T;X&zwssnLvFWrTpaIzs88DEl~GT~jBC3a z{h8QkQi1|F>P5E0P!#PJ**P1ABa(n%Ev0rTO^S#{v0OSVwf=be0}) zj}&AgA5TPcKk`C6Y84L;f5V=Cz>}A-6Y!h`7cdF$1J5_@j}9L`?jb1QF#pRTp&0ba zCVXfc5UtS{($5U14y3%{h-IvHbYbh`rV7=b%{s9@oB3U`tZ40XdhIjE+fZEV3Q+|v zwb6eKD>ruY!n##S%p*hXflhEe1Jm%tuc>cn1C$#`Cx3eYwgs-|lQd@N-NZ9&Eddh1 zs75X>`lEM@hJr+DA0yNR6K5x5{gTQ8gW?>LnUY_xg`>e zjW!tdWaP{y?xpD{N5%x3P=3CQGv87H0npcptdwePp_qj=7G9} z)$lZvu5;;eBa|GjM+vZg}eyx18kDE+?Cbh3f#;l z>}=LZw>Z>woySfAQMMl+m0R>ayW*dTPn-vdk{~eyU_9>M-cS=6+KU+UQ<#2w_j~t` zw@7WMd>}!?upXZ6jWaR$jsJghACIlsH>u3F-ep2(0dx-Fo!qQM2xmVdCn63>OxVZ- z`xQl>CI{s}AB0}yE&ee~lPM-NY7TMozTvNOYpdL=1*>_DumPhVUPeSt*8q=^-*~^R z&!l&uEL~evKshD`pa?y8MPLZnt$9uq<8DAy2NzIl@RJro1uPk6KG>3hRmWGHQfHAe zXi~mo>Tw8JV1;qizR+<>Q20>PQwt3XN^igeSNT|`w-#s$+(EeqjpXUFS;r2|43R7> z96oCmLN9B2DlZ+ScK_m+ou8 z7I4E1Sz~z@23^ZJK_t~=6pRQm%PzQ3_^jg_kZW(fIF|WBx7XX(2QM1X|JmESigD=i zX@bjs2WBwLh&K}Ak93^am^gB^qG5VQijm1mDTamqTSLD%*^qqJBW{@C7P(brMUMi3 zdsjUSU0KthL?&ROLUDM>d=i~@SsDq58lHM{zT%6~dD$wp_e*ghK2QwH$Ac2A>J!9_ z3v|{CD>^xTNZncwKkwxaHzpp^G2QKnj0zjx+<3tibERox-RGn8oo2=ceyfpX-)CKv zYe-J?%;m#;E-H`%Q;pv`;$S8K<-}%uuCCj+P|_v}e8Go?8kquDXbi+hg?lz_hW~Ivr#2eIx)6%2dx`8*D!hok%WK52`B8xc6l-FWCQ}1+m*^@0 zW&=IrHHFvCe7!x!EekE zJRZtwogcPdEPso*wp(WlEiG6MRo0_8gmxKVzADiw9pTqZb>?INaYwLHFC0c?wtf3E zE-J^YkuT>4S&YxP-3U-0RIdl@agEP|*`4Fow2I6!5eeDH2DAfKQtyX-XnFH+0gPLR z@Dkfi?SIcIBH_AvzX2q3{)jYS=MG=L))-S#B%D~2%Vu>*Ogn4od-dS5{w%2&>5%#^ z6+%wL^21Ki$!PMtV2R~LZ$<-?6f^xKzh-J9H#HVlzlcOo+bAU5tm##jRKxAG%f30`r_ zCaN`yR8GD12xf|=2ZPDoxv1h#=C4B@n?|68057dU@)jO7U>e1DZ9fl@txekPJWbDP zD*zxM;fWf>yy|IIRZP^Tr=euY;}p8YSNX3;Tpm(YKhZ+>W4R@X7Fbu)jo0`$a`n9> zkr1sMl-m<`*tZQJZjgU698+dEZozs6{33GuSX3;9M7%0Fi5k$>3ST&)`*dp%M~y>K zJ#fNzvgN^9dn01@*1GwDn)8(Gsvqf*v7j+U+T32@+P(ZZ1Lc1ro4JDt`;w7hCkRvxt0-@3mMB@Xu(B;~Q!Np_!3n2U*0Ez7~;b?yfa-%$BpAZ0C7 z>jC$Ep6a96%bMz3lj2|Yd&*TX=8McjPOdKq+3+JLbAxIQD-sfCF3$0 z!7hv6y?hSfl_+jM*~klk7gs$QIrxO^Ch804)4yH%!O98r3l#O3`lfWADq6s}w~UJl zDzv^nzn>@O?`>s=BDdC0Qn!+V$%z)rKd!cLFcjVSgW@~}<<(xTyou@Wt=h!RSrpax znxIpA%MfWD*zCPwW0Up_W%>6NTp;QLkKTQi902p25#n|0!{2Q$06UY> zdV*n$-y!W3I1UqV4|7(}lkDsSo#)GFm1Ifu|SgmQqdWb@A_fO&ykXHU$3HUnRd?XP1V zlW?kmHiGw>dH`eC|Llb0c=!J}y2`kw+CKa!A*o0+5T#4f(cO$rQKTef(kVzvcMXt` z&e1BMgn%H8!bVDWcbC9>@BQpgww-gIe_VBr)uA2FkAvTpF$+C;U(4+MQ`IVGULZGX zv0#3*x`~#Icmlg9yIjRyZKt%j*lmgQJ-?$tXd`*^5xDP8+-#8j|2S1CmY4;Qxz3aA z)3g{~@Wzuf*Uj|dwK5UZYg5}WR`YIZw=VMsx8a%pFKvz6z6H0l)SA#`x!LU$W}RpE zwPI_7uP8y?!?FGBO@8-!1JL~r$0x}lvy}>OkGvN?xe&@0hb2Lsi`BD3!`MD{+j>&< z#^$NrXLGb_a8QyW?P3d%YKhsiv&hX`2p^p(V>VviYtIC~zJi&@*!m0{UDw~c#oKMS zj_Q~WYvdEe=+Ef^F!2P(@yzO%U&YsL?`O4o_-ZJ9V`U8WEvhrw(4%ardwV}*t;sY-iTZauZuaU}ghBV!Hl;-e zecZ}IF2qE}IDgA3iwxUowa5(|2|%Vg1TjIi9oy_bncIc5N{+Kv!mtCtknCCui#GjL z(t;Y$WQ%NFZ4=d};xj%Gf2OvWgLk59Q)stTYty#p4!2q#)i$o|7_%WEA4N3|cF6=kGoZNj(z)%A2u~Sx zaRfW+y&zIMZ0=^i$Gw4FSjVz;;|eqP>$cX$eFKd_wVr<3mQ_>h5g(8RSJ_eGs-uBL zu1gPUM7xx8a;8uear)%niLaz9Z75~Vk7j%8)Xp6=u%4K?r)8!VkdJ<#bcg;{BB)?% z>Xp+o0B6eOs^&bFO}cP^z7If;WGdFNcodSBI1(NRI5N0@J$B@&|H_2rnV;8*a8olK zLgE`RP3X8WQ!Zr?A4fAydaqd)46Z6*mDvU4z2|yMnW-CpNJrrF@T<#{6B=yVg1H!V z=(LtkOlxf68#=MvK%$0)D1csIul&R(7!Xm8a?ICJ?C75tQR$-+iT1BQJW}+=pfl>>BwU9ZVMw9#No&Fy!Y;6CGDmF|JN?i6S{SQ zDcnxMolQ4%J&q8W=9$F$!@~zgV4X)==#x*AoQxMo;(qdQeP|fEoU)?#()HPHpmt*W zHynIL$pxqUyjjoB2GX+mEbJTlysdUXh@s7(E16qEq+jKbcSmyLG8q}WEc9f!*}+sm z9qg*`B<+sTi#v#KT?$zA{RSl?8OtC0^q7t)?)?C~iPTG3DMu&GCKP;*vX75YaVYXw zuiqH}hB0pIpR$(vyafgog5`3`zkMty+%6l4BX~gU_J-fTm}&8$pa1pN#5*!#S(7~N zqP5#97EJxhJINV5&~KI+mywDkWllgC#Iya6+pgo*@zmi?`J9PPIf*&`Tg=QX!zyLxnV)YLkL2kMH)43 zp$t4bBmVd|M(?fOy`E*3hWO+^H7HcOJTFi#+>})<1 zcPe|teN4k#y*@KPu4eZS_?~G}GC|%2wSW@HLPbeAdm!wttKT<(32<__Xtv?w{8eCJ zn9<|o{HTwac@LEtlv^oRt(N6-@27;A6a$43a#g5pWS&LvSXY09-V2`}Xn~ps<8#x@ zwYZGn+FE>``UWF-$q+J+;ei@0U#lLZYW4DrJ$>5_%Q`^1&QV8n0*LrO z$JcGE>sb6K__EY!o(=EDS}bKucOtdt=BER$kncgxezyIMD6f#!Fv?b{x`lrwBw1jP zX(k&v87DukM<U?-j$Qzr;xmIg&}ZT z7IJ_JYuc@K-}mOkx^bM1Cj{j?0^HbeVR2 z1K!Gk#S+(hDrT0o_qyl%_%#3)ydIU#w!g#`1Nxf7B+GJsl^A1A&QPYruoh#$_#xkF zNr;<;1z}S{stWU&Dw#NkLtC$jZFIM3A2aChrMb=0UINu*&f4<{b|zHnLyc+kKbbMG zdNwR!g3ghMAQnmpQ3D+usVaAk%v8>BN&S>SjK!lNYV?gs zKL;8sk`HuVxwgTx**>OeRVAztR6RbDEl5Gjk1Ng*%#yJLGx}|f>Ht5Z-9sKZIKg6O z#%atzZ*SV`fz@bSj|(e#4ON7)#eQ`xZP7L0pi{#j{Aq4UM%VY3W#k(U zi+;4ScxVw1;F{orJz|L-FH4sw$cJ;L8L$fF$Ch_@wRAi<^*KZ}XnjC)Lg~f^X*Nho zdgbNiS-<3cr1*9#=Q#4u`NN=~+X0^f-pI(XsbV%RIszR5!s?28%$`&-I1b{-6W8G~ zmS03mY6_(vP$1&_drU*r!xB&fVuk{I$*rxZTzWlJm!r{8+g6P<6+=>+-cG;Ulf>fu zw}iys*n>4=63G=VPdR{!E+C&NtgG{)cdNNL1Fo_zDwq{*#e@9M$@RU$cL#t2bn4N^ zwjLc!bidAJnDIp2JUsb!^$nC^dx3Q!1MNvUoyC80@`}XBsU((}TAc!2;T92(4y%87 zfou!lj|w`oL5v6Ohep+mTSF+TjKVOIm-)7|80jn8y)l6G)cFW|zoViv8Np_`_))up zDUR1PINU+%W~o@jqNbgt&XJ4xWT8cDlEUj&%fkzqkv3}W=br3l(Df-P&RN+ZruDrB zewwpY8D%*ZS%Z00-HwcWdA+!r{@2a8bzinRTnmB2iQK-$HBVtlr9;Ie!cDbzMu_mp z0P>zQNb!vY(EoZ@Qk^eWn+T&(uDN}x@d_IM_)n;SiYk;fF4z0QZcGD;oZg+fc)`5- zd;IEEjIU77Uoz^6cld#DcJ#&Obc#Y<`wfS}zZVlCvQeB-k3zjtPGx>&(SK@RQJ_-r z`W?Ex+Q5&05v9$6zgcfb5M%=PLXn-}P&6=yt?BXmfaQl&@>gam_KC$yII4=0(~{}! zgYr^z%Cpzov7O)~e4QW2s^GBp&0BEA*(ohI&L_M>5#;uMC$7qTPw6sK;uaDfgW z;v!O!yky@G#{~4qf68tH);ia6=J|nN7fg6w9`2qB@_@6?VEuS7GJx|`5bzGKPR3GJ zS(?kGx>gvi1ad>r_;je22380oryX=xVMbcLBT~V{-VBJ~ka*xd1(XR~!uXhzUMp84bGbAwW$EG(K;?u!!N zR+1;uYQw6Gx@`2*Isl`;3jNN04G9L4+eZ!|=|8MbN2EK-P18m8o1igK1YhN%O0+lGEuTaP<*O#Z<(ls=#a=G0+k0ax7r#(iK zDOvvfxmAo9=n0Jw6%EXqv7~2%T(@?I6ssaaY;Gwm_ztwJv~vHHl08!8y~*1yckcE>g`Hi8C;ehOyV?H1Sod z;76QgRK!xW2F|ug%p9lj9-=fCUkkSpHQ9%I?k#X6k4a@78x#KtSrH4brzI%>Inu0I zoIA}-L{TF5>wlEWv~*x;0IORnNzwrqHqS`SSM}BJXmdTD^$$`SW8g(rm_a2_$U-F5 zNl)_0`}{kSQ)-eYh>=#==-?=k`VCwyuyOqg5IYm)+e1L$s7r6-QAN_8<29oI{$1;h z{U;A4zWm@4nykR&Tn9{w(Sw7_?wbxY#O>f zZcHR6MMdstJy1UMqx?`&{)zH*$}3&Lt7@WP=Lf-^OWkDZHKKv!p^CHpy^A5 z&@CH*7hqA5?YUApG&dBBior#uegqyx%#%ZUuks7mqA>Uf3SXQ}Xk)yJ4!&tkX~Kb4 z;rSZemwZwm>IM1;we>(c^w&>%_{WtI ziAa-l=!9PX&up;eILBJaQef>|rawdF%F9T4urby1yRW<9d^eS$0y3fbzPepscp*=R z43?(6eflQ+#uGGSDmlIWrkdC3W(=m#kT;tvi%ey6j^+)v75Eyc zJu+>y|C96zPz^mSIk=)y`>jHxpHJeB)dE zVL$JwFq7FsudmE)C#b7sA(VMeLUa+q;%!~VuQ!=$cRS_A`Lf8$ll^U$6!q-J!bw$G zoZ`=w;a(j--dOT|wT@&p8%ar(xpob-VQmvd0}Tq|7S8NGxcyi)a8aB}oD`G=VhdphSFY@e## z*Rw7lS&st7jm&;pT6f65Da4dR6dXR)aHDx9LAxA&E!cm(-TG|Bp}M@A=Y&6V_G zW|kKMwS~D`H7`?&LpGh$j&&bm1g3h0oEqJMUZK=*ReJvTBHLZWIfE_a(XaoP{~%7O z?7i>`u!Uyltn_(#!6ud7I`tObcMH($8f+Yq)t=I6_yT-~TCpShR$Y3=2)h!KkvCa6 zNr~|a9oJkv-GY9>_o1Ae(-2KFjl=uuZ;;s!55b}%JJ8c0_BF3jn~-?Idq_xi$am=# zxz{sr-ZiP$#8PiCd~vP6tLtd=*U{TdT1?@i-&yNk{~~S*T~{*MbY$8fkPmg{IC9hI zHlG&zgvgw3$P9t)t$LwJ{QMwB?D+(r*Uu-$d%j_~0U2>#0y*by`yX(xuZHeBOpW#b zrb!&Ss!8~!fT)hSA}tYXXSW&Q#t(&G}B4l$1_JODrRX|#EM(}$P8OPt{*mNRcum`krA`#jL^~F z{dzZkd(;jvyH>UV9QWp(8$P1$f`f6RSz*(Y9 z8B5lvWDPw#UO67D71nH~ba$_Sj%X#pyb(WTJr<)YJqFC5B+6o0W1k)e0(-ncjj|Uo z(~wpjg--|ZBruZQ^SBO~U!iu46Cd-J>CenURCEGDoXLY3Rf;!00n70Dl*EQBqU;AU z&$3;X*46^_DffW|U)lU6u8wG2UGEbmF4Or$JxR8`9XzjTaIQAx_CksxC?P`{*4$Oj zgqaJi|7Q_S+XylSXy=qIau*J195mOMPj7^=Fd7Fr&5dcn@pa79o6(fhAIiFMrkQ?K zK$mDScOHj*qavH{{@sl&BR?NK$rJyv-Ym@i7kz{s20zx9om@Vm++kf+2>#v~GUN!m zu6LsC0Sjov@=t8pUuU~mn$YRE%{NIJ4Al6_DV{^M=NM1SpJ=ZE&n*`;M!Q`p_Sht`l)!m8;P{0{zIsY6_KX=tQYKFc7)AweZo4>uz^{Qk3f|BKlT(lNxVAMV5 zZ%)aLmOu=RDi3~AU#>jK4TVF`qMH$g4!d)SX)(qTGLNirRuwSx_}Ui+)9+Qc4f$69 z7s-{T#5tQ>*9XjwyBbFb^QP9NO*9X9x@C2JMl=}kh~Xw>w$s+P(hTh-r|dU++V#T& z-y5#kbKqXvkIFuFLjB4=I|AJKqA8_`~u0MNah+6vPz|Btyy(FkNA8Va9 z$ALS$fiC#|7L5dJ8|<$!Ti}_L+-gl zz-*4C-4D17(@NDSC2Y3QP5)!$Q!#{m&EUU8d0N?qehFzAI4TdfU@D8H?cFV>GTU`e zp0C8cf>WZIP~6IyEGH^OjjUj|HwHhZV|-p~>tsAZZmo5&>YS~J?V8D4o2+w zkbEP>AcP6#7uyaZ7AqZL&Aoe;*NlMqzkHf`EpxQF6Nqc0ioDQO1Z-FjA86*t-jzf6&o>?9nWbHH)+&U}v zp>+|GRZLmW&fMD3@BLbwrcdr=S_GUfAqA`47j!M?YF#!+Mm*>DsK!_GA8_=KxbR(` zIVy&7rl`_qf44Ez$0A;6&~3=3R%C%ook61$2XS{PnbKlW-`8YUi!k<;0pkQ6dpNz*M=FNZ3-iqHt+WlsCp`#oo1MZy4%-P7L)@bcjY?1TTN>v2mCY zYr^0nuA10c)G516Aby0_w&cYzQ)H%d@s0tY)!Urtfop*j~HzHT1fVAKNT3y}iyw&UDP?B>~Y(t}%3Na0_A7$_r(lwgURcr*FMTbd}tsV}Nl? z9Z$mI;Dw0U3y-8X`FUmb$19bE^n*FMO#pd~*t0&*r&}`$R*@tOMw3WL+(u5t;q=m7@=)uclup_@-MwQ1oD}UVV~{Al)0b$g z4a>g6WI|p!{jn23i}$4vQq*NvU&x46bsAMhQ_lP)4(|>&BHe63yMS)S}6syfc@)zW)u?;5`kFvJDP&aEai$+ z|6yt%J*Q$=Wb>Z$BInAk#wPMud;#y-ZOj_h8QJ(0CAW|$`mGBY<{cj>UjKHk~iI+j@KmGkRp&pcWm0oO(tOBwHB(@cio%OZYyGJq$bT$q& zfIgAp6krN^cut!`@bptcJeFVtIW%{DFM*8svTCK>ffWXgN+urJt9f*Vos`#o)Z~^& zI9fvuP~_SS7i$h!;MHDl9iFtn3pV6JWn)|#{AWtG2B&6n$eCeSYC^9}+0(2hmF7T@ zw8HV}m7eN1q$4$pMcCV6?k*1OO6?JAenM4)25?AK&W0`3a|5&NGW5a_LYKrJ9U~X*zr@()w|vpCnZYY+|N-P%71t|1&1H=RV5>m zPlojkWw$&Hfbp3I|K13m5h9oDY6{+Sz<=y&&0MXK?te~cApo}NlXcOTX)*s|!+a%` z8m81#P5n>VFebFZGU@S?ElE2nNQJ|fk5-DKW!e*Zk-Z!pR?AGXc|<|%I7`5&2$@QY zx`|6wz|$7JBiv{64Ag1MV#3)YnS`ST^aoZGcPTEI|AU=@`Rh!8n%M;RNfY!Cd9f#8HCHW?k2@- zU1txKShg!ni0vR2*6-kHO)ZH5-ai3rg6tV$+pZrd^Sw#L$@fCCaP+x!TMPf)7?`;#mD6cL%aqO6hLN7p<*m zlglD|ZNE4|u>;bVcapFj4F}Wx%N^KHiFvR>+wcTpE^jj7Ds`p}AD{GzMZ=p4O~+)u zIPuXq=XrA>LyzKq$zV2Cyk(Ba?SUx^MApZDAoXNSFK zrqB69eW8Nlu6Z)k-`cvUD6gJZ6x5`tJ3Xt{-|~43s9WShs8e!lgEm=r6|ip7?6d6^ z@RiH}KMMR7uTg}PfoYiG(=pS4lgU4lQ&CiTV-aJNqH5RKxUBh-bG0CdGB-YfFWSP2 z6wB_EPaBaY?K5GWXi7?ZHe+8i({q2|ka<7*BO%j-At5vhRxOvT;c3b`&J>1r7U*`+mTZV{ae zz9i>;7jdmu0pPK5&MWi!c4CqPUO%wqN+CJP$U&~|A-dl~tf!&gRSEK=wA*Utu7Kio zG($~rgq$=WxTKjMW77~1wL!gyy%jMpvaaAW&kSeb{lH+9d1{PNyuV+yZ zdr)s#lEROoYl}#lLUEygHR>8wG7t#`OWxoOCQ@xy`^X;c_gUjCoy@$@S}wK`?|fV2 zI`S=9`-@Z{<5@tB;EBCSu;_^E|b8#kLjgx9gi zV*Lk~c(2ZtpJ01f_A(4Kf1yq#fpmuw-0$gIcnbCMqcTvn&4-(t4g;Yv1Cr)*+*+cx zlgn9P*rw}1Y1mJvUWbd~{2|Pcw1!m;oD> zpl@zbAY13W6dbmH80_=oU=3(cQfz!H7iHlMF3z9an{Y98~uMS(+p ze=W4M*CY+NcKx&$MxK^lz>zN#vXyp0k5!0u%_i&S;PEbK(@}SAlKv|V29lPD?3 zTao>i9l2KPFk=SBupT9J-7G@+{?7i0dO-pN(;1HQB*RNv&zQ)F7oytC8evtgSd!%L2}@ldPP@T2FAbo$1b-~Xqs@8JfSi~-!a;D_k73Vq8fd$6)p_2}%yr0+4uPN-vR${JHx=v6N7`ooplo#1+I}7CA z#usu|hgC|XMCxzfwiSwkT?s$&t|XeE>i&j>MLxr<)-#6ZFt2kn41f@{IEFJyiP_!5 z#8dkV^0-Q;6eV2~o(}@8jIY?!Q8%fndLCdz-F#%r$!`eb9{RrqP(kJRKW8D<|9{wS zBhM{0@B6e>4{w?!aN~K+8n^l*yN1gZPwHRkM<1JooVWOjer=h#hziq<7J}?kx1v%j zR1ep!km&`pO_qF)f)9g=j8~5cgMmI&`>S0`mJ5PMb)=fLVjR#rHo=RbgOb!p@m?i) z4lTYm<9uDmbR)hv-9pTDZcGZIb(nb!W}3|uZJR094dlNEG#GPmj<)y&M(wtc|4wnqYY~m_yLqT!W80$$!3n5S4Ci6j##8NE(*NM;YIlOG2+1AH!XHP#K z_q_aNSL~7;(#SD;BBhq6f(|)ud{vvu>oUJia?1$npIWumkKL2*eocDV>l~P^7W&FE zH*fMvRX z;R37>!Eeu#-8`a6sb2V~cL71P@*Z|2JA1EPL0kFNm>BiTio4~tJ>WcxyzV8i{e4yS z^&UjuZ#z^d4rxC2SVIs%{@4@)ZT^A%ZEK&q1;&=iUIre^Im+V#hE-T z;+y*`jnz+kO>z&%r6%6_CVT!&l6{dyx{jj+Y*nK$YM8jIc($_6(nO?fVfJEB+UCm zj??JX^=}2N#>5p(Q?;t?9%O-GC}wLT%uDJGYDO<1*dW|ZpQ=)uxBV8HgfZK7<6mqh zINLVBTUY&$XEKt=KMUP&rdugy`T>+Z z^G&j!%G!TBo+g^m7dFYBWf8b{1#9t}8{9DNd2D0GgNhmhttC+RV#;ZlywP7$N-jl07lK8Kg)`NR}z%ze+(Y!%^7rkQAj`)4b?^PC2sTU6E~-XI6gUM$fz zOgI@pg*ijo6WSbKjvQVB?G=MnY`=gY?9XR9?e31|r)*26A64JOM0V3+1H+8BHv)BZX)|MVTuSv8O#yGI+s zx$8d6!JRc5Rx>^>^TNG<#=H)L^Mbj(_nDH}OKsQCQy{II{Hx_s3D-$ktOm(I4?;@b zNv(O%9D_8kX=fclU2#$diI-{qf4acp%}lT@spA0b38nZ#Df6^OwI zjP&YL)y)9B*!JpdebxHGaki^nF(|x*3j!%sh(~6il0Wr)eh_uHe_&Xnqe7?`Jjz}J zcCeBfM^jCxHvQ`+iPT& zEQjPS`FT3kpN+2$u1&o3Tdg+5VpOUOcWOg?{8oo5UDyu=ktVJhvPkKq3 z1~io_t%1E}>s*A>K}6MTAP{_bYx!-~*S-jbF!>JI8z)z0rb@RK9h(-*5hn z_aT}TM+e56#~QA(WUjkad)cw6i4U+xXQ=c!{0(MgmKyRhnra(a zR#(nG!ukC_VtdQ24dv{WA1laLeoIF=_Fnxfxu&MTWg7{TDNg_|HM&EHnOX@j4FxVT@q;^j97e3i2mX zd5ousK5NXzv@EB+o|@Zdc?N8@+J1`-arYY(4E(StD3^>#N9vO{d9t0#rkx5FU}dJ? zx$@N{=d5&K5{()Q(KDmi_^RXT?zigh_A72!2W(@@5 zLYW9~qSPF0AAPkMwW2uOw&9cP}`SV zZ(kmgs@{Y}+J$52jtSMM?Jd(C%luMC2OFD~_x(au|H-XF>Jq1rP_ z*>JuxkT=SkXdQk@?{PW_^!D*sCjtUC42$A4ypZPXu;+Uz^u5j4nvl+o>OgA1gd!hz zycgKU2zcd^mRmRoWxmQjx)goW5(}hlA%i1`UElbr#|&%``Xc%FQ5D%U-$@66*X-^I zNA^)r`)m2IxUhb`#O?%^=LV-jE8p?+0DnM)U3OwWP~_Zx6-Y%qLUp982%DC+bckW# zVd19%DQ;%RvEKj2e;;I{1kn0si~jDY{JR=+xLR5)T(Nh}6d+j)NS!M9G0;r&|BUE&hnHHVax+kbe#X2X=HEAr}H;~WaOq^txo z3^W#9v>S6`$10ooLA}9ENtaSCD>o&F=eMnjGaERfv2qI}xLVbLP(~S#jjz@xuQL)i z%b=V?5w`fV6@Q_HFo`poOZL3aZh{!PzNkk0g%w7Bj}s?pslMhF#>P6%^|{nnItbXH z`WiaKVNvO~bv0~D&kc^1B9Ht|y)R|%L#GW7*3Y0YZqeWX3*+xLq*u5}ZR})Ox%#e~ z8Me7TeWwPx2=aG)K-Te{x*X6aN$9Pk%q^O<>;))VJ8CEy`UJMUv4GMk#lSIg3bmft zmAJFklBoG9HyVj97Df0C0|pgcH+3^Xg%wn91>%||HzTf08 zL?v)F3+sp@ZygskmA(n@-->6+pN78{M$NnUNo%z${a%DAMIG%Sl}#!1YeoJbBM`E=04Q$tBEx?Kt|N6+#=##I*6LBj|@lRhzd*McgZ z-J&HH&akVx+)A`+{vuQqv(JSks=Zdjbt44P?^hhRRcx!jO~@m=p}8l!@n^w{7-~E= zF6W61I=cv<2|sS8)+tLZ5*_SpsxyVor)M5KZAn>f?$w!Spiico5FR@%{CJ%1UcH`S zn-?f?&|O@vlDxu}Xa&rty6uUg-xv6x_X&yN+1eknJo5<|m(@iFXGCclqV^}*U=>T&;?QA0z%cV=f(6 zUwB4Hd{eda-iQcc^|2Ma#uLQ-yz*-)-W1*>B<3j_@h$(pKBBU2TWKwde`clN+KEk7 z|0V*3{$S(kwt0w2I)@NZ_f{xDuR1Dw9mJUS%gCpCUL_o3RimoI*E!&HhCkUu!L zoxszlX@@xa!QRyM7|y9zVJF|o#(AVgJho%pSzHje7{+$Dhg?VP7x!X1XQc$-^jQ!YQ9pBB5z~5rG z%X+Af+kO&34DfN}q?)qqBe&+|b!EdTL*7>R;I%xzqUIpC4W z|6L5BhyYqjixQcJzS*HF!K8%>gH0bh~Nkky7 zPm_2p7X?q)0zo2y)(;lqx*K?8Z~eXYH{K1T$v-zf+2yt= zdDazX6n0tU_a9f3tO2e@Cd3?DGT6KDpBxsw3VkeTCCf|6fR7j)@dc+eqYCnU9Z*L2 z8)?T2k`6}8CDabv31K$tr|$!wXf2}yDBKJP%j#POxmw`>hc-;5lIU8 z9xqI?@11;3tf$K<{@AZoEXJH%h~a?l@)oW4tc24I1ZJar9O!iB%! zEB-22lvm_sk^LO@PU-iXs{Y>dm!uOHVCkH_a>`p!-K}b5g?*@Zi>wO!XG+Qogk9ps zLP6{4RWb}*NanDxE;t-9mg zq%OUa?aw0^S+sVbL%{tB)C?)0S%zzDql8nfx;Uxicm3n7=gzr8aw9$of$%La_rIG5 z%qi3A|2~oAa5~~ENA(R79{#yhA%c#m={1MFz+M}F`~a-k4C*-rHQD=^C&Mje9$ip| zn8vZ)+x!P*qg>KWW3VX`aiPak6HteaB<~sd;Uk`rKcIeef>#P`>R}2Vr`Ut0esrvm zY}#>aU(`s7@ve=QbzL!0l8crS9z5cc`$+1yPk{G%0J&rdSxY?r2z=b4h?1C#fK zRZf_C^w%^nacZFp# zw(tLxb+jB%+&yWX4}494Mr$8uS-O6uhS;WksRS_$?~rGG!z^PHSj^?N`5W^p`dNmq z;gde>TPt^XKw+tGDM(U?OBl<6*FT%QQi{x2>7d*H7v)CB%8)9%phYV3f#IJJB#0pX zTNx{`5lRoVJe~MR-u+G`yyc=iy@$?uRXT(XeHG^w##k`)^s8glmf9yJm0YEQ3kw_F z%{LOE&XcZ2_`(6c`3%dsChwVSUg|bYnk!`=vPxKgHYEsqT{0B~UR1afx$-B9g3HN> zgPDJ1#X=&K52?9#FFeXm(H;6j=eqz!pj*LpGn-LN2?=KcYb!0(Pe=^n{=7&+>aFIW zxGlkErJ0%qACNf7mByf|-X)5oWlGQ2yI`6!e04MO@|**I_-V8l?i##lP^SCla}tSL z`z7az6;FlF$zzZ~!hl_8M49%)^vLvhwC2bAo$!h1HpcbhT|50Op95wS6LHz z`MhPLF%UNiX&j)R?iS=-Mkui7LbbquA9*+;>5MHn3ovMNcQ0&5Xc(_1z9j3@SV{Z` z5AROm#Uz#Ah6Hx`J(SeMemx{6c+2JvUp!I;u1?X579%YGd7hue*iI4 z_KhAE_f6zdR=(!IXt0?=;xciMZGCg|7%uJwyz-+T__I<{1)|bx&^IB8Vsjva;m(Y6 zx%%%Qy{VfytIu;2cq7kN{nNRx?A@Uqwq|N)VHI#=Ev*ah|2x{;|HJW%XV%r9cFw!w z5uY0GNjFSd#{{YO_FjxWpu=Ztwn{#>8^0vesCzHCdC<2xc1a8f$u$)(GMWt4+Jt#< zhA0FLF6NJ4>$fN3SdOU>b?M=;g*GX39;+iFaX0$a-Y;c#4M{(oj6NX0Tld!7m|6Mu zI~qO~Y25MY#mAd7Ix}#ZlbPRtKc)aLaDXl=L(J?~Yajnx<$2mZh(Jxwh*#7RL<8;I z6zBe$v#B?;ciXW_O$c>NILWmM;^B{>5D*I`rM5-iebkArC+AWz=Lb4Y0lFB&x8QRU z&{IDdQqo83Pc03&yTIS$nRc6P1fID0mFOtWm))El-tU+vz_z+>ZXKc)0`$Bb0w*Ly znVg*w!u7w_Di0eAFsF&lBgr0-KLCnI36zr z%*!i%3-h?hpN<8gX5Ho)bHAoGb6(yW=IuI9#_!J zK8zpB20unfJNtHK$g$Uyj95o{V0~>RjZDArubnjSDb*53NUo@byM?`vZ|(wrwX3X^ zX6aL!^&q9erzM?Uc(2(tjnMmp<>{N+ofqms&|0haOWs%1i#MYK!iA2T&K2>$1xwk}oO_7l>M2rX7t(TOIm zpl``JYyIQ(8#lJ*+u2p3qb3pb$IC@`FD{X;nUd9BP!AK3gnN+@x^+puxeP5@+;C_O zeRt_{j9Im0^Z|)n-d*Ceh>I~}`#kh-MKj!6S~l84whCMRY`HWUr`MjL6QS$ypOr6j zLNtk%T1+>pt|LWyCCheD zfn6RP&53Ylw;-XXp}RfS`&wOYLMW#F82E{!1`(9Gh?FOZ&86zJ7av+f)BQ#Qz{6z? z_a^J^+7c2!&-F|AF>m}f=}WvCT7Akx{HQSFTi6k zl9Iqrx})op9|&L>-t^&n2W$;CAREp-S;tk?q1JFEviQYcW%46u0(ES~FOe1mU#MG| zWQ*#mhtVNv@Pt$DCW8$yDzM!*wgn^Y=VPEhIu@#(VglLKN%hsUWoky*mG~vZeK? z$-dat6PC-up0d@k?ku#iv=+C@{R3+BZuD9gh*3|D6R zO1p!7UOHJ?@YBnAh1*Ovze%+p*jJFJfEkLlQLBEs8@X8FT#r8(nCsyhU@?iQvl~TB8)SmS8J%7P53zQanuZ)lfw9uI z_`jWF+qk!E9F}NaK}?rJdJq7I-nJZg53XUs)WT!U+k2bKvXYA3oim`?ldM0Uqh&a? z1vwMFhA){*W#baL(4Qy8F$dyr#8!3<>-rOblB076?gzOg=+#G|Ex3R8o>R!Zij$`Y zo$mM(Ck6E)l=qT~0kS03QbA_)x9KC^4&7rovby2~o$h8mrfStGAJ*nYgx!a9cHhBVw_v$|+%xa!21hOI3y{1C`iaTLT3|D}6G%&4=M9~J)J5)Da8t;_32%iyTD>*bIr zam5tdfY-go#q$MHctqU4chl_Wt_~nk_w)|D-A(b@f8xT>_~RR z!#9u2FrWF&V&H82<4s^3uED|Di&vs2h|0D{wjGofeA#mI-4X>7j{W&*a2dBbwrHWd zHYTN z1dpqnFnK4;i@$n@5}b)-r*^)xrk8@K5AU|rxFIj)e0lk(mKZ_~*NghEdeP0*fw)8Z zrlI*FMNLSe9AW^Fc1hCK>&shpD1T?<1NZy~{+|wAno|}EPiOI8aQ^I?z$?XRvhP=a zIux*~A}Y)-u*1qOB}G`5L}}NHn|!YFZ%9Sa`?v+F`Ag^0B?P=+CPK*(o>8Oxlf=;? zkGzT(=`}K+>^x?`q`7Q%cmJhZ1+smh_Q|sVCd+ep z0!ss4Qq$Kva&Jax4A(9?#?-ENiWW^t7zj18;Ko%Oy)is^Ou||YJL_N(x+IvJqp0X1 zNL4prGEw5I=#)=p*^RWE^A^mRl&6`3CrekN3r=XIdXdIx=0#~k4RvBi*pr_N*^Hu} z>IzC9ssx5VMEuwR&c7+33ayfJF!_83QJItSm>E0+Br0xPo-_h!GBgjFOAe9tg$j)U z`7v14kw_Kl3eL;})&X1TjL5$Viv{&XyNa`@JPpX0CI$6f+kXpcISKG&tZneyJ0cz$ z6}^~VzK$l22S-%G7mGSgt!-i-x;Jetsc9OCQ$*?-GkdM5HK)9cWJgCsC8ttuPA zqA<%Tz`FuEElkFJxc0kFfwBawv`}&h0-GEvDHL(!nFK?OPx77gJ^ub+UmSry`Bx!6XfMt1lhH{1$D0?IL!YTZ ztrUZv4{wAt$)e=K^c$2$yc9yc{|Ao0k|6nspUDS4SG)W#%@^Nn^*5Aw)GY7agneOL zmVkMx{M(|QKAZOipkD_6-tjQW+NQU?P!$_U1(!EDzU>^htd7BAi2F`zM4|ZdZfedH zJ|LIJ{uj=!A@k{FzL$rZnO|uR*&Z+$sAw~x_h4tj2!`t{QgrzT60WNezd|#%m`*VGePjZY3Mjf|VeO1M+ zZEBG1jO#PdJYK73rVJn4iDlACcGUik_K7s7d+ea|9nj3t#9OEptX7W%HS7UkM3Q-_ zv7LFA>j6FrSEO9&J_;|NYY+6Jh+L@m5h8<<%Wvx_WA&nciC#j3F__uW0TzRm+sl(O zfxzz0{qU);*+FoM;285k#T#`FG)PK?)7^= zsGxK>Cdx23*3n3do>|ubR`UDFu&p#U3wKagxxV-HyC^Kf6pth}y3zIKzK(Hy`0i1R z4?T3)TWYKEE$}dbZJX;pchWBGF^N(S7$S~%1#f{GwXtU&EA-J-Rw52-tC`xVWii4i z@3E$TJ9+2}A)jhBEXX#Pw8YyiCFx^~8NHymFJsrw{1hw)$hmYoZvPzmlXs;9E;?q+ zOWOpJx-ivIa2u00I3GD1SC*k`o+PQ^?*tOEg{m@O5zyG{qe(tsMwTmv%mO0>o|x@p z-b8T6-Ds`S(sEp7m$+;?nd>lfP(OxbBMrT8CiYif5*<-V!z3m}R_S~s7c!+v7t7ktTp^G7>AsJ;fi{$nFy z-ld=f1#hy`elKVkhT7dGvLZ*7hL<`d1*d9P?uALMEg5jbMdI|;+6wZz?qVwHpw?mLj6d&WzZ?Xq`Z(4|Zt3iQ2`Qs+&V(K& zik6jR*gd~3Cvf`Av~Qxkr&%?uf95cYdc-LGZIZ{-LG`|aWF@eS3V0S(!14%w*<9K7 zS1Cd@Xj`4R_ELeHyQ_9?ln>ApVzFBX)uENRHwucQC8b-!CtWkK=AcHd*duRVi$mx5 zP)ZRo|4vCC`uxD?C?pd78w)IZBIV+;lQbvRWI1Tt$CcYZc{ZxRtqTZ6WLEnEzDIp3 zYk^ZX?gMZ1wZwuRjtZWzJgytB#!d_LamHt(k-yJ(?47^*db}tuY#KizwuH6D3@|Y| z%#i6fFD%Ih!MvJ_iV5OvO-Gb(7;o#2lA#+|YS!^*ZA{j|T7Z^_Nzi=72NE4@o!w<+?i5@9(&j6>wregMciH) z(ugB+1*HEQf60DeOxFFi?o%e&=JXE7;{edn>(WQJskRJ`y8<>vD)Bh3?XHXCvjDg} z(~lEA02<|xT5mXoqWs^YY~&W)!sHJp{ko`eqcxa&?me{4g{{@ITt^c`96ce1S}x>v zJOgU$ZzWYJ^-pikFKR(04Rflo-;gN104BU~Q^&z%99>(_Rr10Ao2T7}vFE8 zT#q()z_LNpIq9VO|zK;Xraeq#8Y2yW+q0?|C z;7PY_;-F`0WzItQ6(sS1XOD9NgRsK#8(0v~JoBIYM%GkvtR+joYU?@HN$(TNmW2ig z;6E;XKB5pIt}*7u-X7I@{~nnjE9JQrV64q9tucbt>ar?2@*YzKq*v6=O}kf|AiPevQ5 zJxTo!4255DmVt(%`;HWc@Fo%yO=Avc>Q&7s7!8Pz4(7?$!oB;@ z2CJt71SC{_!?ioNT#=$o%$%8D1o66c!@j_xW}E`WxDzHHFKbe^s5p=6Hl6a`?K@KfU@KxAgU}idmdPpS&J+^dTFHtp-#MwBK-px%DVw?MRCjzpw(C_NkW1 z${eXFVsFa_)nx>B#n!nn8zS5MThfs?U`cDWT=98-ZPmL@;8Oz-6FbHEAg!OqI8Mm0 zoJD$Ayx>`X;;1z|$jm%2uOmYx*%mwt#bmbpAL$6vxh~;n{dSMw4=ap?8Y_3gqK>1= zywfV$Y7hFp0b!Gkr*E%}S!>@He#lDFs$2U0YJ2Sm;%sl*;c*&Sj8)ec6*$}yE#t(! zS5Jj361x8TJ?tJq82{%_V{SU5fRWi~xZ2~~Z$!hdz+JHU8`w<@$m!nW({8wX<@yY= z<$97eUT{06B`*eAczU+4IJqQyKS7j1jRaog>K0Cn#l388AqRlL%bl1voIm*rsw~E$ zO#jBt*H&twdYN-@fh*!rs5f3QyUzoM`~cUy^<&QA(orQddfzY^V4xp>!)zt^JLKJP z6;RZad@7e)hRp`acbTY-8<~j^<{Bte-SV`4%WgO-*;x` zfr)|h>ViIixn#3#9-P7OSHm(7^v*y81(!ZUb`3fH*pEc9%Vrhy!Cf&HhnI1b?Es#@ z#fNL_pJ%L?0lllIo_2vVDC{cHim={=p6lRDPpF}gW+HV^yr7FesDah;Kx$5 z`Z$RSZ3!t7a?Et8VM4pRea+;b;!l>omw5i10{m0JqMd%QL`}%DGgj8o`+E;4_!sT1Nj4IwJU_KtBY7W|GhhN=9R0Tm=REN9 zJ&KQxy}9}M~)R z?Qz!c=p2f$&s)EvgFI?(|0ji#lW`8`5!h_m8F*j~&VngbWh*wkUhW?Z>tkGfH4tAt z-pW~hNi#swNe#+=0%5^Y(N&IcZe^gYpLj`;t6)|72Ov&?AG66#4q z`1ojL_f|l`7u2lqq4LFQ$9`;DT9#4nvf&}&;{Uo_*mxK%WI4F&DJcV?PKc2aw-2`n zmvq~B*E^RuqJAI$lHZhzIZO?^^W_Ed8rfF-=?=O#K&~~GL~M9@mosR4RSjH-4z8T7 zVmF=*%&eP%Pdqf?hbtf(fMmW*b1V>NCt0+!5 z$zV!ec_O2-xkIwk>sww)DrG^pt!wdxT*Q0jr~xkR+kSBo@OGq-9ND*0{iF(3Cj_do z2**e=M7n%sWn)c{FczpwH=B%5i3*VMH_(x@J@mx*f4gI`=$|gxy=Gq?Rr{}+j4-V# zx|dGEsRY^1Kc!VA8G3y2ohup#>L=W&+BTC5m6p~&mJCXudltNei23^o#BdhHm?NBN zmYY=RzK2D<+ssp?`{K=wuVMGq<|V+t6(9{FwkIJ_O`kkw$x;Jkp0zgPpxLmy2qQ+= zW$mlKES}{MmfwdW}|i8yEq1H7liZd9`hD7GqZ6C0PF%mRcYqsko!s|>j**M zTTYFP(oYP7LLm))etocSrfG)L5fdsu>F@#+AxW} z_{kH?Xr#i|HmGPxt5i?kU>0-y8uJ6daO5GhQDow!r!@dwD!E}U_`%fa@?-@jbyX{l z(&MFoCfGyrwH@V zAQemc&x1>8Do-lg|z2{@gp9O%QN8jy=g4mptb!>Alt9 z9s58iuMS%0x0I%0D7i%P5{%~wjj0(FgCsN)Hu)nW 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 z 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�vf|94Kp~~opecqibN7uI=W|(ee6VL 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�ADB!HjMpc(pNoVcrVQ`t^Vv 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

    st0t)S){Ycs~7I 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%0D&-7!f0G}S`PGdpxN!Wa|q!3O?rATP8kAw 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

    l zvabF(9!rxnP^ZDwd$+_1ivwz&8ca`$m*NarG?_+uGjhQRdfn<@vtQ$c3f^$}ogm`` zVpD%hHP2MhAusoJrgJ8XsY_KYbb2_m4E#{~0%K@)jE6}J`vLaeN{tWnEMX9gR<~UkJX|gosKn?LQbPVG79dDzDcRPk_Nqk z^3wAIUT}||%H%;~QNy#= z3_v4h+@PbSvx{xnfeL#>7Xk7s+0K$@NU>s(HiqWGL7wLNhM}RzFd>;*2Lp)`ClYi~ zjj`UQflm$%bv9W`%Yq;PG)NS=*a6pEH-Tis?*X5kb8uoN1|#tChyAFa=fNk}6|}C+ zECJZ@9AMeX(_Jbsq8;H84NkmRW~o+!HOw@J^cy&|$99JmjM2N`w9}T7b#6RSG}D=C z$`+?>aNL(c<)oHK)Njd*Jk^_S?2Ywg2#O2g<|B_-RO?yt4CK=oaU0ybFag1xA^ zR|U)q90t!|={KYnc{ zU>SqK|)n*lK*F&mds|;yg1f2I`Hz7k;`H&c;1$o;kE%>C}Y5?IM-43QVNgYLxT5n1+uUQE2 zwsTy1pZ`$VM?BjH8#Udr3~p>Aq6jbV-090XSKIM>Mmb+j ztTOuH9f9SPdnws^y#n$B4~^I7Hb7V01am9pw=s4d=!jQqm_^Ws%HCZG|76;DfvWLx zC>>fT0nV{Ht+nw<#X8Xuy&Kr(MMMOND3rz-48P5z)tag#Kq=1X+;aBimdKRVE|0E# zI-mcR2_mS-&o81)(SSNXrI-J44k*rL;##9Pcq+ITd3Xa`U@?r(%3r2hwzHP&z*kz( z8#=gMGUb5B1c`22|5N+tnkt$4px5%fCdmA#^&HldgpRNHh;ai4WtTLJVav>^kg2jS z-5unOfdqPlv4lbM*jQ?O{ZiBZQ5h38;T&J0v;4ToHrfRrx25nz&4q$#(KqzE3-uAEhVZl$n@m z@G*N%QIZy|8K=J=oSmK^HH}`7s*}t*((?IO1WsB*UVWicqBO9hY7hMi_2ylCh6vq; zMrN@gcH8pfiM&T$o$X4+81{257=019uMzd2>sJ+{HuZ!n)W1k1vemb3QWoU2q2 z;10eh!&B(JPzM%=I$f?Az-16Gp{8w(v;A9ogMRoF>w_-$|d>;&j~4YM%l zJZMEA9D(iV^{jtThXR0MvLkJ>jZjx*?YUfVJ1>N2?i*}u1yqG5n8mVI49{cT=Mc}0 zqZsw_g%V71EPZ(#WM-fHTAlMa49FAXN}T`uJNTXIFD5sIqzwGAs881kpz1VPw7R-f z#IH(*JnuVlgALi>2fu?$lW9K9VEIb6Ni#v%K0(O9bmE|akxR=~t(p>g_W1gz5?|k_ zl8{1p?N_oFd9<(3i+{#;(EXUG+qtQObAuTvE&x4%9E_e2!a2v8LV~eF+Z0c4Q3!u4mHAgTR6PO@_ z&;Y`Td7K+H=4fAi0lIt?oj-Q)0_N@^2rP4m>gk)4pTdR+gPBaAc<_aGU~i)*6a9~l z@-}W8>QrSq>1ON{6{fvWQdN6*8DsyvPKGyK+bGZRIIvH@lyf(^?@RP^Dvq3wwH=r= zge3EV(RykVGu=|bb%HlKA~iRfN_(ZRr^O_hHUypy4!|kWjr2DyWqrw@c=`|8jgU1?x#l*IaZ0 z@Q18?2Kv=cXjvNLa+z+lfU#Bcllt_o0mi>bNhvqd`rxly4hA)pK=uglDe6GHFuP0u zJ`nZC54qUdnq3~Y&FeI4n&T%KN2Ftn1kEI_4yt&0jX0R zJ*rpKGk|9Lm()fXPSYF4xNpho5=G$7S^UHa{eunJGaOwv=PqdKEc&bzm4tEA8~8tz@zC?k63Me60Ji+ z@?Z1VCpMit{oXgkG_)@^7OAeEvVQeTm2PC%hzwh>3Md|Ov4!6-_ctA~t0i+xEy4>b{%{hYTsPcg`!ilVw(lQ-!{FV1g(bqT#42DJ3{+aux7JgRY zKHbX1Xda8#BcV0hT&cBv)@Sp4n`NZOHU1MGLyufAH}{h-jO8HC_Ei|z9}dox z)UdD@wFMc3gDtxEU`=?b0u({q{<~!ZO;~~DsVb3Kp-@@jvG|S9TlIXH2515 zMB8%j2l|N)&p@~=rHMp@PV`(I#7csC3zc^LZ=%vJP?C#zH%0B>SoMpA{=PZg3t5JU z&uj&uvzvM6O2fsqs;z_t^^c4O@WBNu^eJ<-BVk)01FIv`j$=t-4Zp~@s1BIl6)boT zWmenkVgHQ@rY7Sm0tdd-+qz94DLaW=8bb(D-B zSQLysIS{s8*#Y_55RQJ@=|c8msUg=JdjggYO5IMUC@k_RydQyKFWY2f8(lJbd^Jyz zpP093@_R!tk3FzK?kCy%W4%W50dFw3=<7QU;CvMql7`4yz-3-I?~#%vJQ<%9jxhh@ zKXqy4Yp*RfG18KM5n>E=5-Pf=Nu}@cWO%V*IiY2Tr?8p%OcFFx3yJI23_ocFV^3ir zi<2Qf*6sC@hP@@u(4SI#e2alE)$B-$p8zQoK!`S3SIU|SiMjz}aeZ|u{9oT#)qFj+ zt$g3f=AN*Rc$TPKxg!@HK{jMxi0e=69C1JjXUJ#|)Rtwh3nYhP_A%JkdcfjkcPj1D z20U(o;Eh${Os_;JlJ)RM z>HA}0Au!{@Y@QXB281fL3p zc+?)&RLa4$Q7h<#ve(~K5p@Tg367KR918*%!*(sl zsz8KVHR7yhzoB1BmL1CIoy5-+y`@R}o0ImJaKHKj_|A>yUt03C7K}-TaB=#vR4C?z zAfoc;cu{bliX=6?oa(r`@h873$C@nhD$72gxC6>*w!hSTWuTak_>(@pGDPb$r+$@9P{Ai46Ava44kGhG^sdl*orMhS6 zP@XEA@SULq(h)GMp`*vO*J{!W)M*9mm(3s8VQ+w|OT=2OaI3i+u8zw~u;^219w!~* zhLY58V6s;#*spl8V+Chl3J2ygA~^YCL%wc%mkxffAX0j-Xt67Mt%iQl>=NBVxCN>K zxL@8rBUN$TiX%`-l6Wel7praBb@6>0I;Nqsn7=j|dDG8@wZh}XQTGOKT_(7&<@fC% z?54HDI{j+SjumFfpsH#KevQ5o%flIPeQ zKVJ&7xB0>!fAVnntbCm)4c81X#;>U!2n_r5^L^#Ex-$-|?d99)jV=qo0JRNEKU7SN$LhN<7jM;xOTz3b^WNuxh6`BrtBECo(Cul=jL*pN4ir)BhK69j<1 zxYk^*m8RP0Ki&2 zdabgiFdm_jl$R#56^x(`WTcH*TU4$SOpQcO5PJr{NNkPAEi?PQMT)RmoU|^;`xb4B zey|91PExuw+dN?XL)AFJ&Xkx-W$G|a+*@vmF@o-_i5Lltjk5i6;KWKFqWIs%pjefv zij*<5M4u^{-U(a7Kjd}vZQ@tLJGg6)!ag80PVyMoxUWP}9sd%y@5b)Y7(hK}zttm&aS7~Rk z`WoGn{Y;V<0o{1h9ks5%bkzuJ*69W$f0h+965(ZBpZRjtim5l zQ-PA@Re}@y(B<}3NmV(J_e^LVLtIhWvEX&2GFlS#F^FmDB*RPF&KiB=#th+Uc*TZN_V zOh0A9;vO6SwzrxdvOrk&@(<%F&k-4f=f?EaNyYRNy?(_g1B{>cE3>JEQnISqIf5T( z`UBC|+)Dzr4C36O!eA(viL;9~3Vl~$G}bQ{?6zzeo-M(KcES!uTj*V0!(K@O z?DI}}v>PHVLGPwo|DgtO^x4bH)o_fQKnD5pZQ;2k1y=QGzbDtZNd)NLwe|sZOLOu^ zo#P|;1Q2HU(8{y8!Uu*BibtJx0tHuF=r-NcG|)l9D&;7K*C~vqJTLp~4Y5@S#m&-U zYVF{il-`>Bhnv69AucKnr)nOzeXlSz*r%I9;6@ctJ?%LVgI|>dV4ANi3sINECcI<3 z0Ku8vnzTx8I%^4;%sEgs2=h@(6Z{wes`sDJgODCJ}W z4VYXd6O^Kkek+wo?Xg%i;XJB)8=`XE@Esijiwae<*VsZU&MzFR`{RwYxu#DLT&&WSl{$OMvXoTIIp;-AiWk3fZ@qoSm@cq>;NY}X~{nYf4D?n!+Xhxp3 zGQ)1jY8b!FAzOsh!s3Xl+M=3+#P@k?sih1)-}`sosj>U??h9OT9io^A{U1qJ9nfU^ zc3(vS5fJG{B&B1>Na+-$rIC_JkB}B=fzcp}qoqbE-AD^4FjBf19nv81-TQrizrO6* zv-`f{oO7M)wVvdguudx4AqCHqs90f=sDb_=6wTQV-QFaAVb9=GeQK7;A=fWf?(j6S zb!DlVCoapMV+QK(E#9dX6XR&E);f>G4SAZv>rG!t9Q$$`13>L>Q*jZH7Z8LQ<(Pd`8;bYO!|%aZc>xPyO?tL!UgLk!Vb*#Z1}knES=cF|k7~(Nhe@vdMbhYntx{AYSMdeMtlTG`XNRC0P}xd> zX43D7yv=52m2B5&X5-K`TH>E5?z^@E!#3kE`pm-v5eYf4^D>cliZk5Z4VK-Drnv=t zz4=1(Jthx53g>=*&y{VQj^2tw3hRlKuFV$OeWPY#{z|N;ab8mFt6Lg`8zEJyD(FN1%ohjj#?m?SX%O=7SyUnM-3f?o)>{2(={!B7(TrY%>Ay@zqBC4J=G5 z-hh^*LfJE5*lGJxVAAv)BU@exT}o#k+qNowHmU%P;~mPC%I5`-;`;Y7`=PXZwp4R4 z(g`&l?3#11ouk$<9Zn>m@z!i? z+*{qSnX$n)FLJ*Xl;J9h)`Hm6`mi0B_l(Qe{SM0(v?aH9ZleVYqV?rJ_nGHF#)0_{hRigsvJMvYY5LNQpx$690y1=%iQG|1q6wFv9ie`i? zLqhY}Y1KKPI+=^E&Wu!#=sJSBmn-wZET z_?D6K>k+^On+l4tf?$UT;bw>sBw`<>aD0O)+h7a@YqV+QQBRb1oR z#qd}X7~Y~v9f;dA1@eX)GzPQSSyE!N2;@-Wf&xhZC~~K9DGUsibP@!?dGd&=Sn;T& zeQ^CTTd)OB?yT}qj6z>o_bUBU(Iz|Q&zU^_jhl4y4_l^zR2yqh`j~RPtQz7e{;5(7 z*_~L!_Q^tqaP!oTGCCM%_PE=ZA5R=)Q!Mh{F|L6ok2REJp0a4OmT>qe0gQO5?K9u+ z;!2|&8YF$4o{3#Iw)y7y$zN6cG1Pw=kh;*v3w0HIufJ+NRCfE-ZDoqHX!Qa1PdM#; zC}`Ha6nVFct&ThV9RTh1AQWuu5_k$@0uw7<>VetS-A_0V4uYsaB4s-hV6=1s#AJ|L zX-8hv;-`y5KIp`pAqeBrKYws)=1pygptGVHrN*Wg=(Ee^em_`#`N92O<8I^&$Y}5v z;d@n!H@PI`q;I`T)cXr5XZ6Pv1lY-Yl;#>o-y6V|RZAZIq6={iey zZs(r9$Ro>Fti-x=v!9rlQ;_*LT-N7TO@qfm?egEnjY>Pb)h)Hz6)UQneKmHtQO}4t!ZA+L z7r?gjav%1I6VIj#b-)4hzdv{Md93ib7OZUrZNtCxQ4Z$k#jV0<8BYKN+~+`SaCh4L zdybb&o4BjIFQaSvR$JdtGh@`onf?HU7w&G*uv6mny0(#N<1#x_g?C0977!y8QQ;54+vAFf}JJF3mG(TjU9@ zVBA6P8PeRlM3+l+&mb_TZQT%6GUtkN@V5aMLqLI6Tc@EmfckXL{^h&;i>cVgLASlqX@JMj z88EI(%sW2>F0Wdty@!tL;1FvUZ@WQC{23($;EKyK^=7?U;wkNHz&@GFLB>UV!ozO>YL ztvcMEE8RKO>cms3WobHT>i%`b;ea8qwl@02{6`-KOGac)%7n#AGcRjO0TS`YZyI6G zBn+(I0tZb~OCg)CG2o-okxvWbWXqXYCgor{DK2DRZh2hDg2$r3T-7Wxq!qm1PBS`* zR3Rd8o^bcmY_BCOR2ndM_3FZ-ZC-Fqh+Rk~zTuT;nHdksYyXXC&;qQ7{J|nAd2;`g z>}yRXz%xL#M0pkm&k1T67RiXJ@yW<$?_M8@0M?UTUh5|4u-|`6zJBOYRUKSaPm`6R zVNN^Zn_!=UH}-k*uzB;?Yvu$<(P18n;o0+1 zc+Vk!{Kw=ve)Z-GMvZPZ)tiD)0o%t_lBb*NEYoL_vOFRxX-o{J0`@ft=^?7KNDy97|?w zXpN3-dVk?Hp8Xt&TjZk5=HoKXa-W#R_;gv;8;kajD@tZAH87Zi{y6tzT`;Dujp@D@ zAbAbBB7A2UDz+kn*rkF_E_TH3CTQ_zWwJ%&wF12bXD&4ZV)|-B0mpfOPXGHtQw1l= z$};a$gFP15jd?Uv|IU zR!Sa#Gzx3>r@>Rk2A-U*C#IjtoM2`nWc{B$fltK$5$2}(#U*lzj3{}ACD9T>Mi`Y-U1X z5u0KSzpCaU$cQKcV!0`pjhY`2jWHTGS_^?zIb(p$+AJK4dMeE)|MIzKz_j{ud9Le> z@Q&t#v^m7b*U7jIL$EhJ5@DQV#cA`!jKfwlb{$G=gNoY<#Z02;_tB(R&oW61(&neL zK8MB;5-8&m@hk0d()LD%f0^3bG~{8K+ZQH@hJT4!-@oZyo{Qfxx5{C*sfyWM5>vlj z>Zm@UYwZI1(5H9wO(ipzbH=`Xfk`%d2)-Pne@Xo^mUt_``eBPr);D+=4s^)XY)$jD zRP3~%)n+~P(uSJ5eR34#1 z^||^7lEAo5ZT!WWgb$Ah85h?7xIbpRVT_!YL(b2JLI%s@UyX!CEKm?GZ(sPa)^K~u zPYkCe439j&io~^b|9;#eyfqmk-ZAi(5!8Alvea#yKSmnvXh5LR;WaXciOViprSHwD zxg4>J>dgG9Rn0YkWJ*PTHr{s0bXjLqfH({*`CwumdO`}ZZYoZQ#N`SO?@s%OyeRf? z%N?>-1+SZx^GRHS+XPD|2Q6n_K{GvEEi*A^>)!X*m)(4!!oxq^*`}Nq0lKHPOu?^D zL&-<0H+3N(98C#IlavJ;8_Sy4TVzBvqy0sX4euv0t}AeV-33~)P?@Bceo9ySSUHZd zg|UGxRLWRG0W;B=$Iia&Y?l=HYh40O>xNyQI#Qkjs^CV?Jo7sAARc>dyzFf4-@?#uCaJ_`^9F@VII7d3M?+4i1T2 z`RlzkY}FhL5n^GhUM+b6iBC^+?=7LE-^*#jR-d9wQ*oHhsGXp9Ig5R<$=_EYhZm-3 z9wR=zm}J68Qe{~<)PF}J zPK1Ug4+s_PX7GZq0|o~4OH;-ba@$AS_1-|AEU)lng$P*8Qv#~z?jtp&QEPScPp~6# zXO_MGIeL+UmQRM*lH)=8R>T*Br+zsbk<#;`)jsE^fL|764$XTXRT(xJ2aJo$iv*7Y z+&w79cE;C>GyrF3g1`y;h7lxq{p)r1=1lbzk5mT)r`3~ih0|hv(w5y`A*d8(&R^yQioxM5LGDg zS_@PyIHRW|(%tTP`)s!eDKnzj1{~^aag-$$PJvr(vS6Bdy@})epD=vQ9NiAiSq&UP z^!xi#7IGFPYY|7|YcCUeu~8_GpCTU!Suh(w)mX}O22-3s5K8>|?u^Z6P}xP?_UhMTBEw%lHgp)Y?5&{(Lq<0<8- zk2J7rKt@T_n-H2e=5K5Oe@~KVxvf4~P?;OVLoWGKq+k?ZoZ#oCop?W1tjZ@8m4D2R zLq>FhN>mepqh32m^4dB&$IZ2TzrV=K=z{6znr`sXfMoT_`dL&oFuen8{H2Q4#hwo^ zmI3kK|07d@=1<u7+$5VhYJFo$olEvGM+n71~ zd=Z{BSo}#t#qr`=a)ht4J}>w%?oyj%cNgAL4qBo#lT;g*fy?>J4X20FNsGn?T}Il~ zuF;XWF^^Sd78PUrs>EdEHMq{kUyfe2P{^}rn zvm%oghv*@dJjLS*Um4mvxeZ8Pd!b#NplQW)ht{gZru#(1W2{|zaB+v+yuBvUtx+I_ zkf9DKTRkr;@mnGzx_xt~ANpF~qMH0Z#oFpGEK;I{=c@GmA$FSk(NfB$lOY2lFYhs( z^Bjm}8u)#`JTQN+rHJ3=EdFITPj=`QJbnhKqH+?91J^7c=rUD9_9 zO~cFbdF#Key>so6vzXs`ZdmGMN;0~P%|Z4KuB;9=jLBAO3ffnf)hRX z@q1GcShU@yG>^oY$cPMP*r_v(4#Jsw9I&)9p^=j8IpyM0v}?ViJZaR}`tGcjuOOi7 zFv|RsR|}xTt}m|ho($ZxZ>FwYulNuW_Tg}rjc8S&!zq+=CH9ckRV9j_&cs8|nT46& z_zjYM89QWPqqxP>|Erfyi~MDTa?dDOh++hR@n(m0z&K|U?b&IApR@buieQdk7&8At z@zw!4(UrZ>eMqTX6#`r-Fs$~ngFYYgGmw^2$Jpzl$}lnT;HZ>yR{_UYsyEV70KYfLSeW=C1mNQ8?Cu8j6TH+)R;tdtKl7$j3mTIm+uo>=JUG~HkC zdToX^a7l?0ESFHD-*BgnV^T+DGcWTc=__egbt;?j0ksM%#nI~%w+z?^?_dkDy8|gd z3d8`A7bYWYD0F)#9Eg=(%5WUDNZPskJ8uK3h%ZDL?_kC;0EP-uVzZ3t)w!=kxQPkF z%EN;C)u#@(?0KxW^#(ob1MFJ_SP!*e6V;v5fG$U<@Ldvx}<()2eUYW$d+pLUu*BWNqU9`2vifP}i9uM}3z2a+wBU4>0OP>H?& z$GMoD78SMbvGPUNgv7~I2-BGcwrAe6lnm2Dmj9Z%T2+v5Vexz?fE1@=ykRan_D(eq zwV@#=#f$x?0^fKeS%@VXsngjx;8QZlVNer)^zKmueT9V)|8FVui2@LU#n6X?~El za6{%h93mY`Gn|HpNNY*^;%0O9T|l!0Hwdk}|9TgPp8=!)5cO0xvc&oy3n(S*aGI@q zKlqFuz64Z?;5g;pRv_K~wtX1bT&C}ApZpO<$2$zv%1p-|GCr5)Xb^K(1jD9tGA^@% zjCq&W+pr@jSP5uWf~<`LJdXt_>%_T1^E|yK8m9&;}~hccT$zRkBB7^k$GxWBvJI&NT3tC%b6-|~jf`4);=x(st+<;GbStWwKw znp|RnaD67+K67z#{OV&s%i6Ax(o;-8xnirit2Wg=3(fT6T zEf4c*!lnHcqyCt-=ZSY@h8OF7S0VuD)rJd5XYgJziU^?>ti~0y!}`S<3m-R;I?n-V ztp@($wCBzF{w4rRpbR43qfq3qN^<>zukO|r-QI@Q5n+2%BRy7=uz?` z?@`iOfEKt?@CIa(72I03d&<5D1ohufW)$l2gf$?A_q{l{o)6?scqtOL2hiV^+7&`B z)YJltx&-3V51sX$L>Z_WpGL^oEC0}V?@kFN+DOM!J#pR}n*+FTDlX(S`LAiA= zyF_d+=K78p`jwuFzFk|S*@1_s^?3bvpyK7MA4MKgDl|St!d$=ln*K!E(%j~a6j(k6 zB~$3(u%Oz(r>9`Qm_B>K8lT+L%0EB?$majub8-W% zK&WsAdb-3&! z7WANaq{m!Ppn}cCV9>8`PNztt546cfn*g^&2i_~Le)H2Vam{`ojUdyxdNDe{0^E8) z8cxUKk2NGUI*ZEq-YoXO+}pKx{dELrAYX*%@)2S}a#LzQ!SGj}C2K*^7p?5p0QD}E zX$~9+R{)MBF>lj5l* zMUzR6%)~@0aeQ+2m0N|WQ#4iT3{Wmd9|Sm4_j7LS77TDe)>#$n{hO%0NCS~{F(642 zIEzorY(E$V>_(n((5PO#yO?#(Cfl9PlbATdM06!ABa?{ex(tH{XX|EN@C$Tb>~guGv{HD6$Oh)sC45H+QM!nf~;Ap_lc&FbFouP=+RvfaY(6f8uQ z6uO^a`zZ65j{>9I{Vp~k-+&~p1g$A_Y5W4RFh2S{i`d4t3m3)1lnO?SMHrGL0w{Bs zmVo8B8RgAexZ~BMp)Q|_aiB*H&3c=PXwTdc^2<5+FR%MSoBLlCR{iZ*OLOcH8!Kzd zwH0JyHyV{ITlBa*%Lq6Gc7!14uN98!RdTD0EMTf9r=VysetuGw4nQxiF4H^47YOLgAl*6`DGMe1 zs4ZDK7VsH{Bu>g})mvK`X$k|-kjlbBr@Lc~a~uz-@Dy$2k4K>FWf1l#0S9tyM$Z*%xxhQ#k1&~5#xjQq`i~oLFP3?XHo()+FGt9`3ewjZiuq8rLqV}3a z?Hc%dPlm@;GIZCqbH!xGs3+R#5$YQF|K@YW@s>_}eaT{8Qy6dQkDl!X)nTir7cmY4 z=NirHeE?l#&UNB|N(o56+yrF>sW(bVNlxSNhMiU|->RcfQH-iLfgtu`!(~2?()&NgP3XqvBBi3;nA-m6sE`;D6J)H({f;ST&O?Zn5tByQ;CPj{lxV zatD@CYyld9swVs1b%cA)D7IQR`|!R+FgGk|1H}DTPN)mY#6!k^@c*!fAiBHwkix#) z`5D^V?Pqc^Ieoyn87MYQQuU@x8B-M=L}$RV1oEdpInv-9IG7Q4pUOb}c9TaeFdVd- z`sjO21U;w=>qoSJ%s!&(fi|@x3FUBB1(T58pAzr^6t+Nh{L=-J+adS;J$KcqYkKk?+^ZM`=Pv{mmu19K2U*U`9sHAM&~;B`xG7EtfMu;P+MNSPY; zx!(<7snp^VG;Ke4MZ9ukb2L);j3hZim6h3Yk$Hq*c#V`idU3$~g(wP_Hdxqzfa|!; z2U$?_0KSI69?FM94A5fKTYf=wd{j}9ITdE%tn(qZ`K)?+b*^Lf1-tC@@1iMTVdG5* z);u8eFLFEoqXhWp0h+@fe*L|9cMlLTBSFP0NQIo4PqE>+oBeD^?h>Wt*8E)ImKqp> zUcNDN8HechgYpl=uU0%g-T_w?ixJs-gP4eqZxz895E|7eSI5&cbS=UF*8h^qN@%Lv zogQWd{hej?l)O3BYVA5hS`;=BVy?=YWi>r?$@KcdbuU+I3DXa%`OsE&9<-?dR)KIm zFOu^+z2M)f5Z;x8HW*0F>l4{dpyPwpp5Tw4vlYpC;8(ss1p*FO*E8w_mQsUp1^Ksa z`3rE!wHYXUNP}}q20ZT=Qv+OAvDMs;jg(`sKS#TglnP9}f+l45uopep8l>cqlgzEu z_2iIRudz3s+ltg#NCl%HIYF`~2C#|RwlGg06R`p+icykc zKAI(}dK)}xERT_(0aHF_^Q%VM$4$qPxOV6rH9@%eqjz%{s%28S?pLf*y$lSNJ6I{8 zCce?0uQ1=(eC2@vklxj35@K|l9@r|&m!0bCzfMWGB=-dI$|K&|qsFc~<%diNO75lp zZT|dCtV}5^D<=@)7ilo&l7l8Yf${Ww;pm)R#Zq_Pd^AcX$>Vvifn{fAsVG%3VQ~da zq1wT;IbgY2f)lc7s@PzYl#Png;$|4MzeZm#6=Fv#7VOT-702>LtlHRCz=! z?);K8|6oym1V^mEI|@~E@FlqJDCv}(1Zach^E;^e!{5D0`F-W1PF7BcwmK#{O-{`> zeifUPw9XcV&TcE-S>85UJ^7eF)QIUs0o+u=ayztK2Zf7Q zYIRjkS6XBA>1?d-&{f_yrfw(Ih0j*hUa8;XY?N`XE27puudpHlZ2^>(m?gc95b&JV zH&e#h)kv{j;w|w&4gY96F~gY`djF)eaN}yatGjlYip7d=1!bK#SDlw zlH_BC-TggyDp0J4vYfIBm>W%b5JNs}d+@#djv%_gHmd4!_B|@|qNwtsSlk(E{i!9R zYbB45#ur$jBLIlVS}R-h0BL+*(5&Yrsmz&Z+V6trwwwtgnd>@iv$UOFz==6| zUg)Krpig$n4H_Omw*SI>xT1W}H1z5!j6J1{iu-g>+3t0He*~QBcFJcv5AUrn)>+x> zj=8*HBfAR@!1m+{pNN(r!Ts#HXcZo9Us#QsNZB`(JWW;D&Qx~N!DRLs)#komtnLT! zj!7GYmdb?S!HI$WL)7y)*)$?>la!mV@CCE)s#9O|KY{Iqi>YX02LyY`! zQM~^FQbz_m3?fZhXEjr=s;U0a9Hu4WVChgV)(~af(Dkrzp9GNhg~5L&GicNrbBjh~ zzV6nRG?12al{^4&bTM^7Y8qH@=IA#3#6#RLyRJ19hPZTulC@9LxiAP)(K=&_pGJC? z-(XLR95w2NZw<<79*8)EKCY8pM}L<`zk8$I>)=iZ@(0TCEwNrE3YD836<@|mw8ehz z`TYje#~)xciYp%L+>NyHap38?(C~~7VhuLyXt^(D!#CRND=#&{EThf0QsbdX zyd7>-F7s!ExSXwl?CBn`E_D)ebqj_TZyU(@XTu$`IQT*r4d3n&yF36~^7?GLk)UIC zTl{5_+9In_0054^kSO8r(5Mz&{dLP?Cf6Z_xmUE0vUnmboCiU#@gp~3VDhjH4J`lh zNqJq$*$Q&nFL_Ta{}I3kLg>R!WaRZGbza!CX{QF>V+P*D(7S{B5{+F z%Tuo*?C{F_9xmZX>+D;KDn&W)b}_jyp{XyP{MeeC{#ZjS)nl(42m+ghr}PEs29DYC zcDgt*?MQ?LGhxTM8#p7VuiNbX1b@zS@eeDiHs(UKDZFNY$``ifT(w7zd7Ns0%g^Pb zpdbxXsnhx)VxYc^AsdHCv0Ht~$REyipyHeF(**Y5Jh+n=nrV@z_^bt&mi{;h!E9qt ze2Xesz|D9n37q6o+rYQ~nFJMvg`1*_yKQ?T2cJIH%AN8I*X*7k&YRQ0c$H_{fgQ^E z=E+pWzgiu>n{EPAc(8TPxE=B1As9_q{3uEs0t^lQVVC8xhuUAs(PVFG07}5Ba3K6u zcx3BuASlowt7~cZ@%o8f$4r&4swU?Cy?uKQl#pPNuCLN3Z!cisGQ=+UIQLC^udnXh zU5~o)a}nx!0^#*TzqpMTM>s^?zAtyRZu&bWY-T1xUm9l|D>!6S4Q25kWhU|=ol6sa zfnxOS9=Ooo%<+`$#`*ci2H? zAJ>ABp|C!J`MS1!99QDlx)`AI{r}}1v?SAmk_^OBIxNQflFKXp>DszHSOjK>s2e(tIdO(jWd z=9#_JG|8b%z2;OPXpn&J~Vmj;VTwf zZPGx5La7{)^xvPFZW-OM1r^(Cv0FT(W`qo@6+7$z1$a9Jch>$gzzExaDrQptcaNx= z5nO3SqZ345-4zZ4QA45e@o%o9xDgk9{?t|MC=&^+mRo6GMfeWDkhv}lMsJ-k<#sXw zPXbx07nr}3eKjH?L$Boff+}jn_zBC~6@Xmy&XjU^g4^q96=F!JDW82u=RN(KZeaZd zkaE`LbB)tkk)e1rMjPhtR>uAg01#jXtDF>LGCD5#CR=t6ty3;Gh(c^tyZbg*V-Lz) zgF6lFh|67E+M!|H@iTg8&lx{ZtFzo`*n+t$DM9&SIu$z1cGnfFk#i45iH48YQ~@8z zcgG%XZ|+{hKMfL*RhiDLnrq*7YqY5(meb?Op#-}IDZ>?FHb}QhM=lYGO8gBx8YHY&vUl`^fFdjQu3|QsY z_FJZnLo26xDZ>n6&gmbrpX^OB&)i3}eDlZZKgsbPgJ;0LF;oUZnzWxelD;+oQ}}v%3!>R@Qw(r zwFiDmfDw?ziPc?db_xDcX92q)o8$Pwu$8Ox{ybqZ%4t6+zeE(S-`@w-h4uGl^!(3@ zAgkd3fuQuT0~0T25@u|+yih4Cb07K#%TMXh>ORs<7b8aswMvLYwKVq{+_E=CImTcq zcfg}ip{4DcCli3p(eq=o^UcN3FT-Y{GeTilz)__NZ|VH1l!DzDCfW2g%g?d{+Wl;h z9=yie`gq)k{5PO5WaE>>h3~mr$;?x|2J9}7b_wKa6lLG9j0EnIpQms{l+6f^e5*c< zVB@1}3pH^TKG?39-&xB&t2tL9KIfMU+?5{&U+`Z3j3m#R6-1Lbr{>Df2aSXTqw?z# zQ2$6;Y)G_)|DJv67eu>8H-<`>Bco?5z`7f=@DIB*x&Of=y1>-EoQ7fqRe{h>@yD4C zU}6!8zh-J7Hw}cg;k19#(Hje)#oPr=#LjxzKHxlZQtr(t*L|rYBa%zz(S!4li7pX~ zygvHsPd%@G8xOO60zCjK0(~yA&yKI}eA9YKN|0nY0`xWsuH-*{aT8Px=@BX`%siTC zeO8TSOWv@uQ0V-xiik2Jps|~2ZbGdZm~NZc)_15vj4o&95nR! zoI+K(`~!Tu#nL5(xFgrFNL+R2fabd#ehWbG24t!WWm2vD)P2v*U^11})T1pW&SGWy zEy!BX+cMo#BebddNUSl4-Sxfcq2KXFpXG_mv#JCwpnH?MV+YAyv++AigZ&7Z9Ob6% zsu#S(TJ_4s2Xxl85`v^vhJs5`8$oM(_k=w_@08^fgj%L=8x91Sj<2Y1iJ~B3p99}R zu;nRUgB;>yJo|xya;{*4f>6fGFtG5)#{VeqF!91QQ_2#&*;`IDTgBQ3z-5}|8BW`i z>c!t+%+A|$)lDnyko=-Y2BAYYEhC_&e0mxd8UCt|SHmq$w|FxyXvlnJ)o=s`ImTxh88ThRmHD!Y?hM-4grF0gmshy)7p&JpYYivQ5k<1#k4 zsDpokG%*LwTtpmP&~9+ir7iSSy5Tzi-5920@bFc8M6LK%KkMi0TAgF&1t$9At>wkia7D;LQ* zRDM)BL`LGq4d6D18pmEv?3SmF2;URMc_}u?xx{Y8)C0z;d_SW;e0DdYWb>W3)T8pJ zKD{d&Xw~_|W6vdvS>2)c^Xk{Je@{aFryt7EdY**D&{67xl}AWL{XJ-$Ih1BSy`&(c z>+E5$w%z>Z@hwzkIiZ=_;cbd*(spP4CU^pM#qoea`kS|%GB}JIVdARZGI-4yPN zo5$Wa(v*%Ew8^s84DXw~<&-2iq-EN)w+`XRT-|!F3F1>pKE1Hj7P8Dn>Qi)AA zfHfE+sTTNh)y5yUJ*(*J-EyiPxe(qlc9)T>!5Bd%5Pw+3FuM?v3YWnk+$yDt)9Vu? zX5o}#*UBGP&d+I9!slwR7nTj?yU;U27;ZO$Sbt}L#y=%VyQr=^j9SM5s#uzo81l#@ zQrbLn=CV$#Mu?g4TARr(clsj^k)T>;x}9g+*&P%=$n-Pq2F(sU*KDDiTW(oxDJEc0 zqW}}6q)S?0EzQdV>`4v9r#^>+6W!Vuu%#zf*!EfGZYV3oztYeWa7C3 z>qA1LpZ-$Qq`)B>pZ8MY4$5U)H~#$xnwy9vP_l(&dxZ6###!gc zzSQ1d*hd~ceofqq-5?K9xMs}Yc*g9-X zg`nl0!bOMi}ml_2&k-tFfG#J=xyN z_4$xXW2ZUS$)M~H5ak4MQ(T=?-Y@(D)_EO# zMEP1kirpPM@6Jrk?EuZuw>cV3Wo~gXO4{4DdIXySCwrjU&ntGl%sLUrl-Cw_goSf+ zdZnuWEgO^a9WM4i29goEL^3yLIoNY>Y!=61x?w28R7hI;W~bg%G{Ea|-ymHv#&o6X z>k1)!wIB4Mu|^c=(;a=jqmxKGAy!*DVH7=Wg&igBETej}xxGz^T3`B*TFF{<5}XcC z|Z!nvu!0vm4R`4_>Du(*C}3Ar?S+N}^mw5YV>S$UfnO(Hn(iv>t6CKbt_ zmk*YIub?6WBcVce@I@+`>od`?cL2nNN}3QZFTfHMfS5|3y8?J-R9+Q-Gq(e?wnX{V zW+`@goO1FX+kpO--p=w`do7;&RF9PFzWY-*<)(i!^2uHEIpUfaLpOm!=`l4n8bmoE zL6^$*hKnW{(Jc{$0h{Ol3J3{~RkyV>d`$)a-uV8NQ^rXvO>SlvquO%0{A)QA(pgG{ zP;<_|>+~D~H7yX-5?XoI+QQp?nqH%YVC}r76d#iDlusmw@n024>~z=78z_=d|5j6s zzCpqoIOSZ1O*3?deq@b2*&&3RAR4)!pSvHN9gU^k?QM1$661=wjFRn_z@4O!69uS+G;fRBMCXR;(?X1a0XURbz<#Z+!Ukythhl&(AU zb7&n_)=9;n^t)sqw3eE^Sve#rWUy0kA;B2zhxYXJMMmJ{LeiB^pEiGE3rq~$GZ8H$ zQ`88|(A!MOp#_b;TLD);3`sM+7Q28=Wn|5nx0*?G~yH@My4`|Ok?wWjE z@6aZjAY-}*R!g!zy=0jg)gKG!K_ZqVTeV+R5pT6S zf**27ND%RHxfHqsJcN!;D2#mQ=Q+ZAp<(f9*D5dBmCeHJPwYZMl0@na*?N`=aNF4n zGghnI!!?N2slM!?hXPA}KiV0@RUYi<;+FXR#3;;INq04sF~2!!HyDQMzcH8#B*RGmi%K+O0w93`wLZM(ut6H7d*o}xS?J?Em zx4;z<`o5awSE(%jKH|I>l%~fa)}PKo#Uh6?RAi0Wr$p$J+*5G^-lCKOk(ASceedOU zcE(vMql|TrDeP>^r>ejs#M@6CNIq(L@bi6$`leF)HZ(7p<-7;ICGsfgkPVM^wJ#k{ z;Y%hFF`5Iyxbk~aAR)>VpDOM8kJ!B1LhHO!E!bfqQZw^Dmrq1d!oW)A*0xv;Q{bi7yX z<~#K-(b~0T!VrLc`*w&=nnN(hsjN4+u~b&)l`-Ot{yK*O7Lk7?NUs2bM@eh)V6G# z*SLvaL1PR)RV^l1yY9M$W?dDCFVAm5t{q)bE)t)nj|l6GPIN?Yn)r z!Q&L_mFYRGc%aXCdlqI^_vN(mf|r{@TQu?Los)`7+1z&ZTYMei(irJ$FH{X&uR!iN zMS5X@FLm3Aw4jBoOM~X>k9D*=6LIu7DiX8YwE>=H(o~3o#W|K{C1LzQoGoT%RY1>U z!_@!Rmlh{Hdc+eigtn zJH9eo1NHscMchN@jH8#=y14Ya3sH4jt2CP|I`=+t&eFz#uflQ%Vifl}K7N^uA@*(d z#M(*Jn>f`dUh}tq9|ve4vYaCj?qyqXw<2689_RKVkCH8Lgv7kWzMhQ!jB2#RrFU&p zH*0z=vX-JYBGG6>V3XK#N4w8oP4MQ4il`O`y?;DSsYRDyXyGa%PN*bBTfp+g+E zg6er?8#6g7HP$!%yUtBwE?n9zE0CpVhE6_rShjZIeT!Am=+|^zgDxE@NNLY)A84vo zfiW(w-4>GR^+#a8~ z&heE6TK!;NG4a-W6h7wkfFtJ_``HzXix~N=dHRD-`S+;kOCG{XmtRjKvm4wT`n@=)%ufsj>$fUkK7%3l}wE{d%#oC-pbp zP%klmk|o`^*U|KD9?+_%5u@P| z*3?UIYF}Bg>Oh;3t)SO^jky=`**A%|BDnS!bSF}1Mo5uaUsax!WJQ2;%faf|Ez!>m zZUU=5&*tdQH>w}_ZZ~MVT@XFMJf#mGucd{hJd_xXOlA8$$T?pd0NkXMl{ z^6eQzdtQX*9>cXsa@I!QMrTw!4l^DR5)&0GTrC;F{1|#iQ?>BOlUVTckKX=hn@^{1 zTb4IJpYp=wmWz5_ou_C21b3v{3{2YfLJzfFw5p5pMyS9uL9JHy8TJS~O&H0Dr}DSt zoXBasK3e3u!gt-EY}yjzryJ=V|xNyW?-JY1d zwLd@Cr*rSKkFj7w$k6ERQ`27)T`iKh^y@Xl{Wjdnes>619A8d3-~2Qo_MLq_(?)$< z*(OWZkRAPbc_WD>nlkH?S^&Idb-zzwZcPEiP7>}0FShPq_=oX@Qcp6Nor68Vkt6tX zc~%pcSrbt70J<(Qqpv^c;~>Mfn^Pd}1z!39QOYl=7wXeIWW<6iGCQ791@r8T2Ltvl`O5Vw7QwKF zXUpOjWW;SYRYOsyNVBbjtUb}K^0@6SoURIln~l_CyS5--JR28^p0<&3q7)ajYmJEr>wv7xWMXi z!pjI`rl+{&6xQkCCz1D*x$$4@`bK^kDL15Jd){9)dZ|3;_UDx?)bEeZm7{As`YUG{ ziCECO+TwxL{~v^XM&3V%meJkq;5|gFDO8Xj^?xT|$$(D{IyHi8&Eso)U>ftMCm;M= zD`u$v3bzUzL>_f%A?Csm*+^e^J8$9aPk;&@{fp@jI98vi3iebQB97Sbi~by@)Vz5y zd7n7DP=YGZU5J>)r?MhteHi;dTJw#Ecgqd~oI(1sJT$9lgwE05b&RxI<{L00)~lcA z7-^NKzXWk)hN8@BEFCHuc0@lkB4fccx%z`_^1}<_wfPsdPT88!I@77HPd2}!@5?@0 z`?KWVn_Yx=Vni&pvhFGq_Q|$^upsyE1icA(&N4;yOblBU&g=GDQn~7RTU^Kw$idQ% zrJ2<%di#M@!}Vps1=r>51f5aj2i}O?QhobLrszX47b0WU#KrB1Yjg3%^=+z6Ial?8 z^kny=#O9+55GX=)(wZfoeM-Al$ECMvNGTuwHYZUy{{=Bv^&ET=)ixVM#I&=qCUoTk zyXEu6CDV8QeB)FY6Jpak#D6s~5X|llt0w&`g__wsGap@=`52LS7Kk{jJ^+92e2e<@o>Fawa9!K-oF(PDd6TPgcLmTz<6$bWGBfk)C6#b%^ z5NB}JLgkcVTw<%Q{UG9)1B0RX1Y~7aS#H~{)N=nY6SqzCv-R)$jT<_Knj`&@mOz#9m;RL*i~H%}{+WhRLxHLxIJ;Gh^N8n7-?C(~&EAzUh8$5p zSWLcoDm{8;Pe-rN<-*o=Q&Uek;3Nqn@}6W2ymX5Loqm=_i+Y)$d;XI&uuo>%+ReEm zyXc$lKlA6F!ijkFd=*N`4NyDc(PAC^e}+Bw;;Jv06V#pyy1d7wFPnZt!8d*yj6;e@ zwIuwxBI%*!-nW-4cODv}0p+wXB~L9a5$A2!?w!?8;V>fu%Z*;9nwGo$2wEC&5{Y$x zaUKz?>Dxkm)YMvjZ0l};OW$WJ&$k}o+F}}1tPBx8uuWi;`&u;|aH-wU`WY9`q-e*9 z2kB^Vq$=fUkwLf1Diw;KZ9zOcfAWTEc;S8bAJ1u4vCl+xJIhK%%e3(W^;=opQS_I3 zA`A?~-P%=2^&%bSJx)OvN%f4ftxzw9IVd-EW|>Rex~tZ`mn?o_nh);xZSU9lmllbu zcrhDm)#L8wUA$kObJ;W9TcD<#l*n;$a~3C0&nepL56H_Dd%CdjM6lvRr}`q99(QL< zq`24vhPq3^$8OIXGw58u8Py?b6c_cLcgEpdQHfam!alD3^1tTk^RvpfHeHgBWkF;T zN>03H#R{)aA{-sKcJpP05G0etjJWh_ynW{A`I3VlZy25854#A5!Mf6PlcRa1&;HWa zw|ahSZc6-YuOED;YzB@n9!0m+==r_h%S^7EUOWTS>feIz!$T6BzdQ=@@DtR-d--$k z_dv}7xNQy#nno$@8%tLv${e$v3jZj{S#WE9j}S)~rq>IlL6Jx@)bztHQyF&5wK+YT zG_8`3?4_#&y-gFku`1Y|S<#PAJn2ikY(q>$+s=#dy#ttXI1aH_LrHTU1%0Nb&p-9E zb7NeLG$T6~>fyft?e%w0q1C-9Y+arIN78r4Q{nypf4r6LQnD|SWJTHcT4nDovdhTk zUaqW+tSdVs>&ni^$mYtt+1V>AF0w~5%laMP-`^f}x#yhM>$zU%6o0pErq=8ANs@%0 z;M#yXnD%q=bpbhikW`5 zyid<>qTY$7iXPTqSXD;LYm&_~;QC^GyQ8%S^@%08qbZFbEL6}pSdlPuj}l@Xzb6vK zmO2`8z)7>USIe#Vxr=!GNqK9e!a1g5EeAaj03eBtNV%j0v!vrPc6 zugXRFhBj{fZPEUS+3HkrldiqGkol4b5EY_q(#x~7<#3O%q_?p*`{3R_i~B~_KL`y( zbQz<~gOGc&;5WZAw-DJur6*{0HskX>XgM-Hq2dAZUI?W`LRYB=uGeQhyIdfeft?mC z+e#8Y)6U=3d;-b7A1A_0w(h$U_dBoNoZSCia*+f<8|a1^rg;eDv#~wVFmiNv9V2YE zs4{J(vYyG|+w&*p>aIyDzecNRi|Y^wCmpu+LMF zN5D{t?!EDMlUw_cN^3uzA_;DccV&&7qzvdtEJ5n(jRJ>5!d_ zh->m#SrKVLX$)S}X1`zEKA9S=s^)_J4ukO}tgRScMxJB9X8BvAb@kI+!%qPnQr;jk zugfs_UZ-uE{qSoI2Gaz|DWF;SSm4Hb6%^8lAg)`A#FT%u;Z+tM65v`pciu=R^6J=I zddy$v)`7<+e;>b0sch6KyE_}HfW2UEqS#E~Z2i34blgY*3#GpB59=U(7Wp>P` zRG)C{p9{^uu86$8OU^iz4ntcbSS7yx!J8^eMx-GcDy$3|e`iI%+vFMRNQbkAc#PfR z_MZ>19I1W&gOoTbR!2=s!SMF)_cYBgZI*jQd-*;Gb1Is!aq{NvZ6BXEt)3#F=5gjY zo;k#ATt+~ME%Tc&c45pac+BK6GH>oONuDJ0rqF{3SH80#`P+sDFNN3Cc**SK#$7ey zdmFc?Q72dagdADlyGV&S`wAxb;an-V>yuOlX#XLH@0pXUP(zH2m8L(+qzkJs&7+P^_jdDO9QzeM7y|tim33O z&!5}I?pSX8J-W=1jM%|O8TxY$q2Sg>FaAZmhB2g7=XoY1b}PRd9*tHQ>hz%?t`IZ# zIw6MMVY+2(8SC--pObIHvkceG$8Sq&0~dxm#d297wH6JZERCzNo=bMT7cg}TaA5fE z+lhKs`q!~QDtYHtI?CXjDueNJoj&VrwF80z>*>8u7Ii2mp0%;07)850ifw|$oyf`d zpWBw=*ewlTJ#y`Yhv(e3)C%8F)*RjO^GVobsB9my#f9QnkQ>wupQ?6G0yoz4yMwY9 z`q$}#6R%l)5s%Y*GQO0!+q^EAi4D390R>{m`@N~fF5xH`lMRoqqJ2BOC{KxVzY#9Y z>JA}!wrbaKo}+mTDU4@Ou1vyc3F&3aJ9U(bRI0=g?0>}i`Im2(Xih+gw?vXZoJ5Yv z|Duh+s!*}p=WOi#L5+H`Q$l!jwS~=U;DS^iGz?g#GB&^;&Z|k?vZWd)nvY{&Rzlas zFLMsH4g#)!ytBlH|DW)n)f|xSjMR8bDh7JB{^@ti`%;iFk>DkV+W*!~d%{*WU386+ zGK^~*6ZWFwY3+?$PlFZ}R=bY%C7?aw^m@ix`F|uModM7(61lzHG5Q+(7C+}1uiWUO z#c8B2eQhUA#9&k`_JJjPe8t)Sv>gzmFUb^Fg`&r&Vva#+)aelEqzsgpJx;qz2)Wmj zgyh#RO^RB3=x7$hKPZp(La812W6MB6w|~F4C6=7H_1jc=&5W%)k3ygeU*O2M86+QV zpJeQZBpYqD>|c=z59tVR8Dp;9#EmQlnYy~C2_0M>MY`(l3I(?ppZVJqom+=cz+ig< z6l;pt=W_1SZg<$pda+<~*9OIR7N@!e63n3N~HuiN^-+b$}Uf~HEij(DU?(_;s zaATbhlD~tUvv)QeBxN*#Rz6Gp^MBjC^dQ>W*GioBQ*UgW_u?;zy(A zB$;+ydtcP^W><&t)WNMARVE$+wMg+Ct4@8u-}6|DlFU!VrUz(T9^>QX-z)u0)@Nq( zN(%b8Bh{aY+3K%F{ord=H{0ZL^Y0)qPj@yLe&_M|LS1QX4$bkLS!((CkmpJi|CC5| zf0HgcbN3mGE0R^>d&TV0)moBs8~a8&VhDiq?N-lJpJo{g^1cr9%*wIasZo5;!ZxkB zN~zS&)b#Pn9GX!2zEELnA^LK9G5*cN^~UhN;?_$na|WgmVts>y&@gu2d$Hl;Dj)ZI zIKO^K;qm(eXGc9&A;j7kX6m{b8KmU3a)*Q_Dx&ioro_bIL-9Os>;A{#c40h03=JN@ zDp|uV2zTr46YKulejV7yqmTn{Q|Zz*R|&zzxP~b6h3X^Ca@kcjRMbH|L}lmoHjWwY z%)f@YdgL%+(J#NIE=WkMm50n&@hK6aU)#eLsVlOpJ;U{%GM>Oh$mb6&AFP$*hQpRl zGLu|o#scb%RMG=K>QZluu6b@Hw!T7UsJsX-9gE;(2)H*?M64E#t9@t} z+j$AT{<%-Yo}{m8;!ga1QLu=3CtXDkh|U6VpMZR0mKFS0tJ>K!i3?gf)HfgeOm_so zYUP}oqL+9u{B}(Fjies$v9buPC^V}0DNX7!OhMCA`+^}3bXD(?q=2d0e^!kriJ|U1 z_BL2PtzWJNM!gI=XWw z712;ownX<)STUxsl~e}q2oTUr9-N~Ee5b<*El%dmA9rqh&K{i zmRMk1a;*aVT%bQFZ(VpzEbtl6RuMy8 zjtvCpBdswLy76LvBL7+ut(D8q1o5$oC-}FGpew_m2*ZsQVQB}X>lt(cy4Yj?(vuJZ z=VXjj4EejDO~D1UOnbO~o_1Hum6TPRY*&K%*MddpahB2J#6O(4^}X!=$$rNU{3oV# zuO3YOA2fx>YYE&F;q=<{Iv3YAeARB z-z4_9FFl;=uh(hej$H=%#Vtxm?_yV$b#dv5`_CB7L34D0{LQX&doOE3h~l_!PW3>s zQ3x|B_Wj5J)hmF{P~*{ReOQ+>LWmJW)Xx1o!)KmdM3*$zUEjc-Vw}$BR6zIW*$5$@ z7MEUTRz{o0&fVbbJapv(2XpbVpWA4Rj943%ZY{82;%9gkT3x%oWY!cVW}umx_~yET z*c*k=*8f8J272DH#GD~?s-FhD7!1mz59`7{RQgg?TO^#FxR{2@c?nu1{piv_O8%tT@=RhY8VGZj>WYLY}NVf zdq?XT{GtKBDmsJ4`MRyX*`WR-Nv2RkI8K0$lo8v_e}<=6Wz1V+3HLJmrpFz!wk+Yp@nL4(6N(7Z_+*AzXFwU&Sd=g}oc(9g3 zXk?)z5-I)%fTGDi0)4;hu$KQ{i3MJcr1#jGgDT{O}K9c%_ zUiY$?hz^(LyZK%N_Iz1UsHG}cV8~rG%ERvwQ!8(GgW29e9!_>Oc=nb1N6)I5{3K@y z=W$hRT=!ULvhL5~Fm) zJmmj;f5s_SYg9kN;B94oUG*ga@v_aW2j->aw;!#!yR%A!il!r#r&fOi$@7fs*5B9i zTY5s2pSUY0W$qbh*>Px-Nxk2K@DDN{3K_`;0k0DCBlmzN7KP zOG;N~lcA+pP@M6@Qt|s|21UKL%UT~Iv^>{H`o_93wecxZy0=q=wA@mlmM1NMSiGbL6 z&lzzOk8-(mQutn^-=uUyeD$}#9OtZRPmsKh+Ruj6eZv!@hdrQ8F<8Uijk+{3BjS_H zR0_@*D^^*?#emwhPIcx+KUUL0LkMY5S)~rPVoA=y%fex}u}n}|OEAagx;D1!bo~EoeBC6AC2uc7 zLk?SaaL0g^;a!r2DqS~!dToR5%%1;p+zS)uy@-_6~jN9Y6P) zm~vb(d$|hdk0`GfQ&p#*Vr8+dw1?-xHh1XacRV%_2*s2r#}>rb{*!G6@NJM8{DojP zxl#!sc*yws^%l5bc9LqSu$2HCAfW93&3NIP3T>wZ7lS;;xubCH)2Ey_a~OmP3mHyj>@(>z!HaCiEJM@9w^DI!1Inj8E{0}=OpEi0Tj zCPvcASC&tCjT~2rX~~46nQ?_`JE8L6dDN+`1WZs!q0D#e?Q~E+xg&M|%G?~`FA8WI zfkvI?nF(O#DyMv}708aXo`@@FaR8E3U-2B68z1S6Smubd6y$lhRw(K@4DLnsf6NwH z1i{u$5a!f4aDoBF4r)-P8R!+?HMDCNq8}%-_3Slf@|}Rpduyi;5U@<|WglGufG1l`059eY~-s)WXHno2?JZx z>?$ybBBDS&CF}5mc1)%i9q1Sd``;a^3IHu>FyVwZJoL--Ew6W;`|@OESk`AOI#_?T z7y#yMjpnZ^!89{_^3gv_Zsk^ko;dX9J2!*%jP?d%*kHc0p^Yc;%0!2L&FtxVT#?~< zq4cZ#tLa61;t51lK8(C)i`o;(ip#NYw439e&7zED6R1rYNPl+PC!H0QUSSKG-i^!# zf8wBYF=+{?hT1cW@MozAN?=pw-x-Dr+h_Axd{NnCTiQ}m}rAJnNKW``ufI|hvc94NXqZhdHvXhKLjmB zx#{xk&cyU3z+)oP2xIPG{otrvo!+rs^0TEm8M83*=8JOeJrr9U5qcBpYvVp}Ijv&> z1W|^lM_aRZ{h(M<;>hfVQY=R|66UA!2yCvJ$PR**sWCBKN$76mqmqUUeTJWUITn21 zp>geinTv7;5Nl*`x%+kS==Sxf8+-`yqw_YqJ_-r84BM4Ya@*NqSvs98&nxxIV3;hv z&AZaXH_A@;-1U`W7yh)3Sb3e=Sdw!oq~1PhX3Qi6>n8tvE~M2|jb{q*rx#{Op4pxe z*_ivDPSC|;G)4l!EJT4Wr*c5!G~X$8IcasyU8DNCfb4x0+0}&udEjgfd#Ow=1k-$u zUQm7-XZZaW3L(GxvTM^B#GWqroJ5qR+c zD&qS0SFTp_l`0UgQ8yeN+emy+Ls2Y<-!eM5%AP~!&`GVvV(WOmpC+)8YN*p)y;4?nw@9Ek>d-+tG7Dwl8VztyQAicxtIbM}CRVV>zvj%ax?-DfB$ zY@)|Px$&9?6o0HZmFlDQ2SP=DaJk3Rq0HqDg-wOL55NiD(vk62f(uQ9i3w$W__OmD zBA=&;X7a|({20OkczbEW+Zy_JGmNBERTl#b%<~3w^F<5G*nk%UqCrXvQj*nM8TLDBe~Cx@*D)F@ zVfMH|I54A68`c*}$Z|yQM7V}9)r}4bsQUNqGF~42Y4~jKoN8q76A`8)&=Q}^5})jq zQ-t_^Sj)A+{%uL(%)G#&P98^4_|rSZqYhCb{Z+dVz@U(&oL2JpWD|jEA@b4F%QJ&Q za?!GTs!a7=c^(4G!+d=UuaY<&x)KIQ4u{~4>vMWyym7w-0ccbUED=SY2Wi51X; zY>*l=>?{F^KOdybm}Y(x!q_s%l)hj=Y4De?~KVCvmZ z)1HK}a%QS<9xWLG2+`40#KF0HLOJ7~BvsD^UAfJ7r5T9d#S9rG4aRuWR?tKJpBB+3 z*g>bH+Z$;hGW7V*%IZg!d5`FRv4w~OE_R=qda?GV+s|~7e${yC$QJ%5) zc=5%iX3lnwyQ_9!T)1D^R&4MtBb>hENiI&-?r<$yxRe`bbns0PJD`UV7!eF+{b-6M zRbJ4ujJ$2d(7(aQ;)UE@mgW3_^P+2Z;R9a8{wxbY?AnPWzO5RQ}A_S1YRc5rl=%vHIg z6Iif>(#V%B!Xf`?=YvA{Soz6};L0|8G{?P-8(&bL9a=b8OnY$Pi7xvLs6PnK!?K-5er?#4u*e%LRwt*jh|~d@hLMt zbFF&>>~08inceu$O+$PTVfvE?O_JePzo)eZj~W;M1hcV;U!po>y|Ykqt#55VKk;I* zg6V<=4zXL9hh9c+ll#M%FtH&;o>ohz6nhzC08>6@O3B-McHyuO$FD1Jnnm-LM`9i_ zY%-Ls!LI;1%{Q{p=zS}-sHNAqf!?)s-le(Z8}C8Jq--n zkX_3YMc&9=iLX^^9``&x+B&z%(z3~QHpe})mer3KA%R+Awmbv{9DCpO`>1JX!Lr|~ zi>{88EEbgW)sQJq{pawXq~eyzi4Wn zg>+viKKrb=djF$|P6=_k1t-&7C@AfBwg&O?bZd_YIKPa=A%^@$wrF zfWY}vsEcW5*r-H3G$LJgVaz5V+x$O0cCN9^F4(==I{6+!e zmLM1qu+bXo_^m~Urx8V{djr`KuPk??ys7b)jP^M&k z?O%9}Y+}DICs_xgnKS@B$gL6iYrZ`yRoPAhA#JrO`?JH)UHEZS|3at-B!pOlm!7py zy)=`QVL?PpFL=3&7ZNk?x(k$^Pl4(-JdQ=*`Y$)@e2NsEfM_Zp?NHSS@PCx(vGe#} z@#Y!J=)&zTE@*z=ua=4okB~FoKQ&;NlT5boF`qkdHHkr4AadqElMIY`!YZ^7pdj8W zuni4(-H&Kv$C961JU6afuF&}b2*U5v5{ADc7mogI_>N9e{uli`M^DAjBktvFi5?kj z_VKVIf3eB>6aus37|yhW0qBwq@{2ouQ}SqqM-YzJxk*a}5kHV)UI@0J zo4!9EMk2C-^HM2yjr|og7O<5-!CoE7+ZD967`>eVwz4~N{6w+J+a3A<$}$%vF>itS z0}2eqpuc%xkdD&YH&;MWsHeM7f=#DCH1V~JI|2|PgG$RE;NrLY_+>{ zw}=HXo!|jls-|*8L!R)5xI)}%D2`UWSw03c_2)H$Ywgkm5hEInrI*fjZ5xppp!IrW zsG4`;@(VED;U??DdixYBLWs=gczN#9gG$Tg5gtiK&_gI zo#*5w?h?wK+=>>^GO0Vt!{N1NUM0uBt!`Ja?eL)IJVtLXzvLdcYC3J$5duOOo8zQC zUv(~p#2TQjlr9~Ya2}g@R=JOV`l46qTr?yx30+XQXadb^WL@pGGR423iVFNGF46?{ zf`h(W22Ek$s2fYB$C&K1j$yjfSbg7_EDac=TwgkqF?qyOTA}h7*92BMieFlS3DV2J z7Eq2b)FMZ?3n?n5O2yu1->GyI6#ZK0RNHjA|C;&T*WOX*Tzk0cuOtT7X6Z0ds>O0?`gO1ydN5n> z^~{_PjV?qTir&?Iy!k%bXm&AvAX(=jmk6wZ z+y!@!j4LnBaiy5<5THfq^4r&03DCVNO28W?WEUTG^#0qM3IqCsZ1*d?q{j5wr#xJ7 zu`TT{v9GMAD4|zI-oL?N0o2AiNpZ``4-H;!99J~Qa8sitnQPx>KDw5$LJK=yWYK)9 zk88!T-{kvzz=;qNpxCWOnwx0>w0zfVWj0RNUquoM-94{M-G;4&zgK(f%r_0{bavW< zg1@_+qx$Yd(3*#pb4FIre&+jr8Qstgwtinul~VOM_n!bQhe^_(Ao=XCa?8@6@AQDJ zfMTQ8);wsz)jLZDF(4$q@cm5b;}!X9p$F8+Z!+DB(f9a=`a#fVaIwRcmTT;7u2rcS zJr(#P-wNDhdj35;fd(SsU{q3t$rWAMU=j&fHOK_|a$f0+6GE zTaZ}tD%IKQ5yDd|w0xHHOWe1*9KZD|U_5qGn3L+wBletuI0!l-KqVLd>%OXfTf^vq zf|vUsUT2>tyQ1YRi&1UT0)cpDmx7$BmPzGUf59=o5T(PLzE>^3HKR9)r!L1Fu#i{G z9P#~onGj1aKZ9_nUg*lnt)d}^@Pw7z-o;>qHR2LwWh$v$1AG2jmF8cDWGxGZ*R-?e zq%aGJ)WYmi0bCk%fk9`~E+vyRz8!}`3STEYu;{WkO!ie?NZ#<@5W5b)grWb+@R9d{ z{I!Z$&Yqi_mPUr?4u#d=7$7>o30xlhd^R5}Zx~)qL2Gvrv8n33F00NALM%1@cB)s6 zrTTU|H;H}t7(cgie6}1iRa%n@mzT*LZbeD036ew71w!BGU_$w8ra6CAppPshz~V_b zzB}G=)i*`oB(911FSfVrx!AO6&t2(IDHc=K# z2ajmPyeNeH>izZa_}{aPmn@KtgujsW+k$lCW7IRiH*Z&0;`;HJb-%6MD5k5pFOn8@ zH|xz&V><;va#;3FNsn#PbPL2|d>xUv84lq-l>INp!(ZU7v#(O1+gLzvP)OhD#TK|# z&3Ev{uNV*JSnA+!^KrLkuQbL8(EW6d>M7D(ALi|q;Ww>A(m#)>=?#z8 zr*DaEY3LlTSWs(hp&2*2UbO z>VqTWen7!^uLAB-GJYJ-3i_3Q08hKEi-GGu6G5*uEh?(=r1grZs4h zLtu_?ekft6-@W-VuqQ`8JbU~^w|u9f0LSjb)2w;#;-DDU1#r%8NTlvqPZWp<4Vt`+ z(n^?0?;7p2OU>H3D@~*zT`(#WCm?T1Dhd7CAjJPJot6N*#^4NUrqg=Ix<^Vim{moT zJV3$sTn8JId}Qcp)~aM+;w+b>Y*r1^e|!W9AswN)!{KW-uohQ-@zEoEu5@nZxz9WVA|C0mDUfWq*}R6$9{bZTS~!Nur)Cv5ELe(B*CB&#s(6ypHm^bE)- zZT!2CuzPTLz4ahIkhfb;3|{{(QoY>jI~DB_h?>S&Mt!JXO)B*ISl+hd%OB#Ah?iFE z6(q|OVPt`r&}T$`g~3f*Z72qp%XEG~3VBV~fQ6e>RVw$~5O??Qcd94!KpP(9=W%$f z&`sj!ZI#RgrKB!KY?5i6d^4Kf>x2&_I)oMI1nqgGa@~L3!H#du7B_%-71|e*6t8R> zNx`QOIy5Noi0*%%>Pg%XIw|?hCGJACSN7gNRlV55U9pVQs7i4ySA-aoORZ z4cUN~fqemAV!8+<;0s*a*c7>41oxdNz2=pbY|K`77l;Lh%J+ld73&uf_(?vw^*t`~x``$zqQUX|$uHah7FW;@v3Vp@w2C5bz!ku9uin#i7LN4hg>o+#gYl?s@bV4mmc)M#)>=9jQx+MB^*cI2 zK7`NjjTW1a?pOu?D}Y#rUl=TiHQfU4s{Dw!$+oVy($|EsJ254PFhLAvEoc}JXz%L1 zMiz)tSg7R-&#!eKT8Z-Cf0VO&0~ZXm2v~Q0A_ALBi4upWNUh;hu2XWz*njZ>CyCA} z5JHGOx3V%H;oA0}p87c;xzR~WJGFXU?RKI-r2XsHVT;SPZ)GtD!?OPMEeHJaCz}$` zazw8;Uz)LOrSjN842oWE#5VXA+;-M&13~?_ubl1?Ofw|7y5rR6p$Nc?CXA0589jHT zUbV@Zh^!105Ppu$?&|FN_jdy_IN+%KIdrhB#kPiL5})m!-Qgv8;X(Q*20&;<`rpx0 zRx?f;2$Z|9=aa8|YrBM+0aGR}P%5}*_I$VM+#eUtEyU(81GT#Mo+s=SCElO9_v0^W zdx8SLb642RY_B6!VEdb4AD^tfH&85xrc-I!II%Yw0f7T_k#F zQYjDK%!@|qm@9?k5iEI(3m~hsi&MnQyO0lA!JJi2sZGuM@tt*dfF_|7hlb?xM9G_l zn_HPxu#L9`OxSYD%|Fg}Xt1X!jrERU{@O zZi-;~+KD>;+|p`NF?+a}LaS%Z-xC4KA z+jahRyqPYb^iEI{aO;qNqiS8epV*eI+mMO+E$c~eMXsO3;Q*cBd9X3>@6QVWD|d}p zAmZoTTjcmvi^@k#xA(W-GMiU^iPy0t6&O~P7}uDClV&?fT(eQzqk?x6*1KMrYpwH~ zH!i-Ysi2!c{*f7`lYcTACd!%#Wb!ci;~mk^AD=+BbFiT`+o>1+qw9#!QsK_B-*po~ zQ!8~C+6Vj!!g(60QB=M45b~Uyn*$LYm@UJzn{xIZ%{XLmQt5hKeDb(m4@0$UOPVZJ zjA1MJzUjuR-;9FQ)^i^v zd=e6qkazLU%Y5$)6h3^j%{S+*mIq!i1JmlS`+HX}K3-$E+c3v%Kznj56cy6$apCqg zv}a&LCsy2Fj{QE)fEJX3rSMHRL6ihJa9KN5=bWIwcHzd7rwbvH0eysM1GlKz{!Dm5 zL1unSts_GbSi~Gk#ojkV`eQ9A5cIt~FQaCb&uViPM~=&2+r;~Iv6wq&nW6PP3!sra zZviisNKOYUU|T#faUzxMA|(M;7@fG2ET9F?ISBRVkPcgX(qet~^%lss$%(!r%VrL5 z4g8=u3%Ewgl;U`(vuh>x!v*iqPm@cl4`EO zZGgvnLpqs&Ii^$`z&?%qSDOo+lpo2_H_?(A2E9J3q2o6XcbjSCyMeY6`XcY2Ysb=& zur@JNO)R&^;8B;v>V{c4eC8GKq~&GId!C%6{O}ZkrQXNIWVpWgO8-s&bq&jyHAt(j zuM0fxlc?W&-6os5>8SbMj=rU3RuxO0GpY5F=GjSUFYtlLS`0iEqDkF^O{MsF$ z5A)J<+zJ~AAt}w6W^VSqCp`?9CJO%IU%%I!90b50`1n71p*?9XImSTj$t!<>5RX7U zx=aJ5*@^6bj~ozR21j#@Ud{hUnuE0T6CgXfOsc2OVWiY{0aG|SpI`UhM^Rtp#iK#2 zX_)F2YJ9i&CgEj1Y&|0(>M9DPst2g$#W|wGKMYVaAu#M>e2?DXG4ah15J?qeEz$_c z;zF+iqMeV((f)L2&3ABww)G8`>+c0S8uBiXw`Hs*#8F)b9YSfOcoI+R`w|h?ZIrWy zmIR_V#N~EZ$4}QzBB;XGL_Sdu_lFByV2fn1>WymB$SZ-KO^k9)RG1w`%#1Wcbifn~ zRQpz77k|8CYd%hvp7wy&_&xo#>L3bD$Gkgrp$(^7hb;yXP4KJfVBGKTd0=}RDbY&( zBO80HmgVMv*56m%htvpM`fZLhGd6M5{JdriU&tbS@KI$PcM zQ>Dz}i^%fW-Eg13PrF$_Rs)UGm74O(ui3+m;8EZ*Bg2O7b9z9$r)2Q~(bi^VGaSIK z`I1teizr>8=AgAn>-uqB41N38ISMob6+%L2jpt=vX(4}H`wuxdU0JfO9kXj+<+k2e z>)V(cJ12tI(jCJle=kXjBl&QU{J5wI(nw1|;PMSw77bADq);k-iTLFI86&v0inm^; z>kAL*p^T`755aguR@rewj}Umz>%VdQ-R+AS0eUIBD=G7={BCb^a}*Ug|*%bu4GiEK&b zc;&Y|*Cn68*8Y2K1_@+O#aN^Bmzdl^12JGx4!n63f?}o$ixTi%nDamrpwrbS#RVuS z{Ju-}y_pbx=L$~CHceW`1PY0j)}~%qwQLp28jF)JJ3f*M&|Gr6GFN=Q>(@?m#S}fCy-UKVb1R5J|)9qLXk+a zycy7-sE>Gs<_0~4UJSz&6Ac6yK|g?;=ibRvDPsn{Fm-|4=f`Tjf1NFpRe)9~ulFNs zxl57)mU^dnt!d3bAxG|^LBVV1hHHU9Q0Q3l=!SR+sERU9P-iaqJCnV+soq9Ss$$Wb z`2m`7g|k0`7~6+XxYQef|8fgEQIVtcsp( z0d_J0=#Gifb1m{K21Is{(}to!^u*ydPbH9Q|MRT3In~{1K!A7V?+GaJ%wcX^PUT$Z zK%S>#qfbUb`7vuRGC-a!-FIvz=DWUzq_JI_Ni-#7G%rhqlYNR=a_r7$9CiDvlP8LjJiN2Zb~n@QCl$ zl{&?xSi%7!KQ(5&+8Oe!28tOz-O9Zra^gGw>(49zMs8VW(=dIK7F(ot)kHr_vksJ^ z97MW^FGr<;)UVFF&OOd=wWYxXXg$SG=fVR`0q`)5QGW$)u}6si>OcBr6BPR0HA@(- zdoiK+rT`BDWhC>3LS_MMz@{iF*`{@0G-wE5;zVSze4X8fX4HnQJqp-T3MHx}k=ppZo6e{&(}PRW~ds)eeZqa*>f^8|Nvp zgTUn_sE+1SpZY&2GRkSDcAO>I>V}zh%AqLXW*`vU@!LRfOUyjoA%EUU%UYpWv1c34 zdT@vTzwp}9nF3spd~f58G!0wheu(*-^OZ@do&2+)#nP83-bw6L5)s zZbfF?sVh=IadUFcWxVrRLcjIS&8;cF(?Cfuby7jupKV5I!_WbK@EQhBu?j?bqHBX(G7J%GrM- z?u}6JsVgEyI|onPyt1MtaL5^X4Y^iq7$k~M4AC#VZh=R$`PDwk>u5v zHcI_svJy~#bcsug)9Sa;tU}Kyk8*328O=|$P2k=mkcW`hycuXM7$yu|W1qerJI3#J zb0;u&aWFx@vv>;TJcwmEypC0Rs=QOWIN49~+0G^<4pcQSk`(8%+N5YS1B-D>#FF9d zayfq?3&cPYr_(KGfwP(U?;Ch0S*3nI+jnT>@iG0y_b&wK=cQ$w4q5`g`!BD3EZ%D8 zR(i0^Eq zQhux^9NF>jhlM&iB*!2sLWX5)m%|(NGT7{TT!gh@Ty=oQ>iVbh?VgPF0z(eZ56MKq zCsJtgyS3O#)jDuNLuHjEC;qVAenGc(Y-09BD{ZfCugtDJ6i4%8iCn$=%qb0Xc8KW9 zdDo#r;y4C?>x^DO>(0QJ1kd{(&UC%z;MWhkw0L3jpE#d=o2)UC%Mx>OLR|$6S8wcu zkYU_!Faw8XZdD9)(rOdCL}SILhR^gN>fs~ z6HJlF^f8-pc*!HUcxrEB#kRrXK%g??=Gq6>4t65mQ%z~4@p1Q0sh7Z8NBk3#>q*a& zUR)pYNyCs}Qg@!9L_qOkB1*@LOEto1AShwOXFBioP4P!~Ko5wg)tp=1+X!MJKCei6 zyq+^!pInma#x)pm=CwMlUQe+}_^|NB3UDbhyLd(lLnY@|%(k$3{kPf~APWJi=#ba< zI{R%0E0e_k)5LKpsDR0zaGcH~Wu*umwh;(1*@Mb|hNXUSDa@jPq4(*(Rp~N!zZMnO zx%D4ty%2RxGT7*sDUJcD$xDl*ID!IyQ|imm+j~goqX}I=6W_rPe@I| zmj$$d`-QtfSA&jb)TJMUO9H{Lg3j96gTH%4=m&W?0(vJt$5PB4Gpw3&o`#0HeZsEX z4NuRdL&ob}mSPYXWo4YnUv$EMb1WwB5=8ot;rijF^O;((neC*iq=C+Ni@D!)FeTS# z9QETVT4TXKu_IAY9N$o97p7IdJYF9l>3N;pxH03n;Fq~2!33>0^PCE`?no>8P$fA* z5@ig|0yfAiy3R>E4NHoK-mEpJ5ig|MGTwCrB~xU^E1K$rXI31)xSgz~5$@snFVg4w z^ymF%39R=&(OwQFCC+fmLiMC2?x>#BwrhcYP|ly?Oo(rBlL>YPXHV9fvm%?bu$f+h zG69<(cZ70x6+*l#7?0m0i3fr@I&^5i&anS+k^}#1dp#<3d+_7?TB&V6%;&22s9@aK z#vXw$CS_w`xrr~ElV!1}RQoXT=-W0sZHTrJ3voPML*o~B>Ee~sfA%2ytje>#;69i* zyUllH2-kL8de26sSnPmOu;zC9ji+~5rS=x3M??3+f$Xt!0l0Cwm#k6 zn6~QXf;tyV&>F#}p6V^CsonazTz&169E#F%n3;G2c3-mME}3b(FS|KCc8)0w0T?ky z6q7)I(X@m3l7c)Ht=gSf-~^F*b_E?}yDkFbvtvmpg0sW3c@ERlQdH!rfbs~Z7(D8< zC!6rU$#eDOWRnnL(IBbX?wEJ+)BM5O0}h>2kvz)zL}qDxc7@|`VkG9jz7<7d_tHWj z&otsA4H2 zD3a3pBlI1g6yQesCr|Zuqn3ADPiA`?W421@#&WOkGFG{Myq<9S94Bwin2c7ZW zFyq$A4F~ZsKx%u07!qMh?&BzeCE)t=3Pa11vtH8 zeI!5~7|&9C%tZHNZ2|)8d9xgKtLrgj)4~`GI%w*vs&-;*n<=}4La6`I$*2wb{%dIi z(g$MkH3tmNrpFb#w&qD_DB~xoP?A1&`h^VFg$r=|K?zZ)YtXVnb@SKD-o`qHTg|^C zk=%z#Az6s0ri?DH!Nn?(Ohv}&qGMUo&jVrkBn zJJQuIU#t&!2GxhPAFL)i6{M5ZjGsdX!-Fm?=R5zHKrg;Zl&(P6bjs0J)Zo_33vvaXkU3M45^)KCb-EOvW?)NR9Np9wr zfom21Y~+?1r;SvkgM>XZ>%vE7T91KijZ{d@d?G*=@{?4F|Kj2_d~6FU`t;HM6M`XUtI zd-k9X48kpvPlSJ%8rXLod9d5f23%+vsDM4o_rjYiA45Q*)@5R+)IDtCB}@Hnxa7z~ z@Q!?RxgulCwJ^v2YI$K4w0gw02?sG_2)0IOs0#{Pc)FtV-eZtwVF4bI~IAS z^C@uv*pf6*3R(R_`Bk$(`sQaQ;^CF3JwhBn6oUU*vgV;}&zvQ}l^KgKZWuk^`tgW8 z6O~c4F85Wt`?7Vf4u>D5*NRVoXSC#p>?~r^B#6LR_ggaEO0tPzB4K<`6!!4v=PQKp z^_H=ZR~Ra`IeY^w#D@De8PUH)+Wq16*Sr0`;<~?9{IM0dnjkmIdr@PN%38YBEM$q z@l8=MV?tjgJUG_c4 z@)FSX>dz@(;Wy8u3ii5<{ZL5OC#0N@9 z;_1mzFaoBj#0>6tm1yz0=xwAze_8+Qajz?DT5$31H}JX)ec=~R1$7Fv{CE8I48Y-U z*fT;+<~Rs(Nzn%dM5%LS{eh6GID11jcS8T%5izu+8ao~>!IVPx;V%}rB#OM3q!38jI(W8I1;ioF<0xs~- z>DUNzA}Rc@=QA2ydt(`06Rzt$-gK$X1m(`wFsrQ+OFe+uBVC200^VLW38;S#l)&HB zo8U?Q*5m+lo1ov=H>p9&1&}$=z66-*A-lfcBa5hxJdvGy;PR0gV0qVD2Z+EtN#*MG ze7Z^5Y3>AE%WVa}t?K>e8QW+A@d$ahB@o)j$ufk@L z^MX_B)2XG~r}w*Zn1g@MFu$(gk&K8ha4yw>6@1LX|DtcEz}C)VdE5LpRtqJ;#=bK~%gCdrE%zrh z#2wE&L#m}kEpYc%Cfdgx7}NzC(+r$Ar5!d`G@)lrgX3ci+1*y#>jBBocXC3!+2M6Z zUjL7ztB#AR`T9RZKxz#@KtV+sBn8<8C8cHQE-5L2rCTJIMrmE~TaG zo%_6h!)ICU+?hG&TL+%@ka2IR5TjCGd}{@~Cl*UNthZu4Wg_TKdNDT>iYQQ zg)aZ0m^XMHomFdHrC@=xz15r59i8ZwRRr}#wRbX?YkN25C?5}E!7*=}TTsh@wON|# zOvX%wr6awQlz-`zYfde!FXcTAyBkX3clM);X+!uCk#v`jYq2dgmJFu(T}{0~Cg{`g z4G_jhtFjPfT<|0t6h>kRrlcOQI8~`9X-jnGD=9#wOL>=;tMvz|G+M&_J!(3@9Y#_! z$vLp)5^cLA#-aU^{^`W4ArtV4(cNkN0~>=9=Efa)(9?INUGHmDRJzvdYAM~i4R1qb zrmyL({;jN%&j@?T*2)1wSjuxu11LK{CrTOT(pbj%Y;fU?gBGaL=?jccF1GxsQC)OG zzDHD*_?xrB4&VjKLEO(*Q}6^VwMKxhez(H|>w2yY0R8&EC+`o&5^vq5g{jB;A-6fS zNHwFT%fb2DBtVI19sX9rUX-)9GC&0e)23Y5mKPehNHZ~Ala@ULht_u;w`Q3KBhVoyJ4O_yd+k#- znu4)5tGs{x+K1Wu-`5fx^wj!;Xu^VqCX4&{?Abn0d`((GFBNsF&H26%O(-G4gNt#^ z>hBw*4rqQXF3>0OMsLm;X<;ovv8=XXs(Xvi%B$f5)GBF`Ewbzuy&h=)x`_G>gAm8R zPllrIarn;dC?X7qk$QR52bW_N+LH@v;-`7=-|z&OieN~5Mba7!SZo%}-p2ANl|UAo zU^YWRbL4)KJwB}t+1f`Ez*VQy1`o+)93G^gxJ#rk`H_yi6uH(eiR~VgYe`Sm_cAD3 zZk>6l7&6n)qW^OJ+b6P4kXSQlKdlDvJ)DN(h3Tl$Hh`Ny*@aY~tKf_kb4R}b=07ja z>~Hk9VoS@aiB7rRhmE^Ex9qg$2L^NQW>LenI6V*L3FU0JARhBGYn^XdD1vSAuftj@ zV(b3@c;}T4ZMPZ5e8CWvp@+Me!Id#LGy6xWTV%|wyX-SSz2fsQ0fjZ8sESpKAJ63uBms7P zb*ZuN?JZmcmen9CF99!9|oz!`_)`c!kSqX7sjvSe(Gj#`*wFK`2NJ0C95L%@6R;YytvE?;k^O=ycYN~ zWtD{dS?44z!%}N7cMg zGG(sZ#xDYY`kg?fUvxd|#kI}R3BqbbZs^V0nZtc^l8Ed!HjWerY@)=jU$b}cC)-(T zqy5ti5bBwldxrlx=)=GD@k*J@AH5Tz*`*-Xqq5UDuMFNc4gRnRwRSaYAtdzQlG9;u zc(QjLD>jbo{gY=pS=Knz;D?ME2jMcUE(3tK$or`&lcJ6sQkLctD2{>nyENvfR2w>Z z8z5QhKy4LO z3u^41&eS?SO-_w!THh0-RoSgrqL*u(%P%`5@~EhP7pLF0^p{X^-7jHkC&op9&;bd8 z!}Fmztn-$dd(*;j$E06oTdl%}jdcJ?H;Z^kA7AeDyeET>BPrb0MimMNGrj8(1YS z9L}y?DYppG;U>Q04)gCT8vOvVaixQCtXk*YB&d)EN}#Y57jEB?qeJ!J_h5swT@`Gg@bS$ng2aCZ;C%b_aKoJ9m)TB;4tu3v=b(-}t?9=Y^lVg9- z_im(_2vJb`E^+wVHZ|+t+q$yS;`cQ8asai;-sB{`t!4i^!Xc>f{U&G}7}M=qA*2m5 z4fHV7_myY>6KWB%;fB{;GkeW126;Lftp{0H3sVOkkil-u1X^V(U|OGGhG(m>!f$@1 zI^0sWxQ}|esnZ{ZgN?bu&?l)C%#Otm(@7l%fcx#!`ohW1SLYEQIW+E7mx?NBA5*+^ zRFou8K{VW1txfu9>5IUHjZxH>J z@aV$}#{U|7(ynX@M#8?JoE`*p+A*OV-ah46bGhGXh;a-{&p6cR-Vya5&qTG@XJ*2% zm8LTo9be+=18)zgu?p{qieBJ*DeDAqbiA*-dl!*5t6y1+`G>gcBegw znnST+;si7wl_PDyyZ`f#1{dz~j_3w3J)_Ur?g{9*JMt-aC2w_Sz-aUiGlYNn3-1rvrA9E(LV7vn+RSyQeny3Qj+THcB?=QhL|*oN?W;>jnB^Q05pNNPNhL)PUhHx=N^#3DD$RLxdyDp%6eEn%Me zJN-7DO>=FxBD(lxiVNdSSbQDnXTsJ9xW(-yqi_{2S|87N8;VU-S+`yT(Ffk^S#xju z?N%|`a4KCN3m^?{UKjFomhP-B^s>2x3}a#%7p_c^e~Yu4?Ryo*yZsvfrkZ3yFY-gl z!e3y-4fJ@VrllUr+D_25Nn9zG_jJhb7no97BZ=lpJ zrnql(P5KGWzs*A$Bqjl1Z}jQ!-n+_`U==rIf1SD*ErT6Nk(bc`n`m5Pfc(FeU{+ed z!pNFaOS($md<55*z2Cz;N#n-0PT;8Vt?+dY*YX(Y$ZWOG?3Img+tg$jO3u<{dBxPl zp#O*9gQ%b2Ew5A?h`g%eR=@Zk$KdPBtjw54xEU#!jln}T;FyLXm{Z@>@#lXSgy0I& z;H((8J^k6-xaUczPc=bWl82bEk>{tTz;b9b#CKE5wL+sz zC86K;nvmz#bx9Y%G&xq~#w3FjkB{sjQBx1~vHo0lKGfYh|B_i?2uWXxQ>_BK!?g8z zbeY0?(CYb*b_P2EqXS}lZ;w?&$C*}IwV z{!D8xUh&1fna{(S4BKkMlc0)ZU(mER3=V9nsN$6Ip*IX0p|vR%*N5troHgjA0) z(HcKne)*1|MmI^BMB#{XYJR>{qI16n(cbuh6nOZYmHL?uXL!0RV-f-BII!@eC3Ze~asKD>5J~+rmkm2x3F4WaL=y=sMHw5Mup%xUYiTj(f>MpL zU+nzrlS=?qbGKAM1tnNq=MfIly$C#V!%Yh{5d1VtAr5f+JE4m@t{OZ-jU&ztxoy7WF zS3m(SqfD0N`2!YkgTHv+`U6Nk0>~m`hwmpFpck!T)qKj>Y`MJq2jv-ER5&+ZVRB<> z{YO8DlV_2rlY|wx@NxNjJJ^2kkCyvB&kcvVq~LF~-f;b22~f~&)w7fhytVFIm8DY; zK{OxwTd97>+Ata<0KbyU=S8Xy@Fd?lu?eKk0UGm#G*~Oi65l@@8`O8I~=Jx2H8dHf`xTKR(&17dncWH2T@PeXw z5%f+dIeku$!+7AY=jP<3KBK7w*$}?@FN;XSi%6!WxrAUQ_HLr?g%q2l4yCsp*%$>-yT!iqvP;)jn&4-=`;FgPWO+NXdA`p9(J z4{CF=I+seGO$*sYzbsfBk0_@{8Sq$;2Tq_d;u{lK^#D!X;)~`7U$x4$eEu_HN#aFP z9ar{0dWgD}P%YPNZ$u+>bCZ)pKN0ehId@SpFi&LArorIB#5RWoPuIf4%o!H}a|7(o ze?+6WETmX;EevhZt=?+|%QgstAhju78{*BhY16cRS}n$aqG5*rw_DGi@u>6s4!%^Xa{9EHrpy1pH<uL;?o$mYKd_r$wRJ z*H17svjk6I52EuBdG-q#0J>-i^qs0-Jb6(;*?`f`3MJm;pwEAh->Kdf!RTynE65^+ zpT#q&H9RY_pu|OuqOF44JTtsZ0wBj@KV;ss)+Nod<~MM?c8c7keoHBdiEqoJ&Z-vn zMGLpoNN5!-IxdB^oylOFRcxrJg|Z^NOsuv<_Lpg38|n8g9)%- z;Tp=Z|6M-Dz8CzNDP|s{>`=Esg=#unMy@X#U-zTcE3LR_)jNq|&(fT)sBoB`o zj?j1UqRC)`%JKZe{2+pGG6ZpyzY*s+$3i}JKf_GGe5A=Dd-MJd@s)-{U2D1&A6sZG zy$S#2n2-_5R&ZA_CkE$W-l2sqe$l2oX@q3Qb#F+lhESQjZ<%_9&23Ikg>vGy+GcqZqnZNY`7ltze@!#&A)%tD+p+A@(U!qaCAwWJERa? zyW1T3$LD05H+zZ>Bp}Fc~P-FAv8ygUv4&B}aX)3h_3o1z?4smDh z3k^cIA2Y4FCxr>$Z=JFg1_1`D?O6}-m>G_}dxQ~D61-tPX76jVArJt}6qV1NEMOdq z#&UBhGH=+!S7PnM|DE3V0I~Jz>|D;$-S9$BLmlKm>u(K3jmzVkAtDbk5Af0hGiliq z4U`!9Ulr3rd0!%Cy@&yuP9AW7FK}h%Gr_y@Ae*EyzO9ta?`}E{gefFa|d}BoW8zyjHLS! z`h%LtSJ{#AD~KMWR-VoG8M)pL12hv`Y&w{^lR*pos|-pl_m*h*h5ZHRKRF$p5>4*w zSPiqDqt3tq-#S$ITp;N~Q@X*GoHE70{eyuAP?V&+JL{Z$E%5#;so$%V`y3N&&FX4c z<^CQHlv1WWyg$}W9|LW)=ef|AzX(e4Mn3>#b1qx5Z#0O^to=f@EHtRxZ-);s`#*di z+|vm(ZU8xKQ7VpCq~*v1mUQpkBbTeifX|XW6ZZyRh0i>8*i2JZkOHZqjs>ka%xF0T zYrpLI?xc$8{soEvRN|^K2zsJ&{ZFKD&RoG!AvUD?FB#cKynQ!>0f0sqU{0e*Jq5zV zaRnt3ipcMEu;MM|5*F)%R=3E1Tmboe>lc&~S}@!_|8FI>Z$wR8Y2a2kxG~cNM@W2X z6-!`ftDF(T96vJQ4@b{*zzWD7UQ$&!9Dq4E+inP(*9+6SlQN7HE#W&~0qDba)N!kz zbPuQ;h$RX9r5<;pLt-};-eo{SVkM2K<8oYaKn~wj-hQUH%102dhQ|*VXfLhb1%8L`qf}+Rzr5yoZ+R|0DsSGDdFV|HTWPSc=3LI#({dGM))KS)oWA2q^?RtG1 ze{)$+@clR5Wk37ty}lAcX<7}#3ey3+^Ze2^fW^+&I$ll1S@o|m)9A@6=ln%%N%@VD zBX~SsaDmDf_I)k(UMPT51CBzFuJE9h$R^_$B6vDmOB ztLxz*@CptGG<{ce232|FAJ(GHs!-F8ixa>g04O=5#B6y`g!p#=u7~nw^!h32V8i6^I~EXIs^sp;0`K+pPu-%II*nmXtO*m|K*tmoR}K*D&QwGJ)f_A`Kvx zvA|$Y_qw(fq!Bt3>0enPa1OZ+OhAv^WnuQ3?bscp2I9e_+E#*9lOh^!Pp_R{{U>34 zpe5BHNzCvSbzz&im%xJAkra-jtltNO8fbeR)ZjL6Q*LGv5;#hu<9{rgTFHl)d^8A3 zG3*1~gN)uYYMv4(Z%9qop1$6G=Y$#bYe}ZD9E&H(o!G4t)Q8&Rs98(vV#8Wc!M_S4?A5=qhlWRE4^5(|F)C(t=|hcd);Yhrc49{Nw_kK58&|78-NsV*eTC+8Ju-wWo)R*Um+h8GJs?m7vPk_Cl_Ic>;jx1Fw3RUD`9kV#PUD_gR{Vsd}zz#A-^qFFVsvg!YI0?5o ziZKZ9iJuCctj1D(!_bn`zoh5+{Zd_qnWii~h+>u%NuiSG!D&t$4{jBu^$nEZQW@Yr zn#yaWENQVPYfvJ@S8PxQ9yRk{#RUu@dUM81m0w`(+xDwh_-i~gx!)XkK!_5?8*iZzbv;}cwDAdfwSP&L$!E8d!n_v9wCl_%R;5yM$>QvycB3DMe8kKxL z+Y3E{`ulkStat)eo-NJG7SF~87t6-ZI5O=Uf|j=WFO!As!0+oFW)vuFAV>?YsUj<% zuieo9@;tA#UHB0xY`sXsP_-JNfCM4nkanGjHd5K9)EyMw%A;PEK6}WG$eb;pYbKx$ zEeP6yFv9BBHKk;c<{nC&*+YUr$sjmNW_Im;It(<;tu{m+J*$g14+-QG99`PdpABr4 z|1y7Unq8;}|0XXPyh(WGKA4cP9@fa22`4RFM=B+*)+AoCo_nUhL-^hO`xBN0W;5yKPP^t}`rDP_ z2r}0+h2T+pcbt^lv|a%e6?TI${Nthp2vGX20%G8|)IvU*nOk$c=*@h9Ztqvt_a&1o)z^h0K<|qt<+;_)l5}u04GA9=mo+I9E`h}y zzu*o#7+sh{Px?@9K`t7lh{5&F-zRp07x2;T)G*2XF2|biZjf;kSu5XHm4uJn@8vUsFA!uFm7%_#O(Iw)p!EcAIPhxwJFxpg+hUHH1c3nIWMNlO?py|mATK` z2b>rzX>uRtZj_Ut3DHv;oA1-%_5JottaC}s!IyN{NUFtr&YtUS?rY|^u$pBE5$rUyG z(`VqB7BHJwkv*eMe$}t)Y~9klphY03w?@nOIDr%_>D?TjqVtN0)SN*=^k2I#cslnA zc1KESCZ7UJzY-fo=F0|v4U5hhw?xF2E=f^mYI+#VAqPxEF$qVtJgFaUR4~&-=LxD) zA|fVcVSV84rcyb7C8h@~_GywG=|x}2R!@4xlL4zQL4jyg_@RL?Z`qh`PH++$sBX>g z1Bva<@Xe9l^@AY|5CBFl=WyH}`YlQ$o#z}AMGK6~ENogGIYd*lHt1Fk@93w~m;u=n z=bN$|`D-N9;6vGSQfTSj3oqkgos^DfRAxvkYmVEyMNY6Q|G}*jSG1UE^5WL3=lD@K zvRKdBgDm~u447m*z#=-*Ed>QJdLOh^<38UFej1oY#PNZH&L3EVR9-ESEX(?RL2;{n zAg^adF5}r&!I_@+{pXRrkwD!qLv8mNums2rzo`W7KHF~3)(puS!XdG*m3Q|mC$68- z;lirj?CLe+8sLM=R@Ga|Jj4)cQyn&v_`J(kD5@IS{sUcDaO(%ZEn%TzG7 zx+Z(>uLzK-!a-Fo8$w2Yz;?S9K7q=SvAe2$AR|Kg0AzU-*+^z0uZPm2}w%z z3*oID;;xUl!o5sfH<<_TkycrFC5l0&>bp51yqU2|LIl((?y6Q9_1^Yh#yPKP4jCUo z`^PYhx0yGRYbxUCqeLC2&-u46g?^|(o8MkmK0U*}+5e+xeH+{0c0-hj#*b4{sl4WT zHu|0Yqv91p0y8~J5K$3%F0c0ccVBg;#BG5^DG|z&ZV<^<)}Cy3bM+q%m}67*h}=83 zg*x&MM#+8|!wKk^l&g5mNz{vGP{-BA)mkn7dW@v@qBIx)kdZY!$H$svuD;!y`0qm$ zhL&#J$r@>PR>{l{a43{cXH$-v`6QSwp_OIEne9;YY;No((DB{$RxE5-%1V+4zP9|= zuFvI>mCMJhP@!t!gk)eIO@jsvso5E_yo@gmmE5-z=9T+f1iPGJQu%1l!g5BqUtT;mI=5yy*|A z`RR~kjmLJy8leX{StV4oIXXNc4|W;JtSOiFD~y5e%<{`l35#Zy`H@Ibe431UPC3EF ze~#ZRZVj2z9ymFqEcsqHvuc?DX!C@)GGSAF;eGZ0w~}$>6?3_G>#>*bQ7k|3`C{!_ z^RO5DG!XL=ZQl}{bqxLtOSt%I?QGq?w;d=apR2^B8Q&q9NCzZO(}sOQY`JN21`y-> zY$~i@vUYyF<>ZgR)6w&MP77Ndu4LI*)oaW7h-;j3t7wT13(I?clFYa=6$j9T@dvKE zU)7^7D}f-}DUr&L&(A*i%yj7u{2ROF=w~pf#k+dBB|M@%=yVG|TMl7u6di z9AY7DnX^FH14aT-=FcJZ!MXb>ruqjg{fD4l9cb_M(WToqF_$|^KM19Db6zK_E{>YJ z2NFRlVRghX39}}|yi|=y7IT%6B80E251{gh!m=!!p6)m3_C)!2qU$);WY#H&e!wS` zNs?|bNl6_>Fbli2h%FLH)jy+MD*q%OcK(OOybNBskmmBQ>YC@x5ybpWnX0$PagIAL zxJT7OrmiI1&pfYER-9UzPubI&4aoDA2k&+?z+I`GHm+<^Yp{940se#4qbxD+sC!0N zv|iq?olJG8qtsi?ebI%DdiY<&tuQlrtDsW${)GeH+h+q3(rLtFJK0G#2wD{1F9q?D z+II$)(q+?_NBr7Au4ar$FOr+v`}YGZ&#o-f23Ko{K+~&~q@M#TCJv95=>B>lE`{pT zyeny8$Vm^?@*Bwio&M&w0HxC#wPO7DK2u^)$0VjJkiE>?*?!5dOaKn#>j%_#muD-0 z{_Kv!A>*DPK5LJGwR7A*fU6QD6LD|)yt;cx23wUPZZprkUQn|5Y)eMrlWWY8W5fCv zrIe+|ICB4h3usxh{hy){hd0&!lV0YaUHNTJwQ*K-t$KI-{;rU~u2*2f_ z=Cb#$n)^RlWbmih#Qpl%SIJ>aGkmO(-ev10ToX@ws?t0)SgqE_$#s67n<5$Z1cXsv5a* zPb!5eBDPVGxOXx-aOcyDtrQM$AJm3#8_8iJVUX!v0zF*t{0DQJT}y7>0VAdg5l2hU z=$27h48w2`{{l3)8~FwZ|(?8!?`Ie1lqLq9#DWhGeoOQAvujG)kw zLYN#$pmm`UZs~dfq)ioR9+J&8b9612rL-t+sp`al<+3byA#P|ALvG;yoa;sQRvb7u z@(R}r5F10ILpKuCcz~)y6@53wzJg;6(1D>$Lt}W6c#A1TtDx)v)zaf!w?3@D^|_)Y zP-j)B8R|F)>#}hel|g~=*{#YE3G$HfD-eBruPA zQ~vD3tGNZGFz?WxsHfS6?vr7TJ)$BJL>nDDCTR1CRMfvU5)UV8U=i0%XH&O-?*NkF z+2c12JUYg-gj}dlqMDp}54U)b_&wBJ4e;aNVi6cag~BV>sbfN{gJ$48W)kM+`DaYu z;g!F|c0z`3Pn-aUQfEEmB!k@Q7;lUEL(L&%`;G(y`VM7kk97OTpwtJF^4Dgs3G%^)Bv_CSULnHp2Cdf* zh5UTUi2)BMPk%6HW~2Zlb@Gjng|Y`tB;VeWE-z@2_2|2EMx2?M1&waXsM{+1+s=CH zdLT;|bhM2ArsUhIHWjY$X+~4S6-LB6rKWxg{qWOwK<6sa#zL*{(eVZ_Rf-oGcOzp) z)^b;Ro;|68A5-wlG4h-EyWitvqIq2-G1f9yAnrWCP9#AK+XmJqtv_&S(+X-Zv?p)Y zVj#9@vt@tZ5b$icuHq`^_3eB>Ti>nu=jWrPY0HOvQkh2{wt$)E*wR>PAfsN;Rg?fe zGMNqdp;HN!*#$s9p>CXrWKtj-;C<~NK zd*IXtJ4#s3SGZc!0W@3aNUQ|M(k3+6TB#`BbZFo7HQ^VFjA&z99`O3o;jLtOf$57N zQB+!FGf!=MWtC3^;jerjyi2c%Qs13aZjC$!`rkxjy#=RokFhU0AV)(?Xd2y=6Miq1 z%cn_9P+y_`Pk-VgJ0B1;(0VtZoiRa~s0}!<%SiUTRcT!Y+BdYdJRs`lS#xE(%;|eT zwTsDENj}LpF84zSF#*CdIO7}nJI-xjH@0JY&JMps`RF4+GW4wv;&Ld#hzfv0%!iNu zo}*;$T$uTR0?N{L)N$O(?lJQCSuSp*)R%84e;TR|I{u>U;&&K8UTuYygsS9HWyJ!C zAet>K!J@)(F)O!IuxQ!p19->@>9n0{wu}*=(&|Q#J4yz1UqOL!v!Q7Yg3}K{40L`h zds0v6m$OR^C|ts7)8xvMwKBg1hd_DAG3U%7eD6E?Bum7XQYV04hD(=(J8l&L3Vx}Q zwJVX9>-PX-DSF7O@9YGqR zNc@^Gz$Sk)=)Mox_4S)bB&5&vfK_hlNIWmh(d*0#TMrPM4El@)vUUCUWB>|HkjUp` zy~o_WpAbIa{%mtxvR!7`j`<00Upu^7%ZbL~!`Il1%nK`*yRQXCk+BL5#7Wkj#*9d<>dd8hYw5>x0Rk@>H?MG@eym5ad9s{Hmh=*zMO52oQ3UzSOffGNol%!e@^&fQmp|%9Ze$EJeh7vw(=v2<-hf{vu1sYT7+Jcid|@nQozX3>w9i~_yX2Tp~`iVGjp z!kkodio?u4%WlvF&et3o17Xe0LM^_uM%rF%+)99|thuN94nknEu?PS~Os~@i!?p$J zPY$R*(VLgNGR%cAb4dCG^xA6|h{gLI)$QK2)S%IZ|C|{O z@1j`&^{Nt6ZggbAlS?!#E2@izv2`Tt>cG=I^cE6+LRFM6SQZHH_JYL)Dg9Bh7yTW10!8*-C@+pZII-(o-~k1BXfZ407UI=Msf44sAC=mp)6gZM>L}P@xdFFMk#3l39{1diq zDgZtf;klz?4@Dp`Cwe5>`SUbLdXOeyN~#TIchEVgzv0ikwr3FF9Iq_?-9`x)_9Am5 zyixx7YG*O9Eq1!eSoOA`%2uFCp;$J7BdMgQaWmuDKzWhs6Na(0lNZ7rWRKv}#}O~$ zo)sjrhDH;4bWj7x08Y~Ivb&1%4;TW6V&rR5mRiOLQT7AD)3j>f!mfLwx-m=RK^A3n3cFV`yF}izfqj&xfxs zBm`+1^}LytpJFT5APDYj4*umcB=MiU0DJ;6NAVb4hZ|fUl9!RgjxV257@m4@&4MU+ zjolt%%+v7TtJ0ZH0NSwh>|evK-XB^q(d3lq@v%B24cF14L61$z7PtZDNw9$fnlXn^ zVEU``XRnHX20%2J#^XOL(AxV!M@tcY;+2~}K4o9jVL*@ouGNK~Obaxh$_HJV=z?@g zS#=ydnCrm;AL{HX9wl4sxniQBvF)Kfh}ZTq-L0V zxGS<@0o63IS6lBYbr{HCC&CP8N+B^_Xe598z~IAaumeG&M6eOTE6F$}nilW4w}s0A z|D^dkP=|?~kV4ETzymFJ{TK&~ypv;^u0c(rCNYbX3zOddQ-J7k+q8Rr@i*RAXnwvg zkcnE|W2Nno)&>dKKMCc}l2WQkM^-{K>#zT1xa1cwJu^28?5_5%;8oIBDgr4&Pf#Ag zY{gxniXW0wki&5}Wd3E5CEewYTZGtM)hr@OFu$&~q`f-zgB$zL5@XYWd~jy*n%k%n zVFH#Xes6#$t|hJcGQ8tp5%eU%zuRIuWx1)d-;HQVQVGNn{HOa=uB?mU* zWTc}NqEYcb_17c$&kLr<61gyf?^{r*%(1DIA8rw@Dj2M!B?qM8QxGkNPd9ZAwBrNO&E9dsRc_$cI5u z(dJ|G)c?SbI%hQ0g_{iB5_eUL(kbPuy=+Zwt0JwXLT?;B_ffO0wT1fce zcshRdxFH?_8Ju=@OB(0G!1|)p^>8xsL&xa9+{o6`+sOhO3!@bIS@GAT^&5ECy3>n} z5>ADoVeFfZk|YrCLqN?CZ!djvQwV4rPK?EQLMXCdQyjjhp{M}Yc{k}jCW zr-mFNr{pzBP@R<3;~lpWgiq}I`egLlOGUbYwVW&Br;aP zMB~IdKGQBeU?pc+#F2>H0b>IE&wAL98YZ6NAdQCep|=KxOixdScJe__zoj4;THGZ0 z!YxuB8r}0YtovzpTeWJ`=vyZjZ+$S~R<_eTJeml^AWDP~USeb6-meUEjX|Hl(V}7~ zD}@&gWfJ5S^_p$)n#6?RnCH6w$)pA0BY`eBOEfGmh;v%g-8lCADGG+2Cgs>uo1(y6 z7&rD4fkG;MqD=7Qo~&C;k2zdtMxq_%)uWI)QpKej6CN#MdC^6$5sTNqqjWLn8eyyF zwO40zx_VQLLNr#nzJgDFyooBMoCVl{Qpb4ZAToRvpsvc6*(lql7Rg4(Vk|Ikc9DKTb9iHYOwRjfuTAm4dcx)N{% zqUZV_3~#%1f`h>l+ia2VK}-ciH(E5t5$e$?&^C)dZk5#RS9KmB;1 z2OBg4GunMq$**{&8oJ2_1Qrx=1%2|nPW22r!BZyfRK@udM{(#{lmwpDTe3C zVm4iHalx>rCrD9&6H4n7cXzFt&x$FX~sCDP=)`U}WUOb(q)6-dW0# zJbQ2_lPY^-gx{!zZuVr{`VOY|y9i`i3_e!2Uo7)}I0_@!^i$e?hB!@zD`ed_{s)JW zUmoU?2-4fu_k*84v_;oq4lv%=B>vjqxWbaJ)kr`i1lt#SdSAC&Dg_Jsw`o4Nl?QJz zZnA9__3=gt#}ir@oFC;bl^Jdlne0v)=BO+BMilpG>Vn(*HAn=;q|=3b{jE*TA#)dd zn_t$I_ECNCN%f~MKU06sE7_HOUuJ|`KKjpp@2Nbzz|@f=IR`=z3GBbF_Y@LI-#V;u zEnKdiOx?dHPFmS8li&hI`Ob6sWO}62D%9Zc&LL*x2dc-$sy7Y-%Y_5uz?OudZtJ+4gzcyk-`n-G1sL z==u1bOE_qnsoQ7!U*118I>KUb{jSHu-_@A_lTFvp;ollab>^jjF^_RSXo)cW&D^1* zIWL|-iPSlNU$0I#)D?~bdBdl5Z%120kkUaAN+v3w&tfn@=v=36)sQGw!xS7lsvm8S zoCtDi@D-+%mN_IS>+X4QCsc7FIi%Ot zE#xAO93cs2lwrj+?3RlGXr(ca5bAdK2EmLd*hE;Qp)=$>S#ssYh9?<@me15a9^o zWzK=6`de9xuKbqPXTdMvRQ~KTAp+(vXaAdsYm|iB6JAS&+D(^B4&$JaXIVTR%KPyP zg5UGh@~L=+8#v5pVQ2T&ZGw7+_Jqw+!IDtazlC#e{XjM0)K4)CxyxWqZUd$(EHwxYa)OM|GRI|kZe!t8OTqb3n=Ps5i;Fi$eg~&8 ze5f`#goLV!6Vr39RoSPGxUd?jLT5AQrc39lSF&K{vzkpbkK$AqNV#6i{&+vwSY5=M z7^2Z^a%S)|iDVysh7lxrW@~g-U%PouLTFuA@! z(k?LcO-ECgx}9<=Fza`k>9vt#J8RMz)}Kh1`hgxhOwE~T>jrcV`! zkVV7pu{U5lV?tjpC~bP1Df2SZZ^Y?V!_kq!#L3?=GxsZdQv-uCln87M1SBMXj#iIU z)a69%QISxuup3|aBp9TkSSUZREZ&cIga;LcIz^F`i4}dExc8|wXO2I z?T>yOlJlFDx;IjJFg{!=cpHPXEvq9jPWYp|M9OQL@SauhRXt zl=wXH0nsdQy8MKT&k3si1yGdeh}xX6Jkn_E|3f;X4fpj`c*{VmT(v?uInRK7GR^fE za#^9;0dLeJAHM{j+e!tshQ8!o*yKJCgdzLZ(@gfXlUR7r4FY=ym zn(ZAo$3pxsF*WjTzo4OyJD8_R1>>WCxn@vcqe2TiYQRHYL{q=JGv?!BH311!s(uk7 z$##CZOvBK|_L7p!p=2+vA{A4>5+;d9d&az+S2NC7Otk1`Bg8Tmr5hthnyYuXeS3&` z>bz%OpkZjX;@-uS_RZ@3Nyz(*O8_tmyAnt^oYYquZy0x8QdRT$Mo?9J`~|0@4}!C8z(L}O>BBN*t)J?WJaS#DrW2J0}$ zyS3vc)c9e*XWR`!t;Z}lc&Bq#2T0-DRaH?MHFKu~;IXBM)6D$Oi__HQ<)W|Z=bb6l zJyoROPtX4x{SKlxGyAoL3?HMo?_K`2;N_aUORAF9M)DMzV`#=I7o;5C&<|9-wHh&n zY?#8w^)iCB$&o8Sc^@o;{o3K(Ky^R@c+sryH_h)AbL?3MK^cy;SIeyo&dy?~JqbSBT`^C0H{mIIGGCby14EvO3KvP}0+-BfqQHCM;VtpcU(AbsDOeZM!=!yElNwUtIbeC`@Mve{ z6eCiJpgqsGLCLVf^}?N2Z?e^sw065k5-7aw;C%;B6$`76$*9bwa!;tpGeQOaoE>c&3yf1Ujd#eDn;;{JA&H>s}%~W70uDRuLPSdhcD2P9qx6Mb|{#) zp?T#^@HAC-s8mZRnZ2)9=AoRrvD;U|*XzD4U{X*{?CTa~qva6KGLi7)iQnLS^?exm zmVd<(T!IS?Sp!vp4lfd2zx@N%r_$HQ9hYGi<63C{euO%^%_`sEhZPL;c@#M2|76}v zPvOFN7_gadC4VSCoc%R9R|8!%Ua?W(U3)Hfp3gtYc#XS!FOF=31(lj$tfr)gIlsD> zdz*%yaMkh=nC`8|GTN5)U4^ErvckSBUHcms-DhWScJMUx8h!<2i>#d;Dbnrzt?~1b z_$V-U)f=PBy`Yp_E;+wC`1_P1?(stfb4oC|?abOf>1G>v8tF`IanuOg(Ow|;1NYAs z4P3qGVh|sjX%pwgiTQ}O@NcOfQ2a0ZEA@ts%-lgHH036u;kB+AzPb5sqCF9a5b{oZEc=Z$K4q&Y~P?pyS8TuXW^{ z&uYIrK03<%=D{)739A4%QmajwLiH>q^Z8-;nj!c;@{HIvSFKcAk*ro6Qq>jC{O9JU zpG$K7rb@0sxL=x_fb?*=w2SpMf^>I{>#&>_9 za_gx$4ZcF-0h;lc@H@ocO$tmbJSp-B{G$>&Qn>fGvl4D7sAuX_GQ0}9^f=||3_0Z8 zPhhADrZX&^O_1bvM}=KutC-y9{AWoqW~Xd_%ixAfz8weH$oNX(g*z%CM8|}!C&oEO z#h=Cd0^b9PU_q1Fre{VEn7SF6GD_ie6smgiM?L%l;3$=HDCQo8?|^W<=zZ4=Hu{2n zB0iq}$#sZ?QRPm!5XQ0J0*PNAs^G%@C`Rvet#3tDf~iYNUQu>AO8B=u=sQQEEQkj(&0> z&9RB_-YYEYJUfLs_%aOJqTwzPHJ7n4bP`u!s_o*praIUoXg(&sd|;D^i0)iA5O7s5 za^%F}?TB{$G+ThO(Eo@QcTh`F-x(7I^VyD73O~8d_uW?Dz{}+MFL0V_jW1JJKNWzp zV=4{VZx01eLBU!y$e6Zd3D=iQW%)%&V3?OTKt51Cn$I~6PzziE!+-pZx=ED}>d7LH zw0^X#v=JIk5HTmDDmMdw+}AVi-9H(x8(e@qRqEDz;BBKZNvKZhAx8+<`g2c0U$&RL za*HCpV8C);cDxpD{wki}vWAcla72PKnct~#hUL|VZd`(_=-nR=kVMx2Iy)Fmw*+%% zukS$80F};@dHS`*r8*ywZx|_x-3}dZHLv#(@_cJ^7n>d7?u1;-Yf%-L zXndOt7dV5ZB(HF39vqsk`3UzZi|Dv_A(rW1>M+>E1ClcZqLzZDX`zPJF9p{w3^1<= zI;}fS6SJJ(w}{R2MMx1MNqJdceZU^Eimw8D#?k^y@NY*Li9Q(Xh@0dtHjT8WnVx7~ z0r=6+1)sO%zCJV{iiLRQ_ScsF+=6+3C5w#6KYyVdlnXK)hQ8S@ARHs?p*T)bS2(K- zM?3a>znkDaeL;m)S?*JSlT$e4g8S5u#XyPJa3(pSy}CP%1%Gf|=7PZ!$mWznYs$^VM{s#RCz4DW!dQ3_Ez}Dda3Q3!yLQaLZ4|%@ohWSiY(mG z@2@N>a>(Eqj54#gwZp@5QZN`V*9kY8HqogdGplJk+pqW)fL=VHPyIA+_`LD9A`q}P zNzOO0GvAUVvg<~Un*bm6vhK&t zOPrD`Jg?NJf62j#yvY6bKl!`wMgk;j0@7+Z3q9fh z|CYUuWOFDf?_sD6PKdS(kIkrRWt@~gPmA(0YK3* zukv46fvFBp)1A-{v^h58sGUCfnU4fcAZkGw&lVm(+%{7Mq5-lNCz3>ccuQslLm$W& z@8q5qK&66++jt!(GgeLrLSNN5s@rNKdQmIW&T4l2X!Z!Q$iy}wMlfd2Qv1Z+SvY&d zQTz>b?}^u2&DY+ebnc|ESqSz2j;G;OD2FuCaxOFo7%B^F3(`M_T)r;^mDuM1FSM`d zeho6_fi4g#TII!|%oVcF%HAXK-G(h8<5vs6B&fiMm90=Thx-+fxA^7H>nAjmbN*Z$ zue6FUYx(sM>mqc4GGB*io**=gQKKe%^;n09%#8-6#C&7o$W1$TcbB2$+BZlS2qu5| z5z+1~p}v)B>m0Anwi!Vgwy<5_*4zor9XhX}tngvV3$0pFua{W67r+?x?quA38E9Dv z|2@{xLR`Hej{neEqEmv=tg^p66M_6FpagL+$ zV?XZ^;v(AILeR~$A!Q*+2%{^}SLWb6_C6fK z1r2QC2e@7zjHtdKx!!g~`%>DK0ayF3MH7+INf-cSla+C5U2$$KzJA>=YGO`%3W}=M zJjPut*}RWh==}C2jy0+}+)f42e=Mf4dpIwUkpU)83%LZXT9`J{UN>_aFsx~R>{s}Z z`-|u#y7o$fP?!`JCbE+3lXLKoRO-oAoEdvz27AsMWtG_XNThH_L>msgYv}9K{y`7i ztP#!UIWz!m4)Al_hWz>&&$NB)V!tj2%d;Okat#)*w$|!L z!7os7Tk+{6v(S~NjX7+GiYV>|i=y-8S<^)uxrImv|H}?M5*S)n!-cxN7vC{i*iY;L zgR;BPLSKG(rwtQ-aYF0tIGePSnG3#iIP2!?;x&Enl%nTi}WvzHNb5d{#L7YzY}k_x*@^0~?$A?_$~pQq(k!aq}RHr?n^22eJJGS|C@(x7N1R zefIy6X(O$)IqL zBI}zLpYol)c0wJDrRd+v!oJz2`{LrbzIS}mXzo7-0~n_7%Eo4B!Xmji8(E6Yc4*Ul z081lUtAGE|2F#TFg{m!JygvYFcqu;diH8lsqwc>RGmwtmql-izlRtVMfhIR#N4Xbj ze_8?cXDoHw8-xocIijR*JC&dF#pZu(^?RFkgtF^4X~ql)4;*%)DDqe%azeuXF`vei z!CJ1J^+K}#Hxo1A;14RDB(9&V?f~`05a^!^SCi!3(J^4a&~ z2XZxUdn_IH>}B58aT{v{+7cOsV(HZM&hX@wfJk_L^#3SxplMsWwxNMh zh1mLuM(H?9vajw;t9L(~v%u@5Bal@>5@kI=wwzI*UvsfiosE~h10|5D03W|`zzl{i zfAd2zD8eaCStv$O=qK1Zra>y%hZ-Hec-oR)K#|V+8Oc!})opjQ2YbOJGw5OD`QW_$ z9a3`0*f2E3YoIxLCl3CilIxrgk!Fe_~m}Y7XsF2MW0^ zt5(qJUXzhP#^*N;4E@PbSK{ZGS)U4nX>(KztATY}Yp}>%9UUT>3ZY@EJ40C^VXFHA z8MgWJ^HP1}A$z-KTBaWLFqPp@U;)cb^B>|LZNQxbY+3_)K9cL-fH!O6l!ubEh}}ThL65%qdS^ zg##gDFWc%mih1VY=8f>+FIP|=8M7sRB(s|Wt|^D?)YN!1s)@7t$u{s9FGghF%eH60 z1mt$Gz~l8V2Q zV>;`OA^IWV&bBOe?;?3p_Uxp0q@6^8!`j~9yNI9)EG(B?$Md7hlK*XHypeJ&hQZ>b zKM>Yu6$12|gZbHpZ($ZS`)q+S!ofW+b|)z~|4~WQ;o$9X8@_gk9@mr>gVPT1&%(~` zv^KM4(TM0*5Q{*whe6ZgR7QtBcskY9{yGD^DD=J-7Pr@H;;**-0)>X*9)_rkf|{ch zLSqbR4X{x;CZ3JNr!omF#tx4rP9?Sw>>S}ztHS%ha7sGV>w?nPo)7a^KwQ+)s4Y^5B`rXY9-1%2M8uFt7~_oV+RGIA~+=`Oocr_1*iN>b?djF#{V;N_)&LPND?R zx<4-d*Kg5s2VQ% zxHoCF@g(3mIa3H6Hy&W}4_aAP)W>ej&7PfQqwgG^KE=coF=|sBG1yJn6W~FSF>E6%MQy#Z6RT~twAljSII$Gz-{&B|{$SUV z)g!W!8V{4>8&>2eS^3XehOnk4X1+Que}@Yl(%?DB_Z+>=NT~$G8ZEln5ZbM&m^{%% zRV9!`u-B$g5z8hu@bVX^R(UBNwr$4FMl<3ZlZw#tnz3iwB9(wA z{P4@Ylw5l)F*$N5_udg;c!WYE^@*A#J`I87`oR3mcSVBjL;g1GEH6L)$6BQ@vtuuN z3j-NAKivrHZlryIg^kPfzJxs)t!DbPJMiaw#&ggny}5I3A-N?3FyIi`?`4RY^f5o_ zymP*yPrW-~PIOWjPM|~5by@ZJ4m$~K^$m_$6nyaW5KwL(-wTlST6}2-f&?K4vXr%K zT021t0H*WL8tpZCrso3unt{&R<26fGh@P?HM>Cj#%)jLQcxtWF=c9{$6Bo){IbVIh zsj+V4ORK5^hf)Dr#c?GlP^m04*sWqZy^~e$=`m`wvo5=p9CSN>T$MeQi&z=9R)EW>~6F*6R%n=<7PSVAh5B>WSkR9 z3)>r>FTU|*f|{efN5xwEw|276mQ>r7JHMBj(1c13_rChXVhm6(j2e_3x}Erg9w4t& zI_gl7Wj!LnNfEE6?Y9Srbs%MW^jd!MOz{b*NoH?2wu;toLTxZu>c7dtWBhlwz6e^j z+>yAGc2MfH%ro>vM%TL25Ty4=Bsy6(eCTpfO&DIf=M`-*EBLKRR~d&dB~DlYti2`F zHkaI>@}O3brj#*LpbUe{(pLTQ3fRVIqC>N=b!Fr906DnzH>#MY&k4e_APX`egH;^~ zbI`9zi|LV>^%rb)% zMIW(##t%E2%tk{m+)fxrCxKO&=779!5HFhC$(3CXl&R=PIWWCvKvvg0bMKnc#n_wY ztFa|W3VP%ab+EA2k}o4p4BL!tB$N796xR^`3iE#d-Q4!F=Pd&e%69#TzY4gmy*?*n z=I>eH7$WM6>Pg=P;UFz$x0XA~jjJatuueH&TW0{1l4SDTyau797}d32VYa3v$n@AW zC`iH7X%8rKe!nDLq(kcc9_EN-aVnx|iWpNKtn!hsOkyMcJL3Q%9Q^|8eg-$QJGNaK zD1%gbap*Y+&07%G`RaEE&pzT+o~f3Vjk85n?5Ju65Z%0qnYfelF%OfUq}p(DvqgEs z!!Nw?1nYW^rb({7vH}>Qje~j0IQrQY_Mv6z*0Ojiz&goBm$i>AJbIrHto0`z>A}Wf z5udU|^q!TLgN;R)Wd<_(2ZliZt$bZ|Pxn^($>8d&0nuB_0Egh63vxPWNq(+uZ@8p4 z9>^ck56L>+Ul>Gf^V31Oug;SuGBk-u^s)8el|Z})7<#5H`Y~#jqY`O1KyNAH@JbuT zg~)5E&2;{>Rh{50;Tl%+M5imsOyq_Jle^6Ep_`pdn)-ny%`fx~aObr&{^D&wV+c10 zz0O)^n`DQJS3t>T7af%$uw=KkL%iQU!YsAmBD-6@u}G5DD&xlL{C>AEO5J`KbhHzlgC zU0(n;Or?@`Eso6#^rs5zxLR}HKK7R$bz9e7&vp~NTb7ErS>uAtf^t;rZ2mfiRDi!= z@^F>JUVdc04rVC#X~t4BIFb11I3=>xqwif(uDuvYJiB|cEcpE!p*?;objhItM2D*4MtaxCaT?;%IHFw&pP!|~ZN$9Vd@t~{yIXjY5}pAh@o!R7BP8CnR84n27OM{g1u<~oh@`D`@Um5!UBo5b$U|O>&*{* zmB1I&&SadpV_SFx6z$n~%*&lyN$1=Lynt4BPm4c5;*x)2X_45aU87+>8&feliK2N$ zCLI8G-K|TFksIZ+7XO?MJ3pT2@rjr8U%%=W{@Q`-y5To)knh&pyPVm!d9ijf`XVcAM1 zI8E=3{S1rann!>eQSnE0seSM>tAESW7@YN;_WGI^bZ>1g)sV(O zSdJvm30VE&X=lj;3LrI}hF8fwJHJebcc-t@-sXnJvOY`xoF%YinfO_$nir5lc$_=P zk}weKEa{b*%V>f3T|+_A@!S$AI}N6@Vyy1qCzf=bb=HWCV~TI?D;n>r4Dyc`eX1A& zL{6Zwz_*F4MxZwNQpz($fLQ#I%vezL!1E_&;@{MZ|L}PX>9eI5gMN9BLZA=UpC)4> zIyT4INrz0Pbax86*xwxb4{|PKTGv+eIOlw5fpuBgDXDD`%s+|Vg$sy!niZT~c#Zks* zp?`#>!YW7j`|!ktaiLy^*{X{|1@9N${`CY1H>RlMufi_AzSS6MF}`m<#a~Y&lz+oE zaFKqXpU^y~ zLbvpfUJsbg2L|xXx^UA~f?9_2%HMy1uML=G|^|B zek}Z07u9VO7kxh&5a2+LAf7`3G~7Z^$;%8EvoB|6zNya&vc3d|yN}D;b&9v2CFj)$ z|5{>Kz+%p_8zv)@wJ`3jo^v7|NfMG9Nf0#ICA|o}y3x}yTqFpM4R(^!?qt_tMjlWc z{lVm^p<^B~XYo|70Wz}Mu)O{wR;o3OYtH)z73=q93Vw`Rf~k%^J>?M*YcAsT|1u1| z^e@haVx1YM$1uPZ^tbf`7CSm#Mx1`oZ~{r`K#tap-<2L{_XV{4&B_Xd49~jA zXpYGs64ZqHVyACQ2wBb=9s8h zxq(QJHHZ#aO*fvjD={^Tf+fc@iedvbv0yS9I@7zXDi}rLq*#8aZS( z*KO=Dth!gyCY1y=+XbBP5KXnO=DrR(2jbE6KDMLP>0lXHv+Pr^xXlQdzxCp? z)BX}#vm$*IlRH=Gaww8pX2zldOWhv6h!9o>rT`GT_pN4)_fftx7|>=Ol{yVppI1|l zDpY^8W=k1(7S34-T!s%RgnN7G5eemPNuOluNW=0K??tAah-1Ey2XbbwD@!g6)kcHx zj}mBs%V>M#lHpsaH>fJHswm`Qe)jnOr2`Y+w9aKM?lk*~Xty&5>;<{w7D1Ci3 zl9n@)*Lna5IY>iE;-d$eNV&hrfKI|!KX3Y*zj|S`9?qqPr5dL62$`now1>^(4gzw4XQ$+VgaWa15$12pt zbdTDECwPy5xC7Oz%KR4;2rD6ut#{_kb)fBixF6s^JQ5Ee@|8)2VIAAUOVP1ZF-@gda39GwKNZ36g#~o|4FIP{3FB&Ryq2 z=rz-&n~f-U?E>o`qaNTu4&FjI+nq0Pe#e;E(d7vj;*rBDg@9VkaqVrU(MBNU?ZSfz zin_{&nq2ckHV-#{A(wN_Fl6!{*t&{wAJxNGOHGh=k`n&A?yPjGyMvby%%6`vh3vxyQ`;TyBQM|4aJ=b<8Q6z_WNCcb z4XXy2(TM$XYsWH|bj5(|@jj&!6mr%+fhXnNl%$5-eTmVNamb)PZWHV)ZDEUTv@5Jb z4=a`O3Exlkyy2%>#>!Exwat{3H;s#9M)p|KOAj5tO(tnBn|@%VG@@P;qKkhNLZeMm z$A!sj6!&oIjHsAuqQeHCg}^2>fDi6Gvw{mmCQJsxPIh!RBUx*oiE;~{zP&0N+5aMS zmpr=6_LSP^I>X88VuBCjB+Ss0ll3|Ey4&hc_^IoI0wR9Hke_jIrE1Z9t7Z)>mC=L^ z(bP5t*Vj728*s59%Ny5|Ms=VFNXHeJFmptWYz$hiBtCQ61z7D5h;He=f4`z8ronR( ziTx7UFR=3FPh$pYmo2YG?yS0O)I1d!eEC7#$llT-$`9n5N+8eL9Ke_mJDM!V%~V9| z0dh!cVpWyEB;NWJlc8fGkoN58dQ5vZ+qK`Eu4JgVwk#cvJ-^||SmA+P9v{<0?}GSn zEHSfIHk=s_I0Cl#j*T|__0zQWA(uroA*R~aXyV}=6w~1!@e3@4l`SEX&4L>5SFnO_ zf=hO%Sq17$4^(Wg^tkE68CGD9HEVKJxTe6#$yRYDsB-H@*-0RG$(l!TpL4NItwN7> z-M<|;%W3pbI4cj)dCVlRPr0x8CfE=!dG%e{#EuA_Y@9aI1UiMNC3JoS<2UXcf*|@N z^E~aVc+kf!wJ^x}{u&(`iN%A4GS5nROdPuxNCRMBw|ZGroU09ZnKk2+|22JoM`Mg> z#dfPKz0}ow2S>D0ecM{INs_*&*F=;@^zo)2MfRxA{XD)CTEs@UP6)mH)aM+h z-t5g4b#!iB82KH{nUGW$J%k1=x(8FPk_&aU~uvK3oT26$$x|e^u;tDKg4!6r){zh(l-V$b~ z<<7YGgz56Pe>vXO^KOyEx7jh{9?YAad5O_bO0$|p%KLzFPSSkVp6G;NNv|H76bSDA zb}KCwtEujsRwi|snuqq?yxj(+NK9l{rZx-BF6RvE^ToucF@{`w&M1!$$vwK@XUQBq zU6@Q9u%SWnTK1Z5qi#sO-7#9~QFzf}z7R3Y(n;h&A>ozpuMo_C8TIljQTc6qH7M2- zoptT>e%;7mGJZ3SBwN)NPP;2`Nnm=Dlp6g0PEn}gY*vH>S2l^p%fI58qMw;nPZ9A&ynUI|3-vBzdrY}#gXq&FkO3TJ1=Rg|d?F>~Kf z!NfcaXP~Hq{p;@a=o^>$9hE^79~imeu+44v){S4FAO%aTeYBy%zbEHYbxX3!pl~A) z;yqNFX$1esOMA=WyaZ)#w)4f5S_!qLwDd|CWekhu5_fBn&<#QWgbIm{w-xnR{>j2j zuG%yU(TdBJI-YpxnDd(AqgiFM?I}yY`|I+CiHT^Ay=;>9kB@qBj&Ppyi`~ul{Vk$oleyTN&rXj#5nNJz zm8&|o35zq)T4v?$rmg_XE6L^<4mzKD$S#nO7tvD$l$P9m9B0>})1d`uSeuzr%JIX4 zQWC{We(jpuns&v^zbM)WsFHt40PVS&hMu1qLv?8(L-ZG7yE&KYW*%<2Ja1qUq(bPv# zRYpe+lmVz|Y@Pd>USY{fp|&fgJXk#S$Lf|>um-~v_T=W=8N3Y7kAn%W*3*TU{ln1X zcYj<5yn!u1Vfs_xT8Y_L!WoQLd&|XkCXbT$v11;TL9L1R23KJ zFf`w`i3h!JXH+%OVWqX28 z8h8Cn>{fjfY>F+oc;c8@cV1c*HJw7C;nz$&3>tgEao5@4)TJrpej8DU3S&2lns6=I zjW`lyeBwhbMKsU`Me``qrU&W%BN0xF zL84_mGH4&<?xt1$$=U#D|~nQ|4nv*fqAoy=WC`3_@x4EH8?qi+`{nF~26XKp_k8 zIX6`Uo(AkkeCo#jjI30XDQtbIWzhQB4a0~WJC^pXjvcA<=4OCYM?6V0hHaSo6F;zB zyV3&#tM;t+E?yF|G$0`iKXfSNj&{0PY)mdiRRV73_7Fn1Rle*G=-?y!t6#0JANyhS zg-A zXc|3~ZVl+5inW$Zstuy3qjRIUCIjL!&V{XfDUAOG?abm?&K*=qA|N??W6X$Q*YNsw z@yUOANCKhSkUbeAyp)i`Fm3ScfSRfEGIpxiH-z%XpdyavD)7531 zi${6ft$6}97R;D-`VN5@iqC-vJZ!x@8p#=zzvn?%lmco~mRegpg@u+n(5j{XAOryq zo=JMP4NDD-XBGFsb!1oiRZp@H)-di%y8Gh1brjn|`QX9VL^Yf8m3*Sureo>E1ZGTT zA!A|Q@n1OC2twnRZCwUFR*Wyz(5|eG@qx*Sl<;F!7ZN3~W+tP#;4T zMQZ_*zbk42qfLjXd|McpSGMFAhURkiPU}8K1jbZHf?AQvzpS^oVB)rEDg)UvFwvLF zwQ+n1=0+ZyE&2%w64W!oV4_bhxE^`1o>+SUc938#OL`g^fLpGNL3Ca3MvkKpT3?mG z8PP<|3@0mZ`W1uQ9aToP#*=ls+bA%2ExuV;%k?Qwh!x5)m%7mAI7nPL`O!em1*1FV zOf++UT@KVYOly{->WdjJf#I&J6^%gv^#{?Lf-(900R4b`tHGY)XU)9zpVoTdywUqw z`j4Av@_sxkl+a^pUI!r~$4*j9XzZ+DfSJ#jKij+5V8(}NW~oqTAEP*GeF;1;9mG(? z{-W^FEDZwI5fSj-W~5;{-cvFUlr=3RZ+iAAtL9>qVY3`>nTDapUbSC^dOeUf2x@YX+=nrp>;hAs>1S(sNF zld6QWzYRx$n^fi{Z~feRx526d&v3+eWTn&;&u@CDp42Gr^SQRSs#OU(Pf5)|$Tphp zck#i@LiA|`n8VO8Z*?wGb@6v^#@jKBE00`PW#a5t{)=AvzU#Dwtn7Yl$0K>DD2m}; zoZZP19ottOqe>H5dbsbdP#MGzNHU#cJcHh%L1YM!R5Ja8dUPrFZ&mK{qXNa|f=Apn z=s_!C*mDL*GyAMd)2`{|ZwLr{CUqNOauU7K{(RF}Ye00}+w>^t_6HFF2g!LVEd|;X z-8Nda0;O{x9f$l;WBn!=C%2COu}i^X-EPIZN_l<+GMIspJ&SU{&7+^n9ljK6(n!8H z7oHHu3^i*&90B4EKa$Te(&y{$v`I_WvM&1tRX{~G^y5*)p*wqcv^q^X`Gq@BgyGqY z>{4`hpHkc-U*}p{o|SFSnxnZsL(osVyTZpCoJh7m!s|c@Nsi{?}*smLOa43`Fm0v9vN8UFS(P@ z0;-vyKsgg$VMSlFxq}BR=~P?nVQmhVT4*Eu!iq^&axRN#C7v3?;dR9spi7{1u^%_q%}Y3kL+*jbT%GGeCgG}7#_DRdcSoxcn^XQ zq4!>|SqQsfhI&L0x`X71BNn`}N3z-({|EvC2hi<`_dcq#pOeDDJphR?e`ew#0H899 zJ>G;cU1A$0D}VaOgTKK;>d9hHiBv0A0dye#ab-=2_JeL%UR$b>xByr&Lo8VG-gynY zDrN_-p%W$Ut~wZWa^5&Q0I~X=P~Za*uOdP8Qo&8BVJs-$UOwQi#!n@FydDfx66oit zpHfyj6xC)_P$64_N`p=YC9mTTk{Q5TwusBCY2K=EdIh|kvtys~@M&d_(5xK}ZLM36 zm0P7l9cJU<;ip}ej8&jti6co*|l$Uzr)aggiS3Zt2dy3L((c)A-=?}RC>_B*Bo+-q< zqKW`dEnJqq#{l)FE-X#F!(|#w1R!R{_ZAd_^L4?E?tho^L?4UQRY{ct@y6O4$>^xc zS+I{99g>p3g{tOh`;Y$Y#mQHal_|0z0OTCW$Kwh{9k?#_-`XWLY+n^+jLsd8pMXxx zk!Cyd-SXL8t4VM`u)iiMzSr&x1LUa@laP#Jlm*2dj~_RF?ZNbLqFq?INhM>$(b2U9 zKsPNFGS(Z{T!MX+^y`}+Zhui1&SN(mbYdsntD>v1tqqSHZ=&;dz5w=|Msv}0T0+il zK;Eg?GYxCUJx3TJ_h@88E?Ce)IP?@PthiXuPJRvpNXFp{o@cy@UOTSM5{rx3`K9;Y z;CwJNI9(O(Kq8*KuAJHV3c9y_r^7v8|`eA|>^r@YeG#w_K? zXj2{-oOoCv@ijPR$6IQ1FTs1`H4yPEGQWclR6c*F^CB$}rk3T+>z$3Hx_vA6XXDw( zAt(74b{yt|W{xc;gQ>KIz(gtdgk<`8JlX0{C9noHRu&FpBWgD6`GhyPyAtC1)NtJG~U;VdEDr0YRI@Ltd2cdK*M$40wjyTGcBBtxZe#D753If z_=^W!Xc;xlH50@11ckLDlu(|eGL%~#4Kb;x%M$l(xfPmXX7DM8ZHCDth_brgkizLU z*zvga`=eSIkfMh+jl~2g{Mk)pedgEiy~8j!_-2>kv%R>PVgAL34spWXcmwW`9A1@~ zM-#g@ang{!;v>{x5$5b|O?)$S*$mhB4;a;mw)>QyaFmD@!-07G1@I0i$`QePk?%eQ zB}!T45v4(+jy_S7Ed)>Ax{;R>;Q5Z4$Th;xlA2dBa2!hp9A;_-L7cIrOdgJj&@PFU z*h?|S^rKj2!ed0Uvee|MZK!ms%0~DG*Gkh;H5B}dG^{A%ulMG2<=;zw-Qi^^ZYUIb z!4a%HAmmY_#8vZ?U@U^3-+27EfM!PIrKh8v^_*f+e-FtR9kK>`vcb{m5boXNNXxqM zBqYm?M)qTI8PNDTOL~6OYVG}$5P!e5%GCxYyp>AD5&wc^nkHG8Ym@*_#iFz{KEd)Z zyjdURB>Fdo?OiGv+s&V8;EK@iIcS1QLZUAOU=n49nBGFja)su}p?acgTkFO0a8rD$ z!!*aSabvkL1n3>shN!6dnFX(U>pvs^3Q>95K$Cn`cJ*@89#S~75i>j9^tyjW#tJDq zT=uXB9vVDIa4IEresf?yOLd1FBCd`+%ERh+f$Lyn;{0++)qJ(H?I{7@F0z4}(@6=n z1hc{68RUbu!DGzhO)66g+DwQbZ3cZ>8VRU)|2V>sb8#sBh7dIRP|UFZ*!N5@4SDZv zO4=!r2`qbbq{Jsb!YKhu|0$Q~nU7tYWWC;ZvW#)2t;l&pR2uY&r7}x(bMJVb3zn$5DM7ak)bu8wm*X;{XeA}V5iE_35|#Zn zafFswdiX5qb?gMPE&IXb&Bv@~mvTb8lJm_~k?;F9rk&dyV0t7hd2QAbfs85lnezc^ zrakKmBzQrlyY1*V-;&?0A#zRs=>rbc&SBQ|_PqyFYpSNy4rK&i(f|zNf#Pp#cK6*c z-XO5A-@jY-8_M#;BA5jB`=M#Lj6&C8nET@(%>oODvNfiv*!gFXQyUJp7?a@(KBZ%eQwKTA=Ze?nRuifD6kHP#CDD zvvD?cw~LZZlSe;sY;<^*+)=|yJocbo#&YJGxgMGr+Rjn-5A$XT+;xoZ)I?C?7?oI0 zOYc8;+pi(~A<5!p23iP;1=)7hcGSTSx$nsZRDUF)ni}0g_J>1{O>(fL`WBVPqa8-WI{_=5O0)F`zV~B>{Ti(b~1JdkP0R4+{ zuc-Uk^mP*``yQIg61BS6u|l(j!o!E1?2v{R&fxB{tkllC;kL5UnLD`?`iZ#lmS!TU zy|{86T)@0z%MnMyzh?lcVDQyF98v~^1CdR-n$NgB2uFds2f&$VzvkumZ(zy657&@U z-@?5ur6(DRr*^?taSy^kC#%vnPhZ}?1PM;{ryH~>jM7=wO1C|Kvhf5j^{2;K}>FX+FN`cj3IIxkdzoGMlfF4x z34US4gru&gHh^zDQW{>vlYE08aB&Cn)e$@cd5gd#l-tY%4Z2-&JhFaR0nziO(qCg! zuOI=u>94|nnvIF=h*8r)|F$%aGZbB_Tr&d&9A4e?`L~GiID@(B)+|%eCmLEPbj(6t zxX1=mDA_cUJ5VQY1cIkqRkqZYu+rQEtnKj4Jp`X!;D?h92%clIQ|660>ge>nI=H$n znPoSaSzSvhxxlF=hCuRC7c>?njy;i)$j@46cEk^0EV4+PLY6B1^23^=_)u4Ld1kzU z`3y&yJ>OwJ$E-tR8R{+s3tD*97Cf30oSqZ2Bo$tA*Od*hc~R&NyLfmwzY-{LJbEym zuw1-ZhaBtIel}9>dDk&CupKVP#rdXnIeDaD{knTu)KPzT)Fp6ZSQ(ZW%dN+(h}>hC z2e-REWQC0>&Y|{3RF(v`rlI%+TW1-iryZ!MGWdM8*JG7Gn-ogfp0{HaMgsY6?OE^$ z`qj_5QYeTvS4^RLl~B@qg0^-@%(Ah))tcdrwd9obH*4puWsCuK+2IzWR=_5U@ z%A3_Wrz1W9$;-Xr|0%>Js4CRU=+;Y^xs7;>R=(Dtk3M??isB*7r;Ky=wHDs@5$YBm zCVoTHKl#EGn^6L6GYy1b#6D<4IJ9kcl zL_adr=J=RkC8hsAG|k_i|4YriMAAs6V~L06{89vF>EJdw@{QD67kU6%9?wGK5x2v3 zlO}PYf5-ka2S-bGbHu}O>G-hi8&bZpX<)@d$eznM->UErmq`OAO@=pDfIcBE*8$YWdj2#SaR;y!vqB#7P6&x zGHmpkea)iqri%rP4@B;t9neuh*=Xrig!SKa?=p%vJM0}jLJNrIq{)eZLH|%jtctq=}3+a_>OKH@5)lVxHZb+rq{`fzdL$V4Aq>ofm_8x*V3YuGd!r2u;SkY!sw zfoLO3HK90r^(PYw)!o5%^{~K9LwAP((iw!@c_lmFVJT|*^Xd3Ag=z-o$F#P@)!%)y zTJKPbxSTtnbdsHUD0O|!D|}a>q(y&^(@(Rz@7o}I>NrvainG|}Y|{P;lo5h^2#z)! zso&ndwRE_phRGw=xi$ z*uR9cM#xtr|3k$YmZ`lZm1VtyO1#U|kXYe7ysFoq$f%B0fMZyU|7;P-S?O(GZi zgBm|K4I0j2&&OY>^XCE#-eeYCdjr&o_EMmM&M8>w1g*$(moL+}c)NuZuejqA=4r9& zri~0bfWC;hXyDp=u&Sf>4qlv-Dm5btWiwk5y_zfPO0-QaYp=O`3_c5EhsPX(I!3f1 z7WM%Obs^Fn^22{3XGZ0)NMJp0*kr^A5n}x*%m6xa@IpjwdeUj_Hb)E>ifTO4f6ZHB zTyR%~Tyjn?traSd9IRrg&nKDMZKx1&aO%^g= z%W-uTu?6?ZotV|B0mv>fjwWB3#Ps1N5_vpg_Hw=B)zUKW@ghH>winDAj?w>UCq95K z!4Eh1<5oCoMqMwl2HIBADFI(_#Fwqns0ZK{dAOPLy5m|$Nwjf2-3udTO{<#-ECC;`RZZO7+u7Z1&%a8Bh#Dm$gW6g`Se=~}9 zI6uJtnOdWewSuv;fl2wtk6p~Yc)@@;J3Eon-DZGvnR@CkFN>yH+psk`enok)lyQd~C2eD4L40r>>+sz%oTSgN?Sk9mLK^x3rndaOIdp*0hzfm|ZP4v%#2+&Sd zCeL2?K0Ba@KzBNFv43}sP(#2EI)pc`nM0vks?B$0jZ%Lc0J@WN{a(QQqYa_3!}pD8 zCsj{C7;US(tQ^?}2ArK4@`ybp_GT22Qq&=RhyQ%0?SntyLb2%>wPjz0B~{+OiteiI zmvs5Q>o)arH04cbj#f$``kqHj&{%Ir@#h~B;DuFHE9!akP(R%jhRw2nEQ)n~xdO7p zPfKOH)t~h(ot_LY#X6MsTH0$pohzQ`0y}HzW&F2YNC9o&RdHwC4(=8&D5I=96-HZ? zfPFCJGO_n|;(;yraf@(+V-}8r&CB{PJ>Ubl=l_Sp4&Ck-C`bFfnQ~)q<$9VI?zWQ1 z&BvAFA7T|^7K+8lt#$bxmIaCb=@edPX+9(?Ji&fV7R>OhuXL2bHl3o>cDMh*O^}`U&74)$oWKeUC2@nQb3mkav@O zDl^4LA;M5Y1R2vE*4SrmR}ydRi^7aOD!FKIR0-k#Z{Y5Dv+a1}u`SUlM+MD&`kh0x#GUM0bokQe ztS;bI!52>5-z}M3r7Y z+C%Z5$e5!$$`RbVf$>4RXYS`1uCE?3{M-_5Phv3@gXu*5znH#!(hU}=(R+HbE6)v4 zsV4v5imLYC9i%M7#FD3pTyk1#1yvTvxlD;@*n@EdT{Q*sk8k#XFvMoh@HCk4$|mTz ztM-^CIIkv!@lxbnL+LjN-r9G~P69-Ay>{4&EQqFc8AR_-yGvFV?jl>-JJ*Ya2N}2< z4@UaWMBjmc2Yfo* zzc~UTMA&g$U9*Fov1&)GQSM;Xk!wq9-A);Qaoa~D&$lKCPG6`#M%OGK_xhBy0WFVN zFAFQeL|fYSK8hbRsZ@q&eAJjrRny%5$BqSYnOuB;uHM-zQ@0tIMPoH1l z59*>$&hpoYd3v{a#sJl>ALg^Kwt!?pqwG}}y;zs;^90rnCOkz>+LQBiaC#wMrExp| zgWI)Z-cK8U`GYz389KmqlT=?p6dZTLH7Y}T8a z9N1XVi4_jq*OI*^(G`ZNy70wC(-Q(sk#5^eugBEcQSJ9YJ<^~$EFoJ@JxUC=Oy3ha zHQzG)^d;h#uf9|6Z;V4jSj7c=HTCmS!!|6O)SnfzV9$wTdw~ZkZ_;+q+i?b?$>8TMi{bq~?5j6c|=->C5U79~Xz=Etr zk66?RnkYr&6Cxevt$|erf-)&GZ5KYJhR!N~RUDZ`t%l^#FLl*&#k^SROOEp&O$O7H zAF_41&gNl~Owofx5(AkEA0qLhxe9UvtaozS{V&3nzEDOl{MC&GBJ_YV9n(YtDsN-3 z;&i1=a$45Y%lPF41`d1>Qs_Z?yTy!y$Re^}*`+*O{X%-Ap6^0=)czBw1>67ZqQR3#QdoB}UGfokkQ?BB}fE1xem zL{;rfxVpv--bQTq6k4m%@f(uQ!S-LWahYPJ^*ehz1TVY^F$vsI47nYRGA6=8H;w4VrB=zdWFnoUm|rqxz=TyQ(-}4st{;snr?TB-+?Syqe+ni~PAOPX zZ*pj-NOq&WTZWA%aT;Y>YwNs%qwI5M6vxpfEIBf-CwGAcTcx^4!9h6fnhv;BB15ye zS0XbPT~}RUVKXbfIdXSw< z4Ml$XDz7gF>*euREC~7cO&pl0Th@*`l6*y+V|IBLV~5`GRKG3}r(&!wJaiz&431y8 zwRP^htqw^HFFxG2tf(a}sF?ci!oiby^hUP5*0o%0@g6#5Zuf5jRE~b!_YEdF8TdDV-g=G$BJ*qzW9T0!-H zv2RrZoJZ8}9ShB!(dGa_r5uUzz}k@P8n&1yz2G1k%!T`n3UdN4n`WY8Z~;a?^)B9YB3kd z^x&3tUG?&59uCF`j{uB3*tbt1Gr^L+f8vqO?gRK*3lk}-qw9ybF!V1)k_JumQOK(@ z#8?*~1c4WvtvTj^YD{C>Z$q~r_PeP~qeFfZ9@j8lr07bK zQtz8hK+>IleJ@v*Wg_Qwrg3&t>p_DQm?|zlFh1dg=~~&MHf9PFTKOH{fkZz%&m1Z+ zL|lc@Yull~HF4uV2B2&|#sFv-Eg0by$<_+x{Wq0AZjs3={$B zl-MYx1*A(_LApkV(gI3%=;%%b>F$&+X-0>DAdSFx@BRMXalrOGcU;$bolzNYwdXS( zWD}*14P`=0HU*XvTsyikEW*zYkrOWQjwItlNmz3C8JTog9;DMllnJW(>E_(PnB_G; z9cMPocFqYK8qXEeZiWylI1m~DTNmwk#p`tOAt@VBI=k-%L7y_q?5x{>x-v3@H73<_ z5ei>MtCQ&Qquk&Yq3fWw_1EUuF_0~h_&N&>@w&gMaR{5ns`4V(IwQK~MMNED^oYnl zMQ%OMZEK@OJ50!y+~aXT0E#f(aQ2Qnf5`#(AXBxzC+Ny=TtHvr>s{VQ;O<6n&u%-2 z=nm6+FRKO=6!eqkrw7T+p}34UE-AtCy<~Mf-&?7ET@8kLrgnFCWFl$Tkm=N7Vuj!b zNbI5Dg>Vcd>{meOg!b54jBt(U>zNR55RlQG~Q_0 zwL9q<#|p`>N>>dUZ+J-b+B$*9;UlKlm;6}J+#@A`5QdG+Hy=JC$@lHx{_ht|%q#E) zs9}6#Q@I&GEmtDqj=Wdl>C25f^IsAHPcQZRm`L@5-)bHY)X^7aq zKM}~TEBrvZ<(1f@I<8r{^vC}104mMa;2=i0wHsX<$w{IIb=h*@u2r=*Q> z0f+vIOL*UO#4j5sOH=mQ$MODtHCFhUOV)!cIV0=MzVQ5C@GHAa2Q~5f#fDRdxIb%sKlA)l2-|sY6r^TJZ@|h>&OJY zh~40YMcstE4D`I@gM1m{Z}C-2U3V{wPyIB^W_PR~ z`fIgDkKreLT3t>D;1PN5dl{O4z6@h%O>2!J8cym+6Csw5F*YC;h%4l;@-yMlty2$S z;J5DBaCMsUSMNL#sEM3ZdwEvX=1x`k;pguhyzveYDp1VKv8PeB>!GaLrMBVQR+N}QMQHnAMj*&)UvvIKY3Y7&7zUH z2Cig??;GnWp;Tngz#e^^y>rFdTa?!a1bgHA?SFS~xc|dNCtNj)_neJpu|Vr0Sx&cL zHaJ>v;0k>55Sp!hm*N*+arl-CX1FWkO2cl^`0qe~oWuj}@MB9%X>D{a5O;@}a07^r zKwl!+G|+MF9kc^BgaL)UxW#>DgUkO)6)8k9PWHbfTfke0Hu>C#=)jYeun1at@%uZ- zzo3V3wM`3Oi`0KB9f!*G(08-1dUkzw>(ruhL8;VYx~Dsu$%BmKC=Oy#dyS2Wt>^lG zZNbaZJecJR2-J^9`$?5n6?{y?m4Y%AX0k0Gq}eFeQ+yzE}$Pt>m+0o8Ifx@s?MZ!jD zDM5-VE<=N1g+LAip_U6B?=RvW2O&X(WR^}T78K2Elt4r)$}Jtf7SP;D4XYf~nq_|) z{Fqedv8|?!HxOk(w}Y(WC-#>j$#x~j z5NNmY1j`G@Cni1v7=->V-J4LguJ28xPt zLE^d!iIW!6qB=D;MgX7)p@`q_{jNOs5V#@<=87<7BV^*UofNjoM8x4W#BNccX&Udd zWmt&d@p>aeOPs0?S{iU~DOmFl)1F(`KoRexZrTpc#zv>RpxH1Oru^Vt$Db zMmrBf%ZTM=&J^o0%gB2oIhQF$Zeg4sV?V35Bz#+{a6K$JE*7ohF{RfnHbURoUEBR+ zS%RbT9b=2AJDo1r+3vP@N&@&1HFg7GVWofH(W>iSNSR5`;LC#<85D zN4|wl(Nj|-n3JkbC`Cf^9}EABjYqYcep>}5qE5?dC6r2{T65L3P!Cn@bf>o`-iW|1 z3h=+SnDqGax+)*+A&IB=>QUmYw ztdn5O+oWKl)O{)7S6+`Wtg_p)5ASxhg`oHG0&_6e6(V;F6G^7HIKxt@h#-4El9pdm z;Am0*au`cZ+mXw^+fNjk@$r8yh4E|Bqv&d~%mj|=D;;Ht5#hsdo`Et#5g1Fq9Bw-8 zX5ycp-(I7x6uKC~HSkaSKBXZ=k%c47I|@^G9?&npwE!N_W2U0~hVi^!?~ethmY3Jf z_`RG_dfrE@jO+3Gpv0FVu1DXL#pavozXOU{^Yj3PSS@cuxd)vU$`H^{_fxG?rj^>r z8isUu4}2}Em`5qw$Ps;(sf)UIf=3W8zT(X<3{xoDdQR4Z*!KB6%IeO`SpWK{VXf|f z*)Sw9t9dvNKhp60XceT5v$l(|Z(QwHbAtI}>d4t+(->WPhbUHqoE{I=Btlu7DW7FG zc(1ia#Hdr5alvwmgUaRG+g|#RR;E=d-k@0!U;4uP;XdmAuH7Fp(UzBIpViVN0*2Rph&9}9MWzIVvCXYs&V;jlCRUUelYv4SdL}K*g_kbS z-?!6pU|w(d6 zLx5EU7}TaTZvHJCy6Ya%q{9bx}6JF~@s{IZMnPNYO#L@@J@ zltYEtCq~RLl;XOR%g$?{6ml=A3n5}-cQcW_b?D(+~^o1?DzkLpJ4 zZP?u;_lyGqGjY8m@O~{vG6siojbz;NG|Kj>OFz5hopj5`8%1iEDvs)&7QYWd!O)st zwTl{f5PW`HFf!?0kZe`MjSamy?fU$|QL=K85TATooHN)&W8y4xX>t7?OtPTnNWm$z zE#q;_{@3gIy1-*%=`4D>mL-u_nC>zZA}wEzj8!zI&7#=kf)vi{$Yr#YMgguQ#BRc_ zs+oWD^z>Dq9@tFr?SE;D_S1h|3#q#jG}OP#{SaG=eIt&BZoV)5?e@PsOCRd0d< zP=Y?kWHMb&h;mqf3Se>08jlMux{9HDOPe>Qpn-S&5JTZLfPyj$s#{4u8w8Q$gdtM* z$pyrIB(HxAZ1aAf-80N~d)cg$4iLU}kq+VCB|_X5znYlr=Fd+4IvmEafMMIg`*poGD@CirIW@Jz;*1&iz?`L# zK#(uIqWb4On7!FR>XwBgmkG-^=fyuN{e}c*ACG;7mh8UTxB9!i;&+c}%-;Wyj{*m1 zv~K%%3C&whLa0m@gIRbIDyi-V@!pC7TPLEpPx|uIVU9u=7V0Xn_!LK3MG~Jj&gu9e z2#2Ax^awlP%g*Hf4h`W@&^oO~*--L_vpVn&t@FZ#ct@b0{MBe{55V%B+kV2~^$(SC z@oC6_)Ny~d4bhe1Lw;W6@Sa0-Tp0ag(3ds+%j8U|(Vy$z$xZMxfzY^(^_ruts7vg~ zo3OwA%e+11ajdrrUwFW@X5R^y?RzJS?nD{{0^_2;YbB_>wu@=Yqp|a+Rb9TH7>@@8 zUi=uzu<6PcF@#NKrgxH$8W{<8oAUg*4L@(Da`xr{MY(KL>=)^ZfH6RS8R^#0Lxp6i`Ic*-?Nrts4~_pHg8vr=O?3I%yG2wADrHrOu`5jvEAOQnFkhgD zoOB#6F&i|*1C~p8o<)T^A~zP??%*6N5G*@~D!2_=Q6hfc{xEh$Jt0ns>hRt7@jDZrzUQqU9EB9R%Wd+($Erv1a^KhKG zIW^zAd(vNX56}4pE_B~%%M7G=CH)UXDR62kxvo=Eyt^*hMgGYtl?tWUe7Z3WMzr27 zxQecUEz@$wJA}|JqbrkuO_$Mg8#whgS4f2mfn!K^M`r(=UK_i7pp$BC;G-%KI4aIb z9YueYnm*YBl3AD7oE4K+TF#0=Y5-pXsYbs?hRra@WoN^W%HCsR-qm3X>_H`a*<#k` z5m)oUbgIo<-of!Bx_`>Txy;Ni_Gpoz-Ip@=5AywaPiO4&p5lx?gvp>r5Uon)f~hjghh zjdCY~&r7zmhYg1O#HA6uu@1*+W}%b~RV()dC9w1(ep68l5;z(&wiCO((V3A^dQ+*E z3Q|*R*57`_oBgo)P&A+L>ic5JnS6R-wS({P$`tUqX4 zC;)J8Cc&PWY^4XyC=}uk(W%mU84Np+I{_ci7cwom6Wgi?0D#MsMx}^@kC_`qJ!d2G zXcB`0?95HmpPgOHVT$oOO;QGJW&bqHaSkxawc|UI1se{qCD-5AY zRaZ~eF|6871SVN`H|;!_|#|&(B0+?99l&$t!4(@wv>;gi(T%6(rMgIS8 zb}Lg+Hb%&6_(>7bd5yNO_N8Bk8PdEz0Wob#N}Jox;am?AmwDoit`}H~v~p6AJgmPw z?jIYzmW>ve!162^m-oVzl>1YoRbYqFlSfzZAoPdW`KYV)k`ow#R2uQ86+axN!HjwD zStt$xXT2vkp_!PgBe=bW>aDk3rW^d7ez9iF{l?TQ@|?J|fS1Ko*S@ZgV(!T)JuUfu z5qiti1PC($8DC`n`Z=x%f+{YnUXho{OWA32hRhKV1zC!;v#A#RzF0p3r=IdnMdIJb zOfs6We2c;Ig7QhwOt(UMq_vRvD(^BL`Xx_SPx) zKdkTElnTfC^3FE$Pu@FMi1yTMv0^(Q>ms-A+zk#X#zfo`ld0U6h!*S7lbu$0{YSBZ z7G?ajWF~I_Ra&1xih>C8$@3)(kT7;ydb)+f(|&OU+QCnZ(k?YhX+OAJf$}dO=&?E?D9! z4DRBB?az2ikXHj7fIl~4&aD!~Focy|$g=RN61Wk=R7Qvy^os0~p&_V>&oeaILgh)r z&oO8Xm)T##i8=l_+t$&VpLHKUZfvw%xqxNO5Z!Zfy+5jB9U>)*L;Rx;#g^@047^gE zdi}1hL_RK51Msz$6>ndb7rrX7TflU8`ZF?;u-!r7aZnKu)&O zputy_&C@7U$J_W50*XAQGy?efLlX&$EAx3<8X3Ffy-L7H5_VvfqcSt&xAIB^wv0qu zBM3vp$)V5oxO{z|gbbXNL9C$(r~zK%H*nRgO#F~WG>*-N3ecsxq*L&xVKcX724xWd zZF1;Zu10u6vT-4E+%YMm`pod~gYB!_4u45u$rpjC(}I6_dNG$rCjRemd;z;47r3E4 zd;gscQvP$TNhh%4DR)%cSp;S|Ca@sKKsuI~M#dbmOPxAEg(rfD!lLKgZHDA;DWB1~H&_Q!weqYRy>(_$!LwKwDR-VBR1gK8j8Z}2Dxydh z=;S+@!J(b8V?go&IJQF2=+jIUyO53`!MqmfG6J%rWsNg(-qeWe}TRlHU%%H+~KcAZy_^IakI`l5e}o;I!}wJdIZ4{{5`(t?=|_v z{Wd84bt;KZ3I5Q<(GczzaJ;d2Rjs<*+JUoqtsu@>lQt=LN+7{GnW{F<f|vEZr5 zj|`a#z!wh(8@tU@(I?+p3D7c*#aW9`YBhgiOk2^-KY9=D0uY8A9*CE%deS6|2W*YhFtg7QSP7Dlm2gX@CJ(T_Uyp$$r-gk?> z0tDERiw*u%DkpIIxK0n$Um8mS*j$_rdTluHS=tI9l4rgxhF{|$^MN1ft> z9fz0JwvarvzD^ImjKj78@eh3Iu^&%Y?V1Kbl9NZR{-UR8{hrEkuZNG- z9B9_fEB(h35H;{1IBSSdX3vsx1 z^B4}x^(12<_UZ{verxs#@3(2p1t^xlo0Zd`eSmDurI*S*Edy$ET0?f5?XxJ96AOuv zzpZa^d0w;#Z1OdErutm4@7el)yMlvX7K#MrTi~E(iV(}tz-0pmI33r4`|_RDv=-fb zY~?`)YxPX0iR2F-?yj0Y{KL3#TFOKE<6mmslr_kNxUAlK_U?EczUN?6144j9{Tq^P z&kvSQw7=T7(~o+ytY0AOOHjF-pc@O$q!wN(UX`x^HH~$Zo-vIFy~U}L&Cv; z1M%L|nR628Q2d-~umHOZY`V~Pbk^&(Uz~0tFj1ovj^Ph)h3Of|Cf!I?^gLOBFj7ir z@p!nKk|_5PT5f6UQs&PWtF5nyu75Y;D}v}=gK{>^Hg-T~O)Jxv5MW|Bj%q9y*RyY2 zuQ+L;YFZ&ri`8IFK0D)}Z}U&|zgAv!ph_fx3bEa#2wgF-Nsl57bE3c=COifWWX5J~ zDpJ$5@9S%vO|?{EhUl8-(>=>5r;$cahSf9Lvh2ogoRBAmO-_{*rmJa8VM0UY4u?^s zLES!^SVX))l5?D!W!2+JlFebcv-T_4bQOqX$6)L35H*2yk7Z(oL3s)-xQbfKx+OSS z;x8x>?h=@AwsIk_OJVA6t6jU}f`-e~iSD{QnXVT?=8eDSa3C=s)(UwH`wD+^O z7i8-rLY@e%oS0vpIobf5!weecSGfbdzD*VL@S4L64=HYdNSKji14)8Qaa!nV0{$Y+ zPx~B2sDxRnST-=CY3G3B8fFg{Zumlb7T`5j5Bl}d&EIlh0`rE*j1^r$EzviWfNeXH zaB2z%`o26%++{Q;W#PwCsWm@rJ(8NyW9ZShIk#0XM^dR%l*KyFms#_Znk<{;z-N{Z z6aJhbLX!`yq>?&f(NxXe*ME+m0XKj9gJef<#>kjgW&tQ#Wsm`~hC78eKV1^4Ev-8C zlj0IwO5}TsxRMdmrTQVV3Tl1cf+ZuzW8a;qP2TtI64LHL?;M8Kdy1tGR!|#O(#0>9 z3wWs)s)1SRA3d!DXY}z?d?VG900cM2f3^PMX?V@`l(|zYx_uSvx?ho(id%vh! zIG9F8Yy*{Q1;>aH)c@!Ab{;Jbvfuq~*S7clv~<6QDsw-24=Sf$enrMU({8H6ftMep zdXv=TbKC2F5X3HyZ2otXJS1xFH3E#L&ktW3mZ73iFF(K3n_=x)HW-+oEXwWfC4avU zdkV8nDDp^$FP3%$SyjTc-UHXd;HfdEMY}mRT4bxYx@~x2h1=c*Pt8jq1j~#B-u^b< z@|yvrJu?}zE^ic*7sYn9Xl3S|!tmcoQ$inFB@$GF`eL2u)w6{dPUfq@A&V`Ld%Bb) z(GR99tqE>c6OT|3$x1b({1t)@a|G*UQ)d1fPF?@l5wuayxiNN&j(d~fad<8t`4WG?=FWuAQw{hocm_7DfI+Gas_)0xP~w}H>L5rR$j zi^Y#XU>fR%SdBzaNM0}jU+cS>XTHV%&f0F@F)6`61@y?i^w+STpYfaWP7d{UYF_&@ z+bPZgDhw)$zXTIrB{ z(SkXL{~X^~tiNWsLVBQt2XyI5t3ZH(^Rz3l@1EK5J;vPvc${Ufn&0i_r6uneHuQ!t)KmPB&Q&Tq z=oiQ(AYbedsV&DzSLnN4^!YiMl^2}ookIzC2Jr#F{h;3CG6h!Ua|#C*`mp#Ji{|uA zFP2-s4kaaWLq3#|jf1x^LI{Cs^)&BlKkm;3(5I|YqC?;I{^1Z7NML{odf_{p<}_D+ z@u!8N^N!jc2B90ha23sDLtvQa`M$`m^QE_yK&miInsH9E|EI`iB;hl}nG;2@aJu&r zb3?T<1Z8bkXp*olDtpal!Ve$jBhhR>xSBu9{@IBQnZPO|h){{RFT_)bK<5qZsruq$MK=FtT3m5Q@DN$0}A=I z#g$};EbUa9;xC{@sIU&B{^FeZdt?pwt-0W3wuvq=3VA9=vXcJy#Ej@7XL zM{CN%ayF_uHKXG*wPfcv#|&O5w=A=xuC@xdeAi|~O0i4yegN+0#8LPA)UaQmj^O$% zlCXxD>}EZhQe54v#QfopXGdDwD+dc>EhEd(-}GF_IC5|F!-wh!d~boP@2XRz0BV@Q`?=(19(SQiozfsRsZqi zoHsx-JRZQcy1%MFLjDn60yLX^-^p*2z;gvr01;XZe_!-c1&#|davo)E^Hi(Z8rbn% z!>~@Rf=mrYt5$%bwT4Y*aet*#ZhR_QxVG*U1n4I-rXWjYrM94MT(;rGOEpv0+QXm{ zrbfpa-)`r+5&=P`a!jQYp6|O+{AU|9v&3op`_0oKR-l8S51mt-*g+99@k?#Uqcw?PlBR@pmvqf%U&^t3^}T=?TM>GFJMT0!*1w#uPjL zjx3)>{dUTbc!K;y*;R_+1bb%F$BhqK#U1ZN)`ELJbJwj4FW&1_6jn&=ZZ4O*Gn7JV z^sah@k0>VLy*}Z>N8P=gJL(=}B1$s!37m<*hX`03=oAviJczdq0#ho>LK`ZLzEBDs z57PSvIaigcM)dhvQs4t(gMxi+50`QUgXKc=&f3=?$E4AN^Yucp3C$QZL|uK%$f#t6 zVOE3Y-4_ZV9gprn;4@wMSb3;NGs8?mpXiX>@6oJ@A7U}5#6*I3jmip!TOML$Ql-jo=VdeD56-aH*Bz@9r(3<(sX5LTtyBZ_=%L4*R(<`WjpkkMlq za3K~Xb(I6sP1!A!P!B*VY>hNw*9ZLNcz~`rGN2ql5fC8DD7@|XpHad)+?Y6X>#x9< zw_Afdq6lGgvcPN=1NL3$4~xzZ{iphXK+{VhbL_ZyYJ5=!B+7x*zwRl|B?$s9WiDIl zhvwJVM_&Af;KUzVDgS$YZjxTaLjsjCx*Xziww9NZFyk{{{m+OXn-OI(!Rvu(%FVwi zB+5IfBQa7%Q_b>8(jH1{>(oBFFVN@bX)Ynq-ojeU0|Tx zki{9dJ6K11CBPZzoSw)mCi`KRXc|MV7O>n)0L(MHiQQ@>z#F9JUxcGb7J!EZ{USYN zmt?cle~fM*YR5>b}DI9vSZN$(uGD33{D~_dtvzW7e)%>$JS&i zk(6;O1I9{r`t{G8!$+b{PeDCo@G6$=+mBFrI$8k?)~u=6>mw9i=?%^p$w_$yLk{+n z_1_tF;7%MF{=0LPc)NWdj`nEOjM@=)3W&QU&WYO(VDTCvBRHT3i{iWcDT1``*^9*h zkcl9TI*QHgll-~>&F6rrnX$l>Hq`94wRhSv%+l!Y-t#8uOFW?Wb&y+FVEX2AG-LJ- ztO->LoSv5u>$(|i<=mVO*RQ>WTRE(hh}m3q2q4+I_9G5cy^A}3XhL9PWC=Wi&j0Gq z%of12`=t3W{K36B`$zX+S$Hz}#ZG#|Xu71BeiYGyxV&*d#^zb-^2j1cqFJc_a7Aga zjMa5U^Aq#TEuQ>3P}et1A%uImx;)ZY8QkF_w|uy%hz4_u3`o{NPt?>0`*#0-7P?C4 z9IO@vd2VpPRdUU<6P^1q>%D@j3Itek|4S+PlkrJ-CIZ~tDhLiLgQX}_KxmMP$W`|i zRlb>TIKO-X3iXK#170_K{Q{t@lDAMJS4LphJLW2!|NWH;);4uS&UD1jr6DN{A%IKU ze@e?N;qpU53g$&_T~hz`_Mb_+4}q!jCa#6AynC(Q_pF~OS;QPkM}byt)IVGm)l}T zo;qdD(x5kFln|8zKP!WuZUd(1DDCl?!XAd}sx?tD<2j7iFGG?LYEW{xg|Q`2N6|8n zS9=3uz~`%aR zA%wGR8rHwtSo;vYA}MFT$PT<7;RRB#Y%ZVQ471CR`RX-XIy(ANZ<)aHy^g!@xp-}q zhq*4e6x9UVoSnKbE;nGd&=kz)G>sX+WFsFvRl6hQjiFViIb|rec}TfRMM9uL!g7<$ z+E+=>*D&3xrrf5M`nH4O7Qzt%v)4TcaKp*>o|sGd0zMP|W!bDhe9F>+CFi|^D#B|L zj>K7sukz6Y%+tB*dqOd9N#EVKYjAv|I6{y0*B#>rg1{Jrd&)qm!q{!iw=m155bPIhZ%QQR%*?nqYJ+` zDaVfIUwF?vN7PJ8$n1)C+_To<#g0@kysNg~?wRxcATK+b(T2|fkhls5+5@XtPZJGT?1XZO(VAzL;l0QZv!AS68FhAxxeG!B2a2X z3&-1H7r%M5V5UJkTjvM?wO%&0-4gHhY-P$elIIJ)Mwm-^R(!VXcWNUbOeO#1++vh_ zQ!PG=bb+5Ie>m*N8Dc$CBskmE!oRgRZfY4|wwc4whEB+o>iL|&Qb$!Nrm;o4=uj|Lb#U9dL<$1&?7+_r0&9M4dUOr9PR%dL#wi| zEHU#xq12hZRg&}WzrOTGION)7Pp~-_n;x><=a}lNfSr6M4S@ZQCfp?|~eVSif;NWTn zf$jULzbr=JsP@eWZCytEbpuyUhHoc}E$!?8Xh+34>GpWZ5dL)-M(m~s%PwV)!7~B~ ziY+=pB#XO?6+5c`wH1Pm4FoMfzj1gqhF^_a^bo>TPh9Aw1WWQnJxWFe)4|zpNE{-V zZoZaY$&!f$q1_h=)IDsvTn^ls@ zmxPw1$s%P~5?qbXlO7Xok3CkomF%$+nbWoo!LF)e|B@DmVE-68rYoehE?-ZCTU3*Q zppXR5F@(h~l)_cvouTdf5W4;Fq12o?KitYF4u;@Hu{HuYDZjXMRqS66HXQtb(~(Bi zG(a80<--+Sbu1x#86w5v5qv2^I<#BZy7YF!1w3kch?jXK zVyd17>gqoK9;k3Luv{A?r$!PV@s(vj2Ca~n^>GKqvx`&@U)2yG zwo;zIym%+Fb;m~o6IQ{r9Ji_Cv z6-Y1};U_3iVc!iJ(zuWov+Dqwc1bdQveiEh^aj|_ODCZqq~nu>2=Z=4USlvJ=7N}Y zHTRf<{a6Kg~XO ziVSgW=j-3#r+L?k?yhpzuzD7(cB&1q@3|V~l}Efqwj!9>_|z-A&)CfPj2V~2>UIM_ zYSQtR<)Y2^fMUtKx}$CS(=!9dFS?MjiiIAnD;=mr<#d1+q{^-i8X_s)q8|H~^mwNb$9OK8{p}%98^mG+DNh4U389d zf%zU8zGU;#R1XjnM+eQvqI4H5?|y-8sn-2xIsWlg-1LLLw~P}Y(^aH?ZLo_s(RdIG z%(EfZzW>TmK)e3n+47bWD~!-tQJH;l`q@uF^;|A|b@(&Y}JZI<{e2|-)rOlo@+wh>*swLmuGa2Ux9(SYT1WO*@q~qLVGWvb(oWUowm3b>mqd zwKnR~AxBuLV_cLt&c^huDG{Y0i}!#k@JrW+2G>09Gbp70*~{%Rlx*UDAvSjp+2qPR zq*J%>2}7At4HGz^QnQ2uYBpY*eWUq_QFN$fhO-=*bAfElPdB4x+-;r>IZtWyY7yMv z3<~_>&6ief2vBZpI@e56{-4S3&yc%7mHR0-Us^e#ug8xPDe9K1z-6sWk!UO=1*~VK zGvAUlTgbWrrJj=`*`SiA<4#9bx(WlIPA@Qc$>56fHzle96T&rvO2IU(yMa3sxKlbGMC51*>7A9z_l_7{%h!LK|STw0zOy~_JVsm!g| zUn5z{woxboE*uW6ghPUbeK5nVitKK(WR%Mlf1rPgr!9!_h2bx1nEraS6cc<25QfH& z_0o80aa6C$|84avVU#A^TWs>(9^t@A?7O6@8eR&Vg5H9(dquPxyUP1b3DE+G3Y2Oq!4U>I{rMu=#Lz;T?+zwZ|Rdja7MuEL$2EkcYIy&xK`CD%*L4h z|E=BSO-u8BuJg(2Ygq@q$JYquAg%37vyU8LwpmD+kNx$a1(Y-m>`Qzs%3|p{G`n30 zLU))E?P#UN$GAd(HH=RCk!L^Ph`Kstbj(VTeq0tGTvacx`uC}#u<|Y3obyA)CtF0^fT>i} z3)hY8t5fdvzlwm*6xtF=N_jeL#R5zPBi}?2ELkD6YmCRx#C$mK*!a&WJ2FePk7lZ^ zZ+k%tkSoR$8Yk+r|1s{fo}wDXfu97k@`c(<3&;Hq|GZ}@)=P_KV8n+#s}obyX+DJW z^h?(hFR^t>P^OZqcX|}PpWnmFk0siOWMdo3KEe=<=^^$7tp)k8Yw%okibLi5+IJW} zyOqQ`CqMzUs`5VSO+2}(9bk=GYiI@CFS!yff`-@!qKaJrA0(rm{IcOq+1^!i2Yv2+ zmFt1;_#4gOpUv4zFp!Ad4^}<{%PQxrN^>5kM7S!xTa?`qW1Yp=#l_dJEbt73@v6nW zFy-zl5_Ob51;*IW!{WK^B?=+kj0(%ZC)a?7%w12{BhC!Ygcr| z+~U}d9=dsm2YL+3-ir;8la3g9@%QGvXQiY##u1O5mD*&gDqcr#>(HnclqD?n93S)_ zNr9@Q|7?QKMj3bO(SJ3San}`#dJ2SHkdJ%WiqiCWvuQ4ro^8M1D}fN8$6;tDQIjmR*KpXWdLS zcsZLg83Ng5t?!>-GreRGyZhjwcj-Zj74xm1)R9at`zpRUUd5UB(#sk$Nwiz=D0goa z7-~(vMum9q|E+NDE(m(Up z6%g>&_fGbirQC@1y#WIaRXf80%jXAa;$kFFbsg5&@gVd_rbCpk7$kh=xl_M?WP^G9 zGoPYNkUtXrc5u=033sXMy^|hGlkY(O%`h7OPg%)cUY`VNWcUzRGS$wIzRnLMVjy@I z1FmV-gX9>3anO(v=hPFjz3-CG>*!i5rRzGv@HvC(WR$VD!QzC{XJb7a?6T7QXN2*o z>X3QBkbOHF_e>l;VX!hb!5E^!dFv`Bh^RU7=X!K$7S0nb2!?*um-?h$7Zy~(wR3vo zQQv*nDTxdQG+!P$i<-$hWi6Zg6RhKU+d- z-!Dh-m4bFQn`r@m1!`y1E%o*hK*oFxi$2A3T6m*W{$WV9st4TN9{j^jtrDNSCM{pj zBo4RaPhW3?HjcPpo>G8Y28j7VM8#x*A|lvdApym@XS1Kw2Dnd5`vnKTd6%?6jJH_d zq83YAfqd4V?|U-bT^M5&DWcnOy=e?fIxAl|F4xKa1xB_bg!nTrwJG9bY*4)!j0Jh$ zFsCuf9_g*n2hzFa4j#=MC%Yae_l}ry4!vn@Qw_}?b6-n!-gI7PTv*Gf9NTK)&iitY z8u?Owu}bx54V_&|8<&k;QDt#3|9`roU-+%KLz68w z=x@S)ma%m8ee`_(pRLHwXT55PL{w&8So!?fC=e z6IGo1#YJxxqSfNNY$GtN_QoF)d@yjhVME2qcS-Fjl{M;b7q-Z3s*rPAMo;V{X7Sg z3EzQ-{jN5VPvR_UB4q0Cn_%lZN4DI8+(`p_0LSKAaf4n)1iBsG9z*vFDh(^=DI@5dGq#yg$ zDW!S5AfxkK@DZ{q*0h8lGTb;GQ-$W#_NW0;Ny5hw#7lIy8cT25=@E{FB7E#r>6z&u zSegRA|2XkM-zh(3I?~0_?E6Li-5$xwFBLhPK}TR+^2C!}igD&$$3sIzaE!}#;7@nh zDcl{wjkH_z(c~k`bHSf}*lC7aw(S3`Zg0#H;EAObnsi19Yyz%F-ln(?tYHDNW5o`ISjChb_xAu#@W zwJJ(egif%9{3#|W_zxf7ey^sjO-Tp6QPO)i0(O_Mtn)!?%#|jg<{18|p8O4b*|I`I zrULEo|)Z z2Kl7d=o+NivW9@9vf*#RFe2C*?b=@Px=V(y7V0(Vxe1+qw zd(7Tj7%~fGoJo3uo7^+WTbDOzwYH;arz6(yU4FQqre!t=Cvs#tjU&p|JnG51N zTOE4!QDph?H)=E2L|y4W;r~!Mn|{*Vl;pa&pjLtTPc>m$ndZ2Ku#azUB1-AjEqhH?D9qsO6K%lJ<7y#)Jf3){{G3vuzS9- zxthWM9uClVX0{#_+)Vk~wP(T&WuQYy{PRXOTy78>o4>*vzNP~t$!!x2!TNWVM{-Hy zFHL^_bOyG5(Jy4`ns+m+)wf8X@_@ggj?QQ8eOWZ3 zX}6POOyg5t7WtA<%Ox0%Raz)6gn6vj_}sV3vDsU(joi`tcjdrccysNZqit)ZdcRivLw4S+ zgx8>Mqg|0dzIEBryak&~!fxMG>vU#I8z+7C37&C2)TwwGg$8 zxM#PCnK{p>_g9*Vj&7eO0nWB=SW#^#oDgPQ15lDjk(&aK`6|R`EB27J-rZzzu>3A& zy@J{w&qr5%Zes*s?_!n_|C+*PdV*4rxNS)^QS92eA2vzJB({6zR}4Dd79Lf31X2HU z_WXqhahW?LCggJ7>5y^hG=Tju1p&DzS5n#mOKcz(V!W9_29tOJdc zsc5`Lct=;S;G_u5NeMnhM&vw1*uYn&yK885zVTbIkazh240AZ%)H`2?rUgju3M{#D1u|m5ZAu8o6r75n%n>$#Qj43r>o=B zon86&j&#_PDxpjAwfmmzC}i{@G^vS=nQxOUyAgQUXMho5v1$z-xKR>1I&#g25;CP6 zls&RH-KjuI75byO0o9iqAnj_iQmfG1d5&_%eMc>V$;^tM(Fdc^Jkl|OQ>f#rB(zGWC~48BxuB;bk;odr+WZN`E~tAT@Z~r{~MP5>*E2qj9-Z1W^)Ks#B%ulmw2>}eG{Vgw5Ajg ztu>K*E874eKB{+n4ZeZt3OnA0!*J%{1P~>Z1-5w5R{8F3q2^@s*2aJDyl1ev0{X&$elD1C=@(Kq)t^Ey`jbY)$X6}tiJ zA%`4aNqne^$%l+&tr3ce8!avv5L_LsxRwrCl?d68t1U*qBTH*4p#VWN@KWsT)l27F zUUc;6|30ISggSUW_$Fb}M(^6n);auVSC5~-9cV#oDyqs`zwWgUcIR~Fwz5AOEv_O# z0_|JniVoOpL^q4g_ti~tQhg725WAbU!a)Kpl2*H`_Y4)C%#wZjEW{o-RljAV6AmY( z9M9YKlRDn#k}yJ%CfCsOBhH2;B|^R(o!`z+TDQ|PDg^Xkna`JLlso5Ii~$CNOYI9H z_i!JqVa215QdtTlS+!r!I(-{QIL8E@TlP!_jN1P$q~}Kymo{;wk7Qk(`GB~Co(@RG z7-gn6khEYAT^KOf+Y@yB!2}cUwgx?3KXa|{qytGVTn=NL6(;Lmz=aDW_8b~~<(<7- zy#iWLcNdCFvl-;Sf@!Z5;KQ!!)$hKkMK%YzwqMdp!~eSQ_U?17+wMQX)%NDLpHrXrl+H!5mzUD>9&i=jc=l8dVy3Rf4 zeO|BU>;XKM*vO{Py%*vDgqZ975!(0;Ms~v__5d7xB3|!X%{OZuuqhK0QB<@jk__MN zbWbPvBFT|zV*30K`KpEK{a;b13zNlWG9{n?`r5g z>p;>ISx&26D}BKvO@4D~FE7Q#7kaUKwcOXcE$cGCyLAqHZm&5gy)D_I-#2WuRarl+onIB245$lm#0NcONzY?wJn0f^f@Fpyr z;M+Rw11A^kK1s1*Lwe*Htq!${va?zC4cp#=Ry{weUnoChw0ELIXDKA!xNJv|_W zY`@)C-WZZw_U!_+THo0<`<>Sp77FUGu&=7W)=azuw33-1)6n3)rhHpwWo(NPAlA^1`qToS}H!+i#&fOgq&s&_edz(tJh4hqplyS`wn$Za1;X zkjn$aho$TlKg~KT;>zW*D>dv5E-Pw7c==Idxrge$WC zmS)z=8L+0E&Kutn;h$5#`L6&wE43%GVfX|hxb)dgbtv({*UJm{N^r70)cmXwrR@sJ zqIHY^-IVxi&YxoshRrOICk4pUOKa*v90+v=jj%$m=&|=-3O-?MAQKp5NLkKW3vG!& zx!qJ+(>I$bcjl0~Nq#Y()d^`M5gMW2Gj~DW(d0Znb)wZ72}ysvOPPTjtNtbTjMa=6 zE&Q*Lwu?R&TjPFWQys|3iede+$8ha-nrZi;y@R%C<4eEequ(RC(x+Awo^KEZ5En_> z$=1x^A##YeWvun`O^AJJ#1W}~E(^uu`bx0M%66Agr2m;cxE!dDfi|-FJS2 zxIwfIDnG9xBGKny3afPWm?N;~1=*j<Uio9+ItyEVImao0z-{kFSbR;%!U;E@`F= z(QJ|NdLMfUbi9uBO%TBCqA*N$&j7<$fJ;C3#QZ314gLBVJ;%PJ4z~I=fG|$%MpD&a z43t<>4OqC&b~b$Um?SX-M6@EUqhXIg=y2bcey|s>MRYV;5vod%Ze31%F9=eEIfBaeAN}aT9$CZuc2zob#i%X(K(sKhcjyMn&skg(-m#$T9A?oT?Mp?TDnWd%BMZ2%Y0B`ynK+&Yf zM+xO07TW_hS3Pl5B$3h-(O7|Bj{WZ=qsN z5wx^+SP?Y!ymxX7Z=kjTQJS)Ln7RKw!i9+>EJN`vOZjPTIWl`8@c=`%p^tAwHBU|t z-ts&Qe$m-`voxR|mRU!4fWaPS_}^@>tEBPT^It1#wc2SOfda#Gm15T(4pgv$Wa>^X z^a|7fDn|LI2(_`%+hp|=xvwYeBofxE?OQ0OT`52qv<8wj18YbWLjn#r2O3PPi%;Kg zdXF3yrh#JvO|imUpW=!Gv6xpseua|T`fm~m@Y+#?ZI)T(K%lUg52K@+rJ!)>zKR-0 z`fuOW5z{E5ikM%%tt@HqhPY^@?h^i2%yZm@XM?=NY-@4ZQTG?xJ~g#HHhX^qDmwyX z@-B2@HCs1+fMaR{PIJ^oTie?U(pxx+3y0PO3dETh8{!s>*R6oj7h*?@q6v2Rt>Y6S zJ7K+OiR9S29O%_UY=0tXm|S^bMpL*0%>6ab7^zj31?fHt#ez8>DsgN|*};1-^?nit z^-zxO^c;9EDl;T88vg)I4Q90a30;Xl`>3gFY}n{mgFe0=6R}OT374WR*vXNw@ZiWC z{6GdplWOy6>n1`Yrj!ip)q3wY-}Gh6>JPM9)ICUp<7XI(^%g%m+FJb%?#u8GHG6C! z1)ax%NXx=UN+T)etShgjORU}$VDBULmn+Swu|nYR)EavF{K^j6{57{K)6@qb>zf{1 z8;+%w-$1F{ghAhHu8p3*Yw|$%p&&(~z{l;ha|pyFBNq+f0(zCkT>XouHeEE_W2&Kt z9w&Euw2jgVaiZ-5%4u7CbhzB4dt0L(i&@3m%M>p0@7^rZ^=W=K??g8pMD^M&AH|&u zJpy{ON9-FK-d0r4ttJ8khL+2f7ZRCQCqIF5A&P!%nNyJ3 z-P&shly-PcmHc)iXMH%yTvg z1?RV)l64Ihz(JtS$ANsqxAUDIDBmj7zF`K6O(WOoAsGB6eQ*M=WfqFak1lLD(83$` zJ`2TF#Ly#}4n>V{a4~;P#qrusfQc7xJ|2E9Qg?k92hvHM*wx+i&R67fI%51?!Sw$WIvy>OAD;!?3VF2c z9Y!ijeut|{QI54)160h=deGx`6b`*h1B_hC(2m1nQQ^?&qrIUkb4PoVZcTDG7?;V(z;C816j}bR>9`M;AT@4!2auA!GSpWu%_1wqZaY7bHL3;?$c7 zUU>4fnuF{aT=^OEDkm80rjPz&Y;Xq)J&rB(VNiC%D%^Qy*f~MV<&uU7k(e45O7N1m zjAVuH0Aamhqr;Y6$AF2r5kMd|ze8@aS8BLyqB_Ls|2$Ei{Pwb^`()4p6b(gN#pK+y zZhlc~SpZCcEqnM0DawOBQ5|e^0bbck7wMRh9`kl)g`@nfZj}J(Lquv?^pFeaNM_#; z-8V|@c#i%&`+8_pA4b4S$Qe@-zm_*w5Rw;DzvqN%o!n-C3-&rGCHW_cmQdL_AF)`; z{Zncp$hK0Ih^2MBD${cc!O=ENUgj?);6ANv$+@YUew0*R}QmIC&EOPShkg{*XxL!lnQFzm|BnltaCR+4I%8U>si_#o@w` zbpw$U2wu%Z1pfIlXY%4utr)oE9E@Rmo9Il!X+RjemG`{ysO&(6yE$*3F#UGLx8b#G zD+tjotB?zkovQC=)r0vZo&NWSKe{ti_-odT0T{mypKkcSn`{#S{^fF6O}Xz5Ca5D} z2m>S~75dRY@7>5p@S&+RsWW-)u{Et}4(-g(5Z0B^&Nm)%}90VGzhDo4z za*dSvbzqWmE;|=?F*Cla6U;?Y`1NF4p#NFBDXt<`)8rr-+p%0!z3myEm zWeB4FtvxaWR{}d*Ukt8FxT-e{oYpO1m-~^YMhQmkVZW}y24kNohkNO<*xxQ)D^tt> zx$i!{RkbSkFPvMQGC^pP(x7#LdzI4H1oiJ|$cj3q_Jm)}&HMR}fyP|~XPxy#h z(^zT82VS{C8M)W$$_-0d42%2sbhD1YH-j9*Nj!7Q@p^dmS@xCt=o5UHm0EHCmulOj z1(2T!Q4P|ZJN2mf;eRW{|AosM8MNXz7R+h6ga5?geUE@s8c@i0P8%d#EZ0_P1q+vH z-?oU^6?I7%$X`AswlCoqS|YvsfV5scquSW`j3@q3G5b*GjXZDU`yvSj*cYCKyte`s z&C}wpW%2gRS2_v>v__6Iz$N#PpE8Imc)ap#O^X}#80psp^_{NYwd}*Czs>zM!vD*g z;{!;6ljANe1V$K4G8qXJ08ZH&p)%0nt-UJm_`}c*kp)rt=jvak|G@jKH;cogDKu^MU2I8fh-^O znh)jBTi1=_4qZBf_iK@}9m)}^Rn!=;>^_|DK`JPRo^f;jW|Uy1w@;2}PKb?6`=V=` zfh7U6zIz2foiei)r@z;dG-C!$Y&FRaig50ivh-Mj+DrWX9DtOR{Kp|W%%En~1r<*R zBLHqKY}KWF3Vc38I3@9y&aJ`6iNa1vOa_SNdp6}~Mh3;&rs;4}{l(XTX_TeM18Hf9 z3wmM?Hv#TyZxscg8?MAh&Ga>Ui!K0nRuNKZIF!rdd;~b8FzMaR7E>$x4h&JC?t6y! zGN|qiEhxxKE2H4=fwFQMZPRI%j-xkRAUXIacT(whH!M0*gK-ON=WL9^v!S724#4YxgBhJ5hLx z?b}<%`gmvYx0rBwU%ZcXRdM7H>RPc_Ij?AqP+|UZE$|$`cahm2;IX3>?QUR;XI?>- z+x8(IwOHjxbOYbNRuXySW1x7mPA);NB#pnKSEVqwR!GmZjM-iBQ!$X2Z?d)iXc`j0 zt(R!LpJQ zC#;5tcmQ2u(vd7+Ld|w(AZ&fICfV5|5vPPgX!TMVgP)rbeDu(#j*UMtc>q{ZAXWB) z?H^l-Fu+GPr*@Nq4lfT&z9U&A1J(QAU)g<@&|YGrk8H|oaJEQ%cm@`_U75>6&Mr*C zFIJGY5hH5Skmj^CCU5imt@l@QS9pdPOKtXzF)ye(2uNZ$=f1p2T5wdq#f`;rnMM)!_;dE5XX;f72$7PC!yojpx8HXAkCXj zW~U0?zTYlHeeKiYL8<3M@IJ4Zv?x=&dXG4-3@BSm2H7Qd5hYqmT2u^R8+5UiD5u`^q%pJ{v=zC#$kCzR)v3tJUqGISQIZ)3`xzM~b zIt%C_q@VCJN|Ar`(eHfkK`|b>mp$(9&VKWVd&cd`{6((R9dNPKosFW^_abcm*U+wv z3TJ-(bi1-rZA=qiOli^c+qd7qd(EMh&NJ-w@k|A%wgR(mxM=T-mSZQRS5M#V@xYL} z$2DvF<7S!QdKSB1rL(M?V>!1>qnF#Ve>v6=`|Vh`2W7Q-$LQ$k*phm8RB+He#8(7{ z*ywp7=tJKX6RZunXchP%In7Fc@MLeb*mRQdV`5S&`1ib$&|S*4l6lBmy5PvH0K zCJq;msk&>Cqf}wlgdZC};eTH1Ja#$*q^&P~bBCfcBS77H$@5eY?>=TH@mFBB{a3Hc zEI?By(swW9GowxM-@C9BDJ~gugTtO=E1%sYpXla`wD8i~oQeDHq%h8VjJ)Ah;~U%8 z;2Fw_r=SUAtRn(#x7X1cbBQa;ErS_6W5=ei1eH~KM)$C7S6+7?FR$q_?$X}J(p6HL z?Qmt>9v~k@Lk^M>oDLRUel3t%LGX^b&tU>WO(fOaQ!Y zj`M3~4;rAu2XF77DC&0A?tL~EL8Uq3h2Q~#U^C2Q+UU$2hzIQxGuD_-oz#fP=?-Mn zy8!5h^etw2-&yk^cN%z>oPi+fK8%#k2d{~Ro^ES(ZiTC5iN24sj1k=S{6>48cL-;>H) zAr#&R)<5Ag#0!H!w<(tJBzH%Awd3XkT>Z&&xd~B`V2p0_ukiNmD+L(C#M8iindzy) z&$2naS6ZdZ7Prw;VY5MoD+9oq7RA!LVWp28UWLh zwX;*EQolyAA#yvtP_Nj*(SA@)e51(|J#!uNB7+FoQCDhmenG`>(e-OnmF zm*->5oAGdg-k}?vJxz%p!LS#Sq^FC%z}?8kku1^u*x6=6e-7fK3@NImxaK^((@-D3 zDm8i2NL(BZUjF-N;vfdJpG9X?)Fs(EU1j9Do?jO&L4v+tc~Eua-q<5zPzoq_YQAnJ zWcX2G{S~0|a~{sCF<)hE!xd54Y_7T}xp@Ss= zttWUy@r3)6ctiQk6Ywg=TdCqkko~2w`ixilmG1Y_oF$Di#4PXc@ryiAiB;tyTZa(y zw#qqQmS`o+$K&%7sR6ko?=A)GCP2}*U z2sC`o60zj5X3D5^&Z77|D9gZgQ)w%dTw9%%!g2x-SM_^lMWv5cQp<%nXyA&>Ds0ax zx@qTUmL2&EK(}x&^0}*G+Z8)C$TFcYwQX?Fee<5J%~b*{3LG!WY4)7$R2bnk0n4iL ziT`-^%;Jxp+_~bCm!kp?w)85ZXo0c78JQ`=I3|mqz8NWU{jQ1xih&bp|DCg(i_zOI zTus5gpuyieoNRV<_{ZcMvgqKe9CbSfEMm1(qeP0(idT@;#Y%Y70!mm|& zk&Rr2h(T^%C$64kJNVyL7Kxpz^+4kvmVo2;QarV3AU zy+C9i!!Y?mK}xCF1t$XpH>wmqJy`ufM4c;;mjS@-ufDMPr)qfD+WldGJk@uZUE84% zlZnJw{-YfL(QXV0TD|PWBQj>V^t;cR5j#duYMFst0^z|7Zj@c>YjQTW)}1d&WP(dE zz-N#GWp2c1jy-?A_X5Ng(UU1m`<%8D<*0&wCM7xTNR85W6%}<|;B6(-T}K<6$yMpt z-VvD&Cw?L9>=jmVq8vIMayHA0 zHMD2FbkSDq-hZYcpA{x{S_w9V@eL;IvT2X!3O&~Vv8H%alJlATkQaov#s>B-Dl<;R zmOL8X*p0qgU)60rgtKm(Xv3}KRaE%O<1-0_m!v4)Q6_S2936I6ch?`J+T6ry;xR6k zZd+i@H!oErSxU|Re5;UW!=AX_Rdn(K&8;kJ$)&}O5dK?uwAr*Z?ic2==Zd*c#g=?l?G2%j~uMB{InA9$)x z_tqevwtjCiVA0wCf}P;&zKnh|qbV?qNO}P8Tjr0p5rhwjya?I(;N1)bGNwY|BZt7Aa1{grmkiAa;L)i|Uu-$K7P4+2nQ-c~&6B zWwpc#QtuRO^@vx$bz)?aUyeNE&Yv)7fk3^SbqVgzQ}=wPkuH0%R_G35(ixuXKc;bv z<|6lKXEx%uxTF&(h@W~^?dZhKFr&Vyg8FD_-7+IaKjQk7QXxQF;r!>S0Z^br=_~(v zJ8WLO+yRm<(FQckFU${-uaPf989{uv#XhuJSOk@WG9O;XkA6D@o896@nx6cA3A`ys57HJ4uWsD{VpZW%BS}b;09>rSQB}vqhQ8-x9p?P^v=WiAc?1T z;f}Y)rc}UyKcCDKJSn}L93}=8A?o5_Sdf&vXlR+Dy~JtaDu_(*pBdcdHQ{92tb>nwh_&50>g8nEiTVxNqlM^NSLa>}^n*w=>-BM)x6Uk}>*!-_1 ziyXm>jt=ap{-V)+_MTF5DJDTt7ZsQMCu~tVf^Bu|Pg~U&Jjs2id|B8v5kvHfhQ0To zi{qnuV<5Q#d2_{nPuf1})X!X!L-e=O$he>~k5cIpw4jE7#EimAiB26a&Kk6a|4lBQ z*5-lTMK1m~#)>VyTn}8Yah*l0J1+NoO?TO7XB9n(%>V#HwygSR_QzEfQJ{R1hgvmy z(Ag!+$odDF^KS^isVDc=?^LB=m1bzNq8>7+2no-HizB1hNTt&vgHDtKIQZ1b6XPq& zFE11muoRqIQio50{46Myg5^`nG-)Z`Fps>A-IcjR>wS-?)&bbxjoEfU;<~eyhjBM2 z%5I*}b}{zImx*Tw_?}($o1f&zd?)i8#l*sRXwyO9#z2wPQI*GKAwlmM^QWJ|mh5eR zIsxI8rLgP3uuyje(r2lx?r4XamKsRtwG@1c2XoIRE6Yo<^VZX2om~6Qjz#L@QP<-| zT~|YJ79O>fwZLLAP{K%)k^(y@p%+1tvfQwPg@?sQCEl0t%2$R z!}PD+rVwEwaajFh=+xKu|W4`+ePttBVcoa z$r@?%BUZr7FaCSkRwf{LW&asEfi7PJ+kus>U$!IxIGu3&0&v_eJiYc1O(h$SBlg z1x^3hVm26jbhQTQJ0BHv9{$iTiJ`S5Ez3Q@J{`fk; z_-3s-Dp+av7+Z%yYRk*|O6!tp#+t;$N>}m9i!XopSr|oP$KPH5?gCjnJDMlE#R&LL zG9O5otdNl#xQE0)*eP*=2F9pxCnq7Mm2+PnRsZY)GBN0-lLfo?V)+X(TzZSb=Snr| zq7{KI@uinPt^gPu{jliM-YJ*8GY4Si2%R^TO9^NF23mW6M>v4{O&xK%I1hi-yau9Z ztta%#$gMPQEbpoUCGWSbyvT9vhRL2F%%ifLQ0G&-rU#I=t%qIgKeEAvrx5HO;ctR2 z?EJ^IB3~OAM<4J10SJILZCd!K$TPp_fsbh^DK&~}%vwx-j#td!cfJ-^59<5vhmj z7*~9}21b5I7asxc1nj-5(tt3FO48OkPX@{kB0dP)p1W+B&a1bb((Jx;c5;?~EGt4o zz_XJ@_WmcwEIA~jDPesH+IV+V?!G=!2upV2s6OWrT~nC-um_LP9_LD4nh=a>cOmiHmtz+#>C#AT2|wEN>V>6nrlGxSxYwZaPcaEfeETmz1VU)ur&$F3YD z^+Uw(tZ=XE3E+S@qEm(+%L$$yFK|^+njv|m=wb7EJy{$`P)1LlM(Kh>n=AH>HRCPq zbCJ{v&WJvt{=vjT==%bXIZcwEl|@+IPWy-talkn|#sF`qRX>jtDJYwoy_bR*6sxiR zhPH42&@Y09Yqot({j~g3lcT_TInoV80C{A|GIzP3irfSu0h7kGt*xR=zsUc5jeNss z7f48;N3BnC^Q~@b7$BQttZa#T?;HN{*w|=7@vt*NO>HE5jN4PeC3O}2`W}YN>iW$0 z0K`puSd&j9pXol|lZ%wL46kqG?2QP6y?zp`(G7RpZD( zx|1G+&|tERA4PJ=6oadhwIy_>)5KrS?Q2&Ma9AeG7Z;Zfnsu{^Ui--gd^t2i9o2&O zzzD0?Q<_S4yGb`FR9B8z+sTaB1ulju;3!@2U5zY?SlHfcRqCn9#K09t^I6RH=^f}S zyPzen00bR!q}87m%ejF4!`2NEMVQA|7vk9fas4i%B=1Z7`XsYL7)FGxAmm@Pf*ND{HugC(%2|<$XpX7f7|C5>k^9i^u~vleI1eHRQa@cs;fcz)QFS z!Q$+>X6d_5P}&n>uz<+uzt>V(I>;+b; zHP@Xx=u>GUYEU-vM-RNJ%L9sEDfCR%*=6PFr|arfpBGZk+T0FZVNa09iC|*Eb_~69!WH>rSKJ^1xx_MtNt)DGVA)i zI6Z=ZVl_@ww-HKfrtY&Q3;_=igtUN8wb>jn%3>RzfZaFgA0a77KY>WEeQ3q$GyL!Z zj9z!2VI0%RH9|7f5@0B)O)Ooi#+1LeGF4OmOBj4(wyH*B<3O81^J z%pENLNHnKsN2J0a;Blhq6kp-a%OW{C8DE<4dfmjzh7f1e)vGaZ<@vTtHz-qoUVgE9 zfYnbjXHt=q!Pfi)CJLK53msjUMM=t0L+NDa#)BzOR8*B+1kY zOS|19%HlIp8h^qw!JOELE`1)ntLA&TNKd{>`RWB2#V0I795d%Q*KUOjo>LStJYg$j z8a9~Snhd;BI0-7j(H^rniOPV7${6)5B(7O$UTHU)^#V^6eK@ykt25C={45mxRv_c@ zl#<1YDZ(16SbG9i)9sjB)3+asG<{JBd2uC(OsweK6kaa+b?UVSAZx2^jMvZ`ZmwgC z_R-xR@@p%=c0SOd_y$()*eYUf+iJ%(N?stUU&3Mb<-PPq$&XdJigc6H@P zZV2Wcz-y*Q1zw7zIbYo;7K>#r2M=h5m^x=}j(Kx1Eqo*gv!%(8km|+mhCn4gOxN95 zBRCuidNOa!M}ZmY9}}4)E6BzCH~b+X1W*%m*Ngi`i_xY+!}zD(#~A}fH@!v-y}8!fdc%EfxWHm1Q=`kwk1_z8v-Fd> zaZ1Xv9vpXU*FNIcR@})O2LO zNwEp_o3u8%Bd2RN4%({=NL_jx*CN>H!^whY=HUa%H&60n?LXpYbWA|jW)p3I))S+j zL@z{1dP(x^9ekHRp?&^lR?4nY87DfUPG->$+@md4qCh?F|BkFhTVSa3R!E_}C#9ov zlR_)jB?qVo%hbKO>4K#8K-t!jyqGPjQhKqY{n~V5Pii1L%bKNbBSxO6LzggUs&H*H z+CO`Lhx-9;$***qZDyY@9~W$V;We8Fk!elt5b&C@lyGIDso2^Xbc4daXl-dfE_hEy z$(yyV?d)|AbyY%RbMw=))ovUF;!ep~N(gvTyW&djKwFZ*qBass_|JzY`Q(%M(r4ey z=E5A>75_h1pTxoK=@Qn1skOnvi%eDOIor}X z?(d!4#v-!-0?Qsvy+*}u@j!4O4N;A7jZK8FLnTNK3=tfACjSOTWKIW{a(;ztz)5>Gn1ggUXqbv*>zz=QPt zd)kPf)9z2=u&<0qP?$r8+ZZfAp_HZi!ZX5?Ia!6hazfafGhtHIwLSsvgl!1xXTg8q)9ysvv^>KWkd4as72 zvi3Umxk=XcU1xU$fEqhthn+@l%a9IOJ!O*qm-zY}rMpzI&n|*88-uq_&v&p zRMPOKmX)@E)&xfFUaXUWK>4Yagi>u7Xqv>knDAIyU22^<#O@38dbWoQ`y)=0c=VBt zpGsMsW^`4QEY;KBFujW@XV89aq;+FQkU|A|oTVz?>z-tc_Z%4cxM1^LGVojWh>%za z5;d-3z@akS#4Nt&$hJ`wAXee)@Ng%P7EYR^e`nO`lH?GOl9_Vquc(j@n%tG4?rGowLYdh(_Hp7q=?`{dma+=(Hc6Z#JQa~1L8tgdYCYZtY^n-c1oOn zB#%)0Yu|nq)(sK@Q6}PBB-zIDSELiPbH=fnqf1|~&6W_aw5UbhZ6KRanJFjv0l9x{MECI2WGV zhXhn;EYzzd)rP%96pH+RYZXhy}~WYaV0SXIt(}3MpT)yLkCxu*UT>VFrfiG@EEG&dqo8*%`;f)SD+p z^w+1sj@0B>Pl)TQmn*z`0dW?_-qY8uO&`Gd+K~Rv<>kw_mSupbS3KR5+58bZ zdS9*n7HD&bi*-L1b>#4qC{;7XslMqeLaI~TJ|uqE>1W)y!@vy_t(i_g02*WVq90dN z`!91r1)HVO5VM|6qr^tpCo_g_;BmRkk}*s|k8iSq4x0=c%R~~yui?`ZJ|L@ZXV9?@ zHpO6_oCq>~7K-csfp+im2mdb{l@scOG8bYsaWXk|hpq5WMY_sp03&3mkH(Gcby&au{pTRLh64n+%@C$Shb8ylWjZ0= zo!M{9BXaW`qK&K>$437;|C)f6W2(+RAKgJW_lD;7{Sl!*miH6wst#gMvQy+S*U|nmuAQ~VJ8>1IOH_V}hCSp5~!CyN% zyq$}cn#C9}L!Zv9pK0RKzsyg4tGlkH(Q`#%1Qqn|`3$Op@wMOSrp87cmNwoBdFY78 zn*-;_X}OvOHSVP0ET_xO{1NpaZ*k?aq4t@)^Uo}kjX{?AUYvTL+dg!K!!H@&_!QsM zBi8TWsoc-kHd_z}j#PXfPI*Zyb3mm8Mkd7+>GRt=kIwjJjQ2*10WpGg7ylS%rf~x~ zOzHA2F(Luujx3DHds}WtxKM!|6 zX+vR;qVL)&tr+`w;7l10L%Q=c^HXmBQDyO(?nU(5AfmV?9OoPcyRIRlG*Jy;$VTRz zmeF*7oQtn}j*i*m)a(*SCZ{4VO)|4DjCV@*^HDsC3>Iwd$G}M&lT!26EZJJzfIouB zu~WX6VDDovNOPu$E6y6~1>;z%RgW7AF>{Uj3afy7yUxwS4jl6>|%7I&(_ zqYQ;dMs6H+drAPvc+Jr~dBWzO0Unvb;`!k}tg!niZj+YUway!~mX*A$ksfKYkb4#j zIlbdoc%@snXZF-#AaHMb-0gq_I;Ty2j)Yc@H5f>^2Rf%h07fK8xn?o64)bZsYJAuT0VIk!!LsMR(>2sRe$qj+)2rU{jjZ z^`89Mu%+M|^yqvFCJdl{3R^2$JR@uHWKExOdD~cv^}E_nx*p}8OdGni0EmYw zXP70VS-Ty4maVhST7Kvlj@SCY7Q5{pqZDBj9{~{t6Zx|c%mE!`ub@GK(_89P`N!7E zja_stGuB2dy*)A5Nsx5%CCq*um{Vtu)C;+ItLQAT%}|0{GE~vpbTE}KCLL-eaIn2F zGaU23y`w4wjLRNdD;?m-L($yr^rBT@pIru$P|Mb4;cJG@1>furX{ZEKWE_INX_5c( z&kQtJRzaEMWHH3B`8fleSB(e{O}H_G=Db}65K3zy{b0(83_o1@%b=ThxUN+#Q9HxW zA#O;-;e_eq0#ITN(5bGS7LF83+DlaJ8=#G$H#Vmcm2L&*O=S9B!j>K9ii=|$cZ`)| z5cmt*x%ifiZ@m4^zxLxmSYv1HIoNc!6V0(;Xn45kr;U+gl5zBBgU=7y(x#L5u1tZ! zzbi~?$EW$vuN{1r5Qo~q=bt)2W@U<;-=UG`YUz`*=n_vHC=tHAm_sc z&>1Du7o)R?8>(&B0kVvA+3WZB*C$P13{(S)a%fh$?EVGu`un>AXmzqC^@exQvrl_O zF<}4oSPq7=Dy9|TK#r;UOFlrEU1JYa{WH`c@rTKf9=%hS&uMT)%mVHTH!KppD2B?7 zUUp45FTeQRdCo@f#K9f*xve)Wxra+Ab#%!V0QBsUp=jObL5!^Q#Yj!=Ko+RN?(cpe z+Y}oqs`MYUPbcCBgdIuLg1onIAfwHSRT&lfq zc)tOqku1mlL7mn@B6>UA8(dPCtc8uto~rk1(m0T4l#lylU!$yckK(36{}3PpcrlmW zryL*7K9NT+P)r7cA;LG^_CxGR8J17fyt5I-^6$x(3GJ|t#&6_J(&mX z*_c$GAUuX=vggUsJ&g#T2ag6fy}tDTO9=iqvG||qqS7+HpQt{%Nov;2;vw0G$Ed-G zmVgN{)OxhpR+#F_H0}EdP?c)ZpO}-dX1*8=FP9Wro`&HV zuoA0v`{RliEPNxV@sLbQR(O0b41+#%K zZ-Q9=Kmy{kxgAY*&3;bkK8XR3Hm^08oLgP@XCyh3g?&vmw0uJ2H{iX*1W^yp>|$%l zYRMrK1a#eNqUA_&Locv$1-izKe`vXS3W63wR*Mr5rIq!zqN39sYDKOdRQ&ddy*v`| zzR@I)?VOvm$R1#uzekbP8ER<@_Eo2@=-3(ePo#T${s|{Cu-BAv!4Q^pY;D7auWQ62a zcWXX}cS>)GudJIsE`j}g)&q|#zm-jzlGP@w(L^V-^f@V=qPuFVs)fjid(0>#YymFD zezb25hkI19aP$v6{deUR0Afb(2_{P9?)8tCTX&+J>V>A*V4(*NwCT>7j2$msY-x-L zXG3=2;lJyWE0YeZV0QlsD}GIYq+$krTQtpr4;b9lWy88LU7n8r*5t7qz`Z>f?+sgu zL%Z}`qgGLzS?#!s2Lkin`xQ7dTV~~k8@}3rmn8fd`9K-*b|)!y8Fe*cdD&15{zJ8E ze&-@=R|zH)jEqN4%CCf{B~aS9d0;~25iiHs9cZ_G)% zNa2MPtNI%JQEN=SrEn^2U|HKLdN`q(tui~@DA%avaZr7G#jnjZiV-d)upT~HJtNdc z_MB?tL}R2a+hEG!V`)^+=Kxm^>u=BGVfFX7VD$5U)+K?aBjKJ6O$DRc+rNQ0=VzVb zXwmr}vM*)THzzHz5rZso>T?roQSy;7Uxcbn5UD+fikcM znfIWKmmUYrWFBt(^B#Toi)+AuMwtF=NHJQc?7e;nvdmmbYd`If(`^P&8`I1TPYC#I z9FC$rfIynaK$WcY4&Eh)^+_oz3XpTmcPPJFvFO);v55CH>RP>BGO)TN)7y`2hLE0r4-VHhY8SX@CXn4aU}8R9@0n-q1*N_2^A-WqyXYO7su(?MG|WAgm`-~6!h zwua;%KiU4fZQ-rtCEr(`RXM}~pUJo)lx0yF#CRrpalZZB8q9xw z;)F)GKkb@x75cXCSAYF;H}wf3>zYQ$vu_3b++NK8%c=<<_m5zuGtVl;(t9wY zYbJZdKt9i0M3{Wty0O=-C`M2CV6MAqAWXpH;v(XRy_GqKXpw~XomPuATrqmU*VEnk zwwZB|DHbF2JZ&wyxM-=;*2TbMjPtggl1&>RsQ1N4;la~aD1q&jFzSD)Mcg%Au@F4x z#1G1D2x_s*72>-__IgZF&eQvbvAm2hgDGG}hV?8eKS>I*`GOl4afnYWU(gOOMjn%{ z;o@1vlhBG-quf31{$Rs{9s4e75XLgDTm-{D;MeHqu-#q?1VD?=}=>`*YKBq&pTa99ptpSB(1$C zg3u+-V~nH~D(Zmg7GJu{$IjaO(-ZEG@u+7&re)xgCD)A8Bhy4#tB#?C<%mO%4k2qK zf1JsXN9Cs_jNUp$tu_Lekc!wvVs=VpWJ$s#udq^Jg`fw}^!SwN-Y$cW3hFm(U!)^u z2cM??HOB0rF+52OkO^Lv-1@$ODiDRR~Ebz}A_w?%O@96D&c=Yfl!wJbq*S~Gc zZ`l9@8OPHqu3#|ENC*-Wd5T$6MDz9f97!=;kv(h?E*IRWC5qJ_BVj<{H%ytO<4>L( zpc!DZsfOd~RK6b*ZT5#^gMTro{kNjO-a^ZDVW#EDW34%b@P`KY;<_9kS-dQMu$%lhK92k1jy5T#lzCt}Wq z9Y2sm9xXOlbPp*-UjP4BTCCht=$Sp^vI6kX$ct-BnA*E zX(<6Eq@<-0Ns*o*q(NHxJM;Vg=HZ!p&pl_Kz1LoQE#0_(Ir|T0A55Wj4q4&MkD=l8 zt**4iDHtk$31pKRU{hmp1o*m>4sYN7k*SjeT<;{=(0D1ZeFK+s;gZ&FK>R9UN>x2D zZo>Y%<^MkP@8>^W8@Phbq_&unuk}6lcXTBm8xCjm6Y0hLoGYy4_`}zq&E^s(SSfS( zzIRyrzN%MXsv+ft$uF`C8M5{t2`m8#fE0z2xQPUPMl0Q^lV9DYJ2KuIc}xYTEuQ25 zcxWNUO{K{S=v28-`X(TUgH|ZQf6<$8;kJtn8Az+ZVT6ed=uw&Th{rdFVx}i<(FRH` z*aE1en)XeHSTg7p0z;_CAD0{qYkAl9RuzGr_VeDurM|6q(8%ZMetlpI8Q7;`1=6Je zb7^@M^<~E1*ft$);U+H=p!7*=ApcXqmNpa^4fT;Qr*In9aJ?)m30ye_5_9=cce<(D zy2*@0(Rptgk7ys4EO1)PtM7i#rjPQ;xn5i@Tftr#`Ft%8oLzU_nOm1{wk0M3(v6^y z%iMPAU8b^89zkLW?@RRvIp=J!PU4&s)=T7&TL%75_xH5(treFN4t$AdX9)odz6-tV~sd_~-+bfN_ z|A|N>?%}hw;DUfggqB$#V5v%`(b&RnuGwjzd!Gu*Kf+x-^v1b`@v^Z6U=1V+f%6e5 z%F}*#^N2UdmP_pW($hqYZy3p-u^Y@De1pWoN3cgHq}xp~O4RmXX6khL z#u^-`0CxF35@Mm1NhU&`mf}A{kAeJFuJ=L?f97bhL-$yCa^1MITQuhJ1_o$z9lWb% zY|13u?CZRet|@7t_kt9}2)pl<7lsvxzh^Dw%>7?31>5TLIWMHlqh z*ZJ;S3yf@#y-+q@q4vQC0+rxT_JtLzb&vQ{%YTWG0K(3J$%aeJfk|e!3<_@IIiGf? zzAZqCUla&j9B(`NhD5#Ci6wkQqgpCd152?HUwHt!%K?*1s5H=Uu6=tIW<)aq2O z#{*YSykT8IOG?N2qo*o1a)WU-VbK*|SDj;cRjLWqFNLK5!x3ACw(z-~jyvxz{H|VH zT((m0iz^_I5$butHY*RSv9WaoG_7d+ygB*&Z)l&$^T4a{gTZYbU?4%9t= z+|cbJS(Uxn94k!sA(LZR6byLuVh2!f{W}RAtp_Augf&lPO&yf^+~v6Z1J|4fATh-J zwGUEzU-7EhVl0`>YiaEINg@s9^?7>~3gHe-H-SCptM|Yrn^iP4n zxNA*JcxL4OT2E7@Ir+hK8#Ym>+Y;c*tjfCItN-(=U}yIY#_Vcik+bhbsLM2f9#h#( zs)k)jUR%8^$e0cT9AjE%*f_DU9eXg)B8ae^j(d{eQ+e%g%?8K{$B7(_D|0vZK|1kd zYS`;^*>F};BZ(UrCBs8FW;QPcN-;dz;+=#0X*N>MbFUuaPkQDBVfrf|80a6(;O z8@9UY`jyR#E36p>f7L&>3TCjyql=L#OS#3joWu$ERRrk)$rBLm0?t(q4Ob6_D3Aqi z1wx(baxq#}lOAaWemtEn#=d{r0P-z4`lahO@<8(+6_5eW;QAE3%EGR&b@IP4h{ktT z_3by(XLBXHVCH*1I^_9K;7O8v^CG>@e!KU*F$3u8<(K>(F!hpm7yUSl&N7wJ)Vk6w zVJUnKOiF&|{PXD&FbGnMNQ*^idhwRMgy2V+59BdrMd{)3nWnoTFB^34{o6_dr#F64 z>QYKSuJ`~afNv6K*h_$LwhQp`S>Hc2U&G07n|0vEQ@Og9zR4R{FFlIXfURJx3BW4)b_U|I872{|KjsA6p@bsofn$#LfomFhd%3xKCET z)HncR`1!`-2^!S#J)IBg_#3)*u3#I$H(zzY)<0yblR=dGRy7j7jaqLBFVm?EVis2p z|FM9c*KGIimn$#-z2C@BYDjE-s+!GTqxwz*PA=U?uobUC9|8hGdn{LbQtWT))BU$%#&w zPyO*|FiNxs@&e^lF(NYJP-lf<%6iEgk`F-O{grbao~6lExYe5UL7gJ{EfWlZnN(1iD0 zpH~a04wc3G8kvGmfiOmpi`CzabxB;^jwqpDBl`m2YGKsd3_7=1J)D_l2bwY-hUw3= z`BI-$=TP&~gS3CStbZ&ZXP$k@u8Z-KYmBl{Oq9eDCyvl@{xd)oRbJfN5Ex8+1B&B6 z-op8k-6w(;z}MzEFhg!i*;zkO;sC8ULjJW7sp4CLJp6bCT}F6Z1=3OW0ppbhJf zXH()TtKo?rZJ)L|KEq7IYxD348isUrPA=DQAjzIwo2jfz`f=2K$l%oj<)T5c!JUdA zRK@-*XzWuBvO5{Xx;zF-VR{J^Jo8z`t4KPi@B1S_v60`HN*>DvW|QM+XAY+a8hY6m zzg8OP3!A+DAB8Lg1?(V)Devuw|PBYukcojV9^EIt0=OXj8%H>nVO+E;lW z5r;C8>NJs$iEawrc8>iW_Hbg--e#!=L08orVbWXRv@ zD!ntpRos`UNkn+MI4rR*_|!|Gtu-1qxMI=-{EddpfI?1)tVJZ_N+4k-yqP|ZZDAwB z3(8si);wkuP@Hu5<+?XdZ+?UB(nC@e;y75~+v#J$VyuRqD`4S zCV$0`7$cXg3_HL6Z)Jfh5g($qc>YHI;6mj?U^NgDUEWYn)~9cO>w<_v<}Vr&YWZz1 z$zyt#;z8V({@j;fMD}i5G%3sD*E@dLn7(S=0G}l15(O}0JP4>_jqc(Ueo$Cfac~88 zE)`exFsI#bP+MZ3B$TU4oEYu%naul7D1zUuTwKBp@~bnULnu_ zTmiE=2<5@*{rJ4*lFr`fs6aYsNGr_cRp&i0%Lv#O{*<|pz<3;Y%&fQ)ny^_fIfbmq ztM=|J&;KTM813v8YoyZ1*`T8j6>9HaD;Z%o7G@uTesk1_-A`37XO+p9*f(h_<2-AEBXg{5tyEF(FC5%H7vS+Lql_~e1r z_XErYA);(8n3&I22?lcDsuxBD1-M=B8LH0)L5EA{-onrQvq7T-zb?5veIwprpK?4P zECF(cqz&WN@rc`m-Qa{KEc_MwBylkbXD>Y4f&jV80g=@E!ds$C^=L0VI(gU@T~1da@v)?EMJ23+ zu9qPqwMI#U#{pi^lG1;|=86-qwV6#H=TqBVP{jX``DImtg5nkSyG<<+h#n$#{O2ouaEP5R0XJu~IX`Z;T-6Fq z-u^_(5%FUZOEc+w=K6#HU!@#b2_>bz?;50$^Jx9W6D3}}58=p|ANz4#Jp9D&_GU(NQ-F?if1eP+nv-pZrIqy6*KA<1kVA-h@#SdnmgbFRawx zB%qW@k7&d|GMth^@#elXjlnYS#)Ig%za&u#{aS|Q!AM17EQRC0Zai@*+7Ks6aiOld zI9x<+P6mq(s~$_W;|~({hHkx~eNXoOlc#{7Kv(}2uEaa^mFR5qV1A8a)A4Q@b;-U0 z=Un?cEJSow-^?sE4)!5roq|1!J|=Yq$LZDev2T}LA1XyU-kv+u^CB*V1OfDp+Jo=> zJQF~{o3W$t(hFJ2v~|-b%$_m+MY#Fv^wy97pj#Ul3S>7K5VWahev&}ueFwzpq1E|b zg#|IMrOvop8+d6C9l~oP{~pDO{brZHg(I()BR&E3_H^au(!?=cA^{?gm)uqZDX3At zSo|qXj4tjd{p%X)Ea0VPEOwf!}E!=Qha9XuAwv9_o#NRZRkXvVKC1Qj*&s)M9 zPSRBeHb@ja^h6kvz4_Wtyc7ZeJh4?w5>QT|7!b`!bI)ZuE~6-mR)oEi7EJ|Qw^!7qynnRs-{BPr6|rDcSC^{Q82Nam znKUr)$0bi^!wjol!<`2v#-MBSnd5-4ELk!RQKg%)YYYy*EuWH_88}MgH zk1~Dx>9cpTx58*st@>zM^*XLLEY&w~#V5@^{~I#`JSaLleYLvp2B>4F4xx7@7UK?S zPt8s+=l$-%p2YB839#3ukohkiUP7k!UB}{8mLD$3I@l852xdplhy%K?EXso%=DS(@ zAiN}gUfvRWIKgtWMlxC-;Lc_546;%U@Q*dSZETTs)i>^asMT(-+|F>qv-ig!Wc*1Y3;KY( zT1~%m*$pgE*sIOpq=I2;h$tCyTw ziO2(d)l{-8BOb1-`YX<>6`pJ97hII$Lm17=b1Z)^WOuoyeZT?-iE*TdVT0wtMI4Y6 za)l2z=p&u}A{e7mACYntPKEqT`n@##Qh|Hw;}Kj=?*PqF0w4S=sO5oRr{+JQJ(y5A z>&S0>qf6KP;5LZSF1v+RPWF{i!aHxUI$^ zAoxd#lZ4t1^Ok*|d5ok6zoqsvoU&@>{51rBwpz=Th_RV#^#SclHstPga`DKk8lG(u zs9ujdPlm$y9XvbHEA?v~h<$blOsLtv`bPKmne}-GI^OhrD~tRIy)%Aur2mg`wSgab zuh|HB;C44Q@W0&1^uS-?m8pHO3|h_>H>=%>+l1OFk|=CeF^cdHC8ghxcdkCIPuIY5 zXOblYKPkgo!acpoAf1i+)3z*A#B~N7p;kD7H}^g8PO2Ls^><(VtR}$Me$~KV`b3O4 zC=k?x?d0O833nvq!yjWqoLUX~Pe+j}_Tuk{Mk*Tw#F}U?-X%RK_3)LzgPQ)`n6?nt zIGx=cjqsB8SIp+6x_=k>d(Wg9W!>daCUkH=w&w2yfA2t_0(EhYYy$U5F6bc0^N7=J zre>?VSN@=8uVq#?Pq+AYvJS41j8KI?52LA8V z`KM6U)~pytT8Pu@HJ#1-^+zG+a&akhHuDy_M`B6_4R#%z7IVt+aFW<>3Wo+|U!h4L zGBQLwWNoa5T7hX`No_7Se}T1SO<~^WVVdfWcron;Y8ShebC*A~V0Gm_O&r(q-tUGT z+Nsv-utnwQ_r#9t^SGXe(Fy&FHml^)J#11OKburAMDk0wXmmI*N<>7;`h&yor1xu? zC@qy~U*%PNN;{ePRtgHQ|6_1&Hr%=LoaSc%i&*GQ7)elA4S3iGp8_?yuT~aru<`ve zR7Gu{e)iwNJp$)ZLHGB0Ys>qqZdBgx1CC#wOq>s^_&ULbM`t&}p=v95HV&LJcqr8k zzo>FamAVl|g&;mp*23=(m9$+5uIqsm+4Pe}IyO$t9__D!Dnx z9{Kyi>gD-H&xYC zSwldXm#1XAykHcUlEhqUipYY3y@9!a%)Q-@&_aeF6JA<1Yow68L9uM#v7ukR@8Bh! z%N;YXcIkQUII*xopmNrT3VIHfq681PzT(8*oBMDx2%{H#Vxdnkd0;M+2UMtgxBt8m zh@6R#khJJ}C8j~iF38MUQJD8mcj@SPS0~$iy#{G4PCIjY&j1^Ky|!ZY!DZp@QAn4Z zo$p(%QF7d>GD98+iP#|~Nfi&hqDVg7vkYT{TG+4UcpK^smwIg;3`RH2@PKb9KEKDh zcb!=9js!aL(NrwanMEnh%mi}F{n%S=-IFs!r=?BEU zoPI9t6=~tXPpskP zkdK^Uvc0AMc7s;u;t5K|?^WN6u}4mxr)rM)6Zb9KcSnRPr;#l2)O<*6L?`i&G;Cz6 zvlQQaF7)x1@DP<9JuGgaBLjs-W~<&{jexbgCcUYt1)G5$Ba)W3N?UKi0O)=(y#8opvyy zxGbK&MQqge7>ZUjCO|1TMOiqGv2p6FLP2GrsxtY7oajHCqe)Zbu~q)i@~Z!fEh84^ z!`b~jHmJP&G@5L0{dQ5qGCPa*!^8Ku>Q>#rDXf(6{NaqMyjw|~7S9Ml4G4V+ihZ~q zIx;oca5&3wg;&XaTJ&E24Tvgv6O;Q!G+&ptv|&lMF-Ly}3z+epO0S2_`zY3H!%%ND z&dMU!46ead$UFVYs)L+W-l~0=3M`nL=4w~CR$`csBsy;)xvHGU#yg@%CmdH7gyskj zpZ?8Y+HKi8~#T;)h{jUk^Tf zB!g7WhS2@c@Qz%hlm(xVGR~{<=El@KpqCB0q|xI|fZ|Mo; zX)(LdJV1OtkiDht4rk^-G#Ad{;v;Gk!%~v#s^Ktwz*Ai(vFVm`RAw&~XtElLjB49S z%hp8-mKk^b#-#fKy2ul+eIG&yzE<6fIyTq$w1w={@A)O@v_zo49#^;RTkP#skwD?? zjBjO$yl%VUnp&Xe_$`<{nQ*Jxp#%N-hryQA`*ysn%2 zpIBP|D?w=Q)N5+pmL%96eULn`UfMrrs|WSgwBE84lETX zQ=Q4caF7%?iEKYo{)rU%K9=$v`s?a__B;d%zg9=x_U)0AWX}%c1$@v#Dyzg6P>FqS zs^Zo96GBx|rg(W&|IY)ETC2a5PuLGU;PGIe4IrQWPTz%K)}vk0=-u>W-w3NEgWy`o z7gi$sms@Mj=mA_LFM8ppe}0y)fGHYeN;fUEkW~*-$==+4+VuyqO;MhpV8=!UI6$vc zZ{E`z2Lnsy?v7-V7J$-R2>EDLnhqOs(Q$D19LZw78lOB^$aw&l9-?YHiEl1gp4b-^2h8c_$7g<&XbZ$AzC<0tyRq>Se2Bh;0yKH`H3kT zJALA+>N8n3fs2m(W`jB{F~S7t$P?e_+K=Ean_wOnI}5<)omRLeK#&!F@g@1Zx{;dt zsN}uK%KS%!!q8-cr|ShTHN4|3p~Xoz?%0F9Ik0bHy7Q{p`X9DS7)illkVFM9MKubd z3)=`9xoQ(}v2*zQ`yub3qac$+M7{Gdf6vOA)4mH3Y}(XFhRvcytD%=GmUEL1-G1uP z_sBNCO2uu08$>51fE70O>$;T)_IqnY0iCP9hi@f4x@_Hk$9Va^A>#kQ;5IqIJqKJ>2~JKlxdINpqYt8aR6z!hU6ZRX)e^V7)TjTV!s zNQHu5ylts0Ge=T4QVxA$j4L5Kqtvuf0oIpi1zLlNgpgTlNpEXKrWDSiJA-AAe$^(% z2=N1gH+h~J6SxTIo1uC(?y)b&sf!uP6htf8+xR!h`F>hSc7YXlcwveqrXADExQ;BY zrMB~Kizo0y^eD>{*1rV%dr5?lKcnUU%3H0k^J@7><3211(Cay>7F4(oV70dsXTUkw z_x`O<)qQ_dSXSobf{S_C=0LUfa&Q9iQ>qJm6HLeNzijTrms)e8A8`s}aW}s&6mZmV zwG)Xwplpldt=deoKP?lVLab7x{J}ISDmcK;0-pDYB(0i?^^Ddm`UglLJ_w1l4<&jk zW#U6N8N9Tn;#q#!3`N?2gIl~IAP=YaZ=WH+-+iN-?wal_RnO`7!}%wD*KVE``>JGE zTY3v`XC$`t(8YwxzzJ$D0pM?PX8D(GP8%zr6x$4v44yeT;Qe2UdC$}9D16Vh8Kt9{ zK;BL{fVEeZ-vNGKZmjpbwdyR?qYG{DF}2&#B#KS^HfJUz9%LK)n+u<}=nWqMUcPZ+ zNI47VWoR`$xDVw%)XHie8T|tg%iv~Ley!q%J{m6Tzt4kBvVVGSc{TZ4j#8F+`T&pu zN?tgqKbiJYJRp9f=dc7=PK1qYwushGpYej_oe}d9V~w?3tak9KnO^Q66Sx!bWMRUt zD9vhAtr$ale?JI;%225A@)iP+Q45`#y$N#ZnLpY5lRL?C* zw;r2w1`!qiQ}{Yv0OhcT?n>ek=@ZkWYKl?Cs61zN+w6Rn8UnFpmJrlCI* zTMWU;nCNXTt=Lh$haFmRxTAEOBp~qwkAf$Jck9oGO)|(YiuF-aX0fQw(MXS<>+3bJ znJb-lJWMROx)+GfPTfAM_JykwuaLFW3%_mJ4 z)}~zdz?as{bK4syiR#uhJrtf|Y9hIGS6L6)$+P^0i9TeMt6tz{Sm z*W3P<`5NSu2nA7bkfbf{03|%j^YJosB*CF~FCD=6H`UF!H+h23NHgF>mU>!$IFNX< zlk8D6uRlR#<5H>RD+52(EIC~@m^Gr{^%NFO-xRB6oHQPfZe6s1T}icQves5Ox47rp zmH%;~!ndB~_rJ0-QHMQ}fF1Pwt}NxLM6;iZ^m0u1TH=JT5451Pa|OQu@$5b*-JJE9 zAC$VBF0PS5dZyuZsH=90VjEDF2gKor8{c0P1Atv$VcOR7w7cRvOmGa&sN+3zmM|Cm z`YDWsp2)A#xnP1p+mx!1DGMZRqQ))ryg%|efyJ6V2+bk?>)3I4Y@|e9*5* z|L;^=`@5cjn5h3mLNuyPmdp%^VQp#l)f4ncKG$>^OvD&835q?q$#vWVZ*F8U%Za=j zk_c`{a#^vSCuMzKU3@dP;HA<+`XdT@vBwo(23O~IR3A2ng>#pQGSR?GJ7ci%3r>7R`&g&J&L z+Tmw^H^3vjoy*HR4wxL!hJD|8b5i^v((sy_vJQOFH{~|ChcJs^_pVNxI#2T{Az z_|zG+{3vy5909G?RIe`n#RiqOY*L4?Z!`hiU=O)av}^a>v@vIocZotrcFF=vN05Fy zBsr^r;$L?@Z`8WV4K3x{N}%%Ol@hmvkS*8oEt%V-$QZErQHs$!0g>bPdw_A5p4)mp z$$$&mBDw0iP_jlfSI;?7f{oTOY)Q#)ss{`4TmA8uXKGF}OEiTksl<0_SIeGoRBf<= za;BK8LI9GYsG7ybg(vHSWddICsWrT6(|VyOFiC%uI-r`12T0Zfc&Hk51o>D3K7 zc06O-j}0H2$cD}E!*b8j;});Do@wt-3!q;<>K)V5SJIAk4;p;A z2&J526~>3UO8-3SQqo0k{oPXg4AzWgd>iM|eV+lCiIQ@@n`Iem58wY^X~a=)nDp#L z2`ev5N7T6ZN|z<}mD$4{fC)f1pN6o9_{%tV<=cF++B>?uwe3UM`~S`xTT3yL=Y^#* z>*+mz@QRqi4liKn11kp0*e#4(3h0-@^6x~$h8=voNzvz4-mg+pW^DF`{Uc;Y?*FEN zJ2%m&JhfmI_VGNg$6%+6T+E|{Tcng^2}^NYYR0_hmI60HSN89=wm=p%dj95yBA=EN zm;pDM{qj!JWAS$jxWt^ZUKCC}`Ut@JzCvbyZAdLDmH?9Gh-mZ6#!YX~x2ovwq@b)G zk{I9|rf)U^=&lX+^{@R@Yr(oiU;*{!f9}zx}Ib?IE?&AEt=HS?X zbKqXr#sy_uQ(`(7-Ru_(?YMtcYR+Cp_5OERs-ku)_xgWVW}0v{OH}x~O%pi0en?EU zEp0l7ig|5C?y~o}@b%@xhQvMqDPPC(tEFaFw$r@9yd)mBvKobYcs(}6SSmzeTE{!^ z(Y`Ib;msKZ=yf#TCv~7%u-XN9-y*g&ExwX~_WrxCu0Ikn1;)Fs$QY(yXST^$C12MX z7+w|$WwR{4)vM6NAUSzU=gnD{mj>zp(SVuv#aD{O3P=YKL;?KQX1LP&wr_t204jDX(^@;Ow|Oo=sIVF+;yFT*JLehA-X)yaXK+w^;qZ?{5gybtnd^vbQ)$-1`29*q`xZ~9$A7W1fHiSOeL`6=$YFm1M;VC$Y8;bR~^|qOR0i+e=-oDRzgVdjwA)*HTzsc9i_r*5&nP?#&U(9{dL$a<~l(vCjHK@os zrn997lxJsXcXc{ndstZ(gJ3lyr_!|#nYn#-2+GePcYf43kBj;-sb&}~H`Z0HX5^lh z_R4P3Q&^qbtX~>Kir5lv5xt%?T~S9>d%#VYMHA}&O0pY=(Ile;>T<|2uoPejD-S4qJ<{vukuVVbMhzlpTPNlt6pGmRWj8JaA`0mW$@xnOZt3Q~`bb zt{>&+^NPZ1VrI>hW-I(+GXZg9_jv>(J%$(Ju}Y%e3p(ZQwtJ2rgW}@zWZq1;XJb`0 z5INmc=g$7uc~?Z7o~c*nAcHOi6!-ymZ@I_Tn}rsm74(gp%*jJ}I_;jsN^c#fQi79? zBTjyQ-Z235;tVvTbu4O&w7V9v^thE?^$dK(hkWu=P9mCE+5t1PRhm*x5ViE3*0TQY zf#Ez;g>_td_ghA6$QY`m;JH6C@!b~5mAYIYY{rcLI*v4Tcd6F53w^K3{DjN!aI7tX z794j(iK0wIuq)`DIcGYk;9uX~{I&rZ4_}y(76a<{bSD8qqLXTYT9>eTx(u_Oa7t2B z>Ry2?ga9FUVNQN+MrzE4Uv%vrs1Yw!|MO4wh_Ti@QWy9q(Y6a13h41FOFB`pPJACi zWfccHP`F4lh(C_y+y4ysq{W0ed8I6Bc%2+kWAl37Ex={Gb+f^8{l0}3J7G?v`QE~3 zf-0-U#S8GLRB!2vQRd~I4P+4ZUb{^|K^eeM{BRvd>20W54xGdA z(m%%#5KN|p55XgThn7wr1edg||BhDpfopXhsJge_Z&=dR`ahhE`9)f!HRJXQKMH00 z_=ayQ)&6dv!Mau%D}UMt%IpL(x#XQI}l0{^j}I*F~R? zHwhL@#0Vi(JqET)3O6a3UMaeC>UB|tEB!bYf`&h#s}cS1B!{4J;bJ|+4G=msA-#m- z8<)hx(NQ84cAUEv92Q$^QBOeO&?N;UxKKPL>jrFv=!De@FC^XvUV1+-X)~g}cvvD4H9Y(LbcoAP=WbmfCoAO)l`P%sI50xzs?uONnaR|2*v^ zAtoxphxaS8YWNGLZAs3(2Sb$Nu~)P_tv8vl!vvf8GaR+gjsTs`7ePAZxh-LGv-#ad zi{k1t+Y7njXoWB3md7V*TGL}EOb>3FS^y^v@iSmA;n;^7&Tzh_XZswv($zqlax}B1 zTBwBBKPH*GG#^}G&W@} zu6#c#*@=NE)xt}|Lz zf+aSAU|qqQ*Acw=s0!!ZjU8~6*fIFUnCd6Z|GoVR#!URFd~D9L z=Kc2(?nhQief-v=L+$NuJpQW#B(_0fM3kxS+Vbj3MDqPAfu)@P7Qkb#bbZizo1&}+ z=Gj0_53V})TUUmg#4UOfsE2T%RaTK9*$Cd%^B^TKc-l%KL>QiYJwi`d^!dDlG1s`4 zmjwHLc&O$X+*|M=-l0j7^hXeJH+GmSmRYYg1%LdpU$N^&g)FKM6S!-bBoVKGzq-0L z>r%Y8KI!m$RZ}+)@1q;}kzoIcl0{<;11L9}dN>`KKK#+zi`iBjD|O_JB^Z*-4;5OU z1EtTUD@%kC_iB5qZj-bWNb!seWPPv<=~>)VP8W<2Pmi_gTET0$>)Z@?6RS#D4fctjkML`9W1 zLh7kl-d0$WcVM`OtSMa$d+!B9PpIG>s6E)vhrG$8ZxZBGYTMoo3{dcwa|=agqxhxp zpqf1nLiE2hzK@Xmebe!31%HiUc2Ifn_U~QCPAubmLMJIay&7isr?g7FbZ1E(F^X5E z;LtQgc0_iQFK0ZC(L>I;#hdw3-soI0?qkI&6SyKLNuun0&8jE#CkEZ`SP1lpgjzZuWPn;2U3SvJ1LjQcJrm zYcU+^HJ4h+kg`VtsF%-W^}kNuj#}KH?fvt-j-Q5J$^}p!;o^JV={?U^oi!-=B)Iqa zc{}EsG&gj6_%QB-QV>0=DNAqCqcG{tidz4;J_dSCa}mMKH>Z7jE!Vh+_zy1nC#0-q zfEwxJ;lFAfFI&dD1_%X(5Id4WR;9PG&5O}O{Q7wy_#zbqtAJ7_#$W6N3n@`&Fcu5GUw@g41WpZ$? z1L7NSA40GsU-$xc!br9et5McVXV>XOFh#?1qmr+r;hMTfReUYX z(xAQiaKTA6bL2!+0)-0oGR$HcI}4i{mdXAJw?)xPKX! zk`Y0;)AD0riTl^y0w7*&y*P>(tNAXm;4@9Hb!sI4+A{Fu+Nc+_qfx)#rDm$mL_nr2 z=pmSvqRqZ$|2{`B2>4^P8tJD_sSiK7xDLK5w0P$yWETSA0-QJ##g+J{owPCF0 z``glT6oejhzr{m?w&POoF7)5M(v7g!LB_kydL#g)+w0$(yWF^3jgFF%KZ%{yzG0UT z2dB@m89V9ZVK6H1a8q4!ME~>l$}q#*Wy_ho zr7WF%<5IHZ*uNq1I=bT_h}0_cJN1?i<74tq@BZw(ShjcM$mKh{kv{LgMi9Xsx^|~z z3NQ_PsiZ&bZeqiaX`V@$y(vL_+Gtye=-wQOX>lk+`g(~!%!7QCvbQb@j7QX)n(W5Q zV!z8QlYzrVcX=Ca)PtN&Duk3h73Q+Mq#g4V(vi1Seyt6S_z)+JWM7S})$b9=WH`a2 z1S;kq+pW*uaCzVS3Tv0hmV}r7qG#tBMyA*gG7&Y>th@9xIm9I4xEO3+_9Lq}>0vZ_ zqbH38MfeE{h;c5NgblzeL@)~b%f*oa#LfDpZ1LV_dnm7nPs_{$?aQbSs2rGb^5MekN;so28wAyFV}P=nNn(Tr(Q&Vu%#)Ld&FH5Uh-nV^|mmq0~qvZydMJ^yU5!0EQ{yZx`6zReMaVQOp+9 znyNNX`PVn&JSR#+{T>N)lv8TCjAVdvo5PByr_mDNk(O`1>K1IsPV10BTND5AeV$@k zOO}}VeqP`A6a<}$r#E|vMe?`vc+m0|K1eCIx~m2ACbn5?+YAPkirC}E8Dze;qlW+8 z?eP5SGG-YUj=K_9mj4}ej6_OMxa@rS+DTXlTh++LxhG|bsBa@TTtd?-9zQ#p<$&0XS+}u2!!kaQ;tNta(ylpSou=29Hno@!Gh}GT3v4*_n*Kw!{A#KeXhVkckPBe zfpO51&?j&;`^brkYzys~QvsST4~f-CpNx8*Bpk+X-hq~8mA{w4)%cCZ?+~=4}skftmB^H~DYN ztgutr>LebMoPgSA!Wy6PoWVi2c19x@g1)p{XIe)p+2M9>-2{}vm1It4J z9H$j2XR;k4HZZW6BOp2y4x*8Yx-#+;`30z+=HXdQPxkzgPi} zRf&Mj{CQ3N&)sygPxQ&n`pfJ!zW{Sj+6-A0Xd!g9n|R_Pj=JyaTVL<2bOGZk4Z9}$ zr*Mjv-RBQ&p`VSn8b`nM@L>$49$-DS^zX*FrMdCR@qRhi@PIuFUP~fj^&%v;5Zw5; z^ECwoep+oD0^k25>8se?tEr{&)@snn)l3|d(S=R+}h7oc#yvKasewQ(_$T=WXzG(!^EU1^R#-F z2VtStpz&lrKEUsQ=__8v*U6>eH%9Jve-I0eW!f>h`xcFN?l&k>BuyJHP>I&CPz>z` z(gs;##UIso0bk_1#M<#YjbQ7%-)}ZLPvVj;D_KLz6&cRO-&C}9yi6uLXXgH?#560go1GQe4k`EP>tV7xV zsZ2K&nm2OC;viJQFHtgNIeCuxlRJ1`oz+T4TNE(u`J}48d_Z7f@#2`QWeRUj71{cN z=MXK?`Y3@3wWs0K{a+{Gm#c)PQy-Q}_>nxOWC7<(L&5#e{5JbF``rcY{ zF(sh*e^mF%hUa~V$Mu$=$eR!^-C{EEr+K^X5mkAWeE0!`4`Vq>&TBPJ_!GODbok4I zUyoRxJUE;QaW#m(7Gk*e^owVn$JL_-RFrQs;tWV%Z`uGT zxdma=uut}IQlY+Z*eX>oY04`7^}7I*1DZhydgzmIbO?q@k;XvXYsRJQ8rVmqcjuoU zN8qUJb!-0ncubRUdk(XmiHKAF)6H+I{cl@{iyLBrjCIjg6uELAb7AGqDOe&Oi;fI? zlQp0;be`k&8F((ZDhKN&Ez*gxvP+e@HbjFBF| zm+l~YH|`ojFC*HpEz?%Uq_GhcML?Qn+Uj7RU{|mm|FcN_lU#LpOzJJPuWPMQzE*&z z2}8b5^z1IureulgKGg^Whwu2Qt(Nf`U=;gQShSyP9q8Tx8-{IVac8tG*aZw?OcZ=u zpTNY(>PG#s3i~L$rF%9AB}iKKdBtoBi_Cw<5`xDySjhlujN23q(@pw)x1vW6;i~b{ zxH;WWlQy?5Do-+Uf6;vrP~f7PsDdwTe>ZxBi2~JTa}n$mS`qt+t3x^w^Zy}(x&OX5 z?huZ~Yy>60a2sg<* zNaoG~jqUq)@Hn3RHC(n@Ln3+gw*qAl%WT4Qi(Z_w_NaZ3k~V5xIr^M~jCUYj_|AlC zhB3ln?U)K0aQVpn1y7&cn_abYi(@}u?V|V4C76L1Z_bE#yu z`S!lh8MBURa&Y8X+X~vKmp^c%k=E|&JR!xH0gqqd7(opz+4+sN}+B9)D@mQO>s4#5|L?|ML7!nTrRQz+NsDku`r(=?Rs{ZnLGd5@tSBg^hCE zN>1T=ZFVMQctA0m#84ps7^8$?^u{73ObE9>LIXM~p5oJhu$Ja|>kTr4whkm-|LP!| z(ul_VoUA+Rq?LC}Fx%w#H;Wh7X4~fgJ?6<5EXri{ntf}Aa=v4Nw88smd+ce}_>UcQ zutVSdR1=UD*B8EM{_0^s&kg=2r4RKYOFWLsy$bKFiea*V#Pemkzq7yz5G0E-FP$L8 zTP{F%z5Hv5LSmX}0-0~-3JJTw751wvcen#Ga8>crg0uQ4TWui8;|5+k?Hmr=R_dXR zHisW+i_F=3xSI_3J&*9QjVh+6=XODrh1?XkM~tW)_nS5k-e+$dlJU)Y^{-~?NJn)9 zq=}NIDSHAFfS|A(&7#3u99 zHisG3qfI+-v9_sqUDWRM@2w)?-L-Z_vcJso4XU>;f>!RkG*AmOJ`8>f^03QK+{r;~ zh>RQr=c9^~jq+sB<`?cFU7otn=ft<`gV%xbeq1i!BTTNOz6gDllpofc3-dapHJ9OgFA(+p=?%>*#71d3slKV%N|h{eYz24Lso;^EmCg! zllVfDdm#5{-OYr`jYRRPP@7C2uN=MuMK)$iZMN0D=NL$0zHsfQ2MPPK2Fu0NmH%Ec z2I#ShX2sm*i=#cjf);xJ-Mm=p$JBhquRJWmP!BZaXrg3TYP!cjmi1_SJjkSo=?~w% zx>u4LIPU&`giAc`xh-*x8_Mu^GS$MJ=`yYfQRD)Yg1Cx>gqb)d>;*_%y6l(I7nWrH z{hjIKlyJP;HxmjCe)TbvdjoI*D3h&)D)Rp8#|9H^Ja++T-D|-b0@6B}!?$;kSP@suVsUzJhoC z%>2zr7zjzzOEc+VC|NbG!=m8J@3}Zz-LRm*xjVHitqSm{S4%IoWZFSsQtfh84){AE;&ZGoIl2A0(#C}gM5`h(e?%0Tcd|9zsSdfgG zXRRa<0ZA%W!1yNfB|bJwq9d~$qognVMnXQ-l!SA7b@hfW7BTc}4^I0@iEwULK3woX z2w=(t^UXXJKyF4n(zJLmU-63Y=o!0LraQny#DDbHN(V(pZMhK%^HJNfFO17B? z>q6wZU_bXXI?P==#&m+I1K&uDtqqjAC)z~r;kqa)61FY)d&WSA&Z@IFR43p~OC)d@ z@tgZU@R~VEY2(5BiyRTGN?4q+kY+?wLgTPFHQ?>LT-te;C)I-zc*WK^vQK{K{LZZ8 zkPF+QXwvtQ7wK*c@wp8j0kedzN0YoDR+d$Dc6L*14UqcV9`gIQ%o5)(pzi=fID%1Y zFujPsY{DeRed3yzjP7ur|2eI><*JJ@f}v{~?4ODHh~3+q{_l<0y!Kdz0P*1Y83;O4 zsA7Hu@nb<(|L>mN@PRo_P0D+(BaLj;Drfg09zidaY zlK+#bV>2peBOGOM*lk`VR?DU!A}`JSa@D}mDn_Yq2J+P^k>Qrfq-~pR`Mt`#%$_n^ z+ZV$#s5g7)%|bTKFC>Q)t|nl#Reg*|81sbHpqOm@hO81mCceKUlgS^T2N378KdRhy zv-ej$WGgwXbfW4OX?fcw+bWAUe zxgyF-<&6H1ETA;m*4UZZGv= zSq|Z%hP`Yvp_eI@rw_e_=1+OEqyih=-}$}=4(P+ZSP%IhFfkBpd9=Cu)cwmA(?Wxo z#iKq&@~<-ap9%?0?}Fh48t{It1PldJ1O8vSKI<2&O8oBhR!;YPi91#3XNJOM3Vu%L zT-t2a-N79c8Zd+_tUXxfQ**lCGt=Mklx?x!Nzg9~aRj4*l(P!edw z=_eG3Xtv{Jq~epjK$#>!dj_G9!TfVOUIQ(y=B<}RAN@T8MX+DQKiYVsvTxdK_kpyT zHF9m_O2m21Sa|NeE=n*(sVort{3tVBXYT&Q7DGHm`tk)HI&VZrjhIZV*GX%3e!A1w zHOa&6>q0vKHLKLr4|GNjPofp8ar~k;^RsUulOf<*{;`7iV;Pj?xUD_d{dDFoBSFjO z>IdV?fG};J!n^p)1)({_VPt7r_SL{eo{%Kd zR)%-_3UI6nPjgkJKE_|V;_%LvmhLWS$G-2{Xsh0I+eC?xL;A+$v6jr;cGCnt^gVy> zE)DA$^~gsuaJyUta8*D|h6f zPUmizzH>g}nseS9{Dq%Yis&x~hY}-CxreM@X{hKv6`x&M`yypaEs!VzJL&3BNiWu2 z*9wXZLBrB}cP?AgnT4>(A>zA}R4@x6r_wdMoCd(le3COj_JjpmAy$(4;TN~s zG|!{iKeYc`ucKlac`YPU?CF}a+Za>+XkGR{?IO(ybc?a^qMg1ph0K;Pm?MAFKLl{jW{YeeYd?~7 zX>)JAhYq);WmgmwQ$Tiq|3`VBg=`q9R!b=#Ybm@{ZK@K3Fyeu-0 zY`9jsKV-lJdVGn~8pN@AsUpPqC-z&v0GyT1bDL^9F7&=lGvlcSkD(}2;W>8+62Na7 zY42aF_zi=26JA1Am|xeUM!V|RQiK}D$#Toy&ra!Yp2d(ugcewy6su!aWIgmVdkTN! zA^~ep8-;t7htFL&v?fjEsq2Hk*gT?1zfSr@+#NWVR+(n&>;;Gf*ZV8j+X>Hv+GV(f zL^Z8&k;lV~yL&|$q-~NjS2ux+FU~xKa7#9z%;&?D4e!WoV;p%LB>p`nS~~-8zKz{V zKdbja4=4Y~zOG8F-_Egjn@h~F>HybXr}-P2mpv;qE9GhPZ&u6B#qaZp8Gzf|QqQ0? zCvc>Xc5SzFiJEI@t9?~rt3pEixcC_lb|C7{){tt(LA?3+jw2I}%BR*$fsQL1>_Gk(+iGJ;SBL!lNfcS9kCiUwlRM`$pm77pf zIqb|2La4Uc;ygE!u^gP$k4q*o%PLm0K zY62I3a5NHl@Yzp>5A|lh6yRK2md!0WPg&rKP}F4j1J~hs;U^StRQE49L(+1JZL&TN>7szuvmpe zkJ?7R!*#I77P6>`nosQOhzYfkXL+@Ozp{+3$bctE=*8tt{hrM_r7=0=p_7N^ZWEJb zXvt6DA9W9%&PxWQIE3~jcH$uzS@)*lH7ZcVlwcmN%7;(`Vyvi3a-%Fsh1VH9(A%L) zPh~uUTGvv7MX<<4{gUOx$O_XpC4|WnKMZ>pO@RBvDA6Qe*aYv~mthEPLrx--G4zI{ z@loX%j@KrYNuSm@6K1RM5<6D_sl_l=Eb8~HY#ttzf@GPHtu}Gz{L>6M7zk5gUBf&l z$GnzsHa4Z3RnHjpjtlNg1P;j>$yNsQt*44sR^O{UO&7R;{+L43AaG+0yr*%Xq(=_p zvd0BC0EjE=ffntRNFN<{PFs39y)mjzx(>OveY;}v-E*)~HD+(RYo%`H??4kmR+j!e zf(6y(evuG$n+E^k1OM8X`^KYS(C%jxu_yXtVRCzxYh_h?IIsQeE?UuE4Mvpd8ZhRE z$4T3#6%l)>C8-CRf=F_KP5qQ~d2mw?ZeHuhjP_vtUX7l+XX@TbW-Bq80#e}9|E6roO-{u*3q=J^@8UVh;rA^XFjPb@ zPx^JtEvuiZHLjun0tJfJA@s{x5&e>XV7AYScLbY~3&Q76-ogq5J@`8LVMFEL#ux~E z0Qj`KM4<$RJG$n)x<<2_l3rC^1oG?xMSPkarg66S zTPiaY#j*C>P(JHJMX0@Q!njKtNH*qJg}RsYH-X4N#Z0rRmW+U#89&5JOqARNRkk!T zAKv+yf4M+>?n|O`8?R-?7`8+_1FYo-)&K;9`($)BGqlHL1ZAM3<~4lLTe@V7+OK{s z<{SLpX{|k(9O9&_@=a!B;3~TdNF9(WQ;|#$CLb4`e`#}}aC2c1P9dEvgdVJ?Rf3tF z&Dtz*=1t8DawX~u8ltmj@=5?}%7VUFh{2UwWdWEO)5|Cb`dhjM|CWZ&)8XnLBOrx( z<;Ce?w!a~o12Sk$HOm?j*?lA4AKz+wOV|Mr5?Y^H^(wWxN(WarVrx#2JYQ1bQ%^J$pjsI-2zdRU1}yw^^soCa1}0(x z>cDcS&yLoKTOKjt=zhF)w@lfT+WOlP)t8_!IZLy7vMnOk9oh`UoIf#=_gQ84q5n{s zL7-AD454E3^uuY8^k1r#3J69#?k(gv0NqWM#Me8GO|hzdaO|n!rh{f7(}^!l5=-_l z8ALa!-;EI_!2!475#u!nCOcu78um^wrSKj@nTFfIaO@tsm(3lGQVqebB8jf+686E^ zFhwH^91rrLFYmRU(eQBvpyJx2c;DE>O5Zu=ti(~Zw&&w^MEor}?-2&}2bP~x{2op+ zuN>H*!O>OI>K`{Yq}h%GQ4Ut+?|*g=g>rA@8@yZb1JU@`^pjJk!=YJ#ly~H6Jcjk8 z-dA!d`FxboOkXyEvLier@?uuN*X(TqILWA`7CKh{`sWiZaG&@Gtws?^SDn9x&%Mu+ zASyn>i0CP!?Zk_LV5)nTq+?D{);0e`M|e&}Ls0uqyZkRa!$3)Jy-TS!{n~ks=EXUq zD0RoQ$t~U%5O`Pa8j#H0w`J8r+eI2!b`-Zt3mF_4;3@v?qqDA_alum^bJSfsWoxG9 z5r)13UA3$YvSOy%G7q!2z@h>zuR+NWZJUIgUM68p~5e$`=29DercP(cJIrgV$lp8m$DZO6Y9 zu*rbo&?k_BnDr1Y)v*X3^XZ8(fu*OWJ73@Ed%dK7gaBxv0A1Y@>yV$MZgPFc*QNUt zoo#NBAq=%Rk#&oe0+NnpCXzkvtz??{GBQ^}xdyIw&1KTQ=Xuux-4;JJ8fb%&zp8E>1IIk=TG6MiwAkPUw#M@>9&LI8(?+L! zgbfJ8FFY_lck7C;#j$BG9DX|@GU}8jrY9v3JVBA1xs$c5d*ZI4ZGOJ{WajQrM#eT`M{Kzpi&~07EqQ zh-Tnjw~Vjts<8yj4!n)>(iv&+;BYQ&uzy+Bj2YZtS zfr@Z*yMe4QjGJ8U-k*2X`%qlXMXK@l#^b2~D4Wytl!NP|rN>1uagNS5k8#`gXCOkQ zo2KKC201|4Fpa_wShxHo21$-`_|XX5Uf@glkR!Vn?(`wI&>S%RfuKl=1nGi1ZC8%C zMo6oW1Y*FVZO@kM;fE;nDZEy}HDq{*%cbQ`qHaHgE*RxK=c!>40f&Ie(!6 zxKjLm_1P_W0qME<0qeReLRX{d*BRB4;Nx?f{G+XJIFgh}aCl`AIwGkLmdaLyeH7Ai z7VN*jN??L0$#Z+b4CNZ`lBy!(t#h(k1qT|>SfSu$v}ZXUq$fG_7b(+|q+DZ$Lajrb z!iuQHi#X#F=Q|=es;+rhDZ?p)abOp7$_|S9qh_!0^Qv)(9-~DLp`0xhnt#OffwU6R z-=7XxI}7Qkj3XJ>#{yU+R5g+Rnx(g4apWe^r!o|#7D8O=x6j-2_@m7OxBeP@&o!{N8HsBf* z_CS`YGZPB11Iy^G#Lw%P3cTHb;=mXUKzeeN#=ss{Xl(?z1K*K)eo`N4lZ6>uC$P76 zX9!wKJHtJbk(Y+gq*}M%BLH za=ou;5F}1r7O@TxEo>wk!Ohu8tvl{-!7}kHRT`v*{n|A7ZMcuZzrAc!7sE033panx zsWq*@72q0fX^}~Rz;?bs{?Wv;?W;R1iF6P`R!`-y0hl0j64M-VJq9B~J430YQIzu4 z1GB&PitwL~_kZ)a_MRF0k?axX+rq$}{;?sqvN`w@G`Z4z?aSyEMrL70ei|*g>7xe^ zl5xZ=H(q9zr2g3_2L0AaNLjSd-Quw_vhi3vJ|J6Hp(j2lVhp$dq)4fngc9bl1&Js| zoKRD9lAwh+c?S^6(`ftRR5oDw&U=uTFU!GbDL^};VitQ#}8n z|7y(;#;uMbiHao^O5*DbdqA{Fs79{jQ%GZW&VdMBK@NA;SVZ68Hkk6(X`{qsF@O)} zjGqg_KQqax+2dtbdTio^_TFWA_)giNBd&Dyv^Baw4CeF4KB1^h_zljIWmQC;tfHQ0 z*H3CtG4^p{R*TpgzQtiDPBCDN?#lu$qlWeM(wy+c^^dG_@(K0W4S88nj$xcE-BnXq zwzrH5>LX;;U6Ufm-fBb}Pd_yN<>$unbun7EX{mThy@+n9HC*X|R-LriR;G@l0{E?$ z{y$%h&-X>>B9R*MisPP`-!95qypeAI_ghz+NQDcIDW(Ys6-UW57`Z2`BOTy~#j#X1nzGQMhE!KhjY*tCoG< zf4yI%hE}4L?MVq19*R+R!kcjERTDK?^8=#88o*7B4SUr9SMC;rdD7Ncu2oLqKA8P4 z)vERe?pvL%;STkI?;p8U#(02y_2XSk+c0n& zh1P?wYrR*z93%5qZEUuC(8?(u$DdvHB{MPKX#C$j_-WvUyhv1@NY-q{E{+EqtO83d z+ET)PS=f)jq>HGldPQHY9x~3{t*P5G9?PeoNzjUJfAC( z*pljaJtWUV7Q$jYvW8J@yb!cqVjkNWD}0!a+@u-HlZ)Ddn>OU1*lgbiQ({hwlbV&4 zfM*Ik+&?~NIT`awT$#FR-PV_RMO;09Tk^-3VB#U{D?($eLToIB3E>XrsGo#SsG8cY z(95%!;dBphKL+CcJ7c->c|rnuN@H8k+PaU0)_ces`MF-N9vC;@@=(9aVH~aB2#;o+ z;VSa*0?mGq=y{(9j9(4YBjJi3LKHr2Qw>McUC6|1~5q;Ev^_t0ez_TjzX&b1GY-tO(Vt)}{?Xaqt4u#gT!0 zTE`0CTupDfRitLL3Dz>YOBu3(^oS_iA!ulbB8a_Lt9%5;YFiQ!7@Gx9`)z1JI2Puy ziwly3E~{bkjU}utL)@x6N?>#blk5*2Q{UIm+ssphZM8gbtt+&POEc+L>`${9(C z$vDw@Pilxy0fc73doTDN_r!S97_Xfd3UG_*BNA3+`J(=T?tJxG`du#T*@KZ_?J4Yo zAzS9VQjmzdq}O7}6DNG&`2LjlQLn2H`|H!DV{MaTuF76aJi>q?04hUHdd8uzO|Oz_ zZoojJ%k9_0lC)%{yo%Q4Wk#vMk2r^IyK7l5`|S~p8>oFtg9|G+w__>>eZqQ0l9Li+ z6%48g3S`oOS{BdWjPtKX!|H=rHI;q4#}z;bnLcFR!WK*i6fQmXftkn&YLLRMHWRjWjO+$SI+wS>Gy={q;Y6QC3RJcM4uRgK4u{O=Ck*gC@AMP=4GAlgO0 zzv=AwaRZZf{c^XsNAfE2QYjbJs~x6F_V_rz#p+a_>`fTIL-VbBFJe~qdjzge zD9gfa$c^2}qO$B9Kh;Cf(>=ykteC2oH*s;2bqc|-a)uNKzVWcOTj)TmXJ0d5w-^wr zr$MgPTivyx=zEV9_YY`?X?w^am6{~*I+LPD)q=0MSC|R&7j9F3v-P5auZl#4&yO-y z20j1B`=*pITIi*aeX!O8fuYCzrXGk`o> zE5VFJEfBsP#?}>Bgt6`kVp2a0zG7ZsM+dI!<(|%_w<8}Pp|*SRVt?0$ zS#0+F^=lhNnG?ho%+a(dZtT5Z8TVM$UrMW^K8AW&egcm~iruLm`N?!rm~OsQf+FFF zBatDGs-4LhjIKMdZ@p!G>|?CgFeln>e0R%3V)(fsSlr9b3A~KTv+`yvUzjJ|rRLLe zZ&5iePLzG0B7}reT-%VAo1PrPsMcnXSU3kgh~aDV+_~_)>f$2IR!ClH54HQ$Z0ntM zQ3YqlxTVh9Mt;zywX;E~s6txsiXUxcwhdbDE@uS2=Hs3X5fRcB5{;&f{fUn=!=1C# zRJM`af1iKE{i(M+C>Y@+i4;n`kXp~XevTYCC((8(W+z^`IaP_bi*CCD%)Hjf3*|@1 zSJ4mpGyaqDW=(A-U7lWSE?3K6=(brnl}1Z7Sh=SpNN+{3o)@pcz8*c>P+UQ(BPJak z@2~r{WvA4SZ8BXDjKdQqj>SMk5`^YKi9{U+!<6mezgXfpoH+w>gVxtV1^C71@@wiDOU-G_O&ThlX2^#81Xlh6bs}?Fj za*g{uM1!e*noq&OEcSeOaFO#j#QL07w%0x4zs;sYrn4FTQgYq4$#po!+5nX+om8pb zQyE$8t$9xFa6}!1$W+j*_BQYr_AMFB|IT!4YGkXu>6Xdw+8)XK1-cJb7S?+Q&f!N-Z<9lm9gF@6$`uf*M%ulgfO97Z#fr{-ddgO6 z=7cKg;lsX1m4=N)7rgcLKXXFNY~0Zf5TQ72{-mTtD3)5+(Nm8;6}U@`Mm=Vm zc>UwmT^;=fr5{F3txsYfPvO7NB3SBNomu!QrO~lb=*%JqZ@;PH_x8fNb6Qv>Q6u%Uq22G=KuPfmyREc{WHIaO!5JKhb_-*;h z8%Bz+La`1B6xruVE7?|{S0>QzU)A=k`*WJwQJ-}2)8?c?8gn2=OPuXn8pP&NsL{mL z!ZdyODQ8|yT5R#J2y-|;%&>K6v>sMw1GdQ7&UQwKeP?-{;PljN$Ez-3XoT9=qcepa zL(mD=+*Ev2qf5ckaD;Uc0;KtPkrN2L=QS~!l(SYpn!KGQv)J2lB(bA2tJfJn={fhe zYN!znlIWPXeYTNU&{{2OhwQIVN79BfK06E3z-avmpjfFMwe&ItR4VUnJlhf|rUx3| zns4}3@~a%5nz1%T>@O;1Y&_YMq&YL4r<8^iADF31kjMBL!}U*>IO_C<_LkI1k8vA) z@8Wv@^Um5S8*ON=YZ1(R3uam=arWwWZLzxOvbc`b&32s#&PINCT$5|Z$7I%X-Y4FU z7E;EsIZ?P(_tLzTQM{CSVQ`sxiP9wZp0#Z;+7XN9je(6XY&rYx#l;V~+Of z;+3sFO3#Q`49YG&5rKBaW?T+4-5VQdg#5aqWAL?0q`9Pba-^Q5gTBB%uxztX)l~a$ zKGC@~sU8YOcZq*UL0!(}g{tc0)FZa_ZtOf*8@dKTEZrq(z3Jq2{-lu~kIa)y=X(=9 zO>m)wy)zge!nzEa07c>MTuZB+BY;tQ@l-wCtEGXSt!g0e#3w$f*VFc&3CHThfbkkL zltj!*wfdu4VB7T;7IG3IqYM=ipAB`hX>Orfw;KD- zq`IM(>n{|$l)lO*N=-s{#tnEjvn|@uOk$bWfm0ucG$B2A#ov0&Q{3pxz1MGxXs17# zHI9tmk8aKU7l&UOv!|UJi+zt#-g^qhDu&UR^_ki_k0k8T`{;+Ant4k}xovVS#nfbp z-y=8d(+u^y(A~d%xDoRQX}(uCa`g_eX%Sq5xX`Q8ktpkyl+?f8A1~*2ouLy?zLJ}|!sSh|r#2sktVQ#R!z8S}imlqUVtGgY z>I)3&2`*i7O?(7ToiPksH9WF>f-p%ke=@5j#Yk*3PEI6IwOMziRC zr)#3ML?mk-!_;>Ts!!B`E~9(e1>8mSX9~SWjl*6nx0fVHp>nce4XIPa+q%;;Df^Gl zPUDiMD(2`{4jM;i%t8CWS7Y{{DCQSyE^B%-3ib|{43VxJV6HyTzBBrO2dS>(@-i)9 zy7%~Gd7pcwOjI}%9^pp8-J0k$VRr@*wc$;Xgv7uoiR9G}zy3WjJ3`?*Rue-BEs*V9{$wTtv6i69X!JRXlF zM!(xGuy0`MJNnW&w>pPgZdBSl6viSe5lIL|xw0>n%Dw)O_v_8!G<j5ZYM-Hb-c2? z>S890?xOlt+#ez`m&dyBT%82{-MK8gU?r5$1jD5roUNtigSz7anoYhWv7xaM0%^po z2#GF`TZ7S-rX1c&iybTtxK$sQ47q#$Y{#4Hzm0wmo!sh{<69ma%O#1rq-h5)_k2ym_sDc5oAr|l zy`QpCBg|BrGh#;&{Xkrt8T=qvPEujpI|=bYEON!t?t55PI;)ISuHgoMF}+SqzLeM` zON+(i>|^Gnz}EC)H_d>n`88ASrga)So3@AgL%O@nV>mO}x%>;08hX{$IMiaoLJvft zj@ZYoha|L=juA{wBXz+<=Vi2(e61uiM6jMLLsOZqRl)*qhfn+~5OkdT9U!Luamf|!A$ z@2vLGw7ejb@xJIz38JnuJT-2;#a)BB`fAp76YkTNHC2&z6pw#Atq)q8Jry*)!(0ek zeW{`%W9Qg4kVd|W8^iE4~7!WO44dZY0yjQ!PLcQQoz`-@9LMHW0-ewjBn6V9MqGj z^-wYigN$+N{``sGwf8!?tG3)-?Kgm@MMc3?a+B+w)YOmA^nP+9Ci_`#;L^<+#vT^tlD337nnV& zB_?#u>%6DVPw@vSa2Iv>eCFC)^zOmmi+K-5c?(O8+d}UJ&W)i6}JCk zL98t&TbtRs92+40p#;}R%0W@W0=U!erhUQeMu>w)PhoB4P44vk2L!!7V({W9B@+MB zRoM|)Ds7})GS!pHIif`E>o2}xMICC%)Nmisln2RISfpu+i{{-F6Z%LTkZA74mQ!$|h4w}tJvdPh_P#_SxwZke93 zKvTs+5qbM^&=xOn;M#kY#1x}w zECrtuVd+u!aC|2{(dLZreXOB`*D@zcy$mx{Y@;TT(t5$5aLiH(2|8uDNdyCXDSw%` zCObmOY?&lcUw)zgF6uMiiT)pZq#IpW@$Gx?zqzMlDvT7Gt5Y08 zyr2+eR}DK_xXp{(HB0gwx|xmFvr=O5b`fp=y*OlY(huW~Lv}e!jHnbXI_y6A*bS0l zmDaCWL>^w8$w(seYEc9=f|aM1S+m46c??_y&V|8D(WT0OF|sY9NGY8$hbcFo@60kf z*;>?JYSw!yyZ$NI0Sp9ML7ve>McdEWJuJDRaRKcB508NYq0|ivrLFsr^my695KPDK zcuPcDjOfZ&p;>Dy@^yrd#+&h?OX6IL*1022RG&w(>hD?z;gJui4_`Z&gNWQc&8+ww zo3$G+7??o5H^pFAjFKMeV=8b>jk%SppuL{6ZQ?Pb_|4V=)&uI6xz_#_I+nHoQLOoU z2~Dx%mo*ffhmcMk4@jd%H2kLXh@Bd~t?PTcR;$rdnv$SrhdMVQ;9FX@Qki9Zc3 z1P(c`OT_5gc?I#}RJ_cSKE?)N(f_b%R_Zmc2Xtfp-X+>l8m{nMTtb|17WgG4tjfIMc_ zN+UShry_?8vWg;x7YOPFRql_{T#0b|0vx0>3Nwc&W|>xkPjfP7mgRkbB~)qL`WoGe zs13k+IIeJ&=V*(8G==KVR~D1*$fC^o6rrE7y^H#eK{uK;6cn^;7uL;tD3|@MglK!l zYe%X7fZ`!ZJ~cz@W~9CDh##c9iX*04YOviBS8x-N%>R^s6TUx09s$^9lnNHxyf;$8 zg5a6{RdArkPlsQT<3UC&b<@v=q^mvOIJ_uudIbiPGmvl=9e6&{Oajv(%nfy(@t-tN z(#F~A3n{)7$)9lFyq&qZHc+N~tuXf#^2t^^w6 z1St+5j~c#6>PnRLez3D&amwQvS-gcN)K;)yvxt~@70}3D{_-0_TT&s%(0+wHOCnYY zF6}kCsTQdLIqgW|TPZU_?szG`Mx^GcPt3M21r{vI6bAGy@hc3q6=`xd1zm!y`I-Ul{3 zzVFR5BYIj$te|%5g&Z;S@>D<^xb~j@`)1~aqBEYvnm4Vgd_-WJK84kDws-MP{;utQ z$p24T?F3k#@t+tRL`zdvu`Wtoy-42zc&qb5UU{MyK7k^fH944V?;)+pt$Q^;;w~aV z6~jWwG{|DS0Del?ECTMZ@@rkn&lGweDSai<%=k#AIqfxeHYylHhoF(&{{`_Et z+K@Z{ny#UBIsRwB8;Y{WuQ57H@%A>`&$CgtKZ>9bqs(iI+vT)uy;XE4nLU9!!$(qM zsP$qO(#2pvpqeu6wDS5%gIBws6g$ZcM@Arf>59s1e~gG0SW{7oNq5}=#K^HGpduHh zpUUZEPAJRrfkepr#=7s`X!Mh|L97Op=Ce?Cu(_f5XlA@Uxpe&J=etcu!@OW5_2aNG zGQHA_o?G76^H%Sa0B)%`L($i7hr@4a+-9Q4cZn8H?|>|k3tjC)qKD{D-S_pa<+iH@ zW_LeL<*&jiR(|uYJSCJ-8>Dp<9lNjsG?R1`*gCf)qlpBLDToYf$KAm=UPZZba78z7^=|1!E7W+T0EuPem`gW*Q*7&-MFpuD?Y5b zR!nbppk^lDXS=5MtJsmy3fzds3 z$fhjba#~1rVC7ts{O#;(Ub^IiXuJ|4>tHH)mnY-oUBcOjgbd=YnI-E}8WwPR)$$ngv0cA9t)?u#+3|Uef|UHR9J{ z3AZHxMsDNm5j#kx_5*u3m>mRcXMz^qq` z)7MT++6wTw!5prNZ-MVc2QWR(2X>Oy%kK9G$@B1I#pyS%T)bLa)GO8XJupXmoV(qi z9vG0yU?QvL2HB*p9LXsc?m7b&%h(X)7^vx$9 zBcg_?y;;ELr72+uNaA-`2EO1u{+ah>I*jSjS|Y(OuqL6d%~=c1!N`1KwC;}O6`1h> zm(YKq@zsJo4}4Sl8i{xh)@}AT@!R@zK_|**E@|bu>M_>tOEgKnw(HNY#wUK$O*u9* zir(vo_*OS9*8O3ImHe}^!GKCw_J;a&91Vs#%NU##6%P9xL}ffKci5>F7s`d|5C)M) ztLwHCc?EeFPF=eUhNoCgMF(X)rTzMJ!DxNSh`PgpXJF`1XZM{D7pT*6<2N9Cju}2Y zW0xOEPlr;ode?bg=$q~2Z?C;1S3>_au&Vp4Iup^fw3<~2g&g_VVWnU8wcH}q{Mc3~ z8r0Kx!`aC&!`$&M6`yxON{=3?pKbn#Qj_WH+eTGZ+})s+vN+gwr8Bq4`5W8V##umr zl~3~vheYLW*3uPkl+ckY!S1FkT18Q`D(AVUcU+%?AkB_G?f~rlDO<4PMMLYPE}*c0 zSE*^X%lcI8lv~wiC!MSzfVqF9cyF{Y>&XKLG|GHnpYtUSz4Wp5`Rnj~6{_99RzGfd)%w5PowRBD zuEjJ8529flrJEs7f^f}N*&yCC0OIU;st|J1)BU$;KC(G_(_ebXTj)hjpgTwoY2}x$OCbSU$>#3d;w%Z=gXd+Iz@stz?_M@G{Tfmr{%|5=GE~<`g4^9_wdK;^4f`B|^*7OaG6g>yD@T|Gys@ zH!5UAx<=VMqAnRx#=Z8=E>g(2RyNs@QPO zp5vVJJkOgwBt0qnasL)v8mJKB#n(%pZx37hy#ClvEvcy@l#KkjFHMgo)Gb5f&g=AN z)z<76@EuNe%JBDQwV2FlX4l>v@<#L1JMp;SZwVG1zcYOynq)(3xS^ytEVMX&K7Q`( za~lLtH*m@hpZ>Km0ZE0!p)P^-T<&SLV%U2SKmn}#rB8Qoqw)f5f^uv)8d+rBXZ3cE z7X37K>JM-y=Y67VdMzuUbe?xqOM65^m~19Z{67OE_8 z47#}%I8PS`u%mpge zi*N`9KXFv_?Z5lU9NHT2RpdTsP z2d1p6yut(aoDN+u5bqY?u>-aYc{F25NYTzD{*{>QIj>S=oMSSL!Ef!sI~=z~z%cX~ zuRnQYmIYfhwxi%*ax6~vO~!^eZ@~3q95ZEA&O0cfpQp=vpqdWKEb{Q33A_Y2s^*IJ zm;@?Gc9SZcZsH?csozXbQBhA-wdF5)6fvYg-_FGujv*`HWahM^R09H6{FBniQxcq6 zk&9ti9q*>@ja0L&C%=&oscv_4{xpN`^HTcU~T9UE(C{@u-ftMndf9OqzmA)k< zqZ2m(CF!T^GAmIPL&bFV*YN|05`G_kFtOG?Ye+=8SXCRa7Ah{1WlW#P8pPw;HdR{R z=AY1e*PmZn$#&L#F|luCrN+HE3N%Ye?v*?P^2@T~rz(5YGil3r-vq}waaowYn>5BP zk{xPduT!l`8B6P!8g*mUpr0%`Qee%OBy$|t3)uIKC;Z4_Gt4nEaTz&8D)xKAOav+F zhA(v&RP{^rCb{ycPj%?^*bF<{)EHvZHfFzNw&4}W#N?r~vk(H=(=44v);KnSrgUM7 ztl=>*y_Lexiot}eJMl%9G8oJKW|<{WYf>C6qZeMSY{LduW!~0<@4pJ_yf>+A1=Jl* zMqQ)a@Z`iMfIY2;WYgV1ecNwRCysYyB=ghPB~KKKc^x#8=vGsFByaigy{K4{*D)yV zd(yk$?nV3z?)}~Ve!MHC*<)<>v>7=l%+|xiq~7{(_(R0f_HKw4e|)VUwH|yKY^#|6 z60VY~HdI)JYb|~{EvVv-wDBG6jel`>GXe}KvZ_`TFJy3>E^Wmn zfOG-#R5Qo~=DOW;6BK-KRj}lb$f0Ox>;7)IO8kKL^hHyuAXb$RqpGE(3yyiwbk-S@ zX}@!NerPWnNvkC4qO7^ag=UNX2Rdr_8D}uOYCml?!}=tiMPg`iMCMPIp=|D1J!E-irH}M={{4w#=G1*8>NIWty$JU62T^Muj*`#|dl*0yU}2e-y_xfjT@84}ucbG1+^{#gOT z|G%Bw1>?=k*d#Xi0kleC_pASz;rg!?e~n^!mF&A;n{ySD3+g??z!_g|=AKB^pTG0q zeQTbf?=Ww=@5%hqdOWy-bJK(m#v>kXBdaq>lwA4q!WFic%ldZ_$w|GxvWwJFzWPh8 z^q_AT9JSCOz;jCNnNq9?Co&VIlhVqaQv~>EMe8lw*hjiK-i5%%tLLrnr_DdoO0&n0 zu^e(o-}UeiCJv3*EgbS2$u3_ERRN2?14-EDdo1A*=9`6^$92~1AeiOaJRQF0L8-h3 zv8;=&c?Yg^Wa#`U=#>1`?FpUm>)_9@Zw|H#g=Opyy|->Y2A!->1AWTKsz$Mm2zD@G zoRFq~k`UqT)*!F}Jc?QleL2$4f=MBxGb>Zpj4fw(Z)E=oa_&^@Hxr8*#{_PdOL&|p zDZ#|DzQrT8;PJsK^-mr6T!%z*vwko=IvIcAi$%^0tKIOXZXhJY+!=8^ZUTIzh%1~9 z`L7HNuB>^XRH|5#kz`R`Aeq$nYO6A`;RNk3l&aoGoHQ;IJMWSl+3(oDu7?rEv!4&# zfY>{-8rU2+bq?Y9?qIG5#1zn9K=ILh(da)|n)P~*U-GsSBM=(^c#-VIx1xU<757Oy zsLJ*DneD%OQt%q7&sA|PwJd-rdRbF>KYT4tHc^TiPHy=xnucry@4%kV#6PO6d6e;` zaSlEy4PCV+mGKclS?6+N(v~^L!BwhG5QAh^Tlzn)Wf9hmKi|ci!WLcr#X1<$qp#Gt zCPeyNu>Mh=hN>Sqv~j3 zZ`MxqZCg_bNvAG)g$k#<$yB{SUBH1-7_MnK0eI6Og6G7^I795#6psXLqZRua7et1< z+QH7?Sqxx!M)}0<+BjXEz&dgGepPTdZoL~NJ!wR7o*_aZWX0TGVdaf@@dz9ox2bpv zb4It@@-31_(Jd7#)h9OJzndu96rWWf>ty^ zv48#+cw^4NX9p4A{Z~9t#Kz#e9Z9W^=sX|%4uNi3D>?PcBlOiJ@8s`xj{~$Tr-Sz6 z$Yk~`_mUt~dNlT6fHh?77qj9L?K=r&_6@GiV$PonL*=0V%Y_bPrSRmxIM{GFurC_P zu){NJ$xAuUmRwL(Z`^&CxZKx9lqD>1n2rP4y^eF+5rd%ka{g7J#!8s9!6_-5=~|}< zf}&+Humup+o&aqh-0-gj$_$Zn>-d$Ehle82A0&yvyZI%7@^NsrG*%}=7M4o)gCBGu z8G-}8KO61(?!Y)Gj|0XHC~5fxT;0M1>y6pK-KFZdpQ>bK-AN+~RdF)N78PR6Q+@fC z-CVZeP!MF8=4>dTp8e+9#Am;5M7%a5I~;;|n5G0AI*8WTpFfc@`zOdAe<=Gz%d~@Vpqymr?5}W768j@gi z(9ed9K^ZoOLg>45PT=@Q(Q0&N@nDwMJyKZ0ohWI&u&gKK9h|I!$)~T9vlyk2FBw$? zpObui($N<*%OrSC{8TtPw6w5|A+(;e* z(09;!N{r1lhfga5RAdzs`o>#iK9Yx(i^V)#Sz(sClsIVb<4d!`<*>)xOUQxW3C4hm zfkt89^%wpQ0%Dr9JYAIRbFIa|belS#0-O4zUgW~tRE%r9+Y>fWmB7(j_v=px+x9KY z_U!@a^eIQF)ANA`2vq5d!(DjPc0QAP`}<7*(c$~6eAb3R8y3h@0f#V{S}?r zA373h((mc2S|=?<+i(Sb&FGmCf5#WPfp|rWCJS8#9B&IN>oPDOfG0U-Cc7V(lNH;(DH)*;!0>iHJM+yT@KZd$~^g( z?~n^veIj4UbaQ@qQl|n|Y*5NW9z{z>9oCNdcmnvlS&Q3(e>fS)26t*qvqK%=$pebi zg?_7TAau83lfu`a197;*dKohA&8wtIA1Hkm>G}*1GRuRS1G_FR)jLjcNS74<&A&^& z>q6NSr#<_o_@I1SAiUSF#iqWQI|1O3A7s?@MX0J++X}9 zPmP%?#0c3SiFWlUDRu!z*eykqm!>&CaR$Q3oqY6r7Q)6n`bS!oi>~n?X}P>et*fgu z2f9NHN!ZK7j#-L=;jJI@(66x$lU3-K?7_C;N7)h!dsJGU!AcZ)SKU~5@G&2Et9kmB z*)~M1fA-6@DuEWn)HCh+RO8gO0cJ_Py6&@`U{auoO89u3@>pbui=+RpHwfd7f6e`F zeqDJCwTVhISjl^2$~bx+ciR>`WEg}qBVidZdgko_nc;?PN~F=J1qlaI$LrQ7lgY7Wn^rt zdw`IcON;$DZpQjuYWcxoe1$X)M5EUj^wM#j2O`bNr(yJcDG?&cReeP## zg^a)Wf$vfNP2xN0Y(11umf5iE?{JfhGaq~@Tt9h$O~}b$`mqpETj-HLhzkWhX`37_ zb@ZTkMphVAKVal_RnLWxWiLMG#epcA3(0reTl^bEiJ(W;PENX1#m8Yp?*XZd5`1{G zlv}ZhmIzvup=1q@N|L57g~f~HLtznpSBHf?^G`FF^pLKmfz_e764FbuJJ+2!*r{q+?s zD5z%Blr~uP1nDZh{>1+DdKZaL#$hjzdSVU4f<80pn}6Z<4IT%pMj%fqiC#^LjO|Vn zcOEYNx*pA7`Rhl~zJKab431w9cAZqTAlKs06&|F1zt2hIp>r_Qz3w8`k+OYJvcG@i z+lB3YWWBA@R~-e^x5CipY=5WJEr1d@=<6gg!YW+&>B2Wh4G}RVl=1$Zx2E8~$?%OX zHSBf<1I*vX&AlRmWqZXIq$jQ*VVCmcX_hb;kO5MmUu0XC(*2myP#0qS0|3@GmS|Su z#j9?|)^3}xD>oa82#n~h;A=i<%OL7QvRVK!RrsCGzRTF zvp>sYdO?nr}QQJ}H%5I_ZD*8e4(?I6RI7eNE9<>22sepn;eQ;LY=3Qi0 z*}4bRV^AY7iC_^O0raE1w71gE2qjpSxvjT`d^k(<-7wt&WzHOr?3*HWfBLb64Td+` zT2|<6g!EYLs;QJ^=1N>0AFtKI(2!`+X;sTp2_h(;zNvhbD@*c!^bL%4I>&K9#Db@F zmyt#5+>2|_|D|w5zOx`ob6iEMH`XDVStF}yx#t-G?$WO8B&+t->_5?pZSpvidjo3W zMZjE=MtUw3pA6r=mt~uU5K!Yw&9*k~vO}Y45Wl_1F{1eS@RGHf) zDU_r}&o>v{UAwimtp3iG$^g>c-2aUUY^}DIAsj4+_)()4g(fJ{2nupjG%(o$a?-S( zqqSf0?=Pe9Ai&SHq2O6YjEVWwgTCE!oVqbs7?7AvCZVFPBX zYs=KW$eu}ROsXDy#huJX0){ffObLAYTt2P#xQbLEKrx*EMgQ>w_h#%<;l(u@cr#(m zFI2cdlke@}mCMJv9{`6Qc}_zFZOu$RsG_81IIDm6WQ~hRPtzCjZnW(U8x&<*QQ`JA zhxJ3Y-3ym^<$fnU^qvbj%iT`{8~%Qr_t#czVws>pGZmP2-wJRB$>fk9yrb^?1D%}y zljKch^-VF2!qJ~l20!};ck=UjT(0lOf?dh^v9U3o-SJ!^BH zfWqZ5WI$95tCO3ANELWL-}4xPo5_wosx>2#7+QgqM|r3FVXbDsn~x_xc{pgAI4F0{ z#RVp&avij64CGX2H81<|7eRNlcQ)qSSl>>0#4jbf;hwh0Si>YT{u0!cEsLL8MtI=% zf0--Th=Z+ZRt?&}L`iyml8-m8kq&GdRs2F2jo0m0tARJp_7U)U$_iQ4r-xS*8keAX zp6JvP;!bWawsAVJiOd9iyT5#FG}Br(=vW|5tRW1eD2#Z>ap;Z`DGpW4Z}ke7ENR5) z;u1&*StWHB=Q|0pm%FWDI0>H+oj$f+(Y>LBSWaYbswt6LtILiv_i~j9yzC%_U#AY? zuWi4#Bdev`Y-{vQroA%DafpWrX+QR`&F49Gp)}vT5vG>skj(K|#4ZazlJ8+BiJ!sCmdVG0_h4cK9MY1ZU;P{>Wzl1$v*)6%yim%SyNEx>v_TXcXPZr*wNlQzcQT2YTzz;LeEPf+_`9F7c=aya&2M zx-hmfDgf@mZPs#P1NAEcIwZ0rJ~wUuVBWpH5fpEH`f%bXfbja+RYTN!Q7&I?TLb_^ z+Z@Tb``AY#pK%MHw8Q)g7Ry54PAQxq5VB1KiiMk+H#d?9F>RUb(5Xn9`a>Dsa*442 zjQh>%(tJK-ydb9Q1*Mzy$h6@Uo9i_b zBgq)&sPVAvhbOovl@!obU%Pw;mNbHm?YBSPbDHb0D2eY4ZN$m_me9-n$}?(4!2eBC zXC$CNRy~pE&b`@WDVwXVI%6Rj23aX(&C6&$6PQ>DOL>>?GHq|u)?e$vE&#Q^7IFzo zOIqRA`-*+zD>z`5lofs>APie#R#SFAlF!#%Q0%xSySAiE>zE8!wuRL`Q5aT2YO7wk zU6?-xm_iXyJT!o0KlM;!xz_yr>LA=SNzIAX?YUUnYt=$d$x8e0_dweoeygK-Qz>^GjDm zdgT)(WVq)jsNd$e^7?AiR^u3pE$K;*1!~kQ6WWc}#Vp15Jv~5;?tR;dN-7TH5=w_e zus=Qy(WQ`;doYe_iz1BAN=&xC%l2h$Yd?&V6iqOxt!fzS`0CdoGvEG4aJ8}cW_HAv zq=sO1mOQ4Ldo<=>Q0*@NM$UJOp4>>cD0V1a^tKB+CZQ|yM};S|YMetXJ~g#-y@>%` zk6F+XJSWl8+(v;daB(f{pjh@POh<%Dh9QalJzX_EDV~$Y$HCC=S=Sj2w!z3DOyyS2hkvDI&pTa{LIiG?}>DYGw*$i2i5!! z_abSfZW)I3hTv0$+CQ|LkD>{5iXIpPoLqrVB-5;sl=hidlA~g za~bd3=WkkoTl3iQI=Nu^v_$zi)W-TNcZ($zl z^(o!!MBYH!h?5J`*%1=&0Kk4GpIh&K0Ardp8%)Gjj9BtNU~LO(+@ER`W8>DGfiD~L z$NOE?zAdqvB#FdsQwTN$-t^5r-xpZeiz>jp-&2f!$0B2PXR&?1$e#>3ePx)D<9V%b3F=X}&zvFivqpEEzLeTkG)!)j zp_CZH_3WkE03sto&5S!~QYO3~oRsb}@4ufz6-$UAa;|C>Xb$3_v-ebwH%gVoQ;t!C z%Oy*oO8P7pchVQbUhq!_T#~R0H03(v#@h6L96YQxY z9{=s6Kqu^3uqX)PZKkj9T5O5hl~rpxs+jXT;lKGdI}mP}*H0}%E_V;=J=<=>go{FW zIeGIk{bPwYw|tf+aDw^%1X{w58>8f4wEq}wUyzAti=S-k2Q_fa zquGA@37kY_uc+2uY2zQGpfadZ+sr5lJ19Hhum$8ijFy2{r~6FGP%QB6eH?!g7YdOg zr&afSK?MD?LZ9HMR;o(Rur(?Ai5MvNl=qcoM;BaD&V?EWv7e`^nEiB32GU2P925<# zqHu4n?@{u0&%{@_GAwHl9aT#~{hdvv={oy{HRI&+;880thuNS52%>zp3i2DMR~S#q zHC)xKT9bF^wLzcB1}&BCd;HGx)^8dvSMp>2(t#gf{^yH}b_(+(W&&8ji@tJ_A$dsN z&}?N$0)7$Sw!kH(?U;d`Qdy>AX1mw**Nj1qwDt!M~ z#k%Hx@`8}8Du95-W^!Eno=y82+9$DRGP2da(+72 zY1+R+n>iJ}Zy?8cR0^h48acOia#)WGDJ>Z|aWRj44S4%Jpm${g$yy1@{CuxNas;qhgsx@!zsT z2Y-L+TjxgfJE^3947|nlc&*O3>t+k{#?14K`3YcgPtq?j^u@khqEpnNsO_#p*M`TB z2%aS3Aok3+uZIwkLW1K`iE}>x`2JnW_kZt)&5Y0nF*F3j z&d!7W8hDus&&r2bMs=vQcn)G>H|61g{G3-0-v!f**G46+5CH0E48m%aI{P?BACPubA!Z>esM8VK zLI?1U($3eg28;uL{UeBjEN2W6W2hHYg{EncZ5=QYN$fkGp7qe)8Q7pNJj_$)d)kwq z>`izdP<=+M?5a_QsquIaA+^K;^GXF9(PAaVczT>{#^=R2p^?^SVp! z`zEgB6_7T%5Q{_3-(8{2M82RA60(?Vi~&t7RY)OGp4w5qIpz%Lq{5IRNMFmVtp3a*X4U*`qlARbLnmeXie0*eEmiE3ad zQ=L@&U0<+7XscmUwSi^)s2EhWRjP4GEF#63uNVCB^EX7?N&K%EwQ&GF(wqA1@`L8y z&r%393~>U}s%H^-&LLK5wfIbW_0pe6O{sjO{&i=%6al1OZ>n&Y&Cbii;WNl2ZJFAS z%$HYW9o2%CwoUj9t)rqOFYbARsj_%W`;nWXvUdcCpl(Tif0fdRM1&;syzux(y21Fp zEO+nC5coOH5-XZZTHRU<-hMCoSJ{3A2ab8PQznkFC}tJG!Wg0^k`kAX(sl~i?uR?# z#QBz?kptA0CJ|YQ$eGGmUYdU|)yb7Vk|eoTfIl1o>2M+rj}T#yg!zwgkoCbsEH!pp ztS+V%^qNY^ZdQx}x)$!a+(36aqoV*|Ph~%L4 z;R7ehZQ_hh1lK3*wtTSx%vc2Vuh2+piY~949~#xTr+Q+JzWN|y)bAvwE}QLT{19s^ zqFOSF0}=wQLaZwgzVx`19qXs4<}+31`M@330m7|3XCdSF1fsvHtkfWZYz=!RWu6+Bp%NRq&zy zY~<4wHz<%)6blb6{bNSxDjW^AQfGmF!Vgig;t;Zit`@+WORE{JP_yKj46$ShdrS+0 z_wfWpA)EgkklQ+P|FkT*Q2+UfQ=hFEXv>{<*b$Q`9>vomT?VuA`+^tk{vkq5z>Ht{ zh|%5+489#ZRId(A>iAvg2PS-x>&`Ua@0w7#P|+NRB+Y@}?_okgwG-C-{MCBsb-Iw& z6fk-d#GEn56LLWd@CVHKIynMP@%3N?>n{?EeW5`lJa*{*`p+$3$zFXFRX_*FvuM9a z6YJD}47i1Aw=kTs@Dk>v{`xKzOg zwb~Ed-1{%UVy9%lLC76FcFkB`Et{@B4h!%X8_BB<9}$AL_i6zN?2%?E+v0l#Z_ zB8)#CIv8bdhK~>jrR^xN7V>qEe9h@`)GL9+0xs_HQ{tZH@cb!CQcf9%=VGW=P7@Tm zCqB7Qx|om=o9L=goC9x)g1Hnl)L6t4UoT#3UXCkAcb( zePXTuRA%vNkg8=B8UzDJA7ZAYfJn{3bu*n`o2J-;C(e)b-u4*YR>;=xr*j9u3*JEF zbh;0V-E$90B@httm3Y0CVQ>q8?@QHnCXhF<+*?h|?Z**DZ~|@)-5E;Yscatoe&#Vs z;>4R(NN_`f37+SmmaBGV+WK$;rAFpm-v0bvcg-rM&K9!vlxfmiKmPi8W;2+x`&?UV zw{n1zV8=-R#tI!Y;tm<+mpVPomu{S`lE;2TfhgQEBE9H)lGhXExWfixM|(6Uv7XBm zkZ*?vQsqmHeW?$aNBIDBH>gv~+h+8gqa=XyinP&%C0#!+iNF+dqcN0qfpKNe6ih~W zs7L*wVqtA6kKkfSp4+Ddo0n8=gAN7z9K^hkH$^naRKELM=*Z&XxU!D5elLS$oDxTj z^`1NS6ybXgU6GE*%|rHzhKWu(k}`aqO%}rrF47ahUXaXI(l`yDi0N&6U?AUX$0XviqNa>%dW#|O{to!|#H5-)v z&I42%;33VU36wJbyxzbkRXJ=CDnBFKgwQWy6rxoCB-w*4bH-lY7Lt|#^UE5}tFD8J zl<0s{XLJ~m3XX3~Yu_##eSBcUo+O=>s8)j5^jhE(R@1!#4j{2B*g^rsn?D1<<=0%r z>rr@6Y<-BC+|^x}Ev^Ag+o|`JC|jze2MaD57^iLEQd_pvte`_^zBZT2j4Wv-g3fGf zl+}dP-r#imHXKujC%7TV&-cr`zbB7T56Hu%oqi@<#4OKWW``+(oVD)RLy~0r9-Pv= zpV@sR)a2dSDsKb!$F+EH{Y~21H-{>=kuoDTXw_Hi+Fx?;Qf_4O>iXmcuxfxl)rfo` z^+n1Utn>=^rPAO)nTBR4MQJ2e;>sBbk22eT^gZ*103Fn>sCj9Jx{(-l@G_ic4!mmJ zoTz)>`aR#vH5?K{@|&&r4RR>V{^-9>grDrIV(QOawu5kjjTxJd8Fx^8dgZp6+jp02 zu6p>sWa_1TuvN7!6vcjKGs~+|ifGrDZx{WklPGe6HzbI6Uu~V&>yYUoMFc8ZGrFjO%RBOT$akDN2H^s7IBmb}kLoK=SWr zR5QRHzhzblQc6AAVVbvQ-Bfo>IUz`7(%8MX4si)ON3*glc0Lryoyv{X8+mr_PrBB29O3!_gl46V z)ead zMPhl{ss))eFo-zI6Rpul4Sq=wovLc;GZ~NgVUndt?M_%R;MKYB?$ z74H~-FCZv*VC~=C$_oiLD47$+=_-IOfWu;5^mt6d6cl|zLJdqXj=#@<&$a$eXyQF3 z2t4|0!#!RA9^K{0+%;fj4+J6lDBI7?3Pt5`9+0wmLJnMRjMSCa;%;GF0n?7kOmAgK zZnl)CTArwz2W~xyP%3)U!y#SR)CXl4Mw@eG8P&e;4ZTS*MNNQc&pFClQ9It$SpWEY0F?_#i4-D@oH)UE=tOaGFd^g4gr@^-n5%D5yyk8LeCba>lk9N>=vBX2fJ8~Up3N2Ekr}!OBShl$CR3)h%c+3oxu=Spp8ZT6@r_*hi*fYbk0cPT|tk*Y+ z@#}nWph||7??H;VxfSTUl{hK&P<1DT!)>^vLU^#G^x!u%f-&h_E91LM1rz*ASaZ0A z2Yd)mF?8Jb=He9a3RR0#zlQ4%?~bvocv5Fo( zXvX5K^2Sak?WWeun)ik7?DS_N&S$+I2;(H$f7xy!S{+Y%{qcA7lBmTV5iUt7U1JW= zxZveN2&-HSOI=)t40EH+pM&%Jcl zyO1h;Nq`3p1b#n?ojD%y3u?6}#9T4_t}$>R;kRMt7JfBrAKa$H>@`>FU}oE0uAI7|$2{LHaArqb@POs5FL3foS8Wo~k&da)`RI4g zcYoxkS^qQLJJ+G5orEiqXv@P}LEjQw^SweAj`oz}vGo;Oa!*AlWYS4`^wcanZb8b~ z7%%+UHVBv3ACKCAGE0~7L(+*n@ z!l^6d3s1L(bx{5{GWk{`?{AmVfFeWQ+MH!e2u$`MB}w{DELr=w_YfMBoBP_eNE`dX zvQVaTmN0-r2~qD@W_Z6UDL!4&O1Mg=88-a(j^GMIAHCv+nJpYLKUCAdSKN9#M+&CN=mU0joh{;Ouo>g4;QpzZE6rJ05K=Ca4=7LRJbs z|6O!vb=rl}`~|);oMGda{@V9QGAG$s$HLa8 ztcJxE0ZtlLj&Em-1n{maJo8o`9?UCZnj6+U56MTR`52l3L9;-A6umTW9e?o&%!Da@ znEzw_&jGpA3QqXlHpIg7KF@427>99cj30G0!(@UE54aLs3v2I`w2fdE-B@Wu70lSI z+e)-4L=t491(J|8IvOt?U@762=oZf{pCELVKgd;l27Dt5pn<^QZvPZ%nguXJ z#5Py|pii-%&z-%Fm`N&{Z-s@2I&0$$*r;}$NyP=0?C&F8P%Ylx`B@?@DQ{|#MfTsU z*Zb4qZn%i2LPotdmO=h+TgnPMv#gpCUiXv~AX|D4CFRdK;l%jKXkrzTVx|!NorCkV z9ueQcEGj_Ds`BQ2t^NE}uaDC*fbQ%F*v5eQ!)SIi@e|Nhm_HL2hC!*-%++6cVj8v_ z!9Pr^l+*j88*U?W2NoXW)-#*L;xm{lZxh%2KQ3Jk9(%+10N2WXl5%ekkkh=us*y5h zvaNyx{{r?2hhUxocVHF&y;52g(5Bd^IUalsqY+WhY2Gf27PkSxK{cuM*6LH=CCtZs zx9hJ%e{sC*dW|u;I!tm1Yi>5KZnvuizd5T->I^<3liZxh+j&+ncJ2p%#>Lp7FqhHQ zva9HPPk6=wZ_st^e;Ft-*0q$M)XY+vlj?be|V+5J^P^s zxnqC1D5z||Ab5>)_u~}d!sDHI45VOChyRzoy)!3Xe3Ju}gsBFiSzjWChs8JK9bnJ+ z92!q<&AyOGp)7q#izA0#-qK{>I~!Q>0T=VO%xWo9roBgco1L~adUHRP1M@_EfUoj6 z9uy->p5LI1o>gFP^L>@@h5cA!?G5b;S1iuHgMQKhL8W&Gz%l0Z8Nxb|RLV!169`D7 z5w66#X3&mMslu6xwiVV_q0?kr>fc$GWc+#5xnK|@C)8~zWxT%g9IR^U(GJKhW6|rq z?sx2X`V>qLOTk?~JaDfDg9<&PmQQq|{@mLnx-a5j3;t)bCzL=Sp!*2;K{roFM%A6( z{1NzPoyz&ob2BjeBaP%s)v*}9N`WHHzh8O_i@>#l3kSAaLAK45FFiCX=){S|o<^I? z3&HL7{nZz`O7>fUs8sc4Riq2*;{AQ(43EwWGamQ>XE%M2b3tMXAf1E!ZX8^SNdD20 zI|yitbnwzcz~5|m8-E6$@#O<9c25kkHRBK-JH)0@=${6r;bWMjE-co<&IN)HA{!3^ z8m~p|n$ms>f%QH;SKu_U4E|tg5Jny0dQelFjI zfRR$8r#fu{c^Q@gr&Xa}c{+hP#HnzYSkO{6CUyesH!D0T-0S})_8->pqsiaklWo9i z*^vtP?)geE;gja&=wq!6QAa;{89rbQmcNLoKKB3N1k%UJsp{S|imO9e?Qg_NtjMaz z09k&$&1?;#WV33HYw#U6R-0n|na+w->p_K-}geid9W++#jxCt=u;HfdqG; z`K%P>QV4{8ez!KqT$T_;`s(k7+=5;CG}&g^WZ}c2N# z(*v&gU?i$J8v5(oC)hfbRfA=8bh_5^r`Lg|;F2#~D@_fZy)EL$0JGE(+n*|tr@th$ z2JQg@gF@Krxm@dd5tuWqo>oJBL}h7s@r$k+bmDvK^!TPc!G+BQSG~5(e6+!VwvGwz z5hIO>J-QolPPmpcyb?M}sM@)qC9zkHZ{i%H@yQI62^vRs%94<(=!nVOEPV>%!;g83 z6ix4*0E2`Oy#^9#)gz$rXBC&}14djmPPr+m zr!6frDmOtAs65c)E=NQg6K-T(+_1}HNb;;UH4%lXW)81*=fFuzd3CL^GerKiLbs&( zYGZ9$^E&nGdNWz@Qr*S#0>D=w^)&fGZviF{wS6xWCpu`6E|%@gp*(TdJArS3RRx+m zCXIGS)edZhb+K2H5znZ0T1rZ`o4U0o!TW2?A30*m-0xyy2pYj zveJyFBfC%`bY)44tfn6w)>c**6J5v-{B)x(8`ofbP*y+TaUOl!jQ8x3o&)a(_;S!E zO?r;9e*z-LB3-E=&i%TQVUq6Q*w51M9)wo-Zf7{z!-_3M{f&mrnpDB?E&H+<@b1Ja z^BQn*!9O!|1;qRE<#_fceWi^OWdN=|B|)NqihAD?i7`f5q*vOPJY)a4C0DufwqD_% z0a5?o|9}C{gFC@rLzTJ(k1=%JZrZ@DoDGuC0sr>bq?26~y8aL$9uZxScYo8s(sTj5 zF&z;kJ*2ym9=PIk&v_q&DbF$;!{DS^}4!P#V{oCn~*p7S8Mz8$fi|1x;I_DHUan5_D+X6IZw8JR}Cq&KEU zQL|H#vw7jrhI8&}pe8;@*8<=ib`6q!u>A<~yuv9ln)M#YpJ^48Jm3DgJO`3G6{%Rc z;lQ}F^!qN{PDeYM)#{<0pMMYhf1uyeDEBUn|R)75iYxu8Ts{f z62Fo@c90ny|1;nfSuJS=boTlnNijD&NkDL*;Qg68Wyr=O$Z@EUZ_cBuS<}|^D66CF z!mg&qSS17bao2Q71>X-NUiU!bsgTIM{9OJ|PlNcdG@ubbgosEoC+?7gPUC%2_M#83 zYuW{YH)tN^j>2!y^be65g5{?__!;*|V(XdRGts1T?w`Q~mCvh?ObH$RlTRQ~`lN^> ztYj#b)+sl;rOKMV;n1VfpEo3%ww^p+SRg5)EvI9lnSJJ)g452F^rY_A7}xdCkdj2F zv1hU62i0js>A|WjhMuM{|C%+RrzgdFIeMudWw;w-l`z}-O8O6}q zQE5SE69DR~tmMO_apZKQ`F9T@df-v`Wki!zv3@0!|H^$V}tDru5b9a^^i`t~Z zbO;{~w_Sm4S32_u4Q=&P9(B%v_B(aP{oAx{rb8+EGZ$)hR?QEq>j=USRV;|^B_yqI zpMH*kj>TR`sf5a0#Q%tlqOWtAN7O9z`B%kd^{I6MBIBb{z)IY+?E(wd@&)!rB7#wi zGV<~JHfE`yRw!t56I;*v4i;NV=<0Ka2RG->6zK9LU2OhTzIE{ZJhRi^FSsu|6s+{6 zOwSqa+FcO@lly1c-YL&NoY?`}ew!Gi;i|pb!tJS#tvoo~(JdTi8{4PB@$E$Dd2L=#@)I3AZ&a zL6^Hc9)e`+o++G z29UmvJW$aPeq=aNUs~X>yb*iIwSiXD!a2*$9JDWp^NdBY$UUj32T+QS6X3NW%r;2F%4cW**?^Yci!#lPRN zSp^q!+h!oG{zPA~Ms#`FK%naI^?@^KzsCn@C^GaKb26qflFUB zb3MVkxU~`~5i+|ZVji_X-4zNj-k-VBCo;VmD)VaLinU$eIfT!q^;E7Z-nKqml$4>* zaM+=aY>S%y5f??+xQ*U?j76@#ZcA@qc}09&+uC%<@(9=*++4vtmr@u_NfX9mYRb-E zTYWP)XriFQkq~!mndLQiV*x`nmC2Q_1~J@+i%f2bC8~9o7Rg}sRo4-1k<@wHd z>1+hyhCbe0jSaMB5|u+11>e1Kf0RP%UY>pbGq9l>Gb1vZRqN91P>wzIz!+)!FU{E0@17 zKFX%n*qKb!H^7gR*9~=P`hJK=p%BLo4l>q;yL{QnHo|V{-sCA|!f}T$$Kf2g9Bp7x@!>>8zf?o3USsG-c zY#hQZCH@i-g6V`tLu4sS1I9h3!@n&rTz%jkYdDn+X+&rD6M%n5`Yj>|2l(5J7?F?7 ze`J0wcvbjqV}HE5lN{i&<*Lp?EkzYC6G>sqBT<%n?x@N~`cGN|0F5C>&)bx1_76oG z#B7Y&d4bVp(I{CxV$l%NrbZ_r`Z`R;@lqY!pb)gL|ZQd5r8LhQh4VOCIN z++wIYouFz<+|jf3VZh?RR&~Z3m@4H+$igP@&r?wtlR|EgcXDkbVF{J{>V5L+KDQh2 zcq=ECXL1R77i^2)asj)WFCT85O-PlBRR(^+K_ZifzR(5iETHI$?Y_IQBj6bsxmY;x z_c08&BB-iwm$ki{6UXl z#jP@;eheZyKhNo5K?=M*hervmzp`{h)_Wcq$E*x-G76~YygyX_=Hu`|TM(KdayUxL z-c9AM)Z11gBM+gDdNZvKS%i=h(pdCTWgSWO?j!m1e#HJbo2zK3Z})%6F{GYorS|5n zBj!cayjUD=EO#?0Ez6892#ibRgmeeAX0srY!z)f*>~WDV!MO~5ebX@xX~0nUUP}e; zyH?kZv(%Xphc@D`cfNhT@J1CMisj1q&rRr6az7OK0u?|-Q7vp74O8MZc%2&kMjNGw z;Z7lqSYlg7USQNBB9z=bKU?Ouxb45Rp^g^nxywS#Ui^Y~)u8h0C*7u~^Xp07ZJ*3F zd+fsx2H&afAnxa`bZdM7J+q_PD=+KuY#@714#@XcIKa3Eq@5a=tMprIQ)$^C>E`-@yCcnCv2f!(kaR+lqV1_PNV`4FZuW={Sakia>B71_o;P$Bke4EgQyPn0vxE<6jm;}D^L(vpkI)`W*w+R&Lc)HeiE7SY6a{EZ z8X2Ge274evL+=GMQBB}N)pD=@6Z(v*RA(QFRf7(B3D=fLg<^FvEOLEhdM2E$Cd^H% z&8*+aZV+h^Y&^XNdLEq__InM|Ekh>s!sNFHfGY=BD-p>;Rs9@nkvX?#;AOgei(+Qv zZB5dR7F-kL{eGa@BXr~ zH!`y4HKL?!8QED`$-LQQ&#Zpu{rUX?>3!ehoY#51p3ld#fnp{6=!FKd|L3kYvloSt zuCdg#9Qb}NwZ!d-ZnF6&H_{ZiKXi&PH;c2l8#TVW#g^om#$vW*-2Yl3@)ih2exp!& zyXaf-XQV()A~zapT}=e${pEHUU;}pNK_a)Q3c~!_RI34`K6;40eS2lU??nqs-$Uh6 zSlr#(!~{qwT~S|D)LjuY zk)lvc4=Gbg!j4HIH8(1H|LGj3fiTEUo6ehPjshQq6fp2SxR^{ieLS*T$c=Gc^0hX; zM|j@sLqvi}1G}i>?j%BKU->Wa($H0H`l8RhKXZ?31Wtj=x?PQX9zZVFkhSctvhLIw z)Rcn|j(!IEL4KL-92DzbOY3tlrk6cNtUsgAeO_|!RSVhqUi~r)mv<&K?bC6Jr$bIA zTZ#S=r0EZ0dt=utzect9It~$bfN!Fq&Z|&+!^(mT#@B-Zpf=y#v*T+;)0YjA@mBTf z_WIlRkHxY=(AQDf(#A%<4H-v3UM3Rod&v3<$|y`LZB6z{C?MXEY+36Pyc0pxH@EX) zWs1O}p3!c8tYw;r7wytH zUS5Y!c+Fu={KF7=WQmTFTr<#gs8V>+hAqh=bDf-B^j3yx!kUA})NK>ps0S?c{BX3mR`6G?$Mht<=c5 zcz=lJ$SnB;&ip$soQfe1*=d3s>7$n>wffu@V~twRqGM742MSJj(}>~FnEp0#gpSH$xJ@}1A!I(g{Y90k5Zt45rFl?~k?Ie5 zii4;!)!3YaLW%l(e%jxL{@V^hY8dN+_e-_+6Ytx8SwUV{yn^4hr9_Q=I;I3mfp#q1HU zN^^pp@hyHfiOsj(Q2ZJqeT*q(vH%~Kb`&Wqgy)A(?fR0FVGb8;?5EjERxvS6$(1)X z@?ZODGS#9C92=Hgk;^~etS|_8-R7OMb_tr>^~D)dplD6^mkvryNQwf`exi?ap6pGt z$={Qu4=}1bj3OdB!9EC&p!k?I%L3Gc7a?yGzVUH^H*Sk5RPO&$2b&_Z@Z9m%Pd=OwIglGuEw}z6-<+J-n@M zK=b7l9E{oK7Fzu(lggyWeK~+`#xa#q)PGt4WqibEff_{3NoH3WlH%n2H?StD(ze+< zXxu^`Vy&tD&zavB;4;e?BDw;}%eqIV)f5ftoym z@S>q7Qx34lGda^MoN2fTXXRy_1gP$A`f&S4cTU+L8TETB*uH4CNmvJ!*468-do_8$@u$p^YiIz}5IVtAI!a%LMJNCCN7+>*E^ zrhbb1Bbl~B7byZwh@E>bp;%q{2QWb&+r~$i)yM_oXCna}XSdu?u_oc$k?-h&J=7m4 zne%bO`O(PE%osQ}4@-0k(5ZC1OQ%nOCdE~mQH{laLZq0YNARlpFK?Br22BDg*DY9= zI79s3m5*S8>zr~khBq-@vcJi={HgBCW?wwyB1z}?vZ=|34m_2 zf7i7$Is&}YnOT-!acOhjlL12oRY|^q`n_7P8uCrtU3?bMS>jB3G8SShI`gydIO8xm zcNd<0m#!ht?8=!Q*8+c;czO8tr-Zp~E$eu+S{j&XaKZe)GRJ@Dg}5tD!xH#z-L8Rp z@^+}zsB%kk$$YGs#Q^zYr>H>fHR4)I_Cb7CYGe<%S`iL2+3AnG_7ADybs85q-Up+1 z#dySR@3tqJK&6w6FI{&cD6M5wQ-`^4j>ITbmHe%Oj*8kBaTJD<(D*VlFftg+f!^pn zSOp-!9o&TuA=IB|_w2}{+k>!dNAWi^4W^AdzgIsR*Q|~vJY0t+R}Qm=0UX9%-DQl6 z`Zdwo`pGG;gUVu5a{*C+m}DHH6Cq4d5kQRVFayWBPL#^~2GeZyG6fkD){=N)UZ0ED zD7*bazeb-Y(8+RL~jP$mjY1N6W9(8?6;lONAcvdJqrI@NwN&z28xf{?JhG3a)XOsUQrEohdCr zM-}p;7tsk3U54GTDc!(4f0VBMSoD%Pc&#?LH}B!<4B zP5b;4jc|5I@1C_vdHV2X7U2I4j(flpbqS0WKE|His@FUl=3ZKwXf;7|Q6blC993%?*zCfc7orI4Q8cS#R6Gc2<$C( zNO-y1*{JyVenueFV>TLasb-OzVHhZ?jZ_er-GYJe5_1^sn~MZhV?c(E_WwiYBw_B+ zZpgt>g+Mmp6nGUF?q9WhoN+u~deVh4D&*e7IK|h!G=5p2_bGRw1-#&}+p%5jHV3v; z@Lzt1zQb3Rd5_iuTEIFfI*;hM?FlqRKbDD+vS*|JRGz1UOJJ@~p}CUV4k&~bMNc2b z3*Y*acE1UHN3@U0(Y$k6YE*DW$C|cJuIP7F&5?qa`Zq^=GLN&`3e}jk# zY=Ws9c9G)OY+`XA5cx7Ei@v1eGz8X`(JlFxn7X-4-4fgp(%u&Ik|Nd0IhB_Y-mzIP;RpKNVBlPM!3=Sea|0wT z4_L=k%R!xk$KYgPH}n1PM&kI^2Q?D2u;bn<@+;M16|_CVePjyXt9v7IYIYZn*RgP5 zK~s?PEGpKqJ#X5Z{9E7h9W-!JmXG{9VwZIf41tVP+8%CS67X4-FdcZa7z@R}8ktNV zywm<;J|hS>dS23-f_PAH=24J)X!kkw#X(#1 z)5H{JxjP&{L-SIrdgRw7L>wwv@!_5QeK3t@7kw^T)w(thpa{eM!+7t4rMJ;X>LRNd zVT#BDKlBwb=Vx|}S*|&yJ9P-Zi&m!5b$(VG(#zR5O1#h?9uRnTz;c|d9{L#Z*K&ig z^*czDq&c%;Sy1EQ5`??zvjonIcFN}YGfs`SyCs2z;_V~y5cM@tzsACMu3zvGg!TDL zi2?#qG8)a!HV7R2o6 zmrv9J2=3%|xQhfT8k-y#awr>De|25EvpSe9X=Vig3jeT0ob$qshNn-1XQWaTP0-{{ zsq599|6X?Sy8@p4y`CsG^n-ci=3TnfzTKV7ri44Xugw_?ZW$U1UR-p1Fu|&w*^I$` zi3~(i!%L43xNqCNHtu@AxBig^>XGcxT$+e#l?I(qtcS%U?3J6|Xui&BhP)zV{hic1 zufJzo>)cF6PnXtmxp*1C&mREbrxMxi*n0yI-?ntJWM6BDmt>wE1JvhIfuaKUQi z1KO_AQU?{tOM&U;WlmIYP+7Gi2~+bsKL2Da7zsK$tPf@eYb_3@S(Z=w&S`JV*DWQ< z5(b2FBv&S{F@0f$-~pN-V}3+xiu7*mv;O-Kk*y8WppZt4cB> zZ;dCsW?|`Uaxs#4>T_K%5T;O+;DqDTuT6ZLgt_4vVYMVDP<6pys0YMV@X&H|qKv6k zK))pG^KW{so?VKmRB37IRtwPH=?n?brMdDY5~$-dJ@bl+6NOb)SvCN3TXD|}@$Yym zZ}cbyW8~C-RIc?~^KWKoYjWVo^3246-c1{k`jaFKaqp!-PS({s1!jH%xdpF*C(%Pw z`8nm&f_$N51LRVsBzLpGivA6b$}O5|&{&Apr*}HH_yr8%b9e@+%#+_v2>g2so$ic& zP8SPKPRC&bb%1PEmUXS!TW5WV_$tXXRj>`bt`hCSzA|gj(mSMjbyW;#Y^FXRLY?|G zeSV$rYYzMY0`mp0{9o>N90 zwwO=^zauk8K%{Y@7DSEQFZ(2z_KrCBv-r9^c%lFHIFC16lVIrJL3MwErq z8(tLXRzAbenELC=|H(&PmE|ZM{h%S2ewOPcAw}{l{A07MAL~HKkSJa@K0s2KyT1}- z*}&HPmS@2cTsIF9dk_avKxekZoHrh7Og|-u_5500ZxqLHF4^`_IQfCYn>mcjS(|1k z2`ESz0#yR_0IKZOyLjEwPn_?-dj<>SL^Zx$TeWXQxiQa{qZos?yIg&dYGrDiJ6i#r@-mH~fFyP5tE5MnN@{ zI&-yf{sP-e2iyItnRw4+Hn`l7FizDoN8Sq`>Y4S^N}^M*Ma=(<1o+a|y;%=`W|e_n ze2#tf)nV1QCG-=YepPXN-H%;-XlB+ zHsZas`;RiQ^W?5OQge5q$miy56laeeclEhbjhgf73VP0Bv||0TaNP!GtINb~fl-)S z*jAWlBEQkm&q|>L$bi|B9;#+&OfLSO+3)GIA!*Qb;$gCyX?ih1$$`nl`G_QbiYWbD zY4H)fnW3fEDDz_>{Baeo{h{6#qyG0|;mMZ2OAN|Q{i+1zlq1j&*)tlpju+)Ck5B6| z*g670DfXeo0X;^Hd#fsGh||6#*Wv?jb+(bIRX;OzS4^p6pu+tjZAV;(bsPN1HZ@rOYra8Sx+esIux zJVJ3{E`|&;tSgELED3u9GdUcq(H(2&MS-hIqB9?yW03*-dtFXfBJTBsDzLf2R6S{3S=FMl8Usjzoq&7Pwv=d|pO}ZFv2CFn;iK+PsY;`tE|LGn|JY zI-A=zJh(GYnlKOeU}Zw%=sM2@qoTeBUm@&L`GzT|f)8ft=lL!-#p_Vg-P;_Zsim=H zjfxle?DJcHzq(pJcD&7w>F3#V=tdJvHj4!R0%kKQ?e=t-NB&K243aa2dB2hJ3XK75 z=It36Br};44m!$*efV89Lc)i>j>H6C`F)PxA;xZzuEKVRX$7 zmKJXd^{;+y1Ixs02u@Jw|Ir#&g~KB=B2?M>>rF=P%7lxD+VmO zmBOdpemZbPjqBs5fzwd1Y-aDm^eibK&J7zH)7P>=XpOq4Wb!40B&~^gOw$E;HxlBc z(ks4=y!kR$QIbX3^HtfGWZE>(jNEBzX;uF9|jg(MTOp(3Pj#mNHS=<3&StJ zx;s_|2;lvJO=ueV2!DURk2dfm;8@GbF-9}w%RK~oYFdth*5RuW`4@NuXkr$n!0>>1 z-4T^Ei_E5i>wms{D2x71U$p1`J{UgHS$#`Cx7g<+oIIK-)Xv&sBwIBd066>04dPeO{1y8Tod|0euF})>+gd<|V|+v8laz(z9!H z>wNyB3@@JVhJj47Yn}^c>X*WVW~=WrU$1lQ)uKx!E>Wlu{v2NBjGaH{H@V|9oN6k_YmUNXD ztW?55;bm=s@3f>jCwcT#i4ZGi7@V4w6f*uIc=e%iYMVF+-xub6zMM=+zx@hQ6 z1_uT=PO6r}wDo^gZ^%5VkKk{)e8~T$SU}R(B3LU%1yoi`Ns~S{_$j||Qs&U`uYnYV z`>MIa$$z@%h5DIzE~~&svU+sj@}Mn&dV-m_NrTq|jTh|>Y?xr+Oa^ANFm3lRSz!2` zN|8yi!j(b{=%J>fV%nFq(xHDU-lwFA z{IHr2G`}TG)BweADK%o$<+DSrQFIs#?%kByU3w8P6j{8B9gy*nH)h{m#EyZT9w48S3v?i6d7H5@v1rNXra9-eXAbxPqZjp{UF!xRrJ;6eH z=>BE))71aOg-2J3*nx2dS-2IAmD6P8T+a}(cDqxSClu@$1y@Cs9)bl7P&&dToq%KFI zq$E3D?I+FqvO`1*qn(2%lroWXWYkWEqWF975u+`c*SUu6nW0m;Prwvz>QbO4X!sk9 zQgVx+u`-C~gMc)r|M(VeTdM|a(D+>8Pr?Yau6<^Tm4xem!DE-?(t~m20QLuK z_xz_%Mz4l;lGXmDQP`dUl@|wTMKe(!BtMejHMnotu=Zfkz7KA$4yimO0bNw4o4cg5 z^GdBMH^yVXFe;s>nr`mfuy6tg;X}OiyTO!&l@CimxM%*|=4u6j1dn~hYrF@OMlG?S z>~Qku7joDw`Lu!W@f3O-sitKU<@&&rES_v7K_m10805`mCIT>S(Ogk%HjQc7WC_%1 z&ukSXHnWX&a!|RB?_=s}hguwM%LI72t!s$=T$l0#Wi_vkaEgyDzL(zP~ z=s<91(rC?UuJkNkcsYTo(%s(5c2D|u?MfOpnFEW`XP%qcW%xqV{@Cq=LtUQmvQLdF z7qrjR^PlsXxmq`aoSuTxY-vy32)8q7P~<_#_oxqklvr<;k>^%1bx1m-@T@_>sep*wRw7>- zc3MvKP6(fONgND+;j|_6S$1$r3i^mqGay9dhlYd@949}@a#~0!bgSR&{)ER12G3IJ zD8t?Ly=tGw7RBVSvDFq!A76Cxt+B^j5S)=Pwo`CtJYmg0diY{sB7-|9(krNL2d9 z)H=73H+g0pNWPZH%tEw5?7m+M+B zrZ~#W_I>Q{HDe0teuO#9q$wux=azuHO7h;|ryokw>5(v%*5o>CL!0YySC=G%j)o<3y9X_>o^D6ppg^A2;Pw!(IqQOjKce>=;^`rtKqIE)<8 zIJPrY9&*^S?iU+d?(9dIu{p*u#z=+A`KK0-E*&0CMsZ>qpV;j0ibj0*a?Q<)UmyeY zLO#(#zVkgCOtLdZAS1o2*AtbqSGggA5>)f)5xSs7dRHSXiSlXFtS<)!`>C%8=brsX z_tv=mq-5w02W(|Cs#_;EZ17kMAR5JTN>wG%_cz`Alv7tLoYi%@Y#?U1vhBo!F5^#g z#t~GF7`=47XM)CjW+>m>4~Wz{r?VWluZ*yC6Ez}RZvXE{?QB}OfeWk$Y>+G?`r@B; zh~2?z{Wz=F;2~S)Gn>v+TB55ZL3fEcra$sE!D_cm6)X+c;KYU0T%K`uAUrEFQ_wAC zR3M5*d7X`cQX#G-$1<}%S9I-hpg!{Fh0{3Gk!k(eSG*z-?mWj(R0?%}arD46xm^$| z(*NS$5BUz_%U*UyG@R{mKfeDhp*QqQr1WAA05GrV$HSi$>{y*m-xa>V&FTTF7;wgO zGS*q7KyZT{9b&Waq~(mJi0J*K34UnGjOnF`KK*DQl=|iIhv93+n_9aHyB+U81kK6w zj9kc;y!j2JN4k&LIGGX}8zQZ K{Eb98Ym6T*wFlegF+2|SIzjX$EW(`34DCnr7 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�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

    ZDD4am!`hHS_l@4+Y>}sZl`r;qQ8ti+Zc{VU& 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

    {Hw>3_OgAo`MZ<70*@q;NghUrY#+H#mH1 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%0Dy%#%5J4!x>LXLP9(})2hTpswEhVfA)^|%c!>O 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ð1x6< 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

    #)hqhzRrtPG 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 @6<>50U=&_oZ?2_4h6${;|>(pShdl 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%0Ad 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

    ezD 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

    xJl_#^9s3qU=vz#6NmtsJrL$PN58 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 z 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

    02_m=P#4Ahrju+R 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%0AbshG-fpP@6SE5D8Lwx(y%Y#KGgTtu-yKm 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

    0^K6neM|QPw3Dok9NL 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 literal 0 HcmV?d00001 diff --git a/examples/finetuning_on_flickr_style/models/.gitignore b/examples/finetuning_on_flickr_style/models/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/examples/finetuning_on_flickr_style/readme.md b/examples/finetuning_on_flickr_style/readme.md new file mode 100644 index 00000000000..4a164e5f16a --- /dev/null +++ b/examples/finetuning_on_flickr_style/readme.md @@ -0,0 +1,100 @@ +--- +title: Fine-tuning CaffeNet on "Flickr Style" data +description: We fine-tune the ImageNet-trained CaffeNet on another dataset. +category: example +include_in_docs: true +layout: default +priority: 5 +--- + +# Fine-tuning CaffeNet on "Flickr Style" data + +This example shows how to fine-tune the BVLC-distributed CaffeNet model on a different dataset: [Flickr Style](http://sergeykarayev.com/files/1311.3715v3.pdf), which has style category labels. + +## Explanation + +The Flickr-sourced data of the Style dataset is visually very similar to the ImageNet dataset, on which the `caffe_reference_imagenet_model` was trained. +Since that model works well for object category classification, we'd like to use it architecture for our style classifier. +We also only have 80,000 images to train on, so we'd like to start with the parameters learned on the 1,000,000 ImageNet images, and fine-tune as needed. +If we give provide the `model` parameter to the `caffe train` command, the trained weights will be loaded into our model, matching layers by name. + +Because we are predicting 20 classes instead of a 1,000, we do need to change the last layer in the model. +Therefore, we change the name of the last layer from `fc8` to `fc8_flickr` in our prototxt. +Since there is no layer named that in the `caffe_reference_imagenet_model`, that layer will begin training with random weights. + +We will also decrease the overall learning rate `base_lr` in the solver prototxt, but boost the `blobs_lr` on the newly introduced layer. +The idea is to have the rest of the model change very slowly with new data, but the new layer needs to learn fast. +Additionally, we set `stepsize` in the solver to a lower value than if we were training from scratch, since we're virtually far along in training and therefore want the learning rate to go down faster. +Note that we could also entirely prevent fine-tuning of all layers other than `fc8_flickr` by setting their `blobs_lr` to 0. + +## Procedure + +All steps are to be done from the root caffe directory. + +The dataset is distributed as a list of URLs with corresponding labels. +Using a script, we will download a small subset of the data and split it into train and val sets. + + caffe % python examples/finetuning_on_flickr_style/assemble_data.py -h + usage: assemble_data.py [-h] [-s SEED] [-i IMAGES] [-w WORKERS] + + Download a subset of Flickr Style to a directory + + optional arguments: + -h, --help show this help message and exit + -s SEED, --seed SEED random seed + -i IMAGES, --images IMAGES + number of images to use (-1 for all) + -w WORKERS, --workers WORKERS + num workers used to download images. -x uses (all - x) + cores. + + caffe % python examples/finetuning_on_flickr_style/assemble_data.py --workers=-1 --images=200 + Downloading 200 images with 7 workers... + Writing train/val for 190 successfully downloaded images. + +This script downloads images and writes train/val file lists into `data/flickr_style`. +The prototxt's in this example assume this, and also assume the presence of the ImageNet mean file (run `get_ilsvrc_aux.sh` from `data/ilsvrc12` to obtain this if you haven't yet). + +We'll also need the ImageNet-trained model, which you can obtain by running `get_caffe_reference_imagenet_model.sh` from `examples/imagenet`. + +Now we can train! + + caffe % ./build/tools/caffe train -solver examples/finetuning_on_flickr_style/solver.prototxt -weights examples/imagenet/caffe_reference_imagenet_model + I0827 19:41:52.455621 2129298192 caffe.cpp:90] Starting Optimization + I0827 19:41:52.456883 2129298192 solver.cpp:32] Initializing solver from parameters: + + [...] + + I0827 19:41:55.520205 2129298192 solver.cpp:46] Solver scaffolding done. + I0827 19:41:55.520211 2129298192 caffe.cpp:99] Use CPU. + I0827 19:41:55.520217 2129298192 caffe.cpp:107] Finetuning from examples/imagenet/caffe_reference_imagenet_model + I0827 19:41:57.433044 2129298192 solver.cpp:165] Solving CaffeNet + I0827 19:41:57.433104 2129298192 solver.cpp:251] Iteration 0, Testing net (#0) + I0827 19:44:44.145447 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.004 + I0827 19:44:48.774271 2129298192 solver.cpp:195] Iteration 0, loss = 3.46922 + I0827 19:44:48.774333 2129298192 solver.cpp:397] Iteration 0, lr = 0.001 + I0827 19:46:15.107447 2129298192 solver.cpp:195] Iteration 20, loss = 0.0147678 + I0827 19:46:15.107511 2129298192 solver.cpp:397] Iteration 20, lr = 0.001 + I0827 19:47:41.941119 2129298192 solver.cpp:195] Iteration 40, loss = 0.00455839 + I0827 19:47:41.941181 2129298192 solver.cpp:397] Iteration 40, lr = 0.001 + +Note how rapidly the loss went down. +For comparison, here is how the loss goes down when we do not start with a pre-trained model: + + I0827 18:57:08.496208 2129298192 solver.cpp:46] Solver scaffolding done. + I0827 18:57:08.496227 2129298192 caffe.cpp:99] Use CPU. + I0827 18:57:08.496235 2129298192 solver.cpp:165] Solving CaffeNet + I0827 18:57:08.496271 2129298192 solver.cpp:251] Iteration 0, Testing net (#0) + I0827 19:00:00.894336 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.075 + I0827 19:00:05.825129 2129298192 solver.cpp:195] Iteration 0, loss = 3.51759 + I0827 19:00:05.825187 2129298192 solver.cpp:397] Iteration 0, lr = 0.001 + I0827 19:01:36.090224 2129298192 solver.cpp:195] Iteration 20, loss = 3.32227 + I0827 19:01:36.091948 2129298192 solver.cpp:397] Iteration 20, lr = 0.001 + I0827 19:03:08.522105 2129298192 solver.cpp:195] Iteration 40, loss = 2.97031 + I0827 19:03:08.522176 2129298192 solver.cpp:397] Iteration 40, lr = 0.001 + +## License + +The Flickr Style dataset as distributed here contains only URLs to images. +Some of the images may have copyright. +Training a category-recognition model for research/non-commercial use may constitute fair use of this data. diff --git a/examples/finetuning_on_flickr_style/solver.prototxt b/examples/finetuning_on_flickr_style/solver.prototxt new file mode 100644 index 00000000000..ed1548c0aac --- /dev/null +++ b/examples/finetuning_on_flickr_style/solver.prototxt @@ -0,0 +1,15 @@ +net: "examples/finetuning_on_flickr_style/train_val.prototxt" +test_iter: 100 +test_interval: 1000 +# lr for fine-tuning should be lower than when starting from scratch +base_lr: 0.001 +lr_policy: "step" +gamma: 0.1 +# stepsize should also be lower, as we're closer to being done +stepsize: 20000 +display: 20 +max_iter: 100000 +momentum: 0.9 +weight_decay: 0.0005 +snapshot: 10000 +snapshot_prefix: "examples/finetuning_on_flickr_style/models/finetuning" diff --git a/examples/finetuning_on_flickr_style/train_val.prototxt b/examples/finetuning_on_flickr_style/train_val.prototxt new file mode 100644 index 00000000000..bcb1e1ce1e2 --- /dev/null +++ b/examples/finetuning_on_flickr_style/train_val.prototxt @@ -0,0 +1,349 @@ +name: "FlickrStyleCaffeNet" +layers { + name: "data" + type: IMAGE_DATA + top: "data" + top: "label" + image_data_param { + source: "data/flickr_style/train.txt" + batch_size: 50 + transform_param { + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + mirror: true + } + new_height: 256 + new_width: 256 + } + include: { phase: TRAIN } +} +layers { + name: "data" + type: IMAGE_DATA + top: "data" + top: "label" + image_data_param { + source: "data/flickr_style/train.txt" + batch_size: 50 + transform_param { + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + mirror: true + } + new_height: 256 + new_width: 256 + } + include: { phase: TEST } +} +layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 11 + stride: 4 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "relu1" + type: RELU + bottom: "conv1" + top: "conv1" +} +layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "norm1" + type: LRN + bottom: "pool1" + top: "norm1" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + name: "conv2" + type: CONVOLUTION + bottom: "norm1" + top: "conv2" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + pad: 2 + kernel_size: 5 + group: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu2" + type: RELU + bottom: "conv2" + top: "conv2" +} +layers { + name: "pool2" + type: POOLING + bottom: "conv2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "norm2" + type: LRN + bottom: "pool2" + top: "norm2" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + name: "conv3" + type: CONVOLUTION + bottom: "norm2" + top: "conv3" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "relu3" + type: RELU + bottom: "conv3" + top: "conv3" +} +layers { + name: "conv4" + type: CONVOLUTION + bottom: "conv3" + top: "conv4" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + group: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu4" + type: RELU + bottom: "conv4" + top: "conv4" +} +layers { + name: "conv5" + type: CONVOLUTION + bottom: "conv4" + top: "conv5" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + group: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu5" + type: RELU + bottom: "conv5" + top: "conv5" +} +layers { + name: "pool5" + type: POOLING + bottom: "conv5" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "fc6" + type: INNER_PRODUCT + bottom: "pool5" + top: "fc6" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 4096 + weight_filler { + type: "gaussian" + std: 0.005 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu6" + type: RELU + bottom: "fc6" + top: "fc6" +} +layers { + name: "drop6" + type: DROPOUT + bottom: "fc6" + top: "fc6" + dropout_param { + dropout_ratio: 0.5 + } +} +layers { + name: "fc7" + type: INNER_PRODUCT + bottom: "fc6" + top: "fc7" + # Note that blobs_lr can be set to 0 to disable any fine-tuning of this, and any other, layer + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 4096 + weight_filler { + type: "gaussian" + std: 0.005 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu7" + type: RELU + bottom: "fc7" + top: "fc7" +} +layers { + name: "drop7" + type: DROPOUT + bottom: "fc7" + top: "fc7" + dropout_param { + dropout_ratio: 0.5 + } +} +layers { + name: "fc8_flickr" + type: INNER_PRODUCT + bottom: "fc7" + top: "fc8_flickr" + # blobs_lr is set to higher than for other layers, because this layer is starting from random while the others are already trained + blobs_lr: 10 + blobs_lr: 20 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 20 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "fc8_flickr" + bottom: "label" +} +layers { + name: "accuracy" + type: ACCURACY + bottom: "fc8_flickr" + bottom: "label" + top: "accuracy" + include: { phase: TEST } +} From 23a50260846f3fd4f45f81a70ab5c837a4ed0b40 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Thu, 28 Aug 2014 21:45:46 -0700 Subject: [PATCH 0549/2053] [example] edit fine-tuning and train on ~2000 images, 1557 / 382 split - further detail merits of fine-tuning: less starving for itme and data - set random seed for reproducing the tutorial - 1557 train / 382 test split is more indicative of training quality than splits of 200 images --- .../assemble_data.py | 1 + .../flickr_style.csv.gz | Bin .../flickr_style_solver.prototxt} | 4 +- .../flickr_style_train_val.prototxt} | 0 examples/finetune_flickr_style/readme.md | 159 ++++++++++++++++++ .../models/.gitignore | 0 examples/finetuning_on_flickr_style/readme.md | 100 ----------- 7 files changed, 162 insertions(+), 102 deletions(-) rename examples/{finetuning_on_flickr_style => finetune_flickr_style}/assemble_data.py (99%) mode change 100644 => 100755 rename examples/{finetuning_on_flickr_style => finetune_flickr_style}/flickr_style.csv.gz (100%) rename examples/{finetuning_on_flickr_style/solver.prototxt => finetune_flickr_style/flickr_style_solver.prototxt} (69%) rename examples/{finetuning_on_flickr_style/train_val.prototxt => finetune_flickr_style/flickr_style_train_val.prototxt} (100%) create mode 100644 examples/finetune_flickr_style/readme.md delete mode 100644 examples/finetuning_on_flickr_style/models/.gitignore delete mode 100644 examples/finetuning_on_flickr_style/readme.md diff --git a/examples/finetuning_on_flickr_style/assemble_data.py b/examples/finetune_flickr_style/assemble_data.py old mode 100644 new mode 100755 similarity index 99% rename from examples/finetuning_on_flickr_style/assemble_data.py rename to examples/finetune_flickr_style/assemble_data.py index d8770e92914..b4c995e8eae --- a/examples/finetuning_on_flickr_style/assemble_data.py +++ b/examples/finetune_flickr_style/assemble_data.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python """ Form a subset of the Flickr Style data, download images to dirname, and write Caffe ImagesDataLayer training file. diff --git a/examples/finetuning_on_flickr_style/flickr_style.csv.gz b/examples/finetune_flickr_style/flickr_style.csv.gz similarity index 100% rename from examples/finetuning_on_flickr_style/flickr_style.csv.gz rename to examples/finetune_flickr_style/flickr_style.csv.gz diff --git a/examples/finetuning_on_flickr_style/solver.prototxt b/examples/finetune_flickr_style/flickr_style_solver.prototxt similarity index 69% rename from examples/finetuning_on_flickr_style/solver.prototxt rename to examples/finetune_flickr_style/flickr_style_solver.prototxt index ed1548c0aac..740ec39fe6a 100644 --- a/examples/finetuning_on_flickr_style/solver.prototxt +++ b/examples/finetune_flickr_style/flickr_style_solver.prototxt @@ -1,4 +1,4 @@ -net: "examples/finetuning_on_flickr_style/train_val.prototxt" +net: "examples/finetune_flickr_style/flickr_style_train_val.prototxt" test_iter: 100 test_interval: 1000 # lr for fine-tuning should be lower than when starting from scratch @@ -12,4 +12,4 @@ max_iter: 100000 momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 -snapshot_prefix: "examples/finetuning_on_flickr_style/models/finetuning" +snapshot_prefix: "examples/finetune_flickr_style/flickr_style" diff --git a/examples/finetuning_on_flickr_style/train_val.prototxt b/examples/finetune_flickr_style/flickr_style_train_val.prototxt similarity index 100% rename from examples/finetuning_on_flickr_style/train_val.prototxt rename to examples/finetune_flickr_style/flickr_style_train_val.prototxt diff --git a/examples/finetune_flickr_style/readme.md b/examples/finetune_flickr_style/readme.md new file mode 100644 index 00000000000..822499829e6 --- /dev/null +++ b/examples/finetune_flickr_style/readme.md @@ -0,0 +1,159 @@ +--- +title: Fine-tuning for style recognition +description: Fine-tune the ImageNet-trained CaffeNet on the "Flickr Style" dataset. +category: example +include_in_docs: true +layout: default +priority: 5 +--- + +# Fine-tuning CaffeNet for Style Recognition on "Flickr Style" Data + +Fine-tuning takes an already learned model, adapts the architecture, and resumes training from the already learned model weights. +Let's fine-tune the BVLC-distributed CaffeNet model on a different dataset, [Flickr Style](http://sergeykarayev.com/files/1311.3715v3.pdf), to predict image style instead of object category. + +## Explanation + +The Flickr-sourced images of the Style dataset are visually very similar to the ImageNet dataset, on which the `caffe_reference_imagenet_model` was trained. +Since that model works well for object category classification, we'd like to use it architecture for our style classifier. +We also only have 80,000 images to train on, so we'd like to start with the parameters learned on the 1,000,000 ImageNet images, and fine-tune as needed. +If we give provide the `weights` argument to the `caffe train` command, the pretrained weights will be loaded into our model, matching layers by name. + +Because we are predicting 20 classes instead of a 1,000, we do need to change the last layer in the model. +Therefore, we change the name of the last layer from `fc8` to `fc8_flickr` in our prototxt. +Since there is no layer named that in the `caffe_reference_imagenet_model`, that layer will begin training with random weights. + +We will also decrease the overall learning rate `base_lr` in the solver prototxt, but boost the `blobs_lr` on the newly introduced layer. +The idea is to have the rest of the model change very slowly with new data, but let the new layer learn fast. +Additionally, we set `stepsize` in the solver to a lower value than if we were training from scratch, since we're virtually far along in training and therefore want the learning rate to go down faster. +Note that we could also entirely prevent fine-tuning of all layers other than `fc8_flickr` by setting their `blobs_lr` to 0. + +## Procedure + +All steps are to be done from the caffe root directory. + +The dataset is distributed as a list of URLs with corresponding labels. +Using a script, we will download a small subset of the data and split it into train and val sets. + + caffe % ./examples/finetune_flickr_style/assemble_data.py -h + usage: assemble_data.py [-h] [-s SEED] [-i IMAGES] [-w WORKERS] + + Download a subset of Flickr Style to a directory + + optional arguments: + -h, --help show this help message and exit + -s SEED, --seed SEED random seed + -i IMAGES, --images IMAGES + number of images to use (-1 for all) + -w WORKERS, --workers WORKERS + num workers used to download images. -x uses (all - x) + cores. + + caffe % python examples/finetune_flickr_style/assemble_data.py --workers=-1 --images=2000 --seed 831486 + Downloading 2000 images with 7 workers... + Writing train/val for 1939 successfully downloaded images. + +This script downloads images and writes train/val file lists into `data/flickr_style`. +With this random seed there are 1,557 train images and 382 test images. +The prototxts in this example assume this, and also assume the presence of the ImageNet mean file (run `get_ilsvrc_aux.sh` from `data/ilsvrc12` to obtain this if you haven't yet). + +We'll also need the ImageNet-trained model, which you can obtain by running `get_caffe_reference_imagenet_model.sh` from `examples/imagenet`. + +Now we can train! (You can fine-tune in CPU mode by leaving out the `-gpu` flag.) + + caffe % ./build/tools/caffe train -solver examples/finetune_flickr_style/flickr_style_solver.prototxt -weights examples/imagenet/caffe_reference_imagenet_model -gpu 0 + + [...] + + I0828 22:10:04.025378 9718 solver.cpp:46] Solver scaffolding done. + I0828 22:10:04.025388 9718 caffe.cpp:95] Use GPU with device ID 0 + I0828 22:10:04.192004 9718 caffe.cpp:107] Finetuning from examples/imagenet/caffe_reference_imagenet_model + + [...] + + I0828 22:17:48.338963 11510 solver.cpp:165] Solving FlickrStyleCaffeNet + I0828 22:17:48.339010 11510 solver.cpp:251] Iteration 0, Testing net (#0) + I0828 22:18:14.313817 11510 solver.cpp:302] Test net output #0: accuracy = 0.0416 + I0828 22:18:14.476822 11510 solver.cpp:195] Iteration 0, loss = 3.75717 + I0828 22:18:14.476878 11510 solver.cpp:397] Iteration 0, lr = 0.001 + I0828 22:18:19.700408 11510 solver.cpp:195] Iteration 20, loss = 3.1689 + I0828 22:18:19.700461 11510 solver.cpp:397] Iteration 20, lr = 0.001 + I0828 22:18:24.924685 11510 solver.cpp:195] Iteration 40, loss = 2.3549 + I0828 22:18:24.924741 11510 solver.cpp:397] Iteration 40, lr = 0.001 + I0828 22:18:30.114858 11510 solver.cpp:195] Iteration 60, loss = 2.74191 + I0828 22:18:30.114910 11510 solver.cpp:397] Iteration 60, lr = 0.001 + I0828 22:18:35.328071 11510 solver.cpp:195] Iteration 80, loss = 1.9147 + I0828 22:18:35.328127 11510 solver.cpp:397] Iteration 80, lr = 0.001 + I0828 22:18:40.588317 11510 solver.cpp:195] Iteration 100, loss = 1.81419 + I0828 22:18:40.588373 11510 solver.cpp:397] Iteration 100, lr = 0.001 + I0828 22:18:46.171576 11510 solver.cpp:195] Iteration 120, loss = 2.02105 + I0828 22:18:46.171669 11510 solver.cpp:397] Iteration 120, lr = 0.001 + I0828 22:18:51.757809 11510 solver.cpp:195] Iteration 140, loss = 1.49083 + I0828 22:18:51.757863 11510 solver.cpp:397] Iteration 140, lr = 0.001 + I0828 22:18:57.345080 11510 solver.cpp:195] Iteration 160, loss = 1.35319 + I0828 22:18:57.345135 11510 solver.cpp:397] Iteration 160, lr = 0.001 + I0828 22:19:02.928794 11510 solver.cpp:195] Iteration 180, loss = 1.11658 + I0828 22:19:02.928850 11510 solver.cpp:397] Iteration 180, lr = 0.001 + I0828 22:19:08.514497 11510 solver.cpp:195] Iteration 200, loss = 1.08851 + I0828 22:19:08.514552 11510 solver.cpp:397] Iteration 200, lr = 0.001 + + [...] + + I0828 22:22:40.789010 11510 solver.cpp:195] Iteration 960, loss = 0.0844627 + I0828 22:22:40.789175 11510 solver.cpp:397] Iteration 960, lr = 0.001 + I0828 22:22:46.376626 11510 solver.cpp:195] Iteration 980, loss = 0.0110937 + I0828 22:22:46.376682 11510 solver.cpp:397] Iteration 980, lr = 0.001 + I0828 22:22:51.687258 11510 solver.cpp:251] Iteration 1000, Testing net (#0) + I0828 22:23:17.438894 11510 solver.cpp:302] Test net output #0: accuracy = 1 + +Note how rapidly the loss went down. Although the 100% accuracy is optimistic, it is evidence the model is learning quickly and well. + +For comparison, here is how the loss goes down when we do not start with a pre-trained model: + + I0828 22:24:18.624004 12919 solver.cpp:165] Solving FlickrStyleCaffeNet + I0828 22:24:18.624099 12919 solver.cpp:251] Iteration 0, Testing net (#0) + I0828 22:24:44.520992 12919 solver.cpp:302] Test net output #0: accuracy = 0.045 + I0828 22:24:44.676905 12919 solver.cpp:195] Iteration 0, loss = 3.33111 + I0828 22:24:44.677120 12919 solver.cpp:397] Iteration 0, lr = 0.001 + I0828 22:24:50.152454 12919 solver.cpp:195] Iteration 20, loss = 2.98133 + I0828 22:24:50.152509 12919 solver.cpp:397] Iteration 20, lr = 0.001 + I0828 22:24:55.736256 12919 solver.cpp:195] Iteration 40, loss = 3.02124 + I0828 22:24:55.736311 12919 solver.cpp:397] Iteration 40, lr = 0.001 + I0828 22:25:01.316514 12919 solver.cpp:195] Iteration 60, loss = 2.99509 + I0828 22:25:01.316567 12919 solver.cpp:397] Iteration 60, lr = 0.001 + I0828 22:25:06.899554 12919 solver.cpp:195] Iteration 80, loss = 2.9928 + I0828 22:25:06.899610 12919 solver.cpp:397] Iteration 80, lr = 0.001 + I0828 22:25:12.484624 12919 solver.cpp:195] Iteration 100, loss = 2.99072 + I0828 22:25:12.484678 12919 solver.cpp:397] Iteration 100, lr = 0.001 + I0828 22:25:18.069056 12919 solver.cpp:195] Iteration 120, loss = 3.01816 + I0828 22:25:18.069149 12919 solver.cpp:397] Iteration 120, lr = 0.001 + I0828 22:25:23.650928 12919 solver.cpp:195] Iteration 140, loss = 2.9694 + I0828 22:25:23.650984 12919 solver.cpp:397] Iteration 140, lr = 0.001 + I0828 22:25:29.235535 12919 solver.cpp:195] Iteration 160, loss = 3.00383 + I0828 22:25:29.235589 12919 solver.cpp:397] Iteration 160, lr = 0.001 + I0828 22:25:34.816898 12919 solver.cpp:195] Iteration 180, loss = 2.99802 + I0828 22:25:34.816953 12919 solver.cpp:397] Iteration 180, lr = 0.001 + I0828 22:25:40.396656 12919 solver.cpp:195] Iteration 200, loss = 2.99769 + I0828 22:25:40.396711 12919 solver.cpp:397] Iteration 200, lr = 0.001 + + [...] + + I0828 22:29:12.539094 12919 solver.cpp:195] Iteration 960, loss = 2.99314 + I0828 22:29:12.539258 12919 solver.cpp:397] Iteration 960, lr = 0.001 + I0828 22:29:18.123092 12919 solver.cpp:195] Iteration 980, loss = 2.99503 + I0828 22:29:18.123147 12919 solver.cpp:397] Iteration 980, lr = 0.001 + I0828 22:29:23.432059 12919 solver.cpp:251] Iteration 1000, Testing net (#0) + I0828 22:29:49.409044 12919 solver.cpp:302] Test net output #0: accuracy = 0.0624 + +This model is only beginning to learn. + +Fine-tuning can be feasible when training from scratch would not be for lack of time or data. +Even in CPU mode each pass through the training set takes ~100 s. GPU fine-tuning is of course faster still and can learn a useful model in minutes or hours instead of days or weeks. +Furthermore, note that the model has only trained on < 2,000 instances. Transfer learning a new task like style recognition from the ImageNet pretraining can require much less data than training from scratch. +Now try fine-tuning to your own tasks and data! + +## License + +The Flickr Style dataset as distributed here contains only URLs to images. +Some of the images may have copyright. +Training a category-recognition model for research/non-commercial use may constitute fair use of this data. diff --git a/examples/finetuning_on_flickr_style/models/.gitignore b/examples/finetuning_on_flickr_style/models/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/examples/finetuning_on_flickr_style/readme.md b/examples/finetuning_on_flickr_style/readme.md deleted file mode 100644 index 4a164e5f16a..00000000000 --- a/examples/finetuning_on_flickr_style/readme.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Fine-tuning CaffeNet on "Flickr Style" data -description: We fine-tune the ImageNet-trained CaffeNet on another dataset. -category: example -include_in_docs: true -layout: default -priority: 5 ---- - -# Fine-tuning CaffeNet on "Flickr Style" data - -This example shows how to fine-tune the BVLC-distributed CaffeNet model on a different dataset: [Flickr Style](http://sergeykarayev.com/files/1311.3715v3.pdf), which has style category labels. - -## Explanation - -The Flickr-sourced data of the Style dataset is visually very similar to the ImageNet dataset, on which the `caffe_reference_imagenet_model` was trained. -Since that model works well for object category classification, we'd like to use it architecture for our style classifier. -We also only have 80,000 images to train on, so we'd like to start with the parameters learned on the 1,000,000 ImageNet images, and fine-tune as needed. -If we give provide the `model` parameter to the `caffe train` command, the trained weights will be loaded into our model, matching layers by name. - -Because we are predicting 20 classes instead of a 1,000, we do need to change the last layer in the model. -Therefore, we change the name of the last layer from `fc8` to `fc8_flickr` in our prototxt. -Since there is no layer named that in the `caffe_reference_imagenet_model`, that layer will begin training with random weights. - -We will also decrease the overall learning rate `base_lr` in the solver prototxt, but boost the `blobs_lr` on the newly introduced layer. -The idea is to have the rest of the model change very slowly with new data, but the new layer needs to learn fast. -Additionally, we set `stepsize` in the solver to a lower value than if we were training from scratch, since we're virtually far along in training and therefore want the learning rate to go down faster. -Note that we could also entirely prevent fine-tuning of all layers other than `fc8_flickr` by setting their `blobs_lr` to 0. - -## Procedure - -All steps are to be done from the root caffe directory. - -The dataset is distributed as a list of URLs with corresponding labels. -Using a script, we will download a small subset of the data and split it into train and val sets. - - caffe % python examples/finetuning_on_flickr_style/assemble_data.py -h - usage: assemble_data.py [-h] [-s SEED] [-i IMAGES] [-w WORKERS] - - Download a subset of Flickr Style to a directory - - optional arguments: - -h, --help show this help message and exit - -s SEED, --seed SEED random seed - -i IMAGES, --images IMAGES - number of images to use (-1 for all) - -w WORKERS, --workers WORKERS - num workers used to download images. -x uses (all - x) - cores. - - caffe % python examples/finetuning_on_flickr_style/assemble_data.py --workers=-1 --images=200 - Downloading 200 images with 7 workers... - Writing train/val for 190 successfully downloaded images. - -This script downloads images and writes train/val file lists into `data/flickr_style`. -The prototxt's in this example assume this, and also assume the presence of the ImageNet mean file (run `get_ilsvrc_aux.sh` from `data/ilsvrc12` to obtain this if you haven't yet). - -We'll also need the ImageNet-trained model, which you can obtain by running `get_caffe_reference_imagenet_model.sh` from `examples/imagenet`. - -Now we can train! - - caffe % ./build/tools/caffe train -solver examples/finetuning_on_flickr_style/solver.prototxt -weights examples/imagenet/caffe_reference_imagenet_model - I0827 19:41:52.455621 2129298192 caffe.cpp:90] Starting Optimization - I0827 19:41:52.456883 2129298192 solver.cpp:32] Initializing solver from parameters: - - [...] - - I0827 19:41:55.520205 2129298192 solver.cpp:46] Solver scaffolding done. - I0827 19:41:55.520211 2129298192 caffe.cpp:99] Use CPU. - I0827 19:41:55.520217 2129298192 caffe.cpp:107] Finetuning from examples/imagenet/caffe_reference_imagenet_model - I0827 19:41:57.433044 2129298192 solver.cpp:165] Solving CaffeNet - I0827 19:41:57.433104 2129298192 solver.cpp:251] Iteration 0, Testing net (#0) - I0827 19:44:44.145447 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.004 - I0827 19:44:48.774271 2129298192 solver.cpp:195] Iteration 0, loss = 3.46922 - I0827 19:44:48.774333 2129298192 solver.cpp:397] Iteration 0, lr = 0.001 - I0827 19:46:15.107447 2129298192 solver.cpp:195] Iteration 20, loss = 0.0147678 - I0827 19:46:15.107511 2129298192 solver.cpp:397] Iteration 20, lr = 0.001 - I0827 19:47:41.941119 2129298192 solver.cpp:195] Iteration 40, loss = 0.00455839 - I0827 19:47:41.941181 2129298192 solver.cpp:397] Iteration 40, lr = 0.001 - -Note how rapidly the loss went down. -For comparison, here is how the loss goes down when we do not start with a pre-trained model: - - I0827 18:57:08.496208 2129298192 solver.cpp:46] Solver scaffolding done. - I0827 18:57:08.496227 2129298192 caffe.cpp:99] Use CPU. - I0827 18:57:08.496235 2129298192 solver.cpp:165] Solving CaffeNet - I0827 18:57:08.496271 2129298192 solver.cpp:251] Iteration 0, Testing net (#0) - I0827 19:00:00.894336 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.075 - I0827 19:00:05.825129 2129298192 solver.cpp:195] Iteration 0, loss = 3.51759 - I0827 19:00:05.825187 2129298192 solver.cpp:397] Iteration 0, lr = 0.001 - I0827 19:01:36.090224 2129298192 solver.cpp:195] Iteration 20, loss = 3.32227 - I0827 19:01:36.091948 2129298192 solver.cpp:397] Iteration 20, lr = 0.001 - I0827 19:03:08.522105 2129298192 solver.cpp:195] Iteration 40, loss = 2.97031 - I0827 19:03:08.522176 2129298192 solver.cpp:397] Iteration 40, lr = 0.001 - -## License - -The Flickr Style dataset as distributed here contains only URLs to images. -Some of the images may have copyright. -Training a category-recognition model for research/non-commercial use may constitute fair use of this data. From 5ea91dd1522a011c0f2fefa1a8102ca6f058f60b Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 29 Aug 2014 14:14:32 +0800 Subject: [PATCH 0550/2053] Ignore LevelDB files --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 07eebe34591..c349a3e1179 100644 --- a/.gitignore +++ b/.gitignore @@ -58,6 +58,13 @@ data/* *leveldb *lmdb +# LevelDB files +*.ldb +LOCK +LOG* +CURRENT +MANIFEST-* + # Generated documentation docs/_site docs/gathered From 1c49d630c771f8cb99d4fcc9cecbfc87799112a4 Mon Sep 17 00:00:00 2001 From: Daniel Golden Date: Wed, 27 Aug 2014 09:25:10 -0700 Subject: [PATCH 0551/2053] Explain how to fix homebrew to allow updates after editing formulae --- docs/installation.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/installation.md b/docs/installation.md index 1ac6c08b6ca..8e5078ab36a 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -193,6 +193,38 @@ If you're not using Anaconda, include `hdf5` in the list above. **Note** that in order to build the caffe python wrappers you must install boost using the --with-python option: brew install --build-from-source --with-python --fresh -vd boost + +**Note** that Homebrew maintains itself as a separate git repository and making the above `brew edit FORMULA` changes will change files in your local copy of homebrew's master branch. By default, this will prevent you from updating Homebrew using `brew update`, as you will get an error message like the following: + + $ brew update + error: Your local changes to the following files would be overwritten by merge: + Library/Formula/lmdb.rb + Please, commit your changes or stash them before you can merge. + Aborting + Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master + +One solution is to commit your changes to a separate Homebrew branch, run `brew update`, and rebase your changes onto the updated master, as follows: + + cd /usr/local + git checkout -b caffe + git add . + git commit -m "Update Caffe dependencies to use libstdc++" + git checkout master + brew update + git rebase master caffe + # Resolve any merge conflicts here + git checkout caffe + +At this point, you should be running the latest Homebrew packages and your Caffe-related modifications will remain in place. You may still get the following error: + + $ brew update + error: Your local changes to the following files would be overwritten by merge: + opencv.rb + Please, commit your changes or stash them before you can merge. + Aborting + Error: Failed to update tap: homebrew/science + +but non-OpenCV packages will still update as expected. #### Windows From ea04cf82686af668a5da8827443a2c9f7e6daf2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20=C3=87a=C4=9Flayan?= Date: Thu, 28 Aug 2014 14:05:09 +0300 Subject: [PATCH 0552/2053] [docs] Several documentation fixes - Fix a typo and a path in MNIST tutorial - Rework instructions about Fedora installation --- docs/installation.md | 6 +++--- examples/mnist/readme.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 8e5078ab36a..898425a8b04 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -96,9 +96,9 @@ On **CentOS / RHEL / Fedora**, most of the dependencies can be installed with The Google flags library, Google logging library and LMDB already made their ways into newer versions of **CentOS / RHEL / Fedora** so it is better to first attempt to install them using `yum` - sudo yum install gflags-devel glog-devel lmdb + sudo yum install gflags-devel glog-devel lmdb-devel -**Finally** in case you couldn't find those 3 libraries in your distribution's repositories, here are the instructions to follow for manually building and installing them on **Ubuntu 12.04 / CentOS / RHEL / Fedora** +**Finally** in case you couldn't find those extra libraries mentioned above in your distribution's repositories, here are the instructions to follow for manually building and installing them on **Ubuntu 12.04 / CentOS / RHEL / Fedora** (or practically on any Linux distribution) # glog wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz @@ -232,7 +232,7 @@ There is an unofficial Windows port of Caffe at [niuzhiheng/caffe:windows](https ## Compilation -Now that you have the prerequisites, edit your `Makefile.config` to change the paths for your setup. +Now that you have the prerequisites, edit your `Makefile.config` to change the paths for your setup (you should especially uncomment and set `BLAS_LIB` accordingly on distributions like **CentOS / RHEL / Fedora** where ATLAS is installed under `/usr/lib[64]/atlas`) The defaults should work, but uncomment the relevant lines if using Anaconda Python. cp Makefile.config.example Makefile.config diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 266ff4c9689..975a77e5128 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -26,13 +26,13 @@ If it complains that `wget` or `gunzip` are not installed, you need to install t Before we actually run the training program, let's explain what will happen. We will use the [LeNet](http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf) network, which is known to work well on digit classification tasks. We will use a slightly different version from the original LeNet implementation, replacing the sigmoid activations with Rectified Linear Unit (ReLU) activations for the neurons. -The design of LeNet contains the essence of CNNs that are still used in larger models such as the ones in ImageNet. In general, it consists of a convolutional layer followed by a pooling layer, another convolution layer followed by a pooling layer, and then two fully connected layers similar to the conventional multilayer perceptrons. We have defined the layers in `CAFFE_ROOT/data/lenet.prototxt`. +The design of LeNet contains the essence of CNNs that are still used in larger models such as the ones in ImageNet. In general, it consists of a convolutional layer followed by a pooling layer, another convolution layer followed by a pooling layer, and then two fully connected layers similar to the conventional multilayer perceptrons. We have defined the layers in `CAFFE_ROOT/examples/lenet.prototxt`. ## Define the MNIST Network This section explains the prototxt file `lenet_train.prototxt` used in the MNIST demo. We assume that you are familiar with [Google Protobuf](https://developers.google.com/protocol-buffers/docs/overview), and assume that you have read the protobuf definitions used by Caffe, which can be found at [src/caffe/proto/caffe.proto](https://github.com/Yangqing/caffe/blob/master/src/caffe/proto/caffe.proto). -Specifically, we will write a `caffe::NetParameter` (or in python, `caffe.proto.caffe_pb2.NetParameter`) protubuf. We will start by giving the network a name: +Specifically, we will write a `caffe::NetParameter` (or in python, `caffe.proto.caffe_pb2.NetParameter`) protobuf. We will start by giving the network a name: name: "LeNet" From 190c43e06adb92c112b122198b093b55706862ec Mon Sep 17 00:00:00 2001 From: Yung Siang Liau Date: Sun, 31 Aug 2014 01:22:04 +0800 Subject: [PATCH 0553/2053] Fix norm_region param in cifar10 deployment net --- examples/cifar10/cifar10_full.prototxt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cifar10/cifar10_full.prototxt b/examples/cifar10/cifar10_full.prototxt index 9e7016362fc..8bbd30004fd 100644 --- a/examples/cifar10/cifar10_full.prototxt +++ b/examples/cifar10/cifar10_full.prototxt @@ -75,7 +75,6 @@ layers { bottom: "conv2" top: "pool2" pooling_param { - norm_region: WITHIN_CHANNEL pool: AVE kernel_size: 3 stride: 2 @@ -87,6 +86,7 @@ layers { bottom: "pool2" top: "norm2" lrn_param { + norm_region: WITHIN_CHANNEL local_size: 3 alpha: 5e-05 beta: 0.75 From a888de30b85bc89307c22b33da7377417bfd2b02 Mon Sep 17 00:00:00 2001 From: qipeng Date: Sat, 30 Aug 2014 10:28:15 -0700 Subject: [PATCH 0554/2053] patch MacOS NVCC boost::thread issue --- include/caffe/internal_thread.hpp | 18 +++++++++++++++--- include/caffe/util/thread_wrapper.hpp | 25 +++++++++++++++++++++++++ src/caffe/internal_thread.cpp | 5 ++++- 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 include/caffe/util/thread_wrapper.hpp diff --git a/include/caffe/internal_thread.hpp b/include/caffe/internal_thread.hpp index 9989936e519..48ee113878d 100644 --- a/include/caffe/internal_thread.hpp +++ b/include/caffe/internal_thread.hpp @@ -1,12 +1,24 @@ #ifndef CAFFE_INTERNAL_THREAD_HPP_ #define CAFFE_INTERNAL_THREAD_HPP_ -#include - #include "caffe/common.hpp" namespace caffe { +/** + * A minimal wrapper for boost::thread to force host compilation for boost + * Defined in caffe/util/thread_wrapper.cpp + */ +class ThreadWrapper { + public: + template + ThreadWrapper(Callable func, A1 a1); + void join(); + bool joinable(); + private: + void* thread_; +}; + /** * Virutal class encapsulate boost::thread for use in base class * The child class will acquire the ability to run a single thread, @@ -30,7 +42,7 @@ class InternalThread { with the code you want your thread to run. */ virtual void InternalThreadEntry() {} - boost::thread* thread_; + caffe::ThreadWrapper* thread_; }; } // namespace caffe diff --git a/include/caffe/util/thread_wrapper.hpp b/include/caffe/util/thread_wrapper.hpp new file mode 100644 index 00000000000..5842d9a27fc --- /dev/null +++ b/include/caffe/util/thread_wrapper.hpp @@ -0,0 +1,25 @@ +#ifndef CAFFE_THREAD_WRAPPER_CPP_HPP_ +#define CAFFE_THREAD_WRAPPER_CPP_HPP_ + +#include +#include "caffe/common.hpp" +#include "caffe/internal_thread.hpp" + +namespace caffe { + +template +ThreadWrapper::ThreadWrapper(Callable func, A1 a1) { + this->thread_ = new boost::thread(func, a1); +} + +void ThreadWrapper::join() { + static_cast(this->thread_)->join(); +} + +bool ThreadWrapper::joinable() { + return static_cast(this->thread_)->joinable(); +} + +} // namespace caffe + +#endif diff --git a/src/caffe/internal_thread.cpp b/src/caffe/internal_thread.cpp index b89aa2ef061..89c4147f2bb 100644 --- a/src/caffe/internal_thread.cpp +++ b/src/caffe/internal_thread.cpp @@ -1,5 +1,7 @@ #include "caffe/internal_thread.hpp" +#include "caffe/util/thread_wrapper.hpp" + namespace caffe { InternalThread::~InternalThread() { @@ -11,7 +13,8 @@ InternalThread::~InternalThread() { bool InternalThread::StartInternalThread() { try { - thread_ = new boost::thread(&InternalThread::InternalThreadEntry, this); + thread_ = new caffe::ThreadWrapper + (&InternalThread::InternalThreadEntry, this); } catch (...) { return false; } From 1a71867e676173c7f45366b4088b08b854a6f34e Mon Sep 17 00:00:00 2001 From: qipeng Date: Sat, 30 Aug 2014 10:38:33 -0700 Subject: [PATCH 0555/2053] xcode compiler complaints (warnings)... --- include/caffe/util/io.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 8ff8b0c25ae..546c3d6af80 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -14,7 +14,7 @@ namespace leveldb { // Forward declaration for leveldb::Options to be used in GetlevelDBOptions(). -class Options; +struct Options; } namespace caffe { From 8742fe665787efe2e32664b0f9ff2bc5b72dfaeb Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 29 Aug 2014 03:31:33 -0700 Subject: [PATCH 0556/2053] fix data_transformer param_name --- include/caffe/data_transformer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 302bf70e606..5d5134f5db5 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -31,7 +31,7 @@ class DataTransformer { * @param datum * Datum containing the data to be transformed. * @param mean - * @param top_data + * @param transformed_data * This is meant to be the top blob's data. The transformed data will be * written at the appropriate place within the blob's data. */ From c9f938b338cd6ae200847d3fcb40649b330106ab Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 30 Aug 2014 16:06:17 -0700 Subject: [PATCH 0557/2053] [docs] new PR policy: send master fixes + docs to master To address fixes and documentation updates to master between official releases from `dev` to `master` PRs will be accepted to `master`. All new development must still branch off and PR to `dev`. --- docs/development.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/development.md b/docs/development.md index d586a2b1c30..822d88023f5 100644 --- a/docs/development.md +++ b/docs/development.md @@ -44,7 +44,7 @@ Use this if you want more stability. ### Issues & Pull Request Protocol -Use Github Issues to report [bugs], propose features, and ask [questions]. +Use Github Issues to report [bugs], propose features, and ask development [questions]. Large-scale development work is guided by [milestones], which are sets of Issues selected for concurrent release (integration from `dev` to `master`). Please note that since the core developers are largely researchers, we may work on a feature in isolation for some time before releasing it to the community, so as to claim honest academic contribution. @@ -52,12 +52,14 @@ We do release things as soon as a reasonable technical report may be written, an When you are ready to start developing your feature or fixing a bug, follow this protocol: -- Do new development in [feature branches] with descriptive names. -- Bring your work up-to-date by [rebasing] onto the latest `dev`. +- Develop in [feature branches] with descriptive names. + - For new development branch off `dev`. + - For documentation and fixes for `master` branch off `master`. +- Bring your work up-to-date by [rebasing] onto the latest `dev` / `master`. (Polish your changes by [interactive rebase], if you'd like.) -- [Pull request] your contribution to `BVLC/caffe`'s `dev` branch for discussion and review. +- [Pull request] your contribution to `BVLC/caffe`'s `dev` / `master` branch for discussion and review. - Make PRs *as soon as development begins*, to let discussion guide development. - - A PR is only ready for merge review when it is a fast-forward merge to dev, and all code is documented, linted, and tested -- that means your PR must include tests! + - A PR is only ready for merge review when it is a fast-forward merge, and all code is documented, linted, and tested -- that means your PR must include tests! - When the PR satisfies the above properties, use comments to request maintainer review. Below is a poetic presentation of the protocol in code form. From b036c1df7741808d3e65195c532d7b273e1e6783 Mon Sep 17 00:00:00 2001 From: qipeng Date: Sat, 30 Aug 2014 16:31:33 -0700 Subject: [PATCH 0558/2053] renaming && typo fix --- include/caffe/internal_thread.hpp | 8 ++++---- include/caffe/util/{thread_wrapper.hpp => thread.hpp} | 10 +++++----- src/caffe/internal_thread.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) rename include/caffe/util/{thread_wrapper.hpp => thread.hpp} (65%) diff --git a/include/caffe/internal_thread.hpp b/include/caffe/internal_thread.hpp index 48ee113878d..245ffa080e6 100644 --- a/include/caffe/internal_thread.hpp +++ b/include/caffe/internal_thread.hpp @@ -7,12 +7,12 @@ namespace caffe { /** * A minimal wrapper for boost::thread to force host compilation for boost - * Defined in caffe/util/thread_wrapper.cpp + * Defined in caffe/util/thread.hpp */ -class ThreadWrapper { +class Thread { public: template - ThreadWrapper(Callable func, A1 a1); + Thread(Callable func, A1 a1); void join(); bool joinable(); private: @@ -20,7 +20,7 @@ class ThreadWrapper { }; /** - * Virutal class encapsulate boost::thread for use in base class + * Virtual class encapsulate boost::thread for use in base class * The child class will acquire the ability to run a single thread, * by reimplementing the virutal function InternalThreadEntry. */ diff --git a/include/caffe/util/thread_wrapper.hpp b/include/caffe/util/thread.hpp similarity index 65% rename from include/caffe/util/thread_wrapper.hpp rename to include/caffe/util/thread.hpp index 5842d9a27fc..7251402cf1a 100644 --- a/include/caffe/util/thread_wrapper.hpp +++ b/include/caffe/util/thread.hpp @@ -1,5 +1,5 @@ -#ifndef CAFFE_THREAD_WRAPPER_CPP_HPP_ -#define CAFFE_THREAD_WRAPPER_CPP_HPP_ +#ifndef CAFFE_THREAD_CPP_HPP_ +#define CAFFE_THREAD_CPP_HPP_ #include #include "caffe/common.hpp" @@ -8,15 +8,15 @@ namespace caffe { template -ThreadWrapper::ThreadWrapper(Callable func, A1 a1) { +Thread::Thread(Callable func, A1 a1) { this->thread_ = new boost::thread(func, a1); } -void ThreadWrapper::join() { +void Thread::join() { static_cast(this->thread_)->join(); } -bool ThreadWrapper::joinable() { +bool Thread::joinable() { return static_cast(this->thread_)->joinable(); } diff --git a/src/caffe/internal_thread.cpp b/src/caffe/internal_thread.cpp index 89c4147f2bb..1e2b3366f9b 100644 --- a/src/caffe/internal_thread.cpp +++ b/src/caffe/internal_thread.cpp @@ -1,6 +1,6 @@ #include "caffe/internal_thread.hpp" -#include "caffe/util/thread_wrapper.hpp" +#include "caffe/util/thread.hpp" namespace caffe { From 39acda0ccd45a64476fe146b40723ca259663c1d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 30 Aug 2014 16:37:51 -0700 Subject: [PATCH 0559/2053] fix up renaming --- include/caffe/internal_thread.hpp | 2 +- src/caffe/internal_thread.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/caffe/internal_thread.hpp b/include/caffe/internal_thread.hpp index 245ffa080e6..6a106e6eefa 100644 --- a/include/caffe/internal_thread.hpp +++ b/include/caffe/internal_thread.hpp @@ -42,7 +42,7 @@ class InternalThread { with the code you want your thread to run. */ virtual void InternalThreadEntry() {} - caffe::ThreadWrapper* thread_; + caffe::Thread* thread_; }; } // namespace caffe diff --git a/src/caffe/internal_thread.cpp b/src/caffe/internal_thread.cpp index 1e2b3366f9b..e8cfc861932 100644 --- a/src/caffe/internal_thread.cpp +++ b/src/caffe/internal_thread.cpp @@ -13,7 +13,7 @@ InternalThread::~InternalThread() { bool InternalThread::StartInternalThread() { try { - thread_ = new caffe::ThreadWrapper + thread_ = new caffe::Thread (&InternalThread::InternalThreadEntry, this); } catch (...) { return false; From 1193b25c1795da321cdc2de3a9131557a4c8daca Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 30 Aug 2014 16:41:01 -0700 Subject: [PATCH 0560/2053] Makefile: fix boost::thread linking, drop pthread, sort --- Makefile | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 9c420249887..731e6fd1f35 100644 --- a/Makefile +++ b/Makefile @@ -159,9 +159,9 @@ ifneq ($(CPU_ONLY), 1) LIBRARIES := cudart cublas curand endif LIBRARIES += \ - glog gflags pthread protobuf leveldb snappy \ + glog gflags protobuf leveldb snappy \ lmdb \ - boost_system boost_thread \ + boost_system \ hdf5_hl hdf5 \ opencv_core opencv_highgui opencv_imgproc PYTHON_LIBRARIES := boost_python python2.7 @@ -205,16 +205,8 @@ ifeq ($(LINUX), 1) ifeq ($(shell echo $(GCCVERSION) \< 4.6 | bc), 1) WARNINGS += -Wno-uninitialized endif -endif - -# CPU-only configuration -ifeq ($(CPU_ONLY), 1) - OBJS := $(PROTO_OBJS) $(CXX_OBJS) - TEST_OBJS := $(TEST_CXX_OBJS) - TEST_BINS := $(TEST_CXX_BINS) - ALL_WARNS := $(ALL_CXX_WARNS) - TEST_FILTER := --gtest_filter="-*GPU*" - COMMON_FLAGS += -DCPU_ONLY + # boost::thread is reasonably called boost_thread (compare OS X) + LIBRARIES += boost_thread endif # OS X: @@ -228,6 +220,8 @@ ifeq ($(OSX), 1) CXXFLAGS += -stdlib=libstdc++ LINKFLAGS += -stdlib=libstdc++ endif + # boost::thread is called boost_thread-mt to mark multithreading on OS X + LIBRARIES += boost_thread-mt endif # Custom compiler @@ -242,6 +236,16 @@ else COMMON_FLAGS += -DNDEBUG -O2 endif +# CPU-only configuration +ifeq ($(CPU_ONLY), 1) + OBJS := $(PROTO_OBJS) $(CXX_OBJS) + TEST_OBJS := $(TEST_CXX_OBJS) + TEST_BINS := $(TEST_CXX_BINS) + ALL_WARNS := $(ALL_CXX_WARNS) + TEST_FILTER := --gtest_filter="-*GPU*" + COMMON_FLAGS += -DCPU_ONLY +endif + # BLAS configuration (default = ATLAS) BLAS ?= atlas ifeq ($(BLAS), mkl) @@ -273,7 +277,7 @@ LIBRARY_DIRS += $(BLAS_LIB) # Complete build flags. COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir)) -CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) +CXXFLAGS += -fPIC $(COMMON_FLAGS) $(WARNINGS) NVCCFLAGS := -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) # mex may invoke an older gcc that is too liberal with -Wuninitalized MATLAB_CXXFLAGS := $(CXXFLAGS) -Wno-uninitialized From 67ae8dec664d6f098b8582af5e601fdcd475fd13 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 30 Aug 2014 16:59:02 -0700 Subject: [PATCH 0561/2053] fix up leveldb ignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c349a3e1179..810c178f672 100644 --- a/.gitignore +++ b/.gitignore @@ -59,7 +59,7 @@ data/* *lmdb # LevelDB files -*.ldb +*.sst LOCK LOG* CURRENT From 45a80fa588be78e7a7ef8bbc28ba5893b28190ac Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 30 Aug 2014 21:32:21 -0700 Subject: [PATCH 0562/2053] ignore leveldb extension: ldb --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 810c178f672..62d96f8e9dd 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ data/* # LevelDB files *.sst +*.ldb LOCK LOG* CURRENT From 4dcb96e42dfa212d07c351e4a75c158a5ec95b9b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 30 Aug 2014 21:37:12 -0700 Subject: [PATCH 0563/2053] remove residual pthread references, but restore in build for gtest gtest depends on pthread in Ubuntu 14.04 --- Makefile | 4 ++-- include/caffe/loss_layers.hpp | 1 - include/caffe/neuron_layers.hpp | 1 - src/caffe/layers/data_layer.cpp | 2 +- src/caffe/layers/data_layer.cu | 1 - src/caffe/layers/image_data_layer.cpp | 2 +- src/caffe/layers/window_data_layer.cpp | 3 --- src/caffe/layers/window_data_layer.cu | 4 ---- 8 files changed, 4 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 731e6fd1f35..b6e04444fb0 100644 --- a/Makefile +++ b/Makefile @@ -158,7 +158,7 @@ ifneq ($(CPU_ONLY), 1) LIBRARY_DIRS += $(CUDA_LIB_DIR) LIBRARIES := cudart cublas curand endif -LIBRARIES += \ +LIBRARIES += pthread \ glog gflags protobuf leveldb snappy \ lmdb \ boost_system \ @@ -277,7 +277,7 @@ LIBRARY_DIRS += $(BLAS_LIB) # Complete build flags. COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir)) -CXXFLAGS += -fPIC $(COMMON_FLAGS) $(WARNINGS) +CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) NVCCFLAGS := -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) # mex may invoke an older gcc that is too liberal with -Wuninitalized MATLAB_CXXFLAGS := $(CXXFLAGS) -Wno-uninitialized diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index f24b1b749f3..df887b8f856 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -8,7 +8,6 @@ #include "boost/scoped_ptr.hpp" #include "hdf5.h" #include "leveldb/db.h" -#include "pthread.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index d17120fa73a..b5bbc5b6482 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -7,7 +7,6 @@ #include "boost/scoped_ptr.hpp" #include "hdf5.h" -#include "pthread.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index a815c4a6a16..519b666e35b 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -13,7 +13,7 @@ namespace caffe { -// This function is used to create a pthread that prefetches the data. +// This function is used to create a thread that prefetches the data. template void DataLayer::InternalThreadEntry() { Datum datum; diff --git a/src/caffe/layers/data_layer.cu b/src/caffe/layers/data_layer.cu index 467b146fa1f..28ca2c1082a 100644 --- a/src/caffe/layers/data_layer.cu +++ b/src/caffe/layers/data_layer.cu @@ -2,7 +2,6 @@ #include #include "leveldb/db.h" -#include "pthread.h" #include "stdint.h" #include "caffe/layer.hpp" diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index ce8338bc028..5039ad03b08 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -12,7 +12,7 @@ namespace caffe { -// This function is used to create a pthread that prefetches the data. +// This function is used to create a thread that prefetches the data. template void ImageDataLayer::InternalThreadEntry() { Datum datum; diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 82bee0ecd19..ab12c61a08a 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -1,6 +1,3 @@ -// -// Based on data_layer.cpp by Yangqing Jia. - #include #include diff --git a/src/caffe/layers/window_data_layer.cu b/src/caffe/layers/window_data_layer.cu index 475ec265a6b..947f2a39e7e 100644 --- a/src/caffe/layers/window_data_layer.cu +++ b/src/caffe/layers/window_data_layer.cu @@ -1,7 +1,3 @@ -// -// Based on data_layer.cpp by Yangqing Jia. - -#include #include #include From e7f712eb977287ef89c63385aaa291c5672ca3b1 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sat, 30 Aug 2014 23:48:41 -0700 Subject: [PATCH 0564/2053] [pycaffe] use class names of the form Py* instead of Caffe* --- python/caffe/_caffe.cpp | 140 ++++++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 3103d0267be..0014c581bc9 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -47,9 +47,9 @@ static void CheckFile(const string& filename) { // wrap shared_ptr > in a class that we construct in C++ and pass // to Python -class CaffeBlob { +class PyBlob { public: - CaffeBlob(const shared_ptr > &blob, const string& name) + PyBlob(const shared_ptr > &blob, const string& name) : blob_(blob), name_(name) {} string name() const { return name_; } @@ -60,7 +60,7 @@ class CaffeBlob { int count() const { return blob_->count(); } // this is here only to satisfy boost's vector_indexing_suite - bool operator == (const CaffeBlob &other) { + bool operator == (const PyBlob &other) { return this->blob_ == other.blob_; } @@ -73,10 +73,10 @@ class CaffeBlob { // We need another wrapper (used as boost::python's HeldType) that receives a // self PyObject * which we can use as ndarray.base, so that data/diff memory // is not freed while still being used in Python. -class CaffeBlobWrap : public CaffeBlob { +class PyBlobWrap : public PyBlob { public: - CaffeBlobWrap(PyObject *p, const CaffeBlob &blob) - : CaffeBlob(blob), self_(p) {} + PyBlobWrap(PyObject *p, const PyBlob &blob) + : PyBlob(blob), self_(p) {} object get_data() { npy_intp dims[] = {num(), channels(), height(), width()}; @@ -107,22 +107,22 @@ class CaffeBlobWrap : public CaffeBlob { }; -class CaffeLayer { +class PyLayer { public: - CaffeLayer(const shared_ptr > &layer, const string &name) + PyLayer(const shared_ptr > &layer, const string &name) : layer_(layer), name_(name) {} string name() const { return name_; } - vector blobs() { - vector result; + vector blobs() { + vector result; for (int i = 0; i < layer_->blobs().size(); ++i) { - result.push_back(CaffeBlob(layer_->blobs()[i], name_)); + result.push_back(PyBlob(layer_->blobs()[i], name_)); } return result; } // this is here only to satisfy boost's vector_indexing_suite - bool operator == (const CaffeLayer &other) { + bool operator == (const PyLayer &other) { return this->layer_ == other.layer_; } @@ -132,22 +132,22 @@ class CaffeLayer { }; -// A simple wrapper over CaffeNet that runs the forward process. -struct CaffeNet { +// A simple wrapper over PyNet that runs the forward process. +struct PyNet { // For cases where parameters will be determined later by the Python user, // create a Net with unallocated parameters (which will not be zero-filled // when accessed). - explicit CaffeNet(string param_file) { + explicit PyNet(string param_file) { Init(param_file); } - CaffeNet(string param_file, string pretrained_param_file) { + PyNet(string param_file, string pretrained_param_file) { Init(param_file); CheckFile(pretrained_param_file); net_->CopyTrainedLayersFrom(pretrained_param_file); } - explicit CaffeNet(shared_ptr > net) + explicit PyNet(shared_ptr > net) : net_(net) {} void Init(string param_file) { @@ -156,7 +156,7 @@ struct CaffeNet { } - virtual ~CaffeNet() {} + virtual ~PyNet() {} // Generate Python exceptions for badly shaped or discontiguous arrays. inline void check_contiguous_array(PyArrayObject* arr, string name, @@ -238,18 +238,18 @@ struct CaffeNet { void set_phase_test() { Caffe::set_phase(Caffe::TEST); } void set_device(int device_id) { Caffe::SetDevice(device_id); } - vector blobs() { - vector result; + vector blobs() { + vector result; for (int i = 0; i < net_->blobs().size(); ++i) { - result.push_back(CaffeBlob(net_->blobs()[i], net_->blob_names()[i])); + result.push_back(PyBlob(net_->blobs()[i], net_->blob_names()[i])); } return result; } - vector layers() { - vector result; + vector layers() { + vector result; for (int i = 0; i < net_->layers().size(); ++i) { - result.push_back(CaffeLayer(net_->layers()[i], net_->layer_names()[i])); + result.push_back(PyLayer(net_->layers()[i], net_->layer_names()[i])); } return result; } @@ -284,19 +284,19 @@ struct CaffeNet { object input_labels_; }; -class CaffeSGDSolver { +class PySGDSolver { public: - explicit CaffeSGDSolver(const string& param_file) { - // as in CaffeNet, (as a convenience, not a guarantee), create a Python + explicit PySGDSolver(const string& param_file) { + // as in PyNet, (as a convenience, not a guarantee), create a Python // exception if param_file can't be opened CheckFile(param_file); solver_.reset(new SGDSolver(param_file)); // we need to explicitly store the net wrapper, rather than constructing // it on the fly, so that it can hold references to Python objects - net_.reset(new CaffeNet(solver_->net())); + net_.reset(new PyNet(solver_->net())); } - shared_ptr net() { return net_; } + shared_ptr net() { return net_; } void Solve() { return solver_->Solve(); } void SolveResume(const string& resume_file) { CheckFile(resume_file); @@ -304,7 +304,7 @@ class CaffeSGDSolver { } protected: - shared_ptr net_; + shared_ptr net_; shared_ptr > solver_; }; @@ -313,54 +313,54 @@ class CaffeSGDSolver { BOOST_PYTHON_MODULE(_caffe) { // below, we prepend an underscore to methods that will be replaced // in Python - boost::python::class_ >( + boost::python::class_ >( "Net", boost::python::init()) .def(boost::python::init()) - .def("_forward", &CaffeNet::Forward) - .def("_backward", &CaffeNet::Backward) - .def("set_mode_cpu", &CaffeNet::set_mode_cpu) - .def("set_mode_gpu", &CaffeNet::set_mode_gpu) - .def("set_phase_train", &CaffeNet::set_phase_train) - .def("set_phase_test", &CaffeNet::set_phase_test) - .def("set_device", &CaffeNet::set_device) - .add_property("_blobs", &CaffeNet::blobs) - .add_property("layers", &CaffeNet::layers) - .add_property("inputs", &CaffeNet::inputs) - .add_property("outputs", &CaffeNet::outputs) - .add_property("mean", &CaffeNet::mean_) - .add_property("input_scale", &CaffeNet::input_scale_) - .add_property("raw_scale", &CaffeNet::raw_scale_) - .add_property("channel_swap", &CaffeNet::channel_swap_) - .def("_set_input_arrays", &CaffeNet::set_input_arrays) - .def("save", &CaffeNet::save); - - boost::python::class_( + .def("_forward", &PyNet::Forward) + .def("_backward", &PyNet::Backward) + .def("set_mode_cpu", &PyNet::set_mode_cpu) + .def("set_mode_gpu", &PyNet::set_mode_gpu) + .def("set_phase_train", &PyNet::set_phase_train) + .def("set_phase_test", &PyNet::set_phase_test) + .def("set_device", &PyNet::set_device) + .add_property("_blobs", &PyNet::blobs) + .add_property("layers", &PyNet::layers) + .add_property("inputs", &PyNet::inputs) + .add_property("outputs", &PyNet::outputs) + .add_property("mean", &PyNet::mean_) + .add_property("input_scale", &PyNet::input_scale_) + .add_property("raw_scale", &PyNet::raw_scale_) + .add_property("channel_swap", &PyNet::channel_swap_) + .def("_set_input_arrays", &PyNet::set_input_arrays) + .def("save", &PyNet::save); + + boost::python::class_( "Blob", boost::python::no_init) - .add_property("name", &CaffeBlob::name) - .add_property("num", &CaffeBlob::num) - .add_property("channels", &CaffeBlob::channels) - .add_property("height", &CaffeBlob::height) - .add_property("width", &CaffeBlob::width) - .add_property("count", &CaffeBlob::count) - .add_property("data", &CaffeBlobWrap::get_data) - .add_property("diff", &CaffeBlobWrap::get_diff); - - boost::python::class_( + .add_property("name", &PyBlob::name) + .add_property("num", &PyBlob::num) + .add_property("channels", &PyBlob::channels) + .add_property("height", &PyBlob::height) + .add_property("width", &PyBlob::width) + .add_property("count", &PyBlob::count) + .add_property("data", &PyBlobWrap::get_data) + .add_property("diff", &PyBlobWrap::get_diff); + + boost::python::class_( "Layer", boost::python::no_init) - .add_property("name", &CaffeLayer::name) - .add_property("blobs", &CaffeLayer::blobs); + .add_property("name", &PyLayer::name) + .add_property("blobs", &PyLayer::blobs); - boost::python::class_( + boost::python::class_( "SGDSolver", boost::python::init()) - .add_property("net", &CaffeSGDSolver::net) - .def("solve", &CaffeSGDSolver::Solve) - .def("solve", &CaffeSGDSolver::SolveResume); + .add_property("net", &PySGDSolver::net) + .def("solve", &PySGDSolver::Solve) + .def("solve", &PySGDSolver::SolveResume); - boost::python::class_ >("BlobVec") - .def(vector_indexing_suite, true>()); + boost::python::class_ >("BlobVec") + .def(vector_indexing_suite, true>()); - boost::python::class_ >("LayerVec") - .def(vector_indexing_suite, true>()); + boost::python::class_ >("LayerVec") + .def(vector_indexing_suite, true>()); import_array(); } From 9d541499a992d89347602c198560f440fabae43e Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sat, 30 Aug 2014 23:49:44 -0700 Subject: [PATCH 0565/2053] [pycaffe] live in caffe namespace instead of opening it --- python/caffe/_caffe.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 0014c581bc9..dd4062c25f4 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -22,8 +22,6 @@ #define PyArray_SetBaseObject(arr, x) (PyArray_BASE(arr) = (x)) #endif - -using namespace caffe; // NOLINT(build/namespaces) using boost::python::dict; using boost::python::extract; using boost::python::len; @@ -32,6 +30,8 @@ using boost::python::object; using boost::python::handle; using boost::python::vector_indexing_suite; +namespace caffe { + // for convenience, check that input files can be opened, and raise an // exception that boost will send to Python if not (caffe could still crash // later if the input files are disturbed before they are actually used, but @@ -364,3 +364,5 @@ BOOST_PYTHON_MODULE(_caffe) { import_array(); } + +} // namespace caffe From 128be26dad4877d6414cbfffb9ce07b4d91bdbc3 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sat, 30 Aug 2014 23:55:57 -0700 Subject: [PATCH 0566/2053] [pycaffe] use a namespace alias instead of using directives for boost::python --- python/caffe/_caffe.cpp | 68 +++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index dd4062c25f4..4810cbf2f4a 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -22,13 +22,7 @@ #define PyArray_SetBaseObject(arr, x) (PyArray_BASE(arr) = (x)) #endif -using boost::python::dict; -using boost::python::extract; -using boost::python::len; -using boost::python::list; -using boost::python::object; -using boost::python::handle; -using boost::python::vector_indexing_suite; +namespace bp = boost::python; namespace caffe { @@ -78,28 +72,28 @@ class PyBlobWrap : public PyBlob { PyBlobWrap(PyObject *p, const PyBlob &blob) : PyBlob(blob), self_(p) {} - object get_data() { + bp::object get_data() { npy_intp dims[] = {num(), channels(), height(), width()}; PyObject *obj = PyArray_SimpleNewFromData(4, dims, NPY_FLOAT32, blob_->mutable_cpu_data()); PyArray_SetBaseObject(reinterpret_cast(obj), self_); Py_INCREF(self_); - handle<> h(obj); + bp::handle<> h(obj); - return object(h); + return bp::object(h); } - object get_diff() { + bp::object get_diff() { npy_intp dims[] = {num(), channels(), height(), width()}; PyObject *obj = PyArray_SimpleNewFromData(4, dims, NPY_FLOAT32, blob_->mutable_cpu_diff()); PyArray_SetBaseObject(reinterpret_cast(obj), self_); Py_INCREF(self_); - handle<> h(obj); + bp::handle<> h(obj); - return object(h); + return bp::object(h); } private: @@ -189,7 +183,7 @@ struct PyNet { net_->BackwardFromTo(start, end); } - void set_input_arrays(object data_obj, object labels_obj) { + void set_input_arrays(bp::object data_obj, bp::object labels_obj) { // check that this network has an input MemoryDataLayer shared_ptr > md_layer = boost::dynamic_pointer_cast >(net_->layers()[0]); @@ -254,8 +248,8 @@ struct PyNet { return result; } - list inputs() { - list input_blob_names; + bp::list inputs() { + bp::list input_blob_names; for (int i = 0; i < net_->input_blob_indices().size(); ++i) { input_blob_names.append( net_->blob_names()[net_->input_blob_indices()[i]]); @@ -263,8 +257,8 @@ struct PyNet { return input_blob_names; } - list outputs() { - list output_blob_names; + bp::list outputs() { + bp::list output_blob_names; for (int i = 0; i < net_->output_blob_indices().size(); ++i) { output_blob_names.append( net_->blob_names()[net_->output_blob_indices()[i]]); @@ -275,13 +269,13 @@ struct PyNet { // The pointer to the internal caffe::Net instant. shared_ptr > net_; // Input preprocessing configuration attributes. - dict mean_; - dict input_scale_; - dict raw_scale_; - dict channel_swap_; + bp::dict mean_; + bp::dict input_scale_; + bp::dict raw_scale_; + bp::dict channel_swap_; // if taking input from an ndarray, we need to hold references - object input_data_; - object input_labels_; + bp::object input_data_; + bp::object input_labels_; }; class PySGDSolver { @@ -313,9 +307,9 @@ class PySGDSolver { BOOST_PYTHON_MODULE(_caffe) { // below, we prepend an underscore to methods that will be replaced // in Python - boost::python::class_ >( - "Net", boost::python::init()) - .def(boost::python::init()) + bp::class_ >( + "Net", bp::init()) + .def(bp::init()) .def("_forward", &PyNet::Forward) .def("_backward", &PyNet::Backward) .def("set_mode_cpu", &PyNet::set_mode_cpu) @@ -334,8 +328,8 @@ BOOST_PYTHON_MODULE(_caffe) { .def("_set_input_arrays", &PyNet::set_input_arrays) .def("save", &PyNet::save); - boost::python::class_( - "Blob", boost::python::no_init) + bp::class_( + "Blob", bp::no_init) .add_property("name", &PyBlob::name) .add_property("num", &PyBlob::num) .add_property("channels", &PyBlob::channels) @@ -345,22 +339,22 @@ BOOST_PYTHON_MODULE(_caffe) { .add_property("data", &PyBlobWrap::get_data) .add_property("diff", &PyBlobWrap::get_diff); - boost::python::class_( - "Layer", boost::python::no_init) + bp::class_( + "Layer", bp::no_init) .add_property("name", &PyLayer::name) .add_property("blobs", &PyLayer::blobs); - boost::python::class_( - "SGDSolver", boost::python::init()) + bp::class_( + "SGDSolver", bp::init()) .add_property("net", &PySGDSolver::net) .def("solve", &PySGDSolver::Solve) .def("solve", &PySGDSolver::SolveResume); - boost::python::class_ >("BlobVec") - .def(vector_indexing_suite, true>()); + bp::class_ >("BlobVec") + .def(bp::vector_indexing_suite, true>()); - boost::python::class_ >("LayerVec") - .def(vector_indexing_suite, true>()); + bp::class_ >("LayerVec") + .def(bp::vector_indexing_suite, true>()); import_array(); } From 3535b4731a9334ac35796f39064a066900852cea Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sun, 31 Aug 2014 00:01:20 -0700 Subject: [PATCH 0567/2053] [pycaffe] make PyNet a class, not a struct --- python/caffe/_caffe.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 4810cbf2f4a..773f51f1aaf 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -127,7 +127,8 @@ class PyLayer { // A simple wrapper over PyNet that runs the forward process. -struct PyNet { +class PyNet { + public: // For cases where parameters will be determined later by the Python user, // create a Net with unallocated parameters (which will not be zero-filled // when accessed). @@ -266,13 +267,16 @@ struct PyNet { return output_blob_names; } - // The pointer to the internal caffe::Net instant. - shared_ptr > net_; - // Input preprocessing configuration attributes. + // Input preprocessing configuration attributes. These are public for + // direct access from Python. bp::dict mean_; bp::dict input_scale_; bp::dict raw_scale_; bp::dict channel_swap_; + + protected: + // The pointer to the internal caffe::Net instant. + shared_ptr > net_; // if taking input from an ndarray, we need to hold references bp::object input_data_; bp::object input_labels_; From 6be5b6ed7a74d4e00e6805f632b14eb3f2f116f1 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sun, 31 Aug 2014 00:07:43 -0700 Subject: [PATCH 0568/2053] [pycaffe] make PyBlob a template over Dtype We will not actually support double nets in Python with this commit, but this change will be necessary to create layers that embed Python. --- python/caffe/_caffe.cpp | 43 +++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 773f51f1aaf..49e28624db2 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -39,11 +39,12 @@ static void CheckFile(const string& filename) { f.close(); } -// wrap shared_ptr > in a class that we construct in C++ and pass +// wrap shared_ptr in a class that we construct in C++ and pass // to Python +template class PyBlob { public: - PyBlob(const shared_ptr > &blob, const string& name) + PyBlob(const shared_ptr > &blob, const string& name) : blob_(blob), name_(name) {} string name() const { return name_; } @@ -59,7 +60,7 @@ class PyBlob { } protected: - shared_ptr > blob_; + shared_ptr > blob_; string name_; }; @@ -67,10 +68,10 @@ class PyBlob { // We need another wrapper (used as boost::python's HeldType) that receives a // self PyObject * which we can use as ndarray.base, so that data/diff memory // is not freed while still being used in Python. -class PyBlobWrap : public PyBlob { +class PyBlobWrap : public PyBlob { public: - PyBlobWrap(PyObject *p, const PyBlob &blob) - : PyBlob(blob), self_(p) {} + PyBlobWrap(PyObject *p, const PyBlob &blob) + : PyBlob(blob), self_(p) {} bp::object get_data() { npy_intp dims[] = {num(), channels(), height(), width()}; @@ -107,10 +108,10 @@ class PyLayer { : layer_(layer), name_(name) {} string name() const { return name_; } - vector blobs() { - vector result; + vector > blobs() { + vector > result; for (int i = 0; i < layer_->blobs().size(); ++i) { - result.push_back(PyBlob(layer_->blobs()[i], name_)); + result.push_back(PyBlob(layer_->blobs()[i], name_)); } return result; } @@ -233,10 +234,10 @@ class PyNet { void set_phase_test() { Caffe::set_phase(Caffe::TEST); } void set_device(int device_id) { Caffe::SetDevice(device_id); } - vector blobs() { - vector result; + vector > blobs() { + vector > result; for (int i = 0; i < net_->blobs().size(); ++i) { - result.push_back(PyBlob(net_->blobs()[i], net_->blob_names()[i])); + result.push_back(PyBlob(net_->blobs()[i], net_->blob_names()[i])); } return result; } @@ -332,14 +333,14 @@ BOOST_PYTHON_MODULE(_caffe) { .def("_set_input_arrays", &PyNet::set_input_arrays) .def("save", &PyNet::save); - bp::class_( + bp::class_, PyBlobWrap>( "Blob", bp::no_init) - .add_property("name", &PyBlob::name) - .add_property("num", &PyBlob::num) - .add_property("channels", &PyBlob::channels) - .add_property("height", &PyBlob::height) - .add_property("width", &PyBlob::width) - .add_property("count", &PyBlob::count) + .add_property("name", &PyBlob::name) + .add_property("num", &PyBlob::num) + .add_property("channels", &PyBlob::channels) + .add_property("height", &PyBlob::height) + .add_property("width", &PyBlob::width) + .add_property("count", &PyBlob::count) .add_property("data", &PyBlobWrap::get_data) .add_property("diff", &PyBlobWrap::get_diff); @@ -354,8 +355,8 @@ BOOST_PYTHON_MODULE(_caffe) { .def("solve", &PySGDSolver::Solve) .def("solve", &PySGDSolver::SolveResume); - bp::class_ >("BlobVec") - .def(bp::vector_indexing_suite, true>()); + bp::class_ > >("BlobVec") + .def(bp::vector_indexing_suite >, true>()); bp::class_ >("LayerVec") .def(bp::vector_indexing_suite, true>()); From f4f508e5f2d4959cec70317552ed092ff748830b Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sun, 31 Aug 2014 00:26:12 -0700 Subject: [PATCH 0569/2053] [pycaffe] split _caffe into source and header files This brings pycaffe more in line with usual C++ style, and will allow the wrapper classes to be used within caffe when embedding Python. --- Makefile | 3 +- python/caffe/_caffe.cpp | 350 +++++++++++----------------------------- python/caffe/_caffe.hpp | 186 +++++++++++++++++++++ 3 files changed, 279 insertions(+), 260 deletions(-) create mode 100644 python/caffe/_caffe.hpp diff --git a/Makefile b/Makefile index b6e04444fb0..dd9ba5c8376 100644 --- a/Makefile +++ b/Makefile @@ -70,6 +70,7 @@ EMPTY_LINT_REPORT := $(BUILD_DIR)/.$(LINT_EXT) NONEMPTY_LINT_REPORT := $(BUILD_DIR)/$(LINT_EXT) # PY$(PROJECT)_SRC is the python wrapper for $(PROJECT) PY$(PROJECT)_SRC := python/$(PROJECT)/_$(PROJECT).cpp +PY$(PROJECT)_HXX_SRC := python/$(PROJECT)/_$(PROJECT).hpp PY$(PROJECT)_SO := python/$(PROJECT)/_$(PROJECT).so # MAT$(PROJECT)_SRC is the matlab wrapper for $(PROJECT) MAT$(PROJECT)_SRC := matlab/$(PROJECT)/mat$(PROJECT).cpp @@ -345,7 +346,7 @@ py$(PROJECT): py py: $(PY$(PROJECT)_SO) $(PROTO_GEN_PY) -$(PY$(PROJECT)_SO): $(STATIC_NAME) $(PY$(PROJECT)_SRC) +$(PY$(PROJECT)_SO): $(STATIC_NAME) $(PY$(PROJECT)_SRC) $(PY$(PROJECT)_HXX_SRC) $(CXX) -shared -o $@ $(PY$(PROJECT)_SRC) \ $(STATIC_NAME) $(LINKFLAGS) $(PYTHON_LDFLAGS) @ echo diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 49e28624db2..7c26c7f79f9 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -2,17 +2,14 @@ // caffe::Caffe functions so that one could easily call it from Python. // Note that for Python, we will simply use float as the data type. -#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION - -#include "boost/python.hpp" -#include "boost/python/suite/indexing/vector_indexing_suite.hpp" -#include "numpy/arrayobject.h" +#include // these need to be included after boost on OS X #include // NOLINT(build/include_order) #include // NOLINT(build/include_order) #include // NOLINT +#include "_caffe.hpp" #include "caffe/caffe.hpp" // Temporary solution for numpy < 1.7 versions: old macro, no promises. @@ -22,8 +19,6 @@ #define PyArray_SetBaseObject(arr, x) (PyArray_BASE(arr) = (x)) #endif -namespace bp = boost::python; - namespace caffe { // for convenience, check that input files can be opened, and raise an @@ -39,276 +34,113 @@ static void CheckFile(const string& filename) { f.close(); } -// wrap shared_ptr in a class that we construct in C++ and pass -// to Python -template -class PyBlob { - public: - PyBlob(const shared_ptr > &blob, const string& name) - : blob_(blob), name_(name) {} - - string name() const { return name_; } - int num() const { return blob_->num(); } - int channels() const { return blob_->channels(); } - int height() const { return blob_->height(); } - int width() const { return blob_->width(); } - int count() const { return blob_->count(); } - - // this is here only to satisfy boost's vector_indexing_suite - bool operator == (const PyBlob &other) { - return this->blob_ == other.blob_; - } - - protected: - shared_ptr > blob_; - string name_; -}; - - -// We need another wrapper (used as boost::python's HeldType) that receives a -// self PyObject * which we can use as ndarray.base, so that data/diff memory -// is not freed while still being used in Python. -class PyBlobWrap : public PyBlob { - public: - PyBlobWrap(PyObject *p, const PyBlob &blob) - : PyBlob(blob), self_(p) {} - - bp::object get_data() { - npy_intp dims[] = {num(), channels(), height(), width()}; - - PyObject *obj = PyArray_SimpleNewFromData(4, dims, NPY_FLOAT32, - blob_->mutable_cpu_data()); - PyArray_SetBaseObject(reinterpret_cast(obj), self_); - Py_INCREF(self_); - bp::handle<> h(obj); - - return bp::object(h); - } - - bp::object get_diff() { - npy_intp dims[] = {num(), channels(), height(), width()}; - - PyObject *obj = PyArray_SimpleNewFromData(4, dims, NPY_FLOAT32, - blob_->mutable_cpu_diff()); - PyArray_SetBaseObject(reinterpret_cast(obj), self_); - Py_INCREF(self_); - bp::handle<> h(obj); - - return bp::object(h); - } - - private: - PyObject *self_; -}; - +bp::object PyBlobWrap::get_data() { + npy_intp dims[] = {num(), channels(), height(), width()}; -class PyLayer { - public: - PyLayer(const shared_ptr > &layer, const string &name) - : layer_(layer), name_(name) {} + PyObject *obj = PyArray_SimpleNewFromData(4, dims, NPY_FLOAT32, + blob_->mutable_cpu_data()); + PyArray_SetBaseObject(reinterpret_cast(obj), self_); + Py_INCREF(self_); + bp::handle<> h(obj); - string name() const { return name_; } - vector > blobs() { - vector > result; - for (int i = 0; i < layer_->blobs().size(); ++i) { - result.push_back(PyBlob(layer_->blobs()[i], name_)); - } - return result; - } - - // this is here only to satisfy boost's vector_indexing_suite - bool operator == (const PyLayer &other) { - return this->layer_ == other.layer_; - } - - protected: - shared_ptr > layer_; - string name_; -}; - - -// A simple wrapper over PyNet that runs the forward process. -class PyNet { - public: - // For cases where parameters will be determined later by the Python user, - // create a Net with unallocated parameters (which will not be zero-filled - // when accessed). - explicit PyNet(string param_file) { - Init(param_file); - } - - PyNet(string param_file, string pretrained_param_file) { - Init(param_file); - CheckFile(pretrained_param_file); - net_->CopyTrainedLayersFrom(pretrained_param_file); - } - - explicit PyNet(shared_ptr > net) - : net_(net) {} - - void Init(string param_file) { - CheckFile(param_file); - net_.reset(new Net(param_file)); - } - - - virtual ~PyNet() {} - - // Generate Python exceptions for badly shaped or discontiguous arrays. - inline void check_contiguous_array(PyArrayObject* arr, string name, - int channels, int height, int width) { - if (!(PyArray_FLAGS(arr) & NPY_ARRAY_C_CONTIGUOUS)) { - throw std::runtime_error(name + " must be C contiguous"); - } - if (PyArray_NDIM(arr) != 4) { - throw std::runtime_error(name + " must be 4-d"); - } - if (PyArray_TYPE(arr) != NPY_FLOAT32) { - throw std::runtime_error(name + " must be float32"); - } - if (PyArray_DIMS(arr)[1] != channels) { - throw std::runtime_error(name + " has wrong number of channels"); - } - if (PyArray_DIMS(arr)[2] != height) { - throw std::runtime_error(name + " has wrong height"); - } - if (PyArray_DIMS(arr)[3] != width) { - throw std::runtime_error(name + " has wrong width"); - } - } + return bp::object(h); +} - void Forward(int start, int end) { - net_->ForwardFromTo(start, end); - } +bp::object PyBlobWrap::get_diff() { + npy_intp dims[] = {num(), channels(), height(), width()}; - void Backward(int start, int end) { - net_->BackwardFromTo(start, end); - } + PyObject *obj = PyArray_SimpleNewFromData(4, dims, NPY_FLOAT32, + blob_->mutable_cpu_diff()); + PyArray_SetBaseObject(reinterpret_cast(obj), self_); + Py_INCREF(self_); + bp::handle<> h(obj); - void set_input_arrays(bp::object data_obj, bp::object labels_obj) { - // check that this network has an input MemoryDataLayer - shared_ptr > md_layer = - boost::dynamic_pointer_cast >(net_->layers()[0]); - if (!md_layer) { - throw std::runtime_error("set_input_arrays may only be called if the" - " first layer is a MemoryDataLayer"); - } - - // check that we were passed appropriately-sized contiguous memory - PyArrayObject* data_arr = - reinterpret_cast(data_obj.ptr()); - PyArrayObject* labels_arr = - reinterpret_cast(labels_obj.ptr()); - check_contiguous_array(data_arr, "data array", md_layer->datum_channels(), - md_layer->datum_height(), md_layer->datum_width()); - check_contiguous_array(labels_arr, "labels array", 1, 1, 1); - if (PyArray_DIMS(data_arr)[0] != PyArray_DIMS(labels_arr)[0]) { - throw std::runtime_error("data and labels must have the same first" - " dimension"); - } - if (PyArray_DIMS(data_arr)[0] % md_layer->batch_size() != 0) { - throw std::runtime_error("first dimensions of input arrays must be a" - " multiple of batch size"); - } + return bp::object(h); +} - // hold references - input_data_ = data_obj; - input_labels_ = labels_obj; +PyNet::PyNet(string param_file, string pretrained_param_file) { + Init(param_file); + CheckFile(pretrained_param_file); + net_->CopyTrainedLayersFrom(pretrained_param_file); +} - md_layer->Reset(static_cast(PyArray_DATA(data_arr)), - static_cast(PyArray_DATA(labels_arr)), - PyArray_DIMS(data_arr)[0]); - } +void PyNet::Init(string param_file) { + CheckFile(param_file); + net_.reset(new Net(param_file)); +} - // save the network weights to binary proto for net surgeries. - void save(string filename) { - NetParameter net_param; - net_->ToProto(&net_param, false); - WriteProtoToBinaryFile(net_param, filename.c_str()); +void PyNet::check_contiguous_array(PyArrayObject* arr, string name, + int channels, int height, int width) { + if (!(PyArray_FLAGS(arr) & NPY_ARRAY_C_CONTIGUOUS)) { + throw std::runtime_error(name + " must be C contiguous"); } - - // The caffe::Caffe utility functions. - void set_mode_cpu() { Caffe::set_mode(Caffe::CPU); } - void set_mode_gpu() { Caffe::set_mode(Caffe::GPU); } - void set_phase_train() { Caffe::set_phase(Caffe::TRAIN); } - void set_phase_test() { Caffe::set_phase(Caffe::TEST); } - void set_device(int device_id) { Caffe::SetDevice(device_id); } - - vector > blobs() { - vector > result; - for (int i = 0; i < net_->blobs().size(); ++i) { - result.push_back(PyBlob(net_->blobs()[i], net_->blob_names()[i])); - } - return result; + if (PyArray_NDIM(arr) != 4) { + throw std::runtime_error(name + " must be 4-d"); } - - vector layers() { - vector result; - for (int i = 0; i < net_->layers().size(); ++i) { - result.push_back(PyLayer(net_->layers()[i], net_->layer_names()[i])); - } - return result; + if (PyArray_TYPE(arr) != NPY_FLOAT32) { + throw std::runtime_error(name + " must be float32"); } - - bp::list inputs() { - bp::list input_blob_names; - for (int i = 0; i < net_->input_blob_indices().size(); ++i) { - input_blob_names.append( - net_->blob_names()[net_->input_blob_indices()[i]]); - } - return input_blob_names; + if (PyArray_DIMS(arr)[1] != channels) { + throw std::runtime_error(name + " has wrong number of channels"); } - - bp::list outputs() { - bp::list output_blob_names; - for (int i = 0; i < net_->output_blob_indices().size(); ++i) { - output_blob_names.append( - net_->blob_names()[net_->output_blob_indices()[i]]); - } - return output_blob_names; + if (PyArray_DIMS(arr)[2] != height) { + throw std::runtime_error(name + " has wrong height"); } - - // Input preprocessing configuration attributes. These are public for - // direct access from Python. - bp::dict mean_; - bp::dict input_scale_; - bp::dict raw_scale_; - bp::dict channel_swap_; - - protected: - // The pointer to the internal caffe::Net instant. - shared_ptr > net_; - // if taking input from an ndarray, we need to hold references - bp::object input_data_; - bp::object input_labels_; -}; - -class PySGDSolver { - public: - explicit PySGDSolver(const string& param_file) { - // as in PyNet, (as a convenience, not a guarantee), create a Python - // exception if param_file can't be opened - CheckFile(param_file); - solver_.reset(new SGDSolver(param_file)); - // we need to explicitly store the net wrapper, rather than constructing - // it on the fly, so that it can hold references to Python objects - net_.reset(new PyNet(solver_->net())); + if (PyArray_DIMS(arr)[3] != width) { + throw std::runtime_error(name + " has wrong width"); } +} - shared_ptr net() { return net_; } - void Solve() { return solver_->Solve(); } - void SolveResume(const string& resume_file) { - CheckFile(resume_file); - return solver_->Solve(resume_file); - } +void PyNet::set_input_arrays(bp::object data_obj, bp::object labels_obj) { + // check that this network has an input MemoryDataLayer + shared_ptr > md_layer = + boost::dynamic_pointer_cast >(net_->layers()[0]); + if (!md_layer) { + throw std::runtime_error("set_input_arrays may only be called if the" + " first layer is a MemoryDataLayer"); + } + + // check that we were passed appropriately-sized contiguous memory + PyArrayObject* data_arr = + reinterpret_cast(data_obj.ptr()); + PyArrayObject* labels_arr = + reinterpret_cast(labels_obj.ptr()); + check_contiguous_array(data_arr, "data array", md_layer->datum_channels(), + md_layer->datum_height(), md_layer->datum_width()); + check_contiguous_array(labels_arr, "labels array", 1, 1, 1); + if (PyArray_DIMS(data_arr)[0] != PyArray_DIMS(labels_arr)[0]) { + throw std::runtime_error("data and labels must have the same first" + " dimension"); + } + if (PyArray_DIMS(data_arr)[0] % md_layer->batch_size() != 0) { + throw std::runtime_error("first dimensions of input arrays must be a" + " multiple of batch size"); + } + + // hold references + input_data_ = data_obj; + input_labels_ = labels_obj; + + md_layer->Reset(static_cast(PyArray_DATA(data_arr)), + static_cast(PyArray_DATA(labels_arr)), + PyArray_DIMS(data_arr)[0]); +} - protected: - shared_ptr net_; - shared_ptr > solver_; -}; +PySGDSolver::PySGDSolver(const string& param_file) { + // as in PyNet, (as a convenience, not a guarantee), create a Python + // exception if param_file can't be opened + CheckFile(param_file); + solver_.reset(new SGDSolver(param_file)); + // we need to explicitly store the net wrapper, rather than constructing + // it on the fly, so that it can hold references to Python objects + net_.reset(new PyNet(solver_->net())); +} +void PySGDSolver::SolveResume(const string& resume_file) { + CheckFile(resume_file); + return solver_->Solve(resume_file); +} -// The boost_python module definition. BOOST_PYTHON_MODULE(_caffe) { // below, we prepend an underscore to methods that will be replaced // in Python diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp new file mode 100644 index 00000000000..20f9908bfe1 --- /dev/null +++ b/python/caffe/_caffe.hpp @@ -0,0 +1,186 @@ +#ifndef PYTHON_CAFFE__CAFFE_HPP_ +#define PYTHON_CAFFE__CAFFE_HPP_ + +#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION + +#include +#include +#include + +// these need to be included after boost on OS X +#include // NOLINT(build/include_order) +#include // NOLINT(build/include_order) + +#include "caffe/caffe.hpp" + +namespace bp = boost::python; +using boost::shared_ptr; + +namespace caffe { + +// wrap shared_ptr in a class that we construct in C++ and pass +// to Python +template +class PyBlob { + public: + PyBlob(const shared_ptr > &blob, const string& name) + : blob_(blob), name_(name) {} + + string name() const { return name_; } + int num() const { return blob_->num(); } + int channels() const { return blob_->channels(); } + int height() const { return blob_->height(); } + int width() const { return blob_->width(); } + int count() const { return blob_->count(); } + + // this is here only to satisfy boost's vector_indexing_suite + bool operator == (const PyBlob &other) { + return this->blob_ == other.blob_; + } + + protected: + shared_ptr > blob_; + string name_; +}; + +// We need another wrapper (used as boost::python's HeldType) that receives a +// self PyObject * which we can use as ndarray.base, so that data/diff memory +// is not freed while still being used in Python. +class PyBlobWrap : public PyBlob { + public: + PyBlobWrap(PyObject *p, const PyBlob &blob) + : PyBlob(blob), self_(p) {} + + bp::object get_data(); + bp::object get_diff(); + + private: + PyObject *self_; +}; + +class PyLayer { + public: + PyLayer(const shared_ptr > &layer, const string &name) + : layer_(layer), name_(name) {} + + string name() const { return name_; } + vector > blobs() { + vector > result; + for (int i = 0; i < layer_->blobs().size(); ++i) { + result.push_back(PyBlob(layer_->blobs()[i], name_)); + } + return result; + } + + // this is here only to satisfy boost's vector_indexing_suite + bool operator == (const PyLayer &other) { + return this->layer_ == other.layer_; + } + + protected: + shared_ptr > layer_; + string name_; +}; + +class PyNet { + public: + // For cases where parameters will be determined later by the Python user, + // create a Net with unallocated parameters (which will not be zero-filled + // when accessed). + explicit PyNet(string param_file) { Init(param_file); } + PyNet(string param_file, string pretrained_param_file); + explicit PyNet(shared_ptr > net) + : net_(net) {} + virtual ~PyNet() {} + + void Init(string param_file); + + + // Generate Python exceptions for badly shaped or discontiguous arrays. + inline void check_contiguous_array(PyArrayObject* arr, string name, + int channels, int height, int width); + + void Forward(int start, int end) { net_->ForwardFromTo(start, end); } + void Backward(int start, int end) { net_->BackwardFromTo(start, end); } + + void set_input_arrays(bp::object data_obj, bp::object labels_obj); + + // Save the network weights to binary proto for net surgeries. + void save(string filename) { + NetParameter net_param; + net_->ToProto(&net_param, false); + WriteProtoToBinaryFile(net_param, filename.c_str()); + } + + // The caffe::Caffe utility functions. + void set_mode_cpu() { Caffe::set_mode(Caffe::CPU); } + void set_mode_gpu() { Caffe::set_mode(Caffe::GPU); } + void set_phase_train() { Caffe::set_phase(Caffe::TRAIN); } + void set_phase_test() { Caffe::set_phase(Caffe::TEST); } + void set_device(int device_id) { Caffe::SetDevice(device_id); } + + vector > blobs() { + vector > result; + for (int i = 0; i < net_->blobs().size(); ++i) { + result.push_back(PyBlob(net_->blobs()[i], net_->blob_names()[i])); + } + return result; + } + + vector layers() { + vector result; + for (int i = 0; i < net_->layers().size(); ++i) { + result.push_back(PyLayer(net_->layers()[i], net_->layer_names()[i])); + } + return result; + } + + bp::list inputs() { + bp::list input_blob_names; + for (int i = 0; i < net_->input_blob_indices().size(); ++i) { + input_blob_names.append( + net_->blob_names()[net_->input_blob_indices()[i]]); + } + return input_blob_names; + } + + bp::list outputs() { + bp::list output_blob_names; + for (int i = 0; i < net_->output_blob_indices().size(); ++i) { + output_blob_names.append( + net_->blob_names()[net_->output_blob_indices()[i]]); + } + return output_blob_names; + } + + // Input preprocessing configuration attributes. These are public for + // direct access from Python. + bp::dict mean_; + bp::dict input_scale_; + bp::dict raw_scale_; + bp::dict channel_swap_; + + protected: + // The pointer to the internal caffe::Net instant. + shared_ptr > net_; + // if taking input from an ndarray, we need to hold references + bp::object input_data_; + bp::object input_labels_; +}; + +class PySGDSolver { + public: + explicit PySGDSolver(const string& param_file); + + shared_ptr net() { return net_; } + void Solve() { return solver_->Solve(); } + void SolveResume(const string& resume_file); + + protected: + shared_ptr net_; + shared_ptr > solver_; +}; + +} // namespace caffe + +#endif From 7907a56b86956403b6941e3a8af8076ea71c0d9d Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sun, 31 Aug 2014 00:36:26 -0700 Subject: [PATCH 0570/2053] [pycaffe] declare the _caffe module init function --- python/caffe/_caffe.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index 20f9908bfe1..5500f6dd3aa 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -181,6 +181,10 @@ class PySGDSolver { shared_ptr > solver_; }; +// Declare the module init function created by boost::python, so that we can +// use this module from C++ when embedding Python. +PyMODINIT_FUNC init_caffe(void); + } // namespace caffe #endif From 88221c9a45120bd892180444c4d6ee9c41841079 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sun, 31 Aug 2014 00:45:06 -0700 Subject: [PATCH 0571/2053] [pycaffe] remove name property from PyBlob and PyLayer Attaching names to pycaffe Blobs and Layers isn't necessary anymore, since they are now accessed by name. This change brings PyBlob and PyLayer closer to their C++ counterparts, and makes it easier to pass around blobs without knowing their names, e.g., when embedding Python in a layer. --- python/caffe/_caffe.cpp | 2 -- python/caffe/_caffe.hpp | 31 ++++++++----------------------- 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 7c26c7f79f9..5f18ff63b4e 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -167,7 +167,6 @@ BOOST_PYTHON_MODULE(_caffe) { bp::class_, PyBlobWrap>( "Blob", bp::no_init) - .add_property("name", &PyBlob::name) .add_property("num", &PyBlob::num) .add_property("channels", &PyBlob::channels) .add_property("height", &PyBlob::height) @@ -178,7 +177,6 @@ BOOST_PYTHON_MODULE(_caffe) { bp::class_( "Layer", bp::no_init) - .add_property("name", &PyLayer::name) .add_property("blobs", &PyLayer::blobs); bp::class_( diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index 5500f6dd3aa..cd567b665c2 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -23,10 +23,9 @@ namespace caffe { template class PyBlob { public: - PyBlob(const shared_ptr > &blob, const string& name) - : blob_(blob), name_(name) {} + explicit PyBlob(const shared_ptr > &blob) + : blob_(blob) {} - string name() const { return name_; } int num() const { return blob_->num(); } int channels() const { return blob_->channels(); } int height() const { return blob_->height(); } @@ -40,7 +39,6 @@ class PyBlob { protected: shared_ptr > blob_; - string name_; }; // We need another wrapper (used as boost::python's HeldType) that receives a @@ -60,16 +58,12 @@ class PyBlobWrap : public PyBlob { class PyLayer { public: - PyLayer(const shared_ptr > &layer, const string &name) - : layer_(layer), name_(name) {} + explicit PyLayer(const shared_ptr > &layer) + : layer_(layer) {} - string name() const { return name_; } vector > blobs() { - vector > result; - for (int i = 0; i < layer_->blobs().size(); ++i) { - result.push_back(PyBlob(layer_->blobs()[i], name_)); - } - return result; + return vector >(layer_->blobs().begin(), + layer_->blobs().end()); } // this is here only to satisfy boost's vector_indexing_suite @@ -79,7 +73,6 @@ class PyLayer { protected: shared_ptr > layer_; - string name_; }; class PyNet { @@ -120,19 +113,11 @@ class PyNet { void set_device(int device_id) { Caffe::SetDevice(device_id); } vector > blobs() { - vector > result; - for (int i = 0; i < net_->blobs().size(); ++i) { - result.push_back(PyBlob(net_->blobs()[i], net_->blob_names()[i])); - } - return result; + return vector >(net_->blobs().begin(), net_->blobs().end()); } vector layers() { - vector result; - for (int i = 0; i < net_->layers().size(); ++i) { - result.push_back(PyLayer(net_->layers()[i], net_->layer_names()[i])); - } - return result; + return vector(net_->layers().begin(), net_->layers().end()); } bp::list inputs() { From 3e924969357da0e0c680a557375c69a8bbd05800 Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Sun, 31 Aug 2014 01:14:58 -0700 Subject: [PATCH 0572/2053] [pycaffe] expose Blob.Reshape While this function should never be called in the current interface, it will be necessary to have when embedding Python. --- python/caffe/_caffe.cpp | 1 + python/caffe/_caffe.hpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 5f18ff63b4e..9c61ea869b9 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -172,6 +172,7 @@ BOOST_PYTHON_MODULE(_caffe) { .add_property("height", &PyBlob::height) .add_property("width", &PyBlob::width) .add_property("count", &PyBlob::count) + .def("reshape", &PyBlob::Reshape) .add_property("data", &PyBlobWrap::get_data) .add_property("diff", &PyBlobWrap::get_diff); diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index cd567b665c2..2df47c7cec5 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -31,6 +31,9 @@ class PyBlob { int height() const { return blob_->height(); } int width() const { return blob_->width(); } int count() const { return blob_->count(); } + void Reshape(const int n, const int c, const int h, const int w) { + return blob_->Reshape(n, c, h, w); + } // this is here only to satisfy boost's vector_indexing_suite bool operator == (const PyBlob &other) { From 750f92ea4e677cd181d4b907f34988d8dc0730f5 Mon Sep 17 00:00:00 2001 From: Mohamed Omran Date: Fri, 29 Aug 2014 16:04:24 +0200 Subject: [PATCH 0573/2053] mnist demo now works with lmdb and leveldb (set parameter in create_mnist.sh), switched around includes --- examples/mnist/convert_mnist_data.cpp | 109 ++++++++++++++---- examples/mnist/create_mnist.sh | 14 ++- .../mnist/lenet_consolidated_solver.prototxt | 9 +- 3 files changed, 101 insertions(+), 31 deletions(-) diff --git a/examples/mnist/convert_mnist_data.cpp b/examples/mnist/convert_mnist_data.cpp index a97a9285a19..671ca0d4c5b 100644 --- a/examples/mnist/convert_mnist_data.cpp +++ b/examples/mnist/convert_mnist_data.cpp @@ -6,23 +6,28 @@ // The MNIST dataset could be downloaded at // http://yann.lecun.com/exdb/mnist/ +#include // GFLAGS +#include +#include +#include +#include +#include +#include + #include // NOLINT(readability/streams) #include -#include "glog/logging.h" -#include "google/protobuf/text_format.h" -#include "leveldb/db.h" -#include "stdint.h" - #include "caffe/proto/caffe.pb.h" +DEFINE_string(backend, "leveldb", "The backend for storing the result"); + uint32_t swap_endian(uint32_t val) { val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF); return (val << 16) | (val >> 16); } void convert_dataset(const char* image_filename, const char* label_filename, - const char* db_filename) { + const char* db_filename, const std::string& db_backend) { // Open files std::ifstream image_file(image_filename, std::ios::in | std::ios::binary); std::ifstream label_file(label_filename, std::ios::in | std::ios::binary); @@ -51,15 +56,38 @@ void convert_dataset(const char* image_filename, const char* label_filename, image_file.read(reinterpret_cast(&cols), 4); cols = swap_endian(cols); - // Open leveldb + // lmdb + MDB_env *mdb_env; + MDB_dbi mdb_dbi; + MDB_val mdb_key, mdb_data; + MDB_txn *mdb_txn; + // leveldb leveldb::DB* db; leveldb::Options options; options.create_if_missing = true; options.error_if_exists = true; - leveldb::Status status = leveldb::DB::Open( - options, db_filename, &db); - CHECK(status.ok()) << "Failed to open leveldb " << db_filename - << ". Is it already existing?"; + + // Open new db + if (db_backend == "leveldb") { // leveldb + leveldb::Status status = leveldb::DB::Open( + options, db_filename, &db); + CHECK(status.ok()) << "Failed to open leveldb " << db_filename + << ". Is it already existing?"; + } else if (db_backend == "lmdb") { // lmdb + CHECK_EQ(mkdir(db_filename, 0744), 0) + << "mkdir " << db_filename << "failed"; + CHECK_EQ(mdb_env_create(&mdb_env), MDB_SUCCESS) << "mdb_env_create failed"; + CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS) // 1TB + << "mdb_env_set_mapsize failed"; + CHECK_EQ(mdb_env_open(mdb_env, db_filename, 0, 0664), MDB_SUCCESS) + << "mdb_env_open failed"; + CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) + << "mdb_txn_begin failed"; + CHECK_EQ(mdb_open(mdb_txn, NULL, 0, &mdb_dbi), MDB_SUCCESS) + << "mdb_open failed"; + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } char label; char* pixels = new char[rows * cols]; @@ -80,26 +108,63 @@ void convert_dataset(const char* image_filename, const char* label_filename, datum.set_label(label); datum.SerializeToString(&value); snprintf(key, kMaxKeyLength, "%08d", itemid); - db->Put(leveldb::WriteOptions(), std::string(key), value); + std::string keystr(key); + + // Put in db + if (db_backend == "leveldb") { // leveldb + db->Put(leveldb::WriteOptions(), keystr, value); + } else if (db_backend == "lmdb") { // lmdb + mdb_data.mv_size = value.size(); + mdb_data.mv_data = reinterpret_cast(&value[0]); + mdb_key.mv_size = keystr.size(); + mdb_key.mv_data = reinterpret_cast(&keystr[0]); + CHECK_EQ(mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0), MDB_SUCCESS) + << "mdb_put failed"; + CHECK_EQ(mdb_txn_commit(mdb_txn), MDB_SUCCESS) + << "mdb_txn_commit failed"; + CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) + << "mdb_txn_begin failed"; + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } + } + + if (db_backend == "leveldb") { // leveldb + delete db; + } else if (db_backend == "lmdb") { // lmdb + mdb_close(mdb_env, mdb_dbi); + mdb_env_close(mdb_env); + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; } - delete db; delete pixels; } int main(int argc, char** argv) { +#ifndef GFLAGS_GFLAGS_H_ + namespace gflags = google; +#endif + + gflags::SetUsageMessage("This script converts the MNIST dataset to\n" + "the leveldb/lmdb format used by Caffe to perform classification.\n" + "Usage:\n" + " convert_mnist_data [FLAGS] input_image_file input_label_file " + "output_db_file\n" + "The MNIST dataset could be downloaded at\n" + " http://yann.lecun.com/exdb/mnist/\n" + "You should gunzip them after downloading," + "or directly use data/mnist/get_mnist.sh\n"); + gflags::ParseCommandLineFlags(&argc, &argv, true); + + const std::string& db_backend = FLAGS_backend; + if (argc != 4) { - printf("This script converts the MNIST dataset to the leveldb format used\n" - "by caffe to perform classification.\n" - "Usage:\n" - " convert_mnist_data input_image_file input_label_file " - "output_db_file\n" - "The MNIST dataset could be downloaded at\n" - " http://yann.lecun.com/exdb/mnist/\n" - "You should gunzip them after downloading.\n"); + gflags::ShowUsageWithFlagsRestrict(argv[0], + "examples/mnist/convert_mnist_data"); } else { google::InitGoogleLogging(argv[0]); - convert_dataset(argv[1], argv[2], argv[3]); + convert_dataset(argv[1], argv[2], argv[3], db_backend); } return 0; } diff --git a/examples/mnist/create_mnist.sh b/examples/mnist/create_mnist.sh index ed6e36903c2..29f625e6329 100755 --- a/examples/mnist/create_mnist.sh +++ b/examples/mnist/create_mnist.sh @@ -1,18 +1,20 @@ #!/usr/bin/env sh -# This script converts the mnist data into leveldb format. +# This script converts the mnist data into leveldb/lmdb format, +# depending on the value assigned to $BACKEND. EXAMPLE=examples/mnist DATA=data/mnist BUILD=build/examples/mnist +BACKEND="lmdb" -echo "Creating leveldb..." +echo "Creating ${BACKEND}..." -rm -rf mnist_train_leveldb -rm -rf mnist_test_leveldb +rm -rf $EXAMPLE/mnist_train_${BACKEND} +rm -rf $EXAMPLE/mnist_test_${BACKEND} $BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \ - $DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_leveldb + $DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} -backend ${BACKEND} $BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \ - $DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_leveldb + $DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} -backend ${BACKEND} echo "Done." diff --git a/examples/mnist/lenet_consolidated_solver.prototxt b/examples/mnist/lenet_consolidated_solver.prototxt index 8ff593f2781..f57d086c671 100644 --- a/examples/mnist/lenet_consolidated_solver.prototxt +++ b/examples/mnist/lenet_consolidated_solver.prototxt @@ -50,7 +50,8 @@ net_param { top: "data" top: "label" data_param { - source: "examples/mnist/mnist_train_leveldb" + source: "examples/mnist/mnist_train_lmdb" + backend: LMDB batch_size: 64 transform_param { scale: 0.00390625 @@ -64,7 +65,8 @@ net_param { top: "data" top: "label" data_param { - source: "examples/mnist/mnist_test_leveldb" + source: "examples/mnist/mnist_test_lmdb" + backend: LMDB batch_size: 100 transform_param { scale: 0.00390625 @@ -81,7 +83,8 @@ net_param { top: "data" top: "label" data_param { - source: "examples/mnist/mnist_train_leveldb" + source: "examples/mnist/mnist_train_lmdb" + backend: LMDB batch_size: 100 transform_param { scale: 0.00390625 From 4670c320b3539e9e55e60d6555fd1cf8d200e3e4 Mon Sep 17 00:00:00 2001 From: Mohamed Omran Date: Fri, 29 Aug 2014 17:04:25 +0200 Subject: [PATCH 0574/2053] data now written to backend in batches --- examples/mnist/convert_mnist_data.cpp | 52 +++++++++++++++++++-------- examples/mnist/create_mnist.sh | 1 + 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/examples/mnist/convert_mnist_data.cpp b/examples/mnist/convert_mnist_data.cpp index 671ca0d4c5b..6fbd2943d2d 100644 --- a/examples/mnist/convert_mnist_data.cpp +++ b/examples/mnist/convert_mnist_data.cpp @@ -6,10 +6,11 @@ // The MNIST dataset could be downloaded at // http://yann.lecun.com/exdb/mnist/ -#include // GFLAGS +#include #include #include #include +#include #include #include #include @@ -66,6 +67,8 @@ void convert_dataset(const char* image_filename, const char* label_filename, leveldb::Options options; options.create_if_missing = true; options.error_if_exists = true; + options.write_buffer_size = 268435456; + leveldb::WriteBatch* batch = NULL; // Open new db if (db_backend == "leveldb") { // leveldb @@ -73,6 +76,7 @@ void convert_dataset(const char* image_filename, const char* label_filename, options, db_filename, &db); CHECK(status.ok()) << "Failed to open leveldb " << db_filename << ". Is it already existing?"; + batch = new leveldb::WriteBatch(); } else if (db_backend == "lmdb") { // lmdb CHECK_EQ(mkdir(db_filename, 0744), 0) << "mkdir " << db_filename << "failed"; @@ -94,6 +98,7 @@ void convert_dataset(const char* image_filename, const char* label_filename, const int kMaxKeyLength = 10; char key[kMaxKeyLength]; std::string value; + int count = 0; caffe::Datum datum; datum.set_channels(1); @@ -112,7 +117,7 @@ void convert_dataset(const char* image_filename, const char* label_filename, // Put in db if (db_backend == "leveldb") { // leveldb - db->Put(leveldb::WriteOptions(), keystr, value); + batch->Put(keystr, value); } else if (db_backend == "lmdb") { // lmdb mdb_data.mv_size = value.size(); mdb_data.mv_data = reinterpret_cast(&value[0]); @@ -120,24 +125,41 @@ void convert_dataset(const char* image_filename, const char* label_filename, mdb_key.mv_data = reinterpret_cast(&keystr[0]); CHECK_EQ(mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0), MDB_SUCCESS) << "mdb_put failed"; - CHECK_EQ(mdb_txn_commit(mdb_txn), MDB_SUCCESS) - << "mdb_txn_commit failed"; - CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) - << "mdb_txn_begin failed"; } else { LOG(FATAL) << "Unknown db backend " << db_backend; } - } - if (db_backend == "leveldb") { // leveldb - delete db; - } else if (db_backend == "lmdb") { // lmdb - mdb_close(mdb_env, mdb_dbi); - mdb_env_close(mdb_env); - } else { - LOG(FATAL) << "Unknown db backend " << db_backend; + if (++count % 1000 == 0) { + // Commit txn + if (db_backend == "leveldb") { // leveldb + db->Write(leveldb::WriteOptions(), batch); + delete batch; + batch = new leveldb::WriteBatch(); + } else if (db_backend == "lmdb") { // lmdb + CHECK_EQ(mdb_txn_commit(mdb_txn), MDB_SUCCESS) + << "mdb_txn_commit failed"; + CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) + << "mdb_txn_begin failed"; + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } + } + } + // write the last batch + if (count % 1000 != 0) { + if (db_backend == "leveldb") { // leveldb + db->Write(leveldb::WriteOptions(), batch); + delete batch; + delete db; + } else if (db_backend == "lmdb") { // lmdb + CHECK_EQ(mdb_txn_commit(mdb_txn), MDB_SUCCESS) << "mdb_txn_commit failed"; + mdb_close(mdb_env, mdb_dbi); + mdb_env_close(mdb_env); + } else { + LOG(FATAL) << "Unknown db backend " << db_backend; + } + LOG(ERROR) << "Processed " << count << " files."; } - delete pixels; } diff --git a/examples/mnist/create_mnist.sh b/examples/mnist/create_mnist.sh index 29f625e6329..ae9469c0f20 100755 --- a/examples/mnist/create_mnist.sh +++ b/examples/mnist/create_mnist.sh @@ -5,6 +5,7 @@ EXAMPLE=examples/mnist DATA=data/mnist BUILD=build/examples/mnist + BACKEND="lmdb" echo "Creating ${BACKEND}..." From c98ed3b8b2da44182551ed8c996c7102b9fec113 Mon Sep 17 00:00:00 2001 From: Mohamed Omran Date: Fri, 29 Aug 2014 17:16:41 +0200 Subject: [PATCH 0575/2053] minor changes to variable names and error messages + set default backed in convert_mnist_data.cpp to lmdb --- examples/mnist/convert_mnist_data.cpp | 45 ++++++++++++++++----------- tools/convert_imageset.cpp | 5 +-- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/examples/mnist/convert_mnist_data.cpp b/examples/mnist/convert_mnist_data.cpp index 6fbd2943d2d..0d3e91ec3ad 100644 --- a/examples/mnist/convert_mnist_data.cpp +++ b/examples/mnist/convert_mnist_data.cpp @@ -2,7 +2,8 @@ // This script converts the MNIST dataset to the leveldb format used // by caffe to perform classification. // Usage: -// convert_mnist_data input_image_file input_label_file output_db_file +// convert_mnist_data [FLAGS] input_image_file input_label_file +// output_db_file // The MNIST dataset could be downloaded at // http://yann.lecun.com/exdb/mnist/ @@ -20,7 +21,10 @@ #include "caffe/proto/caffe.pb.h" -DEFINE_string(backend, "leveldb", "The backend for storing the result"); +using namespace caffe; // NOLINT(build/namespaces) +using std::string; + +DEFINE_string(backend, "lmdb", "The backend for storing the result"); uint32_t swap_endian(uint32_t val) { val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF); @@ -28,7 +32,7 @@ uint32_t swap_endian(uint32_t val) { } void convert_dataset(const char* image_filename, const char* label_filename, - const char* db_filename, const std::string& db_backend) { + const char* db_path, const string& db_backend) { // Open files std::ifstream image_file(image_filename, std::ios::in | std::ios::binary); std::ifstream label_file(label_filename, std::ios::in | std::ios::binary); @@ -65,55 +69,58 @@ void convert_dataset(const char* image_filename, const char* label_filename, // leveldb leveldb::DB* db; leveldb::Options options; - options.create_if_missing = true; options.error_if_exists = true; + options.create_if_missing = true; options.write_buffer_size = 268435456; leveldb::WriteBatch* batch = NULL; - // Open new db + // Open db if (db_backend == "leveldb") { // leveldb + LOG(INFO) << "Opening leveldb " << db_path; leveldb::Status status = leveldb::DB::Open( - options, db_filename, &db); - CHECK(status.ok()) << "Failed to open leveldb " << db_filename + options, db_path, &db); + CHECK(status.ok()) << "Failed to open leveldb " << db_path << ". Is it already existing?"; batch = new leveldb::WriteBatch(); } else if (db_backend == "lmdb") { // lmdb - CHECK_EQ(mkdir(db_filename, 0744), 0) - << "mkdir " << db_filename << "failed"; + LOG(INFO) << "Opening lmdb " << db_path; + CHECK_EQ(mkdir(db_path, 0744), 0) + << "mkdir " << db_path << "failed"; CHECK_EQ(mdb_env_create(&mdb_env), MDB_SUCCESS) << "mdb_env_create failed"; CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS) // 1TB << "mdb_env_set_mapsize failed"; - CHECK_EQ(mdb_env_open(mdb_env, db_filename, 0, 0664), MDB_SUCCESS) + CHECK_EQ(mdb_env_open(mdb_env, db_path, 0, 0664), MDB_SUCCESS) << "mdb_env_open failed"; CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) << "mdb_txn_begin failed"; CHECK_EQ(mdb_open(mdb_txn, NULL, 0, &mdb_dbi), MDB_SUCCESS) - << "mdb_open failed"; + << "mdb_open failed. Does the lmdb already exist? "; } else { LOG(FATAL) << "Unknown db backend " << db_backend; } + // Storing to db char label; char* pixels = new char[rows * cols]; - const int kMaxKeyLength = 10; - char key[kMaxKeyLength]; - std::string value; int count = 0; + const int kMaxKeyLength = 10; + char key_cstr[kMaxKeyLength]; + string value; - caffe::Datum datum; + Datum datum; datum.set_channels(1); datum.set_height(rows); datum.set_width(cols); LOG(INFO) << "A total of " << num_items << " items."; LOG(INFO) << "Rows: " << rows << " Cols: " << cols; - for (int itemid = 0; itemid < num_items; ++itemid) { + for (int item_id = 0; item_id < num_items; ++item_id) { image_file.read(pixels, rows * cols); label_file.read(&label, 1); datum.set_data(pixels, rows*cols); datum.set_label(label); + snprintf(key_cstr, kMaxKeyLength, "%08d", item_id); datum.SerializeToString(&value); - snprintf(key, kMaxKeyLength, "%08d", itemid); - std::string keystr(key); + string keystr(key_cstr); // Put in db if (db_backend == "leveldb") { // leveldb @@ -179,7 +186,7 @@ int main(int argc, char** argv) { "or directly use data/mnist/get_mnist.sh\n"); gflags::ParseCommandLineFlags(&argc, &argv, true); - const std::string& db_backend = FLAGS_backend; + const string& db_backend = FLAGS_backend; if (argc != 4) { gflags::ShowUsageWithFlagsRestrict(argv[0], diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 416a1460912..1c58f3de33f 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -102,7 +102,8 @@ int main(int argc, char** argv) { LOG(INFO) << "Opening leveldb " << db_path; leveldb::Status status = leveldb::DB::Open( options, db_path, &db); - CHECK(status.ok()) << "Failed to open leveldb " << db_path; + CHECK(status.ok()) << "Failed to open leveldb " << db_path + << ". Is it already existing?"; batch = new leveldb::WriteBatch(); } else if (db_backend == "lmdb") { // lmdb LOG(INFO) << "Opening lmdb " << db_path; @@ -116,7 +117,7 @@ int main(int argc, char** argv) { CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) << "mdb_txn_begin failed"; CHECK_EQ(mdb_open(mdb_txn, NULL, 0, &mdb_dbi), MDB_SUCCESS) - << "mdb_open failed"; + << "mdb_open failed. Does the lmdb already exist? "; } else { LOG(FATAL) << "Unknown db backend " << db_backend; } From 5615bf6c17a10464c23e11c370a4241a910870e2 Mon Sep 17 00:00:00 2001 From: Mohamed Omran Date: Sun, 31 Aug 2014 14:27:33 +0200 Subject: [PATCH 0576/2053] updated lenet_train_test.prototxt + minor correction to create_mnist.sh --- examples/mnist/create_mnist.sh | 4 ++-- examples/mnist/lenet_train_test.prototxt | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/examples/mnist/create_mnist.sh b/examples/mnist/create_mnist.sh index ae9469c0f20..8c43dc3391f 100755 --- a/examples/mnist/create_mnist.sh +++ b/examples/mnist/create_mnist.sh @@ -14,8 +14,8 @@ rm -rf $EXAMPLE/mnist_train_${BACKEND} rm -rf $EXAMPLE/mnist_test_${BACKEND} $BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \ - $DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} -backend ${BACKEND} + $DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND} $BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \ - $DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} -backend ${BACKEND} + $DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND} echo "Done." diff --git a/examples/mnist/lenet_train_test.prototxt b/examples/mnist/lenet_train_test.prototxt index 8369af1daa0..e4d65892f37 100644 --- a/examples/mnist/lenet_train_test.prototxt +++ b/examples/mnist/lenet_train_test.prototxt @@ -5,7 +5,8 @@ layers { top: "data" top: "label" data_param { - source: "examples/mnist/mnist_train_leveldb" + source: "examples/mnist/mnist_train_lmdb" + backend: LMDB batch_size: 64 transform_param { scale: 0.00390625 @@ -19,7 +20,8 @@ layers { top: "data" top: "label" data_param { - source: "examples/mnist/mnist_test_leveldb" + source: "examples/mnist/mnist_test_lmdb" + backend: LMDB batch_size: 100 transform_param { scale: 0.00390625 From aae8545427685a7ecd8560ba8f606ded2892123e Mon Sep 17 00:00:00 2001 From: Mohamed Omran Date: Sun, 31 Aug 2014 15:00:09 +0200 Subject: [PATCH 0577/2053] parse_log.sh adapted to new training log format + fixed typos and updated description --- tools/extra/parse_log.sh | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/tools/extra/parse_log.sh b/tools/extra/parse_log.sh index 01ea6f493a6..98ef0a05002 100755 --- a/tools/extra/parse_log.sh +++ b/tools/extra/parse_log.sh @@ -1,7 +1,9 @@ #!/bin/bash # Usage parse_log.sh caffe.log -# It creates two files one caffe.log.test that contains the loss and test accuracy of the test and -# another one caffe.log.loss that contains the loss computed during the training +# It creates the following two text files, each containing a table: +# caffe.log.test (columns: '#Iters Seconds TestAccuracy TestLoss') +# caffe.log.train (columns: '#Iters Seconds TrainingLoss LearningRate') + # get the dirname of the script DIR="$( cd "$(dirname "$0")" ; pwd -P )" @@ -14,31 +16,31 @@ fi LOG=`basename $1` grep -B 1 'Test ' $1 > aux.txt grep 'Iteration ' aux.txt | sed 's/.*Iteration \([[:digit:]]*\).*/\1/g' > aux0.txt -grep 'Test score #0' aux.txt | awk '{print $8}' > aux1.txt -grep 'Test score #1' aux.txt | awk '{print $8}' > aux2.txt +grep 'Test net output #0' aux.txt | awk '{print $11}' > aux1.txt +grep 'Test net output #1' aux.txt | awk '{print $11}' > aux2.txt -# Extracting elpased seconds -# For extraction of time since this line constains the start time +# Extracting elapsed seconds +# For extraction of time since this line contains the start time grep '] Solving ' $1 > aux3.txt grep 'Testing net' $1 >> aux3.txt $DIR/extract_seconds.py aux3.txt aux4.txt # Generating -echo '# Iters Seconds TestAccuracy TestLoss'> $LOG.test +echo '#Iters Seconds TestAccuracy TestLoss'> $LOG.test paste aux0.txt aux4.txt aux1.txt aux2.txt | column -t >> $LOG.test rm aux.txt aux0.txt aux1.txt aux2.txt aux3.txt aux4.txt -# For extraction of time since this line constains the start time +# For extraction of time since this line contains the start time grep '] Solving ' $1 > aux.txt grep ', loss = ' $1 >> aux.txt grep 'Iteration ' aux.txt | sed 's/.*Iteration \([[:digit:]]*\).*/\1/g' > aux0.txt grep ', loss = ' $1 | awk '{print $9}' > aux1.txt grep ', lr = ' $1 | awk '{print $9}' > aux2.txt -# Extracting elpased seconds +# Extracting elapsed seconds $DIR/extract_seconds.py aux.txt aux3.txt # Generating -echo '# Iters Seconds TrainingLoss LearningRate'> $LOG.train +echo '#Iters Seconds TrainingLoss LearningRate'> $LOG.train paste aux0.txt aux3.txt aux1.txt aux2.txt | column -t >> $LOG.train rm aux.txt aux0.txt aux1.txt aux2.txt aux3.txt From fe9502467814b13cf363c5470e7dd5047bfd5a0c Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 31 Aug 2014 23:25:31 -0700 Subject: [PATCH 0578/2053] include comment on CPU mode fine-tuning for Flickr example --- examples/finetune_flickr_style/flickr_style_solver.prototxt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/finetune_flickr_style/flickr_style_solver.prototxt b/examples/finetune_flickr_style/flickr_style_solver.prototxt index 740ec39fe6a..756e162ba1e 100644 --- a/examples/finetune_flickr_style/flickr_style_solver.prototxt +++ b/examples/finetune_flickr_style/flickr_style_solver.prototxt @@ -13,3 +13,5 @@ momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "examples/finetune_flickr_style/flickr_style" +# uncomment the following to default to CPU mode solving +# solver_mode: CPU From f7458b5cd2e687ad467a28ae25c7aed1f4683011 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sun, 31 Aug 2014 23:28:28 -0700 Subject: [PATCH 0579/2053] make no GPU error in CPU-only mode a little clearer --- include/caffe/util/device_alternate.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index 4141c3d60a3..aa359e007cb 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -7,7 +7,7 @@ // Stub out GPU calls as unavailable. -#define NO_GPU LOG(FATAL) << "CPU-only Mode" +#define NO_GPU LOG(FATAL) << "CPU-only Mode: cannot make GPU call." #define STUB_GPU(classname) \ template \ From 5f350aa24654337555ef07f790a10c10a188bef7 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 1 Sep 2014 11:32:12 -0700 Subject: [PATCH 0580/2053] use LMDB in mnist autoencoder examples --- examples/mnist/mnist_autoencoder.prototxt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/mnist/mnist_autoencoder.prototxt b/examples/mnist/mnist_autoencoder.prototxt index d0abc685f0b..b6009fb50a0 100644 --- a/examples/mnist/mnist_autoencoder.prototxt +++ b/examples/mnist/mnist_autoencoder.prototxt @@ -4,7 +4,8 @@ layers { name: "data" type: DATA data_param { - source: "examples/mnist/mnist_train_leveldb" + source: "examples/mnist/mnist_train_lmdb" + backend: LMDB batch_size: 100 transform_param { scale: 0.0039215684 @@ -17,7 +18,8 @@ layers { name: "data" type: DATA data_param { - source: "examples/mnist/mnist_test_leveldb" + source: "examples/mnist/mnist_test_lmdb" + backend: LMDB batch_size: 100 transform_param { scale: 0.0039215684 From 9d10569a79d4dc1a0aa3f42a0bd5214a085ab7c9 Mon Sep 17 00:00:00 2001 From: qipeng Date: Sat, 19 Jul 2014 14:14:21 -0700 Subject: [PATCH 0581/2053] Solver switching support & implementation of Nesterov's accelerated gradient and AdaGrad --- include/caffe/solver.hpp | 53 ++++++++++- src/caffe/solver.cpp | 189 +++++++++++++++++++++++++++++++++++++++ tools/train_net.cpp | 3 + 3 files changed, 241 insertions(+), 4 deletions(-) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 9012c5d50d9..87c6563eae4 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -66,17 +66,62 @@ class SGDSolver : public Solver { : Solver(param_file) {} protected: - virtual void PreSolve(); + void PreSolve(); Dtype GetLearningRate(); virtual void ComputeUpdateValue(); - virtual void SnapshotSolverState(SolverState * state); - virtual void RestoreSolverState(const SolverState& state); + void SnapshotSolverState(SolverState * state); + void RestoreSolverState(const SolverState& state); // history maintains the historical momentum data. - vector > > history_; + // update maintains update related data and is not needed in snapshots. + vector > > history_, update_; DISABLE_COPY_AND_ASSIGN(SGDSolver); }; +template +class NesterovSolver : public SGDSolver { + public: + explicit NesterovSolver(const SolverParameter& param) + : SGDSolver(param) {} + explicit NesterovSolver(const string& param_file) + : SGDSolver(param_file) {} + + protected: + virtual void ComputeUpdateValue(); + + DISABLE_COPY_AND_ASSIGN(NesterovSolver); +}; + +template +class AdaGradSolver : public SGDSolver { + public: + explicit AdaGradSolver(const SolverParameter& param) + : SGDSolver(param) {} + explicit AdaGradSolver(const string& param_file) + : SGDSolver(param_file) {} + + protected: + virtual void ComputeUpdateValue(); + + DISABLE_COPY_AND_ASSIGN(AdaGradSolver); +}; + +template +Solver* GetSolver(const SolverParameter& param) { + SolverParameter_SolverType type = param.solver_type(); + + switch (type) { + case SolverParameter_SolverType_SGD: + return new SGDSolver(param); + case SolverParameter_SolverType_NESTEROV: + return new NesterovSolver(param); + case SolverParameter_SolverType_ADAGRAD: + return new AdaGradSolver(param); + default: + LOG(FATAL) << "Unknown SolverType: " << type; + } +} + } // namespace caffe diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 80582b312fe..5632f249e33 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -377,11 +377,15 @@ void SGDSolver::PreSolve() { // Initialize the history vector > >& net_params = this->net_->params(); history_.clear(); + update_.clear(); for (int i = 0; i < net_params.size(); ++i) { const Blob* net_param = net_params[i].get(); history_.push_back(shared_ptr >(new Blob( net_param->num(), net_param->channels(), net_param->height(), net_param->width()))); + update_.push_back(shared_ptr >(new Blob( + net_param->num(), net_param->channels(), net_param->height(), + net_param->width()))); } } @@ -470,7 +474,192 @@ void SGDSolver::RestoreSolverState(const SolverState& state) { } } +template +void NesterovSolver::ComputeUpdateValue() { + vector > >& net_params = this->net_->params(); + vector& net_params_lr = this->net_->params_lr(); + vector& net_params_weight_decay = this->net_->params_weight_decay(); + // get the learning rate + Dtype rate = this->GetLearningRate(); + if (this->param_.display() && this->iter_ % this->param_.display() == 0) { + LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate; + } + Dtype momentum = this->param_.momentum(); + Dtype weight_decay = this->param_.weight_decay(); + switch (Caffe::mode()) { + case Caffe::CPU: + for (int param_id = 0; param_id < net_params.size(); ++param_id) { + // save history momentum for stepping back + caffe_copy(net_params[param_id]->count(), + this->history_[param_id]->cpu_data(), + this->update_[param_id]->mutable_cpu_data()); + + Dtype local_rate = rate * net_params_lr[param_id]; + Dtype local_decay = weight_decay * net_params_weight_decay[param_id]; + caffe_cpu_axpby(net_params[param_id]->count(), local_rate, + net_params[param_id]->cpu_diff(), momentum, + this->history_[param_id]->mutable_cpu_data()); + if (local_decay) { + // add weight decay + caffe_axpy(net_params[param_id]->count(), + local_decay * local_rate, + net_params[param_id]->cpu_data(), + this->history_[param_id]->mutable_cpu_data()); + } + // compute udpate: step back then over step + caffe_cpu_axpby(net_params[param_id]->count(), Dtype(1) + momentum, + this->history_[param_id]->cpu_data(), -momentum, + this->update_[param_id]->mutable_cpu_data()); + + // copy + caffe_copy(net_params[param_id]->count(), + this->update_[param_id]->cpu_data(), + net_params[param_id]->mutable_cpu_diff()); + } + break; + case Caffe::GPU: +#ifndef CPU_ONLY + for (int param_id = 0; param_id < net_params.size(); ++param_id) { + // save history momentum for stepping back + caffe_copy(net_params[param_id]->count(), + this->history_[param_id]->gpu_data(), + this->update_[param_id]->mutable_gpu_data()); + + Dtype local_rate = rate * net_params_lr[param_id]; + Dtype local_decay = weight_decay * net_params_weight_decay[param_id]; + caffe_gpu_axpby(net_params[param_id]->count(), local_rate, + net_params[param_id]->gpu_diff(), momentum, + this->history_[param_id]->mutable_gpu_data()); + if (local_decay) { + // add weight decay + caffe_gpu_axpy(net_params[param_id]->count(), + local_decay * local_rate, + net_params[param_id]->gpu_data(), + this->history_[param_id]->mutable_gpu_data()); + } + // compute udpate: step back then over step + caffe_gpu_axpby(net_params[param_id]->count(), Dtype(1) + momentum, + this->history_[param_id]->gpu_data(), -momentum, + this->update_[param_id]->mutable_gpu_data()); + + // copy + caffe_copy(net_params[param_id]->count(), + this->update_[param_id]->gpu_data(), + net_params[param_id]->mutable_gpu_diff()); + } +#else + NO_GPU; +#endif + break; + default: + LOG(FATAL) << "Unknown caffe mode: " << Caffe::mode(); + } +} + +template +void AdaGradSolver::ComputeUpdateValue() { + vector > >& net_params = this->net_->params(); + vector& net_params_lr = this->net_->params_lr(); + vector& net_params_weight_decay = this->net_->params_weight_decay(); + // get the learning rate + Dtype rate = this->GetLearningRate(); + if (this->param_.display() && this->iter_ % this->param_.display() == 0) { + LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate; + } + Dtype weight_decay = this->param_.weight_decay(); + switch (Caffe::mode()) { + case Caffe::CPU: + for (int param_id = 0; param_id < net_params.size(); ++param_id) { + Dtype local_rate = rate * net_params_lr[param_id]; + Dtype local_decay = weight_decay * net_params_weight_decay[param_id]; + + if (local_decay) { + // add weight decay + caffe_axpy(net_params[param_id]->count(), + local_decay * local_rate, + net_params[param_id]->cpu_data(), + this->history_[param_id]->mutable_cpu_data()); + } + + // compute square of gradient in update + caffe_powx(net_params[param_id]->count(), + net_params[param_id]->cpu_data(), Dtype(2), + this->update_[param_id]->mutable_cpu_data()); + + // update history + caffe_add(net_params[param_id]->count(), + this->update_[param_id]->cpu_data(), + this->history_[param_id]->cpu_data(), + this->history_[param_id]->mutable_cpu_data()); + + // prepare update + caffe_powx(net_params[param_id]->count(), + this->history_[param_id]->cpu_data(), Dtype(-0.5), + this->update_[param_id]->mutable_cpu_data()); + + caffe_mul(net_params[param_id]->count(), + net_params[param_id]->cpu_diff(), + this->update_[param_id]->cpu_data(), + this->update_[param_id]->mutable_cpu_data()); + + // scale and copy + caffe_cpu_axpby(net_params[param_id]->count(), local_rate, + this->update_[param_id]->cpu_data(), Dtype(0), + net_params[param_id]->mutable_cpu_diff()); + } + break; + case Caffe::GPU: +#ifndef CPU_ONLY + for (int param_id = 0; param_id < net_params.size(); ++param_id) { + Dtype local_rate = rate * net_params_lr[param_id]; + Dtype local_decay = weight_decay * net_params_weight_decay[param_id]; + + if (local_decay) { + // add weight decay + caffe_gpu_axpy(net_params[param_id]->count(), + local_decay * local_rate, + net_params[param_id]->gpu_data(), + this->history_[param_id]->mutable_gpu_data()); + } + + // compute square of gradient in update + caffe_gpu_powx(net_params[param_id]->count(), + net_params[param_id]->gpu_data(), Dtype(2), + this->update_[param_id]->mutable_gpu_data()); + + // update history + caffe_gpu_add(net_params[param_id]->count(), + this->update_[param_id]->gpu_data(), + this->history_[param_id]->gpu_data(), + this->history_[param_id]->mutable_gpu_data()); + + // prepare update + caffe_gpu_powx(net_params[param_id]->count(), + this->history_[param_id]->gpu_data(), Dtype(-0.5), + this->update_[param_id]->mutable_gpu_data()); + + caffe_gpu_mul(net_params[param_id]->count(), + net_params[param_id]->gpu_diff(), + this->update_[param_id]->gpu_data(), + this->update_[param_id]->mutable_gpu_data()); + + // scale and copy + caffe_gpu_axpby(net_params[param_id]->count(), local_rate, + this->update_[param_id]->gpu_data(), Dtype(0), + net_params[param_id]->mutable_gpu_diff()); + } +#else + NO_GPU; +#endif + break; + default: + LOG(FATAL) << "Unknown caffe mode: " << Caffe::mode(); + } +} + INSTANTIATE_CLASS(Solver); INSTANTIATE_CLASS(SGDSolver); +INSTANTIATE_CLASS(NesterovSolver); +INSTANTIATE_CLASS(AdaGradSolver); } // namespace caffe diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 622bca311c8..11767591991 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -1,6 +1,9 @@ #include "caffe/caffe.hpp" +using namespace caffe; // NOLINT(build/namespaces) + int main(int argc, char** argv) { + LOG(FATAL) << "Deprecated. Use caffe train --solver=... " "[--snapshot=...] instead."; return 0; From 8a9c268bd53767365fa0760c167bdcd0158a56f3 Mon Sep 17 00:00:00 2001 From: qipeng Date: Sat, 19 Jul 2014 17:33:35 -0700 Subject: [PATCH 0582/2053] restored vituals in solver.hpp --- include/caffe/solver.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 87c6563eae4..03c655800a7 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -66,11 +66,11 @@ class SGDSolver : public Solver { : Solver(param_file) {} protected: - void PreSolve(); + virtual void PreSolve(); Dtype GetLearningRate(); virtual void ComputeUpdateValue(); - void SnapshotSolverState(SolverState * state); - void RestoreSolverState(const SolverState& state); + virtual void SnapshotSolverState(SolverState * state); + virtual void RestoreSolverState(const SolverState& state); // history maintains the historical momentum data. // update maintains update related data and is not needed in snapshots. vector > > history_, update_; From ed8b1da57fbbadb611d98372671fafd77d863234 Mon Sep 17 00:00:00 2001 From: qipeng Date: Sun, 20 Jul 2014 08:57:33 -0700 Subject: [PATCH 0583/2053] converted pointers to shared_ptr --- include/caffe/solver.hpp | 3 +++ tools/train_net.cpp | 30 ++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 03c655800a7..9d5481cc368 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -120,8 +120,11 @@ Solver* GetSolver(const SolverParameter& param) { default: LOG(FATAL) << "Unknown SolverType: " << type; } + return (Solver*) NULL; } +template Solver* GetSolver(const SolverParameter& param); +template Solver* GetSolver(const SolverParameter& param); } // namespace caffe diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 11767591991..2a2a522dfb9 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -1,10 +1,36 @@ +// Copyright 2014 BVLC and contributors. +// +// This is a simple script that allows one to quickly train a network whose +// parameters are specified by text format protocol buffers. +// Usage: +// train_net net_proto_file solver_proto_file [resume_point_file] + +#include + #include "caffe/caffe.hpp" using namespace caffe; // NOLINT(build/namespaces) int main(int argc, char** argv) { + ::google::InitGoogleLogging(argv[0]); + if (argc < 2 || argc > 3) { + LOG(ERROR) << "Usage: train_net solver_proto_file [resume_point_file]"; + return 1; + } + + SolverParameter solver_param; + ReadProtoFromTextFileOrDie(argv[1], &solver_param); + + LOG(INFO) << "Starting Optimization"; + shared_ptr > solver = + (shared_ptr >) GetSolver(solver_param); + if (argc == 3) { + LOG(INFO) << "Resuming from " << argv[2]; + solver->Solve(argv[2]); + } else { + solver->Solve(); + } + LOG(INFO) << "Optimization Done."; - LOG(FATAL) << "Deprecated. Use caffe train --solver=... " - "[--snapshot=...] instead."; return 0; } From 8b3dde08fc664fa2ba19694c918bc1d411adbd56 Mon Sep 17 00:00:00 2001 From: qipeng Date: Mon, 21 Jul 2014 10:47:55 -0700 Subject: [PATCH 0584/2053] fixed solver constructor in train_net.cpp --- tools/train_net.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 2a2a522dfb9..3652182d606 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -22,8 +22,7 @@ int main(int argc, char** argv) { ReadProtoFromTextFileOrDie(argv[1], &solver_param); LOG(INFO) << "Starting Optimization"; - shared_ptr > solver = - (shared_ptr >) GetSolver(solver_param); + shared_ptr > solver(GetSolver(solver_param)); if (argc == 3) { LOG(INFO) << "Resuming from " << argv[2]; solver->Solve(argv[2]); From 0144de68e6f98d5158f8c0f94cd31c9bb6f79db6 Mon Sep 17 00:00:00 2001 From: qipeng Date: Tue, 22 Jul 2014 21:17:19 -0700 Subject: [PATCH 0585/2053] improved numerical stability for AdaGrad --- src/caffe/solver.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 5632f249e33..abcbe5e6a20 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -481,6 +481,7 @@ void NesterovSolver::ComputeUpdateValue() { vector& net_params_weight_decay = this->net_->params_weight_decay(); // get the learning rate Dtype rate = this->GetLearningRate(); + Dtype delta = this->param_.delta(); if (this->param_.display() && this->iter_ % this->param_.display() == 0) { LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate; } @@ -594,10 +595,13 @@ void AdaGradSolver::ComputeUpdateValue() { // prepare update caffe_powx(net_params[param_id]->count(), - this->history_[param_id]->cpu_data(), Dtype(-0.5), + this->history_[param_id]->cpu_data(), Dtype(0.5), this->update_[param_id]->mutable_cpu_data()); - caffe_mul(net_params[param_id]->count(), + caffe_add_scalar(net_params[param_id]->count(), + delta, this->update_[param_id]->mutable_cpu_data()); + + caffe_div(net_params[param_id]->count(), net_params[param_id]->cpu_diff(), this->update_[param_id]->cpu_data(), this->update_[param_id]->mutable_cpu_data()); @@ -635,10 +639,13 @@ void AdaGradSolver::ComputeUpdateValue() { // prepare update caffe_gpu_powx(net_params[param_id]->count(), - this->history_[param_id]->gpu_data(), Dtype(-0.5), + this->history_[param_id]->gpu_data(), Dtype(0.5), this->update_[param_id]->mutable_gpu_data()); - caffe_gpu_mul(net_params[param_id]->count(), + caffe_gpu_add_scalar(net_params[param_id]->count(), + delta, this->update_[param_id]->mutable_gpu_data()); + + caffe_gpu_div(net_params[param_id]->count(), net_params[param_id]->gpu_diff(), this->update_[param_id]->gpu_data(), this->update_[param_id]->mutable_gpu_data()); From 76ef2ca1f6e326622090aa7d57a10e80d5831350 Mon Sep 17 00:00:00 2001 From: qipeng Date: Wed, 23 Jul 2014 10:25:44 -0700 Subject: [PATCH 0586/2053] bugfixes for AdaGrad --- src/caffe/solver.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index abcbe5e6a20..8928c7b29ae 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -577,14 +577,14 @@ void AdaGradSolver::ComputeUpdateValue() { if (local_decay) { // add weight decay caffe_axpy(net_params[param_id]->count(), - local_decay * local_rate, + local_decay, net_params[param_id]->cpu_data(), - this->history_[param_id]->mutable_cpu_data()); + net_params[param_id]->mutable_cpu_diff()); } // compute square of gradient in update caffe_powx(net_params[param_id]->count(), - net_params[param_id]->cpu_data(), Dtype(2), + net_params[param_id]->cpu_diff(), Dtype(2), this->update_[param_id]->mutable_cpu_data()); // update history @@ -621,14 +621,14 @@ void AdaGradSolver::ComputeUpdateValue() { if (local_decay) { // add weight decay caffe_gpu_axpy(net_params[param_id]->count(), - local_decay * local_rate, + local_decay, net_params[param_id]->gpu_data(), - this->history_[param_id]->mutable_gpu_data()); + net_params[param_id]->mutable_gpu_diff()); } // compute square of gradient in update caffe_gpu_powx(net_params[param_id]->count(), - net_params[param_id]->gpu_data(), Dtype(2), + net_params[param_id]->gpu_diff(), Dtype(2), this->update_[param_id]->mutable_gpu_data()); // update history From a683c40d63b79dcb4e2407d59335fb7f8129c82f Mon Sep 17 00:00:00 2001 From: qipeng Date: Thu, 24 Jul 2014 13:09:28 -0700 Subject: [PATCH 0587/2053] Added L1 regularization support for the weights --- include/caffe/solver.hpp | 4 +- src/caffe/proto/caffe.proto | 3 + src/caffe/solver.cpp | 139 ++++++++++++++++++++++++++++-------- 3 files changed, 115 insertions(+), 31 deletions(-) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 9d5481cc368..4bf50d413c8 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -73,7 +73,9 @@ class SGDSolver : public Solver { virtual void RestoreSolverState(const SolverState& state); // history maintains the historical momentum data. // update maintains update related data and is not needed in snapshots. - vector > > history_, update_; + // temp maintains other information that might be needed in computation + // of gradients/updates and is not needed in snapshots + vector > > history_, update_, temp_; DISABLE_COPY_AND_ASSIGN(SGDSolver); }; diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 49a6e142fcd..0bb5d11cfbe 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -116,6 +116,9 @@ message SolverParameter { optional float power = 10; // The parameter to compute the learning rate. optional float momentum = 11; // The momentum value. optional float weight_decay = 12; // The weight decay. + // regularization types supported: L1 and L2 + // controled by weight_decay + optional string regularization_type = 25 [default = "L2"]; optional int32 stepsize = 13; // the stepsize for learning rate policy "step" optional int32 snapshot = 14 [default = 0]; // The snapshot interval optional string snapshot_prefix = 15; // The prefix for the snapshot. diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 8928c7b29ae..223194bdb09 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -378,6 +378,7 @@ void SGDSolver::PreSolve() { vector > >& net_params = this->net_->params(); history_.clear(); update_.clear(); + temp_.clear(); for (int i = 0; i < net_params.size(); ++i) { const Blob* net_param = net_params[i].get(); history_.push_back(shared_ptr >(new Blob( @@ -386,6 +387,9 @@ void SGDSolver::PreSolve() { update_.push_back(shared_ptr >(new Blob( net_param->num(), net_param->channels(), net_param->height(), net_param->width()))); + temp_.push_back(shared_ptr >(new Blob( + net_param->num(), net_param->channels(), net_param->height(), + net_param->width()))); } } @@ -402,6 +406,7 @@ void SGDSolver::ComputeUpdateValue() { } Dtype momentum = this->param_.momentum(); Dtype weight_decay = this->param_.weight_decay(); + string regularization_type = this->param_.regularization_type(); switch (Caffe::mode()) { case Caffe::CPU: for (int param_id = 0; param_id < net_params.size(); ++param_id) { @@ -412,11 +417,23 @@ void SGDSolver::ComputeUpdateValue() { net_params[param_id]->cpu_diff(), momentum, history_[param_id]->mutable_cpu_data()); if (local_decay) { - // add weight decay - caffe_axpy(net_params[param_id]->count(), - local_decay * local_rate, - net_params[param_id]->cpu_data(), - history_[param_id]->mutable_cpu_data()); + if (regularization_type == "L2") { + // add weight decay + caffe_axpy(net_params[param_id]->count(), + local_decay * local_rate, + net_params[param_id]->cpu_data(), + history_[param_id]->mutable_cpu_data()); + } else if (regularization_type == "L1") { + caffe_cpu_sign(net_params[param_id]->count(), + net_params[param_id]->cpu_data(), + temp_[param_id]->mutable_cpu_data()); + caffe_axpy(net_params[param_id]->count(), + local_decay * local_rate, + temp_[param_id]->cpu_data(), + history_[param_id]->mutable_cpu_data()); + } else { + LOG(FATAL) << "Unknown regularization type: " << regularization_type; + } } // copy caffe_copy(net_params[param_id]->count(), @@ -434,11 +451,23 @@ void SGDSolver::ComputeUpdateValue() { net_params[param_id]->gpu_diff(), momentum, history_[param_id]->mutable_gpu_data()); if (local_decay) { - // add weight decay - caffe_gpu_axpy(net_params[param_id]->count(), - local_decay * local_rate, - net_params[param_id]->gpu_data(), - history_[param_id]->mutable_gpu_data()); + if (regularization_type == "L2") { + // add weight decay + caffe_gpu_axpy(net_params[param_id]->count(), + local_decay * local_rate, + net_params[param_id]->gpu_data(), + history_[param_id]->mutable_gpu_data()); + } else if (regularization_type == "L1") { + caffe_gpu_sign(net_params[param_id]->count(), + net_params[param_id]->gpu_data(), + temp_[param_id]->mutable_gpu_data()); + caffe_gpu_axpy(net_params[param_id]->count(), + local_decay * local_rate, + temp_[param_id]->gpu_data(), + history_[param_id]->mutable_gpu_data()); + } else { + LOG(FATAL) << "Unknown regularization type: " << regularization_type; + } } // copy caffe_copy(net_params[param_id]->count(), @@ -487,6 +516,7 @@ void NesterovSolver::ComputeUpdateValue() { } Dtype momentum = this->param_.momentum(); Dtype weight_decay = this->param_.weight_decay(); + string regularization_type = this->param_.regularization_type(); switch (Caffe::mode()) { case Caffe::CPU: for (int param_id = 0; param_id < net_params.size(); ++param_id) { @@ -501,11 +531,23 @@ void NesterovSolver::ComputeUpdateValue() { net_params[param_id]->cpu_diff(), momentum, this->history_[param_id]->mutable_cpu_data()); if (local_decay) { - // add weight decay - caffe_axpy(net_params[param_id]->count(), - local_decay * local_rate, - net_params[param_id]->cpu_data(), - this->history_[param_id]->mutable_cpu_data()); + if (regularization_type == "L2") { + // add weight decay + caffe_axpy(net_params[param_id]->count(), + local_decay * local_rate, + net_params[param_id]->cpu_data(), + this->history_[param_id]->mutable_cpu_data()); + } else if (regularization_type == "L1") { + caffe_cpu_sign(net_params[param_id]->count(), + net_params[param_id]->cpu_data(), + this->temp_[param_id]->mutable_cpu_data()); + caffe_axpy(net_params[param_id]->count(), + local_decay * local_rate, + this->temp_[param_id]->cpu_data(), + this->history_[param_id]->mutable_cpu_data()); + } else { + LOG(FATAL) << "Unknown regularization type: " << regularization_type; + } } // compute udpate: step back then over step caffe_cpu_axpby(net_params[param_id]->count(), Dtype(1) + momentum, @@ -532,11 +574,23 @@ void NesterovSolver::ComputeUpdateValue() { net_params[param_id]->gpu_diff(), momentum, this->history_[param_id]->mutable_gpu_data()); if (local_decay) { - // add weight decay - caffe_gpu_axpy(net_params[param_id]->count(), - local_decay * local_rate, - net_params[param_id]->gpu_data(), - this->history_[param_id]->mutable_gpu_data()); + if (regularization_type == "L2") { + // add weight decay + caffe_gpu_axpy(net_params[param_id]->count(), + local_decay * local_rate, + net_params[param_id]->gpu_data(), + this->history_[param_id]->mutable_gpu_data()); + } else if (regularization_type == "L1") { + caffe_gpu_sign(net_params[param_id]->count(), + net_params[param_id]->gpu_data(), + this->temp_[param_id]->mutable_gpu_data()); + caffe_gpu_axpy(net_params[param_id]->count(), + local_decay * local_rate, + this->temp_[param_id]->gpu_data(), + this->history_[param_id]->mutable_gpu_data()); + } else { + LOG(FATAL) << "Unknown regularization type: " << regularization_type; + } } // compute udpate: step back then over step caffe_gpu_axpby(net_params[param_id]->count(), Dtype(1) + momentum, @@ -568,6 +622,7 @@ void AdaGradSolver::ComputeUpdateValue() { LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate; } Dtype weight_decay = this->param_.weight_decay(); + string regularization_type = this->param_.regularization_type(); switch (Caffe::mode()) { case Caffe::CPU: for (int param_id = 0; param_id < net_params.size(); ++param_id) { @@ -575,11 +630,23 @@ void AdaGradSolver::ComputeUpdateValue() { Dtype local_decay = weight_decay * net_params_weight_decay[param_id]; if (local_decay) { - // add weight decay - caffe_axpy(net_params[param_id]->count(), - local_decay, - net_params[param_id]->cpu_data(), - net_params[param_id]->mutable_cpu_diff()); + if (regularization_type == "L2") { + // add weight decay + caffe_axpy(net_params[param_id]->count(), + local_decay, + net_params[param_id]->cpu_data(), + this->history_[param_id]->mutable_cpu_data()); + } else if (regularization_type == "L1") { + caffe_cpu_sign(net_params[param_id]->count(), + net_params[param_id]->cpu_data(), + this->temp_[param_id]->mutable_cpu_data()); + caffe_axpy(net_params[param_id]->count(), + local_decay, + this->temp_[param_id]->cpu_data(), + this->history_[param_id]->mutable_cpu_data()); + } else { + LOG(FATAL) << "Unknown regularization type: " << regularization_type; + } } // compute square of gradient in update @@ -619,11 +686,23 @@ void AdaGradSolver::ComputeUpdateValue() { Dtype local_decay = weight_decay * net_params_weight_decay[param_id]; if (local_decay) { - // add weight decay - caffe_gpu_axpy(net_params[param_id]->count(), - local_decay, - net_params[param_id]->gpu_data(), - net_params[param_id]->mutable_gpu_diff()); + if (regularization_type == "L2") { + // add weight decay + caffe_gpu_axpy(net_params[param_id]->count(), + local_decay, + net_params[param_id]->gpu_data(), + this->history_[param_id]->mutable_gpu_data()); + } else if (regularization_type == "L1") { + caffe_gpu_sign(net_params[param_id]->count(), + net_params[param_id]->gpu_data(), + this->temp_[param_id]->mutable_gpu_data()); + caffe_gpu_axpy(net_params[param_id]->count(), + local_decay, + this->temp_[param_id]->gpu_data(), + this->history_[param_id]->mutable_gpu_data()); + } else { + LOG(FATAL) << "Unknown regularization type: " << regularization_type; + } } // compute square of gradient in update From b0ec5314f407f47bd2b593c609f88cf23ffa32cf Mon Sep 17 00:00:00 2001 From: qipeng Date: Tue, 29 Jul 2014 10:06:32 -0700 Subject: [PATCH 0588/2053] fixed caffe.proto after a mistaken rebase --- src/caffe/proto/caffe.proto | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 0bb5d11cfbe..73ae89d326a 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -137,6 +137,16 @@ message SolverParameter { // random number generator -- useful for reproducible results. Otherwise, // (and by default) initialize using a seed derived from the system clock. optional int64 random_seed = 20 [default = -1]; + + // Solver type + enum SolverType { + SGD = 0; + NESTEROV = 1; + ADAGRAD = 2; + } + optional SolverType solver_type = 26 [default = SGD]; + // numerical stability for AdaGrad + optional float delta = 27 [default = 1e-8]; // If true, print information about the state of the net that may help with // debugging learning problems. From 3f7a910e05c1ee6e9d09ac201831592357fc18ee Mon Sep 17 00:00:00 2001 From: qipeng Date: Tue, 29 Jul 2014 19:46:37 -0700 Subject: [PATCH 0589/2053] Addressed Yangqing's comments --- include/caffe/solver.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 4bf50d413c8..2f51268f295 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -125,9 +125,6 @@ Solver* GetSolver(const SolverParameter& param) { return (Solver*) NULL; } -template Solver* GetSolver(const SolverParameter& param); -template Solver* GetSolver(const SolverParameter& param); - } // namespace caffe #endif // CAFFE_OPTIMIZATION_SOLVER_HPP_ From 23d44308692e469bd7b587d1697ac68068986608 Mon Sep 17 00:00:00 2001 From: qipeng Date: Tue, 29 Jul 2014 19:56:36 -0700 Subject: [PATCH 0590/2053] fixes after rebase --- src/caffe/proto/caffe.proto | 8 ++++---- src/caffe/solver.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 73ae89d326a..9afe8e83a8e 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -63,7 +63,7 @@ message NetParameter { // NOTE // Update the next available ID when you add a new SolverParameter field. // -// SolverParameter next available ID: 27 (last added: test_state) +// SolverParameter next available ID: 31 (last added: delta) message SolverParameter { ////////////////////////////////////////////////////////////////////////////// // Specifying the train and test networks @@ -118,7 +118,7 @@ message SolverParameter { optional float weight_decay = 12; // The weight decay. // regularization types supported: L1 and L2 // controled by weight_decay - optional string regularization_type = 25 [default = "L2"]; + optional string regularization_type = 28 [default = "L2"]; optional int32 stepsize = 13; // the stepsize for learning rate policy "step" optional int32 snapshot = 14 [default = 0]; // The snapshot interval optional string snapshot_prefix = 15; // The prefix for the snapshot. @@ -144,9 +144,9 @@ message SolverParameter { NESTEROV = 1; ADAGRAD = 2; } - optional SolverType solver_type = 26 [default = SGD]; + optional SolverType solver_type = 29 [default = SGD]; // numerical stability for AdaGrad - optional float delta = 27 [default = 1e-8]; + optional float delta = 30 [default = 1e-8]; // If true, print information about the state of the net that may help with // debugging learning problems. diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 223194bdb09..52fd6523e95 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -510,7 +510,6 @@ void NesterovSolver::ComputeUpdateValue() { vector& net_params_weight_decay = this->net_->params_weight_decay(); // get the learning rate Dtype rate = this->GetLearningRate(); - Dtype delta = this->param_.delta(); if (this->param_.display() && this->iter_ % this->param_.display() == 0) { LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate; } @@ -618,6 +617,7 @@ void AdaGradSolver::ComputeUpdateValue() { vector& net_params_weight_decay = this->net_->params_weight_decay(); // get the learning rate Dtype rate = this->GetLearningRate(); + Dtype delta = this->param_.delta(); if (this->param_.display() && this->iter_ % this->param_.display() == 0) { LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate; } From 29b3b2442dc37d7c7481e96a3db747447181b1b8 Mon Sep 17 00:00:00 2001 From: qipeng Date: Wed, 20 Aug 2014 15:19:30 -0700 Subject: [PATCH 0591/2053] proto conflit, lint, and math_functions (compiler complaint) --- src/caffe/proto/caffe.proto | 8 ++++---- tools/train_net.cpp | 9 --------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 9afe8e83a8e..bb14b838f9b 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -63,7 +63,7 @@ message NetParameter { // NOTE // Update the next available ID when you add a new SolverParameter field. // -// SolverParameter next available ID: 31 (last added: delta) +// SolverParameter next available ID: 32 (last added: delta) message SolverParameter { ////////////////////////////////////////////////////////////////////////////// // Specifying the train and test networks @@ -118,7 +118,7 @@ message SolverParameter { optional float weight_decay = 12; // The weight decay. // regularization types supported: L1 and L2 // controled by weight_decay - optional string regularization_type = 28 [default = "L2"]; + optional string regularization_type = 29 [default = "L2"]; optional int32 stepsize = 13; // the stepsize for learning rate policy "step" optional int32 snapshot = 14 [default = 0]; // The snapshot interval optional string snapshot_prefix = 15; // The prefix for the snapshot. @@ -144,9 +144,9 @@ message SolverParameter { NESTEROV = 1; ADAGRAD = 2; } - optional SolverType solver_type = 29 [default = SGD]; + optional SolverType solver_type = 30 [default = SGD]; // numerical stability for AdaGrad - optional float delta = 30 [default = 1e-8]; + optional float delta = 31 [default = 1e-8]; // If true, print information about the state of the net that may help with // debugging learning problems. diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 3652182d606..9429fe892e9 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -1,12 +1,3 @@ -// Copyright 2014 BVLC and contributors. -// -// This is a simple script that allows one to quickly train a network whose -// parameters are specified by text format protocol buffers. -// Usage: -// train_net net_proto_file solver_proto_file [resume_point_file] - -#include - #include "caffe/caffe.hpp" using namespace caffe; // NOLINT(build/namespaces) From 7f2e66e6cc0133e18a659611eaffbadb7b0edf2c Mon Sep 17 00:00:00 2001 From: qipeng Date: Wed, 20 Aug 2014 20:07:53 -0700 Subject: [PATCH 0592/2053] added unit test for solvers and fixed solver bugs --- src/caffe/solver.cpp | 76 ++--- src/caffe/test/test_adagrad_solver.cpp | 351 ++++++++++++++++++++++++ src/caffe/test/test_nesterov_solver.cpp | 351 ++++++++++++++++++++++++ 3 files changed, 746 insertions(+), 32 deletions(-) create mode 100644 src/caffe/test/test_adagrad_solver.cpp create mode 100644 src/caffe/test/test_nesterov_solver.cpp diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 52fd6523e95..dcac4c1537c 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -413,28 +413,30 @@ void SGDSolver::ComputeUpdateValue() { // Compute the value to history, and then copy them to the blob's diff. Dtype local_rate = rate * net_params_lr[param_id]; Dtype local_decay = weight_decay * net_params_weight_decay[param_id]; - caffe_cpu_axpby(net_params[param_id]->count(), local_rate, - net_params[param_id]->cpu_diff(), momentum, - history_[param_id]->mutable_cpu_data()); + if (local_decay) { if (regularization_type == "L2") { // add weight decay caffe_axpy(net_params[param_id]->count(), - local_decay * local_rate, + local_decay, net_params[param_id]->cpu_data(), - history_[param_id]->mutable_cpu_data()); + net_params[param_id]->mutable_cpu_diff()); } else if (regularization_type == "L1") { caffe_cpu_sign(net_params[param_id]->count(), net_params[param_id]->cpu_data(), temp_[param_id]->mutable_cpu_data()); caffe_axpy(net_params[param_id]->count(), - local_decay * local_rate, + local_decay, temp_[param_id]->cpu_data(), - history_[param_id]->mutable_cpu_data()); + net_params[param_id]->mutable_cpu_diff()); } else { LOG(FATAL) << "Unknown regularization type: " << regularization_type; } } + + caffe_cpu_axpby(net_params[param_id]->count(), local_rate, + net_params[param_id]->cpu_diff(), momentum, + history_[param_id]->mutable_cpu_data()); // copy caffe_copy(net_params[param_id]->count(), history_[param_id]->cpu_data(), @@ -447,28 +449,30 @@ void SGDSolver::ComputeUpdateValue() { // Compute the value to history, and then copy them to the blob's diff. Dtype local_rate = rate * net_params_lr[param_id]; Dtype local_decay = weight_decay * net_params_weight_decay[param_id]; - caffe_gpu_axpby(net_params[param_id]->count(), local_rate, - net_params[param_id]->gpu_diff(), momentum, - history_[param_id]->mutable_gpu_data()); + if (local_decay) { if (regularization_type == "L2") { // add weight decay caffe_gpu_axpy(net_params[param_id]->count(), - local_decay * local_rate, + local_decay, net_params[param_id]->gpu_data(), - history_[param_id]->mutable_gpu_data()); + net_params[param_id]->mutable_gpu_diff()); } else if (regularization_type == "L1") { caffe_gpu_sign(net_params[param_id]->count(), net_params[param_id]->gpu_data(), temp_[param_id]->mutable_gpu_data()); caffe_gpu_axpy(net_params[param_id]->count(), - local_decay * local_rate, + local_decay, temp_[param_id]->gpu_data(), - history_[param_id]->mutable_gpu_data()); + net_params[param_id]->mutable_gpu_diff()); } else { LOG(FATAL) << "Unknown regularization type: " << regularization_type; } } + + caffe_gpu_axpby(net_params[param_id]->count(), local_rate, + net_params[param_id]->gpu_diff(), momentum, + history_[param_id]->mutable_gpu_data()); // copy caffe_copy(net_params[param_id]->count(), history_[param_id]->gpu_data(), @@ -526,28 +530,32 @@ void NesterovSolver::ComputeUpdateValue() { Dtype local_rate = rate * net_params_lr[param_id]; Dtype local_decay = weight_decay * net_params_weight_decay[param_id]; - caffe_cpu_axpby(net_params[param_id]->count(), local_rate, - net_params[param_id]->cpu_diff(), momentum, - this->history_[param_id]->mutable_cpu_data()); + if (local_decay) { if (regularization_type == "L2") { // add weight decay caffe_axpy(net_params[param_id]->count(), - local_decay * local_rate, + local_decay, net_params[param_id]->cpu_data(), - this->history_[param_id]->mutable_cpu_data()); + net_params[param_id]->mutable_cpu_diff()); } else if (regularization_type == "L1") { caffe_cpu_sign(net_params[param_id]->count(), net_params[param_id]->cpu_data(), this->temp_[param_id]->mutable_cpu_data()); caffe_axpy(net_params[param_id]->count(), - local_decay * local_rate, + local_decay, this->temp_[param_id]->cpu_data(), - this->history_[param_id]->mutable_cpu_data()); + net_params[param_id]->mutable_cpu_diff()); } else { LOG(FATAL) << "Unknown regularization type: " << regularization_type; } } + + // update history + caffe_cpu_axpby(net_params[param_id]->count(), local_rate, + net_params[param_id]->cpu_diff(), momentum, + this->history_[param_id]->mutable_cpu_data()); + // compute udpate: step back then over step caffe_cpu_axpby(net_params[param_id]->count(), Dtype(1) + momentum, this->history_[param_id]->cpu_data(), -momentum, @@ -569,28 +577,32 @@ void NesterovSolver::ComputeUpdateValue() { Dtype local_rate = rate * net_params_lr[param_id]; Dtype local_decay = weight_decay * net_params_weight_decay[param_id]; - caffe_gpu_axpby(net_params[param_id]->count(), local_rate, - net_params[param_id]->gpu_diff(), momentum, - this->history_[param_id]->mutable_gpu_data()); + if (local_decay) { if (regularization_type == "L2") { // add weight decay caffe_gpu_axpy(net_params[param_id]->count(), - local_decay * local_rate, + local_decay, net_params[param_id]->gpu_data(), - this->history_[param_id]->mutable_gpu_data()); + net_params[param_id]->mutable_gpu_diff()); } else if (regularization_type == "L1") { caffe_gpu_sign(net_params[param_id]->count(), net_params[param_id]->gpu_data(), this->temp_[param_id]->mutable_gpu_data()); caffe_gpu_axpy(net_params[param_id]->count(), - local_decay * local_rate, + local_decay, this->temp_[param_id]->gpu_data(), - this->history_[param_id]->mutable_gpu_data()); + net_params[param_id]->mutable_gpu_diff()); } else { LOG(FATAL) << "Unknown regularization type: " << regularization_type; } } + + // update history + caffe_gpu_axpby(net_params[param_id]->count(), local_rate, + net_params[param_id]->gpu_diff(), momentum, + this->history_[param_id]->mutable_gpu_data()); + // compute udpate: step back then over step caffe_gpu_axpby(net_params[param_id]->count(), Dtype(1) + momentum, this->history_[param_id]->gpu_data(), -momentum, @@ -635,7 +647,7 @@ void AdaGradSolver::ComputeUpdateValue() { caffe_axpy(net_params[param_id]->count(), local_decay, net_params[param_id]->cpu_data(), - this->history_[param_id]->mutable_cpu_data()); + net_params[param_id]->mutable_cpu_diff()); } else if (regularization_type == "L1") { caffe_cpu_sign(net_params[param_id]->count(), net_params[param_id]->cpu_data(), @@ -643,7 +655,7 @@ void AdaGradSolver::ComputeUpdateValue() { caffe_axpy(net_params[param_id]->count(), local_decay, this->temp_[param_id]->cpu_data(), - this->history_[param_id]->mutable_cpu_data()); + net_params[param_id]->mutable_cpu_diff()); } else { LOG(FATAL) << "Unknown regularization type: " << regularization_type; } @@ -691,7 +703,7 @@ void AdaGradSolver::ComputeUpdateValue() { caffe_gpu_axpy(net_params[param_id]->count(), local_decay, net_params[param_id]->gpu_data(), - this->history_[param_id]->mutable_gpu_data()); + net_params[param_id]->mutable_gpu_diff()); } else if (regularization_type == "L1") { caffe_gpu_sign(net_params[param_id]->count(), net_params[param_id]->gpu_data(), @@ -699,7 +711,7 @@ void AdaGradSolver::ComputeUpdateValue() { caffe_gpu_axpy(net_params[param_id]->count(), local_decay, this->temp_[param_id]->gpu_data(), - this->history_[param_id]->mutable_gpu_data()); + net_params[param_id]->mutable_gpu_diff()); } else { LOG(FATAL) << "Unknown regularization type: " << regularization_type; } diff --git a/src/caffe/test/test_adagrad_solver.cpp b/src/caffe/test/test_adagrad_solver.cpp new file mode 100644 index 00000000000..45cf2002e33 --- /dev/null +++ b/src/caffe/test/test_adagrad_solver.cpp @@ -0,0 +1,351 @@ +#include +#include +#include +#include + +#include "google/protobuf/text_format.h" + +#include "gtest/gtest.h" + +#include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/solver.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +using std::ostringstream; + +namespace caffe { + +template +class AdaGradSolverTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + AdaGradSolverTest() : + seed_(1701), num_(5), channels_(3), height_(10), width_(10) {} + + // MockAdaGradSolver: an AdaGradSolver with public history. + class MockAdaGradSolver : public AdaGradSolver { + public: + explicit MockAdaGradSolver(const SolverParameter& param) : + AdaGradSolver(param) {} + vector > >& history() { return this->history_; } + Dtype delta() { return this->param_.delta(); } + }; + + shared_ptr solver_; + int seed_; + int num_, channels_, height_, width_; + + virtual void InitSolverFromProtoString(const string& proto) { + SolverParameter param; + CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); + // Disable saving a final snapshot so the tests don't pollute the user's + // working directory with useless snapshots. + param.set_snapshot_after_train(false); + // Set the solver_mode according to current Caffe::mode. + switch (Caffe::mode()) { + case Caffe::CPU: + param.set_solver_mode(SolverParameter_SolverMode_CPU); + break; + case Caffe::GPU: + param.set_solver_mode(SolverParameter_SolverMode_GPU); + break; + default: + LOG(FATAL) << "Unknown Caffe mode: " << Caffe::mode(); + } + solver_.reset(new MockAdaGradSolver(param)); + } + + void RunLeastSquaresSolver(const Dtype learning_rate, + const Dtype weight_decay, const Dtype momentum, const int num_iters) { + ostringstream proto; + proto << + "max_iter: " << num_iters << " " + "base_lr: " << learning_rate << " " + "lr_policy: 'fixed' " + "net_param { " + " name: 'TestNetwork' " + " layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: " << num_ << " " + " channels: " << channels_ << " " + " height: " << height_ << " " + " width: " << width_ << " " + " channels: 1 " + " height: 1 " + " width: 1 " + " data_filler { " + " type: 'gaussian' " + " std: 1.0 " + " } " + " } " + " top: 'data' " + " top: 'targets' " + " } " + " layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 1 " + " weight_filler { " + " type: 'gaussian' " + " std: 1.0 " + " } " + " bias_filler { " + " type: 'gaussian' " + " std: 1.0 " + " } " + " } " + " bottom: 'data' " + " top: 'innerprod' " + " } " + " layers: { " + " name: 'loss' " + " type: EUCLIDEAN_LOSS " + " bottom: 'innerprod' " + " bottom: 'targets' " + " } " + "} "; + if (weight_decay != 0) { + proto << "weight_decay: " << weight_decay << " "; + } + if (momentum != 0) { + proto << "momentum: " << momentum << " "; + } + Caffe::set_random_seed(this->seed_); + this->InitSolverFromProtoString(proto.str()); + this->solver_->Solve(); + } + + // Compute an update value given the current state of the train net, + // using the analytical formula for the least squares gradient. + // updated_params will store the updated weight and bias results, + // using the blobs' diffs to hold the update values themselves. + void ComputeLeastSquaresUpdate(const Dtype learning_rate, + const Dtype weight_decay, const Dtype momentum, + vector > >* updated_params) { + const int N = num_; + const int D = channels_ * height_ * width_; + + // Run a forward pass, and manually compute the update values from the + // result. + Net& net = *this->solver_->net(); + vector*> empty_bottom_vec; + net.Forward(empty_bottom_vec); + ASSERT_TRUE(net.has_blob("data")); + const Blob& data = *net.blob_by_name("data"); + ASSERT_TRUE(net.has_blob("targets")); + const Blob& targets = *net.blob_by_name("targets"); + ASSERT_TRUE(net.has_layer("innerprod")); + const vector > >& param_blobs = + net.layer_by_name("innerprod")->blobs(); + const int num_param_blobs = 2; + ASSERT_EQ(num_param_blobs, param_blobs.size()); + const Blob& weights = *param_blobs[0]; + const Blob& bias = *param_blobs[1]; + ASSERT_EQ(D * N, data.count()); + ASSERT_EQ(N, targets.count()); + ASSERT_EQ(D, weights.count()); + ASSERT_EQ(1, bias.count()); + + updated_params->clear(); + updated_params->resize(num_param_blobs); + for (int i = 0; i < num_param_blobs; ++i) { + (*updated_params)[i].reset(new Blob()); + } + Blob& updated_weights = *(*updated_params)[0]; + updated_weights.ReshapeLike(weights); + Blob& updated_bias = *(*updated_params)[1]; + updated_bias.ReshapeLike(bias); + + for (int i = 0; i <= D; ++i) { + // Compute the derivative with respect to the ith weight (i.e., the ith + // element of the gradient). + Dtype grad = 0; + for (int j = 0; j <= D; ++j) { + // Compute element (i, j) of X^T * X. + Dtype element = 0; + for (int k = 0; k < N; ++k) { + // (i, k) in X^T (== (k, i) in X) times (k, j) in X. + const Dtype element_i = (i == D) ? 1 : data.cpu_data()[k * D + i]; + const Dtype element_j = (j == D) ? 1 : data.cpu_data()[k * D + j]; + element += element_i * element_j; + } + if (j == D) { + grad += element * bias.cpu_data()[0]; + } else { + grad += element * weights.cpu_data()[j]; + } + } + for (int k = 0; k < N; ++k) { + const Dtype element_i = (i == D) ? 1 : data.cpu_data()[k * D + i]; + grad -= element_i * targets.cpu_data()[k]; + } + // Scale the gradient over the N samples. + grad /= N; + // Add the weight decay to the gradient. + grad += weight_decay * + ((i == D) ? bias.cpu_data()[0] : weights.cpu_data()[i]); + // Finally, compute update + const vector > >& history = solver_->history(); + Dtype delta = solver_->delta(); + ASSERT_EQ(2, history.size()); // 1 blob for weights, 1 for bias + Dtype update_value, temp; + if (i == D) { + temp = history[1]->cpu_data()[0]; + temp += grad * grad; + update_value = learning_rate * grad / (std::sqrt(temp) + delta); + updated_bias.mutable_cpu_diff()[0] = update_value; + updated_bias.mutable_cpu_data()[0] = bias.cpu_data()[0] - update_value; + } else { + temp = history[0]->cpu_data()[i]; + temp += grad * grad; + update_value = learning_rate * grad / (std::sqrt(temp) + delta); + updated_weights.mutable_cpu_diff()[i] = update_value; + updated_weights.mutable_cpu_data()[i] = + weights.cpu_data()[i] - update_value; + } + } + } + + void CheckLeastSquaresUpdate( + const vector > >& updated_params) { + const int D = channels_ * height_ * width_; + + const Blob& updated_weights = *updated_params[0]; + const Blob& updated_bias = *updated_params[1]; + + Net& net = *this->solver_->net(); + ASSERT_TRUE(net.has_layer("innerprod")); + const vector > >& param_blobs = + net.layer_by_name("innerprod")->blobs(); + ASSERT_EQ(2, param_blobs.size()); + const Blob& solver_updated_weights = *param_blobs[0]; + ASSERT_EQ(D, solver_updated_weights.count()); + const double kPrecision = 1e-3; + const double kMinPrecision = 1e-7; + for (int i = 0; i < D; ++i) { + const Dtype expected_updated_weight = updated_weights.cpu_data()[i]; + const Dtype solver_updated_weight = solver_updated_weights.cpu_data()[i]; + const Dtype error_margin = std::max(kMinPrecision, kPrecision * + std::min(fabs(expected_updated_weight), fabs(solver_updated_weight))); + EXPECT_NEAR(expected_updated_weight, solver_updated_weight, error_margin); + } + const Blob& solver_updated_bias_blob = *param_blobs[1]; + ASSERT_EQ(1, solver_updated_bias_blob.count()); + const Dtype expected_updated_bias = updated_bias.cpu_data()[0]; + const Dtype solver_updated_bias = solver_updated_bias_blob.cpu_data()[0]; + const Dtype error_margin = std::max(kMinPrecision, kPrecision * + std::min(fabs(expected_updated_bias), fabs(solver_updated_bias))); + EXPECT_NEAR(expected_updated_bias, solver_updated_bias, error_margin); + + // Check the solver's history -- should contain the previous update value. +// vector > >& history = this->solver_->history(); +// ASSERT_EQ(2, history.size()); +// for (int i = 0; i < D; ++i) { +// const Dtype expected_history = updated_weights.cpu_diff()[i]; +// const Dtype solver_history = history[0]->cpu_data()[i]; +// const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * +// std::min(fabs(expected_history), fabs(solver_history))); +// EXPECT_NEAR(expected_history, solver_history, error_margin_hist); +// } +// const Dtype expected_history = updated_bias.cpu_diff()[0]; +// const Dtype solver_history = history[1]->cpu_data()[0]; +// const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * +// std::min(fabs(expected_history), fabs(solver_history))); +// EXPECT_NEAR(expected_history, solver_history, error_margin_hist); + } + + // Test that the correct update is computed for a regularized least squares + // problem: + // + // E = (1/(2n)) || X w - y ||^2 + (lambda / 2) || w ||^2 + // \nabla_w E = (1/n) (X^T X w - X^T y) + lambda * w + // + // X \in R^{n x (d+1)} (each example is a row, (d+1)th element is always 1) + // w \in R^{(d+1) x 1} ((d+1)th element is the bias) + // y \in R^{n x 1} + // lambda is weight_decay + // + // TestLeastSquaresUpdate works "inductively", assuming that the solver + // correctly updates the net K (= iter_to_check) times, then given the history + // from the Kth update, we compute the (K+1)th update and check that it + // matches the solver's (K+1)th update. + void TestLeastSquaresUpdate(const Dtype learning_rate = 1.0, + const Dtype weight_decay = 0.0, const Dtype momentum = 0.0, + const int iter_to_check = 0) { + // Initialize the solver and run K (= iter_to_check) solver iterations. + RunLeastSquaresSolver(learning_rate, weight_decay, momentum, iter_to_check); + + // Compute the (K+1)th update using the analytic least squares gradient. + vector > > updated_params; + ComputeLeastSquaresUpdate(learning_rate, weight_decay, momentum, + &updated_params); + + // Reinitialize the solver and run K+1 solver iterations. + RunLeastSquaresSolver(learning_rate, weight_decay, momentum, + iter_to_check + 1); + + // Check that the solver's solution matches ours. + CheckLeastSquaresUpdate(updated_params); + } +}; + +TYPED_TEST_CASE(AdaGradSolverTest, TestDtypesAndDevices); + +TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdate) { + typedef typename TypeParam::Dtype Dtype; + this->TestLeastSquaresUpdate(); +} + +TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateLROneTenth) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 0.1; + this->TestLeastSquaresUpdate(kLearningRate); +} + +TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateWithWeightDecay) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.5; + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay); +} +/* +TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateWithMomentum) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.0; + const Dtype kMomentum = 0.5; + const int kNumIters = 1; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + +TYPED_TEST(AdaGradSolverTest, TestLeastSquaresUpdateWithMomentumMultiIter) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.0; + const Dtype kMomentum = 0.5; + const int kNumIters = 5; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} +*/ +TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateWithEverything) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 0.01; + const Dtype kWeightDecay = 0.1; + const Dtype kMomentum = 0.0; + const int kNumIters = 5; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + +} // namespace caffe diff --git a/src/caffe/test/test_nesterov_solver.cpp b/src/caffe/test/test_nesterov_solver.cpp new file mode 100644 index 00000000000..f2fcba30b29 --- /dev/null +++ b/src/caffe/test/test_nesterov_solver.cpp @@ -0,0 +1,351 @@ +#include +#include +#include +#include + +#include "google/protobuf/text_format.h" + +#include "gtest/gtest.h" + +#include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/solver.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +using std::ostringstream; + +namespace caffe { + +template +class NesterovSolverTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + NesterovSolverTest() : + seed_(1701), num_(5), channels_(3), height_(10), width_(10) {} + + // MockNesterovSolver: an NesterovSolver with public history. + class MockNesterovSolver : public NesterovSolver { + public: + explicit MockNesterovSolver(const SolverParameter& param) : + NesterovSolver(param) {} + vector > >& history() { return this->history_; } + }; + + shared_ptr solver_; + int seed_; + int num_, channels_, height_, width_; + + virtual void InitSolverFromProtoString(const string& proto) { + SolverParameter param; + CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); + // Disable saving a final snapshot so the tests don't pollute the user's + // working directory with useless snapshots. + param.set_snapshot_after_train(false); + // Set the solver_mode according to current Caffe::mode. + switch (Caffe::mode()) { + case Caffe::CPU: + param.set_solver_mode(SolverParameter_SolverMode_CPU); + break; + case Caffe::GPU: + param.set_solver_mode(SolverParameter_SolverMode_GPU); + break; + default: + LOG(FATAL) << "Unknown Caffe mode: " << Caffe::mode(); + } + solver_.reset(new MockNesterovSolver(param)); + } + + void RunLeastSquaresSolver(const Dtype learning_rate, + const Dtype weight_decay, const Dtype momentum, const int num_iters) { + ostringstream proto; + proto << + "max_iter: " << num_iters << " " + "base_lr: " << learning_rate << " " + "lr_policy: 'fixed' " + "net_param { " + " name: 'TestNetwork' " + " layers: { " + " name: 'data' " + " type: DUMMY_DATA " + " dummy_data_param { " + " num: " << num_ << " " + " channels: " << channels_ << " " + " height: " << height_ << " " + " width: " << width_ << " " + " channels: 1 " + " height: 1 " + " width: 1 " + " data_filler { " + " type: 'gaussian' " + " std: 1.0 " + " } " + " } " + " top: 'data' " + " top: 'targets' " + " } " + " layers: { " + " name: 'innerprod' " + " type: INNER_PRODUCT " + " inner_product_param { " + " num_output: 1 " + " weight_filler { " + " type: 'gaussian' " + " std: 1.0 " + " } " + " bias_filler { " + " type: 'gaussian' " + " std: 1.0 " + " } " + " } " + " bottom: 'data' " + " top: 'innerprod' " + " } " + " layers: { " + " name: 'loss' " + " type: EUCLIDEAN_LOSS " + " bottom: 'innerprod' " + " bottom: 'targets' " + " } " + "} "; + if (weight_decay != 0) { + proto << "weight_decay: " << weight_decay << " "; + } + if (momentum != 0) { + proto << "momentum: " << momentum << " "; + } + Caffe::set_random_seed(this->seed_); + this->InitSolverFromProtoString(proto.str()); + this->solver_->Solve(); + } + + // Compute an update value given the current state of the train net, + // using the analytical formula for the least squares gradient. + // updated_params will store the updated weight and bias results, + // using the blobs' diffs to hold the update values themselves. + void ComputeLeastSquaresUpdate(const Dtype learning_rate, + const Dtype weight_decay, const Dtype momentum, + vector > >* updated_params) { + const int N = num_; + const int D = channels_ * height_ * width_; + + // Run a forward pass, and manually compute the update values from the + // result. + Net& net = *this->solver_->net(); + vector*> empty_bottom_vec; + net.Forward(empty_bottom_vec); + ASSERT_TRUE(net.has_blob("data")); + const Blob& data = *net.blob_by_name("data"); + ASSERT_TRUE(net.has_blob("targets")); + const Blob& targets = *net.blob_by_name("targets"); + ASSERT_TRUE(net.has_layer("innerprod")); + const vector > >& param_blobs = + net.layer_by_name("innerprod")->blobs(); + const int num_param_blobs = 2; + ASSERT_EQ(num_param_blobs, param_blobs.size()); + const Blob& weights = *param_blobs[0]; + const Blob& bias = *param_blobs[1]; + ASSERT_EQ(D * N, data.count()); + ASSERT_EQ(N, targets.count()); + ASSERT_EQ(D, weights.count()); + ASSERT_EQ(1, bias.count()); + + updated_params->clear(); + updated_params->resize(num_param_blobs); + for (int i = 0; i < num_param_blobs; ++i) { + (*updated_params)[i].reset(new Blob()); + } + Blob& updated_weights = *(*updated_params)[0]; + updated_weights.ReshapeLike(weights); + Blob& updated_bias = *(*updated_params)[1]; + updated_bias.ReshapeLike(bias); + + for (int i = 0; i <= D; ++i) { + // Compute the derivative with respect to the ith weight (i.e., the ith + // element of the gradient). + Dtype grad = 0; + for (int j = 0; j <= D; ++j) { + // Compute element (i, j) of X^T * X. + Dtype element = 0; + for (int k = 0; k < N; ++k) { + // (i, k) in X^T (== (k, i) in X) times (k, j) in X. + const Dtype element_i = (i == D) ? 1 : data.cpu_data()[k * D + i]; + const Dtype element_j = (j == D) ? 1 : data.cpu_data()[k * D + j]; + element += element_i * element_j; + } + if (j == D) { + grad += element * bias.cpu_data()[0]; + } else { + grad += element * weights.cpu_data()[j]; + } + } + for (int k = 0; k < N; ++k) { + const Dtype element_i = (i == D) ? 1 : data.cpu_data()[k * D + i]; + grad -= element_i * targets.cpu_data()[k]; + } + // Scale the gradient over the N samples. + grad /= N; + // Add the weight decay to the gradient. + grad += weight_decay * + ((i == D) ? bias.cpu_data()[0] : weights.cpu_data()[i]); + // Finally, add any momentum. + const vector > >& history = solver_->history(); + ASSERT_EQ(2, history.size()); // 1 blob for weights, 1 for bias + Dtype update_value = learning_rate * grad, temp; + if (i == D) { + temp = history[1]->cpu_data()[0] * momentum; + update_value += temp; // update history + // step back then over-step + update_value = (1 + momentum) * update_value - temp; + updated_bias.mutable_cpu_diff()[0] = update_value; + updated_bias.mutable_cpu_data()[0] = bias.cpu_data()[0] - update_value; + } else { + temp = history[0]->cpu_data()[i] * momentum; + update_value += temp; // update history + // step back then over-step + update_value = (1 + momentum) * update_value - temp; + updated_weights.mutable_cpu_diff()[i] = update_value; + updated_weights.mutable_cpu_data()[i] = + weights.cpu_data()[i] - update_value; + } + } + } + + void CheckLeastSquaresUpdate( + const vector > >& updated_params) { + const int D = channels_ * height_ * width_; + + const Blob& updated_weights = *updated_params[0]; + const Blob& updated_bias = *updated_params[1]; + + Net& net = *this->solver_->net(); + ASSERT_TRUE(net.has_layer("innerprod")); + const vector > >& param_blobs = + net.layer_by_name("innerprod")->blobs(); + ASSERT_EQ(2, param_blobs.size()); + const Blob& solver_updated_weights = *param_blobs[0]; + ASSERT_EQ(D, solver_updated_weights.count()); + const double kPrecision = 1e-3; + const double kMinPrecision = 1e-7; + for (int i = 0; i < D; ++i) { + const Dtype expected_updated_weight = updated_weights.cpu_data()[i]; + const Dtype solver_updated_weight = solver_updated_weights.cpu_data()[i]; + const Dtype error_margin = std::max(kMinPrecision, kPrecision * + std::min(fabs(expected_updated_weight), fabs(solver_updated_weight))); + EXPECT_NEAR(expected_updated_weight, solver_updated_weight, error_margin); + } + const Blob& solver_updated_bias_blob = *param_blobs[1]; + ASSERT_EQ(1, solver_updated_bias_blob.count()); + const Dtype expected_updated_bias = updated_bias.cpu_data()[0]; + const Dtype solver_updated_bias = solver_updated_bias_blob.cpu_data()[0]; + const Dtype error_margin = std::max(kMinPrecision, kPrecision * + std::min(fabs(expected_updated_bias), fabs(solver_updated_bias))); + EXPECT_NEAR(expected_updated_bias, solver_updated_bias, error_margin); + + // Check the solver's history -- should contain the previous update value. +// vector > >& history = this->solver_->history(); +// ASSERT_EQ(2, history.size()); +// for (int i = 0; i < D; ++i) { +// const Dtype expected_history = updated_weights.cpu_diff()[i]; +// const Dtype solver_history = history[0]->cpu_data()[i]; +// const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * +// std::min(fabs(expected_history), fabs(solver_history))); +// EXPECT_NEAR(expected_history, solver_history, error_margin_hist); +// } +// const Dtype expected_history = updated_bias.cpu_diff()[0]; +// const Dtype solver_history = history[1]->cpu_data()[0]; +// const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * +// std::min(fabs(expected_history), fabs(solver_history))); +// EXPECT_NEAR(expected_history, solver_history, error_margin_hist); + } + + // Test that the correct update is computed for a regularized least squares + // problem: + // + // E = (1/(2n)) || X w - y ||^2 + (lambda / 2) || w ||^2 + // \nabla_w E = (1/n) (X^T X w - X^T y) + lambda * w + // + // X \in R^{n x (d+1)} (each example is a row, (d+1)th element is always 1) + // w \in R^{(d+1) x 1} ((d+1)th element is the bias) + // y \in R^{n x 1} + // lambda is weight_decay + // + // TestLeastSquaresUpdate works "inductively", assuming that the solver + // correctly updates the net K (= iter_to_check) times, then given the history + // from the Kth update, we compute the (K+1)th update and check that it + // matches the solver's (K+1)th update. + void TestLeastSquaresUpdate(const Dtype learning_rate = 1.0, + const Dtype weight_decay = 0.0, const Dtype momentum = 0.0, + const int iter_to_check = 0) { + // Initialize the solver and run K (= iter_to_check) solver iterations. + RunLeastSquaresSolver(learning_rate, weight_decay, momentum, iter_to_check); + + // Compute the (K+1)th update using the analytic least squares gradient. + vector > > updated_params; + ComputeLeastSquaresUpdate(learning_rate, weight_decay, momentum, + &updated_params); + + // Reinitialize the solver and run K+1 solver iterations. + RunLeastSquaresSolver(learning_rate, weight_decay, momentum, + iter_to_check + 1); + + // Check that the solver's solution matches ours. + CheckLeastSquaresUpdate(updated_params); + } +}; + +TYPED_TEST_CASE(NesterovSolverTest, TestDtypesAndDevices); + +TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdate) { + typedef typename TypeParam::Dtype Dtype; + this->TestLeastSquaresUpdate(); +} + +TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateLROneTenth) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 0.1; + this->TestLeastSquaresUpdate(kLearningRate); +} + +TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateWithWeightDecay) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.5; + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay); +} + +TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateWithMomentum) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.0; + const Dtype kMomentum = 0.5; + const int kNumIters = 1; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + +TYPED_TEST(NesterovSolverTest, TestLeastSquaresUpdateWithMomentumMultiIter) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.0; + const Dtype kMomentum = 0.5; + const int kNumIters = 5; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + +TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateWithEverything) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 0.01; + const Dtype kWeightDecay = 0.1; + const Dtype kMomentum = 0.9; + const int kNumIters = 5; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + +} // namespace caffe From dbb9296050054095d8d2979992e969534b9b1430 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 22 Aug 2014 11:51:29 -0700 Subject: [PATCH 0593/2053] cleanup caffe.proto --- src/caffe/proto/caffe.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index bb14b838f9b..ff18779f62d 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -137,7 +137,7 @@ message SolverParameter { // random number generator -- useful for reproducible results. Otherwise, // (and by default) initialize using a seed derived from the system clock. optional int64 random_seed = 20 [default = -1]; - + // Solver type enum SolverType { SGD = 0; From f206c6479fd355f17bd821ceb6931fd0663c1e70 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Fri, 22 Aug 2014 11:51:16 -0700 Subject: [PATCH 0594/2053] Merge Test{SGD,AdaGrad,Nesterov}Solver; they become subclasses of TestGradientBasedSolver --- include/caffe/solver.hpp | 2 + src/caffe/test/test_adagrad_solver.cpp | 351 ------------------ ...ver.cpp => test_gradient_based_solver.cpp} | 193 ++++++++-- src/caffe/test/test_nesterov_solver.cpp | 351 ------------------ 4 files changed, 170 insertions(+), 727 deletions(-) delete mode 100644 src/caffe/test/test_adagrad_solver.cpp rename src/caffe/test/{test_sgd_solver.cpp => test_gradient_based_solver.cpp} (66%) delete mode 100644 src/caffe/test/test_nesterov_solver.cpp diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 2f51268f295..b3c7f6f35d6 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -65,6 +65,8 @@ class SGDSolver : public Solver { explicit SGDSolver(const string& param_file) : Solver(param_file) {} + const vector > >& history() { return history_; } + protected: virtual void PreSolve(); Dtype GetLearningRate(); diff --git a/src/caffe/test/test_adagrad_solver.cpp b/src/caffe/test/test_adagrad_solver.cpp deleted file mode 100644 index 45cf2002e33..00000000000 --- a/src/caffe/test/test_adagrad_solver.cpp +++ /dev/null @@ -1,351 +0,0 @@ -#include -#include -#include -#include - -#include "google/protobuf/text_format.h" - -#include "gtest/gtest.h" - -#include "caffe/common.hpp" -#include "caffe/proto/caffe.pb.h" -#include "caffe/solver.hpp" - -#include "caffe/test/test_caffe_main.hpp" - -using std::ostringstream; - -namespace caffe { - -template -class AdaGradSolverTest : public MultiDeviceTest { - typedef typename TypeParam::Dtype Dtype; - - protected: - AdaGradSolverTest() : - seed_(1701), num_(5), channels_(3), height_(10), width_(10) {} - - // MockAdaGradSolver: an AdaGradSolver with public history. - class MockAdaGradSolver : public AdaGradSolver { - public: - explicit MockAdaGradSolver(const SolverParameter& param) : - AdaGradSolver(param) {} - vector > >& history() { return this->history_; } - Dtype delta() { return this->param_.delta(); } - }; - - shared_ptr solver_; - int seed_; - int num_, channels_, height_, width_; - - virtual void InitSolverFromProtoString(const string& proto) { - SolverParameter param; - CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); - // Disable saving a final snapshot so the tests don't pollute the user's - // working directory with useless snapshots. - param.set_snapshot_after_train(false); - // Set the solver_mode according to current Caffe::mode. - switch (Caffe::mode()) { - case Caffe::CPU: - param.set_solver_mode(SolverParameter_SolverMode_CPU); - break; - case Caffe::GPU: - param.set_solver_mode(SolverParameter_SolverMode_GPU); - break; - default: - LOG(FATAL) << "Unknown Caffe mode: " << Caffe::mode(); - } - solver_.reset(new MockAdaGradSolver(param)); - } - - void RunLeastSquaresSolver(const Dtype learning_rate, - const Dtype weight_decay, const Dtype momentum, const int num_iters) { - ostringstream proto; - proto << - "max_iter: " << num_iters << " " - "base_lr: " << learning_rate << " " - "lr_policy: 'fixed' " - "net_param { " - " name: 'TestNetwork' " - " layers: { " - " name: 'data' " - " type: DUMMY_DATA " - " dummy_data_param { " - " num: " << num_ << " " - " channels: " << channels_ << " " - " height: " << height_ << " " - " width: " << width_ << " " - " channels: 1 " - " height: 1 " - " width: 1 " - " data_filler { " - " type: 'gaussian' " - " std: 1.0 " - " } " - " } " - " top: 'data' " - " top: 'targets' " - " } " - " layers: { " - " name: 'innerprod' " - " type: INNER_PRODUCT " - " inner_product_param { " - " num_output: 1 " - " weight_filler { " - " type: 'gaussian' " - " std: 1.0 " - " } " - " bias_filler { " - " type: 'gaussian' " - " std: 1.0 " - " } " - " } " - " bottom: 'data' " - " top: 'innerprod' " - " } " - " layers: { " - " name: 'loss' " - " type: EUCLIDEAN_LOSS " - " bottom: 'innerprod' " - " bottom: 'targets' " - " } " - "} "; - if (weight_decay != 0) { - proto << "weight_decay: " << weight_decay << " "; - } - if (momentum != 0) { - proto << "momentum: " << momentum << " "; - } - Caffe::set_random_seed(this->seed_); - this->InitSolverFromProtoString(proto.str()); - this->solver_->Solve(); - } - - // Compute an update value given the current state of the train net, - // using the analytical formula for the least squares gradient. - // updated_params will store the updated weight and bias results, - // using the blobs' diffs to hold the update values themselves. - void ComputeLeastSquaresUpdate(const Dtype learning_rate, - const Dtype weight_decay, const Dtype momentum, - vector > >* updated_params) { - const int N = num_; - const int D = channels_ * height_ * width_; - - // Run a forward pass, and manually compute the update values from the - // result. - Net& net = *this->solver_->net(); - vector*> empty_bottom_vec; - net.Forward(empty_bottom_vec); - ASSERT_TRUE(net.has_blob("data")); - const Blob& data = *net.blob_by_name("data"); - ASSERT_TRUE(net.has_blob("targets")); - const Blob& targets = *net.blob_by_name("targets"); - ASSERT_TRUE(net.has_layer("innerprod")); - const vector > >& param_blobs = - net.layer_by_name("innerprod")->blobs(); - const int num_param_blobs = 2; - ASSERT_EQ(num_param_blobs, param_blobs.size()); - const Blob& weights = *param_blobs[0]; - const Blob& bias = *param_blobs[1]; - ASSERT_EQ(D * N, data.count()); - ASSERT_EQ(N, targets.count()); - ASSERT_EQ(D, weights.count()); - ASSERT_EQ(1, bias.count()); - - updated_params->clear(); - updated_params->resize(num_param_blobs); - for (int i = 0; i < num_param_blobs; ++i) { - (*updated_params)[i].reset(new Blob()); - } - Blob& updated_weights = *(*updated_params)[0]; - updated_weights.ReshapeLike(weights); - Blob& updated_bias = *(*updated_params)[1]; - updated_bias.ReshapeLike(bias); - - for (int i = 0; i <= D; ++i) { - // Compute the derivative with respect to the ith weight (i.e., the ith - // element of the gradient). - Dtype grad = 0; - for (int j = 0; j <= D; ++j) { - // Compute element (i, j) of X^T * X. - Dtype element = 0; - for (int k = 0; k < N; ++k) { - // (i, k) in X^T (== (k, i) in X) times (k, j) in X. - const Dtype element_i = (i == D) ? 1 : data.cpu_data()[k * D + i]; - const Dtype element_j = (j == D) ? 1 : data.cpu_data()[k * D + j]; - element += element_i * element_j; - } - if (j == D) { - grad += element * bias.cpu_data()[0]; - } else { - grad += element * weights.cpu_data()[j]; - } - } - for (int k = 0; k < N; ++k) { - const Dtype element_i = (i == D) ? 1 : data.cpu_data()[k * D + i]; - grad -= element_i * targets.cpu_data()[k]; - } - // Scale the gradient over the N samples. - grad /= N; - // Add the weight decay to the gradient. - grad += weight_decay * - ((i == D) ? bias.cpu_data()[0] : weights.cpu_data()[i]); - // Finally, compute update - const vector > >& history = solver_->history(); - Dtype delta = solver_->delta(); - ASSERT_EQ(2, history.size()); // 1 blob for weights, 1 for bias - Dtype update_value, temp; - if (i == D) { - temp = history[1]->cpu_data()[0]; - temp += grad * grad; - update_value = learning_rate * grad / (std::sqrt(temp) + delta); - updated_bias.mutable_cpu_diff()[0] = update_value; - updated_bias.mutable_cpu_data()[0] = bias.cpu_data()[0] - update_value; - } else { - temp = history[0]->cpu_data()[i]; - temp += grad * grad; - update_value = learning_rate * grad / (std::sqrt(temp) + delta); - updated_weights.mutable_cpu_diff()[i] = update_value; - updated_weights.mutable_cpu_data()[i] = - weights.cpu_data()[i] - update_value; - } - } - } - - void CheckLeastSquaresUpdate( - const vector > >& updated_params) { - const int D = channels_ * height_ * width_; - - const Blob& updated_weights = *updated_params[0]; - const Blob& updated_bias = *updated_params[1]; - - Net& net = *this->solver_->net(); - ASSERT_TRUE(net.has_layer("innerprod")); - const vector > >& param_blobs = - net.layer_by_name("innerprod")->blobs(); - ASSERT_EQ(2, param_blobs.size()); - const Blob& solver_updated_weights = *param_blobs[0]; - ASSERT_EQ(D, solver_updated_weights.count()); - const double kPrecision = 1e-3; - const double kMinPrecision = 1e-7; - for (int i = 0; i < D; ++i) { - const Dtype expected_updated_weight = updated_weights.cpu_data()[i]; - const Dtype solver_updated_weight = solver_updated_weights.cpu_data()[i]; - const Dtype error_margin = std::max(kMinPrecision, kPrecision * - std::min(fabs(expected_updated_weight), fabs(solver_updated_weight))); - EXPECT_NEAR(expected_updated_weight, solver_updated_weight, error_margin); - } - const Blob& solver_updated_bias_blob = *param_blobs[1]; - ASSERT_EQ(1, solver_updated_bias_blob.count()); - const Dtype expected_updated_bias = updated_bias.cpu_data()[0]; - const Dtype solver_updated_bias = solver_updated_bias_blob.cpu_data()[0]; - const Dtype error_margin = std::max(kMinPrecision, kPrecision * - std::min(fabs(expected_updated_bias), fabs(solver_updated_bias))); - EXPECT_NEAR(expected_updated_bias, solver_updated_bias, error_margin); - - // Check the solver's history -- should contain the previous update value. -// vector > >& history = this->solver_->history(); -// ASSERT_EQ(2, history.size()); -// for (int i = 0; i < D; ++i) { -// const Dtype expected_history = updated_weights.cpu_diff()[i]; -// const Dtype solver_history = history[0]->cpu_data()[i]; -// const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * -// std::min(fabs(expected_history), fabs(solver_history))); -// EXPECT_NEAR(expected_history, solver_history, error_margin_hist); -// } -// const Dtype expected_history = updated_bias.cpu_diff()[0]; -// const Dtype solver_history = history[1]->cpu_data()[0]; -// const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * -// std::min(fabs(expected_history), fabs(solver_history))); -// EXPECT_NEAR(expected_history, solver_history, error_margin_hist); - } - - // Test that the correct update is computed for a regularized least squares - // problem: - // - // E = (1/(2n)) || X w - y ||^2 + (lambda / 2) || w ||^2 - // \nabla_w E = (1/n) (X^T X w - X^T y) + lambda * w - // - // X \in R^{n x (d+1)} (each example is a row, (d+1)th element is always 1) - // w \in R^{(d+1) x 1} ((d+1)th element is the bias) - // y \in R^{n x 1} - // lambda is weight_decay - // - // TestLeastSquaresUpdate works "inductively", assuming that the solver - // correctly updates the net K (= iter_to_check) times, then given the history - // from the Kth update, we compute the (K+1)th update and check that it - // matches the solver's (K+1)th update. - void TestLeastSquaresUpdate(const Dtype learning_rate = 1.0, - const Dtype weight_decay = 0.0, const Dtype momentum = 0.0, - const int iter_to_check = 0) { - // Initialize the solver and run K (= iter_to_check) solver iterations. - RunLeastSquaresSolver(learning_rate, weight_decay, momentum, iter_to_check); - - // Compute the (K+1)th update using the analytic least squares gradient. - vector > > updated_params; - ComputeLeastSquaresUpdate(learning_rate, weight_decay, momentum, - &updated_params); - - // Reinitialize the solver and run K+1 solver iterations. - RunLeastSquaresSolver(learning_rate, weight_decay, momentum, - iter_to_check + 1); - - // Check that the solver's solution matches ours. - CheckLeastSquaresUpdate(updated_params); - } -}; - -TYPED_TEST_CASE(AdaGradSolverTest, TestDtypesAndDevices); - -TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdate) { - typedef typename TypeParam::Dtype Dtype; - this->TestLeastSquaresUpdate(); -} - -TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateLROneTenth) { - typedef typename TypeParam::Dtype Dtype; - const Dtype kLearningRate = 0.1; - this->TestLeastSquaresUpdate(kLearningRate); -} - -TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateWithWeightDecay) { - typedef typename TypeParam::Dtype Dtype; - const Dtype kLearningRate = 1.0; - const Dtype kWeightDecay = 0.5; - this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay); -} -/* -TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateWithMomentum) { - typedef typename TypeParam::Dtype Dtype; - const Dtype kLearningRate = 1.0; - const Dtype kWeightDecay = 0.0; - const Dtype kMomentum = 0.5; - const int kNumIters = 1; - for (int i = 0; i <= kNumIters; ++i) { - this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); - } -} - -TYPED_TEST(AdaGradSolverTest, TestLeastSquaresUpdateWithMomentumMultiIter) { - typedef typename TypeParam::Dtype Dtype; - const Dtype kLearningRate = 1.0; - const Dtype kWeightDecay = 0.0; - const Dtype kMomentum = 0.5; - const int kNumIters = 5; - for (int i = 0; i <= kNumIters; ++i) { - this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); - } -} -*/ -TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateWithEverything) { - typedef typename TypeParam::Dtype Dtype; - const Dtype kLearningRate = 0.01; - const Dtype kWeightDecay = 0.1; - const Dtype kMomentum = 0.0; - const int kNumIters = 5; - for (int i = 0; i <= kNumIters; ++i) { - this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); - } -} - -} // namespace caffe diff --git a/src/caffe/test/test_sgd_solver.cpp b/src/caffe/test/test_gradient_based_solver.cpp similarity index 66% rename from src/caffe/test/test_sgd_solver.cpp rename to src/caffe/test/test_gradient_based_solver.cpp index 1ec24b134c6..9c21499ea5e 100644 --- a/src/caffe/test/test_sgd_solver.cpp +++ b/src/caffe/test/test_gradient_based_solver.cpp @@ -18,24 +18,20 @@ using std::ostringstream; namespace caffe { template -class SGDSolverTest : public MultiDeviceTest { +class GradientBasedSolverTest : public MultiDeviceTest { typedef typename TypeParam::Dtype Dtype; protected: - SGDSolverTest() : + GradientBasedSolverTest() : seed_(1701), num_(5), channels_(3), height_(10), width_(10) {} - // MockSGDSolver: an SGDSolver with public history. - class MockSGDSolver : public SGDSolver { - public: - explicit MockSGDSolver(const SolverParameter& param) : - SGDSolver(param) {} - vector > >& history() { return this->history_; } - }; - - shared_ptr solver_; + shared_ptr > solver_; int seed_; int num_, channels_, height_, width_; + Dtype delta_; // Stability constant for AdaGrad. + + virtual SolverParameter_SolverType solver_type() = 0; + virtual void InitSolver(const SolverParameter& param) = 0; virtual void InitSolverFromProtoString(const string& proto) { SolverParameter param; @@ -54,7 +50,9 @@ class SGDSolverTest : public MultiDeviceTest { default: LOG(FATAL) << "Unknown Caffe mode: " << Caffe::mode(); } - solver_.reset(new MockSGDSolver(param)); + InitSolver(param); + delta_ = (solver_type() == SolverParameter_SolverType_ADAGRAD) ? + param.delta() : 0; } void RunLeastSquaresSolver(const Dtype learning_rate, @@ -189,16 +187,32 @@ class SGDSolverTest : public MultiDeviceTest { // Add the weight decay to the gradient. grad += weight_decay * ((i == D) ? bias.cpu_data()[0] : weights.cpu_data()[i]); - // Finally, add any momentum. + // Finally, compute update. const vector > >& history = solver_->history(); ASSERT_EQ(2, history.size()); // 1 blob for weights, 1 for bias Dtype update_value = learning_rate * grad; + const Dtype history_value = (i == D) ? + history[1]->cpu_data()[0] : history[0]->cpu_data()[i]; + const Dtype temp = momentum * history_value; + switch (solver_type()) { + case SolverParameter_SolverType_SGD: + update_value += temp; + break; + case SolverParameter_SolverType_NESTEROV: + update_value += temp; + // step back then over-step + update_value = (1 + momentum) * update_value - temp; + break; + case SolverParameter_SolverType_ADAGRAD: + update_value /= std::sqrt(history_value + grad * grad) + delta_; + break; + default: + LOG(FATAL) << "Unknown solver type: " << solver_type(); + } if (i == D) { - update_value += momentum * history[1]->cpu_data()[0]; updated_bias.mutable_cpu_diff()[0] = update_value; updated_bias.mutable_cpu_data()[0] = bias.cpu_data()[0] - update_value; } else { - update_value += momentum * history[0]->cpu_data()[i]; updated_weights.mutable_cpu_diff()[i] = update_value; updated_weights.mutable_cpu_data()[i] = weights.cpu_data()[i] - update_value; @@ -238,20 +252,22 @@ class SGDSolverTest : public MultiDeviceTest { EXPECT_NEAR(expected_updated_bias, solver_updated_bias, error_margin); // Check the solver's history -- should contain the previous update value. - vector > >& history = this->solver_->history(); - ASSERT_EQ(2, history.size()); - for (int i = 0; i < D; ++i) { - const Dtype expected_history = updated_weights.cpu_diff()[i]; - const Dtype solver_history = history[0]->cpu_data()[i]; + if (solver_type() == SolverParameter_SolverType_SGD) { + const vector > >& history = solver_->history(); + ASSERT_EQ(2, history.size()); + for (int i = 0; i < D; ++i) { + const Dtype expected_history = updated_weights.cpu_diff()[i]; + const Dtype solver_history = history[0]->cpu_data()[i]; + const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * + std::min(fabs(expected_history), fabs(solver_history))); + EXPECT_NEAR(expected_history, solver_history, error_margin_hist); + } + const Dtype expected_history = updated_bias.cpu_diff()[0]; + const Dtype solver_history = history[1]->cpu_data()[0]; const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * std::min(fabs(expected_history), fabs(solver_history))); EXPECT_NEAR(expected_history, solver_history, error_margin_hist); } - const Dtype expected_history = updated_bias.cpu_diff()[0]; - const Dtype solver_history = history[1]->cpu_data()[0]; - const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * - std::min(fabs(expected_history), fabs(solver_history))); - EXPECT_NEAR(expected_history, solver_history, error_margin_hist); } // Test that the correct update is computed for a regularized least squares @@ -289,6 +305,21 @@ class SGDSolverTest : public MultiDeviceTest { } }; + +template +class SGDSolverTest : public GradientBasedSolverTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + virtual void InitSolver(const SolverParameter& param) { + this->solver_.reset(new SGDSolver(param)); + } + + virtual SolverParameter_SolverType solver_type() { + return SolverParameter_SolverType_SGD; + } +}; + TYPED_TEST_CASE(SGDSolverTest, TestDtypesAndDevices); TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdate) { @@ -342,4 +373,116 @@ TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdateWithEverything) { } } + +template +class AdaGradSolverTest : public GradientBasedSolverTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + virtual void InitSolver(const SolverParameter& param) { + this->solver_.reset(new AdaGradSolver(param)); + } + virtual SolverParameter_SolverType solver_type() { + return SolverParameter_SolverType_ADAGRAD; + } +}; + +TYPED_TEST_CASE(AdaGradSolverTest, TestDtypesAndDevices); + +TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdate) { + typedef typename TypeParam::Dtype Dtype; + this->TestLeastSquaresUpdate(); +} + +TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateLROneTenth) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 0.1; + this->TestLeastSquaresUpdate(kLearningRate); +} + +TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateWithWeightDecay) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.5; + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay); +} + +TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateWithEverything) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 0.01; + const Dtype kWeightDecay = 0.1; + const Dtype kMomentum = 0.0; + const int kNumIters = 5; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + + +template +class NesterovSolverTest : public GradientBasedSolverTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + virtual void InitSolver(const SolverParameter& param) { + this->solver_.reset(new NesterovSolver(param)); + } + virtual SolverParameter_SolverType solver_type() { + return SolverParameter_SolverType_NESTEROV; + } +}; + +TYPED_TEST_CASE(NesterovSolverTest, TestDtypesAndDevices); + +TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdate) { + typedef typename TypeParam::Dtype Dtype; + this->TestLeastSquaresUpdate(); +} + +TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateLROneTenth) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 0.1; + this->TestLeastSquaresUpdate(kLearningRate); +} + +TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateWithWeightDecay) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.5; + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay); +} + +TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateWithMomentum) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.0; + const Dtype kMomentum = 0.5; + const int kNumIters = 1; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + +TYPED_TEST(NesterovSolverTest, TestLeastSquaresUpdateWithMomentumMultiIter) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 1.0; + const Dtype kWeightDecay = 0.0; + const Dtype kMomentum = 0.5; + const int kNumIters = 5; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + +TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateWithEverything) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kLearningRate = 0.01; + const Dtype kWeightDecay = 0.1; + const Dtype kMomentum = 0.9; + const int kNumIters = 5; + for (int i = 0; i <= kNumIters; ++i) { + this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); + } +} + } // namespace caffe diff --git a/src/caffe/test/test_nesterov_solver.cpp b/src/caffe/test/test_nesterov_solver.cpp deleted file mode 100644 index f2fcba30b29..00000000000 --- a/src/caffe/test/test_nesterov_solver.cpp +++ /dev/null @@ -1,351 +0,0 @@ -#include -#include -#include -#include - -#include "google/protobuf/text_format.h" - -#include "gtest/gtest.h" - -#include "caffe/common.hpp" -#include "caffe/proto/caffe.pb.h" -#include "caffe/solver.hpp" - -#include "caffe/test/test_caffe_main.hpp" - -using std::ostringstream; - -namespace caffe { - -template -class NesterovSolverTest : public MultiDeviceTest { - typedef typename TypeParam::Dtype Dtype; - - protected: - NesterovSolverTest() : - seed_(1701), num_(5), channels_(3), height_(10), width_(10) {} - - // MockNesterovSolver: an NesterovSolver with public history. - class MockNesterovSolver : public NesterovSolver { - public: - explicit MockNesterovSolver(const SolverParameter& param) : - NesterovSolver(param) {} - vector > >& history() { return this->history_; } - }; - - shared_ptr solver_; - int seed_; - int num_, channels_, height_, width_; - - virtual void InitSolverFromProtoString(const string& proto) { - SolverParameter param; - CHECK(google::protobuf::TextFormat::ParseFromString(proto, ¶m)); - // Disable saving a final snapshot so the tests don't pollute the user's - // working directory with useless snapshots. - param.set_snapshot_after_train(false); - // Set the solver_mode according to current Caffe::mode. - switch (Caffe::mode()) { - case Caffe::CPU: - param.set_solver_mode(SolverParameter_SolverMode_CPU); - break; - case Caffe::GPU: - param.set_solver_mode(SolverParameter_SolverMode_GPU); - break; - default: - LOG(FATAL) << "Unknown Caffe mode: " << Caffe::mode(); - } - solver_.reset(new MockNesterovSolver(param)); - } - - void RunLeastSquaresSolver(const Dtype learning_rate, - const Dtype weight_decay, const Dtype momentum, const int num_iters) { - ostringstream proto; - proto << - "max_iter: " << num_iters << " " - "base_lr: " << learning_rate << " " - "lr_policy: 'fixed' " - "net_param { " - " name: 'TestNetwork' " - " layers: { " - " name: 'data' " - " type: DUMMY_DATA " - " dummy_data_param { " - " num: " << num_ << " " - " channels: " << channels_ << " " - " height: " << height_ << " " - " width: " << width_ << " " - " channels: 1 " - " height: 1 " - " width: 1 " - " data_filler { " - " type: 'gaussian' " - " std: 1.0 " - " } " - " } " - " top: 'data' " - " top: 'targets' " - " } " - " layers: { " - " name: 'innerprod' " - " type: INNER_PRODUCT " - " inner_product_param { " - " num_output: 1 " - " weight_filler { " - " type: 'gaussian' " - " std: 1.0 " - " } " - " bias_filler { " - " type: 'gaussian' " - " std: 1.0 " - " } " - " } " - " bottom: 'data' " - " top: 'innerprod' " - " } " - " layers: { " - " name: 'loss' " - " type: EUCLIDEAN_LOSS " - " bottom: 'innerprod' " - " bottom: 'targets' " - " } " - "} "; - if (weight_decay != 0) { - proto << "weight_decay: " << weight_decay << " "; - } - if (momentum != 0) { - proto << "momentum: " << momentum << " "; - } - Caffe::set_random_seed(this->seed_); - this->InitSolverFromProtoString(proto.str()); - this->solver_->Solve(); - } - - // Compute an update value given the current state of the train net, - // using the analytical formula for the least squares gradient. - // updated_params will store the updated weight and bias results, - // using the blobs' diffs to hold the update values themselves. - void ComputeLeastSquaresUpdate(const Dtype learning_rate, - const Dtype weight_decay, const Dtype momentum, - vector > >* updated_params) { - const int N = num_; - const int D = channels_ * height_ * width_; - - // Run a forward pass, and manually compute the update values from the - // result. - Net& net = *this->solver_->net(); - vector*> empty_bottom_vec; - net.Forward(empty_bottom_vec); - ASSERT_TRUE(net.has_blob("data")); - const Blob& data = *net.blob_by_name("data"); - ASSERT_TRUE(net.has_blob("targets")); - const Blob& targets = *net.blob_by_name("targets"); - ASSERT_TRUE(net.has_layer("innerprod")); - const vector > >& param_blobs = - net.layer_by_name("innerprod")->blobs(); - const int num_param_blobs = 2; - ASSERT_EQ(num_param_blobs, param_blobs.size()); - const Blob& weights = *param_blobs[0]; - const Blob& bias = *param_blobs[1]; - ASSERT_EQ(D * N, data.count()); - ASSERT_EQ(N, targets.count()); - ASSERT_EQ(D, weights.count()); - ASSERT_EQ(1, bias.count()); - - updated_params->clear(); - updated_params->resize(num_param_blobs); - for (int i = 0; i < num_param_blobs; ++i) { - (*updated_params)[i].reset(new Blob()); - } - Blob& updated_weights = *(*updated_params)[0]; - updated_weights.ReshapeLike(weights); - Blob& updated_bias = *(*updated_params)[1]; - updated_bias.ReshapeLike(bias); - - for (int i = 0; i <= D; ++i) { - // Compute the derivative with respect to the ith weight (i.e., the ith - // element of the gradient). - Dtype grad = 0; - for (int j = 0; j <= D; ++j) { - // Compute element (i, j) of X^T * X. - Dtype element = 0; - for (int k = 0; k < N; ++k) { - // (i, k) in X^T (== (k, i) in X) times (k, j) in X. - const Dtype element_i = (i == D) ? 1 : data.cpu_data()[k * D + i]; - const Dtype element_j = (j == D) ? 1 : data.cpu_data()[k * D + j]; - element += element_i * element_j; - } - if (j == D) { - grad += element * bias.cpu_data()[0]; - } else { - grad += element * weights.cpu_data()[j]; - } - } - for (int k = 0; k < N; ++k) { - const Dtype element_i = (i == D) ? 1 : data.cpu_data()[k * D + i]; - grad -= element_i * targets.cpu_data()[k]; - } - // Scale the gradient over the N samples. - grad /= N; - // Add the weight decay to the gradient. - grad += weight_decay * - ((i == D) ? bias.cpu_data()[0] : weights.cpu_data()[i]); - // Finally, add any momentum. - const vector > >& history = solver_->history(); - ASSERT_EQ(2, history.size()); // 1 blob for weights, 1 for bias - Dtype update_value = learning_rate * grad, temp; - if (i == D) { - temp = history[1]->cpu_data()[0] * momentum; - update_value += temp; // update history - // step back then over-step - update_value = (1 + momentum) * update_value - temp; - updated_bias.mutable_cpu_diff()[0] = update_value; - updated_bias.mutable_cpu_data()[0] = bias.cpu_data()[0] - update_value; - } else { - temp = history[0]->cpu_data()[i] * momentum; - update_value += temp; // update history - // step back then over-step - update_value = (1 + momentum) * update_value - temp; - updated_weights.mutable_cpu_diff()[i] = update_value; - updated_weights.mutable_cpu_data()[i] = - weights.cpu_data()[i] - update_value; - } - } - } - - void CheckLeastSquaresUpdate( - const vector > >& updated_params) { - const int D = channels_ * height_ * width_; - - const Blob& updated_weights = *updated_params[0]; - const Blob& updated_bias = *updated_params[1]; - - Net& net = *this->solver_->net(); - ASSERT_TRUE(net.has_layer("innerprod")); - const vector > >& param_blobs = - net.layer_by_name("innerprod")->blobs(); - ASSERT_EQ(2, param_blobs.size()); - const Blob& solver_updated_weights = *param_blobs[0]; - ASSERT_EQ(D, solver_updated_weights.count()); - const double kPrecision = 1e-3; - const double kMinPrecision = 1e-7; - for (int i = 0; i < D; ++i) { - const Dtype expected_updated_weight = updated_weights.cpu_data()[i]; - const Dtype solver_updated_weight = solver_updated_weights.cpu_data()[i]; - const Dtype error_margin = std::max(kMinPrecision, kPrecision * - std::min(fabs(expected_updated_weight), fabs(solver_updated_weight))); - EXPECT_NEAR(expected_updated_weight, solver_updated_weight, error_margin); - } - const Blob& solver_updated_bias_blob = *param_blobs[1]; - ASSERT_EQ(1, solver_updated_bias_blob.count()); - const Dtype expected_updated_bias = updated_bias.cpu_data()[0]; - const Dtype solver_updated_bias = solver_updated_bias_blob.cpu_data()[0]; - const Dtype error_margin = std::max(kMinPrecision, kPrecision * - std::min(fabs(expected_updated_bias), fabs(solver_updated_bias))); - EXPECT_NEAR(expected_updated_bias, solver_updated_bias, error_margin); - - // Check the solver's history -- should contain the previous update value. -// vector > >& history = this->solver_->history(); -// ASSERT_EQ(2, history.size()); -// for (int i = 0; i < D; ++i) { -// const Dtype expected_history = updated_weights.cpu_diff()[i]; -// const Dtype solver_history = history[0]->cpu_data()[i]; -// const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * -// std::min(fabs(expected_history), fabs(solver_history))); -// EXPECT_NEAR(expected_history, solver_history, error_margin_hist); -// } -// const Dtype expected_history = updated_bias.cpu_diff()[0]; -// const Dtype solver_history = history[1]->cpu_data()[0]; -// const Dtype error_margin_hist = std::max(kMinPrecision, kPrecision * -// std::min(fabs(expected_history), fabs(solver_history))); -// EXPECT_NEAR(expected_history, solver_history, error_margin_hist); - } - - // Test that the correct update is computed for a regularized least squares - // problem: - // - // E = (1/(2n)) || X w - y ||^2 + (lambda / 2) || w ||^2 - // \nabla_w E = (1/n) (X^T X w - X^T y) + lambda * w - // - // X \in R^{n x (d+1)} (each example is a row, (d+1)th element is always 1) - // w \in R^{(d+1) x 1} ((d+1)th element is the bias) - // y \in R^{n x 1} - // lambda is weight_decay - // - // TestLeastSquaresUpdate works "inductively", assuming that the solver - // correctly updates the net K (= iter_to_check) times, then given the history - // from the Kth update, we compute the (K+1)th update and check that it - // matches the solver's (K+1)th update. - void TestLeastSquaresUpdate(const Dtype learning_rate = 1.0, - const Dtype weight_decay = 0.0, const Dtype momentum = 0.0, - const int iter_to_check = 0) { - // Initialize the solver and run K (= iter_to_check) solver iterations. - RunLeastSquaresSolver(learning_rate, weight_decay, momentum, iter_to_check); - - // Compute the (K+1)th update using the analytic least squares gradient. - vector > > updated_params; - ComputeLeastSquaresUpdate(learning_rate, weight_decay, momentum, - &updated_params); - - // Reinitialize the solver and run K+1 solver iterations. - RunLeastSquaresSolver(learning_rate, weight_decay, momentum, - iter_to_check + 1); - - // Check that the solver's solution matches ours. - CheckLeastSquaresUpdate(updated_params); - } -}; - -TYPED_TEST_CASE(NesterovSolverTest, TestDtypesAndDevices); - -TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdate) { - typedef typename TypeParam::Dtype Dtype; - this->TestLeastSquaresUpdate(); -} - -TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateLROneTenth) { - typedef typename TypeParam::Dtype Dtype; - const Dtype kLearningRate = 0.1; - this->TestLeastSquaresUpdate(kLearningRate); -} - -TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateWithWeightDecay) { - typedef typename TypeParam::Dtype Dtype; - const Dtype kLearningRate = 1.0; - const Dtype kWeightDecay = 0.5; - this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay); -} - -TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateWithMomentum) { - typedef typename TypeParam::Dtype Dtype; - const Dtype kLearningRate = 1.0; - const Dtype kWeightDecay = 0.0; - const Dtype kMomentum = 0.5; - const int kNumIters = 1; - for (int i = 0; i <= kNumIters; ++i) { - this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); - } -} - -TYPED_TEST(NesterovSolverTest, TestLeastSquaresUpdateWithMomentumMultiIter) { - typedef typename TypeParam::Dtype Dtype; - const Dtype kLearningRate = 1.0; - const Dtype kWeightDecay = 0.0; - const Dtype kMomentum = 0.5; - const int kNumIters = 5; - for (int i = 0; i <= kNumIters; ++i) { - this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); - } -} - -TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateWithEverything) { - typedef typename TypeParam::Dtype Dtype; - const Dtype kLearningRate = 0.01; - const Dtype kWeightDecay = 0.1; - const Dtype kMomentum = 0.9; - const int kNumIters = 5; - for (int i = 0; i <= kNumIters; ++i) { - this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); - } -} - -} // namespace caffe From c1ff97c947af1a6cea0d9f47b397e87b74334d87 Mon Sep 17 00:00:00 2001 From: qipeng Date: Mon, 25 Aug 2014 23:02:56 -0700 Subject: [PATCH 0595/2053] Added sanity check for AdaGradSolver; added MNIST examples for solvers --- .../mnist_autoencoder_solver_adagrad.prototxt | 15 +++++++++++++++ .../mnist_autoencoder_solver_nesterov.prototxt | 15 +++++++++++++++ examples/mnist/train_mnist_autoencoder_adagrad.sh | 4 ++++ .../mnist/train_mnist_autoencoder_nesterov.sh | 4 ++++ include/caffe/solver.hpp | 7 +++++-- 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 examples/mnist/mnist_autoencoder_solver_adagrad.prototxt create mode 100644 examples/mnist/mnist_autoencoder_solver_nesterov.prototxt create mode 100755 examples/mnist/train_mnist_autoencoder_adagrad.sh create mode 100755 examples/mnist/train_mnist_autoencoder_nesterov.sh diff --git a/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt b/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt new file mode 100644 index 00000000000..6193351fcd2 --- /dev/null +++ b/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt @@ -0,0 +1,15 @@ +net: "mnist_autoencoder.prototxt" +test_iter: 50 +test_interval: 100 +test_compute_loss: true +base_lr: 0.01 +lr_policy: "fixed" +display: 20 +max_iter: 4000000 +weight_decay: 0.0005 +snapshot: 10000 +snapshot_prefix: "mnist_autoencoder_train" +momentum: 0.9 +# solver mode: CPU or GPU +solver_mode: GPU +solver_type: ADAGRAD diff --git a/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt b/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt new file mode 100644 index 00000000000..17487301554 --- /dev/null +++ b/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt @@ -0,0 +1,15 @@ +net: "mnist_autoencoder.prototxt" +test_iter: 50 +test_interval: 100 +test_compute_loss: true +base_lr: 0.0001 +lr_policy: "fixed" +display: 20 +max_iter: 4000000 +weight_decay: 0.0005 +snapshot: 10000 +snapshot_prefix: "mnist_autoencoder_train" +momentum: 0.95 +# solver mode: CPU or GPU +solver_mode: GPU +solver_type: NESTEROV diff --git a/examples/mnist/train_mnist_autoencoder_adagrad.sh b/examples/mnist/train_mnist_autoencoder_adagrad.sh new file mode 100755 index 00000000000..628c74b969a --- /dev/null +++ b/examples/mnist/train_mnist_autoencoder_adagrad.sh @@ -0,0 +1,4 @@ +#!/bin/bash +TOOLS=../../build/tools + +$TOOLS/caffe.bin train --solver=mnist_autoencoder_solver.prototxt diff --git a/examples/mnist/train_mnist_autoencoder_nesterov.sh b/examples/mnist/train_mnist_autoencoder_nesterov.sh new file mode 100755 index 00000000000..8f004c4635d --- /dev/null +++ b/examples/mnist/train_mnist_autoencoder_nesterov.sh @@ -0,0 +1,4 @@ +#!/bin/bash +TOOLS=../../build/tools + +$TOOLS/caffe.bin train --solver=mnist_autoencoder_solver_nesterov.prototxt diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index b3c7f6f35d6..a73ba2ccd9f 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -100,12 +100,15 @@ template class AdaGradSolver : public SGDSolver { public: explicit AdaGradSolver(const SolverParameter& param) - : SGDSolver(param) {} + : SGDSolver(param) { constructor_sanity_check(); } explicit AdaGradSolver(const string& param_file) - : SGDSolver(param_file) {} + : SGDSolver(param_file) { constructor_sanity_check(); } protected: virtual void ComputeUpdateValue(); + void constructor_sanity_check() { + CHECK_EQ(0, this->param_.momentum()) << "Momentum cannot be used with AdaGrad."; + } DISABLE_COPY_AND_ASSIGN(AdaGradSolver); }; From 06f335f04b16321d73eeb667c39afe65798fef93 Mon Sep 17 00:00:00 2001 From: qipeng Date: Mon, 25 Aug 2014 23:17:51 -0700 Subject: [PATCH 0596/2053] lint --- include/caffe/solver.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index a73ba2ccd9f..5a7f31be017 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -107,7 +107,8 @@ class AdaGradSolver : public SGDSolver { protected: virtual void ComputeUpdateValue(); void constructor_sanity_check() { - CHECK_EQ(0, this->param_.momentum()) << "Momentum cannot be used with AdaGrad."; + CHECK_EQ(0, this->param_.momentum()) + << "Momentum cannot be used with AdaGrad."; } DISABLE_COPY_AND_ASSIGN(AdaGradSolver); From a464df45a782e2cd45412744de9c0abbd671df6a Mon Sep 17 00:00:00 2001 From: qipeng Date: Tue, 26 Aug 2014 12:01:26 -0700 Subject: [PATCH 0597/2053] Re-added solver switch into the new caffe main excutable; fixed AdaGrad MNIST example --- .../mnist/mnist_autoencoder_solver_adagrad.prototxt | 1 - examples/mnist/train_mnist_autoencoder_adagrad.sh | 2 +- tools/caffe.cpp | 10 +++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt b/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt index 6193351fcd2..fa7d65cd70c 100644 --- a/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt +++ b/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt @@ -9,7 +9,6 @@ max_iter: 4000000 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "mnist_autoencoder_train" -momentum: 0.9 # solver mode: CPU or GPU solver_mode: GPU solver_type: ADAGRAD diff --git a/examples/mnist/train_mnist_autoencoder_adagrad.sh b/examples/mnist/train_mnist_autoencoder_adagrad.sh index 628c74b969a..25a48c3c442 100755 --- a/examples/mnist/train_mnist_autoencoder_adagrad.sh +++ b/examples/mnist/train_mnist_autoencoder_adagrad.sh @@ -1,4 +1,4 @@ #!/bin/bash TOOLS=../../build/tools -$TOOLS/caffe.bin train --solver=mnist_autoencoder_solver.prototxt +$TOOLS/caffe.bin train --solver=mnist_autoencoder_solver_adagrad.prototxt diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 5b3ad0b4691..9958ac3701a 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -88,7 +88,7 @@ int train() { caffe::ReadProtoFromTextFileOrDie(FLAGS_solver, &solver_param); LOG(INFO) << "Starting Optimization"; - caffe::SGDSolver solver(solver_param); + shared_ptr> solver(caffe::GetSolver(solver_param)); // Set device id and mode if (FLAGS_gpu >= 0) { @@ -102,13 +102,13 @@ int train() { if (FLAGS_snapshot.size()) { LOG(INFO) << "Resuming from " << FLAGS_snapshot; - solver.Solve(FLAGS_snapshot); + solver->Solve(FLAGS_snapshot); } else if (FLAGS_weights.size()) { LOG(INFO) << "Finetuning from " << FLAGS_weights; - solver.net()->CopyTrainedLayersFrom(FLAGS_weights); - solver.Solve(); + solver->net()->CopyTrainedLayersFrom(FLAGS_weights); + solver->Solve(); } else { - solver.Solve(); + solver->Solve(); } LOG(INFO) << "Optimization Done."; return 0; From 36f9de4303ddb0166d34a2104ec70abe0493d924 Mon Sep 17 00:00:00 2001 From: qipeng Date: Tue, 26 Aug 2014 12:02:20 -0700 Subject: [PATCH 0598/2053] lint --- tools/caffe.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 9958ac3701a..9c49a0a9d15 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -88,7 +88,8 @@ int train() { caffe::ReadProtoFromTextFileOrDie(FLAGS_solver, &solver_param); LOG(INFO) << "Starting Optimization"; - shared_ptr> solver(caffe::GetSolver(solver_param)); + shared_ptr> + solver(caffe::GetSolver(solver_param)); // Set device id and mode if (FLAGS_gpu >= 0) { From 972264946cf8896689facfbec2f683347b1a8f7e Mon Sep 17 00:00:00 2001 From: qipeng Date: Tue, 26 Aug 2014 12:21:06 -0700 Subject: [PATCH 0599/2053] hot fix for warning --- tools/caffe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 9c49a0a9d15..10ba70d152e 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -88,7 +88,7 @@ int train() { caffe::ReadProtoFromTextFileOrDie(FLAGS_solver, &solver_param); LOG(INFO) << "Starting Optimization"; - shared_ptr> + shared_ptr > solver(caffe::GetSolver(solver_param)); // Set device id and mode From 5894f039a454c249ba65141b9c20f9edc9b71627 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 1 Sep 2014 11:39:39 -0700 Subject: [PATCH 0600/2053] mnist_autoencoder: always compute both cross-entropy loss and L2 (euclidean) error --- examples/mnist/mnist_autoencoder.prototxt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/mnist/mnist_autoencoder.prototxt b/examples/mnist/mnist_autoencoder.prototxt index b6009fb50a0..b2bce47b008 100644 --- a/examples/mnist/mnist_autoencoder.prototxt +++ b/examples/mnist/mnist_autoencoder.prototxt @@ -248,22 +248,22 @@ layers { layers { bottom: "decode1" bottom: "flatdata" + top: "cross_entropy_loss" name: "loss" type: SIGMOID_CROSS_ENTROPY_LOSS - include: { phase: TRAIN } + loss_weight: 1 } layers { bottom: "decode1" top: "decode1neuron" name: "decode1neuron" type: SIGMOID - include: { phase: TEST } } layers { bottom: "decode1neuron" bottom: "flatdata" + top: "l2_error" name: "loss" type: EUCLIDEAN_LOSS - top: "loss" - include: { phase: TEST } + loss_weight: 0 } From b49b2d3e8e0f5ebe453404c79ac9528f426ab2f0 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 1 Sep 2014 12:04:31 -0700 Subject: [PATCH 0601/2053] Add "test-on-train" stage to test accuracy on the training data; correct test_iter (should be 100 instead of 50) --- examples/mnist/mnist_autoencoder.prototxt | 22 ++++++++++++++++++- .../mnist/mnist_autoencoder_solver.prototxt | 7 ++++-- .../mnist_autoencoder_solver_adagrad.prototxt | 9 +++++--- ...mnist_autoencoder_solver_nesterov.prototxt | 11 ++++++---- 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/examples/mnist/mnist_autoencoder.prototxt b/examples/mnist/mnist_autoencoder.prototxt index b2bce47b008..45d0802339e 100644 --- a/examples/mnist/mnist_autoencoder.prototxt +++ b/examples/mnist/mnist_autoencoder.prototxt @@ -13,6 +13,23 @@ layers { } include: { phase: TRAIN } } +layers { + top: "data" + name: "data" + type: DATA + data_param { + source: "examples/mnist/mnist_train_lmdb" + backend: LMDB + batch_size: 100 + transform_param { + scale: 0.0039215684 + } + } + include: { + phase: TEST + stage: 'test-on-train' + } +} layers { top: "data" name: "data" @@ -25,7 +42,10 @@ layers { scale: 0.0039215684 } } - include: { phase: TEST } + include: { + phase: TEST + stage: 'test-on-test' + } } layers { bottom: "data" diff --git a/examples/mnist/mnist_autoencoder_solver.prototxt b/examples/mnist/mnist_autoencoder_solver.prototxt index af1202fc1fd..be0939d92db 100644 --- a/examples/mnist/mnist_autoencoder_solver.prototxt +++ b/examples/mnist/mnist_autoencoder_solver.prototxt @@ -1,6 +1,9 @@ net: "examples/mnist/mnist_autoencoder.prototxt" -test_iter: 50 -test_interval: 100 +test_state: { stage: 'test-on-train' } +test_iter: 500 +test_state: { stage: 'test-on-test' } +test_iter: 100 +test_interval: 500 test_compute_loss: true base_lr: 0.0001 lr_policy: "fixed" diff --git a/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt b/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt index fa7d65cd70c..641ce8a001c 100644 --- a/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt +++ b/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt @@ -1,6 +1,9 @@ -net: "mnist_autoencoder.prototxt" -test_iter: 50 -test_interval: 100 +net: "examples/mnist/mnist_autoencoder.prototxt" +test_state: { stage: 'test-on-train' } +test_iter: 500 +test_state: { stage: 'test-on-test' } +test_iter: 100 +test_interval: 500 test_compute_loss: true base_lr: 0.01 lr_policy: "fixed" diff --git a/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt b/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt index 17487301554..254dceecf9b 100644 --- a/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt +++ b/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt @@ -1,6 +1,9 @@ -net: "mnist_autoencoder.prototxt" -test_iter: 50 -test_interval: 100 +net: "examples/mnist/mnist_autoencoder.prototxt" +test_state: { stage: 'test-on-train' } +test_iter: 500 +test_state: { stage: 'test-on-test' } +test_iter: 100 +test_interval: 500 test_compute_loss: true base_lr: 0.0001 lr_policy: "fixed" @@ -8,7 +11,7 @@ display: 20 max_iter: 4000000 weight_decay: 0.0005 snapshot: 10000 -snapshot_prefix: "mnist_autoencoder_train" +snapshot_prefix: "examples/mnist/mnist_autoencoder_nesterov_train" momentum: 0.95 # solver mode: CPU or GPU solver_mode: GPU From eaf28fe5758164c4af73f9a721e41ee7952488b0 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 1 Sep 2014 12:32:54 -0700 Subject: [PATCH 0602/2053] make adagrad/nesterov train scripts follow new "run-from-root" convention --- examples/mnist/train_mnist_autoencoder_adagrad.sh | 4 ++-- examples/mnist/train_mnist_autoencoder_nesterov.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/mnist/train_mnist_autoencoder_adagrad.sh b/examples/mnist/train_mnist_autoencoder_adagrad.sh index 25a48c3c442..95fe1b17bd5 100755 --- a/examples/mnist/train_mnist_autoencoder_adagrad.sh +++ b/examples/mnist/train_mnist_autoencoder_adagrad.sh @@ -1,4 +1,4 @@ #!/bin/bash -TOOLS=../../build/tools -$TOOLS/caffe.bin train --solver=mnist_autoencoder_solver_adagrad.prototxt +./build/tools/caffe train \ + --solver=examples/mnist/mnist_autoencoder_solver_adagrad.prototxt diff --git a/examples/mnist/train_mnist_autoencoder_nesterov.sh b/examples/mnist/train_mnist_autoencoder_nesterov.sh index 8f004c4635d..cf19ea749b3 100755 --- a/examples/mnist/train_mnist_autoencoder_nesterov.sh +++ b/examples/mnist/train_mnist_autoencoder_nesterov.sh @@ -1,4 +1,4 @@ #!/bin/bash -TOOLS=../../build/tools -$TOOLS/caffe.bin train --solver=mnist_autoencoder_solver_nesterov.prototxt +./build/tools/caffe train \ + --solver=examples/mnist/mnist_autoencoder_solver_nesterov.prototxt From b0f97fda761b8687503a36f4545bedd6497f3c92 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 1 Sep 2014 12:35:03 -0700 Subject: [PATCH 0603/2053] make MNIST autoencoder solvers start from base_lr 0.01 and step (much better performance) and terminate at iter 65K --- examples/mnist/mnist_autoencoder_solver.prototxt | 10 ++++++---- .../mnist/mnist_autoencoder_solver_adagrad.prototxt | 4 ++-- .../mnist/mnist_autoencoder_solver_nesterov.prototxt | 10 ++++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/examples/mnist/mnist_autoencoder_solver.prototxt b/examples/mnist/mnist_autoencoder_solver.prototxt index be0939d92db..6e35cb6a32d 100644 --- a/examples/mnist/mnist_autoencoder_solver.prototxt +++ b/examples/mnist/mnist_autoencoder_solver.prototxt @@ -5,10 +5,12 @@ test_state: { stage: 'test-on-test' } test_iter: 100 test_interval: 500 test_compute_loss: true -base_lr: 0.0001 -lr_policy: "fixed" -display: 20 -max_iter: 4000000 +base_lr: 0.01 +lr_policy: "step" +gamma: 0.1 +stepsize: 10000 +display: 100 +max_iter: 65000 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "examples/mnist/mnist_autoencoder" diff --git a/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt b/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt index 641ce8a001c..b18a0cf5f27 100644 --- a/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt +++ b/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt @@ -7,8 +7,8 @@ test_interval: 500 test_compute_loss: true base_lr: 0.01 lr_policy: "fixed" -display: 20 -max_iter: 4000000 +display: 100 +max_iter: 65000 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "mnist_autoencoder_train" diff --git a/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt b/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt index 254dceecf9b..2a59fd45c8d 100644 --- a/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt +++ b/examples/mnist/mnist_autoencoder_solver_nesterov.prototxt @@ -5,10 +5,12 @@ test_state: { stage: 'test-on-test' } test_iter: 100 test_interval: 500 test_compute_loss: true -base_lr: 0.0001 -lr_policy: "fixed" -display: 20 -max_iter: 4000000 +base_lr: 0.01 +lr_policy: "step" +gamma: 0.1 +stepsize: 10000 +display: 100 +max_iter: 65000 weight_decay: 0.0005 snapshot: 10000 snapshot_prefix: "examples/mnist/mnist_autoencoder_nesterov_train" From 77d66618af116b6faddc9e8b6035ce1b0f099149 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 1 Sep 2014 14:51:59 -0700 Subject: [PATCH 0604/2053] revert tools/train_net.cpp to previous, depecated version --- tools/train_net.cpp | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/tools/train_net.cpp b/tools/train_net.cpp index 9429fe892e9..622bca311c8 100644 --- a/tools/train_net.cpp +++ b/tools/train_net.cpp @@ -1,26 +1,7 @@ #include "caffe/caffe.hpp" -using namespace caffe; // NOLINT(build/namespaces) - int main(int argc, char** argv) { - ::google::InitGoogleLogging(argv[0]); - if (argc < 2 || argc > 3) { - LOG(ERROR) << "Usage: train_net solver_proto_file [resume_point_file]"; - return 1; - } - - SolverParameter solver_param; - ReadProtoFromTextFileOrDie(argv[1], &solver_param); - - LOG(INFO) << "Starting Optimization"; - shared_ptr > solver(GetSolver(solver_param)); - if (argc == 3) { - LOG(INFO) << "Resuming from " << argv[2]; - solver->Solve(argv[2]); - } else { - solver->Solve(); - } - LOG(INFO) << "Optimization Done."; - + LOG(FATAL) << "Deprecated. Use caffe train --solver=... " + "[--snapshot=...] instead."; return 0; } From 396e4afd632183175723225c2b764782db2e1055 Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Mon, 1 Sep 2014 16:45:20 -0700 Subject: [PATCH 0605/2053] add CUDA 6.5 error CUBLAS_STATUS_LICENSE_ERROR to cublasGetErrorString enum --- src/caffe/common.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index a900d6f0198..94fdf924f44 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -223,6 +223,10 @@ const char* cublasGetErrorString(cublasStatus_t error) { #if CUDA_VERSION >= 6000 case CUBLAS_STATUS_NOT_SUPPORTED: return "CUBLAS_STATUS_NOT_SUPPORTED"; +#endif +#if CUDA_VERSION >= 6050 + case CUBLAS_STATUS_LICENSE_ERROR: + return "CUBLAS_STATUS_LICENSE_ERROR"; #endif } return "Unknown cublas status"; From ed13a6199058798bc8631299f3bd086ae06c94da Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Mon, 1 Sep 2014 19:36:49 -0700 Subject: [PATCH 0606/2053] [pycaffe] add converter for vector used by _*_names --- python/caffe/_caffe.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 9c61ea869b9..7bf5ab2ecb8 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -192,6 +192,9 @@ BOOST_PYTHON_MODULE(_caffe) { bp::class_ >("LayerVec") .def(bp::vector_indexing_suite, true>()); + bp::class_ >("StringVec") + .def(bp::vector_indexing_suite >()); + import_array(); } From afd8f370b47291e9944695dee470626ede8b44fe Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Mon, 1 Sep 2014 19:26:02 -0700 Subject: [PATCH 0607/2053] [pycaffe] expose Net.blob_names and Net.layer_names --- python/caffe/_caffe.cpp | 2 ++ python/caffe/_caffe.hpp | 3 +++ 2 files changed, 5 insertions(+) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 7bf5ab2ecb8..39e5d09077c 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -156,6 +156,8 @@ BOOST_PYTHON_MODULE(_caffe) { .def("set_device", &PyNet::set_device) .add_property("_blobs", &PyNet::blobs) .add_property("layers", &PyNet::layers) + .add_property("_blob_names", &PyNet::blob_names) + .add_property("_layer_names", &PyNet::layer_names) .add_property("inputs", &PyNet::inputs) .add_property("outputs", &PyNet::outputs) .add_property("mean", &PyNet::mean_) diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index 2df47c7cec5..5884900fcfe 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -123,6 +123,9 @@ class PyNet { return vector(net_->layers().begin(), net_->layers().end()); } + vector blob_names() { return net_->blob_names(); } + vector layer_names() { return net_->layer_names(); } + bp::list inputs() { bp::list input_blob_names; for (int i = 0; i < net_->input_blob_indices().size(); ++i) { From 3e12d49324793d4798ee10bb6ef6a1c1b7633baf Mon Sep 17 00:00:00 2001 From: Jonathan L Long Date: Mon, 1 Sep 2014 19:32:24 -0700 Subject: [PATCH 0608/2053] [pycaffe] use _blob_names, _layer_names instead of removed .name --- python/caffe/pycaffe.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 9a230a72b3c..31dc1f9b001 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -21,7 +21,7 @@ def _Net_blobs(self): An OrderedDict (bottom to top, i.e., input to output) of network blobs indexed by name """ - return OrderedDict([(bl.name, bl) for bl in self._blobs]) + return OrderedDict(zip(self._blob_names, self._blobs)) @property @@ -31,7 +31,8 @@ def _Net_params(self): parameters indexed by name; each is a list of multiple blobs (e.g., weights and biases) """ - return OrderedDict([(lr.name, lr.blobs) for lr in self.layers + return OrderedDict([(name, lr.blobs) + for name, lr in zip(self._layer_names, self.layers) if len(lr.blobs) > 0]) def _Net_forward(self, blobs=None, start=None, end=None, **kwargs): @@ -53,12 +54,12 @@ def _Net_forward(self, blobs=None, start=None, end=None, **kwargs): blobs = [] if start is not None: - start_ind = [lr.name for lr in self.layers].index(start) + start_ind = list(self._layer_names).index(start) else: start_ind = 0 if end is not None: - end_ind = [lr.name for lr in self.layers].index(end) + end_ind = list(self._layer_names).index(end) outputs = set([end] + blobs) else: end_ind = len(self.layers) - 1 @@ -100,12 +101,12 @@ def _Net_backward(self, diffs=None, start=None, end=None, **kwargs): diffs = [] if start is not None: - start_ind = [lr.name for lr in self.layers].index(start) + start_ind = list(self._layer_names).index(start) else: start_ind = len(self.layers) - 1 if end is not None: - end_ind = [lr.name for lr in self.layers].index(end) + end_ind = list(self._layer_names).index(end) outputs = set([end] + diffs) else: end_ind = 0 From d3c6eb62073cdef5e33278f8f707fb153da3c3e5 Mon Sep 17 00:00:00 2001 From: Mohamed Omran Date: Tue, 2 Sep 2014 13:01:13 +0200 Subject: [PATCH 0609/2053] fixed relative path and prefix for adagrad-optimised autoencoder snapshots --- examples/mnist/mnist_autoencoder_solver_adagrad.prototxt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt b/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt index b18a0cf5f27..cc0ed9e310a 100644 --- a/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt +++ b/examples/mnist/mnist_autoencoder_solver_adagrad.prototxt @@ -11,7 +11,7 @@ display: 100 max_iter: 65000 weight_decay: 0.0005 snapshot: 10000 -snapshot_prefix: "mnist_autoencoder_train" +snapshot_prefix: "examples/mnist/mnist_autoencoder_adagrad_train" # solver mode: CPU or GPU solver_mode: GPU solver_type: ADAGRAD From fea9f0c16dacf5522b0a2d68c40d72de1d66c696 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 28 Aug 2014 15:29:25 +0800 Subject: [PATCH 0610/2053] Create base data layer and base prefetching data layer --- include/caffe/data_layers.hpp | 48 ++++++++++++++++++++++++++-- src/caffe/layers/base_data_layer.cpp | 19 +++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/caffe/layers/base_data_layer.cpp diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index f972965b45b..b33d1eef022 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -23,8 +23,52 @@ namespace caffe { #define HDF5_DATA_DATASET_NAME "data" #define HDF5_DATA_LABEL_NAME "label" -// TODO: DataLayer, ImageDataLayer, and WindowDataLayer all have the -// same basic structure and a lot of duplicated code. +template +class BaseDataLayer : public Layer { + public: + explicit BaseDataLayer(const LayerParameter& param) + : Layer(param), + data_transformer_(param.data_param().transform_param()) {} + virtual ~BaseDataLayer() {} + + protected: + virtual void Forward_cpu(const vector*>& bottom, + vector*>* top) = 0; + virtual void Forward_gpu(const vector*>& bottom, + vector*>* top) = 0; + virtual void Backward_cpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) = 0; + virtual void Backward_gpu(const vector*>& top, + const vector& propagate_down, vector*>* bottom) = 0; + + protected: + DataTransformer data_transformer_; + int datum_channels_; + int datum_height_; + int datum_width_; + int datum_size_; + Blob data_mean_; + Caffe::Phase phase_; +}; + +template +class BasePrefetchingDataLayer : + public BaseDataLayer, public InternalThread { + public: + explicit BasePrefetchingDataLayer(const LayerParameter& param) + : BaseDataLayer(param) {} + virtual ~BasePrefetchingDataLayer() {} + + virtual void CreatePrefetchThread(); + virtual void JoinPrefetchThread(); + // The thread's function + virtual void InternalThreadEntry() = 0; + + protected: + Blob prefetch_data_; + Blob prefetch_label_; +}; + template class DataLayer : public Layer, public InternalThread { public: diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp new file mode 100644 index 00000000000..2a22c8c39ac --- /dev/null +++ b/src/caffe/layers/base_data_layer.cpp @@ -0,0 +1,19 @@ +#include "caffe/data_layers.hpp" + +namespace caffe { + +template +void BasePrefetchingDataLayer::CreatePrefetchThread() { + this->phase_ = Caffe::phase(); + + this->data_transformer_.InitRand(); + + CHECK(StartInternalThread()) << "Pthread execution failed"; +} + +template +void BasePrefetchingDataLayer::JoinPrefetchThread() { + CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed"; +} + +} // namespace caffe From ee65a97ea8458f00b12d1f4524b3e1abeaaf904e Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 28 Aug 2014 16:10:47 +0800 Subject: [PATCH 0611/2053] Extract common data layer functionalities out of the DataLayer --- include/caffe/data_layers.hpp | 55 +++++---------- src/caffe/layers/base_data_layer.cpp | 36 +++++++++- src/caffe/layers/data_layer.cpp | 100 +++++++++------------------ 3 files changed, 84 insertions(+), 107 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index b33d1eef022..bc207c0146a 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -30,16 +30,18 @@ class BaseDataLayer : public Layer { : Layer(param), data_transformer_(param.data_param().transform_param()) {} virtual ~BaseDataLayer() {} + // LayerSetUp: implements common data layer setup functionality, and calls + // DataLayerSetUp to do special data layer setup for individual layer types. + // This method may not be overridden. + void LayerSetUp(const vector*>& bottom, + vector*>* top); + virtual void DataLayerSetUp(const vector*>& bottom, + vector*>* top) {} - protected: - virtual void Forward_cpu(const vector*>& bottom, - vector*>* top) = 0; - virtual void Forward_gpu(const vector*>& bottom, - vector*>* top) = 0; virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) = 0; + const vector& propagate_down, vector*>* bottom) {} virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) = 0; + const vector& propagate_down, vector*>* bottom) {} protected: DataTransformer data_transformer_; @@ -49,6 +51,7 @@ class BaseDataLayer : public Layer { int datum_size_; Blob data_mean_; Caffe::Phase phase_; + bool output_labels_; }; template @@ -59,10 +62,15 @@ class BasePrefetchingDataLayer : : BaseDataLayer(param) {} virtual ~BasePrefetchingDataLayer() {} + virtual void Forward_cpu(const vector*>& bottom, + vector*>* top); + virtual void Forward_gpu(const vector*>& bottom, + vector*>* top); + virtual void CreatePrefetchThread(); virtual void JoinPrefetchThread(); // The thread's function - virtual void InternalThreadEntry() = 0; + virtual void InternalThreadEntry() {} protected: Blob prefetch_data_; @@ -70,13 +78,12 @@ class BasePrefetchingDataLayer : }; template -class DataLayer : public Layer, public InternalThread { +class DataLayer : public BasePrefetchingDataLayer { public: explicit DataLayer(const LayerParameter& param) - : Layer(param), - data_transformer_(param.data_param().transform_param()) {} + : BasePrefetchingDataLayer(param) {} virtual ~DataLayer(); - virtual void LayerSetUp(const vector*>& bottom, + virtual void DataLayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -87,22 +94,8 @@ class DataLayer : public Layer, public InternalThread { virtual inline int MaxTopBlobs() const { return 2; } protected: - virtual void Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual void Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) {} - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) {} - - virtual void CreatePrefetchThread(); - virtual void JoinPrefetchThread(); - // The thread's function virtual void InternalThreadEntry(); - DataTransformer data_transformer_; - // LEVELDB shared_ptr db_; shared_ptr iter_; @@ -112,16 +105,6 @@ class DataLayer : public Layer, public InternalThread { MDB_txn* mdb_txn_; MDB_cursor* mdb_cursor_; MDB_val mdb_key_, mdb_value_; - - int datum_channels_; - int datum_height_; - int datum_width_; - int datum_size_; - Blob prefetch_data_; - Blob prefetch_label_; - Blob data_mean_; - bool output_labels_; - Caffe::Phase phase_; }; template diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 2a22c8c39ac..f8f8ad02ed7 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -2,12 +2,21 @@ namespace caffe { +template +void BaseDataLayer::LayerSetUp(const vector*>& bottom, + vector*>* top) { + if (top->size() == 1) { + output_labels_ = false; + } else { + output_labels_ = true; + } + DataLayerSetUp(bottom, top); +} + template void BasePrefetchingDataLayer::CreatePrefetchThread() { this->phase_ = Caffe::phase(); - this->data_transformer_.InitRand(); - CHECK(StartInternalThread()) << "Pthread execution failed"; } @@ -16,4 +25,27 @@ void BasePrefetchingDataLayer::JoinPrefetchThread() { CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed"; } +template +void BasePrefetchingDataLayer::Forward_cpu( + const vector*>& bottom, vector*>* top) { + // First, join the thread + JoinPrefetchThread(); + // Copy the data + caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), + (*top)[0]->mutable_cpu_data()); + if (this->output_labels_) { + caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), + (*top)[1]->mutable_cpu_data()); + } + // Start a new prefetch thread + CreatePrefetchThread(); +} + +#ifdef CPU_ONLY +STUB_GPU_FORWARD(BasePrefetchingDataLayer, Forward); +#endif + +INSTANTIATE_CLASS(BaseDataLayer); +INSTANTIATE_CLASS(BasePrefetchingDataLayer); + } // namespace caffe diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 519b666e35b..0d3054f8f7f 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -17,15 +17,15 @@ namespace caffe { template void DataLayer::InternalThreadEntry() { Datum datum; - CHECK(prefetch_data_.count()); - Dtype* top_data = prefetch_data_.mutable_cpu_data(); + CHECK(this->prefetch_data_.count()); + Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); Dtype* top_label = NULL; // suppress warnings about uninitialized variables - if (output_labels_) { - top_label = prefetch_label_.mutable_cpu_data(); + if (this->output_labels_) { + top_label = this->prefetch_label_.mutable_cpu_data(); } const int batch_size = this->layer_param_.data_param().batch_size(); - const Dtype* mean = data_mean_.cpu_data(); + const Dtype* mean = this->data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob switch (this->layer_param_.data_param().backend()) { @@ -45,9 +45,9 @@ void DataLayer::InternalThreadEntry() { } // Apply data transformations (mirror, scale, crop...) - data_transformer_.Transform(item_id, datum, mean, top_data); + this->data_transformer_.Transform(item_id, datum, mean, top_data); - if (output_labels_) { + if (this->output_labels_) { top_label[item_id] = datum.label(); } @@ -78,7 +78,7 @@ void DataLayer::InternalThreadEntry() { template DataLayer::~DataLayer() { - JoinPrefetchThread(); + this->JoinPrefetchThread(); // clean up the database resources switch (this->layer_param_.data_param().backend()) { case DataParameter_DB_LEVELDB: @@ -95,13 +95,8 @@ DataLayer::~DataLayer() { } template -void DataLayer::LayerSetUp(const vector*>& bottom, +void DataLayer::DataLayerSetUp(const vector*>& bottom, vector*>* top) { - if (top->size() == 1) { - output_labels_ = false; - } else { - output_labels_ = true; - } // Initialize DB switch (this->layer_param_.data_param().backend()) { case DataParameter_DB_LEVELDB: @@ -183,31 +178,31 @@ void DataLayer::LayerSetUp(const vector*>& bottom, if (crop_size > 0) { (*top)[0]->Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), crop_size, crop_size); - prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), + this->prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), crop_size, crop_size); } else { (*top)[0]->Reshape( this->layer_param_.data_param().batch_size(), datum.channels(), datum.height(), datum.width()); - prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), + this->prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), datum.height(), datum.width()); } LOG(INFO) << "output data size: " << (*top)[0]->num() << "," << (*top)[0]->channels() << "," << (*top)[0]->height() << "," << (*top)[0]->width(); // label - if (output_labels_) { + if (this->output_labels_) { (*top)[1]->Reshape(this->layer_param_.data_param().batch_size(), 1, 1, 1); - prefetch_label_.Reshape(this->layer_param_.data_param().batch_size(), + this->prefetch_label_.Reshape(this->layer_param_.data_param().batch_size(), 1, 1, 1); } // datum size - datum_channels_ = datum.channels(); - datum_height_ = datum.height(); - datum_width_ = datum.width(); - datum_size_ = datum.channels() * datum.height() * datum.width(); - CHECK_GT(datum_height_, crop_size); - CHECK_GT(datum_width_, crop_size); + this->datum_channels_ = datum.channels(); + this->datum_height_ = datum.height(); + this->datum_width_ = datum.width(); + this->datum_size_ = datum.channels() * datum.height() * datum.width(); + CHECK_GT(this->datum_height_, crop_size); + CHECK_GT(this->datum_width_, crop_size); // check if we want to have mean if (this->layer_param_.data_param().transform_param().has_mean_file()) { const string& mean_file = @@ -215,63 +210,30 @@ void DataLayer::LayerSetUp(const vector*>& bottom, LOG(INFO) << "Loading mean file from" << mean_file; BlobProto blob_proto; ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); - data_mean_.FromProto(blob_proto); - CHECK_EQ(data_mean_.num(), 1); - CHECK_EQ(data_mean_.channels(), datum_channels_); - CHECK_EQ(data_mean_.height(), datum_height_); - CHECK_EQ(data_mean_.width(), datum_width_); + this->data_mean_.FromProto(blob_proto); + CHECK_EQ(this->data_mean_.num(), 1); + CHECK_EQ(this->data_mean_.channels(), this->datum_channels_); + CHECK_EQ(this->data_mean_.height(), this->datum_height_); + CHECK_EQ(this->data_mean_.width(), this->datum_width_); } else { // Simply initialize an all-empty mean. - data_mean_.Reshape(1, datum_channels_, datum_height_, datum_width_); + this->data_mean_.Reshape(1, this->datum_channels_, this->datum_height_, + this->datum_width_); } // Now, start the prefetch thread. Before calling prefetch, we make two // cpu_data calls so that the prefetch thread does not accidentally make // simultaneous cudaMalloc calls when the main thread is running. In some // GPUs this seems to cause failures if we do not so. - prefetch_data_.mutable_cpu_data(); - if (output_labels_) { - prefetch_label_.mutable_cpu_data(); + this->prefetch_data_.mutable_cpu_data(); + if (this->output_labels_) { + this->prefetch_label_.mutable_cpu_data(); } - data_mean_.cpu_data(); + this->data_mean_.cpu_data(); DLOG(INFO) << "Initializing prefetch"; - CreatePrefetchThread(); + this->CreatePrefetchThread(); DLOG(INFO) << "Prefetch initialized."; } -template -void DataLayer::CreatePrefetchThread() { - phase_ = Caffe::phase(); - - data_transformer_.InitRand(); - - CHECK(StartInternalThread()) << "Thread execution failed"; -} - -template -void DataLayer::JoinPrefetchThread() { - CHECK(WaitForInternalThreadToExit()) << "Thread joining failed"; -} - -template -void DataLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - // First, join the thread - JoinPrefetchThread(); - // Copy the data - caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), - (*top)[0]->mutable_cpu_data()); - if (output_labels_) { - caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), - (*top)[1]->mutable_cpu_data()); - } - // Start a new prefetch thread - CreatePrefetchThread(); -} - -#ifdef CPU_ONLY -STUB_GPU_FORWARD(DataLayer, Forward); -#endif - INSTANTIATE_CLASS(DataLayer); } // namespace caffe From 6833dc0b7acf51a9bd30986df27e4c00fdfac741 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 28 Aug 2014 16:22:41 +0800 Subject: [PATCH 0612/2053] Remove duplicate codes from the ImageDataLayer --- include/caffe/data_layers.hpp | 35 ++--------- src/caffe/layers/base_data_layer.cpp | 5 ++ src/caffe/layers/data_layer.cpp | 1 - src/caffe/layers/image_data_layer.cpp | 90 ++++++++------------------- 4 files changed, 37 insertions(+), 94 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index bc207c0146a..499ee7f6cdc 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -60,7 +60,7 @@ class BasePrefetchingDataLayer : public: explicit BasePrefetchingDataLayer(const LayerParameter& param) : BaseDataLayer(param) {} - virtual ~BasePrefetchingDataLayer() {} + virtual ~BasePrefetchingDataLayer(); virtual void Forward_cpu(const vector*>& bottom, vector*>* top); @@ -202,13 +202,12 @@ class HDF5OutputLayer : public Layer { }; template -class ImageDataLayer : public Layer, public InternalThread { +class ImageDataLayer : public BasePrefetchingDataLayer { public: explicit ImageDataLayer(const LayerParameter& param) - : Layer(param), - data_transformer_(param.image_data_param().transform_param()) {} - virtual ~ImageDataLayer(); - virtual void LayerSetUp(const vector*>& bottom, + : BasePrefetchingDataLayer(param) {} + virtual ~ImageDataLayer() {} + virtual void DataLayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -218,34 +217,12 @@ class ImageDataLayer : public Layer, public InternalThread { virtual inline int ExactNumTopBlobs() const { return 2; } protected: - virtual void Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual void Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) {} - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) {} - + shared_ptr prefetch_rng_; virtual void ShuffleImages(); - - virtual void CreatePrefetchThread(); - virtual void JoinPrefetchThread(); virtual void InternalThreadEntry(); - DataTransformer data_transformer_; - shared_ptr prefetch_rng_; - vector > lines_; int lines_id_; - int datum_channels_; - int datum_height_; - int datum_width_; - int datum_size_; - Blob prefetch_data_; - Blob prefetch_label_; - Blob data_mean_; - Caffe::Phase phase_; }; /* MemoryDataLayer diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index f8f8ad02ed7..957a771af13 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -13,6 +13,11 @@ void BaseDataLayer::LayerSetUp(const vector*>& bottom, DataLayerSetUp(bottom, top); } +template +BasePrefetchingDataLayer::~BasePrefetchingDataLayer() { + JoinPrefetchThread(); +} + template void BasePrefetchingDataLayer::CreatePrefetchThread() { this->phase_ = Caffe::phase(); diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 0d3054f8f7f..1b3acbdf54c 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -78,7 +78,6 @@ void DataLayer::InternalThreadEntry() { template DataLayer::~DataLayer() { - this->JoinPrefetchThread(); // clean up the database resources switch (this->layer_param_.data_param().backend()) { case DataParameter_DB_LEVELDB: diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 5039ad03b08..e4805ca851e 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -16,9 +16,9 @@ namespace caffe { template void ImageDataLayer::InternalThreadEntry() { Datum datum; - CHECK(prefetch_data_.count()); - Dtype* top_data = prefetch_data_.mutable_cpu_data(); - Dtype* top_label = prefetch_label_.mutable_cpu_data(); + CHECK(this->prefetch_data_.count()); + Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); + Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); ImageDataParameter image_data_param = this->layer_param_.image_data_param(); const int batch_size = image_data_param.batch_size(); const int new_height = image_data_param.new_height(); @@ -26,7 +26,7 @@ void ImageDataLayer::InternalThreadEntry() { // datum scales const int lines_size = lines_.size(); - const Dtype* mean = data_mean_.cpu_data(); + const Dtype* mean = this->data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob CHECK_GT(lines_size, lines_id_); @@ -37,7 +37,7 @@ void ImageDataLayer::InternalThreadEntry() { } // Apply transformations (mirror, crop...) to the data - data_transformer_.Transform(item_id, datum, mean, top_data); + this->data_transformer_.Transform(item_id, datum, mean, top_data); top_label[item_id] = datum.label(); // go to the next iter @@ -54,12 +54,7 @@ void ImageDataLayer::InternalThreadEntry() { } template -ImageDataLayer::~ImageDataLayer() { - JoinPrefetchThread(); -} - -template -void ImageDataLayer::LayerSetUp(const vector*>& bottom, +void ImageDataLayer::DataLayerSetUp(const vector*>& bottom, vector*>* top) { const int new_height = this->layer_param_.image_data_param().new_height(); const int new_width = this->layer_param_.image_data_param().new_width(); @@ -106,11 +101,11 @@ void ImageDataLayer::LayerSetUp(const vector*>& bottom, .transform_param().mean_file(); if (crop_size > 0) { (*top)[0]->Reshape(batch_size, datum.channels(), crop_size, crop_size); - prefetch_data_.Reshape(batch_size, datum.channels(), crop_size, crop_size); + this->prefetch_data_.Reshape(batch_size, datum.channels(), crop_size, crop_size); } else { (*top)[0]->Reshape(batch_size, datum.channels(), datum.height(), datum.width()); - prefetch_data_.Reshape(batch_size, datum.channels(), datum.height(), + this->prefetch_data_.Reshape(batch_size, datum.channels(), datum.height(), datum.width()); } LOG(INFO) << "output data size: " << (*top)[0]->num() << "," @@ -118,50 +113,41 @@ void ImageDataLayer::LayerSetUp(const vector*>& bottom, << (*top)[0]->width(); // label (*top)[1]->Reshape(batch_size, 1, 1, 1); - prefetch_label_.Reshape(batch_size, 1, 1, 1); + this->prefetch_label_.Reshape(batch_size, 1, 1, 1); // datum size - datum_channels_ = datum.channels(); - datum_height_ = datum.height(); - datum_width_ = datum.width(); - datum_size_ = datum.channels() * datum.height() * datum.width(); - CHECK_GT(datum_height_, crop_size); - CHECK_GT(datum_width_, crop_size); + this->datum_channels_ = datum.channels(); + this->datum_height_ = datum.height(); + this->datum_width_ = datum.width(); + this->datum_size_ = datum.channels() * datum.height() * datum.width(); + CHECK_GT(this->datum_height_, crop_size); + CHECK_GT(this->datum_width_, crop_size); // check if we want to have mean if (this->layer_param_.image_data_param().transform_param().has_mean_file()) { BlobProto blob_proto; LOG(INFO) << "Loading mean file from" << mean_file; ReadProtoFromBinaryFile(mean_file.c_str(), &blob_proto); - data_mean_.FromProto(blob_proto); - CHECK_EQ(data_mean_.num(), 1); - CHECK_EQ(data_mean_.channels(), datum_channels_); - CHECK_EQ(data_mean_.height(), datum_height_); - CHECK_EQ(data_mean_.width(), datum_width_); + this->data_mean_.FromProto(blob_proto); + CHECK_EQ(this->data_mean_.num(), 1); + CHECK_EQ(this->data_mean_.channels(), this->datum_channels_); + CHECK_EQ(this->data_mean_.height(), this->datum_height_); + CHECK_EQ(this->data_mean_.width(), this->datum_width_); } else { // Simply initialize an all-empty mean. - data_mean_.Reshape(1, datum_channels_, datum_height_, datum_width_); + this->data_mean_.Reshape(1, this->datum_channels_, this->datum_height_, + this->datum_width_); } // Now, start the prefetch thread. Before calling prefetch, we make two // cpu_data calls so that the prefetch thread does not accidentally make // simultaneous cudaMalloc calls when the main thread is running. In some // GPUs this seems to cause failures if we do not so. - prefetch_data_.mutable_cpu_data(); - prefetch_label_.mutable_cpu_data(); - data_mean_.cpu_data(); + this->prefetch_data_.mutable_cpu_data(); + this->prefetch_label_.mutable_cpu_data(); + this->data_mean_.cpu_data(); DLOG(INFO) << "Initializing prefetch"; - CreatePrefetchThread(); + this->CreatePrefetchThread(); DLOG(INFO) << "Prefetch initialized."; } -template -void ImageDataLayer::CreatePrefetchThread() { - phase_ = Caffe::phase(); - - data_transformer_.InitRand(); - - // Create the thread. - CHECK(StartInternalThread()) << "Thread execution failed"; -} - template void ImageDataLayer::ShuffleImages() { caffe::rng_t* prefetch_rng = @@ -169,30 +155,6 @@ void ImageDataLayer::ShuffleImages() { shuffle(lines_.begin(), lines_.end(), prefetch_rng); } - -template -void ImageDataLayer::JoinPrefetchThread() { - CHECK(WaitForInternalThreadToExit()) << "Thread joining failed"; -} - -template -void ImageDataLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - // First, join the thread - JoinPrefetchThread(); - // Copy the data - caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), - (*top)[0]->mutable_cpu_data()); - caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), - (*top)[1]->mutable_cpu_data()); - // Start a new prefetch thread - CreatePrefetchThread(); -} - -#ifdef CPU_ONLY -STUB_GPU_FORWARD(ImageDataLayer, Forward); -#endif - INSTANTIATE_CLASS(ImageDataLayer); } // namespace caffe From b794cf9433233ec002dc454fa40286bbd3f4ecfe Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 28 Aug 2014 16:55:56 +0800 Subject: [PATCH 0613/2053] Simplify the WindowDataLayer using the base class --- include/caffe/common.hpp | 6 ++ include/caffe/data_layers.hpp | 22 +----- src/caffe/layers/base_data_layer.cpp | 2 + src/caffe/layers/data_layer.cpp | 3 +- src/caffe/layers/image_data_layer.cpp | 5 +- src/caffe/layers/window_data_layer.cpp | 95 ++++++++--------------- src/caffe/test/test_data_layer.cpp | 6 +- src/caffe/test/test_image_data_layer.cpp | 5 -- src/caffe/test/test_window_data_layer.cpp | 49 ++++++++++++ 9 files changed, 98 insertions(+), 95 deletions(-) create mode 100644 src/caffe/test/test_window_data_layer.cpp diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 9008eae02bf..683d1d68f1d 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -6,9 +6,14 @@ #include #include +#include // NOLINT(readability/streams) +#include // NOLINT(readability/streams) #include #include +#include #include +#include // pair +#include #include "caffe/util/device_alternate.hpp" @@ -88,6 +93,7 @@ using std::ostringstream; using std::pair; using std::set; using std::string; +using std::stringstream; using std::vector; // A global initialization function that you should call in your main function. diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 499ee7f6cdc..8651ece4d5f 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -269,12 +269,12 @@ class MemoryDataLayer : public Layer { }; template -class WindowDataLayer : public Layer, public InternalThread { +class WindowDataLayer : public BasePrefetchingDataLayer { public: explicit WindowDataLayer(const LayerParameter& param) - : Layer(param) {} - virtual ~WindowDataLayer(); - virtual void LayerSetUp(const vector*>& bottom, + : BasePrefetchingDataLayer(param) {} + virtual ~WindowDataLayer() {} + virtual void DataLayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -284,24 +284,10 @@ class WindowDataLayer : public Layer, public InternalThread { virtual inline int ExactNumTopBlobs() const { return 2; } protected: - virtual void Forward_cpu(const vector*>& bottom, - vector*>* top); - virtual void Forward_gpu(const vector*>& bottom, - vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) {} - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) {} - - virtual void CreatePrefetchThread(); - virtual void JoinPrefetchThread(); virtual unsigned int PrefetchRand(); virtual void InternalThreadEntry(); shared_ptr prefetch_rng_; - Blob prefetch_data_; - Blob prefetch_label_; - Blob data_mean_; vector > > image_database_; enum WindowField { IMAGE_INDEX, LABEL, OVERLAP, X1, Y1, X2, Y2, NUM }; vector > fg_windows_; diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 957a771af13..8310710dbc1 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -1,3 +1,5 @@ +#include + #include "caffe/data_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 1b3acbdf54c..fbf2d91c7ac 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -4,12 +4,13 @@ #include #include +#include "caffe/common.hpp" +#include "caffe/data_layers.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" -#include "caffe/vision_layers.hpp" namespace caffe { diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index e4805ca851e..687beb8efa3 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -4,11 +4,11 @@ #include #include +#include "caffe/data_layers.hpp" #include "caffe/layer.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" -#include "caffe/vision_layers.hpp" namespace caffe { @@ -101,7 +101,8 @@ void ImageDataLayer::DataLayerSetUp(const vector*>& bottom, .transform_param().mean_file(); if (crop_size > 0) { (*top)[0]->Reshape(batch_size, datum.channels(), crop_size, crop_size); - this->prefetch_data_.Reshape(batch_size, datum.channels(), crop_size, crop_size); + this->prefetch_data_.Reshape(batch_size, datum.channels(), crop_size, + crop_size); } else { (*top)[0]->Reshape(batch_size, datum.channels(), datum.height(), datum.width()); diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index ab12c61a08a..f4349825aba 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -1,7 +1,6 @@ #include #include -#include // NOLINT(readability/streams) #include #include #include @@ -11,11 +10,12 @@ #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" +#include "caffe/common.hpp" +#include "caffe/data_layers.hpp" #include "caffe/layer.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" -#include "caffe/vision_layers.hpp" // caffe.proto > LayerParameter > WindowDataParameter // 'source' field specifies the window_file @@ -29,8 +29,8 @@ void WindowDataLayer::InternalThreadEntry() { // At each iteration, sample N windows where N*p are foreground (object) // windows and N*(1-p) are background (non-object) windows - Dtype* top_data = prefetch_data_.mutable_cpu_data(); - Dtype* top_label = prefetch_label_.mutable_cpu_data(); + Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); + Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); const Dtype scale = this->layer_param_.window_data_param().scale(); const int batch_size = this->layer_param_.window_data_param().batch_size(); const int crop_size = this->layer_param_.window_data_param().crop_size(); @@ -38,17 +38,17 @@ void WindowDataLayer::InternalThreadEntry() { const bool mirror = this->layer_param_.window_data_param().mirror(); const float fg_fraction = this->layer_param_.window_data_param().fg_fraction(); - const Dtype* mean = data_mean_.cpu_data(); - const int mean_off = (data_mean_.width() - crop_size) / 2; - const int mean_width = data_mean_.width(); - const int mean_height = data_mean_.height(); + const Dtype* mean = this->data_mean_.cpu_data(); + const int mean_off = (this->data_mean_.width() - crop_size) / 2; + const int mean_width = this->data_mean_.width(); + const int mean_height = this->data_mean_.height(); cv::Size cv_crop_size(crop_size, crop_size); const string& crop_mode = this->layer_param_.window_data_param().crop_mode(); bool use_square = (crop_mode == "square") ? true : false; // zero out batch - caffe_set(prefetch_data_.count(), Dtype(0), top_data); + caffe_set(this->prefetch_data_.count(), Dtype(0), top_data); const int num_fg = static_cast(static_cast(batch_size) * fg_fraction); @@ -238,12 +238,7 @@ void WindowDataLayer::InternalThreadEntry() { } template -WindowDataLayer::~WindowDataLayer() { - JoinPrefetchThread(); -} - -template -void WindowDataLayer::LayerSetUp(const vector*>& bottom, +void WindowDataLayer::DataLayerSetUp(const vector*>& bottom, vector*>* top) { // LayerSetUp runs through the window_file and creates two structures // that hold windows: one for foreground (object) windows and one @@ -268,6 +263,16 @@ void WindowDataLayer::LayerSetUp(const vector*>& bottom, << " foreground sampling fraction: " << this->layer_param_.window_data_param().fg_fraction(); + const bool prefetch_needs_rand = + this->layer_param_.window_data_param().mirror() || + this->layer_param_.window_data_param().crop_size(); + if (prefetch_needs_rand) { + const unsigned int prefetch_rng_seed = caffe_rng_rand(); + prefetch_rng_.reset(new Caffe::RNG(prefetch_rng_seed)); + } else { + prefetch_rng_.reset(); + } + std::ifstream infile(this->layer_param_.window_data_param().source().c_str()); CHECK(infile.good()) << "Failed to open window file " << this->layer_param_.window_data_param().source() << std::endl; @@ -357,14 +362,14 @@ void WindowDataLayer::LayerSetUp(const vector*>& bottom, CHECK_GT(crop_size, 0); const int batch_size = this->layer_param_.window_data_param().batch_size(); (*top)[0]->Reshape(batch_size, channels, crop_size, crop_size); - prefetch_data_.Reshape(batch_size, channels, crop_size, crop_size); + this->prefetch_data_.Reshape(batch_size, channels, crop_size, crop_size); LOG(INFO) << "output data size: " << (*top)[0]->num() << "," << (*top)[0]->channels() << "," << (*top)[0]->height() << "," << (*top)[0]->width(); // label (*top)[1]->Reshape(batch_size, 1, 1, 1); - prefetch_label_.Reshape(batch_size, 1, 1, 1); + this->prefetch_label_.Reshape(batch_size, 1, 1, 1); // check if we want to have mean if (this->layer_param_.window_data_param().has_mean_file()) { @@ -373,46 +378,26 @@ void WindowDataLayer::LayerSetUp(const vector*>& bottom, LOG(INFO) << "Loading mean file from" << mean_file; BlobProto blob_proto; ReadProtoFromBinaryFileOrDie(mean_file, &blob_proto); - data_mean_.FromProto(blob_proto); - CHECK_EQ(data_mean_.num(), 1); - CHECK_EQ(data_mean_.width(), data_mean_.height()); - CHECK_EQ(data_mean_.channels(), channels); + this->data_mean_.FromProto(blob_proto); + CHECK_EQ(this->data_mean_.num(), 1); + CHECK_EQ(this->data_mean_.width(), this->data_mean_.height()); + CHECK_EQ(this->data_mean_.channels(), channels); } else { // Simply initialize an all-empty mean. - data_mean_.Reshape(1, channels, crop_size, crop_size); + this->data_mean_.Reshape(1, channels, crop_size, crop_size); } // Now, start the prefetch thread. Before calling prefetch, we make two // cpu_data calls so that the prefetch thread does not accidentally make // simultaneous cudaMalloc calls when the main thread is running. In some // GPUs this seems to cause failures if we do not so. - prefetch_data_.mutable_cpu_data(); - prefetch_label_.mutable_cpu_data(); - data_mean_.cpu_data(); + this->prefetch_data_.mutable_cpu_data(); + this->prefetch_label_.mutable_cpu_data(); + this->data_mean_.cpu_data(); DLOG(INFO) << "Initializing prefetch"; - CreatePrefetchThread(); + this->CreatePrefetchThread(); DLOG(INFO) << "Prefetch initialized."; } -template -void WindowDataLayer::CreatePrefetchThread() { - const bool prefetch_needs_rand = - this->layer_param_.window_data_param().mirror() || - this->layer_param_.window_data_param().crop_size(); - if (prefetch_needs_rand) { - const unsigned int prefetch_rng_seed = caffe_rng_rand(); - prefetch_rng_.reset(new Caffe::RNG(prefetch_rng_seed)); - } else { - prefetch_rng_.reset(); - } - // Create the thread. - CHECK(StartInternalThread()) << "Thread execution failed."; -} - -template -void WindowDataLayer::JoinPrefetchThread() { - CHECK(WaitForInternalThreadToExit()) << "Thread joining failed."; -} - template unsigned int WindowDataLayer::PrefetchRand() { CHECK(prefetch_rng_); @@ -421,24 +406,6 @@ unsigned int WindowDataLayer::PrefetchRand() { return (*prefetch_rng)(); } -template -void WindowDataLayer::Forward_cpu(const vector*>& bottom, - vector*>* top) { - // First, join the thread - JoinPrefetchThread(); - // Copy the data - caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), - (*top)[0]->mutable_cpu_data()); - caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), - (*top)[1]->mutable_cpu_data()); - // Start a new prefetch thread - CreatePrefetchThread(); -} - -#ifdef CPU_ONLY -STUB_GPU_FORWARD(WindowDataLayer, Forward); -#endif - INSTANTIATE_CLASS(WindowDataLayer); } // namespace caffe diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 5c21f2e745d..52cc2c082a9 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -1,9 +1,8 @@ #include #include -#include "leveldb/db.h" - #include "gtest/gtest.h" +#include "leveldb/db.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -13,9 +12,6 @@ #include "caffe/test/test_caffe_main.hpp" -using std::string; -using std::stringstream; - namespace caffe { template diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index 73be5da7b23..ab2365c6556 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -1,5 +1,3 @@ -#include // NOLINT(readability/streams) -#include // NOLINT(readability/streams) #include #include #include @@ -14,9 +12,6 @@ #include "caffe/test/test_caffe_main.hpp" -using std::map; -using std::string; - namespace caffe { template diff --git a/src/caffe/test/test_window_data_layer.cpp b/src/caffe/test/test_window_data_layer.cpp new file mode 100644 index 00000000000..47591b60154 --- /dev/null +++ b/src/caffe/test/test_window_data_layer.cpp @@ -0,0 +1,49 @@ +#include +#include + +#include "gtest/gtest.h" + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/data_layers.hpp" +#include "caffe/proto/caffe.pb.h" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +template +class WindowDataLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + + protected: + WindowDataLayerTest() + : seed_(1701), + filename_(new string(tmpnam(NULL))), + blob_top_data_(new Blob()), + blob_top_label_(new Blob()) {} + virtual void SetUp() { + blob_top_vec_.push_back(blob_top_data_); + blob_top_vec_.push_back(blob_top_label_); + Caffe::set_random_seed(seed_); + } + + virtual ~WindowDataLayerTest() { + delete blob_top_data_; + delete blob_top_label_; + } + + int seed_; + shared_ptr filename_; + Blob* const blob_top_data_; + Blob* const blob_top_label_; + vector*> blob_bottom_vec_; + vector*> blob_top_vec_; +}; + +TYPED_TEST_CASE(WindowDataLayerTest, TestDtypesAndDevices); + +TYPED_TEST(WindowDataLayerTest, TestNothing) { +} + +} // namespace caffe From 5af0d240cd22adb60bb6fd7eadd3249a46369faf Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 28 Aug 2014 17:32:46 +0800 Subject: [PATCH 0614/2053] The BasePrefetchingDataLayer shouldn't join the thread --- include/caffe/data_layers.hpp | 6 +++--- src/caffe/layers/base_data_layer.cpp | 5 ----- src/caffe/layers/data_layer.cpp | 1 + src/caffe/layers/image_data_layer.cpp | 5 +++++ src/caffe/layers/window_data_layer.cpp | 5 +++++ 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 8651ece4d5f..4f599e4a306 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -60,7 +60,7 @@ class BasePrefetchingDataLayer : public: explicit BasePrefetchingDataLayer(const LayerParameter& param) : BaseDataLayer(param) {} - virtual ~BasePrefetchingDataLayer(); + virtual ~BasePrefetchingDataLayer() {} virtual void Forward_cpu(const vector*>& bottom, vector*>* top); @@ -206,7 +206,7 @@ class ImageDataLayer : public BasePrefetchingDataLayer { public: explicit ImageDataLayer(const LayerParameter& param) : BasePrefetchingDataLayer(param) {} - virtual ~ImageDataLayer() {} + virtual ~ImageDataLayer(); virtual void DataLayerSetUp(const vector*>& bottom, vector*>* top); @@ -273,7 +273,7 @@ class WindowDataLayer : public BasePrefetchingDataLayer { public: explicit WindowDataLayer(const LayerParameter& param) : BasePrefetchingDataLayer(param) {} - virtual ~WindowDataLayer() {} + virtual ~WindowDataLayer(); virtual void DataLayerSetUp(const vector*>& bottom, vector*>* top); diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 8310710dbc1..b25f0873f1d 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -15,11 +15,6 @@ void BaseDataLayer::LayerSetUp(const vector*>& bottom, DataLayerSetUp(bottom, top); } -template -BasePrefetchingDataLayer::~BasePrefetchingDataLayer() { - JoinPrefetchThread(); -} - template void BasePrefetchingDataLayer::CreatePrefetchThread() { this->phase_ = Caffe::phase(); diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index fbf2d91c7ac..b57ca587749 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -79,6 +79,7 @@ void DataLayer::InternalThreadEntry() { template DataLayer::~DataLayer() { + this->JoinPrefetchThread(); // clean up the database resources switch (this->layer_param_.data_param().backend()) { case DataParameter_DB_LEVELDB: diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 687beb8efa3..72b14832358 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -53,6 +53,11 @@ void ImageDataLayer::InternalThreadEntry() { } } +template +ImageDataLayer::~ImageDataLayer() { + this->JoinPrefetchThread(); +} + template void ImageDataLayer::DataLayerSetUp(const vector*>& bottom, vector*>* top) { diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index f4349825aba..f7e8186a477 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -237,6 +237,11 @@ void WindowDataLayer::InternalThreadEntry() { } } +template +WindowDataLayer::~WindowDataLayer() { + this->JoinPrefetchThread(); +} + template void WindowDataLayer::DataLayerSetUp(const vector*>& bottom, vector*>* top) { From 4f7c9b487d4e0eed5f93f61bf271d94c7dc6e99a Mon Sep 17 00:00:00 2001 From: Kai Li Date: Thu, 28 Aug 2014 17:45:39 +0800 Subject: [PATCH 0615/2053] Implement Forward_gpu in the base prefetching data layer --- .../{data_layer.cu => base_data_layer.cu} | 16 +++------- src/caffe/layers/image_data_layer.cu | 27 ---------------- src/caffe/layers/window_data_layer.cu | 32 ------------------- 3 files changed, 5 insertions(+), 70 deletions(-) rename src/caffe/layers/{data_layer.cu => base_data_layer.cu} (58%) delete mode 100644 src/caffe/layers/image_data_layer.cu delete mode 100644 src/caffe/layers/window_data_layer.cu diff --git a/src/caffe/layers/data_layer.cu b/src/caffe/layers/base_data_layer.cu similarity index 58% rename from src/caffe/layers/data_layer.cu rename to src/caffe/layers/base_data_layer.cu index 28ca2c1082a..8189c79c9d4 100644 --- a/src/caffe/layers/data_layer.cu +++ b/src/caffe/layers/base_data_layer.cu @@ -1,24 +1,18 @@ -#include #include -#include "leveldb/db.h" -#include "stdint.h" - -#include "caffe/layer.hpp" -#include "caffe/util/io.hpp" -#include "caffe/vision_layers.hpp" +#include "caffe/data_layers.hpp" namespace caffe { template -void DataLayer::Forward_gpu(const vector*>& bottom, - vector*>* top) { +void BasePrefetchingDataLayer::Forward_gpu( + const vector*>& bottom, vector*>* top) { // First, join the thread JoinPrefetchThread(); // Copy the data caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), (*top)[0]->mutable_gpu_data()); - if (output_labels_) { + if (this->output_labels_) { caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), (*top)[1]->mutable_gpu_data()); } @@ -26,6 +20,6 @@ void DataLayer::Forward_gpu(const vector*>& bottom, CreatePrefetchThread(); } -INSTANTIATE_CLASS(DataLayer); +INSTANTIATE_CLASS(BasePrefetchingDataLayer); } // namespace caffe diff --git a/src/caffe/layers/image_data_layer.cu b/src/caffe/layers/image_data_layer.cu deleted file mode 100644 index 30a22100dc3..00000000000 --- a/src/caffe/layers/image_data_layer.cu +++ /dev/null @@ -1,27 +0,0 @@ -#include - -#include "caffe/blob.hpp" -#include "caffe/common.hpp" -#include "caffe/layer.hpp" -#include "caffe/util/io.hpp" -#include "caffe/vision_layers.hpp" - -namespace caffe { - -template -void ImageDataLayer::Forward_gpu(const vector*>& bottom, - vector*>* top) { - // First, join the thread - JoinPrefetchThread(); - // Copy the data - caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), - (*top)[0]->mutable_gpu_data()); - caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), - (*top)[1]->mutable_gpu_data()); - // Start a new prefetch thread - CreatePrefetchThread(); -} - -INSTANTIATE_CLASS(ImageDataLayer); - -} // namespace caffe diff --git a/src/caffe/layers/window_data_layer.cu b/src/caffe/layers/window_data_layer.cu deleted file mode 100644 index 947f2a39e7e..00000000000 --- a/src/caffe/layers/window_data_layer.cu +++ /dev/null @@ -1,32 +0,0 @@ -#include - -#include -#include - -#include "caffe/layer.hpp" -#include "caffe/util/io.hpp" -#include "caffe/vision_layers.hpp" - -// caffe.proto > LayerParameter > WindowDataParameter -// 'source' field specifies the window_file -// 'crop_size' indicates the desired warped size - -namespace caffe { - -template -void WindowDataLayer::Forward_gpu(const vector*>& bottom, - vector*>* top) { - // First, join the thread - JoinPrefetchThread(); - // Copy the data - caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), - (*top)[0]->mutable_gpu_data()); - caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), - (*top)[1]->mutable_gpu_data()); - // Start a new prefetch thread - CreatePrefetchThread(); -} - -INSTANTIATE_CLASS(WindowDataLayer); - -} // namespace caffe From 4c35ad2dbc1e31c8bb347a67ff750a37336a7363 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 29 Aug 2014 03:02:10 +0800 Subject: [PATCH 0616/2053] Add transformer to the memory data layer --- include/caffe/data_layers.hpp | 26 +++++++------- src/caffe/layers/memory_data_layer.cpp | 47 +++++++++++++++++++++----- src/caffe/proto/caffe.proto | 1 + 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 4f599e4a306..952fcb71832 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -9,6 +9,7 @@ #include "hdf5.h" #include "leveldb/db.h" #include "lmdb.h" +#include #include "caffe/blob.hpp" #include "caffe/common.hpp" @@ -43,6 +44,11 @@ class BaseDataLayer : public Layer { virtual void Backward_gpu(const vector*>& top, const vector& propagate_down, vector*>* bottom) {} + int datum_channels() const { return datum_channels_; } + int datum_height() const { return datum_height_; } + int datum_width() const { return datum_width_; } + int datum_size() const { return datum_size_; } + protected: DataTransformer data_transformer_; int datum_channels_; @@ -228,10 +234,10 @@ class ImageDataLayer : public BasePrefetchingDataLayer { /* MemoryDataLayer */ template -class MemoryDataLayer : public Layer { +class MemoryDataLayer : public BaseDataLayer { public: explicit MemoryDataLayer(const LayerParameter& param) - : Layer(param) {} + : BaseDataLayer(param), is_data_set_up_(false) {} virtual void LayerSetUp(const vector*>& bottom, vector*>* top); @@ -244,28 +250,22 @@ class MemoryDataLayer : public Layer { // Reset should accept const pointers, but can't, because the memory // will be given to Blob, which is mutable void Reset(Dtype* data, Dtype* label, int n); - int datum_channels() { return datum_channels_; } - int datum_height() { return datum_height_; } - int datum_width() { return datum_width_; } + + virtual void AddImagesAndLabels(const vector& images, + const vector& labels); + int batch_size() { return batch_size_; } protected: virtual void Forward_cpu(const vector*>& bottom, vector*>* top); - virtual void Backward_cpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) {} - virtual void Backward_gpu(const vector*>& top, - const vector& propagate_down, vector*>* bottom) {} Dtype* data_; Dtype* labels_; - int datum_channels_; - int datum_height_; - int datum_width_; - int datum_size_; int batch_size_; int n_; int pos_; + bool is_data_set_up_; }; template diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index fda92976c49..d482df52d00 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -1,7 +1,7 @@ #include +#include "caffe/data_layers.hpp" #include "caffe/layer.hpp" -#include "caffe/vision_layers.hpp" namespace caffe { @@ -9,13 +9,16 @@ template void MemoryDataLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { batch_size_ = this->layer_param_.memory_data_param().batch_size(); - datum_channels_ = this->layer_param_.memory_data_param().channels(); - datum_height_ = this->layer_param_.memory_data_param().height(); - datum_width_ = this->layer_param_.memory_data_param().width(); - datum_size_ = datum_channels_ * datum_height_ * datum_width_; - CHECK_GT(batch_size_ * datum_size_, 0) << "batch_size, channels, height," - " and width must be specified and positive in memory_data_param"; - (*top)[0]->Reshape(batch_size_, datum_channels_, datum_height_, datum_width_); + this->datum_channels_ = this->layer_param_.memory_data_param().channels(); + this->datum_height_ = this->layer_param_.memory_data_param().height(); + this->datum_width_ = this->layer_param_.memory_data_param().width(); + this->datum_size_ = this->datum_channels_ * this->datum_height_ * + this->datum_width_; + CHECK_GT(batch_size_ * this->datum_size_, 0) << + "batch_size, channels, height, and width must be specified and" + " positive in memory_data_param"; + (*top)[0]->Reshape(batch_size_, this->datum_channels_, this->datum_height_, + this->datum_width_); (*top)[1]->Reshape(batch_size_, 1, 1, 1); data_ = NULL; labels_ = NULL; @@ -36,11 +39,37 @@ template void MemoryDataLayer::Forward_cpu(const vector*>& bottom, vector*>* top) { CHECK(data_) << "MemoryDataLayer needs to be initalized by calling Reset"; - (*top)[0]->set_cpu_data(data_ + pos_ * datum_size_); + (*top)[0]->set_cpu_data(data_ + pos_ * this->datum_size_); (*top)[1]->set_cpu_data(labels_ + pos_); pos_ = (pos_ + batch_size_) % n_; } +template +void MemoryDataLayer::AddImagesAndLabels( + const vector& images, const vector& labels) { + size_t num_images = images.size(); + CHECK_GT(num_images, 0) << "There is no image to add"; + CHECK_LE(num_images, batch_size_)<< + "The number of added images " << images.size() << + " must be no greater than the batch size " << batch_size; + CHECK_LE(num_images, labels.size()) << + "The number of images " << images.size() << + " must be no greater than the number of labels " << labels.size(); + + Datum datum; + Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); + Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); + // Apply data transformations (mirror, scale, crop...) + this->data_transformer_.Transform(item_id, datum, mean, top_data); + int image_id; + for (int item_id = 0; item_id < batch_size; ++item_id) { + image_id = item_id % num_images; + OpenCVImageToDatum(images[image_id], labels[image_id], new_height, + new_width, &datum); + this->data_transformer_.Transform(item_id, datum, mean, top_data); + } +} + INSTANTIATE_CLASS(MemoryDataLayer); } // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index ff18779f62d..5acc776fb99 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -529,6 +529,7 @@ message MemoryDataParameter { optional uint32 channels = 2; optional uint32 height = 3; optional uint32 width = 4; + optional TransformationParameter transform_param = 5; } // Message that stores parameters used by MVNLayer From 156a5a29878c6ded8482b9084853628daff9e188 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 29 Aug 2014 10:12:57 +0800 Subject: [PATCH 0617/2053] Remove pthread which has been replaced with boost thread --- include/caffe/data_layers.hpp | 3 ++- include/caffe/loss_layers.hpp | 4 ---- include/caffe/neuron_layers.hpp | 3 --- src/caffe/internal_thread.cpp | 3 +++ src/caffe/layers/base_data_layer.cpp | 4 ++-- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 952fcb71832..1f33748ac99 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -1,6 +1,8 @@ #ifndef CAFFE_DATA_LAYERS_HPP_ #define CAFFE_DATA_LAYERS_HPP_ +#include + #include #include #include @@ -9,7 +11,6 @@ #include "hdf5.h" #include "leveldb/db.h" #include "lmdb.h" -#include #include "caffe/blob.hpp" #include "caffe/common.hpp" diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index df887b8f856..a50488ff5ef 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -5,10 +5,6 @@ #include #include -#include "boost/scoped_ptr.hpp" -#include "hdf5.h" -#include "leveldb/db.h" - #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/layer.hpp" diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index b5bbc5b6482..f062f0e95c4 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -5,9 +5,6 @@ #include #include -#include "boost/scoped_ptr.hpp" -#include "hdf5.h" - #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/layer.hpp" diff --git a/src/caffe/internal_thread.cpp b/src/caffe/internal_thread.cpp index e8cfc861932..d7b6ae206cf 100644 --- a/src/caffe/internal_thread.cpp +++ b/src/caffe/internal_thread.cpp @@ -12,6 +12,9 @@ InternalThread::~InternalThread() { } bool InternalThread::StartInternalThread() { + if (!WaitForInternalThreadToExit()) { + return false; + } try { thread_ = new caffe::Thread (&InternalThread::InternalThreadEntry, this); diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index b25f0873f1d..3062cff4741 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -19,12 +19,12 @@ template void BasePrefetchingDataLayer::CreatePrefetchThread() { this->phase_ = Caffe::phase(); this->data_transformer_.InitRand(); - CHECK(StartInternalThread()) << "Pthread execution failed"; + CHECK(StartInternalThread()) << "Thread execution failed"; } template void BasePrefetchingDataLayer::JoinPrefetchThread() { - CHECK(!WaitForInternalThreadToExit()) << "Pthread joining failed"; + CHECK(WaitForInternalThreadToExit()) << "Thread joining failed"; } template From 3c9a13c5cd289aeb3b6524fca1e34bfe8ccf990e Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 29 Aug 2014 11:45:37 +0800 Subject: [PATCH 0618/2053] Move transform param one level up in the proto to reduce redundancy --- .../cifar10/cifar10_full_train_test.prototxt | 12 +- .../cifar10/cifar10_quick_train_test.prototxt | 12 +- .../feature_extraction/imagenet_val.prototxt | 10 +- examples/imagenet/alexnet_train_val.prototxt | 20 +-- examples/imagenet/imagenet_train_val.prototxt | 20 +-- .../mnist/lenet_consolidated_solver.prototxt | 18 +-- examples/mnist/lenet_train_test.prototxt | 12 +- examples/mnist/mnist_autoencoder.prototxt | 12 +- include/caffe/data_layers.hpp | 17 ++- src/caffe/layers/data_layer.cpp | 6 +- src/caffe/layers/image_data_layer.cpp | 8 +- src/caffe/layers/memory_data_layer.cpp | 42 +++--- src/caffe/proto/caffe.proto | 50 ++++--- src/caffe/test/test_data_layer.cpp | 8 +- src/caffe/test/test_net.cpp | 24 ++-- src/caffe/test/test_split_layer.cpp | 10 +- src/caffe/test/test_upgrade_proto.cpp | 52 +++---- src/caffe/util/upgrade_proto.cpp | 129 +++++------------- 18 files changed, 207 insertions(+), 255 deletions(-) diff --git a/examples/cifar10/cifar10_full_train_test.prototxt b/examples/cifar10/cifar10_full_train_test.prototxt index ffecceb2a39..8fde19f046e 100644 --- a/examples/cifar10/cifar10_full_train_test.prototxt +++ b/examples/cifar10/cifar10_full_train_test.prototxt @@ -7,9 +7,9 @@ layers { data_param { source: "examples/cifar10/cifar10_train_leveldb" batch_size: 100 - transform_param { - mean_file: "examples/cifar10/mean.binaryproto" - } + } + transform_param { + mean_file: "examples/cifar10/mean.binaryproto" } include: { phase: TRAIN } } @@ -21,9 +21,9 @@ layers { data_param { source: "examples/cifar10/cifar10_test_leveldb" batch_size: 100 - transform_param { - mean_file: "examples/cifar10/mean.binaryproto" - } + } + transform_param { + mean_file: "examples/cifar10/mean.binaryproto" } include: { phase: TEST } } diff --git a/examples/cifar10/cifar10_quick_train_test.prototxt b/examples/cifar10/cifar10_quick_train_test.prototxt index f708798c71c..409cfe809f4 100644 --- a/examples/cifar10/cifar10_quick_train_test.prototxt +++ b/examples/cifar10/cifar10_quick_train_test.prototxt @@ -7,9 +7,9 @@ layers { data_param { source: "examples/cifar10/cifar10_train_leveldb" batch_size: 100 - transform_param { - mean_file: "examples/cifar10/mean.binaryproto" - } + } + transform_param { + mean_file: "examples/cifar10/mean.binaryproto" } include: { phase: TRAIN } } @@ -21,9 +21,9 @@ layers { data_param { source: "examples/cifar10/cifar10_test_leveldb" batch_size: 100 - transform_param { - mean_file: "examples/cifar10/mean.binaryproto" - } + } + transform_param { + mean_file: "examples/cifar10/mean.binaryproto" } include: { phase: TEST } } diff --git a/examples/feature_extraction/imagenet_val.prototxt b/examples/feature_extraction/imagenet_val.prototxt index 8d5b07626b5..32310904a66 100644 --- a/examples/feature_extraction/imagenet_val.prototxt +++ b/examples/feature_extraction/imagenet_val.prototxt @@ -9,11 +9,11 @@ layers { batch_size: 50 new_height: 256 new_width: 256 - transform_param { - crop_size: 227 - mean_file: "$CAFFE_DIR/data/ilsvrc12/imagenet_mean.binaryproto" - mirror: false - } + } + transform_param { + crop_size: 227 + mean_file: "$CAFFE_DIR/data/ilsvrc12/imagenet_mean.binaryproto" + mirror: false } } layers { diff --git a/examples/imagenet/alexnet_train_val.prototxt b/examples/imagenet/alexnet_train_val.prototxt index b0f5815e007..3fa46773403 100644 --- a/examples/imagenet/alexnet_train_val.prototxt +++ b/examples/imagenet/alexnet_train_val.prototxt @@ -7,11 +7,11 @@ layers { data_param { source: "examples/imagenet/ilsvrc12_train_leveldb" batch_size: 256 - transform_param { - crop_size: 227 - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: true - } + } + transform_param { + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + mirror: true } include: { phase: TRAIN } } @@ -23,11 +23,11 @@ layers { data_param { source: "examples/imagenet/ilsvrc12_val_leveldb" batch_size: 50 - transform_param { - crop_size: 227 - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: false - } + } + transform_param { + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + mirror: false } include: { phase: TEST } } diff --git a/examples/imagenet/imagenet_train_val.prototxt b/examples/imagenet/imagenet_train_val.prototxt index 766d546a385..d6d64073619 100644 --- a/examples/imagenet/imagenet_train_val.prototxt +++ b/examples/imagenet/imagenet_train_val.prototxt @@ -7,11 +7,11 @@ layers { data_param { source: "examples/imagenet/ilsvrc12_train_leveldb" batch_size: 256 - transform_param { - crop_size: 227 - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: true - } + } + transform_param { + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + mirror: true } include: { phase: TRAIN } } @@ -23,11 +23,11 @@ layers { data_param { source: "examples/imagenet/ilsvrc12_val_leveldb" batch_size: 50 - transform_param { - crop_size: 227 - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: false - } + } + transform_param { + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + mirror: false } include: { phase: TEST } } diff --git a/examples/mnist/lenet_consolidated_solver.prototxt b/examples/mnist/lenet_consolidated_solver.prototxt index f57d086c671..b81f30f2c10 100644 --- a/examples/mnist/lenet_consolidated_solver.prototxt +++ b/examples/mnist/lenet_consolidated_solver.prototxt @@ -53,9 +53,9 @@ net_param { source: "examples/mnist/mnist_train_lmdb" backend: LMDB batch_size: 64 - transform_param { - scale: 0.00390625 - } + } + transform_param { + scale: 0.00390625 } include: { phase: TRAIN } } @@ -68,9 +68,9 @@ net_param { source: "examples/mnist/mnist_test_lmdb" backend: LMDB batch_size: 100 - transform_param { - scale: 0.00390625 - } + } + transform_param { + scale: 0.00390625 } include: { phase: TEST @@ -86,9 +86,9 @@ net_param { source: "examples/mnist/mnist_train_lmdb" backend: LMDB batch_size: 100 - transform_param { - scale: 0.00390625 - } + } + transform_param { + scale: 0.00390625 } include: { phase: TEST diff --git a/examples/mnist/lenet_train_test.prototxt b/examples/mnist/lenet_train_test.prototxt index e4d65892f37..2bd960b56aa 100644 --- a/examples/mnist/lenet_train_test.prototxt +++ b/examples/mnist/lenet_train_test.prototxt @@ -8,9 +8,9 @@ layers { source: "examples/mnist/mnist_train_lmdb" backend: LMDB batch_size: 64 - transform_param { - scale: 0.00390625 - } + } + transform_param { + scale: 0.00390625 } include: { phase: TRAIN } } @@ -23,9 +23,9 @@ layers { source: "examples/mnist/mnist_test_lmdb" backend: LMDB batch_size: 100 - transform_param { - scale: 0.00390625 - } + } + transform_param { + scale: 0.00390625 } include: { phase: TEST } } diff --git a/examples/mnist/mnist_autoencoder.prototxt b/examples/mnist/mnist_autoencoder.prototxt index 45d0802339e..b4345e71ce4 100644 --- a/examples/mnist/mnist_autoencoder.prototxt +++ b/examples/mnist/mnist_autoencoder.prototxt @@ -7,9 +7,9 @@ layers { source: "examples/mnist/mnist_train_lmdb" backend: LMDB batch_size: 100 - transform_param { - scale: 0.0039215684 - } + } + transform_param { + scale: 0.0039215684 } include: { phase: TRAIN } } @@ -21,9 +21,9 @@ layers { source: "examples/mnist/mnist_train_lmdb" backend: LMDB batch_size: 100 - transform_param { - scale: 0.0039215684 - } + } + transform_param { + scale: 0.0039215684 } include: { phase: TEST diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 1f33748ac99..4002a00e11c 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -30,7 +30,8 @@ class BaseDataLayer : public Layer { public: explicit BaseDataLayer(const LayerParameter& param) : Layer(param), - data_transformer_(param.data_param().transform_param()) {} + transform_param_(param.transform_param()), + data_transformer_(transform_param_) {} virtual ~BaseDataLayer() {} // LayerSetUp: implements common data layer setup functionality, and calls // DataLayerSetUp to do special data layer setup for individual layer types. @@ -51,6 +52,7 @@ class BaseDataLayer : public Layer { int datum_size() const { return datum_size_; } protected: + TransformationParameter transform_param_; DataTransformer data_transformer_; int datum_channels_; int datum_height_; @@ -238,8 +240,8 @@ template class MemoryDataLayer : public BaseDataLayer { public: explicit MemoryDataLayer(const LayerParameter& param) - : BaseDataLayer(param), is_data_set_up_(false) {} - virtual void LayerSetUp(const vector*>& bottom, + : BaseDataLayer(param), has_new_data_(false) {} + virtual void DataLayerSetUp(const vector*>& bottom, vector*>* top); virtual inline LayerParameter_LayerType type() const { @@ -253,7 +255,8 @@ class MemoryDataLayer : public BaseDataLayer { void Reset(Dtype* data, Dtype* label, int n); virtual void AddImagesAndLabels(const vector& images, - const vector& labels); + const vector& labels, + const bool is_color_images = true); int batch_size() { return batch_size_; } @@ -261,12 +264,14 @@ class MemoryDataLayer : public BaseDataLayer { virtual void Forward_cpu(const vector*>& bottom, vector*>* top); + int batch_size_; Dtype* data_; Dtype* labels_; - int batch_size_; int n_; int pos_; - bool is_data_set_up_; + Blob added_data_; + Blob added_label_; + bool has_new_data_; }; template diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index b57ca587749..715960be302 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -175,7 +175,7 @@ void DataLayer::DataLayerSetUp(const vector*>& bottom, } // image - int crop_size = this->layer_param_.data_param().transform_param().crop_size(); + int crop_size = this->layer_param_.transform_param().crop_size(); if (crop_size > 0) { (*top)[0]->Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), crop_size, crop_size); @@ -205,9 +205,9 @@ void DataLayer::DataLayerSetUp(const vector*>& bottom, CHECK_GT(this->datum_height_, crop_size); CHECK_GT(this->datum_width_, crop_size); // check if we want to have mean - if (this->layer_param_.data_param().transform_param().has_mean_file()) { + if (this->transform_param_.has_mean_file()) { const string& mean_file = - this->layer_param_.data_param().transform_param().mean_file(); + this->transform_param_.mean_file(); LOG(INFO) << "Loading mean file from" << mean_file; BlobProto blob_proto; ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 72b14832358..4d4f62eb361 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -99,11 +99,9 @@ void ImageDataLayer::DataLayerSetUp(const vector*>& bottom, CHECK(ReadImageToDatum(lines_[lines_id_].first, lines_[lines_id_].second, new_height, new_width, &datum)); // image - const int crop_size = this->layer_param_.image_data_param() - .transform_param().crop_size(); + const int crop_size = this->layer_param_.transform_param().crop_size(); const int batch_size = this->layer_param_.image_data_param().batch_size(); - const string& mean_file = this->layer_param_.image_data_param() - .transform_param().mean_file(); + const string& mean_file = this->layer_param_.transform_param().mean_file(); if (crop_size > 0) { (*top)[0]->Reshape(batch_size, datum.channels(), crop_size, crop_size); this->prefetch_data_.Reshape(batch_size, datum.channels(), crop_size, @@ -128,7 +126,7 @@ void ImageDataLayer::DataLayerSetUp(const vector*>& bottom, CHECK_GT(this->datum_height_, crop_size); CHECK_GT(this->datum_width_, crop_size); // check if we want to have mean - if (this->layer_param_.image_data_param().transform_param().has_mean_file()) { + if (this->layer_param_.transform_param().has_mean_file()) { BlobProto blob_proto; LOG(INFO) << "Loading mean file from" << mean_file; ReadProtoFromBinaryFile(mean_file.c_str(), &blob_proto); diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index d482df52d00..60dc65868b7 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -2,11 +2,12 @@ #include "caffe/data_layers.hpp" #include "caffe/layer.hpp" +#include "caffe/util/io.hpp" namespace caffe { template -void MemoryDataLayer::LayerSetUp(const vector*>& bottom, +void MemoryDataLayer::DataLayerSetUp(const vector*>& bottom, vector*>* top) { batch_size_ = this->layer_param_.memory_data_param().batch_size(); this->datum_channels_ = this->layer_param_.memory_data_param().channels(); @@ -42,32 +43,37 @@ void MemoryDataLayer::Forward_cpu(const vector*>& bottom, (*top)[0]->set_cpu_data(data_ + pos_ * this->datum_size_); (*top)[1]->set_cpu_data(labels_ + pos_); pos_ = (pos_ + batch_size_) % n_; + has_new_data_ = false; } template void MemoryDataLayer::AddImagesAndLabels( - const vector& images, const vector& labels) { + const vector& images, const vector& labels, + const bool is_color_images) { + CHECK(!has_new_data_) << + "There are pending images that haven't been consumed"; size_t num_images = images.size(); CHECK_GT(num_images, 0) << "There is no image to add"; - CHECK_LE(num_images, batch_size_)<< - "The number of added images " << images.size() << - " must be no greater than the batch size " << batch_size; - CHECK_LE(num_images, labels.size()) << - "The number of images " << images.size() << - " must be no greater than the number of labels " << labels.size(); + CHECK_EQ(num_images, batch_size_) << + "The number of added images must be equal to the batch size"; + CHECK_EQ(num_images, labels.size()) << + "The number of images must be equal to the number of labels"; Datum datum; - Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); - Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); - // Apply data transformations (mirror, scale, crop...) - this->data_transformer_.Transform(item_id, datum, mean, top_data); - int image_id; - for (int item_id = 0; item_id < batch_size; ++item_id) { - image_id = item_id % num_images; - OpenCVImageToDatum(images[image_id], labels[image_id], new_height, - new_width, &datum); - this->data_transformer_.Transform(item_id, datum, mean, top_data); + Dtype* top_data = added_data_.mutable_cpu_data(); + Dtype* top_label = added_label_.mutable_cpu_data(); + const Dtype* mean = this->data_mean_.cpu_data(); + for (int batch_item_id = 0; batch_item_id < num_images; ++batch_item_id) { + OpenCVImageToDatum( + images[batch_item_id], labels[batch_item_id], this->datum_height_, + this->datum_width_, &datum); + // Apply data transformations (mirror, scale, crop...) + this->data_transformer_.Transform(batch_item_id, datum, mean, top_data); + top_label[batch_item_id] = labels[batch_item_id]; } + // num_images == batch_size_ + Reset(top_data, top_label, batch_size_); + has_new_data_ = true; } INSTANTIATE_CLASS(MemoryDataLayer); diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 5acc776fb99..74c2bab73eb 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -195,7 +195,7 @@ message NetStateRule { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 36 (last added: loss_weight) +// LayerParameter next available ID: 37 (last added: transform_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs @@ -307,6 +307,9 @@ message LayerParameter { optional HingeLossParameter hinge_loss_param = 29; optional SliceParameter slice_param = 31; optional MVNParameter mvn_param = 34; + + // Parameters for data pre-processing. + optional TransformationParameter transform_param = 36; // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new @@ -314,6 +317,20 @@ message LayerParameter { optional V0LayerParameter layer = 1; } +// Message that stores parameters used to apply transformation +// to the data layer's data +message TransformationParameter { + // For data pre-processing, we can do simple scaling and subtracting the + // data mean, if provided. Note that the mean subtraction is always carried + // out before scaling. + optional float scale = 1 [default = 1]; + // Specify if we want to randomly mirror data. + optional bool mirror = 2 [default = false]; + // Specify if we would like to randomly crop an image. + optional uint32 crop_size = 3 [default = 0]; + optional string mean_file = 4; +} + // Message that stores parameters used by AccuracyLayer message AccuracyParameter { // When computing accuracy, count as correct by comparing the true label to @@ -357,20 +374,6 @@ message ConvolutionParameter { optional FillerParameter bias_filler = 8; // The filler for the bias } -// Message that stores parameters used to apply transformation -// to the data layer's data -message TransformationParameter { - // For data pre-processing, we can do simple scaling and subtracting the - // data mean, if provided. Note that the mean subtraction is always carried - // out before scaling. - optional float scale = 1 [default = 1]; - // Specify if we want to randomly mirror data. - optional bool mirror = 2 [default = false]; - // Specify if we would like to randomly crop an image. - optional uint32 crop_size = 3 [default = 0]; - optional string mean_file = 4; -} - // Message that stores parameters used by DataLayer message DataParameter { enum DB { @@ -387,17 +390,15 @@ message DataParameter { // be larger than the number of keys in the leveldb. optional uint32 rand_skip = 7 [default = 0]; optional DB backend = 8 [default = LEVELDB]; - // Parameters for data pre-processing. - optional TransformationParameter transform_param = 9; - // DEPRECATED. See TransformParameter. For data pre-processing, we can do + // DEPRECATED. See TransformationParameter. For data pre-processing, we can do // simple scaling and subtracting the data mean, if provided. Note that the // mean subtraction is always carried out before scaling. optional float scale = 2 [default = 1]; optional string mean_file = 3; - // DEPRECATED. See TransformParameter. Specify if we would like to randomly + // DEPRECATED. See TransformationParameter. Specify if we would like to randomly // crop an image. optional uint32 crop_size = 5 [default = 0]; - // DEPRECATED. See TransformParameter. Specify if we want to randomly mirror + // DEPRECATED. See TransformationParameter. Specify if we want to randomly mirror // data. optional bool mirror = 6 [default = false]; } @@ -482,17 +483,15 @@ message ImageDataParameter { // It will also resize images if new_height or new_width are not zero. optional uint32 new_height = 9 [default = 0]; optional uint32 new_width = 10 [default = 0]; - // Parameters for data pre-processing. - optional TransformationParameter transform_param = 11; - // DEPRECATED. See TransformParameter. For data pre-processing, we can do + // DEPRECATED. See TransformationParameter. For data pre-processing, we can do // simple scaling and subtracting the data mean, if provided. Note that the // mean subtraction is always carried out before scaling. optional float scale = 2 [default = 1]; optional string mean_file = 3; - // DEPRECATED. See TransformParameter. Specify if we would like to randomly + // DEPRECATED. See TransformationParameter. Specify if we would like to randomly // crop an image. optional uint32 crop_size = 5 [default = 0]; - // DEPRECATED. See TransformParameter. Specify if we want to randomly mirror + // DEPRECATED. See TransformationParameter. Specify if we want to randomly mirror // data. optional bool mirror = 6 [default = false]; } @@ -529,7 +528,6 @@ message MemoryDataParameter { optional uint32 channels = 2; optional uint32 height = 3; optional uint32 width = 4; - optional TransformationParameter transform_param = 5; } // Message that stores parameters used by MVNLayer diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 52cc2c082a9..e01932b7f1f 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -118,7 +118,7 @@ class DataLayerTest : public MultiDeviceTest { data_param->set_backend(backend_); TransformationParameter* transform_param = - data_param->mutable_transform_param(); + param.mutable_transform_param(); transform_param->set_scale(scale); DataLayer layer(param); @@ -157,7 +157,7 @@ class DataLayerTest : public MultiDeviceTest { data_param->set_backend(backend_); TransformationParameter* transform_param = - data_param->mutable_transform_param(); + param.mutable_transform_param(); transform_param->set_scale(scale); transform_param->set_crop_size(1); @@ -207,7 +207,7 @@ class DataLayerTest : public MultiDeviceTest { data_param->set_backend(backend_); TransformationParameter* transform_param = - data_param->mutable_transform_param(); + param.mutable_transform_param(); transform_param->set_crop_size(1); transform_param->set_mirror(true); @@ -261,7 +261,7 @@ class DataLayerTest : public MultiDeviceTest { data_param->set_backend(backend_); TransformationParameter* transform_param = - data_param->mutable_transform_param(); + param.mutable_transform_param(); transform_param->set_crop_size(1); transform_param->set_mirror(true); diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index f0a368245a5..24f72aef3af 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -1177,11 +1177,11 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'label' " " data_param { " " source: 'mnist-train-leveldb' " - " transform_param { " - " scale: 0.00390625 " - " } " " batch_size: 64 " " } " + " transform_param { " + " scale: 0.00390625 " + " } " " include: { phase: TRAIN } " "} " "layers { " @@ -1191,11 +1191,11 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'label' " " data_param { " " source: 'mnist-test-leveldb' " - " transform_param { " - " scale: 0.00390625 " - " } " " batch_size: 100 " " } " + " transform_param { " + " scale: 0.00390625 " + " } " " include: { phase: TEST } " "} " "layers { " @@ -1260,11 +1260,11 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'label' " " data_param { " " source: 'mnist-train-leveldb' " - " transform_param { " - " scale: 0.00390625 " - " } " " batch_size: 64 " " } " + " transform_param { " + " scale: 0.00390625 " + " } " " include: { phase: TRAIN } " "} " "layers { " @@ -1319,11 +1319,11 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'label' " " data_param { " " source: 'mnist-test-leveldb' " - " transform_param { " - " scale: 0.00390625 " - " } " " batch_size: 100 " " } " + " transform_param { " + " scale: 0.00390625 " + " } " " include: { phase: TEST } " "} " "layers { " diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index bee73f64568..e9b942c5c51 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -181,11 +181,11 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " - " transform_param { " - " crop_size: 227 " - " mirror: true " - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " - " } " + " } " + " transform_param { " + " crop_size: 227 " + " mirror: true " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " " } " " top: 'data' " " top: 'label' " diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index 9d0cd58d84c..f46a0e823c1 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -1190,11 +1190,11 @@ TEST_F(V0UpgradeTest, TestSimple) { " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " - " transform_param { " - " crop_size: 227 " - " mirror: true " - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " - " } " + " } " + " transform_param { " + " crop_size: 227 " + " mirror: true " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " " } " " top: 'data' " " top: 'label' " @@ -1526,14 +1526,14 @@ TEST_F(V0UpgradeTest, TestAllParams) { " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " - " transform_param { " - " crop_size: 227 " - " mirror: true " - " scale: 0.25 " - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " - " } " " rand_skip: 73 " " } " + " transform_param { " + " crop_size: 227 " + " mirror: true " + " scale: 0.25 " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " + " } " " top: 'data' " " top: 'label' " "} " @@ -1543,17 +1543,17 @@ TEST_F(V0UpgradeTest, TestAllParams) { " image_data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-images' " " batch_size: 256 " - " transform_param {" - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " - " crop_size: 227 " - " mirror: true " - " scale: 0.25 " - " } " " rand_skip: 73 " " shuffle: true " " new_height: 40 " " new_width: 30 " " } " + " transform_param {" + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " + " crop_size: 227 " + " mirror: true " + " scale: 0.25 " + " } " " top: 'images_data' " " top: 'images_label' " "} " @@ -1562,16 +1562,18 @@ TEST_F(V0UpgradeTest, TestAllParams) { " type: WINDOW_DATA " " window_data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " " batch_size: 256 " - " crop_size: 227 " - " mirror: true " " fg_threshold: 0.25 " " bg_threshold: 0.75 " " fg_fraction: 0.5 " " context_pad: 16 " " crop_mode: 'square' " " } " + " transform_param { " + " mirror: true " + " crop_size: 227 " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " + " }" " top: 'window_data' " " top: 'window_label' " "} " @@ -2126,11 +2128,11 @@ TEST_F(V0UpgradeTest, TestImageNet) { " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " - " transform_param { " - " crop_size: 227 " - " mirror: true " - " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " - " } " + " } " + " transform_param { " + " crop_size: 227 " + " mirror: true " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " " } " " top: 'data' " " top: 'label' " diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index 9045abbe17d..c3d854c0595 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -306,31 +306,12 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, } } if (v0_layer_param.has_scale()) { - if (type == "data") { - layer_param->mutable_data_param()->mutable_transform_param()-> - set_scale(v0_layer_param.scale()); - } else if (type == "images") { - layer_param->mutable_image_data_param()->mutable_transform_param()-> - set_scale(v0_layer_param.scale()); - } else { - LOG(ERROR) << "Unknown parameter scale for layer type " << type; - is_fully_compatible = false; - } + layer_param->mutable_transform_param()-> + set_scale(v0_layer_param.scale()); } if (v0_layer_param.has_meanfile()) { - if (type == "data") { - layer_param->mutable_data_param()->mutable_transform_param()-> - set_mean_file(v0_layer_param.meanfile()); - } else if (type == "images") { - layer_param->mutable_image_data_param()->mutable_transform_param()-> - set_mean_file(v0_layer_param.meanfile()); - } else if (type == "window_data") { - layer_param->mutable_window_data_param()->set_mean_file( - v0_layer_param.meanfile()); - } else { - LOG(ERROR) << "Unknown parameter meanfile for layer type " << type; - is_fully_compatible = false; - } + layer_param->mutable_transform_param()-> + set_mean_file(v0_layer_param.meanfile()); } if (v0_layer_param.has_batchsize()) { if (type == "data") { @@ -351,34 +332,12 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, } } if (v0_layer_param.has_cropsize()) { - if (type == "data") { - layer_param->mutable_data_param()->mutable_transform_param()-> - set_crop_size(v0_layer_param.cropsize()); - } else if (type == "images") { - layer_param->mutable_image_data_param()->mutable_transform_param()-> - set_crop_size(v0_layer_param.cropsize()); - } else if (type == "window_data") { - layer_param->mutable_window_data_param()->set_crop_size( - v0_layer_param.cropsize()); - } else { - LOG(ERROR) << "Unknown parameter cropsize for layer type " << type; - is_fully_compatible = false; - } + layer_param->mutable_transform_param()-> + set_crop_size(v0_layer_param.cropsize()); } if (v0_layer_param.has_mirror()) { - if (type == "data") { - layer_param->mutable_data_param()->mutable_transform_param()-> - set_mirror(v0_layer_param.mirror()); - } else if (type == "images") { - layer_param->mutable_image_data_param()->mutable_transform_param()-> - set_mirror(v0_layer_param.mirror()); - } else if (type == "window_data") { - layer_param->mutable_window_data_param()->set_mirror( - v0_layer_param.mirror()); - } else { - LOG(ERROR) << "Unknown parameter mirror for layer type " << type; - is_fully_compatible = false; - } + layer_param->mutable_transform_param()-> + set_mirror(v0_layer_param.mirror()); } if (v0_layer_param.has_rand_skip()) { if (type == "data") { @@ -567,52 +526,36 @@ bool NetNeedsDataUpgrade(const NetParameter& net_param) { return false; } +#define CONVERT_LAYER_TRANSFORM_PARAM(TYPE, Name, param_name) \ + do { \ + if (net_param->layers(i).type() == LayerParameter_LayerType_##TYPE) { \ + Name##Parameter* layer_param = \ + net_param->mutable_layers(i)->mutable_##param_name##_param(); \ + TransformationParameter* transform_param = \ + net_param->mutable_layers(i)->mutable_transform_param(); \ + if (layer_param->has_scale()) { \ + transform_param->set_scale(layer_param->scale()); \ + layer_param->clear_scale(); \ + } \ + if (layer_param->has_mean_file()) { \ + transform_param->set_mean_file(layer_param->mean_file()); \ + layer_param->clear_mean_file(); \ + } \ + if (layer_param->has_crop_size()) { \ + transform_param->set_crop_size(layer_param->crop_size()); \ + layer_param->clear_crop_size(); \ + } \ + if (layer_param->has_mirror()) { \ + transform_param->set_mirror(layer_param->mirror()); \ + layer_param->clear_mirror(); \ + } \ + } \ + } while (0) + void UpgradeNetDataTransformation(NetParameter* net_param) { for (int i = 0; i < net_param->layers_size(); ++i) { - if (net_param->layers(i).type() == LayerParameter_LayerType_DATA) { - DataParameter* layer_param = - net_param->mutable_layers(i)->mutable_data_param(); - TransformationParameter* transform_param = - layer_param->mutable_transform_param(); - if (layer_param->has_scale()) { - transform_param->set_scale(layer_param->scale()); - layer_param->clear_scale(); - } - if (layer_param->has_mean_file()) { - transform_param->set_mean_file(layer_param->mean_file()); - layer_param->clear_mean_file(); - } - if (layer_param->has_crop_size()) { - transform_param->set_crop_size(layer_param->crop_size()); - layer_param->clear_crop_size(); - } - if (layer_param->has_mirror()) { - transform_param->set_mirror(layer_param->mirror()); - layer_param->clear_mirror(); - } - } - if (net_param->layers(i).type() == LayerParameter_LayerType_IMAGE_DATA) { - ImageDataParameter* layer_param = - net_param->mutable_layers(i)->mutable_image_data_param(); - TransformationParameter* transform_param = - layer_param->mutable_transform_param(); - if (layer_param->has_scale()) { - transform_param->set_scale(layer_param->scale()); - layer_param->clear_scale(); - } - if (layer_param->has_mean_file()) { - transform_param->set_mean_file(layer_param->mean_file()); - layer_param->clear_mean_file(); - } - if (layer_param->has_crop_size()) { - transform_param->set_crop_size(layer_param->crop_size()); - layer_param->clear_crop_size(); - } - if (layer_param->has_mirror()) { - transform_param->set_mirror(layer_param->mirror()); - layer_param->clear_mirror(); - } - } + CONVERT_LAYER_TRANSFORM_PARAM(DATA, Data, data); + CONVERT_LAYER_TRANSFORM_PARAM(IMAGE_DATA, ImageData, image_data); } } From 05ade8171c8fff8c73a4febe4ecd64322444cba2 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 29 Aug 2014 16:36:04 +0800 Subject: [PATCH 0619/2053] Test adding images w/o resizing to the memory data layer --- include/caffe/data_layers.hpp | 2 + src/caffe/layers/memory_data_layer.cpp | 7 ++ src/caffe/test/test_memory_data_layer.cpp | 96 ++++++++++++++++++++--- 3 files changed, 95 insertions(+), 10 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 4002a00e11c..cdd1b89ecd3 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -254,6 +254,8 @@ class MemoryDataLayer : public BaseDataLayer { // will be given to Blob, which is mutable void Reset(Dtype* data, Dtype* label, int n); + virtual void AddImages(const vector& images, + const bool is_color_images = true); virtual void AddImagesAndLabels(const vector& images, const vector& labels, const bool is_color_images = true); diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 60dc65868b7..1d48a49b841 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -46,6 +46,13 @@ void MemoryDataLayer::Forward_cpu(const vector*>& bottom, has_new_data_ = false; } +template +void MemoryDataLayer::AddImages( + const vector& images, const bool is_color_images) { + const vector fake_labels(images.size(), 0); + AddImagesAndLabels(images, fake_labels, is_color_images); +} + template void MemoryDataLayer::AddImagesAndLabels( const vector& images, const vector& labels, diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index f401bb0f4f2..39b97d863ae 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -1,20 +1,25 @@ +#include + #include +#include "caffe/data_layers.hpp" #include "caffe/filler.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/test/test_caffe_main.hpp" namespace caffe { -template -class MemoryDataLayerTest : public ::testing::Test { +template +class MemoryDataLayerTest : public MultiDeviceTest { + typedef typename TypeParam::Dtype Dtype; + protected: MemoryDataLayerTest() : data_(new Blob()), labels_(new Blob()), data_blob_(new Blob()), - label_blob_(new Blob()) {} + label_blob_(new Blob()), + image_(cv::imread("examples/images/cat.jpg", CV_LOAD_IMAGE_COLOR)) {} virtual void SetUp() { batch_size_ = 8; batches_ = 12; @@ -30,6 +35,9 @@ class MemoryDataLayerTest : public ::testing::Test { labels_->Reshape(batches_ * batch_size_, 1, 1, 1); filler.Fill(this->data_); filler.Fill(this->labels_); + for (int i = 0; i < batch_size_; ++i) { + image_labels_.push_back(i); + } } virtual ~MemoryDataLayerTest() { @@ -52,19 +60,23 @@ class MemoryDataLayerTest : public ::testing::Test { Blob* const label_blob_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; + const cv::Mat image_; + vector image_labels_; }; -TYPED_TEST_CASE(MemoryDataLayerTest, TestDtypes); +TYPED_TEST_CASE(MemoryDataLayerTest, TestDtypesAndDevices); TYPED_TEST(MemoryDataLayerTest, TestSetup) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; MemoryDataParameter* md_param = layer_param.mutable_memory_data_param(); md_param->set_batch_size(this->batch_size_); md_param->set_channels(this->channels_); md_param->set_height(this->height_); md_param->set_width(this->width_); - shared_ptr > layer( - new MemoryDataLayer(layer_param)); + shared_ptr > layer( + new MemoryDataLayer(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->data_blob_->num(), this->batch_size_); EXPECT_EQ(this->data_blob_->channels(), this->channels_); @@ -78,15 +90,17 @@ TYPED_TEST(MemoryDataLayerTest, TestSetup) { // run through a few batches and check that the right data appears TYPED_TEST(MemoryDataLayerTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; MemoryDataParameter* md_param = layer_param.mutable_memory_data_param(); md_param->set_batch_size(this->batch_size_); md_param->set_channels(this->channels_); md_param->set_height(this->height_); md_param->set_width(this->width_); - shared_ptr > layer( - new MemoryDataLayer(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + shared_ptr > layer( + new MemoryDataLayer(layer_param)); + layer->DataLayerSetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Reset(this->data_->mutable_cpu_data(), this->labels_->mutable_cpu_data(), this->data_->num()); for (int i = 0; i < this->batches_ * 6; ++i) { @@ -104,4 +118,66 @@ TYPED_TEST(MemoryDataLayerTest, TestForward) { } } +TYPED_TEST(MemoryDataLayerTest, TestAddImagesAndLabels) { + typedef typename TypeParam::Dtype Dtype; + + LayerParameter param; + MemoryDataParameter* memory_data_param = param.mutable_memory_data_param(); + memory_data_param->set_batch_size(this->batch_size_); + memory_data_param->set_channels(this->image_.channels()); + memory_data_param->set_height(this->image_.rows); + memory_data_param->set_width(this->image_.cols); + MemoryDataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + cv::Mat image = this->image_; + vector images(this->batch_size_, image); + layer.AddImagesAndLabels(images, this->image_labels_); + // Go through the data 5 times + for (int iter = 0; iter < 5; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + const Dtype* data = this->data_blob_->cpu_data(); + for (int i = 0, index = 0; i < this->batch_size_; ++i) { + EXPECT_EQ(i, this->label_blob_->cpu_data()[i]); + for (int c = 0; c < image.channels(); ++c) { + for (int h = 0; h < image.rows; ++h) { + for (int w = 0; w < image.cols; ++w) { + EXPECT_EQ(static_cast(image.at(h, w)[c]), + data[index++]); + } + } + } + } + } +} + +TYPED_TEST(MemoryDataLayerTest, TestAddImagesAndLabelsResize) { + typedef typename TypeParam::Dtype Dtype; + + const int resize_height = 256; + const int resize_width = 256; + LayerParameter param; + MemoryDataParameter* memory_data_param = param.mutable_memory_data_param(); + memory_data_param->set_batch_size(this->batch_size_); + memory_data_param->set_channels(this->image_.channels()); + memory_data_param->set_height(resize_height); + memory_data_param->set_width(resize_width); + MemoryDataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + EXPECT_EQ(this->data_blob_->num(), this->batch_size_); + EXPECT_EQ(this->data_blob_->channels(), this->image_.channels()); + EXPECT_EQ(this->data_blob_->height(), resize_height); + EXPECT_EQ(this->data_blob_->width(), resize_width); + cv::Mat image = this->image_; + vector images(this->batch_size_, image); + layer.AddImagesAndLabels(images, this->image_labels_); + // Go through the data 5 times + for (int iter = 0; iter < 5; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + const Dtype* label_data = this->label_blob_->cpu_data(); + for (int i = 0; i < this->batch_size_; ++i) { + EXPECT_EQ(i, label_data[i]); + } + } +} + } // namespace caffe From 20c59928431abafbdb4c02c8e012234d8c53a3f5 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Fri, 29 Aug 2014 16:37:59 +0800 Subject: [PATCH 0620/2053] Move the rest duplicate codes of the data layers into their base class --- include/caffe/data_layers.hpp | 15 ++++---- src/caffe/layers/base_data_layer.cpp | 48 ++++++++++++++++++++++++++ src/caffe/layers/data_layer.cpp | 34 +----------------- src/caffe/layers/image_data_layer.cpp | 31 +---------------- src/caffe/layers/memory_data_layer.cpp | 9 +++-- src/caffe/layers/window_data_layer.cpp | 26 -------------- 6 files changed, 66 insertions(+), 97 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index cdd1b89ecd3..8c1b3f90e27 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -28,15 +28,12 @@ namespace caffe { template class BaseDataLayer : public Layer { public: - explicit BaseDataLayer(const LayerParameter& param) - : Layer(param), - transform_param_(param.transform_param()), - data_transformer_(transform_param_) {} + explicit BaseDataLayer(const LayerParameter& param); virtual ~BaseDataLayer() {} // LayerSetUp: implements common data layer setup functionality, and calls // DataLayerSetUp to do special data layer setup for individual layer types. - // This method may not be overridden. - void LayerSetUp(const vector*>& bottom, + // This method may not be overridden except by the BasePrefetchingDataLayer. + virtual void LayerSetUp(const vector*>& bottom, vector*>* top); virtual void DataLayerSetUp(const vector*>& bottom, vector*>* top) {} @@ -59,6 +56,7 @@ class BaseDataLayer : public Layer { int datum_width_; int datum_size_; Blob data_mean_; + const Dtype* mean_; Caffe::Phase phase_; bool output_labels_; }; @@ -70,6 +68,11 @@ class BasePrefetchingDataLayer : explicit BasePrefetchingDataLayer(const LayerParameter& param) : BaseDataLayer(param) {} virtual ~BasePrefetchingDataLayer() {} + // LayerSetUp: implements common data layer setup functionality, and calls + // DataLayerSetUp to do special data layer setup for individual layer types. + // This method may not be overridden. + void LayerSetUp(const vector*>& bottom, + vector*>* top); virtual void Forward_cpu(const vector*>& bottom, vector*>* top); diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 3062cff4741..c31081c3540 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -1,9 +1,18 @@ +#include #include #include "caffe/data_layers.hpp" +#include "caffe/util/io.hpp" namespace caffe { +template +BaseDataLayer::BaseDataLayer(const LayerParameter& param) + : Layer(param), + transform_param_(param.transform_param()), + data_transformer_(transform_param_) { +} + template void BaseDataLayer::LayerSetUp(const vector*>& bottom, vector*>* top) { @@ -13,6 +22,45 @@ void BaseDataLayer::LayerSetUp(const vector*>& bottom, output_labels_ = true; } DataLayerSetUp(bottom, top); + // The subclasses should setup the datum channels, height and width + CHECK_GT(datum_channels_, 0); + CHECK_GT(datum_height_, 0); + CHECK_GT(datum_width_, 0); + CHECK_GT(datum_height_, transform_param_.crop_size()); + CHECK_GT(datum_width_, transform_param_.crop_size()); + // check if we want to have mean + if (transform_param_.has_mean_file()) { + const string& mean_file = transform_param_.mean_file(); + LOG(INFO) << "Loading mean file from" << mean_file; + BlobProto blob_proto; + ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); + data_mean_.FromProto(blob_proto); + CHECK_EQ(data_mean_.num(), 1); + CHECK_EQ(data_mean_.channels(), datum_channels_); + CHECK_EQ(data_mean_.height(), datum_height_); + CHECK_EQ(data_mean_.width(), datum_width_); + } else { + // Simply initialize an all-empty mean. + data_mean_.Reshape(1, datum_channels_, datum_height_, datum_width_); + } + mean_ = data_mean_.cpu_data(); +} + +template +void BasePrefetchingDataLayer::LayerSetUp( + const vector*>& bottom, vector*>* top) { + BaseDataLayer::LayerSetUp(bottom, top); + // Now, start the prefetch thread. Before calling prefetch, we make two + // cpu_data calls so that the prefetch thread does not accidentally make + // simultaneous cudaMalloc calls when the main thread is running. In some + // GPUs this seems to cause failures if we do not so. + this->prefetch_data_.mutable_cpu_data(); + if (this->output_labels_) { + this->prefetch_label_.mutable_cpu_data(); + } + DLOG(INFO) << "Initializing prefetch"; + this->CreatePrefetchThread(); + DLOG(INFO) << "Prefetch initialized."; } template diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 715960be302..7a46a599069 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -26,7 +26,6 @@ void DataLayer::InternalThreadEntry() { } const int batch_size = this->layer_param_.data_param().batch_size(); - const Dtype* mean = this->data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob switch (this->layer_param_.data_param().backend()) { @@ -46,7 +45,7 @@ void DataLayer::InternalThreadEntry() { } // Apply data transformations (mirror, scale, crop...) - this->data_transformer_.Transform(item_id, datum, mean, top_data); + this->data_transformer_.Transform(item_id, datum, this->mean_, top_data); if (this->output_labels_) { top_label[item_id] = datum.label(); @@ -202,37 +201,6 @@ void DataLayer::DataLayerSetUp(const vector*>& bottom, this->datum_height_ = datum.height(); this->datum_width_ = datum.width(); this->datum_size_ = datum.channels() * datum.height() * datum.width(); - CHECK_GT(this->datum_height_, crop_size); - CHECK_GT(this->datum_width_, crop_size); - // check if we want to have mean - if (this->transform_param_.has_mean_file()) { - const string& mean_file = - this->transform_param_.mean_file(); - LOG(INFO) << "Loading mean file from" << mean_file; - BlobProto blob_proto; - ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); - this->data_mean_.FromProto(blob_proto); - CHECK_EQ(this->data_mean_.num(), 1); - CHECK_EQ(this->data_mean_.channels(), this->datum_channels_); - CHECK_EQ(this->data_mean_.height(), this->datum_height_); - CHECK_EQ(this->data_mean_.width(), this->datum_width_); - } else { - // Simply initialize an all-empty mean. - this->data_mean_.Reshape(1, this->datum_channels_, this->datum_height_, - this->datum_width_); - } - // Now, start the prefetch thread. Before calling prefetch, we make two - // cpu_data calls so that the prefetch thread does not accidentally make - // simultaneous cudaMalloc calls when the main thread is running. In some - // GPUs this seems to cause failures if we do not so. - this->prefetch_data_.mutable_cpu_data(); - if (this->output_labels_) { - this->prefetch_label_.mutable_cpu_data(); - } - this->data_mean_.cpu_data(); - DLOG(INFO) << "Initializing prefetch"; - this->CreatePrefetchThread(); - DLOG(INFO) << "Prefetch initialized."; } INSTANTIATE_CLASS(DataLayer); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 4d4f62eb361..9ff1b8e7eb0 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -26,7 +26,6 @@ void ImageDataLayer::InternalThreadEntry() { // datum scales const int lines_size = lines_.size(); - const Dtype* mean = this->data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob CHECK_GT(lines_size, lines_id_); @@ -37,7 +36,7 @@ void ImageDataLayer::InternalThreadEntry() { } // Apply transformations (mirror, crop...) to the data - this->data_transformer_.Transform(item_id, datum, mean, top_data); + this->data_transformer_.Transform(item_id, datum, this->mean_, top_data); top_label[item_id] = datum.label(); // go to the next iter @@ -101,7 +100,6 @@ void ImageDataLayer::DataLayerSetUp(const vector*>& bottom, // image const int crop_size = this->layer_param_.transform_param().crop_size(); const int batch_size = this->layer_param_.image_data_param().batch_size(); - const string& mean_file = this->layer_param_.transform_param().mean_file(); if (crop_size > 0) { (*top)[0]->Reshape(batch_size, datum.channels(), crop_size, crop_size); this->prefetch_data_.Reshape(batch_size, datum.channels(), crop_size, @@ -123,33 +121,6 @@ void ImageDataLayer::DataLayerSetUp(const vector*>& bottom, this->datum_height_ = datum.height(); this->datum_width_ = datum.width(); this->datum_size_ = datum.channels() * datum.height() * datum.width(); - CHECK_GT(this->datum_height_, crop_size); - CHECK_GT(this->datum_width_, crop_size); - // check if we want to have mean - if (this->layer_param_.transform_param().has_mean_file()) { - BlobProto blob_proto; - LOG(INFO) << "Loading mean file from" << mean_file; - ReadProtoFromBinaryFile(mean_file.c_str(), &blob_proto); - this->data_mean_.FromProto(blob_proto); - CHECK_EQ(this->data_mean_.num(), 1); - CHECK_EQ(this->data_mean_.channels(), this->datum_channels_); - CHECK_EQ(this->data_mean_.height(), this->datum_height_); - CHECK_EQ(this->data_mean_.width(), this->datum_width_); - } else { - // Simply initialize an all-empty mean. - this->data_mean_.Reshape(1, this->datum_channels_, this->datum_height_, - this->datum_width_); - } - // Now, start the prefetch thread. Before calling prefetch, we make two - // cpu_data calls so that the prefetch thread does not accidentally make - // simultaneous cudaMalloc calls when the main thread is running. In some - // GPUs this seems to cause failures if we do not so. - this->prefetch_data_.mutable_cpu_data(); - this->prefetch_label_.mutable_cpu_data(); - this->data_mean_.cpu_data(); - DLOG(INFO) << "Initializing prefetch"; - this->CreatePrefetchThread(); - DLOG(INFO) << "Prefetch initialized."; } template diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 1d48a49b841..693c4d51b5f 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -21,8 +21,13 @@ void MemoryDataLayer::DataLayerSetUp(const vector*>& bottom, (*top)[0]->Reshape(batch_size_, this->datum_channels_, this->datum_height_, this->datum_width_); (*top)[1]->Reshape(batch_size_, 1, 1, 1); + added_data_.Reshape(batch_size_, this->datum_channels_, this->datum_height_, + this->datum_width_); + added_label_.Reshape(batch_size_, 1, 1, 1); data_ = NULL; labels_ = NULL; + added_data_.cpu_data(); + added_label_.cpu_data(); } template @@ -69,13 +74,13 @@ void MemoryDataLayer::AddImagesAndLabels( Datum datum; Dtype* top_data = added_data_.mutable_cpu_data(); Dtype* top_label = added_label_.mutable_cpu_data(); - const Dtype* mean = this->data_mean_.cpu_data(); for (int batch_item_id = 0; batch_item_id < num_images; ++batch_item_id) { OpenCVImageToDatum( images[batch_item_id], labels[batch_item_id], this->datum_height_, this->datum_width_, &datum); // Apply data transformations (mirror, scale, crop...) - this->data_transformer_.Transform(batch_item_id, datum, mean, top_data); + this->data_transformer_.Transform(batch_item_id, datum, this->mean_, + top_data); top_label[batch_item_id] = labels[batch_item_id]; } // num_images == batch_size_ diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index f7e8186a477..d8b693d3116 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -375,32 +375,6 @@ void WindowDataLayer::DataLayerSetUp(const vector*>& bottom, // label (*top)[1]->Reshape(batch_size, 1, 1, 1); this->prefetch_label_.Reshape(batch_size, 1, 1, 1); - - // check if we want to have mean - if (this->layer_param_.window_data_param().has_mean_file()) { - const string& mean_file = - this->layer_param_.window_data_param().mean_file(); - LOG(INFO) << "Loading mean file from" << mean_file; - BlobProto blob_proto; - ReadProtoFromBinaryFileOrDie(mean_file, &blob_proto); - this->data_mean_.FromProto(blob_proto); - CHECK_EQ(this->data_mean_.num(), 1); - CHECK_EQ(this->data_mean_.width(), this->data_mean_.height()); - CHECK_EQ(this->data_mean_.channels(), channels); - } else { - // Simply initialize an all-empty mean. - this->data_mean_.Reshape(1, channels, crop_size, crop_size); - } - // Now, start the prefetch thread. Before calling prefetch, we make two - // cpu_data calls so that the prefetch thread does not accidentally make - // simultaneous cudaMalloc calls when the main thread is running. In some - // GPUs this seems to cause failures if we do not so. - this->prefetch_data_.mutable_cpu_data(); - this->prefetch_label_.mutable_cpu_data(); - this->data_mean_.cpu_data(); - DLOG(INFO) << "Initializing prefetch"; - this->CreatePrefetchThread(); - DLOG(INFO) << "Prefetch initialized."; } template From 09cfe1ca4b1410fb41b3969ca4e50c34bef9a8ba Mon Sep 17 00:00:00 2001 From: Kai Li Date: Sun, 31 Aug 2014 00:16:31 +0800 Subject: [PATCH 0621/2053] Fix conflict between nvcc and boost for cmake --- src/caffe/CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index 139185b52dc..86c7c7eb4a3 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -86,6 +86,16 @@ if(NOT CPU_ONLY) -gencode arch=compute_35,code=sm_35 ) +# https://github.com/ComputationalRadiationPhysics/picongpu/blob/master/src/picongpu/CMakeLists.txt + # work-arounds +if(Boost_VERSION EQUAL 105500) + # see https://svn.boost.org/trac/boost/ticket/9392 + message(STATUS "Boost: Applying noinline work around") + # avoid warning for CMake >= 2.8.12 + set(CUDA_NVCC_FLAGS + "${CUDA_NVCC_FLAGS} \"-DBOOST_NOINLINE=__attribute__((noinline))\" ") +endif(Boost_VERSION EQUAL 105500) + # cuda sources file(GLOB_RECURSE CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cu) file(GLOB_RECURSE TEST_CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cu) From 74fa8797739440ea254a59d2bfe801a2bfe870f2 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Sun, 31 Aug 2014 17:47:58 +0800 Subject: [PATCH 0622/2053] Add lint rule for caffe data layer setup --- scripts/cpp_lint.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/scripts/cpp_lint.py b/scripts/cpp_lint.py index 61b8b0cd320..1b7c6c0536c 100755 --- a/scripts/cpp_lint.py +++ b/scripts/cpp_lint.py @@ -155,6 +155,7 @@ 'build/printf_format', 'build/storage_class', 'caffe/alt_fn', + 'caffe/data_layer_setup', 'caffe/random_fn', 'legal/copyright', 'readability/alt_tokens', @@ -1591,6 +1592,45 @@ def CheckCaffeAlternatives(filename, clean_lines, linenum, error): (' or '.join(disp_alts), function)) +def CheckCaffeDataLayerSetUp(filename, clean_lines, linenum, error): + """Except the base classes, Caffe DataLayer should define DataLayerSetUp + instead of LayerSetUp. + + The base DataLayers define common SetUp steps, the subclasses should + not override them. + + Args: + filename: The name of the current file. + clean_lines: A CleansedLines instance containing the file. + linenum: The number of the line to check. + error: The function to call with any errors found. + """ + line = clean_lines.elided[linenum] + ix = line.find('DataLayer::LayerSetUp') + if ix >= 0 and ( + line.find('void DataLayer::LayerSetUp') != -1 or + line.find('void ImageDataLayer::LayerSetUp') != -1 or + line.find('void MemoryDataLayer::LayerSetUp') != -1 or + line.find('void WindowDataLayer::LayerSetUp') != -1): + error(filename, linenum, 'caffe/data_layer_setup', 2, + 'Except the base classes, Caffe DataLayer should define' + + ' DataLayerSetUp instead of LayerSetUp. The base DataLayers' + + ' define common SetUp steps, the subclasses should' + + ' not override them.') + ix = line.find('DataLayer::DataLayerSetUp') + if ix >= 0 and ( + line.find('void Base') == -1 and + line.find('void DataLayer::DataLayerSetUp') == -1 and + line.find('void ImageDataLayer::DataLayerSetUp') == -1 and + line.find('void MemoryDataLayer::DataLayerSetUp') == -1 and + line.find('void WindowDataLayer::DataLayerSetUp') == -1): + error(filename, linenum, 'caffe/data_layer_setup', 2, + 'Except the base classes, Caffe DataLayer should define' + + ' DataLayerSetUp instead of LayerSetUp. The base DataLayers' + + ' define common SetUp steps, the subclasses should' + + ' not override them.') + + c_random_function_list = ( 'rand(', 'rand_r(', @@ -4593,6 +4633,7 @@ def ProcessLine(filename, file_extension, clean_lines, line, nesting_state, error) CheckVlogArguments(filename, clean_lines, line, error) CheckCaffeAlternatives(filename, clean_lines, line, error) + CheckCaffeDataLayerSetUp(filename, clean_lines, line, error) CheckCaffeRandom(filename, clean_lines, line, error) CheckPosixThreading(filename, clean_lines, line, error) CheckInvalidIncrement(filename, clean_lines, line, error) From 725e98d32d2fe5caf4c065cd1241d3622092b809 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 2 Sep 2014 11:50:08 +0800 Subject: [PATCH 0623/2053] Remove OpenCV stuffs from the memory data layer and io utils --- include/caffe/data_layers.hpp | 8 --- src/caffe/layers/memory_data_layer.cpp | 37 ------------ src/caffe/test/test_memory_data_layer.cpp | 72 +---------------------- src/caffe/util/io.cpp | 1 - 4 files changed, 1 insertion(+), 117 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 8c1b3f90e27..0d435dda05b 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -1,8 +1,6 @@ #ifndef CAFFE_DATA_LAYERS_HPP_ #define CAFFE_DATA_LAYERS_HPP_ -#include - #include #include #include @@ -257,12 +255,6 @@ class MemoryDataLayer : public BaseDataLayer { // will be given to Blob, which is mutable void Reset(Dtype* data, Dtype* label, int n); - virtual void AddImages(const vector& images, - const bool is_color_images = true); - virtual void AddImagesAndLabels(const vector& images, - const vector& labels, - const bool is_color_images = true); - int batch_size() { return batch_size_; } protected: diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 693c4d51b5f..4a778064cf0 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -51,43 +51,6 @@ void MemoryDataLayer::Forward_cpu(const vector*>& bottom, has_new_data_ = false; } -template -void MemoryDataLayer::AddImages( - const vector& images, const bool is_color_images) { - const vector fake_labels(images.size(), 0); - AddImagesAndLabels(images, fake_labels, is_color_images); -} - -template -void MemoryDataLayer::AddImagesAndLabels( - const vector& images, const vector& labels, - const bool is_color_images) { - CHECK(!has_new_data_) << - "There are pending images that haven't been consumed"; - size_t num_images = images.size(); - CHECK_GT(num_images, 0) << "There is no image to add"; - CHECK_EQ(num_images, batch_size_) << - "The number of added images must be equal to the batch size"; - CHECK_EQ(num_images, labels.size()) << - "The number of images must be equal to the number of labels"; - - Datum datum; - Dtype* top_data = added_data_.mutable_cpu_data(); - Dtype* top_label = added_label_.mutable_cpu_data(); - for (int batch_item_id = 0; batch_item_id < num_images; ++batch_item_id) { - OpenCVImageToDatum( - images[batch_item_id], labels[batch_item_id], this->datum_height_, - this->datum_width_, &datum); - // Apply data transformations (mirror, scale, crop...) - this->data_transformer_.Transform(batch_item_id, datum, this->mean_, - top_data); - top_label[batch_item_id] = labels[batch_item_id]; - } - // num_images == batch_size_ - Reset(top_data, top_label, batch_size_); - has_new_data_ = true; -} - INSTANTIATE_CLASS(MemoryDataLayer); } // namespace caffe diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index 39b97d863ae..748a6a96230 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -1,5 +1,3 @@ -#include - #include #include "caffe/data_layers.hpp" @@ -18,8 +16,7 @@ class MemoryDataLayerTest : public MultiDeviceTest { : data_(new Blob()), labels_(new Blob()), data_blob_(new Blob()), - label_blob_(new Blob()), - image_(cv::imread("examples/images/cat.jpg", CV_LOAD_IMAGE_COLOR)) {} + label_blob_(new Blob()) {} virtual void SetUp() { batch_size_ = 8; batches_ = 12; @@ -35,9 +32,6 @@ class MemoryDataLayerTest : public MultiDeviceTest { labels_->Reshape(batches_ * batch_size_, 1, 1, 1); filler.Fill(this->data_); filler.Fill(this->labels_); - for (int i = 0; i < batch_size_; ++i) { - image_labels_.push_back(i); - } } virtual ~MemoryDataLayerTest() { @@ -60,8 +54,6 @@ class MemoryDataLayerTest : public MultiDeviceTest { Blob* const label_blob_; vector*> blob_bottom_vec_; vector*> blob_top_vec_; - const cv::Mat image_; - vector image_labels_; }; TYPED_TEST_CASE(MemoryDataLayerTest, TestDtypesAndDevices); @@ -118,66 +110,4 @@ TYPED_TEST(MemoryDataLayerTest, TestForward) { } } -TYPED_TEST(MemoryDataLayerTest, TestAddImagesAndLabels) { - typedef typename TypeParam::Dtype Dtype; - - LayerParameter param; - MemoryDataParameter* memory_data_param = param.mutable_memory_data_param(); - memory_data_param->set_batch_size(this->batch_size_); - memory_data_param->set_channels(this->image_.channels()); - memory_data_param->set_height(this->image_.rows); - memory_data_param->set_width(this->image_.cols); - MemoryDataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - cv::Mat image = this->image_; - vector images(this->batch_size_, image); - layer.AddImagesAndLabels(images, this->image_labels_); - // Go through the data 5 times - for (int iter = 0; iter < 5; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - const Dtype* data = this->data_blob_->cpu_data(); - for (int i = 0, index = 0; i < this->batch_size_; ++i) { - EXPECT_EQ(i, this->label_blob_->cpu_data()[i]); - for (int c = 0; c < image.channels(); ++c) { - for (int h = 0; h < image.rows; ++h) { - for (int w = 0; w < image.cols; ++w) { - EXPECT_EQ(static_cast(image.at(h, w)[c]), - data[index++]); - } - } - } - } - } -} - -TYPED_TEST(MemoryDataLayerTest, TestAddImagesAndLabelsResize) { - typedef typename TypeParam::Dtype Dtype; - - const int resize_height = 256; - const int resize_width = 256; - LayerParameter param; - MemoryDataParameter* memory_data_param = param.mutable_memory_data_param(); - memory_data_param->set_batch_size(this->batch_size_); - memory_data_param->set_channels(this->image_.channels()); - memory_data_param->set_height(resize_height); - memory_data_param->set_width(resize_width); - MemoryDataLayer layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - EXPECT_EQ(this->data_blob_->num(), this->batch_size_); - EXPECT_EQ(this->data_blob_->channels(), this->image_.channels()); - EXPECT_EQ(this->data_blob_->height(), resize_height); - EXPECT_EQ(this->data_blob_->width(), resize_width); - cv::Mat image = this->image_; - vector images(this->batch_size_, image); - layer.AddImagesAndLabels(images, this->image_labels_); - // Go through the data 5 times - for (int iter = 0; iter < 5; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); - const Dtype* label_data = this->label_blob_->cpu_data(); - for (int i = 0; i < this->batch_size_; ++i) { - EXPECT_EQ(i, label_data[i]); - } - } -} - } // namespace caffe diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 7b6c67cf633..0dd36a33bbb 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include #include From ab1f9b5bf53c7eb76a4ee1eaf4b176e4dc1ea0dc Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 2 Sep 2014 13:44:59 +0800 Subject: [PATCH 0624/2053] Add leveldb header back to util/io.cpp --- src/caffe/util/io.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 0dd36a33bbb..7b6c67cf633 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include From 25ce7f51dbf28b3a87e83409c66ba27d4170f0fd Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 2 Sep 2014 13:53:18 +0800 Subject: [PATCH 0625/2053] Place InternalThreadEntry lower in the {,Image,Window}DataLayer.cpp --- src/caffe/layers/data_layer.cpp | 124 +++++------ src/caffe/layers/image_data_layer.cpp | 80 +++---- src/caffe/layers/window_data_layer.cpp | 296 ++++++++++++------------- 3 files changed, 250 insertions(+), 250 deletions(-) diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 7a46a599069..d2071e2fa4f 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -14,68 +14,6 @@ namespace caffe { -// This function is used to create a thread that prefetches the data. -template -void DataLayer::InternalThreadEntry() { - Datum datum; - CHECK(this->prefetch_data_.count()); - Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); - Dtype* top_label = NULL; // suppress warnings about uninitialized variables - if (this->output_labels_) { - top_label = this->prefetch_label_.mutable_cpu_data(); - } - const int batch_size = this->layer_param_.data_param().batch_size(); - - for (int item_id = 0; item_id < batch_size; ++item_id) { - // get a blob - switch (this->layer_param_.data_param().backend()) { - case DataParameter_DB_LEVELDB: - CHECK(iter_); - CHECK(iter_->Valid()); - datum.ParseFromString(iter_->value().ToString()); - break; - case DataParameter_DB_LMDB: - CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, - &mdb_value_, MDB_GET_CURRENT), MDB_SUCCESS); - datum.ParseFromArray(mdb_value_.mv_data, - mdb_value_.mv_size); - break; - default: - LOG(FATAL) << "Unknown database backend"; - } - - // Apply data transformations (mirror, scale, crop...) - this->data_transformer_.Transform(item_id, datum, this->mean_, top_data); - - if (this->output_labels_) { - top_label[item_id] = datum.label(); - } - - // go to the next iter - switch (this->layer_param_.data_param().backend()) { - case DataParameter_DB_LEVELDB: - iter_->Next(); - if (!iter_->Valid()) { - // We have reached the end. Restart from the first. - DLOG(INFO) << "Restarting data prefetching from start."; - iter_->SeekToFirst(); - } - break; - case DataParameter_DB_LMDB: - if (mdb_cursor_get(mdb_cursor_, &mdb_key_, - &mdb_value_, MDB_NEXT) != MDB_SUCCESS) { - // We have reached the end. Restart from the first. - DLOG(INFO) << "Restarting data prefetching from start."; - CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, - &mdb_value_, MDB_FIRST), MDB_SUCCESS); - } - break; - default: - LOG(FATAL) << "Unknown database backend"; - } - } -} - template DataLayer::~DataLayer() { this->JoinPrefetchThread(); @@ -203,6 +141,68 @@ void DataLayer::DataLayerSetUp(const vector*>& bottom, this->datum_size_ = datum.channels() * datum.height() * datum.width(); } +// This function is used to create a thread that prefetches the data. +template +void DataLayer::InternalThreadEntry() { + Datum datum; + CHECK(this->prefetch_data_.count()); + Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); + Dtype* top_label = NULL; // suppress warnings about uninitialized variables + if (this->output_labels_) { + top_label = this->prefetch_label_.mutable_cpu_data(); + } + const int batch_size = this->layer_param_.data_param().batch_size(); + + for (int item_id = 0; item_id < batch_size; ++item_id) { + // get a blob + switch (this->layer_param_.data_param().backend()) { + case DataParameter_DB_LEVELDB: + CHECK(iter_); + CHECK(iter_->Valid()); + datum.ParseFromString(iter_->value().ToString()); + break; + case DataParameter_DB_LMDB: + CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, + &mdb_value_, MDB_GET_CURRENT), MDB_SUCCESS); + datum.ParseFromArray(mdb_value_.mv_data, + mdb_value_.mv_size); + break; + default: + LOG(FATAL) << "Unknown database backend"; + } + + // Apply data transformations (mirror, scale, crop...) + this->data_transformer_.Transform(item_id, datum, this->mean_, top_data); + + if (this->output_labels_) { + top_label[item_id] = datum.label(); + } + + // go to the next iter + switch (this->layer_param_.data_param().backend()) { + case DataParameter_DB_LEVELDB: + iter_->Next(); + if (!iter_->Valid()) { + // We have reached the end. Restart from the first. + DLOG(INFO) << "Restarting data prefetching from start."; + iter_->SeekToFirst(); + } + break; + case DataParameter_DB_LMDB: + if (mdb_cursor_get(mdb_cursor_, &mdb_key_, + &mdb_value_, MDB_NEXT) != MDB_SUCCESS) { + // We have reached the end. Restart from the first. + DLOG(INFO) << "Restarting data prefetching from start."; + CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, + &mdb_value_, MDB_FIRST), MDB_SUCCESS); + } + break; + default: + LOG(FATAL) << "Unknown database backend"; + } + } +} + INSTANTIATE_CLASS(DataLayer); } // namespace caffe diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 9ff1b8e7eb0..e4a575bec93 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -12,46 +12,6 @@ namespace caffe { -// This function is used to create a thread that prefetches the data. -template -void ImageDataLayer::InternalThreadEntry() { - Datum datum; - CHECK(this->prefetch_data_.count()); - Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); - Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); - ImageDataParameter image_data_param = this->layer_param_.image_data_param(); - const int batch_size = image_data_param.batch_size(); - const int new_height = image_data_param.new_height(); - const int new_width = image_data_param.new_width(); - - // datum scales - const int lines_size = lines_.size(); - for (int item_id = 0; item_id < batch_size; ++item_id) { - // get a blob - CHECK_GT(lines_size, lines_id_); - if (!ReadImageToDatum(lines_[lines_id_].first, - lines_[lines_id_].second, - new_height, new_width, &datum)) { - continue; - } - - // Apply transformations (mirror, crop...) to the data - this->data_transformer_.Transform(item_id, datum, this->mean_, top_data); - - top_label[item_id] = datum.label(); - // go to the next iter - lines_id_++; - if (lines_id_ >= lines_size) { - // We have reached the end. Restart from the first. - DLOG(INFO) << "Restarting data prefetching from start."; - lines_id_ = 0; - if (this->layer_param_.image_data_param().shuffle()) { - ShuffleImages(); - } - } - } -} - template ImageDataLayer::~ImageDataLayer() { this->JoinPrefetchThread(); @@ -130,6 +90,46 @@ void ImageDataLayer::ShuffleImages() { shuffle(lines_.begin(), lines_.end(), prefetch_rng); } +// This function is used to create a thread that prefetches the data. +template +void ImageDataLayer::InternalThreadEntry() { + Datum datum; + CHECK(this->prefetch_data_.count()); + Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); + Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); + ImageDataParameter image_data_param = this->layer_param_.image_data_param(); + const int batch_size = image_data_param.batch_size(); + const int new_height = image_data_param.new_height(); + const int new_width = image_data_param.new_width(); + + // datum scales + const int lines_size = lines_.size(); + for (int item_id = 0; item_id < batch_size; ++item_id) { + // get a blob + CHECK_GT(lines_size, lines_id_); + if (!ReadImageToDatum(lines_[lines_id_].first, + lines_[lines_id_].second, + new_height, new_width, &datum)) { + continue; + } + + // Apply transformations (mirror, crop...) to the data + this->data_transformer_.Transform(item_id, datum, this->mean_, top_data); + + top_label[item_id] = datum.label(); + // go to the next iter + lines_id_++; + if (lines_id_ >= lines_size) { + // We have reached the end. Restart from the first. + DLOG(INFO) << "Restarting data prefetching from start."; + lines_id_ = 0; + if (this->layer_param_.image_data_param().shuffle()) { + ShuffleImages(); + } + } + } +} + INSTANTIATE_CLASS(ImageDataLayer); } // namespace caffe diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index d8b693d3116..4284c327681 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -23,6 +23,154 @@ namespace caffe { +template +WindowDataLayer::~WindowDataLayer() { + this->JoinPrefetchThread(); +} + +template +void WindowDataLayer::DataLayerSetUp(const vector*>& bottom, + vector*>* top) { + // LayerSetUp runs through the window_file and creates two structures + // that hold windows: one for foreground (object) windows and one + // for background (non-object) windows. We use an overlap threshold + // to decide which is which. + + // window_file format + // repeated: + // # image_index + // img_path (abs path) + // channels + // height + // width + // num_windows + // class_index overlap x1 y1 x2 y2 + + LOG(INFO) << "Window data layer:" << std::endl + << " foreground (object) overlap threshold: " + << this->layer_param_.window_data_param().fg_threshold() << std::endl + << " background (non-object) overlap threshold: " + << this->layer_param_.window_data_param().bg_threshold() << std::endl + << " foreground sampling fraction: " + << this->layer_param_.window_data_param().fg_fraction(); + + const bool prefetch_needs_rand = + this->layer_param_.window_data_param().mirror() || + this->layer_param_.window_data_param().crop_size(); + if (prefetch_needs_rand) { + const unsigned int prefetch_rng_seed = caffe_rng_rand(); + prefetch_rng_.reset(new Caffe::RNG(prefetch_rng_seed)); + } else { + prefetch_rng_.reset(); + } + + std::ifstream infile(this->layer_param_.window_data_param().source().c_str()); + CHECK(infile.good()) << "Failed to open window file " + << this->layer_param_.window_data_param().source() << std::endl; + + map label_hist; + label_hist.insert(std::make_pair(0, 0)); + + string hashtag; + int image_index, channels; + if (!(infile >> hashtag >> image_index)) { + LOG(FATAL) << "Window file is empty"; + } + do { + CHECK_EQ(hashtag, "#"); + // read image path + string image_path; + infile >> image_path; + // read image dimensions + vector image_size(3); + infile >> image_size[0] >> image_size[1] >> image_size[2]; + channels = image_size[0]; + image_database_.push_back(std::make_pair(image_path, image_size)); + + // read each box + int num_windows; + infile >> num_windows; + const float fg_threshold = + this->layer_param_.window_data_param().fg_threshold(); + const float bg_threshold = + this->layer_param_.window_data_param().bg_threshold(); + for (int i = 0; i < num_windows; ++i) { + int label, x1, y1, x2, y2; + float overlap; + infile >> label >> overlap >> x1 >> y1 >> x2 >> y2; + + vector window(WindowDataLayer::NUM); + window[WindowDataLayer::IMAGE_INDEX] = image_index; + window[WindowDataLayer::LABEL] = label; + window[WindowDataLayer::OVERLAP] = overlap; + window[WindowDataLayer::X1] = x1; + window[WindowDataLayer::Y1] = y1; + window[WindowDataLayer::X2] = x2; + window[WindowDataLayer::Y2] = y2; + + // add window to foreground list or background list + if (overlap >= fg_threshold) { + int label = window[WindowDataLayer::LABEL]; + CHECK_GT(label, 0); + fg_windows_.push_back(window); + label_hist.insert(std::make_pair(label, 0)); + label_hist[label]++; + } else if (overlap < bg_threshold) { + // background window, force label and overlap to 0 + window[WindowDataLayer::LABEL] = 0; + window[WindowDataLayer::OVERLAP] = 0; + bg_windows_.push_back(window); + label_hist[0]++; + } + } + + if (image_index % 100 == 0) { + LOG(INFO) << "num: " << image_index << " " + << image_path << " " + << image_size[0] << " " + << image_size[1] << " " + << image_size[2] << " " + << "windows to process: " << num_windows; + } + } while (infile >> hashtag >> image_index); + + LOG(INFO) << "Number of images: " << image_index+1; + + for (map::iterator it = label_hist.begin(); + it != label_hist.end(); ++it) { + LOG(INFO) << "class " << it->first << " has " << label_hist[it->first] + << " samples"; + } + + LOG(INFO) << "Amount of context padding: " + << this->layer_param_.window_data_param().context_pad(); + + LOG(INFO) << "Crop mode: " + << this->layer_param_.window_data_param().crop_mode(); + + // image + int crop_size = this->layer_param_.window_data_param().crop_size(); + CHECK_GT(crop_size, 0); + const int batch_size = this->layer_param_.window_data_param().batch_size(); + (*top)[0]->Reshape(batch_size, channels, crop_size, crop_size); + this->prefetch_data_.Reshape(batch_size, channels, crop_size, crop_size); + + LOG(INFO) << "output data size: " << (*top)[0]->num() << "," + << (*top)[0]->channels() << "," << (*top)[0]->height() << "," + << (*top)[0]->width(); + // label + (*top)[1]->Reshape(batch_size, 1, 1, 1); + this->prefetch_label_.Reshape(batch_size, 1, 1, 1); +} + +template +unsigned int WindowDataLayer::PrefetchRand() { + CHECK(prefetch_rng_); + caffe::rng_t* prefetch_rng = + static_cast(prefetch_rng_->generator()); + return (*prefetch_rng)(); +} + // Thread fetching the data template void WindowDataLayer::InternalThreadEntry() { @@ -237,154 +385,6 @@ void WindowDataLayer::InternalThreadEntry() { } } -template -WindowDataLayer::~WindowDataLayer() { - this->JoinPrefetchThread(); -} - -template -void WindowDataLayer::DataLayerSetUp(const vector*>& bottom, - vector*>* top) { - // LayerSetUp runs through the window_file and creates two structures - // that hold windows: one for foreground (object) windows and one - // for background (non-object) windows. We use an overlap threshold - // to decide which is which. - - // window_file format - // repeated: - // # image_index - // img_path (abs path) - // channels - // height - // width - // num_windows - // class_index overlap x1 y1 x2 y2 - - LOG(INFO) << "Window data layer:" << std::endl - << " foreground (object) overlap threshold: " - << this->layer_param_.window_data_param().fg_threshold() << std::endl - << " background (non-object) overlap threshold: " - << this->layer_param_.window_data_param().bg_threshold() << std::endl - << " foreground sampling fraction: " - << this->layer_param_.window_data_param().fg_fraction(); - - const bool prefetch_needs_rand = - this->layer_param_.window_data_param().mirror() || - this->layer_param_.window_data_param().crop_size(); - if (prefetch_needs_rand) { - const unsigned int prefetch_rng_seed = caffe_rng_rand(); - prefetch_rng_.reset(new Caffe::RNG(prefetch_rng_seed)); - } else { - prefetch_rng_.reset(); - } - - std::ifstream infile(this->layer_param_.window_data_param().source().c_str()); - CHECK(infile.good()) << "Failed to open window file " - << this->layer_param_.window_data_param().source() << std::endl; - - map label_hist; - label_hist.insert(std::make_pair(0, 0)); - - string hashtag; - int image_index, channels; - if (!(infile >> hashtag >> image_index)) { - LOG(FATAL) << "Window file is empty"; - } - do { - CHECK_EQ(hashtag, "#"); - // read image path - string image_path; - infile >> image_path; - // read image dimensions - vector image_size(3); - infile >> image_size[0] >> image_size[1] >> image_size[2]; - channels = image_size[0]; - image_database_.push_back(std::make_pair(image_path, image_size)); - - // read each box - int num_windows; - infile >> num_windows; - const float fg_threshold = - this->layer_param_.window_data_param().fg_threshold(); - const float bg_threshold = - this->layer_param_.window_data_param().bg_threshold(); - for (int i = 0; i < num_windows; ++i) { - int label, x1, y1, x2, y2; - float overlap; - infile >> label >> overlap >> x1 >> y1 >> x2 >> y2; - - vector window(WindowDataLayer::NUM); - window[WindowDataLayer::IMAGE_INDEX] = image_index; - window[WindowDataLayer::LABEL] = label; - window[WindowDataLayer::OVERLAP] = overlap; - window[WindowDataLayer::X1] = x1; - window[WindowDataLayer::Y1] = y1; - window[WindowDataLayer::X2] = x2; - window[WindowDataLayer::Y2] = y2; - - // add window to foreground list or background list - if (overlap >= fg_threshold) { - int label = window[WindowDataLayer::LABEL]; - CHECK_GT(label, 0); - fg_windows_.push_back(window); - label_hist.insert(std::make_pair(label, 0)); - label_hist[label]++; - } else if (overlap < bg_threshold) { - // background window, force label and overlap to 0 - window[WindowDataLayer::LABEL] = 0; - window[WindowDataLayer::OVERLAP] = 0; - bg_windows_.push_back(window); - label_hist[0]++; - } - } - - if (image_index % 100 == 0) { - LOG(INFO) << "num: " << image_index << " " - << image_path << " " - << image_size[0] << " " - << image_size[1] << " " - << image_size[2] << " " - << "windows to process: " << num_windows; - } - } while (infile >> hashtag >> image_index); - - LOG(INFO) << "Number of images: " << image_index+1; - - for (map::iterator it = label_hist.begin(); - it != label_hist.end(); ++it) { - LOG(INFO) << "class " << it->first << " has " << label_hist[it->first] - << " samples"; - } - - LOG(INFO) << "Amount of context padding: " - << this->layer_param_.window_data_param().context_pad(); - - LOG(INFO) << "Crop mode: " - << this->layer_param_.window_data_param().crop_mode(); - - // image - int crop_size = this->layer_param_.window_data_param().crop_size(); - CHECK_GT(crop_size, 0); - const int batch_size = this->layer_param_.window_data_param().batch_size(); - (*top)[0]->Reshape(batch_size, channels, crop_size, crop_size); - this->prefetch_data_.Reshape(batch_size, channels, crop_size, crop_size); - - LOG(INFO) << "output data size: " << (*top)[0]->num() << "," - << (*top)[0]->channels() << "," << (*top)[0]->height() << "," - << (*top)[0]->width(); - // label - (*top)[1]->Reshape(batch_size, 1, 1, 1); - this->prefetch_label_.Reshape(batch_size, 1, 1, 1); -} - -template -unsigned int WindowDataLayer::PrefetchRand() { - CHECK(prefetch_rng_); - caffe::rng_t* prefetch_rng = - static_cast(prefetch_rng_->generator()); - return (*prefetch_rng)(); -} - INSTANTIATE_CLASS(WindowDataLayer); } // namespace caffe From 4761072392f923203dde85dcd4cc69998494c98c Mon Sep 17 00:00:00 2001 From: Kai Li Date: Tue, 2 Sep 2014 14:43:58 +0800 Subject: [PATCH 0626/2053] Add and transform Datum vector in the MemeoryDataLayer --- include/caffe/data_layers.hpp | 2 + src/caffe/layers/memory_data_layer.cpp | 23 ++++++++++ src/caffe/test/test_memory_data_layer.cpp | 54 +++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 0d435dda05b..e6a1410007f 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -251,6 +251,8 @@ class MemoryDataLayer : public BaseDataLayer { virtual inline int ExactNumBottomBlobs() const { return 0; } virtual inline int ExactNumTopBlobs() const { return 2; } + virtual void AddDatumVector(const vector& datum_vector); + // Reset should accept const pointers, but can't, because the memory // will be given to Blob, which is mutable void Reset(Dtype* data, Dtype* label, int n); diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 4a778064cf0..03b3e37a626 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -30,6 +30,29 @@ void MemoryDataLayer::DataLayerSetUp(const vector*>& bottom, added_label_.cpu_data(); } +template +void MemoryDataLayer::AddDatumVector(const vector& datum_vector) { + CHECK(!has_new_data_) << + "Can't add Datum when earlier ones haven't been consumed" + << " by the upper layers"; + size_t num = datum_vector.size(); + CHECK_GT(num, 0) << "There is no datum to add"; + CHECK_EQ(num, batch_size_) << + "The number of added datum must be equal to the batch size"; + + Dtype* top_data = added_data_.mutable_cpu_data(); + Dtype* top_label = added_label_.mutable_cpu_data(); + for (int batch_item_id = 0; batch_item_id < num; ++batch_item_id) { + // Apply data transformations (mirror, scale, crop...) + this->data_transformer_.Transform( + batch_item_id, datum_vector[batch_item_id], this->mean_, top_data); + top_label[batch_item_id] = datum_vector[batch_item_id].label(); + } + // num_images == batch_size_ + Reset(top_data, top_label, batch_size_); + has_new_data_ = true; +} + template void MemoryDataLayer::Reset(Dtype* data, Dtype* labels, int n) { CHECK(data); diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index 748a6a96230..3dc00345743 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -1,3 +1,4 @@ +#include #include #include "caffe/data_layers.hpp" @@ -110,4 +111,57 @@ TYPED_TEST(MemoryDataLayerTest, TestForward) { } } +TYPED_TEST(MemoryDataLayerTest, AddDatumVectorDefaultTransform) { + typedef typename TypeParam::Dtype Dtype; + + LayerParameter param; + MemoryDataParameter* memory_data_param = param.mutable_memory_data_param(); + memory_data_param->set_batch_size(this->batch_size_); + memory_data_param->set_channels(this->channels_); + memory_data_param->set_height(this->height_); + memory_data_param->set_width(this->width_); + MemoryDataLayer layer(param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + + vector datum_vector(this->batch_size_); + const size_t count = this->channels_ * this->height_ * this->width_; + size_t pixel_index = 0; + for (int i = 0; i < this->batch_size_; ++i) { + LOG(ERROR) << "i " << i; + datum_vector[i].set_channels(this->channels_); + datum_vector[i].set_height(this->height_); + datum_vector[i].set_width(this->width_); + datum_vector[i].set_label(i); + vector pixels(count); + for (int j = 0; j < count; ++j) { + pixels[j] = pixel_index++ % 256; + } + datum_vector[i].set_data(&(pixels[0]), count); + } + + layer.AddDatumVector(datum_vector); + + int data_index; + // Go through the data 5 times + for (int iter = 0; iter < 5; ++iter) { + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + const Dtype* data = this->data_blob_->cpu_data(); + size_t index = 0; + for (int i = 0; i < this->batch_size_; ++i) { + const string& data_string = datum_vector[i].data(); + EXPECT_EQ(i, this->label_blob_->cpu_data()[i]); + for (int c = 0; c < this->channels_; ++c) { + for (int h = 0; h < this->height_; ++h) { + for (int w = 0; w < this->width_; ++w) { + data_index = (c * this->height_ + h) * this->width_ + w; + EXPECT_EQ(static_cast( + static_cast(data_string[data_index])), + data[index++]); + } + } + } + } + } +} + } // namespace caffe From 858ad41f0272f7acff354e81e1e84bec34374b1c Mon Sep 17 00:00:00 2001 From: Kai Li Date: Wed, 3 Sep 2014 14:48:02 +0800 Subject: [PATCH 0627/2053] Correct the datum size checking conditions of the data layers --- src/caffe/data_transformer.cpp | 2 -- src/caffe/layers/base_data_layer.cpp | 14 ++++++++------ src/caffe/layers/memory_data_layer.cpp | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index bdde028435b..7150fd99c18 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -21,8 +21,6 @@ void DataTransformer::Transform(const int batch_item_id, const bool mirror = param_.mirror(); const Dtype scale = param_.scale(); - - if (mirror && crop_size == 0) { LOG(FATAL) << "Current implementation requires mirror and crop_size to be " << "set at the same time."; diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index c31081c3540..058e361ac59 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -26,8 +26,10 @@ void BaseDataLayer::LayerSetUp(const vector*>& bottom, CHECK_GT(datum_channels_, 0); CHECK_GT(datum_height_, 0); CHECK_GT(datum_width_, 0); - CHECK_GT(datum_height_, transform_param_.crop_size()); - CHECK_GT(datum_width_, transform_param_.crop_size()); + if (transform_param_.crop_size() > 0) { + CHECK_GE(datum_height_, transform_param_.crop_size()); + CHECK_GE(datum_width_, transform_param_.crop_size()); + } // check if we want to have mean if (transform_param_.has_mean_file()) { const string& mean_file = transform_param_.mean_file(); @@ -35,10 +37,10 @@ void BaseDataLayer::LayerSetUp(const vector*>& bottom, BlobProto blob_proto; ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); data_mean_.FromProto(blob_proto); - CHECK_EQ(data_mean_.num(), 1); - CHECK_EQ(data_mean_.channels(), datum_channels_); - CHECK_EQ(data_mean_.height(), datum_height_); - CHECK_EQ(data_mean_.width(), datum_width_); + CHECK_GE(data_mean_.num(), 1); + CHECK_GE(data_mean_.channels(), datum_channels_); + CHECK_GE(data_mean_.height(), datum_height_); + CHECK_GE(data_mean_.width(), datum_width_); } else { // Simply initialize an all-empty mean. data_mean_.Reshape(1, datum_channels_, datum_height_, datum_width_); diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 03b3e37a626..ab631a884fb 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -37,8 +37,8 @@ void MemoryDataLayer::AddDatumVector(const vector& datum_vector) { << " by the upper layers"; size_t num = datum_vector.size(); CHECK_GT(num, 0) << "There is no datum to add"; - CHECK_EQ(num, batch_size_) << - "The number of added datum must be equal to the batch size"; + CHECK_LE(num, batch_size_) << + "The number of added datum must be no greater than the batch size"; Dtype* top_data = added_data_.mutable_cpu_data(); Dtype* top_label = added_label_.mutable_cpu_data(); From a08f111ca7d1a4d0d92a009ce59cbcd6eef83394 Mon Sep 17 00:00:00 2001 From: Kai Li Date: Wed, 3 Sep 2014 15:13:26 +0800 Subject: [PATCH 0628/2053] Initialize the transformer rng in the base data layer --- src/caffe/layers/base_data_layer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 058e361ac59..9b1d55831a7 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -46,6 +46,7 @@ void BaseDataLayer::LayerSetUp(const vector*>& bottom, data_mean_.Reshape(1, datum_channels_, datum_height_, datum_width_); } mean_ = data_mean_.cpu_data(); + data_transformer_.InitRand(); } template From 5d8c93c2015d252278e0653adca987fd515a723f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 23 Aug 2014 18:19:10 -0700 Subject: [PATCH 0629/2053] [docs] skeleton documentation subjects --- docs/tutorial/convolution.md | 4 ++++ docs/tutorial/data.md | 4 ++++ docs/tutorial/forward_backward.md | 4 ++++ docs/tutorial/layers.md | 4 ++++ docs/tutorial/loss.md | 4 ++++ docs/tutorial/net_layer_blob.md | 4 ++++ docs/tutorial/solver.md | 4 ++++ 7 files changed, 28 insertions(+) create mode 100644 docs/tutorial/convolution.md create mode 100644 docs/tutorial/data.md create mode 100644 docs/tutorial/forward_backward.md create mode 100644 docs/tutorial/layers.md create mode 100644 docs/tutorial/loss.md create mode 100644 docs/tutorial/net_layer_blob.md create mode 100644 docs/tutorial/solver.md diff --git a/docs/tutorial/convolution.md b/docs/tutorial/convolution.md new file mode 100644 index 00000000000..a8bd0e656ec --- /dev/null +++ b/docs/tutorial/convolution.md @@ -0,0 +1,4 @@ +--- +layout: default +--- +# Caffeinated Convolution diff --git a/docs/tutorial/data.md b/docs/tutorial/data.md new file mode 100644 index 00000000000..de2d5526dcb --- /dev/null +++ b/docs/tutorial/data.md @@ -0,0 +1,4 @@ +--- +layout: default +--- +# Data: Ins and Outs diff --git a/docs/tutorial/forward_backward.md b/docs/tutorial/forward_backward.md new file mode 100644 index 00000000000..52376e6aa82 --- /dev/null +++ b/docs/tutorial/forward_backward.md @@ -0,0 +1,4 @@ +--- +layout: default +--- +# The Forward / Backward Passes diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md new file mode 100644 index 00000000000..de2d5526dcb --- /dev/null +++ b/docs/tutorial/layers.md @@ -0,0 +1,4 @@ +--- +layout: default +--- +# Data: Ins and Outs diff --git a/docs/tutorial/loss.md b/docs/tutorial/loss.md new file mode 100644 index 00000000000..59c626dc318 --- /dev/null +++ b/docs/tutorial/loss.md @@ -0,0 +1,4 @@ +--- +layout: default +--- +# Loss diff --git a/docs/tutorial/net_layer_blob.md b/docs/tutorial/net_layer_blob.md new file mode 100644 index 00000000000..0d8cc4b4d72 --- /dev/null +++ b/docs/tutorial/net_layer_blob.md @@ -0,0 +1,4 @@ +--- +layout: default +--- +# Nets, Layers, and Blobs: anatomy of a Caffe model diff --git a/docs/tutorial/solver.md b/docs/tutorial/solver.md new file mode 100644 index 00000000000..d6a95b42d20 --- /dev/null +++ b/docs/tutorial/solver.md @@ -0,0 +1,4 @@ +--- +layout: default +--- +# Solving From b256a7601a7789817cf1342e179f436be4698d63 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Sat, 23 Aug 2014 19:22:09 -0700 Subject: [PATCH 0630/2053] [docs] draft tutorial subjects --- docs/tutorial/fig/.gitignore | 0 docs/tutorial/fig/backward.jpg | Bin 0 -> 105017 bytes docs/tutorial/fig/forward.jpg | Bin 0 -> 71957 bytes docs/tutorial/fig/forward_backward.png | Bin 0 -> 57267 bytes docs/tutorial/fig/layer.jpg | Bin 0 -> 54757 bytes docs/tutorial/fig/logreg.jpg | Bin 0 -> 42966 bytes docs/tutorial/forward_backward.md | 35 ++++- docs/tutorial/index.md | 44 ++++++ docs/tutorial/interfaces.md | 68 ++++++++++ docs/tutorial/layers.md | 148 ++++++++++++++++++++- docs/tutorial/loss.md | 53 ++++++++ docs/tutorial/net_layer_blob.md | 133 +++++++++++++++++++ docs/tutorial/solver.md | 177 ++++++++++++++++++++++++- 13 files changed, 655 insertions(+), 3 deletions(-) create mode 100644 docs/tutorial/fig/.gitignore create mode 100644 docs/tutorial/fig/backward.jpg create mode 100644 docs/tutorial/fig/forward.jpg create mode 100644 docs/tutorial/fig/forward_backward.png create mode 100644 docs/tutorial/fig/layer.jpg create mode 100644 docs/tutorial/fig/logreg.jpg create mode 100644 docs/tutorial/index.md create mode 100644 docs/tutorial/interfaces.md diff --git a/docs/tutorial/fig/.gitignore b/docs/tutorial/fig/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/docs/tutorial/fig/backward.jpg b/docs/tutorial/fig/backward.jpg new file mode 100644 index 0000000000000000000000000000000000000000..906b080c975881dbb5bd598b3f0824c7a63014aa GIT binary patch literal 105017 zcmeFZ2UJwevM9XCIcFqE4kAhhff11;B9aA!ksL;XWN=^<2}%?YP*6}oKoC%J9?3~W zat;HMB+VdUgkk1w{Lc5Cd(XLdt^3}3|N7VY|I@7AQ@gslc2#xn?yBzI5GDu<0OK_s zeI0;^hzNKJ{sDwV24#IME$B@XBOU$g+F$_yFo@gx_}nFC1OQJje_s>bD+0HytOY3M z07`%wU}0eah>kj~A?I2z#$lvD_UISrPUr<00#+|~hzhQDvdVtm84_Np&jhTrS0FWyK z041%xy{{_(&|d}d0)dXMARl@s5We8$Uq2KhxSKR&e&He^k_(vxo0%mDgK`qr2D)3^0AYF%Zuf(kp2~2_XDHN7>lFW+#y7y^ zRAylizvkkrbE+dqLqhB62SUI3lL$K6|9%!Hh?n`gK^S~4$t`Cu z^S{YM;^yOj<&@7UeW=gf-~AhulO)CYuI?#b5QOvm0!{y{+v)FXc8Uk>Ml$AMf9RtI=>I?*e_>;e|f7F!*Tz;1Z{;mN7R=_8Cl5&%3kX|Ca z4qh*VS(a3pROQcl0t|o3Nv=(Pm0XWphg{-M4B!Y#eHYBWfct-eGXTq+LG66OtJj}8 z{GA`!3fUmpBH1X}0@);B0et_>I?GLLsgBJ4w*8ij-6$PbM zAiYAW4$2S8PRdTo4M>y9gPLfPLO|UVKhEA1O&5lT?s&k+hKXkTjCi00JaPl3J24Bu%IA z-(=SLZ5`LYo@VmfqA*Yg_djVa6kk}sfcx|AFJ0|H%&7#YZ2S#C-aa9| z?yheB0-E3`>@1+~<#_&_fb4~f@&Ir;rk~OPz)$wyV>JcP!7}pjX(>~3G@Nq zfKgx?>>JC#27m?*fMakHqadOqVjWPxOp^+?T09ZBzzhLgsVW|9_? zR+F}q4wIrt(WH1XIx-$IDKb?ueX?6*u4F-E(PZgl`D9gO9pJmOOm;v{PR>p)My>?D zn^xo=`Cn9>|^Xl9K0Nw9L^k1I7&H&I1V|_a9-wg=8WYm;~eEY;u7G} z=7Mo0bJcLoa+7jPavO68ac6UPaBrSrJ#*=dz-6XRl2c(Fl z6s6pyUP%p}BRi*Z&gV}|2~(`Bb;PV3I<&MD5TF6u5RE^DspuBoo;ZV`gdPxI=g=LI@FwSbm`UpztB}L)gRqhzk)Z5qpm;AJs?lMm~sK ziqefLj;4?HjUJD=6qECq^s)QnuTSKjym*3-b&BncyAYQihl_WN?@hRv@H~N#=#uy~ zNiiw=Dfv^cr(?;G-1%|&Ck0*w3xy_y?eCS|zc1n`N-8EU4k%v#aQnlzlB*@PrP8Hu%Gk@| zJ^~*DKK}T0=hIlZL3wM1az$ySNaf2ama5olqUw-pbd6ihLakNpVBNL4*7{5JRSoAG z3L4KgW;L-jB{fqwM>Z3Xp~(HuKA$&RTw9h}p{>(xx7tS9joZI=7<6=Z>U6esX?7vI z)w>&eRD0@rm3wRY6#J^bD152vSLm<$s`#~fKxv@%o65KPLAAl=A;?h6@YUhY5&ehT8n z8GH*-ymq0jvMIfByfxh}A0DQjpN33^BeHuf){vGu7e2stbyZ(Q;5Kw@>cCb6B zo1q~f2^LTSq(t1H-}8s`8boLQf^~?*fm2Hm0mJ|h;|`oUNT(W}#xkb~^q+p;|M5%w zn)pu&5}ns1f5G2RNeR=SpGSO}h<;y*iAhMvNlCy&K}JSOPDw#Yd77!H>1e2^XsIbF zX&7i|>FB{kMZ?I%K+kjvpE5bE4%Q+kB_*e)qNF;d_}@!}&j1r8$#)VR5+Xr>n2Csl ziHOh+@PnF=fsPrNPQ^V_*&p#kAC^#haQDjtf%;P7qDXGuW(legF$b6fd_b$Jn z@O@EvMP*fWO>JF$Yg>CqXIFPm@6hnb=-Bwg

    Ug>HG4^>e~7b%6hKP?c1k7^CIAAQ;NHfH1OLwd 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 T`XAPH{`YzPyYtHYYvg|b$GsKX literal 0 HcmV?d00001 diff --git a/docs/tutorial/fig/forward.jpg b/docs/tutorial/fig/forward.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab52810908e2e9e79321c126622b5117a0cc6ead GIT binary patch literal 71957 zcmeFYcU)85vM{_u=)HFc2+|Qnno>fMCSt6BAV#Ejq$7bSibxj_P*4!1iW=!fB+?a7 z1QetvK}7{5p@cvR@5bjm=bYcU&%O7(@BQ9CzVEx6-`W{w&03k6)n?61c0TXm0RE#^ zwpIWH0s(G=f4~lb&%oBg0(s&T!pioTC0GFfd@61sApuPM01y}y9(u~!T+Zp7vmDzj zzz%Q%!hj5*;N~6{Vs_%hG2q{Q$YTK5699~A?)LTXlKpjsfQM(8I{-jVfYp~g!rTKv zxE=tQdEG-o!vTP$8^kL_g@^3I-$7V76l4&DX}hrZZKzM(Uhi?!F-vMD0cON$p$NLe4H39>JL6{E&0hLSt z)Q|T+!ESDs{@$mXoA=-0KV;c$3a}sX4GRfyi~0S}|C6u4fCx}uzaM$<&FvFva|-+v z2K9E|KiF;;<_6&xL6?prKv)oj+kAH={sVsR6Jc`}gm>w2?qL?7E&)*xUiWZ2Vh6&~ z0Kmi<;eXcbZ?KYEC|SW*da9d)ZhAN@(T($zB@m_ewa``p01dBx|9BM5_hGBro~IvfXKUJ&jM^FO`I!)`w#S9~mX@xN(8 zBTnt|tO(-2dxcu<$_UaxxdX#M=y(6nJ??J5ze^m%>xBE9u>tX5Tj((l&m)!~41O=v z$usEe-}r(0goK;#_OnZWB_!bY{08}iW_t!$@8b7>aA{cN=|9`{hKHWn#e;f-j`_JA z-JP!>&(NPC;U{)=vda$zI0je%M*uk>0xXw+V89RXeZSPS1pfC&jTPVqgaY1xC!qN^ z%%3eBf7b+o@6*5)U>OJkX~O>A&ir?+ClCqZ>3_%m(N+`i`du6OyM;gS4g7{cW=Uof zW<%y<;M)`|+RO&bhyH9Q$M+|ntd^`tSZ!FXSXKYT0PY~y0bmIQeE$Mx2iAFl(uIQW zpg(2!M}I8eScX{$ET33#EE9kO@a1I`9>9UU{h<|4P-8*Bk3VUc zl|Zg_na!DvLH7owtAJ@=v}0Nw>?j+&{_q zH$1NzukPQtxb&w~;7I_hJ-1lk7Y41Ov0|2{w`YsIstcm{Kt0AKO|G-^-4FHEyz&&7h zJC)m|0suD!0BHFJ07B${;1pKDC3PDBUVU(n2#x%Mj(PWk1w1SGz?C5Z$N~z03Mi8{ zpa&QNrhp}I6hHuHfOEhFQ0qQGAjowTfC8=oH-S{}Ov(icfMVb=PzgK(YJn!84d?)R zfdSwH@Cld#=f+oH5g-C&fC?UBY!DuZ5JUn3gY1Q ziGZLW*CDBpY)Ap51X2a5fwVw6Aa5bVkO>GL@&mF8*=B+=aWe@s$uKD~X)zfvnK9Wh zondli@@BfsbcN{#QwGyrrbkRqnHrfomiCBEmiRgNmG~|A-T34A3;A34$N4t|gai%;}8VOC*fVOwE8;Z)&g!taHNB7!11A`T+aB84Ka zL~x=|Q6*7Z(E!m*(OS_l(QPpqF*7kwv1GC5Vk2Uk;!@(K;-2Cu;u!Hy;@c8(5|$GF z5?K;W5;Ky_l4_DCC8H#ZBzq*6q=cmmrQD@bq-v!mrJ1DFq)$o5NUG@h|2xbEFh24Q+VL#W0CVGm}{i~^^Efr6L99feK>q9RPuUJ<2OtvI=tW3RzppS}5e`}S@sDJwZD zB`Gy2eODG&wpG5OT&+BI2meYD{XnYCdX(YD4Nw>U!$F z>JQY1HCQwbX#{CJ(iqp|)-=LB`H^Ffl1x{jw#k=7xnM!j~fUZoG?f;cyoy5koh6>p|(R?hxHDJAFe&TVyJ28Z}`OUyOFYy zr%|cVyzw4mH{%jxoQa&tMU#gnIJi9A4gLsDFjX-1FfBJ-FjF=2Gka?G%Y46isCk3= zro~~4IE&Xuphv8aq#Su~DQJ1tvcPiIYLAt-Rkan-TGu+(`n3& z#W@X}lRW2puGyK**}=KodBerhCD-NadEN6j&yTq(yGFady&!oZ;KC~;AJPq3cai0y zJI&M{XOJY%krvM0B@s&v#$+F!i|O@x#;DGuv~)%h)U1>$|tHcaHZDAGlAR z&yuf&Z-Fn#&&IFVZ_^*)U*W$K;23}jWDmR;*b*cdEE^mhJRG7Pax(;X`S9i3 z%fwK-(DE=ym}^*bxG-ou4@Rg&Bu3yPO(F{;DNznlbs9NkmDf10`CogNus~zR7zt^yYYyVN&re=3BnE-X|YSzL(5M@kr@U-JhD5N=tK3>rX$Bem8w5!z<%` zre0>zZPwdCx5u*JS(VuW*;lgXbL?{(@5tRrxwD>&%zc}ulUJP2nIDmlyL;?z^F76T zx9`ykdvm?)%pKCrZ!H8l~ zUjQ#6Ui_@NSTj~@SKC=6AQ=H2HPzl43EeZBFG=Ud(aY@zDA_V>0QRzE)cbou#pF=UatbaPo?`Tj4JU-c`d zD}zKQ;#X2AX=gQUO=7KLU1z;>=z0RXmE0HBBN>`))uD46Qdxw1Z`_lLJecILE?f>bug9pMb zqkTcy?Ck+Hu!0?6hDd^T&mY{IK&1W-TR~KST}?m$CICqC1$GUjT?u#ZGP@6GKmGpy zk58tDOn*`^Z9jzm2}6(WlI~1_b{^C21Nr@CVuC_hnW5mr#=^qP%Ff2lzFRmrdAK+@ zxH;L`x%jxad3eExgNt8)k5^z9-tAFDa|8yq@p zam3Qf+Q#on75My?t-q_K%Ey{4_THd14YznE&$i+rsxBKS`@=>l@@v z%GUO-To3^Ihgg4?>|f*(0Oew0W`;7e?aBpVirN)ifSE=90IQ(cNjA63LVL8Yu?w4L zmDF@_C>%UR6uA^S%qgmK-oMrAzBydM0<_*yTRy+86!5 zR>?u9a39!SMz0X&IDM&ub|S)vulnIvW;(P4!RTd=jakulo%??H$NKB`t2-Z4jLZC1Vl(B}Bm33yO#02A0At|$qZB~p-;{R# z9U$Ra{1|x$sLfyU*Zq}bBuG0;vduvdLyK9NtSlDZ1JwzN_ zfphZ-^4*-3mDLUupk2^;18t*)0n7hf}ybM!?9i$%b#Uj4{^P+$b z#Ouz|&X1x!hs6EhOyL-gMXac1;Hf~UJxTSp)2w!Xx`xInn>SH6j@D#V(?ktJ&v6QY8dWf^-3P8 zx8zsx`*whiqwNq%KEA0N%gva@LbxZjx{++NuV?pXe6kuS3^BUX7QrkAadJ8S*bskP zP*@=kpg(%l9!I~6_CavPj~3VTB{I|~-f!y*R^fGv1xKejkhUKcxE7`ky;f$v=^$^{ zOKNAusef1di(&k$q5Z#)Q{Uc(3E%PdKpNxGxeVXP(ar3Sm@{J&|b&PH9Z?U};cY*&+SEWLfGsAiZz&$GFU*7?e z=ZH>oX;*%wJ}Iv*alSC+dpP{9N_1|ZrhLMQ8<$@U=IB{(Ca;*nh8<}_b9k@fN9Yc& zcHwA??(MUQ^x~9yu2&XL4bf{d8|@W3BTwEKejD?-P36qQZPJ7s$u1OCs*MH7x+@+= z;%y>G8P-KTnxb4kq3rp6sX3t$_sf**1xJ z3@hyjQMV$wjf)T`)YHn+e=}hRuzPuq5OO87V(SB&qZ32^gAQ7R!gijBy%iw$Nr&fB zr$5ipez!Z#O$B-xHd7P1cVW*0PMX5rH7yy=KZ_!3fU5Zty#tU>kTOaxg9?Qwx0z0A z*3Gnk5<|7;UU|a78FVSzpg+U5NTYb>8gj%Qtp_Kb(_)>Y!NI1tP;!(Bd{w^XN8K5A zc8sRgME=Q$igv=G({lQbu=PDvBJphEnbSHrFNrMqdr z;uK%&O2?)!WM7&!TVvmkF5OPU;_9i!Op04%bUGzLFOnDpc3>O}d7)lG+bY_44Q6pz+AXp+xGD=N_Zw!6)|}6nm~HWxe?hh?V&Y9x|n<{D*~a@PR*r;}8{wTr6m8i7lu6 z{5Xx!oW>hj+?t>6nUZ>}sPgtFLS}KRk6zF&{Cx+Ih2zSLc}&E*0%L>m2>$3&uIkGs z-u8NXHiaJMz)&tdax)oi1ne{Hlvtkt4Lqq5&e2dLw>E#SR5T0H`SY}DN5;=@3jRUX z*ate%m<23@eGzvHWe;k^uMixL{|hcZHh7hoN5#P+nI^My3ZsR5ZBL*zSftFeJ5n4oM{wnK9$rg z4EZ#S92{EyRKXZ2uF=YjmvM@ACqJS*Ak6Vmsu8W(sv8`q4wV#4%nK^9nz`0>n=L+= z{j~15lt?w8U7=U(0GHrAC|^?kax%%KYvFv`OR8vLXZW!D5S*g*BEe`@EJX%}U9t=l@2&>)M zNLz=o}gGzbtq^&qiP-_fU;>Hz3}x5iMJ)QVJ2o=a1e^iN)!x`UO#Cn zi?NJe=?hM5#q=U3Mo$ry(n);XSgw_z=MV4tx3Zs(5Kl3svf6C90J8o>Xa|Fp-i!(Z z2UCZVPd!A_rkBwW&naOYj-5PVy}{vg?)7O;ZfESby??+bMU_gj&0qo0$8;Ru71u?* zM)1?viRk1dBU@5VA6y(0QT_RO`p~V$YaXYJ6Xnk;Lt2YsCfhC#jf6ueRp3`NkTS_p zOD@Eu*SD6k{fiFdp9(BZAD(b-^F&n6#7b;eVxE8pTK=p!k{h%QgiQGI8mOAzp3zI5 zxXKhBD|a=Y9|&8#>%h~A3JeG65)8}a5v^tG#-n&sYGoOBQRt@@#*Vv3^U z(t`iDttlE?#q_V<0}Gu>efV$g#D{!UKA=UnRY!hKf81tF-N)#2Ug&;xVMaIb;+sZU zsbSPi<`X}`o2wQ~ILxfc_0D3VjlD%@kAn+FlJXca zk`;CJ&25_q)*PAFdOk_BW=K_Z2R}msQh^Glyp8dc63ZLyI&421?>TAmDZ1FAwVNRf zS)Oa$0TSE!_e{i zVpHb#QG#_BAAmwq&PCub$?+m1D0h5p@+n^pUG`16EZ&nJ6F6Ti+&1e_D3K$eR45X} z99-~CT^Sf2esx`o*$Fw#vEtCF(2nm+WSL361W0q^JaD0*ke}-(ErIw0=#GH41MV?Y zC`yfVy#sq@qz$D*@#;I!73ChL`1rf?2<(mHa53@d4j`tVg2km^xt}e(%wF9zZTlFW znv}IE!V#lUqx{0jE75eFsRc$+f0zDjjwaCLTtpDb^Vbsb4VyZ!1LOsH_zdt-m^0wG zvmNLTkXqqH-IF&$R$6nqu%4|cV`hq34Q*u=r*c%&ewk}SwVuVS(2StCIXV|o2u*bL-T~g8 zC4pnxCW9Y>fn(%tWRKSp{V_K=D~lx+-!d8ZB`3?T8P&w9p-8nax*ip=zuzDI2J>Nv z;*OmdU?h(-95-MLn}>V{!PD_7N@@ov@h1c`xSs9+TWXnU`={|h?mhfnHvi^glvU$h|z&kn0shSR;qkAKv3Z#hw0 z8sMJ!=Oi>=*AQZ`uBObN1EZdNtm9 z8B3)0Doq_FeSs6N`v0?iCVGWnR*y!FcfmQ~9>pnGq4sx`)4n?ZF_CiVm_E6vMo6K* zqU}V;N}t?=C+JtmawI3*Gcys%+5Qe4T!!vENr)!SO-Xh>#YkQ0k=3&tGKT~^=s?!P zL#;J9G>&I?|CErClE3zaKQ<+9_pb2o7q+iRny6HtAO*?b5J%~=}@EENCXPy(Uv*hk#~YDm0;OY)wkrm$Z;4If~qk#XSSR%sL91Meod z)LH09%eJxcS+!3Mnn4>L=SAH^$7=SIeKaq+{p11SGeO%MLIF=HmQG^ZIGTw8L=T63 z@x4MWE5k|$y-eV6EH2A&drF%FD|ni}xSf57PoaG;qzyB4>c0J+V{1d4_wYaYvLc zb=_8s>Vt$pwh$n-)2GQH250R2v%L!f9hE5km+ArmG1-0Sivt_-+}NA`+bGNzI|hf# zv-7@iqRYw+a?P<}m!FLV4Y?m=WZ-rC%Fn{dBjQ7Nc_U$%?%!J$5#!b;e}kj z`+|e_c?k3bbNjh|i8NAsl3;5Ds6fBKr(($&FX_c_kJ8i*VtW-Svv+&|KbJIlMn(1< zW}!2tBdovY6`~|E88P=fiF}xTKVS#&LVxbFCdPey`y_hpbXG&K_%+%=~augJgyis1*g=NusSwH!-CeJS2rbK+& zHbDBmVeJkuz@oc7V9Fv4-Xe$kXkz=sB(X~ahhQ&#P^MR@*UNHfJ@FVu*W{g63{6mq z9NwCzlb-XsQSY^u`HNop(;IvCBU&)m;kbrbPR1Dhdb~L0my~Zs3vnf#=g#xgES^`( zPs=7U-M%?bVLm0s@qr4jCLNPi1gC>CO}oynytVCvR)f9TW|&7Wf#Exk=#;?sHL5_@ zPyN1Y(HtmLa1tgEH@o;Ir(7v9ps@hXxB{Pc=})Dj4G%6XoLG(jq^MQv79h;eRQsl+ zQ2qt)fu8u6G-FcZJ(3hTo@m`2xJNzJRjQjITQ~OfaSLE8t?%&TFx!&2dK&cu+uAtT ze;wtvE_xD+7wdc(>5$YFFIDW+>XCn_fZ-;do?oXCd9=&8d=v9=2cRegcbz7VGuS7H zj|>Y9mUV-LEaAz)6Y#H1Q;J%F@|$|8esE5PAKG6lnT>oKl(L>?M+#2*nz7n-fn@G` zK{iW@!}zJJYwpwQk$TC3inp()iRsesQrx>*kvB}FqGLO+$h1y;Z{2r~^+Cn!S9=oJ z$5cMXiI~zT>u}`G?cYr0U86uxD6-rYkIfA}G%HGYc8E9YB;oQFTjU)Nz$3_@Yc`h+Q zg@ZQYEs8oJTPj@-Bd!2cC2$1z2H+G8*{7{hG=X1)cO|~ZtLKgNhMlBiJdce2GHEll zrg64tQTDuR`vC4H>Zm}CTW6IiC2@+@)P9}i17Ta$e4U_`rHM&hehR+?yAjW_&tV5} zCe{7)c}V~M^y%019e`(iSaSO@gX0=*F_R56w&Df3ru1t+>SCJw4?d0vFIshn(j{ju zx-D4(;3oJV?9KntzWrw%+ZVo0rVH=6{5hL)1Rsp>n@Jct%B4?;Y$SDNPPpS8J27?0sUJw< zo#-MXeRA)MYW3dP8te3|un$*VKBdPgSOUVJnfo6W#~y4$@$wKcm2Bn8cZ_u7Fg6+G z{nVwfkdN<&q0y%%-qS<(J`)TE)Suix;AI7b*sN_t>e9H)`wmnI|W4~X4Wp3VM zr3ckcKU1nTa|bV5t5;pL@t9ECAFs_P$8QQSg1|$jI{v^b5|$>4>Aj-pw~s*V%_;Xe z96FV-ET^{^IdJXMjq&W~Y-Q+^Xx27XEEm=TeG|rWqbg)pjQG5`)b?;ClXp{NhH?({ zrFNdlH|$-$iLkDN@#AyE%TH(ZowO8*Seml_tno(_LE_m`;IBdQi{_vwp8j^BY{Zsz z%;KKkHnqvFH~-%ED9IgwCcrhH+fb^h+tcv87{!#9YolvuTN?DZ)Mw$x;s|yh8h1-p zC1aGFK_TIKOb@-%|10{y2E4KsOSR~{peIwd5hhG}YYdSsk?y`1m zg8P(A&CI^h+Jg!JJ2Mc!Nzo~unqzPYMUZ4KgRzH+Ox(UlWD`+~>%jyVKhx7qgD*xt zXBAIpt(MjFt$2uRuUs%D3gJK}i}%okR!1>Mo4joJJKi^n}_55=3Q}F$KBgUI?ld5a5d4XT)1-evBKt_t0q$vG!DT{J3!fs4^C?5 z86CAFVw2WCKh>GK80ui~5jdBrv5@CwR40f~ddc~RgN-j28#t7h50gOSa*>iW4!7XT zQBUpgn;*j~H9zRo%}gA=U?B*dwZ7)QeF!s%r0mh}QTJ_^rg>A;Ba8%Qo&EMlKR$M& zX+_!gv7KExlv;Babc{+=Z)R3@e8U#N1iyneT8BOyHxJr84SVwKDPr?dEf+Z49bBT< zQx`ZQf+EZLK3Ax!q=z2046+@(1EFi3JeFbe_1fO#5vKDQGHysVR*>S!)&nI+L!x95e21b13j z@OM~pyc%N!Ucb<(&IdXOd?{>%m5CL6S}W>`Y|A`c@?67p-vXZ-Ru>zZA4^4f ztLa-0I4-$@=AAOt5#6CAIf~Qjdf-BKy(yI`MnPEXU7;s_AxL2aTI-HARmpd9VGcZq zZ2Y9=4!L~mVN}qJsTPdM8sCD@=uo8o>tap~MZwQLt4w^8K{1}$ zm-^Wyf?IFYygo~}`W>5VK}u7=s2XoPPjp3JyJowqewPVsWZ`3kdbai{@e?ltVcp%_ zY8g(q*_5urAAtAqiqrtmeuGeFeikWB3K z^imiJ#z?_p#((}5?!Wy-jBq%v1_?2dzrYxq6{alsmikR%x;Tuq0!#h2pOtEb>KrO* zevo=B1s(;}_}<@*FTRpp`uyh=tvVHsddZ!D6paT@aH)7@*O~IFsvivL zmvy34^4O$?1MCPE*ll-kC2)=Up@9e}s=x1F@ zGuX5L*ZYAko8^T5O8<4)Kk@*ehK{3w4H%A}1;zvpO|55&jSs*diSSqR8Yg2ww~TTW zO=##GJ!Z_%K`)*F@k=gk#!vL`us}Lx0``% zeOHVW-yAzG;of5Dp$#0Y=~C|vG4te+ip#{O+F$9yW0Ibt&Q?1wGL)M}8l4sT?gtfC2EWSNzt*t#+UBzOC(WK|1Juo-XwNV`sM*6tsZ(}I?D&fNJ zS@n+!$i_vXG~9jffkdwT86t`*irK%06s}&;dL5k5ETFQzD+(rxPbQ9?*1Z z2YBAz9C{)49^dAd+jaZ~C(J83AM#!NH>m>u^?34Mt>C}H{kK>3zs+m-uQU69+Q(lB z^jEn5R|`46Y$8ixLy+bvPr6<+_-aXp_KM3-UA}*?jvhHGZu9M8;if_4bXZRF!Xe$y z|CvSpKlT6djpbkTbMm9EvHsB-edqEL&k7evj^^N^WLj(uQ(N#kdIj8@kN2m&H-;8V zF?=*r)nyhp&n12y{o46NtmGPUvY4zvIZ3^6K3W!$Jc-Sy?aRD?+QsbzAwfj zrOo1~=GkkGDc4qkQVodtX-2B^peqKQY9v5#c90^V=x5R(D_LN{rCxGjL~?7CIoMM?;I;_#+qQ=4Og1#-qUZfVBs4k zm%_!;3uOOD=F90;V6nNoANWZ-Np(ee)4|wXP(Fo?%KLL0nM4!8PmCdCX={2RE_vvSsBXZ(z1rRTdpiCDI3wN z$IB{PGj%)UV5<8S(nI#&YLQA6T3`N`5k}ra6Hmh@w-?Em>A8Vz0yxmx*^L2b%;$~U z<#CAHm!5+(#(tW5lcS-KnzdGEFm&h4RX4^kyfL`DSR($j0~WM8>;fNCG6`$Peh^lq zTzl(�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 literal 0 HcmV?d00001 diff --git a/docs/tutorial/fig/forward_backward.png b/docs/tutorial/fig/forward_backward.png new file mode 100644 index 0000000000000000000000000000000000000000..d2f46c39bf4daf180758b7dc25c59d2960fcd91b GIT binary patch literal 57267 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 bE<_AsUoibVOZY7nybR**?Bi5-JoMtf%Yx(F literal 0 HcmV?d00001 diff --git a/docs/tutorial/fig/layer.jpg b/docs/tutorial/fig/layer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5075381cdad4202802bbee21813d4a8127fcc591 GIT binary patch literal 54757 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%0A-F&$S4#3}iE2dsM3|~$>PoOQC9@QIr+VL8622db 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

      o)OA4NTp!w$>NGq<&$2IvO6)f6@UUREs@_FfjeW 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 literal 0 HcmV?d00001 diff --git a/docs/tutorial/fig/logreg.jpg b/docs/tutorial/fig/logreg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..480f519a826d96218b559faf632c0e1f5158bfa0 GIT binary patch literal 42966 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 G|4jfG2({$^ literal 0 HcmV?d00001 diff --git a/docs/tutorial/forward_backward.md b/docs/tutorial/forward_backward.md index 52376e6aa82..8e740262817 100644 --- a/docs/tutorial/forward_backward.md +++ b/docs/tutorial/forward_backward.md @@ -1,4 +1,37 @@ --- layout: default --- -# The Forward / Backward Passes +# Forward and Backward + +The forward and backward passes are the essential computations of a [Net](net_layer_blob.html). + +Forward and Backward + +Let's consider a simple logistic regression classifier. + +The **forward** pass computes the output given the input for inference. +In forward Caffe composes the computation of each layer to compute the "function" represented by the model. +This pass goes from bottom to top. + +Forward pass + +The data $x$ is passed through an inner product layer for $g(x)$ then through a softmax for $h(g(x))$ and softmax loss to give $f_W(x)$. + +The **backward** pass computes the gradient given the loss for learning. +In backward Caffe reverse-composes the gradient of each layer to compute the gradient of the whole model by automatic differentiation. +This is back-propagation. +This pass goes from top to bottom. + +Backward pass + +The backward pass begins with the loss and computes the gradient with respect to the output $\frac{\partial f_W}{\partial h}$. The gradient with respect to the rest of the model is computed layer-by-layer through the chain rule. Layers with parameters, like the `INNER_PRODUCT` layer, compute the gradient with respect to their parameters $\frac{\partial f_W}{\partial W_{\text{ip}}}$ during the backward step. + +These computations follow immediately from defining the model: Caffe plans and carries out the forward and backward passes for you. + +- The `Net::Forward()` and `Net::Backward()` methods carry out the respective passes while `Layer::Forward()` and `Layer::Backward()` compute each step. +- Every layer type has `forward_{cpu,gpu}()` and `backward_{cpu,gpu}` methods to compute its steps according to the mode of computation. A layer may only implement CPU or GPU mode due to constraints or convenience. + +The [Solver](solver.html) optimizes a model by first calling forward to yield the output and loss, then calling backward to generate the gradient of the model, and then incorporating the gradient into a weight update that attempts to minimize the loss. Division of labor between the Solver, Net, and Layer keep Caffe modular and open to development. + +For the details of the forward and backward steps of Caffe's layer types, refer to the [layer catalogue](layers.html). + diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md new file mode 100644 index 00000000000..e9f593e48d0 --- /dev/null +++ b/docs/tutorial/index.md @@ -0,0 +1,44 @@ +--- +layout: default +--- +# Caffe Tutorial + +Caffe is a deep learning framework and this tutorial explains its philosophy, architecture, and usage. +This is a practical guide and framework introduction, so the full frontier, context, and history of deep learning cannot be covered here. +While explanations will be given where possible, a background in machine learning and neural networks is helpful. + +## Philosophy + +In one sip, Caffe is brewed for + +- Expression: models and optimizations are defined as plaintext schemas instead of code. +- Speed: for research and industry alike speed is crucial for state-of-the-art models and massive data. +- Modularity: new tasks and settings require flexibility and extension. +- Openness: scientific and applied progress call for common code, reference models, and reproducibility. +- Community: academic research, startup prototypes, and industrial applications all share strength by joint discussion and development in a BSD-2 project. + +and these principles direct the project. + +## Tour + +- [Nets, Layers, and Blobs](net_layer_blob.html): the anatomy of a Caffe model. +- [Forward / Backward](forward_backward.html): the essential computations of layered compositional models. +- [Loss](loss.html): the task to be learned is defined by the loss. +- [Solver Optimization](solver.html): the solver coordinates model optimization. +- [Layer Catalogue](layers.html): the layer is the fundamental unit of modeling and computation -- Caffe's catalogue includes layers for state-of-the-art models. +- [Interfaces](interfaces.html): command line, Python, and MATLAB Caffe. + +## Deeper Learning + +There are helpful references freely online for deep learning that complement our hands-on tutorial. +These cover introductory and advanced material, background and history, and the latest advances. + +A broad introduction is given in the free online draft of [Neural Networks and Deep Learning](http://neuralnetworksanddeeplearning.com/index.html) by Michael Nielsen. In particular the chapters on using neural nets and how backpropagation works are helpful if you are new to the subject. + +These recent academic tutorials explain deep learning for researchers in machine learning and vision: + +- [Deep Learning Tutorial](http://www.cs.nyu.edu/~yann/talks/lecun-ranzato-icml2013.pdf) by Yann LeCun (NYU, Facebook) and Marc'Aurelio Ranzato (Facebook). ICML 2013 tutorial. +- [Large-Scale Visual Recognition: Deep Learning Tutorial](https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxsc3ZydHV0b3JpYWxjdnByMTR8Z3g6Njg5MmZkZTM1MDhhZWNmZA) by Marc'Aurelio Ranzato (Facebook). CPVR 2014 tutorial. +- [LISA Deep Learning Tutorial](http://deeplearning.net/tutorial/deeplearning.pdf) by the LISA Lab directed by Yoshua Bengio (U. Montréal). + +For an exposition of neural networks in circuits and code, check out [Understanding Neural Networks from a Programmer's Perspective](http://karpathy.github.io/neuralnets/) by Andrej Karpathy (Stanford). diff --git a/docs/tutorial/interfaces.md b/docs/tutorial/interfaces.md new file mode 100644 index 00000000000..33323410a16 --- /dev/null +++ b/docs/tutorial/interfaces.md @@ -0,0 +1,68 @@ +--- +layout: default +--- +# Interfaces + +Caffe has command line, Python, and MATLAB interfaces for day-to-day usage, interfacing with research code, and rapid prototyping. While Caffe is a C++ library at heart and it exposes a modular interface for development, not every occasion calls for custom compilation. The cmdcaffe, pycaffe, and matcaffe interfaces are here for you. + +## Command Line + +The command line interface -- cmdcaffe -- is the `caffe` tool for model training, scoring, and diagnostics. Run `caffe` without any arguments for help. This tool and others are found in caffe/build/tools. (The following example calls require completing the LeNet / MNIST example first.) + +**Training**: `caffe train` learns models from scratch, resumes learning from saved snapshots, and fine-tunes models to new data and tasks. All training requires a solver configuration through the `-solver solver.prototxt` argument. Resuming requires the `-snapshot model_iter_1000.solverstate` argument to load the solver snapshot. Fine-tuning requires the `-weights model.caffemodel` argument for the model initialization. + + # train LeNet + caffe train -solver examples/mnist/lenet_solver.prototxt + # train on GPU 2 + caffe train -solver examples/mnist/lenet_solver.prototxt -gpu 2 + # resume training from the half-way point snapshot + caffe train -solver examples/mnist/lenet_solver.prototxt -snapshot examples/mnist/lenet_iter_5000.solverstate + +For a full example of fine-tuning, see examples/finetuning_on_flickr_style, but the training call alone is + + # fine-tune CaffeNet model weights for style recognition + caffe train -solver examples/finetuning_on_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel + +**Testing**: `caffe test` scores models by running them in the test phase and reports the net output as its score. The net architecture must be properly defined to output an accuracy measure or loss as its output. The per-batch score is reported and then the grand average is reported last. + + # + # score the learned LeNet model on the validation set as defined in the model architeture lenet_train_test.prototxt + caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000 -gpu 0 -iterations 100 + +**Benchmarking**: `caffe time` benchmarks model execution layer-by-layer through timing and synchronization. This is useful to check system performance and measure relative execution times for models. + + # (These example calls require you complete the LeNet / MNIST example first.) + # time LeNet training on CPU for 10 iterations + caffe time -model examples/mnist/lenet_train_test.prototxt -iterations 10 + # time a model architecture with the given weights on the first GPU for 10 iterations + # time LeNet training on GPU for the default 50 iterations + caffe time -model examples/mnist/lenet_train_test.prototxt -gpu 0 + +**Diagnostics**: `caffe device_query` reports GPU details for reference and checking device ordinals for running on a given device in multi-GPU machines. + + # query the first device + caffe device_query -gpu 0 + +## Python + +The Python interface -- pycaffe -- is the `caffe` module and its scripts in caffe/python. `import caffe` to load models, do forward and backward, handle IO, visualize networks, and even instrument model solving. All model data, derivatives, and parameters are exposed for reading and writing. + +- `caffe.Net` is the central interface for loading, configuring, and running models. `caffe.Classsifier` and `caffe.Detector` provide convenience interfaces for common tasks. +- `caffe.SGDSolver` exposes the solving interface. +- `caffe.io` handles input / output with preprocessing and protocol buffers. +- `caffe.draw` visualizes network architectures. +- Caffe blobs are exposed as numpy ndarrays for ease-of-use and efficiency. + +Tutorial IPython notebooks are found in caffe/examples: do `ipython notebook caffe/examples` to try them. For developer reference docstrings can be found throughout the code. + +Compile pycaffe by `make pycaffe`. The module dir caffe/python/caffe should be installed in your PYTHONPATH for `import caffe`. + +## MATLAB + +The MATLAB interface -- matcaffe -- is the `caffe` mex and its helper m-files in caffe/matlab. Load models, do forward and backward, extract output and read-only model weights, and load the binaryproto format mean as a matrix. + +A MATLAB demo is in caffe/matlab/caffe/matcaffe_demo.m + +Note that MATLAB matrices and memory are in column-major layout counter to Caffe's row-major layout! Double-check your work accordingly. + +Compile matcaffe by `make matcaffe`. diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index de2d5526dcb..74b2675755e 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -1,4 +1,150 @@ --- layout: default --- -# Data: Ins and Outs +# Layers + +To create a Caffe model you need to define the model architecture in a protocol buffer definition file (prototxt). + +Caffe layers and their parameters are defined in the protocol buffer definitions for the project in [caffe.proto](https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto). The latest definitions are in the [dev caffe.proto](https://github.com/BVLC/caffe/blob/dev/src/caffe/proto/caffe.proto). + +TODO complete list of layers linking to headings + +### Vision Layers + +#### Convolution + +`CONVOLUTION` + +#### Pooling** + +`POOLING` + +#### Local Response Normalization + +`LRN` + +#### im2col + +`IM2COL` is a helper for doing the image-to-column transformation that you most likely do not need to know about. + +### Loss Layers + +Loss drives learning by comparing an output to a target and assigning cost to minimize. The loss itself is computed by the forward pass and the gradient w.r.t. to the loss is computed by the backward pass. + +#### Softmax + +`SOFTMAX_LOSS` + +#### Sum-of-Squares / Euclidean + +`EUCLIDEAN_LOSS` + +#### Hinge / Margin + +`HINGE_LOSS` + +#### Sigmoid Cross-Entropy + +`SIGMOID_CROSS_ENTROPY_LOSS` + +#### Infogain + +`INFOGAIN_LOSS` + +#### Accuracy and Top-k + +`ACCURACY` scores the output as the accuracy of output with respect to target -- it is not actually a loss and has no backward step. + +### Activation / Neuron Layers + +#### ReLU / Rectified-Linear and Leaky ReLU + +`RELU` + +#### Sigmoid + +`SIGMOID` + +#### TanH / Hyperbolic Tangent + +`TANH` + +#### Absolute Value + +`ABSVAL` + +#### Power + +`POWER` + +#### BNLL + +`BNLL` + +### Data Layers + +#### Database + +`DATA` + +#### In-Memory + +`MEMORY_DATA` + +#### HDF5 Input + +`HDF5_DATA` + +#### HDF5 Output + +`HDF5_OUTPUT` + +#### Images + +`IMAGE_DATA` + +#### Windows + +`WINDOW_DATA` + +#### Dummy + +`DUMMY_DATA` is for development and debugging. See `DummyDataParameter`. + +### Common Layers + +#### Inner Product + +`INNER_PRODUCT` + +#### Splitting + +`SPLIT` + +#### Flattening + +`FLATTEN` + +#### Concatenation + +`CONCAT` + +#### Slicing + +`SLICE` + +#### Elementwise Operations + +`ELTWISE` + +#### Argmax + +`ARGMAX` + +#### Softmax + +`SOFTMAX` + +#### Mean-Variance Normalization + +`MVN` diff --git a/docs/tutorial/loss.md b/docs/tutorial/loss.md index 59c626dc318..b470eaf943e 100644 --- a/docs/tutorial/loss.md +++ b/docs/tutorial/loss.md @@ -2,3 +2,56 @@ layout: default --- # Loss + +In Caffe, as in most of machine learning, learning is driven by a **loss** function (also known as an **error**, **cost**, or **objective** function). +A loss function specifies the goal of learning by mapping parameter settings (i.e., the current network weights) to a scalar value specifying the "badness" of these parameter settings. +Hence, the goal of learning is to find a setting of the weights that *minimizes* the loss function. + +The loss in Caffe is computed by the Forward pass of the network. +Each layer takes a set of input (`bottom`) blobs and produces a set of output (`top`) blobs. +Some of these layers' outputs may be used in the loss function. +A typical choice of loss function for one-versus-all classification tasks is the `SOFTMAX_LOSS` function, used in a network definition as follows, for example: + +``` +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "pred" + bottom: "label" + top: "loss" +} +``` + +In a `SOFTMAX_LOSS` function, the `top` blob is a scalar (dimensions $1 \times 1 \times 1 \times 1$) which averages the loss (computed from predicted labels `pred` and actuals labels `label`) over the entire mini-batch. + +### Loss weights + +For nets with multiple layers producing a loss (e.g., a network that both classifies the input using a `SOFTMAX_LOSS` layer and reconstructs it using a `EUCLIDEAN_LOSS` layer), *loss weights* can be used to specify their relative importance. + +By convention, Caffe layer types with the suffix `_LOSS` contribute to the loss function, but other layers are assumed to be purely used for intermediate computations. +However, any layer can be used as a loss by adding a field `loss_weight: ` to a layer definition for each `top` blob produced by the layer. +Layers with the suffix `_LOSS` have an implicit `loss_weight: 1` for the first `top` blob (and `loss_weight: 0` for any additional `top`s); other layers have an implicit `loss_weight: 0` for all `top`s. +So, the above `SOFTMAX_LOSS` layer could be equivalently written as: + +``` +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "pred" + bottom: "label" + top: "loss" + loss_weight: 1 +} +``` + +However, *any* layer able to backpropagate may be given a non-zero `loss_weight`, allowing one to, for example, regularize the activations produced by some intermediate layer(s) of the network if desired. +For non-singleton outputs with an associated non-zero loss, the loss is computed simply by summing over all entries of the blob. + +The final loss in Caffe, then, is computed by summing the total weighted loss over the network, as in the following pseudo-code: + +``` +loss := 0 +for layer in layers: + for top, loss_weight in layer.tops, layer.loss_weights: + loss += loss_weight * sum(top) +``` diff --git a/docs/tutorial/net_layer_blob.md b/docs/tutorial/net_layer_blob.md index 0d8cc4b4d72..21de96c8035 100644 --- a/docs/tutorial/net_layer_blob.md +++ b/docs/tutorial/net_layer_blob.md @@ -2,3 +2,136 @@ layout: default --- # Nets, Layers, and Blobs: anatomy of a Caffe model + +Deep networks are compositional models that are naturally represented as a collection of inter-connected layers. Caffe defines a net layer-by-layer in its own model schema. The network defines the entire model bottom-to-top from input data to loss. As data and derivatives flow through the network in the [forward and backward passes](forward_backward.html) Caffe stores, communicates, and manipulates the information as *blobs*: the blob is the standard array and unified memory interface for the framework. + +[Solving](solver.html) is configured separately to decouple modeling and optimization. + +The layer comes first as the foundation of both model and computation. The net follows as the collection and connection of layers. The details of blob describe how information is stored and communicated in and across layers and nets. + +## Layer computation and connections + +The layer is the essence of a model and the fundamental unit of computation. Layers convolve filters, pool, take inner products, apply nonlinearities like rectified-linear and sigmoid and other elementwise transformations, normalize, load data, and compute losses like softmax and hinge. [See the layer catalogue](layers.html) for all operations. All the types needed for state-of-the-art deep learning tasks are there. + +A layer with bottom and top blob. + +A layer takes input through *bottom* connections and makes output through *top* connections. + +Each layer type defines three critical computations: *setup*, *forward*, and *backward*. + +- Setup: initialize the layer and its connections once at model initialization. +- Forward: given input from bottom compute the output and send to the top. +- Backward: given the gradient w.r.t. the top output compute the gradient w.r.t. to the input and send to the bottom. A layer with parameters computes the gradient w.r.t. to its parameters and stores it internally. + +Layers have two key responsibilities for the operation of the network as a whole: a *forward pass* that takes the inputs and produces the outputs, and a *backward pass* that takes the gradient with respect to the output, and computes the gradients with respect to the parameters and to the inputs, which are in turn back-propagated to earlier layers. These passes are simply the composition of each layer's forward and backward. + +Developing custom layers requires minimal effort by the compositionality of the network and modularity of the code. Define the setup, forward, and backward for the layer and it is ready for inclusion in a net. + +## Net definition and operation + +The net jointly defines a function and its gradient by composition and auto-differentiation. The composition of every layer's output computes the function to do a given task, and the composition of every layer's backward computes the gradient from the loss to learn the task. Caffe models are end-to-end machine learning engines. + +The net is a set of layers connected in a computation graph -- a DAG / directed acyclic graph to be exact. Caffe does all the bookkeeping for any DAG of layers to ensure correctness of the forward and backward passes. A typical net begins with a data layer that loads from disk and ends with a loss layer that computes the objective for a task such as classification or reconstruction. + +The net is defined as a set of layers and their connections in a plaintext modeling language. +A simple logistic regression classifier + +Softmax Regression + +is defined by + + name: "LogReg" + layers { + name: "mnist" + type: DATA + top: "data" + top: "label" + data_param { + source: "input_leveldb" + batch_size: 64 + } + } + layers { + name: "ip" + type: INNER_PRODUCT + bottom: "data" + top: "ip" + inner_product_param { + num_output: 2 + } + } + layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "ip" + bottom: "label" + top: "loss" + } + +The Net explains its initialization as it goes: + + I0902 22:52:17.931977 2079114000 net.cpp:39] Initializing net from parameters: + name: "LogReg" + [...model prototxt printout...] + # construct the network layer-by-layer + I0902 22:52:17.932152 2079114000 net.cpp:67] Creating Layer mnist + I0902 22:52:17.932165 2079114000 net.cpp:356] mnist -> data + I0902 22:52:17.932188 2079114000 net.cpp:356] mnist -> label + I0902 22:52:17.932200 2079114000 net.cpp:96] Setting up mnist + I0902 22:52:17.935807 2079114000 data_layer.cpp:135] Opening leveldb input_leveldb + I0902 22:52:17.937155 2079114000 data_layer.cpp:195] output data size: 64,1,28,28 + I0902 22:52:17.938570 2079114000 net.cpp:103] Top shape: 64 1 28 28 (50176) + I0902 22:52:17.938593 2079114000 net.cpp:103] Top shape: 64 1 1 1 (64) + I0902 22:52:17.938611 2079114000 net.cpp:67] Creating Layer ip + I0902 22:52:17.938617 2079114000 net.cpp:394] ip <- data + I0902 22:52:17.939177 2079114000 net.cpp:356] ip -> ip + I0902 22:52:17.939196 2079114000 net.cpp:96] Setting up ip + I0902 22:52:17.940289 2079114000 net.cpp:103] Top shape: 64 2 1 1 (128) + I0902 22:52:17.941270 2079114000 net.cpp:67] Creating Layer loss + I0902 22:52:17.941305 2079114000 net.cpp:394] loss <- ip + I0902 22:52:17.941314 2079114000 net.cpp:394] loss <- label + I0902 22:52:17.941323 2079114000 net.cpp:356] loss -> loss + # set up the loss and configure the backward pass + I0902 22:52:17.941328 2079114000 net.cpp:96] Setting up loss + I0902 22:52:17.941328 2079114000 net.cpp:103] Top shape: 1 1 1 1 (1) + I0902 22:52:17.941329 2079114000 net.cpp:109] with loss weight 1 + I0902 22:52:17.941779 2079114000 net.cpp:170] loss needs backward computation. + I0902 22:52:17.941787 2079114000 net.cpp:170] ip needs backward computation. + I0902 22:52:17.941794 2079114000 net.cpp:172] mnist does not need backward computation. + # determine outputs + I0902 22:52:17.941800 2079114000 net.cpp:208] This network produces output loss + # finish initialization and report memory usage + I0902 22:52:17.941810 2079114000 net.cpp:467] Collecting Learning Rate and Weight Decay. + I0902 22:52:17.941818 2079114000 net.cpp:219] Network initialization done. + I0902 22:52:17.941824 2079114000 net.cpp:220] Memory required for data: 201476 + +Model initialization is handled by `Net::Init()`. + +The network is run on CPU or GPU by setting a single switch. Layers come with corresponding CPU and GPU routines that produce identical results (with tests to prove it). The CPU / GPU switch is seamless and independent of the model definition. For research and deployment alike it is best to divide model and implementation. + +## Blob storage and communication + +Caffe stores and communicates data in 4-dimensional arrays called blobs. Blobs provide a unified memory interface, holding data e.g. batches of images, model parameters, and derivatives for optimization. + +Blobs conceal the computational and mental overhead of mixed CPU/GPU operation by synchronizing from the CPU host to the GPU device as needed. In practice, one loads data from the disk to a blob in CPU code, calls a device kernel to do GPU computation, and ferries the blob off to the next layer, ignoring low-level details while maintaining a high level of performance. + +Memory on the host and device is allocated on demand (lazily) for efficient memory usage. + +The conventional blob dimensions for data are number N x channel K x height H x width W. Blob memory is row-major in layout so the last / rightmost dimension changes fastest. + +- Number / N is the batch size of the data. Batch processing achieves better throughput for communication and device processing. For an ImageNet training batch of 256 images B = 256. +- Channel / K is the feature dimension e.g. for RGB images K = 3. + +Caffe operations are general with respect to the channel dimension / K. Grayscale and hyperspectral imagery are fine. Caffe can likewise model and process arbitrary vectors in blobs with singleton. That is, the shape of blob holding 1000 vectors of 16 feature dimensions is 1000 x 16 x 1 x 1. + +Parameter blob dimensions vary according to the type and configuration of the layer. For a convolution layer with 96 filters of 11 x 11 spatial dimension and 3 inputs the blob is 96 x 3 x 11 x 11. For an inner product / fully-connected layer with 1000 output channels and 1024 input channels the parameter blob is 1 x 1 x 1000 x 4096. + +For custom data it may be necessary to hack your own input preparation tool or data layer. However once your data is in your job is done. The modularity of layers accomplishes the rest of the work for you. + +### Model format + +The models are defined in plaintext protocol buffer schema (prototxt) while the learned models are serialized as binary protocol buffer (binaryproto) .caffemodel files. + +The model format is defined by the protobuf schema in [caffe.proto](https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto). + +Caffe speaks [Google Protocol Buffer](https://code.google.com/p/protobuf/) for the following strengths: minimal-size binary strings when serialized, efficient serialization, a human-readable text format compatible with the binary version, and efficient interface implementations in multiple languages, most notably C++ and Python. This all contributes to the flexibility and extensibility of modeling in Caffe. diff --git a/docs/tutorial/solver.md b/docs/tutorial/solver.md index d6a95b42d20..992869f88a6 100644 --- a/docs/tutorial/solver.md +++ b/docs/tutorial/solver.md @@ -1,4 +1,179 @@ --- layout: default --- -# Solving +# Solver Optimization + +The solver orchestrates model optimization by coordinating the network's forward inference and backward gradients to form parameter updates that attempt to improve the loss. +The responsibilities of learning are divided between the solver for overseeing the optimization and generating parameter updates and the network for yielding loss and gradients. + +The Caffe solvers are Stochastic Gradient Descent (SGD), Adaptive Gradient (ADAGRAD), and Nesterov's Accelerated Gradient (NAG). + +The solver + +1. scaffolds the optimization bookkeeping and creates the training network for learning and test network(s) for evaluation. +2. iteratively optimizes by calling forward / backward and updating parameters +3. (periodically) evaluates the test networks +4. snapshots the model and solver state throughout the optimization + +where each iteration + +1. calls network forward to make the output and loss +2. calls network backward to make the gradients +3. incorporates the gradients into parameter updates according to the solver method +4. updates the solver state according to learning rate, history, and method + +to take the weights all the way from initialization to learned model. + +Like Caffe models, Caffe solvers run in CPU / GPU modes. + +## Methods + +The solver methods address the general optimization problem of loss minimization. +The optimization objective is the average loss over instances + +$L(W) = \frac{1}{N} \sum_i f_W^{(i)}\left(X^{(i)}\right) + \lambda r(W)$ + +where $f_W^{(i)}$ is the loss on instance $i$ with data $X^{(i)}$ in a mini-batch of size $N$ and $r(W)$ is a regularization term with weight $\lambda$. + +The model computes $f_W$ in the forward pass and the gradient $\nabla f_W$ in the backward pass. + +The gradient of the loss $\nabla L(W)$ is formed by the solver from the model gradient $\nabla f_W$, the regularlization gradient $r(W)$, and other particulars to each method. +The method then computes the parameter update $\Delta W$ to update the weights and iterate. + +### SGD + +Stochastic gradient descent (SGD) + +TODO Bottou pointer + +### ADAGRAD + +The adaptive gradient (ADAGRAD) + +TODO cite Duchi + +### NAG + +Nesterov's accelerated gradient (NAG) + +TODO cite ??? + +## Scaffolding + +The solver scaffolding prepares the optimization method and initializes the model to be learned in `Solver::Presolve()`. + + > caffe train -solver examples/mnist/lenet_solver.prototxt + I0902 13:35:56.474978 16020 caffe.cpp:90] Starting Optimization + I0902 13:35:56.475190 16020 solver.cpp:32] Initializing solver from parameters: + test_iter: 100 + test_interval: 500 + base_lr: 0.01 + display: 100 + max_iter: 10000 + lr_policy: "inv" + gamma: 0.0001 + power: 0.75 + momentum: 0.9 + weight_decay: 0.0005 + snapshot: 5000 + snapshot_prefix: "examples/mnist/lenet" + solver_mode: GPU + net: "examples/mnist/lenet_train_test.prototxt" + +Net initialization + + I0902 13:35:56.655681 16020 solver.cpp:72] Creating training net from net file: examples/mnist/lenet_train_test.prototxt + [...] + I0902 13:35:56.656740 16020 net.cpp:56] Memory required for data: 0 + I0902 13:35:56.656791 16020 net.cpp:67] Creating Layer mnist + I0902 13:35:56.656811 16020 net.cpp:356] mnist -> data + I0902 13:35:56.656846 16020 net.cpp:356] mnist -> label + I0902 13:35:56.656874 16020 net.cpp:96] Setting up mnist + I0902 13:35:56.694052 16020 data_layer.cpp:135] Opening lmdb examples/mnist/mnist_train_lmdb + I0902 13:35:56.701062 16020 data_layer.cpp:195] output data size: 64,1,28,28 + I0902 13:35:56.701146 16020 data_layer.cpp:236] Initializing prefetch + I0902 13:35:56.701196 16020 data_layer.cpp:238] Prefetch initialized. + I0902 13:35:56.701212 16020 net.cpp:103] Top shape: 64 1 28 28 (50176) + I0902 13:35:56.701230 16020 net.cpp:103] Top shape: 64 1 1 1 (64) + [...] + I0902 13:35:56.703737 16020 net.cpp:67] Creating Layer ip1 + I0902 13:35:56.703753 16020 net.cpp:394] ip1 <- pool2 + I0902 13:35:56.703778 16020 net.cpp:356] ip1 -> ip1 + I0902 13:35:56.703797 16020 net.cpp:96] Setting up ip1 + I0902 13:35:56.728127 16020 net.cpp:103] Top shape: 64 500 1 1 (32000) + I0902 13:35:56.728142 16020 net.cpp:113] Memory required for data: 5039360 + I0902 13:35:56.728175 16020 net.cpp:67] Creating Layer relu1 + I0902 13:35:56.728194 16020 net.cpp:394] relu1 <- ip1 + I0902 13:35:56.728219 16020 net.cpp:345] relu1 -> ip1 (in-place) + I0902 13:35:56.728240 16020 net.cpp:96] Setting up relu1 + I0902 13:35:56.728256 16020 net.cpp:103] Top shape: 64 500 1 1 (32000) + I0902 13:35:56.728270 16020 net.cpp:113] Memory required for data: 5167360 + I0902 13:35:56.728287 16020 net.cpp:67] Creating Layer ip2 + I0902 13:35:56.728304 16020 net.cpp:394] ip2 <- ip1 + I0902 13:35:56.728333 16020 net.cpp:356] ip2 -> ip2 + I0902 13:35:56.728356 16020 net.cpp:96] Setting up ip2 + I0902 13:35:56.728690 16020 net.cpp:103] Top shape: 64 10 1 1 (640) + I0902 13:35:56.728705 16020 net.cpp:113] Memory required for data: 5169920 + I0902 13:35:56.728734 16020 net.cpp:67] Creating Layer loss + I0902 13:35:56.728747 16020 net.cpp:394] loss <- ip2 + I0902 13:35:56.728767 16020 net.cpp:394] loss <- label + I0902 13:35:56.728786 16020 net.cpp:356] loss -> loss + I0902 13:35:56.728811 16020 net.cpp:96] Setting up loss + I0902 13:35:56.728837 16020 net.cpp:103] Top shape: 1 1 1 1 (1) + I0902 13:35:56.728849 16020 net.cpp:109] with loss weight 1 + I0902 13:35:56.728878 16020 net.cpp:113] Memory required for data: 5169924 + +Loss + + I0902 13:35:56.728893 16020 net.cpp:170] loss needs backward computation. + I0902 13:35:56.728909 16020 net.cpp:170] ip2 needs backward computation. + I0902 13:35:56.728924 16020 net.cpp:170] relu1 needs backward computation. + I0902 13:35:56.728938 16020 net.cpp:170] ip1 needs backward computation. + I0902 13:35:56.728953 16020 net.cpp:170] pool2 needs backward computation. + I0902 13:35:56.728970 16020 net.cpp:170] conv2 needs backward computation. + I0902 13:35:56.728984 16020 net.cpp:170] pool1 needs backward computation. + I0902 13:35:56.728998 16020 net.cpp:170] conv1 needs backward computation. + I0902 13:35:56.729014 16020 net.cpp:172] mnist does not need backward computation. + I0902 13:35:56.729027 16020 net.cpp:208] This network produces output loss + I0902 13:35:56.729053 16020 net.cpp:467] Collecting Learning Rate and Weight Decay. + I0902 13:35:56.729071 16020 net.cpp:219] Network initialization done. + I0902 13:35:56.729085 16020 net.cpp:220] Memory required for data: 5169924 + I0902 13:35:56.729277 16020 solver.cpp:156] Creating test net (#0) specified by net file: examples/mnist/lenet_train_test.prototxt + +Completion + + I0902 13:35:56.806970 16020 solver.cpp:46] Solver scaffolding done. + I0902 13:35:56.806984 16020 solver.cpp:165] Solving LeNet + + +## Updating Parameters + +The actual weight update is made by the solver then applied to the net parameters in `Solver::ComputeUpdateValue()`. + +TODO + +## Snapshotting and Resuming + +The solver snapshots the weights and its own state during training in `Solver::Snapshot()` and `Solver::SnapshotSolverState()`. +The weight snapshots export the learned model while the solver snapshots allow training to be resumed from a given point. +Training is resumed by `Solver::Restore()` and `Solver::RestoreSolverState()`. + +Weights are saved without extension while solver states are saved with `.solverstate` extension. +Both files will have an `_iter_N` suffix for the snapshot iteration number. + +Snapshotting is configured by: + + # The snapshot interval in iterations. + snapshot: 5000 + # File path prefix for snapshotting model weights and solver state. + # Note: this is relative to the invocation of the `caffe` utility, not the + # solver definition file. + snapshot_prefix: /path/to/model + # Snapshot the diff along with the weights. This can help debugging training + # but takes more storage. + snapshot_diff: false + # A final snapshot is saved at the end of training unless + # this flag is set to false. The default is true. + snapshot_after_train: true + +in the solver definition prototxt. From 17252db7a0d89eb66b76e5eec0df6e36cb6417a4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer Date: Wed, 3 Sep 2014 10:58:25 -0700 Subject: [PATCH 0631/2053] [docs] add note on Caffe convolution --- docs/tutorial/convolution.md | 9 +++++++++ docs/tutorial/index.md | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/docs/tutorial/convolution.md b/docs/tutorial/convolution.md index a8bd0e656ec..2119d640e71 100644 --- a/docs/tutorial/convolution.md +++ b/docs/tutorial/convolution.md @@ -2,3 +2,12 @@ layout: default --- # Caffeinated Convolution + +The Caffe strategy for convolution is to reduce the problem to matrix-matrix multiplication. +This linear algebra computation is highly-tuned in BLAS libraries and efficiently computed on GPU devices. + +For more details read Yangqing's [Convolution in Caffe: a memo](https://github.com/Yangqing/caffe/wiki/Convolution-in-Caffe:-a-memo). + +As it turns out, this same reduction was independently explored in the context of conv. nets by + +> K. Chellapilla, S. Puri, P. Simard, et al. High performance convolutional neural networks for document processing. In Tenth International Workshop on Frontiers in Handwriting Recognition, 2006. diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md index e9f593e48d0..5638e41f09d 100644 --- a/docs/tutorial/index.md +++ b/docs/tutorial/index.md @@ -28,6 +28,10 @@ and these principles direct the project. - [Layer Catalogue](layers.html): the layer is the fundamental unit of modeling and computation -- Caffe's catalogue includes layers for state-of-the-art models. - [Interfaces](interfaces.html): command line, Python, and MATLAB Caffe. +For a closer look at a few details: + +- [Caffeinated Convolution](convolution.html): how Caffe computes convolutions. + ## Deeper Learning There are helpful references freely online for deep learning that complement our hands-on tutorial. From d15405a4b0df53aaf296c77d5f1d81b4d2ffa9bf Mon Sep 17 00:00:00 2001 From: Jeff Donahue Date: Wed, 27 Aug 2014 21:16:18 -0700 Subject: [PATCH 0632/2053] use kramdown for markdown syntax; add mathjax --- docs/_config.yml | 1 + docs/_layouts/default.html | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 docs/_config.yml diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000000..10e6731ad27 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +markdown: kramdown diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index 756e8ebae1d..73c6d5873d3 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -1,6 +1,10 @@ + + From 59eaba19acb873034e007a5fe2f2a008bf078179 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 27 Aug 2014 19:38:13 -0700 Subject: [PATCH 0633/2053] [wip] vision layers, start convolution --- docs/tutorial/layers.md | 53 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 74b2675755e..f316e826bab 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -11,9 +11,60 @@ TODO complete list of layers linking to headings ### Vision Layers +* Header: `./include/caffe/vision_layers.hpp` + +Vision layers usually take *images* as input and produce other *images* as output. +A typical "image" in the real-world may have one color channel ($c = 1$), as in a grayscale image, or three color channels ($c = 3$) as in an RGB (red, green, blue) image. +But in this context, the distinguishing characteristic of an image is its spatial structure: usually an image has some non-trivial height $h > 1$ and width $w > 1$. +This 2D geometry naturally lends itself to certain decisions about how to process the input. +In particular, most of the vision layers work by applying a particular operation to some region of the input to produce a corresponding region of the output. +In contrast, other layers (with few exceptions) ignore the spatial structure of the input, treating it as "one big vector" with dimension $$ c h w $$. + + #### Convolution -`CONVOLUTION` +* LayerType: `CONVOLUTION` +* CPU implementation: `./src/caffe/layers/convolution_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/convolution_layer.cu` +* Options (`ConvolutionParameter convolution_param`) + - Required | `num_output` ($c_o$), the number of filters + - Required: `kernel_size` or (`kernel_h`, `kernel_w`), specifies height & width of each filter + - Strongly recommended (default `type: 'constant' value: 0`): `weight_filler` + - Optional (default `true`): `bias_term`, specifies whether to learn and apply a set of additive biases to the filter outputs + - Optional (default 0): `pad` or (`pad_h`, `pad_w`), specifies the number of pixels to (implicitly) add to each side of the input + - Optional (default 1): `stride` or (`stride_h`, `stride_w`), specifies the intervals at which to apply the filters to the input + - Optional (default 1): `group` ($g$) if $>1$, restricts the connectivity of each filter to a subset of the input. In particular, the input to the $i^{th}$ group of $n_f / g$ filters is the $i^{th}$ group of $c_i / g$ input channels. +* Input + - $n \times c_i \times h_i \times w_i$ (repeated $K \ge 1$ times) +* Output + - $n \times c_o \times h_o \times w_o$ (repeated $K$ times) +* Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) + + layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + blobs_lr: 1 # learning rate multiplier for the filters + blobs_lr: 2 # learning rate multiplier for the biases + weight_decay: 1 # weight decay multiplier for the filters + weight_decay: 0 # weight decay multiplier for the biases + convolution_param { + num_output: 96 # learn 96 filters + kernel_size: 11 # each filter is 11x11 + stride: 4 # step 4 pixels between each filter application + weight_filler { + type: "gaussian" # initialize the filters from a Gaussian + std: 0.01 # distribution with stdev 0.01 (default mean: 0) + } + bias_filler { + type: "constant" # initialize the biases to zero (0) + value: 0 + } + } + } + +The `CONVOLUTION` layer convolves the input image with a set of learnable filters, each producing one feature map in the output image. #### Pooling** From eebf2e29aedca09ffc77526ea82d7a76d585e912 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 27 Aug 2014 22:21:49 -0700 Subject: [PATCH 0634/2053] add .Doxyfile: the default Doxygen config file from `doxygen -g` --- .Doxyfile | 1781 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1781 insertions(+) create mode 100644 .Doxyfile diff --git a/.Doxyfile b/.Doxyfile new file mode 100644 index 00000000000..552a39cf933 --- /dev/null +++ b/.Doxyfile @@ -0,0 +1,1781 @@ +# Doxyfile 1.7.6.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = "My Project" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +SYMBOL_CACHE_SIZE = 0 + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command <command> <input-file>, where <command> is the value of +# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command <filter> <input-file>, where <filter> +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# style sheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> +# Qt Help Project / Custom Filters</a>. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> +# Qt Help Project / Filter Attributes</a>. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the +# mathjax.org site, so you can quickly see the result without installing +# MathJax, but it is strongly recommended to install a local copy of MathJax +# before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = YES + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES From c34ed497ff35804048461445c85172217ba5ffd0 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 28 Aug 2014 01:44:02 -0700 Subject: [PATCH 0635/2053] add "make {docs,doxygen}" targets to build doxygen-generated docs --- Makefile | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index dd9ba5c8376..50e68acd84c 100644 --- a/Makefile +++ b/Makefile @@ -187,6 +187,25 @@ ALL_BUILD_DIRS := $(sort \ $(PROTO_BUILD_DIR) $(PROTO_BUILD_INCLUDE_DIR) $(PY_PROTO_BUILD_DIR) \ $(DISTRIBUTE_SUBDIRS)) +############################## +# Set directory for Doxygen-generated documentation +############################## +DOXYGEN_CONFIG_FILE ?= ./.Doxyfile +DOXYGEN_OUTPUT_DIR ?= ./doxygen # should be the same as OUTPUT_DIRECTORY in the .Doxyfile +DOXYGEN_COMMAND ?= doxygen +# All the files that might have Doxygen documentation. +DOXYGEN_SOURCES := $(shell find \ + src/$(PROJECT) \ + include/$(PROJECT) \ + python/ \ + matlab/ \ + examples \ + tools \ + -name "*.cpp" -or -name "*.hpp" -or -name "*.cu" -or -name "*.cuh" -or \ + -name "*.py" -or -name "*.m") +DOXYGEN_SOURCES += $(DOXYGEN_CONFIG_FILE) + + ############################## # Configure build ############################## @@ -301,7 +320,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo ############################## # Define build targets ############################## -.PHONY: all test clean linecount lint lintclean tools examples $(DIST_ALIASES) \ +.PHONY: all test clean docs linecount lint lintclean tools examples $(DIST_ALIASES) \ py mat py$(PROJECT) mat$(PROJECT) proto runtest \ superclean supercleanlist supercleanfiles warn everything @@ -317,6 +336,11 @@ lint: $(EMPTY_LINT_REPORT) lintclean: @ $(RM) -r $(LINT_OUTPUT_DIR) $(EMPTY_LINT_REPORT) $(NONEMPTY_LINT_REPORT) +docs: $(DOXYGEN_OUTPUT_DIR) + +$(DOXYGEN_OUTPUT_DIR): $(DOXYGEN_CONFIG_FILE) $(DOXYGEN_SOURCES) + $(DOXYGEN_COMMAND) $(DOXYGEN_CONFIG_FILE) + $(EMPTY_LINT_REPORT): $(LINT_OUTPUTS) | $(BUILD_DIR) @ cat $(LINT_OUTPUTS) > $@ @ if [ -s "$@" ]; then \ From 3223ca4c9865285863fcab888a3804891522c240 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 28 Aug 2014 01:48:49 -0700 Subject: [PATCH 0636/2053] .gitignore doxygen-generated documentation --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 62d96f8e9dd..9ba6de74561 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,7 @@ MANIFEST-* docs/_site docs/gathered _site +doxygen/ # Sublime Text settings *.sublime-workspace From ac9275bd6f6993a98dc4404db839d6bf6ccfb661 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 27 Aug 2014 22:39:51 -0700 Subject: [PATCH 0637/2053] .Doxyfile: modify to generate C++ docs, excluding tests --- .Doxyfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.Doxyfile b/.Doxyfile index 552a39cf933..432d4eda007 100644 --- a/.Doxyfile +++ b/.Doxyfile @@ -26,7 +26,7 @@ DOXYFILE_ENCODING = UTF-8 # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. -PROJECT_NAME = "My Project" +PROJECT_NAME = "Caffe" # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or @@ -52,7 +52,7 @@ PROJECT_LOGO = # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. -OUTPUT_DIRECTORY = +OUTPUT_DIRECTORY = ./doxygen/ # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output @@ -648,7 +648,7 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = +INPUT = ./include/caffe ./src/caffe # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is @@ -672,7 +672,7 @@ FILE_PATTERNS = # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. -RECURSIVE = NO +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a @@ -680,7 +680,7 @@ RECURSIVE = NO # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = +EXCLUDE = ./src/caffe/test/ ./include/caffe/test/ # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded @@ -1247,7 +1247,7 @@ PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. -EXTRA_PACKAGES = +EXTRA_PACKAGES = amsmath amsfonts xr # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until From afba4e6a38d49d0ca8d5324525b32e6de4a8a8c1 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Fri, 29 Aug 2014 03:31:08 -0700 Subject: [PATCH 0638/2053] .Doxyfile: don't warn if undocumented (maybe someday...) --- .Doxyfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.Doxyfile b/.Doxyfile index 432d4eda007..e0b64bdd6a0 100644 --- a/.Doxyfile +++ b/.Doxyfile @@ -595,7 +595,7 @@ CITE_BIB_FILES = # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. -QUIET = NO +QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank @@ -607,7 +607,7 @@ WARNINGS = YES # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. -WARN_IF_UNDOCUMENTED = YES +WARN_IF_UNDOCUMENTED = NO # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some From 55eebfd511e6fb98f1b62ab327293b9eff19212f Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 28 Aug 2014 00:24:12 -0700 Subject: [PATCH 0639/2053] layer.hpp: Doxygen-style documentation --- include/caffe/layer.hpp | 293 +++++++++++++++++++++++++++++++--------- 1 file changed, 226 insertions(+), 67 deletions(-) diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 2881fe25807..59e6ccf4ef9 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -12,12 +12,24 @@ namespace caffe { +/** + * @brief An interface for the units of computation which can be composed into a + * Net. + * + * Layer&s must implement a Forward function, in which they take their input + * (bottom) Blob&s (if any) and compute their output Blob&s (if any). + * They may also implement a Backward function, in which they compute the error + * gradients with respect to their input Blob&s, given the error gradients with + * their output Blob&s. + */ template <typename Dtype> class Layer { public: - // You should not implement your own constructor. Any set up code should go - // to SetUp(), where the dimensions of the bottom blobs are provided to the - // layer. + /** + * You should not implement your own constructor. Any set up code should go + * to SetUp(), where the dimensions of the bottom blobs are provided to the + * layer. + */ explicit Layer(const LayerParameter& param) : layer_param_(param) { // The only thing we do is to copy blobs if there are any. @@ -30,113 +42,229 @@ class Layer { } } virtual ~Layer() {} - // SetUp: implements common layer setup functionality, and calls - // LayerSetUp to do special layer setup for individual layer types. - // This method may not be overridden. + + /** + * @brief Implements common layer setup functionality. + * + * @param bottom the preshaped input blobs + * @param top + * the allocated but unshaped output blobs, to be shaped by LayerSetUp + * + * Checks that the number of bottom and top blobs is correct. + * Calls LayerSetUp to do special layer setup for individual layer types. + * Sets up the loss weight multiplier blobs for any non-zero loss weights. + * This method may not be overridden. + */ void SetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { CheckBlobCounts(bottom, *top); LayerSetUp(bottom, top); SetLossWeights(top); } - // LayerSetUp: your layer should implement this. + + /** + * @brief Does layer-specific setup: your layer should implement this. + * + * @param bottom + * the preshaped input blobs, whose data fields store the input data for + * this layer + * @param top + * the allocated but unshaped output blobs, to be initialized by LayerSetUp + * + * This method should be used to do layer-specific setup. At a minimum, this + * includes reshaping the empty top blobs to the shape as dictated by the + * shapes of the bottom blobs and any relevant parameters from the + * <code>layer_param_</code>. + */ virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { NOT_IMPLEMENTED; } - // Forward and backward wrappers. You should implement the cpu and - // gpu specific implementations instead, and should not change these - // functions. + /** + * @brief Given the bottom blobs, compute the top blobs and the loss. + * + * @param bottom + * the input blobs, whose data fields store the input data for this layer + * @param top + * the preshaped output blobs, whose data fields will store this layers' + * outputs + * \return The total loss from the layer. + * + * The Forward wrapper calls the relevant device wrapper function + * (Forward_cpu or Forward_gpu) to compute the top blob values given the + * bottom blobs. If the layer has any non-zero loss_weights, the wrapper + * then computes and returns the loss. + * + * Your layer should implement Forward_cpu and (optionally) Forward_gpu. + */ inline Dtype Forward(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Given the top blob error gradients, compute the bottom blob error + * gradients. + * + * @param top + * the output blobs, whose diff fields store the gradient of the error + * with respect to themselves + * @param propagate_down + * a vector with equal length to bottom, with each index indicating + * whether to propagate the error gradients down to the bottom blob at + * the corresponding index + * @param bottom + * the input blobs, whose diff fields will store the gradient of the error + * with respect to themselves after Backward is run + * + * The Backward wrapper calls the relevant device wrapper function + * (Backward_cpu or Backward_gpu) to compute the bottom blob diffs given the + * top blob diffs. + * + * Your layer should implement Forward_cpu and (optionally) Forward_gpu. + */ inline void Backward(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); - // Returns the vector of blobs. + /** + * @brief Returns the vector of learnable parameter blobs. + */ vector<shared_ptr<Blob<Dtype> > >& blobs() { return blobs_; } - // Returns the layer parameter + /** + * @brief Returns the layer parameter. + */ const LayerParameter& layer_param() const { return layer_param_; } - // Writes the layer parameter to a protocol buffer + + /** + * @brief Writes the layer parameter to a protocol buffer + */ virtual void ToProto(LayerParameter* param, bool write_diff = false); + /** + * @brief Returns the scalar loss associated with a top blob at a given index. + */ inline Dtype loss(const int top_index) const { return (loss_.size() > top_index) ? loss_[top_index] : Dtype(0); } + + /** + * @brief Sets the loss associated with a top blob at a given index. + */ inline void set_loss(const int top_index, const Dtype value) { if (loss_.size() <= top_index) { loss_.resize(top_index + 1, Dtype(0)); } loss_[top_index] = value; } - // Setup the weights associated with each top blob in the loss function. - // Store non-zero loss weights in the diff blob. - inline void SetLossWeights(vector<Blob<Dtype>*>* top) { - const int num_loss_weights = layer_param_.loss_weight_size(); - if (num_loss_weights) { - CHECK_EQ(top->size(), num_loss_weights) << "loss_weight must be " - "unspecified or specified once per top blob."; - for (int top_id = 0; top_id < top->size(); ++top_id) { - const Dtype loss_weight = layer_param_.loss_weight(top_id); - if (loss_weight == Dtype(0)) { continue; } - this->set_loss(top_id, loss_weight); - const int count = (*top)[top_id]->count(); - Dtype* loss_multiplier = (*top)[top_id]->mutable_cpu_diff(); - caffe_set(count, loss_weight, loss_multiplier); - } - } - } - // Returns the layer type as an enum value. + /** + * @brief Returns the layer type as an enum value. + */ virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_NONE; } - // Returns the layer type name. + /** + * @brief Returns the layer type name. + */ virtual inline const string& type_name() const { return LayerParameter_LayerType_Name(type()); } - // These methods can be overwritten to declare that this layer type expects - // a certain number of blobs as input and output. - // - // ExactNum{Bottom,Top}Blobs return a non-negative number to require an exact - // number of bottom/top blobs; the Min/Max versions return a non-negative - // number to require a minimum and/or maximum number of blobs. - // If Exact is specified, neither Min nor Max should be specified, and vice - // versa. These methods may not rely on SetUp having been called. + /** + * @brief Returns the exact number of bottom blobs required by the layer, + * or -1 if no exact number is required. + * + * This method should be overridden to return a non-negative value if your + * layer expects some exact number of bottom blobs. + */ virtual inline int ExactNumBottomBlobs() const { return -1; } + /** + * @brief Returns the minimum number of bottom blobs required by the layer, + * or -1 if no minimum number is required. + * + * This method should be overridden to return a non-negative value if your + * layer expects some minimum number of bottom blobs. + */ virtual inline int MinBottomBlobs() const { return -1; } + /** + * @brief Returns the maximum number of bottom blobs required by the layer, + * or -1 if no maximum number is required. + * + * This method should be overridden to return a non-negative value if your + * layer expects some maximum number of bottom blobs. + */ virtual inline int MaxBottomBlobs() const { return -1; } + /** + * @brief Returns the exact number of top blobs required by the layer, + * or -1 if no exact number is required. + * + * This method should be overridden to return a non-negative value if your + * layer expects some exact number of top blobs. + */ virtual inline int ExactNumTopBlobs() const { return -1; } + /** + * @brief Returns the minimum number of top blobs required by the layer, + * or -1 if no minimum number is required. + * + * This method should be overridden to return a non-negative value if your + * layer expects some minimum number of top blobs. + */ virtual inline int MinTopBlobs() const { return -1; } + /** + * @brief Returns the maximum number of top blobs required by the layer, + * or -1 if no maximum number is required. + * + * This method should be overridden to return a non-negative value if your + * layer expects some maximum number of top blobs. + */ virtual inline int MaxTopBlobs() const { return -1; } + /** + * @brief Returns true if the layer requires an equal number of bottom and + * top blobs. + * + * This method should be overridden to return true if your layer expects an + * equal number of bottom and top blobs. + */ + virtual inline bool EqualNumBottomTopBlobs() const { return false; } - // AutoTopBlobs may be overridden with a positive integer to automatically - // create enough "anonymous" top blobs to fulfill the requirement specified - // by ExactNumTopBlobs() or MinTopBlobs(). + /** + * @brief Return whether "anonymous" top blobs are created automatically + * by the layer. + * + * If this method returns true, Net::Init will create enough "anonymous" top + * blobs to fulfill the requirement specified by ExactNumTopBlobs() or + * MinTopBlobs(). + */ virtual inline bool AutoTopBlobs() const { return false; } - // EqualNumBottomTopBlobs should return true for layers requiring an equal - // number of bottom and top blobs. - virtual inline bool EqualNumBottomTopBlobs() const { return false; } - - // Declare for each bottom blob whether to allow force_backward -- that is, - // if AllowForceBackward(i) == false, we will ignore the force_backward - // setting and backpropagate to blob i only if it needs gradient information - // (as is done when force_backward == false). + /** + * @brief Return whether to allow force_backward for a given bottom blob + * index. + * + * If AllowForceBackward(i) == false, we will ignore the force_backward + * setting and backpropagate to blob i only if it needs gradient information + * (as is done when force_backward == false). + */ virtual inline bool AllowForceBackward(const int bottom_index) const { return true; } - // param_propagate_down specifies whether the layer should compute gradients - // in Backward. You can safely ignore false and always compute gradients - // for all parameters, but possibly with wasteful computation. + /** + * @brief Specifies whether the layer should compute gradients w.r.t. a + * parameter at a particular index given by param_id. + * + * You can safely ignore false values and always compute gradients + * for all parameters, but possibly with wasteful computation. + */ inline bool param_propagate_down(const int param_id) { return (param_propagate_down_.size() > param_id) ? param_propagate_down_[param_id] : false; } + /** + * @brief Sets whether the layer should compute gradients w.r.t. a + * parameter at a particular index given by param_id. + */ inline void set_param_propagate_down(const int param_id, const bool value) { if (param_propagate_down_.size() <= param_id) { param_propagate_down_.resize(param_id + 1, true); @@ -146,33 +274,42 @@ class Layer { protected: - // The protobuf that stores the layer parameters + /** The protobuf that stores the layer parameters */ LayerParameter layer_param_; - // The vector that stores the parameters as a set of blobs. + /** The vector that stores the learnable parameters as a set of blobs. */ vector<shared_ptr<Blob<Dtype> > > blobs_; - // Vector indicating whether to compute the diff of each param blob. + /** Vector indicating whether to compute the diff of each param blob. */ vector<bool> param_propagate_down_; - // The vector that indicates whether each top blob has a non-zero weight in - // the objective function. + /** The vector that indicates whether each top blob has a non-zero weight in + * the objective function. */ vector<Dtype> loss_; - // Forward functions: compute the layer output - // (and loss layers return the loss; other layers return the dummy value 0.) + /** @brief Using the CPU device, compute the layer output. */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) = 0; - // If no gpu code is provided, we will simply use cpu code. + /** + * @brief Using the GPU device, compute the layer output. + * Fall back to Forward_cpu() if unavailable. + */ virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { // LOG(WARNING) << "Using CPU code as backup."; return Forward_cpu(bottom, top); } - // Backward functions: compute the gradients for any parameters and - // for the bottom blobs if propagate_down is true. + /** + * @brief Using the CPU device, compute the gradients for any parameters and + * for the bottom blobs if propagate_down is true. + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; + /** + * @brief Using the GPU device, compute the gradients for any parameters and + * for the bottom blobs if propagate_down is true. + * Fall back to Backward_cpu() if unavailable. + */ virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { @@ -180,9 +317,11 @@ class Layer { Backward_cpu(top, propagate_down, bottom); } - // CheckBlobCounts: called by the parent Layer's SetUp to check that the - // number of bottom and top Blobs provided as input match the expected - // numbers specified by the {ExactNum,Min,Max}{Bottom,Top}Blobs() functions. + /** + * Called by the parent Layer's SetUp to check that the number of bottom + * and top Blobs provided as input match the expected numbers specified by + * the {ExactNum,Min,Max}{Bottom,Top}Blobs() functions. + */ virtual void CheckBlobCounts(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { if (ExactNumBottomBlobs() >= 0) { @@ -222,6 +361,26 @@ class Layer { } } + /** + * Called by SetUp to initialize the weights associated with any top blobs in + * the loss function. Store non-zero loss weights in the diff blob. + */ + inline void SetLossWeights(vector<Blob<Dtype>*>* top) { + const int num_loss_weights = layer_param_.loss_weight_size(); + if (num_loss_weights) { + CHECK_EQ(top->size(), num_loss_weights) << "loss_weight must be " + "unspecified or specified once per top blob."; + for (int top_id = 0; top_id < top->size(); ++top_id) { + const Dtype loss_weight = layer_param_.loss_weight(top_id); + if (loss_weight == Dtype(0)) { continue; } + this->set_loss(top_id, loss_weight); + const int count = (*top)[top_id]->count(); + Dtype* loss_multiplier = (*top)[top_id]->mutable_cpu_diff(); + caffe_set(count, loss_weight, loss_multiplier); + } + } + } + DISABLE_COPY_AND_ASSIGN(Layer); }; // class Layer From 9f5857459d1f85f4fadbe9ad7f4c03d29a87ed5b Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 28 Aug 2014 04:17:43 -0700 Subject: [PATCH 0640/2053] loss_layers.hpp: Doxygen-style documentation --- include/caffe/loss_layers.hpp | 490 +++++++++++++++++++++++++++++++--- 1 file changed, 448 insertions(+), 42 deletions(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index df887b8f856..1a93e4d8060 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -19,13 +19,21 @@ namespace caffe { const float kLOG_THRESHOLD = 1e-20; -/* AccuracyLayer - Note: not an actual loss layer! Does not implement backwards step. - Computes the accuracy of argmax(a) with respect to b. -*/ +/** + * @brief Computes the classification accuracy for a one-of-many + * classification task. + */ template <typename Dtype> class AccuracyLayer : public Layer<Dtype> { public: + /** + * @param param provides AccuracyParameter accuracy_param, + * with AccuracyLayer options: + * - top_k (\b optional, default 1). + * Sets the maximum rank @f$ k @f$ at which a prediction is considered + * correct. For example, if @f$ k = 5 @f$, a prediction is counted + * correct if the correct label is among the top 5 predicted labels. + */ explicit AccuracyLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, @@ -39,8 +47,35 @@ class AccuracyLayer : public Layer<Dtype> { virtual inline int ExactNumTopBlobs() const { return 1; } protected: + /** + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$ x @f$, a Blob with values in + * @f$ [-\infty, +\infty] @f$ indicating the predicted score for each of + * the @f$ K = CHW @f$ classes. Each @f$ x_n @f$ is mapped to a predicted + * label @f$ \hat{l}_n @f$ given by its maximal index: + * @f$ \hat{l}_n = \arg\max\limits_k x_{nk} @f$ + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the labels @f$ l @f$, an integer-valued Blob with values + * @f$ l_n \in [0, 1, 2, ..., K - 1] @f$ + * indicating the correct class label among the @f$ K @f$ classes + * @param top output Blob vector (length 1) + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * the computed accuracy: @f$ + * \frac{1}{N} \sum\limits_{n=1}^N \delta\{ \hat{l}_n = l_n \} + * @f$, where @f$ + * \delta\{\mathrm{condition}\} = \left\{ + * \begin{array}{lr} + * 1 & \mbox{if condition} \\ + * 0 & \mbox{otherwise} + * \end{array} \right. + * @f$ + */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + + /// @brief Not implemented -- AccuracyLayer cannot be used as a loss. virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { for (int i = 0; i < propagate_down.size(); ++i) { @@ -51,10 +86,14 @@ class AccuracyLayer : public Layer<Dtype> { int top_k_; }; -/* LossLayer - Takes two inputs of same num (a and b), and has no output. - The gradient is propagated to a. -*/ +/** + * @brief An interface for Layer%s that take two Blob%s as input -- usually + * (1) predictions and (2) ground-truth labels -- and output a + * singleton Blob representing the loss. + * + * LossLayers are typically only capable of backpropagating to their first input + * -- the predictions. + */ template <typename Dtype> class LossLayer : public Layer<Dtype> { public: @@ -64,24 +103,50 @@ class LossLayer : public Layer<Dtype> { const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual inline int ExactNumBottomBlobs() const { return 2; } - // For convenience and backwards compatibility, LossLayer's automatically - // allocate a singleton top blob into which they output their singleton loss, - // (even if the user didn't specify one in the prototxt, etc.). + + /** + * @brief For convenience and backwards compatibility, instruct the Net to + * automatically allocate a single top Blob for LossLayers, into which + * they output their singleton loss, (even if the user didn't specify + * one in the prototxt, etc.). + */ virtual inline bool AutoTopBlobs() const { return true; } virtual inline int ExactNumTopBlobs() const { return 1; } - // We usually cannot backpropagate to the labels; ignore force_backward for - // these inputs. + /** + * We usually cannot backpropagate to the labels; ignore force_backward for + * these inputs. + */ virtual inline bool AllowForceBackward(const int bottom_index) const { return bottom_index != 1; } }; -/* EuclideanLossLayer - Compute the L_2 distance between the two inputs. - - loss = (1/2 \sum_i (a_i - b_i)^2) - a' = 1/I (a - b) -*/ +/** + * @brief Computes the Euclidean (L2) loss @f$ + * E = \frac{1}{2N} \sum\limits_{n=1}^N \left| \left| \hat{y}_n - y_n + * \right| \right|_2^2 @f$ for real-valued regression tasks. + * + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$ \hat{y} \in [-\infty, +\infty]@f$ + * -# @f$ (N \times C \times H \times W) @f$ + * the targets @f$ y \in [-\infty, +\infty]@f$ + * @param top output Blob vector (length 1) + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * the computed Euclidean loss: @f$ E = + * \frac{1}{2n} \sum\limits_{n=1}^N \left| \left| \hat{y}_n - y_n + * \right| \right|_2^2 @f$ + * + * This can be used for least-squares regression tasks. An InnerProductLayer + * input to a EuclideanLossLayer exactly formulates a linear least squares + * regression problem. With non-zero weight decay the problem becomes one of + * ridge regression -- see src/caffe/test/test_sgd_solver.cpp for a concrete + * example wherein we check that the gradients computed for a Net with exactly + * this structure match hand-computed gradient formulas for ridge regression. + * + * (Note: Caffe, and SGD in general, is certainly \b not the best way to solve + * linear least squares problems! We use it only as an instructive example.) + */ template <typename Dtype> class EuclideanLossLayer : public LossLayer<Dtype> { public: @@ -93,17 +158,55 @@ class EuclideanLossLayer : public LossLayer<Dtype> { virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_EUCLIDEAN_LOSS; } - // Unlike most loss layers, in the EuclideanLossLayer we can backpropagate - // to both inputs. + + /** + * Unlike most loss layers, in the EuclideanLossLayer we can backpropagate + * to both inputs -- override to return true and always allow force_backward. + */ virtual inline bool AllowForceBackward(const int bottom_index) const { return true; } protected: + /// @copydoc EuclideanLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the Euclidean error gradient w.r.t. the inputs. + * + * Unlike other children of LossLayer, EuclideanLossLayer \b can compute + * gradients with respect to the label inputs bottom[1] (but still only will + * if propagate_down[1] is set, due to being produced by learnable parameters + * or if force_backward is set). In fact, this layer is "commutative" -- the + * result is the same regardless of the order of the two bottoms. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * This Blob's diff will simply contain the loss_weight* @f$ \lambda @f$, + * as @f$ \lambda @f$ is the coefficient of this layer's output + * @f$\ell_i@f$ in the overall Net loss + * @f$ E = \lambda_i \ell_i + \mbox{other loss terms}@f$; hence + * @f$ \frac{\partial E}{\partial \ell_i} = \lambda_i @f$. + * (*Assuming that this top Blob is not used as a bottom (input) by any + * other layer of the Net.) + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$\hat{y}@f$; Backward fills their diff with + * gradients @f$ + * \frac{\partial E}{\partial \hat{y}} = + * \frac{1}{n} \sum\limits_{n=1}^N (\hat{y}_n - y_n) + * @f$ if propagate_down[0] + * -# @f$ (N \times C \times H \times W) @f$ + * the targets @f$y@f$; Backward fills their diff with gradients + * @f$ \frac{\partial E}{\partial y} = + * \frac{1}{n} \sum\limits_{n=1}^N (y_n - \hat{y}_n) + * @f$ if propagate_down[1] + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, @@ -112,8 +215,49 @@ class EuclideanLossLayer : public LossLayer<Dtype> { Blob<Dtype> diff_; }; -/* HingeLossLayer -*/ +/** + * @brief Computes the hinge loss for a one-of-many classification task. + * + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$ t @f$, a Blob with values in + * @f$ [-\infty, +\infty] @f$ indicating the predicted score for each of + * the @f$ K = CHW @f$ classes. In an SVM, @f$ t @f$ is the result of + * taking the inner product @f$ X^T W @f$ of the D-dimensional features + * @f$ X \in \mathcal{R}^{D \times N} @f$ and the learned hyperplane + * parameters @f$ W \in \mathcal{R}^{D \times K} @f$, so a Net with just + * an InnerProductLayer (with num_output = D) providing predictions to a + * HingeLossLayer and no other learnable parameters or losses is + * equivalent to an SVM. + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the labels @f$ l @f$, an integer-valued Blob with values + * @f$ l_n \in [0, 1, 2, ..., K - 1] @f$ + * indicating the correct class label among the @f$ K @f$ classes + * @param top output Blob vector (length 1) + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * the computed hinge loss: @f$ E = + * \frac{1}{N} \sum\limits_{n=1}^N \sum\limits_{k=1}^K + * [\max(0, 1 - \delta\{l_n = k\} t_{nk})] ^ p + * @f$, for the @f$ L^p @f$ norm + * (defaults to @f$ p = 1 @f$, the L1 norm; L2 norm, as in L2-SVM, + * is also available), and @f$ + * \delta\{\mathrm{condition}\} = \left\{ + * \begin{array}{lr} + * 1 & \mbox{if condition} \\ + * -1 & \mbox{otherwise} + * \end{array} \right. + * @f$ + * + * In an SVM, @f$ t \in \mathcal{R}^{N \times K} @f$ is the result of taking + * the inner product @f$ X^T W @f$ of the features + * @f$ X \in \mathcal{R}^{D \times N} @f$ + * and the learned hyperplane parameters + * @f$ W \in \mathcal{R}^{D \times K} @f$. So, a Net with just an + * InnerProductLayer (with num_output = @f$k@f$) providing predictions to a + * HingeLossLayer is equivalent to an SVM (assuming it has no other learned + * outside the InnerProductLayer and no other losses outside the + * HingeLossLayer). + */ template <typename Dtype> class HingeLossLayer : public LossLayer<Dtype> { public: @@ -125,14 +269,73 @@ class HingeLossLayer : public LossLayer<Dtype> { } protected: + /// @copydoc HingeLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the hinge loss error gradient w.r.t. the predictions. + * + * Gradients cannot be computed with respect to the label inputs (bottom[1]), + * so this method ignores bottom[1] and requires !propagate_down[1], crashing + * if propagate_down[1] is set. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * This Blob's diff will simply contain the loss_weight* @f$ \lambda @f$, + * as @f$ \lambda @f$ is the coefficient of this layer's output + * @f$\ell_i@f$ in the overall Net loss + * @f$ E = \lambda_i \ell_i + \mbox{other loss terms}@f$; hence + * @f$ \frac{\partial E}{\partial \ell_i} = \lambda_i @f$. + * (*Assuming that this top Blob is not used as a bottom (input) by any + * other layer of the Net.) + * @param propagate_down see Layer::Backward. + * propagate_down[1] must be false as we can't compute gradients with + * respect to the labels. + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$t@f$; Backward computes diff + * @f$ \frac{\partial E}{\partial t} @f$ + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the labels -- ignored as we can't compute their error gradients + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); }; -/* InfogainLossLayer -*/ +/** + * @brief A generalization of MultinomialLogisticLossLayer that takes an + * "information gain" (infogain) matrix specifying the "value" of all label + * pairs. + * + * Equivalent to the MultinomialLogisticLossLayer if the infogain matrix is the + * identity. + * + * @param bottom input Blob vector (length 2-3) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$ \hat{p} @f$, a Blob with values in + * @f$ [0, 1] @f$ indicating the predicted probability of each of the + * @f$ K = CHW @f$ classes. Each prediction vector @f$ \hat{p}_n @f$ + * should sum to 1 as in a probability distribution: @f$ + * \forall n \sum\limits_{k=1}^K \hat{p}_{nk} = 1 @f$. + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the labels @f$ l @f$, an integer-valued Blob with values + * @f$ l_n \in [0, 1, 2, ..., K - 1] @f$ + * indicating the correct class label among the @f$ K @f$ classes + * -# @f$ (1 \times 1 \times K \times K) @f$ + * (\b optional) the infogain matrix @f$ H @f$. This must be provided as + * the third bottom blob input if not provided as the infogain_mat in the + * InfogainLossParameter. If @f$ H = I @f$, this layer is equivalent to the + * MultinomialLogisticLossLayer. + * @param top output Blob vector (length 1) + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * the computed infogain multinomial logistic loss: @f$ E = + * \frac{-1}{N} \sum\limits_{n=1}^N H_{l_n} \log(\hat{p}_n) = + * \frac{-1}{N} \sum\limits_{n=1}^N \sum\limits_{k=1}^{K} H_{l_n,k} + * \log(\hat{p}_{n,k}) + * @f$, where @f$ H_{l_n} @f$ denotes row @f$l_n@f$ of @f$H@f$. + */ template <typename Dtype> class InfogainLossLayer : public LossLayer<Dtype> { public: @@ -141,7 +344,7 @@ class InfogainLossLayer : public LossLayer<Dtype> { virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); - // InfogainLossLayer takes 2-3 bottom blobs; if there are 3 the third should + // InfogainLossLayer takes 2-3 bottom Blobs; if there are 3 the third should // be the infogain matrix. (Otherwise the infogain matrix is loaded from a // file specified by LayerParameter.) virtual inline int ExactNumBottomBlobs() const { return -1; } @@ -153,16 +356,77 @@ class InfogainLossLayer : public LossLayer<Dtype> { } protected: + /// @copydoc InfogainLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the infogain loss error gradient w.r.t. the predictions. + * + * Gradients cannot be computed with respect to the label inputs (bottom[1]), + * so this method ignores bottom[1] and requires !propagate_down[1], crashing + * if propagate_down[1] is set. (The same applies to the infogain matrix, if + * provided as bottom[2] rather than in the layer_param.) + * + * @param top output Blob vector (length 1), providing the error gradient + * with respect to the outputs + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * This Blob's diff will simply contain the loss_weight* @f$ \lambda @f$, + * as @f$ \lambda @f$ is the coefficient of this layer's output + * @f$\ell_i@f$ in the overall Net loss + * @f$ E = \lambda_i \ell_i + \mbox{other loss terms}@f$; hence + * @f$ \frac{\partial E}{\partial \ell_i} = \lambda_i @f$. + * (*Assuming that this top Blob is not used as a bottom (input) by any + * other layer of the Net.) + * @param propagate_down see Layer::Backward. + * propagate_down[1] must be false as we can't compute gradients with + * respect to the labels (similarly for propagate_down[2] and the + * infogain matrix, if provided as bottom[2]) + * @param bottom input Blob vector (length 2-3) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$ \hat{p} @f$; Backward computes diff + * @f$ \frac{\partial E}{\partial \hat{p}} @f$ + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the labels -- ignored as we can't compute their error gradients + * -# @f$ (1 \times 1 \times K \times K) @f$ + * (\b optional) the information gain matrix -- ignored as its error + * gradient computation is not implemented. + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); Blob<Dtype> infogain_; }; -/* MultinomialLogisticLossLayer -*/ +/** + * @brief Computes the multinomial logistic loss for a one-of-many + * classification task, directly taking a predicted probability + * distribution as input. + * + * When predictions are not already a probability distribution, you should + * instead use the SoftmaxWithLossLayer, which maps predictions to a + * distribution using the SoftmaxLayer, before computing the multinomial + * logistic loss. The SoftmaxWithLossLayer should be preferred over separate + * SoftmaxLayer + MultinomialLogisticLossLayer + * as its gradient computation is more numerically stable. + * + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$ \hat{p} @f$, a Blob with values in + * @f$ [0, 1] @f$ indicating the predicted probability of each of the + * @f$ K = CHW @f$ classes. Each prediction vector @f$ \hat{p}_n @f$ + * should sum to 1 as in a probability distribution: @f$ + * \forall n \sum\limits_{k=1}^K \hat{p}_{nk} = 1 @f$. + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the labels @f$ l @f$, an integer-valued Blob with values + * @f$ l_n \in [0, 1, 2, ..., K - 1] @f$ + * indicating the correct class label among the @f$ K @f$ classes + * @param top output Blob vector (length 1) + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * the computed multinomial logistic loss: @f$ E = + * \frac{-1}{N} \sum\limits_{n=1}^N \log(\hat{p}_{n,l_n}) + * @f$ + */ template <typename Dtype> class MultinomialLogisticLossLayer : public LossLayer<Dtype> { public: @@ -176,14 +440,71 @@ class MultinomialLogisticLossLayer : public LossLayer<Dtype> { } protected: + /// @copydoc MultinomialLogisticLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the multinomial logistic loss error gradient w.r.t. the + * predictions. + * + * Gradients cannot be computed with respect to the label inputs (bottom[1]), + * so this method ignores bottom[1] and requires !propagate_down[1], crashing + * if propagate_down[1] is set. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * This Blob's diff will simply contain the loss_weight* @f$ \lambda @f$, + * as @f$ \lambda @f$ is the coefficient of this layer's output + * @f$\ell_i@f$ in the overall Net loss + * @f$ E = \lambda_i \ell_i + \mbox{other loss terms}@f$; hence + * @f$ \frac{\partial E}{\partial \ell_i} = \lambda_i @f$. + * (*Assuming that this top Blob is not used as a bottom (input) by any + * other layer of the Net.) + * @param propagate_down see Layer::Backward. + * propagate_down[1] must be false as we can't compute gradients with + * respect to the labels. + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$ \hat{p} @f$; Backward computes diff + * @f$ \frac{\partial E}{\partial \hat{p}} @f$ + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the labels -- ignored as we can't compute their error gradients + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); }; -/* SigmoidCrossEntropyLossLayer -*/ +/** + * @brief Computes the cross-entropy (logistic) loss @f$ + * E = \frac{-1}{n} \sum\limits_{n=1}^N \left[ + * p_n \log \hat{p}_n + + * (1 - p_n) \log(1 - \hat{p}_n) + * \right] + * @f$, often used for predicting targets interpreted as probabilities. + * + * This layer is implemented rather than separate + * SigmoidLayer + CrossEntropyLayer + * as its gradient computation is more numerically stable. + * At test time, this layer can be replaced simply by a SigmoidLayer. + * + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the scores @f$ x \in [-\infty, +\infty]@f$, + * which this layer maps to probability predictions + * @f$ \hat{p}_n = \sigma(x_n) \in [0, 1] @f$ + * using the sigmoid function @f$ \sigma(.) @f$ (see SigmoidLayer). + * -# @f$ (N \times C \times H \times W) @f$ + * the targets @f$ y \in [0, 1] @f$ + * @param top output Blob vector (length 1) + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * the computed cross-entropy loss: @f$ + * E = \frac{-1}{n} \sum\limits_{n=1}^N \left[ + * p_n \log \hat{p}_n + (1 - p_n) \log(1 - \hat{p}_n) + * \right] + * @f$ + */ template <typename Dtype> class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { public: @@ -199,34 +520,88 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { } protected: + /// @copydoc SigmoidCrossEntropyLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the sigmoid cross-entropy loss error gradient w.r.t. the + * predictions. + * + * Gradients cannot be computed with respect to the target inputs (bottom[1]), + * so this method ignores bottom[1] and requires !propagate_down[1], crashing + * if propagate_down[1] is set. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * This Blob's diff will simply contain the loss_weight* @f$ \lambda @f$, + * as @f$ \lambda @f$ is the coefficient of this layer's output + * @f$\ell_i@f$ in the overall Net loss + * @f$ E = \lambda_i \ell_i + \mbox{other loss terms}@f$; hence + * @f$ \frac{\partial E}{\partial \ell_i} = \lambda_i @f$. + * (*Assuming that this top Blob is not used as a bottom (input) by any + * other layer of the Net.) + * @param propagate_down see Layer::Backward. + * propagate_down[1] must be false as gradient computation with respect + * to the targets is not implemented. + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$x@f$; Backward computes diff + * @f$ \frac{\partial E}{\partial x} = + * \frac{1}{n} \sum\limits_{n=1}^N (\hat{p}_n - p_n) + * @f$ + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the labels -- ignored as we can't compute their error gradients + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + /// The internal SigmoidLayer used to map predictions to probabilities. shared_ptr<SigmoidLayer<Dtype> > sigmoid_layer_; - // sigmoid_output stores the output of the sigmoid layer. + /// sigmoid_output stores the output of the SigmoidLayer. shared_ptr<Blob<Dtype> > sigmoid_output_; - // Vector holders to call the underlying sigmoid layer forward and backward. + /// bottom vector holder to call the underlying SigmoidLayer::Forward vector<Blob<Dtype>*> sigmoid_bottom_vec_; + /// top vector holder to call the underlying SigmoidLayer::Forward vector<Blob<Dtype>*> sigmoid_top_vec_; }; // Forward declare SoftmaxLayer for use in SoftmaxWithLossLayer. template <typename Dtype> class SoftmaxLayer; -/* SoftmaxWithLossLayer - Implements softmax and computes the loss. - - It is preferred over separate softmax + multinomiallogisticloss - layers due to more numerically stable gradients. - - In test, this layer could be replaced by simple softmax layer. -*/ +/** + * @brief Computes the multinomial logistic loss for a one-of-many + * classification task, passing real-valued predictions through a + * softmax to get a probability distribution over classes. + * + * This layer should be preferred over separate + * SoftmaxLayer + MultinomialLogisticLossLayer + * as its gradient computation is more numerically stable. + * At test time, this layer can be replaced simply by a SoftmaxLayer. + * + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$ x @f$, a Blob with values in + * @f$ [-\infty, +\infty] @f$ indicating the predicted score for each of + * the @f$ K = CHW @f$ classes. This layer maps these scores to a + * probability distribution over classes using the softmax function + * @f$ \hat{p}_{nk} = \exp(x_{nk}) / + * \left[\sum_{k'} \exp(x_{nk'})\right] @f$ (see SoftmaxLayer). + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the labels @f$ l @f$, an integer-valued Blob with values + * @f$ l_n \in [0, 1, 2, ..., K - 1] @f$ + * indicating the correct class label among the @f$ K @f$ classes + * @param top output Blob vector (length 1) + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * the computed cross-entropy classification loss: @f$ E = + * \frac{-1}{N} \sum\limits_{n=1}^N \log(\hat{p}_{n,l_n}) + * @f$, for softmax output class probabilites @f$ \hat{p} @f$ + */ template <typename Dtype> class SoftmaxWithLossLayer : public LossLayer<Dtype> { public: @@ -247,20 +622,51 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { virtual inline int MaxTopBlobs() const { return 2; } protected: + /// @copydoc SoftmaxWithLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the softmax loss error gradient w.r.t. the predictions. + * + * Gradients cannot be computed with respect to the label inputs (bottom[1]), + * so this method ignores bottom[1] and requires !propagate_down[1], crashing + * if propagate_down[1] is set. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * This Blob's diff will simply contain the loss_weight* @f$ \lambda @f$, + * as @f$ \lambda @f$ is the coefficient of this layer's output + * @f$\ell_i@f$ in the overall Net loss + * @f$ E = \lambda_i \ell_i + \mbox{other loss terms}@f$; hence + * @f$ \frac{\partial E}{\partial \ell_i} = \lambda_i @f$. + * (*Assuming that this top Blob is not used as a bottom (input) by any + * other layer of the Net.) + * @param propagate_down see Layer::Backward. + * propagate_down[1] must be false as we can't compute gradients with + * respect to the labels. + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the predictions @f$ x @f$; Backward computes diff + * @f$ \frac{\partial E}{\partial x} @f$ + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the labels -- ignored as we can't compute their error gradients + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + /// The internal SoftmaxLayer used to map predictions to a distribution. shared_ptr<SoftmaxLayer<Dtype> > softmax_layer_; - // prob stores the output probability of the layer. + /// prob stores the output probability predictions from the SoftmaxLayer. Blob<Dtype> prob_; - // Vector holders to call the underlying softmax layer forward and backward. + /// bottom vector holder used in call to the underlying SoftmaxLayer::Forward vector<Blob<Dtype>*> softmax_bottom_vec_; + /// top vector holder used in call to the underlying SoftmaxLayer::Forward vector<Blob<Dtype>*> softmax_top_vec_; }; From c5d53088b896ed93fb94b76e398524feb523ffbf Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 28 Aug 2014 02:36:35 -0700 Subject: [PATCH 0641/2053] neuron_layers.hpp: Doxygen-style documentation --- include/caffe/neuron_layers.hpp | 372 ++++++++++++++++++++++++++------ 1 file changed, 302 insertions(+), 70 deletions(-) diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index b5bbc5b6482..370f851a9ee 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -18,10 +18,12 @@ namespace caffe { -/* NeuronLayer - An interface for layers that take one blob as input (x), - and produce one blob as output (y). -*/ +/** + * @brief An interface for layers that take one blob as input (@f$ x @f$) + * and produce one equally-sized blob as output (@f$ y @f$), where + * each element of the output depends only on the corresponding input + * element. + */ template <typename Dtype> class NeuronLayer : public Layer<Dtype> { public: @@ -37,12 +39,16 @@ class NeuronLayer : public Layer<Dtype> { virtual inline int ExactNumTopBlobs() const { return 1; } }; -/* AbsVal Layer - y = |x| - - y' = 1 if x > 0 - = -1 if x < 0 -*/ +/** + * @brief Computes @f$ y = |x| @f$ + * + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the computed outputs @f$ y = |x| @f$ + */ template <typename Dtype> class AbsValLayer : public NeuronLayer<Dtype> { public: @@ -56,24 +62,54 @@ class AbsValLayer : public NeuronLayer<Dtype> { } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } + protected: + /// @copydoc AbsValLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the error gradient w.r.t. the absolute value inputs. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (N \times C \times H \times W) @f$ + * containing error gradients @f$ \frac{\partial E}{\partial y} @f$ + * with respect to computed outputs @f$ y @f$ + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$; Backward fills their diff with + * gradients @f$ + * \frac{\partial E}{\partial x} = + * \mathrm{sign}(x) \frac{\partial E}{\partial y} + * @f$ if propagate_down[0] + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); }; -/* BNLLLayer - - y = x + log(1 + exp(-x)) if x > 0 - y = log(1 + exp(x)) if x <= 0 - - y' = exp(x) / (exp(x) + 1) -*/ +/** + * @brief Computes @f$ y = x + \log(1 + \exp(-x)) @f$ if @f$ x > 0 @f$; + * @f$ y = \log(1 + \exp(x)) @f$ otherwise. + * + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the computed outputs @f$ + * y = \left\{ + * \begin{array}{ll} + * x + \log(1 + \exp(-x)) & \mbox{if } x > 0 \\ + * \log(1 + \exp(x)) & \mbox{otherwise} + * \end{array} \right. + * @f$ + */ template <typename Dtype> class BNLLLayer : public NeuronLayer<Dtype> { public: @@ -85,29 +121,54 @@ class BNLLLayer : public NeuronLayer<Dtype> { } protected: + /// @copydoc BNLLLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the error gradient w.r.t. the BNLL inputs. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (N \times C \times H \times W) @f$ + * containing error gradients @f$ \frac{\partial E}{\partial y} @f$ + * with respect to computed outputs @f$ y @f$ + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$; Backward fills their diff with + * gradients @f$ + * \frac{\partial E}{\partial x} + * @f$ if propagate_down[0] + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); }; -/* DropoutLayer - During training only, sets some portion of x to 0, adjusting the - vector magnitude accordingly. - - mask = bernoulli(1 - threshold) - scale = 1 / (1 - threshold) - y = x * mask * scale - - y' = mask * scale -*/ +/** + * @brief During training only, sets a random portion of @f$x@f$ to 0, adjusting + * the rest of the vector magnitude accordingly. + * + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the computed outputs @f$ y = |x| @f$ + */ template <typename Dtype> class DropoutLayer : public NeuronLayer<Dtype> { public: + /** + * @param param provides DropoutParameter dropout_param, + * with DropoutLayer options: + * - dropout_ratio (\b optional, default 0.5). + * Sets the probability @f$ p @f$ that any given unit is dropped. + */ explicit DropoutLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, @@ -118,6 +179,22 @@ class DropoutLayer : public NeuronLayer<Dtype> { } protected: + /** + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the computed outputs. At training time, we have @f$ + * y_{\mbox{train}} = \left\{ + * \begin{array}{ll} + * \frac{x}{1 - p} & \mbox{if } u > p \\ + * 0 & \mbox{otherwise} + * \end{array} \right. + * @f$, where @f$ u \sim U(0, 1)@f$ is generated independently for each + * input at each iteration. At test time, we simply have + * @f$ y_{\mbox{test}} = \mathbb{E}[y_{\mbox{train}}] = x @f$. + */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, @@ -127,21 +204,30 @@ class DropoutLayer : public NeuronLayer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + /// when divided by UINT_MAX, the randomly generated values @f$u\sim U(0,1)@f$ Blob<unsigned int> rand_vec_; + /// the probability @f$ p @f$ of dropping any input Dtype threshold_; + /// the scale for undropped inputs at train time @f$ 1 / (1 - p) @f$ Dtype scale_; unsigned int uint_thres_; }; -/* PowerLayer - y = (shift + scale * x) ^ power - - y' = scale * power * (shift + scale * x) ^ (power - 1) - = scale * power * y / (shift + scale * x) -*/ +/** + * @brief Computes @f$ y = (\alpha x + \beta) ^ \gamma @f$, + * as specified by the scale @f$ \alpha @f$, shift @f$ \beta @f$, + * and power @f$ \gamma @f$. + */ template <typename Dtype> class PowerLayer : public NeuronLayer<Dtype> { public: + /** + * @param param provides PowerParameter power_param, + * with PowerLayer options: + * - scale (\b optional, default 1) the scale @f$ \alpha @f$ + * - shift (\b optional, default 0) the shift @f$ \beta @f$ + * - power (\b optional, default 1) the power @f$ \gamma @f$ + */ explicit PowerLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, @@ -152,33 +238,69 @@ class PowerLayer : public NeuronLayer<Dtype> { } protected: + /** + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the computed outputs @f$ + * y = (\alpha x + \beta) ^ \gamma + * @f$ + */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the error gradient w.r.t. the power inputs. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (N \times C \times H \times W) @f$ + * containing error gradients @f$ \frac{\partial E}{\partial y} @f$ + * with respect to computed outputs @f$ y @f$ + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$; Backward fills their diff with + * gradients @f$ + * \frac{\partial E}{\partial x} = + * \frac{\partial E}{\partial y} + * \alpha \gamma (\alpha x + \beta) ^ {\gamma - 1} = + * \frac{\partial E}{\partial y} + * \frac{\alpha \gamma y}{\alpha x + \beta} + * @f$ if propagate_down[0] + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + /// @brief @f$ \gamma @f$ from layer_param_.power_param() Dtype power_; + /// @brief @f$ \alpha @f$ from layer_param_.power_param() Dtype scale_; + /// @brief @f$ \beta @f$ from layer_param_.power_param() Dtype shift_; + /// @brief Result of @f$ \alpha \gamma @f$ Dtype diff_scale_; }; -/* ReLULayer - Rectified Linear Unit non-linearity. - The simple max is fast to compute, and the function does not saturate. - - y = max(0, x). - - y' = 0 if x < 0 - y' = 1 if x > 0 -*/ +/** + * @brief Rectified Linear Unit non-linearity @f$ y = \max(0, x) @f$. + * The simple max is fast to compute, and the function does not saturate. + */ template <typename Dtype> class ReLULayer : public NeuronLayer<Dtype> { public: + /** + * @param param provides ReLUParameter relu_param, + * with ReLULayer options: + * - negative_slope (\b optional, default 0). + * the value @f$ \nu @f$ by which negative values are multiplied. + */ explicit ReLULayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} @@ -187,28 +309,64 @@ class ReLULayer : public NeuronLayer<Dtype> { } protected: + /** + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the computed outputs @f$ + * y = \max(0, x) + * @f$ by default. If a non-zero negative_slope @f$ \nu @f$ is provided, + * the computed outputs are @f$ y = \max(0, x) + \nu \min(0, x) @f$. + */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + /** + * @brief Computes the error gradient w.r.t. the ReLU inputs. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (N \times C \times H \times W) @f$ + * containing error gradients @f$ \frac{\partial E}{\partial y} @f$ + * with respect to computed outputs @f$ y @f$ + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$; Backward fills their diff with + * gradients @f$ + * \frac{\partial E}{\partial x} = \left\{ + * \begin{array}{lr} + * 0 & \mathrm{if} \; x \le 0 \\ + * \frac{\partial E}{\partial y} & \mathrm{if} \; x > 0 + * \end{array} \right. + * @f$ if propagate_down[0], by default. + * If a non-zero negative_slope @f$ \nu @f$ is provided, + * the computed gradients are @f$ + * \frac{\partial E}{\partial x} = \left\{ + * \begin{array}{lr} + * \nu \frac{\partial E}{\partial y} & \mathrm{if} \; x \le 0 \\ + * \frac{\partial E}{\partial y} & \mathrm{if} \; x > 0 + * \end{array} \right. + * @f$. + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); }; -/* SigmoidLayer - Sigmoid function non-linearity, a classic choice in neural networks. - Note that the gradient vanishes as the values move away from 0. - The ReLULayer is often a better choice for this reason. - - y = 1. / (1 + exp(-x)) - - y ' = exp(x) / (1 + exp(x))^2 - or - y' = y * (1 - y) -*/ +/** + * @brief Sigmoid function non-linearity @f$ + * y = (1 + \exp(-x))^{-1} + * @f$, a classic choice in neural networks. + * + * Note that the gradient vanishes as the values move away from 0. + * The ReLULayer is often a better choice for this reason. + */ template <typename Dtype> class SigmoidLayer : public NeuronLayer<Dtype> { public: @@ -220,23 +378,52 @@ class SigmoidLayer : public NeuronLayer<Dtype> { } protected: + /** + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the computed outputs @f$ + * y = (1 + \exp(-x))^{-1} + * @f$ + */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the error gradient w.r.t. the sigmoid inputs. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (N \times C \times H \times W) @f$ + * containing error gradients @f$ \frac{\partial E}{\partial y} @f$ + * with respect to computed outputs @f$ y @f$ + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$; Backward fills their diff with + * gradients @f$ + * \frac{\partial E}{\partial x} + * = \frac{\partial E}{\partial y} y (1 - y) + * @f$ if propagate_down[0] + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); }; -/* TanHLayer - Hyperbolic tangent non-linearity, popular in auto-encoders. - - y = 1. * (exp(2x) - 1) / (exp(2x) + 1) - - y' = 1 - ( (exp(2x) - 1) / (exp(2x) + 1) ) ^ 2 -*/ +/** + * @brief TanH hyperbolic tangent non-linearity @f$ + * y = \frac{\exp(2x) - 1}{\exp(2x) + 1} + * @f$, popular in auto-encoders. + * + * Note that the gradient vanishes as the values move away from 0. + * The ReLULayer is often a better choice for this reason. + */ template <typename Dtype> class TanHLayer : public NeuronLayer<Dtype> { public: @@ -248,29 +435,59 @@ class TanHLayer : public NeuronLayer<Dtype> { } protected: + /** + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the computed outputs @f$ + * y = \frac{\exp(2x) - 1}{\exp(2x) + 1} + * @f$ + */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the error gradient w.r.t. the sigmoid inputs. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (N \times C \times H \times W) @f$ + * containing error gradients @f$ \frac{\partial E}{\partial y} @f$ + * with respect to computed outputs @f$ y @f$ + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$; Backward fills their diff with + * gradients @f$ + * \frac{\partial E}{\partial x} + * = \frac{\partial E}{\partial y} + * \left(1 - \left[\frac{\exp(2x) - 1}{exp(2x) + 1} \right]^2 \right) + * = \frac{\partial E}{\partial y} (1 - y^2) + * @f$ if propagate_down[0] + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); }; -/* ThresholdLayer - Outputs 1 if value in input is above threshold, 0 otherwise. - The defult threshold = 0, which means positive values would become 1 and - negative or 0, would become 0 - - y = 1 if x > threshold - y = 0 if x <= threshold - - y' = don't differenciable -*/ +/** + * @brief Tests whether the input exceeds a threshold: outputs 1 for inputs + * above threshold; 0 otherwise. + */ template <typename Dtype> class ThresholdLayer : public NeuronLayer<Dtype> { public: + /** + * @param param provides ThresholdParameter threshold_param, + * with ThresholdLayer options: + * - threshold (\b optional, default 0). + * the threshold value @f$ t @f$ to which the input values are compared. + */ explicit ThresholdLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, @@ -281,10 +498,25 @@ class ThresholdLayer : public NeuronLayer<Dtype> { } protected: + /** + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the computed outputs @f$ + * y = \left\{ + * \begin{array}{lr} + * 0 & \mathrm{if} \; x \le t \\ + * 1 & \mathrm{if} \; x > t + * \end{array} \right. + * @f$ + */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + /// @brief Not implemented (non-differentiable function) virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { NOT_IMPLEMENTED; From 57171b507aff14f16773b4791b53d19aee1e7be8 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Fri, 29 Aug 2014 21:53:12 -0700 Subject: [PATCH 0642/2053] common_layers.hpp: Doxygen \brief & TODO stubs. --- include/caffe/common_layers.hpp | 169 ++++++++++++++++++++++++++------ 1 file changed, 137 insertions(+), 32 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 1b50e9563ca..e32dac71332 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -15,18 +15,27 @@ namespace caffe { -/* ArgmaxLayer - Compute the index of the max value across all (channels x height x width). - [In the future, can take specific dimension.] - Intended for use after a classification layer to produce prediction. - If parameter out_max_val is set to true, then output is a vector of pairs - (max_ind, max_val) for each image. - - NOTE: does not implement Backwards operation. -*/ +/** + * @brief Compute the index of the @f$ K @f$ max values for each datum across + * all dimensions @f$ (C \times H \times W) @f$. + * + * Intended for use after a classification layer to produce a prediction. + * If parameter out_max_val is set to true, output is a vector of pairs + * (max_ind, max_val) for each image. + * + * NOTE: does not implement Backwards operation. + */ template <typename Dtype> class ArgMaxLayer : public Layer<Dtype> { public: + /** + * @param param provides ArgMaxParameter argmax_param, + * with ArgMaxLayer options: + * - top_k (\b optional uint, default 1). + * the number @f$ K @f$ of maximal items to output. + * - out_max_val (\b optional bool, default false). + * if set, output a vector of pairs (max_ind, max_val) for each image. + */ explicit ArgMaxLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, @@ -39,8 +48,20 @@ class ArgMaxLayer : public Layer<Dtype> { virtual inline int ExactNumTopBlobs() const { return 1; } protected: + /** + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times 1 \times K \times 1) @f$ or, if out_max_val + * @f$ (N \times 2 \times K \times 1) @f$ + * the computed outputs @f$ + * y_n = \arg\max\limits_i x_{ni} + * @f$ (for @f$ K = 1 @f$). + */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + /// @brief Not implemented (non-differentiable function) virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { NOT_IMPLEMENTED; @@ -49,10 +70,10 @@ class ArgMaxLayer : public Layer<Dtype> { size_t top_k_; }; -/* ConcatLayer - Takes at least two blobs and concatenates them along either num or - channel dim, outputting the result. -*/ +/** + * @brief Takes at least two Blob%s and concatenates them along either the num + * or channel dimension, outputting the result. + */ template <typename Dtype> class ConcatLayer : public Layer<Dtype> { public: @@ -68,10 +89,49 @@ class ConcatLayer : public Layer<Dtype> { virtual inline int ExactNumTopBlobs() const { return 1; } protected: + /** + * @param bottom input Blob vector (length 2+) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x_1 @f$ + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x_2 @f$ + * -# ... + * - K @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x_K @f$ + * @param top output Blob vector (length 1) + * -# @f$ (KN \times C \times H \times W) @f$ if concat_dim == 0, or + * @f$ (N \times KC \times H \times W) @f$ if concat_dim == 1: + * the concatenated output @f$ + * y = [\begin{array}{cccc} x_1 & x_2 & ... & x_K \end{array}] + * @f$ + */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the error gradient w.r.t. the concatenate inputs. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (KN \times C \times H \times W) @f$ if concat_dim == 0, or + * @f$ (N \times KC \times H \times W) @f$ if concat_dim == 1: + * containing error gradients @f$ \frac{\partial E}{\partial y} @f$ + * with respect to concatenated outputs @f$ y @f$ + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length K), into which the top gradient + * @f$ \frac{\partial E}{\partial y} @f$ is deconcatenated back to the + * inputs @f$ + * \left[ \begin{array}{cccc} + * \frac{\partial E}{\partial x_1} & + * \frac{\partial E}{\partial x_2} & + * ... & + * \frac{\partial E}{\partial x_K} + * \end{array} \right] = + * \frac{\partial E}{\partial y} + * @f$ + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, @@ -86,9 +146,12 @@ class ConcatLayer : public Layer<Dtype> { int concat_dim_; }; -/* EltwiseLayer - Compute elementwise operations like product or sum. -*/ +/** + * @brief Compute elementwise operations, such as product and sum, + * along multiple input Blobs. + * + * TODO(dox): thorough documentation for Forward, Backward, and proto params. + */ template <typename Dtype> class EltwiseLayer : public Layer<Dtype> { public: @@ -119,8 +182,16 @@ class EltwiseLayer : public Layer<Dtype> { bool stable_prod_grad_; }; -/* FlattenLayer -*/ +/** + * @brief Reshapes the input Blob into flat vectors. + * + * Note: because this layer does not change the input values -- merely the + * dimensions -- it can simply copy the input. The copy happens "virtually" + * (thus taking effectively 0 real time) by setting, in Forward, the data + * pointer of the top Blob to that of the bottom Blob (see Blob::ShareData), + * and in Backward, the diff pointer of the bottom Blob to that of the top Blob + * (see Blob::ShareDiff). + */ template <typename Dtype> class FlattenLayer : public Layer<Dtype> { public: @@ -136,10 +207,28 @@ class FlattenLayer : public Layer<Dtype> { virtual inline int ExactNumTopBlobs() const { return 1; } protected: + /** + * @param bottom input Blob vector (length 2+) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs + * @param top output Blob vector (length 1) + * -# @f$ (N \times CHW \times 1 \times 1) @f$ + * the outputs -- i.e., the (virtually) copied, flattened inputs + */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the error gradient w.r.t. the concatenate inputs. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length K), into which the top error + * gradient is (virtually) copied + */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, @@ -148,8 +237,12 @@ class FlattenLayer : public Layer<Dtype> { int count_; }; -/* InnerProductLayer -*/ +/** + * @brief Also known as a "fully-connected" layer, computes an inner product + * with a set of learned weights, and (optionally) adds biases. + * + * TODO(dox): thorough documentation for Forward, Backward, and proto params. + */ template <typename Dtype> class InnerProductLayer : public Layer<Dtype> { public: @@ -181,7 +274,10 @@ class InnerProductLayer : public Layer<Dtype> { Blob<Dtype> bias_multiplier_; }; -/* MVNLayer +/** + * @brief Normalizes the input to have 0-mean and/or unit (1) variance. + * + * TODO(dox): thorough documentation for Forward, Backward, and proto params. */ template <typename Dtype> class MVNLayer : public Layer<Dtype> { @@ -209,12 +305,15 @@ class MVNLayer : public Layer<Dtype> { Blob<Dtype> mean_, variance_, temp_; - // sum_multiplier is just used to carry out sum using blas + /// sum_multiplier is used to carry out sum using BLAS Blob<Dtype> sum_multiplier_; }; -/* SoftmaxLayer -*/ +/** + * @brief Computes the softmax function. + * + * TODO(dox): thorough documentation for Forward, Backward, and proto params. + */ template <typename Dtype> class SoftmaxLayer : public Layer<Dtype> { public: @@ -239,14 +338,18 @@ class SoftmaxLayer : public Layer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); - // sum_multiplier is just used to carry out sum using blas + /// sum_multiplier is used to carry out sum using BLAS Blob<Dtype> sum_multiplier_; - // scale is an intermediate blob to hold temporary results. + /// scale is an intermediate Blob to hold temporary results. Blob<Dtype> scale_; }; -/* SplitLayer -*/ +/** + * @brief Creates a "split" path in the network by copying the bottom Blob + * into multiple top Blob%s to be used by multiple consuming layers. + * + * TODO(dox): thorough documentation for Forward, Backward, and proto params. + */ template <typename Dtype> class SplitLayer : public Layer<Dtype> { public: @@ -274,10 +377,12 @@ class SplitLayer : public Layer<Dtype> { int count_; }; -/* SliceLayer - Takes one blobs and slices it along either num or channel dim, - outputting the result into as many top blobs as needed. -*/ +/** + * @brief Takes a Blob and slices it along either the num or channel dimension, + * outputting multiple sliced Blob results. + * + * TODO(dox): thorough documentation for Forward, Backward, and proto params. + */ template <typename Dtype> class SliceLayer : public Layer<Dtype> { public: From c3151bb9aed7deb8b7483f46e7e36bff80efca87 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Fri, 29 Aug 2014 22:48:11 -0700 Subject: [PATCH 0643/2053] data_layers: Doxygen \brief & TODO stubs. --- include/caffe/data_layers.hpp | 43 +++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index f972965b45b..bebbab10c03 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -23,8 +23,14 @@ namespace caffe { #define HDF5_DATA_DATASET_NAME "data" #define HDF5_DATA_LABEL_NAME "label" -// TODO: DataLayer, ImageDataLayer, and WindowDataLayer all have the -// same basic structure and a lot of duplicated code. +/** + * @brief Provides data to the Net from a LevelDB or LMDB. + * + * TODO: DataLayer, ImageDataLayer, and WindowDataLayer all have the + * same basic structure and a lot of duplicated code. + * + * TODO(dox): thorough documentation for Forward and proto params. + */ template <typename Dtype> class DataLayer : public Layer<Dtype>, public InternalThread { public: @@ -80,6 +86,11 @@ class DataLayer : public Layer<Dtype>, public InternalThread { Caffe::Phase phase_; }; +/** + * @brief Provides data to the Net generated by a Filler. + * + * TODO(dox): thorough documentation for Forward and proto params. + */ template <typename Dtype> class DummyDataLayer : public Layer<Dtype> { public: @@ -106,6 +117,11 @@ class DummyDataLayer : public Layer<Dtype> { vector<bool> refill_; }; +/** + * @brief Provides data to the Net from HDF5 files. + * + * TODO(dox): thorough documentation for Forward and proto params. + */ template <typename Dtype> class HDF5DataLayer : public Layer<Dtype> { public: @@ -140,6 +156,11 @@ class HDF5DataLayer : public Layer<Dtype> { Blob<Dtype> label_blob_; }; +/** + * @brief Write blobs to disk as HDF5 files. + * + * TODO(dox): thorough documentation for Forward and proto params. + */ template <typename Dtype> class HDF5OutputLayer : public Layer<Dtype> { public: @@ -174,6 +195,11 @@ class HDF5OutputLayer : public Layer<Dtype> { Blob<Dtype> label_blob_; }; +/** + * @brief Provides data to the Net from image files. + * + * TODO(dox): thorough documentation for Forward and proto params. + */ template <typename Dtype> class ImageDataLayer : public Layer<Dtype>, public InternalThread { public: @@ -221,8 +247,11 @@ class ImageDataLayer : public Layer<Dtype>, public InternalThread { Caffe::Phase phase_; }; -/* MemoryDataLayer -*/ +/** + * @brief Provides data to the Net from memory. + * + * TODO(dox): thorough documentation for Forward and proto params. + */ template <typename Dtype> class MemoryDataLayer : public Layer<Dtype> { public: @@ -264,6 +293,12 @@ class MemoryDataLayer : public Layer<Dtype> { int pos_; }; +/** + * @brief Provides data to the Net from windows of images files, specified + * by a window data file. + * + * TODO(dox): thorough documentation for Forward and proto params. + */ template <typename Dtype> class WindowDataLayer : public Layer<Dtype>, public InternalThread { public: From f2f73cfda455d941ace64294024042c602806639 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Fri, 29 Aug 2014 22:57:27 -0700 Subject: [PATCH 0644/2053] vision_layers.hpp: Doxygen \brief & TODO stubs. --- include/caffe/vision_layers.hpp | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 02f9e43b6d9..86a54ceddaf 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -16,8 +16,12 @@ namespace caffe { -/* ConvolutionLayer -*/ +/** + * @brief Convolves the input image with a bank of learned filters, + * and (optionally) adds biases. + * + * TODO(dox): thorough documentation for Forward, Backward, and proto params. + */ template <typename Dtype> class ConvolutionLayer : public Layer<Dtype> { public: @@ -60,8 +64,13 @@ class ConvolutionLayer : public Layer<Dtype> { int N_; }; -/* Im2colLayer -*/ +/** + * @brief A helper for image operations that rearranges image regions into + * column vectors. Used by ConvolutionLayer to perform convolution + * by matrix multiplication. + * + * TODO(dox): thorough documentation for Forward, Backward, and proto params. + */ template <typename Dtype> class Im2colLayer : public Layer<Dtype> { public: @@ -98,9 +107,11 @@ class Im2colLayer : public Layer<Dtype> { template <typename Dtype> class PoolingLayer; template <typename Dtype> class SplitLayer; -/* LRNLayer - Local Response Normalization -*/ +/** + * @brief Normalize the input in a local region across or within feature maps. + * + * TODO(dox): thorough documentation for Forward, Backward, and proto params. + */ template <typename Dtype> class LRNLayer : public Layer<Dtype> { public: @@ -171,8 +182,11 @@ class LRNLayer : public Layer<Dtype> { }; -/* PoolingLayer -*/ +/** + * @brief Pools the input image by taking the max, average, etc. within regions. + * + * TODO(dox): thorough documentation for Forward, Backward, and proto params. + */ template <typename Dtype> class PoolingLayer : public Layer<Dtype> { public: From 81eb2ebf0e8ab407c01d4702e6aaa17fc51108eb Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sat, 30 Aug 2014 14:46:13 -0700 Subject: [PATCH 0645/2053] filler.hpp: add brief filler descriptions --- include/caffe/filler.hpp | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/include/caffe/filler.hpp b/include/caffe/filler.hpp index a8366801132..136ce958aed 100644 --- a/include/caffe/filler.hpp +++ b/include/caffe/filler.hpp @@ -15,6 +15,7 @@ namespace caffe { +/// @brief Fills a Blob with constant or randomly-generated data. template <typename Dtype> class Filler { public: @@ -26,6 +27,7 @@ class Filler { }; // class Filler +/// @brief Fills a Blob with constant values @f$ x = 0 @f$. template <typename Dtype> class ConstantFiller : public Filler<Dtype> { public: @@ -44,6 +46,7 @@ class ConstantFiller : public Filler<Dtype> { } }; +/// @brief Fills a Blob with uniformly distributed values @f$ x\sim U(a, b) @f$. template <typename Dtype> class UniformFiller : public Filler<Dtype> { public: @@ -58,6 +61,7 @@ class UniformFiller : public Filler<Dtype> { } }; +/// @brief Fills a Blob with Gaussian-distributed values @f$ x = a @f$. template <typename Dtype> class GaussianFiller : public Filler<Dtype> { public: @@ -92,6 +96,9 @@ class GaussianFiller : public Filler<Dtype> { shared_ptr<SyncedMemory> rand_vec_; }; +/** @brief Fills a Blob with values @f$ x \in [0, 1] @f$ + * such that @f$ \forall i \sum_j x_{ij} = 1 @f$. + */ template <typename Dtype> class PositiveUnitballFiller : public Filler<Dtype> { public: @@ -119,14 +126,21 @@ class PositiveUnitballFiller : public Filler<Dtype> { } }; -// A filler based on the paper [Bengio and Glorot 2010]: Understanding -// the difficulty of training deep feedforward neuralnetworks, but does not -// use the fan_out value. -// -// It fills the incoming matrix by randomly sampling uniform data from -// [-scale, scale] where scale = sqrt(3 / fan_in) where fan_in is the number -// of input nodes. You should make sure the input blob has shape (num, a, b, c) -// where a * b * c = fan_in. +/** + * @brief Fills a Blob with values @f$ x \sim U(-a, +a) @f$ where @f$ a @f$ + * is set inversely proportional to the number of incoming nodes. + * + * A Filler based on the paper [Bengio and Glorot 2010]: Understanding + * the difficulty of training deep feedforward neuralnetworks, but does not + * use the fan_out value. + * + * It fills the incoming matrix by randomly sampling uniform data from + * [-scale, scale] where scale = sqrt(3 / fan_in) where fan_in is the number + * of input nodes. You should make sure the input blob has shape (num, a, b, c) + * where a * b * c = fan_in. + * + * TODO(dox): make notation in above comment consistent with rest & use LaTeX. + */ template <typename Dtype> class XavierFiller : public Filler<Dtype> { public: @@ -144,9 +158,12 @@ class XavierFiller : public Filler<Dtype> { }; -// A function to get a specific filler from the specification given in -// FillerParameter. Ideally this would be replaced by a factory pattern, -// but we will leave it this way for now. +/** + * @brief Get a specific filler from the specification given in FillerParameter. + * + * Ideally this would be replaced by a factory pattern, but we will leave it + * this way for now. + */ template <typename Dtype> Filler<Dtype>* GetFiller(const FillerParameter& param) { const std::string& type = param.type(); From c84908a6052e3e773d776048a7658ac85efa366b Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sat, 30 Aug 2014 15:02:22 -0700 Subject: [PATCH 0646/2053] blob.hpp: a little Doxygen-style documentation --- include/caffe/blob.hpp | 42 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index 69600290858..b2a5c2f697d 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -8,6 +8,13 @@ namespace caffe { +/** + * @brief A wrapper around SyncedMemory holders serving as the basic + * computational unit through which Layer%s, Net%s, and Solver%s + * interact. + * + * TODO(dox): more thorough description. + */ template <typename Dtype> class Blob { public: @@ -36,8 +43,15 @@ class Blob { CHECK_LE(w, width_); return ((n * channels_ + c) * height_ + h) * width_ + w; } - // Copy from source. If copy_diff is false, we copy the data; if copy_diff - // is true, we copy the diff. + /** + * @brief Copy from a source Blob. + * + * @param source the Blob to copy from + * @param copy_diff if false, copy the data; if true, copy the diff + * @param reshape if false, require this Blob to be pre-shaped to the shape + * of other (and die otherwise); if true, Reshape this Blob to other's + * shape if necessary + */ void CopyFrom(const Blob<Dtype>& source, bool copy_diff = false, bool reshape = false); @@ -74,16 +88,28 @@ class Blob { void FromProto(const BlobProto& proto); void ToProto(BlobProto* proto, bool write_diff = false) const; - // Compute the sum of absolute values (L1 norm) of the data or diff. + /// @brief Compute the sum of absolute values (L1 norm) of the data. Dtype asum_data() const; + /// @brief Compute the sum of absolute values (L1 norm) of the diff. Dtype asum_diff() const; - // Set the data_/diff_ shared_ptr to point to the SyncedMemory holding the - // data_/diff_ of Blob other -- useful in layers which simply perform a copy - // in their forward or backward pass. - // This deallocates the SyncedMemory holding this blob's data/diff, as - // shared_ptr calls its destructor when reset with the = operator. + /** + * @brief Set the data_ shared_ptr to point to the SyncedMemory holding the + * data_ of Blob other -- useful in Layer&s which simply perform a copy + * in their Forward pass. + * + * This deallocates the SyncedMemory holding this Blob's data_, as + * shared_ptr calls its destructor when reset with the "=" operator. + */ void ShareData(const Blob& other); + /** + * @brief Set the diff_ shared_ptr to point to the SyncedMemory holding the + * diff_ of Blob other -- useful in Layer&s which simply perform a copy + * in their Forward pass. + * + * This deallocates the SyncedMemory holding this Blob's diff_, as + * shared_ptr calls its destructor when reset with the "=" operator. + */ void ShareDiff(const Blob& other); protected: From 19cf38504856ea36780d8f039b9b0627536c85aa Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sat, 30 Aug 2014 15:06:16 -0700 Subject: [PATCH 0647/2053] syncedmem.hpp: \brief and todo --- include/caffe/syncedmem.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/caffe/syncedmem.hpp b/include/caffe/syncedmem.hpp index b2fc287b23e..db8d0e80e12 100644 --- a/include/caffe/syncedmem.hpp +++ b/include/caffe/syncedmem.hpp @@ -31,6 +31,12 @@ inline void CaffeFreeHost(void* ptr) { } +/** + * @brief Manages memory allocation and synchronization between the host (CPU) + * and device (GPU). + * + * TODO(dox): more thorough description. + */ class SyncedMemory { public: SyncedMemory() From 4572663839ee7132cb7b38004800367e4dc89c22 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sat, 30 Aug 2014 15:12:39 -0700 Subject: [PATCH 0648/2053] solver.hpp: add \briefs --- include/caffe/solver.hpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 5a7f31be017..6fd159d0b98 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -8,6 +8,12 @@ namespace caffe { +/** + * @brief An interface for classes that perform optimization on Net%s. + * + * Requires implementation of ComputeUpdateValue to compute a parameter update + * given the current state of the Net parameters. + */ template <typename Dtype> class Solver { public: @@ -57,6 +63,10 @@ class Solver { }; +/** + * @brief Optimizes the parameters of a Net using + * stochastic gradient descent (SGD) with momentum. + */ template <typename Dtype> class SGDSolver : public Solver<Dtype> { public: From 9c31482e04ca6f215b079c04cf3784123373bf37 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sat, 30 Aug 2014 15:30:48 -0700 Subject: [PATCH 0649/2053] net.hpp: Doxygen-format docs --- include/caffe/net.hpp | 137 +++++++++++++++++++++++++----------------- 1 file changed, 82 insertions(+), 55 deletions(-) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index cc238e721b6..3dcd0d5d598 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -14,6 +14,12 @@ namespace caffe { +/** + * @brief Connects Layer%s together into a directed acyclic graph (DAG) + * specified by a NetParameter. + * + * TODO(dox): more thorough description. + */ template <typename Dtype> class Net { public: @@ -21,32 +27,41 @@ class Net { explicit Net(const string& param_file); virtual ~Net() {} - // Initialize a network with the network parameter. + /// @brief Initialize a network with a NetParameter. void Init(const NetParameter& param); - // Run forward with the input blobs already fed separately. You can get the - // input blobs using input_blobs(). + /** + * @brief Run Forward with the input Blob%s already fed separately. + * + * You can get the input blobs using input_blobs(). + */ const vector<Blob<Dtype>*>& ForwardPrefilled(Dtype* loss = NULL); - // The From and To variants of Forward and Backward operate on the - // (topological) ordering by which the net is specified. For general DAG - // networks, note that (1) computing from one layer to another might entail - // extra computation on unrelated branches, and (2) computation starting in - // the middle may be incorrect if all of the layers of a fan-in are not - // included. + /** + * The From and To variants of Forward and Backward operate on the + * (topological) ordering by which the net is specified. For general DAG + * networks, note that (1) computing from one layer to another might entail + * extra computation on unrelated branches, and (2) computation starting in + * the middle may be incorrect if all of the layers of a fan-in are not + * included. + */ Dtype ForwardFromTo(int start, int end); Dtype ForwardFrom(int start); Dtype ForwardTo(int end); - // Run forward using a set of bottom blobs, and return the result. + /// @brief Run forward using a set of bottom blobs, and return the result. const vector<Blob<Dtype>*>& Forward(const vector<Blob<Dtype>* > & bottom, Dtype* loss = NULL); - // Run forward using a serialized BlobProtoVector and return the result - // as a serialized BlobProtoVector + /** + * @brief Run forward using a serialized BlobProtoVector and return the + * result as a serialized BlobProtoVector + */ string Forward(const string& input_blob_protos, Dtype* loss = NULL); - // The network backward should take no input and output, since it solely - // computes the gradient w.r.t the parameters, and the data has already - // been provided during the forward pass. + /** + * The network backward should take no input and output, since it solely + * computes the gradient w.r.t the parameters, and the data has already been + * provided during the forward pass. + */ void Backward(); void BackwardFromTo(int start, int end); void BackwardFrom(int start); @@ -59,33 +74,44 @@ class Net { return loss; } - // Updates the network weights based on the diff values computed. + /// @brief Updates the network weights based on the diff values computed. void Update(); - // For an already initialized net, ShareTrainedLayersWith() implicitly copies - // (i.e., using no additional memory) the already trained layers from another - // Net. + /** + * @brief For an already initialized net, implicitly copies (i.e., using no + * additional memory) the pre-trained layers from another Net. + */ void ShareTrainedLayersWith(Net* other); // For an already initialized net, CopyTrainedLayersFrom() copies the already // trained layers from another net parameter instance. + /** + * @brief For an already initialized net, copies the pre-trained layers from + * another Net. + */ void CopyTrainedLayersFrom(const NetParameter& param); void CopyTrainedLayersFrom(const string trained_filename); - // Writes the net to a proto. + /// @brief Writes the net to a proto. void ToProto(NetParameter* param, bool write_diff = false); - // returns the network name. + /// @brief returns the network name. inline const string& name() { return name_; } - // returns the layer names + /// @brief returns the layer names inline const vector<string>& layer_names() { return layer_names_; } - // returns the blob names + /// @brief returns the blob names inline const vector<string>& blob_names() { return blob_names_; } - // returns the blobs + /// @brief returns the blobs inline const vector<shared_ptr<Blob<Dtype> > >& blobs() { return blobs_; } - // returns the layers + /// @brief returns the layers inline const vector<shared_ptr<Layer<Dtype> > >& layers() { return layers_; } - // returns the bottom and top vecs for each layer - usually you won't need - // this unless you do per-layer checks such as gradients. + /** + * @brief returns the bottom vecs for each layer -- usually you won't + * need this unless you do per-layer checks such as gradients. + */ inline vector<vector<Blob<Dtype>*> >& bottom_vecs() { return bottom_vecs_; } + /** + * @brief returns the top vecs for each layer -- usually you won't + * need this unless you do per-layer checks such as gradients. + */ inline vector<vector<Blob<Dtype>*> >& top_vecs() { return top_vecs_; } inline vector<vector<bool> >& bottom_need_backward() { return bottom_need_backward_; @@ -93,22 +119,19 @@ class Net { inline vector<Dtype>& blob_loss_weights() { return blob_loss_weights_; } - // returns the parameters + /// @brief returns the parameters inline vector<shared_ptr<Blob<Dtype> > >& params() { return params_; } - // returns the parameter learning rate multipliers + /// @brief returns the parameter learning rate multipliers inline vector<float>& params_lr() { return params_lr_; } inline vector<float>& params_weight_decay() { return params_weight_decay_; } const map<string, int>& param_names_index() { return param_names_index_; } - // Input and output blob numbers + /// @brief Input and output blob numbers inline int num_inputs() { return net_input_blobs_.size(); } inline int num_outputs() { return net_output_blobs_.size(); } inline vector<Blob<Dtype>*>& input_blobs() { return net_input_blobs_; } inline vector<Blob<Dtype>*>& output_blobs() { return net_output_blobs_; } inline vector<int>& input_blob_indices() { return net_input_blob_indices_; } inline vector<int>& output_blob_indices() { return net_output_blob_indices_; } - // has_blob and blob_by_name are inspired by - // https://github.com/kencoken/caffe/commit/f36e71569455c9fbb4bf8a63c2d53224e32a4e7b - // Access intermediary computation layers, testing with centre image only bool has_blob(const string& blob_name); const shared_ptr<Blob<Dtype> > blob_by_name(const string& blob_name); bool has_layer(const string& layer_name); @@ -117,77 +140,81 @@ class Net { void set_debug_info(const bool value) { debug_info_ = value; } // Helpers for Init. - // Remove layers that the user specified should be excluded given the current - // phase, level, and stage. + /** + * @brief Remove layers that the user specified should be excluded given the current + * phase, level, and stage. + */ static void FilterNet(const NetParameter& param, NetParameter* param_filtered); + /// @brief return whether NetState state meets NetStateRule rule static bool StateMeetsRule(const NetState& state, const NetStateRule& rule, const string& layer_name); protected: // Helpers for Init. - // Append a new input or top blob to the net. + /// @brief Append a new input or top blob to the net. void AppendTop(const NetParameter& param, const int layer_id, const int top_id, set<string>* available_blobs, map<string, int>* blob_name_to_idx); - // Append a new bottom blob to the net. + /// @brief Append a new bottom blob to the net. int AppendBottom(const NetParameter& param, const int layer_id, const int bottom_id, set<string>* available_blobs, map<string, int>* blob_name_to_idx); + /// @brief Append a new parameter blob to the net. void AppendParam(const NetParameter& param, const int layer_id, const int param_id); - // Helpers for displaying debug info. + /// @brief Helper for displaying debug info in Forward. void ForwardDebugInfo(const int layer_id); + /// @brief Helper for displaying debug info in Backward. void BackwardDebugInfo(const int layer_id); + /// @brief Helper for displaying debug info in Update. void UpdateDebugInfo(const int param_id); - // Function to get misc parameters, e.g. the learning rate multiplier and - // weight decay. + /// @brief Get misc parameters, e.g. the LR multiplier and weight decay. void GetLearningRateAndWeightDecay(); - // Individual layers in the net + /// @brief Individual layers in the net vector<shared_ptr<Layer<Dtype> > > layers_; vector<string> layer_names_; map<string, int> layer_names_index_; vector<bool> layer_need_backward_; - // blobs stores the blobs that store intermediate results between the - // layers. + /// @brief the blobs storing intermediate results between the layer. vector<shared_ptr<Blob<Dtype> > > blobs_; vector<string> blob_names_; map<string, int> blob_names_index_; vector<bool> blob_need_backward_; - // bottom_vecs stores the vectors containing the input for each layer. - // They don't actually host the blobs (blobs_ does), so we simply store - // pointers. + /// bottom_vecs stores the vectors containing the input for each layer. + /// They don't actually host the blobs (blobs_ does), so we simply store + /// pointers. vector<vector<Blob<Dtype>*> > bottom_vecs_; vector<vector<int> > bottom_id_vecs_; vector<vector<bool> > bottom_need_backward_; - // top_vecs stores the vectors containing the output for each layer + /// top_vecs stores the vectors containing the output for each layer vector<vector<Blob<Dtype>*> > top_vecs_; vector<vector<int> > top_id_vecs_; - // Vector of weight in the loss (or objective) function of each net blob, - // indexed by blob_id. + /// Vector of weight in the loss (or objective) function of each net blob, + /// indexed by blob_id. vector<Dtype> blob_loss_weights_; vector<int> param_owners_; vector<string> param_display_names_; vector<pair<int, int> > param_layer_indices_; map<string, int> param_names_index_; - // blob indices for the input and the output of the net + /// blob indices for the input and the output of the net vector<int> net_input_blob_indices_; vector<int> net_output_blob_indices_; vector<Blob<Dtype>*> net_input_blobs_; vector<Blob<Dtype>*> net_output_blobs_; string name_; - // The parameters in the network. + /// The parameters in the network. vector<shared_ptr<Blob<Dtype> > > params_; - // the learning rate multipliers + /// the learning rate multipliers vector<float> params_lr_; - // the weight decay multipliers + /// the weight decay multipliers vector<float> params_weight_decay_; - // The bytes of memory used by this net + /// The bytes of memory used by this net size_t memory_used_; - // Whether to compute and display debug info for the net. + /// Whether to compute and display debug info for the net. bool debug_info_; DISABLE_COPY_AND_ASSIGN(Net); From 134e2408bef8017b22f9af23559c17a2e4c01731 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 3 Sep 2014 00:44:23 -0700 Subject: [PATCH 0650/2053] wrap up solver.md -- add update info for all solvers with citations; rules of thumb for SGD --- docs/tutorial/index.md | 2 +- docs/tutorial/solver.md | 132 ++++++++++++++++++++++++++++++++++------ 2 files changed, 113 insertions(+), 21 deletions(-) diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md index 5638e41f09d..d499806d7f4 100644 --- a/docs/tutorial/index.md +++ b/docs/tutorial/index.md @@ -24,7 +24,7 @@ and these principles direct the project. - [Nets, Layers, and Blobs](net_layer_blob.html): the anatomy of a Caffe model. - [Forward / Backward](forward_backward.html): the essential computations of layered compositional models. - [Loss](loss.html): the task to be learned is defined by the loss. -- [Solver Optimization](solver.html): the solver coordinates model optimization. +- [Solver](solver.html): the solver coordinates model optimization. - [Layer Catalogue](layers.html): the layer is the fundamental unit of modeling and computation -- Caffe's catalogue includes layers for state-of-the-art models. - [Interfaces](interfaces.html): command line, Python, and MATLAB Caffe. diff --git a/docs/tutorial/solver.md b/docs/tutorial/solver.md index 992869f88a6..3780fc3ab8c 100644 --- a/docs/tutorial/solver.md +++ b/docs/tutorial/solver.md @@ -1,10 +1,10 @@ --- layout: default --- -# Solver Optimization +# Solver The solver orchestrates model optimization by coordinating the network's forward inference and backward gradients to form parameter updates that attempt to improve the loss. -The responsibilities of learning are divided between the solver for overseeing the optimization and generating parameter updates and the network for yielding loss and gradients. +The responsibilities of learning are divided between the Solver for overseeing the optimization and generating parameter updates and the Net for yielding loss and gradients. The Caffe solvers are Stochastic Gradient Descent (SGD), Adaptive Gradient (ADAGRAD), and Nesterov's Accelerated Gradient (NAG). @@ -17,8 +17,8 @@ The solver where each iteration -1. calls network forward to make the output and loss -2. calls network backward to make the gradients +1. calls network forward to compute the output and loss +2. calls network backward to compute the gradients 3. incorporates the gradients into parameter updates according to the solver method 4. updates the solver state according to learning rate, history, and method @@ -29,34 +29,125 @@ Like Caffe models, Caffe solvers run in CPU / GPU modes. ## Methods The solver methods address the general optimization problem of loss minimization. -The optimization objective is the average loss over instances +For dataset $$D$$, the optimization objective is the average loss over all $$|D|$$ data instances throughout the dataset -$L(W) = \frac{1}{N} \sum_i f_W^{(i)}\left(X^{(i)}\right) + \lambda r(W)$ +$$L(W) = \frac{1}{|D|} \sum_i^{|D|} f_W\left(X^{(i)}\right) + \lambda r(W)$$ -where $f_W^{(i)}$ is the loss on instance $i$ with data $X^{(i)}$ in a mini-batch of size $N$ and $r(W)$ is a regularization term with weight $\lambda$. +where $$f_W\left(X^{(i)}\right)$$ is the loss on data instance $$X^{(i)}$$ and $$r(W)$$ is a regularization term with weight $$\lambda$$. +$$|D|$$ can be very large, so in practice, in each solver iteration we use a stochastic approximation of this objective, drawing a mini-batch of $$N << |D|$$ instances: -The model computes $f_W$ in the forward pass and the gradient $\nabla f_W$ in the backward pass. +$$L(W) \approx \frac{1}{N} \sum_i^N f_W\left(X^{(i)}\right) + \lambda r(W)$$ -The gradient of the loss $\nabla L(W)$ is formed by the solver from the model gradient $\nabla f_W$, the regularlization gradient $r(W)$, and other particulars to each method. -The method then computes the parameter update $\Delta W$ to update the weights and iterate. +The model computes $$f_W$$ in the forward pass and the gradient $$\nabla f_W$$ in the backward pass. + +The parameter update $$\Delta W$$ is formed by the solver from the error gradient $$\nabla f_W$$, the regularization gradient $$r(W)$$, and other particulars to each method. ### SGD -Stochastic gradient descent (SGD) +**Stochastic gradient descent** (`solver_type: SGD`) updates the weights $$ W $$ by a linear combination of the negative gradient $$ \nabla L(W) $$ and the previous weight update $$ V_t $$. +The **learning rate** $$ \alpha $$ is the weight of the negative gradient. +The **momentum** $$ \mu $$ is the weight of the previous update. + +Formally, we have the following formulas to compute the update value $$ V_{t+1} $$ and the updated weights $$ W_{t+1} $$ at iteration $$ t+1 $$, given the previous weight update $$ V_t $$ and current weights $$ W_t $$: + +$$ +V_{t+1} = \mu V_t - \alpha \nabla L(W_t) +$$ + +$$ +W_{t+1} = W_t + V_{t+1} +$$ + +The learning "hyperparameters" ($$\alpha$$ and $$\mu$$) might require a bit of tuning for best results. +If you're not sure where to start, take a look at the "Rules of thumb" below, and for further information you might refer to Leon Bottou's [Stochastic Gradient Descent Tricks](http://research.microsoft.com/pubs/192769/tricks-2012.pdf) [1]. + +[1] L. Bottou. + [Stochastic Gradient Descent Tricks](http://research.microsoft.com/pubs/192769/tricks-2012.pdf). + *Neural Networks: Tricks of the Trade*: Springer, 2012. + +#### Rules of thumb for setting the learning rate $$ \alpha $$ and momentum $$ \mu $$ + +A good strategy for deep learning with SGD is to initialize the learning rate $$ \alpha $$ to a value around $$ \alpha \approx 0.01 = 10^{-2} $$, and dropping it by a constant factor (e.g., 10) throughout training when the loss begins to reach an apparent "plateau", repeating this several times. +Generally, you probably want to use a momentum $$ \mu = 0.9 $$ or similar value. +By smoothing the weight updates across iterations, momentum tends to make deep learning with SGD both stabler and faster. -TODO Bottou pointer +This was the strategy used by Krizhevsky et al. [1] in their famously winning CNN entry to the ILSVRC-2012 competition, and Caffe makes this strategy easy to implement in a `SolverParameter`, as in our reproduction of [1] at `./examples/imagenet/alexnet_solver.prototxt`. -### ADAGRAD +To use a learning rate policy like this, you can put the following lines somewhere in your solver prototxt file: + + base_lr: 0.01 # begin training at a learning rate of 0.01 = 1e-2 + + lr_policy: "step" # learning rate policy: drop the learning rate in "steps" + # by a factor of gamma every stepsize iterations + + gamma: 0.1 # drop the learning rate by a factor of 10 + # (i.e., multiply it by a factor of gamma = 0.1) + + stepsize: 100000 # drop the learning rate every 100K iterations + + max_iter: 350000 # train for 350K iterations total + + momentum: 0.9 -The adaptive gradient (ADAGRAD) +Under the above settings, we'll always use `momentum` $$ \mu = 0.9 $$. +We'll begin training at a `base_lr` of $$ \alpha = 0.01 = 10^{-2} $$ for the first 100,000 iterations, then multiply the learning rate by `gamma` ($$ \gamma $$) and train at $$ \alpha' = \alpha \gamma = (0.01) (0.1) = 0.001 = 10^{-3} $$ for iterations 100K-200K, then at $$ \alpha'' = 10^{-4} $$ for iterations 200K-300K, and finally train until iteration 350K (since we have `max_iter: 350000`) at $$ \alpha''' = 10^{-5} $$. -TODO cite Duchi +Note that the momentum setting $$ \mu $$ effectively multiplies the size of your updates by a factor of $$ \frac{1}{1 - \mu} $$ after many iterations of training, so if you increase $$ \mu $$, it may be a good idea to **decrease** $$ \alpha $$ accordingly (and vice versa). + +For example, with $$ \mu = 0.9 $$, we have an effective update size multiplier of $$ \frac{1}{1 - 0.9} = 10 $$. +If we increased the momentum to $$ \mu = 0.99 $$, we've increased our update size multiplier to 100, so we should drop $$ \alpha $$ (`base_lr`) by a factor of 10. + +Note also that the above settings are merely guidelines, and they're definitely not guaranteed to be optimal (or even work at all!) in every situation. +If learning diverges (e.g., you start to see very large or `NaN` or `inf` loss values or outputs), try dropping the `base_lr` (e.g., `base_lr: 0.001`) and re-training, repeating this until you find a `base_lr` value that works. + +[1] A. Krizhevsky, I. Sutskever, and G. Hinton. + [ImageNet Classification with Deep Convolutional Neural Networks](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf). + *Advances in Neural Information Processing Systems*, 2012. + +### AdaGrad + +The **adaptive gradient** (`solver_type: ADAGRAD`) method (Duchi et al. [1]) is a gradient-based optimization method (like SGD) that attempts to "find needles in haystacks in the form of very predictive but rarely seen features," in Duchi et al.'s words. +Given the update information from all previous iterations $$ \left( \nabla L(W) \right)_{t'} $$ for $$ t' \in \{1, 2, ..., t\} $$, +the update formulas proposed by [1] are as follows, specified for each component $$i$$ of the weights $$W$$: + +$$ +(W_{t+1})_i = +(W_t)_i + +\frac{\alpha}{ + \sqrt{\sum_{t'=1}^{t} \left( \nabla L(W) \right)_{t',i}^2} +} +$$ + +Note that in practice, for weights $$ W \in \mathcal{R}^d $$, AdaGrad implementations (including the one in Caffe) use only $$ \mathcal{O}(d) $$ extra storage for the historical gradient information (rather than the $$ \mathcal{O}(dt) $$ storage that would be necessary to store each historical gradient individually). + +[1] J. Duchi, E. Hazan, and Y. Singer. + [Adaptive Subgradient Methods for Online Learning and Stochastic Optimization](http://www.magicbroom.info/Papers/DuchiHaSi10.pdf). + *The Journal of Machine Learning Research*, 2011. ### NAG -Nesterov's accelerated gradient (NAG) +**Nesterov's accelerated gradient** (`solver_type: NAG`) was proposed by Nesterov [1] as an "optimal" method of convex optimization, achieving a convergence rate of $$ \mathcal{O}(1/t^2) $$ rather than the $$ \mathcal{O}(1/t) $$. +Though the required assumptions to achieve the $$ \mathcal{O}(1/t^2) $$ convergence typically will not hold for deep networks trained with Caffe (e.g., due to non-smoothness and non-convexity), in practice NAG can be a very effective method for optimizing certain types of deep learning architectures, as demonstrated for deep MNIST autoencoders by Sutskever et al. [2]. + +The weight update formulas look very similar to the SGD updates given above: + +$$ +V_{t+1} = \mu V_t - \alpha \nabla L(W_t + \mu V_t) +$$ + +$$ +W_{t+1} = W_t + V_{t+1} +$$ -TODO cite ??? +What distinguishes the method from SGD is the weight setting $$ W $$ on which we compute the error gradient $$ \nabla L(W) $$ -- in NAG we take the gradient on weights with added momentum $$ \nabla L(W_t + \mu V_t) $$; in SGD we simply take the gradient $$ \nabla L(W_t) $$ on the current weights themselves. + +[1] Y. Nesterov. + A Method of Solving a Convex Programming Problem with Convergence Rate $$\mathcal{O}(1/\sqrt{k})$$. + *Soviet Mathematics Doklady*, 1983. + +[2] I. Sutskever, J. Martens, G. Dahl, and G. Hinton. + [On the Importance of Initialization and Momentum in Deep Learning](http://www.cs.toronto.edu/~fritz/absps/momentum.pdf). + *Proceedings of the 30th International Conference on Machine Learning*, 2013. ## Scaffolding @@ -149,8 +240,9 @@ Completion ## Updating Parameters The actual weight update is made by the solver then applied to the net parameters in `Solver::ComputeUpdateValue()`. - -TODO +The `ComputeUpdateValue` method incorporates any weight decay $$ r(W) $$ into the weight gradients (which currently just contain the error gradients) to get the final gradient with respect to each network weight. +Then these gradients are scaled by the learning rate $$ \alpha $$ and the update to subtract is stored in each parameter Blob's `diff` field. +Finally, the `Blob::Update` method is called on each parameter blob, which performs the final update (subtracting the Blob's `diff` from its `data`). ## Snapshotting and Resuming @@ -168,7 +260,7 @@ Snapshotting is configured by: # File path prefix for snapshotting model weights and solver state. # Note: this is relative to the invocation of the `caffe` utility, not the # solver definition file. - snapshot_prefix: /path/to/model + snapshot_prefix: "/path/to/model" # Snapshot the diff along with the weights. This can help debugging training # but takes more storage. snapshot_diff: false From 9f1903074eda2d60758867943b0974d8b1ce4de4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 3 Sep 2014 12:25:52 -0700 Subject: [PATCH 0651/2053] [docs] draft data --- docs/tutorial/data.md | 74 ++++++++++++++++++++++++++++++++++++++++++ docs/tutorial/index.md | 1 + 2 files changed, 75 insertions(+) diff --git a/docs/tutorial/data.md b/docs/tutorial/data.md index de2d5526dcb..644ba9bef8b 100644 --- a/docs/tutorial/data.md +++ b/docs/tutorial/data.md @@ -2,3 +2,77 @@ layout: default --- # Data: Ins and Outs + +Data flows through Caffe as [Blobs](net_layer_blob.html#blob-storage-and-communication). +Data layers load input and save output by converting to and from Blob to other formats. +Common transformations like mean-subtraction and feature-scaling are done by data layer configuration. +New input types are supported by developing a new data layer -- the rest of the Net follows by the modularity of the Caffe layer catalogue. + +This data layer definition + + layers { + name: "mnist" + # DATA layer loads leveldb or lmdb storage DBs for high-throughput. + type: DATA + # the 1st top is the data itself: the name is only convention + top: "data" + # the 2nd top is the ground truth: the name is only convention + top: "label" + # the DATA layer configuration + data_param { + # path to the DB + source: "examples/mnist/mnist_train_lmdb" + # type of DB: LEVELDB or LMDB (LMDB supports concurrent reads) + backend: LMDB + # batch processing improves efficiency. + batch_size: 64 + } + # common data transformations + transform_param { + # feature scaling coefficient: this maps the [0, 255] MNIST data to [0, 1] + scale: 0.00390625 + } + } + +loads the MNIST digits. + +**Tops and Bottoms**: A data layer makes **top** blobs to output data to the model. +It does not have **bottom** blobs since it takes no input. + +**Data and Label**: a data layer has at least one top canonically named **data**. +For ground truth a second top can be defined that is canonically named **label**. +Both tops simply produce blobs and there is nothing inherently special about these names. +The (data, label) pairing is a convenience for classification models. + +**Transformations**: data preprocessing is parametrized by transformation messages within the data layer definition. + + layers { + name: "data" + type: DATA + [...] + transform_param { + scale: 0.1 + mean_file_size: mean.binaryproto + # for images in particular horizontal mirroring and random cropping + # can be done as simple data augmentations. + mirror: 1 # 1 = on, 0 = off + # crop a `crop_size` x `crop_size` patch: + # - at random during training + # - from the center during testing + crop_size: 227 + } + } + +**Prefetching**: for throughput data layers fetch the next batch of data and prepare it in the background while the Net computes the current batch. + +**Multiple Inputs**: a Net can have multiple inputs of any number and type. Define as many data layers as needed giving each a unique name and top. Multiple inputs are useful for non-trivial ground truth: one data layer loads the actual data and the other data layer loads the ground truth in lock-step. In this arrangement both data and label can be any 4D array. Further applications of multiple inputs are found in multi-modal and sequence models. In these cases you may need to implement your own data preparation routines or a special data layer. + +*Improvements to data processing to add formats, generality, or helper utilities are welcome!* + +## Formats + +Refer to the layer catalogue of [data layers](layers.html#data-layers) for close-ups on each type of data Caffe understands. + +## Deployment Input + +For on-the-fly computation deployment Nets define their inputs by `input` fields: these Nets then accept direct assignment of data for online or interactive computation. diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md index d499806d7f4..d47ecad95c6 100644 --- a/docs/tutorial/index.md +++ b/docs/tutorial/index.md @@ -27,6 +27,7 @@ and these principles direct the project. - [Solver](solver.html): the solver coordinates model optimization. - [Layer Catalogue](layers.html): the layer is the fundamental unit of modeling and computation -- Caffe's catalogue includes layers for state-of-the-art models. - [Interfaces](interfaces.html): command line, Python, and MATLAB Caffe. +- [Data](data.html): how to caffeinate data for model input. For a closer look at a few details: From b3673174f8301d9d3fa8203323f5ad8d7b3f65fd Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 3 Sep 2014 12:46:47 -0700 Subject: [PATCH 0652/2053] [docs] suggest the CVPR14 deep learning tutorial for nice contrast --- docs/tutorial/index.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md index d47ecad95c6..0c048111c55 100644 --- a/docs/tutorial/index.md +++ b/docs/tutorial/index.md @@ -38,12 +38,14 @@ For a closer look at a few details: There are helpful references freely online for deep learning that complement our hands-on tutorial. These cover introductory and advanced material, background and history, and the latest advances. +The [Tutorial on Deep Learning for Vision](https://sites.google.com/site/deeplearningcvpr2014/) from CVPR '14 is a good companion tutorial for researchers. +Once you have the framework and practice foundations from the Caffe tutorial, explore the fundamental ideas and advanced research directions in the CVPR '14 tutorial. + A broad introduction is given in the free online draft of [Neural Networks and Deep Learning](http://neuralnetworksanddeeplearning.com/index.html) by Michael Nielsen. In particular the chapters on using neural nets and how backpropagation works are helpful if you are new to the subject. -These recent academic tutorials explain deep learning for researchers in machine learning and vision: +These recent academic tutorials cover deep learning for researchers in machine learning and vision: - [Deep Learning Tutorial](http://www.cs.nyu.edu/~yann/talks/lecun-ranzato-icml2013.pdf) by Yann LeCun (NYU, Facebook) and Marc'Aurelio Ranzato (Facebook). ICML 2013 tutorial. -- [Large-Scale Visual Recognition: Deep Learning Tutorial](https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnxsc3ZydHV0b3JpYWxjdnByMTR8Z3g6Njg5MmZkZTM1MDhhZWNmZA) by Marc'Aurelio Ranzato (Facebook). CPVR 2014 tutorial. - [LISA Deep Learning Tutorial](http://deeplearning.net/tutorial/deeplearning.pdf) by the LISA Lab directed by Yoshua Bengio (U. Montréal). For an exposition of neural networks in circuits and code, check out [Understanding Neural Networks from a Programmer's Perspective](http://karpathy.github.io/neuralnets/) by Andrej Karpathy (Stanford). From 09a1ce79ca6e97df2a48555f217545ce2dd971c3 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 3 Sep 2014 12:59:55 -0700 Subject: [PATCH 0653/2053] update doxygen config to stop warnings --- .Doxyfile | 2406 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 1480 insertions(+), 926 deletions(-) diff --git a/.Doxyfile b/.Doxyfile index e0b64bdd6a0..432c9c62f1c 100644 --- a/.Doxyfile +++ b/.Doxyfile @@ -1,110 +1,129 @@ -# Doxyfile 1.7.6.1 +# Doxyfile 1.8.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # -# All text after a hash (#) is considered a comment and will be ignored. +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. # The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (" "). +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 -# The PROJECT_NAME tag is a single word (or sequence of words) that should -# identify the project. Note that if you do not use Doxywizard you need -# to put quotes around the project name if it contains spaces. +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. PROJECT_NAME = "Caffe" -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. +# With the PROJECT_LOGO tag one can specify an logo or icon that is included in +# the documentation. The maximum height of the logo should not exceed 55 pixels +# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo +# to the output directory. PROJECT_LOGO = -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. OUTPUT_DIRECTORY = ./doxygen/ -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. CREATE_SUBDIRS = NO +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, -# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, -# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. +# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. +# The default value is: YES. REPEAT_BRIEF = YES -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief +# doxygen will generate a detailed section even if there is only a brief # description. +# The default value is: NO. ALWAYS_DETAILED_SEC = NO @@ -112,160 +131,207 @@ ALWAYS_DETAILED_SEC = NO # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. +# The default value is: NO. INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. +# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. FULL_PATH_NAMES = YES -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. STRIP_FROM_INC_PATH = -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. SHORT_NAMES = NO -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. JAVADOC_AUTOBRIEF = NO -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. QT_AUTOBRIEF = NO -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a +# new page for each member. If set to NO, the documentation of a member will be +# part of the file/class/namespace that contains it. +# The default value is: NO. SEPARATE_MEMBER_PAGES = NO -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 8 -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name=value". -# For example adding "sideeffect=\par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding -# "class=itcl::class" will allow you to use the command class in the -# itcl::class meaning. +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. TCL_SUBST = -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given extension. -# Doxygen has a built-in mapping, but you can override or extend it using this -# tag. The format is ext=language, where ext is a file extension, and language -# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, -# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make -# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C -# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions -# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. EXTENSION_MAPPING = +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by by putting a % sign in front of the word +# or globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. +# The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. +# The default value is: NO. CPP_CLI_SUPPORT = NO -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. SIP_SUPPORT = NO -# For Microsoft's IDL there are propget and propput attributes to indicate getter -# and setter methods for a property. Setting this option to YES (the default) -# will make doxygen replace the get and set methods by a property in the -# documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. IDL_PROPERTY_SUPPORT = YES @@ -273,67 +339,61 @@ IDL_PROPERTY_SUPPORT = YES # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. +# The default value is: NO. DISTRIBUTE_GROUP_DOC = NO -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. SUBGROUPING = YES -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. INLINE_GROUPED_CLASSES = NO -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and -# unions with only public data fields will be shown inline in the documentation -# of the scope in which they are defined (i.e. file, namespace, or group -# documentation), provided this scope is documented. If set to NO (the default), -# structs, classes, and unions are shown on a separate page (for HTML and Man -# pages) or section (for LaTeX and RTF). +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. INLINE_SIMPLE_STRUCTS = NO -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. TYPEDEF_HIDES_STRUCT = NO -# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to -# determine which symbols to keep in memory and which to flush to disk. -# When the cache is full, less often used symbols will be written to disk. -# For small to medium size projects (<1000 input files) the default value is -# probably good enough. For larger projects a too small cache size can cause -# doxygen to be busy swapping symbols to and from disk most of the time -# causing a significant performance penalty. -# If the system has enough physical memory increasing the cache will improve the -# performance by keeping more symbols in memory. Note that the value works on -# a logarithmic scale so increasing the size by one will roughly double the -# memory usage. The cache size is given by this formula: -# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols. - -SYMBOL_CACHE_SIZE = 0 - -# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be -# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given -# their name and scope. Since this can be an expensive process and often the -# same symbol appear multiple times in the code, doxygen keeps a cache of -# pre-resolved symbols. If the cache is too small doxygen will become slower. -# If the cache is too large, memory is wasted. The cache size is given by this -# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, -# corresponding to a cache size of 2^16 = 65536 symbols. +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 @@ -342,357 +402,409 @@ LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. EXTRACT_ALL = NO -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# be included in the documentation. +# The default value is: NO. EXTRACT_PRIVATE = NO -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# included in the documentation. +# The default value is: NO. EXTRACT_STATIC = NO -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. EXTRACT_LOCAL_CLASSES = YES -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. +# This flag is only useful for Objective-C code. When set to YES local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO only methods in the interface are +# included. +# The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. EXTRACT_ANON_NSPACES = NO -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. HIDE_UNDOC_MEMBERS = NO -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO these classes will be included in the various overviews. This option has +# no effect if EXTRACT_ALL is enabled. +# The default value is: NO. HIDE_UNDOC_CLASSES = NO -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO these declarations will be +# included in the documentation. +# The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. HIDE_IN_BODY_DOCS = NO -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. +# The default value is: system dependent. CASE_SENSE_NAMES = YES -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES the +# scope will be hidden. +# The default value is: NO. HIDE_SCOPE_NAMES = NO -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. SHOW_INCLUDE_FILES = YES -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. FORCE_LOCAL_INCLUDES = NO -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. INLINE_INFO = YES -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. +# The default value is: YES. SORT_MEMBER_DOCS = YES -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. SORT_GROUP_NAMES = NO -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. SORT_BY_SCOPE_NAME = NO -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. STRICT_PROTO_MATCHING = NO -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. +# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the +# todo list. This list is created by putting \todo commands in the +# documentation. +# The default value is: YES. GENERATE_TODOLIST = YES -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. +# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the +# test list. This list is created by putting \test commands in the +# documentation. +# The default value is: YES. GENERATE_TESTLIST = YES -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. +# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. GENERATE_BUGLIST = YES -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. +# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. GENERATE_DEPRECATEDLIST= YES -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if sectionname ... \endif. +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if <section_label> ... \endif and \cond <section_label> +# ... \endcond blocks. ENABLED_SECTIONS = -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES the list +# will mention the files that were used to generate the documentation. +# The default value is: YES. SHOW_USED_FILES = YES -# If the sources in your project are distributed over multiple directories -# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy -# in the documentation. The default is NO. - -SHOW_DIRECTORIES = NO - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. SHOW_FILES = YES -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. -# This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via -# popen()) the command <command> <input-file>, where <command> is the value of -# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. The create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. LAYOUT_FILE = -# The CITE_BIB_FILES tag can be used to specify one or more bib files -# containing the references data. This must be a list of .bib files. The -# .bib extension is automatically appended if omitted. Using this command -# requires the bibtex tool to be installed. See also -# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style -# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this -# feature you need bibtex and perl available in the search path. +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- -# configuration options related to warning and progress messages +# Configuration options related to warning and progress messages #--------------------------------------------------------------------------- -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. +# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. WARNINGS = YES -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. +# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. WARN_IF_UNDOCUMENTED = NO -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. WARN_IF_DOC_ERROR = YES -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO doxygen will only warn about wrong or incomplete parameter +# documentation, but not about the absence of documentation. +# The default value is: NO. WARN_NO_PARAMDOC = NO -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- -# configuration options related to the input files +# Configuration options related to the input files #--------------------------------------------------------------------------- -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. -INPUT = ./include/caffe ./src/caffe +INPUT = ./include/caffe \ + ./src/caffe # This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. FILE_PATTERNS = -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. +# # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = ./src/caffe/test/ ./include/caffe/test/ +EXCLUDE = ./src/caffe/test/ \ + ./include/caffe/test/ # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. +# The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = @@ -701,756 +813,1091 @@ EXCLUDE_PATTERNS = # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. EXAMPLE_RECURSIVE = NO -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command <filter> <input-file>, where <filter> -# is the value of the INPUT_FILTER tag, and <input-file> is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. -# If FILTER_PATTERNS is specified, this tag will be -# ignored. +# by executing (via popen()) the command: +# +# <filter> <input-file> +# +# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. -# Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. -# The filters are a list of the form: -# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). +# INPUT_FILTER ) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext= (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + #--------------------------------------------------------------------------- -# configuration options related to source browsing +# Configuration options related to source browsing #--------------------------------------------------------------------------- -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. SOURCE_BROWSER = NO -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. INLINE_SOURCES = NO -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C and C++ comments will always remain visible. +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. STRIP_CODE_COMMENTS = YES -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. REFERENCED_BY_RELATION = NO -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. REFERENCES_RELATION = NO -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. -# Otherwise they will link to the documentation. +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. REFERENCES_LINK_SOURCE = YES -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index +# Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. ALPHABETICAL_INDEX = YES -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- -# configuration options related to the HTML output +# Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. +# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# The default value is: YES. GENERATE_HTML = YES -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is advised to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when -# changing the value of configuration settings such as GENERATE_TREEVIEW! +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If the tag is left blank doxygen -# will generate a default style sheet. Note that doxygen will try to copy -# the style sheet file to the HTML output directory, so don't put your own -# style sheet in the HTML output directory as well, or it will be erased! +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefor more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra stylesheet files is of importance (e.g. the last +# stylesheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the -# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the style sheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the stylesheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = YES -# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, -# files or namespaces will be aligned in HTML using tables. If set to -# NO a bullet list will be used. - -HTML_ALIGN_MEMBERS = YES - # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the -# page has loaded. For this to work a browser that supports -# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox -# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be # written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). +# The GENERATE_CHI flag controls if a separate .chi index file is generated ( +# YES) or that it should be included in the master .chm file ( NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. +# The BINARY_TOC flag controls whether a binary table of contents is generated ( +# YES) or a normal table of contents ( NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = org.doxygen.Project -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> -# Qt Help Project / Custom Filters</a>. +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> -# Qt Help Project / Filter Attributes</a>. +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project -# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) -# at top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. Since the tabs have the same information as the -# navigation tree you can set this option to NO if you already set -# GENERATE_TREEVIEW to YES. +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. -# Since the tree basically has the same information as the tab index you -# could consider to set DISABLE_INDEX to NO when enabling this option. +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 -# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, -# and Class Hierarchy pages using a tree view instead of an ordered list. - -USE_INLINE_TREES = NO - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the -# mathjax.org site, so you can quickly see the result without installing -# MathJax, but it is strongly recommended to install a local copy of MathJax -# before deployment. +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://www.mathjax.org/mathjax -# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension -# names that should be enabled during MathJax rendering. +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use <access key> + S +# (what the <access key> is depends on the OS and browser, but it is typically +# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down +# key> to jump into the search results window, the results can be navigated +# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel +# the search. The filter options can be selected when the cursor is inside the +# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> +# to select a filter and <Enter> or <escape> to activate or cancel the filter +# option. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a PHP enabled web server instead of at the web client -# using Javascript. Doxygen will generate the search PHP script and index -# file to put on the web server. The advantage of the server -# based approach is that it scales better to large projects and allows -# full text search. The disadvantages are that it is more difficult to setup -# and does not have live searching capabilities. +# implemented using a web server instead of a web client using Javascript. There +# are two flavors of web server based searching depending on the EXTERNAL_SEARCH +# setting. When disabled, doxygen will generate a PHP script for searching and +# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing +# and searching needs to be provided by external tools. See the section +# "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. SERVER_BASED_SEARCH = NO +# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain the +# search results. +# +# Doxygen ships with an example indexer ( doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). +# +# See the section "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will return the search results when EXTERNAL_SEARCH is enabled. +# +# Doxygen ships with an example indexer ( doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). See the section "External Indexing and +# Searching" for details. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. +# The default file is: searchdata.xml. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of +# to a relative location where the documentation can be found. The format is: +# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTRA_SEARCH_MAPPINGS = + #--------------------------------------------------------------------------- -# configuration options related to the LaTeX output +# Configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. +# If the GENERATE_LATEX tag is set to YES doxygen will generate LaTeX output. +# The default value is: YES. GENERATE_LATEX = YES -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. +# invoked. +# +# Note that when enabling USE_PDFLATEX this option is only used for generating +# bitmaps for formulas in the HTML output, but not in the Makefile that is +# written to the output directory. +# The default file is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_CMD_NAME = latex -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate +# index for LaTeX. +# The default file is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. MAKEINDEX_CMD_NAME = makeindex -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. +# If the COMPACT_LATEX tag is set to YES doxygen generates more compact LaTeX +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. COMPACT_LATEX = NO -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and -# executive. If left blank a4wide will be used. +# The PAPER_TYPE tag can be used to set the paper type that is used by the +# printer. +# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x +# 14 inches) and executive (7.25 x 10.5 inches). +# The default value is: a4. +# This tag requires that the tag GENERATE_LATEX is set to YES. PAPER_TYPE = a4 -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = amsmath amsfonts xr - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! +# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names +# that should be included in the LaTeX output. To get the times font for +# instance you can specify +# EXTRA_PACKAGES=times +# If left blank no extra packages will be included. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +EXTRA_PACKAGES = amsmath \ + amsfonts \ + xr + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the +# generated LaTeX document. The header should contain everything until the first +# chapter. If it is left blank doxygen will generate a standard header. See +# section "Doxygen usage" for information on how to let doxygen write the +# default header to a separate file. +# +# Note: Only use a user-defined header if you know what you are doing! The +# following commands have a special meaning inside the header: $title, +# $datetime, $date, $doxygenversion, $projectname, $projectnumber, +# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string, +# for the replacement values of the other commands the user is refered to +# HTML_HEADER. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the +# generated LaTeX document. The footer should contain everything after the last +# chapter. If it is left blank doxygen will generate a standard footer. See +# LATEX_HEADER for more information on how to generate a default footer and what +# special commands can be used inside the footer. +# +# Note: Only use a user-defined footer if you know what you are doing! +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. +# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the LATEX_OUTPUT output +# directory. Note that the files will be copied as-is; there are no commands or +# markers available. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_FILES = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is +# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will +# contain links (just like the HTML output) instead of page references. This +# makes the output suitable for online browsing using a PDF viewer. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a +# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate +# the PDF file directly from the LaTeX files. Set this option to YES to get a # higher quality PDF documentation. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. USE_PDFLATEX = YES -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode +# command to the generated LaTeX files. This will instruct LaTeX to keep running +# if errors occur, instead of asking the user for help. This option is also used +# when generating formulas in HTML. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_BATCHMODE = NO -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. +# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the +# index chapters (such as File Index, Compound Index, etc.) in the output. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HIDE_INDICES = NO -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. +# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source +# code with syntax highlighting in the LaTeX output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the -# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See -# http://en.wikipedia.org/wiki/BibTeX for more info. +# bibliography, e.g. plainnat, or ieeetr. See +# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# The default value is: plain. +# This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- -# configuration options related to the RTF output +# Configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. +# If the GENERATE_RTF tag is set to YES doxygen will generate RTF output. The +# RTF output is optimized for Word 97 and may not look too pretty with other RTF +# readers/editors. +# The default value is: NO. GENERATE_RTF = NO -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: rtf. +# This tag requires that the tag GENERATE_RTF is set to YES. RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. +# If the COMPACT_RTF tag is set to YES doxygen generates more compact RTF +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. COMPACT_RTF = NO -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will +# contain hyperlink fields. The RTF file will contain links (just like the HTML +# output) instead of page references. This makes the output suitable for online +# browsing using Word or some other Word compatible readers that support those +# fields. +# +# Note: WordPad (write) and others do not support links. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. RTF_HYPERLINKS = NO -# Load style sheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. +# Load stylesheet definitions from file. Syntax is similar to doxygen's config +# file, i.e. a series of assignments. You only have to provide replacements, +# missing definitions are set to their default value. +# +# See also section "Doxygen usage" for information on how to generate the +# default style sheet that doxygen normally uses. +# This tag requires that the tag GENERATE_RTF is set to YES. RTF_STYLESHEET_FILE = -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. +# Set optional variables used in the generation of an RTF document. Syntax is +# similar to doxygen's config file. A template extensions file can be generated +# using doxygen -e rtf extensionFile. +# This tag requires that the tag GENERATE_RTF is set to YES. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- -# configuration options related to the man page output +# Configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages +# If the GENERATE_MAN tag is set to YES doxygen will generate man pages for +# classes and files. +# The default value is: NO. GENERATE_MAN = NO -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. +# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. A directory man3 will be created inside the directory specified by +# MAN_OUTPUT. +# The default directory is: man. +# This tag requires that the tag GENERATE_MAN is set to YES. MAN_OUTPUT = man -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) +# The MAN_EXTENSION tag determines the extension that is added to the generated +# man pages. In case the manual section does not start with a number, the number +# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is +# optional. +# The default value is: .3. +# This tag requires that the tag GENERATE_MAN is set to YES. MAN_EXTENSION = .3 -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. +# The MAN_SUBDIR tag determines the name of the directory created within +# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by +# MAN_EXTENSION with the initial . removed. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_SUBDIR = + +# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it +# will generate one additional man file for each entity documented in the real +# man page(s). These additional files only source the real man page, but without +# them the man command would be unable to find the correct page. +# The default value is: NO. +# This tag requires that the tag GENERATE_MAN is set to YES. MAN_LINKS = NO #--------------------------------------------------------------------------- -# configuration options related to the XML output +# Configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. +# If the GENERATE_XML tag is set to YES doxygen will generate an XML file that +# captures the structure of the code including all documentation. +# The default value is: NO. GENERATE_XML = NO -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. +# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: xml. +# This tag requires that the tag GENERATE_XML is set to YES. XML_OUTPUT = xml -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. +# If the XML_PROGRAMLISTING tag is set to YES doxygen will dump the program +# listings (including syntax highlighting and cross-referencing information) to +# the XML output. Note that enabling this will significantly increase the size +# of the XML output. +# The default value is: YES. +# This tag requires that the tag GENERATE_XML is set to YES. -XML_SCHEMA = +XML_PROGRAMLISTING = YES -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. +#--------------------------------------------------------------------------- +# Configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- -XML_DTD = +# If the GENERATE_DOCBOOK tag is set to YES doxygen will generate Docbook files +# that can be used to generate PDF. +# The default value is: NO. -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. +GENERATE_DOCBOOK = NO -XML_PROGRAMLISTING = YES +# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in +# front of it. +# The default directory is: docbook. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_OUTPUT = docbook + +# If the DOCBOOK_PROGRAMLISTING tag is set to YES doxygen will include the +# program listings (including syntax highlighting and cross-referencing +# information) to the DOCBOOK output. Note that enabling this will significantly +# increase the size of the DOCBOOK output. +# The default value is: NO. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_PROGRAMLISTING = NO #--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output +# Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. +# If the GENERATE_AUTOGEN_DEF tag is set to YES doxygen will generate an AutoGen +# Definitions (see http://autogen.sf.net) file that captures the structure of +# the code including all documentation. Note that this feature is still +# experimental and incomplete at the moment. +# The default value is: NO. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- -# configuration options related to the Perl module output +# Configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. +# If the GENERATE_PERLMOD tag is set to YES doxygen will generate a Perl module +# file that captures the structure of the code including all documentation. +# +# Note that this feature is still experimental and incomplete at the moment. +# The default value is: NO. GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. +# If the PERLMOD_LATEX tag is set to YES doxygen will generate the necessary +# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI +# output from the Perl module output. +# The default value is: NO. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. PERLMOD_LATEX = NO -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be nicely +# formatted so it can be parsed by a human reader. This is useful if you want to +# understand what is going on. On the other hand, if this tag is set to NO the +# size of the Perl module output will be much smaller and Perl will parse it +# just the same. +# The default value is: YES. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. PERLMOD_PRETTY = YES -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. +# The names of the make variables in the generated doxyrules.make file are +# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful +# so different doxyrules.make files included by the same Makefile don't +# overwrite each other's variables. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. PERLMOD_MAKEVAR_PREFIX = @@ -1458,110 +1905,128 @@ PERLMOD_MAKEVAR_PREFIX = # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. +# If the ENABLE_PREPROCESSING tag is set to YES doxygen will evaluate all +# C-preprocessor directives found in the sources and include files. +# The default value is: YES. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. +# If the MACRO_EXPANSION tag is set to YES doxygen will expand all macro names +# in the source code. If set to NO only conditional compilation will be +# performed. Macro expansion can be done in a controlled way by setting +# EXPAND_ONLY_PREDEF to YES. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. MACRO_EXPANSION = NO -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then +# the macro expansion is limited to the macros specified with the PREDEFINED and +# EXPAND_AS_DEFINED tags. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. EXPAND_ONLY_PREDEF = NO -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when a #include is found. +# If the SEARCH_INCLUDES tag is set to YES the includes files in the +# INCLUDE_PATH will be searched if a #include is found. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. +# contain include files that are not input files but should be processed by the +# preprocessor. +# This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. +# directories. If left blank, the patterns specified with FILE_PATTERNS will be +# used. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. INCLUDE_FILE_PATTERNS = -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name=definition (no spaces). If the definition and the = are -# omitted =1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the := operator -# instead of the = operator. +# The PREDEFINED tag can be used to specify one or more macro names that are +# defined before the preprocessor is started (similar to the -D option of e.g. +# gcc). The argument of the tag is a list of macros of the form: name or +# name=definition (no spaces). If the definition and the "=" are omitted, "=1" +# is assumed. To prevent a macro definition from being undefined via #undef or +# recursively expanded use the := operator instead of the = operator. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. PREDEFINED = -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that -# overrules the definition found in the source code. +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this +# tag can be used to specify a list of macro names that should be expanded. The +# macro definition that is found in the sources will be used. Use the PREDEFINED +# tag if you want to use a different macro definition that overrules the +# definition found in the source code. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. EXPAND_AS_DEFINED = -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. +# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will +# remove all references to function-like macros that are alone on a line, have +# an all uppercase name, and do not end with a semicolon. Such function macros +# are typically used for boiler-plate code, and will confuse the parser if not +# removed. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::additions related to external references +# Configuration options related to external references #--------------------------------------------------------------------------- -# The TAGFILES option can be used to specify one or more tagfiles. -# Optionally an initial location of the external documentation -# can be added for each tagfile. The format of a tag file without -# this location is as follows: -# +# The TAGFILES tag can be used to specify one or more tag files. For each tag +# file the location of the external documentation should be added. The format of +# a tag file without this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: -# # TAGFILES = file1=loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths or -# URLs. If a location is present for each tag, the installdox tool -# does not have to be run to correct the links. -# Note that each tag file must have a unique name -# (where the name does NOT include the path) -# If a tag file is not located in the directory in which doxygen -# is run, you must also specify the path to the tagfile here. +# where loc1 and loc2 can be relative or absolute paths or URLs. See the +# section "Linking to external documentation" for more information about the use +# of tag files. +# Note: Each tag file must have a unique name (where the name does NOT include +# the path). If a tag file is not located in the directory in which doxygen is +# run, you must also specify the path to the tagfile here. TAGFILES = -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. +# When a file name is specified after GENERATE_TAGFILE, doxygen will create a +# tag file that is based on the input files it reads. See section "Linking to +# external documentation" for more information about the usage of tag files. GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. +# If the ALLEXTERNALS tag is set to YES all external class will be listed in the +# class index. If set to NO only the inherited external classes will be listed. +# The default value is: NO. ALLEXTERNALS = NO -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed in +# the modules index. If set to NO, only the current project's groups will be +# listed. +# The default value is: YES. EXTERNAL_GROUPS = YES +# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed in +# the related pages index. If set to NO, only the current project's pages will +# be listed. +# The default value is: YES. + +EXTERNAL_PAGES = YES + # The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). +# interpreter (i.e. the result of 'which perl'). +# The default file (with absolute path) is: /usr/bin/perl. PERL_PATH = /usr/bin/perl @@ -1569,213 +2034,302 @@ PERL_PATH = /usr/bin/perl # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. +# If the CLASS_DIAGRAMS tag is set to YES doxygen will generate a class diagram +# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to +# NO turns the diagrams off. Note that this option also works with HAVE_DOT +# disabled, but it is recommended to install and use dot, since it yields more +# powerful graphs. +# The default value is: YES. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# command. Doxygen will then run the mscgen tool (see: +# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide inheritance +# and usage relations if the target is undocumented or is not a class. +# The default value is: YES. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) +# available from the path. This tool is part of Graphviz (see: +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# Bell Labs. The other options in this section have no effect if this option is +# set to NO +# The default value is: NO. HAVE_DOT = NO -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed +# to run in parallel. When set to 0 doxygen will base this on the number of +# processors available in the system. You can set it explicitly to a value +# larger than 0 to get control over the balance between CPU load and processing +# speed. +# Minimum value: 0, maximum value: 32, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_NUM_THREADS = 0 -# By default doxygen will use the Helvetica font for all dot files that -# doxygen generates. When you want a differently looking font you can specify -# the font name using DOT_FONTNAME. You need to make sure dot is able to find -# the font, which can be done by putting it in a standard location or by setting -# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the -# directory containing the font. +# When you want a differently looking font in the dot files that doxygen +# generates you can specify the font name using DOT_FONTNAME. You need to make +# sure dot is able to find the font, which can be done by putting it in a +# standard location or by setting the DOTFONTPATH environment variable or by +# setting DOT_FONTPATH to the directory containing the font. +# The default value is: Helvetica. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTNAME = Helvetica -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. +# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of +# dot graphs. +# Minimum value: 4, maximum value: 24, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTSIZE = 10 -# By default doxygen will tell dot to use the Helvetica font. -# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to -# set the path where dot can find it. +# By default doxygen will tell dot to use the default font as specified with +# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set +# the path where dot can find it using this tag. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for +# each documented class showing the direct and indirect inheritance relations. +# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. COLLABORATION_GRAPH = YES -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. UML_LOOK = NO -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LIMIT_NUM_FIELDS = 10 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. TEMPLATE_RELATIONS = NO -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. INCLUDE_GRAPH = YES -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. CALL_GRAPH = NO -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. CALLER_GRAPH = NO -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will generate a graphical hierarchy of all classes instead of a textual one. +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. GRAPHICAL_HIERARCHY = YES -# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. If you choose svg you need to set -# HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible in IE 9+ (other browsers do not have this requirement). +# generated by dot. +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, jpg, gif and svg. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. -# Note that this requires a modern browser other than Internet Explorer. -# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you -# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible. Older versions of IE do not have SVG support. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. INTERACTIVE_SVG = NO -# The tag DOT_PATH can be used to specify the path where the dot tool can be +# The DOT_PATH tag can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). +# contain msc files that are included in the documentation (see the \mscfile +# command). MSCFILE_DIRS = -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). + +DIAFILE_DIRS = + +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file. If left blank, it is assumed +# PlantUML is not used or called during a preprocessing step. Doxygen will +# generate a warning when it encounters a \startuml command in this case and +# will not generate output for the diagram. +# This tag requires that the tag HAVE_DOT is set to YES. + +PLANTUML_JAR_PATH = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_GRAPH_MAX_NODES = 50 -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). +# background. This is disabled by default, because dot on Windows does not seem +# to support this out of the box. +# +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_MULTI_TARGETS = YES -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. +# If the DOT_CLEANUP tag is set to YES doxygen will remove the intermediate dot +# files that are used to generate the various graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. DOT_CLEANUP = YES From c4b9ec58fe6e1d7fd325b1c131ac7a2334238ebc Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 3 Sep 2014 13:22:09 -0700 Subject: [PATCH 0654/2053] [docs] configure doxygen + docs script for docs/doxygen site output --- .gitignore | 3 ++- Makefile | 4 +++- docs/index.md | 2 ++ scripts/build_docs.sh | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 9ba6de74561..2ac7a0096eb 100644 --- a/.gitignore +++ b/.gitignore @@ -70,7 +70,8 @@ MANIFEST-* docs/_site docs/gathered _site -doxygen/ +doxygen +docs/dev # Sublime Text settings *.sublime-workspace diff --git a/Makefile b/Makefile index 50e68acd84c..546de931f7e 100644 --- a/Makefile +++ b/Makefile @@ -191,7 +191,8 @@ ALL_BUILD_DIRS := $(sort \ # Set directory for Doxygen-generated documentation ############################## DOXYGEN_CONFIG_FILE ?= ./.Doxyfile -DOXYGEN_OUTPUT_DIR ?= ./doxygen # should be the same as OUTPUT_DIRECTORY in the .Doxyfile +# should be the same as OUTPUT_DIRECTORY in the .Doxyfile +DOXYGEN_OUTPUT_DIR ?= ./doxygen DOXYGEN_COMMAND ?= doxygen # All the files that might have Doxygen documentation. DOXYGEN_SOURCES := $(shell find \ @@ -337,6 +338,7 @@ lintclean: @ $(RM) -r $(LINT_OUTPUT_DIR) $(EMPTY_LINT_REPORT) $(NONEMPTY_LINT_REPORT) docs: $(DOXYGEN_OUTPUT_DIR) + @ cd ./docs ; ln -sfn ../$(DOXYGEN_OUTPUT_DIR)/html doxygen $(DOXYGEN_OUTPUT_DIR): $(DOXYGEN_CONFIG_FILE) $(DOXYGEN_SOURCES) $(DOXYGEN_COMMAND) $(DOXYGEN_CONFIG_FILE) diff --git a/docs/index.md b/docs/index.md index 67b424ceefd..94227c25249 100644 --- a/docs/index.md +++ b/docs/index.md @@ -43,6 +43,8 @@ Tested on Ubuntu, Red Hat, OS X. BVLC provides ready-to-use models for non-commercial use. * [Developing & Contributing](/development.html)<br /> Guidelines for development and contributing to Caffe. +* [API Documentation](/doxygen/)<br /> +Developer documentation automagically generated from code comments. ### Examples diff --git a/scripts/build_docs.sh b/scripts/build_docs.sh index c5680151416..f8ace0ead43 100755 --- a/scripts/build_docs.sh +++ b/scripts/build_docs.sh @@ -12,6 +12,9 @@ cd $ROOT_DIR # Gather docs. scripts/gather_examples.sh +# Generate developer docs. +make docs + # Display docs using web server. cd docs jekyll serve -w -s . -d _site --port=$PORT From 9302b1de5a1549a40e3797414b1d2f37167a319b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 3 Sep 2014 13:58:00 -0700 Subject: [PATCH 0655/2053] [example] upgrade fine-tuning example to new transformation param --- .../flickr_style_train_val.prototxt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/finetune_flickr_style/flickr_style_train_val.prototxt b/examples/finetune_flickr_style/flickr_style_train_val.prototxt index bcb1e1ce1e2..46a198a8d89 100644 --- a/examples/finetune_flickr_style/flickr_style_train_val.prototxt +++ b/examples/finetune_flickr_style/flickr_style_train_val.prototxt @@ -7,14 +7,14 @@ layers { image_data_param { source: "data/flickr_style/train.txt" batch_size: 50 - transform_param { - crop_size: 227 - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: true - } new_height: 256 new_width: 256 } + transform_param { + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + mirror: true + } include: { phase: TRAIN } } layers { @@ -25,14 +25,14 @@ layers { image_data_param { source: "data/flickr_style/train.txt" batch_size: 50 - transform_param { - crop_size: 227 - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: true - } new_height: 256 new_width: 256 } + transform_param { + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + mirror: false + } include: { phase: TEST } } layers { From 66acf92e0ed310eb20245305ded56ad95550af36 Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Wed, 3 Sep 2014 13:00:58 -0700 Subject: [PATCH 0656/2053] Update paths --- examples/mnist/readme.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 975a77e5128..074923d2a68 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -26,7 +26,7 @@ If it complains that `wget` or `gunzip` are not installed, you need to install t Before we actually run the training program, let's explain what will happen. We will use the [LeNet](http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf) network, which is known to work well on digit classification tasks. We will use a slightly different version from the original LeNet implementation, replacing the sigmoid activations with Rectified Linear Unit (ReLU) activations for the neurons. -The design of LeNet contains the essence of CNNs that are still used in larger models such as the ones in ImageNet. In general, it consists of a convolutional layer followed by a pooling layer, another convolution layer followed by a pooling layer, and then two fully connected layers similar to the conventional multilayer perceptrons. We have defined the layers in `CAFFE_ROOT/examples/lenet.prototxt`. +The design of LeNet contains the essence of CNNs that are still used in larger models such as the ones in ImageNet. In general, it consists of a convolutional layer followed by a pooling layer, another convolution layer followed by a pooling layer, and then two fully connected layers similar to the conventional multilayer perceptrons. We have defined the layers in `$CAFFE_ROOT/examples/mnist/lenet.prototxt`. ## Define the MNIST Network @@ -102,7 +102,7 @@ Phew. Pooling layers are actually much easier to define: This says we will perform max pooling with a pool kernel size 2 and a stride of 2 (so no overlapping between neighboring pooling regions). -Similarly, you can write up the second convolution and pooling layers. Check `data/lenet.prototxt` for details. +Similarly, you can write up the second convolution and pooling layers. Check `$CAFFE_ROOT/examples/mnist/lenet_train_test.prototxt` for details. ### Writing the Fully Connected Layer @@ -176,7 +176,7 @@ The `softmax_loss` layer implements both the softmax and the multinomial logisti ## Define the MNIST Solver -Check out the comments explaining each line in the prototxt: +Check out the comments explaining each line in the prototxt `$CAFFE_ROOT/examples/mnist/lenet_solver.prototxt`: # The train/test net protocol buffer definition net: "lenet_train_test.prototxt" From be9a912b430dc5066517dc21022d08526ac3777c Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Wed, 3 Sep 2014 13:01:29 -0700 Subject: [PATCH 0657/2053] Point to local file, not github file This makes the readme file more consistent --- examples/mnist/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 074923d2a68..a51fc1c0d3b 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -30,7 +30,7 @@ The design of LeNet contains the essence of CNNs that are still used in larger m ## Define the MNIST Network -This section explains the prototxt file `lenet_train.prototxt` used in the MNIST demo. We assume that you are familiar with [Google Protobuf](https://developers.google.com/protocol-buffers/docs/overview), and assume that you have read the protobuf definitions used by Caffe, which can be found at [src/caffe/proto/caffe.proto](https://github.com/Yangqing/caffe/blob/master/src/caffe/proto/caffe.proto). +This section explains the prototxt file `lenet_train.prototxt` used in the MNIST demo. We assume that you are familiar with [Google Protobuf](https://developers.google.com/protocol-buffers/docs/overview), and assume that you have read the protobuf definitions used by Caffe, which can be found at `$CAFFE_ROOT/src/caffe/proto/caffe.proto`. Specifically, we will write a `caffe::NetParameter` (or in python, `caffe.proto.caffe_pb2.NetParameter`) protobuf. We will start by giving the network a name: From f9a67784b02a62a41aa68fc485b0f13d505d3c17 Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Wed, 3 Sep 2014 13:18:48 -0700 Subject: [PATCH 0658/2053] Correct reference to lenet_train_test.prototxt Not lenet.prototxt --- examples/mnist/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index a51fc1c0d3b..13354916ab8 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -26,7 +26,7 @@ If it complains that `wget` or `gunzip` are not installed, you need to install t Before we actually run the training program, let's explain what will happen. We will use the [LeNet](http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf) network, which is known to work well on digit classification tasks. We will use a slightly different version from the original LeNet implementation, replacing the sigmoid activations with Rectified Linear Unit (ReLU) activations for the neurons. -The design of LeNet contains the essence of CNNs that are still used in larger models such as the ones in ImageNet. In general, it consists of a convolutional layer followed by a pooling layer, another convolution layer followed by a pooling layer, and then two fully connected layers similar to the conventional multilayer perceptrons. We have defined the layers in `$CAFFE_ROOT/examples/mnist/lenet.prototxt`. +The design of LeNet contains the essence of CNNs that are still used in larger models such as the ones in ImageNet. In general, it consists of a convolutional layer followed by a pooling layer, another convolution layer followed by a pooling layer, and then two fully connected layers similar to the conventional multilayer perceptrons. We have defined the layers in `$CAFFE_ROOT/examples/mnist/lenet_train_test.prototxt`. ## Define the MNIST Network From a865a235764fdadc9df7029e67b5e31c1a70a892 Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Wed, 3 Sep 2014 14:13:18 -0700 Subject: [PATCH 0659/2053] Inline latest lenet_solver.prototxt --- examples/mnist/readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 13354916ab8..ae294cff2c1 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -179,7 +179,7 @@ The `softmax_loss` layer implements both the softmax and the multinomial logisti Check out the comments explaining each line in the prototxt `$CAFFE_ROOT/examples/mnist/lenet_solver.prototxt`: # The train/test net protocol buffer definition - net: "lenet_train_test.prototxt" + net: "examples/mnist/lenet_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. @@ -200,9 +200,9 @@ Check out the comments explaining each line in the prototxt `$CAFFE_ROOT/example max_iter: 10000 # snapshot intermediate results snapshot: 5000 - snapshot_prefix: "lenet" - # solver mode: 0 for CPU and 1 for GPU - solver_mode: 1 + snapshot_prefix: "examples/mnist/lenet" + # solver mode: CPU or GPU + solver_mode: GPU ## Training and Testing the Model From 0766cd97f8a4d97ad1f1bdd62a8b310121cb0859 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 3 Sep 2014 15:18:21 -0700 Subject: [PATCH 0660/2053] [example] drop stale mentions of glog env var --- examples/cifar10/readme.md | 2 +- examples/mnist/readme.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cifar10/readme.md b/examples/cifar10/readme.md index d0b0b766217..bf64ce89f0e 100644 --- a/examples/cifar10/readme.md +++ b/examples/cifar10/readme.md @@ -43,7 +43,7 @@ Training the model is simple after you have written the network definition proto cd $CAFFE_ROOT/examples/cifar10 ./train_quick.sh -`train_quick.sh` is a simple script, so have a look inside. `GLOG_logtostderr=1` is the google logging flag that prints all the logging messages directly to stderr. The main tool for training is `caffe.bin` with the `train` action, and the solver protobuf text file as its argument. +`train_quick.sh` is a simple script, so have a look inside. The main tool for training is `caffe` with the `train` action, and the solver protobuf text file as its argument. When you run the code, you will see a lot of messages flying by like this: diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index ae294cff2c1..d4fb62d901b 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -211,7 +211,7 @@ Training the model is simple after you have written the network definition proto cd $CAFFE_ROOT/examples/mnist ./train_lenet.sh -`train_lenet.sh` is a simple script, but here are a few explanations: `GLOG_logtostderr=1` is the google logging flag that prints all the logging messages directly to stderr. The main tool for training is `caffe.bin` with action `train`, with the solver protobuf text file as its argument. +`train_lenet.sh` is a simple script, but here is a quick explanation: the main tool for training is `caffe` with action `train` and the solver protobuf text file as its argument. When you run the code, you will see a lot of messages flying by like this: From b136da595be1a0f176a48df989b7b91ba5ac6819 Mon Sep 17 00:00:00 2001 From: qipeng <pengrobertqi@163.com> Date: Wed, 3 Sep 2014 16:30:34 -0700 Subject: [PATCH 0661/2053] [example] convert mnist name fix (crashes xcode compiler) --- examples/mnist/convert_mnist_data.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mnist/convert_mnist_data.cpp b/examples/mnist/convert_mnist_data.cpp index 0d3e91ec3ad..19040153c86 100644 --- a/examples/mnist/convert_mnist_data.cpp +++ b/examples/mnist/convert_mnist_data.cpp @@ -37,7 +37,7 @@ void convert_dataset(const char* image_filename, const char* label_filename, std::ifstream image_file(image_filename, std::ios::in | std::ios::binary); std::ifstream label_file(label_filename, std::ios::in | std::ios::binary); CHECK(image_file) << "Unable to open file " << image_filename; - CHECK(label_file) << "Unable to open file " << label_file; + CHECK(label_file) << "Unable to open file " << label_filename; // Read the magic and the meta data uint32_t magic; uint32_t num_items; From 59fafb1f0d7d57cedd849d8ccd3cf4d179b54144 Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Thu, 4 Sep 2014 01:44:28 +0100 Subject: [PATCH 0662/2053] [docs] default setting for layout --- docs/_config.yml | 8 +++++++- docs/development.md | 1 - docs/index.md | 1 - docs/installation.md | 3 +-- docs/performance_hardware.md | 3 +-- docs/tutorial/convolution.md | 1 - docs/tutorial/data.md | 1 - docs/tutorial/forward_backward.md | 1 - docs/tutorial/index.md | 1 - docs/tutorial/interfaces.md | 1 - docs/tutorial/layers.md | 1 - docs/tutorial/loss.md | 1 - docs/tutorial/net_layer_blob.md | 1 - docs/tutorial/solver.md | 1 - examples/cifar10/readme.md | 1 - examples/feature_extraction/readme.md | 1 - examples/finetune_flickr_style/readme.md | 1 - examples/imagenet/readme.md | 1 - examples/mnist/readme.md | 1 - examples/web_demo/readme.md | 1 - 20 files changed, 9 insertions(+), 22 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index 10e6731ad27..95aec12babe 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1 +1,7 @@ -markdown: kramdown +defaults: + - + scope: + path: "" # an empty string here means all files in the project + values: + layout: "default" + diff --git a/docs/development.md b/docs/development.md index 822d88023f5..d65c126cf14 100644 --- a/docs/development.md +++ b/docs/development.md @@ -1,5 +1,4 @@ --- -layout: default title: Development --- # Development diff --git a/docs/index.md b/docs/index.md index 94227c25249..47191ba8646 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,5 +1,4 @@ --- -layout: default --- # Caffe diff --git a/docs/installation.md b/docs/installation.md index c2382c92906..82a22d5cde3 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,6 +1,5 @@ --- -layout: default -title: Caffe +title: Installation --- # Installation diff --git a/docs/performance_hardware.md b/docs/performance_hardware.md index a39e954d160..62385431751 100644 --- a/docs/performance_hardware.md +++ b/docs/performance_hardware.md @@ -1,6 +1,5 @@ --- -layout: default -title: Caffe +title: Performance and Hardware Configuration --- # Performance and Hardware Configuration diff --git a/docs/tutorial/convolution.md b/docs/tutorial/convolution.md index 2119d640e71..6a86e3afcfd 100644 --- a/docs/tutorial/convolution.md +++ b/docs/tutorial/convolution.md @@ -1,5 +1,4 @@ --- -layout: default --- # Caffeinated Convolution diff --git a/docs/tutorial/data.md b/docs/tutorial/data.md index 644ba9bef8b..87954e1da63 100644 --- a/docs/tutorial/data.md +++ b/docs/tutorial/data.md @@ -1,5 +1,4 @@ --- -layout: default --- # Data: Ins and Outs diff --git a/docs/tutorial/forward_backward.md b/docs/tutorial/forward_backward.md index 8e740262817..699a26c8953 100644 --- a/docs/tutorial/forward_backward.md +++ b/docs/tutorial/forward_backward.md @@ -1,5 +1,4 @@ --- -layout: default --- # Forward and Backward diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md index 0c048111c55..fd21a440cee 100644 --- a/docs/tutorial/index.md +++ b/docs/tutorial/index.md @@ -1,5 +1,4 @@ --- -layout: default --- # Caffe Tutorial diff --git a/docs/tutorial/interfaces.md b/docs/tutorial/interfaces.md index 33323410a16..334d27e8137 100644 --- a/docs/tutorial/interfaces.md +++ b/docs/tutorial/interfaces.md @@ -1,5 +1,4 @@ --- -layout: default --- # Interfaces diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index f316e826bab..c6040255dc5 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -1,5 +1,4 @@ --- -layout: default --- # Layers diff --git a/docs/tutorial/loss.md b/docs/tutorial/loss.md index b470eaf943e..8c053ed60ab 100644 --- a/docs/tutorial/loss.md +++ b/docs/tutorial/loss.md @@ -1,5 +1,4 @@ --- -layout: default --- # Loss diff --git a/docs/tutorial/net_layer_blob.md b/docs/tutorial/net_layer_blob.md index 21de96c8035..21b8ddece64 100644 --- a/docs/tutorial/net_layer_blob.md +++ b/docs/tutorial/net_layer_blob.md @@ -1,5 +1,4 @@ --- -layout: default --- # Nets, Layers, and Blobs: anatomy of a Caffe model diff --git a/docs/tutorial/solver.md b/docs/tutorial/solver.md index 3780fc3ab8c..f5156ee0aa9 100644 --- a/docs/tutorial/solver.md +++ b/docs/tutorial/solver.md @@ -1,5 +1,4 @@ --- -layout: default --- # Solver diff --git a/examples/cifar10/readme.md b/examples/cifar10/readme.md index bf64ce89f0e..86fd5ea2967 100644 --- a/examples/cifar10/readme.md +++ b/examples/cifar10/readme.md @@ -3,7 +3,6 @@ title: CIFAR-10 tutorial category: example description: Train and test Caffe on CIFAR-10 data. include_in_docs: true -layout: default priority: 5 --- diff --git a/examples/feature_extraction/readme.md b/examples/feature_extraction/readme.md index 4aab26c941e..083908ebe54 100644 --- a/examples/feature_extraction/readme.md +++ b/examples/feature_extraction/readme.md @@ -3,7 +3,6 @@ title: Feature extraction with Caffe C++ code. description: Extract CaffeNet / AlexNet features using the Caffe utility. category: example include_in_docs: true -layout: default priority: 10 --- diff --git a/examples/finetune_flickr_style/readme.md b/examples/finetune_flickr_style/readme.md index 822499829e6..da584f0088a 100644 --- a/examples/finetune_flickr_style/readme.md +++ b/examples/finetune_flickr_style/readme.md @@ -3,7 +3,6 @@ title: Fine-tuning for style recognition description: Fine-tune the ImageNet-trained CaffeNet on the "Flickr Style" dataset. category: example include_in_docs: true -layout: default priority: 5 --- diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index 4c716d9ce0b..b4a3110ecb6 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -3,7 +3,6 @@ title: ImageNet tutorial description: Train and test "CaffeNet" on ImageNet challenge data. category: example include_in_docs: true -layout: default priority: 1 --- diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index d4fb62d901b..5a8e8cab3f5 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -3,7 +3,6 @@ title: MNIST Tutorial description: Train and test "LeNet" on MNIST data. category: example include_in_docs: true -layout: default priority: 1 --- diff --git a/examples/web_demo/readme.md b/examples/web_demo/readme.md index b0c14e379b2..3c8fdc068e7 100644 --- a/examples/web_demo/readme.md +++ b/examples/web_demo/readme.md @@ -2,7 +2,6 @@ title: Web demo description: Image classification demo running as a Flask web server. category: example -layout: default include_in_docs: true priority: 10 --- From e553573e2c4800e11050d6b83f0579766ebf4648 Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Tue, 12 Aug 2014 17:29:25 -0700 Subject: [PATCH 0663/2053] [models] adding zoo readme; caffenet, alexnet, and rcnn models in zoo format --- .gitignore | 4 +- docs/getting_pretrained_models.md | 26 +------ docs/model_zoo.md | 31 ++++++++ examples/imagenet/get_caffe_alexnet_model.sh | 28 ------- .../imagenet/get_caffe_rcnn_imagenet_model.sh | 28 ------- .../get_caffe_reference_imagenet_model.sh | 28 ------- examples/imagenet/readme.md | 22 +++--- .../bvlc_alexnet}/alexnet_deploy.prototxt | 0 .../bvlc_alexnet}/alexnet_solver.prototxt | 4 +- .../bvlc_alexnet}/alexnet_train_val.prototxt | 60 +++++++-------- models/bvlc_alexnet/readme.md | 25 ++++++ .../caffenet_deploy.prototxt | 0 .../caffenet_solver.prototxt | 4 +- .../caffenet_train_val.prototxt | 0 models/bvlc_reference_caffenet/readme.md | 26 +++++++ .../rcnn_imagenet_deploy.prototxt | 0 models/bvlc_reference_rcnn_ilsvrc13/readme.md | 20 +++++ scripts/download_model_binary.py | 76 +++++++++++++++++++ 18 files changed, 229 insertions(+), 153 deletions(-) create mode 100644 docs/model_zoo.md delete mode 100755 examples/imagenet/get_caffe_alexnet_model.sh delete mode 100755 examples/imagenet/get_caffe_rcnn_imagenet_model.sh delete mode 100755 examples/imagenet/get_caffe_reference_imagenet_model.sh rename {examples/imagenet => models/bvlc_alexnet}/alexnet_deploy.prototxt (100%) rename {examples/imagenet => models/bvlc_alexnet}/alexnet_solver.prototxt (63%) rename {examples/imagenet => models/bvlc_alexnet}/alexnet_train_val.prototxt (100%) create mode 100644 models/bvlc_alexnet/readme.md rename examples/imagenet/imagenet_deploy.prototxt => models/bvlc_reference_caffenet/caffenet_deploy.prototxt (100%) rename examples/imagenet/imagenet_solver.prototxt => models/bvlc_reference_caffenet/caffenet_solver.prototxt (59%) rename examples/imagenet/imagenet_train_val.prototxt => models/bvlc_reference_caffenet/caffenet_train_val.prototxt (100%) create mode 100644 models/bvlc_reference_caffenet/readme.md rename {examples/imagenet => models/bvlc_reference_rcnn_ilsvrc13}/rcnn_imagenet_deploy.prototxt (100%) create mode 100644 models/bvlc_reference_rcnn_ilsvrc13/readme.md create mode 100755 scripts/download_model_binary.py diff --git a/.gitignore b/.gitignore index 2ac7a0096eb..fa279f9071b 100644 --- a/.gitignore +++ b/.gitignore @@ -51,8 +51,8 @@ Makefile.config # 1. reference, and not casually committed # 2. custom, and live on their own unless they're deliberated contributed data/* -*model -*_iter_* +models/* +*.caffemodel *.solverstate *.binaryproto *leveldb diff --git a/docs/getting_pretrained_models.md b/docs/getting_pretrained_models.md index 5df2bd4dc2d..70d8f7bde68 100644 --- a/docs/getting_pretrained_models.md +++ b/docs/getting_pretrained_models.md @@ -5,30 +5,12 @@ layout: default # Pre-trained models [BVLC](http://bvlc.eecs.berkeley.edu) aims to provide a variety of high quality pre-trained models. -Note that unlike Caffe itself, these models are licensed for **academic research / non-commercial use only**. -If you have any questions, please get in touch with us. +Note that unlike Caffe itself, these models usually have licenses **academic research / non-commercial use only**. -*UPDATE* July 2014: we are actively working on a service for hosting user-uploaded model definition and trained weight files. -Soon, the community will be able to easily contribute different architectures! +## TODO -### ImageNet +Write something about the model zoo. -**Caffe Reference ImageNet Model**: Our reference implementation of an ImageNet model trained on ILSVRC-2012 can be downloaded (232.6MB) by running `examples/imagenet/get_caffe_reference_imagenet_model.sh` from the Caffe root directory. - -- The bundled model is the iteration 310,000 snapshot. -- The best validation performance during training was iteration 313,000 with - validation accuracy 57.412% and loss 1.82328. -- This model obtains a top-1 accuracy 57.4% and a top-5 accuracy 80.4% on the validation set, using just the center crop. (Using the average of 10 crops, (4 + 1 center) * 2 mirror, should obtain a bit higher accuracy) - -**AlexNet**: Our training of the Krizhevsky architecture, which differs from the paper's methodology by (1) not training with the relighting data-augmentation and (2) initializing non-zero biases to 0.1 instead of 1. (2) was found necessary for training, as initialization to 1 gave flat loss. Download the model (243.9MB) by running `examples/imagenet/get_caffe_alexnet_model.sh` from the Caffe root directory. - -- The bundled model is the iteration 360,000 snapshot. -- The best validation performance during training was iteration 358,000 with - validation accuracy 57.258% and loss 1.83948. -- This model obtains a top-1 accuracy 57.1% and a top-5 accuracy 80.2% on the validation set, using just the center crop. (Using the average of 10 crops, (4 + 1 center) * 2 mirror, should obtain a bit higher accuracy) - -**R-CNN (ILSVRC13)**: The pure Caffe instantiation of the [R-CNN](https://github.com/rbgirshick/rcnn) model for ILSVRC13 detection. Download the model (230.8MB) by running `examples/imagenet/get_caffe_rcnn_imagenet_model.sh` from the Caffe root directory. This model was made by transplanting the R-CNN SVM classifiers into a `fc-rcnn` classification layer, provided here as an off-the-shelf Caffe detector. Try the [detection example](http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/detection.ipynb) to see it in action. For the full details, refer to the R-CNN site. *N.B. For research purposes, make use of the official R-CNN package and not this example.* - -### Auxiliary Data +## Auxiliary Data Additionally, you will probably eventually need some auxiliary data (mean image, synset list, etc.): run `data/ilsvrc12/get_ilsvrc_aux.sh` from the root directory to obtain it. diff --git a/docs/model_zoo.md b/docs/model_zoo.md new file mode 100644 index 00000000000..b4cbeb1d467 --- /dev/null +++ b/docs/model_zoo.md @@ -0,0 +1,31 @@ +# Caffe Model Zoo + +A caffe model is distributed as a directory containing: +- solver/model prototxt(s) +- model binary file, with .caffemodel extension +- readme.md, containing: + - YAML header: + - model file URL or (torrent magnet link) and MD5 hash + - Caffe commit hash use to train this model + - [optional] github gist id + - license type or text + - main body: free-form description/details +- helpful scripts + +It is up to the user where to host the model file. +Dropbox or their own server are both fine. + +We provide scripts: + +- publish_model_as_gist.sh: uploads non-binary files in the model directory as a Github Gist and returns the id. If gist id is already part of the readme, then updates existing gist. +- download_model_from_gist.sh <gist_id>: downloads the non-binary files from a Gist. +- download_model_binary.py: downloads the .caffemodel from the URL specified in readme. + +The Gist is a good format for distribution because it can contain multiple files, is versionable, and has in-browser syntax highlighting and markdown rendering. + +The existing models distributed with Caffe can stay bundled with Caffe, so I am re-working them all into this format. +All relevant examples will be updated to start with `cd models/model_of_interest && ../scripts/download_model_binary.sh`. + +## Tasks + +- get the imagenet example to work with the new prototxt location diff --git a/examples/imagenet/get_caffe_alexnet_model.sh b/examples/imagenet/get_caffe_alexnet_model.sh deleted file mode 100755 index 7312ed93070..00000000000 --- a/examples/imagenet/get_caffe_alexnet_model.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env sh -# This scripts downloads the caffe reference imagenet model -# for ilsvrc image classification and deep feature extraction - -MODEL=caffe_alexnet_model -CHECKSUM=29eb495b11613825c1900382f5286963 - -if [ -f $MODEL ]; then - echo "Model already exists. Checking md5..." - os=`uname -s` - if [ "$os" = "Linux" ]; then - checksum=`md5sum $MODEL | awk '{ print $1 }'` - elif [ "$os" = "Darwin" ]; then - checksum=`cat $MODEL | md5` - fi - if [ "$checksum" = "$CHECKSUM" ]; then - echo "Model checksum is correct. No need to download." - exit 0 - else - echo "Model checksum is incorrect. Need to download again." - fi -fi - -echo "Downloading..." - -wget http://dl.caffe.berkeleyvision.org/$MODEL examples/imagenet/$MODEL - -echo "Done. Please run this command again to verify that checksum = $CHECKSUM." diff --git a/examples/imagenet/get_caffe_rcnn_imagenet_model.sh b/examples/imagenet/get_caffe_rcnn_imagenet_model.sh deleted file mode 100755 index 9a8d0a155a0..00000000000 --- a/examples/imagenet/get_caffe_rcnn_imagenet_model.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env sh -# This scripts downloads the Caffe R-CNN ImageNet -# for ILSVRC13 detection. - -MODEL=caffe_rcnn_imagenet_model -CHECKSUM=42c1556d2d47a9128c4a90e0a9c5341c - -if [ -f $MODEL ]; then - echo "Model already exists. Checking md5..." - os=`uname -s` - if [ "$os" = "Linux" ]; then - checksum=`md5sum $MODEL | awk '{ print $1 }'` - elif [ "$os" = "Darwin" ]; then - checksum=`cat $MODEL | md5` - fi - if [ "$checksum" = "$CHECKSUM" ]; then - echo "Model checksum is correct. No need to download." - exit 0 - else - echo "Model checksum is incorrect. Need to download again." - fi -fi - -echo "Downloading..." - -wget http://dl.caffe.berkeleyvision.org/$MODEL examples/imagenet/$MODEL - -echo "Done. Please run this command again to verify that checksum = $CHECKSUM." diff --git a/examples/imagenet/get_caffe_reference_imagenet_model.sh b/examples/imagenet/get_caffe_reference_imagenet_model.sh deleted file mode 100755 index f687ebfa79e..00000000000 --- a/examples/imagenet/get_caffe_reference_imagenet_model.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env sh -# This scripts downloads the caffe reference imagenet model -# for ilsvrc image classification and deep feature extraction - -MODEL=caffe_reference_imagenet_model -CHECKSUM=af678f0bd3cdd2437e35679d88665170 - -if [ -f $MODEL ]; then - echo "Model already exists. Checking md5..." - os=`uname -s` - if [ "$os" = "Linux" ]; then - checksum=`md5sum $MODEL | awk '{ print $1 }'` - elif [ "$os" = "Darwin" ]; then - checksum=`cat $MODEL | md5` - fi - if [ "$checksum" = "$CHECKSUM" ]; then - echo "Model checksum is correct. No need to download." - exit 0 - else - echo "Model checksum is incorrect. Need to download again." - fi -fi - -echo "Downloading..." - -wget http://dl.caffe.berkeleyvision.org/$MODEL examples/imagenet/$MODEL - -echo "Done. Please run this command again to verify that checksum = $CHECKSUM." diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index b4a3110ecb6..6b18407dd44 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -6,18 +6,16 @@ include_in_docs: true priority: 1 --- -Yangqing's Recipe on Brewing ImageNet -===================================== +Brewing ImageNet +================ - "All your braincells are belong to us." - - Caffeine - -We are going to describe a reference implementation for the approach first proposed by Krizhevsky, Sutskever, and Hinton in their [NIPS 2012 paper](http://books.nips.cc/papers/files/nips25/NIPS2012_0534.pdf). Since training the whole model takes some time and energy, we provide a model, trained in the same way as we describe here, to help fight global warming. If you would like to simply use the pretrained model, check out the [Pretrained ImageNet](../../getting_pretrained_models.html) page. *Note that the pretrained model is for academic research / non-commercial use only*. +We are going to describe a reference implementation for the approach first proposed by Krizhevsky, Sutskever, and Hinton in their [NIPS 2012 paper](http://books.nips.cc/papers/files/nips25/NIPS2012_0534.pdf). +Since training the whole model takes some time and energy, we provide a model, trained in the same way as we describe here, to help fight global warming. +If you would like to simply use the pretrained model, check out the [Pretrained ImageNet](../../getting_pretrained_models.html) page. +*Note that the pretrained model is for academic research / non-commercial use only*. To clarify, by ImageNet we actually mean the ILSVRC12 challenge, but you can easily train on the whole of ImageNet as well, just with more disk space, and a little longer training time. -(If you don't get the quote, visit [Yann LeCun's fun page](http://yann.lecun.com/ex/fun/). - Data Preparation ---------------- @@ -100,11 +98,13 @@ We all experience times when the power goes out, or we feel like rewarding ourse ./resume_training.sh -where in the script `caffe_imagenet_train_1000.solverstate` is the solver state snapshot that stores all necessary information to recover the exact solver state (including the parameters, momentum history, etc). +where in the script `imagenet_train_1000.solverstate` is the solver state snapshot that stores all necessary information to recover the exact solver state (including the parameters, momentum history, etc). Parting Words ------------- -Hope you liked this recipe! Many researchers have gone further since the ILSVRC 2012 challenge, changing the network architecture and/or finetuning the various parameters in the network. The recent ILSVRC 2013 challenge suggests that there are quite some room for improvement. **Caffe allows one to explore different network choices more easily, by simply writing different prototxt files** - isn't that exciting? +Hope you liked this recipe! +Many researchers have gone further since the ILSVRC 2012 challenge, changing the network architecture and/or finetuning the various parameters in the network. +**Caffe allows one to explore different network choices more easily, by simply writing different prototxt files** - isn't that exciting? -And since now you have a trained network, check out how to use it: [Running Pretrained ImageNet](../../getting_pretrained_models.html). This time we will use Python, but if you have wrappers for other languages, please kindly send a pull request! +And since now you have a trained network, check out how to use it with the Python interface: [Running Pretrained ImageNet](../../getting_pretrained_models.html). diff --git a/examples/imagenet/alexnet_deploy.prototxt b/models/bvlc_alexnet/alexnet_deploy.prototxt similarity index 100% rename from examples/imagenet/alexnet_deploy.prototxt rename to models/bvlc_alexnet/alexnet_deploy.prototxt diff --git a/examples/imagenet/alexnet_solver.prototxt b/models/bvlc_alexnet/alexnet_solver.prototxt similarity index 63% rename from examples/imagenet/alexnet_solver.prototxt rename to models/bvlc_alexnet/alexnet_solver.prototxt index 94bda7f36a5..0d61fed4692 100644 --- a/examples/imagenet/alexnet_solver.prototxt +++ b/models/bvlc_alexnet/alexnet_solver.prototxt @@ -1,4 +1,4 @@ -net: "examples/imagenet/alexnet_train_val.prototxt" +net: "models/bvlc_alexnet/alexnet_train_val.prototxt" test_iter: 1000 test_interval: 1000 base_lr: 0.01 @@ -10,5 +10,5 @@ max_iter: 450000 momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 -snapshot_prefix: "examples/imagenet/caffe_alexnet" +snapshot_prefix: "models/bvlc_alexnet/caffe_alexnet_train" solver_mode: GPU diff --git a/examples/imagenet/alexnet_train_val.prototxt b/models/bvlc_alexnet/alexnet_train_val.prototxt similarity index 100% rename from examples/imagenet/alexnet_train_val.prototxt rename to models/bvlc_alexnet/alexnet_train_val.prototxt index 3fa46773403..69b8916d769 100644 --- a/examples/imagenet/alexnet_train_val.prototxt +++ b/models/bvlc_alexnet/alexnet_train_val.prototxt @@ -34,6 +34,8 @@ layers { layers { name: "conv1" type: CONVOLUTION + bottom: "data" + top: "conv1" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 @@ -51,8 +53,6 @@ layers { value: 0 } } - bottom: "data" - top: "conv1" } layers { name: "relu1" @@ -63,28 +63,30 @@ layers { layers { name: "norm1" type: LRN + bottom: "conv1" + top: "norm1" lrn_param { local_size: 5 alpha: 0.0001 beta: 0.75 } - bottom: "conv1" - top: "norm1" } layers { name: "pool1" type: POOLING + bottom: "norm1" + top: "pool1" pooling_param { pool: MAX kernel_size: 3 stride: 2 } - bottom: "norm1" - top: "pool1" } layers { name: "conv2" type: CONVOLUTION + bottom: "pool1" + top: "conv2" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 @@ -103,8 +105,6 @@ layers { value: 0.1 } } - bottom: "pool1" - top: "conv2" } layers { name: "relu2" @@ -115,28 +115,30 @@ layers { layers { name: "norm2" type: LRN + bottom: "conv2" + top: "norm2" lrn_param { local_size: 5 alpha: 0.0001 beta: 0.75 } - bottom: "conv2" - top: "norm2" } layers { name: "pool2" type: POOLING + bottom: "norm2" + top: "pool2" pooling_param { pool: MAX kernel_size: 3 stride: 2 } - bottom: "norm2" - top: "pool2" } layers { name: "conv3" type: CONVOLUTION + bottom: "pool2" + top: "conv3" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 @@ -154,8 +156,6 @@ layers { value: 0 } } - bottom: "pool2" - top: "conv3" } layers { name: "relu3" @@ -166,6 +166,8 @@ layers { layers { name: "conv4" type: CONVOLUTION + bottom: "conv3" + top: "conv4" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 @@ -184,8 +186,6 @@ layers { value: 0.1 } } - bottom: "conv3" - top: "conv4" } layers { name: "relu4" @@ -196,6 +196,8 @@ layers { layers { name: "conv5" type: CONVOLUTION + bottom: "conv4" + top: "conv5" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 @@ -214,8 +216,6 @@ layers { value: 0.1 } } - bottom: "conv4" - top: "conv5" } layers { name: "relu5" @@ -226,17 +226,19 @@ layers { layers { name: "pool5" type: POOLING + bottom: "conv5" + top: "pool5" pooling_param { pool: MAX kernel_size: 3 stride: 2 } - bottom: "conv5" - top: "pool5" } layers { name: "fc6" type: INNER_PRODUCT + bottom: "pool5" + top: "fc6" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 @@ -252,8 +254,6 @@ layers { value: 0.1 } } - bottom: "pool5" - top: "fc6" } layers { name: "relu6" @@ -264,15 +264,17 @@ layers { layers { name: "drop6" type: DROPOUT + bottom: "fc6" + top: "fc6" dropout_param { dropout_ratio: 0.5 } - bottom: "fc6" - top: "fc6" } layers { name: "fc7" type: INNER_PRODUCT + bottom: "fc6" + top: "fc7" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 @@ -288,8 +290,6 @@ layers { value: 0.1 } } - bottom: "fc6" - top: "fc7" } layers { name: "relu7" @@ -300,15 +300,17 @@ layers { layers { name: "drop7" type: DROPOUT + bottom: "fc7" + top: "fc7" dropout_param { dropout_ratio: 0.5 } - bottom: "fc7" - top: "fc7" } layers { name: "fc8" type: INNER_PRODUCT + bottom: "fc7" + top: "fc8" blobs_lr: 1 blobs_lr: 2 weight_decay: 1 @@ -324,8 +326,6 @@ layers { value: 0 } } - bottom: "fc7" - top: "fc8" } layers { name: "accuracy" diff --git a/models/bvlc_alexnet/readme.md b/models/bvlc_alexnet/readme.md new file mode 100644 index 00000000000..20c393ff26b --- /dev/null +++ b/models/bvlc_alexnet/readme.md @@ -0,0 +1,25 @@ +--- +name: BVLC AlexNet Model +caffemodel: bvlc_alexnet.caffemodel +caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel +license: non-commercial +sha1: 9116a64c0fbe4459d18f4bb6b56d647b63920377 +caffe_commit: 709dc15af4a06bebda027c1eb2b3f3e3375d5077 +--- + +This model is a replication of the model described in the [AlexNet](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks) publication. + +Differences: +- not training with the relighting data-augmentation; +- initializing non-zero biases to 0.1 instead of 1 (found necessary for training, as initialization to 1 gave flat loss). + +The bundled model is the iteration 360,000 snapshot. +The best validation performance during training was iteration 358,000 with validation accuracy 57.258% and loss 1.83948. +This model obtains a top-1 accuracy 57.1% and a top-5 accuracy 80.2% on the validation set, using just the center crop. +(Using the average of 10 crops, (4 + 1 center) * 2 mirror, should obtain a bit higher accuracy.) + +## License + +The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: +"Researcher shall use the Database only for non-commercial research and educational purposes." +Accordingly, this model is distributed under a non-commercial license. diff --git a/examples/imagenet/imagenet_deploy.prototxt b/models/bvlc_reference_caffenet/caffenet_deploy.prototxt similarity index 100% rename from examples/imagenet/imagenet_deploy.prototxt rename to models/bvlc_reference_caffenet/caffenet_deploy.prototxt diff --git a/examples/imagenet/imagenet_solver.prototxt b/models/bvlc_reference_caffenet/caffenet_solver.prototxt similarity index 59% rename from examples/imagenet/imagenet_solver.prototxt rename to models/bvlc_reference_caffenet/caffenet_solver.prototxt index 5b5be4bb8a9..d52e11a56f9 100644 --- a/examples/imagenet/imagenet_solver.prototxt +++ b/models/bvlc_reference_caffenet/caffenet_solver.prototxt @@ -1,4 +1,4 @@ -net: "examples/imagenet/imagenet_train_val.prototxt" +net: "models/bvlc_reference_caffenet/caffenet_train_val.prototxt" test_iter: 1000 test_interval: 1000 base_lr: 0.01 @@ -10,5 +10,5 @@ max_iter: 450000 momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 -snapshot_prefix: "examples/imagenet/caffe_imagenet" +snapshot_prefix: "models/bvlc_reference_caffenet/caffenet_train" solver_mode: GPU diff --git a/examples/imagenet/imagenet_train_val.prototxt b/models/bvlc_reference_caffenet/caffenet_train_val.prototxt similarity index 100% rename from examples/imagenet/imagenet_train_val.prototxt rename to models/bvlc_reference_caffenet/caffenet_train_val.prototxt diff --git a/models/bvlc_reference_caffenet/readme.md b/models/bvlc_reference_caffenet/readme.md new file mode 100644 index 00000000000..1fbdbe12c3f --- /dev/null +++ b/models/bvlc_reference_caffenet/readme.md @@ -0,0 +1,26 @@ +--- +name: BVLC CaffeNet Model +caffemodel: bvlc_reference_caffenet.caffemodel +caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel +license: non-commercial +sha1: 4c8d77deb20ea792f84eb5e6d0a11ca0a8660a46 +caffe_commit: 709dc15af4a06bebda027c1eb2b3f3e3375d5077 +--- + +This model is the result of following the Caffe [instructions](http://caffe.berkeleyvision.org/gathered/examples/imagenet.html) on training an ImageNet model. +This model is a replication of the model described in the [AlexNet](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks) publication with some differences: + +- not training with the relighting data-augmentation; +- the order of pooling and normalization layers is switched (in CaffeNet, pooling is done before normalization). + + +This model is snapshot of iteration 310,000. +The best validation performance during training was iteration 313,000 with validation accuracy 57.412% and loss 1.82328. +This model obtains a top-1 accuracy 57.4% and a top-5 accuracy 80.4% on the validation set, using just the center crop. +(Using the average of 10 crops, (4 + 1 center) * 2 mirror, should obtain a bit higher accuracy still.) + +## License + +The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: +"Researcher shall use the Database only for non-commercial research and educational purposes." +Accordingly, this model is distributed under a non-commercial license. diff --git a/examples/imagenet/rcnn_imagenet_deploy.prototxt b/models/bvlc_reference_rcnn_ilsvrc13/rcnn_imagenet_deploy.prototxt similarity index 100% rename from examples/imagenet/rcnn_imagenet_deploy.prototxt rename to models/bvlc_reference_rcnn_ilsvrc13/rcnn_imagenet_deploy.prototxt diff --git a/models/bvlc_reference_rcnn_ilsvrc13/readme.md b/models/bvlc_reference_rcnn_ilsvrc13/readme.md new file mode 100644 index 00000000000..fb8f26d15df --- /dev/null +++ b/models/bvlc_reference_rcnn_ilsvrc13/readme.md @@ -0,0 +1,20 @@ +--- +name: BVLC Reference RCNN ILSVRC13 Model +caffemodel: bvlc_reference_rcnn_ilsvrc13.caffemodel +caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_reference_rcnn_ilsvrc13.caffemodel +license: non-commercial +sha1: bdd8abb885819cba5e2fe1eb36235f2319477e64 +caffe_commit: a7e397abbda52c0b90323c23ab95bdeabee90a98 +--- + +The pure Caffe instantiation of the [R-CNN](https://github.com/rbgirshick/rcnn) model for ILSVRC13 detection. +This model was made by transplanting the R-CNN SVM classifiers into a `fc-rcnn` classification layer, provided here as an off-the-shelf Caffe detector. +Try the [detection example](http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/detection.ipynb) to see it in action. + +*N.B. For research purposes, make use of the official R-CNN package and not this example.* + +## License + +The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: +"Researcher shall use the Database only for non-commercial research and educational purposes." +Accordingly, this model is distributed under a non-commercial license. diff --git a/scripts/download_model_binary.py b/scripts/download_model_binary.py new file mode 100755 index 00000000000..48e9015fd26 --- /dev/null +++ b/scripts/download_model_binary.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python +import os +import sys +import time +import yaml +import urllib +import hashlib +import argparse + +required_keys = ['caffemodel', 'caffemodel_url', 'sha1'] + + +def reporthook(count, block_size, total_size): + """ + From http://blog.moleculea.com/2012/10/04/urlretrieve-progres-indicator/ + """ + global start_time + if count == 0: + start_time = time.time() + return + duration = time.time() - start_time + progress_size = int(count * block_size) + speed = int(progress_size / (1024 * duration)) + percent = int(count * block_size * 100 / total_size) + sys.stdout.write("\r...%d%%, %d MB, %d KB/s, %d seconds passed" % + (percent, progress_size / (1024 * 1024), speed, duration)) + sys.stdout.flush() + + +def parse_readme_frontmatter(dirname): + readme_filename = os.path.join(dirname, 'readme.md') + with open(readme_filename) as f: + lines = [line.strip() for line in f.readlines()] + top = lines.index('---') + bottom = lines[top + 1:].index('---') + frontmatter = yaml.load('\n'.join(lines[top + 1:bottom])) + assert all(key in frontmatter for key in required_keys) + return dirname, frontmatter + + +def valid_dirname(dirname): + try: + return parse_readme_frontmatter(dirname) + except Exception as e: + print('ERROR: {}'.format(e)) + raise argparse.ArgumentTypeError( + 'Must be valid Caffe model directory with a correct readme.md') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='Download trained model binary.') + parser.add_argument('dirname', type=valid_dirname) + args = parser.parse_args() + + # A tiny hack: the dirname validator also returns readme YAML frontmatter. + dirname = args.dirname[0] + frontmatter = args.dirname[1] + model_filename = os.path.join(dirname, frontmatter['caffemodel']) + + # Closure-d function for checking SHA1. + def model_checks_out(filename=model_filename, sha1=frontmatter['sha1']): + with open(filename, 'r') as f: + return hashlib.sha1(f.read()).hexdigest() == sha1 + + # Check if model exists. + if os.path.exists(model_filename) and model_checks_out(): + print("Model already exists.") + sys.exit(0) + + # Download and verify model. + urllib.urlretrieve( + frontmatter['caffemodel_url'], model_filename, reporthook) + if not model_checks_out(): + print('ERROR: model did not download correctly! Run this again.') + sys.exit(1) From bcc12ef597f5eec04c582fe16e65dbb12a3b84f8 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 28 Aug 2014 15:47:05 -0700 Subject: [PATCH 0664/2053] snapshot model with caffemodel extension --- src/caffe/solver.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index dcac4c1537c..d8517c64f85 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -316,6 +316,7 @@ void Solver<Dtype>::Snapshot() { char iter_str_buffer[kBufferSize]; snprintf(iter_str_buffer, kBufferSize, "_iter_%d", iter_); filename += iter_str_buffer; + filename += ".caffemodel"; LOG(INFO) << "Snapshotting to " << filename; WriteProtoToBinaryFile(net_param, filename.c_str()); SolverState state; From 39f7a4d327d6ca044114db600c2de1324fb43c1e Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 28 Aug 2014 16:28:51 -0700 Subject: [PATCH 0665/2053] proofread model zoo --- examples/imagenet/readme.md | 6 +++--- models/bvlc_reference_caffenet/readme.md | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index 6b18407dd44..1cd467803a8 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -104,7 +104,7 @@ Parting Words ------------- Hope you liked this recipe! -Many researchers have gone further since the ILSVRC 2012 challenge, changing the network architecture and/or finetuning the various parameters in the network. -**Caffe allows one to explore different network choices more easily, by simply writing different prototxt files** - isn't that exciting? +Many researchers have gone further since the ILSVRC 2012 challenge, changing the network architecture and/or fine-tuning the various parameters in the network to address new data and tasks. +**Caffe lets you explore different network choices more easily by simply writing different prototxt files** - isn't that exciting? -And since now you have a trained network, check out how to use it with the Python interface: [Running Pretrained ImageNet](../../getting_pretrained_models.html). +And since now you have a trained network, check out how to use it with the Python interface for [classifying ImageNet](http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/classification.ipynb). diff --git a/models/bvlc_reference_caffenet/readme.md b/models/bvlc_reference_caffenet/readme.md index 1fbdbe12c3f..d1c6269ae73 100644 --- a/models/bvlc_reference_caffenet/readme.md +++ b/models/bvlc_reference_caffenet/readme.md @@ -7,13 +7,12 @@ sha1: 4c8d77deb20ea792f84eb5e6d0a11ca0a8660a46 caffe_commit: 709dc15af4a06bebda027c1eb2b3f3e3375d5077 --- -This model is the result of following the Caffe [instructions](http://caffe.berkeleyvision.org/gathered/examples/imagenet.html) on training an ImageNet model. -This model is a replication of the model described in the [AlexNet](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks) publication with some differences: +This model is the result of following the Caffe [ImageNet model training instructions](http://caffe.berkeleyvision.org/gathered/examples/imagenet.html). +It is a replication of the model described in the [AlexNet](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks) publication with some differences: - not training with the relighting data-augmentation; - the order of pooling and normalization layers is switched (in CaffeNet, pooling is done before normalization). - This model is snapshot of iteration 310,000. The best validation performance during training was iteration 313,000 with validation accuracy 57.412% and loss 1.82328. This model obtains a top-1 accuracy 57.4% and a top-5 accuracy 80.4% on the validation set, using just the center crop. From 84917d6ccae60fc4063a5d1bb68b86e658e80545 Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Wed, 3 Sep 2014 15:42:46 +0100 Subject: [PATCH 0666/2053] removing unneeded scripts from imagenet example --- examples/imagenet/readme.md | 10 +++++++--- examples/imagenet/resume_training.sh | 7 ------- examples/imagenet/time_imagenet.sh | 17 ----------------- examples/imagenet/train_alexnet.sh | 5 ----- examples/imagenet/train_imagenet.sh | 5 ----- 5 files changed, 7 insertions(+), 37 deletions(-) delete mode 100755 examples/imagenet/resume_training.sh delete mode 100755 examples/imagenet/time_imagenet.sh delete mode 100755 examples/imagenet/train_alexnet.sh delete mode 100755 examples/imagenet/train_imagenet.sh diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index 1cd467803a8..8ce3644942a 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -87,16 +87,20 @@ Training ImageNet Ready? Let's train. - ./train_imagenet.sh + ./build/tools/caffe train --solver=examples/imagenet/imagenet_solver.prototxt -Sit back and enjoy! On my K20 machine, every 20 iterations take about 36 seconds to run, so effectively about 7 ms per image for the full forward-backward pass. About 2.5 ms of this is on forward, and the rest is backward. If you are interested in dissecting the computation time, you can look at `examples/net_speed_benchmark.cpp`, but it was written purely for debugging purpose, so you may need to figure a few things out yourself. +Sit back and enjoy! + +On my K20 machine, every 20 iterations take about 36 seconds to run, so effectively about 7 ms per image for the full forward-backward pass. About 2.5 ms of this is on forward, and the rest is backward. If you are interested in dissecting the computation time, you can run + + ./build/tools/caffe time --model=models/bvlc_reference_caffenet/train_val.prototxt Resume Training? ---------------- We all experience times when the power goes out, or we feel like rewarding ourself a little by playing Battlefield (does someone still remember Quake?). Since we are snapshotting intermediate results during training, we will be able to resume from snapshots. This can be done as easy as: - ./resume_training.sh + ./build/tools/caffe train --solver=examples/imagenet/imagenet_solver.prototxt --snapshot=examples/imagenet/caffe_imagenet_10000.solverstate where in the script `imagenet_train_1000.solverstate` is the solver state snapshot that stores all necessary information to recover the exact solver state (including the parameters, momentum history, etc). diff --git a/examples/imagenet/resume_training.sh b/examples/imagenet/resume_training.sh deleted file mode 100755 index 3c964b56ffc..00000000000 --- a/examples/imagenet/resume_training.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env sh - -./build/tools/caffe train \ - --solver=examples/imagenet/imagenet_solver.prototxt \ - --snapshot=examples/imagenet/caffe_imagenet_10000.solverstate - -echo "Done." diff --git a/examples/imagenet/time_imagenet.sh b/examples/imagenet/time_imagenet.sh deleted file mode 100755 index 3f46e0e0f97..00000000000 --- a/examples/imagenet/time_imagenet.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env sh - -if [ -z "$1" ]; then - echo "Using CPU! To time GPU mode, use:" - echo " ./time_imagenet.sh <device ID>" - echo "(Try ./time_imagenet.sh 0 if you have just one GPU.)" - sleep 3 # Let the user read - GPU="" -else - GPU="--gpu=$1" -fi - -./build/tools/caffe time \ - --model=examples/imagenet/imagenet_train_val.prototxt \ - ${GPU} - -echo "Done." diff --git a/examples/imagenet/train_alexnet.sh b/examples/imagenet/train_alexnet.sh deleted file mode 100755 index 1ddcbeee4b0..00000000000 --- a/examples/imagenet/train_alexnet.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env sh - -./build/tools/caffe train --solver=examples/imagenet/alexnet_solver.prototxt - -echo "Done." diff --git a/examples/imagenet/train_imagenet.sh b/examples/imagenet/train_imagenet.sh deleted file mode 100755 index cba2ad59581..00000000000 --- a/examples/imagenet/train_imagenet.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env sh - -./build/tools/caffe train --solver=examples/imagenet/imagenet_solver.prototxt - -echo "Done." From a66100181be17f843bac411cf52ff24aeace6306 Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Thu, 4 Sep 2014 01:24:57 +0100 Subject: [PATCH 0667/2053] Renaming CaffeNet model prototxts and unignoring models/* --- .gitignore | 1 - .../bvlc_alexnet/{alexnet_deploy.prototxt => deploy.prototxt} | 0 .../bvlc_alexnet/{alexnet_solver.prototxt => solver.prototxt} | 2 +- .../{alexnet_train_val.prototxt => train_val.prototxt} | 0 .../{caffenet_deploy.prototxt => deploy.prototxt} | 0 .../{caffenet_solver.prototxt => solver.prototxt} | 2 +- .../{caffenet_train_val.prototxt => train_val.prototxt} | 0 .../{rcnn_imagenet_deploy.prototxt => deploy.prototxt} | 0 8 files changed, 2 insertions(+), 3 deletions(-) rename models/bvlc_alexnet/{alexnet_deploy.prototxt => deploy.prototxt} (100%) rename models/bvlc_alexnet/{alexnet_solver.prototxt => solver.prototxt} (82%) rename models/bvlc_alexnet/{alexnet_train_val.prototxt => train_val.prototxt} (100%) rename models/bvlc_reference_caffenet/{caffenet_deploy.prototxt => deploy.prototxt} (100%) rename models/bvlc_reference_caffenet/{caffenet_solver.prototxt => solver.prototxt} (79%) rename models/bvlc_reference_caffenet/{caffenet_train_val.prototxt => train_val.prototxt} (100%) rename models/bvlc_reference_rcnn_ilsvrc13/{rcnn_imagenet_deploy.prototxt => deploy.prototxt} (100%) diff --git a/.gitignore b/.gitignore index fa279f9071b..cf92e5fd4db 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,6 @@ Makefile.config # 1. reference, and not casually committed # 2. custom, and live on their own unless they're deliberated contributed data/* -models/* *.caffemodel *.solverstate *.binaryproto diff --git a/models/bvlc_alexnet/alexnet_deploy.prototxt b/models/bvlc_alexnet/deploy.prototxt similarity index 100% rename from models/bvlc_alexnet/alexnet_deploy.prototxt rename to models/bvlc_alexnet/deploy.prototxt diff --git a/models/bvlc_alexnet/alexnet_solver.prototxt b/models/bvlc_alexnet/solver.prototxt similarity index 82% rename from models/bvlc_alexnet/alexnet_solver.prototxt rename to models/bvlc_alexnet/solver.prototxt index 0d61fed4692..129265e679b 100644 --- a/models/bvlc_alexnet/alexnet_solver.prototxt +++ b/models/bvlc_alexnet/solver.prototxt @@ -1,4 +1,4 @@ -net: "models/bvlc_alexnet/alexnet_train_val.prototxt" +net: "models/bvlc_alexnet/train_val.prototxt" test_iter: 1000 test_interval: 1000 base_lr: 0.01 diff --git a/models/bvlc_alexnet/alexnet_train_val.prototxt b/models/bvlc_alexnet/train_val.prototxt similarity index 100% rename from models/bvlc_alexnet/alexnet_train_val.prototxt rename to models/bvlc_alexnet/train_val.prototxt diff --git a/models/bvlc_reference_caffenet/caffenet_deploy.prototxt b/models/bvlc_reference_caffenet/deploy.prototxt similarity index 100% rename from models/bvlc_reference_caffenet/caffenet_deploy.prototxt rename to models/bvlc_reference_caffenet/deploy.prototxt diff --git a/models/bvlc_reference_caffenet/caffenet_solver.prototxt b/models/bvlc_reference_caffenet/solver.prototxt similarity index 79% rename from models/bvlc_reference_caffenet/caffenet_solver.prototxt rename to models/bvlc_reference_caffenet/solver.prototxt index d52e11a56f9..af1315ba2ac 100644 --- a/models/bvlc_reference_caffenet/caffenet_solver.prototxt +++ b/models/bvlc_reference_caffenet/solver.prototxt @@ -1,4 +1,4 @@ -net: "models/bvlc_reference_caffenet/caffenet_train_val.prototxt" +net: "models/bvlc_reference_caffenet/train_val.prototxt" test_iter: 1000 test_interval: 1000 base_lr: 0.01 diff --git a/models/bvlc_reference_caffenet/caffenet_train_val.prototxt b/models/bvlc_reference_caffenet/train_val.prototxt similarity index 100% rename from models/bvlc_reference_caffenet/caffenet_train_val.prototxt rename to models/bvlc_reference_caffenet/train_val.prototxt diff --git a/models/bvlc_reference_rcnn_ilsvrc13/rcnn_imagenet_deploy.prototxt b/models/bvlc_reference_rcnn_ilsvrc13/deploy.prototxt similarity index 100% rename from models/bvlc_reference_rcnn_ilsvrc13/rcnn_imagenet_deploy.prototxt rename to models/bvlc_reference_rcnn_ilsvrc13/deploy.prototxt From d5e9739e5261de5f30832c06d849da5265bc95c6 Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Thu, 4 Sep 2014 01:13:29 +0100 Subject: [PATCH 0668/2053] updating feature extraction example --- examples/feature_extraction/imagenet_val.prototxt | 4 ++-- examples/feature_extraction/readme.md | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/feature_extraction/imagenet_val.prototxt b/examples/feature_extraction/imagenet_val.prototxt index 32310904a66..83fe8c1a08d 100644 --- a/examples/feature_extraction/imagenet_val.prototxt +++ b/examples/feature_extraction/imagenet_val.prototxt @@ -5,14 +5,14 @@ layers { top: "data" top: "label" image_data_param { - source: "$CAFFE_DIR/examples/_temp/file_list.txt" + source: "examples/_temp/file_list.txt" batch_size: 50 new_height: 256 new_width: 256 } transform_param { crop_size: 227 - mean_file: "$CAFFE_DIR/data/ilsvrc12/imagenet_mean.binaryproto" + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" mirror: false } } diff --git a/examples/feature_extraction/readme.md b/examples/feature_extraction/readme.md index 083908ebe54..c325ed482e5 100644 --- a/examples/feature_extraction/readme.md +++ b/examples/feature_extraction/readme.md @@ -10,7 +10,9 @@ Extracting Features =================== In this tutorial, we will extract features using a pre-trained model with the included C++ utility. -Follow instructions for [installing Caffe](../../installation.html) and for [downloading the reference model](../../getting_pretrained_models.html) for ImageNet. +Note that we recommend using the Python interface for this task, as for example in the [filter visualization example](http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/filter_visualization.ipynb). + +Follow instructions for [installing Caffe](../../installation.html) and run `scripts/download_model_binary.py models/bvlc_reference_caffenet` from caffe root directory. If you need detailed information about the tools below, please consult their source code, in which additional documentation is usually provided. Select data to run on @@ -35,7 +37,7 @@ Define the Feature Extraction Network Architecture In practice, subtracting the mean image from a dataset significantly improves classification accuracies. Download the mean image of the ILSVRC dataset. - data/ilsvrc12/get_ilsvrc_aux.sh + ./data/ilsvrc12/get_ilsvrc_aux.sh We will use `data/ilsvrc212/imagenet_mean.binaryproto` in the network definition prototxt. @@ -44,14 +46,12 @@ We'll be using the `ImageDataLayer`, which will load and resize images for us. cp examples/feature_extraction/imagenet_val.prototxt examples/_temp -Edit `examples/_temp/imagenet_val.prototxt` to use correct path for your setup (replace `$CAFFE_DIR`) - Extract Features ---------------- Now everything necessary is in place. - build/tools/extract_features.bin examples/imagenet/caffe_reference_imagenet_model examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10 + ./build/tools/extract_features.bin models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10 The name of feature blob that you extract is `fc7`, which represents the highest level feature of the reference model. We can use any other layer, as well, such as `conv5` or `pool3`. From da715ea07af8ea42487d333e3441d138320da36a Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Thu, 4 Sep 2014 01:08:19 +0100 Subject: [PATCH 0669/2053] removed mention of getting_pretrained_models page and old paths --- docs/getting_pretrained_models.md | 16 ----- docs/index.md | 4 +- docs/model_zoo.md | 68 +++++++++++++------ examples/classification.ipynb | 9 ++- examples/detection.ipynb | 5 +- examples/filter_visualization.ipynb | 9 ++- examples/finetune_flickr_style/readme.md | 4 +- examples/imagenet/imagenet_full_conv.prototxt | 1 + examples/imagenet/readme.md | 55 +++++++-------- examples/net_surgery.ipynb | 9 ++- examples/web_demo/app.py | 4 +- examples/web_demo/readme.md | 6 +- matlab/caffe/matcaffe_batch.m | 3 +- matlab/caffe/matcaffe_init.m | 4 +- python/classify.py | 4 +- python/detect.py | 4 +- 16 files changed, 104 insertions(+), 101 deletions(-) delete mode 100644 docs/getting_pretrained_models.md diff --git a/docs/getting_pretrained_models.md b/docs/getting_pretrained_models.md deleted file mode 100644 index 70d8f7bde68..00000000000 --- a/docs/getting_pretrained_models.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: default ---- - -# Pre-trained models - -[BVLC](http://bvlc.eecs.berkeley.edu) aims to provide a variety of high quality pre-trained models. -Note that unlike Caffe itself, these models usually have licenses **academic research / non-commercial use only**. - -## TODO - -Write something about the model zoo. - -## Auxiliary Data - -Additionally, you will probably eventually need some auxiliary data (mean image, synset list, etc.): run `data/ilsvrc12/get_ilsvrc_aux.sh` from the root directory to obtain it. diff --git a/docs/index.md b/docs/index.md index 47191ba8646..83ba236bcf1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -38,8 +38,8 @@ Slides about the Caffe architecture, *updated 03/14*. A 4-page report for the ACM Multimedia Open Source competition. - [Installation instructions](/installation.html)<br /> Tested on Ubuntu, Red Hat, OS X. -* [Pre-trained models](/getting_pretrained_models.html)<br /> -BVLC provides ready-to-use models for non-commercial use. +* [Model Zoo](/model_zoo.html)<br /> +BVLC suggests a standard distribution format for Caffe models, and provides trained models for non-commercial use. * [Developing & Contributing](/development.html)<br /> Guidelines for development and contributing to Caffe. * [API Documentation](/doxygen/)<br /> diff --git a/docs/model_zoo.md b/docs/model_zoo.md index b4cbeb1d467..490bb68f808 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -1,31 +1,59 @@ # Caffe Model Zoo +Lots of people have used Caffe to train models of different architectures and applied to different problems, ranging from simple regression to AlexNet-alikes to Siamese networks for image similarity to speech applications. + +To lower the friction of sharing these models, we introduce the model zoo framework: + +- A standard format for packaging Caffe model info. +- Tools to upload/download model info to/from Github Gists, and to download trained `.caffemodel` binaries. +- A central wiki page for sharing model info Gists. + +## Where to get trained models + +First of all, we provide some trained models out of the box. +Each one of these can be downloaded by running `scripts/download_model_binary.py <dirname>` where `<dirname>` is specified below: + +- **BVLC Reference CaffeNet** in `models/bvlc_reference_caffenet`: AlexNet trained on ILSVRC 2012, with a minor variation from the version as described in the NIPS 2012 paper. +- **BVLC AlexNet** in `models/bvlc_alexnet`: AlexNet trained on ILSVRC 2012, almost exactly as described in NIPS 2012. +- **BVLC Reference R-CNN ILSVRC-2013** in `models/bvlc_reference_rcnn_ilsvrc13`: pure Caffe implementation of [R-CNN](https://github.com/rbgirshick/rcnn). + +User-provided models are posted to a public-editable [wiki page](https://github.com/BVLC/caffe/wiki/Model-Zoo). + +## Model info format + A caffe model is distributed as a directory containing: -- solver/model prototxt(s) -- model binary file, with .caffemodel extension -- readme.md, containing: - - YAML header: - - model file URL or (torrent magnet link) and MD5 hash - - Caffe commit hash use to train this model - - [optional] github gist id - - license type or text - - main body: free-form description/details -- helpful scripts -It is up to the user where to host the model file. -Dropbox or their own server are both fine. +- Solver/model prototxt(s) +- Readme.md containing + - YAML frontmatter + - Caffe version used to train this model (tagged release or commit hash). + - [optional] file URL and SHA1 of the trained `.caffemodel`. + - [optional] github gist id. + - Information about what data the model was trained on, explanation of modeling choices, etc. + - License information. +- [optional] Other helpful scripts. + +## Hosting model info + +Github Gist is a good format for model info distribution because it can contain multiple files, is versionable, and has in-browser syntax highlighting and markdown rendering. + +- `scripts/download_model_from_gist.sh <gist_id>`: downloads the non-binary files from a Gist into `<dirname>` +- `scripts/upload_model_to_gist.sh <dirname>`: uploads non-binary files in the model directory as a Github Gist and prints the Gist ID. If `gist_id` is already part of the `<dirname>/readme.md` frontmatter, then updates existing Gist. -We provide scripts: +### Hosting trained models -- publish_model_as_gist.sh: uploads non-binary files in the model directory as a Github Gist and returns the id. If gist id is already part of the readme, then updates existing gist. -- download_model_from_gist.sh <gist_id>: downloads the non-binary files from a Gist. -- download_model_binary.py: downloads the .caffemodel from the URL specified in readme. +It is up to the user where to host the `.caffemodel` file. +We host our BVLC-provided models on our own server. +Dropbox also works fine (tip: make sure that `?dl=1` is appended to the end of the URL). -The Gist is a good format for distribution because it can contain multiple files, is versionable, and has in-browser syntax highlighting and markdown rendering. +- `scripts/download_model_binary.py <dirname>`: downloads the `.caffemodel` from the URL specified in the `<dirname>/readme.md` frontmatter and confirms SHA1. -The existing models distributed with Caffe can stay bundled with Caffe, so I am re-working them all into this format. -All relevant examples will be updated to start with `cd models/model_of_interest && ../scripts/download_model_binary.sh`. ## Tasks -- get the imagenet example to work with the new prototxt location +x get the imagenet example to work with the new prototxt location +x make wiki page for user-submitted models +- add flickr model to the user-submitted models wiki page +x make docs section listing bvlc-distributed models +- write the publish_model_as_gist script +- write the download_model_from_gist script diff --git a/examples/classification.ipynb b/examples/classification.ipynb index 4d4a738a9f3..7c01b9e235e 100644 --- a/examples/classification.ipynb +++ b/examples/classification.ipynb @@ -3,7 +3,6 @@ "description": "Use the pre-trained ImageNet model to classify images with the Python interface.", "example_name": "ImageNet classification", "include_in_docs": true, - "signature": "sha256:4f8d4c079c30d20ef4b6818e9672b1741fd1377354e5b83e291710736cecd24f" }, "nbformat": 3, "nbformat_minor": 0, @@ -19,7 +18,7 @@ "\n", "Caffe provides a general Python interface for models with `caffe.Net` in `python/caffe/pycaffe.py`, but to make off-the-shelf classification easy we provide a `caffe.Classifier` class and `classify.py` script. Both Python and MATLAB wrappers are provided. However, the Python wrapper has more features so we will describe it here. For MATLAB, refer to `matlab/caffe/matcaffe_demo.m`.\n", "\n", - "Before we begin, you must compile Caffe and install the python wrapper by setting your `PYTHONPATH`. If you haven't yet done so, please refer to the [installation instructions](installation.html). This example uses our pre-trained ImageNet model, an ILSVRC12 image classifier. You can download it (232.57MB) by running `examples/imagenet/get_caffe_reference_imagenet_model.sh`. Note that this pre-trained model is licensed for academic research / non-commercial use only.\n", + "Before we begin, you must compile Caffe and install the python wrapper by setting your `PYTHONPATH`. If you haven't yet done so, please refer to the [installation instructions](installation.html). This example uses our pre-trained CaffeNet model, an ILSVRC12 image classifier. You can download it by running `./scripts/download_model_binary.py models/bvlc_reference_caffenet`. Note that this pre-trained model is licensed for academic research / non-commercial use only.\n", "\n", "Ready? Let's start." ] @@ -41,8 +40,8 @@ "\n", "# Set the right path to your model definition file, pretrained model weights,\n", "# and the image you would like to classify.\n", - "MODEL_FILE = 'imagenet/imagenet_deploy.prototxt'\n", - "PRETRAINED = 'imagenet/caffe_reference_imagenet_model'\n", + "MODEL_FILE = '../models/bvlc_reference_caffenet/deploy.prototxt'\n", + "PRETRAINED = '../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'\n", "IMAGE_FILE = 'images/cat.jpg'" ], "language": "python", @@ -404,4 +403,4 @@ "metadata": {} } ] -} \ No newline at end of file +} diff --git a/examples/detection.ipynb b/examples/detection.ipynb index beae000a11b..e1620417af1 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -3,7 +3,6 @@ "description": "Run a pretrained model as a detector in Python.", "example_name": "R-CNN detection", "include_in_docs": true, - "signature": "sha256:8a744fbbb9ed80acab471247eaf50c27dcbd652105404df9feca599939f0c0ee" }, "nbformat": 3, "nbformat_minor": 0, @@ -26,7 +25,7 @@ "\n", "- [Selective Search](http://koen.me/research/selectivesearch/) is the region proposer used by R-CNN. The [selective_search_ijcv_with_python](https://github.com/sergeyk/selective_search_ijcv_with_python) Python module takes care of extracting proposals through the selective search MATLAB implementation. To install it, download the module and name its directory `selective_search_ijcv_with_python`, run the demo in MATLAB to compile the necessary functions, then add it to your `PYTHONPATH` for importing. (If you have your own region proposals prepared, or would rather not bother with this step, [detect.py](https://github.com/BVLC/caffe/blob/master/python/detect.py) accepts a list of images and bounding boxes as CSV.)\n", "\n", - "- Follow the [model instructions](http://caffe.berkeleyvision.org/getting_pretrained_models.html) to get the Caffe R-CNN ImageNet model.\n", + "-Run `./scripts/download_model_binary.py models/bvlc_reference_caffenet` to get the Caffe R-CNN ImageNet model.\n", "\n", "With that done, we'll call the bundled `detect.py` to generate the region proposals and run the network. For an explanation of the arguments, do `./detect.py --help`." ] @@ -37,7 +36,7 @@ "input": [ "!mkdir -p _temp\n", "!echo `pwd`/images/fish-bike.jpg > _temp/det_input.txt\n", - "!../python/detect.py --crop_mode=selective_search --pretrained_model=imagenet/caffe_rcnn_imagenet_model --model_def=imagenet/rcnn_imagenet_deploy.prototxt --gpu --raw_scale=255 _temp/det_input.txt _temp/det_output.h5" + "!../python/detect.py --crop_mode=selective_search --pretrained_model=models/bvlc_reference_rcnn_ilsvrc13/bvlc_reference_rcnn_ilsvrc13.caffemodel --model_def=models/bvlc_reference_rcnn_ilsvrc13/deploy.prototxt --gpu --raw_scale=255 _temp/det_input.txt _temp/det_output.h5" ], "language": "python", "metadata": {}, diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index 5fdcbe25fb4..4d69dc0f64e 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -3,7 +3,6 @@ "description": "Extracting features and visualizing trained filters with an example image, viewed layer-by-layer.", "example_name": "Filter visualization", "include_in_docs": true, - "signature": "sha256:b1b0457e2b10110aca847a718a3fe631ebcfce63a61cbc33653244f52b1ff4af" }, "nbformat": 3, "nbformat_minor": 0, @@ -54,15 +53,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Follow the [instructions](http://caffe.berkeleyvision.org/getting_pretrained_models.html) for getting the pretrained models, load the net, specify test phase and CPU mode, and configure input preprocessing." + "Run `./scripts/download_model_binary.py models/bvlc_reference_caffenet` to get the pretrained CaffeNet model, load the net, specify test phase and CPU mode, and configure input preprocessing." ] }, { "cell_type": "code", "collapsed": false, "input": [ - "net = caffe.Classifier(caffe_root + 'examples/imagenet/imagenet_deploy.prototxt',\n", - " caffe_root + 'examples/imagenet/caffe_reference_imagenet_model')\n", + "net = caffe.Classifier(caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt',\n", + " caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')\n", "net.set_phase_test()\n", "net.set_mode_cpu()\n", "# input preprocessing: 'data' is the name of the input blob == net.inputs[0]\n", @@ -598,4 +597,4 @@ "metadata": {} } ] -} \ No newline at end of file +} diff --git a/examples/finetune_flickr_style/readme.md b/examples/finetune_flickr_style/readme.md index da584f0088a..68b2778cafa 100644 --- a/examples/finetune_flickr_style/readme.md +++ b/examples/finetune_flickr_style/readme.md @@ -60,13 +60,13 @@ We'll also need the ImageNet-trained model, which you can obtain by running `get Now we can train! (You can fine-tune in CPU mode by leaving out the `-gpu` flag.) - caffe % ./build/tools/caffe train -solver examples/finetune_flickr_style/flickr_style_solver.prototxt -weights examples/imagenet/caffe_reference_imagenet_model -gpu 0 + caffe % ./build/tools/caffe train -solver examples/finetune_flickr_style/flickr_style_solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel -gpu 0 [...] I0828 22:10:04.025378 9718 solver.cpp:46] Solver scaffolding done. I0828 22:10:04.025388 9718 caffe.cpp:95] Use GPU with device ID 0 - I0828 22:10:04.192004 9718 caffe.cpp:107] Finetuning from examples/imagenet/caffe_reference_imagenet_model + I0828 22:10:04.192004 9718 caffe.cpp:107] Finetuning from models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel [...] diff --git a/examples/imagenet/imagenet_full_conv.prototxt b/examples/imagenet/imagenet_full_conv.prototxt index 570efae5901..395b0f0162f 100644 --- a/examples/imagenet/imagenet_full_conv.prototxt +++ b/examples/imagenet/imagenet_full_conv.prototxt @@ -1,3 +1,4 @@ +# This file is for the net_surgery.ipynb example notebook. name: "CaffeNetConv" input: "data" input_dim: 1 diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index 8ce3644942a..97a68f306d8 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -1,6 +1,6 @@ --- title: ImageNet tutorial -description: Train and test "CaffeNet" on ImageNet challenge data. +description: Train and test "CaffeNet" on ImageNet data. category: example include_in_docs: true priority: 1 @@ -9,16 +9,16 @@ priority: 1 Brewing ImageNet ================ -We are going to describe a reference implementation for the approach first proposed by Krizhevsky, Sutskever, and Hinton in their [NIPS 2012 paper](http://books.nips.cc/papers/files/nips25/NIPS2012_0534.pdf). -Since training the whole model takes some time and energy, we provide a model, trained in the same way as we describe here, to help fight global warming. -If you would like to simply use the pretrained model, check out the [Pretrained ImageNet](../../getting_pretrained_models.html) page. -*Note that the pretrained model is for academic research / non-commercial use only*. - -To clarify, by ImageNet we actually mean the ILSVRC12 challenge, but you can easily train on the whole of ImageNet as well, just with more disk space, and a little longer training time. +This guide is meant to get you ready to train your own model on your own data. +If you just want an ImageNet-trained network, then note that since training takes a lot of energy and we hate global warming, we provide the CaffeNet model trained as described below in the [model zoo](/model_zoo.html). Data Preparation ---------------- +*The guide specifies all paths and assumes all commands are executed from the root caffe directory.* + +*By "ImageNet" we here mean the ILSVRC12 challenge, but you can easily train on the whole of ImageNet as well, just with more disk space, and a little longer training time.* + We assume that you already have downloaded the ImageNet training data and validation data, and they are stored on your disk like: /path/to/imagenet/train/n01440764/n01440764_10026.JPEG @@ -26,44 +26,39 @@ We assume that you already have downloaded the ImageNet training data and valida You will first need to prepare some auxiliary data for training. This data can be downloaded by: - cd $CAFFE_ROOT/data/ilsvrc12/ - ./get_ilsvrc_aux.sh + ./data/get_ilsvrc_aux.sh The training and validation input are described in `train.txt` and `val.txt` as text listing all the files and their labels. Note that we use a different indexing for labels than the ILSVRC devkit: we sort the synset names in their ASCII order, and then label them from 0 to 999. See `synset_words.txt` for the synset/name mapping. -You may want to resize the images to 256x256 in advance. By default, we do not explicitly do this because in a cluster environment, one may benefit from resizing images in a parallel fashion, using mapreduce. For example, Yangqing used his lightedweighted [mincepie](https://github.com/Yangqing/mincepie) package to do mapreduce on the Berkeley cluster. If you would things to be rather simple and straightforward, you can also use shell commands, something like: +You may want to resize the images to 256x256 in advance. By default, we do not explicitly do this because in a cluster environment, one may benefit from resizing images in a parallel fashion, using mapreduce. For example, Yangqing used his lightweight [mincepie](https://github.com/Yangqing/mincepie) package. If you prefer things to be simpler, you can also use shell commands, something like: for name in /path/to/imagenet/val/*.JPEG; do convert -resize 256x256\! $name $name done -Go to `$CAFFE_ROOT/examples/imagenet/` for the rest of this guide. - -Take a look at `create_imagenet.sh`. Set the paths to the train and val dirs as needed, and set "RESIZE=true" to resize all images to 256x256 if you haven't resized the images in advance. -Now simply create the leveldbs with `./create_imagenet.sh`. Note that `ilsvrc12_train_leveldb` and `ilsvrc12_val_leveldb` should not exist before this execution. It will be created by the script. `GLOG_logtostderr=1` simply dumps more information for you to inspect, and you can safely ignore it. +Take a look at `examples/imagenet/create_imagenet.sh`. Set the paths to the train and val dirs as needed, and set "RESIZE=true" to resize all images to 256x256 if you haven't resized the images in advance. +Now simply create the leveldbs with `examples/imagenet/create_imagenet.sh`. Note that `examples/imagenet/ilsvrc12_train_leveldb` and `examples/imagenet/ilsvrc12_val_leveldb` should not exist before this execution. It will be created by the script. `GLOG_logtostderr=1` simply dumps more information for you to inspect, and you can safely ignore it. Compute Image Mean ------------------ The model requires us to subtract the image mean from each image, so we have to compute the mean. `tools/compute_image_mean.cpp` implements that - it is also a good example to familiarize yourself on how to manipulate the multiple components, such as protocol buffers, leveldbs, and logging, if you are not familiar with them. Anyway, the mean computation can be carried out as: - ./make_imagenet_mean.sh + ./examples/imagenet/make_imagenet_mean.sh which will make `data/ilsvrc12/imagenet_mean.binaryproto`. -Network Definition ------------------- - -The network definition follows strictly the one in Krizhevsky et al. You can find the detailed definition at `examples/imagenet/imagenet_train_val.prototxt`. Note the paths in the data layer --- if you have not followed the exact paths in this guide you will need to change the following lines: +Model Definition +---------------- - source: "ilvsrc12_train_leveldb" - mean_file: "../../data/ilsvrc12/imagenet_mean.binaryproto" +We are going to describe a reference implementation for the approach first proposed by Krizhevsky, Sutskever, and Hinton in their [NIPS 2012 paper](http://books.nips.cc/papers/files/nips25/NIPS2012_0534.pdf). -to point to your own leveldb and image mean. +The network definition (`models/bvlc_reference_caffenet/train_val.prototxt`) follows the one in Krizhevsky et al. +Note that if you deviated from file paths suggested in this guide, you'll need to adjust the relevant paths in the `.prototxt` files. -If you look carefully at `imagenet_train_val.prototxt`, you will notice several `include` sections specifying either `phase: TRAIN` or `phase: TEST`. These sections allow us to define two closely related networks in one file: the network used for training and the network used for testing. These two networks are almost identical, sharing all layers except for those marked with `include { phase: TRAIN }` or `include { phase: TEST }`. In this case, only the input layers and one output layer are different. +If you look carefully at `models/bvlc_reference_caffenet/train_val.prototxt`, you will notice several `include` sections specifying either `phase: TRAIN` or `phase: TEST`. These sections allow us to define two closely related networks in one file: the network used for training and the network used for testing. These two networks are almost identical, sharing all layers except for those marked with `include { phase: TRAIN }` or `include { phase: TEST }`. In this case, only the input layers and one output layer are different. -**Input layer differences:** The training network's `data` input layer draws its data from `ilsvrc12_train_leveldb` and randomly mirrors the input image. The testing network's `data` layer takes data from `ilsvrc12_val_leveldb` and does not perform random mirroring. +**Input layer differences:** The training network's `data` input layer draws its data from `examples/imagenet/ilsvrc12_train_leveldb` and randomly mirrors the input image. The testing network's `data` layer takes data from `examples/imagenet/ilsvrc12_val_leveldb` and does not perform random mirroring. **Output layer differences:** Both networks output the `softmax_loss` layer, which in training is used to compute the loss function and to initialize the backpropagation, while in validation this loss is simply reported. The testing network also has a second output layer, `accuracy`, which is used to report the accuracy on the test set. In the process of training, the test network will occasionally be instantiated and tested on the test set, producing lines like `Test score #0: xxx` and `Test score #1: xxx`. In this case score 0 is the accuracy (which will start around 1/1000 = 0.001 for an untrained network) and score 1 is the loss (which will start around 7 for an untrained network). @@ -76,18 +71,14 @@ We will also lay out a protocol buffer for running the solver. Let's make a few * The network will be trained with momentum 0.9 and a weight decay of 0.0005. * For every 10,000 iterations, we will take a snapshot of the current status. -Sound good? This is implemented in `examples/imagenet/imagenet_solver.prototxt`. Again, you will need to change the first line: - - net: "imagenet_train_val.prototxt" - -to point to the actual path if you have changed it. +Sound good? This is implemented in `models/bvlc_reference_caffenet/solver.prototxt`. Training ImageNet ----------------- Ready? Let's train. - ./build/tools/caffe train --solver=examples/imagenet/imagenet_solver.prototxt + ./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt Sit back and enjoy! @@ -98,11 +89,11 @@ On my K20 machine, every 20 iterations take about 36 seconds to run, so effectiv Resume Training? ---------------- -We all experience times when the power goes out, or we feel like rewarding ourself a little by playing Battlefield (does someone still remember Quake?). Since we are snapshotting intermediate results during training, we will be able to resume from snapshots. This can be done as easy as: +We all experience times when the power goes out, or we feel like rewarding ourself a little by playing Battlefield (does anyone still remember Quake?). Since we are snapshotting intermediate results during training, we will be able to resume from snapshots. This can be done as easy as: ./build/tools/caffe train --solver=examples/imagenet/imagenet_solver.prototxt --snapshot=examples/imagenet/caffe_imagenet_10000.solverstate -where in the script `imagenet_train_1000.solverstate` is the solver state snapshot that stores all necessary information to recover the exact solver state (including the parameters, momentum history, etc). +where in the script `imagenet_train_10000.solverstate` is the solver state snapshot that stores all necessary information to recover the exact solver state (including the parameters, momentum history, etc). Parting Words ------------- diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 2d8bbb106be..336c8457c2c 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -3,7 +3,6 @@ "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "example_name": "Editing model parameters", "include_in_docs": true, - "signature": "sha256:10c551b31a64c2210f6094dbb603f26c206a7b72cd99032f475cb5023edcdc43" }, "nbformat": 3, "nbformat_minor": 0, @@ -27,7 +26,7 @@ "cell_type": "code", "collapsed": false, "input": [ - "!diff imagenet/imagenet_full_conv.prototxt imagenet/imagenet_deploy.prototxt" + "!diff imagenet/imagenet_full_conv.prototxt ../models/bvlc_reference_caffenet/deploy.prototxt" ], "language": "python", "metadata": {}, @@ -144,7 +143,7 @@ "import caffe\n", "\n", "# Load the original network and extract the fully-connected layers' parameters.\n", - "net = caffe.Net('imagenet/imagenet_deploy.prototxt', 'imagenet/caffe_reference_imagenet_model')\n", + "net = caffe.Net('../models/bvlc_reference_caffenet/deploy.prototxt', 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')\n", "params = ['fc6', 'fc7', 'fc8']\n", "# fc_params = {name: (weights, biases)}\n", "fc_params = {pr: (net.params[pr][0].data, net.params[pr][1].data) for pr in params}\n", @@ -179,7 +178,7 @@ "collapsed": false, "input": [ "# Load the fully-convolutional network to transplant the parameters.\n", - "net_full_conv = caffe.Net('imagenet/imagenet_full_conv.prototxt', 'imagenet/caffe_reference_imagenet_model')\n", + "net_full_conv = caffe.Net('imagenet/imagenet_full_conv.prototxt', '../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')\n", "params_full_conv = ['fc6-conv', 'fc7-conv', 'fc8-conv']\n", "# conv_params = {name: (weights, biases)}\n", "conv_params = {pr: (net_full_conv.params[pr][0].data, net_full_conv.params[pr][1].data) for pr in params_full_conv}\n", @@ -350,4 +349,4 @@ "metadata": {} } ] -} \ No newline at end of file +} diff --git a/examples/web_demo/app.py b/examples/web_demo/app.py index f7f46ce6c02..d33fc92f078 100644 --- a/examples/web_demo/app.py +++ b/examples/web_demo/app.py @@ -98,9 +98,9 @@ def allowed_file(filename): class ImagenetClassifier(object): default_args = { 'model_def_file': ( - '{}/examples/imagenet/imagenet_deploy.prototxt'.format(REPO_DIRNAME)), + '{}/models/bvlc_reference_caffenet/deploy.prototxt'.format(REPO_DIRNAME)), 'pretrained_model_file': ( - '{}/examples/imagenet/caffe_reference_imagenet_model'.format(REPO_DIRNAME)), + '{}/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'.format(REPO_DIRNAME)), 'mean_file': ( '{}/python/caffe/imagenet/ilsvrc_2012_mean.npy'.format(REPO_DIRNAME)), 'class_labels_file': ( diff --git a/examples/web_demo/readme.md b/examples/web_demo/readme.md index 3c8fdc068e7..fe74b9ef7d3 100644 --- a/examples/web_demo/readme.md +++ b/examples/web_demo/readme.md @@ -13,7 +13,11 @@ priority: 10 The demo server requires Python with some dependencies. To make sure you have the dependencies, please run `pip install -r examples/web_demo/requirements.txt`, and also make sure that you've compiled the Python Caffe interface and that it is on your `PYTHONPATH` (see [installation instructions](/installation.html)). -Make sure that you have obtained the Caffe Reference ImageNet Model and the ImageNet Auxiliary Data ([instructions](/getting_pretrained_models.html)). +Make sure that you have obtained the Reference CaffeNet Model and the ImageNet Auxiliary Data: + + ./scripts/download_model_binary.py models/bvlc_reference_caffenet + ./data/ilsvrc12/get_ilsvrc_aux.sh + NOTE: if you run into trouble, try re-downloading the auxiliary files. ## Run diff --git a/matlab/caffe/matcaffe_batch.m b/matlab/caffe/matcaffe_batch.m index 3cb7f1445fb..f6d1aa83b84 100644 --- a/matlab/caffe/matcaffe_batch.m +++ b/matlab/caffe/matcaffe_batch.m @@ -27,9 +27,8 @@ filename = list_im; list_im = read_cell(filename); end -% Adjust the batch size to match with imagenet_deploy.prototxt +% Adjust the batch size and dim to match with models/bvlc_reference_caffenet/deploy.prototxt batch_size = 10; -% Adjust dim to the output size of imagenet_deploy.prototxt dim = 1000; disp(list_im) if mod(length(list_im),batch_size) diff --git a/matlab/caffe/matcaffe_init.m b/matlab/caffe/matcaffe_init.m index 4e4ef8bff4a..7cc6935758e 100644 --- a/matlab/caffe/matcaffe_init.m +++ b/matlab/caffe/matcaffe_init.m @@ -8,11 +8,11 @@ function matcaffe_init(use_gpu, model_def_file, model_file) end if nargin < 2 || isempty(model_def_file) % By default use imagenet_deploy - model_def_file = '../../examples/imagenet/imagenet_deploy.prototxt'; + model_def_file = '../../models/bvlc_reference_caffenet/deploy.prototxt'; end if nargin < 3 || isempty(model_file) % By default use caffe reference model - model_file = '../../examples/imagenet/caffe_reference_imagenet_model'; + model_file = '../../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel'; end diff --git a/python/classify.py b/python/classify.py index ddc5429feac..873b5e38f19 100755 --- a/python/classify.py +++ b/python/classify.py @@ -31,13 +31,13 @@ def main(argv): parser.add_argument( "--model_def", default=os.path.join(pycaffe_dir, - "../examples/imagenet/imagenet_deploy.prototxt"), + "../models/bvlc_reference_caffenet/deploy.prototxt"), help="Model definition file." ) parser.add_argument( "--pretrained_model", default=os.path.join(pycaffe_dir, - "../examples/imagenet/caffe_reference_imagenet_model"), + "../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel"), help="Trained model weights file." ) parser.add_argument( diff --git a/python/detect.py b/python/detect.py index 4598fc7a327..bc8c0703646 100755 --- a/python/detect.py +++ b/python/detect.py @@ -46,13 +46,13 @@ def main(argv): parser.add_argument( "--model_def", default=os.path.join(pycaffe_dir, - "../examples/imagenet/imagenet_deploy.prototxt"), + "../models/bvlc_reference_caffenet/deploy.prototxt.prototxt"), help="Model definition file." ) parser.add_argument( "--pretrained_model", default=os.path.join(pycaffe_dir, - "../examples/imagenet/caffe_reference_imagenet_model"), + "../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel"), help="Trained model weights file." ) parser.add_argument( From bc601e9060cc71b95f0250b9efacaffcbb5d8c0e Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Thu, 4 Sep 2014 01:43:35 +0100 Subject: [PATCH 0670/2053] minor fixes to docs --- docs/index.md | 2 +- docs/model_zoo.md | 2 ++ examples/classification.ipynb | 2 +- examples/detection.ipynb | 2 +- examples/filter_visualization.ipynb | 2 +- examples/net_surgery.ipynb | 2 +- 6 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/index.md b/docs/index.md index 83ba236bcf1..af4b50c323b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -39,7 +39,7 @@ A 4-page report for the ACM Multimedia Open Source competition. - [Installation instructions](/installation.html)<br /> Tested on Ubuntu, Red Hat, OS X. * [Model Zoo](/model_zoo.html)<br /> -BVLC suggests a standard distribution format for Caffe models, and provides trained models for non-commercial use. +BVLC suggests a standard distribution format for Caffe models, and provides trained models. * [Developing & Contributing](/development.html)<br /> Guidelines for development and contributing to Caffe. * [API Documentation](/doxygen/)<br /> diff --git a/docs/model_zoo.md b/docs/model_zoo.md index 490bb68f808..5fd3ecf4ffe 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -1,3 +1,5 @@ +--- +--- # Caffe Model Zoo Lots of people have used Caffe to train models of different architectures and applied to different problems, ranging from simple regression to AlexNet-alikes to Siamese networks for image similarity to speech applications. diff --git a/examples/classification.ipynb b/examples/classification.ipynb index 7c01b9e235e..9c9d247a0cf 100644 --- a/examples/classification.ipynb +++ b/examples/classification.ipynb @@ -2,7 +2,7 @@ "metadata": { "description": "Use the pre-trained ImageNet model to classify images with the Python interface.", "example_name": "ImageNet classification", - "include_in_docs": true, + "include_in_docs": true }, "nbformat": 3, "nbformat_minor": 0, diff --git a/examples/detection.ipynb b/examples/detection.ipynb index e1620417af1..62263b66809 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -2,7 +2,7 @@ "metadata": { "description": "Run a pretrained model as a detector in Python.", "example_name": "R-CNN detection", - "include_in_docs": true, + "include_in_docs": true }, "nbformat": 3, "nbformat_minor": 0, diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index 4d69dc0f64e..abf4c0dd796 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -2,7 +2,7 @@ "metadata": { "description": "Extracting features and visualizing trained filters with an example image, viewed layer-by-layer.", "example_name": "Filter visualization", - "include_in_docs": true, + "include_in_docs": true }, "nbformat": 3, "nbformat_minor": 0, diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 336c8457c2c..0854018af4a 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -2,7 +2,7 @@ "metadata": { "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "example_name": "Editing model parameters", - "include_in_docs": true, + "include_in_docs": true }, "nbformat": 3, "nbformat_minor": 0, From c6827bf3fcd8bf6cafb2aeb7a1ce4d3a958b7f19 Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Thu, 4 Sep 2014 02:50:53 +0100 Subject: [PATCH 0671/2053] flickr style fine-tuning model (separated from example read me) --- examples/finetune_flickr_style/readme.md | 16 ++++++++++----- models/finetune_flickr_style/readme.md | 20 +++++++++++++++++++ .../finetune_flickr_style/solver.prototxt | 4 ++-- .../finetune_flickr_style/val.prototxt | 0 4 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 models/finetune_flickr_style/readme.md rename examples/finetune_flickr_style/flickr_style_solver.prototxt => models/finetune_flickr_style/solver.prototxt (74%) rename examples/finetune_flickr_style/flickr_style_train_val.prototxt => models/finetune_flickr_style/val.prototxt (100%) diff --git a/examples/finetune_flickr_style/readme.md b/examples/finetune_flickr_style/readme.md index 68b2778cafa..2c9ee0a8a94 100644 --- a/examples/finetune_flickr_style/readme.md +++ b/examples/finetune_flickr_style/readme.md @@ -34,7 +34,7 @@ All steps are to be done from the caffe root directory. The dataset is distributed as a list of URLs with corresponding labels. Using a script, we will download a small subset of the data and split it into train and val sets. - caffe % ./examples/finetune_flickr_style/assemble_data.py -h + caffe % ./models/finetune_flickr_style/assemble_data.py -h usage: assemble_data.py [-h] [-s SEED] [-i IMAGES] [-w WORKERS] Download a subset of Flickr Style to a directory @@ -48,7 +48,7 @@ Using a script, we will download a small subset of the data and split it into tr num workers used to download images. -x uses (all - x) cores. - caffe % python examples/finetune_flickr_style/assemble_data.py --workers=-1 --images=2000 --seed 831486 + caffe % python models/finetune_flickr_style/assemble_data.py --workers=-1 --images=2000 --seed 831486 Downloading 2000 images with 7 workers... Writing train/val for 1939 successfully downloaded images. @@ -56,11 +56,11 @@ This script downloads images and writes train/val file lists into `data/flickr_s With this random seed there are 1,557 train images and 382 test images. The prototxts in this example assume this, and also assume the presence of the ImageNet mean file (run `get_ilsvrc_aux.sh` from `data/ilsvrc12` to obtain this if you haven't yet). -We'll also need the ImageNet-trained model, which you can obtain by running `get_caffe_reference_imagenet_model.sh` from `examples/imagenet`. +We'll also need the ImageNet-trained model, which you can obtain by running `get_caffe_reference_imagenet_model.sh` from `models/imagenet`. Now we can train! (You can fine-tune in CPU mode by leaving out the `-gpu` flag.) - caffe % ./build/tools/caffe train -solver examples/finetune_flickr_style/flickr_style_solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel -gpu 0 + caffe % ./build/tools/caffe train -solver models/finetune_flickr_style/flickr_style_solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel -gpu 0 [...] @@ -149,10 +149,16 @@ This model is only beginning to learn. Fine-tuning can be feasible when training from scratch would not be for lack of time or data. Even in CPU mode each pass through the training set takes ~100 s. GPU fine-tuning is of course faster still and can learn a useful model in minutes or hours instead of days or weeks. Furthermore, note that the model has only trained on < 2,000 instances. Transfer learning a new task like style recognition from the ImageNet pretraining can require much less data than training from scratch. + Now try fine-tuning to your own tasks and data! +## Trained model + +We provide a model trained on all 80K images, with final accuracy of 98%. +Simply do `./scripts/download_model_binary.py models/finetune_flickr_style` to obtain it. + ## License The Flickr Style dataset as distributed here contains only URLs to images. Some of the images may have copyright. -Training a category-recognition model for research/non-commercial use may constitute fair use of this data. +Training a category-recognition model for research/non-commercial use may constitute fair use of this data, but the result should not be used for commercial purposes. diff --git a/models/finetune_flickr_style/readme.md b/models/finetune_flickr_style/readme.md new file mode 100644 index 00000000000..f73fd5ce1ee --- /dev/null +++ b/models/finetune_flickr_style/readme.md @@ -0,0 +1,20 @@ +--- +name: Finetuning CaffeNet on Flickr Style +caffemodel: finetune_flickr_style.caffemodel +caffemodel_url: http://dl.caffe.berkeleyvision.org/finetune_flickr_style.caffemodel +license: non-commercial +sha1: 443ad95a61fb0b5cd3cee55951bcc1f299186b5e +caffe_commit: 41751046f18499b84dbaf529f64c0e664e2a09fe +--- + +This model is trained exactly as described in `docs/finetune_flickr_style/readme.md`, using all 80000 images. +The final performance on the test set: + + I0903 18:40:59.211707 11585 caffe.cpp:167] Loss: 0.407405 + I0903 18:40:59.211717 11585 caffe.cpp:179] accuracy = 0.9164 + +## License + +The Flickr Style dataset contains only URLs to images. +Some of the images may have copyright. +Training a category-recognition model for research/non-commercial use may constitute fair use of this data, but the result should not be used for commercial purposes. diff --git a/examples/finetune_flickr_style/flickr_style_solver.prototxt b/models/finetune_flickr_style/solver.prototxt similarity index 74% rename from examples/finetune_flickr_style/flickr_style_solver.prototxt rename to models/finetune_flickr_style/solver.prototxt index 756e162ba1e..5e189bc93c0 100644 --- a/examples/finetune_flickr_style/flickr_style_solver.prototxt +++ b/models/finetune_flickr_style/solver.prototxt @@ -1,4 +1,4 @@ -net: "examples/finetune_flickr_style/flickr_style_train_val.prototxt" +net: "models/finetune_flickr_style/train_val.prototxt" test_iter: 100 test_interval: 1000 # lr for fine-tuning should be lower than when starting from scratch @@ -12,6 +12,6 @@ max_iter: 100000 momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 -snapshot_prefix: "examples/finetune_flickr_style/flickr_style" +snapshot_prefix: "models/finetune_flickr_style/finetune_flickr_style" # uncomment the following to default to CPU mode solving # solver_mode: CPU diff --git a/examples/finetune_flickr_style/flickr_style_train_val.prototxt b/models/finetune_flickr_style/val.prototxt similarity index 100% rename from examples/finetune_flickr_style/flickr_style_train_val.prototxt rename to models/finetune_flickr_style/val.prototxt From 51c4e6ed1ae91468ee560edd56c98538bfac0df0 Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Thu, 4 Sep 2014 03:50:20 +0100 Subject: [PATCH 0672/2053] script to upload/update model info as gist --- docs/model_zoo.md | 20 ++++---------- examples/imagenet/readme.md | 4 +-- models/finetune_flickr_style/readme.md | 1 + scripts/upload_model_to_gist.sh | 38 ++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 16 deletions(-) create mode 100755 scripts/upload_model_to_gist.sh diff --git a/docs/model_zoo.md b/docs/model_zoo.md index 5fd3ecf4ffe..0b7daa0bf17 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -3,7 +3,6 @@ # Caffe Model Zoo Lots of people have used Caffe to train models of different architectures and applied to different problems, ranging from simple regression to AlexNet-alikes to Siamese networks for image similarity to speech applications. - To lower the friction of sharing these models, we introduce the model zoo framework: - A standard format for packaging Caffe model info. @@ -26,12 +25,12 @@ User-provided models are posted to a public-editable [wiki page](https://github. A caffe model is distributed as a directory containing: - Solver/model prototxt(s) -- Readme.md containing +- `readme.md` containing - YAML frontmatter - Caffe version used to train this model (tagged release or commit hash). - [optional] file URL and SHA1 of the trained `.caffemodel`. - [optional] github gist id. - - Information about what data the model was trained on, explanation of modeling choices, etc. + - Information about what data the model was trained on, modeling choices, etc. - License information. - [optional] Other helpful scripts. @@ -39,9 +38,12 @@ A caffe model is distributed as a directory containing: Github Gist is a good format for model info distribution because it can contain multiple files, is versionable, and has in-browser syntax highlighting and markdown rendering. -- `scripts/download_model_from_gist.sh <gist_id>`: downloads the non-binary files from a Gist into `<dirname>` - `scripts/upload_model_to_gist.sh <dirname>`: uploads non-binary files in the model directory as a Github Gist and prints the Gist ID. If `gist_id` is already part of the `<dirname>/readme.md` frontmatter, then updates existing Gist. +Try doing `scripts/upload_model_to_gist.sh models/bvlc_alexnet` to test the uploading (don't forget to delete the uploaded gist afterward). + +Downloading models is not yet supported as a script (there is no good commandline tool for this right now), so simply go to the Gist URL and click "Download Gist" for now. + ### Hosting trained models It is up to the user where to host the `.caffemodel` file. @@ -49,13 +51,3 @@ We host our BVLC-provided models on our own server. Dropbox also works fine (tip: make sure that `?dl=1` is appended to the end of the URL). - `scripts/download_model_binary.py <dirname>`: downloads the `.caffemodel` from the URL specified in the `<dirname>/readme.md` frontmatter and confirms SHA1. - - -## Tasks - -x get the imagenet example to work with the new prototxt location -x make wiki page for user-submitted models -- add flickr model to the user-submitted models wiki page -x make docs section listing bvlc-distributed models -- write the publish_model_as_gist script -- write the download_model_from_gist script diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index 97a68f306d8..39a7fad8fda 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -91,9 +91,9 @@ Resume Training? We all experience times when the power goes out, or we feel like rewarding ourself a little by playing Battlefield (does anyone still remember Quake?). Since we are snapshotting intermediate results during training, we will be able to resume from snapshots. This can be done as easy as: - ./build/tools/caffe train --solver=examples/imagenet/imagenet_solver.prototxt --snapshot=examples/imagenet/caffe_imagenet_10000.solverstate + ./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt --snapshot=models/bvlc_reference_caffenet/caffenet_train_10000.solverstate -where in the script `imagenet_train_10000.solverstate` is the solver state snapshot that stores all necessary information to recover the exact solver state (including the parameters, momentum history, etc). +where in the script `caffenet_train_10000.solverstate` is the solver state snapshot that stores all necessary information to recover the exact solver state (including the parameters, momentum history, etc). Parting Words ------------- diff --git a/models/finetune_flickr_style/readme.md b/models/finetune_flickr_style/readme.md index f73fd5ce1ee..c08485f7fd3 100644 --- a/models/finetune_flickr_style/readme.md +++ b/models/finetune_flickr_style/readme.md @@ -5,6 +5,7 @@ caffemodel_url: http://dl.caffe.berkeleyvision.org/finetune_flickr_style.caffemo license: non-commercial sha1: 443ad95a61fb0b5cd3cee55951bcc1f299186b5e caffe_commit: 41751046f18499b84dbaf529f64c0e664e2a09fe +gist_id: 034c6ac3865563b69e60 --- This model is trained exactly as described in `docs/finetune_flickr_style/readme.md`, using all 80000 images. diff --git a/scripts/upload_model_to_gist.sh b/scripts/upload_model_to_gist.sh new file mode 100755 index 00000000000..2dfbabd72a3 --- /dev/null +++ b/scripts/upload_model_to_gist.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +# Check for valid directory +DIRNAME=$1 +if [ ! -f $DIRNAME/readme.md ]; then + echo "usage: upload_model_to_gist.sh <dirname>" + echo " <dirname>/readme.md must exist" +fi +cd $DIRNAME +FILES=`find . -type f -maxdepth 1 ! -name "*.caffemodel*" | xargs echo` + +# Check for gist tool. +gist -v >/dev/null 2>&1 || { echo >&2 "I require 'gist' but it's not installed. Do 'gem install gist'."; exit 1; } + +NAME=`sed -n 's/^name:[[:space:]]*//p' readme.md` +if [ -z "$NAME" ]; then + echo " <dirname>/readme.md must contain name field in the front-matter." +fi + +GIST=`sed -n 's/^gist_id:[[:space:]]*//p' readme.md` +if [ -z "$GIST" ]; then + echo "Uploading new Gist" + gist -p -d "$NAME" $FILES +else + echo "Updating existing Gist, id $GIST" + gist -u $GIST -d "$NAME" $FILES +fi + +RESULT=$? +if [ $RESULT -eq 0 ]; then + echo "You've uploaded your model!" + echo "Don't forget to add the gist_id field to your <dirname>/readme.md now!" + echo "Run the command again after you do that, to make sure the Gist id propagates." + echo "" + echo "And do share your model over at https://github.com/BVLC/caffe/wiki/Model-Zoo" +else + echo "Something went wrong!" +fi From 2bdf516440139ce59f9a45f3cd6c84540e2cb040 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 3 Sep 2014 20:55:00 -0700 Subject: [PATCH 0673/2053] add test_initialization option to allow skipping initial test --- src/caffe/proto/caffe.proto | 3 +++ src/caffe/solver.cpp | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 74c2bab73eb..364cde6cbe0 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -106,6 +106,9 @@ message SolverParameter { // The number of iterations between two testing phases. optional int32 test_interval = 4 [default = 0]; optional bool test_compute_loss = 19 [default = false]; + // If true, run an initial test pass before the first iteration, + // ensuring memory availability and printing the starting value of the loss. + optional bool test_initialization = 32 [default = true]; optional float base_lr = 5; // The base learning rate // the number of iterations between displaying info. If display = 0, no info // will be displayed. diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index dcac4c1537c..d68de5fa930 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -184,7 +184,8 @@ void Solver<Dtype>::Solve(const char* resume_file) { Snapshot(); } - if (param_.test_interval() && iter_ % param_.test_interval() == 0) { + if (param_.test_interval() && iter_ % param_.test_interval() == 0 + && (iter_ > 0 || param_.test_initialization())) { TestAll(); } From d8f56fb2c21058e9ea01cae65f1f9a0cc5371cb8 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 3 Jul 2014 21:53:31 -0700 Subject: [PATCH 0674/2053] add SILENCE layer -- takes one or more inputs and produces no output This is useful for suppressing undesired outputs. --- include/caffe/common_layers.hpp | 31 ++++++++++++++++++++++++++++++ src/caffe/layer_factory.cpp | 2 ++ src/caffe/layers/silence_layer.cpp | 26 +++++++++++++++++++++++++ src/caffe/layers/silence_layer.cu | 28 +++++++++++++++++++++++++++ src/caffe/proto/caffe.proto | 3 ++- 5 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/caffe/layers/silence_layer.cpp create mode 100644 src/caffe/layers/silence_layer.cu diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index e32dac71332..37535920992 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -309,6 +309,37 @@ class MVNLayer : public Layer<Dtype> { Blob<Dtype> sum_multiplier_; }; +/** + * @brief Ignores bottom blobs while producing no top blobs. (This is useful + * to suppress outputs during testing.) + */ +template <typename Dtype> +class SilenceLayer : public Layer<Dtype> { + public: + explicit SilenceLayer(const LayerParameter& param) + : Layer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) {} + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SILENCE; + } + virtual inline int MinBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 0; } + + protected: + virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) {} + // We can't define Forward_gpu here, since STUB_GPU will provide + // its own definition for CPU_ONLY mode. + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); +}; + /** * @brief Computes the softmax function. * diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 1b34702c0c4..4bb7cd7cd7f 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -66,6 +66,8 @@ Layer<Dtype>* GetLayer(const LayerParameter& param) { return new PowerLayer<Dtype>(param); case LayerParameter_LayerType_RELU: return new ReLULayer<Dtype>(param); + case LayerParameter_LayerType_SILENCE: + return new SilenceLayer<Dtype>(param); case LayerParameter_LayerType_SIGMOID: return new SigmoidLayer<Dtype>(param); case LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS: diff --git a/src/caffe/layers/silence_layer.cpp b/src/caffe/layers/silence_layer.cpp new file mode 100644 index 00000000000..75dbbf31f0d --- /dev/null +++ b/src/caffe/layers/silence_layer.cpp @@ -0,0 +1,26 @@ +#include <vector> + +#include "caffe/common_layers.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template <typename Dtype> +void SilenceLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + for (int i = 0; i < bottom->size(); ++i) { + if (propagate_down[i]) { + caffe_set((*bottom)[i]->count(), Dtype(0), + (*bottom)[i]->mutable_cpu_data()); + } + } +} + +#ifdef CPU_ONLY +STUB_GPU(SilenceLayer); +#endif + +INSTANTIATE_CLASS(SilenceLayer); + +} // namespace caffe diff --git a/src/caffe/layers/silence_layer.cu b/src/caffe/layers/silence_layer.cu new file mode 100644 index 00000000000..735abe61eaf --- /dev/null +++ b/src/caffe/layers/silence_layer.cu @@ -0,0 +1,28 @@ +#include <vector> + +#include "caffe/common_layers.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template <typename Dtype> +void SilenceLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + // Do nothing. +} + +template <typename Dtype> +void SilenceLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + for (int i = 0; i < bottom->size(); ++i) { + if (propagate_down[i]) { + caffe_gpu_set((*bottom)[i]->count(), Dtype(0), + (*bottom)[i]->mutable_gpu_data()); + } + } +} + +INSTANTIATE_CLASS(SilenceLayer); + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 74c2bab73eb..dd650be68ed 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -220,7 +220,7 @@ message LayerParameter { // line above the enum. Update the next available ID when you add a new // LayerType. // - // LayerType next available ID: 36 (last added: ABSVAL) + // LayerType next available ID: 37 (last added: SILENCE) enum LayerType { // "NONE" layer type is 0th enum element so that we don't cause confusion // by defaulting to an existent LayerType (instead, should usually error if @@ -254,6 +254,7 @@ message LayerParameter { RELU = 18; SIGMOID = 19; SIGMOID_CROSS_ENTROPY_LOSS = 27; + SILENCE = 36; SOFTMAX = 20; SOFTMAX_LOSS = 21; SPLIT = 22; From f7baf2b486c3ff196f408c61790bd1b235208e98 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 4 Sep 2014 02:33:19 -0700 Subject: [PATCH 0675/2053] fix model download advice and prototxt name for fine-tuning --- examples/finetune_flickr_style/readme.md | 2 +- .../finetune_flickr_style/{val.prototxt => train_val.prototxt} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename models/finetune_flickr_style/{val.prototxt => train_val.prototxt} (100%) diff --git a/examples/finetune_flickr_style/readme.md b/examples/finetune_flickr_style/readme.md index 2c9ee0a8a94..dad45aeb560 100644 --- a/examples/finetune_flickr_style/readme.md +++ b/examples/finetune_flickr_style/readme.md @@ -56,7 +56,7 @@ This script downloads images and writes train/val file lists into `data/flickr_s With this random seed there are 1,557 train images and 382 test images. The prototxts in this example assume this, and also assume the presence of the ImageNet mean file (run `get_ilsvrc_aux.sh` from `data/ilsvrc12` to obtain this if you haven't yet). -We'll also need the ImageNet-trained model, which you can obtain by running `get_caffe_reference_imagenet_model.sh` from `models/imagenet`. +We'll also need the ImageNet-trained model, which you can obtain by running `./scripts/download_model_binary.py models/bvlc_reference_caffenet`. Now we can train! (You can fine-tune in CPU mode by leaving out the `-gpu` flag.) diff --git a/models/finetune_flickr_style/val.prototxt b/models/finetune_flickr_style/train_val.prototxt similarity index 100% rename from models/finetune_flickr_style/val.prototxt rename to models/finetune_flickr_style/train_val.prototxt From d46f3cd65255f088c3ac35654427549509d71b05 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 4 Sep 2014 02:37:04 -0700 Subject: [PATCH 0676/2053] [example] update ImageNet timing for K40 --- examples/imagenet/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index 39a7fad8fda..41384f9475b 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -82,7 +82,7 @@ Ready? Let's train. Sit back and enjoy! -On my K20 machine, every 20 iterations take about 36 seconds to run, so effectively about 7 ms per image for the full forward-backward pass. About 2.5 ms of this is on forward, and the rest is backward. If you are interested in dissecting the computation time, you can run +On a K40 machine, every 20 iterations take about 26.5 seconds to run (while a on a K20 this takes 36 seconds), so effectively about 5.2 ms per image for the full forward-backward pass. About 2 ms of this is on forward, and the rest is backward. If you are interested in dissecting the computation time, you can run ./build/tools/caffe time --model=models/bvlc_reference_caffenet/train_val.prototxt From e23ac45004130889f9b1c1d23903f9a9d6cb81d3 Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Thu, 4 Sep 2014 18:06:31 +0100 Subject: [PATCH 0677/2053] HDF5 classification example --- examples/hdf5_classification.ipynb | 505 ++++++++++++++++++ examples/hdf5_classification/solver.prototxt | 14 + .../hdf5_classification/train_val.prototxt | 59 ++ 3 files changed, 578 insertions(+) create mode 100644 examples/hdf5_classification.ipynb create mode 100644 examples/hdf5_classification/solver.prototxt create mode 100644 examples/hdf5_classification/train_val.prototxt diff --git a/examples/hdf5_classification.ipynb b/examples/hdf5_classification.ipynb new file mode 100644 index 00000000000..9232cb18455 --- /dev/null +++ b/examples/hdf5_classification.ipynb @@ -0,0 +1,505 @@ +{ + "metadata": { + "example_name": "Classification with HDF5 data", + "description": "Use Caffe as a generic SGD optimizer to train logistic regression on non-image HDF5 data.", + "include_in_docs": true + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Classification with HDF5 data\n", + "\n", + "In this example we'll use Caffe to do simple logistic regression on a simple binary dataset, showcasing HDF5DataLayer functionality." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import os\n", + "import h5py\n", + "import shutil\n", + "import sklearn\n", + "import tempfile\n", + "import numpy as np\n", + "import pandas as pd\n", + "import sklearn.datasets\n", + "import sklearn.linear_model\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "X, y = sklearn.datasets.make_classification(\n", + " n_samples=10000, n_features=4, n_redundant=0, n_informative=2, \n", + " n_clusters_per_class=2, hypercube=False, random_state=0\n", + ")\n", + "\n", + "# Split into train and test\n", + "X, Xt, y, yt = sklearn.cross_validation.train_test_split(X, y)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Visualize sample of the data\n", + "ind = np.random.permutation(X.shape[0])[:1000]\n", + "df = pd.DataFrame(X[ind])\n", + "_ = pd.scatter_matrix(df, figsize=(9, 9), diagonal='kde', marker='o', s=40, alpha=.4, c=y[ind])" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nEARhBvH/79EO0YiEt/4AAAAASUVORK5CYII=\n", + "text": [ + "<matplotlib.figure.Figure at 0x1154b4310>" + ] + } + ], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Train and test the scikit-learn SGD logistic regression.\n", + "clf = sklearn.linear_model.SGDClassifier(\n", + " loss='log', n_iter=1000, penalty='l2', alpha=1e-3, class_weight='auto')\n", + "\n", + "clf.fit(X, y)\n", + "yt_pred = clf.predict(Xt)\n", + "print('Accuracy: {:.3f}'.format(sklearn.metrics.accuracy_score(yt, yt_pred)))" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Accuracy: 0.764\n" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Write out the data to HDF5 files in a temp directory.\n", + "# This file is assumed to be caffe_root/examples/hdf5_classification.ipynb\n", + "dirname = os.path.abspath('./hdf5_classification/data')\n", + "if not os.path.exists(dirname):\n", + " os.makedirs(dirname)\n", + "\n", + "train_filename = os.path.join(dirname, 'train.h5')\n", + "test_filename = os.path.join(dirname, 'test.h5')\n", + "\n", + "# HDF5DataLayer source should be a file containing a list of HDF5 filenames.\n", + "# To show this off, we'll list the same data file twice.\n", + "with h5py.File(train_filename, 'w') as f:\n", + " f['data'] = X\n", + " f['label'] = y.astype(np.float32)\n", + "with open(os.path.join(dirname, 'train.txt'), 'w') as f:\n", + " f.write(train_filename + '\\n')\n", + " f.write(train_filename + '\\n')\n", + " \n", + "# HDF5 is pretty efficient, but can be further compressed.\n", + "comp_kwargs = {'compression': 'gzip', 'compression_opts': 1}\n", + "with h5py.File(test_filename, 'w') as f:\n", + " f.create_dataset('data', data=Xt, **comp_kwargs)\n", + " f.create_dataset('label', data=yt.astype(np.float32), **comp_kwargs)\n", + "with open(os.path.join(dirname, 'test.txt'), 'w') as f:\n", + " f.write(test_filename + '\\n')" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Run caffe. Scroll down in the output to see the final\n", + "# test accuracy, which should be about the same as above.\n", + "!cd .. && ./build/tools/caffe train -solver examples/hdf5_classification/solver.prototxt" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0904 17:54:31.724112 2129298192 caffe.cpp:90] Starting Optimization\r\n", + "I0904 17:54:31.725520 2129298192 solver.cpp:32] Initializing solver from parameters: \r\n", + "test_iter: 1000\r\n", + "test_interval: 1000\r\n", + "base_lr: 0.01\r\n", + "display: 1000\r\n", + "max_iter: 10000\r\n", + "lr_policy: \"step\"\r\n", + "gamma: 0.1\r\n", + "momentum: 0.9\r\n", + "weight_decay: 0.0005\r\n", + "stepsize: 5000\r\n", + "snapshot: 10000\r\n", + "snapshot_prefix: \"examples/hdf5_classification/data/train\"\r\n", + "solver_mode: CPU\r\n", + "net: \"examples/hdf5_classification/train_val.prototxt\"\r\n", + "I0904 17:54:31.725751 2129298192 solver.cpp:72] Creating training net from net file: examples/hdf5_classification/train_val.prototxt\r\n", + "I0904 17:54:31.726464 2129298192 net.cpp:275] The NetState phase (0) differed from the phase (1) specified by a rule in layer data\r\n", + "I0904 17:54:31.726560 2129298192 net.cpp:275] The NetState phase (0) differed from the phase (1) specified by a rule in layer accuracy\r\n", + "I0904 17:54:31.726586 2129298192 net.cpp:39] Initializing net from parameters: \r\n", + "name: \"LogisticRegressionNet\"\r\n", + "layers {\r\n", + " top: \"data\"\r\n", + " top: \"label\"\r\n", + " name: \"data\"\r\n", + " type: HDF5_DATA\r\n", + " hdf5_data_param {\r\n", + " source: \"examples/hdf5_classification/data/train.txt\"\r\n", + " batch_size: 10\r\n", + " }\r\n", + " include {\r\n", + " phase: TRAIN\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"data\"\r\n", + " top: \"fc1\"\r\n", + " name: \"fc1\"\r\n", + " type: INNER_PRODUCT\r\n", + " blobs_lr: 1\r\n", + " blobs_lr: 2\r\n", + " weight_decay: 1\r\n", + " weight_decay: 0\r\n", + " inner_product_param {\r\n", + " num_output: 2\r\n", + " weight_filler {\r\n", + " type: \"gaussian\"\r\n", + " std: 0.01\r\n", + " }\r\n", + " bias_filler {\r\n", + " type: \"constant\"\r\n", + " value: 0\r\n", + " }\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc1\"\r\n", + " bottom: \"label\"\r\n", + " top: \"loss\"\r\n", + " name: \"loss\"\r\n", + " type: SOFTMAX_LOSS\r\n", + "}\r\n", + "state {\r\n", + " phase: TRAIN\r\n", + "}\r\n", + "I0904 17:54:31.727036 2129298192 net.cpp:67] Creating Layer data\r\n", + "I0904 17:54:31.727066 2129298192 net.cpp:356] data -> data\r\n", + "I0904 17:54:31.727125 2129298192 net.cpp:356] data -> label\r\n", + "I0904 17:54:31.727144 2129298192 net.cpp:96] Setting up data\r\n", + "I0904 17:54:31.727429 2129298192 hdf5_data_layer.cpp:57] Loading filename from examples/hdf5_classification/data/train.txt\r\n", + "I0904 17:54:31.727666 2129298192 hdf5_data_layer.cpp:69] Number of files: 2\r\n", + "I0904 17:54:31.727689 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.731825 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.731884 2129298192 hdf5_data_layer.cpp:81] output data size: 10,4,1,1\r\n", + "I0904 17:54:31.731904 2129298192 net.cpp:103] Top shape: 10 4 1 1 (40)\r\n", + "I0904 17:54:31.731912 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0904 17:54:31.731935 2129298192 net.cpp:67] Creating Layer fc1\r\n", + "I0904 17:54:31.731942 2129298192 net.cpp:394] fc1 <- data\r\n", + "I0904 17:54:31.731964 2129298192 net.cpp:356] fc1 -> fc1\r\n", + "I0904 17:54:31.731992 2129298192 net.cpp:96] Setting up fc1\r\n", + "I0904 17:54:31.738070 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0904 17:54:31.738148 2129298192 net.cpp:67] Creating Layer loss\r\n", + "I0904 17:54:31.738158 2129298192 net.cpp:394] loss <- fc1\r\n", + "I0904 17:54:31.738172 2129298192 net.cpp:394] loss <- label\r\n", + "I0904 17:54:31.738185 2129298192 net.cpp:356] loss -> loss\r\n", + "I0904 17:54:31.738201 2129298192 net.cpp:96] Setting up loss\r\n", + "I0904 17:54:31.738327 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", + "I0904 17:54:31.738343 2129298192 net.cpp:109] with loss weight 1\r\n", + "I0904 17:54:31.738368 2129298192 net.cpp:170] loss needs backward computation.\r\n", + "I0904 17:54:31.738378 2129298192 net.cpp:170] fc1 needs backward computation.\r\n", + "I0904 17:54:31.738386 2129298192 net.cpp:172] data does not need backward computation.\r\n", + "I0904 17:54:31.738392 2129298192 net.cpp:208] This network produces output loss\r\n", + "I0904 17:54:31.738402 2129298192 net.cpp:467] Collecting Learning Rate and Weight Decay.\r\n", + "I0904 17:54:31.738410 2129298192 net.cpp:219] Network initialization done.\r\n", + "I0904 17:54:31.738415 2129298192 net.cpp:220] Memory required for data: 284\r\n", + "I0904 17:54:31.738785 2129298192 solver.cpp:156] Creating test net (#0) specified by net file: examples/hdf5_classification/train_val.prototxt\r\n", + "I0904 17:54:31.738836 2129298192 net.cpp:275] The NetState phase (1) differed from the phase (0) specified by a rule in layer data\r\n", + "I0904 17:54:31.738858 2129298192 net.cpp:39] Initializing net from parameters: \r\n", + "name: \"LogisticRegressionNet\"\r\n", + "layers {\r\n", + " top: \"data\"\r\n", + " top: \"label\"\r\n", + " name: \"data\"\r\n", + " type: HDF5_DATA\r\n", + " hdf5_data_param {\r\n", + " source: \"examples/hdf5_classification/data/test.txt\"\r\n", + " batch_size: 10\r\n", + " }\r\n", + " include {\r\n", + " phase: TEST\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"data\"\r\n", + " top: \"fc1\"\r\n", + " name: \"fc1\"\r\n", + " type: INNER_PRODUCT\r\n", + " blobs_lr: 1\r\n", + " blobs_lr: 2\r\n", + " weight_decay: 1\r\n", + " weight_decay: 0\r\n", + " inner_product_param {\r\n", + " num_output: 2\r\n", + " weight_filler {\r\n", + " type: \"gaussian\"\r\n", + " std: 0.01\r\n", + " }\r\n", + " bias_filler {\r\n", + " type: \"constant\"\r\n", + " value: 0\r\n", + " }\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc1\"\r\n", + " bottom: \"label\"\r\n", + " top: \"loss\"\r\n", + " name: \"loss\"\r\n", + " type: SOFTMAX_LOSS\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc1\"\r\n", + " bottom: \"label\"\r\n", + " top: \"accuracy\"\r\n", + " name: \"accuracy\"\r\n", + " type: ACCURACY\r\n", + " include {\r\n", + " phase: TEST\r\n", + " }\r\n", + "}\r\n", + "state {\r\n", + " phase: TEST\r\n", + "}\r\n", + "I0904 17:54:31.739138 2129298192 net.cpp:67] Creating Layer data\r\n", + "I0904 17:54:31.739156 2129298192 net.cpp:356] data -> data\r\n", + "I0904 17:54:31.739235 2129298192 net.cpp:356] data -> label\r\n", + "I0904 17:54:31.739249 2129298192 net.cpp:96] Setting up data\r\n", + "I0904 17:54:31.739256 2129298192 hdf5_data_layer.cpp:57] Loading filename from examples/hdf5_classification/data/test.txt\r\n", + "I0904 17:54:31.739305 2129298192 hdf5_data_layer.cpp:69] Number of files: 1\r\n", + "I0904 17:54:31.739315 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/test.h5\r\n", + "I0904 17:54:31.740720 2129298192 hdf5_data_layer.cpp:49] Successully loaded 2500 rows\r\n", + "I0904 17:54:31.740757 2129298192 hdf5_data_layer.cpp:81] output data size: 10,4,1,1\r\n", + "I0904 17:54:31.740768 2129298192 net.cpp:103] Top shape: 10 4 1 1 (40)\r\n", + "I0904 17:54:31.740774 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0904 17:54:31.740795 2129298192 net.cpp:67] Creating Layer label_data_1_split\r\n", + "I0904 17:54:31.740803 2129298192 net.cpp:394] label_data_1_split <- label\r\n", + "I0904 17:54:31.740813 2129298192 net.cpp:356] label_data_1_split -> label_data_1_split_0\r\n", + "I0904 17:54:31.740826 2129298192 net.cpp:356] label_data_1_split -> label_data_1_split_1\r\n", + "I0904 17:54:31.740835 2129298192 net.cpp:96] Setting up label_data_1_split\r\n", + "I0904 17:54:31.740842 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0904 17:54:31.740849 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0904 17:54:31.740859 2129298192 net.cpp:67] Creating Layer fc1\r\n", + "I0904 17:54:31.740865 2129298192 net.cpp:394] fc1 <- data\r\n", + "I0904 17:54:31.740877 2129298192 net.cpp:356] fc1 -> fc1\r\n", + "I0904 17:54:31.740887 2129298192 net.cpp:96] Setting up fc1\r\n", + "I0904 17:54:31.740906 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0904 17:54:31.740921 2129298192 net.cpp:67] Creating Layer fc1_fc1_0_split\r\n", + "I0904 17:54:31.740926 2129298192 net.cpp:394] fc1_fc1_0_split <- fc1\r\n", + "I0904 17:54:31.740934 2129298192 net.cpp:356] fc1_fc1_0_split -> fc1_fc1_0_split_0\r\n", + "I0904 17:54:31.740943 2129298192 net.cpp:356] fc1_fc1_0_split -> fc1_fc1_0_split_1\r\n", + "I0904 17:54:31.741047 2129298192 net.cpp:96] Setting up fc1_fc1_0_split\r\n", + "I0904 17:54:31.741065 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0904 17:54:31.741070 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0904 17:54:31.741081 2129298192 net.cpp:67] Creating Layer loss\r\n", + "I0904 17:54:31.741087 2129298192 net.cpp:394] loss <- fc1_fc1_0_split_0\r\n", + "I0904 17:54:31.741094 2129298192 net.cpp:394] loss <- label_data_1_split_0\r\n", + "I0904 17:54:31.741102 2129298192 net.cpp:356] loss -> loss\r\n", + "I0904 17:54:31.741111 2129298192 net.cpp:96] Setting up loss\r\n", + "I0904 17:54:31.741128 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", + "I0904 17:54:31.741139 2129298192 net.cpp:109] with loss weight 1\r\n", + "I0904 17:54:31.741159 2129298192 net.cpp:67] Creating Layer accuracy\r\n", + "I0904 17:54:31.741166 2129298192 net.cpp:394] accuracy <- fc1_fc1_0_split_1\r\n", + "I0904 17:54:31.741173 2129298192 net.cpp:394] accuracy <- label_data_1_split_1\r\n", + "I0904 17:54:31.741181 2129298192 net.cpp:356] accuracy -> accuracy\r\n", + "I0904 17:54:31.741190 2129298192 net.cpp:96] Setting up accuracy\r\n", + "I0904 17:54:31.741197 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", + "I0904 17:54:31.741204 2129298192 net.cpp:172] accuracy does not need backward computation.\r\n", + "I0904 17:54:31.741209 2129298192 net.cpp:170] loss needs backward computation.\r\n", + "I0904 17:54:31.741245 2129298192 net.cpp:170] fc1_fc1_0_split needs backward computation.\r\n", + "I0904 17:54:31.741252 2129298192 net.cpp:170] fc1 needs backward computation.\r\n", + "I0904 17:54:31.741257 2129298192 net.cpp:172] label_data_1_split does not need backward computation.\r\n", + "I0904 17:54:31.741263 2129298192 net.cpp:172] data does not need backward computation.\r\n", + "I0904 17:54:31.741269 2129298192 net.cpp:208] This network produces output accuracy\r\n", + "I0904 17:54:31.741336 2129298192 net.cpp:208] This network produces output loss\r\n", + "I0904 17:54:31.741353 2129298192 net.cpp:467] Collecting Learning Rate and Weight Decay.\r\n", + "I0904 17:54:31.741360 2129298192 net.cpp:219] Network initialization done.\r\n", + "I0904 17:54:31.741366 2129298192 net.cpp:220] Memory required for data: 528\r\n", + "I0904 17:54:31.741401 2129298192 solver.cpp:46] Solver scaffolding done.\r\n", + "I0904 17:54:31.741408 2129298192 solver.cpp:165] Solving LogisticRegressionNet\r\n", + "I0904 17:54:31.741426 2129298192 solver.cpp:251] Iteration 0, Testing net (#0)\r\n", + "I0904 17:54:31.747434 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.366799\r\n", + "I0904 17:54:31.747484 2129298192 solver.cpp:302] Test net output #1: loss = 0.700084 (* 1 = 0.700084 loss)\r\n", + "I0904 17:54:31.747532 2129298192 solver.cpp:195] Iteration 0, loss = 0.701716\r\n", + "I0904 17:54:31.747545 2129298192 solver.cpp:210] Train net output #0: loss = 0.701716 (* 1 = 0.701716 loss)\r\n", + "I0904 17:54:31.747561 2129298192 solver.cpp:405] Iteration 0, lr = 0.01\r\n", + "I0904 17:54:31.750849 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.752188 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.753466 2129298192 solver.cpp:251] Iteration 1000, Testing net (#0)\r\n", + "I0904 17:54:31.760200 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.5632\r\n", + "I0904 17:54:31.760282 2129298192 solver.cpp:302] Test net output #1: loss = 0.619953 (* 1 = 0.619953 loss)\r\n", + "I0904 17:54:31.760310 2129298192 solver.cpp:195] Iteration 1000, loss = 0.520827\r\n", + "I0904 17:54:31.760323 2129298192 solver.cpp:210] Train net output #0: loss = 0.520827 (* 1 = 0.520827 loss)\r\n", + "I0904 17:54:31.760334 2129298192 solver.cpp:405] Iteration 1000, lr = 0.01\r\n", + "I0904 17:54:31.762578 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0904 17:54:31.762634 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.763407 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.765583 2129298192 solver.cpp:251] Iteration 2000, Testing net (#0)\r\n", + "I0904 17:54:31.772900 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.768\r\n", + "I0904 17:54:31.773041 2129298192 solver.cpp:302] Test net output #1: loss = 0.596873 (* 1 = 0.596873 loss)\r\n", + "I0904 17:54:31.773085 2129298192 solver.cpp:195] Iteration 2000, loss = 0.483448\r\n", + "I0904 17:54:31.773109 2129298192 solver.cpp:210] Train net output #0: loss = 0.483448 (* 1 = 0.483448 loss)\r\n", + "I0904 17:54:31.773128 2129298192 solver.cpp:405] Iteration 2000, lr = 0.01\r\n", + "I0904 17:54:31.774942 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.776607 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0904 17:54:31.781949 2129298192 solver.cpp:251] Iteration 3000, Testing net (#0)\r\n", + "I0904 17:54:31.788913 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7376\r\n", + "I0904 17:54:31.788986 2129298192 solver.cpp:302] Test net output #1: loss = 0.596472 (* 1 = 0.596472 loss)\r\n", + "I0904 17:54:31.789000 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0904 17:54:31.789005 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.789858 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.789932 2129298192 solver.cpp:195] Iteration 3000, loss = 0.42153\r\n", + "I0904 17:54:31.789959 2129298192 solver.cpp:210] Train net output #0: loss = 0.42153 (* 1 = 0.42153 loss)\r\n", + "I0904 17:54:31.790071 2129298192 solver.cpp:405] Iteration 3000, lr = 0.01\r\n", + "I0904 17:54:31.793167 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.794184 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.795362 2129298192 solver.cpp:251] Iteration 4000, Testing net (#0)\r\n", + "I0904 17:54:31.802089 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.5632\r\n", + "I0904 17:54:31.802183 2129298192 solver.cpp:302] Test net output #1: loss = 0.619953 (* 1 = 0.619953 loss)\r\n", + "I0904 17:54:31.802232 2129298192 solver.cpp:195] Iteration 4000, loss = 0.520827\r\n", + "I0904 17:54:31.802254 2129298192 solver.cpp:210] Train net output #0: loss = 0.520827 (* 1 = 0.520827 loss)\r\n", + "I0904 17:54:31.802275 2129298192 solver.cpp:405] Iteration 4000, lr = 0.01\r\n", + "I0904 17:54:31.805856 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0904 17:54:31.805949 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.807231 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.809342 2129298192 solver.cpp:251] Iteration 5000, Testing net (#0)\r\n", + "I0904 17:54:31.815631 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.768\r\n", + "I0904 17:54:31.815783 2129298192 solver.cpp:302] Test net output #1: loss = 0.596873 (* 1 = 0.596873 loss)\r\n", + "I0904 17:54:31.815820 2129298192 solver.cpp:195] Iteration 5000, loss = 0.483448\r\n", + "I0904 17:54:31.815835 2129298192 solver.cpp:210] Train net output #0: loss = 0.483448 (* 1 = 0.483448 loss)\r\n", + "I0904 17:54:31.815853 2129298192 solver.cpp:405] Iteration 5000, lr = 0.001\r\n", + "I0904 17:54:31.816906 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.818512 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.823189 2129298192 solver.cpp:251] Iteration 6000, Testing net (#0)\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0904 17:54:31.833202 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7716\r\n", + "I0904 17:54:31.833345 2129298192 solver.cpp:302] Test net output #1: loss = 0.591513 (* 1 = 0.591513 loss)\r\n", + "I0904 17:54:31.833375 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0904 17:54:31.833389 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.835263 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.835388 2129298192 solver.cpp:195] Iteration 6000, loss = 0.444828\r\n", + "I0904 17:54:31.835438 2129298192 solver.cpp:210] Train net output #0: loss = 0.444828 (* 1 = 0.444828 loss)\r\n", + "I0904 17:54:31.835461 2129298192 solver.cpp:405] Iteration 6000, lr = 0.001\r\n", + "I0904 17:54:31.840736 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.842892 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.844861 2129298192 solver.cpp:251] Iteration 7000, Testing net (#0)\r\n", + "I0904 17:54:31.852855 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7468\r\n", + "I0904 17:54:31.853005 2129298192 solver.cpp:302] Test net output #1: loss = 0.593044 (* 1 = 0.593044 loss)\r\n", + "I0904 17:54:31.853076 2129298192 solver.cpp:195] Iteration 7000, loss = 0.489475\r\n", + "I0904 17:54:31.853099 2129298192 solver.cpp:210] Train net output #0: loss = 0.489475 (* 1 = 0.489475 loss)\r\n", + "I0904 17:54:31.853118 2129298192 solver.cpp:405] Iteration 7000, lr = 0.001\r\n", + "I0904 17:54:31.855607 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0904 17:54:31.855667 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.856359 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.858321 2129298192 solver.cpp:251] Iteration 8000, Testing net (#0)\r\n", + "I0904 17:54:31.864265 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7632\r\n", + "I0904 17:54:31.864409 2129298192 solver.cpp:302] Test net output #1: loss = 0.592058 (* 1 = 0.592058 loss)\r\n", + "I0904 17:54:31.864442 2129298192 solver.cpp:195] Iteration 8000, loss = 0.525746\r\n", + "I0904 17:54:31.864454 2129298192 solver.cpp:210] Train net output #0: loss = 0.525746 (* 1 = 0.525746 loss)\r\n", + "I0904 17:54:31.864466 2129298192 solver.cpp:405] Iteration 8000, lr = 0.001\r\n", + "I0904 17:54:31.865531 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.866392 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.869691 2129298192 solver.cpp:251] Iteration 9000, Testing net (#0)\r\n", + "I0904 17:54:31.876518 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7708\r\n", + "I0904 17:54:31.876603 2129298192 solver.cpp:302] Test net output #1: loss = 0.591526 (* 1 = 0.591526 loss)\r\n", + "I0904 17:54:31.876616 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0904 17:54:31.876624 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0904 17:54:31.877727 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.877826 2129298192 solver.cpp:195] Iteration 9000, loss = 0.445997\r\n", + "I0904 17:54:31.877867 2129298192 solver.cpp:210] Train net output #0: loss = 0.445997 (* 1 = 0.445997 loss)\r\n", + "I0904 17:54:31.877882 2129298192 solver.cpp:405] Iteration 9000, lr = 0.001\r\n", + "I0904 17:54:31.881119 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0904 17:54:31.882143 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0904 17:54:31.883280 2129298192 solver.cpp:319] Snapshotting to examples/hdf5_classification/data/train_iter_10000\r\n", + "I0904 17:54:31.883776 2129298192 solver.cpp:326] Snapshotting solver state to examples/hdf5_classification/data/train_iter_10000.solverstate\r\n", + "I0904 17:54:31.884004 2129298192 solver.cpp:232] Iteration 10000, loss = 0.489453\r\n", + "I0904 17:54:31.884037 2129298192 solver.cpp:251] Iteration 10000, Testing net (#0)\r\n", + "I0904 17:54:31.890312 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7468\r\n", + "I0904 17:54:31.890403 2129298192 solver.cpp:302] Test net output #1: loss = 0.593055 (* 1 = 0.593055 loss)\r\n", + "I0904 17:54:31.890415 2129298192 solver.cpp:237] Optimization Done.\r\n", + "I0904 17:54:31.890422 2129298192 caffe.cpp:114] Optimization Done.\r\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# Clean up (comment this out if you want to examine the hdf5_classification/data directory).\n", + "shutil.rmtree(dirname)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 7 + } + ], + "metadata": {} + } + ] +} diff --git a/examples/hdf5_classification/solver.prototxt b/examples/hdf5_classification/solver.prototxt new file mode 100644 index 00000000000..040162076b8 --- /dev/null +++ b/examples/hdf5_classification/solver.prototxt @@ -0,0 +1,14 @@ +net: "examples/hdf5_classification/train_val.prototxt" +test_iter: 1000 +test_interval: 1000 +base_lr: 0.01 +lr_policy: "step" +gamma: 0.1 +stepsize: 5000 +display: 1000 +max_iter: 10000 +momentum: 0.9 +weight_decay: 0.0005 +snapshot: 10000 +snapshot_prefix: "examples/hdf5_classification/data/train" +solver_mode: CPU diff --git a/examples/hdf5_classification/train_val.prototxt b/examples/hdf5_classification/train_val.prototxt new file mode 100644 index 00000000000..b55b6644b17 --- /dev/null +++ b/examples/hdf5_classification/train_val.prototxt @@ -0,0 +1,59 @@ +name: "LogisticRegressionNet" +layers { + name: "data" + type: HDF5_DATA + top: "data" + top: "label" + hdf5_data_param { + source: "examples/hdf5_classification/data/train.txt" + batch_size: 10 + } + include: { phase: TRAIN } +} +layers { + name: "data" + type: HDF5_DATA + top: "data" + top: "label" + hdf5_data_param { + source: "examples/hdf5_classification/data/test.txt" + batch_size: 10 + } + include: { phase: TEST } +} +layers { + name: "fc1" + type: INNER_PRODUCT + bottom: "data" + top: "fc1" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "fc1" + bottom: "label" + top: "loss" +} +layers { + name: "accuracy" + type: ACCURACY + bottom: "fc1" + bottom: "label" + top: "accuracy" + include: { phase: TEST } +} From a8570017758a29da1c8a2187d9561790d97c6425 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 4 Sep 2014 11:43:41 -0700 Subject: [PATCH 0678/2053] fix fine-tuning example: paths, test acc., and total fine-tuning time --- examples/finetune_flickr_style/readme.md | 65 ++++++++++--------- .../finetune_flickr_style/train_val.prototxt | 2 +- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/examples/finetune_flickr_style/readme.md b/examples/finetune_flickr_style/readme.md index dad45aeb560..4220102e7f7 100644 --- a/examples/finetune_flickr_style/readme.md +++ b/examples/finetune_flickr_style/readme.md @@ -60,7 +60,7 @@ We'll also need the ImageNet-trained model, which you can obtain by running `./s Now we can train! (You can fine-tune in CPU mode by leaving out the `-gpu` flag.) - caffe % ./build/tools/caffe train -solver models/finetune_flickr_style/flickr_style_solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel -gpu 0 + caffe % ./build/tools/caffe train -solver models/finetune_flickr_style/solver.prototxt -weights models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel -gpu 0 [...] @@ -72,77 +72,78 @@ Now we can train! (You can fine-tune in CPU mode by leaving out the `-gpu` flag. I0828 22:17:48.338963 11510 solver.cpp:165] Solving FlickrStyleCaffeNet I0828 22:17:48.339010 11510 solver.cpp:251] Iteration 0, Testing net (#0) - I0828 22:18:14.313817 11510 solver.cpp:302] Test net output #0: accuracy = 0.0416 - I0828 22:18:14.476822 11510 solver.cpp:195] Iteration 0, loss = 3.75717 + I0828 22:18:14.313817 11510 solver.cpp:302] Test net output #0: accuracy = 0.0308 + I0828 22:18:14.476822 11510 solver.cpp:195] Iteration 0, loss = 3.78589 I0828 22:18:14.476878 11510 solver.cpp:397] Iteration 0, lr = 0.001 - I0828 22:18:19.700408 11510 solver.cpp:195] Iteration 20, loss = 3.1689 + I0828 22:18:19.700408 11510 solver.cpp:195] Iteration 20, loss = 3.25728 I0828 22:18:19.700461 11510 solver.cpp:397] Iteration 20, lr = 0.001 - I0828 22:18:24.924685 11510 solver.cpp:195] Iteration 40, loss = 2.3549 + I0828 22:18:24.924685 11510 solver.cpp:195] Iteration 40, loss = 2.18531 I0828 22:18:24.924741 11510 solver.cpp:397] Iteration 40, lr = 0.001 - I0828 22:18:30.114858 11510 solver.cpp:195] Iteration 60, loss = 2.74191 + I0828 22:18:30.114858 11510 solver.cpp:195] Iteration 60, loss = 2.4915 I0828 22:18:30.114910 11510 solver.cpp:397] Iteration 60, lr = 0.001 - I0828 22:18:35.328071 11510 solver.cpp:195] Iteration 80, loss = 1.9147 + I0828 22:18:35.328071 11510 solver.cpp:195] Iteration 80, loss = 2.04539 I0828 22:18:35.328127 11510 solver.cpp:397] Iteration 80, lr = 0.001 - I0828 22:18:40.588317 11510 solver.cpp:195] Iteration 100, loss = 1.81419 + I0828 22:18:40.588317 11510 solver.cpp:195] Iteration 100, loss = 2.1924 I0828 22:18:40.588373 11510 solver.cpp:397] Iteration 100, lr = 0.001 - I0828 22:18:46.171576 11510 solver.cpp:195] Iteration 120, loss = 2.02105 + I0828 22:18:46.171576 11510 solver.cpp:195] Iteration 120, loss = 2.25107 I0828 22:18:46.171669 11510 solver.cpp:397] Iteration 120, lr = 0.001 - I0828 22:18:51.757809 11510 solver.cpp:195] Iteration 140, loss = 1.49083 + I0828 22:18:51.757809 11510 solver.cpp:195] Iteration 140, loss = 1.355 I0828 22:18:51.757863 11510 solver.cpp:397] Iteration 140, lr = 0.001 - I0828 22:18:57.345080 11510 solver.cpp:195] Iteration 160, loss = 1.35319 + I0828 22:18:57.345080 11510 solver.cpp:195] Iteration 160, loss = 1.40815 I0828 22:18:57.345135 11510 solver.cpp:397] Iteration 160, lr = 0.001 - I0828 22:19:02.928794 11510 solver.cpp:195] Iteration 180, loss = 1.11658 + I0828 22:19:02.928794 11510 solver.cpp:195] Iteration 180, loss = 1.6558 I0828 22:19:02.928850 11510 solver.cpp:397] Iteration 180, lr = 0.001 - I0828 22:19:08.514497 11510 solver.cpp:195] Iteration 200, loss = 1.08851 + I0828 22:19:08.514497 11510 solver.cpp:195] Iteration 200, loss = 0.88126 I0828 22:19:08.514552 11510 solver.cpp:397] Iteration 200, lr = 0.001 [...] - I0828 22:22:40.789010 11510 solver.cpp:195] Iteration 960, loss = 0.0844627 + I0828 22:22:40.789010 11510 solver.cpp:195] Iteration 960, loss = 0.112586 I0828 22:22:40.789175 11510 solver.cpp:397] Iteration 960, lr = 0.001 - I0828 22:22:46.376626 11510 solver.cpp:195] Iteration 980, loss = 0.0110937 + I0828 22:22:46.376626 11510 solver.cpp:195] Iteration 980, loss = 0.0959077 I0828 22:22:46.376682 11510 solver.cpp:397] Iteration 980, lr = 0.001 I0828 22:22:51.687258 11510 solver.cpp:251] Iteration 1000, Testing net (#0) - I0828 22:23:17.438894 11510 solver.cpp:302] Test net output #0: accuracy = 1 + I0828 22:23:17.438894 11510 solver.cpp:302] Test net output #0: accuracy = 0.2356 -Note how rapidly the loss went down. Although the 100% accuracy is optimistic, it is evidence the model is learning quickly and well. +Note how rapidly the loss went down. Although the 23.5% accuracy is only modest, it was achieved in only 1000, and evidence that the model is starting to learn quickly and well. +Once the model is fully fine-tuned on the whole training set over 100,000 iterations the final validation accuracy is 91.64%. This takes ~7 hours in Caffe on a K40 GPU. For comparison, here is how the loss goes down when we do not start with a pre-trained model: I0828 22:24:18.624004 12919 solver.cpp:165] Solving FlickrStyleCaffeNet I0828 22:24:18.624099 12919 solver.cpp:251] Iteration 0, Testing net (#0) - I0828 22:24:44.520992 12919 solver.cpp:302] Test net output #0: accuracy = 0.045 - I0828 22:24:44.676905 12919 solver.cpp:195] Iteration 0, loss = 3.33111 + I0828 22:24:44.520992 12919 solver.cpp:302] Test net output #0: accuracy = 0.0366 + I0828 22:24:44.676905 12919 solver.cpp:195] Iteration 0, loss = 3.47942 I0828 22:24:44.677120 12919 solver.cpp:397] Iteration 0, lr = 0.001 - I0828 22:24:50.152454 12919 solver.cpp:195] Iteration 20, loss = 2.98133 + I0828 22:24:50.152454 12919 solver.cpp:195] Iteration 20, loss = 2.99694 I0828 22:24:50.152509 12919 solver.cpp:397] Iteration 20, lr = 0.001 - I0828 22:24:55.736256 12919 solver.cpp:195] Iteration 40, loss = 3.02124 + I0828 22:24:55.736256 12919 solver.cpp:195] Iteration 40, loss = 3.0498 I0828 22:24:55.736311 12919 solver.cpp:397] Iteration 40, lr = 0.001 - I0828 22:25:01.316514 12919 solver.cpp:195] Iteration 60, loss = 2.99509 + I0828 22:25:01.316514 12919 solver.cpp:195] Iteration 60, loss = 2.99549 I0828 22:25:01.316567 12919 solver.cpp:397] Iteration 60, lr = 0.001 - I0828 22:25:06.899554 12919 solver.cpp:195] Iteration 80, loss = 2.9928 + I0828 22:25:06.899554 12919 solver.cpp:195] Iteration 80, loss = 3.00573 I0828 22:25:06.899610 12919 solver.cpp:397] Iteration 80, lr = 0.001 - I0828 22:25:12.484624 12919 solver.cpp:195] Iteration 100, loss = 2.99072 + I0828 22:25:12.484624 12919 solver.cpp:195] Iteration 100, loss = 2.99094 I0828 22:25:12.484678 12919 solver.cpp:397] Iteration 100, lr = 0.001 - I0828 22:25:18.069056 12919 solver.cpp:195] Iteration 120, loss = 3.01816 + I0828 22:25:18.069056 12919 solver.cpp:195] Iteration 120, loss = 3.01616 I0828 22:25:18.069149 12919 solver.cpp:397] Iteration 120, lr = 0.001 - I0828 22:25:23.650928 12919 solver.cpp:195] Iteration 140, loss = 2.9694 + I0828 22:25:23.650928 12919 solver.cpp:195] Iteration 140, loss = 2.98786 I0828 22:25:23.650984 12919 solver.cpp:397] Iteration 140, lr = 0.001 - I0828 22:25:29.235535 12919 solver.cpp:195] Iteration 160, loss = 3.00383 + I0828 22:25:29.235535 12919 solver.cpp:195] Iteration 160, loss = 3.00724 I0828 22:25:29.235589 12919 solver.cpp:397] Iteration 160, lr = 0.001 - I0828 22:25:34.816898 12919 solver.cpp:195] Iteration 180, loss = 2.99802 + I0828 22:25:34.816898 12919 solver.cpp:195] Iteration 180, loss = 3.00099 I0828 22:25:34.816953 12919 solver.cpp:397] Iteration 180, lr = 0.001 - I0828 22:25:40.396656 12919 solver.cpp:195] Iteration 200, loss = 2.99769 + I0828 22:25:40.396656 12919 solver.cpp:195] Iteration 200, loss = 2.99848 I0828 22:25:40.396711 12919 solver.cpp:397] Iteration 200, lr = 0.001 [...] - I0828 22:29:12.539094 12919 solver.cpp:195] Iteration 960, loss = 2.99314 + I0828 22:29:12.539094 12919 solver.cpp:195] Iteration 960, loss = 2.99203 I0828 22:29:12.539258 12919 solver.cpp:397] Iteration 960, lr = 0.001 - I0828 22:29:18.123092 12919 solver.cpp:195] Iteration 980, loss = 2.99503 + I0828 22:29:18.123092 12919 solver.cpp:195] Iteration 980, loss = 2.99345 I0828 22:29:18.123147 12919 solver.cpp:397] Iteration 980, lr = 0.001 I0828 22:29:23.432059 12919 solver.cpp:251] Iteration 1000, Testing net (#0) - I0828 22:29:49.409044 12919 solver.cpp:302] Test net output #0: accuracy = 0.0624 + I0828 22:29:49.409044 12919 solver.cpp:302] Test net output #0: accuracy = 0.0572 This model is only beginning to learn. diff --git a/models/finetune_flickr_style/train_val.prototxt b/models/finetune_flickr_style/train_val.prototxt index 46a198a8d89..7155c492360 100644 --- a/models/finetune_flickr_style/train_val.prototxt +++ b/models/finetune_flickr_style/train_val.prototxt @@ -23,7 +23,7 @@ layers { top: "data" top: "label" image_data_param { - source: "data/flickr_style/train.txt" + source: "data/flickr_style/test.txt" batch_size: 50 new_height: 256 new_width: 256 From f748aee3ec0892fe2b9a4e6aae07ea99f03f0baa Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 4 Sep 2014 12:54:48 -0700 Subject: [PATCH 0679/2053] [fix] stop cloc complaint about cu type --- caffe.cloc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/caffe.cloc b/caffe.cloc index 37a98bf524c..a36ab619113 100644 --- a/caffe.cloc +++ b/caffe.cloc @@ -27,7 +27,7 @@ C/C++ Header extension h extension hh extension hpp -Cuda +CUDA filter remove_matches ^\s*// filter remove_inline //.*$ filter call_regexp_common C @@ -50,4 +50,4 @@ make filename Makefile filename gnumakefile filename makefile - script_exe make \ No newline at end of file + script_exe make From b5b02dc3be416459bf384978f5234f1826b6c7d0 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 4 Sep 2014 15:40:04 -0700 Subject: [PATCH 0680/2053] [docs] fix formatting and other errors in loss & solver --- docs/tutorial/loss.md | 48 ++++++++++++++++++----------------------- docs/tutorial/solver.md | 8 +++---- 2 files changed, 25 insertions(+), 31 deletions(-) diff --git a/docs/tutorial/loss.md b/docs/tutorial/loss.md index 8c053ed60ab..3591858ad31 100644 --- a/docs/tutorial/loss.md +++ b/docs/tutorial/loss.md @@ -11,17 +11,15 @@ Each layer takes a set of input (`bottom`) blobs and produces a set of output (` Some of these layers' outputs may be used in the loss function. A typical choice of loss function for one-versus-all classification tasks is the `SOFTMAX_LOSS` function, used in a network definition as follows, for example: -``` -layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "pred" - bottom: "label" - top: "loss" -} -``` - -In a `SOFTMAX_LOSS` function, the `top` blob is a scalar (dimensions $1 \times 1 \times 1 \times 1$) which averages the loss (computed from predicted labels `pred` and actuals labels `label`) over the entire mini-batch. + layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "pred" + bottom: "label" + top: "loss" + } + +In a `SOFTMAX_LOSS` function, the `top` blob is a scalar (dimensions $$1 \times 1 \times 1 \times 1$$) which averages the loss (computed from predicted labels `pred` and actuals labels `label`) over the entire mini-batch. ### Loss weights @@ -32,25 +30,21 @@ However, any layer can be used as a loss by adding a field `loss_weight: <float> Layers with the suffix `_LOSS` have an implicit `loss_weight: 1` for the first `top` blob (and `loss_weight: 0` for any additional `top`s); other layers have an implicit `loss_weight: 0` for all `top`s. So, the above `SOFTMAX_LOSS` layer could be equivalently written as: -``` -layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "pred" - bottom: "label" - top: "loss" - loss_weight: 1 -} -``` + layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "pred" + bottom: "label" + top: "loss" + loss_weight: 1 + } However, *any* layer able to backpropagate may be given a non-zero `loss_weight`, allowing one to, for example, regularize the activations produced by some intermediate layer(s) of the network if desired. For non-singleton outputs with an associated non-zero loss, the loss is computed simply by summing over all entries of the blob. The final loss in Caffe, then, is computed by summing the total weighted loss over the network, as in the following pseudo-code: -``` -loss := 0 -for layer in layers: - for top, loss_weight in layer.tops, layer.loss_weights: - loss += loss_weight * sum(top) -``` + loss := 0 + for layer in layers: + for top, loss_weight in layer.tops, layer.loss_weights: + loss += loss_weight * sum(top) diff --git a/docs/tutorial/solver.md b/docs/tutorial/solver.md index f5156ee0aa9..d90470c467b 100644 --- a/docs/tutorial/solver.md +++ b/docs/tutorial/solver.md @@ -39,7 +39,7 @@ $$L(W) \approx \frac{1}{N} \sum_i^N f_W\left(X^{(i)}\right) + \lambda r(W)$$ The model computes $$f_W$$ in the forward pass and the gradient $$\nabla f_W$$ in the backward pass. -The parameter update $$\Delta W$$ is formed by the solver from the error gradient $$\nabla f_W$$, the regularization gradient $$r(W)$$, and other particulars to each method. +The parameter update $$\Delta W$$ is formed by the solver from the error gradient $$\nabla f_W$$, the regularization gradient $$\nabla r(W)$$, and other particulars to each method. ### SGD @@ -111,9 +111,9 @@ the update formulas proposed by [1] are as follows, specified for each component $$ (W_{t+1})_i = -(W_t)_i + -\frac{\alpha}{ - \sqrt{\sum_{t'=1}^{t} \left( \nabla L(W) \right)_{t',i}^2} +(W_t)_i - \alpha +\frac{\left( \nabla L(W_t) \right)_{i}}{ + \sqrt{\sum_{t'=1}^{t} \left( \nabla L(W_{t'}) \right)_i^2} } $$ From 51dd4b2628cef4891992ddebf4728818425351dc Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Fri, 5 Sep 2014 01:08:01 +0100 Subject: [PATCH 0681/2053] added a two-layer network that gets higher accuracy --- examples/hdf5_classification.ipynb | 847 +++++++++++++----- examples/hdf5_classification/solver2.prototxt | 14 + .../hdf5_classification/train_val2.prototxt | 86 ++ 3 files changed, 744 insertions(+), 203 deletions(-) create mode 100644 examples/hdf5_classification/solver2.prototxt create mode 100644 examples/hdf5_classification/train_val2.prototxt diff --git a/examples/hdf5_classification.ipynb b/examples/hdf5_classification.ipynb index 9232cb18455..2059e6ff3a6 100644 --- a/examples/hdf5_classification.ipynb +++ b/examples/hdf5_classification.ipynb @@ -1,8 +1,9 @@ { "metadata": { - "example_name": "Classification with HDF5 data", "description": "Use Caffe as a generic SGD optimizer to train logistic regression on non-image HDF5 data.", - "include_in_docs": true + "example_name": "Classification with HDF5 data", + "include_in_docs": true, + "signature": "sha256:c3b84add3bb83e91137f396a48f46d46bf7921b242fc42c58390b30806e5a028" }, "nbformat": 3, "nbformat_minor": 0, @@ -71,9 +72,9 @@ { "metadata": {}, "output_type": "display_data", - "png": "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\nEARhBvH/79EO0YiEt/4AAAAASUVORK5CYII=\n", + "png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAImCAYAAACB54oCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvWmMXOd57/mrfd+33vdmd7O5kyIpkRJJiZKdyLKvk2sp\nUZwBJmPMnQBBYCeTDJB44JkAjpMbw04ugmCQwcxFPiS5jpNJcm3HjmRbJEVRIsWdTfbC3pfa96pT\np6rONh+q2WKLpERKbC5S/YBGV51T55y36lSd83/f93n+DzRp0qRJkyZNmjRp0qRJkyZNmjRp0qRJ\nkyZNmjRp0qRJkyZNmjRp0qRJkyZNmjRp0qRJkyZNmjRp0qRJkyZNmjRp0uQTwHeBE8Cfv2+5Ffh/\ngJ8Bf/GgG9WkSZMmTZo0+XSwC/jr1cd/Bey5ad3vA88+8BY1adKkSZMmTR459Bu4733Aa6uPfwo8\nedO6Q8DngTeAlzawDU2aNGnSpEmTR5yNFCNeoLT6uLD6/Ab9wA+BF4H/HTBsYDuaNGnSpEmTJo8w\nGylGCoB79bEHyL9v3XGgAkwDkfdvPDIyogHNv0/R36FDhx56G5p/zfPe/Gue9+bfhv0d4w4Y77Ti\nPvA28J+A7wPPAf/1pnWngO3ABaAHSL5/4/HxcTRN28DmNXnU0Ol0zXP+kMgvLrJw/DiyKAKgN5lo\n37uX8Ojohh/7k3beU9eusXz6NKokAWC02eh+5hm83d0PuWWPFp+08/4gqBYKzL3xBpXk6i1Tp8M/\nMEDX009jMG7k7fz+oNPpDt1p3UaOjFwAqjSyaWTgLPBfVtf9KfBN4CTwf6+ub9KkyUNA0zTS4+Nr\nQgRAlSRS4+NINy1r8uFIokjy2rU1IQIgiyLpZueqyX2guLz8nhAB0DTy8/Prlz2mbLSU+ur7nv/2\n6v848JkNPnaTJk3uAlVRqJdKtyxXqlXkahWTzfYQWvV4IlerKPU6ZpcLnV6PVKmgShK1UglVljGY\nTA+7iU0eY+rl8i3LVElCqdcfQmvuL4/+uE6TJo8BqZTAzEyOcrlOW5uL3l4vNtvjceMxGI242tsR\ns9l1y60+HxaX6yG16vHE4nJB6yCTV6OIokRXZwd+TwV3S6gpRD6FFApVZmdzpNMVgkE7fX0+PB7r\nR96fIxRCp9ejqeraMpPDgfkT8DttipEmTT4mqZTAT386S6nU6J3MzeVIJgWefroLg2EjZ0LvH8GR\nEaq5HOV4HE1Vsfn9tO7ejf4xmId+lEikRN6dqLE8lkKqCFwfj7Pv2S0MbtnysJvW5AEjCHWOH18g\nHm+MZszN5VleLvLss704HOaPtE9XRwfBzZvJTU8j12qYHQ5aduzAHgjcz6Y/FJpXmiZNPibz8/k1\nIaJpGtVimWtnc/S0GOjoDWO0WD5w+2o+T3FlBblaxREO42prQ294sNnuNq+X3qNHqaTTa2LEbLc/\n0DZ8EpiezqIYbIS2jCIJAuh0ZGQPFdnE7frDqiwjJJPUBQGzw4EjEnng5/5eqFcqlFZWqObz2AMB\nXO3tH/r9/rQSi5VJJNZPq8TjZRIJgb6+uxcjkihSWFqiuLyM2enE292Nf3AQpVrF7HRi8/nud9Mf\nCk0x0qTJx6RSeS9YsRSNUlhaQqeqJAYMKEsTdB44cMcbeyWTYf6NN9amSPQmE607d9KyY8cDafvN\nGM1m3G1tD/y4nyQEYTWDxmzGaG7ccFR01OvKLa9VZJmVM2fITE6iShIGs5nA0BDtTzzxSI5ISaLI\n4ptvUlhcBE1Dp9fjHxig88CB5hTUbahWZd4fs6xpjeV3i1yrsfDmm8z9/OeUYzH0BgORbdvoOXKE\n8JYtj7RwvVcejzHkJk0+AE3TiMVKXL6cYGIiTaFQfaDHb2tzodfrqAsCxeVl1LqEL+TGplXIz81R\nWFi447bZ6el1sRo3sliq+fwdt2ny6NLZ6UanW7/M47Hg8906LlKOxchMTKxl3ij1OumJCcrx+Npr\n8nmR8fEUly8n1ob7HxallZU1IQKgqSq52dl17W3yHoGADYtlvViwWo34/XcfEF6Ox4lfvIiYTqM5\nfBQ1J7PXFsnHM1TS6fvd5IfKoye/m9zCxMQEb7zxBg6Hgy984Qt4PJ6H3aRHiomJNGfOrFCrNXqf\nfr+Nw4d7CAYfzDRDd7eH0dEQV8+V0etUgh1+9uxpQytFAaikUjAycttt3x80Co2MDEkUsXq9t9mi\nyaNMX5+PTKbCwkIBWVbxeKzs3duOxXLrpbZWKKDK63vJqiRRKxYBSCYFjh2bI5+vAWCzGdm3r51N\nm4Ib/0ZuQ61U4v1dfVWWkSqVh9KeR52WFie7drUyNpZEFGVsNiNbtoSJRBx3vQ9JEKiXSlQNLqYn\nMohCo6Nl37SCobWXwVvsQh9fmmLkEaZcLvO1r32NH/zgB3zuc58jm83ye7/3e/zd3/0dzz333MNu\n3iOBINS5fDmxJkQAslmRyck0wWDXA2mD2Wxk//4OulvNRLtVzHIZtbiCXGvcRKwfMKfrbG2luLS0\nbpnJbr8liyWTqSCKMk6nGa/XSiolMDubo1Sq097uoqfn8cneeRQQRYlsVsRg0BMM2jEa788gsc1m\n4uDBbkZGKkiSis9nveN5MTmdKKpGJiWQzYoYTQYirS5MjsbNanw8tSZEGm2WuXw5QWen56Gca5vf\nj85gQFPe+60ZzGYsbvcHbPXpRafTsXVrhM5OD5WKhMNhuqtMmuXlInNzOSRJpT9kwuz2Eb0YRxSq\naIDeaEJUjVy5lqFvtPuxCZL/MJpi5BElm83yi7/4iwwODjI1NYV79Qd/7NgxvvSlL/HDH/6Qffv2\nPeRWPnwEQbrtHGwq9WB7azqdjtbuMLpCnOJCEc3jQdM0zC7XBzpv+vv7KcdilKJRNEXB7HTSumsX\nZqcTAEVRuXgxzvh4mlpNxm43MTgYIB4vEY3eiNLPkUg8Xtk7D5N4vMTbby+Ty1XR63V0dLjZv78d\np/P+BGLq9TpCoQ/v/bpaW7F09mOUVvA5FAr5KiWDn6rB1TCiS9/6HRZFmUpFeihixNXWRnB4mMzU\nVCPGxWIhNDqKIxx+4G15nPB6rXi9d5fOOzeX48SJBWRZJeQzkdAUvJuGCMymyefK1GQdbTt3sJAx\nokoCu5YK9PQ0A1ibbBDVapUXX3yR/fv3893vfhfdTZPQhw8f5q//+q959dVXuXLlCvZPecaDy2XG\n4TCtGxkBaG11PvC2aIqCUq2Sm5+nkkph8/kawavOO7fF4nLR++yzCIkEiiRh8/mw+f1r65NJgfhy\nFodNj6LoKZXqvP76DMPD7w3VaxosLOQZGQkSiTz49/04IUkK774bXSdWZ2dz+HxWdu9+sMG7ialZ\nZs9eoxJbAU2lbcc2TIPbmZgu0NLhp6XFSSaz3gHX4TDjdDYCY+VaDZ1e/8CCRw0mEx379uHr7UUS\nxUb2TziMTt8UwPcDTdMYH09Tryt0hw3kLr/DlFile7iNLZ85xODzR5ldqrCSN7AYk+jyGZiayhAK\nOT5yqvCjRFOMPGJomsZXvvIVuru7bxEiN/jiF7/I97//fb75zW/yzW9+8yG08tHBZjOxc2cr77yz\njCBI6HQQDjvYtOnB592XYjFS165hslrxdHYCkJ6YwNPdjaulZd1rVVVjfj7P7GwOaMQadPd41o1s\n1IpFlk69Teb0OEablbaREbIWP1NTGSRJQa/XoaqNOXxJUpGkWzM2mqynUKiRz98a4Ly4WGDXrtbb\n/t42gmqxyNKZd1mZT6EoJgwGHZl3phj2tKP6G9+d4eEgqZRAKlVB08DpNLN9e4TEcobFsxfJLywQ\nCLnoe2IroeHhB5KBozcacTUzrjYERdGoVCTcbgu1lUmcdiOVXIbZ164S6Qpj3bSduNzC2GySlhYn\nw8MBYrEy+Xz1nsRINisyPZ0lk6kQiTjp7/94Rmz3i6YYecT4y7/8SyYmJnjzzTc/8ML4p3/6p+zY\nsYOvfvWrhEKhB9jCR4/+fj9er5VMRsRk0hMOP5yegpBMUo7FUCSp0WO1WDA7HNTy+VvEyNRUhlOn\nllAUFb/PwtyVLGrBTddQB0arDTSV5dOniV++QmIxg8moJ7eSYOizzxOJODCZDGu1TqrFIk4LGMQ8\n9bLhA0di7oVsVqRUqmE2GwiFHPctruJhYrEYMJkMiOL6qT2n04ymqgjpNKosY/P779kGX0gmqWQy\n6I1GnC0tH+heWy8W0ctVfF4r4uo0o6pqlGIxtj2xDUkUsShlDh9oI1tSkWWVYNBOJlPh0msnmHn7\nIgBzBh2lZIpt6HH2DKyNmtwtqqqh16+/zlQLhbXvsSMcxhn5BEVJ3kc0TSObFRHFRjaU12u758//\nZoxGPZ2dboSigM9sR1xJomllpGqO0myeYiLDs7/+P9PZ5cVo1JPP1zAYdJjNd5/eWyxWOXZsfm0K\ncGmpSCxW4tlnex96zFlTjDxCXL16lT/6oz/i7bffxvYhF8LOzk5eeeUVvvOd7/Ctb33rAbXw0SUQ\nsBMIPLwpK7lWo5rLUVxepl4uU4pGMVqteHt66D50CEWWG+l5gNnjY2oqjcmkp7/LjjB1iYXJWWJG\njatBP6GdT+AJulg8O0mhUKNalciJMj6fSmF+lr17D+B2WyiX6+SWY+iELEPbwyTfOUHB7ab7mWc+\nthHSxESac+eiCIKEyaSnt9fH/v0dWK2P9yXD5bIwNBTg/PkYitIQczabkS2bXMwfO9ZIzZZlrF4v\nHfv3425vv6v9ZqeniZ47h95kQgfk5+dp27173ZTbzRgsFopllWRKYGmpiKZptLW52T3Uht9QZvrH\nJ6iVShhX4zLCo6OIVZmVmSip6QW8kQAmqxmhKDBxLYlifRfdkAmbzcSOHS0f2tNdWMgzMZGmXK7T\n1eVhaCiI221BSKVYOH58LcvLaLXSvm8fwaGhu/+QPwUsLOR54415ZmezuFwWXC4zNpuJzZtDa5/l\nR2Fk0MPUzy+Tu3KGzPXrmOx2WreMsHjyJHazjUoqQb3eQi5XRaeDwcHQPWUNxmLlW2KRbpizPezY\nk8f7yvIJolar8eUvf5k/+ZM/YWBg4K62+d3f/V3279/PN77xDazWhz/M9mmmHIshVSr4+vsZ/6d/\nQlMU6oJA6969VAsFrv/bv1FdvcCbfQE6gwM4xSzK5CLR4ycIdLYRT9epFgVqdQ1h226uXEngsEIk\n4qRalbFajXR1uhl9oh2bzURLyErsShFjVUYrRZGrVWRRJDs9TfsTT3zk95LLiVy4EFsz8JIklevX\nM7S1uR7K9JemaSiKitF4fwyetm6N4PFYWVwsYLEY6OvzocWmyc3MrL1GzGRYefdd7MHghzqMSqJI\nYmwMg9lM7Pz5hjmVyYSQSDD8S790W8M72exC8bZhNEZpa3NRryt4W4KEejuJnn4bSRRRjHakmkp8\nfAqb34/qCKAzGOgeaid7fRoxtoQnGMHpa0eSFCRBYnGxSL2u8OyzvXcMZo5Gixw/vrAW+J3JiOTz\nVY4c6SU9MbEu3VyuVklcuYK7s7PpyLtKLFbihz+c4t13o2QyFVKpCrt3t9La6sLlMlMu1zl8uOcj\nTflVY4uULr9DdmqKxOXLmB0OzHYbvc89R2lpiVDEic0VJJ+v0d7uprvbs+44xWKVcrmOwaAnELDd\n8pu5XbC/qmrU6+otyx80Gy1GvgvsBs6zvoLv/wH8ByAH/PfV132q+fa3v01HRwe/8Ru/cdfb9Pf3\ns2vXLr7//e/z67/+6xvYuk8XN6Y/7nQxqddlFhYKLC0VsdmM9PX5oFRCEkVcHR1s+tznqGQyOEIh\nfAMDxM+fR6pU1kYrtHqV0oWTZLIy9eUZ5FSM5YUZHJ09VBJVbAaJ6sBWRIMLtZQhkSgzMtIotCZa\ngxw/Ps/gYJAWt0I8Po10U7l6aEwXfBzK5Trl8voqoJoGiUR5w8TIwkKehYWG0Vt3t5eursZFdmmp\nwPh4mmKxRlubi5GRID7fx6sibDTq6evzNc7bKpNnlm55Xa1QoFYoYPyQbJG6IKA3GklcukQllUJn\nMCAJAotvvUV461Zatm+/ZZtisYbo7WXkRT/lWAyLy4nB30ohJyBV6wh1A3MnTlFOZXGGfJjcXoZf\neBa/18T4+Bjz71wAIJe/xJYjT9B24ItcjTfOWTxeJpcTCQZvn9EzN5e/5aa0slIina40PHHeh1yp\nIFUqTTGyyvx8nkxGRJZVSqU6mgYTExn6+nwUizUURSOXE/H77/7zUmWZ3Ows8UuXWD59muzUFHK9\nTmllhVqpxPN/9mcUlqMEOloY7Lt9zM7SUoGzZ6NcvpxAUTR27Gjh8OGedSZroZADs9mwzhHYbjfd\n1pTvQbORYmQX4ACeAf4K2AOcXV2nAb8L/GwDj//YMD8/z3e/+13Onj17z2r6N3/zN/n2t7/dFCP3\nAblWIzM1RW5mBp3RSHBoCF9f3y2WyxcuxLlyJbkWPDo3l+OZ7bZGXZp8nvz8PEabjdz8PM7WVkrR\n6Lrher3RSOn6VZxtg8gBD+kzGSqlCkanE01vI70Uw6PUMfaM0uvMYhyfp26w4uwaYKlkR6iUiMcF\nnjnQjq2jB7FYwaRVqRfyaIqCYzWGqC4IjV6uToc9ELjrGAiz2YDFYrzlhvVRh57vhp//fA5JavTO\nZmZyPPVUJ16vlePHF9bs9rNZkVxO5OjRvtuaiH0cbhdnYzCbMdxF3RWzw4HF7aa4uEhhaQmj1Yoj\nEsHm9VJYXLytGLFYDBQFlYxkxxYcpqSoiAmZrlYbdYudq//6I4qxhqgsp7NMvH6c8OhmXEoBg8VK\n+3A39Wyq0VM2q2i69zLKzGYDmsZqYKMJk2n99/fG53wzqtoYfXK2tNzi7Gl2OjE77t6o65OOJCmY\nTPp1sTaSpGAw6HA4zMiyes/X8VI0SnpyEnQ60hMToGkYbXZURUWuSYj5Aj1HP0PVePs4JFGUuHAh\nxg9/OIVOp6OtzcXERAqv18Kzz/atva611cnu3Q0jtmq1YRWwY0fLXaWibzQbKUb2Aa+tPv4p8CTv\niRGAP6UxMvK/Apc2sB2PPF/96lf52te+Rk9Pzz1v++KLL/KVr3yF+fn5j7R9k/eIX7pE4tKlNZfJ\nSjKJpmkEN21ae82NSPQbQgSgXJZIVrwEOjqwuFzkZ2eplUpYvV5MdjuOcBjTzdNomoZBr8Pv0mNq\n6yV/OYRxJY5Jp6K3WbD1DZGLpynWPRT9I2z+wlauTeXJ13WEK40bjt1u4tpkjnzcTGJiAX/AzrbN\n3biMVfyDg5TjcZZOnaKSyaDT6XCEw3QeOHBX1T1DIQf9/T7Gx9Nr7zMUstPdvXHOvzffICVJZW6u\nkW57c90faPT6U6kKHR3312grMDREaWVlzU1Up9cT2LQJ6x3cjrPZ90zN9AYD9VIJIZVCzGbRG43I\n1Srujo47BhMHgw4GBnxcu5ZeG4UKBu209LUzMzuxJkQAbB4nZVGlGE9iMUJri4OsaEEy+VEUlWw0\nRY9SxWSyYzYbCAbtnDy52DDashvZvj1Cb997572ry8PMTHYtZgbA57MSCNhRbcOUk8nGCImmYXI4\niGzffs/BvJ9kOjs9+P1p/H4bpVKNel2gp8eL12vDYNATiTjuylekVpPJ56vYbCbSU1Nc+fu/Z+ur\nr+IIh0ldvYrF48Xq89GycxeaBoo7wvj1EpH2wC1TcIIgMTaWxGw2MDDg59q1FMlkhWRSIBJxMjra\nGN27YcTW1dUwYnM6zbhcG9fJUGQZTVHuqpjiRooRLzC7+rgAjN607r8A/ycwAPy/NEZPPpWcOHGC\ny5cv873vfe8jbW8ymfjlX/5l/uEf/oHf//3fv8+t+/RQK5XIz86us7tWZZnM5CSBgYE1L4V6Xblt\nzzKeqrH1+X3MTcZxHwlSmJ/DYQPvwCCOngEu/9sxdJqC12vFYTQS3rKlEVdSyNN94CkKS0u42jvQ\nu/wkczKaScdnPjPAykqJ2ZUql8Yy+Owa1WQcf8CB19XBsWPLbNoUxNLeS14QmMzY+fwX92Fx25l9\n/fW1Hq6maZTjcZJjY/QcOvShn4Ver+OJJ9pobXWRSJRxucx0dnoeaPpfva5Sq92+B6+9v/rYfcDd\n1kbv0aPk5+ZQajXcHR14biPuazWZ8+djzM7mkGUVn8/Gnk1mZFGk58gRpv/935HKZVRFQanXCQwO\nAo1pmeXlIoJQJxx2rAVcd3a6yWZFuro8bNkSxuOx4uvtJTLUR61QwOJyYPIFKYgG9HodznCEWqFA\nPdc4tzpNw+v3U81l6WgL4fbaGRtLItVlyvE4QjLJ/LsOPv/L2wi1+dGbTHR2etmzp42JifSaoNqz\np60RnGz103/0KEIy2cgqCgQ+EeXp7yednW5GRoIUizUcDhNPPtnB3r3tqKqG02lmdDR825GRVEog\nGi2h04HRaGBysjH92NXlxnDpKkIiQfb6dUa/9CXig4PUhQqRbVup12ScXX1cy9qQlMb00PvFiMmk\nQ9MaU5xvv73M0lKjpIBer+PkyUWCQfs6DyKPx7qhv2dVlslMTZGenESVZbzd3YRGRz9wm40UIwXg\nRvfFA9xc+Su3+n/6g3bw1a9+Fe9qfY7h4WH279+/1vufn58HeKyfa5rG17/+db7xjW8Qi8U+8v5+\n5Vd+hT/+4z/m5ZdffqTe30d5/rDQFAVVuU1lVUlC0zRuXFq8Xisej+UWh9feXg8zMwVOnUmjKEbc\n/i0IZgNyyU6hUMWxZT/FxQXKFiMDmzbT/oSD6NmzJK9cIXHlCr7ubmShTPStt4ns3MHAoaMIkkQc\nFaNOYfeQjQuvvwNeGy3uThYmNKxGI9msSDpdxWAwouWhKGqYjI3pGZ1ej85gIJsqkkwK2NIKcssQ\n7V2BD03jM5uNt8RVPEjcbvPqZ5pdJ/58Pus9FRq7F1wtLbekYMP63t3iYoF4vIzFYqBWU4jHyyzZ\n9KixOFKpROuOHeTn59dGFBRJolCocvz4PJmMiCSp+P1WNK0RKGww6LHbTVQqEhcuxKlU6nS3+ujZ\nu5Pk/ArZgkKhqDC0vZNQbycWp4Pwli3Uy2UkQcAWCNC6cyeKWmV0Z4DllIKiaJQTCfJzc2iqRjyb\nZeJtyNtFbH4/FpeL4b17GRjwU63KeDxWjEY91UKBermMyW7H19d3m0/o8eCGYL1fbsSaprGwUGB2\ntvFd9HgaI3b9/T6MRgP1uoSiaASDNsJh521tBZaXixw/Po8gSIRCds6fj2GxGAmHHRTyVQIGA9Vi\niav/7b8x8h//I672dmqCgKbX0/3cUaaFAMl0mS1bwredovR4bOzb186VK8k1IWIy6Wlvd6FpjRHF\nB2mImJ2ZYentt9dKB8RzOeTqBxcw3Ugx8jbwn4DvA88B//WmdS6gBAQ/qA1//ud/fsedv39K4nF8\n/tprr5FKpfjyl7+M4X1xCfeyv2eeeYZXX311XSDjo/D+Ps7zj4okNW4Q+XwVl8tMa6vrruILLB4P\nzpaWdRkV6HT43xczYrUa2bOnjfHxNIJQRxAkOjrcdHa6+elP55Dlxo2zUKhRqdS5eDHO9u0tzOUs\nOFu3UAOWSzaeGG6l97nnEDMZrD4f5ViM6PnzBAZ66dy1g8LlMyyPLyCIJvr27sYcNGO37OPs6SWi\neQO9I17Ks0mWlmREUcFg0CMIEvl8lUjQgzncTiEnkc+LVC0uarpl9JqZS2Np4qkaBw50PTCDr7uh\no8NNItGwtw+HHWzb1oLPZ2Xfvg6uXUtSrSr4fFZ27Wq9bx4y1apMLFaiXK7j89loaXGu81JZ17tT\nFDybt3PuUoUrY2nsdhObNgUaQYyyAZsGC8ePo9br2INBVFluVOV1OlE7zKhqY2rN4TBht5v44Q+v\n097uIhCw43ZbeOedZQqFGkcOtjB35hpGnQ2r3YpbEnBuGcE1sgXVZMdgMq1NuaFp6PR6asUiJocD\nu8uOPtMYlRESCbTVKTZVqmNyuBDECm67ndzsLCabjc6nnsLhMKNpGsmrV0lcvoxUqWC0WgmPjhLZ\ntu2xcleVZZXp6SxTUxkURaW/38/QUOBjxxfNzuZ4881F6nUFVdUYH0/x9NNd2Gwm5ucbwcCplEip\n5OLixQRHjvQCGsViHbfbTDjsZGwsuZadBg1xYrMZ8fmsKPUaztY2/IObyF2f5No//RN9R48yePAg\n5mCEpaUCdau2VpDzTjz1VCc6HZw6tYSqarS2OhkY8KPTNaY+BaH+wPyXMlNT62oYARSWbg0Sv5mN\nFCMXgCpwYvXxWRrTM78N/BmwBdAD/9sGtuGR5lvf+hZf//rXbxEi94rBYOCll17iBz/4Ab/zO79z\nn1r3+KEoKmfPRhkfTyPLKnq9jt5eL0891fmhIwE6nY7W3btBa/QqdXo93p4eAjf5KyiKysREmvHx\nFOVyo/DVU0910NPjo1aTb0mPq9dVKpXGyIqqahSLjaJn2WzD4rteLhM9f57omTM4W1pwRiK0bNvG\ntX/8R2yBAJrBRm6mhFWp4Nv1FKd+dAZFbyFXL9EVNpLPVGjrCJJLFqkUBDYP9SFXq4h1D1diFq4c\nv0p0MYus6njm+RE6tnUzGZOoVPIMD9+bP8FG8/zzfWQyDafRQMCG2dy4NG3eHKK310u1KuNyme9b\neq8oSpw8ucjCQgFV1TAa9YyOhtizp22tR31z787iD3Dy51OcOFekKDXmvxcXC7zwwgA11UDftu3k\nJ66Rn58HnY7wli0UFhfxbN/HyZ9PcfnMHBYTuIMentjXzZM73FjtNiz1LJpYpRBLEewMoSXmuPiT\nt0gkKzx1eAiDz4WrpYXFrJ5AtMTQUBB/fz/FpaW1+Ba9yUR4dBSTzUZLC3i8VuKrM1l6mwOrx8/i\nUoGlqRTbTJ0MhDsorqwgiSImmw0hlSJ2/jyy2PheSoJA7MIF7OEw7sfIbXV6Ostbby2uxcKk0xVq\nNZknnrg7r5jboaoaExPptewTVVWx200sLxeZn89z7lwMWdbYtatlTZy+8UajU6IoGgaDjt5eH+/X\n/SaTgXq94ZpsqFXRTCqOoJ9KshGjlJubwxWJ0N7ejrWa5cCzT+Hz2z/w+2+3m9m3r5NkskIiIWCz\nGRFFiXSn7nLUAAAgAElEQVS6QiolMDOTZWDAz9at4bXf10agaRqaeu+pwhud2vvV9z3/7dX//8sG\nH/eR5+LFi1y/fp2XX375vuzvpZde4jvf+c6nWowkkwITE+m10QlV1ZidzdHT46W///bmUzdj83ob\noxW5HHqD4ZbgxaWlAqdPr6ztv15XuHIlSXu7G5vNRHu7a53VuNVqpL/fj16vQ6d7LxylpWW1CJ4k\nEd66ldjZs5RjMcxuN4nLl1ElCb07gN5gY+CJTqrlMgvLAunFODodmPwmpk/E2PHSZ6iJdWoLSbr6\nQkT0KYSpKhPydlay4B8cQmCFak1hoWAjrLqQ5dJqT2njrOMVRaVeV7BajXc9+mIyGWhpuX2mgM1m\nuu/ukDduJjfOiSw3hGZ3t2etHdlYBtXXjoU6stnB3PgMXoebck5B1RkQBInFxTyHD3fjsqmERkdx\nd3Y2RkUSCWyBAEvxGlePnUVI5ojFExitVnS1/ewcsmGXNMbPTOIaGCF+7RpP7T2EOL+Ex21BECTS\ny0l0eh1ipYZv37NrTp/ujg76X3iBwtISqizjbm/HtWrO5vPZOHy4F5sqsDSxgMUfQMkluXLsHLZw\nK5fOzCFtibBn1Id+taZNNZdbEyI30FSVarGEySfd03l8WCiKyuRkmmpVplaTMRoNWK1GZmZyjIyE\nPrIzqqqq69x6jUYDvb1ejh1bwG43oqqNjkY8XiaZFHA4zJw4EWuk4ht0KIrG3FyOgQE/fr+1EUzu\nMLN5c4iZmSxGnUo4YGXhBydQy3k6n38RGRNqPkFqchLfpk1E+toJhe/s5nszTqeZo0f7GBtLkkwK\nQCOOJJWqUK024p1umLNtFDqdDv/AAJVUap0ocbW2fuB2TdOzh8Rf/MVf8Fu/9VuY7lORq+eee45f\n+7VfI5fL4fuY7puPK+Vy/Zbg0hspjneLTqfDfgfXzIWFwpoQuUEmI5LJiLS1udi6NYIoykSjJQC2\njvgI2WssXo/h8tsRdE6sDiv9/avnR1UJDg4y+vLLZKancbW1YfV6kdq28tbbswjlIoHOVp48uhtE\nGy29bWjlHGoxjRLsIZ8uMuQv4/XnsDkMCCtlJmI25LSbd99N09XlITjQy+Jigflole2rvTuvd+Pi\nLhYW8oyNJSmX64RCdrZujTwSaYPvJ5er8v442FpNWRvJGh9P88aJGPlYGm/AyY6nWrHYzNTLZYaG\n+8jmJep1hUjEwchICL3iwdPZyfwbb1CMRtEbjQy+9AV+9m6cQl5ElhXMdhtisURybhHnnu0kz76N\nJ9yKzaxy6MXdpNIi+ZkcicU8Ho8Vf8BGqVTH4TTjclvX+YY4wuHbVsutFgrY6nmOHOmmuq+NN14f\n58p0DFukHZvPS61UYnkxz4EXtmFYrWVjtFjQ6fVrNw6j1UrV1cbJc3mkS5P4fDa2bQvfUSw+Ctyw\nZr96tTGlZzDoaG9343CYUJSPbuhlNBro7vasjWZCw/bdZjNiNhtxuy1YLEYiESfxeJn2dhcOhxmD\n4T3xpigaOp2OdFpkZiZLMGhn//4O9u/vIJ8rY1XjtIwOsZJW+enrk8Rmlgl1t/KZV49QXFwkNDJy\nT20OhRwcOdJLKiXwzjvLJJPC2miRpsHMTPaexYhcr1NJpVAVBZvP94GlDgD8g4Mo9TrZ69dRFQV3\nezstO3Z84DZNMfIQyGaz/PM//zMzN8cnfEzsdjvPPPMMP/nJT/jVX/3V+7bfxwmn03yLoY9er/vY\nJlk3uF1tFr1ex41pdbfbwpEjPWSzIjpVoXjtHOWJKG4ZKjmJSFc7gwefxupoDPM7wmEK0Si2PUfR\ndRykbtbhDli4/Ff/SmIpTSWVInp5HFmBz/xPLzF8cAfF5RWMlq0YLFYCXiPlyUuIK1GMlq2MT+So\nKXr279iPzyYj5nKU8mZAT1ubG0VRUVWVlhYnb7+9RDYrYreb6O310dvrxWQyUMlkUCWpkZZ8j+mc\niUSZEycW1nqShUKNQqHGCy/0P3JVRX0+K6JYJ5msUCrVcTrNdHa6cTjMxGIlzpxZoapaEIUqlZKI\nhIneLT2MX14hEHYTiugwGHQ88UQ7VqsJMNH/wgu4u7spzM9j8gXJiGaU8hK5dJl6qYTDacEf9hIM\n2PAFXaibt+Boa8NlUTlxReb82WV2DfYRX0wiywpGvUbIrad/ay8OTxV9OUlVtHJtPM3ERAa73cjw\ncIihoQA6nY7c3Bwrp09TK5XQGwwERjZj9EZo2+ekLlQQ4nHMbi/29k4Umw9RlLDZTDgiEVzt7RRX\n5/RVd4TT5zIYQjZM1trqeazywgv9j0RBtdtRqUiYzQZKpTqqCuVyjYWFAt3dHpLJ8pp4gIZp4dxc\nnnS60kjdD9oZGPDfcQpkZCSEomgkEmWKxRqRiIMnn+ykUKjS1uYklxPJZquN1OwWJx0d7wkXRdEo\nlWokk2XK5TrBoB1RlDl7NsrBg51s39FG9koCoW8f16bGsA/tYNvWrSxenuTidJU9vUa87xu1uluM\nRv2aCdvN3Gtgb61YZPHUKcrRKKqiYHG76XzySTxdXXc+ttlM686dBIeHUWX5Q8ULNMXIQ+F73/se\nn/3sZwnc55S5G3Ejn1YxEg47GB4OMD7eSFm8MV/b1nZ/enTd3V6mp7Nr5lLQ8N8QRZlTp5Zwuxsp\nsKGQg8LiIkKpSkwOEIsW8XjduFQ9tVwaq6MDAL3BwHItwL/8f1dZnEliMJvo6Q0ycuhpUtFsQxT4\n/chGO/Vigf1PDzA+7iWfzNHa6mTXsJ0LP5vG7vGRTZUoZfJs2txGxCFhrWY4dXyKtq4g3bu30N7u\nwuezsrRYYOxyHB0q755P0t3tQSjXMShVTOlZ8gsLjdosHg/t+/bddW0WgGi0dEsBunS6QjpdeeTE\nSDBox2w2Eo2WkCQVUZTYvDmIw2FiaipDva5gD4dQFRkhkSCXzHHghW1YAiGiiSrlskRnp5taTaFQ\nqOLxWNEZDBQWFqgViyREOxPji7SFLQwMR5i8JFIpV+nsaWf/C7u4Op7h6oU4Dm+FruFO7CaF1oAR\nW9cAL/yPQZSV61TTCbq2DbL05gmSk1O079mFPHCAN84LFMsKFoPKpYtRvvTyVgZ6nETPnaNWbGRS\nqLLM/NnL+Hv3MDYp4XQ6sHf1kUoLWH1+roylsM/m6Oz0Eg7b6Xr6aXKzs4iZDEk1iD5gX+eNk8tV\nSaWER1aMZLPV1RiuTs6fjyEINUZHQ/j9Nt59N0qpJLFrV2Oa4OLFOPF4mbGxFPPzeUwmPQcPdvHZ\nzw7c0nFRFJVkUqBcrmM06tm2LUJrqwubzcj4eJpaTSEQsOP1Wjl4sBOr1UgiIXDlSgK73UShUKOn\nx8ulSwmi0RKRiJNCocr0dJa+Pi8eLUe8bOJf/+UyE2MxqvkcLe1+jn7uMMvj81S7g3g/YnC/12ul\nq8vD+Ph7JnZGo/6eXZQzU1MUFxfXnldSKRbefJOhz3/+Q0XGvXRommLkIfA3f/M3fOMb37jv+33x\nxRf5wz/8QxRF+dhBsY8jBoOePXva6ez0UCrVsdmMtLQ475tbZ0eHm2ee6ebatRSVikR7uwuTycDP\nfz631vsIh7McOdJLVaxxcUJg6moUh8tKdCnPypIdf18Png4orqwQnZrnx38/TjZapKWtnbJqZSUu\nYDLpaBvqIeVwYrBY0WQZfVUg5IH6cBtL1KnmcsxeL9L/i79IMZ4kO1egrSvI8IEdJFcybNvRxtCW\nViqFMh29NuYKdc6eWUZMxHh7IsfI5hC9AQM9gTq6+fMspzTK4+fxd3dicbmopNOsnDmD7bOfpVYq\nIZXLGCyWD6xme7MR3M1sgC3IxyaXqxKJOPjc5zYhitKac2YiIaxVQTUYjXg6O1er1mqEu1sYCdga\noyZVBUGoc+rUEi0tTp57rhcllyQ/NweqSsHqJr6SJRhoYe8OH1t3tCOWKozu6kZCz/i1JGavn9jE\nBKlYjv4dmwi2+qkqRozt3Wi1Mv5whOs//THzp86g0+lpe+ZZ/u3v38LbP4C5lKeUziHMG7jYZqQz\nuJl6qYTBYsHg8pEp60jlsoRKaZ7c183khRnysTSj/X4GW2VSNYl//dcZnE4zW7aE2bYtwuatW9Hp\ndFSuJjHP1G/5zB7F83gDg0FHJiPi8VgZGQnR0+OlWKyRy4no9XquX88wNNQIME2lKszN5deybioV\nOH16hdZWF4cP96zb78REei1OLJsVee21GQ4c6MTpNLFpkx+Hw4LTaaalxUGhUOP11+cwmw3s2tW6\n6pUj4/fbOHlyEU2Dyck04bADnQ68dtCqIhd+fhGDpCEkkzhCQTJFmVhOw+OzEd66lbo9uCZ47wWd\nTseuXa3Y7Sbm5vKYzQaGhgL09nrvaT/F5eW1x+VEguLyMkarFXswiH9gAH9//z3t7040xcgDZnJy\nkoWFBZ5//vn7vu+Ojg4ikQgXLlxgz549933/jwOKKGAV4hjrVeyeEGbz/XUN7e310d3tRZYVisUq\nr78+t1aG3eez4nboySVzyJKZclli584WjGoVq9uN4vCRLhuIFAosvvUWBdlOOpqlmCpRFUSCIyPU\njA6qso6Ax002VcZotdDWHcKmE4nGdSzXK+QFEAsqizNJPv/KbgZGKnh2Ay4/7xyb5OqFGWamswxt\nbuPpA63Mn3oH346ncLW4UVu6MLk9GHQqAyGFqX//MW39HdTFJLpMGp1cJzgygtFioZrPk56cpByN\nUoxGETMZAoODdB48iPM28QptbS6uXk2ts5H3+22PVNYONGzy1Xwcr76MoNkQVG11yB5EUaatzY3H\nY6FQaGQ/GcxmWludhMMOkvEiWi6Okk7jdjhwhgKsxPPMTyxjSV9HzOXIz8/j2B1EEkWujSXp39pF\nR1cQg0FP60ArP31tGld7O5VUisimfoKdrYS6I9jMGg63A4Mqkjc78LV5WBAaGTMGA8hKo6demJkm\nmxVQtIZomrk0jfhMBHswSKZm4+y7UeKxMm0DbdgtYXxmie29eqbLAuWpZcamFPRdIyiKnXS6Qi4n\ncv58jFDITjjceJ8Oh2ldKqrbbSEUerTO482EQg4iEQdLS0UmJzMIQiNmyeu1kUwKmEx6FKWRvWKx\nGBqVmreEMBj05HJVMpkK8Xh5XfprrSYzOZlBllXqdZmlpQKRiANBkFZHQCps2+Za8+I5fXplzU3X\n5TJTKNS4eDHGc8/1EQzaSaUaU4J9fT6G+xz0hDSKC2lChjz9ezrZtecwb/xshkTJSKmisuPQPtI1\nO5d/urAqJIJs2xa57XTxnbDbTQy0aIS1KqgqLqsVHfcWU2jxehGSSWrFYsMUsF7H7HQiCQLL77yD\nxePBEQze0z5vR1OMPGD+9m//lldffRWjcWM++ueff57XXnvtUylGxFyO+ePHqawWijNYLLTu2kVk\n69bbvl5RGrn3VqvxrlPdCoUq2YyAVJepiAr1ukJrqxO/pUp1+hz5t6dZ7G4jvPcAYb+R6Jl3WJzP\nEF/O0DbUy+5X/gP2movs9evo3X7aW+1USgJiRaSeyxKvWDh0eBs2xUNNgZ4eL32ddpRSHsEYInp1\niuz0NFavh9z8POd+IrOj34CldwvLBZWrl1dQJBmX08TiTIxLDhjtCqAZVC6fnmHh+gpFzU2k1cVo\nT4hKMo1t+yZCw3sQsoMYjDr0LhM6uYqqKNRKJaLnzpGZnAQgeeUKtVKJLa+8gvGmYXxNVQn5zRw+\n3M3Fi3EEQcLns7FjR+QjZzJsBKVYjIU33yR2fYmJyTTBvm5adu5nIdmoFxMM2vD7bRw+3MPERJps\nVlyrVmwyQvryOcb++RgaOqRqFU/AjW/7HpYvJvBVl2jdtQtJFKnOjzM4PMz1hSrLeRP6kJ2dO1vx\n+gwEQk7Eheu0hJ0MDoVQotPUx84T6OtCM/Xyw3+5zPLFa3RtG2J097OEKwK565Po8nG6BrqYuXid\neg3MFj0Wm4m+Xi9LV6Zx9gzy4//rGLGlDMN7hzl9OsrrxxJ0h1S8RoHNW1pJRWNImkpxbIJw/5Nk\n8o0Kr6Iok8tVCYedhEIODh7s4uLFRuVmj8fK9u0teL2PpiW8KErIssrBg11MTmZQFI16XV4rXGcy\n6env962KCAO1msyJEwtcv57DYjGwY0eE7dsjWCwGTKb3bvT1ukKt1hDWlYpMd7eHmZkcFy7Eb5r6\n1XA6TYRCjnWB8pKkYrMZqdVUMpkKzzzTTTxewuez4XYY8No16skVMmMX8LmMLL3+I3RmM7905BDX\n8l56Rrvxhdxcv96w7a/VFC5ciOHzWentvXsxkZuZYfHkSZR6QyStiCItO3bgam/HEQrdsdzBzQSH\nhylHo5RWVlDqdYxWK5Ft25BEEUkQEDOZphh5HPnRj370gWZuH5cXXniB//yf/zN/8Ad/sGHHeFTJ\nLyysqzqq1Gokx8bwdHXd8qOLx0tcvJhYDeI0smVLhIGBD07/nZ3NcuzHV1icSTK/UKCrx0/XYAQx\nI5JdOUfx2nmqmpWzJ6fYuZIDp59cWSORljDanaRX0kjJZeK2MInL1zAZNEaGD1JIGliJCtTEKi1u\nC3algsFk4tAvbMOlr+ILOBCVdk7+wyXiF6+Qm5uje+coQ09tp7XTg1xdwJhPIIjwC5/fhhhdQENH\nuqgxO5Nl6NlnuHwpQSEWR85nae/3ozPoGZ9IM/zUVnTeMOcmKyy+ew1NltjyzE6e3NuBzaggiyIG\ns5nI9u0UFhao5vMkrlyh5/BhvN3dQMPMKHX1KrVSCXsoxOF9m9HZPdjtpvvmgnk/UGWZpVOnWHzz\nTeR6nYDFTvTCJWxeL22Du+jp8a65VEYiznWOleVkksU3x0i8c4pybAWdxU6tVKK4tERwoBd/0IdS\nlqkWCnQceAajw4EsK2x7to2yYqPNXUedfZep69cJ2oLUe9oolGWm//01Zk+cpLPTw/JbJzEE23n2\ni6/wg0SC9Pwy1+QQu57YT3FuGnF5liOvPE9FqJG7ME8uL7K5J0JmOcHFjIFNLaOkFRfDT7ayGKuz\nFBOxWIyIigNdTSNfNdIy2EHs2jRyFcxGaG11odPp0Ot1WCyNkZa6IGDOzrHZnkP1WAn1ePG1P3qZ\nNPW6zNhYiunpLIqi0t7uZufOFrZuDXPtWoqpqQwWi4GWFg+zszmuXk3R0uJkbCyF223FYjGgKCpT\nU1n27+9gdHS9/0Zj+sVJqZTF5TKTyVSYnMzgcpk5fXqFZFIgl2uYK/b1+Rkc9KOqGjodlEp1PB4r\nQ0ONa8qNVPJ4bAGllOc3/odRXBRx+H0osSSugIvpt88jxKM88ZWv0Le/k3/793lEUcZsNmA2G1AU\njVisdEcxUhcEyrEYcq22ZuOfunZtTYjccOUVkknadu9GU1W6Dx1aK6x5J1wtLfQ9/zz2UAhHJIIj\nEkFTFKr5POh06O9Tx7opRh4g8Xic2dlZnnzyyQ07xqFDh3j55Zcpl8s471Ck65NGKRajuLJC9vp1\n7MEgcrVKvdRIr5WrVaRKZZ0YKZfrnDy5SDZbXXv+1luLOBwmWltvf9EVhDqnjl9n6eo00Swsz8SZ\nHZvnl351N4GwjktvXqU7YiO6UKBSrhEdv87IM3spCxJ1TYfLYsbrMiEszRNTZOyhCOmzp3CrGgeH\nR7B+7gC6YAf5eJoz//hjJKOdzb/wHKPbuunudpB76xTt7U6mjhXoGOzA7PUzPlujUBOxSBae2zFE\nMJbl3f9+AipFlJqItyXEZ754CDWf5PrPjhG7Mou7NYLPLqPXFTGavAzt282bx+cpZisER0aQymVS\nBY2cMYzTnGHs7/6O1LVrOFtb6Tp4kPTkJCarde0CJ6RSLJw4gSQ0PA2quRzVfJ7+55/HYLCsVTLW\n6fV31QvbSGqlEsmxMaq5RjUKh1miv9WBT02z86k23L7b/14USWLl9GlUWUbNxenu9hGNC1TEMk6v\nh5DPiNOicu7kGUwOJ7JQxGg2M/KFl0hNreDv6WT69AQunUBuOUpeTpFVnGzeN8KJvz2H1WYGoxmr\n20ZqcRklvUKkM8zy5CKiKNFx+CihiKuRUhn2cPRQBwN9HqS6zPLkIud/tsS+X3mJsbE0uaoFyeon\nX1wmlyoSDNqpl1Ti596BXJRfemUnttEeZEeQ+YqCbbV0fFubi0jEiaZpRN99l8zU1Nr7r8xNoj9y\n5CMHUm4U169nOXcuuhbLMjGRRlFUDh/uYc+edvr7/UiSwptvLlIsNr6v1arC+HiKTZuChEIOstkK\nZrMBp9N8S2dEp9OxY0cLoihTq0lEo8W14o0rK0WMRj2LiwXGx9N4vTYKhSpXr6aQJIXNm0NYrQZe\neWWUZLLCP/7jtYZ3TLLIkX1BWsx5Fl87Rub6FHK1iqe7h71feJb05CTmSgIxn2diIk2pVMdsNtDe\n3jg/d4p/q+bzLJw4QTmRaBTitFga1aJX/WGUep3i8jJKvY5UaWQRidksubk5pEqlkYIry3h7e/H1\n9WF4n+WEIxSifd8+lHqdciy2lgZuDwZvm2L+UWiKkQfIT37yE44ePbphUzQADoeDvXv3cvz4cV58\n8cUNO86jQm5urtHTrVYpLC5SyWToOXIEg9mMUq9jstluqZyayVTI5dZ7j9RqCtFo6Y5ipFiskV5J\no6kqhVyVUjqHKktMXpyn/akQsiSj2SMsRJOYLWZqqglZVmhtdSHVZRxGCa1SxOrxMHt5huee24yJ\nOmImg7maoSNo4NS5S1z4+UVURWXboe206BIk3xzDvuDG7HKxY9RB8Lc+TyJd5crlGP8/e28aJMd5\nn3n+srLu+z66+r4PoNFA4wYIHiABUqYl0RqNLVvhmRiNx+uYWdmxduynCX/b/TJryzEbnghvxEg7\nY8tjWaKsGzxEiSdA3EADfd9d931fWZlZ+6HBFimSNrUiAFmjJwIRlVVdeN/o7Mx83v/7f56nv0tP\nbHUTxexkJapgjq6TiuaxWnV4PF7qlTrKzhK6oJljJwcYG3GiCFps3Q4EjQZrwIertwdJjaDRaNBo\ntfinD6C3mElECvSOaOg6epRqKkU1kSC9sIBndBSTx4PpnpdNORbbIyLvoJ7JUM9mUWWZxPXrVBIJ\nBEHA0ddH8OBB9OaH03vw0wF7iiSBJKFHwmT88IbvRqFAI5/H2tVFYHoaT6tF/34tsbuLGAxawgMB\nYnOL6MwW5GKGwnaEdktG7ogMnj+PrlUid+0tmnYTotFMOlEkEdti5lA3FpOIXgOl7S0Uqx5NR4vZ\nakBoJmnk8wSGenaP3W5soRDL1xexe+2YNG1iy6vUKypjZ08zH9NgLBSYmQmQydSw2g043FZ0Qhuz\nARS/G1/ATmXpDj2PPo6trw/DnRgdp4Fwv4+BARcmk456Nvs+22613Sa/tvYLRUY6nQ5ra/n3NdXG\n4xWKxSYulwmXy0QiUdlzPr73TcxmPalUlakpP+F7FZ+BARcazfuN3VwuE+fODVIoNHG5zGQyDS5f\njuJ2mzCZdLjdRiRpdwtFoxE4dCh4L4NIYXjYzcCAm2KxRbMpUy63OHWyh19/xMj68/+D7MI8HUVF\nkVpU4zG8oyMIg72oikouXSEctjM3l0KSFDY3iwQCVnp7P5jQFzY2qCaTe8dKq0VmcRH34CDVRAJF\nklDvxYXYurroqCoanY56Ok1mfn7vs3I0ilSt0jU7+74xjHY74aNHyS4uUstksAaDeMfGPpJs96Pg\nV2TkAeLChQs888wz932cc+fO8dJLL/3SkxFVlknfvbsXwGT2+WgUi2Tm5wkcOEC7ViM4M/OBF4sg\nCPfCtHZL1O22+j7L5nfDYNBiMukoi1rCXVZ0SpB6XcLhNKGa7BhcLqrlOuVCjU6ng8Xnxdw3ij1R\nwV2q0UhlCY8NoA32M2B1snlrHqvdjdPjxWi10CoVaJWqqIrKsfOz9LpkYj/8Dk6fk9W4iVKpwdSz\n5/GGfWi8erYiNSLJGv2z+9FZbJRzJfTNOgcOBCiXGthsBhzdZmxqiUosT/XOKrLeSXi4m2b0FsUa\nWEsO9KMORk4dIhktgkaDqEjklxexe1RW1+bRaLWMf/rT7Lz5JhqtFt/kJN7RUcz39og/zPZZEEUS\nN26QX/tJFmZmfh6dyUTo0KGf46z//4feYiF44ACVWGzPSt3odOKbmnrfSvDd0IgiFp+P0vY2xUiM\n9PomRo+PvqOHENU2WpOJSq5AR2oQn19GltqYXU6Udpvc0hJSV4hKKoNSM1IvlfGPHyQWAb3bR3i8\nj1vf+A56ox6zaEdr99AqlejfN0BXv4+xo5NITRnFFiJ6e4HVS8vILRnrwCDDTz7Ba5dyXLteQavP\nMTrmIxj0Ew7b0YkdLFqZVjYFrSqDhyaZGNSSn38b4/omFruRPmuF3uMH7qmFdqF2QHZ2ozq1GI0C\nOrmGlN8llr9o+CDyYDTuuqKmUlUMBi06nYhWq9kzQ5QkhZmZIFtbhb3vBINW+vo+XGGSTNaIREq4\nXAaGhpwsLmbIZGq43UYeeaQPnU7Dvn1+mk0ZVVXJZHYN2DY2Cjgc+r1elFDIxumJDko5T+zKFZr5\nHOq9HoxWqYSo1+ObmEAw29jIdRgddeP1molESjgcRo4c6fpQA8Hau7an34HcaGDy+bD39lKORjHY\n7Zjcbjyjo9QzGQxOJ+VY7D3uuh1VJb+6imd09APvmxafD4vPtxse+jG78v6KjDwgyLLMyy+/zJe+\n9KX7PtZTTz3F5z//+fs+zsOGfK/k+A50JhPe8XE0ooh/chKT2/2BJUSfz0wgYEaWO/ea1BT8fgs9\nPfb3/ew7cLtN7D8ySGJxjfrGJqWdAsH+IMePdxOviEw8cYryxgoHT2uotgR6T53k5TmVoaEjPPO0\niXZLoq2zEllPIZVLXP/RImaLnpnjQ+w/OEt1e4OJPh39+84R9OiZ+9rXaRYKRBa3MFoMGEL93L24\nQODUo1y+tE3H4KYm6vi7b+9w/GQvwwNWTHYrumYet9jGYgbR6sDkcrDz9hUEg5Hw5ChXv/oNDGYj\nfb6+QyYAACAASURBVMdmKUdiRK9dY/r0OYyCgiK3qVc7OEaD9LvbpF7YfQhp9XqGnn4aAeh79FFM\nDgfNUol6NovWYOA9XvfsPuA1Oh3Ve0nU70ZhcxP/9E/cPx8ktAbDboy5IFC555JqCQTwjIx84L53\nu9Ggo6qY3G4QRaK3F4nmVNqyC02yCfEKE7/+a+gNuyvvbCJPuSxRr9QQMlWGzz5GcXMD78gQRrcH\ntd1E7ojIzQZDR6bYyBvpfeRRqqkMrXwat99J36OPITfr9IY9JLMpbn1tGddAH0aazN2IEQi5qZTq\n1DI5hESS8GAXeqsFm03H2JifdLrCk08NICU2GH+ul50VqMRUXDboFNJs7aTpPt4hcfUKXY88Traq\nodgu7yllri9UuHalSCRWRe3AkSNhwu4upoYGHui5+qcgCAIjI549d1FBgEDAgtNp5BvfWKDRkPF6\ndxuoJya8bG+X9hYgo6NuHn20j0KhiSCA32+mUmnuKXDebX62vp7n4sUIjYaMTqfhyJEuvF4L6fSu\nBHxnp4her+X5519hdjbEqVM9+HwmenvtFAotXntth3DYxrFj3ahqB0N7mXqlhMFiIbe4uFvBbbWw\ndXejs1pxDQxg6h3khX9Ikk6n8fvN9Pc7MRq1/2gkgsXvp7S9/Z73tCYTZo8Hx5NP0shm6T52jFIk\nsrvN0ulgcjqRm03k+nsTyFVF+SfJ5/2IB/gVGXlAuHz5Mr29vXQ9gOCpgwcPks1m2dnZofcfccn7\n5w6dyYTZ66VVKu29p9XrcQ4M4Bkb+9ALxmzWc+BAkOefX2RpKYteLzIy4mZoyI3P9+F9NhMDJuQn\n+tjwCwinwevU09ye48CRE/ztl2/RPT3KxG+cAr2Zt6+nqNUk2gE93/rmPDajjGtgiCsv3ERs1zn2\n+c/iCvkJ9gfRhUOMH9hHZmGBuinA0htXScZKNMtVKpUWwz3dTD5xnFZLJnXrNrMT3awkRez1Dsl0\nlJs3k3z6U4/SSbVYvjiH2CwRHvBhsFsx2AKUJR2KxUs5mcaoA1FQKefKmDw+1pdTBI5UWF7JcvNm\nErMBDkzYqSVzDEwcpHTnKrV0mu4TJ3BOHiBVUKmubaJmIpCLIIgi1mCQVrmMIAgYHA5CBw9isFgQ\nPsDrRqN9uDkn7qEhNDodZr8fAbCHw9h7et7zM7IkkZmfJ7+2RkdV8Y6N0a7VqHQsLC1vU28qCFo9\n6/ktpO4Ep0+HsfQO4RxIsz23gkbU4hsewOjvor2VoJivE3j8GQxSiVxdS0vvomdohHobkpEOY598\nFp0q0WnWSM3fRRS1INVZuXSXhmjF3RMgsbyM0+2j2VJpKSKKLBMWKgQPhrlxI47fbaTVkhBQuH0j\nSo/XQGlxiY4k0T0SZv0H38XZN0DP4YOYzVrykRaRtMrqwg4ajUBXl5Vw2MHKSp68bGYrkkCuN6jV\nJM6eG8OS0xAYeTjn7MMwPLzbMLq8nMVq1SNJCt///iqxWGXPDt5qNSBJMrFYBVlWGRpyUSw2mZ9P\n43Sa6HQ6fO1r84yPe7Ba9fh8Fk6d6sFs1pPL1VhezmEyadHpNMTjFTKZGuPjXvx+C9HoLsF56aV1\ntraKhEJWtrZKtNsyi4u5e1s5Iisr2V01kl2Hq+mlsV2i59RJ6tkMpe1tBEFP6NAhnH19tKpV9IKe\nVkulUGhQKDTY2ipy4kQ3er1IMlnF6zW/T97rGhigHIns9Yy8o3jRW62UIhFqqRQ6sxnv+PjuNXCP\niOeWl0lcv/6e/8vs9WKwf/jC7H7hV2TkAeFBbdEAaDQannzySV5++WW+8IUvPJAxHwYEQSAwPU2r\nUqGRzdLpdDB7PAQOHPgnH3iJRBWLRc/0dACzWYfDYWBzs0A4bMNmM3zgd+rJONZ6gpkxM7nNLeI3\ntsgn8vgnJgiMDZHMq+y8kWJywsfGcgp/yM7c9R3a2TzeYyMsLmaRDC5mTk2zURVQ1gWCtRpHTHUG\nDodxWf2s/+g2O9tF/CMDrFy8TnBsiCOfOc/aq2+gMZrpWILc+t4qY6cPMXp2ApvNwOxsiOW7UeZ+\ndJvRvjF8bg0dhxNHf4hqpUZF42ThepIjx/vIlxWCXQZ8QQf5qoTXaWR9o8hbL99FUiBbq5NZkXji\nsT7Kbj/BQ4cQtVqsEzO8PVcmEY+RujuPQZA5frIPh5Sg0WrhHR/HOz6O3mLZqzK4hoZI3ry5VzUR\nRBHv2Biah2jIJ2g0uPr7cf0j/Q+55WXi167tzTu7tITSbtNWBQxmIxIq5YqExtRhK1LlQLVDJp7H\nPHWcJyanqKZSVDJF8ukS+//lc0TWM+RXV+ib3U+5reHWSpO3v3aRM48N8ZufPUV+J0KrVia7fh2j\n1YPNbaVZbxKeGEDr9uMf6UduNFlezXP9eop6vU0gYObA2aN897uLIEvUS2a+//dXGT80RL9X5dvX\nb/PkuXFWX/4hLreFR3/3U5gtOor5GoooY+m30RZNaLUdTCYdzabC/HwaWVbJFdpY/UGUtkRTFDF7\nPWxtl9m3/8FF0H8UaLUaJid9jI662dwsMj+f2QuHU5QOBoOGq1djSJLK4cMhisUmCwsZhofd3LqV\nolqVGB/30m4rrK0VOHYsTDpdY3OziMNh4Mc/3uS113aIxcq43SZGRz1cvhzF6TSi14vEYhW++c0l\nMpk6Q0Mu/H4LX//6PP39Tl56aR2NRuD3fu8QbreZFy+scmKggeCD3PwyrqCX4aefRpHaGOw2/NMH\nSC8u7hKEbI0jR7rw+y2kUlVsNj2BgJVbtxKUyxLd3XaOH+9+j2TeeC/ks5pMorRau1XhQID8xgal\nrS1a5TJqu43e4SAwPY1Go6GRy2ENBvFPT5NfXaWjqlh8PrpmZx/KNXq/yciXgFngBu9P8BWAm8D/\nDfzX+zyPh44LFy48kC2ad3Du3DleeOGFX2oyArt7mEPnztHI5aDTweT1fqQGyXS6RrvRwCBICJKR\ny28laHc01GoSp0/3vi8UrFBokC4o3Lgew2rREwi4GDhoxj3QIDDSz2+O6ail05RrCorNjsE0zvJi\nhnxJi9HuoFmu4PS6MdvNrEQkfAEH2Wiepbsxlm5u0CgfYHzCT6WtQ28yYeua5KmD41jcLtbefItK\nIkk2lqZaVTj4uecorq9RFNzcvLyJx6xw6dVFPGaRjViL5ZUa8dg6n/mdo0weG6MkGSgW6ggGI86Q\nF5kOhVQOndzAMf0IGwkJWQWl2UJnMVNMlqm3oVpVGB3vxTM6SjTbIZGo0m7sqpOaLYmbNxM8dsyF\nkk1Q2tkhODPznu2OwP79aI1GCmtrCKKIZ2zsY3NrvF9QFYX82hqqLFPPZmnkcgiiSNeRIzitIvmd\nKIKoxePxED44QbYqUpINjJ2cYenSbXDZCOyfwlxuY+ntJxvfYv57L2JxWnnl9hr23n5CI0f5xCcC\neANWNrbKJCMya4tFThx/FLdDxmWGF//yqwQnR+lUK9SiUUzhPuT5FFJbRWrJdHQm8oIXRS5iMeuZ\nX8zR0RkR6JDdiVPMVFlazmHzeImsrFPLZmlm2jz/n/6ayf3djJ89xcDsEcy6EunVVSxuJzpLiNw7\noXLCrtnbOw+8TucX14FVqxWpViU6nQ56vbjXH2Kx6FlbS/HYY/3EYmWuXUsgigJer5nRUTeXLsVY\nWMhw5kwfb78d5cKFNXK5OisrWQ4eDFGvtxFFyGTqxGJlbDYD+/YFSKer9PY6abUUNBoBvV7DzEwA\nSVLo7XVgNGrp63OytJRhc7Ow25sm1TArNbbfXkYpF9AadJgcTgS9Dq3JTL0mIWo0mLwBYmWFdFrC\n77cQClmYn8+wupojHLYjSQobGwU8HhMHD743BVdvsbzn+mpWKsQuX2bx+eepJhJY/H76zpxBbjRQ\nZZlmPo/WtOvyOvzssyj1+u4Wzb1/D5qQ3E8ycgiwAGeA/wIcBq696/NfB9LAL+if+MeHByHp/Wk8\n9dRT/Mmf/Mn/FNbwerP5Z1ZouO0iN5eW6R4K8O2/e5tyoYp/dJBtvwGNRsP587vhblKtRilf5dU3\n41hNJkweL8mtOOVKi+FhF5pwN9Vkivnnv8nG3AaKIDJ19iShI+dRR1yst+t09w0R9mgYHfNQlIy8\n8VacpcUUb7++TsBvohBp8A+o/MHvH8LZyaN49IQCFjquEHd/9CbLl7Zo1mp0h/1Q3CK/ME87NIkd\nCX0tTTFtZfXWJtp9IXSVBHpPgHKxTq7YYiclM/TUk5x57hRKvcyhJ4+wenWBdjFHuMuKb3iQ1763\njdlhp1TPoLRlrMEgNr+f/gk34ekgRrebiy+s796g9HpEgwGlJVEu1JAIoAGMDgei/r2rZq3BQGDf\nPvxTU8D92Wf+eaEquzlDGlGkVGpSKbfo2H2019f3VotStUq72WT6c58nJ1mIrMXwjY5Qdw4xHvIQ\ncig0MkWchjYrP/oxnQ7s+41PoxFFrrx4Ha2/F7vPTKqaIhPPcfQEvL5cJZ8tQlhH2G+i57F+vn9h\ng+OnBxjoNoIjQC26zfbVOboOH0YzMEPX7CznRpvEsgpGf4iryy1sLhPdYQcbOzVkrQmdFtqSDDoD\n1aqEx2TA6HTQzKQQdAYOnN6HfyDM3bkEqfILNKxhXGZIvH6ZiUeP4HP58HrN1GoSGo3A1JSPdlul\nt9eBxaKjuLOzG6gnCDh7e7F3dz/kM7gLp9NIpwOjox5u3nxHVSIwObnbL7K2liMardBqKUiSytmz\nA5hMWpxOI/F4BUlS9iS7AwNO4vEqfr+ZwUEXc3MZEokqy8tZnn12lP5+J3a7AVlW71nC6/nEJ0Z4\n6aUNNjcL6HS799upKT8Gg45KRWJ80E4rvYpOr2fik89Qj0VQWg0cvX2Y/X6KLR3BmUlEg4mtqJ5O\np0y53KJSaRGNlnnqqSHq9Z844u7slPbIiKoouw6ppRJasxlrMIhWr6cSjbJ24QKVe3bu1WRy1wBN\nlnEPDgK7Ta655WVEnY7MwgKtchmNVouzv5/w0aM/c1jmz4P7SUaOAS/de/1D4ATvJSOfA/6O3QrJ\nLzVefPFFzp49i+4f6dj/uNHd3U0oFOLatWscO3bsgY37zwUhm0T/gJOdSJ5cIofJYsRratNMxUgY\nNCSjLuydIrVUiqqsJbcSJYKRidkTuAaTNApFArMjaKw2Fr78VyxcXiKXraPVa7n6nVf5xNQ+dnbM\nOGwi7fXbVGMS21sabD3dHJ4Y5vpbRbrD1l2JsE7DyLCL5Zd+hFzMks62aSSjGN1xvF1eNswmkhtx\nhI5Kb5cP2i1cPhtyB3TtCoIs0TMUQFY6mHRazDYTozMDdPd6MNstZBYW+cFbVyjEkhgsJh557hHG\nzj1O7EcvYM+mCDigZfSwLWioF8v0DPoYOzTM/tkuquuLJOfm0BS1pOdTOPsHsIfD5JvrWGwm9Mho\nrFZ8U1MfSjZ+EUmI0m6TW1kht7KC1mwmrwuzGpVptVXkQhWv6sUaCFJLxGk3GhhtNkrLC+x/bBbn\nyCiNhsTJIyEsVNn5/jdZ+YdvYvL5GJk9TrnSInnxVfZ/5jnkQgZVb6RpFdEobbwOLdVylcGwh+03\nrnLp1RjFbJXHnt7Hs48dYznVwGKA47/1aySXNzCPzBAeCbO0UWdxfofh2XEcbgsrawXGRi2YzRrU\ndpvhES/5bB2dwUBHb6DSFBib7qW2XsXXG8Tq87J48RZCucDGlRzWQIDsxiZNn4HVgsSJQwOoqQ2O\nPTnA8HiI9fU8BoMWg0GLw2FgejpAbmWFyMWLezLQ/OoqvadP/0JUu7q6bCQSFZxOA8PDbqLRXVKh\n0Qh85Su3yOUaiKKAKILDYWBrq7DnrDs3l6LdVrl+PcGxY2HqdZl/+IdFenocSJLM44/3sbKSY2Ym\nSLnc5NKlCJVKi099apz/+B/PEImUuXhxd/um0ZAxGnU0Gm0mJrwcOhSkUmnR1WfC5+qlnU3ygz/6\n39CoMo6Aj+4Txxh45tcQHT2UVCMWW5ADBzQ0m/KeY6zL1fseRRDs2vPDrvolcfMmmbt3USQJQRRx\nDQzQc/IkrXIZ+V2Jv4JGs9u4LYrorFYEjYYOYLDbiVy8uFf6UhSF3MoKFp8P3+TkAzuH95OMOIGN\ne69LwNS7PjsHvAoo93kOvxB4kP0i78b58+d58cUXf0VGPgBKJsKBIR16i4/YTC8GUYFiFEKT5NfX\nKG0bmP/6f6VZKmEbnsLStmJwdbO0mMHbE0YX7gWfD7OUIb2dpFJpoSgqOjpYXA7uvnUXa/9pPNUt\nsvFtknID2WMkFc8x/HQ3T5ybIJMsEduxo7aaBA1lMrdWMZl1+F0WajWJ7Ss3OPIbT2G2GPD3+qjm\nyxgdXnpmJtGOjvDKj3fIrO9QDlt47PERUjmJxJ0SzqCbJ8/sxxOw0SqVqKwvk0sVyaXKWIxVNi9e\nocupMH/hR/TOTHJ41s+ArpvUdC9Go5b9+/0MDrqoRTZJ3boFnQ69gQEiNi2FzQ18U1N0H5pmZtJJ\nV5cOi9e7J/V9UMjl6qTTNURRg9+/q6L4WZBdXCR25QodVaXj6+f2/AL+kJOg20nF5GZrLsPsxGE0\n4g0CBw4gN5tkl5cx98iI2SoBk5b2eoObr7wMjSrWQID89jbl7W1GP/VponeWMQgS0/v9FLJVXHYQ\n/CKFYg2r30fy1jo7CxvodSLlcpMrbyzj8toZPXIarU7g7RsxXv3qRZRWG29vkP/1//gdRqa6qKSy\n+FpJeic1hKZsRCMVErESU4MOHNYhSsUaBu8g+w71IFazqGg49anT6ASZwtoaBoOWQrFFrVBm37kz\nxHUG4hsxHK5uTOUMmnKG2dNjzM52Ua9LqOquE6ncarHzLj8KuOdlMT+Ps6/vY3Ph/Hmg1Yqsr6dp\ntVRGRz0cORJiaSmHz2emXm+j02nwenedcYNBK/v2+e+l9Ha4cydNMGjB5zPx3e+uMDHho1RqsrSU\npVBoMjDgpNGQ+d73Vjh2rJtsts6FC6s88siuQKCry4bPZ8Js1nLzZpLubjsDA05cLhM6EZLxKuP7\nwrz1t/+NVrGA0aChtNMAQcDWN0DwTBeb8QbJ+U0eeaSXM2f62N4u0el00Go1LC7uSnf1ehGHw8D4\n+G7ybi2TITM/v2dC2FEU8uvrOPv7MdhsOPv7qWUyKK0WCAImtxv38DCNXI7EjRuosox3fByTx4NU\nLv9Eqt/pUI5Gf2nISAl4pyXXARTf9dkXgN9ltzryofijP/ojnM5d/ff4+DjHjx+n/17j2dbWFsAv\n/HF3dzcvv/wyf/zHf8zW1tYDHf/48eP8xV/8BX/6p3/6C/P7+KeOHxSsPh+pWy/jM3pxqlkK8RyW\nQACpWiUYstBYvkF6bg4EAXMghM5mJeA3Uku2iccr2O0GvF4LupaMPeDD6U6DpgFtCZPdChYnXruA\nKZfFrqnTkCWs3jC2/Ud440qKVFXH3LUdjhzvY9gnYzFKLKbq5HYSIEtYe/oxCwqy0sHb7aOjygQH\nQxx65jD+iTGWc2ZKVZXQUIhmLofbMcHsI2M0np7CZDUS3S7g9ltpZVPo2yUOHAjSGnag1Co0MimK\n8RSh6Sny2xHCU2YOPTOBigadTtyrZMS3tn7SfJqPcuZYkEJLjznsoXswQChkfShVj+3tIm+9FdkL\nJXM6DZw50/e+Pp8PgyxJ5O5twWi0WrQeL11BmUo2h1TMoVVaDPZ7ENxuek4YyN/L9wgfPUp1Y4nQ\nwCCbb13Cc/4pmpkkJqcT0ddNYGg/UnSDVrGAIxRAFrSET5xCuniZSnyTrlCAyadmyJqt6JsFXA4D\nkZ0iAh2sVgPZRJaTow7SZRGbp8Fz/+E55l69yeC+fq5cibG9EkdRVLwOHaPhNjs/fJGrW1rowKB/\nmCeOdZMsuUjsZHHadTht3fT0PYHFbmH79ddxBT2ozQZCScLksODq72F7qYQot9AZdLuJv0bjnoeE\n2fyTbbdmtUE+XaJebGC16vZs09uNBkq7/dDJyPJyjtu3k3Q6Anq9yNZWEVlWcDiM9Pc72d4u0Wwq\n7OwUmZjw8fjj/djtu1s7J070UKlIVCotNjdLjIx4GBlxYzBosVr1iKKGkyd7+MEP1vj856eZnPSS\nyzWwWPTY7Qbm59P88Ifre6qXz352kkZDpt1WeOWVdT73qR4cqoJUqWP1unF3+ZEbdQStDlmS6Mht\nFK2JWKaO3WEklapx82Zyz5jRaBSZnPSh17RRcyl0cg4xryLZ+pBqNZRWC41Oh95iQdBqkQQj8XQT\nT8hD8PAR5FaLWioFgsDA2bNojUaWvv1tVEkCQaB4z4XV0du7504MoP+YzMw+Ku7nneQg8PvA/wL8\nJfAVfrJNcxNIAuF7c/gMsPJT3+/8tGPiP0dcvHiRP/iDP+D27dsPfOxGo4Hf7ycSieyRul9kvOMD\n8HGi0+kQiZSIRMoIAvT2OgmHbbTKZTZfeYXYtWu03YOsRproAt1YqTE9E2brm39DdmkJ39FHSEhO\n0nU9mBwMHJ5CFQ14PLs9KoODTpqrt7nx37/K9lKUcq7MoefOw9QZTA47moVXefPCTcweN5PPnufC\nyxEKhSbegR68Pitqo8rZx3twm1Re/s9fprgToZrJ4R4dx+Cws+/scdbm44wfn6Srx4MiaLi7UKBr\npBunw0g1nUavhWu387zywgINWYvTbeXcJ8Y5sM+FoRzn0le+RlvQU25pqZcq2CwCn/j950iuxzDW\nUgw/9QSDZ8++5/emyDKJa9coR6M0SyU693or9HY7g089hcXj+djO0c9y3iVJ5sKFNVKp97q+Dg66\nOHt24CORI7nVYvk736FZKGAKdXM3aeD5v/wetVqL8Egvx04NYqfE2COHqd96g8LmJp6xMfRWK6nb\ntxF1u83Kgelptm4vk9IEWb0TRTRb8YccPPHJWfQmHatRhdW5TQaGA4yOeTE6HWQLMka7jRvffplr\nL12h0VDQakUmp/wMTPYQeuwc/+n/usL6Wpq+Pje//duTNFsq3/zqNbKxDIJGoHfAy+Mn/XRJ64jd\no1y7leX8E72Qj4LZjmQNMrcDvf0eKok4PX0ehNgCLreZYiRGLlvHEgzRUkWWN2vodFpmQjWUQgpb\nVxfho0cJHz68RzDy+Tq3b6coXH+TyNwyFouO4SE3NrsBz9gY/Y8++rOfdD6+612WVb773WUymff6\nZSjKbk/HykqetbU8kUiZUMjKk08OsrFRQFU77OyUcLmMjI56UNUO7bbCtWsJSqXWvfTpDt3ddp54\nop9Uqk6j0WZgwMncXAqdTiQWK3PjRpJAwMrychaA/fsDHDsWxmAQsVh09NglGvEt+vtsbL74ItFL\nl+h0OrRrNUSzhYkv/HsuZbr49g+22b/fx759fkRR8x6/E5dDx2y4RmHhDnqbDa3BgNnnwzU8THpu\nDkWSqMTj6Fw+sPuIFPXUBAsjPQZ82hKNTGrXU2d0lPWXXiJz9y7teh291YrR7aZVLOKbmtrL9tLb\nbAyePfuxWb2/g3vX5wdepPeTzt4EmsDr915fA/4z8EV2iQrAvwJE3k9EfmnwsLZoAEwmE6dOneKV\nV17hM5/5zEOZw4OGqnbIpCuUsiX0gky9LfL29Qzy7rOU1dU8p0/3MjTkZviZZ3CPjFCORhk7bEZj\nstBMxmiU0kiqiGN0ioWEluVbdzD5fBiCfTjKMv6Ahe99bwVJUhgd9TA4EOT4F7/IxMYqWqMJa08f\nKzGVoE9PJDNApniN/ccnWd+qsjAXwRUKkIzmSW7GGA5pWbxYxBOwM3L6GOuvtqgkUpiNGibOnsDV\n182k00PP9BitRhtZ7jA666NYVogkmhyd6ef6lW2u386RKQk0m03y+SZrS2nM7TwjfhWzx8321ev4\nxye4E5M59dzjyKoWY6eJozuE3mqlnssh6yzEYhWaqRi1jSW0rQpKtYh7eBjYvZGY3G5Q1fviwPhR\n0GjIexWRd6NQaCBJyodmd7wbWoMBz+goxe1tKgY/t9+6hKAR0Or1FHI1Ll/a4tlnBnA49HT6R6mr\netqCASmZxGCzUY7FdvOPajXk7mne/MqPQKvDP+QhmhdYLtgYD3gRbBX2PeahGd/ie99fIb6dxzsQ\nxmVROfvrpwmEXUiqFlGjUIyl6D92kG9e2MRm06E06mwu1dnZ6aUmdcjlalSrLcwGDSs3V+kJGQn1\n6RCqWZ59zMfN//4V2qUcBocDvcvLE1/4N9T1Bux+LxaPm7YhQDkaxdsdQLQ2SUYLdM0ewjxoxW9q\nktyOsxrTIG50kP0F7D0pHOEwAHNzadbXC/SNTBGsN2hlU5TzRdzhYTxjYx/3Kf6ZIQjv70uq1SS0\nWs2ua3K5idNp5ODBEBoNXLoUpdFo02rJlMsSsViFdltBp9vdoiyVWvzgB6sEg1a6uqwcOBDA77dy\n+XIMjUbDzZtJrl6N87nP7UMURcxmHRaLlsOHu6jV2oTDNo4c6WJjo8DSUpaF1BZesYhV48McDGKw\n28mvr2MLhxl45llqjn4uX4iiKB1kuUOlItHf78Jk0tLpQDJZJb6VprvTwOX3U0kkKGxsIGg0jH3q\nU0i1Grf/+q8RdQYSa9tYA0Gmfvt30Ot9LG668J7sxWk1U45GKe3soBFFbD/ld2Xo7cU7Pk7N5UJn\nNuMcGPgnA/Q+btzv2tpPy3m/+FPH/+0+j//Q8YMf/IA///M/f2jjP/3007z44ov/U5ARWVa5di3G\nlR/eJL26jSPgITAYxmYWEexORK1IrdZmfj5DX58TnclEYP9+vOPjtMpltEYjaZOJ9M1lPAcOU8zV\n2HxhCYPTjcHpwRLupS3Da69tYTBoqdXa7GwXkKpV3LYeAtPHkQUdQqfBoeEa2baZa8sSpz7/Scp1\naDdVAoM9lJsiYqXOzp0Vup7Zj8WoIbMZJ50oMv3UMwRmZlD0dpZv7/CJUR+5Rptv/M3V3Sa5oJvZ\nw2GcXicarZb59RqY7IgGA9V6m0ZNItTtIpvI0fJbyVWT+HsDuLufxWjScfL3DpPO1Onk1xHqU109\nXgAAIABJREFUeZoaiXomQzFb5ta2gNdnY/uVl6lVang9Fnq7dNTzeQxWK4WNDfQ2G4XNTXwTE4Q+\noh+BLEmokoTOYvm5CYzZrMNq1VOrtd/zvtttQq//aKqxjqruZhltbbFWKe6uCj1GZK2FVltFo7ax\nOGxsr6Sp5SosvD6Py23GKufRyA0C+/dT2N5GqjeJlQWsg6NYzFoEm4dcGb765bc5fiSAy2tjdLIL\n1erg9vU7GPRaOguLFDQCwcE+SkIXa3c3kVtNDp85SBkHHTnHsZN9jI17uPbjBaqVBhq9CbPLQS2X\nR68TMJqcmGxm+g8G6Qha1r/zLZRqgY7ezNZWCWUtj9b7AvrDTzPcZ8ZezxI4cYL03ByVRAJPwIFr\ncpqlnTbZWJJtDTQzZbZXYth9Lq5eTWAJ93IwHKbZlEmna6hqh1hBZOL0SVo7y7SqNToaLfGrV+k5\nceKB9wy9G6KoYWTETTZb37OCf0dtsrSURZIUxsd9PP/8Ar29Tubmkng8FpLJCkajllZL4fbtNO22\nQixW5sSJbtxuI4uLWc6fH0arFbhyJYYoalhbyxONlrFYdKiqSjpd49atJDqdhoMHQxw6FGRgwIUk\nKSiKSq3Swu9x4NdJvPxXf8fjv/kko5/8JKgqtnCYtn+Yb/z9/G5WlFXH/v0BVFXlwoVVOp0OOp3I\nwYNBzBYdpWKRZmmH7I3Le+aBmcVFcsvL2AIBYjfnqGYLVPNlAnfnaNq7mXziUbZf+D7Zt1+lWSgQ\nmp3FPz1NKRJBZzbvuiWLIq7BQXwTE9jCYZRm81emZ79seEfSe/LkyYc2h/Pnz/OlL33poa1kHyQS\niQo3394gs7ZNR1FQOgK5gkxxo0w0GccdcDI9HUQUBSRJ2XMxFHU6EAS233yTzbvrdKplnOEgrskT\nhBImJNGEIxwkmlboMuloNGQymRobq1ncdg31LhOBoJVMoogs6Dh8rA9du04lkadUVXhzI8e+U/tY\nXNigu9fNeqRBJZdGoxHweMzYzSpOg4l0osjKRgVFNiLnoxyb9VMXbNy4scnd9SZtVWDxdhSHzcCQ\noOX67QwmvUAotLsSq+QrpPNt7HY9Vn0bpZghvnKJ5J15+k8cpeEN4Ng/SzYv0XvgEJbJIwjtOu1W\niZIssn51DsO4i8TCCoJGQGm4CHUNYHY6ya2vY3K7qcTjJG/cIHb1Ku1mE9/4+IeWcjudDvm1NdLz\n88iNBmafj+CBAz/XikunE5mZCb6vZ2Rqyv+R/74riQTZxUUMdjt+uxfrTpP25iZ2iwat0YKIjNag\n585ygUaxTizZZHUxybFZHw6jgKWri+DMDLVsFt3NBti8+A+M8tqLd9lZjRMI2qhkdMy9PsfE/n+J\ntp5hf7dK1/5hFq8uc/DJI9y6lcRo0FAuVClkKkT//hq/9W8f5/qVHb77/Q18fhuTUwMEez309Dh5\n62IEd28PBqWKWs0zM+Vi+43X8Y8Oo2nXMVpNxFJtcrk6FrOWVi6DUCnw+g93OH/CgcmRpO/MGaR6\nnUi0xsXLcUrZGvW6wt1rGzz++AAnHlHJbkaxGGrUy7sPdp1OsyvpLTaxWHREr90gMreE1arHvt+P\nrBNJzs0x8PjjD/X+MjTkplRqcvdummpV4vDhEIGAjXS6htGoRavVMDLiwes1Uyo1SadrlEotjEYt\n8XiF6Wk/Kytl/H4LX/nKTc6c6ScYtJJIVHA4DJhMWjY3iyiKit9vxek08K1vLXP8eDeBgIVcbrcy\nZ7MZmJ/PcPFihGSyypFpF0GXnvpqBm+Xn4v/798TDNkw2a0IWi2hf/HvkOs1enp76O50sFp1zM2l\n6KgqkZ0CuXyLYrHJH37xCI6mho2XbtJqSMiVNBafD1GrpbS9jcXvp6O0EXV6VFWlls4g2row1tPc\neull1NQWnrExohcvsvXaa4x/+tPUczl07Tbho0fxjI2RvHWLzOIiiiRhcDgIHz78QKXbvyIj9xEP\nQ9L70xgfH6fT6bC8vMz4+PhDm8eDQD7foFGpod7bk/GHHLz4WgStCO22QqXcIra8zb/6N4eR0jFU\nd5B0tk4xXyfy+o/JrG5gbJcp7WwhaPXM/msfjpCPdFlAwkA6ncbtNmCx6Mjl6gQCZoyaNvFUg1S2\nxVquSLNYxixlCepLNEQ34wMmfrRSo1WtUq4qGC0tfvtz+1iZs+EwjTLgVnj1by/gCbl56tOn0IcH\nKMcSOMzduJwG1isaam0t9XINjcaATuywtV3C6bFQyZURTJBS2yhSi4E+G225jMmk4eCxPtylRXZi\n2zRKZdILi4z9i/0Uc1V6x3q4tpjnzZfuYLKamT0Spn/QTLtcRKroABW5IVFNtVGFIaRGg44sU9re\nJnb5MlKthiCKBKanKSUzTPza0+gt7w/wqsRiRN56a6/TX6pUaNdqDJ0796H+BaVIhPzaGkqrhaOv\nD9fg4G7+zbvQ1+fEatWTydTRaISfWU3TKBT25uT3C4R7XLsVHkGDRhSYOTqIxmblu8+/jlbs8Mjx\nWaRMlMCREdz6BrmFRQorKwSOn+KR3xgi+j/mKRQaxDdTNKpNxsaHiG1GqaSzZKJZrKU8a6+/jbae\n4+nf/S1SxQ7Xry7hdJqQW220HRVR1PL2W5sEgzayxTKpeIFaQ+HUI/24nHpmZ0OIYgiLXKQ7OIGh\nuE3yzh1sXheWYIhcardhUyNq0OlFHEMj3N1qsbXdYGxmEF2mhM68g9xqkVgpIKoCZqcNndnEMbcD\nc2WV/NoS0eUYgnYNjSqxf7YXezDA5KSPXK6BUZTJptKIWg1dYRvae34a9UyGdqPx0NKYFUXlzp0U\niUSFoSEX2WyDdLqOLO9WFkZGvGxuFkgkKsRiFQ4f7uLSpQhdXVbq9TYazW7Ozfx8mu5uO9evx7l9\nO8nIiIf19QI9PTb27w8Qj1dYWcnymc9MYjLpyGRqvPVWhCeeGERROgwPu9jZKRGPV0ilqnjtAi9/\n/Q1+67cPYdBpqdUqiHo9cqNBPpPGPTSIQ6wzOBZkLqLS3W2jWm0hyk2CbpFmUSDksRMKG6jFoyRu\nvolYyhGY3k9lawNRr0fQarGGQqCqaLUiRpNIo7kbe5CTZNRGHaFeQms0YnQ6Wfne99CIIumhIWzh\nMKJej8ntpp7NEr9+fa83rJ5OE3n7bUaeeeYDr+37gV+RkfuIh9kv8g4EQdiT+P6ykxGLRY/WYNjN\nRFFVBFFLo9agq8dNPlullc9icJqRqlUSy3kW0wkEq5P0VoLIq/MEnBpK0QiNYhWrVc/aK68xfvwx\nHBUdqwmJ4WE3hw+HkRotXnmlTaNpoFqq0N/toNloQ7OOySjQrlQQvdCJrpC9FePR432o1Pj3XzxB\nta6STRY4/egQ5nqcF//q69TrEr1WIy6XgcjFl8gvLqJOTqIfH6LRMlPMllHbEm21g91pRe2oqB0B\nk1ah3VKwGYz4HQJHjo5yqiThsGlx6VskXklh9nrps9vxjI7iHR1FsjpZWC7y49eimEQL8Y0cgtFM\nGz2+bh+C1YnD56EQT9I/PYwn6EJrMGDv7SW/vo5Uq0GnQ1uGQrpEYTGO6h+ie2rkfYmipWh076H/\nDt5xNdV9wIqruLPD1o9/vCtDZJeYtMpluj9Amu7xmPeaiD8KJEkmkahSKDTRyib0viBSNoWSi3N0\nX4jcoBPRG8bjtaDTKNy+m6PQ0NJp1fnOd5Z4/NcOgFbP2uIm6UQdg0FLrnWdiSctfPIT/SytV6g8\nNozVpKEQTZKJ5TAa9YS7HWRXIxx/dIx8oU4iXiWZk3C5zbTrDcp1lVBPCIfdgCq1MOvhsbOD5HMN\nPD4r+XSRjtTk5MkeSoUq7o5Ke/MO2bmroCisvvIGj/yH36NebVKqrGDo99I7ewDT2EFu/PUaFoue\nufkMFsyUFi5QqbR4+3KM3hPHubkmcOV6hj/61/0k3ryDy6IwPOanUJbpFFJkF+bRGvQMDLgwGETi\n0SLaHi+iV8Tt/gmZ1JnNaH/K8E5VFJqlElqD4b4/zN7pzRAEAadToFxuEY9XGBvzMjjoJJGoMD+f\nZmurRK0mUa1KPPPMMG63iVpNIpWqkUrV+MIXDnHpUpTeXicHDgRwOAzU6236+1202yqnTvWyvJzj\nzp00n/3sFI8/PoAkKUQiZQwGDWNjbpaWslSrEmaTiNusUDTqiWyk2DcSxusxUL57jdyd2+itZkIn\nHmHt9Yuc/o3nGJ/ZdWHtaI2U40kWl3N4XXosRhASy6gJP3IuhdVpJ7+6wtBjj5JZWqKRyzH+qU8R\nu3IFayiEUZIIzBzC7PeiF/S4urvwjw1RicepxOOIul3VVLvRYPv11zG5XHs+Me8QkXfQKhZp5PO/\nIiP/3PFOSu+f/dmfPeypcP78eb785S/zh3/4hw97KvcVXV1WBifC1LIZaskUAh2CfiO9ISMBjx6p\nZkDfaaHvNCg1DcRWtlFcKn67nsGwHiWXwu41UdJpEKRdD4BadIeDJw8THrWjSBK1rUWKW5scdenw\njQ0huIf51nfWScZLeM0aAg5wCUW2XrmM3mLmiacP8+YPFxg9th+/voKYyeBxiaCxIXv6+ez/+b8j\nSlUsDgs6uUr86hWMbg8aRaJY6ZDJ5ugd7UKj07NyN4o94ObQ8UEiOwWsJgGd0YKxmaW+tIYukGTY\na0cqKhQqMvbDZ6l1Hcbp0OP36NE7XWyULMwvJlicTzE44IBGlfhKBL+pzpnzsyzejdP3yClGlQpi\nKU7y8kUsXd1kN7aw+7z4DswQv34T59Q+Uptx0Okolppsv7XD+fPD6DQqCML7Hk7vwYeU83PLy3tE\nBIBOh8L6Ot6xMYw/hxpMlhUuX46xspJDUTqochuXxsikP4BSKUA5S18oRO/pAa5djfE3/88bPPbM\nfhw+F4WclkfPzXD2mSlSi8uo7h7kdIPYRha5XkUqfAvzzEn2DfUTsozw0jfeIh9L0TcS5PBj+3AJ\nRcShPqy2FJ7x02SNbix+Aa3ZwsJyHlu5SrVQ5uDMKF6/hZuXt/n/2HuvIEnu+87zU5nlvfdd1d7O\n9HT3eI+ZwWBIDEASAkiKkERK1F5QsXtxoVhdSKd7udi4h4t72FjFRUgrKk6hoKSTyAUIkoIjMBgM\n3Hg/3dPed1eX9zbL3kMBQw5AOAEgIAW/T52Z1dm/yMyu/zd/5vttJTexKvXk4hLrhTgXVyK4B/p5\n7BvbKdyZo1GrYOnuolnIkEvlmb0+h2XPMR5+9FGKlSbZpo7nfnoXu7zMg6fGqNWbXH/hTUa6VMRS\nNRxeKzPTMVbniuwZC6Ipx1i/cYeIvIXTqqLrwC68vQHW33qL+NQUnn37ycqd5Ap1jCMTZBbnqcry\nqKgiV6txjIzcN9pbiMUIX7tGOZVCUCiwDwzgGBlpl0M/ZSwtpXjuuXmuX287RAeDZvbt8/Ozn80S\nibRLLBsbWZxOHbVak3q93edx7VqIJ54YJpEo4vUaCARM5PMSx451YTKp6O42k89X2djIcfVqiFAo\nz+nTffzZnx0km60QjxfZu9fHpUubzMwkGBy0oVCIDAy0FWCdDg1CMURXj40jj+zCIyapppr0bP86\nPPkN8tE4uXwNe0836eUVbr0xjVyhoO/AGFaXGX20hpTP4jDI0asrrP/8X6gmY6gHuzA4HUiFQrvR\nNBjENTGBweul68QJ6pJEOR5HY7ejd7vZOH8emSAgiiL+AwdIzs9jDgapv53tVJvN7ReGXzHVJBPF\nX6sk/G/IyGeEK1eu4Pf78b3dkf554sSJE3z3u9+lUqmgVn88cah/S9BqlTxwrJuuLjOR9ThOR9tC\nO56sEJ+eRiiWMDpNuKxyovESrWYTi1lJK7VGqwUb00u4LCJmtxNrIIh/716qhTw6i4mFC2lKi5Nk\n19fx+kyo5DVayS3kCgGTUUmz2sKmqXLrqZ/hOh5AioTJSRU0Bi0nH+yiJmV47f95mUxWwh7woPV1\nsl53Ick0DAw5OLxPyeI/P4V/ZJhyS8nqhcvIdVmuntlg7OgOdn1rF+nkMFaXCYfXyrPP3KGsrKKR\nVUhcuc7o4R6m/+779Dx4gt5HvsrajShv/eANBFFEUGvo3jOGwVgmHEnQ1W3l9RdvEwvD8HA33UEd\ngz16OjptOAxNysUqRp2LtZcXaLm7uDOfQVYz0EgX6dxzAHP/COHFDSKTsww/fJJiU0toNcb8pTLV\nmUsoDQZco6OYAoH3EAydw4H2fcaCa++yMgdo1us0arVf8emPjkikyOJiikaj/YUryBWkqgZa7g60\nqmUEpRJrXx/lmsCZV9dYW01z/uVbHDoURGvSotRqeOrHcyxfuoZCaHH4gV5G3BZCFy+i0QSwIjF9\nY5lgwMiJRyfIlVo4vWYszSTJG5cI37lLvZCjEA7T7D/A+dkWOouZng4t+YKSriNBhjoEwuEMOnmV\nhevT9O2fwBt0UoiESSxvsP/kOH//g1s8+Ug3Ji1UCwXkAmiSWRQWG5EbVykYtbjGJojOLtBlKmMf\ntrF67lUmjo/TcttoKRqUQ4u4x8cplk3s0uro6dOyObdGYDBAbGEJk9WKxapj4cwr6LwdpJMFsvk3\naDm6mCm6WVrO4DBq2D7gZPc2IyaPE4PnFx4pdUkidOkShUjk3r6t69dR6vX3prI+LUhSndu32+qp\noiij0WixtpbB4dBw8mQ31WoDh0NLLlchl5NwOLQsLaVRKkVEUeSVV1a4eTPMd787zrlzq9y5E0Gp\nlLN7t5dise11k0yWcDp1GI1qpqZiyOUCp0/3cfNmBK/XyeOPD7N9uwuNRo5KJdwT4YvGJfTVBmPb\nzOiyy7z5N/8dWTmPXK2k59Qp/AcOokJDtZBl+uWLRCMlDGYdokJOj0+F3eIjF9PQ022iOpfmztVl\ntPImmeVFKknTPbl2Ua1m7qc/pVGpUIzHsXR1oXO5KKdSbJw/T3ZtjUajgVyrJR8Oc+jP/5z5554j\nHwqhNBjw79uHlMth6emhks1SK/5iZN7g9aL9lEd7Pwi/ISOfEb4IJZp3YLFY2LZtG2+++SYnT578\nvMP5TKHXKxnZ5mZkmxuAQH+FubkkM0IFVSNPb6cBkpuYjV4aoopej8jP/vkCnSNB9v6n71Eu1qjU\nRQzbekg1ZagsSmoqE157nlpWRr0p485Lz5NP5hjb38PgyQd44rHjTE1FKM5NQq2KpcODeTjA6muv\nkZydJXBgPzMvvkIhV8bstJNKVbj42ktMPH6a6ekyucVpTNqj2HUa1l5/nc6Hv4LW7qDVqmI1ynnp\n78/wwFd30+GQM387StqqYt9AD3JDF+nFRTS2fnLXXoOaRCESJpWusBwq07V3Ao1exdpmmZ/+eIrj\nxztZvr3IztOHGBoL0KhIPHKyg0pZYmE6QibfZGQsgF0j0cimEY027txNs7KSoV6rs65o4NhrQBIa\n1MoVhk49gHX3YW5MpYhPTxOVqSlcu4BcraYQidDz0EMEjx4lNjlJrVRC53TiGh1F/j6E2NzZ2RZn\n+iWorVbUFssneiZKpdp9UtoA1WKRrcUCHpLUKxWKkQjG4QkaLRk6p4vFpSi1co0vP3mIv/rrG+j1\nKqxuOyu35zl7ZoE/+M44ldoF3MODFMJR5OhJxUElq6OtFBCTaWx9bqKxKCavi0IUZDoTd9+8zeHH\nv8bthSKh9QQDI27Gxz2snnkRi9/NE09OsDRsxqCTYXcpWbNYCM+bqUkS+wbl1NfnWHrzDYRaGYvL\ngn14G5GshLpZIbWWIn73Lgq9gc1ra2RtJgLHTrK0XiRbNZMK53AP70Rj0OAoRaknE6gsLlxeCwrv\nIeTUsXfZiC6uIeiMLK/mkOrQKTexMXMH1YiedLpCJgPxHAzsGsTvub8ZuZxKUUom79vXajTIrK9/\nbDJSrdaJRosUizWMRhUulw5RFO67r+VyDYNBhdutJxIp0Gi0WF5O43BocTp1FApVfD4j6+sb2O06\nJKmB3a7FZtMwPR2jq8vClStbvPLKMgaDkkymPdb76KP97Njh4rHHhjh/fo1CoYrLpWPHDifLy2l6\ne61oNHJEUaBUqpJMljEalRSLVR5/fIibN8P0d/Wyu09g5u//BrnYQtBp0NlsrJ0/j7Grh6ajk9xG\nmKXNEtW6jH3Hh4nPz6OS1WiGtrDrNcy/sYjFaWb45BHmnvkxCpXinj9UfHYWSzBIan4ec1cXgiCw\n+vrrOIaGsA8NEZ+bQ2ux0CwUEORyCpEItXKZ/kcead+jZpNSMolMJsPgdmPq6CAxN4eUzWLq6MDa\n14f4axSz+w0Z+Yzwwgsv/Fpdej8MDz/8MC+88MK/ezLybphMavbs8TE2bCI6OUlqaQkAp0PDngc7\nEQpJAn4dKqOBt66maSj1hNbjVM5EmDjYj9OlI3ktRSlbYFBT5/JPz2LWi6AXiS2uQ+U5dvaN0tdv\np6Zwos30oZK3uPkP/0CzKkGzSXJuHqQS7m4flWqL+HKESqGElM/R1e2hmUsQXo2y65vfZfXuGpOR\nIoYdD+F3KDndm8b84g22VuPUVP0M7OuhUcwyt1ZGV1zCo8xSmbuOXK1C1OlJLy3jrjbwebQoymnW\nbyyibSn48uEA5VIBk6xIbivKt35/N4Z6hs3FEBfOTCEr54jOGQmvxXjom0cY3NXL1vIW0egmjUYT\nmSBQE5WsJOXITX3s/497CedEplbyZDa3MGtaiLl2qrxeqZBdXyc5P8/AV7+Kye+nUat9qOmWrb8f\nKZcjs7pKq9lEY7W23/4+4ReiwaBELheQpDqiKNBqtShFIxh73DQy7Z6WerlMYnqK4YF+1tfzyFVK\nctUCoY0sUqkC+QRanRL/QJBSOoNgMHHsj56knMkhS0bRFVaxKJzYJ/bSrJnRyBuk8y2StnGK5Sb+\nQwfQChI9pipzcwleeTWCnDrVcgUjOSxNCVkpT/LqW0SvLaLs97I5l8c30Mu3vr2TltVDbvIak88+\nR2wtTEtQYDGGySUy6Ed2EQ2lMNrNyGkSD8UxqJo4gx7C6RaL86v4h3tYvbXEus3GwfE62dkp8mUN\n02+F0CjBNbGHwS89iMVpJHRjkmQ0TTaTQOd0kMlIlIo1tG/zgFarTQSi0QLDw/eTEZkgIBOEd9+C\nj12ikaQ6Fy9usrycpl5vYrNp6Ooy09nZlliXyWTodL8Y835nf7lco7fXSkeHiUSihF6vxG7XYrX2\nMzMTx+PRc/hwgNnZOEajmsOHA7zxxtrbfjUZVCo5lUqdy5dDnDrVy1//9VWWljJ4vXoEQc/8fJru\nbjNra2laLXjppbYAnyjKcLv1HDwYYGkphUIuo6NDT2VzkvDVa+3RXZeT2N272AYHaNRquIJ+slsx\nIutxjjy6h9i1KxSaKpZv36CQSGNzmtDZLOTCUbxH99Kxfz8yUWTo8cepVyrUJYlms4kpGKSUSDDz\n058iyGRUUimUBgMak4lWo0EpkbiXqeo6dgxLTw+phQWy6+uojEYCBw9i8HoR5PL7sly/bvyGjHwG\nCIVCrKysfK4jve/G6dOn+eY3v/mFIki/Tij1evx797bfzlotNFYrQUEkuqykub+PZMvC4uoquZKM\nxGYUjaeDy5e3ePRrQ5x/fRZvwMZoAOrFIvm6iMWkRKMWaMrk1NJR3rixxviQEXeni61r15FKEmqt\nCr3NgsqgRyYDn1vDxlYRuayFUq2iY7iH8nyCUEoiUG/yzA9vMj2dwN3lZfXVKaxWLcdPdHPsyYew\n2HSsbFZ44V+mWJ0L4w+Y2b/dQ2UrRrVUJLcZgkaDjkOHsTj0iLdnmTl/g0pNxvrcJkbbFF/5k+/w\no5deRuV0MzJwkMr8GteWQygbRVApqKRShC5f4ZrdgPexYTzD/ejeWiefl1BpVfTtG2M1q6bXqUPj\n9pKPRtGqBAYGHThpkrp04971rlcqNOt1aLUQ5PKPJBeu0GgIHDqEY2iIZqOB2mJ5T+9JLlehWm1i\nNqvuU6h8P7RaLSSpjkolcudOFK1WQYdPR/+gHYOsQLX5i4yJUmgw0GNgY8vG5maBRl2DL2jDbpKT\njjRIlksgKFHpnViDHSjlUJ++RosaiUwOa8BH9NJ5NCYdkTLciWiZPfsmlUwWUank+LcfQWv3Eb6d\nxePWYxGLrF24jDzpYv+ElfWfPEPP8QdQ2Z28dnYRpdDAHZI4/h+eQNYokc4lSa6sojaYSacr5OUy\n/AoRg0GFbt9OmqIKpBJXzv4zap0SW38fC5MpjFYjMkGGf3w7pUyBZL6Fvb+P7GISi8eIvBAh6NcQ\nWYlSzFVwjI6x/Ozr6N1ulFotMpkMT08HoVybZMhk4HBosVjUv7jGuRyCKKK12zH6fKSXl+9dV1Gl\nwtLV9aH36pcRCuVZXEzRbLZwOLTEYkUuXw7R02NhYMDOxIQHo1HF+Hh7zDufr2KzabDZbAwP27l5\nM0Kt1iQcLlCrNXG7dRw6FMBq1ZJOVwgGzVy8eJdGoz2+nEiU8PuNZLMVmk2R/n4bqVSZbFbCatWQ\nzVaZmopSLjcwGpVks1U2N3M0Gi3UahGTQUkyWeaHP5zi8EE/87MxymsLnD7mod6UkZpfoJyIY+vu\nolmt4h4eQshHCIz0curxPbjcBmYuzeI88ADhagOZIJIMJ7AF/aQ3NiknEwQfeIBKJgOtFgvPP09y\nfh5bfz+mQIDAwYPYBwcpxePIBIHs+jrlVIpCJIKoVGIKBqmV2qXpUiyGY2gIx9BQu6dnaOhzl/OH\n35CRzwQvvPACp06dQv4FuMHvYGxsjEKhwMLCAn19fZ93OJ8LZILwHo0Ld7cfoTJB5PwGRreTRrpC\nZ68LmVIglanSajSpSzVEAWRWL56BLorRKJ5OJwajhnxVoC7VGRh0E85VmNg1gbQ+j95iRKnToHe7\nyayt4x4bI7URpjNoxuIwUVLaKEqQjJcIrcd5NLifH/y3F8iWIF+RoaLC8o11+oNaJJcBqd5idT6O\nTK6g1FSyGpb40ldH6d9uotBtQxAE9D4vcrWGZjJCIGihJe5l7voiHUMKDKoGucVZHH5Twd0uAAAg\nAElEQVQn3f1OxHyU+MoGlUKZJgKNWpNEKIHRakAqFMnG06jdXTz8J99lYyFEMl1jLSnQQqC/30ZH\nhwmv10ilUiUzfYfIzeX7ekMUOh22/v73jOV+6D2SyX6lgFat1uDOnSjz80nq9SZWq4Zdu7y4XPoP\nPN/aWpZz51bR6ZQcPRqkUqnT2WnCKxNJ3Ln5zh9FY7Wi0OlQNJI8dsxKngB6owaDGhYPdPDi0xGy\n4RQGq4EjX9qFLB9jMtTi1OEJ1pEQzTZEtRKp1kQ0u0g3BHKZCBqbnapUpVZtsLUWo7e7n0IhiVpo\nUCtksbtNFFJZ9K5BGlYr67dmKTmH2AgVCPgNrK8kWNso0Ntvxze2jfzGAQrhMBpNEZVGjtQQaZo9\n6HxBrv7op/QM+Bh68BCV2Bb2gAdxbo1kosDc1RmCnRbsXQHqciXxWIxWvUa2AB2+TpyDg5i7e2hV\nytRVBvY++RgLF25RrVTpGAqg6d7Gyqvhtxd8Ld3dFjo6TFSyWcI3blAIh5EJApaeHty7dqE2m8ms\nraHU6bAPDn5svYp0ukyz2UKrbWucvPXWOvV6E4VCIJOp0Gg0OX68i0DAjMGgIpEoIYoCDoeWt95a\nZ3Y2weJiitu3o3g8erq7Lfh8Rg4fDvD666sUiwJKpYjRqGTXLi8Oh46trTyzs3HUajnj4y7S6RI9\nPVbOnl2hWm1gNKrI5yVsNi379/u4fHmLDq+WpdkMTalOaDWD0WpAr1fSG1BhaRaQyhV2fud3yIdC\nhG9cR9Ro6Pvyl1EYjJRKVWqZJO7de9HWMlh7e7C4rZjddhbeWkZvMSJTqejaPYZv924QBKRslo0L\nF4jeuYPe5UImisSnp6lXq2jsdjRWK0q9nuVXXmHbN79JfHaW1Nwcnp07sfX1sXXtGmqTiVKiLV1v\n8Pk+UXP4O6jXGzQarY+kgPx++OKslv+O8Pzzz/P1r3/98w7jPshksnulmn9PUzX5SITcxgatZhOj\nz4fB5/tQ8aVyOk0mXaZYlaEx6HD0DdKdlXPl5R+TiqRYmw8jarSMnjyA26HCZ6phFIpEC1aCRx8g\nszCD1iAjHU2i6+knr/Vx9UIUQQZWl43eR79GvVggsbxKQ8wQr6gJ+LZhODBGORFn3G8mlZZYj9QY\n2O5n25CFerFAPieB2kg+W6JzVzfRRJWF5QyrW2X2G80UsgVGRz0MDzuoV2tIpTKrdQ3+3lEUpQRS\nNsfW5Ss0FFpunb2KZ/sIo/v6Sa6FUAp1zC4bx785gFnIs/zCszT0DtwuLWvTKzSbLZotAUFvxj/Q\nwY2rW4QTK1gHh9Hr7bj6lOi9dRwOLX19NmQyGXK5DL1eTdPno5LJ0Go2SS8tIddq6Tp2DOfIyAfe\nh4+DlZUMN29GaDbbTaihUJ5GI8SpUz0f+AW4uJiiVmuSybRNx0RRxvJymu6DXrRbG5SSSbQ2G8mV\ndRLRDPEcqJRyth3aTlMnJ16pstOSx/6NPsKpBjazCp8hS2Q+itHsYe75nzP92jVsgwPYHXoknZtQ\nREEiXSNTqKOwOAj29FKv1qnpzTjcFnQmHfpmHVGuQKaxoDHpqdaa1DVmCrEERWUJgRZKjZKenaMU\n0PPimQ3U9QyuwXFKVQGhukUqW8JzZDuC2c3F63HGHz6BmNzA87WTWJ0mKpUmtmCDjdA8Uh2yxSYd\ndhtma4tr59bw2JQopBoOj49SLMztN6fwuLTEEyXMHR30nXqQfKFOR5+HjoAZo8tOKJTDbFbT12fD\natWweu4SqcXFe9c7cusWcrUa765duMfH22Wbf4UYmsmkRiYDrVbOjRtxyuU6mUwFi0XN5maOUqnG\n0JAdr9eIxaJ5230XNjez3LoVob/fRjRaoKfHQq3WIBAw0tNjRaEQOHIkyPR0nG99axvLy2lef30V\naJfz/vN/3o/RqOLGjTB9fVZyOQlJqiMIMnw+PUqlmY2NLDIZGPUKXptcp1hqELAb0WgK7Byz47Qq\n6NBrSV2+zJ2nN7EJaVR6Hf2nH8YQ6ERhdzN9dZ5KKsHY8Z2QkcgXakg6J8n1LXr3bENZzVAvFdHI\narSktk6R1m7HNjREJZPBvWPHvd6r6OoqdUnCu2sXsTt3sA8Oonc6aTYayJVK7ENDaB0ORLUajdWK\nXKNBodOhczrxTEx8ojJovd5kfj7J3FyCer1JIGBi2zYnOt0HTNO9D35DRj5lVCoVXn31Vf72b//2\n8w7lPXj44Yf5/ve//++GjGTW1lh74w3q5TLQtoX3HziAvb//V36+1WoRn5lheSHOzGwSvaqF3qCm\nc8iPCYnuLiOVZAKrTYfKoGffLifa7ApuTYmNm+usXRf5yncfZGK0F8oZVHKQRC3X724hFWsUYnFe\njiT4ym9tx7tvP6JOT0Z0kK3pmNxSsHBpGbFZ46GTemxWI8O7TGiXU5z50RvUWgKO7g4W5xOI5hbh\nWJGRsQCHdttYX8+ysZ5heGcvN69vcOapC1jsRh77vT34lTnO/39n2H1ijKmfvEC9JeLePoyo1nL7\nlcsc+QM/a/Ob+P1GrD4H6y8+S1Eqou8IsjqfZvDgGCrdbhbuhui02Oka7aFeKXP97DWc20cBGel0\nhd5eG16vHqtVc5+bK4DR57uXCWnUaqjNZvSfsq/F2lrmHhF5B8lkiVSqjMfz/u6ijUbzXdtt/w+Z\n1kTPqVMU43EK0TiT5+8SidcoptIU43E270zzlf/1O5RTEeaf+QlSuYLe5GR5q8Bmo8KB//l75Go1\nlE4fGVuFWxcjHHtyFxdfm2X30W10jxiJJiS8pjpWTZ1quY65187W7ApWs4Lbr97GatUx2G/l+MlB\npPgW9Qf2o9KquXQpRPewH4PdgrxzG0//ZI5OnxavXU9Mbse808yODi35CpyfqpB/I84Dx3twdJox\niB1k1lZ5/m+eJTI5hXfPfob6Lfi6XVBv0NnrwmuucfBID6tXbyO32dG6fWxev0n/oA+z04q/v0V0\nPYpJIdG1tx+NRsHqaoZyucbAgA2Px4BOp6ScTpMPh++/4G+PYzu3bftEY6E+n4HOTjP5vIQgCGSz\nFRwOLY1Gi0ajRaHQ9pTxeu+XLS+Xa8jlAteuhchmJfbu9eN26yiX66TTFV5/fRW9XoXXq6daFZmZ\nSdwrtSiVclZXM/T0WOjrs+LxGDh6NIhKJadaraNUylGr5bz22ioDA3ZsRpG+ASfnnruJQqwzMuxh\nfNTFxnKEk/vN+JXbMZp2k5yd4c4//YhCLMXR//J/sLKUJLMVwePWUy0UCZ8/j2TwUdfakZOFVpXg\nwQMIcjnVQoF6Lo2UyaAym9G73VQyGSI3b4JM1v5fc7sxer3INRpazSaJhQU6jxyh2WiQXl6mFIuh\nd7nQWq10HDiAd/duaDZRGY2/sr/n42BpKcXFixv3JtXS6QqSVOfw4eDHJqG/ISOfMl577TVGR0ex\nfYqupp8WTp48ye///u9TKBTQ6z84vf1FQa3WYHMzRyxWRK9X0tFhwmhU0Wo278mMv4NGtUp8agpz\nMPgrywPFWIzY8gZz8yU0lTiL565CvUZ5rBu7U89Yjx6fOUgTOQabCSE/R6vRYM+Agt0H95JMFnGb\nWnj6gyz8yy0i0SiZmpZkqMT2fTt5YblFPprln384zR/+wSH6xg/xxlubzM7kmXkphFanYf9BP9fu\n5MimI5SkJgcPBcHsYmszw85dHehsVuqiloEuPT26FKtnX2FrK4vD76RqOYg/YGH/g9u5OxXDIG/w\n1jNv4nKYyJVhYyVGU64mJS0S3DaAw6pElosxPOqje+8E2UIT+0AfsmaDrZUIky+9hZwqu07tYWTb\nODpvgPBGghefvoYgiPdk3hUKkVxOYs+e9x9T15jNaD5iureSy0Grhdpk+sjPgUr13oWt7Wz63i/T\nXE5ifj5JOJxHpRIpFCT0+l88Dw6HDqtVg1wuotTpiK6GiSQk9HolapmOeiZBLpYgsRHBpFOh9XXg\ndVrJbm4hNmsYHF5cfhsutYYzzyVYno8yvr+XSrmG1WUh11Azd3WLEw/1c+epn3Jlch5/pwOxEEPX\nNYAoiZz88jD9E73oChss/svTLNxaxtrhY/zrj9J/4gjqnhRXbyXRFGRIlTrFUpXkZp5rm2XqTZg4\nNEginGYjXMFo1hDayJFKltjWKSd84w7NFvj6/EiRFZwuNwdPHUFlNDI9GSHaVKM22QgcOojUVCAq\n1cilPJtnf07GbkPv8eCfmMCgqmM0qjh3bpVQKH/v+gUCJo4eDb5vs6rsU9Cm0GgUHDoUIBotYjSq\nyeUqlMsNisUqMhn09FgIhXKMjrruy4xFo0XW1jJ0dVkQRZF0uszu3V4WFpI89dQ02Wxb1v7hh/sQ\nhDrJZJlwuO1RY7GoSSSKVCoN1tYyHDzYQW+vlbm5BF1dbi5dCrGwkMRub/vaTF2N8fCXuvjOH+6h\nUpTo3uYnk6tzaLuKlWf+iejtW2i1CjqPHObwn/4JGzcnSWwmePEvfoDJZkY2aEIsJXF2d1BXGYln\nm1i39SMkVlk4+zrxuXmoSujUoHe7qUsSM08/jW1wkOTcHNVCgWIsRvDIEby7d1OIRLD29qI0GKhL\nEvlQCFMwiG1gAN++fZj8fkydnZ+qUu7CQvIeEXkHGxu5t7NYH9yw/m78hox8ynjuued45JFHPu8w\nfiUMBgN79uzh7NmzfPWrX/28w/lQNJstrl3bYno6fu+BdzqTPPBAF3qN7L6Z+HdQr1SoVyq/koxI\n2SylqgydssnmpUlsBoFavkIptEqmqMM3Pkp58iJ1ScLz0ENEVpZo1BrounrJJGNk51ZoukTW3loF\nuQK9P8jm3S0UcqiGNzhwaJgXnrlJbAumrq/i7PZy/lqK828so9YoMTlViCotc/NpbCY1KlWNlZlN\ndh3spVisI7TqfOfUBEqVAml9gTd/dBOdRqSSzbORL+B269H1jjG8I0Cj0SC0EiG8nqBeM6E0ZxH1\nZoRaFVldYnExidNqQ9M5SGwlzsbMCtuO7yNNgaZUZev1u1i8LnRCmalnnsV/YD+1phyjrxtXfxKZ\nSovul3o3tNpPLlhVLZWI3LpFdm0NaGdUPBMTH+l3u7utrK5m37Z1b6Ojw/geFdZqtc6FC+usr+eA\ntoGe06mnWq2jUslxOnXs3Om5r/lV63DQuW8XszMxBIea0WMPU4hFabn8aCygts6yOb9G774xXC1Y\nuz3Dxp0ZnNtHiIbSHP/KBKnpO0RzFWSCjkvnZjA6LITuziOIMnY/MIJGKbCykaMan0YRHGL22gpW\nh474+gIVuRV9t4KteJHc/3iN/b/3GDqThq8dt2HW1/A84mD6bgxBa0ZbVpMvQ6PeYCNU4Ob1TXbs\n6ebO3RgKuUiP3cb01Tk6er0kUkaWZ1bJX9ugWBUJHjuGYHEQDodpLW9Bo47eYkIm5UlO3qJZr6NQ\nq6gtL4NMhnt0lHC4wNZW/r5rvLmZIxot0NlpwRQMEp+aundMJorYBgY+FZ8ajUZBZ6f57RFd6e2m\nVDUul55CocbCQgqvN0p/v7UtrV9vEokUGBlxcvbsMpLUIJ+volK1DTKLxSqHDwcoFtvu181m656d\ngEajQKdT0NtrJRg0cenSBlevblGptDMiiUSZ69e3UKvljIw4mZ6Og6hgYSZMPRUlthEnX9zP17+1\ng7WnnyW/OEthZZGSKJBd3+DI//7nOIYHSURS7PnSXlQKGS6Hmo0bd7ANDGBx2/CKKXKLBerxDbRG\nPbagD61WhUDb2NHg8TA5O0vk1i36Tp8G2tlelcHQHqePRmlIEs7RUQxeL0avF2Qy7MPDuHfs+Ezk\n+t+drWzH1I7r4+KzJiP/DdgJ3OB+B98/A74MaID/ArzwGcfxa0Gz2eQnP/kJr7zyyucdyvvinb6R\nfwtkJJEosrCQuo95x2Il1tczjI660TmdVNLp+37nnQaud6NardMS5SiEJnqNiFaQiM/MIpXKlB1W\naiYR745tOLdvRyaTsfrGGzSrVaR8nsU7S/gOHaVvrIfQhQukV1aolCRUdgfW0d3cevYmqxsljv3h\nOHK5iEEjQ2vWI6tVeeRUgGSqzOpmmZaoIJaoEOi0o2oUSM4tEd+oQk3iS799iCvnl3n6H69i8Vix\npafRahUUskUSqQoarRIqBWy6OnK7jhd/nCCfkLPv8AjpzTCLs2H6Dx8geusmGquFu7NpBnbv59yZ\nOSrpFIf2e8nM3UXr7UBudbJHZyY3fRukPBlRzcbsGuYyOFyd9O4cYnV+i2qhgFKvR6dT0N39ybQ+\nAOJ37963cCVmZ5F9xHq132/kgQeCzM0lKRSqdHaa6e+3IQj3L3rxeImtrcK97VSqjE6nYOdOL8Gg\nGaNRhSDIqJXbCrsKtZpcU8eZC0lW7qyA3sYPn5rlt797EEupxk/+7hk8TiW1ksTkT54jeHA//sNH\nufA/XmaPRk/Xth4Kc9eIzK0weHqAFFYyMytYHAY2FjZZmUoALXweLUaThrWVDA886Mfqc2E0ybl0\nN8Lc3S1kMhlDQ3aKsQiJxWUsKoHom2fIatVEKnrEYouuEydo1OrUSmW2dwoMBwPs3+tF57Dzyqtr\n7Byzki21CPT5aDZbFHIVLB4bVp+D4K4dXJ3KsXenl1xCh6C1UI5HCHrMFDdWMHZ0tBVTRRGZINCs\n1xEUCorp2nvEOZvNFuVymxR6xsdRaDSkl5cRFQps/f335MU/LWi1CoaH20aI0WiRyckojUaL48e7\nmJqKkc1WOH68Pa1jNmu4dStCsVhFqZQTCuWQyWTEYgX27vVx+3aUGzfCjI25efDBbjQaOWq1SH+/\nncuXNykWq6ysZNBoFBgMSkKhPLdvR9m928ujj/bz7LPzbGxk0euVSGUFex8Y5NqLWboHPew90ou6\nUaC0sUytWESp11OIx2nWaoRv3mbnH32PyD/+hKUzr+F0aAhnknjHx3EO9LJ8+Tbx1RDB3TtoinJE\nuYDJaacQ2qCazaA0GNi6fIUd3/42S2dfJTI1g72/h3q5jLmzE7lWS+DAAfQeT1vtVqmkViwiqlTo\nHI6P3Uj+UdHbayMWK91HSrxew8fOisBnS0YmAB1wBPgrYBdw7e1j/xX4v98+/hL/TsjIpUuXsFgs\nDA0Nfd6hvC9Onz79b8bFV5IaSFL9PfszmfbUhnP7dqRslmI8TqvZRGuz4R4bu69WXas1mJlJsLCQ\nxGIU0TfAFXCwVikhFcuICgWCKEdtNLTHf/fvJ3L7Ns1GAymbZevmbZJbcdyFDK1YGVGjQeewE729\nRCu5gsnnZ2hHkGwZltbLPPDlEXxWGbGrb9GyaqhU6jz5UDfzmSDTs3GOHvYzd2WWQnwLT8BBoyVi\ntGgRRZHXzi4QW4/Tu6Mbi1NJLithMeuwWIrYbWqWltL0nbYhSSUCPj1f+cYEdlWJ1fMXufLqJLmC\njvHv/A4thQZbNItep8S6GEVjtSGTK6gjsLWRoDW9gMdrRrF9mGw4iVKTI7u8jFDOoKrmCFoUeHa7\nWFmM4/ZZ2baz7WD6SVCXJDKrq+/Zn1tf/8jnCATMBAIfXApq9xTc3ydSLNYolWqYzWpq5TLR+UU2\nNrOEQgWCI51cncyTbZkI7p5gbiaGwd/BzGqZTnuTza0CgsKM1tqBVKkzc22R3Z09WPUyZJkwHf5t\nTF4vUpGaTJ99i32/8zh7D/UQipRwdQeILGxQKtVQ6zRUKjX2Hu5DbdCj0tUoVGs0miAT5RQLFZbm\n4wz3m3B6Lcy89CqRW1NUKxLbv/Yo6VQZv7mKzFFlcNcA1USMteuT9Jh0pDf1PHykH4NVx8bSOvsP\n7mDlwmWya2vUkTNwcIx4RcX5F66hl1UY6jdjHdiDtDaHz2+kmqhTs9sx9/RSK0vIRdDY7bSabX0P\nhUK4TzROpRLvjfUqNBo84+P3SPxnJR/e19cWGTt3bpXhYQdud9vk7p1sSDpdxm7X4XbrSKUqiGJ7\n6sZkUpNMlrFYNG2fnjtRQEa5XKNQqLJnjw+XS8eNG2HkcpFmE2Znk4RCObZvd9Lfb6NabWdYRked\n2O06UqkStVqDHd8cRqNscerJI/T0WDFWwpSTGVq1KrV8FpPPi8ZiQZC1cAwN0KiUya0u4vKZoVyg\nEE+SmJun6+FHuPD8FZqNBtFUlT0nd6JWQHJ2BlEhx9DRgaBQcPX732f0d38XU3cfC+dvIIWLBPp8\nWLq6cO3YAfBrNyvs67NSrTaYn0/SbLbweg2Mjbn/VWvLh5GRIeCrwDvF4k3gX4CZj3DuvcDLb//8\nCrCfX5CRd1YYLZD5qMF+0fHUU0/xxBNPfN5hfCD6+/tRKpVMTk4yOjr6eYfzgdDrleh0yntW8dDW\nOHC52sZNWquVnoceophI3NMOebep0/x8kitXQlQqdZaXawQ8dvYOmBk+sY+WlEcuiBhMGjzbh1Fb\nrRj9forRKNm1NSrpNNa+fnZ0D+Ea6SeyuMHFKxG2D9uxdRTZml8jEwrjHd9LsKOf63czjG+zEr50\ngcjMAj0PbScvypFimxzbZWPbcD82ZYkOt4KQ4OGNl6eIhtLsPjKIyrrMth1+No1KRJ0Wz4iPzNo6\nAi2atQrLizn2fO1BUhUVEzuDGOxWrp2bJJMuMDS2k2/8n8dIhmIk62auX1nn0E4rubkpLHYDK4tR\n7GY5yUyL+dt30SvrpKduY91/ghuzNTamQ3QN9dHZ08XiuTeJTM+y+9g29u/ciSDGcdg/BXL9PgvV\nJ22gezcsFjUmk/re9AyAXC7g9babXJNzc9y+GWZuLo5aKaeBnPmZCptbRTqDRkp1BVuhDHK5nPyQ\njWSmRqBbAQIUsyXKJQmxVkGoFilKLfoCVurjPeQ2N2k1qtQWr3Jk92GuzwoYgzYcwUXcTi12pwFE\nOR2jQwjyFnWVhZtTaQydXRjjRRotGd5+N2OPTGB2mrFrqtTtWmoNLTplE62ljiIyS9DmJb4e4eLf\nP00pnUep09G/axCPVc7mmgWdRk4mVcC3axcnt+2m2lIiyTRMXl9Do1MBLd588RZqtZyTj+2k90gv\nxVSGW8+eZe7uJuVUEqNJw+7+IaKTk7h2jDE66mJmJkG5XEOrVTAy4sTpvJ+cftZKnTKZjI4OE4GA\niVAoRyJRupexkclkCG8/R3p9u9QSibT7QEKhPLduRfje93aytJQmGDQjijL6+qy43XpeeGGBRx7p\nJ59vC4hpNCoajfbouAwZer2CWq1BKlXhZz+bw+XS8ZWvDCC06li0LWZvrrC+kkBT0HH+rUuMHB5j\n4PGv00Agt7JMqyZh7u/DOTJCJZPF6PGQWlpCpZSj0qrReHxIxTImq4HoyialdJ7X//F5Hv/T76B3\nOankcuQ2N5l79lkqlQalTA6L2cLBP/o2lZqIzGjF4Pd8bo7JCoXI2JibgQEb9XoTg+Ffn4H5oCfo\nz4BvAT8ELr+9rwP4Z+BHwP/1Iec2A+8o32SBd8/5/RXwGPC7HyPeLyyazSZPP/00P//5zz/vUD4Q\nMpmM06dP8/zzz3/hyYjFomFszM3Nm2GKxRoKhUAwaCYQ+EXjo1ytxvQ+Ggb1epPl5TRKpUAmUyOb\nlTgzlyBdaHFq/wFsHd62K6XBQK0pkM1K2FpKjIEAtXPn2q6jDj0NjYVQVs7KVoNEpsHcYpq+gW56\nHQ66D+6hqPOzHpbYNt6Jw9KiqIWR39pDq5glu7FKrSRR1tWxj+ylUZTocCqYWijg7/bg9xkhEyUT\nsZDNNAl2WVlaSrEQ0uM7cBhTM0FJbsC7bZjJDehsNFmaXOfs02+xePkONpeZTrPEpStx3GawO+38\n9ukhonOLVDcXsDoc9HxtDw6/g431LJ6+DtLJEoae7bz03F1Udhc1uZ6VpST5isDYoBmTXiR66xYN\nScK3eze1cplCU0Gp1Jbe1uv/FWN77/i/pFK03hEak8k+db8Sg0HF/v1+rl/fIperolSKDA878PuN\nVEslUtEMlWoDaytNan6dTM7DxNghQtEyBqMamVxEoVER6HXi9NuxOQ0o5AKFooR3xzaMqgbFfBHN\n2BFCkprMpWV6ens59HCBzOI8pXic1YtXmThylKwk8lv/y9dJT90kubiExaZDnlzBHAgQlxk589I8\nO3b0su+3e+hwy2kkNiEboxFrIlJFp1OiMZtQqQTKxTpKgwHJ6mHt9WskVrdoNZrQarC5sInZIGPs\naB+paIbkwhpTFSMbGSWzC2lqtQZjuwI8+e1dzN5YJB7Lo1LKkYsCRp+P5biAfGAPlqIMjcmAKRAg\no3CjLiWJ3bnN+KlTBIMmyuU6Wq0Cm01LXZLIbm1RSafbEx0ez4cq7H4a8PuNLC+n7ysd+f1GLBY1\n5XKNGzciDAzYSCRKZDJl5ueTaDRystkKfX1Wtm930mi0KJdr/MM/3ObEiS58vnbvkctlIJutoNcr\nMRrVIGuRz9e4di3M+noWn89AOlXGZFRy7KifpalVXvynNxgc9RNbzaI0Gll+4wJWsxL/rp3oT38Z\nrdWCqFKxdfs2SoeXYiKJZ6gPmjVc20doCQrMLis7T4ySDPmYvb5AYn2LUiZHZvouifl5GrUaWrsT\njSCgNRtZe+01UKiZu7OGY3CQoX2f3gj9vxYazSfvKfsgMvIfgGHg3S5V/xWY5sPJSBZ4Z+7KxHsz\nIP8R+N+AM7SzKO/BH//xH2N+u0N/cHCQffv20dnZCcDq2ynfL8r2z3/+c7q7uxkeHv5CxPNB26dP\nn+Yv//IvWV1d/ULE88vb78bwsAOXS0cuJ6FSiTiduo+kvPkORFHGlSshtrYKOJ06hoedrK9nKe3p\nQWVIUqtILM9HqTSU2MZ38fKZVXZss9Fx4ABSsUSibqTQ0CBTOvHsttBotpDVKhhMOpQdHuI1A6nZ\nFXq7rfgcOQS1imQrh6wCS6+80lYhFUWi1/L02IxgdiFa3Ey9eY5mS4ZJKyCngSfgRO+UsXr1FvnF\nDcLVNMFH9pMqaym6nfz4bITtOzwUc0VkyRRz52+hU7fYsdPPnR/+GJlKQ2u4g0+L4B8AACAASURB\nVGo8TOruLRomP7liE4WuhLKaRW8MkL7xPOV0Ho3VDdYxmsoQokYLKgNKnUCm0EBQa9G1itSlBqV4\nHJXFyuxSgZmZBJVKezEaH3fT3/9eYbIPg31oCJkgkFpYoNVqYe3txfY+Y9ifBB0dJpzO9jOjVsvv\nva01ZTJErY7szAUWL96iWm2gjOfZtXMPAb+BYrmBz2eko8PI0JCDly4kGH3oEOWNFZSCnIrWwNHf\nO0kilqOynqI+N0P45nkSl9TsfuI0al8nlUKZos7H3/+/F7CY1WQ7W5iFIq1MjKXLd8mHQuz4zh8g\nWbvYM+HkR0/PcPrRQdILk9QzMUZ71cz87DzmQBBbXx/5RIp0KIZ3dARzTy9rSQGzRY8MQACVXk8+\nXaRWktBplUwubNIxMELs9gojfjm79wyzHod0ooDXb+St5xM4PWZ27Axg81qpVussLKRIxlpI2MFg\nIrxcRBtb58RBB618nnqlgt3+i0xIvVpl8+JFUouLbWIpk2Hu7CR4+PD7+g59WujqMtNoNJmdTVCt\nNggGzQwPO5DJZKRSZSKRAq0WOJ06Dh7sYGLCSyxW5Ny5FU6e7OHo0SDXr28xOxtHp1MiigLr6+0e\nkAsXNrBatej1SuLxIkeOdDA/n2RxMQW0hdgEm4Zzryxy8kSAra0cao0CrcVMcMhEZW2OqtaC0Kgx\n9dpV7EEfh//TH3Lzx8+zuJgiOCRHbzOz9OZlvKPDVOslzMEgS2fOUi0W6RjqRe+0k0luQ2uzIvT3\nI9do2Lx0GZ3LhXt8nNjcIhqXm9k3LiMo1ZTjUcqxKKIyQDLZniy02zUolf/2ZlM+KOIG7fLM6rv2\ne98+9mG4CHwPeAo4AfzdLx1TARJQAd43T/sXf/EX73vydxaxL8r2q6++ypEjR+7Vyj7veD5o++jR\no3zjG9/AaDR+pM9/Htu/DJtN+56piY+CVKrE7dtR7tyJIUkNQqE8mUyFxx8fZCNW54HDR4ivh0kZ\nEsjqKjbSDWq1Kleuxzi6cxj3w1ZC18MIKgOvnF1DrdfxxKMPIc+HMSjr6CxGarU6wuICG8/McTca\nY/d3v0Pn0cPM/OMPqJfLyJVypGwag9VE+OJbbP/9PyQjN9G7vZvblxco5Jt0DAaQq5VMuMqYCwY0\noge9RkaXOkbL5cNgNVKrtR2GncYWVlHB//SnD5MLbSFvSuSdakp1AYNJg0ZZJXxrmsEntpNNpAit\np8mkiuhcLiJrEbRCnValjJRKYuzqQUKDfcCI8v9n702D5LrPc79f9+l937fpnp6efcfMYAcIEgBJ\ncAFpWhQlWVdW6ZaXG/uWJd+qVPIpNzdVzoekEldyXZWqW7E/JM61XaZoSaa4k+IGgiAG6wyA2dee\n6X3fu08vJx+apESL2kjRoFT8fcE0CoN655ya7uf83/d9nnaVWmQHrdAkl8+idzjQ2O2IJh835uM0\n6k3ESoVyTs682P5E90RQKHBNTOAYHQX4TOPJ1WoFTudH396UWi16vYJStOuNIZOBa3SEp//Lq/zu\nnzyGwWGlVGqgUinY3sohIWcpZ0FtGKNvWIfOqGU3BTrk7L/zNqn1TbQWE8mNXZ77z/+Vh7/zTba3\nIzgPjrC/m6E/GGL14jyHpq2kbt2knsvRrNVIr6+jGDQwO+JB/2+nGelVsfFsBIe2TTmSBr2NWlvO\n4Jn7Se/FkFptVD0h5DKwKitoh3s4ef4wsUiR/UiRYjKD3nOM8F4Jc8CPTmgSfvtNmnINHYWOvoOT\n6MwhBLWa3//jk6jkoDSaKbb1yOWy7nq0XCCbLJLf3kIml6MdCSKXddBYrSj/RQugkkiQ29r68QmX\nJFHY3aU0OPgr277/qgiCnJERBwMDNjqdzocfuisraba3cxQKDba3c2i1SqpV8UM7+Eqlyd/+7SJP\nPTXGk0+OMz7uIpXqpjnv75fQahU8+OAAyWTl/bVvOclklXZbolRqADJUKgGNuom/xwgygTo6LMEg\nQzMDWMVNLn3v76mm0hh7PASPnaTcgOTaFjduxEhECphVIgaNxMTvPIRnbITs1jabr75KdnMLSWdi\nrqeHgcOTpLb3yd6+iXVggImvfQ3/sWNk1taoFkq0myIKk43ohTexBXz0Tg5STOe4st4mFusObrtc\neo4fD2CzffYnVb9Ofp4Y+Q90Zz02gL33/y4ADAF/9kv83zfoio233//6KvBXwHeA/xMYpStK/rdP\nUvjnCUmSeOaZZ3j22Wfvdim/FBqNhvvuu4+XX36Zr3/963e7nM+MWKyMXq9ieNjO3l4BSeqelFgs\nGlQqgViyRiQjZ2lPQqn88QGgKLbJZyvsxNugNuDT15jxlBiYdFDY3mJnYYmgAwxGPZHLFzE77SRX\nN6mWqyx87zmO/Ol/g/vAAer5PHq7DbfTSS2fx+R109aY+dGLG8w+cAilzUWpIqI1GrBpW2y+eQGT\n08p9B43EdhMsvvgW9/+738PsM6Np5Aj5NRTCm5RrWa4//TyCUsHwvceI3Fhg7P57sNl0lPYzVPMF\nasUKib000Z00ckkkePIkkw/fT/TKPAadgNMqwyd3cWejSinXYTRkxaasYjcrMJ06hVKvZ/Chh4jU\nFeRjScRSiVajgdTpUI7HSc25PpFAhE8nQlqtNvF4hXJZxGBQ4fEYPtZr5GdhsNsYGPHQqInUqiIG\nj4fxI24SqTrff3GRAwfcSJKMhYU4r7+2gcOhZ3bGRT6d4PHzgzgMEsqOjE6jitbuoFgScY2NoVLK\n0ChBOzDF0nKaf/MHJ2nVa7RqDpTyJtTK6I0aTDYT7pAftddAYu0axw8fQSxmSS/dQTLLyRVTNGQa\n7MEelitV4uEUCjnMfcXF+qU3aTbbJCsqLD4nQw47OncVe++9aL0edrJtXCY1iduL6Dw9bG+kEIQq\n4VurzHxpkHazzcD4ILsJkd1oiZMnTUhSd/vhxuUtOnobGkcZsZBloN+CRqdGOzhFpdr6SGuuWal0\nT/x+AqnToVEsfuw1lySJaiZDs1JBodGgczg+tRDt3vPufc/laly/HqNWazI25qRabVIsNiiVugOq\n8XiZ3d08jz8+hNWq5fnn1wGJt94K0253cLv17+fXdFfAW8027XYHlUpgaMjGiRN+FhcT2O1anE4d\nh4/6SSVLDIz5CO9k8RhF4q9dQ6VVIxl1tEolihtrDD75NRpiG5tZhRmoxmNsLizQM9pPz/QkC3/3\ndxT2Y5jtZrxz06RvLZBbuYNKp6VZLmMJ9VMVwdA3QD2fxz46SrsjsTN/DYtdj9NlwGTWkqsK7O0V\nP2xdRSIlFhcTnD7d96mu8b82P0+MvASMAEfonpBIQISuqPjpFYeP5z/8i9ffef/PP/0Vavzcc/Xq\nVVQqFVNTU3e7lF+aD1Z8f5vFiEwGGo2Cvj4LarVAuy0hl0OzKbGxkWZjI4fZrGZ9PUt/vxWNpvvr\nIAgyjDYTznyZyMWrPD+/TihoJnNxDUGtZnyyF00jg6AWyG9u4vTYMNsNSO0WvqFeOqKIZeYY5UqT\nZhuWlqLozE4Cc6fYTCu4vlKh0k5w6HAPEpDNi2i0cm4tRKhWd/GHnPR49fQO+xErJbavLJFc3SUS\n22HizFEEZRO1WKCcb6FQK5g8ewxlp0Ijk6BSETENjrC3todJI5E3arC6veQqEhatDvfoMDuRKuuv\nrzD91CiZisDQoAWfV8fhqWmUhX06gwHMvb2Y+/rYeXuZzOoq2c1N2o0GBo8XS28P7UoR+NdN+BTF\nbprq+nr2w5ySkRE7hw/3oFT+ch9uBreb4IER1CoZ5UoTx3SAOy/ssXwlxvZOmf39EocP9+B06hkb\nc2DUQCe+RbGYon1Ug1hvYBocpCo3sJ3MoNNq2dopYnMYUBkMhBdyvPTPtzh00Mvjj/TRNg9T2V5F\n73LSyKYwB/wo1ErCr72IvneQjX/+J3xzs8w9cJDMrRvIFUbS0QyuwCwdg4PK/CL3/em3aOWz1NJp\n8vEUGneAWqSGOjTAkS/dz/5GlHCkyna2g3lUT7XWQWfUo9ZXaLWhWmqgUbTZDZfYDpfoHfBw6lSQ\nnh4jV65EiOzl8LuUbG2DY2KSQ+M6HFYlV9cqtFMplMosIyN2pqZcXaM4oxG5Ukmn+WMBLxOEj804\nkSSJxOIiicVFWrUaglqNbWiom7XyKWg220QiRZLJKq1WG51OSb3eIperMTvrQS6XEQxaKJcbCIKc\nvj4LMzNeLl3a5803dxgctDE35yGfr3HkiJ+RETvf+94yt24lefDBfjQqgVisjCDIePLJMe65J0in\nKWKzaRgYdpFLV3jumetMHuxDno+RWlqhns9Tz+eRCQrKsShqtYwiekx6GTdeWyA0PYTBYsQ1NoJS\nr0elUqIzG1AYDWitFrZ/9Bq+uVm0NhtqTw9vPfMWnqNN8h0Dc6M2CjdvojfqsFvVyFUqXP0BHJMH\n2KhqkKSPei4lEmWqVfGn3JI/z/yixlKbbrvlC34OzzzzDE899dTnflX2J3n00Uf5j//xP9JutxE+\nw+Pyu0nXtlqJ06lDoZCTy9Xw+020Wm0EQf6+OJHjculJpyv4/WZksq7DpK/PhRjfY3dhDbUCdhbW\nmJp2U9vfxDzmJ76yzdDpU1jdVmr5PFaPHc/UBMmqkvJOFUx6nGNHSCysYhk0IFicXN5RERpsoRVE\n3DqR8Bs/whjs40fP38H0zZN4B4Ncu7BC7HIY0wNDNGVNNHsZ7rx5lb4BJ/uFIvt31hgY9uDqdWOr\nVWnFd5l54hyxxUVaMhWagIve2Sku/sMLGA1axu8bw9jXz82re5w+7qYgtnH3WLGonVyej6JTyxkN\nWBj0NoldfJt2o4LFpKEci1FJJrGqlaibBcqRCNB9Ku4bcqERc7SbTer5PG1RRGM2f6y/y6+TWKzM\n2tqPHR+bzQ6rqxl6ey34/aaf+X1dX4wmarUCQa3G6PeTWV9HWctCs47YkqPRqPD5jCzciCI/7KNU\nrNHj1WOQ1chvFXn4G/eTyBVYWa9x0i1gtFkxpOrEE2WUCjkGlKRFLT1+iYMn+qlVWyzutHA5xhh5\nYAB30EcpHsfs72HvvUuoVQLyWg6jJFK4/DrDjz+Gsp6jVaviHOxn+KEHCd/ZYPaxs3Q6Esk7d4jf\nWUJCTlmUIxcUqKQGWZOBmszB8nYWhaxMT18f4dU2PrcGvd5HPlfB4TSiN2h46YVlvAM9qA0Ghoft\nJJMVVlYyVAslyuEo/W4jSimJUT/AtbeXWby8jv/EPRjcbq5fj2E0qhkctGHweHCOj5NeXqZZr1Op\nSZhCfVRkRrSN1kccUSvJJImFBVr17nZTu9EgvbyMqednu/n+IiTpo2aI+XydalVkZsZLMlkhne7O\nTgwO2jh0qAeXq4BOJ6DXK7Fa1RSLdS5c2KW318wjjwxisWhYWUnjcOj42tcmeOutXdRqgelpF0tL\naSbHbByaMrO9uIGhkUeKFdnblcjEMvT4JhBkaTLr63imJ2hks5QTCVR6Hba+Pt76/jKTR49SSGRQ\nCHDfd/4dCEqyW5v03XcvWz/6EQqtFq3FhNHjwuT1Us4V2b2ziNZsRm9Us3YrRTQ0zfjJ+2iXcvgO\nHUJlMGANhdB5e1h8aeunrpFGo0Cl+s16X//Nm3L5nCFJEk8//TQ/+MEP7nYpvxK9vb14vV6uXLnC\nsWPH7nY5nwlOp55Tp3q5dSuJUa9ketzCyKiLtc0CDocOkJAkiVDIDMgwGrt280NDNnQ6FTpVh/Ep\nL6lYnkRFhlqjRK5oITUbNOodqvUWE1/9Ks1iHkmuYG27QqaupL7b4NryOmOTHkbHDmK3G7j47j6X\nXprnj//9MR48YSd+dZ5SsYrW48Osgys/usmhs3OEagqy0ST+8QEUDg9XX34PkJOMl9AZVOiooTIa\nESWBZqVGI1+gsLeHe/oASoePTDxLNlVAFRym78gkmaaOmwt7TJ+aptSucmVLhqBXMHsmhCNeQyqk\nyd5cY+1KjEIkztgjD6D2+KjWJRI7cTwDPcyGwGWeIZOp4vOaCPXJEFMxYjdukFldpS2KqAwGfIcP\nY+vv/8zuZ6HQ+Cnr6Waz835P/+OJx7umVbFYGUmSGAiZMIjgOXgIuVxGUduDwVyDBpjNKgxaP9G9\nNOceHqFcrFJLJxk+/zBXfrRI7PYy+ZochdGGZWyOgHIduS7K6KSX/tkx5LImQZ+G40cP0WpJNNoC\nrUyUfLqC5J1h8IyP0u0raM1WOkBybRNLX4hOW6SUzCC3ODF5lejcHmQmB/1ne6lEdth5+wLWvl4K\n21vEt/ZQyzUUWhoCc25aGiOptAxVo8DkqQPY7DqyRg21YpnEToyJcQ9Ks47dG0t4xCyjXi9KrYL1\n9Uw3cLHVQaHRoLVa6NAmnOwgW69SV1mZefAYsUiGjsMBCOzu5hkctCEXBHyHDmH0+wmvxygXJLZF\nDTde3SEUsnLiRODDU8bG+wOwP4nUbn+YGvtJSKWqrK9n6XQk7HYtDoeWbLaORiMwMGBlb6+ITCYh\nSfDaa1vU6y28XgM6nZLV1QxPPDFKNFpiZsbDwkKc7e08CoWMra08Dz88SChkoV5vY7Xqus6ulRKp\naAup1UZsNyikRBoFicBoP1qlhM7pYOjcA2y++ho6qwXn+Dj+Y8dQaLWMz4aoV8rovH6cDh0Gj5ul\nZ5/H3t9P4OEnMIxMISZiuMeHESsVIteugsqATBAoxlMcCLhRhdusr2c5/uijOC0CnXb7I1EK4+NO\n3n1370MvmA82yH6VQf/PA1+IkU/JBy2az/ua7Mfx6KOP8vzzz//WihHoGmWZhAq5/RJSLU/p1gZq\nyc6lBbGbSaFVEQpZcDi6IVw7O3l6e02olDIEtRq700C7mEVlk5DyCZyjI8gNZsqCmZX1AhOPnEVF\nh045z9iYwOVrKS6+HaYhGHn7jQ38QRtyVRuHRYm/zwmSDIuqRbFdxN1joG/cwdrVFZqNJq+/voPa\nM447OIFytJ+FK1uItTpSs0U6XmFs2Mfu0hrOQ0dRBoZBoULtcNIoltCLItf/378jfGuZua88wclz\ncxTkNhr7FcYGzcg7Ii9+7zqlGmQSCZbupPjWnz/M8o3b5KQyUiNKMRZn67IT/ZyV6/NhBEnkpMEP\n+QSm6B52rZZ2pEVNCCIMBcmur3+YDdQoFIheuYLO4UBj+tmnFJ8Gk0mFXC77iNujQiH/qVXjer3F\nXjhPLlXi8tUYjabE1laOYlHkilbG8WktwX4HlTrEVxMgEyil0ohtOaERN+VCFbtFwCrVGD8xxNWL\n64QvXkTSGCkV2lTyeZb2wOkdZfjcOI3oFj/8mxcY8Cmp5rLIHz5JPpmhx29hJynjlX+6TLWtxhbq\n5dw9TrKZCjJBSV7lo5JqMnDwAEWFk5paRG6xofWG+Lv/6yW03gDDg1bMXj9lUY7/zP0UK69QzhVw\nTo6jG5zANTWNTdAjnZ7E41RTWlvENzWGyWGjZzpMu1xmZ3WP2t4OnYqcpWef594/+Api1YFOp0AQ\nZICAbzhAeHEDdXGf9KVV8rkKwycPMzIZIFbtgCB85ElbLgjUBBML+2mq1RbQ9QLa3MwSDJoZGLAB\noNRokCsUH50xkck+1Slao9Gi0WjhdOpZW8uwspIilarS32/l3nuDaDQCoZCFZ565QzRaZmDA9n7Y\nowWZTMbly/sEgxai0RLXrsWYnfVSLrcQBDnr6xnGxpzs7haYn49QKtSo5Ao88cQwqUQJrclIKNjD\nmEdOqCkhxDdoGIzI5HIGH3yAWjaDzuVCZ7dTzeXYffmHjJw7S82iJba4gD3gxjQ0Tts7yFtv7VJK\n5bFbzXhdQez9CWqpJLGlVbwHj6F0+YlvRQjNTiHKtSiUwsdet+FhO1qtgnC4gEwmo7fX/HNPCj+v\nfCFGPiVPP/00X/3qV3+jWjQfcP78ef78z/+cv/iLv7jbpXxmFFNZrl1YZW053o0B9xqIrd3ArvVw\nZWkfUaai0wkxO+tlYyOLy6Xn6nu7ZPciuO0qhs/eg1o7T92qpN0U8Rw9QVXvpRMUsB6Y5q//6xbb\nW2mGx30YVG3MBjUWg0BZJge0GFQdLK0UUmWdrzwWpN2ugqyDWqvE3eeBepmjj51gZTlBsaEkUWzR\nG3IT3c8xMOhCE7iXaiKGStYivLrH1OPn0HkDBF1e6sVJ7HY9uxcusPLiqwgKFce/+RSVeIzE5XeR\n27wcHBtAZXDw1//7S6Q295DrTbQbIqLYpJbLIol1rF4jYkRJx+Dg+sVVZnxjyAU59YbAjZtxDh0+\nSznyt9RyeTS+IHWTn2JDSXgpgtdr+HCjoVEs0igUPjMx4vUa6e+3srWVo9OREAQZg4PWj7jDNptt\nLryxzvzzl3AGnLzwzCI2vwdfv5diEfKlJmqTh8vX01y/FqVZLDJ37xh6u4VmukRiP8u5B0L0ejRI\nUoP84hVy+w1sg4M0OwKFZpZiWWJ82kut0WH/9iLRGzcJ9BhJxIsYNQrE2A5Oh5O2So/CrOPQ/bMk\nIzl8oz4C0/3YLUoW3rlDo1zAM9aLcvQIYnyPdq3GxvUl1LsZpk5Oc+XKPtdyFR4+P86tFy9gcDiY\n+qM/wWTRE81JaIO9/N9/v0Wt1qTXLkOW3mF6SIsQX8Xu96DyBpl/5odUKk2y6TL+A2MURDWV8Bah\nIyZMhu7129rKozXq0IoZdhaWsFmUFItt3vm75/n6f/pD8jI1MpmMUOijkQBdZ9t/McgqdS34P3CE\n17vdWPr6yG5u8sGEpdHnw/QzvIF+GYxGFTablmKxzuJigkKhjk6nxO3WE4kU6e+3srycptHoUKu1\n2NsrYDarSSSqnDwZIJmsUK+3EMU2Pp8Rm03L7dtJtrfz+P3dFtaFC7sIclCpFcTKLcoNOVpvgB/+\n41XUr21z7wNjhLwKmqUCW5dWqcTiNPJZFCoVlVQKhVqDTKXGqmrQ3F+n9+QxJh45Qy2yS3J7n9V3\nf4i9L4BeaeKNf3iNXFXGyUkdgZMnCZw8iczk4ubFZZTaCvKAFoWgZG0tQ7HYIBSyfmRouytAfrE7\n8eedL8TIp+CDFs1zzz13t0v5RBw/fpydnR2i0Sg+n+9ul/OZsHgzypsv3qbzvkX4lTeWOHQsSMAp\nMDLiIJerYVI1qdWaWK1aYrECiswuRFbY348ydHSKoYPTVHs9lNNpsrt7JAwG9kp61t7a5tr1GB2x\ngd6Yw+3UkE43GZkO8t6lMCODduy6NrWdDUhtY7S2aPumuLOa494HTpFbmCeysYF3eoKx3x1HaXOx\nGWmyvlXAb2mwuZ0jmW/Tappx2jQEzowSyYtEE2rMjQiv/tXf8uV//xirL72K0eXENjxMNZVi6/JN\nVE4vZSHD7WtbzD50gpnT04RX99EqOliG3LRVBnR6NX6fgYX31pid8YCuSjUaoVZrIlMqsPoCqMxm\ncBuY/uY3yezFqSgsaIPD5Io5wrsFms0Og4Pdp2BBpUJQfnrzo5+FWq3g5MkAoZCFYrGBxaLB6zV8\nOLwqdTokEmWuvjJP/NYtzOZDNIpFNm6UMVt06PUG6nUZcp2e9dUtGqJEo9Hm2vUEWjXc/8AQ2WQe\nuVhm6aXr6JspTDo5gUCQ5Zs7WAdG0PQNs7NXpbKa4Pd+f4ZwZQFN0EgsWkQpSAz0aHnvn17l9Hf+\nGJ1agS6yQ8itYWq0D5neyrPfvYl/wEPbN0ZgyoTG7aGT3ebO95+lWa2h0mnI7kZxOPQoVCrkRiu7\nsTr9YwES8QLvvHIb/72nUZst3L6c5PLFHUYGLWSKaRS1HLeqBX73K6dY+fv/j8FHrKilBoJWjswk\noGwUcJqcBII27Ooaa7diXLqU6Ppz7MuwWxwERwMUdnewmnXU9RqqsX2Gjw7T02P6qadtnU6JSiUg\nij92epDJwGL5sdeIoFTiP34cUyBANZVCY7FgCgR+yin5V8Fi0XLggIdnn12l0WjR12ehXBZ58cV1\ncrkG3/rWAaamXFSrTSKRIvV6i0aju/o6Pu7gsceGWF5OMz3tJp+vs7aWYXjYhtGoYm7Ox9pamt3d\nPO1WB6NJzcGjfRRyNdbWM8h1BppiDbEucvW1Rb781QMUr2xi6vGhHAhRy2aRyeS0Gg3KqRTF8A7V\n6B4Hhgao7cVZ/uHzVKstjHIlses3sIT66D88yeqFq/g7boytDPbRUSQxiqaewj11HLVHSbmtYXk5\nzdpahkajxeSk+xNfv88rX4iRT8H8/Dw6nY7Jycm7XconQqFQcO7cOV588UX+8A//8G6X82unWhXZ\n2MzRed8Pod0UaTYaLN+J0z/qxapMkS9lqMbaKBSTyGVtlM0KzZ0lwjcWQSbQfvk1tl5uMfs797P2\n1mU6Vj85QxwZWvbDpe7qnsPcTYT12UjHsgyNunH1OhkLqshfv4i2UUXSqrj4ym1GzlrwOy3sX1+A\nZofgeJDN119h/dlncU5P4ZudZebRI9yY3yW5n6Gt1LG0lEZtNCAz2NCbjER2szhGQkzffwyZDGyh\nPorpHD0jITKROFqnG41RR3Q7g2AVWLu6ytCjj9A7M04uW6bWUeEO9qK02Kk0BRpNiVimSWCgB1fT\ngsLbh86iQm81I5PJcIUCjIzMcPGdbUrxGpFkg4DDicXrIJvNU6s10epUWIJBdE7nZ3pP1WrFTz2h\n58Ph7jBltUrdOUx2d59mo5sPEuhzsLGRo5jKYQ3qMbn0CAolKrMZl1ZPXq+lXJPYWkrRG0hg0cuQ\n6k3iK2sEB1xozAZktQSTcyG2wjmUFiXHjwfw9zvIxLI43GZyOwL2wwNYdLD39pvo3S70ditr33ua\nzZvrqCxWps4/gG5uGEmTpoWC6ytV2s0Sv/8HPtZ/8BaJ7SgqlUBjP47V60DMpggMjYPZg2/YRirq\nwuCWOP6QlVSyTKlUI7xbpFnM4fL4qa+to9SrqJs8pNtW0h0zzkwJ/8QAycVF5O0CJpkOg9GE1Sin\n2pTz+rubLK115zlkLQV3Fja49+QEYq2OUiHHZzMS6LUyfaL3Y++Fy6VnMTPaSgAAIABJREFUZMTO\n8nKaVqvz/gbLT7cIlFot9qEh7ENDv9K9liSJQqE7D/STAqdaFel0pPddYZtkszXeeWePcrmB329i\nfj6KIMjp77dw/LifjY0sSqWcYrGB2azhhRfWaTTaVCoiOp2SWq1JJlPj0UeHqFZFBEGOzdw1RMvl\n66QzVexWC1aTAkVTicHhplrvUC03aMrVKKbPsvLOdRxaE54+Fzv//DSeuTmyq2tUsnlc4yPUczm2\nXniOWjJBuQqVpgzPyDB1CXoGekht7EFbpBSPM3T+PPFbtxg9PEZRDjuvv47z+Gmgm720upphaMj+\nkUHh3wZ+u36af2V+k1s0H3D+/Hl+8IMf/FaKkXZbwuKyEpwI0SiWSO6n0GsFtGYjTZkai03H4YAb\nd58HvUpCoWzQElNceu11WnURa7AXWbtJLhanUa5Q7agxtqr0uJRU02r6BrTsxlvIZXLk7QadapFD\nh/xMD6mRSy2+9z/+JRafl3C4gNdvZX8/j2UvRd+cm9Wbm/QfOcDtt29STdegVkC+uoraHUCeqHBz\npUS8rEKrE0glSpyc6kUvlWhtrNCOFqg6R7BOH8RkLjB49j5qLYGE0s1edJ9UVo5Tp8feayBXlkCj\nI1uR88gfPcbijX129yrYvBa296vI+mbplXTQrCOzeQkN9rGw02FgwIRMJsNqVuJ1d/1E0hmRXK77\n4RXNyem55z46mSg2twJnfxBLX99namT2cRSjUXbffPPDIUlB50SlkFCoVOwtbXLkyDQOjwWT04bR\nbSXYb8dgUNEXsgIyNjezNJMVXH4bQ+M9qDsVOp0GOocTg1mHQqOhmslgzoU5OTuB3OHEaJQjd5tZ\nvLTKQLAX73ETCzeitAwa/Ocexx9ykbl5jdTiDXoGhtDMnOHdhTyFjQVaSgN+lZLJUTOvPruAsj5M\nWxSRyboBdHK5Hq1KwmFTI9c00Uph9haT7GaVRONlZEKCYMiGTiNn+oCHUqmBTq+i2oGypCcXLVAu\nN7AMDLFwZYvDZ2do1WpkN7fwzc1hDgapFQq0dH7ypRIAOq2ATK7A6XPQaMuwep3oVB16gzZ8k6M/\n89oLgpxDh3z4/SZyuTpGowqv1/jh8OqnoVwWuX49yv5+t0a/38TcnBedTsn8fJStrRzDwzYSiRKv\nvbZFsVjH6dTj9RooFuusr2dQKmU0mx3Onx+iUhFRKq1UKiKhkJXbC1GuX4uxtJRifNzJkSM9KJVy\nvv/9Zc6c6cPm0JOK5dFoFMg7TUJ+Lcvv7pKNpDAr/LTUvRw/f4S1zQKrb19FYzayvrzGyPEDHPuT\n75BduMLCP/4TwVOnGDp3jkp0Hzpt6pkMJqcbqSFQyWQRehxEUi0mHj+Hz5Gn6dCgdThwj49TrzbY\neGsZsQU9iED3d6vZ7NBsdviMgnjvGl+IkU9Ip9Phu9/9Li+++OLdLuVT8fDDD/Ptb38bURRRqX5z\ndtL/Ja16ndz2NsW9PZQ6HdbBQdoaM7WGxEZKiVpmpP+wF4s7wuTREfQ6OcpEm8h+nnI7T6vdIaBM\nYzQo6DSatOo1suEIrgO9KBtF5IKc/oMT5DbW6dUVGf/qcbJVBSbHNqlYDrdVQCjE6VVIVBf2cc/O\nMXP2ENcubVPMVekb7sFkNSIYLeztZkGtR6VVk9iKYDHKie2lGP3dL3HpapKAcp/1lSRXL64zc3IU\nX9BOyNlh5cVXUdBkbyeDPLvP7LljKOwe9BYjqYKVleUUwek5tqLvkVovMTjiwhPQMnbPQTZyLeLJ\nOsFhHweOannlxWVWbmXp6THTUgY5fqafcLSGRaXjoYcsNCo11K0SDiHJ2j++i3NsjIFAkFSqgiR1\njeG2EzAxMc3YicBdE+T57e2PbGuoa2lOnJvh4gvXyEYShG8ucer8YaaODKP1BRGbbcxmDU6nnjt3\nkuh0SlqtDqGQBZtNQzZVRKXV4NE3UJe668xGrxcUarQBF1WVHvtggN35m7S2VogyxOpunbbaxF6+\nQ1RmwDkToFG8QCFdwnyklytX98lF02hGbEQLDTbeW+Br3zrCY1+epZQtMHX6IMpKilw8jcOpx2AQ\nMLpdRG5vEY7nWV9LceyJ0+zVZdy4sU0+H+C+0wMohA6zhwNEt6J4xoeJRgqcOTfKws0woaEZxkeG\niawv4xsdZ/CprxOO1Lk6v8rMg6MEPV6M9iY9rSzVRJz0Xh6L287odACbqECtEXCOjmL9BdtRSqVA\nIGAmEDD/3H/3q3LrVoKVlcyHrxcXE4hii8nJbpyDzablzTd3OHzYx/i4C4VCjr/HRDZbJZOpYtCr\n0GgU7O8Xsdv1PPnkKFeuREhE85QjYaYHu74weztpKmWRzc0cdhNMDuopRWOcOxMglnYT2c8zN24k\n5IKZKRfL7QadWhmvrkrvUD/v/PA9FCoFSo0G29AwhbqMmt6D1uVh4qkncY6OIpfDzltvYevvJ37r\nFvVsBnugl7qgxndkBlVeTnZ7m5s5NY9+6QFKkQiNfDc9xWLVUqhAo/Njke/zGT9RPtTnnS/EyCfk\nvffew2g0MjFx90OKPg1Op5PR0VEuXLjA/ffff7fLAbrT8tVqE4NB9UuZWUmSROTqVdLLyyBJ1PJ5\nEuubbIi97KdbtJETy8sot5t85al76TXViewVKMRTWG2W7lF8LsbCtXc5+uQ5Ju4/xsZ7N5ErVVh9\nLpQeA1i87C1sMzQ3x/ADJ9B7nYQvXOBbD7ooCj1Eri/QiWYpv/4yWwsL9N5zD4f/7M8QVTewroVx\nD/YQuPc+nnsljNWjY3hqnHq5hi/opJlP4R/wUlVaSUfDyKIlBvstrN7SsLsW48v/5hDZ1SsYdTIy\n8QpWPYiJfXav3mBg5itEbkS4fn2fHBZaKi8j586SXN3A6DNz9NFjvPBehZXVXYrFGgemPRw44OF3\nvzxNMl4iuRPFZLJh99gQpTK9vWYOzznJ3F4gv71NJZGgFI+TuHmTkS9/hfFBH/vJ9odx4VNT7rt6\nMviTxlsA1WSSkMtF33ceJRNJopR3cLkNOH02TD0/bh9YrVoCARPVajeJVqhm2bx0HV08jdXrJHhy\nmkrMTiEcRiaT4ZmdQ+YdoNqA8MVLPPs3LzN6IMDmcoS95X16pkYRTDZqpRoLtxIcnpxF/eobyJ0B\nYu/cRN5u4dYLNBRars8nCW8lkeoVjszNUL6xyMz500Ru3aHdkvCMjVAu16mnk4iVNm6HBqla5MDM\nMJIMpGYDXafEzkqMU08cR3fKTyWTQ64xcOvaFuG4yLuXFxk7PMwjDz+O3Sbxj3/1HJVqE9vgIDt5\nLdaajF6fjuTiIpVkFpXegMkgYNd36DtyFJPPh+IuPXpXqyLhcOHD14lEmf39IpFICbVaIJOpIggy\nVla6sfWzM262NtM06k0UCjlKBRw65CGTqWM2q1lZSRGP+xkZsaGopnn9zg71msjBk8M8dJ+H9XAN\nq65NJRrjzMlBXvvna7y0kkBjd3D6dB9SKsz/8hc/4Mj90xw71Y/ZpGR0wke1miZ29QqCWo3B46Ga\nyVDY2yPVp0GdzFCMRLH09xNdvIPnwAHQmTj63/73pG8v0qiLTD36OHmFg+iVi1TyNRpyAx1HL4pa\niQbQqLfQGTXoh4a4vVFDEORMTbk4cOC3b14EvhAjn5gPWjS/DXzgxvp5ECObm1lu3UpQqXTFyOys\n5xdOiVczGfLb2/C+7XR2bQ2twsrKnTt0jC4ENDid3QAsuaDAPzXKRmoTy2A3L6XdbNFpCFRLDeLX\nrnDk4cMEQ1aqySRGpxnfqSfA6MB3YJKeAR8mn5dOu417YoJCJIKpvMPetRfI7+5Sz+dRW20UYjGk\ndofB+++l44khyjSoLVomZ9rkKmAdGsOjqyN6VGQXb6D3uImWGqjNJmSCCpO2w3/3P50nHisyPOKg\nJVhZv1Wk4zDSKohIHSWdep3s8hKrV1fJxhQkK2kkmYItdEwfPINnyEZNq6NcWcdq1TA+7qBYrHN5\nPkJ/2oLXa6B/wEKf30SiLjAz48ZsUhK7cZPV7/4DiYUFlBoN/hMnAMivr9I7p+fA+Tk6nU432fQu\nY+7tJbu5idT+iSFKSSI0PYC/340kSahNJrRW6099bzdfBwp7e6x8//vUsll0JhNSrkX8Wp2Bc+dw\nTU3RbkssbZTZuRyn1ynRqeQ4++Xj2D0Onv/BApE76zSrZcbuO4bRbaXeUWAdn2T40UfAYUOj06A2\nW1AZjQQcWrSPzDJ5eACbsoZaLiIOHaLRllBPmDFrQKORsfnGBXw+L1pNnZrGx15OQSSSJpUsc/q+\nXpRSDUEhI769z8EjvTQqGm4uxskVOkwcGcLXm+X2UprbK3a0cy60fUMYFApURiMKtYalxX0mQwJx\nUx1ZsYnL2ebQERdiKkYposT2GWfM/DwEQf7+yjEUiw22t/OIYhu7vTtw3Ol0yOW6K+Vra1nknRa/\n//UJUpkaDVGiXLJz82qYxaUsNrsBo1HNrVtxnDYt6USZB75ynNhWnMROjNmTw5x7dBapUmDnapzC\nyk1Onuwl19LT7kh4vXreeeEWZpOCrYU1hGoWjVeHsqdF7voSsnqJzM4O5Xic3hMn0Og0mO0m0psd\nRp58CtvYFKmVFfaKGlaursNanqHpewmFLCym1CzeSTF3z2F27+zQbrWQZAr6z5yhFI2yuRJD19HS\n0loJGrutvLExO81mm729wocJyr8tfCFGPgEftGhee+21u13Kr4Xz58/zjW98g7/8y7+826Xw7rt7\n1GrddcFKpcnFi3sYjWqs1p8d+tQRRTqtFpIkUY7FaDebyBQK6o0a+4kMhUIdU08PSrWS6enuU4XJ\nokNQvG//rlRQl9npPTSNGF8lNn8ZtdmMf3YK19QU5UgUtbxD36lTCCoV+b19tt+6wP78VZwjg2hN\nBsrxOEafD6XJSksU6bREkhvb1OU6ZIKVne0c2VtZRoctnDnrJLUbIZJqEgwOozKZqeyHGRzuvgnq\nesw898MVkt9dZXjUhctlYGB0mPh2jGisRKfWwW7XMTgRoLC7haJZ4qGvf4k7awU0Bh1GjwubRY3b\nrqSaL2CT5fAFHJSaEtevx7m1mCDUb2Vk2MY3vz6O0mzBqpVz506KXCyJGNlmKDiNemeHWirF/rvv\nMvDww0iSRD2XQ6cVkAufj2Nic28vvkOHSK+s0BZFtDYbvoMH0dpsaG22j/2eTkcilapQqYjIxCqt\n3WUi8/MAKDQabIODQNc91D40xOpqmtXVNF51iVKiyaWradaubzAyE6T3wBixSAGTQUEtFSe7fIeR\ne2aRC258955FY7JwpGVnay3O0vwqkkrHocM+DFRAY+Tadod4pERiP4NCkLj33hD6wg7IBbbXEoyc\nmOHtm1WiqQx5tZp8usSdhRiOM30UIit4TvVz68oOVxYy3FipkogWCPXb+OrXp0C1i6pZohDrUM9k\n0Fqt1FMJNBYLtUyGdFNEn7zDhFmLmNln7Xu3GXv4/n/1uZ9/iVqtYHjYwfx8hHJZRBTbKBTdgLx0\nusrgoA1JAqMxTbPZJp+vsXs9ytyJfjQOD//r//wjIrEa7WZ3m7hYbFCptHj7zWWmeyXCa1EOP3CA\n+x6bJRots71bxmXXMHBwlDu34lTrYNDKia5t885+EZO/B2s4gtRqoVR0cId8FCJRMpd+xOGj93B9\nXqKYK6NRyzj91QeRR5fQPPAIi0kl5p0O+YSOZ/76NRxeK3qjjs2Xtrjn0Vmu3k7x8vNLqJWzeA0K\nFDoLTp8VtdFI1dXL3q0W8XiZcHiHbLaO12ugWm1Sq7Uol0WMRhVHj/qZmena3/+m84UY+QS8++67\n2O12xsbG7nYpvxZmZ2cpFApsbm4y8IFBwF3iAyHyAaWSSDpd/bliRGO1ojGbqSSTtMWu+ZKyWcLR\n18PKW7vQkdBpFcxMWvBoiqTW1un1WAi7dIhiB53QRJJb8B98AGtzkkoiTqfVQiwWiVy6hMHjoVUu\nU47HaVTrrF28zuL3fkglU2B7aZsHv/1v0VitNMpVipkiSB00Fiu5TJVYLMK+6ObWzTg9E0NcuxYl\nn6vx5d8J4c9luPBf/hZBkGF2mJE2FpmYPsLzF1JISi0WrwqFVsvLL63xR398mNFjU5idYVTacdwD\nvchVGmI3rjN67iyvX42ytVfB4bPTq7eQjOWZfytDS6bEbjcyPmTn2Re2uXw5gsGgopCr8fabW0yN\nWbEYZbx3cRe1zUEplScXyZOPNpibmKNx8XXEahW5QoHB50PndN71D6ufRK5Q4DlwANvgIK16HY3Z\njFzxs9/W2u0ON27EuHMnRa3WpLyzydCABWMwRGm3O39SjES6OSvv+2JEIiVseonyTpibGw2i8Tpi\ntcLCa1c4+pSFQw8dJbsTprCziS/gZLxXwcbb72KePcnFt9eZmfOTiWUYGPUhl0uMzA1z43aUnkEn\na+EsFpuLYZeNO+/c5JWXVvnaN2bxmwwkXrtCSjTSUcvpO+CmIsowqTvkCw0i0TKnv3QCl03JlSsR\nbry3TUtjRtZpsbkaZ3HRzcERHbm1DexqPy6LDI8PBLUJjB2qSgPV3DadZpPkXoxOp41SrUalVWIO\nBv+1bt/PZGzMgUIh5/LlfQCGhmyo1Qqy2Rq1WouzZ/uw23WsrmZo12vUo0WsRiUby5s8/NAAF+cT\nZLIN7C4jJ0/6UakEegIWvIN6oltRBKWCF55dYf7CClqrlZGpHnp7jGTCNaLhDBqrBY/biVel5fLF\nNAfOnsakbuEf8uMIuEh8//9B0JuQdq9x+sgQuv7juAeDaPLLNFUy3r6eIJ2t4xQVbG3WUeoN5LMV\ndrfS9A56ubNexu0z4+11sh0ucfgrY0zNBnC4uq1ESeqeAkWjZaLRMjIZeL0G3ntv/0O3WUGQE42W\ncDp1v/aZnbvBF2LkE/Db1KIBkMvlPPLII7zwwgt8+9vfvtvlfASZjF+o+pVaLT1HjhCZn+/2btNp\nzC47U0E/6XSdQqnNmXvsdHYWuf3POZrDDsxeJydm50huR8nux1AJ4NGMonZ6aTfq5DY3Ke7tUUkm\nqZXrmMamsbYk9hZXqVVEqrkSyGSI1Sbrl24w9Y1vsPPWBZrrOziHBtAH+7l9YQG5f5i1q8vUsg3S\nKjmlSpvE1j6njjjRJdfwmltUM1lSNzdICCpCniEsRjkHDwe67qu1ApVCk9s3wowErBx8fICVcItX\nF3M0M/uolW4mlG4q6StYhRZHjx/k1Tf2qBSriIUC7U6HhMPCwaN9pFNdUWc2qyjmqigFyGaqFPIi\n6c1tnCoNCq0WuUKgWpehCIzSNtxCYzRgnzqA1qDDMfqztyvuJiq9/pfyrkgmK9y+nUIU23TEJqVM\nnqV6g8MjY8j2w0jtNq16HYVWi87hAMBgUEKhQaktEN6Io7fbCB07SCWyTzKc4tSTI7gO6MluKFC3\nSrTXr9Jo6UmubrA8v0qP18CRg05qxQoao56XX1nEHvBREmUsLCTZ299gdMLL4SMH2dlKs5ZSU0jY\nCJx5GJvbzrVUjI4o0szEsRjUhEaCDI1YMaZuksqo2LidJ7+1iWN8HItNRz6eIZ0oYJr1YHU20YsZ\nBhxNrv7gWQSjFc/IIIcfOcbFpSwqew8WuZxSIo6zvwfX4ABKzc9vv4nlMqVYjGa1is5ux+D1/toF\nqlLZtTTv7TVx+XKE/f0ilUq3NWM2a7DZdASDViYmXNRqTSj3UI9sc6tQRFaXOHO6j2pThstlYGcn\nz87OPs1mB5XKwwO/d5r1lTgXXrmNXNbBb+iwenWDi8/neeKxQcRCBqPNSLWt5sCQnUIqy+ZWiqFR\nBw25BrVKTt/ZMyQ3tjA4XWiUHRTpbRQ9JmLLy7RNHnJJDRaPh0Q0RywpUlQ4CITMGFtt0qU2nUQV\npVZH/4iH8XEn04dCDA87Pvz5rVYtbreet9/eBUCrVSKXy9nbK1Iui3i9RpRK3v/Z8l+IkV+C/wM4\nCFznowm+/wl46P2v/wfg9c+4jl8bnU6HZ555hjfeeONul/Jr5fz58/zN3/zNXRcjJpOaYvHHWSM2\nmxaX6xd/yJj8frR2O57ZWQrhMG1RZGM1SX+vjuD0MK2NG+xGkljMGlRqgXI8TvG5H3ajzxMJHMeO\nEb38HpVkkkoqRXxhgeCpU5iPP8Q7r69QvX2TkYIVh1qHSlsndPoUTYURSQaNeoFyqcbMH/wB8a19\nBLWaN//6adK7EezuQeQyiWathlwhUMllcfd5KcciaKUWGqu1+8ZezFGudaBaxGYPUGs2yW+vkljd\nRKXT4T1hJ3l9hUKsl1dfvIPa7sE9MkQxleWdi/tMHRkkEq+RyYsk4kVyyTx+j5bs3v/P3pvGOHZe\naZrP5SV5ebnvO2PfMyLXUGZKKSlTUlqSJdvyomrbPRrUgmm0awboMQwU6tegFgxQmAGmMD2YqXKh\nqzHuKQNV3Xa5XJItW4u1K5XKfY+IjH1hcN/XS/Lyzg+mQkpJXiQrlbas908EGZHkiXuZ33e+c877\nvln0Oo1WvckdByMUy222Ngu0Gk1iI158PhmL1EVtKr3KgsuJ7HKTjadRBAuGod34ZyZZLLkZCzjJ\nLy1hMJmwhsO3TGn1VqJUUqhUFNLpGo1Gm24DGvUiHN6Nd3KSaiKBa3CQgWPHdto8g4MurmUzGPQ6\nvGEvudV1as0aFquEXjbRKFVJv/qv5BcXcY+N4erro7JawRlR2b8/xNyTP0JvNOB0m7nz8c9gC3bQ\nG/WcO73F5lqOekvgypU0xWKTzz40RCBg4/XX17m4IHDf/T6aHZFcTcTu6sPn0mM1donZm5z59n9j\n+J4jDAyPceXUEs1MClcsinPQzcy0n4C+QFkp0sy3yb7yUyJuO97JIGW1y/U3zrP7zl2cf+Y16nWR\n8Mx+9jxyL/mrF6gszzHx5S8jvU9y1yyVWH/5ZaqpFGgaOoOB4J49hPbvvyX3y2qV2LMniMmkJ52u\n3dA28WKz9YZr3W4ZkAE7StjDPb4Cr5+IU2kKaFqHeqVBNtNzsM1m6zz3XJ2QE6rFOrVcjsHpQeqJ\nBMlEm0K+hoYOrVFHJ+pROx3ERoGpYJs7947hsnSZe+lFfvaDFP1jYQ7/j99g+aWXKSfSxPoDFDc2\nQBR7wmeqD0VpUyppDI96mb+6TWutisVuotvRmN4T4tpCiWqtzeioG4vl5ranIAjMzoZYXy9x7VoG\nWdbT12dHUTpoGuhuCLCKoo5Op3tLrv3HjVuZjOwHLMC9wN8As8CZGz/7L8BfAA7gSX6LkpETJ07g\n9XoZHx+/3aF8pDh+/Dh/+Id/SK1Ww/JrqCP+ujh6tL83u1Bo4PWamZ727yw8vwwGWcY1ONhTe8xm\nOTKsceZSga7aIRdPI8sGorGekFdxbY1yPI5vaopqMklpbY301asYzWZESUJvMpFejSPKg2yvppCc\nbvJ5ha1CkcOHYqwtKlz4ySmUSoXxg5OMfXaKomJkK6ng9Js4/PiDPPu3/4jfYyTYH0RncYHVSrSv\nw659YZS1qxgmB1FqdbA48U756A8EGJ6dpLrc5vyLF8lcOo9okBge76N88SQmWSRfaKHW6iiNZVp2\nA1aHh3pNjyXgJ3nyJK6AE4NRj2yRadaaiKKOrY088xfX2H1onI3NMh63CZNBoz9q5o4pC7ZuCW/I\nhU6vR280Yh8cwjsYxRWSsAUeooKNxbNLFFZhb6zTmxvx+3sb9vvYxv8mQ5JENjdLbG9X0ekEPDYv\n5e11DDoN78QEwb17Ce7Z06Pz3oDPZ2H64CgZm4rkq/HKP61TqrfotoB6mbCjTUGno6V0SFxZQDTb\n8PdFaeoMbL7xBhuXFxEEgcBwjPAbp9kzMsVmXkRtVHE4TXTLKh63Ca1axGfvUrpyir39Vs6vw8pK\ngcOHo5RKTS6e2UCOuDky60K3fg5Z0hM/dYq9j42TOz7DdlrBHnIQirqY3uWhXqphCoTplPI4+vrI\n5es0OiLpTI3sXJbPHLiTQ196ALVeo1lrkrlymfLcRQwWC87+fiKHDr2HUVNYXaWaTO487rbbZObm\ncA4M/NwZnV8XXq8Zr/dm4bVms0MyWaFWa+N0mggGrUg2G+MzNpx+N8VEmtL6Ki++sko3nkMW7Qjt\nDpGQnrnXz7H7yDRqvYaotsitb2Jzx9C6MqLQQalUaJRK2F1utuaWeOWffsbdj85ybXWO+FYZyWJi\naUFPOfUMtpEJlLYd1R6gvb1C+tJVfDO7GR52M79eZnBskq1kk8ce30uh0MDpMHD3vQOkUzXQ9xKt\naNSOz/feQVSn08zRowO43TKaBhaLkakpH8vLBUSxl42Mj3vxeH5+C/u3CbcyGTkEPHvj++eBO3k7\nGVm78bUF3GzD+RuO733vezz++OO3O4yPHA6Hg9nZWV544QU+//nP37Y4QiEbwaCVTqf7K9F63w+i\nXo8tGMQGPBTxUSzUidcHaOdT6A0inWaTRj6P7HKhKgp6SaJVrVLd3sY7OYnJ6cTq91MVZLpKT/xM\nb3NgtFrpigaSBVhbLeIeH8dkNmKNBjl5scygN09pK87qi68wcGCCr/9vf4LW1ehrWjjz5hrlzTiC\nQ2K6DzzGEHqLBcfwOF13A4PZjHNymjNPv4bsCzG7x4VLHEcSu0xNO7n4j88wcGA34cEARl2H4vom\nVo8Tm0HCI5lQikWyWykKMQ+H7giylaizenUTQdSz/1AEpSOQzdfZO+Ohq7pxmjpYGin0yydRvR4e\n/uIe0i07xXILh8ONKOqo1VooikpqK0clkaCIE6G/tznV02mKKyvIt+hEfKtgMomEw3ZSqRqqqtEW\nZfY+dDdy2EXXoOEJWXfaM++ErGshC03cucs8+EA/ivkOsrkabq1A7uUfE7n7KE21519kdPkY+uz9\nXDgxT2ZlA0mWkPQQ8eiwCVUkXZ6azU8+UyEQsNI/ZEbWd6kXFIR6mbM/PYXaFbjva4+B2U61qnD2\nzXWahQIbokIi0GXA5sAWidJuNGhcOclnDsxS7HqRYmN0lCaXf/p4qjNvAAAgAElEQVQylXSO/hE/\nI26JZrFAcHI361loKSp6k4ntbAd3t0x1O0lT1eENhHBNqjSScRr5PNVkEue75kea+fx7rk2n2aRd\nr3+oZKTb1Wg02phM+p0N9pehXm9x4UKStbUS1WoLo1FkZsbPzISDeqGE0BWozZ2jkimiVWskF9eo\n1lVG7ppFUsuU4wl8Yh/HvzjL2noBrdslErZw+OgoueUVjHpwB9wMz8TYfm0Fk9dLt1kntbyBzRdC\nUXU36MerHJjegylgJ3H5KrJeY+j+Y5i8PqwtjaEj91BoGIj0t2m1OrjdJkIhG4GAhcOHTVSrLfR6\nHX6/5eeudQMDTlS1y/XrOVRV5StfmWRjo0Qu18DnsxAIWIhEfvsqlO+HW5mMOIGVG9+XgPcT5Phz\n4Nu3MIaPFN1ul3/+53/mueeeu92h3BI8+uijPP3007c1GYFeifLDJiLvhiTpCQTtSHcdYOO112jX\nagCYfT7cIyPE33yTbqeD4UZFRHa5eslIKITaENG5PRhyRpz9A4gGPSadDqPdTHT3OI16G6vLRqNY\npJ4vsHrlApdfvYjVbqaQziIZRKz77uH0hQRmoUV0XwybpBLfLLEtB5geGwG3Qmp1kcDABHNXk1z8\n8RuMHt6LrpQgYlBo16oULjqx9A9RVSUiQRfuWJj0tZ6misEk4fGZGRx08rX/+THWl7P0D9rYf7CP\nxV1B9EKXfKZMudTk7KvXuTZf4K67+5g6GsWh1NGVqoQPHMA1NMSkLFMoNHjjjU1++tMlSiWFWMzB\nnikXCbpEY3ZUpbxzbRvvszH9pqPT0ejrcxAO22g0eroUuWyVf/nuG5h1LSanQ+ydshPaNYnlhrS9\nUqmw/sor1NNpWsU81bU1nENDDO3Zw7X/9hMq+QoOwUYlcpByrYspHESR3IxM97P38ChKXcEmg0mv\nkry+wqDbxVDQy30PTvLGGxtEgxLp+QUCThOblxdoKwrBoI2xMKQ7On70k2WyiTzplU127Y4wd14h\n9MAAeqeHzOoF0qfnsF9d4rP/6//CWlGlqzfgjISJZ7pslmVmjs3iyyRRdSrUqshmO7GZ3YhWF5HB\nIE9fKXD59TlcXjNDAw7ufeA4mtalVa2+5/qZfT7yS0s3PWeQZQwf0oX3+edXyOcb2GxGZmYC9PX9\n4tmHdLrGG29sculSikjETiBgIZ2ucfrla6hxkfmXTtE3NcDmydNIdivDsTDXLkmkE2nahRwGWcfo\nqI/Uq89yV7Sfu48eoJgawEINQ6dI1mRnat8A4/fs40fPbdKWwlj9afRmE61ag+m7vKxtN4mvZRgb\njuKw6Tj1gx9TzpbR6QXUSoHpf/M4Vm8Mz/gQmUydF19cJZmscPlyB1Xtcv/9gzzwwCCxmIPt7QqL\ni1n0epFOp3tDQ0XE5zPT19ezmRgf9zI25gF6RpD9/U5yuTqSJBKJOG60qn77cSuTkRLwVsrmAIrv\n+vmXABfwTz/vBb75zW/ivFEGnpiY4PDhwwwMDACwtrYG8LE+vnLlCg6Hg8nJydvy/rf68ezsLP/x\nP/5HNE1jfX39tsRzq+Ds78dgNvdKzIJAu9EgfekS1kCAei6H2ukw+aUvoSoKjUYLzRVhYHaITTWI\nkxYmuVcR8HrNBII2cvne4tDtapQzBexyk/WFNTqtDvVqA7vDxfbiJrFYhq1UC52i0ey00JltdA0G\nrF2Fiy+eY2Q8wPgRK1euZdGatZ4fRrbK6Pgg688/iy9go1RuoQhWbC4/z/znp9h3/0Gm9vVTbYJ3\nbJTVc9f4/n9NUGsbCPklfvD3z3Hsy3dx4NgMTruBy2dr1Ast3nx9AbPPg9bV6CoKZpMOvTmEe3gY\nvcmEpmlcu5YhlaoRidhRlAIbGyWsFpF990wx4FJopd7eoCyB3z7xJafTRKfTpVpVCARsPPvsEpQz\nUEiis0pcObNGNDBB9/RpRh58EJ1eTy2Vop7JAGByu5ErFaqJBO6REcIHDmAYnOapJ+e5eGKhJzd+\ncA/JtptDBwKMHT1IdWme9QtzJLJFQv1+RKef4txZjt37IIoSRK/X4+j68FlV4peuMjXpI7OdJ75R\noOX1kErXQRNxuCzs2RsksbxFtd6hXr2hhVJrETl0iPObJq7N58jl6rRKBcJeBy8+fYlatcW//cpx\nTIJCeG8dU3SIjOalWOlwYaFKuiFj9riQrSKFushSRs++ARWT472JgXNggPLWFpV4HK3bRS/L+Hfv\n/tDturW13rZQLisUi03uuaePQqG5M6QZjdowGvU0SyWSmzmef26ZzUST7ULPo2V62s9gzMyVEwuE\nLX3k02WiYyr1YhGjWaK1epXHvjzL6TMJ3ANhpveEKZx+hcT8MtL6BiOSSMws0dWJlFIJwqEoer+L\nZgc6bZWXThWIBMfx7vWzX2yjq2aI2tvYdwXZ89ARslevklpPopfNeLxuJG+A9PIG9vAeBu0SJ05s\notMJeL291nel0uLixRQHD0ZZXi6yvl6gVGoiCDp++MN5KpUWo6Mejh7to1hsMjsbRhCEHWFBo7Hn\nzfRuf6ZPAm4lOXkf8O+BbwD/D/D/8nabZjfwfwCP0mvVvB80TfvN6uB861vfwm638+d//ue3O5Rb\nAk3TGB4e5sknn7wt5n+CIPBx3fN2o0H6yhWKq6tomoZ7dBTv+DilRJrrVzZpdCXqOiuaIFIo9Kh0\nwaCNqSkv7XaXl15ao1ZrU6u16NRrTLorPPt//38YjXqcATe5QguLy8HMFx6moPPw+uubHJwN0VHq\nbJ94nWsnriDqYHDUx9f++CE6Dj9nTqxhrW2ipJOMTQXQCxrZjTjGQAxddJLNrQrr81s4vA7uv9ND\nWxN55WKTyy+fp23xc/lKisERL0NRGUsghEXWcfdBLy//+BxbGyUMLi9mp4Mv/94M4e4m1WSSyMGD\nBHbvplxWmJ/PcPJkHIdDwmIxkExWqVbbuN0mHjnqo3D2dVrVKoIoYo9EiB05gmSz/dr34lbe93y+\nwfp6kWq1RTBopa/PQSpV5cKFFJWKwptvxjHkVjHSRCf02gT3PTRBwFBk+PhxzF4vmbk5Fp56ikau\nJ0+uE0UKKyvE7r4HpdmiIMU4cSbDyrVNgmND1EQHme08v/9HB+gP6KktXGD99RMEBiP4xkbZvnwV\nySQx9rnPcWJJpFlroCyc4el/eImAz4TTJqLqzez9yqOYw328+toGmxtFvvj5Ear5MpfObfLZL0wR\nJM21p58lcMdhrpec/Oina/iifhYWsph0HabGbHTyGSx2mYePBZkcc1BPpRD0elyH7mM72+GZZ5bJ\nZxt47F0o5+jUa5itEl/5t3cwuG/ifV2Y240GtVSKjqJgcrmw+HwfSoVXEAT+7u/O7Dyu1VpEoz1V\nXEVR0ekEdu3ysWdUZvPkSVYzIq/+bIFqXUVz+KjpesnSg/dFmHvpFNO7PLSKRayxAdZefZVcPIPb\nJeF36vCPjxA8cIDC6hqoHSSLmfzCPM1SiYG7j9DQjJhlA6lSlyvnt3GFvYzvH+HMxTxvvrrI+KiL\nvYMCpmqcxtJVzP0jqK4YGy+/TKNQwOJ2YPG6MFosmJxODv33/wbBKPH886v8y7/M3Wh5dohG7Rw8\nGOUznxni9OltdDqBQqHB88+vcPp0AovFgMMhsXt3gM99boxDh6J4vZ8cYbMbn5P3/bDcysrIeaAJ\nvHLj+zPA/wX8B+B/B/zAM/QqKF+8hXF8JHiLRfPb7kXziyAIAo888gg//vGPf2udiH9VGGSZyB13\n4J+eRtDpdgb1ipqdxaKNdruLpjURBHC5TNx1V4xw+O3e7IMPDhOPl2k0OrRaHRzdAv6+IAa9jvnr\neaxOG0abjeubbTZzSUZHPRgkA+1UlpWz19B3m6B2SaymWD0/x/3/bhqh1cLQddHZtrD4/EvY/D5C\n9x7nynyZ0nqH1HaTRqmO0WYFs4P50yuUyyYCuybJ5BS6apJUssqDX9hLvtQmeeo1lP7dzA7rmJkc\nQnbaGdk3gkOoUs8K9N19N66RESoVhR/8YI5z57ZZXS1RKNQ5dmyQXbt8eDwQDRjxhDx4Hn6Yei6H\nXpKwBAIfWC68Va9TyZUw2OzYnbd+SDqfr/PCC2vk8z1K6Px8lqkpH3fdFcPns7CyUqBYbFK4nqGR\nu6FPY9RjNeuhDbp3bMTV7W3q2Sx62UIlEcdgsVMXbSSzaRSLgqpqTB0/QmIjh1or0alViS9vs3S2\nyOe/uAejqKIDXvk//4Z2qYAt4KNUruPZdy9NXwx33904nBZyG3G66PDPzHAtLnAgBl/83DBz19Kc\nOZ9i7mqaYNDKayfTjI57OfD7f8DiUoGFpTQWScBAi0quiOC0Umro2Dc7QXlzA8x2OrXaDm3Z7TAQ\nGQyQTteJxyugdWnZTZhlkWDMS9cRJJ1t4veL75nlMMgyzhsVzY8SmUwdt/vtjbfb1UgkKrjrqyil\nEo1mL/E1GaGUy2COOihWVPR6kb139KEVUkihPtaWkgzdfQjPZpxCKkdwxIbVLrHy46ewuJ3YojG2\nzp4nH0+j14u8+eQrWPuHmH7sUU489VNatSYWu4zHqefwuMigI0SrKyILDfwjAxhGo7SKBRShi+HQ\nbpKLq1jdDhwOE0ajnsj+GTAYOXlyi6eeWuDEiS3abZWxMQ/z8zkOHYphNvfYM6VSk1qtTTpdR68X\nMBp71zuVqlKrtWm31fe9Vp9E3Gpq7zff9fg/3Pj68C1+348cp0+fxmKxMDU1dbtDuaV49NFH+au/\n+iv+9E//9HaH8rHAIN/cb63V2rRab1PlNA3y+SaVys0FPJ/Pgs/X21DPnt0mmbHyyDd/n/mXT9HQ\nbxOMeXGMT/PcWYX19SJ79gTo73dwda6EUi6jdlSMRhHZqKHWK5SXF4j/039BcvvoVCsMHT5AVxCI\nL6f4yXffILxnN7bBEbRihUq1Q6msIEf6kYUulaKK3w4TbSN6XRen20olGyc2HEJIrSKmVrBJEmJG\nwnfvCP5dh276W1ZWsrz88iqlUgu320Sh0OD11zc5fDCAmFqCYoHljIxraIjAzAz6X6JD8W5omsb2\nxctcfO5N0okiVo+TiWN3Mrx/HFl+78n7o8LqanEnEenFAcvLBUZHPfj9FkZH3eRydS7WyyjlMqIA\nU3tjWLQK7uFhTA4HWrdLJZEgcOAOrr/yJs1Wh65kx7N7L0o2TXnuEt47bLTTWzQNerLLCaqpNKOz\nExh0GplChWalhmewn9WfvYAr7CevEzH4Iqydm8dc0AjdeS/XdH6uF0IMjfej1iqcvlykUGwT9Rs5\nn6xx5P5xNhN19uwNgSBSqXd443Sa4fEZjB4Jp7vGxvVtuooJh81IrVzF6QoRHQ6SVBv4PTKN7BYI\nAs6BAcweD4IgsHt3gEKhSbPZwRfzo6oac4slttMKRqPI8LCLgwcjO3b17bZKIlGhVFJ2XHo/Kit7\nk0mPw2Ekna7f9HwlnUXXaBD0BzBKvc+Lyy5g95sYGXeydzaGsFWmmNdx9c15kq9fJH1KYvrRB7jz\n6EGKl88w/7PXWF1IUKt3ePAPHkZoNbE6zGznYXW7Tl97i75ECos/gC6dZNfsEIntKnM/eZHp3WGM\neh317U3e/E8/Qi8Z8Y6PM/Lgg4zf9zC5+Xkq29sA2CMRxNAQL7ywzupq/oZsux5FESiVFGZm/HQ6\nKna7hMEgYjYbKZUUfD4z1WqLWq3V001BQ6cTcDpvv+XCx4VPRc9+RXzve9/j937v926rKdjHgWPH\njvHVr36VQqGA6338PD7p8Hhk9Poed7+3YOgwGnXvqwDbaLTJ5xv4fGbsdolUSsJ/zwMYx4sYLFYy\nxQ59fRXsdiO7dvkIBi3o7hji6tNWGrUmdruR/j4nbpuud/LejmOUjGy98jJbr77EyOP/HZnl6xw6\nNslWUaNa62AdHOXQPg9to4rH72azkmImZkJrtxCVMh6PGSW5RcjS4I4HdlO9eILqDaqyPRJ5X8bD\n9naF1dUijYaK1WogEunZwJvUGrrSJma7EaXUInnhAjpR/MCaEpV4nDd/8DM2VrIAFNNFasUqosXK\n5N6BD3WffqX3rby3A9xqqShKT+XXaNRz+HCUgQEn6c1+DJ0qNqGO3e/BecOtVu10qGWyLFxLou+b\nwh9y00wn2JxfhHKOUqqEbekCd953mPPnE8T6vZRNXcYiIiN9Mn7Zz8aJE4SCZmqJbexeJ9ZgkEw8\ng0UCn03D2C7h9IZ56KER5t+4SHojg6iTmRo0cf6nr4E9wGWnmWKmQsTZYXD3KBoCrVYHWdIhBSwM\n91mYP68nsZmlr99NvqAwNmwnU2iz//49hFwVmvogzv5+3CMjKEqHfL6BwSDywAODrK8XAYEzZ7Z3\nqPStlsrCQo5w2MbwsJt2W+XUqTgLCzk6nS6iKDA46OLIkdiHTkj6+x0UCk1sNiP794dYWMju/EwQ\negJnTmOY/JU01m6Bg3cPcfVSgg46hsaDHLyzn4EBJ0pgP83nX2D78jyVahvBZOD0U69i6RSpbm+T\nT+bR6QSCQSvZy5ewBfw0slu4FJX+mRi4HYh0OPLILJraodtuUc7ViU0MUVy8jKC2uP7DH2Jy2pGd\nTnQ6HclLl+i75x4G77uvN8wtCFRViTNn4mxvV9jY6FVORVGH221EFAX8/t5aIUk9UbeVlQKNRpuJ\nCS+lkrIzVL1vXwiv10y1qtzShP03CZ8mI78CNE3j+9//Pk8++eTtDuWWQ5Zl7r33Xp599lm++tWv\n3u5wPnaEQjamp31ksw2Wl/NsbZXo73cxOFjF7e4lKtBzEj1xYpN8voFOJxAIWLnrriiVipPvf79M\n8loao1HE5ZLZvz/E4cMxJEmkmQnyhT+4n7XTFyin89hkAd/wINmlxR6Dp93GGg5T2tyiWa1RWt9E\ns9Z57H/4fSpSiBde2uDslRKCACsrm2iagCSJ7J208+CxKH0BHfV0iuZWhtQzZ3ry7QYDtlAI79TU\ne2irmqZhNusxGvU0GirVaptarcTsPh/GVhGL3fjOXya/vIxv164P1KLJrW+R2r55fr2QzFHYztCa\nin74m/VLEApZWVzM8c5xFKvViMPxduxGo56+PufPNWPUG43oXT4y25dQ1TyptRR9ExFcATfLq+sY\nJT06TcVvKHP3uIAQClLMGElcmiMXcnLq1DYjgw76QxGcfUk2T5zAOz5OKGhFlGSC+yaRvVZsu6Nk\n1uJE6tcY2D/B6deWuPjmKmqni33QTLerYXdIDIz5uHZxi5MvL9BstLj/4Skefmwauxk+89AYly6l\nMJok/uAP9+GSVVomD4GQHWffIO1hFVk2cHUhx7lzSSRJ3DmhHz4coVhUMJlu3hK6XY10usbwsJtU\nqsb167kdkS1V1VhZKTA46PzQA5XHjw/RaHQwmfS02yqVisL6eglV7RKJ2KhUWsTNNipNGf3iNpF+\nL9HP9GOODREeiSLLhp4/TblFvVTBPxQhWU2hKCqyXiC3vIJvMEpKEDGbDdjEJu2qAOEgSqlCenGJ\nVqnI8EMRNKuHp55cYHW1iMWiZ9++EPtGhrnw7E+QxTaVUp12o46m9P7Pi04f8bU02cUmwaCVaNTG\n+sUUuVwDq9XA1laRAwfCPPPMEg6HEbPZiN9vYWLCiyjqmJjw4vWaKZUapFJeHA6Jer1DX5+dWMzB\n5mYJj0fG5/twTKXfNnyajPwKOHHiBBaLhZmZmdsdyseCtyi+v4vJiF6vY3Y2zA9+MMfmZolarc25\nc9skEhW+/vUZpqZ8N/xNkmQyvXKyqmpsbZVZWSliMOiIRu2UywrVagtJEtm924/JpGd5OY8mQHBq\nFIvXib7bQegodHV6kvPLWO0WGtk0nrExRMmE7HJhtNvx7ZlmebvLYjJOJlNncNDF008v0u1qtNsq\nhw6GSVxfYzIUpbkWp7i4SC2Twezx4BoYQG02sQQCRA4efM9AYqulIggCjz02zlNPXadQaOLzmTl8\nZwxzd+0910fQ6XpH1g9yTY0G3q3oL4o6dKJ4Sw2++vudjI9Xd1xfbTaJ2dnwB3Ybdo5NEp5cI7W8\nSVft0lJFxh75HMbQAEaDgF5rs/jUUwjtKpHjn0PJNFnbLBM6ZKCSzXMhm8Pq93Lk6DHq2SzmUISG\nLUa+YUAwBPHKDjrlNnZjm/ziInajja3FTUwGgY7Wxe02oe8q3H80RjxZ56WfXgZBINLnJrm8xUv/\n2uIrX9/L0qVVrLNeZElg7ifPEhwbpeESqTU6LC3l0et1FAoNTp6M76gcj4562LMnwLVrWQYHnRiN\nIq3WzXMKdnsveavVWrTbN6t9drsapZLCh4Uo6rBaewmvXq/jnnv6mZiooapdTp3aJputk9UJ+Pv3\nY9LVsEatBAdDmD09Nls+X+eNN7ZAbdPerlGvtxkYcJHJ9Cj8gYEQXcmMPRqlnU3QyhVwRMP4p6bZ\nePMszVoTBAHvzG6eO5Nhc7NMvd7CYNBx6lQcpzlCdM80Qr3A5okTmIM+dF0Foy9MoqJHt9VgLdPk\n2rUMQ0NO2m2VM2cS7NsXxO+3YTaL/OmfHqFSUXYG4IeH365O9gTdzIBANGrHYBBRFJXl5cLO9fld\nwafJyK+Af/iHf+CJJ574xLdo3sIjjzzCn/3Zn6GqKuJvkCnax4VEosqlS2nm5rJkMnU0rTf8+Nap\nplJp7fD83yppC0JPjOnq1Qz1epuxMQ9Go4iqdkkmqzidMufOJfB6zMgthaUXXqNZLOKPeokdnEWO\nDKDr1nGYTaDTccc3/j3y4CSWA/exkNLzL/+yiM9n4dix/necTLs4HBI6sSfCVC7WiHoNNItFVEVB\n0OuxBIMYLBZEo3GHtfLOz7HRKNJudxkZcfPNbx6mVuuJSEUiNnztNulLuR3DOAShRwM2fjDHXs9g\nP/1jYeYvbexIHPqH+/D2h9Drb93ny2TSc+RIH+PjXlqtXp/e4fjgPXhP2Ivv8L04xnPoBIGaZiLb\nMeDy2cmtbWBoVXF4bWgdEza3g+TJVSYOTdMwumiLJkySyPZ6jsqEg4kvfZmVioNTLy1QrdQRNlIM\nzpjZY2lRTdew9/ejZeNMHxhi8eIKRlnCEQlhstvYPdtH6icLTO+JQLdDp1qlnC6yVK+iPXEHsZCJ\nysY8+VKNkb3jFKQwc3MZdu3ykcv1ZmfOnk2wvl7E6TQhCAJLSznGxtykUlX27QsyPOxifj67c8sD\nAcuO74nNZsRg0N2UkPTmGj7YIPMvgl6vIxSykUxWdhKmblcjmW2REgzo3FaGbiQimqZx/XqOQqHZ\ni7VvCHEtST5fYaDfgaAXce3ah85goFZqYOyP4vaYEY0Sy6+9SXDPbvruuhNJNtK1eMmnU1gsRlS1\nSyJRpVhsMjXh4ejMNOVEktHPPkr8wgWCQReaO4J3ZJpqV8br7VFv19aKTEx4d1yhR0ZcOBwmTp+O\n75jaFYtNDAY9sVjv761UWphM+h3hs7fuE4DDIREK/W5UReDTZOSXQlEUvv/973Pu3LnbHcrHhv7+\nfvr6+njxxRc5fvz47Q7nY0e93rPofucgXbvdq34UCg3MZgNms4FqtbUj2mS3Gzl8OEaz2eH8+SSy\nrGdw0InbbcZuVyiXFfR6Hc89v8L+cTs1OUBbs7NWVCm/cg6r183U5x7CZjdhDQYx+YK8fjLBWqFD\nqdZg9+4gNpsRUdQxPu5he6tEq9FElnRoOhXv5CDhqJHK6hKtSoV2s4lnZITE4gbFShu330X+X3+K\nxazHPzaKZ3wcgywjCAIzMwEuXdymUm3T6XQRhN6JLeTfg95gIL+8jKDT4R4exvshnKrNXi+HvvYo\nzug5EqsJ7JEIg7O76Rvxf5S37X0hijoCgV9vQTca9eyaCbG2oFLP5hh0dhAaWaSgE12rTiGh4b7r\nM0SnhhG1FnfYB3jjbIbUhRTeiA99p4Gm0XOCdnpZmFdYKVopFBtUqwo5JYlJMjAUsGMfGqeR3GLK\nZSMydIRCSyI8Ncqe2X7CMSde9zql9fWbqNB2txWDpKfsHUM3YqUWrzK/pmCzNTh4MMK1axnW10vc\ndVcMVe2iaaAoKiaTHk2DSkXB57MgSXoOHowQDttIp2vY7RKxmH2nMuL3Wxkf97CwkKPd7s2MDA+7\nCYV+fXr3++HddG9NezsvbuTzJK7Okzy5iMvlReeLUldD7Hr4PtLzCwiCgGdsDGN0iOERD7ZYj2Uj\n66vUFy9Rz2aIr66hNFvs/erjKA0Fr89OMldgZaVXlQh5DYj1PKV4gW4pz9Dx+xg9fhSLrKNmChBv\nONCJIufPJ9jYKJHJ1Pn858f4whfGOXNmm7ExD2fOxLFYJKxWA6VSkzfe6Bn2eb1mPB6ZZLJ6wxTQ\ny5EjfczPZ8lkathsRiIRG9vbPcn7UMj6ia+SfJqM/BL85Cc/YXp6mr6+vl/+y58gPPHEE3z3u9/9\nxCYj3a5GNluj1epVF97pf+NwGAmFbqaeSpLI4KCTWq2F3S7h9Zr54Q/nmZ/PIQi9U6PTKTM46ESS\nRGq1NqurRaxWI+GwDUHoLa6bm2VsVgP2UJQLP3qJRqXCkfsmcPT1obPY8U+PYbLb6XS6NBodgkEL\nQ0NO0uk6qtolm63hkDpMRbosXdqilVMwmc2M75+lb0gikXPT98CDdGpVtq8tUNOsOGIRNs5coNA0\n4nSZGCsUaNVq9B05QqtWo7M5jyezhK0r4h4dxzs2uDOwG9q/H9+uXSAIH7gi8k64YlEOfz1Kp9Nr\nC/22LaxGpYi0eR6dCoVraxRXV9AHYlSwYzJbcYxMcnmpzJC/C7UK9a113A43stOK3uxndNzP4L4o\nJdVK/MfnWV4p0O1qjAzYECtp4pfKeIdEghE3aU2gVqmye78P3/go3qGBnWrWrr0xZu4c59KJeQDs\nLgsPPX6IhmrkZz9b5tVXN7BYDHi9ZhKJPA6HDPQ+d4lEBbtdIhKxUa3eoDIbdPj9VkZG3Oh0ApKk\nZ3jYfVMr4a1qml6v4447IvT1OSmXFaxWA8GgFaPxo99GPKEErPAAACAASURBVB4zfr+lRzu+AYNB\nx8CAk2a5zNpLL1FOpEgvpajXrhMcG8A8fYiVip3RYw+zZ08ATWOnBeSYidBVmpSuraIU8/TP7mXk\nwQfpIKJ3+clk60T6Q5y9mAEEomGZPksVYy3Fj374M4b7rNiWtzj6776O0CjTlJ2oDYG5K2mWlwuo\nahdV7XLhQhK9Xsfu3YEbw+8ikYidubnsTjurx0ZqkkwaGRpyoWkaGxtl/H4Lx44NUCw2uXBhmzff\njKOqGq2WyvS0nzvuCGO1fnRVqN80fJqM/BJ897vf5YknnrjdYXzs+NrXvsZf/MVfUK/XMZs/OaI7\nAIrS4fTpOCsrb80SGJmdDe8swE6nicOHYzeGWAuYTHpmZvx4PDIWi5FksqcB4HCYGBx09obZRIFW\nS0VVNYaHXVy9mkHTNCIRO0NDLkRR2HHmXLieZ2Kkj+mvPIYsqgxPhfE5DTht+h0nXL1ex8yMn2vX\nMjz77AoLCzn8fjPHjw+TnV9AKia4/4ERavUOdruEy5Ln+ptpVq6kwWAiEnOimX1Ex0doZLOU2xKt\nVo9BUa0oSOvr1KemSF+6RG5hofeeQPXaGbx+K7gGd67XB9UT+UW4lW2ZW4WuqpK8eBGlVMLs87G1\nsoxSqVGqbZDWPKwsZhneaKDvm8DYKGCrrXP3vQNsJDsoSoeRCQ9HH7uj1yLKN5AkAxaLAb1eQCgn\nSWxuMxwZ59obC+SDVmYePkq1bcA5EcU3FLoploERP0/8T8e5fnSSWqmGfzBIOqPwn/7zRdLpGmNj\nHk6dipPPN/D7LTSbHYzGXuK3vJxndjbC8nIBTdNQFJVdu3w71ZB3o1hsMD+fIx4v43SamJz0EQ7b\niEZvvReKwSBy550xLl1KkUxWkSSRyUkfsZiDwvJST/PFIBIKWVldLZJe3mTX1C7ymozPZ36PC26r\nXqdy9QwXX72G3SxgMzSgmSJ091HKipFKw4TQ1Xj00VHW1oqMD8i01udYfPUUFpuMbDHSzmyz9Oxz\nhPbuYXB3kKZY49VXN4CeiV0kYqdUarK6WsTlkmm3u0Qidmq1Ns1mZyeWQMDCxkYZnU7AbNZz+vQ2\nuVyDZLLKww+PUCo1eeaZVZrNNpVKi2q1xeJinmazw8iIm9FRzy2//rcDnyYjvwC5XI7nn3+ev//7\nv7/doXzsCAaDHDx4kKeeeuoTN8i6vl5ibu7tvnippHDmzDZ+vwWbTcJo1DM15aNYbN7o2fb64hMT\nPjweM+l0pmc/39WwWo1omkY8XkYUe4vLyIiLiQkfBoOOgwcjO6ez3qBgmKWlHOU66C02JKlL34Ab\nj0tCJ4okzp9HL0nYIhEsFgNra0UqFWXnJHvlcpK7BvXQbeOkgNfSRa0rpJbyKAYn2+tZ8vkGmwsy\nTp8Dw6CZfLZNo9FbDLWuhtrV6KoqrXKZ8ubmTdem226TX1rCNTjIp+ihXa/TLL7NBuqqKhoa+WSB\nmmymK4hogp5ksoYiNLh7zIVDqjNwwENXE7Da2zutDrdb5t57+0ina3TqNUpLJe59YBJTt4zJ70A0\nSSRW4sjj+3GF3mvYBzAwEqBvyE9qdYurJxfIrxcZi9qYm2uQzdaZmfFz9myC/ftD+P0Wut1eW0DT\nBKamfNx9dx+tVq9N4/NZ3neIWFE6vP765k5lIpdrkErV+Mxnhnb0dW413G6Zo0f7qdXaGI0CzUya\n1MULNIpFLH4/zWLxRmVGJJtt4HLoGT04uDPj8k7UMxkMrTJDQ06ymTrJKuRyFeRphWTXQaPRQZYF\nwmEb7bZKyNXh3NOX0apFwkEr5k6RXHILTZtBNVppCUZ27bIwPZ0hk6n3qPAmA9lsDbdbJhCw3Ghf\n+TlxYhNJElFVjaEhF8GglQsXUhw8GOHVVzdYXy8BPYbeK6+s43RKxONlZFnPtWsZBKFXyW02O5w5\ns43PZ8bp/GT40bwTnyYjvwDf+c53eOyxx3b8cX7X8MQTT/Cd73znE5eMbG9XeLf6eKXSolhs7rRr\nPB4zDz88QipVQ1E62GwSLpeJVKp6Q/9AYnLSy8mTW2ga2O0mYjEHHo+Zzc2emdyuXb6bpJyDQRtf\n/eouLl5MUi4r+P0WZNlAw2Ags7lKdekaqD0zLcwOTOMHaDQ6jI97EQSBclmhVG6BO0xpo8K1pIGh\nAQc2MUdHaqMzylQqLTStx3zw+DrUOiK4wmhrcQRNw2wxYrEYsPj9GCwWtO7N7AjoJSSf4m3oZRmj\n1UqrUkHTNGzhMLmlZXSSREsFg2TAMTTI6qqGRTIhB3x0cklauTRoGuahO24aGj54MIIgCHSbDSpr\nJqROGb1tgPnFEsliE6fNy8xM4BfqS5Q3Nzj//R9z7uQq6XQNs8PG1x85xrf/cZNg0IbHU8ThMOHz\nmclm60xP+9izJ4jNJtFodHA6Tb/QYC2TqZFM3myUV6222Noqf2zJCPRUoa1WI+mrV9k+fRq11aJZ\nLNIoFokePIiayeD1Wgj1+RjeOwhmM9ev56hUWni9MuFwz9tGU1XQNLxeC16vhVKpSaul0mq04Ubh\nT6cTmJnx4/WaycYziHY3znCXoE+mkhfx3hHDObWXcluiVOp5Gx04EObcuQSqqtHtajeSzX5GRtw7\n98/tlpma8rG9XaHV6pJOV5mZ8WOzGXfWCru91+ZNpapIkh6HQyKTqaOqvYVKknoVxUqlRbmsfJqM\n/C5B0zT+7u/+ju985zu3O5Tbhscff5xvfetbLC0tMTIycrvD+chgs7139sFoFDEab24hGAziTkm6\nXFZ44YVVkskqnU6XVqvD9LQPt1smHq/Q12dn//4QpZKC3S4Rjdrp63O8h4EVDvcsxHO5njvu4mKe\nqFdH6rXXsRja9PU5WF8vksttM9i2kkhImEziDounUGhQqGikkxU2qzWW55Pc99Ak0UOjpHNtYuOb\nJNfTGE0SI3cdwBAKU+wU2fvgXRTXVjEZdVgi/YRnZzE5HJi9XspbWzvxCTodrhuCX5+iB1GvJ7B7\nN0q5jFIq9czxLBaMFY1WUmNgeJTNkgmj1GF4/xiWiEhWtKEh4PHb8YyN3fR6druJw4ej5DNVNjNX\naetdPPmjZTLJIjpRh2p2YwomeeCBofedrel2OqSvXCGXKJBMVimXFTY2yhhs5/nSF+/C57cyMDDN\nsWP9VCotHA4T0aiNxcU8ly6lgN6A8p49QQYG3v+g9dbm+m7cDnlypVIhfeUKaqtXHZQcDlq1GtVU\nCtnjQVNVgnv3oskOXn5pbeewIYoC4+Me7rwzhuzxINntKOW3Nn+J0Ykg5kiQbFrD7Taxd28Ih8PE\n2bMJ4tttBo7ey9orrzO3kmB8Vz+24XFyxgiBsAezuZdo9JIKiaWlHNlsHYfDxPx8lqWlPIcORQmH\nbTidMvv3ywwM1Emna0xP+3E4JFZXC/h8ZmTZgNcrI8t6ms02kiQyMuLeqWY6nSb27w/faLmJH5mj\n+W8aPk1Gfg5efPFFTCYTd9555+0O5bZBlmX+6I/+iL/5m7/hr//6r293OB8anY7K+nqJra0ysmzA\n5zMTCJhJpXpsGUGAwUHnLzzxXbmS3imn9iCQzTY4fLgnvOTxyL/yIiGKOrLZOqlUTwtBT5t6uUpN\n7WCWDSSTtZ6zbq2EzzfAwkIWp1PG4ZBQ1S4mq4x7fAKlVKLbVUkqdsYGoly4dB5TbISZXTPorA4s\ngyE6nS733DdCodDE4ozSaXdYF80IiQ7THj2Rw4cRzpyhnsmgE0Xco6M76qOf4m3suD6nUgiCQOzu\nu8nl6hjniyRyHWJab4OfnvYxP59ldamIBnjreuRoh9i7PloWixGLxY37cw/w5H89QyZdRWeUsAWD\npKsGTp2Ks2dP8H2ZQB1FoZwtoHW7yLKBZrOD2WygnC0w5DWye3/4hgX924nGxYtJ4vEKLleP0ru6\nWiC1lefOfQ6srQyOWAxHfz+ivrcluN0ydrt0k4aIwaC7ZcyZX4ROo0Gn2dx5LAgC9kgEyelk4OhR\n9CYTks3G/Hz2poFXVdVYWircYPw4iB05QuLcOVqVCnpZZuDYNKbIAGO1NjZbT5Rsba3A9XNLlJMp\nik4HndB+XJE2asDBU69tU24scfCQwhNP9Fpoen0vcVDVLoVCk2SyupMIXb2axuORKRabJBIVOp0u\nXq+FaNSOXq/DZOopAL9FTQYIBq1YrXpiMQfj4x727w/SbKrIski12mJ01P2xVqY+TnyajPwcfPvb\n3+Yb3/jG74y2yM/DH//xH3PgwAH+8i//Eqv1t5Pzfv58kosXUzsnPavVyMGDESKRt6zKrQwMOH+u\nAFer1SEeL9/0nCjqUBQVt1v+UNoVxeLbC1ALCavLTiGRpdFso92I0+j2sdsTQNM0rFYDAwNOhodd\nJBJVjBYzRouZdlslla5z9fQS4bCD/j4H1UoLnd1OOl0nFLKwsJDj+vUs4bAds1kmk6hRKvcs2j0e\nN0MPPEBqPUWp2qFkkDGWO3i9H54580mFxefD4vPtPDZ7NHQWB/JSgUajRbOp8vLLGwgCxEZCZLN1\nKpUW584lCAQsO6yTWq1FPN5jVHg8JioGN46xKTR0NDoCzVqHVKr2HvGxt2CQZQw2J/VGh/ExN8lk\njXJFYfLwCINjQfr7HTuW9W8hkahisRio1Vq88soGlWyBVjFPIT3GXYdCXHhujthkk4kDo1itRmw2\niSNH+jh7dptyuafMOjXlIxK59cOr74bRZsNgsaAqN4uruQYGbrofpVLz3f+UVkvdqTA4YjEsgQCt\narV3DW/4Ur2ToVLaTpJZuI7W1Wi0dWxni2wXBT7zkJ2RqRDxeBlN4z3tqqWl/I79gNNpQqcTWFzM\nY7UaSSQqxOMV6vU2/f1Odu3yMTMTwOEwcc89/Vy5kiafb+B0mpie9qPTCZw6FadUajI25qHT0dDp\netUci8XAxkaJSOSj8wT6TcEn66/5iLC6usoLL7zwOzm4+m4MDAxw/Phx/vZv/5Y/+ZM/ud3hfGAU\nCg0WF/M3lZyr1RaJRIV77un/lV5DFHXIsp5C4ebnjUbdTmunVmuRSFRp/P/svXmQXPdZ9/s5ve/7\nPvtopBlZ+2o5kiw7JPFCChPIUgnJLeAm5IbVcAPckPu+RfGmKhAIwQRC2F64EByomBCcgLFlvFu2\nbMnaR6PZ96339fTp093n/nFmWmrNonU0WuZT5bK6+/Tp35zfWZ7fs3wfUcbrtRAK2ZZVF/X7LXPl\nvpDMQ3jnDoRjxzCbQKvXEuxopWwPMTWVpbPTx86dIWw2A8ePT9VEp+bluP1WmVOTMeLTKXYc3ERF\no+PMS2+y7UP7+cEPLjA1lcPns3D69Cy7d0eIROwkk0U1r8RroX8gyVtvzSJJ6sPPZjNw6FDLqjx4\n7iQEQWB8PEMqVeT06RkuXIiRSBTnvGwWtm8PEY2qBomahKmjUCjx2msjjI+rD7VQyIrBoCddUKhW\nLxof8+GTM2dmMJv1hMO2OQXVIjqdhqZd2+k9Pcr08BTBkI2uHW2E778fq9u8wBABtfN0Pq8aRpIk\nU8yk8QVc9PWlyCZy+C0lTp+cZCol8P4PdGC1GmhsdBAIWMhkSpjNugUVKrcKvdlMeOdOJt5+m1Iu\nh6DRYA2F8FwW/vL5Ll5T85jNurqwrM5gQLdIfyYAWRTRZKM43DbS8SxaKuiMelx2BatVz9NPn0WW\nq5w/H0OrFejq8mE26ykU1HJ/Saqg1QqkUkVee22ESMSO223kn//53Fxyu4Hu7ii5nERLixOHw0Qo\nZCMYtCJJFYxGbW3x+9hjHTUjUBBUsbqBgQR6vQ6DQcvkZJb772+4q0I2K22MfAPYBbxHfQffnwf+\nX+BN4DMrPIZr5utf/zq/8Au/gMOxdjMG+J//83/y/ve/ny984Qt3nHdEkiqLrjDn1R2vhCyKpIaH\nCeiz9I6NobO7MLlc6HSa2s0ok5F47bVhpqZUF63BoGX79hDbt4eW3G9Tk5OODs9cg7oyWW+AB/6P\nn8ZhLBGcKDCV1jERUxNJ9XoNfX0JJiYyNSNHEFSPTShoI2DM0jekhpCy+TIX+mME/Q5mo3nicRFR\nlGsNuHp6YjQ3O+ey/3UUi2XOno3WDBFQjbXu7uicPsq97Rlcjni8wOBgCoNBy8BAAkEQkOUKyaSI\nLFe47z7/3ENIX0tmnJjI1gwRgFxOxuMxsXt3hP5+tWlaa6uL3bsjvPHGKLGJOIVEDH+Dj3DExcSM\nhNFqYuNGLzs/8QSTfWOUShVkvY28xsaW9sUftB0dHpLJouolqIJOq8EVcDHYPYpF7ybs1FMtVxgb\nTTI5ma2VjxoMOny+1V+zetrbMbtciMkkGq0WazC4oON2Y6ODDRu8DA4mkeXqXEl+sC6JfDkqsoy+\nmGT3zgBvv54hEx2nvXMrwbYQL786iixXMRg02O1GJiayTE3l0Gjg2LFJxsczjI9n2b+/iYGBZE3V\neHAwxfR0HptNj8VioFJROHcuOieUqHpUBUFY0BNIr9fi9arjfvnlIf7lX86Sy8kIgjqXO3eGiUbz\nRCJ3zzNqJc+ynYAVeBD4FrAbODb32b8DrwK/u4K/f11Eo1Gefvppuru7V3sotw2bNm3i4Ycf5pvf\n/CZf+tKXVns414TLZcLhMBKL1bclb2q68kWsKAqTx44R6+nBbLPxvu1+xqZF7KEAGzY30tKilhAO\nDSWZnLxYeVAqVZiYSKPVakgkClgsaojlUreuyaTjwIFm1q/31qp1VG+JgK2phGM8Qygt4XQaGBlJ\nMzSklpaOj2fxeMysX+9Bp9Nw7twsw6dma2qVglZLKlmgtTVErqi+Z7GoK0ONRqBYLKPRCGzYoMae\nU6kihcLC6pl0WqJSqd6RuiC3AklSQ3cXLsQIhWwUCmWMRi1Op3FOxVY91largc2bA7WHTSYj1a3c\nc7kSBoOGhx5qZefOMIKgdpZ9770p4lMJYj3nQWfgv09Huf/+BirFIuXGVk6cmOHBB1vYdGAbqZSI\nTqclELAueKjN4/Va2Ls3wsREhoGBJIZmI4VsHlks0dTkJJ+JYXS50BlNtTLy2w2zx7No1+l5jEYd\n+/c30dHhoVgsY7cb8PutV21QG+12NFot8qmX2NsaotLlxxksUQg6eDZbqiWbut1GAgEriUSB0dE0\niUQRi8VAMGglGi0gCLB+vQen08jUlJqALMtVqtUqhYKq+xKLqeXAodDyOTiplMi7706Sy6nXqKJA\nX1+CpibnkmG8O5WVNEbuB16Y+/eLwANcNEbiwK3PhLoK/viP/5iPfexjhEJLr2rvRb7yla+wb98+\nPvOZz9DYuHKdVm82JpOOPXsiHD06TiqlSrI3NTnqFCaXohCLkRoeBkWhlM1i0OTZ6LXhjkg0tF/s\nUnppPwlQy37Hx7N0d8dq+ST9/Ql+7MfaCQQuGiSXVutcitVqoLNTTZAbGUkyOJiqhXxU5dgCbreJ\nrVuDHD9ewRIIUhKLFBNJlIpMe1cEweKk0efgzJkZNBpVPVYQBJxO9XtNTY5a2aTaLVRGq1V7bJTL\nVQIB65ohsgTVqsK776pNC0ulCvm8jCSpDwuzWU9zsxO328S2bUHCYXtdEqrHY0arFWolmwD5vEww\naGPrVvWeMz6eUdvJJxJqBYnFQ74YJ5Eu49SVkLJZzC4XAwNJOjt9y5boXorHY+Hxx9fz1lvjzE6l\nSU7D/Qc78Lp0TOWMuJqa0GoFvN47t2xUp9Ned3hREATsDQ3YQiFSw8MIGg2KrgN/63oe3N9IMlNG\np9PgdBpxuUyYzXqyWakWGnI6TXi9ZqrVKhqNhnRaorPTS3OzA1Esk8/Lcx4TL5OTWXp64jz0UOuy\nInL5vIyiqAuJeV0jh8NIpVJZtCrwTmYljREXMDj37zSwaQV/66YwMTHBX/3VX3Hy5MnVHsptR0dH\nB1/4whf44he/yD//8z+v9nCuiaYmJx6PuRZv9/ks6HQacrkSGs1Fz8HlVMtlquWLyolKtYqUyVC8\nLHnE77fQ35+ovdbrtfT1JWhouGhvZ7MlBgYSdcbIUqTTRRIJkURCJJ+X6e2NYzLp5jQTVANBreCx\nsH17kFOnQGtYj6ZSYv0mP3t9Dk6fnsVo1HLgQDMzM3lCISsul4m9exvqqiz0ei07d4Y5e3aWVKqI\nokAgoFaFAJTLVYaHU4yMqB2J29rci4pK3e1IUpnp6VzNaIvHRTIZid27I/T1xdm/v5nBwSRer4W2\nNhctLc65hMYcZrMeh8OIoig4nUa2bQvS358gk1GbpG3a5Mfvt9ZaFIiiTCRiIz+lo2r1kspWSKTK\n6C1msoUqzjnXitW6tA7JUoTDdh57rINEQjWg47MZjh0bx2cLYTLr2LDBu6ga60oiSWUkSX24rnZY\nsJTP425vx9PRgQIolQrKzAD79mxmcFwNc5lMOjo7vRiNOgwGHTabek0mEiLptMTu3Q2MjaVJJESq\n1SqPPLKOqakck5NZGhsd7NkTmfOa6RkYSCxrjFitamuKWMxaa9EwNZXFZjOyiETQHc1KGiNpYP4o\nO4HUZZ8vLGK/jCeffLImONbV1cW+fftobW0FYHh4GOCmvv6jP/ojPvvZz9LU1LQi+7/TX//Mz/wM\njz/+OD/84Q/ZsmXLivzeSqGWUqpGRzYrcfKkWuqo0Qh0dHjYtMm/IDvd7HZjcrkoRKMX3xQEnPMt\nN+dobXUxNpapZdrrdBpcLtOChL+ryVPp6Ylx4sQU58/HSKXURmc7dgQ5fHiw9ltWq572Oc/M5s3q\n6lt196uueq1WQ2Ojk0xGwmJRm6GVSlXcbtOiQlparYbZ2RxjY9laLkpHhxePB86dm+XYscnaSn5o\nKMWDD7bQ1uZesJ+7FVGUOXJkjOHhFJWKQj5fwm43YrcbyOVKdHb6MJl0PPxwGz6fWS2bnSmQy6l5\nPBMTGfbsiXDmzCyzs3m0Wg2trW5CIetcqbm11qJgeDiNLFcQRZlgeyMnT01TFGUOPtRGMVugp3uW\nPQ/78Zh1dHRc2bu3GGaznoYG9TyIROyEG90UCvKyiqwrxfnzUc6fjyFJZXw+Czt2hK86x2MlcEQi\nxHt66sQATS4Xe/Y2sn6Tei6YTDqi0TyvvjpcM+I3bvTT0eFBliu0takVM7FYgaGhFA6HkZYWJ7GY\nSDwu8r3vnaNcVggELBw61LrseFSNkTAOh5Hu7ijHjk3i81mYnc3z8stDfOAD7Xg8d0e7jpU863YA\nnwf+L+DPgb/jYpgGoBX4XyydwKpc3rVxJTlx4gSPPvooPT09uN33zo32Wnn99df5+Mc/zsmTJwkG\ngzd13/Mt7lcSRVF47bURLlyIX/K7sG9fI1u2LPx7spOTjL/zDlIqhUavx93eTnjnzgX9WkRRZno6\nhyiWcTqNHDkyVqcfALB/fxObNi3dqTYWy/P88wMkk2p1RqGgCiB97GObiMdVXZKdO0N0dfmuGGu+\nWhRF4aWXhhgYqPf2hMM2Dh1q5rnnBuq0JkDNt3n00Y6btoq9FfN+I/T1xXnlleGLHWNFmeFh1SiL\nRi9q1Tz0UCuKAq+8Mlz3fUVRaGtzMzKSqu1Dp1PzROaNyu7uKG++OVr7XFEUyuUqDQEDyckodruO\nZKbMVFzhvm2NvO99jXd88qIgCPzv//1erToMVJ2NRx5Zt2plq5VymekTJ0j09VEplTA6HIR378Z1\nSaPU2dkc//VfAxSLau+hWKxAKlXkiSe62LLFj9+vhuVisTzPPdePKJYJh21MTmb4+78/jdmsq3mf\n9u5t4HOf27ms2q6iKPT1xfn+989TqaiNPOfLxPfujbB9e3jJ795uzN0zFr1xrOSMnwCKwGtz/z4G\n/Cnwq8CHgd8G1gHfAz62guO4IpVKhc997nP8/u///pohcgUOHjzIz/3cz/HZz36WZ599dtXdqtdK\nJiPVCSOBGu8dGEjOVT/UK17aIxHWP/YYxWQSrcGwZAKd2ayv8xbs3dvA0aMTZDISer2GlhYnbW3L\ntxVIpyXyeTVjfv6wSlKF0VFV2nvTJj/79jViMl27e34pSqXKgpwXUMNK2WyJcnmhL7hQUPvyaLV3\n1txfL4mEeFm5qNoVV6/XotWq3Wzb2900Nzvp6Ykt+H4mo7Ya0Ggu5oqo4a9kzRiZ96rNIwgC+XwJ\n9A5EwUw2XsLqcrKxwcq2bcE73hCZ51JDBCAWKxCLFVatrFyr09GwZw+ejg4qkoTR6VxQtVMolGuN\n74xGHQ0NDhoaHFgs+pohonLx+pDlCpKkeidlWS0BdrtN6PVqufZyxsh8tY3Xa1nQxmKx5PM7lZU2\nP5+87PWvzv3/R3P/3RY89dRT2O12fvZnf3a1h3JH8Lu/+7scPHiQr3/963zxi19c7eFcM4vZT6oB\nsPjDVWc0YrvGhOaWFhder4VkUsRg0OLzWRaV9r4Ug0E794BXty8U0iiKGmISRZmODs9NNUTmf9Pt\nNtWJsAG1NvRer4V8Pl33WXOz84p/y92E221eoF/R2Ohg82Y/27cH5+ZXDW/4fBYMBm1dpYPVqsds\n1i04xpeGQxbT8PB4zJhMWnQmMzqTmYqiPryvNmH1TkQQuKVhoqUwL7MoNZt1GI3aunJ4QVC1XC7F\n41F74wwMJJGkCgaDhtZWF16vqm5rsxmw2QwL2lAshtNpwm431oV6tVphVRRxV4rVLyBfZY4fP87v\n//7v89Zbb91xq/zVwmAw8L3vfY+9e/eya9cuHn744dUe0lXjdJpoaXFy9uzFPBCtVmDDBu9NvwnO\n32yulkDASlOTg+HhdE3jw2zWEQhY8XjMy4Z4rhdBENi8OVBLvgP14bltWwijUc+uXeE570kBjUag\nocFBV9fi3WTvVhob7bS0OBkdzVCtKuh0Gjo7vTQ1LTTKwmE7O3aEOHcuSrFYxmxWtS4SiQJTUxfL\nv+eTgedZt87N8HCqVlYrCHDffWoegiAIc00cDWzZEqzpT9wNXP5QDwZtt301j99vpavLx7lz0bky\nbjVJ/vJEVI1GYM+eBkwmHRMTGTo6vBSLarfkea2gOC4VSwAAIABJREFUdevcV/X3Op0m9u6NcPz4\nFNmsmh+2YYPnqiQK7hRu56fviueMpNNpdu3axVe/+lU+9rFVjRTdkbz44ot85jOf4d13370p5b63\nKnegUCjR3R1jaCiJTqdhwwYvnZ3eayplVRSFVKpItargdptvmiGTz5cYHk4xM5PH5TLR1OTA4TCu\neAw9mVRbxFcqVYJBW10SYalUJpEQ0WgEvN4re3iulds9ZwTUPJGpqRy5XAm3W1XOXE79MpkUEcUy\nNpseh8NEOl3k7NlZJiaymEw6Nm701QyNeWZn8wwNJcnnZRobHbS0ODEadXPt42WMRt1NP/aZTJFS\nqYrLZbzlpdyCINDfH6e7O4oololE7Gza5K9VjdzOlMtVpqdzJBIiNpuBcNi2bKhFFGWq1Sqzs3km\nJnKUSpW6Ob5a8vkS6bSqzHonesiWyxm5Z42RUqnE448/zqZNm3jqqadW7Hfudr761a/y7LPP8uqr\nr2Iw3Fjd+61+KElSeS7mf2034XlZ7dHR9Jykt409eyLX1aNmjTvDGLlZqOecBp1udcNcpVKZ06dn\n6OtLUC6roZ89eyIEArdOYXl+3iuVak0x9W5ldDTFe+9NkcmoxmxX10Jj9F5gzRhZuGN+9md/llQq\nxfe//3202jVxp+ulWq3ykY98hIaGBr71rW/d0L7ulIfSsWOTvPfeVN1769d7eOihVgRBoFAoMTyc\nZno6h8tloq3NdUes9laLO2Xeb5RKpcrYWJqRkTQ6nYaWFteyGhMryYULMV5/fbSuZ1MoZOPRR9fV\nKjVWmjth3uev5ZkZtb9Tc7Pzmhcd6XSR557rr8v3MBi0fOAD7as2/6vFalXT3JYoisJv/MZvcOHC\nBV566aU1Q+QG0Wg0/MM//AP79u3jL//yL/n85z+/2kNaUWS5wvDw5ZI5MD2dI5uVMJv1vPXWeF2p\n7NBQkh/7sXZcruVvYuVyldHRNMPDFwXG7rWb1d1MT0+Mo0cnahVK/f2JVdNsGRlJ1xkioFYNpVJF\nBEFgcDBJNlsiErHT1uZaNgRxt1IuV3jrrXGmpnLYbHrOnYsiCPDggy10dnqv2mhLJMQFGkOlUoWZ\nmdza9X0J95QxoigKv/7rv86bb77J4cOHsVjunkSw1cTpdPLss89y4MABurq6OHTo0GoPacXQaAT0\n+oUudo1GmBMPyzMyUl99Eo+LjI+nr2iMXC4wNjiY5NCh1loH1zXuXERR5vz5aF2ptCRVOH8+SkuL\n65ZXkBgMC89hrVZAFMu8/fZ4LZl5aCjJ7GyOgwdb7qkKKlBzeMbG0jidJl58cahWDRWPF3jkkQ7u\nv//q8uS0Wk1Nzv1SFruP3MvcM0dDURR+7dd+jSNHjnD48OGasusaN4f169fzne98h0984hMMDQ2t\n9nBWDK1WQ2enry7mrzbG8mK1GpDl6qLaHPn88noA+XyJnp5YXc+S+YfVpa7s6eksr78+wn/8Ry+n\nTk2rWhRr3PZIUqWuamSefF6mUrmyrne1qjA4mOTw4QGef76fvr74oufZ1bJunQejUbvgvVisUCdy\npygwPJwmGs1f92/dqZRKVcxmPcPDqbqy7EKhzMBAkmSyXp9nfDzDK68M8Z//2ce5c7M1LRK/30Io\nVN8Gwm43rJqWyu3KPeEZqVQq/NIv/RInTpzg8OHDOJ33Xm+NW8EHP/hBfud3focnnniCN998E7v9\n7qmBv5T16z1otQK9vXEqFbVV+Lw097x+wKWdT7Va4Yo9aUqlypICY5WKgk4nMDub46WXhmv7npjI\nEosVOHSoddUTItdYHrvdsKhmS2OjY9mqnHn6+uIcOTJWEwkbH88gimW2br0+FeSmJicPPdRKT0+M\nQkGmtdVFZ6eX48enFmwry5UF4mT3Ag6HEbvdSDZ7Ua1ZoxFwOIzIcqVOS2Z8PMPLLw8hiqoBMjGR\nIZUq8r73NWE26zlwoJkLF+JMTGTxeNQE1rupRPtmcNcbI8VikU996lNkMhkOHz6Mw7Fmja4kv/Ir\nv8K5c+f4yZ/8SX70ox9hNt99iZtarYb1672sX+9d8JnHY2bXrjAnTqheC1UPwHtFPQCHw7jow6qp\nyVkzNEZG0gvau4+NZYjF8jdNHn6NlUGr1bBzZwhJKhOPiwiC2hfmvvv8V/xuuVylpydWZxBUKgq9\nvTHWr/dcdz5HS4uLlpZ6D3E4bOfChXhdSMHhMOJ0Gi//+l2Px2Oms9NDJiMxMJBAq9UQDFpxu021\nzr3zDAwkaoYIqB6loaFUzehwuczcf38jiqLccxU0V8tdbYzE43F+6qd+ikgkwn/8x39gNN57F9St\nRhAEvvWtb/HpT3+aj370o/zbv/3bDZf83ml0dvoIhWxksyVMJi1er+WKN6BLH1bzmh6RiL1OYGze\n7Xsp5fLiYaE1bj8CARuPPtpBLFZAqxXmukdf2StSqVTrVuHzyLJaEnsz7f3mZgebNvnp708gy1Vs\nNgN79kRwOO7NsvV167w4nSYsFj0TE2kMBh1ut5k9exrq9EEuNUTmKZerCzxKa4bI0tzOR+aGSnuP\nHz/OT//0T/OJT3yCr371q2g0a27sW4ksy3z84x8nl8vxzDPPXFVo7E4o9Vtp5lfOWq0qMHZp+GVw\nMMnLLw/V5ZV4PCYee2z9AjnxXK5EqVTG4TDd9iGce3XeC4USxWIZh+PKgmNvvTXGmTOzde9dWk5+\nM1EUhXi8gCRVFu0+fbO4k+a9WlWIxQqUy4t3v7680SFAMGjl0Uc7rluwMJ8vIUllnE7TXZM8fE/p\njJRKJb72ta/x1FNP8Rd/8Rd89KMfXYGhrXE1lMtlnnzySV555RWeeeYZurq6lt3+Tro5rQblcoWT\nJ6fp7U1QKlVwOIzs2ROhqcl5yTZVzp2brbn1PR4zu3eHb6mY1bVyr817tapw/nyU7u4oklTB6TSy\na1ek1sl1MbJZiXfemWByMouiqA+6vXsb7mj9mrtp3iWpzPHjkwwNpeYMFjN790auK3wqyxXOnYty\n4YJ6Dft8FnbtCuP3L593didwTxgjoijyj//4j/zhH/4hGzdu5M/+7M9ovqTt8xqrg6Io/PVf/zVf\n/vKX+Z3f+R1++Zd/Gb1+8Rj33XRzWkmSSbG2ar1ctXIx78mNrtBWmntt3sfG0rz44mCdC38pD9el\nVKuqx0JR1HyG293jdSXuxnlPJERkuYLbbbpu8bj+/gSvvjpcdw3fakG6lWI5Y2Slz+ZvAK8Bf3LZ\n+xHgKJABTgN/ca07lmWZEydO8Fd/9Vd8/OMfJxwO8+yzz/K3f/u3/Pu///uaIXKbIAgCv/ALv8CR\nI0d47rnn2LRpE08//TSl0lpJ6vXidpsJhWyLymePjKTqbmKg3iATCXHBtmusDhMTmQW5BMlk8Ypz\npNEI+P1WAgHrHW+I3K14PGaCQdsNGQ3Dwwuv4Xi8QDx+d1/DK3lG7wSswIOAAdh9yWf/D/B/A2Eg\nDhiBHUvtSFEUBgcH+e53v8uv//qvs3//ftxuN5/+9Kd56623ePTRR+nv7+dHP/oRDz744FqS0G3I\n+vXreeGFF/jzP/9z/uZv/obW1la+/OUvc+bMmbtudbSaLCXIdju0ZV9DZTFDYm2O1phnsWtYq9Wg\n1d7d58dKGiP3Ay/M/ftF4IFLPtsMvAHkgSxgBxZqbAN/8Ad/gN/v59ChQzzzzDOEQiG+8pWvMDk5\nyblz5/i7v/s7fv7nfx6f795qa36n8sEPfpCXXnqJF154AUmS+PSnP40sLy8ItsbV09rqXiBmFYnY\n1zQNbiOampxYLPWhynDYXtcpeY17l/b2hddwQ8Pdfw2vpKn1JeA94Hngx4D3Af9r7rNXgUPATwD/\nH6rR8onLvq/Me0RMJhORSGQFh7rG7cDdGENeDUZGUpw/HyOfL9HU5GTjRh92++1b1n4vzvv4eIbu\n7ijZrEQkYmfjRh8u152bjHo93IvzfrUMDSVrgnQtLS66urzYbLfvNXy1rFajvDQwr/TkpN7zMR8w\nfRY1pyQBfBA4PL/Bxo0b18It9xiHDh1am/N7kLV5vzdZm/d7kvRSH6ykMfIW8Hnge6iekb+75LPT\nwAHgBKrBcgY1r6TG+fPnV91qzmYlBs+OkJqcRqPV4W9roH1jw4plNCvVKkMvvURycPDim4JAw549\nhLZvX5HfvJ1YWyndm9yp816tVMjPzFBMpdBbLNjCYXSXCStmp6YYeOEFKtIl7ePtdjoeewzzMv2x\nYrECJ05MEY0WMJl0dHX56Ory3VV5JSsx72IySSEaBcASCCx7jFeK5NAQwy+/TLV8UQjN4vOx7tFH\nMSzTnHV8PMOpU9Ok0xJWq56tW4Or0tF5JREEYUnBqZU0Rk4ARVTPxwngGPCnwK8CXwP+E2gFhoFG\n4LkVHMs1oygK/cfPc+IHh8nEUiAIeBr86D75YTq2rVuR3yym0+RmZi4fCMmhIYJbtyKsCbetscZt\ngaIoTJ04QfTsWSqlEoJGg7OlheYDB9BfIomam56uM0QAStksYiKx5INSksocOTLG9HRO3UeuxNGj\n41it+gXy7WtcJDMxwejrryNlMgAYHQ6aDx7E0dBwy8dxqSECqpFUTCSWNEZSKZE33hglk1HPlVyu\nxJtvjmGzGe4KfZGrYaWLlp+87PWvzv1/Ati2wr99Q6STeQbefEc1RAAUhcT4LP1vvUfb5rYVUcQT\ntNpFDQ6NXq+2hl0CMZFATCbR6HRYA4G6m+FylPJ5BI3mqrdf49YjyzJ/+Zd/ydtvv83Bgwf57Gc/\ni1Z7ZQnxNW4uUjZLIRYDRcHs81EuFol1d1OZK1FXqlVSw8O4WlrwbthQ+55mMU0dQUBz2RyWJYmq\nLGOw2YjHRWKxQt3nslxldDS9ZowsQbVSYebUqZohAiBlMsyeOYMtFFpwvFcS7SJzLmg0CJeMYX6+\n9VYrgiAQjRZqhsg8hYLMzEz+phgjdeev14vpNmwWe2crqKwg1WKBQiq74H0xFkMpy6C9+clEJocD\nd3s7M6dPM68rrNHp8HV2LhlbTQwMMHH0KKVcDkGjwRoK0XLw4LInWymfZ+bUKdJjYwiCgKejA/+m\nTQtczGusLsVikSeeeIJqtcqnPvUp/vZv/5bDhw/zL//yL2sGyS0kPzvLyOuvIyYSAJhcLnwbN1Iu\nFus3VJTaNvPYw2GMTidS+mKo3BYMYvGrDfKqlQqxnh6i58+jlMvYwmFMLZ1otQKXLa6XW4/c85RF\nsc4QmaeYSlEuFjFYb513wdnSQry3l7J4URfEHolg8ftr8x2/cIFKqYQtFCK4bduS4bebMee5mRlG\n33hDPTcVBZPbTfP+/dhvs6KQNb//Ejh8LsLN9R01BY1A4/pGtCvY+C20fTuN+/ZhDQSwNzTQfPAg\nnnWLh4VkUWTqxAlKOdWdq1Sr5CYniff2LvsbUydOMHv2LFI6TTGVYvL4ceIXLtz0v2WNG+O3fuu3\nsFgsPPfcc/zcz/0cL730ErFYjK985SurPbR7BkVRmD59GjEeVxcIikIxmaQQiy28DwgCJnd9jN/i\n9dJy6BCe9esxe70ENm+m+cCBmrs+NTTE+NtvU0wkkDIZ4hcukOk+ybq2eg+I0ahd84osg85sxmBf\nKL1udDrRmW5tkz97KETbww/jamvD7PUS2rGDpgceQKvTkRoeZuLoUQqxmDrfvb2MHz1KwGfC46kf\np91uIBS6sTYOiqIwe/bsxfMXKCaTTJ08SbWysPniarLmGVkCncHAtkfeh1zIMT44i0YjsG5TMxsO\n7F7RDHCd0UhwyxYCmzdf8XekTAY5n1/wfm56esnvFDMZMmNj9W8qComBAfz33YdGt3ZK3A689tpr\n/Nu//RunT59GNzcnBoOBp59+mq1bt/LJT36SDZeEA9ZYGcqiqN7IL6OUy+Hu6CDR10dVlhE0GhxN\nTTgaGxdsaw+FsIdCi7aPTw4Oolz2UBBjs3Ru2gIaP1NTWcxmHRs3+ut6EK1Rj0arJbh1K1ImQymr\nerQNdjvBLVtuaYhmHkdjI47GxgVznhoaWpBPkp+ZQZByHDzYwtmzs8TjIk6nkc2bAzesLVIuFtXw\nzGVI6TRyPo/R4VjkW6vD2pNnGQIbOnjo/3SRmZpGo9Vgj0RuWXb21Rg8eosFndG4IEHO7PEsvd+r\n+G1FUZidzZNIiBiNOoJB64p17lxjIYqi8Ju/+Zt87Wtfw33ZSjsSifDbv/3bfOlLX+Jf//VfV2mE\n9w5aoxGj3V4XZgGgWiWyZw/u1lbEZBKD1YotHF42/2rRa3qJ69xiMXDggB9JKqPTaW5519ZSqcz0\ndI5cTsbhMBIMWtHrb+/QoLOpiXUf+hD5WbW7sS0YXPZeeCuYn3NZrhCLFYjFCqQTqrExP6eCICAA\nwaCNQMBKqVRBr9felMoprcGA0eFYcP7qLRZ0t1mu4JoxcgUsPh+W20zdVVEUpEwGrcFAcPt2Jt5+\nu5ZIZ3K76xLoLsfocOBqbWX2zJnae4JGg3fDhppX5Pz5GMePTyKKZQRBvUgefLAFl+vWujvvVb7/\n/e8jyzKf+MTlOoAqv/iLv8jXv/51zp07x6ZNm27x6O4tNFotgc2bEZPJmhdSZzYT2LIFvdGIfm4F\nfL141q0jMzZWXwYaDKLR66nIMkbj4k0lVxJJKvP22+P09yeoVBT0eg2dnV727m287XviWLxeLF7v\nag+jDlmucPToOAMDSRosXvqHTuJ26Glvd6PVqnl+5rkxC4KwoKFlKZ+nWqlgug4vRu38TSTqzt/g\nli2LJtquJrdzStQ1de29VyjE40y88w7ZyUkMNhv+jRux+P3kpqfRGgzYGxqu6L0pFQpEz50jNTys\nGiLr1+PbuBGtXk8mU+Q//7N/QWb37t0Rdu4Mr+SfdsfqTdxMFEVh165d/N7v/R4f/vCHl9zuq1/9\nKhcuXODv//7vb93gVog7Yd7z0Si5qSkURcEWCmELBm/KfpVqlXhvL9GeHqqlEnqrFb3VSnZyEqPd\nTnDbNlxX0fRTURSkdBqNTofBdmN5BkNDSV56qb7zs16v4UMfWkdDw81z698J834zGBtLc/jwIOVy\nFafTgLsaJ95znpZGC40b1xHYsqVWcFCtVGoLTY1Ox+yZMyQGBlCqVeyRCOEdO64rtLJS5++1sloK\nrGvcZMqlEr0//CFjb71FtVxGb7GQnZyk8yd+gvCOJfsMLsBgsdCwZw+BLVsQUynkTIb06Ci2UIh8\nvoooLuwVMzu7MDdljZvPa6+9RqFQ4PHHH192u8997nN0dHSQSCTwrLIr+l7A6vdj9fuvvOESlCWJ\n3PQ0pVwOk9OJNRhEq9cjaDT4urpwd3RQiEaZePddEn19oCjIuRylXA6j3Y7ZvbT4lZhMMnX8OLmZ\nGTQ6HZ6ODgJbtqC7zkT7TEZa0DVWlqtks2udtq+HTEaiXFZFx9PpEkWjC8e2B4ls8eCxC2TGxykm\nk+jMZqZPnqQQi6G3WjHabCQHBmqhvPiFCyjVKq0PPXTNeYs3ev7eCtaMkTuI5OAg40eP1txtFUki\nfuEC8d7eJStuliPR18fUe++pOSeCgC0cxr9rHyaTDlmuv/H4/Xd3k6bbhW984xs8+eSTaK4gcOfz\n+fjwhz/MP/zDP/Dkk5fL+axxO1GWJMbefJPk0BBKpYJGr8fX1UXD3r215EqtToeYSJC/LPm8lM1S\niEaXNEaqlQoT77xDemSk9t70iRPoLRb8Gzde13gdDiMajUC1etEg0ek02GxreWPXg91uQKsVagae\nJFVQbDryQ70kJwapyjLVOQ+R1e9HzufRmUyMvP46Wr0eayBQ21d2cpJiKrWscXqncnsHAO8ySvk8\nyeFhkoODFC9PiLsKpFSqVp41T6VUonIdXW+LqRSzZ89eTH5VFHKTk0jTY+zYEap1jVRzRqy0t999\nJ//tRn9/P2+++Saf+cxnrmr7z3/+83z729++J1zdt4JCPE5iYID06Cjly5LCb4TsxERd1UxVlon1\n9JC/TG153jARNJr6xNZlDFMxmawlbM6jVKskBgaue7yRiH0un0Edg1YrsGGDh1Do3lACvVmUCgVS\nIyNYK1lam6x1x3NdSIM4NkB17t4tZzJMvvMOSrlcE0cTNBoKl1VyCYJw1ypxr3lGbhGFWIyRN95Q\n+yYoCkank+YDB65JqlhntdZE0UxuN/rG9chmD5VQJ6IoYzZfOSGpLElUSiWkfB65UFjweSEWo/MD\n23G5TMRiIkajlnDYvrYqugX86Z/+KZ/97GexXqVA04EDBwA4evQo+/btW8mh3fXE+/qYfPddVTxQ\nq8UeidC8f/9NKX0splIo1Wrde1VZrukDzWMNBtFF2knnquj0WmyaArpqaVn3ukajWdRlr72BEn2j\nUcf+/U20t7vJZiWcTiPhsB2d7vauprkeKpUqMzN5crkSNpuBQMB6U5J0C4kEo6+/rhqKikJjUyuN\nezopCSYcDiOW4iyjlTKVUgmlWlUNEEVBTCbRWyyUslm8GzYwffJk3X6dLS23pXrqzWDNGLlFzJ49\nS+GSFYyUTjN98qQaO77KG4fV7yeweTMWv5+YZOWddyap2iqM6dOMxod44IGmJduQX6r0WJVlHC0t\ni25n8fkQBIFQyE4otFBEaI2VIZVK8Z3vfIczl1Q5XQlBEPjUpz7FP/3TP60ZIzdAKZdj6r33LooH\nVipkxsZIDAxcUy7WUphcLgSNps4g0ej1dYmmuWiUC6fHePPdFFO9w2j1Otbv6uJDP7l32YePye3G\n0dxMvKenbt/LVdRdDUajjtbWu1tkTZYrHDs2SU9PDFmuotdr6OrysXt35IbLmGPnz9d5vnJjw1jL\nEhsfeQSdwUB6Ik8hFiM1MoJSqWCcyyMyu92Ucjmq5TJGp5Ouj3yE/MwMVVnG1daG7zpDb3cCa8bI\nLaCQE5kZGkfKl+r0OoqpFHIuh/YqtUvsoRCVzZvReUO888oEhkgLgbYGGv06yEwyfraAZcf6RaWP\n0yMjTBw9WishzAwPY/Z4EJNJlHJZzRkJhXC3t9+cP3qNa+Jv/uZveOyxx2i4xqZen/rUp9i/fz/f\n+MY3auJoa1wbUja7qJdwOfHAK6EoColYFjEWxYCMxecjNzuLgNriwdvZWcsFkEWRidPdvPXSGLNj\ncYwOBxqdjrRsYDJWIbz4ugFQDdLIrl0YrFZSw8NojUZ8nZ24Wluve+z3CjMzec6fj9WSS2W5yvnz\nMRobHdclMJdMihSLZVxOQ925I2g0aulupcLsmTM4GhqolsuYvV6Sg4OUi0Wq5TIN+/YR2LyZaHc3\nepsNX1cXrpYWlEoFRVFuu1Lcm81q3r3uB/4YqALvAr+ximNZMcbHM5w/HyUbqzJ9fha/30JzsxOd\nXovebL5m4RlXczOS0Y3Br9DcaqTFFGf81ZcoJNLkwkEMmUmaHnhgQYJTdiZKxd1IBQ1milQycbQm\nEy0HDlCRZXRGI7Zw+Jb2cFhDpVwu881vfpNnnnnmmr/b0dFBW1sbL774Io8++ugKjO7uR282ozOZ\nKF2We3W9gln5fInzZ6eYOf4uoye7MRsEtu3vwtfVhcnlwux2YwuHa7o+YjxOLiORTuRRqgpyvkCw\nwUOrSyI3cJ64I6/2EdEbicdFqlUFn89S06MwWK1Edu2a63GiuWtzCm426XSxZojMUy5XSaclmpqg\nWCyTSBQQBAGfz7Kkt6RcrnDixDS9vXFKpQoNDXb8wkVNJrPPR7S7m8z4OIH77sNgt2O023E0NmLx\n+5FzuZoImSUQoL2hgfzMDFI6TXZyElsodENhtzuF1fwLh4GHgRLwHWAzcHYVx3NN5KaniV24QDGV\nwtHQgHfDhgXxZVGUOXp0nFSqSPO6TpLjM0xMprC7LLR0Bgls3boglnw1WCwGrDYjrd4qvd/9AbHB\nMZq2bcRqVEgND2Px+Wjcu7duHCf6ipw9MkhJknH7ndx/fwPaUgyjy4XtkmztNW49P/jBD2hqamLP\nnj3X9f2f+Zmf4emnn14zRq4Tk8uFf+NGpk6cqCUUmj0ePB0d17W/3t44qfFJBt89Q0UuUyoKnD/W\nR2chy/pHH1mYJyYI6IUyFpuJQlbEG3ThNxcYeuVlGttCDGeGsHRspi9pI56SURTw+Sw88EBjXUfX\nyx9Y1UqFsiiiM5uvKIleiMeJ9/aSn5nBGgzi7ezEsoQxVojFyM2FIGyh0G0nMna1OBzGuioXUJNL\n7XYDs7M5jhwZI5Eoqkn8AStbOwyIA90AeDo6cLe3o9HpGB3NcObMDGazHr2myshQEktLBLMxgZYq\nUiZDoq8Pd1sbWoOBiiQxPThIaPt2xHgcndmMLIqUi0UqksT4kSPq8VUUNHo9oe3bbyhcKIsiuakp\npGwWk9uNPRy+Lb0sq2mMXJpKLgPlpTa8XqpVBVGUMZl0N1VOuRCLMfTyy7UeCPmZGfLRKG3vf39d\n59tkskg6rdbsT+dNND38Y5jJ49RLVHJxpo4fZ3YyQbZiwezxEG5w4fNduYTWYNCye3cEcaSXYipN\n+/3biZ56j9mZMUxWM6nhYUxOJ77OTgCGhlIMT0iIooxSqRCdTPDuMYHHf3wDFo+HcqlEbmqKYiqF\n0eHAHg7f8uZS9zJPPfUUv/Zrv3bd3//4xz/O//gf/wNRFDHfZhLPdwqBLVvUUMrMDDqTCUdDA6br\naP1QLleQ5Qpmo4CvrRmdUqISG0ecHGG6Eiew6b4FxojF58Ni0bF1e4i3siJNzU7KqRLeLbsxeS0Y\nW12cOx+nf2gEncWCRqNBzDoxm3V84APtiyawZiYmmDl1CimTweBwENq6taYUW60qZDISBoMGi8WA\nlM0y8uqrtR4m+dlZctPTtH/gAxgvaz6XGh1l7I03avk1BpuNlgcfvCEV2ltNKiUyPZ2nWCyzZUuQ\nRKJANFpAkiq0tbkJBKy8+uoIs7MXQ3c97/UjzZrZEDajZKKMvPEGFVkmsGkT8XieRmuB+PlzKKKI\nv7GZ0XEfDz54CJMiMvXee/jvu69usaozmdDc98sNAAAgAElEQVTo9Vj8fsqFAggC3q6u2rGfpyrL\nRLu7cbW0YPZ4UBSFQkHGaNReVUKxLIqMvP66WvqtKAhaLb6uLhrvv/+260N2O4xmK+AHeq604bUw\nNZXl9OkZkskidruBLVsCNDdf+81lXnpdo9fXOm2mx8drhsg82clJCtGo2hypWkUWRbQatT6/XK4i\nimVmBT1hTZHhM0cxSAl07dt46z9eQbF5MXs8NNzXwYEDTcuOc2goyfnzMbrPzRC0lWh+6CGqU/3I\ns2PodRqqlQpKpcLM6dNYAwEqksTg+WkMDieejg5y01NUZRlZa8EQaUMBJo4eZeKdd8hMTFAtl2na\nt4+Oxx+/ZX147mWOHz/OyMgIH/nIR657H8FgkJ07d/LCCy/wxBNP3MTR3TtotNpac7N5FEWhEItR\nymbRmkxYAwG0Oh2lQgExkUDQaLD4fOgMBsZGk7x3pJdsLIUr6CU6I3Khv4jXIdDkCiD2DyDqJfKz\nsySHhnA2NVGWpFp/qcju3ZiHhgiEXVRNDv7rX3Nkx5JoemNEUxWmYzKZyUn0ZjNlsYjBZsNm1ZPN\nNuBw1C8cxESCkddeq92jpEwGKZ2m45FHyFdNHD8+SSxWQK/X0tXlo8EuLighnfd+XGqMVMtlZs+c\nqasCKuVyTJ8+rYadVqEh3aUoioJcKKAzGpd80M7M5Hj11WGSySKxWIFstsTu3REiETttbW4iETvF\nYpl4/KIhIhVLTE7nyWaKmI1eink7bQGHqu/U0YFZjHLyv55FyKcABXG0n8j7DiKXW2i8r5OyJNU9\nL5RqFbPbjT0S4cIPf4iUSiEIAvnZWfQ2G1Iuh/GS5OZysah6N6J5Tp+eIRotYLHo2bTJz7p1y4cS\nsxMTNUME1OTseG8v7vZ27OGVVdS+VlbbGPEA3wQ+ttiHTz75JK65B2JXVxf79u2jdS4xa3h4GGDR\n1+l0keefP0Y2W8Jo9JHJSExOjrF3bwPbtnVd8fvzr6VsFv3sLPmZGWLFIo6mJrY/9BAVSSImSQga\nDZFAkKpGTzyXYnR8nBatlmh3N5PRKAaHk7C3keFJKBZj2M1aCoPdFAbOkXI7GTvWy9CxUfybtyBY\nq0RnDJw+bSQSsTM+PrZgPIlEgfFxLS++OEBDQCRXytLgM6EPhrHt3UN6eBivwYA9HGZ0fJzUf/83\nzkoFOWlltm8MR0MDgc2bUapVdIY8yWwCx1iezPg4s/k8eUnCnE7T//zzZE0mwtu30zaX0Ho1x+tm\nvL7XeOqpp/jlX/7lG04+/ehHP8ozzzyzZozcRGbPnmXm1CnkQgGNXo+7rQ3P+vVMHD1aM0ZsoRDW\nzffzo39+h/EzF1i3tYNnvvsedpcVh05Hz3sXmHCaef/e3QQ8eqRCkbGjR8mMj5OdmMAaChHcsgW5\noOYmeBxa+kdjJAYGkMQStnCYQqFEJi1iCYYp53MgqEaAUsgs6GMCqvT35YulUjZLLpHiaI/M5OS8\nMSHz7rsTsMmKRqut7yarKFRL9cKH5WIRKZNZ8HulTIayJNUWa6tBbnaWmdOnEefUSwObN+Nua1uw\nXXd3lFRKIhYr0Nsbp1JR0GoFdu2KMDWVpb3djaIoGI1a8nk1ZJecTRG70Iel0Ub81BAGt5dpx3q6\nWtxUKxWIjkBijInuQaqVChaXneauJoyyWvnibm0lPTpKbmqKiiyTn57Gd999RLu7Ucpl7A0NVCSJ\nUi6HLRwmNz2NoNHUjqfeYkExWHnzzdGatyaTkUgmRcxmHZHIRY9LMZ2mIsuYXC60Oh3FRbSpqrJM\naZFu76vNahojOtRckS8Cs4tt8Cd/8idLfrn1smzxS1/HYgVKJQeXRExQFBdarXvR7Rd73dzUxOB/\n/zfJuYekAxBGRkgODGCPRIh4vYhmP8d6kiQTKQKNHto8zcR6eijE4yhDQ1QtFtq3WAjtaWdi2kmT\nDyZ73yA+O4XT7SE9lqUsihRiUdytLRj0HrJZCVEsLzo+SYoxPNxPa8SI3HeO06d6mXBouK8RIu0N\nNM5JTBtsNuyZDG6NBjGZpDnsYeCCkeJMAatTi6DTct99HUQMBS786EeMvv46equVts2biV+4gFwo\nYMlmCVyyKlrqeI2PZxgYSCBJFVpanJRKZQwG3RWP75Ve3wtMTU3xwx/+cNnz/Gr5yEc+wpe//GUk\nScJ46Ym/xnVRiMdrhgjMCZXNXRvzuiFKtapud36MxOgEJrORqs6IkRIzpwcwro/gb2tBZ9Tj3b2N\nVH8vx/7zPbw+K1t+vAXB5mYiIdD/ry+RHh7G7zUiTk8wnTOxeU8H7xw+SaKvD7vfw64H1pGYSZGZ\nzFHQ2hGUKh2t1kWNkaVI5xViMbHuvUpFYXymRLvXW1eKqjObMV/WIFRnNmNyuRYYOia3G/0qhnVL\n+Txjb7xRCzNJmQzFVAqd2Yw9FKptVy5XicfVv39mJl9rAmg263G5jExP50gmRdxuMxs3+jl6dAJJ\nLDFzoZ+KmKcl4mPoRDc5sZdHvtDCzKTIyNkfUIzO0rhnL0arnWhvLyaDgDQ5jFJShfOMDgdtDz9M\nbmqK3Ows+WgUg9nM6JEj2EIhLvz7vyMmEmi0WnybNtFy4ADFOaNvviljVhIWzJ0kVRgfzxCJOKjI\nMtOnTpHo66NaLmNyu2nYswezx7OgrFxrNN5w/6KVYDWNkY8Bu4Gvzb3+EvD26g2nHjGZXKCQOK9s\nGDr4foybHuDUq+cZHowhaA3oS2bGh2K4MkmSfX1oTSbSo6Mk+vrY8bnPseXRbZRLJcTjYaJ2O5V8\nGl+glelBtSGWzmxGazDgdBpr4mWVSpXBwSR9fQkURcHtNhEIWMkOjHPi7ACCVksiW6Ggc5ONxmh9\nYC+J3l5KuRzBbdsQ43FQFLSpSd5/qInpNJgaHDQ2unBq0sS6L2B0OqnIMunubqqyjLeri2R/P0a7\nvZbMtxSjo2leeWWYYlFdUY2MpEini+zde+fEj1eTb3/723zyk5+8Kb1lwuEwW7Zs4cUXX+THf/zH\nb8Lo7m1KudyCcl+5UCA9NobBZlN7Q1mtmFwuxMw0Wza6sHvdSForx0p5tBqBQiyGTikhaLTkshvp\nOz1MLp7BGQ7TN1KgWNJSSU0x/fZrGJ0e9DoXGlGklBGxywUat3YhV7X4AnbSiTwFsYzG6mDbVjdN\nTS7cDl3N+L8UayCgto2/xIthsNsxOe0IQr0hAWB12Qk0b2Xq2DHkQgG9xUJw27YFie0arZbg1q1I\n2ayqBg0YXS6CW7euagVPIRZbEGYqiyLZiYk6Y0Sn0+D3W0gkRCqVKk6nkZYWF9msxLvvThKJ2JEk\n9V7W1eXDajXQ1z2BJh7EuTdA9OxppqYLNHU2k37vTU5PFEilJbylccolifDOnYTlLOLECGaHDdMl\nFY1aoxGt0Ugpk0Epl6lWKoR27CA3OYnOYsFhsVAplSjM5Yyse+QRDFYrJrcbayDAxMTFuZSyWaRM\nBkGjodSpliCnhoeZOXmyZnTkRJHxt9+m7f3vx71uXU0BWGsw4Nu48bbsU7Oaxsh35/676fh8Ftxu\nE8lksfae1aonGLx6a3AxZcOyXGF6pkD/G2OcPx+jVLSy5QPvI56UaAkbiR99hd4jL1JNzWJ0OGh9\n6CFy09PkJieZCrQzNpYm6d5C5CNe8ideY1PQh2y6n7LRidnjweEwsqnLjZRKgMNB30CaI0fGatne\n/f0JWlpciMpFI8FsNaKz2nH4rNjmYtqCTke8pwdXaytyLqdKvs8O0bVuHZE9QSbefZdzr75KbnIS\nWzhM+4c+RM8zz5AeGaHh/vsJ79iBweG4Ymljb2+8ZoiA6g3s70/S2enD6VxLgF2OYrHIt7/9bV59\n9dWbts/5UM2aMXLj6OYeHpVLZOE1ej1mrxc5n0drNKLR6+l//nk0ngbQmBh+/Xka9h+A5BQOqw1n\n0EdVEjFqqlgECYPZSNPWTgRPhFSyyMBIjt2dRoKbNpFR7EyWFZo6gjQnx5ieHqeYNuDrWMfwaA4x\nF6U80U+1WmW2x4H7o7so6to49Vw/O3eG63QxzG43zQcPMnvmjJqU7nQS3LIFa9hHQ0OOwcFkbVuD\nQUtbmwtPs1pVJxcK6K3WJUMujoYGOj70IfLRKAgCVr//jlIEve8+P/G4iM1mwGTS8/zzA/j9FioV\nhUgkSyRiJxCwodVqaG11EbBXMI2f4MSRXrJZGY3JTMv6EJnRbhIpE+m0hD/sh6khdFoBxR0iHPTS\nuG9f7YFfLZeZeOcd4j09pEZGyM/OEn7/jyPaW+ifmMHQvA2mLlAVRXwbNpCPRjE6HHjXrwfURbBN\nX8FpExgfmCU5MEilVMJiM2EpOMlOWUmPji6ozBQTCUr5PE379+Pp6EDO5zE6HFiDwVXP71mM1c4Z\nWRGcThMHDjQvSGC9tAzuSpjcbhyNjcR7e9U3BIFMUUATDDE9nSebLdHfn0ARNGzdGqA83UduZrbW\nV0BKp5l8911aDh0iqTh56/AgxWKZYkainFJ43+OfJmQtsv6QCVHvwuRyYyolqQyeYlwU0TncnBo2\nUKlcPGmMBg2ZVIHtBzcxfPQYGkEgHLLS6NeSm5pidmSKqaEpLFYjxqqIbnoao8OhJuAZjXg3bCA9\nPIyUSqmJcMUiqaEhtAYDnU88QXp0lPDu3VRlGavff8WeJ/n8wi6e5XKVUqlyVcd4XmzKYLPdc/om\n3/3ud9mxYwddXV03bZ8/9VM/xe/93u8hyzL627B0706hlMsh5XL/P3tvFiTHfd95fjLrvu+7qu+7\nG2g0boAHSBAkBUoiacvWWDP22Duy17G7sfOwYUdo7Y1wbNiOVYTtJ9t6mJjwhNY7trzWTck6SJEA\nCQIgDgJoAN3o+6r7vquyMrNqHxpqmeYhSsvLlL8ReChEITOR1fXvb/7+3wOtyUQ1HsfgcKDV63H2\n9eEaGSFz6xaWUIjk1auIOh3hsRir5y+TW1nFZtHx2ONTbOy0MEZCuD0WhvssmB1mZj/zaWqtLouX\n72L3auhICjpXhBvnN9hcjWMy6bD1KsweCHLi9CyjGieiM8CL/3QHjV6l4/PRQ6RWa1OSTQRMFkqb\nOS5e3OHsWcMbhKz2SARrMIjSbu86N+6vS8eORbDZ9OzsVDGZtExMePeIjN5ieVffQ6PT+XM5jd4v\nmL1ezB7P3jYN7LpVbOHwm97r81k4ciSMx2Pi3r08waCVUqmFxaInFLKRSNTI55v4/bv3weh0Euz3\nM5zOsrFRAsGJ32+lXHfTSjYIDYfx9Tsw7RvBNzaC3m7HrFRwDg1hdDh2p+GFAoWlpb3tE8PAFK/e\nKFMqZ1AkhdJKhf0HDhGw3UNutYgcOoTtvpC6VS6TvHqVVqHAVHCI1mYF1aHHbLYyOeFGzK6TvdN+\nwxTmxxA1GkRRRKvX44jFaJVKVHZ2KG9uYg0GscdiHymL78eSjACEQjYsFi31uozbbcZo3P2vKopK\nu61iNusQxbevYRYEgfCRI/R0BrKJIk3BSsNqQu5ZMJu72O0GDAYN8XiVkydjSAYDholD2AaHEXOb\nlG9fRZYkHKNj3MlCu6OgygqNTIZaIsHFap5Th+0Ep8YZmI6x+eKL3P3BD1DbbWyRCOGHHqGwtY3g\nCiOIGqqJBK1CHrffge/IQX7td8+QX99CLWdRFQlD3yiXv3eNcraILRQkFHUzPWjDNzWF3GrhHBig\nqpi4dmWBzGYVj7MPx6SW5uYyglaHd3qG8JEjVLa3aVcqFFdWyC8tETt58m1zSAYGnGQybxRCud1G\nXK53nor0ej3yi4tkbt/ey0EIHjjwM37C/3rR7Xb5sz/7M/7yL//yPT1uNBpldHSUl156iSeeeOI9\nPfYvCjrNJluvvEJ1ZweT2413fBxVlgnOzqL1hulp9eibIjubWcp4UTQdGrUWnWqJgdEgSA1cnRRW\nRxurz4ZBV0LftKN1DbP58mXa1Sphv4/QuB93xE+uJKHa/KhCiUqtg9EE27keJ2wBcl/7Mt7Hfont\n8y+htCUMTiemcD+GyDAbWQFZiDMUNCELWioV6U2uGlGjeRO5sNkMHDsW5dAhFVEU33ENfDu0WjK1\nWgeLRfeGROkPC3qLhdgDD+wKWAuF3cbimZm3dYuUSm02N8v3tYUqLpcJg0GDLKuoancvCO3H+r3Q\n4aOIRjM94wL5soI+OoJeEXhyn53S0l2yV19F1AgYbBZGxobxBkYoS1qe/6c7ZLNNXG4z0eGD6HOr\nWIJBVjIiq6+9TCObvU/sXCwtpvEfiKLvlBl87DH0JhO9Xo/U9euUNzYAMGp3GNQk6I/p6TazNC9d\nptHtEjp4kNGpKfJGI0r7J7sB9lgM833dT6tYZOPFF2kViwDkFhbwTU8TPX78La3hHwY+lmREUVTm\n57MsLe12DjidRo4cCSNJCrdvZ2k0ZNxuE7OzgTds3aiKgqjRIAgCitJlYaVKU4jw8rrMynKBUlmi\nWGzz+ONDjI15kCTl/hSgx+uLdbL3VtAJCjaTgWOPPYOmsIUt2o9SkWlXJTqlAqJUx+q00dVoES0O\niisraA0GNs+doxaP01UU5FYLSyjM8NgEC6sVavEE2YW7mKxmjp44RSGewjM4Qmj/NOkbN9C4g1z6\n+o8oJnY1Lu1KhbzJhM4fITg7C0A+3+DKK6ssLpXotXvIXZWWLcrA6Unu3s6ytaol6FYJGGwIQpWe\nqtLMZsncvInlzJm33BMeHXVTLrfZ3q6gqrualiNHIj/V/97IZEheu7b3xVE7HRJXrrxHn/5HH889\n9xxms5nTp0+/58f+8VbNv5GRnw/1ZJJqPA7sLuCiTodjYJCsZCF9u0C73uL5v38JQYBaPIHXY+TJ\nMRvtloxG6BKIeFFaTfJ372Ky25CMRswuJ/EfPEct2aSYLaNWQ3gH++jg4d56gVrPxugDh9ELMqIi\noXTapFe36coq9cUbuNwWUps1BMHIxo0NXIMCoaiTr/7DXU4/NkI45tnrV4lGbW/SkMiySqUiYTBo\nsNl2xc0/b+nd2lqRmzfT1OsdzGYd+/YFGB/3fOi/0KyBAJbHHkNuNtEYjXsBcIrSJZGokk7XMZm0\nxGIOTAaBVLKGwaAllaohy11MJg0DA06cTiNOp4GbN9Pcu5dHFKG/34HBMYzngSjaqsROSaKq6adw\nfRWzasIzNI5WrqEVuuiVOnXCvPjD23zl/7nB+nIKg8XCqUeH+NxnxwhoyyTvLSK3WgiiSHFlBbPP\nR+z4UbyzURyaBsb72+NSpbKXOZLPN5DLIppqnfXnn8cVi+w9YKuShN5mo/+RR3YNCI0Gjv5+PGNj\ne+t2aWNjj4jAff3j6irukZGPjH7kY0lGtrYq3LiR2tNapNN1XnhhDbfbRCq1a2urViVqNYknnxxB\nq7bILSxQSyTQW614JyepCg42N8vU6x2+851Ver0esZidTkfl3LlNRkc9eDxmDhwIEo9XsPq8yJUy\nUrVCU1FJSk7O/vsHMPcP07l5j0Kuxqi9STVTxO6xEZoYwKRp0ajXqSWTu4K5dhu9J0AiL7H93asc\n+Z39xAY8LCW2cffHOHzmENvJEjevbGD3ZTj65CHsOgPJdANzpB9XJEM1X6TX7eEbjGIID+zdkxs3\n0vzDly/TqO6m8fkCdp74laOsJppURRddWcf5564wPOxmJizQldpoDQaahQJSvY7xLdpLzWY9Dz/c\nT6HQRFF2yci7Ufc38/k3MHjYFZz9IqDX6/HFL36RL3zhC+/LAv6Zz3yGo0eP8qUvfenfump+DnQa\njT0rpMZgQHFEeHWxy/zSLSZno6TWU9y+vonRZGByJsLm7UWWVyMMHDpEev4uZp+PwvIyvqkpggcO\nIDeb1FMpSou3iU1M4faEMI3M8tzfXyQ8d5C5/UG+/9XXyO2UsFj0WHwefF4b1fUFTFYL6QsvcuzE\nJ7gbDLKTauPyGzl2OEAmU8QfcHDxtSzixR32Hxlia6vCxISHEydieyGP8Z0SF3+0RHItgcGsZ/bo\nIAcO9yOo8p4+5F9WR7wdCoUmly/H9yyvkqRy5UoCp9PwkSjVFEQRvdWKqnZJJmu02zJbW5Xd7fTe\n7vabKFWZHTVjzS/j37efs2dHuHo1idmspb/fwYkTUXK5Jq+/nsJs1mI26/nWt5ZZWysSDts4c2aI\njY0Ki3fSyNsJtGqbU5+cYywkoG3mKK6soJEN3LmdYnUxAWqXdq/BhXNr7Nvvxz7QwufRI2pE9BYL\nVUWhnkqhlZsItRymwQjVnR2EXg9Rr0fUaKhW26yuFrF4YGx8CKPHS7nUwuO34Bnoxx6L0S4WcQ4M\n4Ozre8t781aWbLXTeYMm6sPGx3K12tmpviHiF2B9vYzV+kbLY7HYolys01q4QnV7G9h9Gmpks4gj\nh9BotBQKLWS5e//9bcbHPVQqEqK4u/8aDttYWytisJjxTowjVat0FQVN0Ifi6uPFFzdR1S4D5iJ3\nv/M8jWR81zFTGsE4PYnaUXAbDJhnTlD1zlBHT3C8h0Ujo6NDxG8j9uwhKuksN15fY/4Hr6LttjE7\n7dQaHc5+eh9OQ4ubr4PvwByhXgezz4c2NLi3yDSbHW7eSFGvNKHXwxoO05BlFleqnHooSkOv0iqV\nkGo17l5MEDnTj7x5D8/o6G6o0ztYRXd7G342vYdG/xaj3Y/IqPD9xiuvvEKhUPj/FXL2ThgYGKC/\nv5+XX375fZm8fNxhcrsRtVq6ikLPEeDVKxlW4go7BRCNJsrpKlabgcROBY/PgntskpbOyfCZw8RO\nnKCdidPqdNGazSRu38U32L9LvHUG8iUZUSOycmUVgwai/S5MQouZ/SFef6VEKZlGruT51KefRlpI\nYDU4kIoFqpd/wIGHHmdsoo/N9RxCNUup5MBst7Fwd5u5fW4EunS7PdbWSoyOeggErDTqEj/82hXu\nvXKdRiaDKssk7o6gaR9Hk7iDKIrozGb8+/bhn5n5qeS4UGjtEZEfo91WyGQaHwkyArsOxKtXd5t4\nHQ4DL7+8hU4n0hexkLx7j/hqGqE9itgss/GjHzH51CcYGZnB4zExMOAkGLRx8eI2itLF4zHxd393\nl/X1IlqxR3w9w+ZqjjNPjJBJ19HUVbQIdFsNls/dwIiEweWmNx9nun+MxdlBNlZzdOo12s0W2UIH\n8/Ew4XSW2WOjLN2J44xFsdmNPPbMQfT5Ne784z/iHR3FHovhm5rCOz3N2mICudNFqjdp1NsMPfEk\nKlqcbjMWm4l2tfpT01StwSDF1dU3ZI7oLRb0b/GQ+WHhY0lGDIY3jyC12re2nqm1MvVU6g1/p7Tb\nKKkEihijv9+JXi/S6XSp1SQaDSNTU16OHo3Q1+dEUVSMOkhlsvRUFZ3VisVnwxO0k0hUWVkp4LF2\nEQs7HJgLU/Xt1pNvvnSOriwz8MgjFLRBfnTuAtVGFxkdTpPKmdMDLH/1K5j7hghPDOGNRNn6b+dp\nlKsYDBqsOh3p+TtszkQYHfcyfXiQu6/cIrWZwuLrcDwU2xNhtVoKeoMWo81Ks1ACRUFnMiF3xV0O\n0OtSjcex+P004k3UnkA5XcDg9TNydvodycjPA2sohNnrfYPgzPIL0o/zxS9+kd///d9H8z6q2T/z\nmc/wta997d/IyLtApdKm0ZAxm3U4nUZsoRC+mRlKa2vkmiLFfB2zK0AjWaXRkKnLWjwRP9l0HVnu\ngdLB1Gtw64evYtUpuMcncIxNc/G/fJmuLDN9SiY8M0ElX6FZrmILRug/8ijxwq52YXFpjWatyelP\nzhLyaEheuUpvZ4HAyAClxTt4x8fJ3rmD5u5tGuYCnboGy75D9CptJEnG6TLh9lr2CjclSd1zuGXi\nebbvrNIqFlFlGQQBWepw58I8I9YCFo9nN0H1xg0sfj/WQOAd75VOt7te/Etd+8+SdfJ+I52us7iY\nQ5a79HpQq3XQaASsI1bCQ2E8ET9Wt5FiJkE5k0Go5NB4B8hkGuzfv2sD1us16HQijYbC8nIem0mg\nXihjsluIxyuUym20GgiN9WHu1imv3MNnEllfr2Ks6NAZ29RWaoyPzZDeziM6ndj0XbxO/Z7de8CY\nZ+iTE9QLAaxGMJQ2ef1v/gZHNLq7Vd9okLl1i4HTpxl+5CGw3EHUaonOTbL24ktkltfoxDy4wn7C\nhw4haDQ0crldMv0Wa4tzYIB6KkV5a4uuLGNwOAgfPvyWE+8PCx+dn6L3EAMDTlZXi7RaP7Gdzsz4\n+ZeyB4/HjMWkofAWZXU2ixZRErBYdDz77ATPP7+OKApEIjZOnRogFNp9EuhUysQsNVbzScqFGjqL\nmb7940xMDBKPVxkbddPM5bhzL4NJLhEJmHFHAmhFP66BfkyxQV54LYMYHsXaapK+u0Sh3uPW6zsY\nMkV0Fiul2xUcs3poVHC4rZg9brqKRKPSopQt8dLyFoVql+jYGM9+4giaVhmHuQSqDDoN+p6Ez6oy\nMOwhqdfQrjdxOE08+ugALaWHKtVR2m00Oh1DJw9jtDcxju7HOrmPkujFpXbf024fw/39zeLyMo18\nHqvfj/u+je3jjBs3bnDz5k2+/vWvv6/n+aVf+iUee+wx/uqv/upD38v/oNBVVbqK8q6Jc6/XY2Eh\nx/x8hlZLwWTSMjPjZ2bGT+TIEZyDg0jLZXwTBjroMW+02Nwss2+fH0G1ojFZsZkEHNoGXqeGbqbC\nwvI21XOLHP/1zzD3m/+R3PxNRLON4OwszXaPytY6pr5RXr2Y4Btfm8doMTE44qcv4OTl717nN/7j\nIXyaIrV7OdzuY9ijUUStlkf/9P9CbtQolhVGfQM89/0tquUWDz05jV4v4vZY91wRFotuTxci9LoI\nqrKXF6TR61HaEmK3g3q/tl7U6WhXqzQLhZ9KRvx+C36/5Q2idbfbRDD40QnQqtU6KEoXs1mH0agh\nEDDj8Vi4cTPDtXO3UWSVJz89w5G5cfLxNJVSA4sHjhwJ7z289fU5WF0totWK6PUi3U4bWQVRUugf\ndGO1GQjHXGTSDR4+PIivVKFRkBAtLmyfg70AACAASURBVKRajXqiQvjQHKpRg8utR+lqeOSJKfZP\neyhc+x7u/QeJDI5Ti29j6OoxWU10ajXcw8PorVakWg2L30+90iC/k0EM9FMO6HBYtGwuLGL0B/Eq\nKgZtB9/UFO1ymfUXXgDAEggQPXbsTXZrnclE38MP483lUDsdOvU6nVqN8tYW1lAI7VtNqz9gfCzJ\nSChk49FHB1laylOrdejvdzA66iGfbyKKWWq1Dh6PidnZIA6biMm9Sxh+DFGrJTwxhFPvYWkpz4kT\nMR54IIaq9ohG7UQiNjQakXalQvrmTXT5JJ96dpKiakfpiVhMIl2phV3Nc/VWllyujtViYvv1ZRTZ\nTbAvQjJbRdPzUo93yBU63FutMxQzUZfAgERiq8RDhybJ3JoHr4XA9CRjc8PcfHUBUYCeRovW5sIX\ncnHhYoJCtkaupsFpUplw1xC6ZuKXL+/qMySJIYeHqr2GZ8TI0PggQZdI/6CGtta+G56TcWC16fFb\nVDaW0siyiKEmsnk9idGofUOOwXsBs9uN+fjx9/SYH3X8wR/8AX/4h3+I8X1OqxwfH8dms3H9+nUO\nHz78vp7rw0av16O0vk5ucRGl1cIWDuObnv6pvUrZbIPr11N7U4RarcPrr6fwes2EQjasPh99PRP3\nNlo0mzJHj0bQqBIjoR79USeKPgJoqK7cobSxRSHb4PbNBBqhy87iBis7Mo9/8mFcJpl2pUKr2SZ6\n5AjPfWuBhR2QGhKdtspKq43Lv5/Q+BDbRYG+iYO4DBIGm41Kvcu9ezWa3S4ev4WQx4jYrnHm0Riq\nrNA/7iUaMHDnwm2MXjORsSjhsG3PzebzWxma6aeUziG22yCKeGIBBgYsSGvbqLJMcX0dpdXCMzKC\n1mDAPTz8tvfMYtnViC0tFUin63i9ZiYnveiUOvl7mwhaLdZA4E3leh8k7HY9gYCVQmG3d+app8b4\n0Qtr7OxUsNqNWK0mUutp7qhmjj4yTeTIJCNzQ9jtPymY9PutnDo1QC7X4OjRKNcubZBN1+h2K0xO\n+xkZcrG6lCESteGNBZicmuOH//1FUpkGotLCSBddT+LIsSgPnh7HZhKxO00YlBLt0REqm2vYw2Hc\n0TCNco1CPI03uBul0Gk0sIZC7OxUSKcbFJ01bmwuMjzsQi7nuPDVV5kc9zB9sB9PxE/lfm6J3mpF\nEMVdd6LBwMCpU2+6NxqtFqPTyfaFC1S2tuh1uwgaDZ6xMaInTryp9fnt0FXV3V4lo/E9Dbv7WJIR\ngGjUTjT6xhGU1aonGrUjSQpms27vqTF28iSp69dplUp7CXX2WAynRkM4/OYvllStsnP9Okq7TWZ+\nHq0nwEayx7VbmxTybWL9Dg4dDqHpalDVHqpoIDB3kJBXi6DIpLJNTJEB7sZFbN06rbaKN+JF0KsM\nTPahtpoM91mweVS6EReFfIvXvnOB8cMHMOinKVY62Fw2QoNhsoU2TVVPp9lkbSGO265h5pNe4hdf\nxez1UkxmMfv9mCwtDvSLWKNhEjdeJ7cmsX2hx8iolxMPnGTfyFEqWzvc+MFFtu6uEZ6ZIK/Y2V4u\nMjrqfs/JyC8azp07x/LyMr/zO7/zgZzvmWee4Zvf/ObHnoxU43G2L1zYE+K172ufhs6cecfFtVhs\nvSGwD6DTUSmV2qTTdRKJKj6fhX37/KytlRiJ6shfvYi0kGXh9Q6BvgCDR/dxb3mbbqtFJtfC5XdS\nL5ZpdaDbg1atxnDMTzmRxh32srmcYmO1gNbsxWDU0pG7CBotiUQNt1mlWm3zarrJw0/MoJR2ePGF\nZe68fAu9yYizvw/BYOLZX91PefEW+dUtmqMxDvzK00x+/hQ37pS59OoOWi0sL3o4+WA/6YzE+Gw/\nakdiayWF32fm0MNTqDuLdIxWaqkUzWwW39QUnWaT5PXrKDoLGG3YbPq9JOh/DpfLxPHjP0lYLq2v\ns3bpEnKjAYKAye2m/+GHPzSHRqulMD+fYWkpTzbb4InH+hHpMj7ioNtvolcrUS9VaUlmwocP4x3s\n2yMi7bZMMllDFAUMBi3Npswv//IELqeBmx4DfQNuHjo1xLXLmwQCVh58eBjkFomkRHisn514Daku\n4xqNYR2fZfW1Wxx7cJibr26TSlZwRiNMDFnwe/xc/Mr3aFYb9I1HcUcDmLwBvJOT1FMplK5Is1Ag\nMjrCdl7g7s0dmrUGn37YRcBnRlFUkJoorV0zQuW+3hFBwBoIoLNYkGo1DDYb7UqF8tYWUqWC3mZD\nazBQ2tjgx/PSnqpSXF3FNTj4rpqXq/E4mdu3kapVjPfTd9+rwr2PLRl5O2i1IrIssL1due8xN+IN\nBBh+4gmahQJyu43Ban3HhLr0zZuU1tcx9o3S9Q6ynBe4sJjg4qU49bpMVxB4Jifx+BMj2Pwubi+u\nMTY5grv/CaRSiX6li2i109lpoOnJnD7pY+VejvhaksrmDgG/kaGIA0fQS/KOnoWbS3Q7HUSzjaGx\nKAf2e3ANDHBtReG/fukack9DOBrDolUQBIGOIiJotaTSdQyuMLd/8BKtXI4Dv/osmYUXKKYL1LVe\nHHYtm9fnKdcUCpYB4jsNBNc0j/7nx8gkS2xuFdgpiCjKO4ef/RveGb1ejy984Qv88R//MfoPaBz6\n7LPP8tu//dv8yZ/8yQdyvg8KsqySzTao1ztYrXq6meybHAH1VIpmPv+GKPB/CYNB+yb9g8dj4vbt\nDJXK7vGSyToej4mHH+4jd/UircI9zEoHQSMiFlpUFuGhTx9lc36VfKGJXuMjONLPzAMzBBcWqNyd\nJ0EfOhT8Bw6hy3VwRfxk8h0GxiPsbOSwucwMDPuJxay06i061gCXzi9z7HCQra06llAEpV6mEk/i\nHJ8kWzdw7eV7tBotDIMTZCsi2wtZvvGNZdR2C6XZ4MZFK8Vim3Sqys5mjlNHPfzKbwxQ2dpi9dvf\nxDMQBasHhytG8MABdGYzqiSRUZxc+uotDN4gVqueAweCDA29vdNGkSTSN2/uEhGAXo9WoUB+cfF9\nJSPttsLGRomdnSoWi47hYRfBoA1V7XLvXp5WS6bb7eF2GdhajiPJIqok0avm0Op1+MbGcATcJKo6\nVi/tUKm0cbuNfP/7a9y9m0OSFEZHPZw8GUWjtjl93M0Tj/gp1wXK5TZdQUOp2OHipR1iYTMv/XCb\nJ548zpnxfUhthfWNAgnJzehckG99Z4mFu1miQwHUnRRF/wjJK/NsbRRpFEskNrMceHAaV8jH6Cc/\nSS2RYPvmEraQA4Pdilis0cykWcxnOfvQA9hdFlBker0eepsNqVajVSyi+3Gj/PY2tkgEjU6HVK2y\nee4c1XicajxOu1zGOz6O3G6j0Wox3NeLdGX5TdUHb4VmocDWK6/8pA26UqF9vw36vUjh/YUjI9Wq\nxCuvbJFK1el2e1gsOo4fj+AWqySvX6dTraLR63GPjhI6ePBNCXVSrUY1mcTUP8K9lIAnMkGlkGZ9\nc7dR0WIzYbMaWFwsMD0TYGomSCJeY3GpiJxLs3l3g0aljsfv4PP/21luf/8cK+sdxqaCxPbbMZ46\nTWN5nsS55xn4nz+Pc3Ifw4UKgagHs1HCINfwHXiUsmxE1ecJ9nlZvhNnbVPkgQdiHDreR7tVRBca\nIOYPUt3aInZgH/6JEbqOEMvzm9iMJkJ2gWImjynoIbmRQuz30u6o7OR6bGSSeFwadBqRhx4awGzW\nUSy2aDQ6GAxafD7zL4wW4b3AN7/5TVqtFr/2a7/2gZ3z6NGjFAoFVlZWGP2Y6HFkWeW11+KsrBSR\n5S46nUjI0iHictMpFd/45rfQgf1zhEIWhoddrK2V9giJw2FkZaWAKIr0ej2kapWNZJKJQSPNrTWU\nehWtyYQoCuQWFqju7GCLRAiFrJz81HEyRZXBA6NU1tbQarqMPXqY0tY2itTg1qt3cPZFOfKYn7/9\n8uu4/Sb+p//lONQKhEIygk3DrXUD2m4Vow4EnR5Nt40qarBHYhhNIrOPTGPXSZw4e4RkokKp5yKZ\nqnPhwg6VUoNOuYjBZkXu6Lh0OcGjpyLce32dhXsCuRtX0TYLtJI7rF69g2VslrFDo+yfHSJ/+zaq\nd5BLL62idXpwmT2UUjmya1t84hMjBGJedFY76XSdYnE3Sj0UstJr1t+y/bWRy9FV1fclcrzX63Ht\nWoLFxfze57a5WeaxxwZxOIxUq21qtQ6y3EWRZJoamJrxsbyYRtUbUXtdtrcrDE7GKBTayHKXxcU8\nsqxy/vwW3W4XQRCoVNq0cjmU5Bq1ZIJqTcY/PYklPILDbWVs0oKiKAR9Zv7T/3CAZqOD1DVi0erx\n9gfJbOUopEukSgKR4Qh9Y2EsNgOD/SLLV/JE3D00oeBuuJnSoVOtsXPxIlK1iqNvkMxilrWvfI/g\nocOEIi5KhTrZXIvB44fRtQo4A2Y0JhPhI0d225Qrlb1tF2swiNZopLS+TiOToVUoUI3HEQSB4vo6\n7uHhXfv59DQarRaNXo/+XWytNTKZN5UkSuXybnjbv3IyEgK+C0wCFuCdV4/3AL1ej9XVApKk4vGY\nUJQupVKb7dU0lcwtavkikqSg1Yp0mrcwe71v2kMVtVrM/SNcW+3y8rkN/IHabtyyVovDa0MQRBLJ\nOmq3x8pyAafDwKnTQ/z3/3oJJbmNy6RS2KrQMmm59sNLxKwygiqTu3SecqmBfnCGuqJHawiR3c7h\nmxjD49LT3FmntLmDde5h/vHLL5ONl/CNDPDomREeOTPG9laZw4f8GIxart8sMTkT49o/vcLa5dex\nO4xIV7bZ/8nHcEWCrP/oRxj1InKrTWHVwOzTT7BZbdCpymhlgVJDRzTqZ3Upw8xxHfl8g/n5DM2m\njMGgZWzMzeHD4Z87OOkXCYqi8Id/+If8+Z//OeIHWCYmiiJPP/003/rWt/i93/u9D+y87ydSqRpL\nS4U9274sd1nbbuIedaMRSntjDrPHg8njectjdFWVyvY2la0tol0IzwbISWYcDgN2m55apUWjpZJa\n3qSyvU046iJ39TLdRGJ3Gup2I9fru845826nST6eY+SJx7G39WzeWkFsymjrec79n/8NncWK3u7E\n98gnSNWNXDq/xqHjg0wMmIhfuojNCF/9RhKnx8oDv/wod5s24qke1fMb9B07ipRP0ZYFDh3pI3f7\nOo1mnna5gm//ARrhEDqzCbPNitRMoLM5yBVbtJMZbBYd7XaXgwcDlDc2SCzeZXTEhXc4xPKtFvlk\nAVVV6T84g95mI17qIEkKdo+HWjJBeWubnqqy069FSa6RMQ6xvF5HlrsIwu42+APHw+gtljdlBJm9\n3vet+6RQaLKxUX7DRKvRkFlfL3HyZB8mo4ZEokoqVUduSxR1KkceGOKZz+ynXKwjClAqt8hmG7hc\nJur1DlqtyO3bGXQ6kUjESaHQZG0xxe0fvsLsbIhYyMP8taskvr3AwV/9FFp3kMFBB/HtMquLCV74\nwRJqR+bg4TBqR+bomVlyqSJGQUIspxibmyOdqzI+EiG7skxqM4W1W6WcTOLqi1KWBWKjEUxWM+7h\nYVaefxHX2KFdV2cxzcj4ERD8eGxgEXq4/R4EUaCRSlFaWyN06BCdapVOo4FraAjz/alUp76bqdUs\nFBBEEY1Ot9tzEwySX1xEaTTQeb27xXnvws34tvUgP6U25N3iwyQjReA08I0P4mTdbo+bN9N87WuL\nbG1VsFh0HDgQxOezIEh1ttdSJOMVOpKKVrfb7uge29kjI+1KhUYuh1Stkixr+PrfvUY608RgtfCr\n//4ggaCNttTl3lIeVe1y6FAYs0XHCy+s8dnP7sNhgZogU8nl8PvNOAN2RFnCblBB0LFd7aChh65V\nxOweQurJ6J1ulGwck91GtlTFEo2yHW+QuXGTeq2FWddj8foqR84e49TDUXTNPJ1MnWMPj5Jd3uDq\nS3fwe60oooalO0kMrpuc+exDrJ9/hVyugtMMWrMZrclE+e4KmR2JakdHZHqUoX4bqDKlUotEoobZ\nrKPXA41GIJ8uk97SERkK/NuE5Kfgb//2b/H5fJw9e/YDP/ezzz7Ln/7pn35syEi5LL0pP0hrdSC6\nLJi7FZRWC7PPR/DAgbd11eQWF0leuUJX2dWLaAxbTD/4ID1VInn9DvLdNPZAGK1XQ8DkY3TITuG1\n89i9DpyDgyiyQvLOMo6hYcxTR9heSaLpdXn9yhZr8TYbdzbweCx4ETF5vRRXlgnOuillyqylE3zv\nBxuc/eVZPCtrLN5OEg6aiPi0tBpV6utLxAYPE0/USGxlUNEwPBXl4LiX2sodTCYNPZ2Hnmhj9V6S\nA7F+3N4BhkZcNCthtEqDoqPLdqrDwf0ekitbrC9niDkULF4PUqlAKZFnaHaa1++UGDs8yU5WYdzv\nw1LdFa9q9HpqySQ9VUXUiGg0AuWWyPXXFjAGdzUFvd5ullNy0EVwbo6dV1/dG/Ob3G68k5Pv289A\np/OTuPYfQ6cTMXQbbJw7j70pMdvfw2k00uw6GBq0o9GK3LgRp7S+xfHH95PMSRjMWpLJKrlck17P\nSbfbw+k04vOZefnlLWyaFq1smZtX2yw77HhNNoReiVoqQ6msZ24uQD5T4Rv/7y3u3YmjqhDfLvDZ\n/3CIjY0SLo+F8tI2n/tfz/LqlSxL9wpY2zmq2xs8+NhJ0hdeQm42KW7H2ffsp2ikkiy+fJ4Tv/d7\nRA/OYomEqRydQOdwMvdgFL9Lx865F2k1KyR6Pcqbm4Tm5tDq9excvMjQmTMEw2HalQqOWAwAs8+H\noNGgM5uRGw2kahWb1YotHGbs6aexBYNYg8F3XZxnCQTQW617JAfAYLdjfo9iGT5MMiLd//OBIJtt\ncPt2BkEQMJm0yHKXK1cSfOpTY6g9kWarS0faLXhT5C7VqoQkdWnkcnQaDRKvvUb27l3o9VgSJjDr\noduocfSxCbRakc9+Zpy7iwXCYQuDgy4MBh0IsLFZoVhq8eDpSc6nNih2OnTVNj7/EIcfnaBTLiHo\n9Iy4vCz88ByRaABdNEI7p6EVX0PogaZvEMPUcewWLdU7y5x4cAgxOMi122WGwlZGB50EtHkacont\nG1dpLplRpQ5TE06aXQNSq0NH6dEoVylmy/hPPEJAaRPwmdDo9Sy8dBlLcIh6NkHoyFFiQ0EaHQGt\nw83EhPe+lU/AadehrSTYuniTOytGlCMTBOfm/lW1dn6QaLfb/NEf/RFf+cpXPhTSdvr0aT73uc+R\nzWbxfwxyXGw2PaIo0O3+hJBodSL+gRDho4MonQ6G+66Ct4LcapG/d2/P0qrR61E7HeKXLqGzWJAr\nJfxuLet35omNhqm0GtTXEmSvX6ZqtzNw5nFEuxuNN4ItHGYnWaextkD/Qw9xez5NNZ2hvROnIvmo\nqjJH9x0jM38bx+Ag5rk5lq5V+Q+fP4bHayPz6k0iIQt9PoFWOk29VaGTMnPozHHKNRcrwjBmbQet\nQc/+IwMsZJbo6Q2kUxKhkIVIS0bMLmMouDgxE6RfVbj8/XksSpdf/s2T6DxmvvKlVwgf2M/IPi9B\n537a118gfSOPxmJj6kQMY/84gt1L5GgUlwRpeZP0VnaPqEUGfVjFJk2slLNFgsE3ChyLxRYTJwfR\nW627QZFaLdZg8H1dD9xuI4GAlXj8J4mifqdIY+Eaqtpgc6HAsNfPgakoltgA339+m3PntpkcczIw\n3U+x2uXgkQHK5TbFfAOzUcTrMXH4cIQLF7ZZXi4wOekl4NawLGUp5GuUq0VGToYo78RxeW1U2wLF\nosS9xTwaswWj2YQsddCZTGSTZSZcRg7MRdDtc1CvFBHWr3P6QBS3oc3L14psJBzs+8STBKanELRa\nYnMznP8//neCs7N0qlVyi4tYcznGZiJ4p2dIra6x/MoKi9/8FsGZSXQ9GVGE7N27jJw9i8HpJP7a\nNbo6A1qHG9HhxxIKY49G8U5MUFheJr+0hNntxj0yQmVnB8/oKN6pKXQ/g7PP4vUSe/BBsvcFrAaH\ng+Ds7E91rr1bfKQ1I/V6h2KxiSjupnz+OIv/50G1KlEuSyiKSr3eQa/XYLHoqdUkhmdD1DeiqPES\nGlHAYddi0XWo5MrEL12isLxMr9ejkcmgs7tAaEKrxqOfnqNS7RBfjrPeUZicG2RifAqp0WBrq8r8\n0m4ltUYjILe7fPq3z5JcWmNzfoOjTx1gaSVPbjPFxLgHYxdO/ebTBKYm2bh+m1QyS6duQpU65Ovz\nmA0CV56fx+6xc/faGq3OFfqf+CQvXIzTF7XhCTaZ//KXKceTDJ56kJ7ZTWllGdvwOBafA3vAi28g\nSkc08fy3bhAKmBFmXBjKWwSDXpSwj5kHrYw9vB+11aTZaeJyuXnllR2y2Qblcpt+b49hn4rc7qC2\nuhSWl+kqCoOnT7+nFq+PC770pS8xNzfHyZMnP5TzGwwGnnzySZ577jk+//nPfyjX8F4iHLYxOOhk\nY6NMt9tDFAWGh90Eg1a0ei3an7Kwqp0OaqeDzhuk1DFRKDRxuUxYlQIGm5OmYqMst4gdiSDm1wl4\ntOgQEO5/99N37yEHJ9BbnaTXkggdCW/Uj+ofYuXVJZS6itXmppnP0SpX0Dz8KLO/9VssFyyoFxdx\nBMa5u1pl/k6BuUCAbn6DretxtHINuavB5nMjV8ocHbcip2votAKDU2HsPhc+e49qtUAs4qSwtEx8\ndYuBB0/SVTrU716lMX+D0ZiNarHGwje+Tf+DD2Jz7+oAVu5l2Om1eODIMXzHTpGpiaytNXn+H5aZ\nOdJleMzPyIibRx4ZYOGOkWW5jN+lYyCsp5PdBkcUV+iNglRB2BX8Alh8vvfdPdPr9UgkaiQSu6GP\nAwNOSqUWsqwSc/dopRpotCI2s4bM5jalzW18R3qYLUa8fhvlRo/+kTCxmIPLl3e4dW2LaJ+TWJ8T\no0Ekk65hteq5fj3JykqRx04PMHFsghsv3UQVdHTaHaJjfei8IdLX8ruuq0wTVeni8LlQpSaC1KCn\ndIgNeKiXq2Ru3GD15irJrSo7d1d47NOHmJ7yInW6aEQRlDZqsUzxnsDg6dMonQ6l9XVEUcQcDNO2\nhygpVjo9PRqtBoPXR6XSwdhrYDZqEDUajA4HW9dusrWwgXN8ily6yMrad3lca2Ds+H7cIyPEHniA\n4OwsPUGglc+zde4cla0tqjs7hA4fftsI+beCs68Pezi82wZtMr2n23EfaTLy67/+O6iqAUEQmJ2d\n4rOf/QT79o0DsLm5CezGX7+b17lcgnh8i1RKS7fbQ5YLdLsGJiZmkRVYV8w4D+/D3VXwOjUkilW2\nt7ewj/dR3tqiYTbT0Wqx18r4Y9A3asRkV7A6HLzwnXl6VFjf3KbRdnDigX46jSThsJmJ4Sim/DJr\nN++QEnscPLqPo8cf4TvP36Utw+iAlfmvf4+OSWRkOsJErki62GWnJmGlx50LcT79G31sJzYp9AR0\nHQFVY6Sta9JT8xw5HObOuas4nxqm1G5Q3kmiefUSsV/7LL6TB9E1JGRBYfbxCayDoxQVK/uPDuMO\n9Og0yvhDAQKT4xQQ8O2fQq/TsHZngbLSxjU8SnJLRGM043S2KCQT5FcFHn8kRldNk5cktKkUrVKJ\n7H1h07v9PN7u9ccFlUqFL37xi7z00ksf6nU888wz/P3f//3HgowYDFoeeKCPwUEXlUobp9NIOPzm\nYri3/fc2G9a+QV69lGRpfoNer4cgwNjhMYJmIxe+cxVV7aLKEiGfgQeP+6ncu03k+HEyt27RaTRp\nlqoETx4marfQWl9kKaenXlJYuXwLX9RDYMRP36FhNi9dwRvxU9bpWHjxEuGpUQ5OB/nGP22iqj3O\nPDSOWUyw+IM1Jo4dwOG1Q6PEva//I/59+7FKMt//x3lMT09T8XfRmkx0Wm3q6Q0WLt1GZ3eSq0H6\nOxcIORTUdpNarcHScglVljEurzIxd5RQv59X/u9vUdraxq49DZ4oGwmJfKVL/1gMh8PI3btZYjE7\nfr8V/+kRDk6YSV69SnJ5iWSqQWDKTf/UGMtrNex2A6Io0NdnJxb74NI7l5YKXL4cv19MuuuK3K3j\nsNIrJNlYEhFEkaGZPuyVLtubRSxuF1e/s04m00CrFUmna5w6NcD6YpLBqImt7RLf//YC++ZibG0V\nefJT05w6NYAsd7n8WpLP/btJQpMNRoYcaLsSksHFd19IcOxomEKhgc1loat06EgyWquIWkxz9JFp\nWi2ZpSvzxM+dxz82hL/PTyFdQtEamTk4wL1XrlFeThOcGsUWDLHx4o9o5HL0Pfggla0t3LOHeX0D\nEsk1AiMdzE4H03PHMdy+RzlVwBbzINcKWC0WZEli69YKeqebaktAVbqoSpfVawsMHppGabVopNMI\noojJ5WLj5k1USUKqVGjm88QvXdptDv4ZklhFrRa99b0PuvuokJG3nGE/9dR/fsPravUnwTQ//iX2\nbl+HwzFCoQaZTBqdToMguAmH3UiSgiyrTIwMUNrcxODQ0ihsosnmGZodxWC3E5idpVUs0nW5Kclm\nunoLp8/O0RKsXL64Rb3SRKPRsXy7hjeopV7r8IlPHENrsdG89zqXn7tMuVBHK3S5Va7z+H96GkEf\n5vCUhdXvfZdWq00j04KYn/idFUyBECGrhZ1kg30PzmDVdug0KuybGkIWDDjzDXT5Hi6tDkGv0lBU\nzFobhmKBgYNTGGKjOK1u+h8aweLzUqyD6PDR6IBFD/tnP0MjX8CiVmnvrFHJFmnhQGPS8Xd/812i\nY1EOzPbz+q0che06kQMz+PwxMvkyClV8ES/G0i75EEQRBOFn/jx+2ut/7fiLv/gLzp49y/T09Id6\nHU899RS/+7u/S6PRwGL52TqEPoowGrXvaDd9K9RqEqlUnU5HRbXESOY2QRQRBTA4HGwXRJReFUEU\nQAWNTofW5kbrDeOdkNGazUSOHgWdjoY5RryspSd00UUneP3bL9A/LvHvfusE1Y1Vyju3aCkeHn96\njpF9MV46D0OnH8EfdqHTaXjollrVwwAAIABJREFUgQilsoSEDl/fEHO/HiTi07H8ne9S2dnGZNTR\nkSFy+CTP/I9nMdVTrL/wI1xD/Yx+6tOsXJ5nn7eflgy3Xr5N/3Q/+Z0MkeEIgljkxEOjFMptHGEP\noWMTJFN1ovvH0RiNGEMxmhobwahK/6QVo0lPsdjkzp0MYZ8WXT2HQa5g93vw7p+laooQGlZoCBYk\nRWR83E0gYMXvtxIKWd+TGPhEokq1KmGx6AgGrW8ilj9uRt/YKO0REYBmpcbCa/ewjIoYbVZ0Fgt4\nIsRzPUpqE+uQn2RJwGDQoNeL2O0GzGYd8/MZhse8dNUeyy/uYHWYabRUGvUO8zeSHDvZTyhkxes1\n4/Xb6B4YYWjYST7fQq0rHD2mo15rsblVYf+Mh4zLwNikQChgJuYVCPfZefGHS/idFsaPz2CzCBi2\ncsw9M4fV1GPj6i1CQxF8fT6a+TT1ZBKD3cG+x86g6izovEE2NiosXNym78gc127kWV5e4pFH+jnx\nwGk01y5SKxaYOnkURyyG3JJwxMI0eyaa/6w3qCcIqGoXg92+e2+AenbXBi+I4p6tV6pWaZdKH4lY\n+A+TjGiB7wOzwA+APwDesUc+laqjKOrP5eJotRQGBhxEInby2Rp2mxZRFKlWJRRJoj7/GonFNSpB\nH0F9lYDXQieXZvX1q3RVFZ3FgmbuCV7+u1fpqHVcBQeHT1qot3tYnHYMegGfUQf0EHoKClo2bm+x\n8fw1dL0uTqNCq1xFlfQkF5aZGh9FU83Q3lmjP2qla4pidVnJrO4QNBhxx/oYfHCA5RfOs3NrGzWf\n4ua3r/LI5x4nMhwl2arjH+knfjODxWHBYdcx9slP0rBEydZgu25D39UwGvJgDJkRVYmtW0u8tpRm\ndMzLxLib5O0V3HYN6VKXbGYHS6LAyP4BLry0gmgw4PY7uHJxk9Bkm1bLSHR8gE4ugVH7EwGZPRJ5\n162fvyjI5/P89V//NdeuXfuwLwWn08nBgwc5f/48Tz311Id9OR84isUWL7+8STbbRKsVsVp1NI0B\n/PuC0OuhM1soltoYXWbGjkxSL1XxBaxIO+ssfPu72IXdaO7osWMEDhyg1DGRvpXCpP3/2Huz4Mjy\n88rvl5k3l5v7viORSOwooFbU3l1V3dUbqebSYpMiNWNJY0vDcVhy0NKEw69+sib04JA8YY1GdtAh\ncWSyOaLIJpu9L9Vb7YUqFPYtASSA3Pd9uff6AcUiaTbJJt1UNTk+TwhUJeKL+8977/l///Od06Td\nAqvTiiwr9FtqrFUTSIKM0yTTSayQTUQJj0VRhCSLd5PE13KUKwr9/Q40UgfR4aBezpN47yo7V65g\n7wuhG5hgbbvBavYmjumH8LvC2BsNOqKb9WSPjd0me5s58qkCzXIP7W6Vc48c2jcpmzq9HwgaFug/\nPMz/9dwK2VyTz3/+OHpvGBU9rNSZu3mHwKHDdHtO0okc58/3U12YYeXaPG67gNeuRrC50IydJlHR\n0Ol07l/PYNBKNPrRaAQAXnllnW5XRqPZP3I7fTqMXi/QavVYWMiyvl6g1eqhKODxGMlmG3SbTfLL\nK0h2PU2vm2Yui23yCO9czXP98iaSouKhxyZILJeIRGw4HCKiqGFgwImiKAzHzGyvZbAaZFD16AuZ\naTW79CQFm82A2y3isOkZG3Gwfv0u33nhDbz9PkzhKLtbZRpthVqjx5X3KkT6nTz2xCi9SoHMlbcx\nGs+hFs2YQ24EXZfV736HVqmE0ykiWrV4AjaMbiuZ27eJv/4q9v4IlomjXP/rbzP02EU2dxq4Qz7G\nztp549I2dbUFo8PC1SsJ7M5hTn36c1g0DRzefet50eHAMTjC5tuziLb9ddGJesKToxgMWjA4CRw9\nSm5pCandRqPVYvR60d/TeajU6p8bsvfPhQdZRQ947Bf5gNWq/6UzUpxOA9Vqh1q+gFQuklgtI0lw\n+ukTpLZSXH9zFmSZSq3HyKePoa7ssHnpEnqLBUEUsYwd4u2317GOHaTZU5NPFrh9qc7JE6PsJkqs\nLaVAaTI44sPksLOwVKRebJDN1mnmchyZsGGRSyiVXVTlAAajlZW5TTDZCMR82J1GdEYjGp2B/uNH\n2Mqr2F7aYmV2k1DUS6AvRn9NprC2yuHPfRpXyEsy2cDtsTF2wkdmfRP3o88w/84W88t7dCgQ6HfT\n1KQJBa00mx1e+s5t0okcqZ0QYsuBsZqj1jNQrSsIOj3F3RQD58d4qyezPJfkM89McuLhIXL1HtV2\nheB0gOFjQey6LK2eA3t/P557O/9fla/AryP+4i/+gi984QsMDAw86FIAeOqpp3j55Zf/iyIjiizT\nqlRYuJsjna6jUqno9WS0Wg2lchun00a3lKeWK1DuijR8RlbiPbxeDzG7luytHGG3HYMsIEsS3VYL\nk8eDRaNBo4FEPE8xXcN38ACHh0V2X/422laRvqAf0WZgZqHESu5txn7rKTqNNn3WFvVKAf9gBK3L\nSi5dZa6iYiLcTz0Txzs2jDk6RDyjkE2X0Tp0kK2wvVLm2d85wUayR2EvSeTAMNffWaZcaGEyasns\n5HEf/z26ipZ/+up7LC9l8cbCWLa2ifWbic+tk9txo6rm0clton0WMk4t5fgajoEoU1GBiUCX5cs3\n8GmatNNtMlmZVmWWgCQQHZpmbU/5MdHwR4kfJKJLksLaWoH+fhsDAw7m5zPcupVEUfYnIRcXsxw8\n6MNk0pJOpeg2G4SOD5Jpq8mle+jp8f7NPMW6Fhk1L722zdiYm1SqxuCgA0mSefPNOKJBTbdmx+m1\n0egJlPM1gsUaR44G2Es3yefr3Ly8uU/Qdndo5PNoNCoKqQLJoopjFw6gqNSs3l6nUawTC/mR6nW+\n/fUZPvmZU9ycSZFKN9mZzSAVkpx9/JPoqruEhvtpZNOYjBYQtJTi66g0ApJaT3xpl835HdwjIyiG\nPu4slPjEs8cJ74HbYyLgM9HMZfG6FDR2J067lfzcHIosU0ulGJw+gMpoIZ/MoxUNRKcPEjv6w4km\nz/g45kDgvv+Lcs9LBcASCmF0u38la/uL4uNBiX4KdDrN/dacyaRlYsLzS08l+HxmRoftvDK3ye5O\niVDIztmzfWzNbWAyqJC6++y7Wm5SKLXwqfeFWVqTCaPLhdYXxpKro3N7qGYL5FYKvPLWBodPxQj5\n9FRKdrq9Hla7GbNVJJWukUo1GT4wzPaVIjsbKfocPZqlAs1aA2ltkchQFMsBDwvf+DrpbGp/LPHI\nUfQeL7ff3+LCsJWyT6CyEydRtjD10GE0chtPnwe9U8LX7GKxipiMAlWnmvlUh3dulGi0DJTyFe7e\nzVA7P8jRoyGe+w+v4POZcDhNOGxaKrkCtXwFh09DpSzRaPawGE0Ighq7w8BAzIHd2OUzn51gKyOB\noOPwyX6iUSdazT75EPR6Stvb5N59l06thjUcxjM+fr8F+F8i0uk0f/u3f8vs7OyDLuU+nnzySb70\npS896DL+2dAql9m7cYNes8nKfIdCroMtEkHQ6+l0JA4f9lNM5amms7QMLgSNxPV3N9jerTEy7qOb\nrXHs0DA2qYAgOJEliUYut5+4anOxtJTnrbc2oVXh9AEjS5euUt3Yo52vopK6yArU2gI2jYzT0OG1\nbz0P3TZaeowczuEKnmel0ELbq7GtNxOdOokgmukoAt1cHp3ZQv+RCRLlNmq1hrraxo1//BrlYp2D\n/+5POPelT7Jy7S4Wh42RU1PUsHBzJo0xOkLIGKbT6pDcSGETfZw6FSbgVBOOOTFLZXbfeZ3jQ2NY\nRkZB6lKOr1NYylLY3MJgMaG0WmgdFszRMDqVhLGbZSgSZCvZuRcU+qu7t2VZoVRq0Wr12Nj4oRmd\nWq0iHLaxs1NhasqHSpGJTg2i0ah49du3CUQ9rNxZYW+vjdtnIR4vUomXGB52MDHhodXqcft2BllW\nOD0dIJ0qsbCwziOPjzBzeZ25a6u4/HZOnQyxG0/RHzSQ3ExyvbLL0797hhdfjNPsQjTkIjbgQJ3f\nxBiW6AVEhqxFtq/HOTzdx/s38ghSC005Sa1UJbmcIDwW5aGxCJtvvI5GpdBpNBj/7c9h9nhol4uI\nvgDr81kcYT96hxNF5cA1oMeoh0BzEXdBhappptdQmL1TwNw5QOBoDOUHpn6yTHV9iYPnTqP1hlFp\nNNgdxp/YtIt2O6Ldjt5iIb+8TKtUwhoK4RoZ+chT2X9ZfKzJyGOPxdjbqyAIasLhfYHVL4tarUNm\nt0DACeFAAKndoZwv4/OZKRQa+CNeytkidpuBbq0Gdg3B6Wn0Ntu+Ct/iYGk9w9Jrd9hbjBMZ9PDU\n504xc3ULbS3LJx7fT1yU2y3e+P4djk37qWdztA9EOPiIRHd3nT6nhOA4SiVbYOPKDNNf/iOW3ngb\n0eXBNzyARq+nUShRXV/lzJkhlPQSnUoZum06+Rb5JeibGKRTqTH/t/+RejqFa3AQczBM+Nx5Eokq\niixTyNeoFurY7CK5ZIFauU52cxerETpdhao2QNvnQNDm0ZpMOJ1d0ks5wiODtEU3/n4v02cGkUpb\nvPHKVdKFLqcfjpHRFSmXJtDpdTgcBsyaErvvvrt/vYBmPk+rVGLg4sUPHbr0m4Z//+//PV/84hcJ\nf4ich38uHD58mFKpxObm5m+cNueDkJqZobi+jtZkwuOwsX53G7VWiyMapVxuE/AbmR7yUGv7iG9X\nef+tFVSdHl5NkepaHr1VwHnxDOqdGqWtLao7O1hCISo7O3RKPXZ2KsTjJfr77WzdXULudBg5eYj0\nzWtIXYmNu3EET4zokUlSs3dJLa0jGnU4xS71lEjz2g18vjF2L99lYU1FczxCLDiEo1fC2xAYfuQs\nNSwIy7vQUSHotSiKTKtQZOnGKlsphYOf+QSekJfCXpbV2U0qJYXETp3VlRI6TY9g0Irda+fiaTem\ndpqFr38L8fzDAKilNrW5a9SKVVJ7JfQWC71GjWa7SSmZwRvx0TWK2AcGmPuHf8B58ChjJ84SGB34\nlSb0qtUqbDYDiqL8hI+WzaYnGDQzPR3g0LiV/PYeL3z9yr4IWaNBpdGwm6xhsYskEpV7br27/Omf\nnqZabZNIVIhG7eh0MHttnVymht+t5eQxD/qH+7AHXOhFDXffm0dqdxiZDFGuSmSyTcbGXaRLCgvz\nKYb8Cje/+RoD42H6AwbKS2vY1WqGLkwizSusv/0e1d1dXLEoks9Kp9kmtbBF6s5trMEAtlCI3NIC\n3oOToFah9vgwF/V0NQaqion3XrlDMGyhFGwScatZfvs67VqdA5+8iCZgo5TK0q770ZrN95+7gihi\ndjux+PZHqmVZIZ2uUat1EEUtXu/+JhPA4vf/zJiEB4mP9Rvjg8Luflns7VWJbxTILm6h3Gs57ug0\nPPmFs+Trai783qdo7qwjt9o4g04csSHmb26QWakQ7A9SXS+h1unRatu02z0217KcPTeIz23gjbc2\naMsaBLlLIVcFrDRKVYprqyTtRjpaHSdPTaOsXCNx6y5atUzfkUl8QSdFiwrR7ELSWkglK3RaGizF\nAlpNio25LXxHjrJzYwZadQxGHeHTp0jdvkV2fh73yDC7165hGShgO/kIo+MekjtF1Go1q9UmBp0K\nj1OPwaDBNjhEciuDyajDrNOxttvli//ys+RWVgmYWgxOT6D1RSiUu3zuv7mIoVfhe9+4SaenIhxy\noJa67KUarC0ssJXqMDHhxa2vMxl0wY+Y4LRrdRIbGSSNAaNx/0b4ZY/Wft3QbDb5m7/5G959990H\nXcqPQa1W88QTT/Dyyy/z5S9/+UGX8ytFu1KhmkwC0K3X6fO52R3ykUkXkMJhzBYDQzEHQmKGQlVP\ncrNCo9amvr1OvVzD6HRg1xmoJ/cwSRKppXXQm/DFxtndyiL4Texu52k2u6hUUMiUuHvpDmefmGT8\n/ENs3JrHoVfwnj4NjgDp61ew2gxotFr0VuO+zXy5iH1QzYZaJFdoU5wrYfYPc+7UEOIxB+tbNap7\nOaiXoF5AszfP5IXjbDlW6PNoGBgLE0/1KK/k8LsEJg+Fqc4UqM8kGBlx0mz2yKaKlJM6XvnabYIu\nFeFIGK3RiH1oCGd/P5vvvossOmiWa+gNOvrOPERyfhHTsB+9z4rDLtIuFXF7jDitKszVOEHfxEe+\nXhqNCknaH9MeGLATDFrui5RnZpL3SYlKBaOjbiIRO4piY2czCxoBlQyNnoA/bMe+WkOr1aDRqNBq\ntZw8GebNNzcZGLBjsehZWcmhUdnRm0Sq5TSpnSLxTArfYB8NtQlJqiO4AthNWjo6PbaAlWpLTb4m\nIMldut0e64tJwsN9BMNOqqu3qe0kqBb3RaDBh54hJQqY+1w4Qk6iYxcwCRLt629jMFtQqQUyCwu0\nq1XO/NmfohYECjspgmMDVAQ3t5eqREZDRFwy7e1VrDYjXruack+hl9ri0IVzrCylURuMhCcPUE/v\n+2bZotH7BEOWFWZmkszPZ2m1emi1akZGXBw/HvzQU2cPCh/v6j5CNBpddGYLerudVqGIzqDFHXQi\naAUe/eQEmdl5qoUMOtpozQO8c7NIfF0iv1VhNSkTGgwTGQ4gGAy4jV2kdptOqcDQ8THUXzyPwWqn\nurdHKV/l9LQXp0lm164QsnU4dCRG/eqLrL/xHhabCcvQAAPHD1DbjqOR2qQWd2ipRPaSNbpocR8+\nxmDIw2t3ltG5A4xcuEi4z4au10Ct1dIqluHebsB74hRJbYzv/tMs2v4esiDy1KciWBwidpOaU8f9\nzL51i8GYnZ3NPMuLGY4/epCHPjlJSjay0lUwigpOk5VhTRWLagcUhWouT3/IhMFkwOY0oXE6uDKb\npqay0u4Z99upzTxG2cCw00KnWkVndxAviey+uIpKNKPTaRgZcXL8eAit9jdfT/L3f//3nDx5kpGR\nkQddyk/gySef5Fvf+tZvPBlRCcKPed7IuR3OHPLR0kexRAdwuU143CLxjB5SJTx2LV6njrszZbRG\nEbVazeDkAGKvjMrsQApOoHL4ubahxqAkCTt28dv6KSb2SFoFjvX3oVXfoLixiTw6TejMw0z1BUl0\nXKTTJSStiaNnR+l2epR3d5AqeaYunGKpAT1BZORQANFqxRvykG8bWFrJsrSYpYfA8YtncWRusfL1\nv2P6v/vvcXYsZO/OkszexGAxIfYN8tKruzz9pTOMDDtZWnCg0WpJJyvEghqMcoX4whZb3Raf+u1J\n2s02ssWLMRjCPTJCYjOPymSjo2h4+ZvvcfDRE7iiMYqZMka3CXn1OtZQCJ1eS7dapV0uI3zE5nmP\nPx6jVGpjsegIBi33J3QOHPCgKArxeAmAgQE7Bw7se5moVCoGDkQJbjRoN1rU2mq6XXjqqUHK5TZn\nzuyPLFerbW7eTDI87OTcuQhmsxa1SuGhR8dQqdWY9AqhqX5kq5fRUQ/f//4qq2slGpU6R07FcPjU\nGKxmVm/EQaXiqU8dIhw0kl2Lk7n1Htpchu21JM1ag2qty9mzFzj4xBle/MZlLj8/T/TAAM/87jRi\n7yBqlUJuZZVOMY9KUSht79vthw8dIBg9ypUrSUKBDNE+K9b2Hqvff4OR6XFkWaZTyqGRImhFPUMH\no9R3E3SLOQw2G97JyR/rdGQydebmMjRqbXqtJl1BYHFBxusQCHp1iA7Hx1bb92tFRhRFIZutU612\nEEXhXvvpw11Yj8eEwajDOTiI7CthtYusbda5MV/FulEmYuvRF3WDSsXyRpG1Wym6jgiCL0K1I3H9\ndo6TJ0O0eyqsRhXF1B7Rx85y68oGpaaGSrcJvTbP/N5D9NZnmH/lCgd8bqantKhrG6gdVuw+J9V0\nlpHhIbJz85h9PkInT7D33AvEb93EOzVJUzbQlAQy+TZnHptkfa3A3toOcrVAtVjBdegoaq323vFM\niLKxn7tvrOI6fZHEegFZo8dZtPHF3z2CVWhS2Uty+e1ZzH4/R44FOfvICM6wn2yxy//xF2/x+OMx\n/HYV737nfarDIgd9NbStOn2Dg9RcUNpaZm9dxn3iYZqlHtqgD7m8v10xOBwk0znGAnqoVmlqHcwv\n7GEdGEbDfiT74mKOUMhKf/9Hp8D/OEJRFP7qr/6Kv/zLv3zQpXwgnnjiCf74j/+YXq+H8Bt8hKYz\nGnEND5O8dQtFllEkiV4hTeyhYdyj+y/S1O3bdBsN7GKXQk3m/MNhRPkA9a6asXEvh8ctFBbm6TpN\nbNVM7K7lqGRWKO/u8MX/+iwWd5lPfWqU2cUiPUuAZ/7bp1GVUhQ6IoWWjtuZOianwIGpAObRp0i8\nc4mNS+8RcBkx2yyE+u10uy5qtSGuX45jtnTZ3i4RHPBilGvsvn2J8NQ4mwsNzAETKp2R2uYaQiNL\np2NEKzepbu6iU/UQtUZe/Pp7XHj6CANBHUOHhqiUAiRuz3Pz0hwauUu7JVPXuqgVS7jPfRLcNjyy\nzNr6JVSimXypTn43R77Y4ebaCigyK/Myj54doXvv8arR6dD8Am6dHxaRiJ0P8twSRS3Hj4eYnNxf\ns25XolBoYjL1sNtFgkErR0/0s7ycw9DoUii0OHjQx61be0xPB1layrG8XOSxx2IkEhVu3UqSTNaw\nGeHxxwZw2saZuZFgYDKM0WqiXm8zNuZGp1OjVqvp77eh0ah47/1dJg8G+Po35lhdK3HiRIiLZ/1Y\nMxZmb6TY28ygNxpwBPU0K2VSHTO+fj8mUYNO3eTGa7d49OEjZL7+ddSKjN5mJXbxUaRGk1J8k/jr\nrxP91330WRto4nGSN1o0DT124xmsNpHQ5DjVXAnbyDiy1kRlaQaxz4vS7dAul2kWiww+8QTGe1lM\nlUqbUipHaWuLXrOJ3mqlW6+zJgzQNlUw2O2ETpz4yFxTP0r82jyVFGU/W+bu3cz99tPgoIOTJ8Mf\nat49EDBz6JCfxcUs5qiba9d20ZqsaPR6thaW2G7XefzxGMZeiUqlTbfZRDL3mJnJARCN2qjVungt\nMo22jkO/cwG1aKLZzEGrh8/jIbvbYO7aCr56gqOPHUPvCWHpH6C0nUAMCbhOnMdr0GMKeqhsblC6\nehmDy0v4+DHCJ05g8Aa4enmTt1+4wfFPWzl94RwrW6+RWNvCFfZy4l88QXy3TeDYGbZSPXRRP+Wy\nlcAjQ6xtVJEV0Bg0xONlTp6KMDzi4M3NHIWawubVJbxDbcqSiNbdZGDITTZbZ+bmLp8678QgSJTV\nTjZbBjJrWR6OWbD4vTSyGVzRQVyjY0QMCpWWio5q/wxXqxOJDjvRmfNI7TZVwYToD6PR6e5fd0lS\nKBZb9Pf/qr4ZHw/cuHGDVqvFo48++qBL+UB4vV7C4TC3b99menr6QZfzC0GWFXo96UO3mT2Tk2gM\nBgpra6g1GpzDw/czppqFApn5ebr1OnqbjckxB7LBgrllR6vXYhC6SNkEisFEqa5iJ54D0UwtlwcF\nRF+YeqPL2JCVRx+LYXbYSW27aDc73LqT5+adPUqlEsX8Kg89Ns7nnu4nduoojoAPtUomu7RM4up1\n2rFzrC/uompWSGcyeAYjvPL9ZX7v94+g2MOkigoqqwz+Yc78j/+WbL6NYBvGU8jQfPMN5PQeWo+J\ng0cf4p+eu4No0CCrBHK5GqtLGQpbFaxeJ+VMAcFkoNPuYQ55oddi5U6ekfEhrINJ1OIuPUOL81+e\nIlWC6nYKW8CH3CnT0drYWNxg8mCA4PGxB+JFYTAI3L2bYW4uQ7PZRRS1TE56mZryMj0dxOkUWVrK\nAvueJF6vmdXVArGYg0cfHWBtrUAmU6fblSmXGiSXU5T20jx0NszZsxEiUSevXdrj/WtpcrkGweC+\nf0ouJ9Bs9tBp1bz00iqtZg+VCm7c2MEoqvns1CjXnvseE489TOzxi+itNnQ2Bxt//y5avQ6jDgxm\nK6LXQ0U28eSf/zmdahVZltAaDJR3dykn05gDQUIhG916k9vvzNOotTj25ElO/e5nyC8tobG5OfWV\nr6By+BBNAvWOBkH8od9Wp1qlnk7fJyN6QaaZzyHLoBVFGrkc5c04urNBOtUq7VIJQaej//z5j12u\n2K8NGcnlGszN7RMR2B8JW1kpEA7bPpQJkkaj5ujRANGone3tEpubJURRu/9vWi3VbJNsoYNDaeJ2\nOTFYjOwUW4CCSqXCatVz6piH3GaDnkki4u/y7jt3ya1sg1qF1qDF6vfRkWuMXDjL8luX2XpjDtFq\nZuDMKcotI5mVDFvzG3zp336BzMYO6kaBVrlK/LXrOKJ9hJ/4NLffmccUDOLvc3F9ucVszsqZZ55G\n53Bw6UaVgQE7t/MupIFj1M0qXG4n828n0GjVFIsdeg01EbuK+EaRdquDb7APx8QU04MuYgN2JElG\nLZrQWmwIgorcXoFCuoBOFCnk66iqdfbiRbJ/9z5PPn2MgSMXuHotyc5SBdFiJp/M43Rb2dnMYzCL\njI/HIBxm6ISeTElhMRNHrVahUqnodCRUqv2R7N90fPWrX+UP/uAPPnY3+I/i/PnzXLp06deKjGxt\nlVhczFGttvH7zRw44MXpFH/mZwSdDu/EBN6Jn9Q4dBsNeq0WAL1mk25iC43BQGg4TLtSoVuvY/D5\ncJ0cJXUlw8HzR5BUAkOjfgwWI/M7EF8vES3qCBTUCIY6boeOrizw7e/fQqMGUa/FHXBS3kuzeLmO\nEr/J+pXbDJ85hiviRynu0Wu1yGbqGJxeRLGD1iCiEhok0zXUei1SJc/auxtMxfRsNRXSNZGXn3sX\noyBz+NAU5bl1NPFdRg51OHA0RnFtlbMPnaDS1lJvynRbbYyqDr6BMD67CqmYQjYcJXn5XbwTE3zv\nP19nN61hbGiK8EEn12ayyFRQ22Vk0cbE+cP4+tVorTbcU4P4Dv7wWjbyecrb23TqdSx+P9ZIBOFH\nNiAfJVKpGjMzSdr3csNqtQ4zM0m8XiOg4sqVHer1LtVqh/ffT+DzmZEkiffeS/CD07ofxIiYzTqk\nmojBZqFvrJ/562tIjRpDse97AAAgAElEQVTVGpSKTTptiTt3MrTbPf7wD49iNsmIRoHr15MoQMBv\nBkUhk66ie6KfT/wv/zM3Zsu8OZMhNTfDuWfOUsWCejdOr14hcvoMqYVVDg4eJDkzQ3V3B2tfBGsk\nQt9DD2MdnSIzO0d+fYvI8ABT01GK6RJUc1TVVnSDU+gmppnfbpOcT3PxtIdSrvKB16mez9MqV6jk\nJIxOF3NLJZxuC0ZVnQOnD+CyKGix0czn2X7/fTQGA9ZQ6H6o3scBvzZkpFpt02z2fux3sqyQyzV+\nLhmRJJl4vMTaWuFepoLxx7opRo+HXq1CvSGxu7SDNSgxfGSY/N0GKlUNu11PKGSlnk5jM6nRDwbR\niRp06i5bly9jDQZo1ttogjEmTh2guLfO3etx1EqXWrFGsXqF2BOPM/rMswxfSNKTu5hiE5DbhF4b\nm62O2edD1hkxev0cfeI0keEQ3/l3L2G0Wbhyq0ilnKJdLWP4win+7/90hwNDJk4esuK3Sli8bqh3\n6RsygCzTP+hCliU0GhVGk5ZnPz+FupoluTxHrdZEJ6ixDo1hFkWsMQdOoc7C7A6xkMzu2g7WSBSd\nycROXiG7lKRSqLNz7Ro2m8jUhYfQO13UilV8gz4SiTKJRJnHHosRCBqZmPCwuVmi15Pxek04HAYC\ngV+dAv/jgFarxTe+8Q1mZmYedCk/E+fPn+drX/saf/Znf/agS/lQSKWqvP321v37vlhsUSq1ePzx\nwQ+dU1UqNUkkKtRqnX33UKuI0e2mJotkqzJavQa72MPi9xN56CF6jQaC0UhXUuHa1TCzUGEvUWRq\nyk+u0kORu4yOeYhv13jvWoa+qJtMusYf/esjfPozo/TqDdq1OnK3Q3onj6KyYO6PMSHq6bWa2AaG\n2FM7CI/38+TnnTQaEiqli9yT0Io6VL0OWrrsrW8yODmAQd3jrf98mdjhEQJhB/OX5zFadPQfO4zN\n5yKzss6Z08fpFPPMLhR47/Ief/hfjeFSdGQSFQZjdsI+HT1dPxvz6+TffhGLUcBqDbO+nSddhmKn\nzt3ZFIOjPlLtLoaKDkeqy8q2xOHDQ3RE132dQSOfZ+P112mX9rUc+aUl3BMT9J0+/Ssh4oVC8z4R\nAXA4DAiCmp2dyv7GSn3PL8OiJ5vd37CePdtHsynRaknIskwu12B7u4xWq8bqcqDRa5m5mSC5mmJ4\n6gSGdInTZ/q4eTNJMGRhbMxNNGqn3e4RDln59rcWCQattKo1qjUJq0VLQ9KR6jp492YcVaVIJlVh\ney2NJ+yirlcoL9xGarfQWcwY5Bo3Xr5CqN9De3mFSjJFu1rD5PMTnj6C4AlCq4rVYSa9sIxi7Ucy\ne3BE++mZvBhsFaw9AYPNxujRARLrKSRFhc1pwRv2oADx118nLzt47YVZ3EEnFx8foVBoMDQcI6JJ\nsv3K9+k1mxjsdnyHD1NLpcgvLxO9cAH7x6Rt/WtDRgwGLVqt+r5JDuwrrG22n7/rXlnJc/nyzv3o\n6R8lNRaLDo8nQMFmxuwWsDkMaHRazOEo1kCLsTEX5XKLRqNDvqHj6gu3sTtFzKKawdF+xp98hFq5\nTqXUJCT2ODhmYeW7CerNLlargUyuRWl3B8Ngkt2CmoGIF4e0jTvWh2ksiNSTGHzaQbPWRIwF+MJX\nPot3IIwvaORf/v4xJLWBtXiZhZkt7t7IojPoabd6dCQZv0ekk0nyW589x3P/cId3Lq1htejZSRQ4\ncTqKyWCnsBFnNAC3vvcihc1dtGYzlkPHWL98i5PPPMGt+TLHL4xjoMnM996i3uhi9PgwxWKoDTqq\n9RrVZJJ2pUayo6JwdQt/uIq+V6PV02ByOwFIJquIBjWFQpPt7TLlchuv18j4+ND9DtRvKp5//nmO\nHDlC5BcInHoQOHfuHF/+8peRJAnNx1TE9qNIJCo/sQHJZOrkco0PNWVXLDZ54404+XwTgPn5LMeP\nB5FdI7z2zfep5quo1Cr6xqN86pgPQadD0O1bpKdSNeLxIoJej9Fuwep2sLwSJ+RWoxYMvP/uJkaL\nEZPFRCBoIblT4b1XF7j+zhKBkI1nPz9FLKzj6HSIpW/fpLGzhTs2QLnYJFtV0Zjf4+7tKgvLRTw+\nM4cmXTzz2XGa5TKUUgxFDjM+6mLx/Vs0Gj121pIMHDrMXqqOrDcz/TvnKCzMou01cLr0MHqKO68l\nOXTIx61/eoXFmTgaQU36joaQ38DQ2RP4nDpkt5W5l95Ac/AikWgIlcHE3l6FZ549QDTq4uqVbXZT\nDa5e3cXlEqnXOxw/HmJvr0qr1aO3vUSzUEB9r+2gyDLF9XVcw8M/NSyvWSySX16mureH6HLhHhvD\n7PN9qO+AwSCgUoGi7Afz7exUmZ9PE4s5aLV6DA46MZu1pFI1Mpk6arUKq9VALGYnn28yMuKi25Vo\ntXrU613KpS6nz/hYv7tJKl0nX+qhFQTarTanT4eYmvLx3nsJbt7cQ6fTkExW+f1/dZS11QJrq1lk\nZOwOEcVgYS++RHY7RcCjI3ZwkOzGNqOH1Bx+dIzKpBeX345WapK99gaSokYjipgdZvZu3CS3vEzw\n6FEiD5+jrm+zFy8x/tlPM/7EOW7dyrC6XqSWLTDcdTJ1MMDZc3qkQpKyOUxmJY/UbNDVWggOTFLd\n20Ot0bCyVECSVazfWMSRqWHzudheqqNqze/75GQyKLKMNRLB4vcjtdvklpb+fzLyi8LrNTE05GR5\nOY8s7wdcBYOWn/lQ2jfRaTI7m75PRGD/ITU46MBgEMjlGty4sUe3K3FjpoPbbWR42EH5ZgpR1NFs\ndrlxI8nkpJcbdwrIag3lTJG2RkLXLvG5f/MJ0ts5CqkCJr1MwCazJghgcoCoxerU4e03Eh1w0bO7\n6BX3yGzNs3H5BqHBIKWmisETh9F6w2yVjaAXWVivsrldI2Dt0aqksIt6Dp8exul3otNrGJ3wMjLu\noaXSUa3ukrmzw8p8AjpttlfzpHZNWK0iZ0/68Q1Yib/1FvlUkW67S3JtgdxOlvDFT9ApFzk85cOk\n1LDbjcgGC56oH9fwML4+L+E+M7l8i+qWCkm0kcs18Hi7tBttkvE9+uwhRKeC166mvbnIjfcS1Otw\nbGSUbNdLtdphcTFHNOr4SHIsPq745je/+WthKub3+/H7/czOznLkyJEHXc7PxQe5fsqygvL/NqH4\nKYjHS5TL7fvpsrBPmjOZNsa+GDpXA5UgIFusrMVrBPtcpNM1rlxJkE43qBRrjPQbUDVLGHQgtRo0\nWibK8QLZZAFzo8PQRBC/38zltxZxWDUMjwdAVrh7N8u/+aODJC69QTGxg8tpptVsk33/KgOPXOB7\nL26gdQUYn/CgM2ipNBSMFpFGqcqBAT3JxW023l6k3dGhVilIikKxrrCb7uDtt5BaXIPdLZxHDtFU\nGUmsV9jaLHJ80sxGIo1R06XR6NCUBEwxM2ahQ9s7Rn1Uw8iomw4GvvNmHo2hg2gUKOQbRDxqRgIy\n9ZKE07k/mj8+7mZ5OUcqVUMUtRiSW/QyZSIR2/2RfanTQWq3P3ANOo0G2++8Qy2VAqCRy1FLpxl8\n/PEPtYZ+/34OTibTQJIUbt3aw2LRYTLp6HRk3n8/waFDPprNLpGIDYtFh8Gwn8heKLRIJEr4/RbU\nag3FYpMLF/qxWvUkdmr4hgy0Oz3OnAnznedX0Ok0fPWrtzGZdBgMAul0nZERJwNRB+NjTtrNFgfG\nIthEhXyqhEGvQdDpcPhctLeWsXlNqHUCfX4DjrAVwWxkd24Hnc9D33ANq8/L7b/7O9rNNrZgAHnm\nDt2uhOX0J7h6dQ+pVODQI4dZWEjTrZQJHxihtbvJjY05vE8N0Wp32d2rYpk6Sast0TNbiKcV+o0a\n1IAky6hUakweD5Ik01Xr6RTyOA+Noq7lUKlUiE4n9XQa6Z6Gqtto3AuMfPDHy782b4gfpDSGw1Zy\nuQZWq55w2IrJ9MFnlYXCD0iGzNzcvvteKGRBEDR0uzKFQpPHHovx6qvrRCI2EokK1WqNzc0yrVaP\nU6fCvPjiGuVyi/FxD9NHPHz32xl8g0Mo9TITMQONpVvM/cPX6RSzGENhuu4Qid0GsckYrXqLRqNL\nqqegNtvItETIN3DKbQo18AzHyKeyVKptksvr9I1Ms7na4O7dLQ6OmKnevcpip4rHZwXRjOXACY5M\n9zHz9jyPX4zh8lq4+85dDg65WEgWqe3sIFhs+P1WOl2JeqmC0awjPZvm8mt32V7YwOq2E47FUNcL\nuPUN9J0S66/dIfz0cQ5MuunwKJWGwtCoDaW0hl/xMzzsplKIkUiUUAsdHGY1sZiDVHyPbElGtDdQ\nNpZodLMkk1XUKhWF7V2Gnnicel1Lvd6l0ej+xpKRRqPBK6+8wl//9V8/6FI+FH6gG/m4kxFFUQiF\nrCwu5n4sIM3lMv5czYii7B/fNptdwmErs7NpdncrWK16zpzpo1Jp74sxf0SQmcs1kCSZS5e2ePPN\nOBajivmbcfrCZoJuHeXNOAcP+dndrRMIWjGZ9KiR6QuZqNXadBstWqkdxmIeuooGldTFpG5SLGWg\nuEdyu4reE8ASiODoC5Jq59i8tIZgEDlyIkI1l2N1Totb7NEzWKimM7RaEn0DNlK5Nr7xEZKKlTNP\nHeH4pAX17gLWiXFWltJc+vPnOfsHz3LsyCCVQhmrTc/2bAqLw0xswIla6ZHYqbB14yrbd5eJ33Zz\n/HNPMDEV4PnvrXHiiAdtapHFlQyqXheXWseppx4h0zbj85lZWckjilpUqh5OX4CVO4s47Absjv11\n0JnN6G22D1yLRjZLPZP5sd+1SyWqe3sf6ntgMuk4dy5KIlHmzp00kYgNt9uEXi/c65TsG1dubpbI\nZBqIokC3KxGLOVhd7SDLAn/zNzcJhSy4XSJbaoX1jRKlYpNStkyu2GZi0s/5C1F6PYWdnSprawUW\nF3O4XEbUKNgtAs/+VoiI3CY5+zqlpoy9HCEyNsmRM0PUciWixyZ5/+1VHK0q/f4tVpZm8DoEOrkM\n3slJDEcPk711E3pd9AYBs8dFbS+Fye0hpJeYPn+AuZfeYua9BRRUaLo1crO3EUwmurUaxWNuaiuz\n9B15lJde3aRWbVFpyPhjYf7VvxiD9DZDQ34Sa2naXXAEfdj7+3GpbTjsRQxTUxSMxn1L+E4HjV5/\nv0v1YYhIZWeHwsYGUruNvb8fWzT6keuEHvQb4n8FjgG3gK/8vP+s0wkMDDgYGPjZGpFeT+bq1V0K\nhSZWq55g0MLlyzvo9QJ+vxlBUDMw4CCZrLG1VUatVuF2i6TTNer1DtlsA0HYTz1EUTgYbKLObdPa\nmKdSczB+ehJR3iOTyeKwaKjlChiGD9Gy9XN1tsypc0c44vawPbeO4pIQQ1HuLGSp1ns8Mm3B5LBw\n4/UN+gbD9I2YaauMrKyXSKV6qBQFQ2Wb2ZkF/H0elubTOJ0GhjGwV5ji6ENj+HwizUqN5PI6NuMA\nff0RRg5GSO2V0erA77dy8kSQRq1NudjYN8bxOskli5gsIv02HQaTSK9SopfdYf3tLpMXTzE9IaJ1\n+sjOzSPbnCyvFNDZ7Fx4fJyBqI1uvUHIL6KoBWqc5PZilaMmiepyioYgI0kK9VYXjUZNdTuO2T+J\nKAqYTL+5xzQvvfQS09PTuD8m+Q4/D+fPn+e5557jK1/5ubfbPzsURaEYj5NfXkZqt3GOjnJi2sfS\nSolms4vDIXL0qP+nbkB+8DdmZ9P3u6FvvBFHkpT7mgKXS8Rs1tHr/Xh3xeczkc83WFrKosgyNpOO\n4w+PkM3UGDgYorqxgkFdZOxsgPReif/hf7rInZsJkmu7nLg4hbrToCqXScyvU0wXMZhFVH80SSWd\nRW41QS0gtdvkl5YZ6TZp5POopA6Rfh+ZZBnUGuxOK35LHcvkJBNHByjH16llsoyGR6hr7XhUIjoh\nSCe/R9MUJdOEVreK2QCtnQ0C4TA1owOL8wi59U0sZgGXTSBXg36Hg603rtNDS7PVpVqXuXF1B0WW\nMbdTXHn+bSx2kQsXYiQ2UmRv38R79iKCoLqvz+l0JFo2N+HDB+i1c6BSobdY9p2qLZYPXA+51/uh\ndfmPQPqR8L2fB6tVz4ED+yO+tdoPPydJCkNDDur1LqVSG7NZh0aj4s6dNDqdwJNPDnH9+h4njgfJ\nbu7itxuYuRFHQYXHaSbg8WCziawtpjjzUJTvvLCOz2fmrbc2sZj16HVqOp0uY/168nN3ee1/+yqN\nQpnoWIiiRU0pX+HY1ClEa5AX/mkOfzTA9EE766++wPbtBU48eQKbTkN2aZHxz38BnUamsrmG1mim\nUSrTUwvUu2qKlQ6vvrXIiTOn0Bl0vPbyCp6pEOW7N6DVwep20ErtkN9MYIsUsdoMSIIR74AJm9dB\noa7CZzRibZYYnQqzvFFBbXVhNms5NT1M9vKbqDQazH4/vXabwLFj9JpNStvbaE0mDDYblmDwp17/\nciLB5ptv3hd+l7e28JXLhI4f/9Br+GHwIMnIUcAEnAP+d2Aa+NAxp5Ik02z2EEXhJxw+y+UWvZ5M\nudwmn28yOurCYBBYWysiivvufuvrBfR6gXK5TTJZpb/ffi/7BqamfDgcBiIRG0eGBFa/+Z+QO12G\n+2PcvTLHY48N0JhbxCyXEdVm3M9+kee/PU+9XcA+doD/8z9e47c/f5B6wEyxmue1F1Zp11v4Qk7y\nZRGdpMJsM1Ir12m1JR56dhrDyBjdy7s4TbB36xoen41Mukan00Nn0LKzvInNEmH2WoGRYSf+sAOd\nWuLlb17mk39gIxC2o1X1cLit2A0SB4eNXHn+XXRyC/9QGIPVjNntRtAohE4ewhoM8MZ/+BpWiwFR\nDKEStIRPn2Lv6lWaBhfvvBanVqmjSDJaucmFTx5h/ep7bC1p8Z17DHQi58+78Fo6rKdrdJotRkZc\npJLV/fXpdDGbdUxNeT/2zn//X/CP//iPPPvssw+6jA+Nc+fO8Sd/8icfm9bsj6K0ucnWpUvI3f0o\n9Ho2i+/gQX7rt47RavXuvWx+tptvNlvnzp00nY6ExaIjna7RaHSZnPQhigLttsT0tJt4vES9vu+i\n6nYbGR1102zuv9RMRg2zs0lWlvOgFshmGjx63EJETFO98yp62czomZNEAkN0FS2BiAu3x0Rh0Ekw\nusnsu3eZODqAIIpIZi/miJpSIoFSL+MeGKZbrXD0aIi1zSq7u1UK2RLTZ4dpN1os7+Yxzy5Ta8pU\n2hqsniADFjvajsTNd+6wfmcdbbOARpGwRGMEw05UBiNyt8f8O7ewhYKc/Mwhon1mNm/exREK4jV4\nefubbyHodfTaMirRgs5kYH0xia/fR2VrlXq5itLrIHU6RGNuenQIezRUZYFyuYXdvt8FSWU7hIYP\nMzm8r5vTW60YfkpXBEB0OtFZ9k0RfwCNXv+hNSM/ir4+G35/kVTqng26oGZkxM2tW8l71ucCjUYP\nnU5Do9aiW6lg76Xpi/Qo2A3UJAmjUYfFbkRQJPaSFWbeX2X1jgmt1ODIVJh6W2FpKc/6Wh6NGi6e\nD2NoZWhWkhjoIOlU9Nod9jbS1NopHjl2DK3JSa9SoJguYpzSU8/msDisVOsSys46nWqFwLETOCcO\nEzqZIDlzG/vQICaNEWtflJ1UB4vdzLeeu8PTnxpDQOL21XXcdi8Bu8zAoI3a0jt4Dx3l2nyZF747\nD4IeYzDC2UdM6IwiNleU7NVZxqI+Dj08wV5ZoFbr0FCZ6H/4YfLLy/TabSLnz9MulUjPzqIzmahs\nb9PM54k9/jjmn2Jol19evk9EYF8nVFhbwzUy8jPX/hfFg3xLnAReuffza8BpPiQZSSar3LmTplRq\nYbHomJryEYn88KKk03Vefz1OLtcA4O7dNE8+OcjTTw8zOupiZSVPtdqh15N5+OEI83MZ8oUmgiBy\n8mT43lFQk2DQgo0UUn4PZAWfVc+Jr1zEqm+wXckhdOt02gZuvzpHKV1AsDgxWc3spPJ8/7vzeLwW\nXv3ePLHxIH1TIkadjKQSsMcGkZdzuGP/D3nvGSTJed55/jKzvPeuu6raezs9Mz2uB2YwMDQ4iNJK\nS1EnyqxOp927jY3buI8XQd6ni71QaLUKKbQX0koh7ylBADUACDMw423PtPddXd57m1X3oYEBQQAk\nQPA4xN4/oiO6Kyu73+g3K/N5n/dvPIzP+jFoRVrhNaZ6TOypjbSqXZQSKro7UC03UGuU2AMe6g49\ni3eiGLQCOrOB88/NIX17kTsX73DimWMsPDaMXq/ALJXpVEpMnhyhsLOF2tuL5oSBQqFGtdLA4rfy\nrf/0x7TrVbRKgWalyvZ+mZQ+jbrQ4P79FMVMHrnRILO5SSWVwu4y4XVY2VveRbmxTmD8NOVyg1xD\nydB0L/GtPVqtNoNDDixWLb1np3AM+X9gS/3zjHq9zre//W1+8zd/82EP5ROjq6sLvV7PxsbGT5xT\nbHp9/UEhAkCn8+CmZ7Z+sBvaarXJZqsIgoDNpn2gqigU6tRqh54QkiTgcumpVlvodAoCATM6nQqX\nS0/QpyZ+kEGhFPH67TgcOpLJEkajClFQc/tWlGqhhMVuwKRps3n5FoFTbjS+IEurVYqLMTxeI2aH\nhTf/ZZ+SrCGVa6HqGPjl/+PnSe+FiWRFqj0naJXLeGY6mOQUFqeFZCJDb8DI1HwvS/eS6Ixa9Hol\nq7e32bp2j+OTRiqhbWZ+7qfZjtRRaDQIQoPl6xuYjWqUopZGLkNxdwvNyFnG53qwDA6xfnGHoRkt\n9b1V7v/5X6JzOJFsGg4OZArFGqJKh95ioFLr4LCqGB7zoDSZMbTsmBwWPG49SpWCfK5ES63m7v0M\nSqOMxaKl0ZCxWjW49Q0MzRhCyYLC2vWxD6NGqUQtl0NSq+manyd+5w6NUgmFVotrYgKD1/uprw+T\nSc0jjwQJh4uk0xU0GgWiKHD/fgKDQYVaLVGttqhWmmze2yN0a5HwTpwjxwMYKhE8E5M8+WQ/giix\nux4hH6tQLRTpOuZjZyWEvduNICh49tlB4FCNMupXcO0v3uDUqQBqrRKtTonDbSYPqNVKUqky9WoF\njcvHaMCFwetC4Q4gNBrozAYUDSMCHRrZJOtvJrEE+pgYHaVRrqI0WdB2Bbny7SsM2n3UutTUK03G\nutrMTU/SEpRMTPuQVy+xdjWN7qiddLGO0WpCVKmw+sxEIgVa5SI79+6wsZqieTeMWrdC75NPUkJB\nLFZm6Gw/tv5+Op0OpViMjcXFD3SymuUyhVDoY4uRRrn8odfazean6m59EjzMYsQCbL/7fR4Y/yQn\n5fM13nprj1zukDBVKNTJ5+s8+WQ/Dsdh9sPubu5BMBAcqmdu344xN+fDZtORTh+g0SjwGhpUN1YY\naOWZHvLRc2wQd8BNLFZibS3N9LQbW6XC8NwIjVIRk9OGUU6x953buEcGePPGKmML/TSLIkqFhH1o\nEFlSE4lWaFRqHJsPUi2VuXt5ja7npmnls0yMD5NuKrHNP0qXOc/6tWVsZonoXpLxLzxJvqRBaekh\nsxmnWq7hcuqotwRUvn5eeeuAaqHM+o0VjhclfuqcjflRJWqLE60Qxi4XUbT0XHtpkVJLhdOqZOmt\nW9h0bTpI9J85Rt+JY+y/8iJKmhjsOvR6BaVSHUmhZXnxgAGPmVRi55DYxGHWh0KnI7UfY3CwzXC/\nEZWihH/MztZWjldf3cFj6qahKKChSVevm/75aVxT4//dh+VdvHiRsbExPD+hwVMfh1OnTnH58uWf\nuGLko25unXabtix/4LVstsrVq2ESiTKCAF1dJo4f92EwqNFolCgUIq1WG0kSCQQshEJ5LBbtg0JE\nTO2y9cYrZEMxlEqR2mA/ncceQx/s5+TJbm7ejGKymtBrBLq7LTQKeYq5MoIzwOv/cBm9WYcqWyae\nUbBYN7J6ZwdHwIt7dJi7lw+4UMlz5pF+/vnFLfI7mxikGrTbjI27GVPksPd3c/fFe8SSDd58eQPJ\nYEYptrEaBCSjGWevj51wiPBOnMUtgZoYY+GEm56gmVgohcasQ6xUaDcbdHcZcHUPYhkeIjjRx8bl\nO9xZ3kPV1Ue9WqYld5hfGEAWJEJr+8iSmkC/B4ppJqa7uLeawzw4QHcoRLtWotZok8m3sU8GWNqq\nkkymOXs2wMKCH0UpQeLGLQSFTDQhkVo5XHWbv0dFltvbI3z1KvViEVGhwDYwQO8TTyA3Gii1WlR6\n/ae+NprVKum1NbI7OwgqLRq1i/ubh8ecTh0HB8UH5OZ0PMfIEQtLl3cpl+rsbyZ4+sl+PF4Fm4UO\nF1/fJLST5Oh8kL4RL2a9SKEo87d/cx+T3QSCgE6nJBi0kiq06RvykM63cQa8NJIRlM0i3h4/iaaF\nzYMm4fg6x04PsbOb48I7WbyuIGtvXKVRazAx7MfZK9KqVUldvY7t6WfYeulNJKuL5H6MTDzD6Bef\n5ubFyxh0Ovr9faxlOkQjWaLxGrFIFqdCYPLnvkZFYUbZ2UejkJFpoVGJ2MxKhHoZ2m2alSqNhozT\n70JXCJELpaFmoRBRYvL5EAQBudmk024jiCIqgwFBFGmUy8jfvQj4HliCQcrx+Ade01itaH7ELq4P\nU983BcjAMjALqIBr33X8G7lcjitXrvDGG28Qi8UwGAyUSgIrK2nq9RSyXEGh0NFoyLRaGQShjsFg\n4t69OJ1OFo2mRaulQq9X4vXK+P1q3G7HoVQ3s8P+9Uuk1kLkknkyuTgaqcTA1BhOtwm1uoQk58he\nucTm898inoiQCu0RmJ4hen+Fdv8Qks+PXG3gm5pCcFnQ+900GgoymSp9faCQcwyM9mJ1Wxka09E/\nYsKo05HIygT7RGLrK9TTRSRRRHCZuHLrgNhuAdHipmvciWRQY3H5OPqlBV65EUVrlHC6XQiSRFuq\n4u7W0drdQNkoUGhWSWeyCDoPb1/coGfCwebly1BvIxnMuMY9tKmjU6nJ10Qkh5aGJOHr9uI+coxL\nb98lvrfHwMwEej8/gZ4AACAASURBVIsRWVFDa1bSKLcRRInucQcaRRU9Mn1nTxKLx9m+fp1hj5K+\nPgvGgAXLYA+Dp04SmBxif3+fXC6H2WymnEyyvrRENpPB8W57dnd3l1wuh+XdC3p3d5ff/u3f5hvf\n+MaP9SL8LPjd3/1dpqamOHv27MMeyqdCJBLh1q1bfPnLX37YQwHgm9/8Jt/4xjdot1oUDg4+cMzg\n9eKamHiQN9PpdLh0KfTAy6bVOiSjS5JIV5cJrVZBsVgnmz28MQ8M2LDZtLjderxeI5N9SnZe+heu\nv3yL7bUIyWSZVr2G1WHC7PMgNCr4nRJOrwWDWU9bbmG165HqRQKDXl7+67c5fX4CZSGCza5jc7cE\ncot2rUyn3UGlViLRwmQzsbGRYvjIEEpJoFkuUq22mfvyWTqZCI6hQfJViY3tAnqLkXIqQy5dZPJY\nPz22JomDFN2jvaitNgRBIBXJMn+6n53NBGajGv9IgKFjw0xOdxO+cYuV1y/RNTbIznYGuVzk4O4S\n/rkZTH0DNOMHjE14OPLEcTw+E1aLgrWDNn3jQZKxIvuRKifPTzI21UW+rmDokVNs5PTsh0p0OpBM\nVjj3aID23j2EWolWpUyzXKZVq9Fut7H29T2Yn0a5zO7Fi9SyWeh06MgylVQKrcWCJRj8gDvze/P+\ng9DpdDi4u0x4L0NJVhMLpbn4929idtlYXC/jdOoxm9U4nXq0WiXDAxYi6ztsrkRoNmRMRgXjEx5S\n+3FC+zm0Rh0KtYZ8rsaxYz7SiRy3F1O0RA2NWgOzWcfOTo6BfhuSSkWhAmIhTlefh2q1ic5mpWd+\njr6FU6TyHVRKkdEJLwfhEqFwGW+/j5kTQ7TqdXrmjzD21OOklhYR1FrKsSiJpSVMdgupvQj5ZB6d\nUYc92I2iWaSr10VZYWNpMYZSqcBkNdLRGhH0FgJ+I2uLu5itBrx9fuw2NYOjHnpMFTTtMjq7Dc9g\nAE2rxMGNW+RyVczKOo1kDJ3TidpoRBBFqpkMkkpFMRymkkxi8Hhwjo19bJdLZTIh12o0K5XDQs3p\nPHQM/wFbNJ1Oh2omQ6NUQlKrEUWRb37zmwDf/Kj3P8yl62Xg14G/Bc4Bf/S9b/jP//k/f+ikzc00\nAGr1BwmDLlcXPT2HbaauLhPZrBuDAbq6DmXAh5yQPoDDZMsdkXCiiCgJSJJAj9OEuVGnnExi9vvp\n6elh7623WFtcxD0xjmp7m2o2SyEcpf/Rs1x6Z5daQ8Zk0tGvVzA2O83ORhJdp8rcpI2hQSvr60k0\nkszRcQOPPDJEtaXg26/FKBVl8vEMqy+sUy+XOT4fYHasl1u3t0kXUsgGB+ubQFPHyGyQIYOLteX7\nFJIZdOoozm4HLpcTZUXGNztGuwO3/+EFXD1+IskGVn8Xjf0oyWv3EVUqZK+b8UkPyys5HH6Z0H4e\njcbF5MI4nn4fr3zrJtHVKCPHR0mma0SKKnazbqxGBfM/P0Xs1k0mgxpC//gvmE+epByJULhzH593\nhOTdq4Rf3Mc7Okjb6acY9AM+enp6kJtNDq5cIbOxQatep6PXk5AkXGNjH4qy/zxG21+4cIE/+ZM/\nedjD+NQ4deoUf/AHf/Cwh/Eh2AYGaJRKZLe3abda6J1OfMePfyDYq1CoE49/uG28t5djZsaNSqXg\n5En/A9WdxaLhiSd6kSQRpULg4MZN7l3dJLJzKDUtFypUynWmnlWw+/rrlLIFYpE8ppqCYxOj3FYo\nMKrqDEzOYbXrmTh/itGZIK/9p+dp6Ww0RD/htT0cXXY8Jg2aepP+US86o4KRARPVyB6SUom1tw+1\nyUit1iS9uorhqB+9tsEzz81y916CTkmDVq3l5KkgmTtX2NjM0AlUeftWlPPn+xE1Mmazkq/92hnW\ntsrsb6fQNNXcee0WYipFs1wivbuP68gczVwvp37+WeL3Frn5B3+ExaZH++RZdO4e1mMCkTgcRKuI\nmjDh9T1MJiVvv11mZCZAXmkkExLYD73v9Gm1alBJbYrFIvm9PUqxGHKziaRSIUgSrUcfRaXTAVDP\n52kUvscltNOhGIng/AhH3E+CeCjNyy9vElqPkMtVkNQaBoYGKYV2UakGuHhxD7fbwLPPDiGKAi/8\n0zKpWBGVSsRoUNMWFKgNepqilnY+jyBJ2F1Gbr6zya2bEoNDDgwO6Op1k4nn2N3JsLySYmDARrsN\nN25k+Y2fHqGcj+B/9BzVRpuSyskr/+0tWnonqWQFl88KHRmDUGb9VoSoUYWn/xgZnYt4ooRnagrW\ntlh75SL5dAmfJGG2aFFq1WilJha/neuru3SUWpKRDOmlu5isRuJREcfQINuxBt2SmblpJ5vRDpVG\nC6mWZsDTjdtrpKb2kHn7HQSjlfDly1j8frxBKyazlla1SmZzE5PPh9poxBwIsPinf0ollTqcv0YD\nS0/Px7qxqnQ6gmfPUkmnabdaaG02FOrv7+/VqFSI3LhBYX+ftiyjczjonp//vuc8zGLkNlAD3nz3\n+0/EF3E69Vgs6gfbNHBo8+t2v+/yOTbmIJerEY+XaLc72GxaZmc9D8hvZrOWbp+ebNBCrS5jMqpw\nOHUPgrXkVotaLkcpHj+sJLNZzIEA1r4+qpU65uNTmLfKxC/dpGHQM7UwQY+1iFLaQTPQRbWtYnl5\nk+zV24cEuflBVv7uPl3HjtDX182f/9ldxofMuPxOMvsN9rbjzJwYYGzUSaymQ9IIJBfjJGN5Bkc9\nVMtVVK0i1UwaSSdxkIrjc85iO+pk/1sv0nfuHDavC/fMDGqti7WlMM6pcXwTa5SyRRQaLTSqjI87\nsPT10WPuxWkW6HIoufhPV9lfDWG0GfFOTfKXf3YbtdmCwaThIFLCaFbz5V86R/LNCww89RR6t5v1\nF15A0Bqwu/PEMlFUSoHCwQGtqkR+9R7t+UFESaJwcEByeZnOu232RqlE7NYt9C4X+s+J+uTjsLe3\nRyqV4siRIw97KJ8a09PTbG9vk8/nMf8ICWifFQq1mu75eRwjI7RbLTQWy4cSRpVK8QNbsO9BrX6f\nyN5qtanVWlSrzXcdl7W4XAbqxSLVRgdZeN9IC0Bt0NEoVwitbVOTRUxGFRaTgKRJMvTVk5TLDcyd\nDOSTjE76aFSqZPJ1qqFNxp8bp1Zyk4mmERQqavvbDD7Vj6RVc/+tKOnNbQqRKK1Gg54jE4izcww8\n+zOs7Ld45XIElVrFxKSHricCZPfD6KiyX5aZ/eLjrMSViK0G3/mbN/m5X1nAZDdz+1aYrTubBAc9\nqDUi6ZSJvqPnCCpLGKwGhEKC9WiO5UyY7P372AaHMNuNrC3HGDKvcGJhjo2tPFJ7m06lSDSUIdSU\nMevBpGpg6fLR5dBzsF5Gozfg9FqZmHBh81jJKpUUwuEHn2e5XqfTbtOsVB4UI6JKhahU0m590KxO\nZfjhXZiXV1Psb0Rpt2SKhTqNZoVmq8OxWQdSRSSXq727AK1hMqkZm/ShEpp49vZp1mqMHwni7XWz\nEldhokYkUqQtdxibH+HIcR8ej5FQbp9isYFCpcRsFfEHLXR3GREkiWSyTDKeR05kiF+4RO/cBOH7\nOW7/yzsEjx9h89YOk9Nu5GqHVjpGaCeJ26GmFg1xdPwpSIRQ2A0MPH4WrdlI/N4SereHWCiFTtdG\n7XCxu3qAUjw08cweRLF7bLRzcdBYCV26xNCjJ4ncWaSRCDN3YgG1N0hmfY3ivaschCW0JiO1bAa7\n24Vep6RdSKNouejIKqq5HMLmJgavF4PbTSkaRd8dQLK60OhUqLWHOU724eGPzR8SRPFjTe0+Cum1\nNdKrqw9+LobDRG58/0f8Zy1GfpmP6Gh8CnxqfaHZrGFhIfghAqvDoXvwHotFyxNP9JJKVWi3D29G\n3+0CWq02yct6Ioka9XKNhEKkWmsxNBk8DM67cpWyrKHREqnVZTR2B51GnUI4jNsXoKYyk1N5CTz+\nJM5uNxpDh/t/8ReEF5fRujxMPvs089Nuep0zGLQCte1lIneWUKkl+h7vwSOlye1mePQLp4ncuEk5\nlaaQLTD5yEnKS1VCmzHG5vrY3UwwPGTl1ht3mZtxo5VkUnsh/IM+5o4H8E90U7gZpJItcPrf/RtW\n37yB2IiQ29nlXqPI8PlH2b56GKKVztQIDE9jdxgYmXWhMxtY+8s/pd8DLIwTHO+n2JHQyQUMgohK\nUtBQqFi8fcDjJ53k9vYoHhxg7e2lnssx9MgjJFbWaOfiCJIKtdWITIdUKMruWpjeUT+VZPLBjes9\nNCsVGoXC574Yeemll3jyyScfOFF+nqBUKpmbm+PatWuc/4TmUz9OfL/2r06nYmjIzo0bkQemaEql\nyOioA0kSaTZlLl8OPYieB9jby3PuXB9Ws4aOQoN/bppCNI7RZsLe7WT07HHyiSSbO3kQJHg3MmJg\nRItcLmFql8hvrlPIlhgY7KWczjB8boHQlesUFq/w+JkTiK4TmAJB5Ckz8UgGZ5eDo4+O8/r2Biql\ngH9kgJMLQVLrW7SMPmRRyfmnhrlxM8bF17fxefWcP9dD15CeeL7D25fCrL9zk3o+j0KjRanVUM9n\n6aDg2a+dJLS4THQzhCfYTXCyn+W/+xvqqSSSxYFQaGEc7+fORpTASIC2qkM2WcC4tkO95qSuMKGW\nOlRqMo99YZLFa9s4LApUjSKjvSosigxJfRbBCMMzvRw/04NWq8La34/B46EYiRzmdfn9WHt7qWWz\nDz7POrsda38/yaWlB9WeymjE0tf3Q10LzaZMKttEZTRSz+WQlEokuUO9WscUCJK5lMfrNXLkiBet\nVsHmZoZQqIDebsPitjE5aiUYNLG+U2Fr+1B1Mzxg5sa10KEVvyCyvpljetrN/fsJEgmZYqlOMGjB\n7tRRr7c5dbKbai7LwUacriPHGT0zyJ0/fAeVTkuz1WH0SD+NdIq+gAXztAerHlqlAhNzPbjdWg42\njTSbetShGHqrGUmC9MYmXf1eFDoDbVc32bVFRs6dJroRYmbCyhuhEHKzRatSRaFWMTHbQ/3qPcqV\nKnvP/y2+02dpVmUaghanTk0ul6X71CkklQr74CDZ7W0a5fJhkF4qdZhkff065kCA8HaM9eU09UYL\njUaBv9uMW6ul/SMipHY6HXK7ux96vZxMft/zPmsx8n/y2YqRHwper/EBS/6jpL1w6Eni8310lRcO\nF1mPifQtnCJ27z71YpmWxoJ1+uihZ39Zwfqrr0OrjsbqopmO4ZuaZjDgR+d2Y+i20nl8mM2lME6X\njsiVV2nXq+jUAkK7STFXoHMQQp1Lc//NaxQKDXwD3URv3cI+fxartk0xleHW2zVmHjmNr8tIvthi\nPdLGQJGAR0nPqIuv/MwExVKD3c0UlfgeJ47Y8f3MGOWawMa9PeKhFL6hLzFwIkBse4cX/+YqVpuB\ns+cGyZbAEAjyzJmjJLZ2ydcUvLXeJnflGr/4b04wddxI9+nTyBcvMj9pAClDZjdOKxMnlc+j0Sew\nDQ6RyDSQ221K4TCVRAKN2UxgYYHc7i7NQo52KU+xUEOtkvB0+6nUYH2rgM5W+sjVkKhUIv2AFt/n\nARcuXOArX/nKwx7GD42TJ09y6dKln8hi5AdhYsKJVqtgZyeHKAoMDtoIBg+5R8lkmYODD24T5PN1\nQqE8DocXV7eDdW+Q8//7/0zmzg0ye/tkI1Fa1Rp2s4JMCeSWTHQnhsupoW9O5CAs8up9kbU7KYID\nCp77uRna9zYZfHwBg0lHqVClngijHwzw//z286gdLrq6TIwN6DnzSB80vTQTYXJXXqdh76XsypIt\ntekbcqM47mN2yonVKNAsl4lmtKwuhjArmgxM9ZFPZPAEnQz2GLB3eZjRl3npv/wpS+/cRWu1snp9\njXoyxuj8LDvX7qKVWth1AjqpzOM/NU85GqEk1+kbPezYmp02PBYDbscoq8txfHYdC48NIBRSNPaW\n8eoyNDJp5rprKG1NvNY8Nuvh51VrsdB94sQD3xBBFKkVCh9o2QuCgG9uDr3TSTEcRqnXY+np+VSr\n6u+GQiFitmgx+/0URRG3pKLWEvCPBPAN+HlEaSEYNONy6Vlfz/DOOyEODgp4PHoEQSASLTM+7mB/\nLYJWpyZfLXPjao5TC31E9pLsrB4wOttDvdEhGLRgMqlZWAig0Sh48cU1fvZfjfPSv6xjMasQVRpu\nX97A5nNw7PQAOocTUaOjFtpEKxhQVRrMB6HgtqEUbSj1Bv7pzy5RSmcZGzSx8eobHH/qGF3Hj1Op\ngdpkwDs+ypW3NtEPz/DO1RgLx51UVm9z4kQP4bAFSRLp6zXR62xzbWcLo9OB4LRg9ncTXTygy68D\nQaZZqaDUaqkXCnjeNTSU1GpatRre2VlajQYCUENNXtY+8GtpNhpsbWfxDPei/hERUgVBQKn9sIpS\n/AGChk9SjNz7Psc+Wgv0Y4AkiRgMP5wDXDpdIZ+v09A6sM0/iqLTpI6GqmQinS6SjuSIrO/j8Jrp\nmhzDYDxCJZlk/eo98tVlJN11Rs9M4XcpiNy6g17ooNFrkXwOFAYj+8t7zD1zmvXnn8fkcaOyQ0tU\nYjDrKWysMTLt586rccK7aQrVu/TMHyEWzhNdXEIqJ7EGfNy/H2e0Tw8qLfZuN+FdLcnwoWPra69s\nMDLmISG22VoKoTAYsJbSZCKpQ6dEnZlCPEPxXpi22sT2QYdLV0JEwjkMBg0vPL+KQq/HqNbTkVTU\nsllit26h653FYVOTq4rUSlVq6SRTcwPYTQrKs7NsvfQSud1d+s6fZ+355+k6fpx8PEVHWaHegkq+\niPfxBSI5mWi0xFh/N3q3+30mtiBgCQbR/xAeAz9JaDQavPbaa/z+7//+wx7KD41Tp07xe7/3ew97\nGJ8KkUiBjY0M5XKT3l4Ljz4aRKP5oKHee6TW78V7ad/Wbh+PfFHD1htvUc1m0bndFNJFDC4nUjOM\nVmskuZ+iVS5i7F5A1Oj4q798h3tX1qgXCkR2E9i7nZw8dZw3/+uf0GqD2eXgyFd/it3NGLKoRmmy\nUqk2yGeqRC6/hV3IktyL4pkYxdSt5GAjRDhaodhQsXIvxMxsF//19y8RD2c4/9wcHr+H3P4BvUET\nZWOTowt9aDxevnNhjUKxQcPkwztcYufWEl1jAyy/fZvxhRlCuxmquTy9QSMdrQnr7EkERwwPRQqF\nJnr/MCqzkY2NNP/wN3eQ81kcdjU6VYeTk3oG1Um2XnibVqWC/8wZ2rkk5ZgeudFA1GoxeL0kV1cp\nRaOH/9ROB0tv74c+zwq1GvvgIPbBwc8854IgMNRnZOXNJOVUCrleR2cwMjvXRb3VYXraTX+/DaVS\nIp8/ND7zeo28Z6FzZNrB0qX7yPkMDWTahSKu/hGK+Sp0OsQSFeJv7HHtepRMpsrkpJOtrQy/8AvT\nzM56SabKWA0CW3fWGRhxY5c7RFIy554aY3v1VRwuC7jGSJcllC2B5l4Yc/0ArdPG7eU0paJIJR4j\nLWUoZUus3d5GJba5eWMPp0mi3mjz1uv7bG8ksVo1mLwTbH8njbC3i8tuwaRXYKo5Sa80kMtFMvk8\nw1/6Ao22iEVRRlVpoDB7sQ8O0pFl2s0mtVyOrhMnMHV1Eb5+nfT6OqVIBFGlwjhdRukcpmdugsTG\nDnJLxuJzYhqe/JGqH+3Dw4fcove6LYKAbWDg+57zSf66C3gayH7EsUufcow/EbBYNAjCoeS3WgUQ\nUKlapLM1Lr6xg7qW4ua1PRa+dJzdN9+h5+wZ3vr7t6lLOtbX0ggaHWvrac790pcYGCshVnXkNmoo\nvU7qpRJCTo3W34tjZo7itTsUozkGxgfwjfYSXrrLwInT9HztFGubWbwBO7s5qJdK7G9GGBtxUG4o\nWL+/w0DXMMm9JB2lhvlHhnDbFLz92gYTM124/S7imSYHoRz37sb44hkfvYNORr94npdf26ctg9Xa\nIfxWFK1Bh0qroiMoqAlaDhJVbt+JMeaosPHWLfrGAoeMd3GRs6fnWYt0SCSrDI47efqr04jhZYKP\nPYbJ7ye7vY3GasV79Chaq5WZr/8iodV9GrUGgRPzJNQ+qrEKSuWhIVLPo4+S29ujns+jd7kwBwKf\ne8nv5cuXGRgYwPUxuvzPA06cOMHXv/512u3252KrKRIp8uqrOw+C88LhAqlUhTNnAh8wb7NYNJhM\navL59zllarWEzablzTf3CO8mULVKuGiiaWaR5DySt5fwboLeo8dAqUJtNmH2dWEOBNndzRMO5ZFo\no7dZMdrMXP7Wm0wNf4Ev/MdfpQ2Iah2likxL0jP26DF2N+JIFgtFRPrPnkKR2EDXHcAeDGAcn+T2\ny3sYnXYK5SYOi5LLb22TjGRAbnHjzRX+1VdnGFoYQm/SoqQFOgvP//0S2eW7iCY7y28v8ciTYzgT\nCYRmHYVSolauETnIolHCblwmrWihVmUIH1Tp67Wz8MUZQhkJvVImlSghqbV0DB2KlQr5dInkWDdj\nfgO5ly6AIKAyGNB4u8HiJV9uY9d0UOn19Jw9S25/n1omg87pxBwI/EAy42eFphxl4ZiNeJ8BWe7g\ndmowt0L0zD4CKi1ra2m2t7Nks1VGRhzs7+cIhQqH14KqRT4ax6hX0m7J1LNZ4itrDE8HEAQjx7qd\nXHwrRE+PBa1WQSRSwmrVceNGhJMnuwkfFKmVyjicOsKJBoW8REsso9aoeOYXzpKtKPinv7iKQmjR\nKkgsr4c4cqKPniEvQrFEZukW1VSBM888RjmdpZIrkg9H8FlE9HYLka0oXlMT3xOjRA7yJJNVRs4/\nQimVg1oRs1lLq1ZFpdXSPX8cjc2GbWCAdrNJqZ6lHO9g6elh4KmnKMXjFEIhNFYr9uFhipEI4atX\naR0+5OjIMqm1DQzWXlrdkwSCQ4i0qaJFMNp+pHNm6elBEEUyGxvIjQbWvr4fuFX3SZ4KLwIGDkmm\n34uLP8Q4Hzr8fhN+v5lQKE+nc9gKDATMJJMVWqIKvcGMqFIhiAJtlZbEQRJRo2F3PU2l2kTRqbFy\nN8RUqs7w9HHk1St452aRRBGlwUDA3M39O/vY3EFUAzA4paZRqbB1/T59xyYJ3VmimK+wvlWEk9OY\nB6bQ6lWASKkloRRUDE8FqJdKaMxmdg5qROL7/Pt/e5Qtt47+fhu5gwiNUoTghIdmu0ZDaeD0LzzH\n3/7jFq+9eA+lWsnkwhS9owZuX9tkdtZLLNMmcpDjsSdHCO9n0EXDbKwn8fV50NrtZNZWsbdlzp15\nFMHoIzgxgGfQRStooZpK4RodRW0y0W61kGs1arkclUQCUa0FtYWy0kYsXsFoPFydwOH+v2dq6uFO\n+I8YFy5c4Omnn37Yw/hMcLlcOBwOVlZWGB//RBY/DxVbW5kPJPh2OrC7m2N01IHD8b5vhcmkYX6+\nmxs3whSLDdRqBRMTTu7fT5BKVUitrtGsVtF0ahwbGCd/9ypGcwaz3kI0lMR2dIGqQcZpMkA2DKIf\npcGA1mal2QS1TkOjJFBKZancvIuuy8/lG0nSmQo1fTeiUsmTP3cGuVblxtvrzDx3BrdigtReBJPX\nQ7iiZ2/zKgFBZGZ2mMVkgmy+jiSJtKpNrDYdq5cWaWV9fPXfnieWavJHf3SHdrNJOV3AH+xBJbbZ\nWIkyOeAnfG+Z/ifOoFAradVqmD0uEpkG1rle9nczYLARly2U21qUifscbOyi3C/y2GSQzZybbLJA\nNQVIChSKNrbBQRBFZPcgl5eLtPVl9Ptb9PZaOHrUh9pkwj0x8WOd+2I4DIkwXVotgiDQTFWpKBS0\najWWVgrcvRuj0zlUWi0tJfD7TRQKdaxWDZpWnr5BN5lYlmKtQ6kqoxKrBLsN3FpMk87U2VjPEIkW\nsVi0WCwaKpUmoihiNKrp67Px4nqEnXtRavkiarsLi9NDpq5idzNKNi+T3T+gmi+Qt+qx+Xwk21bs\nsyfoqW1x84U3OPHlBUxmFQOjXjQmE2qhTvyd64x94QlWbm+ze/U24wsw3mtFIbRIhVPEYmW63Gr2\nb9wmH01g/6WfQVQoqKQP1aSBU6cYefZZOoBKr0fv8WB496tZLiNwSDA2BwLk9/YeOKgaDErMVgPh\naJ0MoNGoGOwCIbFFJHUopTd6vZ/ZnVl4twv+aRKBP0kx8ivf59hPflTpR0CnU/HII0EikSKlUuNQ\nuqaS+Od/XiNZlNB6HZz46ScQWyUU6NA6nCg0asqVFnKrjUqS0JiNlCoy6zdWCCibpLJNmuYuzEYX\n3VYLzq4KsWQNQZNmZ3EFjUJmbOEoLYuTwvVNJJ2O4Hg/CcEDByVmj/XQTCfIp/IMjHow6QSiuxH0\n3UGqyRIOk0QxkWBq3MJbf/c6l56/AgKYHGa+/OvPUcyVKAo20CTwj/WjNuhoyiKlQoXZ+R66fXoi\nsQpzJ3rJl2X6PBKVfJ10LEezo8B79gkEi4d2uQC1EvZgF9bgodRLoVI9yC54z0bce/QoG9/+NuVw\nCJVSjXfmGLis9JskRked2O267zcFn2tcuHCB3/md33nYw/jMeI838nkoRr67EHkPrVabZvPDWzI9\nPRbcbj35fB21WiKXq5HJVJHrDRrFInKzRVWlpNDRoNTpqKZS9J4YwHlkHtHqot+noL67Qi2Vxdnf\nRW+PmZBWSzZbp62TGDqqx6iSSRcKhOtF4ntxLL19ePxuDlZ2ufrSTY6O6nnq8W5qa7d58YWXcXY7\nUdg9CCYHI6MuNDqRXjeUB5xEki3k/gA6RQuHETQqiYFTR3jnZo5yW43Kaqcjyxh0MzSKWUYWjlHL\nJjE62sw8vcDEkwuoLRbGzi/QNdhNa6XAOzdS9I10Uao0UDdFolthLOktxFIGdaPO9pXLHPvyU7xZ\n1iKrJYYGrOjVMXxHj6JyeLkXl2jqnSjUaiqVJsvLSfR6JcGg5d3O8o8vSuA9/sl7K3zgkB/RUbK9\nHafTOUxzDocPuyE2m47f+I2jSJKIV53CZhC5fF0isxila7iP6RkPBr3E+nqGVLbG5JSb/VCBRKJM\nV5cJu13LNyu/NQAAIABJREFUqVPd9PZayGSqDI51Ua/WSe2GOXKmh5OPj1KuyoxM+bn45gH2vgB7\n1+9QKjXQVBo0RC2vvRPjxPwQz/6vP0vq1lVe+L9eYmRukC5vGePIAI/+x39PRZbomZsim8gR3gih\n0qVw9vkJnj5J45+f5+D6fYZm+hg8c5TU8n0K+/to7Xa6jh2jnEw+sNgXfT467TaRmzdJra7SbjaR\nNBqs726hqQwGWtXqYT6N14tnMkDTUCeXq9HvbFNZvUGyfdhJlL5L0fZpUCo1kOU2JpP6h742Pt/9\n8s8ArVZJf//7ralKpYFOp6ZUanB3ucbw0AiBHjV+TZZaR03f0Wlu30nSpoXKYGT6/DypXBOXq8lm\nWslKRM3yC8u0pU2e+NIEx+Y8/NMr9+nUdATHjuPpthKpt4mvVOibPY7SYCKWhXuXUqiNNYxihV/9\nD+epJqKIHZnlzTKN/n52Em0qpRaDvSaSuRbdxiZOfZu+UR+iUoXLYyaxtITN7yGV0TJ2pJelzQrN\ntkw7lSbRLDHzZA8TAZn+nhGu3i3SqFYop/PsLIV57Nd/nlC+zp1X1ug/MkX3cBBnwE7P1BCS8v39\n+FisyOpqikymRk+PBWs9hfHdKhpBoFWpYGiEOfr4oz/+yfwxIhqNsru7y4kTJx72UD4zTp06xaVL\nl/i1X/u1hz2UH4hAwMzeXu6BHBcOt2Ss1o+OG9BqlQ8UdOl0hU4HBIWEqFLRqtUBJaZgD0Z9GbXZ\njL2/n9LuBq31JbQ2G0aPm1JbRtsu8PVfnefyzTSL95N4PAaeecxDbfMOiuF+YjE9kuKAajpJ6WAP\no8OJRiFhsmiRs3FKoT3sY+OEDvK08iWczhZf+dqXuH3hbW7/xV8y94v/I4HRAG9f3KFWq2M2KPF2\nW9neyfPKS+tYA36OHfPxykubmPQqlA0tLpvI2efOMDtmpFausnl9ibTk5eZymaZF5MLLW/TPDLMT\nl0mnKqiiEQZ7h7A5e1FvbGHVKhkK6lAU4xybHyfYNcKEr0Zps4mpqwtF/wzyrTwK4bDQq9db7O/n\nKZUaDAzY0OtVHD3qw2T68RDRbYODFCIRKskkdDooNBpck5NIas0DRVW12qRabSHLbTY3M+h0SpLJ\nMuZ5O3YxybgfPLZuFBJ4/Q5aKgMag46D+xlGrUaefLKfRKLM0JCNiQk3zWaL117bxeHQUa40Of+F\ncSyWI1SqLdLpCpVqm+XlKnqTjkxNg3NyGgQwepwY7VZsNi2376UZGrAjbYvoHhlHqBdp5hvsv35A\nUFKSjmawzZ3kS//bL9Nstbm/lELvsLB3+U0Ksg7HzFFs436kchKlVos5GKT3scfQezxkNw/tZ0Wl\nEufICOV4nNTKygNJtVyrUUmlsPb0UIrHket1lHo93tlZHD0+PD2H+W57r79Gs/3+lqZcrxO/fx9z\nMPiRJNTvRb3e4t69OJubWdrtDm63nrk574Mso0+D/98UIz8oGEynU3HqVDd7ezlWV1Ns7+RRqhyY\nZwdwmtoYPB5+cWCUrdUostpEW2vCrqihMwpcvbTDylaZaqWJwelgdT132PIzSNRaTaRqkd231/GP\n+Jk/OkRoP0eqoESphl/5taMYdBI+XYl6aptGSyCWg/7JHjphmXQtTbfPx0EsSyKaZWGogdOppbfH\nQqsjUa+USSYrHHdYqERr3Lu5wdS4lYOtOIVcmdFTfsa8HRa/9c+c+OknOT4X5I3vbLAVyWPSmZDc\nASzKOFJBTW5rk0atSTQLucYedm0Li01HW2fl9dd3KRYPyUhip8X+6i3c5g4q1fs+EOVolHqhgPpj\ntOr/PeDll1/m3LlzKD7nvBeA06dP81u/9VsPexifCL29FrLZKtvbWZrNNhaLmuPHux8kyn4/2O06\njEYVxSIYvV6ylQp6gwaL3YDKdRyLRUvyzvUHuTj1fB6Dz4dreprs5iZmTYR//VPDPPn0AM1CnvL2\nCnI2ibPbTUCnY/WqSD6cohyLYLAlOf4zzyA0KtTyefKRGKGqibXFEHaXhcReDe9sGO+RWWrZAvFY\niXSlyuSkA4NGxKAV0Og0/Lc/3EBUqrFZVBQLNbxdJirFCjIiKp2eLreaV//v/4KoVDPx7BewuIfI\nVBWkk2l+6T88w5VrMdaWUjRkgaP9Jm7dDJNwazlz5DjylTcx2ywEJh0EH59AljuEQznafSasPisq\nrRaFoki9fijLj0RKRKMlgkELpVKDaLSEQiFy9uwnb8F/FmitVvrOnTskRNbraB2OB0F7Xq+BjY0M\noiigUkksL2dYWAiwuHho/VAuN/lf/qd5BFuYg3e2qMh6tlY7dDZDiAqRmRkPuXwDjVbJkSMepqc9\nbGyk+Ou/XubkST+Dgzb8fjNLS3EmTTreeGsPtUrixW9volaJfPVfTzAw5CAZL9Lba2V61oOGOvdX\nQkSyAq5ZBZ1mnfzuNkarkfjaNs1sGs/MJL7BXsRiiNhrd2iLKiz2ATqlFpmNNVQKAVWhQ/jFy8it\nFhM/+7NY+/vRuVw08nlEpRK9y4VzbAxLTw/JpaUPebtUkkmcExN4Zmdp1WofCjUU6FDL5T5wDoJA\nu9mkWa1+omJkczPD7duxB4uEUqlBu93h3Lm+B3lRnxSf/zvqD0AqVWF1NUU8XsLtNjAy4viAJ8l3\no7fXyte/Ps3SUpJqtYksdyhV2kzN+LHbdchaC1XdYXZNuyUT39rENuVHVhmxdRlQJVIoqKGQRLb3\nipw4O0R28Sav//nb0GmjbecxiyUaqiB//w/3kAT42tc6mDQxbr3+Mh0EAueewmjrIxRr8Kd/co9c\nsYFSkHFaJI7NunD1+0iEluntsxKJlimE0wTG+1FpVDhtHSKRMt3eDuMDWmwnxun3Cmy9+h1UCiWl\nSBjLUDdGkwoRC6dPT2NUtbj2Vxeo1toUGkoKF9fomVhHr/4CV1dDnD5mpy2qEMX3yZodBGqNDqVS\n4wNBeIIoIkgPM2Hg/3tcuHCBZ5555mEP40eCsbEx4vE4yWQS5w8pvfxxQa0+dFYdHnY8CG1Tq7//\n7asty9DpYLVqOXXKz+3bUbTaLrx+B06njuWNBEa7BfvWIsn765TKMpWWhNVpxp7MQ6dDKRqlFI2S\n392l6/g8919+gct/+x1K5TrHzo6h7xrAP9bH+uU7aAx6zE4rowMGtIUsJreBWLtDPZXA69ZjtOvo\nNJVkirC1d0DXWD+h3RqlVIYjk1YOrt4iFU7TO2DnK2f7uZey0Vao+NY/rjE54eLMvAe5pKGYyrKx\nuEvP8TksXheWbjeFg7vMj1iJp22olBWOzLhwd9uoVVtkMmW+8/oafX02Zv7dDJLyMnIli3eoh1Kp\nyRtv7D1QG0krJR59NIjBoOLKlQNUKolYrITNpqW720gyeRg+Gg4XKBbrGI0/nu6I2mj8QLjbezhy\nxEuncxieWi430euVSJJIPl9DoRDRahUkch3aei8XNw6o12vkMmWiB3lOnQlSKNTotDusr+eJx8tY\nrVr++I/vcPy4n8ceC1KptHjppU16ey1cuxZhby+PQiEhCFAuNXjppU2e+x9GGBjxMNsL0ZuXCe+G\nqSRauDx+2opZRLlB79FJBLmJnE2A6VDu3CyXuf6Hf4BraoZCPIGk1nHsN36d5lg3zUyCZmyfeqOB\nxmolv79POZGgls8fBkcGg6i0WgweD8K7hGNBkhAE4dC8s91GkCQUKtXHyqrFd7dtqpkMCAJa2+FO\ngahU0qpWP1Gy9+Zm5gPdSjgMqs1mq596q/5zW4wUi3V2dnKkUhXsdi29vdYPtQ0LhRoXL+6STh/u\nNabTVeLxEufP92EyaT7y9x7uGerI5w8JPxbL4U0vlSqzuZkhHi+TTJbZ2soQsBooV9vYutzsLl2l\nUijTFhWg0tHfO0o5laaRijE+3U2jXCbQbWTz1jrdCz4ee3oSlUZJYfUWy8UwFkFALhZY/Ku/ZujZ\n53DZexkfs/PGq1vUmzUCXg9Bu0wxtI/Z4yK5soJbBcGFQdyzs1x74R3iDTNnFwLYXEY66TCl2D5X\n31jEZxMpS3os2Rb5lQTaZg6zVUn4/hrD/Wby6SIKq4tCpkKn0ya+uYdGqBHdS5EZddKIbmLpO0yq\nBCiUWniGhhHCS7RqNRqlEoIk4Zqa+qFCsD4vkOX/l7s3C5LrPq88f5n35r7vmZVLVda+oYDCvgME\nBIqULFGSLavDUozd7bElhyd69GBPTEdMhMMRfpiwI9o9bzM90zMxbffYrZZsa+MGbiAJgthRQKEW\n1J5Vue973tzuPCRYIsRFlE0RIs8TcJG36p83E/ee//ed75wOFy9e5K/+6q8e91I+FgiCwNGjR3nr\nrbd45plnHvdyPhI+Sgp0p9Uit7JCdmWFbqeDfXAQ//g43qdHqFabNBptXn99i67ejlMvUVrNcOfm\nNp2OjKhWUcxXyWiVBA4d2P2ZolZL/OYN4rduIXfbPaJSKFFdfp6z3/gWswe+SCOXo53Yors1T3Rh\nDuvgIDO/+WW2/49/oh5NYAxY6Tt6gILUZvZgEM+Qh/WNVSweB2/9wyuoOxVsijI7b6+xdfltJr76\nVRSBMdQqBbWqRDaaITY3h8PvJbAviDKdZuvSaxTW/LhGh7n1g+dwT4xREMzkBS+vvrRONi9h0Iko\nNDr0Zh3bsTqzR4+itVqxhsNceiu5S0QAVCqBW7cSgMzx40EymRpOp56+PhPlcnP3wSMI7++E+0nD\nYtHyxBMDFAoN0ukqL764xvp6HoejF4xoNKrR69VEIgXcbgPLy1ky2Qa1eptrVyP80R8fpVSWeMqq\nR1SJlEoNvvOdQzSbHS5fjiCKIsWihNWqJZGooNGISFKbWrFKo96k7TOy+iDFqQMWNl64zO1nL2G1\n6rA5bKSXsxjOT6IbDrP4j/+AotvB5PcTPHaMSjJN7sEDujLI7RbKlkRpc43tV14kNDvL2sVFHGOj\nKJRKKqkUjtFR4rdv067Xid+4gc5moxKLYXkoEjX6fDjHxihFoyiUSgS1Gq3VivEXhHi6JiepZ7PI\n3S6Z5WUKm5tYBwZo5PN49+3Du3fvh57/ft8BpVLxS1dF4FNKRur1Vm9ML9oT8KyuQiRS5Ny5MAbD\nz7xHksnqLhF5Bz1CUv1AMgI9VfbiYoZstkYgYEavV3HnToIXX1wjEikyM+Ph7Nkwd++mEKxOZr1m\n0ksW4psNNHotR870I6haGNRK7s5vEt9K4g04UGq0eA4cQra4MYo6hrwKNtcqNJttBLVAaiuC2uYi\nevc+FV2OE2PT3LkukEp0mZm0kbl9Ba0mR//kAP4D+3s32uERkisbbC9HcE5M8tLFO/hCDiYDsHTp\nOv19WnQmPRVJR6ZlJh5vUIjVaORzzBwbQW82IDr7KFXa1BpdtIKAL2ClWe3tgOq1FiaNAtTyw1Tk\nnlJaY+1ncNhI5NJrtCWpJ3iSZaLXryOo1RjcboxeL5V4nOzqKu1abddSX9R+8LX/dcaNGzfw+XwE\nAoHHvZSPDSdOnPhUkZGPgtzKCttXruy6/0azWTqtFv5Dh9BoRBYW0pRKTdwONbE7d/GPjNHgLvlC\nBQUd7F0R60SAaleLUhRp1etUUym63S4olL0k4XabbqsNyMTn5pEEI4ZmmnYmg2H4KEW1BqnexKg1\nMfWlL9Ktl2krVBRVLpwuI46AHbfPysCgHb2UodHNYTfKpNfiaNRKRNok5u7hVop863f2sL6RQ2cC\njcnI9KSF7I3L1Lce0KlXUEpVRDrMfu4wGytJps4dQKMVMSq8bMTaXH07AgKMjbtR6oy0+iZY2Gqw\nfS2NQtEbfX6nJWM0qrh3L4XFosFm0zEw0DPCevHFVSYmXKjV4q7R3LtdrT9pSFKb7e0SyWQFo1FN\nKGQhFLLi85mYn08/NPWqo9EICILi4YayRjpdBYUSd5+VbrfL3L3eff7IkT4OHHBSLErcuBEjn69z\n7FiIt9/eJpWqkExWCIUs3LubZGrSyeJcFLVFh8WsoZDOMeKz8ubf3SQbz1LJCfgqJRx9Psoba+gF\nBYPnnsDkslPa2aHZaCArFLSlBjqHk06zSaNcxtTXR6fRwDowwOgXvkBubQ2N2YzB7Sa/sdHTgaTT\nqI1GmtUqok6325op7eyQW1ujvLNDq9HANjhI4OjRXzh2rbPZGLxwgeTcHOmFBZzj46h0OjqSRGp+\nHnMggN7h+MDzR0cdJJPVR7x9+vstH6jl+jB8KslIIlEhFiu/51g8XmF4+Gei1PdT2n/YcUlqE42W\nefnldRqNNhqNiEKh4P79JFarjr4+Ey67hoC1iaO5wzOnbPjHXFQXbjIV1jA8MIggd9Em7zJ49ADG\nkI/CoRH0WgVGDZgGBim3XOSK0G7VKRWVqLUa/C4bxftb6CwWWu0mRosBSWqhzG/xnT86yFtvx9g7\nbqBa7CCtbJDXdll98UVKOzH6T59E6/Jw+slpbry9ydNf3c/Keomu3czv/Ltv0YqtkS20CLrCLKVE\nitkiKrMLs8mMaPWwkW0SGvLQ7cpYbUUsJgGTQUU6IyGqRRx2DbqGAdFn580XoiSTVex2Lc98eZR2\npoQ5EKBV7QWX3f0v/wVBFHFOTCBqtbgmJylubfXKgEBxe5taPk/o+PFPVI3/ceG555771I/0/jyO\nHz/On/3Znz3uZXxs6LbbZJaXH40hkGXya2u4JiZQG43odL1sGiVdWrUGVZUN94HDKO8v0mlKeCaG\nEPsHiEfzeJFpFIvYJ6eQOzLuyQqm0ADprTiVZBy9P4xlcg8rNxZotGTCx08ha0SajRZL3/shg4k0\n9jO/wd3VKqLZyt4zfXisoGrmiby+iF2CqqTAbBBopiPoNeBw6ZHbLQZmgkitIrPDApJkotlRcuyr\n53DV19iZL9OWFWQKHdrqFrpsmuEjh7DY9aTvXydTqWIstPGVm/zhNw8QTbfptiQEpcy1KztU6l0K\nkppyucnIiJ1Uqrf5UKmUWAxKWrk0qUyHotmMd8DDuXODgIwoCgwP2xkZ+Xh9KX4ZdLsy169HWVzM\n7FZqVldznDsXJhAwc/iwn3i8gtPZS2t++eV1JiZc7NvnIRIpkU5XMJvV7N8fwGjUMDPjQa1WEouV\nGRmx8+STQ7RaHZxOPZFIEanRZsAq4fEIVI7Y0Zn1/P63DxGLFhkMW5kIKBGbeawOI5MHh9lZjdFp\nSjQSUcwWLfVoguhbb1KO7mDp78cSDBE6exad0cjOrTnahSxqkwlBrcJ34AC1XA6FSkUtl0NtMLDy\n7LM0SiUsgQDNSoVyNIr/yBFMfj9aq5VWvU5ybq5nCPewJdNttcivre1qaz4MKp2OTquF/uciOlq1\nWu/e/iFkZHDQhizLLC9nabU6DAzYGB//4Nd/GD6VZKTRaL+nTyXLvYrJu+F06tHrVdRqLTqdLuWy\nhFarQqd779vO5+tcvbpDLlfnjTci6PUqhoZsOJ16dnbKCILAnmkX7a37LL95k7Io43FqkePD+CeG\nWbn4vyN3ZUZPHiQw0Y+6lsLY0HHyS0dRVPMU8zVK2hA//fE8O4km1XKdr//OfvZODELkHsVEGiUy\nBo8Hh99NM16hIwMKgS89PciYr8vl/7aIUqWiuL1No1RBbTKh0ulYffElRr+k49BhP/pBByfPDKEx\nm0lEc8QUPuqWOsV8A5dfRzDsZnOrREsSuPRWjNPH+5g6PktxZZHwsIua0ohgcRLZzHPo+CBmsY5x\nbIrbOy2MRjUajYBGIxKPZChvb1JcuI1Kp0OWZeI3bmAKBLANDaFQKNi6dAnbQ6MbtcWCpLYRy7SR\n15IEw+73tfH/dcbzzz/PX/zFXzzuZXysOHLkCLdv30aSJDSfAZt+GXbtyh85Lsu9ygbg9RoJBMyU\ny03sA0FK+Spzax08ob0IdLiXFzB0uzwzoGXlTo6pkwfYWtwkc/cOUiZJo1AgsG8a98hx9P3DPCjb\n0e5x4DdUqCSjmGwmzAefIOQbx2jRosms8NT5YUSDEUVnm+zNbbqihmp0C93QXnxDPjzqWXLzAvVC\ngZWFGO5wEI3FxuZrV6i0BIwtAc/UFPawk8LdHbKSFqPRSbPTm3Kpl3sPjsrGBp14HKPRhCTVqNbq\nCPFFQv5xpK5APZthY2GLbrWEoNGiNtsBBSaTmkajTZ9Vpmurc31uHVkGpapXGTp2YYZjx3qj/o97\nI9Frk+cfeQbs7JS4di3K4mKvKhIImFGpBNbXe6+LRksIgpJvfWsP6+s53G4jxWKDtbUC169Habc7\nnD0bJhar4PEYGBqyUSw2GBtzMGirc+uFK2x02+w9OobJq8fo9WJQu1C1q1z7/rNUFBKyQqC2tcbY\nnjEK2zt4x4exBzxEyhKa2XPoJiu0thZAqaSLkuAT5xGMZuqpBHKnl1JtHx2lkkyyc/kyq889h2fv\nXhyjoyz96EcoBBFzfxhTMITc7WJwONA7HFQzGZqVynuuU+Ud5+uPgHf0Iu+GqNUi/gIRqyAoGR11\nMjzsoNuV/0Wtu8dJRp4G/j2QAU79MifabLpHSosAarXwHsGM223g6NEAN27EWFhII8u9/IE7dxLU\n620mJ38m7FlYSJNMVul2ZbrdnjgzEikyOGjHaFTT6XRx6prcub9EOpbF51QTX0mR2Ihx8psmnvzO\nN9he2sTt0DL/t/8PRouRRj5L3759HPntf0VZsPJf/3GTUq6K3WpAb9Ty1mtL7P3DWcITAbQGDaXt\nbXx7Z0hn6rz5wh0OfO0pqJaIpCQ89hDhs6cprq8TvXWLdkfG3h/EPbOX5PI6gqjCaLPQzUcI7w+Q\nTeaoNAW05QS5WzewqWHy+AwFfYhWy8zGepapCRfdyAL/+Ldv0+dWo1K26Z+dZvqJwxw4a8SgaqM2\nGEhXRRI319BoxF3RYL2lRCl1adfr6Ox2ipEIyHIv9bjVQtRoaBQKyLKM2mJlq2xk7uYG9VqT4JaC\nPQebHDrkR6X6dAheM5kMCwsLnDr1S31Vf+1hNBoZGxvj1q1bHDt27HEv518MQRR76dq5HO9+Wpn9\n/t1EUp1OxcmTIba2CigkHZEHUY6fDHH7RpRorILV62DQrUdpsuE8dJKWWsn85Xu0cxnsVj2mfivN\nVoexUyf44fduUKtucuYLe+jEEnTVKt6erxOLNakmJPpGvZy5ME5l7TqJlS1kvZWW2kzoyB68Y3u4\n+jff595LVzj6W5/H6Quhtdk4MLkfSann5k9fJ7hnhDdeuk8hW0b38l2+8Mf/ilxdR0fUEklUMdpc\nNKolDP4ASkGg3WhQjsdBmcQSGqBdryLWs/icUG93ef21Fco1JY1iE0Msjt/jJhAwEQpZkGUo3H6L\nfnONzrFBNlazdLsyA16RiVHrYych76DZ7NBsdh75+8pKFq1WRKcTuXEjzvZ2mYkJB0qlEoNBxRtv\nbBONllCrBcJhK6IIXq+JN96IUKm0OHDAx9///Tw2m45z5wbY2irQ12fCYlbxYDVDWWFmbI8PW78H\nrUFPc3uV/PoS5Y1VCvEyYtCNbWgY/54JlM0Kw4dnsA4Pk25b+OEP7pDfjqMSFRx+YpqR2RDp2zfp\ntNpYA35qiVjP2A0o/PjHBI4fRyGKyJ0O2eVlzKEQY1/5Gp1WG8fsIaSOQIf6bvaX2mBA1Ot3jc3e\ngd7pRO52KUWjlKJRBFHEHAy+b7XE4HajEARiN28iqtWYQyG8s7PvqZZ8EP65OpF343GSkSvAXuDl\nX/ZEj8fA/v0+7t1LUa+30GpFpqbceL3vDWYbHrb3HohqJaCgUmlSLErU6wn6+oxYrTparU4vVror\nEwpZGB93EImUqNVaD/uJfjKZGo1KleROFhUddGoFW1tFHG4La7eW2XPhOPv6g9z5T/8RpaCi0+7Q\nlSTWXnqJ0BPnaLkdDI/YEWixcGMNrUrL4VkH9e0NclUl9r2HsY7PEL1+g0zbyOyXziPpPfzj39xC\n0GiYe1Dld377AkN70nQAWVDjnZlhcyWBemgP2pE9bCSaaN0+ggorhUaNsCHHa5d+jJQrkcuXWb/0\nBie+9WWmDn0ehdxmwKfm4r9/i8x2CmXXTrtapt28R/+YH8WR85jtRvQmDVR7gWTvzPQDFMttwpMT\nxLfu06xUMPp8FCMRjG73bh6BOdSz6m6obdy+tkqjJqE2GekKahYXM/j95t2As193XLx4kbNnz34m\nqgc/jxMnTnD58uXPBBkBcI6P02k2KWxsIMsypr6+3fCwd2AyaZie7t2ULW47qecXOXpGTzYvkU0U\nqRUrPLi9jqDRULcpqGaylHcSFFJatAYtCkHAczxDajPJqaf3sfTCayTSEsGDs7z9wtuYPG5c0wco\n1SrMzWcZ0ekQAuPcupdjZ2kZ10aHg6d6InetVuTmxWsIehOnv3iAwN4Ztu4sYQiP0dWYSEVuozIa\nadbrtLMx5retnH7yPLeefQOrs5+x/cN4pycQpRLi6iru6WkEjY5KJos94EVns5B8+UeoA8N4R6dI\nvLlApdqlUm6gVivp6zNj0XbJrqyQuH6VYiSCd2KCgaNDKAQRnSjRqVVYWmoiSW3cbgNer/GxkROz\nWYPRqN61GiiVJOr1Dj6fCYtFTTRa4e7dJBqNwJ49Lur1Nul0lUKhQSZT4+bNGN/85gx6vcjcXJLT\np/uJRAq7FfdMprYbvOe0q3nlufso5DahiQHuLEs4HQritzYZmxqEzTUMjQSh8UOodRrK21vYx8Yw\nhAYpVOHVl9fQ9/VTl5SotWpSsotcXdlzSZVqzP3nn1LY2MDk8yJodQhKBfHbt/Hu28fmK6/QrNbI\nb0ZIr28z+sWn2Uy0Wbl5nxNnR9DabECvzeLZs4fotWu7xnA6ux3n+DjpxUWi167tjq1nlpYYOHsW\n87t0b3K3S2p+Hp3dTvjMGZq1GnqHA7Pf/4l+xo+TjBR+8UveHwqFgj17PASDZiqVFnq96kNV9vF4\nhUzmUSFrtdqkXG5iteoQRSVutwGlUsH8fAqNRuTAAR/tdgeDQcWxYwE6HZnIUoT9h/vZurdKbDMJ\nXZl2OzI3AAAgAElEQVR6VcIxMkytXENnlCklM6j0WlQqJZIsEzz/JPfjatYfpLhzLYJSqWDfyQns\nGonI65cIz9jYvhMlG89w5Pd+h+mv/xZrKZlKrsLcXBytGqRmg8hKgu//XY2v/+5xgk99jfjdee68\nucTLLyzRPzNCxNYglyrRoIHF68LqNBG7fJG1q3N0OjIoBVAoWXnjKof3HeXOXIrpgT5MRpG8SolC\nqWAg7MBuFcmnikTvp1lZyfHEE2HcbgNut4FE4melQI1GwDk0gOaJJ6hnMhg9nl6FZHMTUa1GbTLR\nd/AgjUKB9FZPpKs2GbGFwwgqFZ2OTC5X/9SQkeeee+4zM9L78zh+/Djf+973+JM/+ZPHvZSPBSqd\njsCRI7gmJ5G73Ue8Fd4PgaCV008Mc+faOuVqG3/AjFkHm/Pr6M0GxkZH0BqNtJ0upGqd9HYKe58T\ns93AwMwwjVyOlfkIjoF+VtdyVNtq6okShv4mar2FpXs7TH9liK2lDMViHJ3FhMFiJp8qkEjWsLqt\nFKoKysUab72xxvmJgyiHZll68x/o7yshatUUkxlC/Ta6jQa1aoO1jIOBs2dBoeBWRub6//ICx08N\n8cT5L7Pyg++x+PwPcXosNEolhp/8HN5DR+jUKhze6yObyFPMNwhOj3LgQB9er4GtS5eoJBLonU6y\ny8skbt/GVixi9vup6i3ElyusbPR0elqtwIkjXqzKMvVsFq3NhjkQ+MQm6SwWLfv3+7h1K95zPdWK\nHDzoI5mscOtWmaEhG8PDdrrdLuGwjfX1ng/JO7EfExNO7HYt4+MORkcdCEKviNbzrOmNs3Y6XWq1\nJtFGG6vbxuGTA2ynWrz11jpGgwptJYMzPIB3cASNRsXqixcRRSVSuUxhfZ3g2XPEOh4e3FnH7TVT\nbSpoyU02r88RNA4zNhCmUS4jAy2pgcHlQqlUINNrj9gGB5n+xjfIrG9QrXUYODeEoX+YN398H7XB\njHZo+pGRXefYGFqrlWoqhaBSYfT5UKpUpBcWdokI9HQg6cXFR8hILZOhtL1Nu9FAIQgoRZFKMklu\nbW3XefuTwKdSM/IOrFYdJpOGfL5n92yzvb9NscXy3t3su1sOCoUCjUbglVc2yOcb+HxG4vEKhw71\n0ddnIhrtCZskwcDoqYMsXV9Cb9RiG7LTf2AaSyjEyLgTSlk8YT+NQh61Tovs8dB2j7O4UqbYahIY\n9pJPFRH1ekLmGpYJK63tFdau3qXdhfnv/4AD3x1keaNDPlnAYlHzr//gCGubZebuxOl2Zd6+so1W\nrjM1vp99U9Moh/eTl1RUGkpEsw2v2Yha0Ual6KJExmg1kcvVaNYktFoRrajAqBdRdRusrmSY2NvP\n0KANvUGDoppFARgHhokVGrRaXZLJntnRqVMhlpYyxGJl7HYdExNObEYlzYiJdq1Go1TCPTXFwJkz\n6BwO9HY7OnuvKiWZE/i2FSjUOgTVO9ecT8yj4F+KbrfLCy+8wJ//+Z8/7qX8SnDixAm++93vfiRf\ngV8l5IdtlY9rDe/nS/HzqFQkNjby3LuXYnsxQa0BOq0Sk1pJq9VGUKlw9VmZeuIwi69fp1SoYrQa\nOfTl06RXNuj3aDBoRCw2AzqdgGhRUynVQJZpSB2Uqg7Hz47g9ZtYvL1Ou5SnmEii0ojsOXKBaF8f\nA/1mKhWJ1Y0SDr8TCTVv30wze3wUZSWN267G67Dj8pgptVQoGmX2zYxQTBX46ffexuBw0D89zHqy\ng/9uhHymjM4/QNdswD/jIraRwHPwOKUH96ks3OILv3GAdENDpS2yuJghl6ngF7S063VMfX3YR0bI\nr69TS6dxjo1BcJyttdruNTMbBJYuvopNLqDRCKBQYAkG6T9z5iMZZX0cGBtz4vEYKJUk0ukazz+/\nytJShlary6uvbnD+/CCnT4dYXc3hcPSGDw4c8FGrtbh0aYsHD3I0Gm2++c09JJMVBEFJKlXF5dIj\niko0GoEjRwLk83W8rsMEAwb+7795ARkFNoeZXKTBT//xFv/T/3yWKhLLP/0J5tAAstqE3hdg4+JF\nJr/9PxKYGqKSKWAP+RHo4A062Ht+GEV2G7odXGMjbFy8SDkQoJbLYwsFMPn9qCxW9EOT+PyDFIsS\napePTNdC4IybiiSQU7y3fWL0eB5pwdRyOTrSz9xV3/ESkbtdCpub6BwONCYT3W6358lDL0yv8/DP\nj5z7CeCTICMe4O9/7liCj5Br893vfhertbdzHh8f5+jRowwMDACwublJpSIRj4skEhUajQwul4EL\nF/ZjMKjZ3NwEYGBggP5+K/fuLZPPN9BonAiCAodDolpNAWGKxQavvnqHcjlNtaonFivTbGZRq8to\nNFNkMjUSiSgmk4qqOczX//zfMn9vkWxeYrViop7u0G0vIRdTjDz9eZZ+8APysozt4EGq5gDNikA8\nEUVZyJHNqvGGHMguCa1dSX2rjifsIy9oEIYGWZmPYjN4MTkLLF6ZZ/X5IgeOhjl1vI/bD5qYbToc\nOhVLsQyBIS81g4pUrkqXMm6viXpNyeKDIo5SHvvoMIGwE0jTNNgxW7UMHZpE7/Hg99wilSgyNTLJ\ng9eu0Cjl0BmNHD11kKrWTWlnBwBJ6rksFotJfD44cmSCYrHBG2/Mkc83mBwbwj8bJp2L09Hr8e/b\nh0Kh6F3/UomBgQECYRe+gU2i0QICThQKsFgadDo5wL77ef664tatW9hsNsLh8ONeyq8EoVAItVrN\n2toaw78g5vtXhYWFNCsrvRCwkRE7IyOOX7meqN3ucOtWnJWVHK+/voXdINPOJVEbDZhNbs59YQ++\ngJ3ClZfo87kI/dv/jnJJwuYys3N/hcvPXqfZhqd+8xD+fhdX3o6w93NevCE39baC2cP9tDfvo4lv\n8eDBNuqGiemTe7hzw4IYGOT2YoX+/XvZunUTQaPlyKlh3FNTxCUFT14YJNg3RebmNZR0KZS7mMJD\nbKfbXPjcIIpcjKuvrFKqwep2HLWxTFdQM+mz0kZDvKqhkmzgKORQ1Ms41lN0ZAvhkVE2ijqu3epl\nupTLTTqtJueOu5gJDdFIbeLZswfPnj2o9Hr8R47wxvUszWbPZUihAJOiwoO7D9CP2npkRJbJb0Ww\nRaM4PsHvj9Wqw2LRMjfXE2rq9SpKJQmdTkW53HxoDy9Tq7U4dSpEu93h7/5uHoNBhdGo4o03IszM\neDh4sI9UqsrXvjbBwkKa0VEHktTm9u04t24l0GoFnnlmDN9QH8l4hXKti9YXIpdLkKspMBmMTH7p\nN6g0IF9qkigq6BsaQimVmZ3tY3nVSG47hlZoc/xEP5EXfkJq6QGiANNfeooj/8Mfk1pcoLm9g6DR\n4BifJF3X0XENIzdqNIQmr9wuUyqn6XS6OBz6j2QopjGb0VgstGo9Iql3ucivriKVyxQjETRmM4Gj\nRzF6vejsdqrvErwqlEosv0TI3ceBT4KMJIEn/jkn/of/8B8+8N/6+/t57bVNNjZyD49YSaXg/v00\nhw/7d0kL9IzLvvzlo2xv95TnbrdhV20NvTZOsaij27Xi86nZ2SmRy4l4PLrd3VqtZuD48TA7O2Vi\n8RarCRudpoTJomd7aZvt3DYjxgIth4mZf/P70Gpi8HhYzuj40VtzRKIq2q025Uwcm1nNV48NkF26\nQ7FWx+x1YxK1aI0OVrcKHDvjZWMlhcegpyAlaRRLJNayHPz8k4wFFJDewe/WYjarCZ7185//dh6z\n1cv8fIZ2PU8qIjC+tx/9niGO/ve/x/ILF2lVK3jGR/AePgaZLU4M6dEHJrmzUGTkiZOoaCNarEQ6\nViySEo3GidWqQa8X2dwsIAg2XC4D1WqTV1/dJJNRASpu382yYdXw5JP7H8kjePf1V6tFnn76ENFo\niWy2jtWqJRAwoder3/f1v274LLdo3sHx48e5fPnyYyMjb721vatJSqdrtFpd9u79cMOmfylyuTqd\njszWVpFORyZfU2Ky9WEygahS0ec1IG3MYw2FKOzEubtSZyNWp3/PKHLXjn5ogqBNizI4yojJTanz\nJvm1Nb76jePYh0fQlHZIbSXQdJXcu/oAg8tDy9TCPznC5asp7I4KJ799gsNPTFLN5hEUIGpVpG7e\nZelyAs9vnWLgyF4cQ/3Eo0VWFhL0WZQM2+qUYnGeOB3EvCzx1lvbSG2ZeCxHtePBaDKTLeyAQqDV\n7BAI9xGYHqUpCxgHAqQuRdHpVEQixYcaXyVzd9PoMDHmslLPZ1AIAq7JSXQ2G1ZrDR5aHgqCkk6j\ngaCQ0WrFnj18rEypLNFy7xA2eHYTuz8JyDJ0OjIulwGLRUO93iKRqCLLXSSpjd2uRalUMD7uZG0t\nx9SUm2azTanUJJer8+BBFlmW+clPVpicdLJnjwe/38QLL6ySSlXR6UTq9RaFgoTNpiMSKdHJ16Al\nse/gDN4BH0p9jehKhFIuTSmRwTDST1fjQak3EWoWcE2pKIaDjM6E2XjhWQSjhdDBvVR3tlj+8U84\n8sd/hMpgIHjsGDqbDamrQqjnyW7nSGZbVDBi0KvRCG3GRq2YjCr6+n5xS0wQRfyHD5N4sE69o6Ih\nNWkrNtE5nSDLSMUi0evXGf3iFwkcPUrsxg3quRxKUcQxOor1E74nP842zQHgfwWmgReBLwEfuS5U\nLkuPaBjewdZWgX37PKjVj741s1nD1NS7LM1leTdAq9XqEA5b2dkpAT323+nIBAJmOp2fjQlqNCL7\n9/v44Q+LuPy9nVsqmiW7FaUUiTDyuTCLL73K9o07zH7xNHq3G7tWwu23c38hS7vZwmAxMTHlpdNV\noLE7aZQrxNejBA8fYuTcGViIkbt5mdyd23iGBvB9YZZOOY/VqmF2TM0L/9v/idcuUkkk0OjUjD3z\nVZ45HSLTtbBwd4e21GKj1MIWbKJ8UGDmG8cZOr6fYq5Mtdbh/rMXEbMR4qvbOPcdxOkb5/nn1mi1\nu+w9NoLBrccC2GxaBgdtXL68TakkoVQq8HgMjI46yWZrj1zbQkEikah+aDiSVisyNGRnaOijfsK/\nPnj++ec/U14c74fTp09z6dIlfvd3f/ex/P53i6O7XZmVlSzj485faPn+z0Gt1mRpKcvdu0mazQ56\nverhQ6dNvgwagxEFMlI2TbtWQ263sew7Am9H6bPpqQtGEokC82tqhoetiGsl7i6W2Hf0DKMGGZNJ\nS+zGVXTFLeIbCQS1jnJJIpNeo39Wx8kzw+htNg7M2Khv3efmj++ys7yFp99HMZ3FMzqMf7CP1Rdf\nwqTp0lGKWCdn6TSqWIU6az+5QyqeQ+cfQFHUMLt/nPtrVQI6HR2DHdvENAOpOsVskYMnhlA6A9xe\nayF1OrgreYaG7OzslB8ZjdVYLQgmE2qHBZWo6JX8H+oFRkbsJBI94692u4vGYiE80ruXrq5mKZea\niBoVNVnHa69tcuHC0AdGbnzcUCoVDA3ZSKerqNXiw/u+AqtVi16v4saNGKKoJBi0YLVqqdXa5PM1\narU2Ol2vklIqNUkmK9TrLQYGbMzPp8nnJVqtLrlcHZWoZG0tx8iInUpJQu52MIoSs1M2pEYDldqE\ne8BHaW0FRbOOWtnBv2eC+EqEnRu3CA66GZjZRyWboyrr6FQy6LtV9HY7BreXlRdfInP/Ht1mk6Pf\n/S5Svcza9bvcvBGjVJLw9HsxTx/AHtRhamUYNJswtzLAe1s17XbnoZdKFYuyTO7+PVbvR0ApYPIH\nqAthpkIa2skIAM1ymUahgMnnY+jzn0cqFBA0mo/U4vy48TjJyE3gwj/3ZFFUvq9PhVotoFR++Kxz\ntdrk+vUYOzulh5M2AqOjDur1FltbRUZGHIyM2BketlEs9vhRMGjGYuk5h5pM6t2qSjVfQqHWojXq\nkds9dXetXKNZ7fVf6w/WePJzYRRSlVy2wtCwiwOTBq794EccOtLPgX/ze9TKdVI7GdSyRHl1gUYi\nSmo9Qn4nxtDhGZwDflS0aWaT2FQSykadSr5MPqtEfP0ylpk2Wt8gRruF+HaBitSlWu2lKZ45049k\n01FuGmmu3cBlAllhRqo56Bod/NP/e4kKRtKxHNFEnad/+ygzT09is2l4/fXI7vvvdGRisQoKheIR\nJfs7aLc7fBaRy+W4d+8ep0+fftxL+ZXi3Llz/OVf/uVj1428g05HfmQj8HFBlmVu3oyzuJih2eyw\ntpYjGDSj1Yo0mx1kuResNzphRpm/37PVttkori2jjEYw+4dJlruoFS36gyZaUguDQY3VJDB/ZQGN\nSom1EaFeKLDvQIhaeRNLn5Xw/inyWxHSkTi1bIbBkJHl169hNYosX5lDqVRQESSMTieNYhGDtsv2\nm29hMmuQzW7y8Syf/4N/zd2/+6+o9Dqq6Fm+8gCD3cbg+BDFuonjZ0e5ej2OGPRy4ve+jl7VpVyX\nebDTQVQJGFQC1WqLcrlJX59x1zhSEBTMzPhw6SvklxfolvPk19cpx2IMnDmDzW7nc58Lk0xWabW6\nOOwaJK/MgzdvUC430Rp1BPZNU+zoKZebxGKlT4yMQM8FtNFos7bWS44dGbEzMGDl2rUd+vutiKKS\nO3cSDA/b0Wp7+S0qlRIQOHRoAKtViyxPsrKSpVisMzBgRaGQ0elUpFI1ut0O0WiJ73znAOGwBSVd\nwq4u2mYGUk0Sy0skF5fpP3mcaZeDSkfF9maW8PEjZCUDLZNAQVJhMynYfP0Nits7CHKTPqcatU7N\nxFeeYfvSq/QdOoTB7SZ3Z55yqUH3YcZM9P4D9h8bIrF0j5WtLZRBNVmPC93v//57BKa3bye4ezeJ\nz65k684bLN3ZQqUS0GlFcls7+A4dYTMhMGgy0qxUENTqXUdsQRQ/8ijvrwKfWgGrXq9mdNTBjRux\n3V2VKCoZH3d+oPHKOzfa+/fTPHiQ3T1eKklIUpupKRehkBWrVYPRqCIarWCxaOnvtzA9/bOqysiI\ng+3tEs1mB6vDQCMrcuw3jiFGbqLW67D63fSfOoFjeBilKJK+n8GubyN2RMqZLLmVLKpanvU3EijV\nImZ/AIXWSGJlC4XcRWt34ur3UcsXKEUiBGcmMDksZHbS2AeCxO4vIXUUVKpt7lxdZW//DDqiSA0N\nDo+FgK43b98zbCtx9WqUQJ+B8p0NmqU8I0NWvEMa3l7N0ChX0TitPYMbtZpUoozZrKbb7V2Xn0cu\nV8fp1D9CRnQ6EZfrs5lJ8+KLL3Lq1Cm0n1IL+4+K8fFxWq3WY9WNvBvBoOWRNt7HhUKhQSTSazmo\n1QJ9fSZUKoELFwaJx3uV1uPHgwz4tSSuRhFUKrbefJNqNk8hJbL29ibhvaPUZDdyvc3nnh5nIKDH\nZRP54X+6i97nod1oUk5lCRz4MhuraVZXs+SyNSb2DvLUl0/TtPgxiG3uvFihKvYyVWx2HXq9CqvT\ngmVggPzSIqIIkiTTrneIbEaYTKXpiDqS6zGqTR2tZptUoohuZYOueoQrb+/gcBroH7Dx45c3GRqy\nMzeXoN2WGRy04vf3fFa0WoHpaRfpdB2QGR114LaLNBfvUdlYQCr1KsTlnR30Dgf9p0+j16sJh3/2\neciO/bR0DrrBGB2lmkJTSz7/s43Lx4FOp0sqVaVeb2M0qnC5DO9LlDUakUOH/IyPO3efBd///gK3\nbsURRSVjY07Gx51Uq02+8IVh7t1LUau1aDTaKBTw1399heFhB4cPB7h1K8bnPz/MwICVRKLC8LCN\n1dUs58+HuXhxjWS8xOxeN9HVOFMTdiKXXsXps6Fp5Fl5/Qr5fI2+6SlKHS0NnZe5uwnazSY2l5UL\nJ52YDQoyDYmO3CKXbeHpU2EJBhh5+mlUZjMolWiNeozGBk6ngXJRwu0xUFpbopGXcFhUdOpVipE6\nyfn5R8jIz9pOoOlUiaVyFIsSGk2PjLTaQKNMtiUw6tLSqtdxjI6iezgi/LjxqSUjAFNTLrRakbW1\nHIKgZHjYTjj83lHRej5PdnmZciyGPtDPyv02737rKpXwMG/BiSzLmM0aHA49zWabbpf3xJQHgxYu\nXBhkZSXHllpJKGjGY+4iaSexDA7hCrrw7Jmm3WiQvn+f+vU5hixmqkY1rqCHfp+OiqGElMug93jY\nSUjEM1UMAYG1jSLlTIF9M0M4KnmatQquiXFsY+NkX3iDZHqJ1aUkokaFyaTDZHeRSlYZ9bp45ivj\nXLsWe5jLAKdPhx6avUGzDQa3k+xOkkKpRf9YAOV6jNCwB6UniNFVw2bT4+/rebVotSJaba90/W70\n9ZkYG+sJvMrlJgaDmpkZDx7Pez1ePgv44Q9/+JnKbfkgKBQKzp8/z8svv/xYyMj4uHO3TRoImJiZ\n+cU21v8cdDry7gOrWm0+1ALAiy+uMTTUi4uvVJooRCNdR4hcPEVLqcfoUjJs11FuJMls7bDnqVFy\npS6Re6uINTsjM/2c/9oRHiwmCY/NElfWKdfBMH0EW/c+oQMWFEY7L99ucO6cjJYGh/Z7sQd9GJp5\nyokEKys5Rmx9mFQ6VCYTGlGB3uOkWKwzMjtCsdJBMnhoqmvYTSqabZluF0J7J0juGHA6DVy4EOaV\nVzbw9xnx2sB01MuNOxkSiQputwGVSsBs1nLwoJ/+fgs7O2WKxQYhr8DmpW1q6fTutaokEiTv3aP/\nfaqCCoUCq99L+l7lYfW0R0Q0GuF9/Z5+WTSbba5fj7GykqPZ7KDVikxPu5md9X5g5e6d6bw334w8\n9KBqI4pKfvKTB8RiZfr7LXQ6MgaDmlSqyt27KbRakaeeGiESKaDVCnzrWzN02x1Ghm14vSamprr8\n5m9OoFYrERQyalFG2W0ze24/+0b13Ny5hyU8SKtawdBS4CxX8e2dZm01RyoSZ3tuEZ3FhFKlotly\nYQ/4EXRGSvEkNqcRg7JB9MoV1i5eZPLrX8ccCFBLJunv7zzMB9KiaJQxOyx02jmsohKtwYUl2HPD\n7bRaCKpeRpAktR9W9x5OpaFArRZ2409UWi1GtweL3YNlQMC7bx/mUOhf/Fl9XPhUkxGVSmB8vMd6\nPwitep3Im29SiccB6MhQi8s0tc5dBzvoiSzd7t5YVzJZpVjModeLOJ3vv+Mvl5tsbhaQpC6ZfJOd\njSJHZkO4LeCfGkNnsRC9u8D8G7cpra0gizr0Kh02S5FKVUFu/i7ZyA7VphLL5Cz+vftpWhxI7Tmy\nxQ5b0TpjITMGt4voeox4SaCq96HvH8Ee2iG9lcDgMjH2xEmuXo9z5KtDxKMSFouG4WE7zWab+bkY\nfS4ViY0YcanM5NgotmSaer2O3Gqx98QE9RtJuq0GFrcCUdNlcMKPzaZDEJRMTrq4di26+2U2GtVM\nTrrw+Uy4XAYqlR4Z+Xmy9lmBJEk8//zz/PVf//XjXsongvPnz/Pss8/y7W9/+xP/3adP91MsNpDl\nnuD8VwWbTYvbbWBzs0AkUsTtNnD1ahSzWcPdu0kSiQpKZYDt1STrt+apZPJQrXDkWD/GVoaBfgtS\nq8vQiJPctR0aUpuRCS/p7SQ+r5FQ0EKjXCEUfJqNTIe17QrqwB5K3SbRhW0OHQsjb81x7cYKa1du\n0jc6wL6nTvKj/+s5lPouBn8QvT9EeiOGaWya1RtL6B0OsskuiqIObd8gtXsPqOUaeLwmzIEApmCI\nSbOSmRkPdruO2TE9W2/fYPlWjFDYyf5QiLWikXZbxmgUdjdxwaCVYLC3eatmMkQU761oCGo1bUl6\n38A1i0XLiRMhbt+O706xTE+7PxYBayxWYWkpQ6cj0253qNVk7t1L4vebPnTjU6s1iUZLOBw6ms0O\nDx5kKZebLC9nmZlx8/zzq0xPu7lxI0Y8XsFs1hAImAkGLeTzDer1Jt/7/+5TLjex2Ax4fUb0Bg1j\nYw7CYSsXngih04lsx2psJxoo9GZ0Bh1yu8X9//YT6uUy3XqFwVPneP16jlypSzefJbKZ48tfP4jJ\n7SCWrCKbHFgCTsR6Dp3Lxf4/+AMGPvckLaMHfXicVmMOh6DE4TQgmKwIooiQfw1rOEw1mSS7tESr\nVsPU14drYgKlIGCxaDCZ1ORyDRpKI0aPC3+jRSHf89gyO60YgyHG9oXxej95TcgvwmfzKfIuVFOp\nR0aW2pUyI2Efc2sVeEhGlEoFo6M96+DLlyMkElXW1/PEYmXGxhw89dQIIyP2XUbeaLSZn0/t2tGr\n1QItrZZsXc3ktJ12vUZbkli5s0apocI5McnW7UUMqjIm4wCRK29TLtbp2IOY1Srq1TpqlZkfPxvl\nS184S3D+NsN+NYJKgWwNsHpriZazw81rEU5+7Qx7/3ACoZ6nVKjTUakYOBaipXdw+/Z9QEG12kRb\nz1De2UaYDjAc1BLPZllelhk6doZhL1gtGsION/qBHEv3duh2wR/2cOzkwK4WZ3LShcWiJR4vo1Ip\n8fvNu+2Yd/u0fFbx6quvMjk5ifcXxHB/VnD+/Hn+9E//lG63+wt1V78KvKPJ+lVCEJQcPuyn3e6y\nuprD5dJjMPQ0YJVKk0ajTb0q8eaL9/HoJIJjITQ1LW1ELOFBmmKKRFqi2NRiGQgzHehSWp5j4eoW\n9Vobz2AfwxfOU5RUlPIJNmMxgmGBTjyGUyvB9n1inQJSU0DrC1EuVNi4s8SX/t0f0RG0ZGsCy9kG\n7gMnMdV2KDUETIEAsaaDVy6ncdjUHDp3rvf/sd/N5laO7QfbjM8MMGBtYDAoWVid485rdyiVJDaW\nYoSHY5z/5jNIWgvBoJVw+L0mcGqDAe/sbC/npNzTkpiDQWzhMArhg0esAwEzXq+BcrmJTqf62DYm\n2WyNSqVJLFamUGigVvcqLsWi9KFkRBSVqFTCbitZktqIogKHo9cGSyarjIy0CQTMCHKnF5YoSQiC\nklarQ1vqsLyYIhR2sLWZo1Yooui0mB4/gs6mR9Tr+fsfLFKttjh0wMPw6BjF7U3iN2/g2zOF3mHD\n4PEy99JVFKZBmlKTdktGUIvkcjX6Tz9BR32VVqVCX8BC38HfxNzXR1NjYWVui+byIqLJjG3sCBDV\nyCIAACAASURBVE5TF61Bh9HrpRyPIyi6JO/epbS9vZsZE7t2DbVej21wEL1ezcGDfq5e3SFdahE6\ncIS+wQjUi6DW45qexjXY/5HGgh8HPttPE3omLu8OzupIEg5dkdNnJklUepkzw8MOhoZsRCJFlpdz\nLC9neOutns/GwkKaSqXF178+iSgqKRYl9HqRSkVClmXK8TiFzU1K29s0+t2M6oZRdNvkIjFsPhft\ngJFGfJuhPf2YfV4EtYjKaKaSqLC+EgeNDt9IP914hma5QhcrzpAPUSyzNf8AU1+bwZkhck0tOrFL\nPFrmeraDQqGlP+RmYtyDqd6GbherRYvLraddyJC4twDtJmLHQfHBOiabl05bg85sIjTbv0skTrod\n7JkN0m53sVq1j4iCFQoFgYCZQMD8yX5ovyb4p3/6J77yla887mV8YggGg9hsNubm5pj9Ofv0zxJ6\n+SNhRFEBKLBYUmSzvd2j1aolnqigVomEx3wI+R22bs/xIJVEODvFyOnDTH1hgrrGwX6dgvgrP6W4\ns41JC5VSh8xOCtNWkjfuNRjziyjqRRbejOL3qLE5VGjUXfKrCTRWF22VjobWjv3/Z+89g+Q4r7vf\nX/fknPPuzOaEsMgEwJwpKvmVr2RJVr1OJdmSryzLZd2SZVt6ZZe/yFWW6y2VZdnWdb2uUskqOcm6\nFCVmUARJgCDyZmyOk/P0zPTM9P0wwBCLBUASALkAyF8Vi9iZ2d7T093Pc57nnPM/A0NkYynmZ2KE\nuoI4tQYmxpMMbe9EM2QGn5+X//UMNSpUyzom9QbquRQuv4tIl5twrYYmM0bunI283kR2bg6f14gk\nyVQqdVaXMuSXl1B3Ojl3rin2dccdbeu+E43BgKu/H0GlopzJoNJo0JjNWNvaUKmvPk2o1aprahl/\nOS5USVarNcbGEuTzVQQBikWZarWOLF89UV6rVdPf7yKdviAhYEWlErnrrnbK5RqplMTKSp6BTiPn\nXh+jWq7SEzHS3emkb7iDeKzI4FY/TpeZSjpFeiGNUleYOTOLoNFSLodbi9DTp6O03efHWktiDwUR\nzXZimTr52WWMBjPmiAsFMNn0fOTTB3GbZKZPTBDu7cJqEtBaregtFkSzg9d//BTzJ8aRK1Wsbgft\nB/Zh29WLnhK587k7vuFhkpOTOHt60NntKPU66dlZVFotGpMJk9dLR4cdl8tAJlNGrRZxu7cjNOqo\ntNqbIjH9atz2zoje6URrsbS8fYB6qUh3t4Odl2QiR6NFymWZ8fE3kltLpRqJRIlDh+aw2w2kUhIe\nT9PrrkslyrFV1I0K9UoZj0vH6mtHmjLo2TT1YomVlw6xNrNMOlWibWsPj/4//zcLY4tYQiJurUw8\nKRNPVXh0uB1nSKJ09gg+p4a1iXOsHh+hnlgj1G6nVi/j8FhYnouxklSw2I30PNzNHfuCSCuL5PNJ\nguYSibUS1bVFSokEyBJ+YztE53D4Tey4axeRHd4NOxpvd0WqKApyqYRKp3vTgepWpdFo8JOf/IQX\nX3xxs015V3nsscd48sknb2tnBJrN8oJBK5OTSXp6nGQyK6hUzfJ1u12PUvFCOcGhfzuESq3C7fEg\n6nRU83m8HUHUBgOrJ08SPXmCYiyGyeEhFPZhD0dIZUu49HVGfn6IA7u7WY1bsHqdbIlocDQSvPTK\nKyiZMkN7hnFEOpAWp0jkBWLzKRZ/8VPCO7ew55FHSKZLnHhliqE7DZTKdeIpiZ4eHWqjGYEGC7MJ\njj97jLokEeoO8PCHXditWlIrcUw6A4MDbqRyjXS6zMpqEZ2xiNNp4Ny5FH19rg0OhKuvD0EQSM/P\ng6Lg7O7G+S7W4mezZV54YY5YrEhXlwONRiSbLZ9fJAkMDropleQ3Pc7AgButVsX4eAKzWYvPZ0YU\nYXExx4EDbTQqErOvT/LYY71orXZCIRNWq4Ezp1fR6FTo9FoK+TJOl5G1bBqnx4zLoWNpJY8auZVz\nJAowf24NR8SJyeOhEIthrckoBhuuLhfqTge/9jv3YjZp8JiqHP7BTyml84xXMrRZJAZ/9VcRtm9H\nypVYOjmCUqtjMog0ihnKkydYq2eI51ZBUdCazfiGh7EEg9QrFaR0mtTUFLVyGYPDweLhw7gHB/EM\nDmKx6C5Rt741xuhbw8rrwGC3037wIKsnTlDN5VAbDHi3bMESCGz4rNmsPS+ic7G2iApQiMVKrUk7\nkynT0WFHlBRKDT3FeJ49u/bhtqtYefYonqEhTD4Ls889T0XrwBBSoXZWqNTUzEys0HfvfuZfO45g\nyFFvpOm9ew+nJvJ0exXU6jJKchWHXY8SNqNSlamm4ugENb/yawdJNFzEkhV0GhWFZIrUApTGTxJL\n1RjsDDMXrbMUl7HYjWzd1glzp0hPjKG3mrEYRPTm60suKyUSrJ06RSkeb32Xju7um97rfrscOXIE\np9NJb2/vZpvyrvKhD32Ib3zjG3zta1/bbFPecYaGPBiNGgIBC/t2e6GQwiDKWEJ2XlEaLD57klq9\nQb0BJpuJfEWFLJUpxmJI6TS5xUUMLhcNWcbW0UZ+dRX5XByVMUCPv5O8UcvxnzyDO+TGYuulp3sb\nGo2TO37n18nLOvIVEY3bRHZxEbtNwdCuIY0ZSzWBoxFH57QQ6g1x8vUFdu1pY365iFWvYDBq8UeC\nnH7yBRBEanKN+fFFxoc6uT/spnv3AEeeHSFf05JMltCZjAQHupmOS7hcRmq1xrqutxdQaTR4hobw\nDA29+xcDmJ1NE40WASgUqoTDNiIRO1qtSCBgQaUSKRarb3KUZiiuKc/gIpstMzGRZHk5h9WqY9eu\nAIVYjJGXE7SHbRQLZQwNOPr8NHNzafxdIR5+uIszJ5eR7Wra/fqmIms+y85tbhRqqFQCSkOhPWLH\n6xMw9XgRDUa0CxOkzp4kObfI9v/ro1SMHkrH5/C1dTN38nXWVvJ4zTVoVCmsrhIfGcHZ08PK8Zew\nC1kEjUJ8IYqAQr60SniomwtnWy0UyK+uYnS7yS8vU1hbo1YuozYYsEUiSKkUsZER7B0d75ok/43m\ntndGAOyRCGa/n0o+j8ZguGJDp+5uBxMTFrq7HRw/voZKJRAO29BoRLq7Ha0qFVluoBcqGNPjFOfP\noitLFOZfwzTUjzUcRq3TkZycJJ8ucuqlMyiAM9xGpVTEePQs9o9/iD2/+gEajQalCqwmawRkgZC1\nwviRZZRaDbXdTvu+fcRHR9HoNBi87YyOZzl5apKVrJq6oOHBB5pdcRtylezIKaTZCe54/GH2DO5k\n7lCB+sIpMsuLIIrY2tuxRSLX5TTUymUWX36ZwtoaAJVcjoVMBrVev67x0u3AD3/4Q37t135ts814\n17n33nsZGxsjFovh9Xrf/BduYVQqke5uJ5E2E4svv0x6cQa5Xie7MklPYCvuuwdR8nFsVh0ajYpU\nuows10nPzbF4+DC5pSVcfX1Yw2FiZ8+yePgwrr4+dL1Gzj37HB2dncwelVganSE81ENuZhLX1u2s\nGgd57fmzSPkibpeB3nAvgdI4KyfOYCgWKawUSPZ1I+qMPPChezlxbAVBq6M7YqSSL9A7YOfEK1OU\nKwpaowm50CxJzkoq0mtxhu7ZgznYxpmj5+hUaQnvHiZRNdLWpqNQqGK363E4br5S9VSq3Pp3s1Gd\nzPJynuFhH7lcBUEQ2Lnz7eVv2Wx69u0LASFGR2O8+uoSXfY6EUeVXDSJVCiSKwucPXSaclWksBbD\npN7O/jtCaBplhvoHKaYyUDUgxWMYh7rJVtUUkln6ug3MLRaY/+lpVCoBq6OPXb9+kGFVkbnDhykX\nT7DzsY+QiuaQpTIhr5ZqSSbU7kRaSNKQZaKnTqHWamnkkqyOnUNtcdJAIF/J0ihl0dlsVDLNnrKF\n1VU67r8fnc1GfnUVnc2GZ2CAuiyjNBrUJAlZkt53Rm521DrdZTPCL8Zk0nL33R34fGb6+lwt6fLd\nuwOkUlKrqkSvV1NPrlJOp7Ho6hTSKaRsipVjx9j6qU9RSiaplUoYPW4EpU5dKpNfWcXi92ENhynU\ntAR37wYgEc1S1sQoZYsYQz4GP/YxoqdPozGbKcXjGD0eDA4HybqB//y7n6Cz2fHvuYPV5QynX5vj\nwFYjK8eOkV+ONZ2bRJw9n/gQJqeNasmNqzOCZft+BE+Y1YxA0NisgLkWSskkxYtK/6CZg5NdXLyt\nnJFarcaPfvQjDh8+vNmmvOvodDoeeughnnjiCX7rt35rs815V8gsLjJ19AyFXBmDXo3dUWP27DNs\n/eAjhPvbSCzGqFRkzFY9tqCfUiKBWq9v3vsLC7QfPEhifBzP1mbTTLWhgdcmotFB755BPJEAPb4G\nCy88R9nRxfhLM9TyBQRBT70Bo0fGCN7tb4Y9ZRn30BCOoa1kawaqdTWlTJrFpSK5ZB63XY3F7WhW\nVZTqSLk8Rr8Kg82CxapDbMjotCL3/eavMPholky+xtJyEV2lRqVSQ69Xs29faINC9c2A12vk3Llm\ne490usyOHX5sNh16fbNSZHDQQzh89Q7MVyMSsRONFqmWSphddop5AZtQIjOfxOa2U41L1OQasZkF\nDA4HkYAWITaNGI8jqtV0bO3Duz2ET5NBqjo5NS2TWkuDoMHptiPr9Bw/J7PHnWbsp0/i6urEYHgS\nb6QHQ7eTaCWGqBMxed1oQl3Ydm6nVq8T6vSTnJpCQxWjAdRmM+HhQbJzs3gGBlr2q/V6DE4ntrY2\nNEYjmdlZqvk89WoVQaXC2t5Odn6e+NmzmLxerOEwWuPNmax6OW6+O3KT8fvNuFwGhoY8FIsyLpcR\nrVbkyJFlcrmmRLDRqMZcqaCxGlBM3RicTqqlEqIo4t26lbnnn6ewtkZ4z37659PMvn4Wk9tN9wP3\nkNL46fV5yWQkqtU6LxxaJJM5X6O/muWu/Xeyfdu2ZmLs/DypqSnmXngBqfMgZouBfL6AGpn8yjJt\ngV6i5+bIrsWpKGqqxQJmZ5304grmUBjXYJh03cpzz0ygGCVs7UXaurzcc08Ep/PWuUnfbZ599lk6\nOjpuCvGvzeDDH/4w//3f/31bOSNLSzkmJ5sJkeGwjb4+FyaTllqtzvTIEmMjMZSGAgI4nQZ8PhOZ\nVBHPvruxda4gF0v07+nFrm+wcuwYOosFk89HYW2N1PQ0SqOBWqulXm6u7k2VOO2RbfTv6kEnyEz8\n5Cc4u7pIpitkZqcpJ5MYXC7qDSsNlQ7MDmzt7eidTvSD+3jxpSVi8QoqwwxaiwWnvoaxzYnBpKNh\nsDPY52VuuUxJzqC1gjVoYecdEYLtFqzBIKJaTTDsJggMDDZbX8hyA6fTcNOW4kcizZYcS0t56nWF\nQqHKBz/Yh9drQqtVYTBoruv4JpOWe+6JkEyWaGzzkE3mOfbvP6NcKLLn4DAvPj9NTZZRUcdsVrP3\n/q1YxBKVQgGt0YjJ621WZ8ZiNFwdHHl1htFTi6hUIsHeNrbs6qRWyRNfy1EoC/idHkZ++iTqRoU9\nv/kZhHY3k0fOUEGHEo4wdSxPuSZwn1VNcP9dmP1+NHo9zu5uapUKsZGRlu0qnQ7ftm0t58LR2Ul+\neZlGrQaCgLW9ndziIqnJSQASExM4uroI3303au2NFw98J7g578pNplkaZuJiZdwDB9ro7HRQLFax\nWnWoUgKzz81TWF2lWiyComDv7MTW1oYl0sXS5BKNiRnu+ORHidx3P7mqiqzoxOV1Mjufo3A+EeuC\nIwJQqdQZmchw7wEvTpMJUaslPTuL1mJBZzfi8Rpx662YbQaGDw5iMamhVqGYTOPv7yOZ1GPv7ETn\ndNF3107WRkY5fmSJutaEqDTIra4yUW42uLrrrjBm89V3ii7F6HI1E7XOh2mg+ZBcEOC5XfjBD37A\npz/96c02Y9N4/PHH+dKXvkSpVMJ4C62srsTqap7nn59tCfhFo0VSKYn77usgGi1SrGsRRZF6ow5K\nU8nSH7TR2e/nXFREY3UQDje1KHJzMyAICKKIo6MDg7OZvKizWEhNTyOXStTzeexd3ah0WlZPnia4\npb+pl1Gt4nAYqFcq1CSJSjZLJZejc+cg7cODuB/eh1SF0ZEY3Vs0uDNFFpcK5KsK/Xu2EF+M4ds6\nREeni0Khyu4dXhYmKgiKgtshUiukycwlsV2ySymKwmUVkrPZMisrecrlGh6PiWDQgihuXu6XxaLj\nvvs6iUYLVCp17HbdFVVXr0QyWWoptl6uV5ZKJeL1mqnLOixWHfWH7uClH/4MbTHKr3xsCLkOdpeV\nwTv7qTcgKmlxOENYnAZyy8vMvvhLlk6MILtiBIMepsZUyJU68WiBeLxIf1iP3+bEHQ7g7Q4j5mPk\nZs6x/NoxLDv20/fRHqSaitlakJf/8zW8bW5eeOYcj93tIB3N0HXHDqqFAo1aje5HH8XW3k4lm8Xg\ndK5rXGdwOOh66CFKiQRKo0E5kyF7cedzRSE7P0+pv/+W2bXeTGfkc8CFpdf/Bn54o/9AqVRFpRLf\nVA9DkmRisSKKAk6nHqt1YzxVrVatK3EtqNzUZZno6dPUazXcAwPYwmGy0RRJQ4SqM8Lo6Qns0SLD\nH7gPbd2GXjFQLteRpCoul4Hl5fy6v2GxaDGVVjn3i1OY7SYyMzPoz7d5VjR6hvb0EM+L6PQK6XQG\nm9+HLJVJSWocWguyzYmsNtC9dxsGixGVw4dUiREbGUVtspAVHBQaeUoVBVEU6Oy0o9WqmZ3NoNOp\n6OiwX1WwSK3X037wIGunT1OKxd5IBg6F3uaVuXnJ5/P89Kc/5Vvf+tZmm7JpeDwe9u7dyxNPPMHH\nP/7xzTbnupmby2xQEl5aypFIlCiVZPKKmbbhQZZOj1OXa6i1Guw9fQR7w7QPrV+N29rbcfb0kJmd\npQFoHU40bh+iVUYbTyKKIuaObgzd2yg3NKQWapACxRGiodZiKEfpHe7i6H/NYvZ52bK7i54uG9W5\ncWqmIWqVBsuvHGZ1ZByzw8aWXbuYi9awm1XseqyH9p2DRGNFRkbipGdmUAppGg2YmC7hs/Wj0WUp\nJRKYzuf7KIrC0lKO+fkMigLhsI32dhuZjMTzz8+1Spo1GpHdu4PvmPLt1ZDleqthoV6vJhLZqKJ9\nJVZW8szNpVGpRAqFKsvL+daxtm/3smWLd50zoygK2YUF1k6eRC4WsbS1ceCBLWSiCbRCFEvIg73P\nz/hMgdnZRep1BbNZy8FddlJHDjE9MkcxmuXUL37B9v/xOJ09HqbGY2iNBmq1Orv2hjEXBfZ/8oNk\nFhbwDfThHeijLtcZOzqOJOgwD+zily9PUW2oySSLuPQygnMrkUc/iCClUKsEHN3d6CwWVl8/TnIt\nhSKqad+xlY79u1uKqxqDobUQXLkkfA7QqNWoVd5y79lNZzOdkV8A/3Dehle5gc5ILlfhzJkoS0s5\nNBoVfX1OBgY8l+1Zk0qV+OUvF4jHSy0p+DvvDF9VW6NRr7P4yivIxSKdDz7Y1DERBESNhvFXTpC0\nbaUa3I7PFUYAzuVsRDrsUGxgMmkRRYHp6RSK0iw38/tNaLVq3IYKay+/jv+ObmaefprE/BI1qYyr\nrxff1i189DcfIFszsHB6EvU2O+OvTxIvC/Q9eC+VmoBUqtNx4A7cAwMU43HEcp5KbIV6pULD0cbM\nyXm0Viv2+wdJpcqMjEzR1eVoZbCfO5fi/vs7r3ruRrebzvvvv21Le3/wgx/wwAMPvGeEzq7Epz71\nKX74wx/eFs5IuVzb8FpT2bOBxaIjW2xgDW9lMByhViyisVgJ7uptDfoXo9brCd91F67eXnKpPInV\nJMeeeY3k/DKegI3e/gG0oW7i6gDPPTdPvRqkx21nyyNBJp58ivLxk+wd3saWnb+NoNRR4nOUzr5C\n3Okgt7RIKVfC4Q2xeKJOYm65mfh49/1YdXUcZhVWm55UuowoCtQqVUqZZgdtUSViMmqolSrU5TfK\nX6en07z00kKreubcuRQHDrRTLFZbjgg0k/JHRmJEIrZ3RXzuAlNTSUZGYpTLdXw+E8PDvrccQl5Y\nyHDo0Dzlcg2Xy8DPfz6Nz2dqSfqfOLGG12vC42kq7k5MJMkmstiVFB4dJOZirC3EadvSw9AHHkIQ\nRXQ2G3PRBufOLQJNR2l2No2htErq+DS1WgOXz4fZUWDymRd5+Hf/J1v39aLS6RkYcDO0o53ppyeI\njYwgF4uo9XoElYrgvjuISpO4B7fw/z27zNLEEg0E2jt7Mbm1aOxuljMO7n1kPyaThnq1yth/P8HY\nyTmSiRL1usLEyAr3ac3037F1w3dh9HgQVCqU+htVUhqjEZ311tGI2syZZP78/+vAxtHiGlEUhWPH\nVlqJUADptIRGo6K/f6Ns/OhoojUZA2SzFU6cWMXnM7U6816KlEpRWFkhMztLXZYRRBGlXqdWklBC\nWxBEAVljoSIaqUkSpZk4hXiSoy+MYol0kCuLbNvmJxg0s7ZWYGEhx8CAC1UlR1vESXF1mfj8KmvL\neQTqGIsyi7MxbHt1DO0I4yTFyIuvo+SSREsCWx6+m6KkI6hT49k+gFqnQ2+3U4mvMDzso1yts5Bp\nirRFuty0BQysxppyyx0db6xCJKnGxETiTUXOBEG4YkXSrYyiKPz93/89f/3Xf73Zpmw6H/vYx/jy\nl79MNpvFZrv2pMGbgfZ2GzMz6XUN3Ox2PU6nAZ1OzdCQh5GROPGqDoPBRNhlw+O/8jOg0miwhEKM\nLy8w9cvnyKwmUGl15PNVZqfjGBsuXpwscerkGhZNhdmTVRL7wux54BHcujILL78MCnTu6GN5fhJq\nNRr1OtV8nvz8HN47O7C3B0nPL5FPpAn6jITarLj6+gAIBMxEIjbyaw5KiTgC0DUQwKoqoTKZMDid\nQLOT9uhofF0Zryw3GB2N4/FsnPDL5RqlkvyuOiOHDy+27MvlKhSLVR55pPstJdiOjSWQpBo6nYpM\npkKpJLO2VsDjMbX6amWzFSSpxosvzlOp1MktLXF0dJJwXxBHQyS1HGV+PsNjkS7atg8CMH90svU3\nlpfzxONFQrqmfbOzGXbs8NPW2870dJJEvEBFZyJg09HbZSMxOUn01Cm056+D1mxGLpUop5IMP/4A\nE7N59HotZpsOrcGA1QAemwrKeUwmG1ZnM1RWjMdZnY8SixXh/G0rFSpMnzqHt697g0aMJRTCu3Ur\nyclJauUyWpMJ3/AwJo/nBl2pd56bYVn7e8B/3aiDpdPlVmvsC9TrCufOpTY4I7VanbW1woZjZLMV\nCoXqlVUFBQGNyYTebqdRq2H0NrcCLcEgmt5OFs5Vz39MpBCNUawKiMUySqPO7NgSxZqOYNBKKGRh\n2zYfarVAV5cdh2IkM5EkNRUlnSw0S8qUBrlcmcTSDNYdK/g62wju2UPd7MGyNUVV0XBuUUJvUeHx\nmbFYmslKOrO5WdI8+iQPP9jPWsNLPFbAZNKSTBSRZfVlna2Lu/G+1zhy5AiFQoEHH3xws03ZdOx2\nO/fffz//9V//xW/8xm9stjnXRUeHjWzWz+RkElluKg3v3RtsJUTu2hWkrc3akjT3+02o1VeWQIdm\naDeTqSBcpFis06mJxcv4I1rKpTIkF5k4t4TDZSI1OUlP4DFUbgO5RJbUuVmsNh1SOt2sknA4qJXL\nNKpVDKLM9t0R0u02dBqB/l1dePvf2KnR6dTceWc7bSEz82cdGIQyTl0FdV0itH9/q7RTlhtIUnOX\nxGjUYDWCihoqg4jdvjFfzGjUXCKW9c5zqd5JPF4ikZAIBq/eO6XRUFpSC/W6gtGoQRDe2PECUKkE\njEYNExOJlmqqgkAqJZE/ucQD97bBUpRyuUGu1KCUTqPWaPD7LSwtNXNp4vFm12BMbpw+F+fOpZif\nz9LT42DXwV4cXW1YvG4G+l0UxpsCeKnpaar5PFqzGUtbG8mxMSzt7c1dNbMNx30eHv3QEOlkAVGW\naGTjTeXY4WArZ0dUq5EqSssRaaHWXXZuUqnVhPbtw9HV1XRGzOabphvvW+XdcEZ8wL9e8toq8Gng\nDuAx4LKa23/4h3+I3d5cuQ8MDLB//346zifxzJ1P1rn0Z6u1GfOsVBIA6HRNBySXizI3p219fnp6\nBlEUsNt1pFLSus8bDGpisWWyWfVl/57R6UQym1EPDmLM51l5/XVyWi0hu53hoAPjSo58PoosSQhK\ng55uN4vnRukasqJZ0bK4lEeS4hQKApWKBYNBjSQlQdNAazRibWujbNKjeB3YBRXlmog+4mJpdYVh\nqYLgMFBR11lKppk7uQZ1GdHYwGmJ4Hb3tuyt2O14t28nt7CAO6BnLZolGjXh7PGjVpIMDqpbD+6F\n849Eglf9ft/pnzeTb3/723z+85/flL4sNyOf+tSn+P73v3/LOyNqtYrdu4P09DhbiZEXr7xFUcDv\nt/B2InNarRoEEVdvH8n5Veq15mSXzcv0uBwYdatko3EUmpoZWquBSj5HWShg79+C0W7DGgzSyKXQ\nW61oTCakbBZFUaiVJapLi4TCYZw9PXh6ulBpNOcn4Ao6nRqjUcvgkI/BIR+lVIp6pYLebl+nMWEw\nNAXdREHBUl4jdmSUqlSmZ1cvoe0H2brVw9RUikqljsmkYedOP2bzrVF5IYpNDahkUqJWa6DTqejq\ncpBKSRgMzWsbCllxu42cOdMc48rlGoLehKDVUZPrIIioNGq23jPM2omTSOOvozPosLd30hWxMzLe\nDKUbDGr0Die+e+6iIKupFPLY29uw9m0h0N9OX5+bQixGenq6Kcvu81HN56nk8zTm5iilUgT37kOu\nyphMNXKjp9HbbPS43RQqEu49fXQf6Eerf8MRNHk8tA12sTj7hhq43e9G7wug1V7eURYE4ZbaCbmU\nzZTNDNF0Uj4CpC/zvnKhFfLbQVEUnn9+bl2YRqUSuOuuMP39bmKxAqOjCRKJEm63gVDIysmTa6TT\nzZI8nU7F/v1tlw3pXEylUGD12DFG/u3faMgylkAAs9/f3C47cC9LqxKlbAF9JUWq0KBaAfeuSQAA\nIABJREFUKFLPpckXq6wVdNQsfjo67ESjBSwWHcGghXq9QcABViXL7AsvMntyHFlRI6uM+Hbupqa1\n8OHP3InJYaecyTD38hFyFRWVGtisekyqMs7BrQgmO0ajGq1WjZROk5mfRy4UUJwhojmRotQgGLRg\nNms5cmSZdFpCrW42wtu/v23TBiRBELiWa34jmJqa4uDBg8zMzGCx3HwdLTeDcrlMW1sbx44dazmN\n7wSbed2vh/n5DCOnV1Fll0lMTGIyiAjOIK6hrTz9n0eZPtrs/qo3aPCHbNy9143NZaFYBX9/N91D\nbUizEywcPkxhdRWtxYJv+3YAsotL2PsG6LzrAAa7nViswMmT0aai6vnQUn+/a0OliSQ1e7iYzVpU\nKpFMRmLu1ASn/vNJ6rKMf6AbWWsjmpJx9/YS7nDgchmxWnXvegM1QRD4538+sW53JBg0v+UwTT5f\n4dVXl0gkSphMGlwuIwaDmny+WSDQ0eHAbNZy+vQa//qvZ4nHS1itOuqFHAGHwmCgjslhRY6vEF+M\nMjDgplqtI6hURO65h4zo5uzZWOveLJVqWEwqusJGfCEXOoMGt7tZ7ZNdXOTcz3+OqFajt9tZOXaM\n1NQUBpcLQ/cWchoPY8dn6B0MMry/G71GAEXB4HQil0o0ajXMfj/WtjbE83l4mViasZdPE52aRTRZ\nMbV1YPF72bMntKlVT9fD+fv1ssZvZpjmzwEv8B/nf/4AUL7yx98agiCwZ08QnU61LoG1u9tJLlfh\nxRcXSKWaiVuplEQiIXHgQDvJZIlarUEgYCEQeHPJdJ3ZTKNWa7ZvFkUElQpZrhOfX8W7I8+2bSGU\nhofJ10osja3y6hOvIgqwdTiEtRFn6M5OkrKacNh2fju1uSX4xBNr7Nrl566HHsU4uJv4app8SUFG\nYHibC72laZuUSlFcmsdgs1HXeJiczlDTWjBnV6mrm4p9w8N+Ojoc67brIpecxwc+0Oy3o1aLuFzG\nyyb5vhf41re+xRe+8IX3HZGL0Ov1/Pqv/zrf//73+cu//MvNNuddIRYrEIuV0GhE/H7zVfMnIhE7\ner2aeNxJZOdWPB4jC8tFpqaS7L+7l8LiImZrlWDIztbtXuqJVaxdu2nUjXi6nNSTy+RWVnB0daEx\nmZqVOIEAaxmFBY2Bs6ckZuvLbNsJZ85EWV5uhpTz+Srj43EkqUo2Wz1fgWJrJe5XKnVcLiO7d/up\nVhusTUwTj+YIdQVIlHRMHJlCEEUk0UomJ3PPPZvXyfXgwXZGR9cnsL5VQbZmKXAHZ87EOHMmSjpd\nxu83s3NnAK/3jZw2WW7Q1+dGFFPUag26tkfoiFhRajW0Opm5Y6cJek3Mz2dJJJoJwTXzGGL3btra\nLMzNZVldzePxmAi12xnaEdigeaKzWNCazc0dkWyW4O7deLZuQwz18/TT08yMr6CuCaz87CQqh5cP\n/9aDyLkcM88911JYjY2M4BseJrRnD42GQlYSkJ0dWHe3Y7frcbuN+P3mW9YReTM20xn5vXfqwBcq\nYi4t7V1bK7QckQukUhKlkszw8NuvnhA1mlYcNx4vsrSYw2Q3wWiCxZdSBAIWqpKG+TNTKBWJYlXh\n7Nkov/rJXThJow34+Pd/HyOVklhczGGz6dm5089LLy3gMrURFAuEvFrqDbCa1fj7wq3qFUGlQmM0\nEq/Z+eXTY1Q1FsYnp7F4XDz+sZ0Ui1UOH17AYtFedaAxGDSEQtcnJnSrMzc3x3/8x38wMTGx2abc\ndHz2s5/l0Ucf5Rvf+Abq26xy6lKmppK8+upSqwzY6TRwzz1hvN4rL058PvO6lvY2pwmHw0CpUOY3\nf+8u0surxOZWSY1PEL5jN6LNyZ2DHjRKlamfjVLJZmnU68RHRqgWCtRdHRx6NU4unkZjMlK3BYgm\nmyv9C1itOuJxiaNHl+noaC40XnttmUjETjpdRlGgWMyi0Yjk8xW0qLDb9dT1Fn55aAaxIeNymxFE\ngVqtwcREgp4e5zv0rV6dvj4XnZ32Vjnu221XEY0WOX062tpdmZ/PUirJPPpoN0ajttUF2GrVEQiY\nqdUaGAxqLFY9ZrMWo1JCGHCTXM2wtJgDwGjSEIuXwVRkba1ItVqns9NBX5+TbdsuP0/o7XYCO3ey\nevx48zrKMhVHJ0/+bJGjhxeoZnNY7Eb6B4dJVo3kCzVK09MtRwSaHeaTExM4u7qYjzV45ZXFluq3\nTqfirrvCN6Vy7o3i9j0zwGhcH264uAHeW3n9zXB0dZGZmyObzDMzk0atFhFtHn7xYozl1RKdnXZi\na1n2bOmllJdQEBBFFfFkmfawnfHxRGvwyGQqxGIl2tosuFwm5tZquHcMMNShRWk0MLhc6ypYTF4v\nxrYORp+eQ5YblBGo1qDSUDM2lmDrVg/JpEQsVty0Vc+twp/+6Z/yxS9+Ebf76qG59yJbt24lEonw\ns5/9jI985CObbc47hiTJnD4dXadHkkpJjI0lruqMXIparWpVqNX63Zx4aRy70Yt5m4FkRcv8ySgG\ng4ZOn0j9vAaEqFJh9vkoqdUsLWWQpCqCKGDy+lBptSQSxXXOiFarYmQkhl7/Ru7AwkKWel0hEDCT\nzTaPWyjITE8nObg9wtEnj2DXlUmnSpQKEia3C8358aRWa6AoyqY1u9RoVFesXHwzlpdzG5Jgk0mJ\nZFLCaNS2zulnP5taV+K9spLnD/7gDswmH6rELKOn3mj9oDcZsHd28k8/HgUE1GqREydWufPOML29\nLvT6yy/e3AMDmHw+Krkcsqjj1ddi5NJ5lHodnd2BrBKRRAtaq5VGQ6F8kSNygXq1SrlQYnQ033JE\noCmIOToaJxKx37a717fnWV0Bj8eEybT+RjKZNJdVJ3wrWNvaiNxzD1q3H6vPQ89d+0jowkxPxpFK\nZSqVOtl8jVhKxuFxIIrNB04UBRpGK9VqA5/PjCCAWt18aOLxEj5fU3ekUhextrVhC4c3lNJqDAZs\nfYOorQ50Vgs6qxWDxURDKpCJZ5raJzQVB9/nyhw7doznn3+eP/7jP95sU25aPve5z/Hd7353s814\nRymV5Mu2p08kStecz5LNVRlfqjOTNrCQaIZXFAVGTy5QSiQo5/OtCcns82Hv6MDs8aAxGHB0d2MJ\nNjuLWyy6DeNWrdaUdr+AKArkcpV1z7sgKHR0OFhKQN8Dd+MLWNm+r5tAXyc4gkjlOoIAXV2OW7br\n9uXMFoRWbgJmsxZJkqlU3nBERFFohkGyFUSViuC+fXTftQ932E9goIuBRx9gMqpiebnQOr6iwMxM\ninT6Im0WSaIYjyNd5FQYHA7skQgNrZl8WWDr3h70NhsqjbqpipqRcJhE7Hb9ZTvHa81mBL15nb0X\nkKRaq+DgduS23hm5FLfbyIEDbZw8GaVUkjEaNezY4cPtvradA0EQcHR2EhTtrJlXKCoyz/3sl0jF\nMiq1CnVPU0CoodZjsJoglcdoMdA14Mcd8mOcWcXjMSGKzVXM3FyGvj4XDoceUWx2FL0aLr+T7l0D\nyBoztbU0Rktze7i3y4qcTWK3u/D53tzRatTrlBIJ6tUqWosFg/0N7ZF0WmJ+PkM+X8XvNxMO295U\n0fZWoV6v88UvfpG/+Iu/wGx+66vf9xqf/OQn+epXv8ro6ChDm9Re/p0gmy2zsJAlk2nmGmi1qg1K\nrc3FwrVN1KIobFgMFGMxNBqJpEWFxe9n9dgx6rUaZp8PTyRCeHCY5eIkhaxEQ64hqlQEAma2bWvm\nUqytFXC5DOzeHaBcrpFKlSgUZNRqkaEh97pJrD1kpLY2z3MvzzFxeomOgTaG7tyCabnM0lIOi0XH\n8LCPvj7XNZ3fzUB7u42JieS66+bxmNaN6aGQlUjE3soH8flMBAIWVKrmdTU5bAT37KVgjiDXIV7T\nUK0msdm0reunUglNKf/zmzCpxRUmT82xNJ/EbNHTu7WNju29rTC62axFoxHROSw8+PgWTrw0TqVU\nZfdODz2uEpmZaXQ2G0aPh1IiAYqC1mIhsGsXNo8NjydJPl+lUqmRyTQXtqGQ5bbdFYH3mDMC0NXl\nJBSyUiw2u9feiInV4TAg5UsUVpfxeU3EYgoOtwVVOU9HyM2OvRFScRehwW4GBz30DQVQ63QMDzc4\nenQFlUrAZtNz8GAbAwNuGg2F3l7Xm4qPiaLAjh1+lqdXOTYVo1AR8AXsVKs1NDoTB/b53lTAqFap\nsPzaa6Snp5vOiNlMYNcu3P39pNMSzz4728qzGR9PMDjo5uDB8G2RRPV3f/d3aDQafvu3f3uzTbmp\n0ev1fOELX+Bv//Zv+Yd/+IfNNueGkMuVeeGFuZbg4exsmmDQSqVSb5aACuByGRkYuPbQncNhIBKx\nMToaR1GaTn85FadnfwApudhsZrdvH1qzGXd/PxqrldiZM2z1y4yk05QSKcK7B9lzZwS324jP11wx\nq9XNhcq//dsI586lUKlE+vvdmExavF4N0WiR9nYbPn2BhZVJ+nu9jJ2cZXFinkqxyLaH7mD7dh+7\ndgVu+RBuIGDh7rsjjIzEKBZlfD4T27Z51zUD7OpyMDDgJpcrIwhNB/FC2e8FenqcKIrC6moBtVrg\nwIF2crkq8XgRURTwes10dztxOPRUCgUOPzPCa4fGWyXdY2dX+FWjifBAGGg25du+3cfRo8s0klH2\nbrfj9NnZ2mNESa9x9sWnMPl8WAIBXL29WIJBjF5vayG4Y0eATKbMyy8vks9XiUTsKIrC8eMr7N0b\numV3sq7Ge84ZgaZo0I1c3Vuteg7udnHqlQQf+8Q2jr98juzyKupSmeHBLu6+O4yigFotrlsp9fW5\ncTgMJJNSK3vfZHp7ZbUej4mONgP33t2GgEC1XCa6tES0bEZ7b+eb/n52YYHE2FhzHxKo5vOsHj+O\nyedjbk5al/CrKE156d5e17qkvSvRaCjUavWbMulqfn6eb37zmxw+fPh9XZG3wOc//3n6+/v5q7/6\nKzy3sJbBBZaX8+uUl8vlOolEiYMH26jXFdRqEa/XdN0iYLt2BTCZtMzOplFRZ1ugA2t5lWqt1uwd\nUi5Tr1YxeDwkx8dJjo3RKJXo1zWQVQqeioBebEeWdWg0qta4pdOJ9PQ4W31c6vVmD5oDB9rYv78N\nrVbN3AsvoFHqdHsVPvyxHUyNRZHlGopcZWjIc8s7Ihfo6LDT3m5FlhuX7Ujs85m5774Oxsbi5HIV\n2tqsDAy4141LarVI0FhCXZ2klpVwDAzx4P1h5haavW5sNj179gQxmbQsTsUYPTHfckQAEitpxs8u\nt5wRgP5+NzaLhilTFqFexaqWULIFVo8fJ7+ygt5moxiNUoxG0VnfUNiF5i7+tm2+1nzRaCjkcs1c\noGSyhNt9+ylg33yzxC2KzQhbIirio4fZ66xT9ZoQ61V8xQnqxa4rquF5PKZrzlm5wNJKkenjk+te\nK2hEauLVB1JZkpDOtzKv5nLUq01Fw2qhQCWXI5/fGCuvVusbEsYux8JChtHRBPl8hUDAwtCQZ12M\nezOp1Wp85jOf4Stf+Qr9/f2bbc4tgcfj4eMf/zjf/e53+frXv77Z5lw3l1MazuUqiKJIT8/1KVdW\nSyVq5XIzj8ugYccO//kGdApzL7xAOpZd93mjx4NGrye3tES1UCA+OkqtXMbcFmZG4+Ho/3kVUyBE\nd6+bwUE3RqMWSaqxsrJRPTqTqbQmWfV5AbRqYo1+t43OB9ppqLV07+3EEbh1epa8FVQq8ar5cW1t\nVtramomjl9vVzS4sMHfoUCupWHrpEB27djHw2BDVah27Xd8q563VBcrSxvyiYmnjuOgP2pD9auKj\nk8iNBmq3m1I8jtHtxnqh27kgkF9b49IMklisSDzeDC25XAZkucGRI0skEhJ79gTo63PdlAu9a+X2\nOZNNxuTzkZyaYu3EiVazIq3VSskwQH5l5ZqleavFInKphNZsXqeueDEdg+0sjC9SSqZQGnXUej1t\nQ93YXVfWzEhOThI9c4bUuXPIxSK+4WHkUomaJKHSalFrtfj9TSnli/P3zGYtVuvVnZy1tTyHDs23\n4rjpdJl0WuKRR7pvinyT//W//hcGg4GvfOUrm23KLcWXv/xl7r33Xv7oj/7ols+x8XqNqFTCun41\nRqMGq/XaBf+URoP42Bjx0VHqlQo6m43g7t1YgkEacpVKLod7YIB6pUJ+eRkEAaPbjX/7dgRBQGe1\nImUy1Mpl1AYDZUcXh56dxBquYq+oyeRkyuUad94ZxmjUYDRq1iXdCgLres44Ojtbz3clmwWyuHp6\nsHlv3RyR6+VK4eXU9HTLEblAcnycns5OXIH135cr6MTfHWLh7EzrNY1BR+dg27rPlbNZ6rKMa2AA\nKZulsLKCKIo4e3owejysHj9OJZtF73DQef/9G2zyeEyMjycwGjVkMmUOHZpHoxFxOIy8+uoyjQab\n0mX5nWLzZ4bbBK3JhCUUwhoKUcnn0ZnNGL1e1Ho9DXmjF/1mKIpCcmKC6Jkz1CQJjcmEf+dOnF1d\nGz67ZaufRGInSzNRanINp9fOgfu6NwjzXKCwtsbSq69SK5dR6XRkZmdZPHyY8N13UyuXsXd2YvR4\niDgU+vtdzM5mWqqOe/YE3zQPZXExtyER8IKX/2Z5MO80Tz/9NP/8z//M8ePH3w/PvE0GBgZ44IEH\n+M53vsNXv/rVzTbnugiFrAwNXZBDr51PZvdf1/Z3bnmZ5aNHW8+7XCqx8PLLBHfvZu3ECaqFAiqd\nDld/P77t21EUBaPL1VpkuPr6WD5yBGiW7p+azWJwe2nIMkqj6TTNz2fZsqWM293MjTh1Kkq5XEOl\nEohEmuGKC5i8XjoffJDU1BSVfB5bezuOri5E1bWV0d7O1Msb9TYb9TqN2saqFqvVwAP/4w4O6Y1E\nZ5cx2iwM7eujb0uzlUZdllk7dYrU1BQNWUbvdBLYsQO2bwdBwBIKcepf/oVyuik8LksSyakpfMPD\nGF1vOD7hsJWODjvFYpVTp6KtXBezWUujoTA1lWRg4PbZHbk9zuImwRoM4t22jWr+jUZ9Kp0Ok+/t\ne6+FtTWWjhxpeeu1cpnlV19Fb7Otu2GhmSj38CM9xGKBVsnf1eLBhWiU2vmHT2s04urvR0ql0Nls\neLdtw9bejqhSoVPBnXc2ZfSr1TpWq+4tdfRsNDaGdxoNZdMlv6empvjMZz7Dj370I3zXcE3eB77+\n9a9z77338vu///u3tFqtRqPijjva6O52UC43He3rDSPmlpc3LDwKq6skxsebFRM0n+O1Eyfofvhh\nbG3rV9KWQICBX/kVDC4XGqMR67yB3GwMpdFAY2o+z4qi0Dhftr99uw+/v6kroter8flMG3YeLX4/\nlrfTdOc9ir2zk9zyMhdvAxtcLgyuy+8i9fb78AVsZLMVNBoRt9vUqnTJzM4SPXmyJa9QWFlhpV6n\n57HHUOt0SIkElkAAjcGAqFZjcDoRBAEpmVw3thuNWu65J8Lqap7l5fz5HKY3du6aY+o78W1sDu87\nIzcQg9NJ2/79rVWQ2mDAt20b5msYDIqx2IZtw2qhsOGGvYDJpKWz861tMYuXKGlqTSa0ZjOOzk4c\nneuTXlUq8S0lq15MKGRlbCyxLrfE5TJuas5IOp3mQx/6EH/xF3/Bfffdt2l23OoMDg7y0EMP8Z3v\nfIc/+ZM/2WxzrosLVRI37HiXUaitSdKG57ghy+TX1rBe4owAOHt7URSFzNwcXYKa1aUUllBba/fE\n7ze3OrYKgrBBAfZ9rg1HVxeVfJ709HSzE7vLRXDv3lap7uWwWvVYrRsXZ9mFhZYjcgEplUJKp7H4\n/ai0WoxuN8aLRRYFAeEyO1Y6nZqODge7dgU4cya27r2ODvtNEfa+Udw+Z3KT4OjsxBIIUCkU0BgM\nG8TK3ioq7WUcC0FA1Fy/dLslGERns52PIzcxejyYvN7rPjZAKGRh//42RkfjSJKMw6FvVRVsBrIs\n84lPfIIPfOAD/O7v/u6m2HA78fWvf5177rmHz372s++r1l6Erb2d5Pg4cqnUes0aDm/oAg9XeL5p\nOhju/n6sbW14imXMnX3MzmVpNBQCAQs7d/pvy7LOzUat09G2bx/u/v5maMVuv6xz+VZQ6Tbm1Ikq\nVSs8ZvL70dnt66TgjS7XVcff7dt9NBoKCwtZBEEgErGxdeuNGa9vFjbzrv6fwO8AOuAfgP/3kvev\nqWvv7YKUyTDz9NOtuCI0k2S7Hnromh2ci8mvrREfHaWcSmH2+3EPDKz31G8A5XKNSqXW6iD6ZrwT\n3VsVReFzn/scS0tL/PSnP73t+6u8W/zBH/wBsizfEGXWW7Vr7+XILS0RHxujksthDYVwdHezcuwY\nucXF1me0Fgvdjzxy2R3Oy1EoVGk0GlgsutvKEbmdrvvF5JaWmH3uuVYoHMDZ10fHPfcgnM9TK0Sj\nxEdHmzvdXi+ewUFMb6FkPperIAhcd8n5ZnG1rr2beWergRpNSfqjwJ5L3n9POyMAxXi8FW82+/24\n+/sxOG9sQ6tGvX7TJLS9E4PT1772NZ555hmee+65W74C5GYinU4zMDDAU089xfDw8HUd63aclC5+\nrsrZLMmJCXLLyxicTtz9/dcUur3duB2v+wWyCwskJiaQi0XsHR04e3svu4i8mcbfd4Ob1Rm5gAH4\nOXDvJa+/552R9xo3enD69re/zfe+9z1eeuml98MJ7wD/+I//yPe+9z1eeeUVNNcRPrydJ6X3uTLv\nX/f3HjezM/J14LPAnwH/55L33rPOSDJZ4ty5FKmUhN/flCF+M22P24EbOTj9y7/8C3/2Z3/GSy+9\nRDgcfvNfeJ+3jaIoPP744+zbt49vfvOb13yc9yelK5NINMeCdFoiELDQ3e24ZbfoL+X9635lisUq\n09NpVlbyWK06enocNzTZerPYbGfEB/zrJa+tAZ86/28t8CzwAeBiSUHlS1/6EvbzWv0DAwPs37+f\njo4OAObm5gBuu58dDj/PPDPDykozxqzTuWlvt9LdLaLVqjbdvnfy587OzhsyOP34xz/mi1/8Is8/\n/zyDg4PXfbz3uTKrq6vs3r2bf/qnf+Lxxx+/pmO8PyldnkxG4plnZte1ZAiHbdx/f8dtUUXx/nW/\nPLVanRdemGdm5o18QatVy0MPdV9zU9ebhc12Rq6EFqiet+EF4ENA/qL335M7I6OjcV56aWHdayqV\nwMMPdxMO2zbJqneHGzE4XXBEfvGLX1x3LsP7vDVeeeUVPvrRj/LEE0+wd+/et/37709Kl2dkJMbh\nw4vrXlOpBB55pJv29lt/LHj/ul+e1dU8P//5OWR5fXnwnj0Bdu0KbpJVN4arOSObKUH5J8DzwGHg\n31nviLxnKZc3qrXW6wqy/Ob9YN7r/OhHP3rfEdkEDhw4wPe//30++MEP8tRTT222ObcNkrRe6l2n\nUyEIwoZJ6n1uL2S5Qa228Rpfqmp9u7GZe33fPP/fbcPaWoFotIBGoyIQeEOc6O3g9ZrRaMR1A47J\npMFuf3Pl0/cqiqLw7W9/m7/5m7/hqaeeYvv27Ztt0nuOD3/4w/z4xz/m05/+NJ/4xCf48z//c5w3\nuPLrvYbP1xwLTCYtarVAJlPGZtP//+y9aYwc53nv++uu3vdtept9575TokSRErVQsrM6RozEH2Ij\nyLEdI7GViyBGhMQJnFwguQFu7HsAx3EQGIgNO+fmHOUYtnUdWZaolaS4DoecjbP0LL3v+1JVXfdD\nk0MOh6RIihKH5PwAAepiV3VNv13v+7zP8n8wGu//EM3DRipVIRZr7bd9PstNm6M6nQZsNj35/BWx\nPEFQEQzev4rHt8K9TmC9GfdVmGZqKsWxY2FqtZb16nDoefLJnttWR2w2FUZH44yNJanVWj0zdu5s\ndWh80LkTt221WuXFF1/k3Xff5ZVXXllPVr3HpFIpXnrpJV5++WV+53d+h89+9rPs27fvpn2A1t31\n10eWm0xMpDhzJsbbb88D0NlpZ+tWL0891XNLrRnWMg/LuC8s5Hj77QXK5Zany2zWcuBAF11djhue\nEwrlOHkyTLHYQKcTGBpys3OnH43m/i4DXqs5Ix/EfWOMVKsir7xykXS6uuL44KCLQ4d6b3DWzcnn\na1QqIlarHovl3iiXftzc7uR0/Phx/uAP/oAtW7bwne98B7v9/o+jPyiEQiF+8IMf8KMf/YhkMsnh\nw4d54YUXOHz4MN5rlCYflkXpTshkqrz88jjZbBWDQbOcuLp3b5CdO69tOn9/8TCMuyQ1+a//miYc\nXpmF0N5u5fnnB5b72VyPSqWx3HfoTrzsa5G1mjPywFCpiCtaeV8mk6let2ncrWC3GwgErA+NIXKr\nKIrC22+/zWc+8xk+/elP87WvfY0f/vCH64bIGqOnp4e/+Iu/4MKFC5w4cYKDBw/y8ssvMzQ0xN69\ne/mP//iPe32L9wWViohK1ZoPrq6gyWZXd5ldZ+1Rr0sUi41Vx4vFxrIX/UaYTDoCAesDY4h8EOvB\nx7uAxaLDatWtSjDy+Syo1WvZ+bR2kWWZcDjM/Pw8oVCIUCjE+Pg4b7zxBg6Hgy9+8Yt873vfw3wX\npPHX+Wjp7u7mC1/4Al/4whdoNBocPXp0XQ33FrFYdJhM2lULWlvb/V3i+bBgNGpxOg0UCiubJTqd\n67k/17KWV8r7JkwDrRjf0aOLFIsNVKrWZHHgQDdu9/qkcatcdtuWy2VcLhdtbW10d3fT09NDT08P\nAwMDPPXUU/T23lnoa521ycPgrv8wXLiQ4PTpKNWqhFqtoqPDxv79nfe9+NnDMu7RaJF33llY9mY5\nnQaeeKKLQODBTki9HjcL06xZ0+zJJ598oJpCrfPBXDvm4XCYcDjMe++9dw/vap2PmvVn/eFkfdwf\nSvI3+oe1/Eu4rzwjt0opkSB05Mhy+2hBrye4Zw/ezZvv8Z3dex6WndLtED1zhtjZszTFVk6SyeOh\n56mn7nrDxHvJ+rg/nDwo4y6LIovvvktmehql2QSVCnt3N90HDqA1Phz5HrfKWk1uTplyAAAgAElE\nQVRg3UxL8Owt4MP3Ib9PSE9OLhsiAHK9TuL8eRql0k3OWudhpJrLkRofXzZEACqpFJmZmXt4V+us\ns87VlGIxsrOzLUMEQFHIz89Tikbv7Y3dZ9xLY2QS2A8cBPTAznt4Lx8b1XR61TGpVkOsVq/z7nUe\nZqRKBam2umqimsncg7tZZ511rodYLtOUrqmMURTqhcK9uaH7lHuZM3L16BmB3I3e+CBhDQYpJxIr\njuksFnS3UV3QlCTyCwvkQiFUGg3O3l7snZ13+1bX+ZgpRqNkZ2eRqlXsXV0Y29rQms3U8yvDrBa/\n/x7d4TrrrHMtersdQadDblypeFIJAgan846u1yiVyM7NUYrFMDqdOPv6Hqiw7I241wmsvw78n8BJ\nYO4e38vHgmtoiFI8TjkeR2k20VmtBHbuvK3YYnJsjPCJEyhyq19Nbm6O7oMHca5Xmdy3FCIRQq+/\njlipAJCdmyOwezf+HTuInDyJWC6jEgSswSDOvr57fLfr3A3m5+d59913CQaD68mc9zFmr5e2zZtJ\njo0h1+uotVrcQ0NYg7ff1E6q11l4913y8y3F3dzcHPmFBXqfeQbDA66ltFZ+/f8P8BPgF1cdU776\n1a/icLQkczds2MC+ffvWVMv7O30tVqtMjozQlGUGN27E6HLd8vlBr5eLP/0pS/E4AB59q7yvYrXS\nsW/fctnrWvp7b/V1b2/vA5HQdieE3nyT9OTkimNas5mhX/kVmrJMNZtFo9Nh9vnQ6O/vks5reVAS\nGW+VRqPBSy+9xPe+9z2efvppJicncTqdvPzyy7jdD37bh8s8SOPelGXKySSNYhGt2YzF60Wtuf29\nfn5xkZlXX13eaF6m64knaNu06W7d7j1jrcrB64DLfq2/BY4CP7vq3x/IapoPSzWb5eIrryCWyyuO\nG10uhn/zNxHu4AFYKzxIk9PtMvWzn1EMh1ccE/R6Bl54AYvPd4/u6uPhYRr3er3Opz71KQC+//3v\n43a7aTab/Mmf/Alnz57ltddeQ6vV3uO7/Hh4mMb9VsnMzDD3y1+uOh7YvZvg7t334I7uLmu1muYF\n4AjwJtAB/H/38F7WPIqioCgKepsN03V2T7bOzvvaEHnYsV+nwZ/ebsfguHEzrQ9D85qd1zofPYqi\n8LnPfQ6j0ciPf/zjZS+IWq3mH//xH9Hr9Xzzm9+8x3e5zt1mucrmFjA4HGivUZVWazSYr+nn9CCy\nVsI01+OB84wUCnWWlgpUqyJtbSaCQdtNGyVBq9ImPTVFdnYWlUaDZ3gYo9PJ4nvvUUmnUanVWINB\nOh59FL3N9jH9JR8N98NOqdlUiESKJBIl9HoNweDd6R3RqFSInDhBfn6epixjsNvp2LfvjuLON6MY\niZAcH6eWy2ENBPBs3IjxDhPt7hb3w7jfDb71rW/xb//2b7z77rsYDKs77k5PT7Nv3z5GR0cJBO7v\nJni3wr0Yd0VpPb/xeAmdTqC93faR9X4phMMkx8ep5/PY2tvxbNx4S3kfqclJYmfOIFYqCHo9ng0b\n8O/YgVq4vzv2wtoN03wQD5QxkstVeeONEMlkK0FRo1GzbZuXPXvab3re4rFjJEZH4dJ3odZo6Dpw\nAHtXF9VMBpVajcntvqP45FrjfliURkfjnDwZQRRbux2Xy8BTT/Xg8Xz4HjlKs0kllaIpSRiczrsu\nmFRJpZh59dUVmjaWQIC+Z5+9p+JM98O4f1jGx8c5cOAA77//Pn03SUD+6le/ik6n4x/+4R8+xru7\nN9yLcb9wIcGJExEajZZn0OHQ89RTvXi9d7fHVSkeZ/a111aE020dHfQ+88wt5XzVi0XqhQJao/GB\nqqRZq2Gah4q5udyyIQKt1tJTUxlSsSyZmRliIyPkFxeRrxK4quXz5Obmlg0RaJX1piYnEXQ6rIEA\nFp/vgTBE7geKxToXLiSXDRGvS4dTVWDu2Cmyc3NI9foHXOHmqNRqzF4v1mDwIzEOCuHwKnG9cjxO\nJZW665+1zhUUReEP//AP+au/+qubGiIAf/qnf8q//uu/kr6OHtE6H45SqcH584llQwQgl6szOXn3\nf/+FpaVVeX3FaPS6z1qjVCJ98SLxc+cohMMozSZ6qxVbe/sDZYh8EOur2IdAURQqqRRyvY7ebkdv\nvXHjo+u1/HaaFRbeehMlnwRFQa3R0LZ5M+1796JSq1GazevGGxVJahko15QCSo0GiiyvSxB/RFQq\nIvV6Sx7H49KhCo8zdvYCFpOAEGuV3Hbu3/+RVbvU8nkaxSIao/G6eUMfxNWG7mUURVmVuX8jmrKM\nVK+jNRhQqdf3MbfKj3/8Y3K5HF/+8pc/8L2dnZ38xm/8Bt/97nf58z//84/h7h4eqlWRWk1adTyd\nvnPByaYktbyZsozR5Vqee6/7rDWbq561Wj7P/JtvUorHQVEQdDp827cT2Hl3NUCXn12jcc2WkK8b\nIzehXG4QiRSpVETcbhN+v2U5x0NqNIieOkVmehq50UBnsRDcvRvXwMB1r+XzmZmevqKcqdWqMYpZ\nKtEwRmMre74pSaQmJnD09GDx+TDY7Vh8PrKzs1cupFLh6O1dsRhc9pakJydpShK2jg6827aht1hQ\nmk2keh2NXn9PFhCp0aAcjyNVq+hsNixe7327kNlsesxmLY2GjE1dYeLcGLIoYbebUZpNsrOzOHp7\nb1vvRaxWKcfjyKLYmtBMplXjlRwbIzYyglipoNHr8WzceNtxZGsgQPIacSa9zYbB5SKTqRKLlZDl\nJj6fGa93pQhffmGB+PnzNIpFjE4n3m3bsK6Lr30giqLwjW98g7/+679GuMWx+vKXv8xnPvMZ/uzP\n/uyWz1nng7FYdFiteur1yorjweDqTeTlub9cFnG7jQQC1lX5ffVSifCxYxSWllCaTQxOJx2PPYbV\n78fW3r6qlYPB6Vz2dEj1OqhU5JeWKMViy++RGw2SY2M4uruX39uUJErxOI1SCZ3Fctve8Nz8/HLL\nEaPLhW/btjVZobdujNyAQqHOW2+FiEZLKErLeNi61cvu3UFUKhXFpSWSFy4sey7q+TzhEycweTzX\nrYDo6XEQDhdYXCwgywp2uwG7NkPTuLKMT67XkS5Jw6vUagJ79qAoCuVEApVajaO3F8/w8IpzMjMz\nLB07tmx113I5mrKMs7+f5PnzVLNZDA4Hvq1b73pC5M2QajUWjx4lNzdHU5IQ9Hq8W7YQ2LVrzVrn\nN8No1LJrV4BTp6LI1RiyKOFwGvD6WvFmpdmkUSze1jXrhQLzb79NLZtFazaTnZlBYzTiHhzEu3Ur\n1kCAcjJJ9PTpZUE0sVIhPjKC2eu9LeVdazBIx2OPET93DqlWQ2+zEdi1i1xFzRtvTFMstowUk0nL\n44930tfXSmytpFLMv/32stu5ns9TKxToP3wYw32eNP1R8/Of/xxJkvj1X//1Wz5n7969uN1uXn31\nVT7xiU98hHf3cGE0atm508+xY0sUiw3UahV+v5mhoZWhkFKpzptvzhOJFJfn/i1bvOzZE1wxb6Un\nJlZsFCvJJJGTJxl44QVs7e20P/IIybExpFoNg91OYPdu1Fot0TNnlvtLqQUBk8ezInwj1WqIlQpG\nlwtZFImcPElqYoKmKC4LqrU/+ugtVU+WEgkW3n57ee6o5/PULz27N/Pk3wvWjZEbsLCQIxK5El8X\nxSbj4ym6ux20tZkpxmKrQiiNYpFaoXBdY8Rs1vHkkz0kEmUaDRmHQw9pgVBsdkVOiMZoRGsyLb82\nOhz0PfMMtXy+JTFssxGNFllcTFOtinR02GBxcYX7r9GQKWdyZGZepXlpF1zP56nlcvQfPvyxVU8U\nlpbITE8v/31yvU7ywgVsnZ1Y7tNStb4+Fw6HkcKSDm08iEmvoikrFAo1TGY9+htky5fLDRSltTu7\nmszMDMVwGJPXy8Lbb1OOx9EYjSiyTDWXY+DwYWr5/PJkcpmmJFFOJm/JGCkW6ywuFsjlang8Hrqe\n+wSCXEdntSJotRz/xeyyIQKtcNToaJyODis6nYZiNLoq/l3LZqmmUuvGyAfwz//8z3zlK19BfZve\nwC996Ut85zvfWTdG7jK9vU4cDgPZbBVBUOP1mpc905dZXCwQj5dxOo2o1SpAIRotkk5XsNsNVKsi\nJpOW/OIi0MpFyWSqSJJMWw3aM1ks3ja8mzfj6OlZNvwFrZbo6dNETp1anhOL0Si2jg60ZvPyM6Y1\nGtFeag9SjseXDRGApiiSnpzE3tV1S89+KRpdNXdUMxkqqdS6MXK/kMmszvGo1aTlmKPOvDr7Wq3V\nItxEsEiv19DZeWWxEk2dOHt7yc3Po8gygl5P26ZNmNrakCSZaLREqdTAatXj99vQaARmZzO89toc\n4+NJ8vk6Xq+JQ9s02GQVAjKRSJF0tkGfykR+YRFP0LX8sNXzecqJxMdmjFQzmRWGFlyy+ksluE+N\nEQCXy4jd2oO6uJ0Lb55iYS4Ngobe3ZvJy2auNkWrVZHR0QRzc1kUBbq77Wzb5sNsbhklpVgMtVaL\nVKlQvqSqKzcaSPU69VyOfCRGTVITT1Yx6FTYrHpU6tbuTHeV0XojyuUGb701Tzjc8tioVNDf7+KJ\nJzrR6DTU6xL5/OrfeqnUoFKR0OluMEVc0r1Z58bEYjHefPNNvv/979/2ub/7u7/L1772NRYXF+lc\n7zt1V3E6jTcs500myywu5vH7LaRSZU6ditJsKuzY4WdhocDi4iKVikh7uxVbU0s+X2NyMk390rpQ\naeoJxGsMX5redGbz8loh1Wotj8hVz43R6aQcj+PZsAGxXEZjMODduhXjpQ1tvVBYEeqB1kaklss9\ncP3I1o2RG+DxrJ7oTSbt8iJi7+oic/HilQ6qKhWOnh7MbW23/Blao5GuAwdwDw0hViroL+WISFKT\nY8eWuHgxgyQ10WjUDA+72b07wPnzSWZmMsuVObFYmXGbkc12A/VUgvn5PBqtFq3ZTCInU27kGN7g\nueJe/BgXEL3d3lr9rvpMQadD8wAk2ApaLYb+rRjTOnq6iwhGMwXFzDtHI1jsJtzu1u9nbCzJyEhs\n+SsYHU2gUsG+fa2JxOTxUIrFVizsglaLoNNRr0uEQjnSkoWKYGd2bIaODhudnXZMXi+WWwi5LS0V\niESuhI4UBUKhHIODLjo77eh0Am63cVWCtc2mx2JpGbEWv3/Fzg1a8W+Tx3NnX95Dwg9/+EM+9alP\nYb2DHajZbOazn/0s//Iv/8I3vvGNj+Du1rmWyckU778fZmEhz9mzMaxWHRs3tjEyEqdYbPDTn07i\n97fG8uLFDFu7g6TzF5cNEUGrwbtxA5NzFQLdNWy2lVoyiqKsmn81BgNGtxv/rl3ItRoGp3OFwJnO\nYkElCCs83ypBuGWvhsXvR2syrfCOrNVn96E3RhoNiaWlloiV1aqno8OG3W6gu9vO0pJ9OcfDYNCw\ndasPl6u1kBqdTnqefprc7Cz1QgFLIICjp+e2y2w1ev0q9c3oUo6pqTSy3PrhSlKTyck07e1W8vna\nioVDkpqkKxqcj2wmlC5h96pwdnei6xxEcy5EPlegXBaxWHTorFZMt2EsfVhsHR3YOztb7kxFQSUI\nuIaGHhg1wWi8wsW4GkFwIleaKEqrtDedruJ2m6jXJWZns8vzj0rVCtNkMlXK5QZmsw5Xfz+FxUVQ\nqzF5PC0xskulvfmqmkZDTzhZJ7hhFwPBduqZFM4t/QQ2DV03RKIoLZdyOFxErxfI5eqr7E9Jai57\n+FQqFVu2eMlma2QyVRSlZYjs2OFHo2klT5rb2uh64gni5861kuCcTnzbtz/wjbs+LP/5n//JSy+9\ndMfnf+lLX+K5557jL//yLx8aifh7Rbnc4OzZGNWqhF4vUKtJLC4WCAZt9PU5UakgEinR1mZBEFTI\nskKqYaXt0QPo/PPIYgNbRyd57JSyVWo1mWsfT63RiKO3l9iZMyuOu4eGcF7q0QUr1ySPS4+pvYvK\n0jxKs4lKrcbZ24vlFkXxLD4fnfv3r0xg3b59zYVo4N4aI48C/zfQBE4A/8fHfQPNpsKJExHGx1M0\nm60Z2+s18dRTvTgcBp58sodYrEStJuFwGFYJ45hcLky3WQcuSU0WFvKEQjk0GhW9vU46OmwrEqMK\nhcayIXL1eZLUxOezYDZr6QwacRplapIaq8eOYvfifeJZdNkKVUlgKirTuf8JihfHMNoFrD43vm3b\nMLpcFAp1dDoBg+HGw59Mlslkquh0An6/ZVVc9VbQmc10HTxIKRKhXixidLmwBoMPhJIgtMJuitIa\nm8uoVK2Et8s0GjKNhozLZcRo1LCwkCeVqtDb62Rw0IXR5aLv2WcpxeNY/X6ys7MoioLB4UBj62Jk\nromiNAknRPT6NozBALquLoyOKzNdLZdDFkUMDgezoTzvvbdEvS6jVqvwes0UCnVstivlxgaDBrv9\nymuv18Lhw/0kEmWaTYW2NhMOx0rvlaO7G2t7O3KthsZovOEYNhoSsViZSkXEbtfj81kuxd0fLhKJ\nBKOjozz99NN3fI3NmzczMDDAT37yE37rt37rLt7dOtcSjZYYG2uFvq1WHT09DrRaAVGU2bHDT6Mh\no9GoVqgp5HI1tG1O0iYBo1HDfEFElht4PKYVz5eiKJSSKfL5Goq7C1NfFTEZRn2pIMG7Zcvye5tN\nhZMnI4yNtdYklQoGe7sZ3t8DtRIGux1re/ttyQc4e3uxdXYi12poTaY1W814L42REHCIVrO8HwBb\ngPO3enI6XaFSETEYNHg8pjuqzkgmy8zMZJcNEYBEosLCQg6Hw49er6G7++72BhkbS3LiRHjZ2Jib\ny3HwYDe9vVfyOKxW3bL1fRlBUKHTCezc6UNVSnH+1bdIRNO426xs6N+L096F3W7g4lwRWW7tepdE\nPVufeZYtww60JhP5QoPXX58jkSij1aoZ6nfgMxTJz86gs1pxDw5iDQSYmEhx4kSYalVCpWqVvj3x\nROv616NRKiFeStLS6FYmaOpMphuWO9/vBAIW3G7jsk6BwaCht9OIQ1cjnSgwOZ1HpVIxNZVix44A\nb70VolwW6ey08+67i1SrErt2BdDbbC0p/8FBnFu2k43nkFRasskahUIEna618F82MPT61mup0SB2\n9izZ6WmakoTGYqNg6V3+PTebCrLcpK/LzMLEPIVEGnewjV1Pb6GtbaVhbbXqsVpvPsEJGg2CxXLD\nf69WRY4eXWJuLossK+h0Alu3etm1K3BfVk99GH7yk5/w/PPPo/+QmjNf+tKX+Kd/+qd1Y+QjJJks\nc/FimnJZJJWqkE5XMBg0eL1mhofdOJ0GrFY9yWSFXK6GyaRFrxcolUR6e3Vks1XGx0v4/RY6Omzs\n2RNAr28trY1ymaX33+f8uxdIxIs4OoIE9j6CdbCLrk4TlViUuddfx+Tx4BocpCzrmJ7OotGocdkE\ntEqdYqFKNhhg087BO/4bP+jZXQvcS2MkftX/i8BqNZrroCgKo6MJRkfjy8bIxo0edu4MIAi3Z/HV\n6/KyiNXV5PNXlDRTqQrhcIF6XcLvt9Debrvtz7lMtSoSi5UABVkUUQsa6nWZsbEk3d0OlKaMXKvh\n91vo73cxM5NBlhUEQcXAgAu328j0RIzyxFkMUpFAm442j4C0MI5jdx/Ovj4kSWFyMoUkNenqsrNx\nkxeDWYcoyhw/Hl7+zhRF4dzxCfr9Avp0DCUcprC4SODJw5w9G6dalS593xAOF5mdzbJz50rXYFOW\nSV64QHJ8HLnRQG+zEdy9G1tHxx19P2sdWRRRFGXZ4LLbW96zqak05XIDnzaHuHiKeMnKqVkViZJA\n14Yunnmmj+PHlyiVRHp6HAQCFppNhampNAP9Tow6BY1eTzxR5o03Qpw6FaFQqHPwYDcqFRQKNSwW\nPY2GTH+/k2KxpYGgzYfJnDmJ0dh6jIvpPAUpSfeOg8yEWiXpehoI2Ske22RF2dqDViViL00jVtqu\nm4T9YVhaKjAzk1kOCzUaMhcuJOnosOHzre2J8G7zi1/84q5Uwnz605/mxRdf5OLFiwwO3vlitM6N\nmZvLkU5X2bHDz7vvLlAsNhBFmT17gnR22i9VoiUxGjWEwwUqlQYbN7ZhMqgJL+V49NEOFEVBqxXo\n67HS5m2FQAqFGnPvnGDyzeNMT2daBky2hFqjIdKxBTkTpzl/DhSFYjhMMRzGvvNx1GoImqvEz5yh\nlM5hsJoJmB5B2dh2x0a9WK22CizWsFr3WrizbUAbMHErb04kypw9G1uOeVerEqOjCfx+a6vM9Taw\nWHSYzTpKpStljSoVyxNnPF7i9dfnlssetdoku3cH2bbt9gRjxGqV9NQUCyOTiNkGAx2dRBJ1QlMJ\nTD4/VZeR3GKY5EhLS8Lo8bBjy3Z6ehwUCnWcTgM+n5n5+TypxRiLFyOIDZF6vkApFsM46CB2+hS2\n9iCbNrUxNORClpVl6xwgk6kuL4DT0xlqpQp2bQ3HrwzT53BQTacRy2VS4QTV6mr1wHi8vOpYMRwm\ncvIkTak1FlK1yuKxYwy+8AK6NW6F3w5So0Hm4kUK4TC5S7oCvu3b8W7ejMdjw+MxUYrHmXn1PahW\nKZmdzE/OU6u31HB7h/1YLHqCQStdXVfyLEqZHEtnz9GMzWFp7+RM2MjoaIZYrPVdv/baHL/2a0N4\nPEZKJZFmU+HChQQ//ekUhw71wswEsYkEw8NuVNUChaUw2XKTjcN99Ld7WUhI6Bp5UtPTeHV+BIeX\nkmwgngNjOEX70N01Ri7nnFxNrSZRLq/+PT3IKIrCkSNH+Lu/+7sPfS29Xs/nP/95vvvd7z4U/Wru\nBZWKSKUiYrXqOHy4n0KhgdGoYetWL2NjSVQqOH06hk4n0NFhZfNGN816mUgoQW+/m4u/PIO+msJg\nEGCwi7zHjH1wIwvJJpELs6A1IisqqhURh9NIbjGC3dVBqlHFo9EsV8tUUimshTSdbQKzr75HPt4q\njqgWy6TPnaa4tQtb+817mV1LNZcjMTpKMRJBYzDQtmkTroGBNempvNfGiAv478BvX+8fX3zxRRyX\nSpw2bNjAvn37qNUs1GoS9XpLJEav9yCKTSYmppEkFz2XEoFCoRDAB77escPPmTNRMpkoGo2ajRsH\n6ey0EQqFGBmJUSxeKoutp6jXYWxMS2+vg0R0nkomg89qxeBwkKrVUAvCqut3d3cTOXGCo0eOEQnn\nCZ1aApXAjt95BpOlyvybb7Jp8NcYffs0oizQZrVQSSaJv/sW9u5uur1exFqBs69dJF8TsNn8aLQa\nivUCNaVKm1ZAatRZjEQo/fKXbD/4JAablaWl+RV/bzS6SCi0yIULLe0Una5EOp3i3KiTwYM2UpEI\nAH1KA4NBQ6kUWf5+G+UytXyWs29FGNiwAYvXSygUInHhAsIlQyR1qS+LJ5ulms0SuSTic7vjsRZJ\nT0yQnZsjdOQIlWSypZy4sEAtl6Pr4EEKCwskx8ZYOnYMi8+H2dWBSqVCrjdolEpks3W8XjOJxBWD\nTqxUsDRzNNNNsnNz5AsNZi5CMmXich8pr9dEPZfB4nGSqTUJRyuMjMSp1STOn09waGMQVVOk0chR\nX1zE0dODx2KjNHsRwRhl4/BupHyJYLsdxdnBWyfixBbSgEJfVM1hk/OWDXhFUSjF49QyGTQGA2af\nb5VnxeEwXFs8hV4vYDLd62nm42ViYgKj0bj82/6wfPGLX2Tfvn38zd/8zXW7/a5z6yhKK3R5OTkb\noL3dysWLaYrFBsViA51OQKNpNfFTlJbuCEC1VGX8bBZ1OY3ZqGHT1gDTR95GpwW5XmJ+YpLY6TPs\n//ynWTwdwmTS4vI7yYk1HtvfQyGRIbMYxu10IRh1mLUizUxr/rzcGM+ZjtPlcjFZbs3TgqDC7TFh\nM6kpxWK3ZYzIksTSsWMUFhZan5HPU81kEHQ6HN3dd+srvWvcy1lCQytX5E+BxPXe8M1vfnPVsfn5\n3KW4+ZXSJJWqtej39Fzp13HtRHCz1z6fmWKxC51OwOs1odG0jIqRkRrQWkAuf169LpFKFBFjOTSZ\nGOloFJVajTUYxH9VP4HL16+kUiSmZskvlhGTRewWgXS6RuzURYJ7H2HbIwIdXg3vv9YgnpbQGhs8\n9kQv6qUxCouLHI9EMHs8uIeHiZwbh44KA49v5/z/foVOnxUKSWrpMv5tWzj/P18nOhrDs3MPbR4T\nHV1X8l22bBniF7/IAK0feV2006jXkEWJUqWJ55L8eFvAxRazgVOnWomXtXwefS1Nj8GGPDHB7MIC\nnY8/Tk9fH9pUilg4DIDnUmxcLQio1Gp6rqmBv53xWEtIjQa5hQUqqVTLEAFQFMrJJLn5eUxjYyTO\nn0drNFIvFFpy6W1euvt9XDgzDyoVyWSZnh4HBw50USo1kKUmZlOTDT4T1cgUakGgnk4g5QQESYVB\nb6G/14atFCJ/Ms7Zs000ZiuBTbt4PVtFFFvJzGNhFeffmMeklXn6uf2U585RHhvD6HKTCccZFCQ2\nPHuIhJLmzGyR6HzLQFTrtJTqKkZGYvj95hUT841InD9P9PRp5Esy1pZAgJ6DB1u5Lpe4XHa8uJhH\nUVqdqYeG3KvyUx50jhw5wqFDh+7a9fr7+9mzZw///u//zuc///m7dt2HjVAox/h4knK5JRbZ22vH\nYNDS1WVn8+Y2ZmayiGITi0XL7t1BFAVkuYndrkctN1CqOfQqFYV4hYHdnXjsAqNYiIcyxGfj9AwM\n0d2rR63VkDjyJsmxcQyChLs7SGQpjs3roSk3EdTQ7tNjE5rkMq01IjMzg6DVUs/nEapVBrsMiCo7\nRpsFl9/ZagugUiGL4k21rK6mmkpRvkpqHlqiablQaN0YuYbfBvYA/9el138OHPugk/x+C11dNkKh\n/PKxQMBy3f4C11KtikQixUuhDyPBoAWdToPbfUUX4mra220rwhONhkytJjJyMsT08TF6hgN06tIk\njh5Bo9dTikbpOXSISipFYWkJtVaL0eWi2pCpSSokUYZGBY/biMNpQmOxsrXeREIAACAASURBVGOb\nnYnJNO//8hwGh5PgUBfTR8+gSoXwunSUIhFKkQiCTkd7j5+xkUl2feoF1If2UFkKUW1W8A/1sXBu\niky6wsIrb7BVa+L9SJUnD3TQvbGbto0b0WgENm1qI5mskM/X0Gj0DPYP4TZV0WkVsFhwDQ5ibW9n\nS5eA220imSxRizbRV2so6ZbRIVYqxM6dw9rRgb2ri/Tk5Ar9CUsw+LGWD3/kXFaPvaqfy2WkWo1K\nMklTFNE4ndg6OigsLpI8P8rmZzvRmzcynzdQKjVQqWDPngAGg5Z8OELx/Dih//cVcnNz2Lu66D50\niD2PBfE3XKTyMkOuMmf/9wiBNj16s57Q2UWs2QrtbYMIRjNnz0ZJWqporS4KqSjxVB1tvo6YL6Ax\nmtBbTDTSCaRSEfeW7WTOnECtEVBrddg7OzDYrOTzdUolEYfj5sbIZVevfLkrsaJQikTIzs3h3759\n+X0tleFuIpEipVIDp9NAMGi94xyr+5UjR47wyU9+8q5e8ytf+QovvfQSn/vc59aki32tEw4XeOut\neSqVBpVsgbdePU+g3c6GTT50JhPbt/vo7nagUqlwOPSYTDoqlQYOhx6Px4TVCGKjicGkRVMv0OmB\nRlPgzdcmsepl8pE0uUiCnoFnSIyeJzN+gchECKfXTi0Roe/pQ6RnZtj76U+RvDhL7fxRTP2tKpfU\nxAQGh4PAzp2tnjWKgtFswGm3ozWbWXrvPeqFAr5t26im03Q+/vgt5XvdSFFqrYoV3ktj5EeX/rst\n9HoN+/d30dHRKpF0OPQ4nUbK5VZi5o0mvmpV5J13FgiFcshyE6QGG7YEeOKJ7hvuDIeG3CSTZSKR\nIrKsIIoyXV125kanKFVEjr1ynOyQm163h8LiAk2VwPzJs6TmlpClJkajGsUtk9N3gF+Ht72TxLlz\nhOeTOFQmCuMh5IyRcMnYqvtWmthsejJjIbRqGbet5cJryjL5xUV8vgBOmwZBqpJO5BnYuY2Z//o5\nE2+8R7Um42jvJp8UKScTxKeSzHmgGZ9DFkXqhQKDAT/JDU5KFRlBENDrBXbt8NLXoW0ZTlcpswaD\nVrxuHRdnjq5qey2Wy0jVKhavl56nniI1OUk9l8PW2YlneHhVRc1aplCoLeuwXK+aRKPXYwsGaTYa\naAwGpFpL48XodKK2OJHNbgyeOrVCgY59+8gFAi3viMVEd1sATbpV+pvP13njjXmefypAY+o0jXRi\nuZ2AoNdjaAswF9OwFM6gNpgIn5+kq8uBILR2Z52DQfLFCo/utTMdU5gTRUrJDKpqFptFj9VuJjpS\npByKgs6IYHUSz8oE0ln6Dm6md3eVpsWDoNNdUoKcxdDlRlULADd3/YvlMmJ1dWfTZU/RVRiNWvr7\nH56259fj+PHj/O3f/u1dvebzzz/Piy++yDvvvMOBAwfu6rUfBJLJ8qXigNaG9VpvXCiUa1XKxNKk\nEmUWQmmioQQWoU4o0mBmpoOhIQ9btngxmXQ0SiU0ajVbtvj46U8mOPruAqHZLC63iWcOBrBqJcrZ\nHO1dTsqZPDa7kWIyhUCTSqGMWK2gNeiRGyKpVBb7Ugx7wE+jkCN+/gJSuxejzYJ/5076nn0WqVpF\nrFRoFAqIgoB/504MTidzb71LTdYitHVSrSvk5uaw+Hz4tm37wO/E5HZjamujeMl7DaDWaNakVwTu\nfc7IHWE269i0qY1crsqJExHOnImhUqkIBq088kj7Ck2Fy0QiRUKhHNV8gcLiImK5THZmhnanisHt\n1++yajZrefLJbjKZGo2GxMxMttU4T91SyKzWJCancwQe7STY1UMhX2PkX35EqVDG3d1J4Llf4/X/\nMYraZCaXyFGr1XnqyQNY+5NUtE6cVgFRbSAayeMe3oJSzIBWh9HlRFAktMYmpXgcuVZDMJhIRXMU\n6wLlYg2VLJJNFbl4YYlSvgJqDdu3WWlXa7G4HZSyM8hNFdmpKZr1OiqNlrJ4gZ7ODaQsTlSChm3b\nfPT1OZcNuGKxvkJrwm43oHc4VhkjepsN7SXLXGXzoB+2YtUJd1xifS9QlFYy6OhoglpNwmTSsn27\nnw0bVisTejZuRCUI9D37LPHRURC00NaNFNzM+bkaGslMX7uDSmQWi9dL29NPIzq6eOvnF7mmfRHZ\nRA6pXsfa3k77879BUG5SW5hk/mKMsyNFZKOd/h0b8JqcvPm/LtBswlIoiSfgYue+AdqCTty9VhKp\nKmZZhVdjQJVdorQYQqc00HcFUesNGCwmwqkaDW1Lw2bH7g7yJZnIVIjcXAizRU9vm4Olt15H9fjj\nN62A0prNaI1GGqXSiuNrUcXxXpNMJsnlcvT399/V66rVar7yla/wrW99a90YuYb5+RzvvLOwnCht\nNms5cKB7RbJ4Pl/j/GiMRjbNUrRKLlPGH7RTr8sk5hbR2lo9x2YmYxCfIT83g9ZoZK7hI5WqUMoU\nselFSrkip0a0dP3mMGK2RmC4j3w4jOg04en0Y/X7aEai+Pq7qFVn0KhBYzNisRioVhqMHp/m1JGL\nPPa7G9Dmm1iTSQS9viV8CKBStcQP02miY1PMj17E3tNLoaZmYTzG8LAbeyRyS8aIoNXS8dhjxM6e\nbfW8utTte90YucsoisLJk1Hm5nLLx2Zns1gsOvbtWz2x5vN1xFqd3MwsFpOA3m+nXm0QuziH32vA\nepWinSw3mZ7OMDeXpVqV6O52MDTkXl64DC4X2XyddKaOtaEQixZwBAeZ+K8jZJaiqLV6FLWGt356\nmnxdj5KvYx/agF1ukNM4GHxuG/lUlsWxELpqgd4eOxVJg2eoF0EDHb1umDlNI7WIyeWilExiau+k\nEo+y9eABUKtwdfhZijcYeO4wc0ePk1hMkcwr+LbvJtO0Mrx3E+3tVhqmQcr2VtJTMpwi/V9H2PYb\nnyRcUpNIlBgcbOXZxOMl3nlnYYUK5/79nXi3bm01RbvUZ0ZnteLfsQNBo2F2NsOJExFKpVbSV3+/\nk927gyuqeNYSiqIsG0uxWIlTp6LU6y2Z5Xy+zokTYVwu4ypxO63RiH/7dlyDg/Q+8wyLC3niuSah\nWI3z4xmkUgFRE2BX/yAaTUshMZmT0ek0y1VflxGMZkz9mzg1VmJ2voBarNNp6cHp7yL61iix8TCi\nxox+kxf0JuKhBNVKg3y+StMR5NhIls6gzPhohGee6cOeifD2T14jv6Wf/c9tZunYcQRDA0GvY+Ou\nnVQEO5LUpL3dxtNPdTKuSVPvHsDj1GCoZ1DrdCQnJmiUyxhdruu2MzA6HAR27yY5NkY1k0FpNrH4\n/Tj7+j6ikbp/OXHiBHv27Lntxni3wu/93u/x9a9/nfn5ebrX6ILycSNJTUZHEysqtsplkfPn47S3\nXwkRGgytqhVFlhEEFZLUxO4wUCzU8PltWMxajh9fQs5EGerQsf9RH3qbmXOvx5kLVcmUVagwEItk\nMZgMLCwVURQ1F5caWDQu2vr96DSgdbjw6LooRiPodw2QC8cx93lp372DQlGkMhNn868+T8nSwXsn\nY/Ts2Ii7v4daQ0GrNFCaTaRKBbEhUiiIxC+GWDo3xdDzz6I1mYlFSwwduHXlY5PLRe+hQ4jlMmqt\n9rbE0j5u1uaqcQtc3sVfy+Jinp07/asWRKfTgLpZp3PQz1K0ytxCmWC7DZPTSTEaXWGMzMxkGBmJ\nk8tVcTqNzM1lqdcltm71kUrNUVfUZKo6PEMDDHdqsetL1ApFsukKVl8b5UwBwWQhPhlHH+hGa7eT\nStdQFBCMItZ4GVHUYOnsQa7XGBz2YXeYiUaLCIKK3k09GPtMhN54A6O/g97uXhroUWplkufPEwtn\nyM7MgNWDbvNWbDseZ/NnOghXrBRMZl790Tv83n/bB9o677+fJDz+JorZgafDz5bBAcqZHLWmllAo\nz6ZNVRwOAxcuJJbFu5pNhWy2ytmzMT7xiQH6Dx+mnGiFFUweD0ank0KhxokTkWVNlmpVYmwsRVub\nednAWStUKg2mplrGpdGoZcMGD9WquGyIXKZalchkqquMkcvoTCbQ6JiNZ1lcLPDOOwuXUkrUvPp2\nnL7Ne9mxq51IpEg4XMBm02Gz6cleSjo1m7V4O1z87HSM//Xv55AkBalUYGC4jV/Z4SWWqpOvgFhv\n8NbpIruefQbH1BSldB73QD8LopdioUZTVvjkJ4cY7DEy/UqBbYd243FqSc7HMPZtYPjxHVh6hzi3\nqOH9I0vEUg22bPHisUG7o0FdztFIFNH4fETPnKGSSODbtg2dxUL7I4/gHhpa/pubTYX5+RxzYS0N\nzQAdW/S0+/SY2zx3XafkQeDEiRPs3bv3I7m21Wrlc5/7HN/+9rf5+7//+4/kM+43ajWJYrG+6nih\n0KBelzCZdMhyE1Fscui5QU6/M4HLL9Dd46Czw0p0LsbA1h7eH4mj1yhUQ4s0khrMDgv9G6yIlRqq\npoRWr2V2NoNaraerv40zJ8O0+aw88sQgEyOLZKpw6AkfbqeWutqPa2c3umYVo1mHpi1IKA5jmQyW\nDUO4TRqO/OwsKlMbCdHGqbdiWAxt2IqzKLFZchPnaYhNDN3D9O1/hMlfvkNqahLb4FZUiozzNkUk\nVSrVfSG1cN8aI1qtgE63eveh12vQaFYfb2+3snV7O//je0eZnohjsBqRNXqOnUzwq796RUyoUmnw\n6qszvP9+hGazJTi2c6cfk0nL8LCH/fu7OHMmitdnYdOT+xgIwOLZcQwOA7LBisntRqVaQK4UaO/1\n0bDYqepc1LMSarWKnh4HwaCVhYU8glaDyWKns8vJ1q0+Go3WezQagdRkFk1bOwtzObK/PI+7w0vo\njTew+b1kGgbcbZ1EZyP0P2GioPXyP49WmZ2P8t/+YDvbHuklW2gi2S0oYp3+HQMoGiPVagPZ5MDk\nbUNcbO0QasUy2XKe2FJLifZy7FWSFAqFOo880o7PZ13VyyCfr69oOw+thSsaLa0pY6TlQYswMZFe\nPhaPl9i2zbdK5ValYlnt9EYIghqjUcvUVHpFCataoyWerDIyEmNkJI4oNimXW9/P1q1eFAU2b26j\nUpGIxGtY/AHqlTolUaJUVxGJldi2t593XhujWBQxehycnW2i1g8SlbMUT0uYLGna2234/Vbiiwmq\n2QbeNhMF2UilVEYu5bG6HZRyJd5/M8JUQk17l5vZ2Syjo3F2bWtDzhnoCvbT1qeQHB0lOz2NraMD\nlVrdSk4eGcHa3r5saExOpjh6dGlZ8j6aktA6XAyvGyLX5cSJE/z+7//+R3b9P/qjP+LRRx/l61//\nOub1McBo1OB0GlfNRS6XEYOhVXUiCGosFh2CIPDYwUGUahFRgoszGfbuHyBT01Kvp0FSsNsMyLLI\n/GIZwZCjs8OMyqql1Mhy/rxEX5+Tnl4n46NVRs9GyWYusnmDAzUKbp+TQjaN2ugFt5+tW72k01X+\n+3dOcvp0jKXFHIosc+ipbjbt2cCF83GyhQbZVAm7W+bsL0/R4TcgqNWo5Drz759i46/9CsHtW9Cb\nDQR2bsbR0Y7lNgsEZFFEuiQFv5Zbcdy3xojRqGVoyLNCWl2rVbNxo+e6Saw6nQZXmw27y8TmPT3U\nJRXZeJZf/DxG+0AQnatIIGAlHC4yMZFeltSW5Zbi68CAC5UKNmzw0N3dkvOu10VOTxUxGHw4rVp2\nH36M8dPTdBx8DpPTxobeASYjMotLJaymIv42A08+6ibQ3cbmzW3U6zIWiw6nU8/YWJJUooBFVSEy\nn8Rm1bEwEWNxJolGLdPZ40YsFUhn7RicJgqVJpLWzPx0gvFkgWykzv59Q0iyCpvXg7fDgTYfY9tm\nD7pmldT8LEuxEvo+I/7gFirlBDZDlXponFwmDTmBas2CoDRxu/TE4lUqFZH5+RxerxmVStXK9KaV\n1KnVCmi16lXeBbN5bTX0ikaLnD+foF6XMejUNEolaiqIR4309jqYns4uv9fvt+D333yCFwT1qsot\ntboV1qqU6rz202kSUyGsdhO29gAmtxuzWceOjVZyczMsjodwF7Mc3BXgvfMashkr8XiZVKKMy6Lw\n27+7HbXJStdggMnRRc6eDpOOpBje2sm2ne1MXohQSGbJJIqcr+p5tKsdlVhHr7Gg13gR5CrW7j6K\n75fp7mvDZNIyNZEksRBj35Ca5MUL/Ow/Z9j51E5MUhVLMIg5EEBuNFBrtYjlMo1SCZ3ZTL0uMT6e\nWtF7RxSbjI8n6etzotWu3YntXqAoCidOnODb3/72R/YZfX19PP744/zgBz/gi1/84kf2OfcLgqBm\n+3YfxWKdbLaGStXSu9m2zbuiJ9LGjR6SyTJTUwXSiRo+t4ZP/vo2mhoNk5NZDjzqpcOjolGyMDcV\nQ2820NHrxWLR016T2b+/m09+cgBQtTwtElw4F8HjszB+LgKo2P7YEG5vkGZ6icrcBAndLo6Ni8xP\nx9E1q5jUdWRFYfpiS6hw9yPdVCsSZlUZTbmEupIln9Dh0mloFPI4zQYapRIFrAxs3YHi6aF94Paa\njGZmZ0mMjrbENC81ybP6/Xd3EO4S960xArBpU2uynZvLIghq+vqcdHffOJ6mqAR8nV4WQynmzi2i\n1gjoHW5KVYXTp6M8+6xxuSQxHr8sDtaSbNdqBRwOA01JQi7l6PBqSWdlQpOnmRyZYlyjsO/xbg78\n1pMcO52hFFZoNzXZvMXPzs016ukUZlUVJTXPmfk4sbIBq93E8LCbRKLEyEicHnuF196YYuT9Wbbv\n7WHD5i2oE2cQGnl0ZhMdO7Zx+myc3RvtmLRN4vU0bR1u0k0Rj0PDcLdMWWnSMRAkoI0xMjqGw2nk\n2H/8GJVKhWt4A9HRcZzaGuqmQCG5gNrnwrvnEfYGzbz30/cJXQhhtlt5csdWXIPtpNNVIktZmpk4\n1aVZpFoNV38/ruEN9PQ4VngIHA49PT13t5fPhyEUyjExkeTChSRGQUJJh9GrRdRqFS5jg1/97b04\nnUZKpTpWq57eXicm05VKoFpNIp+vXWosd6XipLPTxic+McjISIxotIROJ1CriZi1EhePXSCXymK3\nanFFw3i3bSPjbDK7dIzpV1+lafFQjMnMRc+x8fEnWAobQaVh564gb/w0hrohMDueRJAq7Oo3s3nj\nNnIFkUalit0GffvtxBcSuDZ5UBTY8olHkBaDJM6dJTszg62zE1FqUlicx20yUFYcxJZS7NnqZObN\ndxg7PoZer2Xy1BR9PTZ0Rgv5+Xl0l5JULcEgWlOrzF0UmzQa8qrvtV6XkaTmujFyDUtLSwB0XqOx\nc7f56le/yh//8R/zhS984b5JGP8oaTU17aZYbKBSqfB4jNhsKyvEXC4Thw/34/GYmJ3NEgrl+feX\np3G5jDy2WUfh2ClO/jKM02lkx74NGId6OXoiSTaextdmoFKus3PfIK8eCdM34EGl0eLr9mI3q2g2\ntBx8biO5skKfUeTkkTfZuaeLqgilTJ70QoRqNo9Rb6KOCr1WRZtbT2fQRDGVRhMdx9DnxVJPICha\nmg4TOosFRVHo3thFz14nzg2bcXnt6HQalGaTYjRKOZFAYzBga29H0OtRC8KKrvHFWIzFd99FrFSo\nViWKySz1YnHNKmTf18aIRqNmYMDFwMCtlRJ6PCYcXieTc2VsHe2gVuNyGbFYtCuaIMlyE5NJSzxe\nRq+X2bTJw/Cwh1o+T/j4cUqxGHq7HYveSXpqEptZjcGgJZsqEP35UWybHkUuQ6mqcPSNCXb0gjEz\nw//P3nvGSHbeZ76/OnUq5xw7VefcM8MJPYHkcGaYRImStbIsy1rJlrW+Nu4H+9PC/mLAhgFf4AIX\nuGvsDYvFtbUrrS050AyimIfDiZzUcTpWd1dXzjmn+6GpkShRwVqRQ0t+gP5QB3X6PXhPnfM+7z88\nj+ByEfAXyGSqqPtHiEbb7O/n6O014nGqKEcTLN8J0G53SETyDM4N0XCNo9cJFJQKvI+4YCBLPlui\nSQ3v0cOopHUmbVUi4TyRW2GO/9Zn8Hh1ZG/eoW/Iwc6125TLLbrdDqZSDrtDz8abl5l65jwydQ/Z\nVIHWyhYaixFFK49R2UTaLdHZX8Uy28/d9QrbdzdpZpOMjNroM4uEb96k2+1y7NgUDoeWSKSITidn\nYMD0gXotHzXarRapSIq3X9tFrdfgduvYvLZAai9Mb68Ri02NVdtl8bVrlMyjtFod3G79+wjH/n6O\nW7eiFIsHDsdjY1ampmxsbmZYW0tSKDTQ6RRMTtpYWUng67WgpYTJrKLTqCPXqhG0MnQq6HWK1Dbz\nSEURSTWPWaOh41IgyYU5c3qG3j4THamcseMTtBotJLIEXn2dd69E8W/E0CqhXS5gtOg498k5wrdf\nZu6zn0RqcbO2lmRi7hAOiQSdy0Vma4vqzjrKdpHE8jKmmSO4rTKGvHKq2SKHp0z4FzbJrcRQTj6N\nRmeg2BxgdzeDFDUzngkk74VyNRoZTqeWQuH9OXm3W/dzuTj/smNpaYnZ2dkPnSCcPXsWQRB44403\nOH/+/Ic61scZzeaB99H2dppWq0tPj56ZGcePNXwUBAmlUoPV1eR77b9qtIou6aWb2HVtVEMmqtUG\nS28vMSwaWbgRxu7Qk6+JdJGwsRbnNz8/wcJqht/+7TlWluKk0yV8/TosQpFCcBNDTssnvnASudCh\nKMgwyWt4XBqW90O0s3mkCgVjvR5cuiaKcgK5UCZaTNMtq3DPTrJ/+QpKqYl2vY7v/Hm8D/2o11di\nZYXk2hqCXI5CpzuQVigWUer1WMfGsAwPIxEEStEohXSe/f0ChUIdQQK2RBnnoQSWfyMjDxZ2u4YT\nJ7zE4yXa7S5Go5LZWQflchOZTEAQDgpjh4bMtFpdNBo5KpXI6dN99PToCb5ziXzgQGa902hQ2l9F\nJzZQm80YVG2k7TI7a3uM9Q2QWE3cFwXTJKT49AX8l64RykpJ5DoojPfoPfc4m4EGOmWHo0fsrAW7\nlMoNJg4PIZEp2NnJMjzVQy5TJZdPk6vriCahmmvSrLURw3Xm+qsUtrcw9/XSO+NkasKKRBDItNtY\nLRpyFjU2m5pOu40oaeNf3CKbLjMm07L3xitE7m0yMDuK0mTEO32EZldGKhinKyq4dWWHaEmBkAzR\nrte4U2qifWwUt0tKIRzGNjHB2Jj1A9thHxTqhQLBa9fI1BT4ry6DTMmhc4cp7WooJpQIcjmTc73U\nUzFi8Rzmk73EUy3y+SBqtQyXS0exWOfatRDNZgedTkG322V/P3/fo+IH0xaFQp2nznkp+jco+bd4\n5nOHeffaPtlQmKHDQygMJu5u1JA0B+h9fBxFcgPJ4gJakxWJUYHrrI9ytUU5W0DRLDA47KGSLyCq\nRIL+e9BuEQ0WEGlRzJQJ7OWQd5vc+dbzDD/1OI4jpygk0qRXt5GWUxSCQQQxyiPnzrOVVVNqg8+r\nwK5pcevGJZQGAyOHRoj4g2QjMZSPXODqP9+lkMwhVVTZC99AojtoI5ZIJMzOOqhUmiSTB8XiTqeW\n6el/Waj4VwXLy8tMT09/6ONIJJL7bb6/ymRkczPNrVuR+yn1tbUUnU6X06d7f4QQtlodtrbStFqd\n91S2BarVFg5Nm3ff9dPr1jI+YWVnI8bueobYhp+x8X6WV9O88OIWs4e8JMNJulIZR+Z9DHjkdItS\nShYFBmkG/2tvImnV2Ljix9TXS/9j51ArZTQSYR4/34deKyUeLtDrs3D+rBerrIxK2iRw9y7Rm9dI\nXq9h7u9j5nOfQSqXUctmye7vE1tcRCKVonO5aFar1HI5qtksrXqd7Noa1XQaqUyGbWKCSjJJMJ1G\nEEXMg4N0u1329vKkU5X78xAKFchka3xUVX2NUolOu41Cr/+pJP1XiowADA2Z+fznJ7l7N0qz2aFY\nbNBotBkaMrO0lOC559axWFRMTNiw2dQ0mx0EQUK1UKIUiyHIZKgtFmQaDc1qlbEhA9VqldT6BsgU\nCA2BeqmMqFBSSSbJB4OMPPkI8Vf/gUoiSaeqwKq3EIjn4OYCobyBIw+5WFmOo7a5+Np/fJblpQj/\n/A8rSCVw/jMKZofVKO1Wvv31a1TiccxWLdaBHoK3F2iMH8U91kKtEtDo1YgqFTK1GqXRSC2XwzEx\nyvr1ZfK5KvbZXobG1DiGBxDaDdQOF2MOK3VDD1ev79LaXGT0xCyOcT21RpdYNIdloJ9c+qAauxSL\ncfutKqpJEa3DTrf9oyH8B43U+jr5QACJbQBRJmXXH0Vv8TPeL+LQuXDaVbQTeySzBdQOB21EoEWt\n1iISOagbymarCIKETqfLzk4ao1GF16vH789QLNYRReF+iiK6n8YhZklu7KFr5mktvY2PNoozU4Sz\nDXb3Q0hkCtZXY7RaLR4728fRU4/QSkVpO4col2pU9zYobG+ikXeRqnM8fGqEVrmC0KjQbbRRq6S0\n6m0GjkzhnR6hpjhHsSlH63DT3LhNPp1Fa9Yhs/pQ2Z0gU7C6lUawqlHVszRSMdq9HlyHDxPZSyI0\nQOnup+ehOS6/ukhqL0S72aTdaFCQSFi6NcHEoX4UioPiwMcf9xENpGiUihh1IkpJA1A90Pv8ccTy\n8jIXLlz4SMb64he/yJ/8yZ+wvb3N0L+wu+KXAd1ul+3tzP0mA7NZRavVIRIpsrubY2DAeH/xi8dL\nbGykePHFTeLxMqFQgUSixMSEDe1JK+OTLmqFEvVqA5lCjlytQm0xUxPVLC+t4HAb0Zq06I0qEukW\nxVyVF68vMXVogD6blI3vXKYeDeD0eZDqfOTiWaIbOwwNTmCyG8lsLPLYmJ7mlAV5u4ahvM/WUpip\nx09S3vcz+cjRA1VUqUglX8Q1O0tqJ0xhf59Wrcb+lSvYJiZIrqzQKJeRKhTk9/Zo1+skVlZoVSoI\noojn2DGqmQyZ7W3Mg4OIJgcdUQF8n4xYvE4SJZEP2/+5Va+TWF4m4/fTbbfRuly4Dh/+ief8ypER\nAK/XgCBI8PuzaLUKensNVKsNrlwJ0Wi02d7Osr2dZWrKzsiIBUGQvfLO2wAAIABJREFUIFPKkdtc\n5IsS9kJ5VGIet8NOPXGRZrGIyayiXixz6MknuL20ByY3jUqN/lE3KirsvvkWCpOFTF5KS8zQNzOD\nqVfPEV8PlVSQYKFNtiwlly6hVUl5+LidoalelPUUqy+tceJzT1GrtwnspKjVW9hnZrDPHabcVVKM\nNxBkSrRzQ4TuLOIYHcJz7Bh7l69SSVY49Ou/hlqnIB9L0iyVqdZaiEqR9Poq7vPPcO1iiNB6lFYb\nqoKWgQEzR04MkNxoIZHK0NgdxBcXEDs1PCOTZMUWpbyAOZLCNdT7oG/nfXxPqRZA1S7gG3GwtZHE\nfy+E6+wwuVtX0NXVZLNV7C4DtvEJwoXv6xN8j7iLooBUKtBsNBkwN4mub9BsGFGZXYRCJYrFBm63\nDpNJiUreQSZABxHL1BwF/xqdnXUUvhGkbaDT5sXntmlJRCTNGiPjTsx2N0anG+9wD7Jals3oFjIa\nbC2FqRUK+PIxRHsPntFetq8vYXWZmDs5Sy2boR3coCo1YPdaWLl0C7ndi1Kup7gXQ9MukA+FMJ77\nLMlyA0HWYeeNy+RDEZrKZxl76Dyp7ZeI+DP0Hz2E3Owgmzl4WXxP6l2Qy6lW6tTr7fvt8cX9ANnr\n12iWy+QApclE/yOPoLH/W4TkB7GyssIf/dEffSRjqdVqfvd3f5e/+qu/+kAPr18FKBRStFo5er2c\n27dj+P0Z5HIpuVyN06d78PnM75GTLLlcnVarQ7FYJ5Op0elAsdhAYTShbPUjdLe4dTuGQSugtZpR\negeoR9r0DdoplttsrCfxDVm5fDWEzSKnmytz859fR90tI43uIMgVyLQ6FFotbWMv+aaM6H6KyfkJ\ndmRtavEwNjOolDqKsRh6vQKpVIbG7WHx6/8N97ETuM89TTzTJHQ7ikrtYPRzs4hKGdndXUSVilou\nh9bjIbezQykeR+d203v6NOEbNyiEQnhPnAA4UHAOF0jkBAYefxJHwE98awet3YZ+aJxS/cO3Z8hs\nbxO9e/e+nUZma+u+4vSPw4MkIy7gJWAc0AA/+Up/wXC79bjdByZfzWabf/7nDVQqkclJO41Gm06n\ng8ulw2hUUK228O8WWEvoWL+xSi6ZI19sMjBk4+nf/Brpy6+i0GnptNuonAZOOXsoCTr0FgNmsiRv\nXMI2MU61UMaqUpArwcC4l1Y9ycar22xupNDq5IyfPUlekLOyHOWLXxgn8M7bbAbT7C1v09NvwWKU\nURrwYveaiW3uUC5UmBufRHd4mkBRzZU7OY7MWmjduYPe5UI5PIegzODrMbP0wiusXN0kuh2iW68y\nfmKCY7/xBW68tU5HpsI0fYhKQ0JNoSZZkWMcGMDdKBEMFVFr1Cg1Slwjo6xu5KiEAih0WvayCp79\nihWr9cHXiQBIBAG5Vks1naaezTA75EL+a7MEwmXU3j6e/H0PSf8uvUoRq6+f9ahA4z3PGZVKvP97\nsNk0KBQCqkqM5/7L81hNMhZfb+AbcTJ8+DjvZg9E8eaPO9EX9rn2NzdJB6MUBs24h7wYvR5i715D\nprPjMh/kbwWpjOOnBwkmmqz/4xZzc04W1pZxiVkGdDJie3EMdhMKKay8fJGBC+d59NwoKqVA36CT\n5RdfxWFVci+4T7MDzk8/Srhm5PY3b9OtlfBapZx5coaZz53m1mYL0e7F7DJTHPAiUyoo1ETiBSkd\n+yBKpYLdpg1nrInb56SYztJptZDK5aisNjw+FzrdQSFvq14ntrT0Pv+hWjZLYnWVgX8jI/fRbDbZ\n3NxkYmLiIxvzD/7gD5idneXP/uzP0Ot/NvflXxYUCnWUSpFisY5MJtBstqjXWzidWoxGJel0lZ2d\nHRYXYyQSFfr6DLRaXe7ciVGpHGgMpVIVnnlmhJrKy+AJB7H6CjqnntGJEf7p9RiHD7kZnvKwt5vF\n7dJRrrRRyqvkkxn6HVpuv7rIyENjnPz0M4SuvsPit59DIojIzFYmnn0G/2aSfCLD2JyPbFRHZnmB\nlWvXkSjUNEQt7WIWjUGL1uPF/eSneeG/v0MsEMfQP0A1V+ST/8uz+IYs7Fay9HSt2EbNVPY22Xnt\nNdKbm+g9HkSVCu/8POV4nC6gMFsIlA3sveqn0Wizv5+nt9fN8IVx0rkm4VyT01Mfrl1Dt9sls739\nfvtuoBSN/sTzHqSDVQZ4jJ/BHO/DhigKWK0qDAYFUqmESqWBRiOnWm3wwgsbpNMVQvtZ/MES7okh\nVFYHhWyJV/7xNpcu7hJumFEaTZTjceKRAst3A+wEStxaSJNtKAmGSgw89SnMvR469RqeIQ8GrZRG\nuUI8VgRBIB5IEF1aZtinQyJAt5hl9+46HQSsThPJ9U0G7BIOnRlHKWmglLaYmXWT2t1ja2ELURR4\n50qQb/6PVS4t1MjWZGTDMRKJGploksuvr4FMiWukH/NAP4GNIK2uFLleR0uuZWMrRyzTYT9cJZSR\nkMtW8YhJjk1pcbgNHD7/EFXU0KiiNBiQCFLisQLr66mfOr8fFSQSCdbxcUSVCrpdGokIveocZx8b\nolKHq6s1JL1TzD5zDu/kEA6HBoNBgcej4+GH+3A6D4q6ZDIpbruSnRsLtOoNTCYVuVydnc0Y6nKY\nuVkboihh1CulEQ8TChWRak0YLHruPff8QetfNkl2d4f8+iJzR3poNjuoNHJWFmPUSlUy+xEKqQJ+\nf46qoEdPiVIqSz5bJFeoIeisZG5f5sgAiLkgDrOMRLLK4lKMZLbFXqhCuiSBTgeFSk5DIieWl1KQ\nWllcTvLc3y/x3HMbjJ07xZHPPE6u3GZxJUu0osLQP4B/O8PVO1kOPzzJ7NnDWAcHsA75mH70IY6f\nGbof4m5WKjR/SAYeoJpO0261fuT4ryo2Nzfp6elBrf7oiHlPTw/nzp3jG9/4xkc25scB+XyNt97a\nZW0tRTRa4pvfXKJQaDA5aWN83EokUuDv//4eb7yxi9msQi4XcDk16NQSxsYstFodlEopHo+Ovb08\nNqeBeNNAWjfE6xsqXrmSobfHiMWq5ty5QdweA7FEBUEq4cR8D9lMBZVWycipo+znFJS7SgJrQdpy\nLSqjFrPHTiWVRqxlSGaaRN+9TnprkzvPvUJoM8T6pZt0SnkapRLtaoWRp58kngel2cL042fom/Ch\ntFp582KApY0CK6sZXvj6RfZDRbKRGMaBAcyjo8h1OiTvuaR75+cPOuIGptiNNmk2O0gkElwuLeFw\nkWrjQA5jft7LwMC/vOMxHwyye/Ei26+8Qmp9ndYHGId+DxKJ5H4R/PuO/xRV4gcZGam/9/fAIZFI\n0GrlvPbaDsVig3C4gFotMjXlYHJQA6F7yEyjlNIF7i2XKeUqOH392D1WcqkiiVic8SMnMZ9yE85I\ncRgkvHMtwX4gQK3Uw3hvP7feXmX26BF6Hn6UrtZMPhRjbSWCu8dF6k4QmVyklknRjAeZm3PTKqRR\nKKTo9Er6+ocohcOU717jC//bf8R/p0MxmiB27waFSh3zqfO88/oanbaCoREzOoPA+l6NwVEnlWiK\n6H4az+w4lYYU/70QDqeXsWNztJAy99hhbn5jm4ZERTqSx+E2YlB2WLvtx0aCPneUiSOHqLT0bC5d\nofO9cL4oRW21Eo+X3iez/qBh7O1Feu4cuUCAdrOJzOIkUlaia1TR6RTodArkcilGo4qzZweoVlso\nFNIf0aYxagWk3RZWqxrle0J6lUqLSCCJ2yfjoYfciJ0G168FKOUaNBot4ns1NCYjkm4bi12PqiUj\nLxEYcyjY8isP3DgVEuwOLWpVG2k1h8trwtxrpRiwsH/1Duq5XiY+8RSx5RVym+vU83lKHSUbqxEy\nhTa1jpR8qcvGRgpRrUFjNlAvlxk8PkmipeXSzTQKrZazT9oJxupYrWpuL/spBvapFCrMPvYQRqed\nT/w7K4l0DfNAD5891E8yUUSQyXH1Wu+LRQHI1GpkWi3NSuV986OyWJCKv5JZ3g/ER1W8+sP46le/\nyp/+6Z/y+7//+x/52A8KwWCeRKJykEpttrFYNGxvZzh1aoaXXtqiVmuTSJTpdrt0Ol3OHlIQu/U2\nzmqVx8dMzIwMc3u1yMyMg1qthShKeP75TXw+E4uLccbGrOwF8mSyVU6d6kUUBSYn7UxO2viHby9T\nTOZ4+OwgwaxAPJrn7qVlCh0tznEPJredbX+O6q0IZ37rMCqzEXm2gNJtxjPuo10p0ZUIaO02NEYt\nlUIJ79gEyaaLcCVI6m4eT7+D6QunufnOJp0ulGIxTCYl0lKawNWbyKkjUyrRejx0Gg30PT2MfOpT\niAoFe6EKrfb3Nw9yuYjXa8Dh0HLokPPnctDO7e+z99Zb91O5+f39A2PQY8d+7DnW0VEqiQSdH9iw\nGH6KhcGv/Nuk1Wqzt5fjO9/Z5vLlfYrFBlarCodDS73aQFrcot6WsBuu8cLza1QrDXRmA6H9Oicf\nsuF0S6mbh4kJbu4uJtncSOIbcTJ/dpjWi+9y/eIa01+ZRLq6jv/mKspqgolf/zyO4R6m9sM0pQoG\nR53UCgUkjTLFfIW+ATUuu4kj8wOUm3IkopSKxU3vmB5JvcSN//evaTWaCFIBqcFCeSvG0Gg/x6Z1\n5JbepbQWRebzIfZeYHUlwqPHnYSSO1y7uIZGbBLeiZLO9DD35ClatTrzj44hKlU0ml1senBZpET3\n48ydtiCpZkivruB5+DEcvh5qtT2kcjlapxOVyYTZrCKbrSKRSDCZPh5FjTq3G53bTbfb5eLFPba2\nvu8uG4uVkEgkPPxwHxKJBLX6g1tUPf1Wpg73UQgFkXQb9PfryWbrWPp62NopUijUGfVY0BlUlFJZ\ntBo5pVwGSbGKQqslubqMY3ISeVfOzKkeKi05FquKbNpCq1QimM5z4pCZZmCVVEuGxarn4S8+RR0F\n1hEfb/+XbzL58BEqsQi+Zz7LxZdXyOdr2LxO6rUGngEXdzdrdBVa5g4PsrJVJJKvY92vUSuVGJnt\n48vPOtl44TnEbIlH50fRDY1yZzXPc89v4HTqefiRXqxWDXqTGr3tg0O3okKBc3aW4NWr91M1KrMZ\n2+Tk/e90Wi2yOzsHoVmJBPPQECaf72Ot9viLxvLyMlNTUx/5uBcuXOB3fud3WFtbY3x8/CMf/0Gg\nUDjYlddqLRKJMnL5gQAjSNjby2EwKHE6NUQiRXpNDdZfuUJoL4XXq0ciyXB4VsrYzDR3F1P09Bh4\n441d4ODdcOSIi2q1hU4n59TJXna2UxQyJdaWw0QjBWbnPCTCShpNkFsc2FodlGaBcLGGtu1g8Z0w\nxVwZk1XHdqjBkMPCbjxGdiGCUuZEEBLoxDqZSIq6VEv/mccptGBhIc7WegxBriR1J0SxreChk2Mk\nd/eJ+UMc/dIj7N1ZAUGkVckj12holsvYJifpmZ8n5/eTCwRomvpoFnKIuu8X8EokB3YoPw8RAUhv\nbt4nIgB0u2S3t7GOjqI0fLCul8nno9tuH5zbbGIaGMAyNvYTx/lYk5E//MM/xGg8CCmNjY1x4sQJ\n+vv7Adjb2wP4n/4slZpIJssolSUeecSA399lczNDs5nGqtWQuxfHc+wEb1xZYGxcwepym3ymxOC4\nGrlZxDncS6YIb715l8BuhtW7eW7dCPHwYzaGZq3EghliiSq64ycwmVW4OkX8V25gOHWKll5BO99k\noF9HS2XEOjZCO9eiGvKTs/tQjw2Suemnki/S89AQ1uFBEqEkaqeLbCmDrceCx2IlYzbhmVCw9vpL\nRC8v0m63UYWjVGoZTs49RSzdQDCITB23U8t0kKsUOMas7EQzjIyPUN0OYnVJMBrVNCJZNm8HeegR\nD9V2CRkHi008FWPosAPBYKNWa9Nopul2c4Dlvd1ICpdLy/nzR1AqxZ/7fvwiUSo17tuK/yCi0SLV\navO+VkajVKKWP9AAUFsstBsNIjdvMnpkiEY6zt7qLuMjTgx9A9A7SWKnwtxcL3c30xy6cIL+vjUa\n+TxauR6zY5ZqOolUFKkXCqi9LurVJuZmmF7bMM0JE9/+rwt86ulBtl57E6ddRbYNBquRSEpKyTiI\nPFrHPjlNoyNl+jOfRtE3wqO//Swb11cpFusMDHnpm+gn3s6j0KkwDZqJLq5itusIhTIMDlpJ+AOE\nvSUygSB7m1HahTQ+k5nnvrVGS5BTq7XIxZPYbBrOXRgmna5QqTRRKmXYbO93XzYNDCDX6aimUkgE\nAa3TieIHahSS6+uEb9y4311VjEToNJvYPsL6iQeNlZUVvvSlL33k40qlUr70pS/xN3/zN/zlX/7l\nRz7+g8CBIvSB8rFEcqAdMj1tx2xWMTpqobfXiFQqYLOpkZYTmIf7MY6M43GpyYeibC9u49b14bCr\nkcuE++Smr8/AyZO91OstwuE8l797h2SyTKPcZXbGickoZ3DIxJHDDvp7NMRjBfbrTroWFUc+fYHF\ny6u02x0MFgMT505QU9l49fVdbEKDZKjIeL+DbCZPC5FmJYvZYifZMVGVqDC5MoyfnScTzZCLRCnl\nq/QNOnjpH59DpVORCwbJBSKc+cTD5Fbv0mk2EUQRx8wMhWCQ3HvvT3kHXFolkWIeud74PguSnxc/\nHBWFgzWh/RNSNYJUinVsDPPwMN1u92eKon5cyMgHxvh/UpX49xaxn/ezRmNjfz9HNhVnZztBLivn\nxZf26e83cvSoG78/w68/1UMoESaTqZCJtSmVGsxM2RAUKhodAY3ShEKtoJqqEt6pU6so0dtklEp1\nlhbK2M1WLjx7iHqzyaWXd+h1a1DVExyem8ZqMNPzud8kuJOgkC6hpEMl3yAdiDJ85BhL9zLorW7c\n50Yx60UUWjV6rQz/mxcZf2weoZondW+VRrHAQ58eoxoJk3x3lXyhgQQwFMs0N7bwnDlPU2ai1LTS\nVOlpmevUkVLc6zB+2MDf/d0yc4e8JBJmbt5MYVe3GRx1cWTMDakAXQ66J4YmJxkXRUZGSiSTFQSh\nl2Sywu5u7j2VTiPRKGxvp5macvxP35+fF8VinWDwQFjOZFJit2vodLooFCLN5sE9VKlk7+2kDuSS\no7du0ahUkKlUGPr60DgclNNpBLmK4595jNkLNbrtJo7pSQJJMLtrvPrqDuVyg7bFjtQpR+eto7dq\nGZryEPvut7GOjSHXaFB4HCy8/hZ6nY5KoURyO8y//+oJLEKOjl1JJpFF0lSisZrRq2BozklB0NI2\ne1G69CzudigsL6JyD6Kes+DSy4jnBf76b9f59V+fJmZWoFbL8A1aKVeatLoyZHKR4FKIzhkzDoeG\n3W0BtUHL7e9cpa/HSyTVoVXIUapJWL2XxuUxcOdOjGq1hUolMjZm5dAh1/s8njRWKxrrj+rJtOp1\n0hsb72vz7rbbpNbXMQ0NIcrlP3LOLyMeVJoG4Mtf/jIXLlzgL/7iL5D+kkejGpUKHqeS6Wk76+tp\n7HYNpVKd8XEbgiBhfr6HVKpKNlthfr4XfVfH5e8uEQmGUShkTB32cvrCNHKnktArG8S6GkSp4n6U\ndGMjiVIp4rKruLge4PHfeJhvf3uVcrGC063lnUt7IEiZP+Fh4tAA4fAyLz6/xtlHexi+cI5uo4bK\nZGIvCXv3kmQyFTxHzMgUCe5c38HcN4B31oNBbHDz0j36jDlW9tK0qiWKqSK+6T6k43aK0RgaeRvX\n+AjFTB65Wo1GLVLa36P39OkD3Q5BwNDbS+jq1e/PTzbNsNXK4LgHiemgEN3l0qFU/vxLvbGvj3Is\n9r5jSrMZpcn0U8/9l0RHHyQZEYHvArPAK8CfAO9+FANns1Vu3AhhkuRZefEy/o0oLp+H//Bb43z9\n7wP09xt45JE+nD43lo6PzWiXh455eefNbTLRNKJGRwcJhw+NYu1EWA4kKKfSFNIFjE4PolyF3W3E\n7jIw0G/k//vfX8BsVFCKRSm222wm5Ez/2iTPf+Ma4XARmdHEcI8Kl03HxNRRotESerMOlc3Bu/ey\nFApZHj7Tx7BJT0PnJLiwSl+PHoXRTK1apezfRK1ToRLb2J1aVAoRrVqgUcxDrYDDZAFByu5+iVis\nhLRRRK+Vo1Yfxu3SceXKPmq1jE99apSRYRMWIU89sE5LFFGZzXiOHr3PbB0OLSYN5LJltrdrtNsH\nTVAajQyVUiSVqn4Ut/ADUak0uHQpQDhcBEAqldDTo0cQJNy7l8BsVtPfb2Biwo4oSqkVCkRv36Yt\nU1NSmanWWlCBVKDA4o6UUiGPTV9gxKdDJW1SLlRJpeD11/3Uay1mZ2z81//7Gul4AW+/lbFhKYl0\ngCeeeJpK6IDIiSqRvkE7Kxdv89DMKHKjmVtvLTHdJyUSSCFVKFCajJRrQDmNU9eiHVjjkU8cJl+T\n8nf/12t4+ix4hjzkNVquLWfwDRiZP+pAJ29yayuEXienXqlRzpQYGzVjt6swzLrxONQEFwtMTdrR\n6DRISy1sRgOlRol6qYDO5KDZ6hAMFqhWD3K71WqLlZUELpcOr/end2h0Wq335YW/h/Z7du2/CigW\ni8RisQem9zExMYHX6+W1117jySeffCDX8GGjXigQX1qiEA4jlcnoHx7G95SPUrmXcrlBJFJCJhPo\ndqFcbhAI5FGr5cg7VVr1Oi6nlkazzfbtDfrdM/S0S0grWRpI6LQlTIzbqdfbXLwYoNvt8plPj/Bb\n/+t5bl4LcGJGj9pk4JVX1zFbdUzMeAgurVMIannqqUEUCikStRLjgIu713dop4ps75Yw2Q34Bq1U\ny1VKxSrlGgTe3aNabeGVJejWW0TCedpd7YGhpT/H4u0wR4846Os3Y9SJzH/qFHTaDPRo2fynIl2F\nFFF94J+l0OuRKZU/0jLbyKQwGvUMzsz9QubePDxMLZ8nHwjQbbd/ZE34ReFBkpEW8EDkA0OhAspW\nkb0rl9i66yebrRLcinC8WeGZJ47QFuR84fNjNAolpP0jTDrrtO6GeOrTM+wGyxSyJeaPudAXtnn1\n//g/Gf3Sf+CORiC6kaKSyWHy+Tg23c/8MScbK2EGBs3E1raRGDRIdFYqGgehQJ7121uYvG586jxe\nnYTM0l1SlwvItRpszn62w2pW7yVxO1XU6m3uLceI5TSc+Mx5ohffoJDM4vY52VrYZuqxE/SNeSln\nCihkHUq5KtpBH4W2ilwgytyUGblCjnoziVph5dCcnXCkwMZ6ip29AodmrJR3t9jeyWCYH8Z5+DBK\noxGlXn9/d9tqNEgsLZHZ3qaFiF1Q4/GY6MoUtMt5wsv3wGEi1w/GX1Ck41+CSKREJFK8/9loVHL7\ndpRKpUmt1qJUaiCXC8zPH3iH1PN5Wgod1+5kCfn9SAQJo8fGiSbTZLf9ZP1+up0OkUODPDzvYHsx\nTSDRIZWqoOxWefv1NDarBqHdQNJuIBMl3Ly5z9lHe9m58i71TBKVToPa4eTMM8eQUuDwvA+vTeDE\nyX4OPzpFp9VGpVXSyOcILNyjmEjhf+0N0qtODn3pNzh5po+Mf4/QxTcwD43y+NkRxoe0bL31DrE7\nIieODFFrtBme6mFzK0MxW8Lm1HP83HHqS5cxuuxIIjEUYp0TnzjFty5WaNbbKIwWZGolY4M6gpsh\nUOpp1mq063UqCOztZel2u5jNKjSaHx/dkGs06Nxu6vn8+47rvV5kqo9HDdGHjdXVVcbHxx9oVOIr\nX/kKf/3Xf/1LSUa6nQ7hmzepptM0ZVpa3S7ptTWcSiW+4QP5romJDktLcarVFt1ul8OHXWg0Mt54\nI8pEbx+ScgZJuYpM0JOriniS+5w/76NhGSSZa3F7Mc0//tMGI6NWvF49e3s5Rkd8xDcv4nTrMQ25\n6e01Uy1VyITi5PcDtKoVJvqknHQk8J0+TiYUxakqced2hF67gfmzk2gtBl7+26u0pUqarQ4Op4HR\nUQuL/3iNuSdOEVPoGLJKmRrT4raOkco28fabmB2QInaraBol/CsBbq+2mf/cZ8nt7hC6+S5yhQzj\nwABapxOl6aCT83uQCALGn1As2u12aTebdBCQy386BZCr1fSdOUNlYoJuq4XSbP5QIp4flzTNR4p2\nu0MtGaNaKqPXK6jVWkilAplQnNmjAo4hF9e+u8DbLy/QbLSYPTnOqSdmyeSaOPrKdLIJFJlt9lZ2\nqGaydLZv89lPHuN6r4lUrMDMyVG8LgU2q4agyURFMOCaP00uWyWdqyPNtBE1Guz9XsaHNMikcO+d\nO9x4+TquXhs6gxb3cAfHgJJjx71cfnODTruDzarkzKyaUjCEXKPEOneYlkJJrxcygQAzv/ZJ9t+5\nTDWTweAbouexJ/jP//kGfWM9CFoTg0N2PG4N4UCKeKKMQqMmk6mikndRZ7a4/dY9jj89z/XbaSIv\nBZg+PcPMMR/9/Qc/vO8J2ci1WiTNClsvv4wgVyJTyuiojZQEI6n9KJJylrlfexrDh2wY9sMolxvv\na20XBAmbm2kGBkz09Hy/0CoSKWKxqJEqFESzEoLbBw+y0XzQ6pevdGnnv09q9rejVJ84wt69ML0D\ndtQ9JWIbfiZ8AwRyGq5F4jRLDVpVLYcfnWX/1l2Wrq6hUsvQ6+voM1k6opLeRx5Ffe8eNkmZYlzD\nwms3CK0eFH3OPHaCsc98lvDqJkazDrPXRm5lgdzmBusLAaStOrUry3z1P/0JjZAfpc3JpUv77PzD\ndxgYdfLMFx/moUkN/vUKY3M2hFqaQqFOfDuCc9CLZWwM9fg4h6o5zC4LrXKZx875GOlXsfBWAIXF\nRiZVJpOu0AVmJsws3inTaEs4daoHh+PHe1k4Z2dpNxoUIxEA9B4PjgeUsngQWFlZYfIHCnofBD7/\n+c/zx3/8x2SzWUw/Q/j8XxOqmQyVBqxG5QT34kgkEoZGbSjjKSzvkZFotMQrr2zzyit+KpUWer2C\nL395BhDItTTozHpQ16hGQ4gqJTsZJbe/s4RruonF18/i3SiPnRtgbS3F66/v4HBosFg0nP30Ca6+\n46exneK1l+9htuo4fXaYrs5OKpMArQm1KkIjuElueQMHSj7unkTOAAAgAElEQVT9ZA/VepvO/grW\nwYd56jOH2FjcRT7joM8poxLwc+SpUzhPnKLhT9PnVLCxEiK0l2Fg3MtMHyTfvUL45i3kGg2uYydQ\narXEd/ZpJlPILC4MJhXdVovI7dv0zM+TUSiopFIIMhmW4WGMAwMfOJf5YJDdd+8S3I4hN9twTE3i\nGfJgs/1kt3KJRPKBadpfJP7VkZF2u0O53ECpFH8mVvdBsNk0RKUSGvU2PV491WqTTqeLzaZmcNhM\noV7n+W9codPuIEgFVhbDNKVKTp+fQKOV0yHJ+ht36JkaIm3Vk9veQBrc5dHpWZRH+7FM9rK3k+Ta\nZT9Gtx2T28qtazvsrQVRmG1MTrtR1jJMeTuo6gkMQ2MsfSeL2WmGRo3Ebppms8HRHivhPZHN5SAG\no5Ixr0Dy+rtUAtsopV06UiljT15g9+YSxWCAxHWRvvmj2A4fA42exG6Q80+McPVGjNPPTrEbqpBJ\nVyhXO7jcesYn7cTCORRdCaEba4w8NM6tu0lqxQDVaov9UBl/uMEXvjCN06kl6/dDt4uoVLJ79SpK\nakhlItHtINFElaNf+CzBHNxbjmAb2fjIyYjZrEIUBVqtDhLJ9zV3ftjUrVY7SCuoLRaKTdlBxVL3\n4IHrClLqzQZytRaNQ0KzXEaqkCGIcuw6SF6/iH9pl2QkQzm0j75/kJOn+tla3qeSy2NWd9i4HkBQ\n6ygXMrSrFSQ6ECNRoguLbF+5zcmv/Xsuff15tq4voDBZ6YpK3n7hBiq3l3trKYYmjuA9NsvGWgSJ\nT8OIYwx5JYFeI8DOHdLBMJEUPHx0hJFBPRv34vzT19/h/GdPYPVYCS+u8fJ/+u/0jXhw2BxEi1I8\nNiftVJi5mV76ejR0mw0cdiWdZoOxo2O89eYum9sZCvkaR4568W/GmZh2sbbXYGEhxoULgwe2CNUm\nrVYHrVZ+v8hVodczcPYs1UwGJBJUZvPHptX7o8Dq6uoD6aT5QZjNZh5//HG+9a1v8Xu/93sP9Fp+\n0ZBIpazv1li6uXf/2M1kAY3ZyCAHO/1795J0Ot9XUS4UaiwsxHnssX5u3YrQaIi029DX7wCk/MN/\nu4ZaLSOdusNTkyNMTDtYWU1y61YUq1VNPl8nsJ/D7XTj3ysypdcxPOogkW2yvpZEQQ29Qcm7byxz\n9ISXzNYCybs3URv1VEKbdA0O0hUZ6t4I40M6VNtBZAoRpUZHY8hFQ6rFPuLEYFRxbzPP4kaFeqbE\nqTNy9t54i9CVS8Tv3EGh05Ld3eXI177GzvWrGKwmrMM+WoUsAK1KhWalgu/CBWr5PKJc/mMdeUvx\nOKsvvcLty5tUSjWkcgXZSJJc+VGOHO/7sQaDHxX+VZGRaLTI3bux99x1RaanHQwO/nQ1uU6ny95e\nDr8/Q7cLw8NmBmaGiK+s0qxU7vdfe0d7GZzu53/8P2/Rea8WQmezEk21CH1nFb3VyPWbcZ54xMXw\nw8eJLK1gGx9FpENqa5PtS1d46GuTLCzGuPvWAiaPA1bC+MYGUCkGcXuMTM84OTKuIXTnLq29VbLF\nPPV6m+FBI+vFHOGNEKIopZzOUa80mBnTEQq4GfHp6FNnufW3b2PUieTzdUxmFbFbt3AMDdFKhKjk\ncuxcvIznyByuY8cpRSLIpTFOTtkwmpRUtorI5SJPnTajqcXI3PAz7bSgtVtZ3lWh0BvYfWMJq+3g\nx9xuNtjezhAI5HA6tUhl7y3q3S61bBapVIIgCAgSCXq1jGYug1KjppTJk8/+aBfLhw2XS8fUlI31\n9TS12oF+yPS0A7VaRiZTJZutolBIOXXqgCQJUimDcyPshyvUcjm6ajUjEwOUF2KInRyFdBy9Xsn4\n6UM06k1cTg2hS1Ek3Q7ybo16ocCopox5RkM1peKRTx0lFs4RjldRaaw4HQaEchqpKGAfHyMZiqFQ\niIhyGY1WF/f4MPsbQbLxfSx9PaT2QpgsZnKigStvrXLrxSsIShX6Ph9zxydxVjeJrqwid/Sj6MZZ\n+9bf4hzzMWa3gaefTEmCx6Vl6YVX6AoyQv4otYzI2OFh9t+5hEylounMk2jqyQWC5ORFNJIyY//u\n84TidTqAViOjWqpx8aIfb7+FsTEL8k6VwM077IVr7AYryPRGegZszM05MBoPUjESQUD9Ie+cPq5Y\nXV39WBjWfeUrX+HP//zPf+nISFNQEc/8UF2SBKLZA/VsOBBCM5tVjI3ZuHs3SqHQYGMjxYULPvR6\nBclkmU4H5masvPrNi8j0RhRCjZYA+UiYk/P9rN1LMjJixunU4nbrkMtlLCwlUZlMBMJlnv3cDIlE\nlcBOikOzfXSKGWKbe4hiHyp3H4axKplQlO07O8g1MXpPzqPpFtm/e5DSyW4FKYb2kSqV9D/7eaKb\n++T9m8Tu7DHa08PIhVkcmgaXnn8BahXMfV7azRb7V2/gPnYMpUZN8J2LGOxGFHo9jWIRJBJEpRJB\nKkVt/slrYdbvJ7i8RWI7AN0ugkxGqNvGPjtHImH9NzLys6JYrHPlyj6ZTA04aNu8ciX4ns35T25b\n2txMc/Vq8L7bajCY5+zZfp742qeJLCwjadYwuOw4ZmeR6nToTQf/TypK6YgKYuEwvhEHglREoRC5\nuxDlwqOH0CscWM0KhGKCvkceoWHuZzstZT8U58jjx2jmM6C3kkhVcNjUmEwq5DKBzPYm6y++QiWV\nwuU1Ud7YxNLrweXWs3+vi0whYvXasY+NQENkaNCCt9+GshRDa9RQyhcoFhtIZCLpSBLd+Cxyg4lK\nQ0LvM88SzCm4+N003aqXYZ8Os6JKem+flZUix4YFvvEXL+JxanA51Wg0+8jq/fgmByjSRa0SaFZr\niColGpuNQqV1/4E3Dw9TjEZBEJCp1TQrFWR6HTK9AYoplEYDzb0MUlGKoefn86zJ52vs7ubIZKrY\nbGr6+40/80MiigJHj3ro7zdRqzXRaORMTFh59dUdAoEcKpWMiQkbW1sZ1GoZAwMmhkZsROMjRCJF\nul2w2HVceELH2oL8QK/A52brXpC9rRgDPWryhQZOlxaFwo1e3qays8nwsSmefmaUrkFDMVDj+LOP\nsvHaW9TEDjqZgNpmo24aIJdSMva5C9xczLIaEWk3NYyceRTVyl3y0STu4R62dksUCnlktTISmQwa\nVUrBXeTzfZQqbaR9Mxh7XWzcWCYdiiNpN2lq81jlGjpmF5lolUIqT7nSxtujY+70EOsvfYeaQ4dj\ndoblW28z/ZCPfDrHwvI6IyMWVBshrr21gdGkpJiuYnMZ6BlysBus4i3uYlXVSWgNXHp5iUa1jsJo\noFQeo15vcf687+fWL/hlwerq6gNP0wA8/vjjfPWrX2V9fZ2xn6Lp8K8JglTA0OOhWKhRzeYQpFI0\nTgcaiwmJRIIoCrhcOlKpCkajkpERC5lMlf5+I/v7OdrtLtevh+9HwCMlJeaxCVSNNH0zI4TTHURL\ng6eeHmF9PUUsXsHvz1Eo1HniCR+5YptmrcrOTo4u4O01Mjxq5drrMY5+4jQVqci9WINoVIdWq6P/\nlJPVN69xdm6Ixcv3OPPUHJFKi/V8AdRTjE67Uej03Pq7FxA6LfaXwwwU4gRTm3h+42nqxRKtchGp\nVoZMrUaQSpDSQaGVY+71kNnexjs/D8UiGrsdrdP5M81jOZ2mUaneDxl3mk0qqRSdVvO+8/GDxL8a\nMpJOV8lma+87Vqu1iEZLH0hGut0usViJfL7GlStBcqki0m4DQRRRaHXcuRPlk58cxT7so12rIdNo\n7oeWj5weZfmmn3gwRb3RRquVc+zMMN1WA4VCYH09jdCoktrbZ8Bn4+iZYZptCUvLOdK5JhuLEQL/\nP3lvFuTYfV55/u692Pd9SwC5Z1aute8LWdyKorhKdlvulmWpoy33jMPu1kzERMf4aSIc9uM45sER\nE+2wrbEdHssamRJpkRTXWsjal8yq3PcEkNj3HbjAnYcki6JJmrQsm8WZ84REAsh/4n9xce73ne+c\nzSIT037e/uE9TF43x48GMZpUqDs1rGKN6socVq+TSqGGx90mHS8w+cyTiK4QHURGjk3RFHScf2eL\njZ0WuUSOhydFHL1BiuvrKArUi2UsoSO0Wh10Hh/W3mkWd1T87V9cRBa0yK02qWPDTA6bGQw3GNvj\nJD77Hvl0BQmFgQEbSrtFdWOFia8+Tr3ZZXUpRTmTw+S1YTAbMJuN92fU7f39KN0uxViMnqNHKW5v\no7LYKct6nENDSCYrenOTwPQYntEhqtUWjcaugdDnbamdP7913xtkdTVHNFpi/34ftVobjUaF12u8\nn5j78+h0uhQKDdRqEY/nw/6nyaRhcNCOy7XrnfGBUdL8fJpw2IrFouXs2T4SiSrd7u5kycZqAou6\nzcixEW7PZtBY7LsnB40GSZERuh2c2jqhQR9d2Yze5WZ9W+HCq7eR1SaSDj0Tp87i0dUQ5CaZksJr\nr63hcJuY+8k6UreF3uVh6b07RCN5zj21j9BwBntfmPiFC0wcG+fW61sYPD7alQrNWgOTy0FNNcHF\n92Io791Gq+ph5LkhWlsLNPVOWpUSvQ6BOzNZRo5OUkhlcQdd0Kggdlp4BsN0dFZcziLxG9foPXKM\nzLoe7+ggSlfA5zUwEtJAMUVN0nD7wjbBPb3MLM7Q4zczeWoSQa2BepNWqUSjVCaZNLxPGv/pfvP/\nl1EoFCiVSoTDX3xgpEql4pvf/Cbf//73+aM/+qMvejm/NJhMGkbH/dRbAu1mC0EQ0ejU7Bnz3B8/\nHx93sbVVIJGoUKu16euzcfx4iKWlNO22QixWolBoYjSqGRzyUUnG8Q2GefHFZZaXUzz5wgHiiTr7\nDvYgdxSuX48BMDho59KlbRqymnhGpq/PysSkh+s3IuQrAsWGmp/89QydegW/306x0sQx2cvD/+Mo\nstlHeuc22YaOl384Q3ZtHUkSSRdkzvWPUkmksHgcBPs96IQay+/eYP9zj9N/+jiRt99CFAQklUTP\n3gmcw0NU02lso2MIChjcbrRmM5JazeY772ANh3GNjqLS6T71fdQYjdgcRnQGDY3arkeIPeClI+ke\niHyxLw0Z+bQW9Kfdv7CQ4fr1GCaTmtnrG6SjafZOudB069TKJszmAdrtLlqtBukf9dgm9of5rf/2\nHPfubFNtgNLpQqNCdD1Go6ZBlqF/yE2rJXPxVoqaNguiGlFQKMUTGC16rl/bpokWUFhf2MHt1PHC\nM0P83f/2f/G13ziGSiNRz6SwOi00o118U9MYrCb8B/Zi1ikohRR3VluYLDYsRZlWo0Hb0o9tuIZc\nyJOPLxGemsB16DiFtgG73Ua5YmDtVhatw4WcL9MRVUS3C/hcGkYGzPgtbSoOiVW9Bq1WhdWig66a\ndq1CIVdh/NgenhLVXHprhXgkgyq2ztf/06MMDOyW/wRRxDk8jGNwEPnoUSrxONV0mh60lBQjhVyN\ngTENA2M9JFJ15ua2abU6WK06Dh7009Pz2aOiyeRH2zs3buzQbndJJitIkvj+SSb4ER1INlvjxo0d\n0ukakiQwOGhn714fWq3qffJRo1L5qEFPrbarfZAkEYNBw8CAhky6yqUL60RuzVFOZ6nvH2JxPke1\nCRJdmuiZ/so52oktVBUtrWoN0dPLjcsbxPIChwbVmFUFJEMLyenHMTTB/EyEaxd3rZT7Jvq4sRDF\nrBfwGlUcfPYslVwJ2/Agx471cOVanP1nJgh4dLxTk2lW6mjNVtCYUSwe3n1jnYXZKE6jTGVnh1a7\nl8cffYjkyiZ6k0Qnt4PPJjF2YD9ep5r01g42S5t9Zw9iDPWyvV3CbNLQ7toxB3s5+huDODRNBG2T\nZ88FOf+XL2MLh7l8aY5WuQpuEZvDQi6RZSdeQ6dW6BoNuyO7yq4u5/9H0pBPxNzcHOPj44ifkbvx\nb4Xf/M3f5Mknn+QP/uAPvrSeI7lcjVari82mu++PMT3tRa2WWF/PIUkiw8NOhoc/bEs4HAYeeqgX\ntVoimayQzzd48cVFZmYS/MZvTPPIIwOsreUwGFScfWyIcsbJwnyafKHBvkN9lPJ1drbS9A04mZry\n0mp2MZk1vPzyCmNjbnp6zHQ6CqOjDpYXU1x5b4tf+8YUr76+QrHapZ6pkM9UEDQaLD4PtmELt5Zb\n7Dk2wcytCJJWg8XrArmF1mIkkaoTmBgiOruM02dHrzGTFrtkNiP0PXwWh89JemEB18gwlmCIer3N\n6mKKYk1h8itnyUg+jEqU2vsOp4k7d8iOjuIaG0NrtyNXq2QWF9FaLLj27MHs96Oz2Rg4fhC1xcH2\nehKt1UbP4UMMTQYfCPfsLw0ZcbkMuFwG0ukP3eCMRvUnOstVKi3u3k3SbHYQ5Ca9AS0Oi5+WpKbR\nAq9RSzigw2T65PEkSRIZm+phZNxPdCPJlUubXJmt0umIqFUCx073Uap3ee3VZWqVJsE+N6WmCr/f\nBM0KzkAfwUoXp0vP6KCJlY0SzXqTcq6A160jl28x/eyTJK9fpVWt4AgH0GoEzLouA06Z7Nw9FI2O\nPeP96DMiSreL0IJMpoZg9jP9qy/g2ruB2hng1obCeqrFb37rKOl3t6hpujS6aUpVGUQJuS2jN2gR\n9QbWbt5hasTNoQMurDYjlWIVlVriyEMTeCcCbL/2MtWVVY4E+mHEg5o2jTvvkNsXpljfjea2WnUE\nAmYa+SL5dBFRY8QR8BF22qlU2uj1KpLJCtev75IIgHq9wuXLEZ58cvhT3/MP8PPTMB/4BQwNOZCk\nXWHq2lqOnh4zo6O7+gRZ7nLtWoxIpHT/eTMzSUwmDePjHkwmDU6n/mNkxOs1odXuHv71XI7sygr5\nukji3jz1hkw6LzNlsZAupEjGS3g9RpKZGu0hD+GxPiyWEQwOB3//F+/gGdLSY66QvHad69tFGl0N\neouBp7/3LRI5mfDBfdQqdUSjBUVroqVV0VWXidyawe6xYTarMVkMHBw3onU4KSZzfO1bp3jtR9fZ\nidc4dHaSQqGBORDg7FeM2EwiK7dM5PINDL4gjpWbYBzkvZeuEJlb40ZPgP1PnmTk1AGCFpmVVxKo\nGgV8PQ5SmQZdi5dkCW6fv41aUvj6rx+kFtsk4JRw9Dmx3k2hMhioRjaxBIMIgoDWoEdQeWmmStTT\nSdrVGl63Dofj811RdbsKkUiR7e0ioijQ22v7XD4mDzoehEman8fk5CR+v58333yTJ5544otezj8L\nrZbM7dsJVldztNtdLBYtR470EAxa0GpV7NvnY3LSgyDwia1Bl8uIouxWNSKR0v1zRrHYpNtVePTR\nfiwWDZIkMjTeQ77cZWzSSyaWQ2/UUGvu2j5MT3vp7bPw5392B7tDz9pqjvFxF+NjLpYWM2yuZhEB\no82MWq0mmarisDnQim1y6RItRY0lPEBjJsPex4+Q/NE1DC4XeqOW6WN7UDfzaKsxwodH0UoKCxdv\nMHF0jFPPncKkbhO98A6B/XtxT+/F4vNSL9e4+splojs1glN7yLbNXP3by0yNOxiwmEnMzNAsFjF6\nPGycv0BqbgH/gX2Y3G7y6+uUd3YYfPxxbOEwpWiUvv2jDBzfT1elw+Zz4xv2/ttv9ifgS0NGjEYN\np06FuXcvRTpdw2zWMDHhweP5uHK4Wm3dN3HKJfMMDzt5+dUtlha3cVoELFYtgT4vnU73n+x3z82l\nefPFG0hqFT6vAb1BzdSBEO9d3OSVN2NYAn6sShej047fbmRjPY/T48WoaWOqbtNn0aMqxjkz3c9S\nRr9rzTvsIbqwzvBIkOApFbVMDu/BA8iCjlKhQn72NqVoFJXJxPzbi3StfpqGAWqKmVoeXH4n7nEH\n+kCIZF1H526SXr+KV19dpqfXiVZbRmWx49HrqJfKOHx2BibD2ANWwv1u0Aocf/IwpfUVmoUc/vEJ\nDH2jFCMR6oUCq2++g6h6D1lUAyKDZ0+RTRZY227SbHdpygJhc43E9SskI1mM6jZWu4mJpx7FM9SH\n1uZlZ6d8n4h8gHy+QS5X/0wyshsHvvvcZrODViuh16spl3fJhKJAMlm9T0by+TqZzC5BbVWrtOt1\nREliZVnP+LgHSRKZmHADH0zRCGg0AlNTHgDa9Trbs0vEYiUqshZf2Es9O4/T76DWkBkesNGo1DHo\nREasJdZfvkzHI7J4c5l9x4c5dfZRGmiZeeUOO7ECiXgFk9NOJVukuLqMqPhJVwS2ozKpWgGtSU+9\n1qbt9mIcEnEPeBiZHmBtIcL6dpVuM0Wr3UXQ6Pj13/kK1UqTVqNJo9PAI0dJrawja1VMTQZQuXrQ\n6yX0E+MYeodIyHZqxQoGuwm714mhXaCaKOGbnKQjd2gUFDRmDWZvD++9fJ5iIoO9N0SurBA0C6Sq\nMYxNPz1eLZGZeUSrFY3ZTFNjw2DWYhINRLfyOPp6GenV028u0W23ELWfrelZXMxw9Wr0/t6uruY4\nfTp8v+r2ZcWDohf5eXzgOfJlIyNbW0Xu3k3d1y9kMjWuXInw1FPDtFodEokqnU4Xj8f4kdagLHdI\np6s0Gh0OHw5QqbT4yU+WCIWsHDvWcz91OxIpkU5XaTY72Gw6xsZcmN1OrG4nxVITXw+YTCpUEmTT\nVZ766jDpVAWPx0Rvn5U7txP0BCwEQzZWZtfJp0sMDlh559U5BMWEO+DEFDAzOh1C0OrYO+GmXJHx\n9/vJxLIMjrioLd4iMrfM8P5hkjs1PDY7/d95CrVOjbWvn4WXX6MQi6M2W/G5Q9RqbfLZCnXnCB05\nwN1oG31xDaNZT2SnymCPnVomg2t0lJU330ERJXbmVpAFDb7pCZx9QdqFPIWtLXoOH6b39GlKsRhy\nvY7R68XS0/NFbffH8KUhI7A7kvvww300mx00GglR/OQascmkwWhU02p1MFoMrK5kKKZz7N/vw6hu\nI7WqRLeyZDK1T/VPKJfq3Lm2Ti1fIr+TpFSREQ1WOnKXfQf93FssEG0phIJmxqcCtNsdNjYKiBo9\njeQWI4MW1Jl1VueitG5vcugbz6M2WRF8w+yfVlFfvUu11iZ48hTFZIqNK5fo3TtKPZ7E4HJSb3QJ\n9xmJZRtMTvn4/g+36OuzYXWYWFop0h/Q0o1EuPbiBXLFLuG9I+zd9zDPPz/G8eNhZu7E0etVDIYN\nrF69w42flnj6iTBL71zG+tgh9BNjFHcStCQDGquNrs2BTedmtC0SuXKVUjyFIIJvbJTc0iL52Q06\nXRg8vp+Vi7dpFfKYxDrp+WV26i067TYjx/fSc/jQJ2o6RFFAkj67pr93r4+FhTSNhozDoae310q9\n3v7IY2y2D7/8did6BCrJFMWtTRBERJVE0yHSLIfIVeDKlSjJZJVarY3PZ+Lxxwex2/W0ajVSS2tE\nNzPEEzWiiSrJgoDN4iKoU2iWqzQLWV54ZgCn20Tz3nvslHeodgScXhuVbIH6xjyeIyexW1V0FBGT\nzYRcLRMY7EHTrfPwYSuX7qi5cCnKdqTC818bQ1EE0skyokbD6YcGmLk0y/l3tpi/uoDFZeWJXztD\nswZXbqQ5uM+FgIKYibNz+zaNpgIItCtlHvsPISyGLldeeQ2N9Dp7/923GDv52yidNoZWhvr8HFVF\nYejJpzCE+nFlC1y/uMyN8/PIggq6HfKbm6Qy+xkYNFNauINQy7N331kaGRfVpoLaZMNq7FIrlMln\nKoR69FgtOob7DJQXZ6mGvFjf10vU83lq6TQIAkaP536IVrMps7iY+QhBbTY7LCxk6O3958eZP0iY\nm5vjqaee+qKX8RF84xvf4Pd///cpFAr3s72+DIhGSx8TUpbLLSKREjMzCQqF3bA2o1HN8eMhBgbs\n5PN1bt2Kk0hUMBjUdLtdenrMfO97x0gmq3g8Bq5e3UGnE9+PruiyE83jdhmw27X09Tu4dy+Nwajl\n1HEzU5NumrksD58OUCzJIPkI99p45cf32Jpbx6IOcvBoL0fPjFIvVzDoVXz7P58gHi9TztWYPhJm\nbMiKwaDi4vVFxJCeXkuDqK6FSd1icWkViw6sUo1moUB5J8ah06doW3wsL8YgOIbfuesDFJtfZuTk\nIdq5NHatjrwooxIFKpEtKt0OXYeGak8I/4ED1DIZqvkyWrudoYdPU0/Gmf2/Fwgf2ot/YhSNyUQt\nl0NSqfBMTDyQo/dfKjICu14Qn+WzbzRqOHQowNxcGkEwklaJ6A1JTGKdbj6HZLUg6E3vZ6p8HF1Z\nJrW2xc7MPSLXblOr1JEFLe6hfhxOA+2WwrPPjNBstLAaBLbidZLpOuce78cmlUneTeEzCGzNx7BY\ntVgcZnw2uHEzTn4zx9JMiZNnxggPN1l7510WLt3GPz2O0mlTz6ZpZhKsLURptzqMf+URekacPP6E\nil6vxObrrxJZ3GLvgRDjR0Z48leOsZ1okq8oJJJV9BWZnWgRUWlj1GtRCQqrd9Zo1hpkJwysX3yP\ngf17iK/HiK/tMHF0lHikwFs/uUGr2caod7D32W8Qfe3vCe6bQlKr2Lxyi2x+lxCkFxaRs3HUGh2V\n6A6t+m7FohBPUa82SM7MEDx4hsXFDNXqhyTC7zd/LpHUgQN++vps1GptjEYV6+sF7tz5MBfB6zV+\n5AvMbtfT4zOwcn4bQaWiVakgl/JYx7WsvVlmuR0ml++iVktYrRLlYo25uztYNC62L15k4fI9br09\ngyPoZejESSrFHM2qyOPPHINOm1w0wcLlWY49NEp+dRWlWcfkMtNOpEHQQKeFI+Snd7wPRaWlkG8Q\nGu2lnY2Tnb2BXmoTFMz8z787xdJGg421LNW6wlNPDjDs85PaSTN7ZYXEdhG52aRrcPLWW2ucOt3H\nwmyEdj5FsMeMPr1E0GsgmqhjclgYPr6PzViDgmLD8fBzqDotXvyb6+iCGRrFMqJK5NjJSZTkBpde\nvIR9usbCUpF2rYpW6pCrtZFMFmqJOGZVk2axytjXvkZ2eZna9Z/xxOPnMA5P0TF5mLm8wM56kuS9\ne7jHxoh3Ovhcw6SX0jQ8MXQZFT0OSF+9eN+JVWe3EzvFZr8AACAASURBVD59GrPPR7Mp02x+3DL+\nA93OlxkPYmXE6XTy2GOP8YMf/IDvfve7X/Ry/klsbRXI5xtYLFpsNu1H/IFgN212aSlzn4gAVKtt\nZmcTWK1aXnppibfe2qDb3b0IPXEiRCpVZXDQiUol0Gm1ye2k2HcoTCZZIpavoVULtNpd/uT/uMy/\n/+Y+Rkac2K1a+vtMbL17haVrc4yd2s/dpQqHvnKY9aUUDreZc8/uQ2yVmbtwm69++zHMJjWVqszd\nmRgWo8joniEGw0aKhTqzN7I0S2V8fi/JV16lV2ngtYzR6TOglTrUtlbpdDoogorNjTyvvvgmGrub\n9Moa+48P4ZFkrLoy2+ffZuPCJWRrAHfPAAa7k5m5NAabiYnpPrZef5XeM2cwh3rRODYwelwUN1Yo\nRWPUajL1Yj+x69cRRJFiJILJ7cY9PY1rdPQzR4H/rfFFk5H/HTgI3AL+6y/rRUulJmtreba3C1Qq\nLawWLU8+f4Dt+Q0Ejx293U5P2IkkCUQiRfR69f0vynK5SX57m0Yiik7Y/QBIKhVagw53f5B3L67j\n77EzGhAwtss4TE42q22Wlwqkdwo8dURL9NpNZIeEN+imJZfQ2Cw0W23IJxGaNepthYXVKs8+t4fI\nnUWmvnKWTrVMcGqMyuoitWQG3fs5CyCxtpYnE8vSuHWXVqkIgsjWahKvVWH8zFdZez1GW+pw7Xqc\nu7MJTp3o4eobM+RqKo6c6OfAYwe5+cYtJJXIxBOnScWy6Lo17IYuGo3E7TeukFzeQtJoqGh0rHnc\nPPK//Dey0QTbt28hmu1YLCL5fINuR8GkF5G0EsX6hycIi8+LqHRpVSo4rCrOnu1jYSFDodAgGLSw\nZ4/rvkbjs+Bw6HE4dgVV09NanE496XQNo1FDMGjBYvmwMiIIAlOjZlpnBtnYLFDfKTO8LwybM6S6\nQ2ylG2j8fYBCObZDLZPGLAdZL81RjcdotruIGjW5aBLd7Aw94QlW53doZ5PUV2Z46PQoO7kebB4r\ntpOHKC7OUlqah65IPlfFLaspxFN4Dp9kdfN1thNFtPoEcjbO3seOUUlnSMwtEj4GzYqNyGqCTqOB\nTd+Hz6Nnc1PA4vVgzomUyw369gQImpv0Gss4BwVcXj3xeJZxv4f3XpvBHbATPDDGT/9+hnK5xdCJ\ng1jMVvpGe+gaS3RQoWj0GM1qEnkFncrJG393nifsYfKZJontBHsmeoktb6OxWDnwiJ8+nxql1kVt\nMuE/eIj85hbl5bvI2R10B8+RXV5F7w8CUEkk0Pv8ZJIlUtEculSJ7aUl3Pomk74P96WRz5O6exeT\n14vJpMXlMtxvtX0Av9/8uY+JBxHZbJZ6vU4wGPyil/IxfPvb3+YP//APH3gy8sYb63Q6CoIAbreB\nQMB8P1vKatUSDlu4eTNBpdL6SIu3Wm2zvV1kfj7DB9Es+Xydt97aYGLCjVrs4teVqW9HePygEcku\nUcxVSO3kQaUhlS1TKjXJpMtksnWcTj3rq0keOjRCp17B57ew79wJrtxIc+vmDipJxGLTcvz4CPaA\nj/W1NOsrWbKZCk+cG8KrbiK2oty51OHmW7eQTDYEi5u3XltknydM9NU/w2TWUo+soe8NY/R6kVtt\n2noHW+tJivEU+qaMe3yca5fm+ebvPE707/+SwPQEqm4Lq6GDKNUIDA1SrQ0z0m/E3klSczrpdjo4\n9+yh+dKbeB12SqsyersdtU1AJQkUNtYRAI3ZzNbiIq1qlW67TejEiV96vsy/BF/kSg4ARuAM8CfA\nIeDGL+OF5+fTrK/nUakkbDY97XaHaktg9NgkqVQVt9uAXq/iT//0FplMnd5eKydPhujttTE7m4D0\nFp10hIGAhtJgDyv3thndN0Ik1cTvNTNoKXP+T18lHDRyuy1RaoocOnWWe2sNyoqBw4/uJTtzk+JO\nkoOPn6FTrVCJzREW2oxO9VBsikQXN6A7TO9EPytvXySfKrJ58x5ahxOt1Yq2V6TQ0eE8fIqZpMTh\nfS7O/2madKKIqJKwjrtQW52sL8VoFovotEai0RLFbJmV9RIHTo/x+itLLMynOH1imtO/asMdlli4\nMo+nGiE8GSQ86EHXN0xBW6avUgeTnfhajIV37zB9qJeOoEa0OLl+LYrTqSeZrLCTrPPUrx2lVcij\nMRmpl2u4h3oJTI7SbZQwBAZQ6XQEAnoCAQvdrvKp7bTPA7Vaoq/PTl/fp1tcGwxqBjxd3O0yuVqG\nysIczWYT68AQGlWXdq1Ks1ikGNkGBSwWNdmF28j1Oq5AEFuwh1I8QTlfILTfRLDHiLpZoNpqYhFr\n1KxWbt+IMj46QE21jePAYZqFIoZAiJpk5d0fX8L3yFdZbgd5+DsHKc1eQRfay92X30Cq56kUmiwn\nopz45m8QWRE48tQk1UKJH/yflwhMjFEpNwj0WHCFfPToisy/dRm514KWNikUAkeOYR8ZR616HZ3N\nzu07caIrMTwjg8S3Usg2Fem6DvfoOH63luLcLbZuLaNN2hh6ZC9nHhul2VaoKRqkThNFkPjO//pr\nKHIbM0XMVgOyTkDt9BJfWqdm8OCYOoVnIEAnGydkaWB2g+fRfczPRLA7zMiFFL6JPazNxag2BbL1\nMoPPjCORur8vjUKBVrWKXKsxNaRDpbKzublbOfF6TUxOun/h4+JBwAdVkQex5H3u3Dm+/e1vs729\n/UCMHX8aOp3dMoiiQDpd48iRHmw2HbLcpVRqsr5eoFxucu9emmDQQk+PGUEQMJk01Ou7gvnd1+mS\nSlVRFHj+uWHE5BLrN2eRFJlkqoposnHusTP8uKWwE69SKNZ5+tk97Nsf5Pr1HVZX8xw86MfkceI9\neJTNaIGlCxH+8q/nkCQBg0HFnhEHb7+xTrjPxsiQjVSsiEZfRZuYp1jJYugd4upL52nXGnQSKZwj\nUJYNtIdDePdO03fyKD0TI2y8/TbdVhNzIIT71GO88U4UrcWKIEoYnQ40NgeS0YLRbqES2aRRKFBM\nZhk+a8BGngl7EWVjnoK8ezGoqPXIJi97f/UF2uUigtGOomoTGBtFziXoyjKSVns/uDK/vo59eJh6\nNovJ+2CIV+GLJSNHgZ+9f/sN4Di/BDLSbneIRksfuU+tltBqJfbu9e5m0OTqfP/7d0gmq7tlQblF\nI5Xg8H4nzWya0HCQ7bhALbLJuFdiZGACQzBI4q11BvoCbLz5Oj6PDkmjpZAqI6i17AmrCY33067X\n0feP4RQErHYD2fm7xO7Mksy0QaOnprax95knOPP0QVJ3brL6yius313H4PZTS6dR6kWm//1/oC7o\nKWbL5FI59o16aHdVBEeC9Az6sdiNaOQq0c0kDb+XuTffY//zT+DxGFlblsikypw508ueqQoOl4mJ\nfUF2NtJk2l1O/w/fwk2GnUvv0KhWkVU6+u1W+k/30e5KtI6P8u75Vaw+N1lbD+Tq1OsblEoivWEr\njZaCYvXTd+gw4YNTlKI7iEoXsV1D53RiHZ3k7t0k0WgJp9PAUK8BoZqn02yidzoxejy/9JO33uHA\nHAiQXVykuL0N7M7US0KXqSkf83EVxUgZjdGE0aylN2hGUPdSz+dRaSUOnhknnRmgWq5jD3jpMdbY\n+MH3KUYixEcO0LQE6DvwMDlZR++pEzSSO+jdZXZWImgdYHYHyGUqnDzsQSu0GTkyxea7V8jFEnh9\nFrrIoCgUVlf47u9+ldu345z/wVu0Wh3UrgDmUIjaTpTDR3vYubrJYy8cQm8xU20opNcj2B0aFK2R\nyeefQWhV2Zqr0DM1Rq2pQKVCPJbAfypAz2AQMTbH9s0ZOvUailUhc+0ie0+fRAp4kc0KS6gotiVu\nXtmko9Zx6qFBypHbJBeWsUweQDN5irVL68zcrtP92XlG+3X4PXq27t3G5PPzzH98AovTyuK1eba2\nihSyZdQmI616ky4CH6iFBFHE5PezfeEC1XQaQRQJ+vyMPTqNotbjchk+UVv0ZcKD2KL5AGq1mqef\nfpoXX3yR3/u93/uil/O5oCi7U1cnT4bZ2irwxhvrdLsKAwN20ukasVgJi0VLIGBm717f+66ruxOW\niUSFel3mwAEfDl2LKz+8xs5WmqFBO3q9mnq1QtjW5rf+035WVnPUmwJGk4a/+P4dtjaL1OoyBqOa\nyUk3itpAoV6i3mqxHSnTlTv4/Ub6nhwmn6+ztJhDbrbptFpMTAVQGgmsVj3Rewvs3L6L0WHH1t9H\nJRrBtWcMtdXJ2f/yXTbefofo1av49k6j9/golVqUyw1qghnb2BRqQaZdrTBydBJfn5em00pxO4LR\nbkHXlqmlU0xO7EFWR2l3+pGaJcRqFtueKW795A3kZhvX2Dia0YNsvnuLdrKJrtbCtWeSnqNHqSQS\nGNxu5GYTQVEQHpBx9A/wRZIRG7D+/u0i8Ev5VEuSeJ8t/zw0Ggm324BGo2JmJk4yWQV2xVByOsrq\nUhq7ehBVbot6bJvw/nHyEhSW7lFcuYLBoMYV8iNKGnRaNfPzJfrHzfTsm6RnYoSsbGBtLk0+nuZW\nJcUzz41RjsyRXFqlVGpTKtZpVnOE99upxzbJymUcQgFBEHH7bNRKOQzmSXC7SGwmyBZlls5fpVZt\n4t+zxumvP8Sx/Q7u/MM7mBQbvYcmEbUGxKEh1jfKpBJlNAYdo4MmuorC1lqSIyf6OHfWj6rbpNGG\nre0ynT4L3UaFSrGKQa+GWonLf/GXGJxOKrUuvccO8fS/+xXyDS2bm0VMrn5GT1Rp51IE+52YegfI\nYcfY1HD4oROkomky2wmQJAx6iYVLt0jFC1iCIWSdk0vf/xlOfQO9ToVKp8N/8CCef4UTuPt9x8lm\nuUyn1UJntyOqVPSHTQSng8zpKzRLBYIhGzZDh6KisPnWW6h0OgSNBvvIGId+/RlQFOb+/DL1XA6t\n2UwuVSS7muPYiTMYtCq2371NI53EblXTLpcoJrOce+5xomsJbvz9NWq5AifOjqCTy/QOeoltpmi0\nBbQmGxvraVzFKtlUiUpXRzzbYO6vbnDysSme+MYZvFawG45SbOu4enmL2MIaQrNO8LibXCSOyukF\ntY4DXpn5hTQqrRaP20ApmcI76GUgqOXWhXWsPg9aGgTsCoWlOVJWM4OhMI8esqMVu5QbkEvKiIKB\nt386w8lJA422QnI+waWb8/imphBEgVQkSTmn5Zmv76Mnl0SvqzI6YCISybE4l6D9vg5ErjfonRrG\nqJL5oBFjCgSopdO7gtb3UdpYx2C10HPkyC99/78IPGhjvf8YL7zwAn/8x3/8pSEjoihgt++admUy\ntftVk0KhyZEjPbRaHUKh3dRbp9NAsdhgcHB3VNxs1hAKWTh2LEg6niEVL2Iy61jbKnPgkYO0GhJ3\nl8qYAyaMYoupg34uvJfC4zFhseg4fjyIw2Hg3lyGvl4bw2M+AgEzyVSNa9diaFQiOr2at/6feVwu\nIzqlSnQ7h15yc3jASGllk3okgX+kl2YbsktLaK02KvEY2rqDSlKgsL5Gq1wmduMWuVwDUyCAT+4w\nNTzMT/76DiapjtGk5cjJR7AZBYRHHmH2r/4KAQF7bwjH+BSbBR3X5xoUEhkcIR+nn/46ikVPcmUb\n954RXvybawRDNnwHD+H3GekdOo3QrlONx8guLVGORhk8dw5LOIz+F9SMyI0GrWoVjcmE6nNM0n1e\nfJFkpAh8YDRgBQr/+AG/8zu/i0az64y6f/8kp0+fpO/9aPrNzU2AT/x5zx4Xkcg27XYHrdaFJAk4\nHE1SqR0CgSCiKGI215DlLjrBRDqRxuJSkAwyle0GhWIDVX+Jjt3NyHPPYTJp2S7W8adkItEOFpeD\nji2Fc+8Qt66XubqyDAYFjVHPqWNjXPzBHFdn9PQZWkgqiVK+gq7Xj9CUaTebOD1moqk4HacWlV6P\noDfT9YTYUXSUIzLT/UYuvvsusiwRcLnI76R498WX6ZkcxeaxI9RyzF+7Qf+jj6BaW+DQ0RDJap2t\njRyj4z6On+yl28mgrqWY+cFVMqkijiE3HrufN99M8/xXwuR1VjR+CzsvvYRaaSNbDFjCDiorc5h5\ngrsrCQrJPJG8mnRWxZFj4xQlkXsbGlqtJHZHmxs3iiwtyTQaMjZ1hI0rN9BWW6jUEtH1ZfrHe8nG\ns6gcElW7GppNpLt3sYRCJHK5T9y/XxSiSoV3chKd1Up2ZYV2tYqttxdzMMjWhQtYM0sUt7eJ3iyi\nOnuW7PIy7okJJJWKbreLVqfGaFDTabep53JoLBbodnH4QhQTHZKbSfr2SFx8/V1UtKHXtvt/9w3S\nqtZIzi+SjecpRSNclpucODOIwVFDvZPH1xdiO69mdMxDtihTqirEUm22FmNIGg0/+ZsrHDnRRywC\nuUiFn/1slmKxTu+gn8GQjq7BTkIWqFQbjE77yaaKbMaiLC9FUEvwzHMTjA3oMVNgaNBGxSHSSW6T\nmb+LpNGgMppYevMCrVoTmy9MoH+UedyoRRn0HmJdI/4TLlQ1gdqFt6gXi6hMVtJtE9aOlkRJxGoP\nonObEEQRt1Xi2Okh5u8mqNeaONxmTj08xMCon0oiiCCKaM1mti5c+PiHfnsb3/79H+YcfYkxNzfH\n888//0Uv41PxxBNP8K1vfYtMJoPrAc0N+mCUX6USGRqy4/fv+kbtBjHuVktarQ7pdA2NRiQctuB0\n7ur7rFYdjzzSTyJRpVBoUKu1uHw5iqbbIdDnJrqeZPTkQd64EGfuTgTv6BClTpTnnh1mUFSRieeo\nlBoMj7pRFPiTP7mGz2dmYsIDdBkZcTE87GBgwI4oQixWZnzCS63aopAro+k2aHdVNPIZNAY9NpPI\no79ymstv3aNVqaI3atl/ag/N9bvkixYQRURRJLsVJZ8soFGBVpygU0/z+JOjmE0qTFIdq0lmLQGr\n9xqEXvhtjNUYjegmjhOP8Xd/fpFGuYpaqwWDjfm1CvtNehAEBJWaaqXJnRvbHDkzTFivZvPGLPnb\nV+mWs3gmJvAfPEg1k0Gt1yP+AqZ4udVVkrOzu2TEbMa3dy/2T0kI/ufiiyQjl4HfBv4OeBT483/8\ngLNn/zOFQhNBAIfDhM32YX/rgy+xT/p5YMDOU08dYmOjQLvdpb/f9v4EhkI6XcNi0eL3h1haymKy\ndOl0OoR6woSsOlacfioNNSvrIsGJILLDjmLVE7Q1SWQS9I9osI8eRzKZWVhooNbqkEQTWzsNSqUm\nDkeRA2cPUCuWCAwGgTo7kTzJtSRKt4v2wASG0ABBgwWnqoLp+ee4+dI7lOcjyKoWrj17KDVFNu9m\nkBtNmv4W+ydt1Ja3sB8/Rvf4WTrNFupkHE2xTLHYwnNkgKWbHQpZifLyOtGVKF/7lUk23lukkMix\nspRGvrrBua8f5/DBCW7eznBszzRWocC9nTyVYgWXPoNc6yJKkF6PoAjD2M0iPodI/7CWUirLjXdX\n8E9PEujzoFY7SKdbVKv13auZzRy1WIl0tc3wkAOppVCZncMWHEZuFPFpd0eo2/U67Wr1n9y/fwms\noRDWUAhFUWjX65R3dqil02jMZvQOB0q3i1yv05VlLMEgrXKZdqGwK7icn0dxhDAdfQJrvUg7n6TU\nVNMj1Qn1O5AUeXd+36VldTWPVifRNRWplWrEIzn6e01s5ESqySSV1ijeiWnWo02yFRHFaMO6Z5pG\nV9gdPVY0aIwGul0YHu+hUu9y8XKCh04HqTVXUWk0ZIpdTj4xzI9eWkclqdCKLebX63icGgYHbIgC\ntGpVohtJYn0GStkKJtGAVswRX12ikkgROnmCtqLizo9fxdkbIr1UwjCf4NS3XmB2pcbCSo50ps7r\nC6s89OwxZI2JSqmB1eZFQaLRkOl2YWsjj8ZgwOByYXC5GCzfxm/zIisSVoeBnrEe9HY7BqcTgFat\nhvgJ4jhJq33gysO/CBRFYXZ2lunp6S96KZ8KvV7PY489xksvvcR3vvOdL3o5n4hz54Yol5sYjZqP\nRD309Fjw+UzE4xUURaFabdHXZ0OjkVAU5X6r9wP3ZEVR2FxJ0qhUiWTqPH7mKCrDHDvpFgtzCUYO\n7aGhtiHmGkTjuxduAZeKZY2C02ng/PlNfD4LWq3EzEwClUpEo1GztJRheMjBof0uRvv0zN+pUutY\n2Ikp1FMxXB4jtj1BBFHANJ4nde8uh6bs6B/dg8liIDlzm7W5OcJTw/gPHCT63nu0qy2a1RoKoNLp\nKUTibMyuMRJUoeoJcn22SMOQ4+arl+m0mpx97jAHw15iqzFarQ6tpkyrVELvdFI2mxG0vQzuH6ZU\nruL2W0nHcgS9Olau3sGua9GsN9Cp1eQ3NvDt34/caNDI5z+yD4qiwGe0biqpFJHLl5HrdQDkep3o\n5ctoLZb7n/t/CT4vGRkDAsBV4Of9up8EXv0F//ZtoAFceP/2x/QiH4TiwS4rnZ/PcOLER2Pp2+0O\nKpX4ER2CIAiEwzbC4Q9HQJtNmcuXo6yv53E69UxO7lr80mlzYtqI19iiUKgTzynM3lwhfGCK5eQG\niiwz6m6gbaQx5aqoHD6Kejfm8QOY2zG0XYmNeznKxQa1apN7M3F6nhzEJraROhUwGJl65hzSu3ex\n+V2EzjxEW9TSSWyyuXoXg7eH0KlTDD3tYLuoZTHSxZ1K4LAbqJR3DxK720I4OEbX5ObyazeJr27j\n8Lt4dN8xQoddvPH6Grdvx3d7o/kMBoOPSz+7y9HxAG//9B65TAUEkbdfmeHZ/2kauWsHU4NOvY5k\nttLNV1Bb7MQjWQxWM2M6E8XlCIntFI8+e5CAscpiR+Dck6OEpvvJ1iSSySq53O5BKUkijXIJjUai\nUmmhoCC3uwgGFWqNgFHzYSlPpdOhNvzr5iBUEgmSs7M0SiXUBgP1bBa9w4E1FMLk92PyeGhVKtQy\nGQobG6h0OrqCip1EnfdeukQxlUejhqljkwjbd/G6NLQySTIba/zqf/0Vrv7odQrFND69mZ6hEEaX\ni1algs/lwGaEQqrI5R++xn/873+Er6LH6HSynFJx7XqCqeNWjp8Ms76cQG/S4XLoOf3oMMlch/hO\nmUSmhXsgRLVUp9OWSSar3L2+wd4jg5jcdqrVFrPxMhOjVnKJHK18BpQelhYzzN1c5cheO3uGxnEW\nC7gmpwidPMG9V89jMGgw2i2U61py6TJio8TqRo1SQ4VFpadvTy/r9zY4dHaaldUcpZaK/r3DGDtF\nxFKSbquOpb8fSadDb7XS99BD1LJZBEHA4HJ9rFyrMRhwjoywc+MGyvvjDqJajXts7Be6InvQEIlE\n0Gq1eB8gAeAn4ZlnnuEf/uEfHlgysuug/XEXbZNJw0MP9bK1VWRxMfN+NUTgZz9bY2zMzb59vvuG\nlYqikJydpZNMcua4j5+9vkG6ZWb03CMUrkSYfNRKuiCzuphAUkkUC3VESUQldDnz8CCyItLfb2d+\nPkO53KDd7pLPNxgddXHkSICVe1Gy5hKhfjuVlXm8w32EjwaRD/nZiBTIFrKsLMQxSG2+/rUDaLZW\nqFbqpGJb3P2HN1GUDpPPnKPZajHy1adJLizh6AgMPf442WgCg9GEx2/BoK1SwEqxIZBNxCnlKmhN\nem5cWiX89QncagkFFeViHb3FjMpgQK3VYHcY6PvqSfKRGCNHNFy7voPVqSctimg1Ah2pS7u8K0so\nbGzQrFbx7t9Po1hEYzKRW1sju7REV5axDwx8asZNLZW6T0Q+QKtSoZ7N/puRkd8DfgdYAP4M+C/A\ni+//7o/4xckI/DPHeXd2yshyB5VKIpWqMjeXIpOp4XDomZhw/5PpvbFYmdXVHN2uQjJZxWbT0dNj\nZnrai7Fb4tqP3yHfMLAwl8Q73E+6oqJaq7BwbYHQ2SDtWITa0iblronRJx8j0tXTqLdZXk1j1Kox\naRWErkAwbCWbKDBx1IvZZqHSCtKI5Tn83cMUOwbanRbxN3+KnIvjNlqQGw0Ss3fpf+brXHlnm0uX\nd/jVF4YZPDBCZWcHq1WLxurAu2+cH/3tFeSWQr0tsbqcRn47xsRkh0S6icGkZ3MlQajHg8GkRaMT\nKNc6iKKATq/B4TKhN+qIxKoMTPXjdEmsXUxz5Le+w9bF94itxtCYrfQ9fJq62kopu04zHWdtIYZn\nv516PEajWkMeDpHNqjAY1PfH8Or1NrZwL7r1GMGgBZ1ORaPRxDk8hKs3QCcVAXavij1TU/fNsP41\n0CiV2Lp0icb7bSBRkqhls0gaDRqTCUmlQlCpCBw5wtKPf4zcaOxWTcJ7uDsbZ2d+HWs4TMfoYDXa\n4vjhY9QSCa68dRddYYt6ocTBb7yAYr9KeDSI2e0kWVXhmZ5mfXaOeldPaNKJ0Rcgu7GNzaYnK9pp\n1DLYfC6cehmjXuD0cT+xSBEEgRvXIhw9O44nYGXuXpK9Ux5++qPb2MwqSvkq3qCTdqPJnVtFRkdc\npJMlNPu9qDRq1GYdjXqLbCyJ0mqyeHsTS/gsrgNnqSWiROM1Vu+sYnfb0Dg8iNkukwMWYtES81dX\n6bTaRBZkpg4PYteIHDzai38kzOpagZE+Fy5Dh0YmieTqQWO2kpmfJ3T8OGq9HutnjLS6JydRGwzk\nNzYQJQn74CC2X1IF7IvGzMwM+/bt+6KX8Zk4d+4c3/ve95BlGdUDNMb5eWCx6HC5dr2KyuXmfdO8\nu3dT+P3m+1Eg9WyWQiJNvOUgGsuzd3+ARLICYSfOgJvb82XeuxxFI4Fe16FcaqDR6UjHc7gDAgeO\nj7G1VWB7u0i73aHZ3M3TMpnUtNtdmuUK2UiTwSEH5r5B/l/u3jRIris903tu3tz3fV9q3wv7DoIA\nCBAkmy02W+xF3S2NRh0jyxGKGMszCtshhUNWOBThHwp7RrZlSzEzYbU1bknN3tjsbi4gCZIAsQMF\nFAq1V2VVZmVW7nvmzd0/EgQbJFtNUE2xOe+firyVVflFnnPP/c53vvd9z18Is+e4BbPHwXY2i1Sv\nsb6coJLNI5fD8T1G5q/eRitvYfa5cA6GEG1eP3ullgAAIABJREFUlLIWXRSM79yNQqFk4coduo0W\nA3sGMGtaiI0qRbkRucuEUIsjiDKqhQoyQaAlqtBpZFhMItFbWexBDyqLjdCQEyG5RnR5HgCDzcZX\nf+cI5VwZdX6FRnwTLCaK5SLtZhOZQoHKYKAtScx++9vYhodpViqUEwnodqmm07QkCf/Bgx8Yjw+r\ndCIICL+kzcVHmZ3/FT0tkDLQBzx/7+e/+6VE8BAwGHq+AoWCxFtvbdzfmedyEplMlTNnBu9TedfX\ne5NLpRIZGLBQLNYfUPfL5yXyeYmRERveAT/BE4+RuRbFPFwnmm5SLJbpD2pplEtUEkmka1dIb+Zp\ny5Q05/Uc/9wTjLj7+P5LW8zfijA9aUVl0HHwUBBBKuPUN4lu17l5aRXBYOONv/wpw/tGOTylIbaR\nwK5pkw+v49u/l1a5Tnb+DicPDyAT4PrtDGdOH2NUIWHUQiEvsVHSki4KGExa9B4FZpOVy1fjBIIm\ndDoFzY4Ms0GBTKPB3+fAH7LSWLqGwaDCYtES364weLCfpUiDrjrLzRs1hgcmKCvrjH05wECpQE00\ns7BRIzu7icpkwjY8TDGRohgpou8WGXxkHxsVBdVqA4WiJ7OuVIpEo0VEZ5CRQ0W0rQJqlQy53kjf\nsaMY7RZK2z1tDY3d/olTyaqp1AMlyGa1inf/fmqZDHK1GrlGg3VkFHRmLJMbKGxuXOPDrG+3Wbnz\nDt12m0apRLVtoJCvkh/U09gM06nVQG1g9dodfPv2kK0oMBaa2Hb08b//u3PsPz7O7ucGSG7EcQbs\nBEMmts/+GP/Ro+zZ2Ud62sbN61Gk2AbrN2fY97WvoHfa2dwo4e4TGfAoKE45uXEtgkNb59kvjNJq\ntwkMelhb3GZ9PoLKaESjljE2akMu9HYlHr+dwVEPC1cXMWlBJSpZWM7h8xnp9/fTKpcYPXWMWDjN\nVqZLdKuCyWVDJtdTKdZo1huAjPBqiumv7KVYaZOKpDl4oJ9qvshrb6yi06vYOe1E1y1S2pLotFoP\nLEztZpNKIkGzVkNlMPQYUzIZolyObWQE28jIJzrmnwZmZmY+E8mIx+MhGAxy5coVjhw58mmH8wEk\nkxVWV7OUSg38fgP9/ZYHTDALBYlqtfmAem+j0SaXq91PRqSqxOxGlx++eK1n5ul34Q+YgQ6Tk3ZW\nVjLEYlbK5QahoJHTT4ywNBelmJeYuXSF4Kgfv0+P32cgco+JOTZmw2JRE93I43AbCQyK3LoeYf7i\nPCa9Ab2yzcpSCptFCbUS7XabbLrM9StRAr4xVINTTB8YxG6AeHibm1fC7D4+xe0bM+Q332F4yIJW\nLeDZuQNHvxeNWkTQ6DBbBrj7D3NILTmh6RFK2QIWrwOtUY8tFOT0E3J2HhxmYynG2IiWgClP+sbs\n/fuxGI2i0OkIHj1KN7eL+e+tobXbUZvNaB0OHBMT1ItFVn7yE1qSxMabb+LeuRPrPaov3S65tTXs\n4+OojQ96R+ndblRmM/X8e+2d2nsMyV8GPkoyIvDe0UwYOAF8Fwjd+90nhp/1KdFqFUxMOBAEgWTy\nvSOCd5HP19nermA2a7h1a5uZmcT95GN9Pc/UlBNRFO53aL/7/9+d+FanCa2lREumpNWqI4pgs2qw\nqJvIKym67Q5yrRa9osvKiy+gtxqIz87z9KlnGPaJlBpyatUGseUoGkWTmkFDqiwi0xoI9pl55PEJ\nwptl6pIct9eKohjFvXOa/MoygtaEza5jceYSTx2YQOmbQJTBRjjLnbktYnNLBCYHyeTqqHz9NFt1\nig0RrVkPCg06bReH08DG4hbFgkS11sbu0GANHEaqd6mWa4w97kfSutBVu2yE09yZy3Biv5WLf/si\nqZUN9GYDnp2TOPqG2Mq2UVoN1NIpDj8+gckAmNyUy3VK9Srb2xJTU04CARN+v5FUqkq73cHy2DDd\ncp5Op9MT3dH0hMtsQ0Of2BwpJ5OUYjG6nQ4Gj6d3U/6MhGO70UBlNOJ5/HHUJhMKrZbVzSqFuTVW\nrt0lubDCmExNW+cmu7KKxmqlnEigHnKhNhlQdSqs3JhlaLCPWluPb8hNaMcwluERoltl3nw7QqMF\nuWict66uYQ4E2VxfxPsb+9EGQujsDmJrMfKpIrGFVXyHQqgsJs5+5wKlhgyj1UhkNY/VMIXLquNr\nXxxA0y7SqNW58sot6jYVQ/0GqqUaZo+NTjrCo2cmCQ7ZcCuH0JhNdBVq9LpJlArIlbok8l0klKxV\nVAgqN6qpAK3OHGKjwN7Hx9D5Q7xxPk6gz87mcoxGs0W9VsdmUnD5Oy8hqtTYdhkxWlRMTzrpttso\nxS6i0YJeIz6QiLTqdaIXL5JbW7uvZ+CcmsKzZ8+HUrgb5TKVewwbrd2OyvDzq5m/ypiZmeErX/nK\npx3GR8ITTzzByy+//CuZjLz22tp9MbyNjTypVJVHHgkiijJSqQrJZBVBEHA6tZTLTarVJjKZgFb7\nXsKSq/Rc2utSE4vPzUs/WaJcbvA7v7uf/QdDjI3Z8ftN91k3K3c2qGxvs3e/H5tFRSFbwagXOXzE\nz0m1ArkosLFZoC61GBiyoulq6BvS8+r3v08ukUNrbFAtV5G11YRXYvS7RZxOA+lICqNJxdZKlGyy\nwL4zh4hVqtxNGzAO2UjWtAyePkl67g4KRZvgmJdqLs/b//e3SG+lcY8NEnpCxdSUi8hSlGwJpo/u\n4cCxYZqNFrWWyOorZ8lvJ1HrNBhGRLaXY3RaLUyBXvtCS5LILC1hn5jAd+AAKqOR5OwsMoWCai5H\no1Ihdv06nWYTuUpFq1YjvbiIdWSEdzuGu53OfU2Sn4XabKb/xAmSc3PUsll0DkfPJdhgoFSq02r1\nnJY/rnTDR0lGksAuYObe6zLweeA/Ap9o99bp0wNsbfXcFwMBE253rwny/f4F76Ld7lAoSCwvZx94\njyS1SCTKjIzYWFhI0+32PE2Gh633DZccDh2HDvmp11vcvBlHEARCPi2jHieNSy+gtphwqDps3bxN\no5Drcc937aK1eo1hS4DNsoaFZINmLs3up/dw7ieXiSWbXDt3h9E9g3zhG0cwmtKYnTocln7WXlvv\naW/YHVhCIXIzV1Cn88gTCgLDTrZyAqKs54GSS7tpydQM75+i3pahVki4bCInDoZw2ASuXiuwa4+P\nZiXI2JSP7eUNvv/vv8tjXzvF7i8+yXY0Q6dWRspmGbIbWIx2mRyQU1hdwiNL49vlJZ1rYO1mCXlk\ndI17qOYKPPKVg8QjGd7+8SyVOniGQhw5YyXQL+8p1eZq2O26+x3wAOjdn9yEeB8KkQgbb71Fs9I7\nD02p1bj37EHrdFJNJlFarGTbJm7OlTBXS0zsNONViYTDeWp3lzEMjVGv1ujUJRwegZ2fO0FkKYpc\nrcbq0DN9bBrl+jsInQbNfAqXz41/7xTxsohcJqKTVTl8wE1XqpBYWKG0skC71aWaybDxThufz0BN\npuHOXIxqvojdrqOaL7H7yWPM/4e3Ca/nGZrw0R8yopO38DkFrLouyz98Fc+uHZx8eppctsDo43ae\ne6YflBqyGxGW7q6hrycwhG+gMhjw7tuHQpZg4fo6BpeLkX37iOVlFHIVFldiLK9k6etzc+rkQW7P\nbuPqlMkkcli1HSYmnSDI2HOwD5ehhcupZWpPkFvffRHPvn3k4jU8TjXZ23PM3W0ycaBnqvju4lfa\n2iKzvHw/AWzX66Tm5jD6/R+ogpWTSSLnz1PNZIDe4hZ85JF/tvnyy8TMzAx/9md/9mmH8ZHwxBNP\n8Md//Mf86Z/+6acdygfws6q83S6Ew3nGx+1IUou3394kl5NYWurNl+PHQzSbbTwePR6Pnmq1gVwu\noy1TodBosLrMpLMSggCHjvYxNOKkVmsAArFY7zkyN1dDWS+xf8pCdf4GYqFOI6Vja72Eq3+AN96K\nkMtW2bfXy6nTAywupPBa1Uj5FCOTPoy7HYidBhaLgGfATr1aoVXL4rUKaA4PsP9QkMJmhCOPDlG/\nex7fnv3IBpRUlu4gJGoYhvsY+vwjNFsdlM0SK29dpFGpUisUWD73DjqnC+3IUf7tn3ye7UiaXCyJ\n3aIgEy+RX46goElLqhOc6MfkdqI16ihFowiCQCkepxCJoHO5iN+4gSUUwjU9jc7pJL+5SRfotlrQ\n6dBpNmkLAqZAgFo+T6fRQJDJ6Lbb6N1u1D/H00jndNLvdNJpt5GJIvV6i6tXt1hdzdFud3C59Ozd\n68Fi0Tz0XPgoyci/AJrvu9YEfhv464f+xIdAIGAiEPhgf4HdrkWvVz5gC6/TKXA6dTQa7Q84xkKv\ntLdvnxe3W3+P9aLB5zMgl7/XPex06njuuQkefTREKV9GiqyirOeZWV+nns+jD/ZjdFrouF3I1Wpm\n/v67GJ0WnKMSupaOrz7zCCu3mnz/P56lIajpGwtQlxuoVFvcWcjTzGRRdCQGH53Gixa3sU1+M0Ls\n+jUyK+sUUhkS16/h2rmTelZi843rLN+NMzbpps9uJhC04OzzkdhMoqjnKW0ss3Q5wpPPHqdUqzAy\nZEHRKDF3/iZKnYH5pRzTExaqiVtcfvE8KqudZLZJYDRIaGInlfUbVDfXUKmVjO2cotvKo+8UefLX\njpOLbrF2c5nXnj9PJVegmCmT3UqhMNsIjflJpaoUi3Xsdt0Hvut/DnQ7HVJzc/cTEejtCrIrK/j2\n7yezuEg4LXDxUgSty02r0OH8+U0O7PdgFkrINCKttobgk89gNwiEX3+FE48donxqF8ViHYdVRWhQ\nQdU8hlanYn0+SlmmYC6tJ7Me41Bfg/N/+Xf4x/qwCFpc+0LcLmURNRpCE/2I1Qzu8X3MRapItRba\naoylC7eYKdSYPjjMnkkPJ587gqqUIH7nLrmry5hzLhSDQ9iPPo5MJdKeuYDdZGH+b39APpXDPjZO\nsaFk4sRRDGrI5jxUigXufOe7RLdrKI1Wmpt58kKVmmGCZLqDzaZmZVXAZFSwvpLilR/N8uvPDvP1\nb+ziytmbFBMpJnb42O2vU5p5C4+sRHkhRz6exJRMsvPRRwi/+hKJlTA2t41ut8v2zAzl7W1MgQCV\nZPJBMxHe0yF4YLy6XZKzs1TT6fvXpFyOxK1bn+xE+QRQKBTY3t5meHj40w7lI+GRRx7h7t27ZLNZ\nrL9ifiTvR6vVodXqMjubpFJpolSKDA9byWRqJJNlHn98EINByZUrMeLxEkqlyOCgFceAH0Ffxt/q\n8mtfnOLqlS2uXInyzjtRvvnNXRw8GODs2VVEUeit79feoL56B6fViKuzRTvoYyNf4dChAJLUxO3U\ncf7Ndcq1Dm6PD6NLIGCa5fprNxFEkcrZyzzy66f4zd88ya23bqE36xkdd6OUd6k1g7TKeaTtAmaD\nnKXLr7Jw7jKh6RFqq3PEzp3FMjhI9PxbDD31FFpXjdhiGElqkdqIsxK5TWp9i065xIhfwFCXs5mt\nokzOYLRoGTjxHIm7i6xeuIysXqbbbmMMBilcuUKn1cI2MkI1maSaTKK2WnuWDC4XBrebxO3bQE+U\nUK7RYOrrQ1uroTKZ6NxLRLz79v3C6sa7TejLyxlmZrbvLwFrazm63S6nTg08tPL2R0lGIj/nehc4\n/1Cf9kuCzabl6NEAMzM9zwKdTsGOHW4cDh3NZhuLRU083jtZkstltNsdQiEzGo2C4eF/vOtXJhNw\nufQ04+vkiyU6Gi07f+u3WH/9dar5Av69u3FMjLP8xgVyuRpau40b55eJplvU6i1Eux+lSk4plUNs\n2fHpahRlXRSdOl/8zb1IyTivvLRAOlXjX/+bR1h69Sz58DqIIiqjCa3XR3pxmaXlMs1Sgb6Ajm45\nRyW8RCewi/MvvINSytM36sFnEzGHBJo3X8O/7zDf/+sf4BkdZHDfFFfPr2CplFCLHQrzN7FYtcRS\nRbRaDfmVJY594TBbWzUaZiOirIuMDsa+EKb+AcLhPJWNOJfeXGQznEdvVKHUaqiXy6STefrGA/eo\nb//0hrh2s/mxNCfazSb1YvED11vVKkq9Hu+RR7j2g3mso7r7N47JqCB+9TLZtTVUFhuFCuhkdVoy\nA6myiObOTcR2A6MoEn9jDe1TT6PzBdlumomUs5SKEpVElD6PiluvLaBTNAnfuI1vpB+TU8fU0Un0\nTjuWTppOZIt6o8PsuZv0B7SEZ+aQqVSg6JJO1zDqtgkYhlh4+yKlxRXMbgelTj9n/9+L2KZ2k5m9\nyfCkF08hihTfQK0x0tiOYA+GaK3eZHErh85px+r1kA+HqdUFMls5WlKFTqxK6JgDk97BkZNDHH80\nxNztLaqlKl/76jg7dvuxKcucORmgVbXSP+Zl9ezr1MpV6CrRq7qYnWbUJhM6dZdaWULvcDC0Z4j8\n+jqxW7MYvD48UxMYg4EHqJYAolJ5/4ju/rhI0gOJyLuovY9i+FnA7du3mZ6eRvyMsIJUKhXHjh3j\ntdde48tf/vKnHc4DeL8xntGoQqmU3a+YvNdQ2ut9czp1vPNOhM3N9+59rVaO12ukXG6yuZQhulWi\nWGxgsagZHraxuVnEZFLz7LOjaBRdpEQMlc9Obh6ahTSZ65c59t/8awI1G5ubJaxWNe12F7tdS7Xa\nJB7JUG1l2V6LYrKbKObLmPUKmrFl9FkvzsxNbLYR5KZRzr2yQPjWEhqtkkNP7qUQDhO/8BZquQql\n2CZ28w6NQp4jE6MUIxFufetbHPnv/nuarQ6Vagtz/wDFW1XK200iK0kUgo+dQS0Wg4QvuB+53c/S\n2xdZm4khyAQCARNOq4JqKoVv/35UZjMyuZzavXutlk6jv9fTYQoEUBoMiCoV6fl5BFFEYzbjnJ7G\n1NdHt9VCbTY/1DHL6mru/XsREokKuVztvh7MR8Vnq736ZxAKmfF49FQqTXQ6xf0Ho0Ihsn+/j7m5\nBJVKE0lq43brGBh4sOxULjdoNtsYjar7FDG4t4NLVnj1bJjYyhZypcjQqJuBg0dp5jPoAiGK0S2S\nkSQOv5N8qc3i7CZtQUExU8EXUmIw69Gb9UQuvI2UL6DQ6rA6xihdi6L0DRC7s0wqVSWf24ulL0R+\ndY12tYbG6cI4OMr2ZgqjyUJ8HRSyNt6gjuXby/RbfcQXw+QX77J+Vcc3/tsvEHnh2yj1evR9A+i1\nCi7/+BK7vuygVKrT12ciF09TzWTxD08gMzQwmlRsL6wSvrmI2hGgs7RMo1ztdZirbDR0Tu7eSOFX\ndzHajXQFgVKxjsNtBpkcEBEECAZNOJ0PN9nK5QblcgOtVo4oFUncudOjhdntOB5SyVKuUqF1OJDy\nD2rlqcxmlDod9WaXrkyOTHzPLdYkr7J58w6GgRHOvrHGykKcdqPJ53/3afY9eYboyy+gqKUQAOuB\nk5y7kMDobBIrq4in2+j0eoJDftqRuyzPp9g5GqJ8e5FmPoVT6WT/F08TX0vQTufRjg9RzaShUaVV\narC9vI7c6iIRLdA/YKUWi1BOJMmurpNYWMY2PsGFs3fYWtpE1z9CuSQxeyuO7ZEA9YaA2MwjSCVE\np5XMWg6Z0cnKpRn2/NopSuUGep+frVubNFtyjHoFOqOObFYivBQlPjOLzWHgwJ4g27dmUG4XKSvV\nTB4cpRTZJL4SxTY+QXL2Nq1ImEK6w+DkTvyHJmhLVaZPH6LWVaLSykldirCdqFETy2TbEXboDGht\ntl5S0e0iiCLW4WF0jgd9Z0SlEqXBcN/V91180jTvTwIzMzPs3Lnz0w7jofD4449z9uzZX7lkZGrK\nyepqjmazjcGgZP9+H1arFotFzeZmoXekWmsiijLMZtW9I/eejYfRqEKhkNHpQKXSIBotMjnpYHY2\nxczMNkajiv5+M/F4CZNJRSLRUz8WagUO7t+B76QcixaarTbheIsfnZ3h6u0COp2cqSkXjz4aJLKZ\np55O4e3rsB3L065W8ASsKFtdtK08jVKJ2LVrBE88xkt/8zort9eJRzL07xji4g/fwvLUEDIZONxW\nVEoZ3UoeWbdJU6qhc9hpSxJSPodjqI/B0ACSOYTbESWxuo7BHUBw9tFuNyETRTIEaEkypHIdnVGH\nVMixtpzEdHQcQSbDPjFBo1ik2+1iHhigmk4jKpXUSyVq2SyCTIbO4WDg1Cncu3bRqtVQ6vVoLD/f\n9+sX4cMsHWQy4YFn6kfFZzYZAVAq5R+6O3c4tKjVCu7cSd03XAI4dMiPTCZw506KxcU0rVYHu13L\n3r1edGKd9MICUqXG5cUOsa0iuWyZYqHOyswyJ5+YRFMt0DdgxTrtZmA7SzuX4trlTbqCnEZNot4V\naSmNPPlckMtnZ4iXq3TlCvwjfrymNrMvvc3oMyY8fU469Q1q5Trakd048xXanS4dmYqO1oxvapyz\n379CeD2P0ajE51aTiucZFEV0ZgOFbodqoUQqXUPv9yOqtcgEGZP7Bth55ihan5/gxAAGvZyNSAmF\nM8TWRoZ8TUaj2aZWlTA4LAj1ElNffo5qsYy9P0hDbeHumsT26hY6VxuPVY6n300mWUZtNKLRq9i1\n18+uaRt2l+mhKiNLS2lu3tymWm0i0sKvq+DspqgXCki5XK+T+yHhmp6mXi73zkEFAYVGg3N6Gplc\njkYOgYCRfL6nVSOKAu1SEXvAzdVbcRLxAvliC7lc5OL5NZzBgxin9hFwKRHocvZchKsvvMHQgWnK\nWj+xdIepiRHKVQlZsYjZrKar1BLaNUlo2EUJLRevZ7h1NcrYDj87Rw0UZi8xuaOfRgs0ZjNyJUzs\n7sfl1BCfXcMW9KLSqHAEXMhtHrZX30auUiHKZBh9PsqZHLmaAkvQSyWygcJoI52p4BgZoWNw4Ot2\n8O2YoJwrkNjK0mw0qFVb2IcMYLQz5JCzsZpma24Z55Fhapd/SjeyRXpFRt/h/aRmKmgddkYOTfeS\nO5VAwWlBaTCgdThox1fJtM28/HfvILVAbbbSykvsP3iEZi5DMlnh1jvzPPX7X73PQtJYrei93g/Q\nAGWiiGtqCimXu3+0JtdocP0Ki4b9PFy9epVjx4592mE8FE6fPs1f/MVffNphfACHDvkZHrbRaLQx\nm1VotT1n3vFxO5cuRSmVemu306nDYtESi5V6sgKmNuXwHarpDJYDB1iKSmxvV9izx41er8DvN+J0\n6qlUGuj1ItFoifPnN+m2mgz4lMxci/CbXxnk8gs/wtIfopDdxunUcfCgnkikyA9/uECt1uLXnx3m\nW28tYTdbCQy4oNVCr1fQH/ChUsmR+cfY/z//byi0KjZnX6Zbb+L0mKHdJLeVo6k/isI7RHQ1jN7l\npIMM58Q4apOJgVOPobHZ8OyYxnPoKGubFWYuLJHbjGL0BwlMjeJxa6G0RWZ+Dsk6zM0L88jWoqSi\nabw+A2aDjM2FdbwDh4hducKdv/97FFotoWPHCJ04gahWs/LSS0j5PIIgoHO7CR49iu7nKPK2Gg06\njQYKne4jVUhGRmwkEuUHWiNCIRNm8wd1Sn4RPtPJyM9DMllheTl7nynT6XRZWsoSDJpotTrMziao\n19t0Ol0qlQJStc6UOU1+eZGOPUT49hoyo5VaU067WabTEVkKV5gY7+Pbf3ORvokg+w8dJ3vzCkpF\nDIVaTmjPOHJnkO/+zZs8+ztnOHk8yKD9KFIuD6kN8lfDNGtNaDfp2zHM5JgFCRV5mQO5d5CFK4tk\n0mkOPTuJKjjEduI1jCYVuWyNZkckuGuKjWiFTruF0eOi06ijVkJdpcS9cxrDxBSNgJJ0uozR4cKo\nlWh35UTu3uCRYwdYevMSqXyFtsXGmX/7u3SzCRbffIOs2YB5YJCa00kmvIxzxz7eXFyCvJGRAT1P\nPDHEZqyG2e1gaNSJx9KlHZ6loxknl6iRWV6m2+lgGRjAMjj4oZbUqVSFK1diVKu91qPcdpKN6CZP\nPDWMKBSh26V2TxfkYaC12/Hu3cva2bOU43GUej3NWg3x6FF0DgfT007q9TZbW72SrtNjp9CpEHs5\nQrXa8wsSRRluFKws5wi0ishzOWzjk2QjcUS5nFQ0xeQTE2zFK0TX0wSdAqF9u6nMXSW/FcdiN1Cu\ntEiIRubvVtA7vWys5yhsJRhR1ZBWzzH4xd/A83tfYO7Fn6JQltEp9Ux/4Wm2Khq6vkky2w18KjVm\npx1BZ6RZq6ELDRLdvNaj0mmt2EeU6F1OZDYP3qPHuXYpjHrcTUPnxHP4URI/fIUDj47hnhzFNTlJ\nqirHZDNBrcyu3z5Ge/UGs9/+DmqDAYM/gMruotFq4HC5iW+mSc9cRyF2cQ4P0AWyy8vo/EFWkgra\noop2OU+n2yGTKpJqhLCaRSgkkBrQQoFzeOAXjpcpGGTwzBlK8Th0u+jd7l8p19CPisuXL/OHf/iH\nn3YYD4XJyUkkSWJ1dZXBwcFPO5z7EAQBu/2D1TGFQmT3bg+Tk70KmyjKyOclUik5o30aZp4/S3ar\n5xCtdW2iEczI6KBSydHplITDeeRyGfF4iWeeGb23MW2TzdYJBfSk0xWqbSUqo4GpU0dYzqhIZFqY\nzb2j/eXlDDqtnHpN4olndtBtt/Dt2Ul2aQm7uQsGGwVTiO88nyCfr/Nf//YoBp+f+vIqjewWKqUM\n/fAkWwU5g7/2DKXnf0RbbWL8S8/hmhijuLlJfm2NdrNFemUVmU5Pt2Oi0Wxz4HOHUHZqpGbPYdSM\nYPQ6GXz8DK9cTbE4t82x3WNkY+eJRkqYJqyYrHrURiN3/+EfAKhls0TeeQfr0BByleq+1EG326Uc\ni5GenyfwPmZVt9slu7JCcm6OVq2G1uHAvXPnByqc78fAgIVut8viYppGo01/v4WxsY9nPfBfZDJS\nLNZpNB6kJvUSj8Y9A6YeBUkmE8hkqsTCCbyhFjJApIsol1HMV5E7PBw/NUm3mMKgU6AwGAiOa2gj\nkGlqcZ94iqemd7I6v4VMoaBbr/HsV/YTHLDTDN9F2LhN+KevIGs3MTotjB0/iW/Ej61URa3SERf1\npHJV/IERlAUTGkeVCzcKHA82ePRfPketZieOAAAgAElEQVR8bpFyKoNtehy72cGF1+YRRDX2sVG8\nfiuDUyHE0W9QkOT8+KV13vjOeQS5iD3g4cmvn0Cm1TGyaxC7X8D5O19ilyQj3dDQ7lTZmrtA39GD\nVKIbxGduU08nGDj+KIKUoN+vIxbLcafexBcwc+bZPQipMNG3v0tEq8Xo91NNJknevYtcpaKWzdJu\nNBh++mmCx46h0j3Y1JrLSfcTkd5YdJCqdbL5Bm6lkna9/rHGudvtkp6f72mY3Cs1VpNJtm/dYuDU\nKfR6FcePh8jlanS7YDLIuVEpotWpMJvbaPUqHEEPmbIMhVbL6PgEytQKrVyK8UkX/aNeVtfyxJbC\nPP21E3RlSnT1JD6PBvXEaSLXb9FpSFh2HyW2JdKKRal1mxiNBjZvXMI9riR67i30FgMag4Ydn3uM\nRKKM3m6hY3TxwvO36HO68Bw8iqBQceJffYmZ83dRWW3cno3jm57COxLAuftf0pQk6HYpNBT8+Hs3\n2Yg3kelNLOWiPHLEj3LXSdwOFY3EJpe+8xIo1Dz5mycZeqyPpTtRcp5Jhr7+TQo330FGF43dzt03\nr5PqWLHajWQTOVKLK+zWabH3h2jX61TrUCxUEZQqmoISjajENTZCPNPC4lOiUCsJ7plG8xC+JzqH\n4xcucL/KyOVyxGKxX2mDvA+DIAicPn2as2fP/kolIz8PoiiQz0v31/F32ZE2mxalUMM6PIjB46aR\n2cZMAWt/gKIkY24uxfXrcZ55ZhSPx8DmZo+d8/rrYUBArVag1GronxpEZTQx9aUvEqmoeOtChO1U\njXq9jc+n5zd+YxK7XYtSrWHu4hrb22UefaSfI18bxahuEi/IuXy5wNXrq5RKdS5N2xje2+sDKZdL\ndOoVjH4/60tJwm0Z09/4HeQ0GZweQCwlaFYqCIJANZ0mNTuLfWyMkV1BbCo3ubUVMitr2BQiq2df\nQ6FRMfTrX2c7vILBpOHabIH9T52hK1UIBE3s3N9P/J03kbJZRIWiV11VqUgvL2Pq70dlNCKTy2lJ\nEs1qlVIs9gGtoGI0yvJPfkI1lUJUKqkmkzQrFYaeeOJD1VjfhUwmMDxsY2jISqfT/VjHM+/i00xG\nngL+VyAN/FJrnjqd8gGNEgCrVU04XODixQjJZBXolZgGBiwkywVk9N4rlpP4HEpSd3MERwykbl5l\n5foSk7t8lDVeNtIwv1zCf6fIU5+f4vDeAbQaOXdePkc5U8Rg1pLp5Aju2YnR78M2PkFhaQ593xDm\noVEyG1uotUrWVzK4T+/m//rBHY4c9NDuiLx+dol9hwfRiRLXl7JspXXIFQZit9v43TmOPDZBZDnG\ngE3CTB5Zt8VGOE9R5ebm+QVQqnGHnLhDTrbjOZ54JkRjJcrN//A8tXIN/cQ+vEeOsXLxJnIE3vw/\n/xONYgHfcID07Awagw7PoaP0q+IMHR2hIdfh8JqR5aLM/ue/xTo0dN+PoFEq0ahWEejteOvFIuHX\nX0dl7Lmy/myFRKmUPdCopjIYEJVK1Go5Xan3vSv1+oce52at9uFNkek0zXuukoIgYLW+t/NS+wc5\n8w01Vy+t4tujpCJ1MFkNHDroQVUKk1nuOVtKMhtFSeTgk6eYj8lY3Gzy9NN9sLDG1f/8U2LRPAan\njekzR8li5rX/7wVK2ynMdj0Otxlbfz8mdwPlo4cob0WoK0Q0bi9qi4V6V0ltO8meIyPcvboE1Tbx\nQo4nvjKG50v7iKbaOFwGdDoFiWiOly4scP2teUaO7KYkddm904lT0WRmocLMzC36ggbsLiOp2Rss\nX5yhIxMxaWH5xy+iDI7zg2+9SastYA14GN15Bo+xwcZyHKXDxWuvb2CzaTmxbz/bC2sIciXhN94g\nPT+P57BIcV1BPt0km6mRr8RxTkxw+EgAnxVcu3dj7w9gMD48je+ziqtXr7J3797PTPPqz+L06dO8\n8MIL/N7v/d6nHcovhM2mJRAwsrz8XsXU69WzvV1h5eYSifkVNAY1+w+NYlfmkLWiPPOFQ3zvh6sM\nDFgQBPB49HQ6Hba2SgSDRorFOu12B41Wid2mQq3TkKu3WQkXGBi2MzjS0yuJRkvs3Onh0CE/f/1X\n17n0zgbjY1beeP5tztPkt7+5l/MXoqxGGtRrHYqFOj98YYn/6X/YR//vf57w3TD+qVF0Lg8/fGGB\n61dy/ODlOA6XCcN3o/yPf7iLYiTCyssv0ygWsfQPkA+vo9CoKcW3Wfre92hLEt49uzE7zFRLNUpb\nEUwmNa1Wl7pCx+2VGv4BL/snQzQy67Sl3nF0p9kEQUCUy9GYzSg0GiqpFLVcDqPXi87lQqHTfeAY\nNX79OvEbN+7riygNBriXLBl/gdIy9JJdUfynyY59mo5VF4FPpAvM7dYxNGS9/+XIZAIOh4719Ty1\nWotMpooktQiHewJdgxNezA4TcpuLYjJDUF/gc782Rr+9QzOzzf5jIxgHR7j09iqx+TU8fU5MehVv\nP/8mkTsrLH7vO1jECv1+FTZ9B5nawNmza7x4ocRcvR/nF/8VbZWBl/6X/4Nrf/s8tVQaW8iPXOxi\nMGn40YvLWEMBfv9PvsSp04OEX3+No/vsaFQC6/NbNMtlXD4bue0UQb8Gr7GFStaiLqgpFiU2lrep\nFCqM7R+lo7dx+XqKazfTrK1maLdb6N1u/IcOUq3Uufv97xMYDyHlC5TTOVrNFo1SAZVOTSWTRaNV\n0kpEaNx6A3crgqmZphqPIVMo0NjtbN+8iQDUSyU6zSbVdJpGpYKoVPYcb9PpDyQILldPF+BdqAwG\nRo/sxOXSISqV6FwuAkePPvQ4fxhrA3q9COLPsbZWadU0FTqeeu4Axw44OLFLw+FQBYu0SXXpFlI2\ni97lIhQyE/AbaCU2CTjlnNilQSNIKCwOnHsPYA14UZvMWAaGqEXWkXVbdOnS7nTJR7boH7Lj8JoI\nnjiF98gxTOO7KGr8LG3LuXAlycxSHZVey/ZWnlJLRWQzS347TavRoJwrcvPCEjevxbD43Ny9skqt\nWqcrKlhbTvOD788jE0WarQ52p45aLo9X2Gb7whso82Em/TAyZCYaq7JwbZHhk8eQq9UIKj2Jjo22\nJYDN78YQHGA0qCRkB8Hk4MjvfoNqKkmrXse1axcyocPwgIlOuYDVbcfo8VDKl3C6jYjOIM6hPsbG\nfznqi58VXL58mYMfIpX9WcDp06d5/fXXaX+IoNWvGkRRxsGDPg4d8uH16hkbs+HzGXtHriodgsVJ\nU21jdr1B19GP0O0Q9Gh59NEQJ0/2oVYrePPNMO12l/5+C1//+jSf+9wQzz47yq5JK4cn1FTiUbbW\nEszdibO8nEGS2thsWkRRIJutsrFRpNnqIirk5OMprr21wOzMFqUaWK1a1m8vM+DXoJALGLUyXnlh\nhr7xAPv2eBA2Z4nfuIpK3kFqdKhV6lTLNYL9dlqSRGJhEVEuR1RrKSeTSPk82dVVVFo1CqWCeqHA\n9q3bVLJ56sU8emWbwyfHqJar6JQdRsfsjATVuPQNHCMjOCcn0TqdIJOh1OvReTwEjhwhfuMG8evX\nyS4tET53rudWPj7+wHct5fNU0+kHhM4apVJvHf+YAmYfB59mZST/i9/y8SCXixw86CMYNJHLSZhM\nKkqlOvPzKQqFOu12l0ikgMWiQatV4A9aeOtcisjdPFadhX6PyHDAQl1Tw3lmB/lklo7Lhr3PTypR\nwGrT0dgOs3l7mdgxL/m5RbTKLo7hART+Ic798DJtjQXbzt0srxXJJ/OEZGl0WjmmwQmuvL2E1Zsj\nZBvn5OkhNkZcmOR1aktz6LRNdPUU2evneWTvTnx2kWIyzeKVu4idOv2HzMQW13GF3HQ6IBNleL0G\nxnYGyNRlnHt1AYfbwpAaXv1PL7B70oxqZZXm1WsMfunrXPvBWYYUSjRWK6JKhUbVk+12jY3SbnXp\nSFX6TpwgvbCAIIqoTSbUVitb164hk8t7BnOZDPaxMTILC9Dt0qrVUBmNmAIBWs3mB9T7NBoFx46F\nWFnJkkiUsdm0DA9bMepEmtUJFDodcqXyocdZlMtxTE0h5fO07u0MRJUK5+Tkz6UL9/WZKRYlwm++\nzfzFWxj1SjxONXW5g0osgiAItOp1up0OjZUVbNO70XTMLL10kepIkODucdZSAh33BKWyRLVU5far\n5zn12BSFcpBSpcXYiBWXukg8JvVYAW+eRzOyi9f+8sc0qjWcU1PkKhJvvLxA/7CThbevYzKraCPy\no//nHBpfkHpHRmojz9nXw+w6Oc2tdxah3UQQZWxtZlEbDTRbeVwuDZpWkVJCwmaSIygVlDbDCN0g\nW+t5BF2DkpRH0Joop5I0FBrk+8ZQOx28+e+/ReTOIu12h+SdYZ78vS8i9vcj6dRUUimyaxtoDEW+\n/C8O0rD0s71dRmjUyMYzPPfU9ENRAOulEsVIhHqxiNbhwOj3f8Bc77OAy5cv881vfvPTDuNjwev1\n4vV6uXHjBvv37/+0w/mF0GqV7NjhZseOnpDixYsRJKnF5naDsqRmayNLtdqkfyzA0MBuRJ0eh7HI\nq9+bo5AsodOb2NoqYrNpOHGiD61WgU7Zprpyl1Q8z8UbBWKJGtWGgnhbx9mz6/zWb+1gc7PIoUMB\nymWJutSi0+nSqUuoNUoEAbY2MowNm7FY9Rj1MsxGBT6vjqOP+li/PsvSGxeZvTDL5KlDWL07OXbI\nRSLnYGTYgkXIE10Io9DoKEQiqM0WlGY7BreLWjaLTKnEFAqSDW8iV6vpNiRK20lkShXT00HsIR/l\nuozBQStepwqjzdgzq3Q6MXi9pBcWkKtUePbu7XnGdLvYx8epFwo9iwZlz+H4Z9GsVtE6HCj1ehrl\n93xwNVYr2oc4gv2n4r/InhHoMW1CITNWa51IJH/fvwYE9Holen3P58ZgUHH+/Aa35oooxZ6ink60\n0wpXGTTJWX/heVrNDvYzZrRClcm9/YhGLTfe3sBs1qBTC5SVClq1PPnNTdSuCfKZMraJPqRsFpVR\nTy67zdDUEOYdDa68EyYQNCNTKNAquwwE9OwKQa1co2Mbpry2gKzb5sKLl3EOJ/HsmKLelhja1Y9e\nI6My/zp9Rw+RmruDJF2hrg7h9eo5cGYv3/m7WUxWPYMTPgxijWa3xWa0zL6BQeJvn6OwOMfkyUNE\nFqPYRicZOfkIjVwGV5+bcrmBQdYlvbiI1maj/9QpnJOTaKxW6sUihY0NmpUK5r4+pHwe69AQOqeT\nyDvvYPD7MXg8WAYH6XY6aD5EWMlkUrN3r/cD1/+pDyTrwAAKtZpCNArdLsZAAKP3g5/zLlQqOX6n\ngnApjdfZq6okkxW6goBNrekpGcZiNCoVcmtrePYfYGstTLPRILq8Sf/BHQwO2bn0yk0UFgf5ioDW\noOf2a5cY3xmgXWkQvhqm/6kdNFUmls+/iXd4iJzSQj55g5ZUx5TP4dt7kLWFLUZOTjA86qR/xEki\n08Q0Mk5bkrAauoQmQmwl60zsnSS2kSa7lWB41Iu/3wVyJaJc5PDhIPrKGkqZjMHdY2xcuU46WUKu\nzWDSq+l6fczciOEO2HBabQR2DOGfHubOS2/Q6XTQmo0UMiX0yja51VVs/X3c+fFZlLIWMpnA6sWb\nhDoi1kddxOaWadSbPPbVkw+diITPnaMcj/cuCAK20VGCR458uPnWryi63S6XL1/mr/7qrz7tUD42\nTp8+zauvvvqZSEbeD4NeSS5Todlss7Utka8IGIx6cuUOL70Ro10pMH9zk+jsIhqNHGo5gpNjgEAy\nWWVuLom5ESd5/QoDB3Yxd2uObhfs/QE6LQWtVodIpMAXvjBCqVQnm63j8xtoNJpYlDqy6+u4/RbU\n3RryYo1/8ydPEysqOPJYi/ExG/pOntnnX2MrmqdabVGMp1Aac8TvpvDtnETelpi7cJ3msJWxyUlk\n7QaCKKJzOFHbbegcLqLXrmIfHun1k2SyyOQKvAcOcuf1y2gWk2woRth7uI/xCecD7tdGjwejx0Pf\n8eP3r0WvXEEQBDQWywP03W6rRbfbpZbJ0Gm3e8c2CgV9jz1Gen6eRrmM3uOh7+TJf9YNwz/HSuAC\n/u5917aBr/2iP/yDP/gDzPdkacfGxjh06BB991w/w+EwwD/6WpKarK1BIlFGpSoxNCTj5k0Jo1GF\n2SwxMGBBklqUSg08TgmzvEZ1M00jWkCxy8vi/DKCQo1Mq6arajI0aWT55ipab5PpR/swm5Q4zHKc\nzz7F0swNFBYLtuFhtN4MhXwMaWsdz/h+sk2IFUrUpTY6k55KQ6SNEmN4gfN/fwm/W0NbVqPTFTj9\nlc/TyKZRe4qU6yUWfvoyg/sm2Zy/RbXSYIehSyGRZjORQtVo09Tb2OgI2AfMHDwzwMCOQcxGke3Z\nd2g081DTQqOOYmKcTLnI8RMHyWbrLM4vYT9xGPlWDLlag8qsweh20W2pycp0VNDRzBUZcTh6k3nP\nHjqpFJN9g6QX5kk3W+j8fvb//u+jUKvZjMVIVavsOn4chUbzkcbnw15/HBi8Xgz/SALyfiRTNarV\nFuWfkaJORHJMf/VRCmtL1AsFRLUak8+HSq/DmI0jsxmpNmXUKxJ7Dg9gcdt569I2t5dKnH7uGHd/\n+jqJ6DalQo2J3X20rQGSW3VqSjM1jbO3AzJZUFtliAoFpfU1jFKOwdBBSukmm5euUpObmH3xdQx2\nC0qdhka9iXtoBLPTimFwlPpWBqVex2OnJjBbtIxPunHqJBKvJ3jzrQ0840M4du0h37iDtb+PQN8Q\ns5uQT0cJTg1jsMsZCmqwKmq47Wo2lEr0bg+juwexWrVU6gI+kwHX1Djbt2fRG1QMHdmDwtNHo1Sk\nI8jp3zvC5L7+hxqfYjT6XiICPTOu1VVsQ0MPNW6fNubn5zEajfh8vk87lI+Nxx9/nD//8z/nj/7o\njz7tUD4y3mV6KDIpVJVtxGIDk05NPi8wMGhjfj5FMV/DW12grTFRyEuACqdehZRK0HXb0WjkJBIV\ndAZQKkREGThdeqIbWWTNGnt39eHzGRgZcyIIMl55ZYUDu2186biOBW0U+f/P3psFR3Lfd56fzMrK\nuu8bVQUUrsaNBtAnm2yySapJkZRkyYcsjaSRZ3asmN31ju1d27H7ug/WTsRsrNYbfrBjxjuODYW1\nkmxLYw0PiVezye5mn+xGN+6jgAJQ930fWbkPIEFRJCVKpthsxn5fgMxIVPyQlcf3/zu+X4uVJx75\nbdR6mdr2Oi39IJdfWCCba9HpQj7Zx1OfGUHUasmliuiNeraWYpw+eZzO4TDpVptCokynK+L1WzE5\nzWhmZojfuEFX7WL2+VER8M0eobixRs+RIxg9XjKb22zcXCUZTWGoahj69CQeC2SWlvD+giZqs99P\nWqvd7yN5EzqrFa3JxNb58xS3tvYXjy4X9khk/zMnJxFEEYPLhaP/l7vP/7n4KMhIEnj4V/nDb33r\n/Y2B33qJ/bztjY08u7sbqCrY7R70epVHH93PirhcRiRpf3Vns8rIe1kWXruB2lUxyDAQ1CK2Ougn\nD2Pt7WXt2Z/gC4YIPDRGpWsg4PfhNCjc/Ou/oO++k4ROPUWyoqXYlrGE+7jz4uvkd3ZpNQ2M3D9H\nj6XKVr6K12/hjVspPnv2FDtXV8inS2jVNv0hIysXrrLgdjPxyAPMCkbisRz6gSEEdw8L33uVB8+O\ns3P9OiP3H8FvtdIS9chyBUkno600mZ4Y4IfrS+Q291DSLZRCjZGTg5TnX8Lh9dH38CMIoVEEY4vj\nkQFsFolurYhSq9GqVtlcjlNVoC4bqTc1tLoifX0ddDqJnr5h5ktW4rUGhpEAfoNCuN+NKxygXavh\nmZxEb7MdlEc+yPfz87Z/nWijxT0yTCGZQ+3uN9B6h/tAFNCaTLhGRnAMDJDf2KCwuYlSLtM74cXg\nD2J0Wli9GSU0GmFytEWzo2LwmJl4cI7heoNcvolks/Pyf73J0P1HGDk6QmVjBe9AkMjMGKnNGO1a\njUomy9DhQSS1xdW/+3uGjo6jb2Qx2cykd9IERyMk1mIMHR4kGDTTPxZGY7Jgsxl46dw21WqLf/21\nSfQGHQ3ZydraG6xGb3HmqRkch0/gO32UV5+7g8ms59/8L1/A65BQ91bpbtwgmpYJBP3MnuhnL5rC\n5jCjcfrYKaks/9cNHLogg58dQq/W0Blkdpe38PbYeWxwgKGpPry+X87c7r2Ucrvt9kFp7V7Byy+/\nzEM/tfK8F/HQQw/xpS99iWq1isl0d6wcflkUolG2X30Vtdtlut9EPmCl0NQyd7yXWKzElStxpsds\npGMpwuNmgn1Ocuky7baC1GrisOno67MRCtlo1wV0NiuNXIapmRAWuwk9LWJXryO7/XhNDpZX83zx\nt0YIqTG2zm+yvZShUWsyNNVL5NQJxmd6efrZdfbWE9QLBUSNyF45w+2Ig9HHzrC+lsMa8KF1uHnj\ndpbjT97H0R4fjUyCbXGP7PwbWA8PolYbhE89gAokVqMIQO8DDxCcmaa8E2PxB/+FZLqOqNUy+dj9\nYHHRP+xCVJrU8i06zebPzVxYg0ECc3OkFxb2DUMtFgJHj+77SS0tHRxX2dtDFEUiZ87QyOfRyDJm\nn+/nTtH8OnA3c6RHgP8NmAR+DHwW+NVmPN8H9frbjLDR6BCJOLhxI47fb8ZqlRkZ8SLLGpRilkvr\nm7hdeiQBXB4z1UoTv8/BXlJPKVOikKuQTizgrTQw9Q5hSG+jWsw4e7wUdEEuf+8KOpeXVj5HaHyA\n+77wENs37uAOeRkO6zAaTBx+ZI69nSJDjmFaOjsri3E0GolOo0mlqOAK+qgWimzsNTn85MOY1gts\n75SJrcZ48uufImJrIgw9hXdmhmS8iMVippHPk7j4Kna/k6nf/R2+8uUJXv2HHMbxKfzGOsryBRRR\ng9bhxDZ9nL//x3VSqQpBh0pv2MLsjJedF39EZi/H7dtJlLbC6NkHcc70sLmZJxKxU6+3ee21GO22\nQjBoJVNUWGsqVCWF0xENOovlnnJf9fnMJL39jDyqJbu6hihpmDw1QW1zkUYmQ2Z5mWoqdZBxkfJ5\nbH0Rao4h/vHbV7C7LbSNVV65lMLuMFDfXGbn9jL3PT7HTqbB7qVbRMYjhNUYu9cvUdtep7Z+m/sf\nfpLisTPsbCYwKhVGhmy06zUq+SKyViL66nlO3H+c+TsZrC4LwWEHhyccrNzeYf7iCv7+HpYWk3Q6\n4HAaqDZVBobcZK0j3PcVC/nYLqLFhe9QPzeX6hSzRTLxHG67SPn2TQqZIgP3H8MV8iKKIoNHR9mN\n5bEN9PPyC+sUGhKIGtJ3bjMx08dMbwd9u4BWo8GurVNL3KQqZVF9ZxDED977bvJ49k24um9Pt0kG\nA7qfsSj/uOPcuXM8+eSTdzuMfxbMZjNzc3OcP3+eT3/603c7nA+E/Pr6wepeW04iFlqINYGyfpjV\n1cr+5KQq0TsSohTb4ujRflbXi2hEGD86xAOPDOJ2mzh2rIdUyoZt3EFzZx3ZIzI0GebWhaX9rOGw\nA3snwf3jJsaPWrjxD1ss3klTr+975GwsxXGO1VC6KunoLpV8kVyySEcBb0ikXKignRji8f/uS9y4\nvsvLP17EHQlx8Y0S4o0cs8MyaqvBbjTJ5OMPIRoliqks0dtRNq7OMzgSoGdylGqrgmNggOCJEwix\nHNZwL61cBjGxTPbVEnqXm1yrjc6oxz87+74lU1GjwX/4MPb+/oO+Pq3BwNL16+86tpbNIgCuu+i3\ndDfJyDXg7K/rw1utzsEUjaqq1GptBAHOnIkwPOwkELBgs+lptxXEioWcXyG9EUcrdHHiwSI48E8e\noyntkNncRtQIBPrc+KfG0NvtSJUU9r4+TMFefvxynFq+SKcLjVKFV/6fH/LoVz/Nk5+bYPHyIunF\nBvrRI5hd4xya83LnB0vECyKRIS+p7RS1Ygm9pKVcr+EeHaEQ22MjcRODxcJEOMTDD56irXTZ2shR\nESRiN0qM3P8Q6YvnufbD5zFZjLSRWHnmOcbOnORTMxLl3U10Jgvy6fsQ9CYki42ddAdNu4I5Oc/C\n+S1SLgOmeASbxUa1FKNZqaG320lv7zE5V6Njs3D58i7pdJVbt5LU6x08HiNnzkRIJqvs7ZWp19sH\n4nL3CkIhK81mgLU1Ga+/H7fHhFVJ0Yruy8mbvF6q6TSdep1Dn/kM5p4euq4+Lj+zhs1rp9KWeOX5\nJRRFx8Z6AbO7iV6nQd+t8ujZYYpHA/jDbpZ//Dy1+C4mrw+NVkLdWWX6AS+2YpHc1i6lPTfOgQg0\nmrQ7CrlEnr2NHzIwOszwuJe9dIF8poRZb6KjCHz3/76ARqvF1eOkWjbSrgcpZ0tcvJLA7nbi7u9j\nU1XZvl3k/pN+5sZOodOKVJeus60ImIYn0Cgtln/wA9Rul97Tp3not88QqxipiimyqRRGk0zvzAR7\ne3FOnBzD3EzgHBqilsnQaTQo7exQy2Z/Ka0Qo8+HPRKhuL1Nt9NBazTim57G4Pr5PlEfJ6iqyrlz\n5/j3//7f3+1Q/tl4q2/kXiEjP01iHQ4Doiig06nYww5yDRmv14jNpsce7mFlfoe9a68SHuphYLqf\n8dk+Op0u5XKTwX4LzVIJVbKx0u5lctqNmN7E/OAAeqMek1gjt5mmsLVHMexkbTlFOlkinyzgcOoJ\n+E20qxW6Jj1Oj4WLT1/BYjdx8oFBbBYNowFILq9RU2QyTQO9s1NUyg10OomN9QImg42xE2eY/vRD\nKDtLbL58jlK+imt8Ao08S30nimzQYR8YwDsxgTUUwnpzhc3zr1LeXEVVFFZ+8iJas43Zr36J5Pw8\n5p4eLP6f75Sut1rBui+m2K7Xkd5jAlGUJMRfwSPsw8S90z32S6BabXHx4g7RaIGtrQKNRoe5uQA6\nnYZw2MahQ+4DR0GtVoPTrsNlVNE6RVRVRGwWaCe2aUiP0gpOcSgSopXeQ5X0dEsZ9q6c3x//WlvD\nfmgMj9fGYrNFt6Vi8PphJ8PijWiSi90AACAASURBVE2s2iAby0m+9GcP07H4WFxI8/r3buL02tiK\nZjh1dAa9dBWlrkdoFBk4dQzR5MBRjxG7fJWW1ooiL3Pic6exBnowCnWa5So9vVZqDYG6Lczhr3yZ\n3NoaK/M7mK1Zcgu3MHu97F15nWKrhWQwUC036HnoU9y+dQdNapvk4gqVUgej0GT5ldeZODpMYGyY\nWLKNxmRBVQCljVYrsrVVRK/XHIjZpNO1/dqrSYssa97henyvQBAEhoacRCI2Wi0Fo1Emv9EkIwho\ntFocg4MYPR66ioKttxfP+Di376QJeTRYe0IsLaZIJaG3x0LNr8HvdtB/PEBxK8oL/+n/wGizMDLm\nRWfUIVqcLNyKIkkSGl0Cz8QklmAYwROhVBfI1bQ8/O/+FVtXbzF0+iTLL11AauQpJxLojR62NzIc\nPW5gbLqH8y+tUqs2MVt1DM/5WFuK49HbmByx8dLLUbKhHnQ6DaOjLlwhP+1SgY5Gi2loHGljlx6P\nlo0fP4vcbaA1mShsbpItqeinHqBU6RLdSKMoKqFeB0OjvbgODeOSg5RisYOVqdrtvmta6v2gqiq5\n1dV9cTxZ3j+vbjcmnw+jy/VLNcHebSwvL6PX6z/ScuKvC2fPnuUb3/jG3Q7jA8Pe308xFju47mw2\nPb7hALVABK29gtW671nz6rU9DCMnmDvSwWzSspZUef6vFnjwwT56rXWkzCYGTYuuZOCBqVFyXZHd\nopbla5v4+nzozSYCo8fw5pMUmlqsLivZvQxqu0m10KZuk+kiIhn1DA3YiIyHmTkcIHnlIopGpWBt\nsLaSpf+RR7h5aZN2W8FpERBMCv0BGclgwGi3cO1HP8BEFb1WRzW+QiWRZOJLv4s4OYjebscwOMHK\nTgew4BwZInHtMm27jc1XXkNRuiBUaOZztM0y9UzmF5KRTqNB8vZtChsbIIqY/X4QRXiL5AkCzqEh\n9Dbbr/mb/Pn4RJKRaLTAxsa+BG44bKNSaVEsNvnsZ4cJBt99wquJBMETxxCuQC2TQWswYBs8RKUp\n0m21WLi6iKl/BIO2S+z55zCZtLjHp6mm02Tv3MI/cwZBq0OQDXR0VhxDQ4weDuBya/nd//G3cfSF\nSK5Eia4WSe3kkIp7hO0GSjUHZ/7lb+DQtShVFWodLZ1SjlpNIfyFz9ASZLrtNuvPv4iEwvZmhpP/\n7g/40fNxFt64RDcbR2fS88SnB7E5srTbCo1cDq3JhK23l2oyic5mw390gK1YBoe9jxsvLKJWq1gs\nduqVKsYBJ4Wt6L6MuM9EIlnGGA6gaPfNqoxGCQEVj1OmUqqDqKFa3XfEHB11v6dR0r0CSdIgSfvx\nmwMBbOEwxe1tRI0Gx8AAJq8X2WKh3WhgaqTYe+UFdupVVtZLhMcGaOkC2L1GtJoG7oid5/7iP1NK\n5TFaTNSKFZJ3luh/8AGSGzEknRatXod5YAhFcPLsX7/IxhuraPU6HvytBzn1mccpbaww8cgJREnL\n/NUNdrbzGO1Z1s9tY3eN8/XfP0k6VWFwyEmt0mR3K0vMVGE8bMb7xQkyVQ29ERfhsJWePievvVZH\np1GwN9qYHXYyKyvU9nYwRkI4+vupl2sUK3uMzrZwhAOMvTm2WynW0ekkvCE3hRsXEUQRrclEp9HA\n4HZ/4IxGeXeX2IULKK23G4Xr+TyOgYF7iogAvPjii5w5c+Zuh/Gh4OjRo8RiMRKJBP5f8CL7OMAe\nidCp18ksL9NttzH5fARmZ2lLJoxmPfl8g+FhJ4VCg5s3k2zudlDVNrduJfF4TBg0Le48+xK06kxO\nejEYGqg7CzgOneJOWcQ72MsrL66Ry1awuq2c+dQIXqudntlpTDroarS0OzD44H3U2iLesI9aMsG/\n/MZpiou30PXsa42Uouu0CgqF1QUeeHiK15+5THp+G5ImZIOB0//2SQaCEtlOBtotSvkKllAYo9WM\nzW3H5LTTaCqsLGVYWc3RViUme0WKlQ6dtopss6MgUa60KZZaqPkWEe0vlkRILyyQuHHjQHWy227j\nGRtDabVQmk3skQj2gV9s5/DrxieSjCST1Xds74/xCqjqez8AO80mSrP5Dr3+SrVFpdpGqBWJr2yh\nNxuZPjWK1ubE5DSAKOIcHqaRz2O3SZz+8uNcuxilWigyevQQM/eFEB1+nD470Vcv0ZEMtCplPFaV\nO6/epNtqYXfbsAhHGfYraAZn6SoCHkOH1/5hkcUb6wwdHqJvtJe+qSHmn7+I5PZzdb7A5XOryGYT\nVpuJnfUkl6+aeeToKKZuEYPPy9qzzyEbDXjGx8lvblKObePz96KL+NkNutnM5rGYNHQ1WmSzEXeP\nG1EQ8NshNHyI0EOPYB8ewmzWsr2eZPP6IlK3S9BupNKCiXEPw4dc9PbeXSb9YUJrMNB7+jSlWIxW\nrUZ2Y5P47UVyq2to9DpkiwWvU0smpUGnVVm/eocH/kWERFlhd2eHgMGHZLJicnWpFMu0PAb0dis2\nr52+AQ96i4HgsRMI3j7+y7eXiVeNyIFe2vUm3/3LZ6h+6SSPnnKyvKNw88Id1q/MM31sgJlBJ7VU\nFoPPzJ2tDLJOIpuuoCDRP+zGamtRj8fo85g59qn7cLpMBPq8yLLEkSMB0sur3HnxGna/m3AkgKae\nR2k06Ha7iKIIGh3R7TKCzkjbFiLk76G318aRk/04ekPo1RnSi4s0i0Uc/f34Z2ffV8PlZ1GMxd5B\nRADq2Sz1bBbtB1B1/DjhmWee4atf/erdDuNDgSRJnDlzhhdeeIGvfOUrdzucXwiNVotvehrn8DBK\nu43OYtkfWQUmJt4W3UskKrz2WoxOp0ul0qLb3fdOoVqkmM4jCPuZXY1GwCPIFKNpvCEnF14tUdeY\nEKw6Ck2RrWQHi6eDZPGjHTXw8OwJGm0Vo8NOK5dCok1blbAa9WTW1slFt8gnsgxNDeB1OmmVShx/\nxEHsikRRsWGz6fAGHChLF9AGTlDbWAJRxD00SHl3j26rDs0KtVSdqmhj87m/xTc7x/pOk7RlAMHi\nwq7t0Cj3sn5rA73ZhMbqIFfVUOqa+XkF006zSW5j4235a/YFzcp7eww/9RTyx8g1+xNJRt7LMVCn\nk/Znz9/r+EiEwuYmtXT6YJ/JF6CityCUywA0KjXy6SKSrKFVqSAIArLRiGwy0TM1Smsthf64B7Xr\nwihDQ9VTyrbp7+silRM0VQPd7C4Wr4tw2E49n8dgBKPdTLxYR4gVaTXaXHzlZewGGwaDjNqss/7y\nKxz/+pfRiR08/V6u7JVpVmpodHqMwR76dEZq9Q4Wvw+j3s9uMkVDa0fSqOhsNgJzc+TX1mjtRXH1\nuPmNf/MEN5/RUe3ImKQ2ZrGOd3ICrdGIc2gIayhE8NgxSqUGqWSFgbAJuRlkfX4TvVzlwRMRjo4Z\ncPb+6rbTH1fIJhOmvkH2XrvG68/f3k+zOnSYtQoCXXomxzBrWthtftYX47R319Gbe/GGDdhdZoxW\nI2qzRj2Xo1jrEugN4hoaRNaKWAIBAkePEa8bSKWqlCttWrkaSrVMu91hfTnJjDvD7NFZwoEZKo9P\noJO6tOKbGANBdtNZ/F4zCwtJJJOZSFhGbub4j//rj9Cb9PzW75/Fm4wiSQ46FT1ahwO3rk45t4Gp\nsIHYSaJxjEO3Sz2bxeh2IxjMyJ4AN1YarK8X6O21YTBoCR/yotHpEDpNcmtr1FIpuopCIRrdd/R1\nuz9QZuN9m1zvsaxIo9Hg3Llz/O3f/u3dDuVDw9mzZ/nJT35yT5CRt6A1GN5TcfktTEx4OXUqzLVr\ne0iSyPS0l/5+O816jq6iUig2cDprVMotshWV0EMidARKlQ7lhkippCLLUCg0iUbz3Hc8yF9/9zpq\nvcrRI37aV26RjGXxDUaQtVq03SaqIFEvVfGHXKidFrXdKLNfuQ+XUeHxY3oM4TN0RC3FWIx6dJ5a\nrsDwE49TXFtBK6mYRyIYXS5cQ0OUkhl23ojSrtWpb60yODzN8vUVTp4+iZy4Q7EGh8MRPKMjdG1+\nzM4Qd1ZL9A37379cLgjvvFcFAVGjeUcfzscFn0gy0t9vJxotkMnse9BoNAKHDjlxOt/7Qrb39RG6\n775907VWC5PPh//wYSxVDZvdJs6Qh1IyC50Wg6dPklm4s8/ORRFrby+OoSHathA17QbdTpeaqmev\nrHLimIvK0hu0k9s0ym36wkGWr9/G5HBQi+WJPHqaTK7JKz+6gb6/xROPBKjkCuidelyT04iyQKNY\nZGdxHVdfkMruBv2T09xesCIKCuV6F9nTy+ioA8tggHP/dI3myh2UWo3Jw0G0NgfFtRWSt28Teegh\ntl56CcloZPL+OZRWa38UV6+nU69Tz2ax9PTgHhlhb6/Ma69tk9hKkl1ZwR/xc/YLRxDLaeRWhsLK\nIs7ee1dr4edha6vI8pVFqpUWZovM6kKCVqOBWMszZYtg0ruxtbYZ9ncJzvRi8IfIXTmPWDMwcuow\nKxduojUawerGNzdHt93aH78TBHYuXqDnkccZH3dTyeYp5BQUVUFvszI224fBXkGRzaxvRrn16jzN\ncgVXj4uBIxFa1SJmScMjT05RrSk0ikUqe2V0Fgtmv5e6aKSRjLF64zVskQgGhwONXo+oEajvRinX\narRzKfxzcziHh7H29GDsP0Ss6UG6mqbdVlhaTGOUVfSaNifmpqnGotSz2XeM+OXW1vYF7z5AA6s1\nHCaztPQOI0STx/ORqjp+GHjllVeYnp7G+R5ifvcqzp49y5//+Z+jquo9VzJ7P1gsOj7/+RGGhvad\nZGOxEvPzSfqmPMg2G06NsG/mJmmwetw4vDZa2TY6nUQuV0dVVcJhK90uOBxGnB4TX/z6/RR299i7\neYdCro5zeJh8Ko8z4EJDi7FH7kMvNslvbSO06pg8Xqz9A+j0GhqCgef+80sUc2Ua9Q6nnphjLhDE\n02oitht0m3UEQcASDLL89LOkqjKrsQb5bA3zep4nZo5jtplJ7uU4OjfNXtNOraGwWdGgMbroJBWc\nzu67FFV/GpIs4xwcZK9QQO9wgKqitFo4BgZ+LrG7G/hEkhGHw8Cjj/azs1OiWm3j85no6bG8700n\niCKesTEcAwN02220JhOCIBB2gstlYLDXTG55EaFexhoO0f/Qg9DtIhmNWPx+JL2eUJ8RNBLRaB5N\nR2Vy1oZL12AjHscZ8iPt7tLjl+gLHSZT7HL/k3O0RAPf/r+exj04SFXRsb1TxeG20W63aHX2exlc\nQ4NYPG52t7fRdNscGbeS60xx6404haqKzajSP+zj2//xIrsrUc6eGSd66TKlQo1GqUo5HufQU0/t\nNyuurCCbTOgsFjyjo3gnJ7H19lLP5UAQMDiddFWBG+fXyOcbgIjS7hBbiGLVd5kOtmkWi5gDgY/w\n2/xw8EEeuqqqsr1dRGs2I2lF6tUmGysJjGYdvb0+cukSS4kSJwY12ANeTHqR5vYSzkgv1XSSiSfP\n4p6apZIvERrwIhYSFJbn0TscBzberfg2D53wsLUQpdPwo69ZGBhyc/rBfmQZsoqV7axA1ztMU1si\no7Oxdb3GZz8zxuLryySLO8Qy7As1jfoIjA8jyyKmZob1F1/D4TRh9vuJXbyI0enEPjCAf3qa+PXr\nVLM5Srkytok5zDNHcQZczL8UJRSyYbXoSGwlaZbLHB4xo0muktjaQmm331GWUd4saX4QWHt66D19\nmvSdO7RrNcw+H96pqXtOBv7pp5/miSeeuNthfKgYGhpCo9GwtLTE2M94ldzLkCQRSRJZWMjQ6XQ5\nfboPp9OA78ufIb+ySLPeRN/TT7quY2GlyLFjQR5+uJ/d3fKbn6BiNmsJBi37xnqCREvvQt93CIen\nTqMlYPa6ydZUULUYtHYGHn2UbjZBu1bGHDnE9oULmPoGWc8bKWTKIHRxBN2sxuocznaJ/f0/Yg/6\nQenQLJWQDAYqDYhtJNHJJgwmPWgkNjYKhIaCBKQMrfgOqiSzshAFwN7UYQuH6O+3/8K+PffYGKIk\nsf788+RWV9Hb7bRrNSS9Ht/U1K/3C/kl8IkkI7DfcW2z/XKiLZJOBz/zoDQaZYwjEXoO9R08mN/v\npRYKWQmF3tZOKO/toXa7+xMakQjteh1HLc7IsRmalh7+6UcreCamiOdhfSnJ0SOHUawe1i/fplCo\n4zSD+cQQg2dO4Ql56XTaOL06/pv/doZLl3apFGu43EZevxTj1kIeTUvgyu0ij/7GkwSdYO1xoNaG\nsQaDpObnD1azSrNJPZcjvbh40Kh5EHOxQbG4/7LRmk0YHA6qqTSpRAW1z4akb+L8qWYnVVVp5PN0\nFQWD0/kOieKPAxKJCouLaXK5OoGAhdFR9/tmyAA6HQVL3wCO3Rjrd2KggqKo9B2fI9O2oOgFHEfG\ncZrUg1FVUZbRTZzkR//v62g0AjavC1OhRfL1BUZHA6jq2xMo9UwGl6ry+18bIVkSkHUy/QN26oUy\nhVoXnSSRb0gUK21yJdhd2gFJRzhkpVRSOHrKS0OoYJANCJ081IqEentoJbYx0Mbs9++XR7pdyvE4\nBpcLnd3O+Be/SKnawTQwxrXrKTo7iwwfHmBoyMnt2ym03QbmZpKBiIN+R4NidBdJp6NSKmH8qYZV\n2Wzed/T8gHAODGDv7UVptz92K7EPAlVV+dGPfsT3vve9ux3KhwpBEHjsscd49tlnP1Fk5ObNJPPz\nqYPtnZ0y4bCNuuimHTqMoKg883KUQiGL0aglHq9y+nSI3/zNMfb29gmJTqchm60xPe3DaNRSqbQQ\ng0G2N3P0D9u4s1JieSWHonR5+MEIWk0Rh81EI51gd3GVpR+f4+SfzFFpdQjcf5pqvoTR6cBos7A2\nH8XrcyGiUk6lKMZiBI4cQbLVQc2j1kqMzkwxev8cDZ2dgUNO2kur1CstRnpDdLsRYptZLFYdk5Me\nxsd/cYZS0ulQVRWNLOMZH0ej1aIqCqn5eazhMIY3Vc7vNj6xZOTDhiAISG+aDNVy+7bWBofjHcRE\nVVWqqdSBip3e5cLo8ZDbilEsNqmXquhlGdXoYGevCBYXVSVDqVKj02oTjZXo8Y7wxP8wTWY3g9tj\nQtXqSWQUlCZ4IxE0kobNrQovvbhJKZGixyMhOzzIRj1dtU2nI2B02HD1mTEFXdRlB6lqG9PEMYSl\n67QrlQOxqfdqRDQYJIxGaf8GFEXs/f1ojUbcbhmr344tNHNgKd2qVtm7epVSLIaqqpi8XoLHj7/D\nB+FuIperc+5c9IBcZbN10ukqZ88OYDS+uwtdabcZC8JOtMn0k49g6d1A514jONZPTdWS3k5idTlw\n9gZpbi2hNRrpyGZ0Pj+rywlK6SI6g4zFbkEyGnFNzRJvdQiEHJiEGmqzhi0SYefiRZTmFmFfAIxe\nYq++SiOTwuK0IGjMzI25uKao3LwRp1ioEegzYLbquHGxwOgcDA87GRpyEF+PceYpLU6LgNvgRq33\nIogirWabutZGo9UkEB7FojVQz+co1iViywXS6Qpebx97e2X6+qw8/vgg0UWZZl8Xu75DN7uz3yho\ntR4IJnXbbWSzGf/c3MEIYDWVIru2RqtUwhIM4hgYQH4PVU9Rku4pD5qfxo0bNwCYmZm5y5F8+Pj8\n5z/PN7/5Tf74j//4bofyoaCQLbOysEen1T0w3ux2VVZXczz4YC+lUoPXX9/D5zMTiTiw23WsrGS5\nfj3B4KCTxcU0iUQFvV7ic58bIRi0EA7b8Pst7O2VCAYtOJ16LlzYpbfXxli/AalVQDZKdCyD5Itg\n6rVy4utejEYtrXaXvWgSWafH0O0ScAkMhx1oLaMUt7bwTk5SicdJ3brFyG9+FdW9jM1jw2qSiN54\ng0Khjqczg7vHQzWVopPeYbLHxlh/CP/hKXyRD26lUEun0fzMPdiu1WhXKv8/GbkX0axUiF+9Sjke\nRxBFTF4vPUePHqiPJm/fZvf111EVBUEUsfT04JqYZiNaZHNzhU61QujIYVR3H9RKuLx1DLE6R4+7\nKJcb9Pba0ekk/u7pHdJ7BcamZPq9bdqmEq/8h79k+P6jPPYHX6JUatIVNCiymeXFXWaPm/if/ueH\nadUbDAR1VDNZqsUqNzZ2aVXKaDwhNlYUJoeP4mok0dtsiFotzqGhd/2PsiwxNeXjwoUY9XoHSaej\nZ2yQ06d76e1950WbWVwku7x8sF3c2kLQaBh49NGPRR16b698QETeQipVJZWqEom8TUbq9TapeIG9\n1y9R3o7S7XTYLXcZevwxCqYIO9E0u9EUatfIkROThMYHqPV4ufp6lM2NHGwVaLcFhmYGUEUNa5tl\n4ud3yefqzERg67UL0KoxNh1CkmWsvb3UsnlWUxKd5WVu/fAZzH4f4X4vXl8NuZgnMjjOaxcsGLsi\n42NuhK7C7P3DuL0WTpwI0dNjIW6vsXluEU2+RVt00tT7MPn95FbW2EmlcUf6eOGZBQw0GOlRcHgc\n1JoG7H19yGYzAJlMnakpP0bFxubONTql+tvnJZ9n4FOfQqPVHpCTt4hmNZ1m44UXaL3Z4F3c3qaW\nTtP34IP3LPF4L3z3u9/ld37ndz4W1/OHjbNnz/K1r32N3d3de9pvByC/uUliLUZmaZNyqYk1GMTk\n8yEIAqqqYrXqmZz0s71d5saNOE6nHqtVx9xcD+vrWXZ2ihw+7OPUqTCCIHDyZBBZ3r+OQyErsixS\nLDZ57rkN/v7vF/jik37euPYGYY+GaztljA47hx46wXrOwNTYMEpiCWMrw961Nzj91CxOcYf0pdu4\nM2YkpY5rdBaN0mTo05+m2+2iExQcU0ew6LvcfvoFWg0Vf9CFpl2lHG9hHxigvLODIAj0DIdx9/1y\npXKDywVra+/YJxkM+/1tHxN8cp4aHwFS8/OUc2VKWg/1RgdrQUFeXiF49AiZ5WUWvvtdKokEstmM\nLRymvLtLXbLR6TuCU7UiSyKi0ci1awkuXd6h0VTx+OxIWpFg0MPIiJtvfesiO7EiIl3azSgr3Sp/\n9N/PYvK4yWUqrF64yeDjn8bvN9NodFDcHq5ejiFptXz1Xx/l1WdvsnRlmUS6gdlm5uTJENpansDs\nNOlamYHZEGqzjntkBPv7CDgNDjoxmbTE4xVEUaCnx4LH884Vr9LpUHgPc7tqMkmzWET/MWDbnc67\nxbnUN8sub6HR6HDhQgw1t8fCs5dRVRWPx8jgoANd8g73H3uAV7oCWqOJYNCKImpZXMrRaHS4eLNM\nqdTFqFYo5soMDPuplutotFrmbybxeWTSi1HyW0lsDhP5koJlawvXyAj4BkgsrKJJbqO3O9DoDSRT\nNTweE1a5yfAxJ43WYVBVctkqiWyHrgputxGfz4xW6NDcXsHpkFFdQ5y/lCB65w2MbheOgIdjTz1O\nYidL5vYdAMaPTrD00kXCDzyA6vbRbCoIAgQC+0Ta9KZKanZl5YBM2/v63tejori1dUBEDvZtb1P9\nACJM9wpUVeV73/veJ65E8xZkWeazn/0s3//+9/nDP/zDux3Or4x6LsfOpUuIGg3hsJ2blzfJb24i\nGQwY7DYGB51Ikkip1ODSpRhOp5GLF3e5des64bCVz31uBFWFZ55Z4/OfH2Fw0IXV+s5r3mbTs7tb\nZmkpw2NnIwTbC2ysz7OXd5LPN9HQpbq7jTU0wxvXNuknia26w9f+4FPo1CY7V68R6A2SzLSx69p0\nozuYBw8x8tn7cPWH0Gg0DGoNLD33Ij6PHpPJisOuPxCbdL7Z+yUZDL/SOK49EqG4tUUlmQRVRdRq\n8YyNvafD+t3C3SQj3wD+1Zu//wXwd3cxll+Idr1Oudzk8kKN6OomXaWLwaTjxJlRzP4dMsvLlPf2\nUJpNOvU6SrOJZ3ycXHSXtttJS2NidTOP3avn2rVN+oa9XL8W59KVFfoidr785UkymSpmsw63x4Qs\ngaa9v52KF3H2BlFlE4VMCZdZ5bEH/az2WVlZy+O09fPEYxH24lVW5mN0VZFms0M5luG6LHLqqBu7\nVUtB68F9ZBCH3fC+Y5fttkIiUaFQaOByGXC5jOTzDTY28litMm73PikRRRHNe7yk7nZKXlVV0ukq\nlUoLvV6LJIl0Om+PsVksMi7X270L8XiZRKKCtZKjq+wfl07X8HiMSFKJbipFqdSiUGoR3d7BYtEh\nigLRaJ7V1RzdrorLKqDUahQrHWStjMuuI/fiEpP9PcQuR2nV6uiENsWsFXpt1HM5LLNT9M8JqFst\nlHaHer2N2lWp1toEwm7MdgOzswFef30HjVbC5TEwPe3j+PEgVquOaiq134RmMnPuappLr6yBqmIV\nWzQcVua3FMRsEUGzX4prKSIDh3xUknuYh8LUalV8PjOgkkxW8PnMBE+cwNbbS6NQQGe1YgkE3tcs\nq12vv2tft9N5h0PovY5r164hCAKzs7N3O5RfG774xS/yzW9+854mI7Vcbp8YCwKjvUFEcYDtzRwm\nncrMXICRkf2ep5WVHH19dpaXsywtZeh2VUqlJplMjW5XZXzczd5eBY1GJB4vMznpPSDrOp1Eo9Gm\nUmny4GEXN//TdZRGg1y2QqfWoFWUyO2maevKpBNFBvotlOJxZIeTej5OPb5DTmegI5moNmScegmd\nc5DFjJFPzdgPSIe3x4EaeWeZW9RokHS6d/Ru/bLQ22z0P/II5Xicdq2G0e3eV2L9GOFukpHngL9+\nM4ZLfMzJiCCKpEoiG0tvW6HXq03uLKSJDLpAVTH7fBRjMVBVWpUKrWoV9/Q0erOR+I5Mva0h4rKS\nyW6iN+Toi9hAI5FIVFheznLyZBC/30QkYqNRa6FVjKxfvIao+pFtDmSDHo9VoBLbwriXYMpk5tGv\nHcbVF0LTbfHDf0xAV6GrtNFqoFwqEVtu0Jl108qXsHj8WCz69yUiitLl6tU9Fhf3O9G9XhO5XJ12\nW0EQBIxGLXNzfsbHvQiiiHtkhFo6ffACEkQR1/DwQQngo4aqqty4keD27RSNRgenU084bCWbrdFu\nd7FYZGZnA9jtb5ORcrlFXzvLfwAAIABJREFUs6mgt9kOUrpqV6XZVNDIMoWqyrVrcbrd/WxKtdom\nkSgDb6ftyw0Rq92N2QDBkJVaXSEUstLpikg6mVa9QbvZwqDdJzsaWaab2iZ14Tw9fS5MShGDxUyu\n2EYWFWw+F+EhD32jBk6cCO7Hp5dwuQz7QmWA1mRCMhjIV2B9JU6jVEJptzF5PdyZ38NikRh0WUlt\nZ9BoRKxmCcmhIxjwoxvzs76eo1Rq8sor2xgMEidOBDl0yI29rw/6+n7hubYGg2SXl9+hVyBbLB+L\njNiHhb/5m7/h61//+ieyRPMWPgmlGlGj2deuUVXaqR1GPTaGe1x4xyMERt/uq1BVdb+vr9oiHLZS\nr3fQakW0WpFqtY0kieh0Evl8g3q9Qy5X57HHBnE49p8XIyNutrdLNLIZfL1e9kp57G4j25s18ukS\nPTM60lUVk8eFXk4yeMhH26ijllPQasBqkckV6qxv1Ki3YO9qjJaUJxy2Mj6+P0Rg7+sjt7ZGu/q2\ncKc1FHrXOPyvMpItm8131QjvF+FukpGtN38qQOcuxvGBIOl0VLp6BFFA7ap0lC71egdTV0elo6PQ\ntNIdfxhbYJfO5jy1bAZLTw/BqRF+8Owu3/neMuVskXJdIRC006pW0Oj0+Dx67CaRiWELtUIJSdzv\ndahU2oQCeo6cmcJmEshrZQJeLY6Am3ouR7dZh2ad0p3r2Kw69m7fRii20MgytWgUo9ZASQNWuxGr\n18HmZpKZo5H3HAPrtFqo3S6FQoudnRKdThetVqRWa/Pyy5scOuTG6zVRq7V5440kgYAFh8OAc3AQ\nUaMhu7pKt9PB3j9ATe/m6adX6XQUBgedDA050ek+mssslaoyP5+k2dwvz+RyDZpNhVOnQlitesxm\n+V2x2O37neYNnYOe8UHiSxsIqJjMOpyHDpGpWg+IiMUi02h0iEYLzM31sLq6X65pNDoUVS1DhwcZ\nGrRx5bUNjhzv5fq1OFOHJ0neuIZW28GgE9DodBjdbvauX0ZqVYguNwlMTNKtlgmNmLF6bDRbKtvn\nzuGdmMA7OEgyWWFhIU02WycQMDPQa4R8HL3NRjudQKdRUBoNLB4XWpOFAY+ZwUE3YqfBwBEtfWEr\nDmOFrujBPzXO4l6VaLR4cA7q9Q63biUJhazv2dj7XrCGw3inp8mtrqK0WsgWC8Fjx+4p9+afh1qt\nxne+8x1u3rx5t0P5tUKWZb7whS/w7W9/mz/7sz+72+H8SjB5vfvmlskkwL78QI+JmmDk+efXqVbb\nRCJ2BgYcLC9n0eslFEVlYsJDJGLHbJZxOg0YDBImk3yg4F0sNkkmq7RaCtvbRRwOPVNTXnYvraK1\nhlDkGBYDeP12FK0e28g4e/Euc6cOoYnVsbodZGIbDByZoOwxsbVTZenKOtZgCM/wIOevb3Ds0cNE\nV+KYlAIGsY3J76f/4YfJrKzQKpexhkK4hocRJYlyIkF0Pc3yUpa2qOfQVJiRUQ9m8we7Zz/u+Dj0\njPxb4Ad3O4gPgvChMCtDacqJJJVcHY3Hj28gyLkLCeZ/cglfwIbdbeHIsSc47AH/3ByZisjubgmn\ny4zVaqBQaDE+7iafl9HLGjLxIj6vzO3zN8gncvzm73+Kzd0ma9EyR46GODrrRapmGZ0dQCd1qezu\nHGhWADTyeXJraxS3txkI97O7a6Y7NEQtk2XyvjCnHpvG79LitQoY63Hg7VVvp9Uiv75OdmWFzNIS\nTcmC3hQk6O+nVBdIJCp0u1CrvZ16r1ZbVCotHI79Uo9jYADHm6O+q6tZzr+8fVAWSSar1Osdjh79\n4F3f/xyUSs0DIvJ2vG1yuQb9/e9dG31r3Hd1NYtz5AhTh4ax6rsMjPdiCfawcWGX2Vk/29sFMpk6\niqLi8ZiJx8v099tpt7vUai2GhpyMjLgZGnJh0GuZPz9POGzDZjegO9VPaXMFa08Q75Fxds+/QuL6\ndVweH3a9jUIygzvgQGs280//53fodjpMHokwnE7TMbk590qMQmG/ETcey7JwPsuxYRGhVSMwNcYD\nBj9do5NsoYPRJKO16FhcSGCyGBDbCgZNHosxg06vBUGgUGi86zzUah2q1fYHJiMarZbQ8eO4hobo\nNJvo7fZ7cnT3/fD973+f++67j3A4fLdD+bXj937v9/jGN77Bn/7pn96TWSDZZKLv9Gkyy8tU4nEM\nbjdd7xCvvr6fIYX9Z9GxYwEeemhfd6S/P0c2W+fKlV30eolDh1yMj3sOFh5vYd/vJkGx2MTp1GMw\nSMw8NM2d584x9dRZ1HaTIZ8T++Ag+Y6ZU9Y0ne072IYP4RsMIV6+juT04PGHkPy7YPdhGxhmO6/F\naW8xEdGSunKOhatF5G6d4PHjBI4cof9nfJAKW1uszW/y46eXqZbqCBqR3a00heIEZ85EDso89zI+\nCjLiA77zM/viwL8ATgCfBj7/Xn/4R3/0R9jfTPuOjo5y8uTJA9fM6JvNkx/ltlZuMXJkmOVlJ7mt\nKGarDkWB1c0KjmEf3VaZarHKylYd11AYsVSiUjFisegIBjvUyjVSqwVul/M88VuD+NwypoYGRTLw\nxo08bqPKS//7X3LkNz6FtldHb0+T4VE/4CcajZJZXYU3iUim2UTUaPCaTLQbDTKNBpr4Gg+eGGA3\nYSJT1BEaDtIjJGlFc6SqVZpShLcerdFolPzmJnI6zdpzz1EURVSjneTGbUbOnkFx+jAY2ggCmEwy\nzWYGALvdj04nvev8rK9vcPnyDp3Ofk/JW8evrekYG3OTTu99oPP9z4HB8O4eEUEAq/X9Rba0Wg0n\nToSIROzUam3M5n68XtPBze3xmIhE7ExNednc3Ff1zeVqWCw6kskqs7N+gkELer1EOGxDFAUiA24K\nyR52r88TX45jsJnwzz1AqijgyFRoVSoAlLej6JxO0LqJ35ingUwpld0/HysJ3F4rymr8gIjA/qov\nsb7F2OAEulICnatGq1hkatpPOtciNBDg+o04DqmO1WEnvbjBne0qoafGEItRtl95hdDQMWKxd54H\no1H6lVZYH6cGuA8Tf/VXf8Wf/Mmf3O0wPhI88MADdDodLl++zIkTJ+52OL8SDE4n4fvuO9g+dy56\nQETewu3baZ56apihIQd37qT5wQ+WmZkJ4HAYkGWBq1fjPPJI5OB4k0lLu60cTOQJgsCVK3tYzBLe\nwTHWby+AqlLT2NAEurQLuzRjq+xtpdld2uC+3zqLwWJg/eYqhWwJvaTSe3gGS7gXOV7CNCiz+L3v\nUskVUe1tmrub5Dc29pW9g8GDcrqqqhSiUTY3ClTfnHZTlS6VeJytTT/ZKS9e790pjX+Y+CjISBJ4\n+D32B4H/AHwOeE89229961vv+6E/a+X9UW1HIi38fhN37hgJBi1cu7ZHsdikKjmJ9EXwuvToLQb8\n4SH8fvP/x96bB8dxnnf+n5np6bnvA/c5IG6eIkXSlERZknXYa2WdxHGta53dcmJXnK2K7ewfm+Nn\nx5uy1055165N9pdNbbxR8nMSZ+P4ikRTVnR4TUqkSPEED5AEiPuYATD3PT3dvz8GHGEIEAQIgLjm\nU8UqooF+++1++3je5/0+z8PwcBibTUdtbQO3eifRO9UY7Hqa6ypx5ca48fqPyVprmTl7i1Q8BQpE\nhkeI6qtRtcglx3cbjdwOBJBSKapqmwhndQQULZVmN9WVcbKhGZTAIDU6LRXmFBZVslhvp8JioWlO\nroS62lrk/n5G+/rIZzKYAUGlRnYamLp1m5oPtmC1mti3L4goatBqjWg0KnbscOLxGFGpSq9PQ0MD\nFy+mSSQKD4tOV1jjlGUFSZKXfb0fhMpKE83NDm7dmkFRCoZIba2V6urFlw4ymcJLy2bT43YbUavf\nnx3u2OEkk8kXl0oEQUN9vRWDQYvBoEUUNezeXYl9jvIdQNKaSXo7sFbuII+Gm5M59NkgGY+dZM0+\nFMWFTY4Q67sO+hSOpgZ6Tlwu7p+Kp5ByeaRcaQ2JfDaLnJeR5cLLMReaotklEVNy+Bqc5EQtxmwQ\n0VRT0C3FYiiyQiyexaTVkksmcUhhamsdjI3FUBQwGrXs3l2JwbC0AnhbnVOnTjE+Ps5HP/rR9e7K\nQ0GlUvHv//2/56WXXtqUxojfH8fvLwhPq6osOJ2GeR5SKETRZbMylZVmtFoNLS2lhnR1tQWdTsBi\nETEatezc6eX69eni7yVJpqLCRG/vNCmPDcF3EEElE9RqMU8l2FGtIZcTcZgLHhaHTYvQXI1WyREO\nGggNDqGduIpYaeXyv5xi975awjMx6psqEJPjZAWB8MAA0fFxksEgplmdiJzPI6VSZHOl5yRLErl0\nriQ6cDOznss0XwK8wA9nf34BmO8/3mAYjSL19Xb6+kJMTsaLYkhZVhB1WgS9DpNJi8VSmGVWVVnw\n+ZyMjkYxGER0HiN791UhyGnUajVGtxtR1KLVashrNajUKux1tcSmZezm9z9umYxEEhMVBw4T9U/z\n9rsTTEwWdCl9/iB1dhuNtjyZSBhBq6X26FHSkQj5bBZBr8fT2VlMVgbArJhLlt6fPUjJBF6HDlOL\nndodTkSbnSNH6vD7C9EpXq+J2tqF0+oLgoamJgczM6VRFpWV5kU9E6uJIGg4fLiW+nob09PJWSPQ\nisl07xn/0FCYs2fHiEQyaLUamprsHDhQg15feDREUWDfvipisQzJZK7k/AyGQk4Wl2t+qJ3P52Rs\nLIY/kEZRJFwuAyaNk+M/Okc2m0fJ57EaRA4feQrRYCCtMhL7yYmCLlYBh8eKrcpLdZOHmyNjxZer\naDbjrHBgErLIskw6HMZaW4tNq0WRUsSMDky19WgsFpRUHEVRELQarFYROVRYbtPp1DzxRAN+f4Jc\nTsblMswL3d7OfPOb3+R3f/d3EbZQvpT78eu//uvs3r2bb3/72xg20XJbX1+QU6cKOZGg4AU9erSB\nxkYbQ0PhucVqcToNOJ364v9nNa9FqqrM7N5dgclUMEa0Wg1TU8liqvhoNENDg514PIfNpiMazaBS\nqTh4sAK3OkwyEkGobKAiFyMdDqNCpv7IEQx2O46JCWqbvKg0GpLxKZ7/+EH0ei0Exxm82ItaraK+\nppHs2MC8aESNIKB3OKivE7h5ZRxp1igRTWY81fZFM0pvJtbzafutdTz2spmZSZJM5jCZRDweE93d\nXi5enKSy0kRHh3tWR6EvzjLvfAC1Wg0+n4NUKksy6QUpSz6V4FZfmL1ddtpefJHw4CCJWJLxkQju\nHS1gdbG/SUdVfcEyHh2NFj+YFosWl8tDQp/H1fr+R9afEenY14xXncLk8RRTvOdSKdRa7bzsexqt\nFnNFBU6fj1B/fzFduWg0UNvRTHNnXTG1+0If24Vob3eRTGYZHo4iywoVFSb27at8qOvQOp1Ac7Oj\nUDr8PiQSWc6eHSMYLNjA+bxEb+80Ho+J9vZS9brFouOJJxo4c2aMYDCFRqPG53Pg8y18HIfDwDPP\nNDM5GSebzWM2i7xxrIdULImSl1FrBeKSjri5gb2Hfbzz6kV2vfgcoxevotfCzsNtVB19inRORVOT\nnZs3Z0ilJNx1XnY+Xo0w2Utao0FrNGJvaMDV3sHli+OMjcewehxcuzaFy6HD7HXja7BgUeJkZRmN\nKGKprsZs1mE2b64aMQ+DmzdvcuLECb773e+ud1ceKnV1dezfv58f/ehHfPKTn1zv7iyJTKYgvL5j\niEDBYLh6dYonnqhjZsbLhQsTRCIZamos7N1bWUxkVlNjxedzMjAQIp9XEEUNnZ0eKistJZ7R9nY3\nwWCKiYk4slyYwP3bf7uTbDaPJCm4XAakbJZX/r8rTA5MIuq1tHZU0FZnwVJZicHhwLv/IOJMHEEU\n0EpxUn4/gXCejCwQy75LJJQoFNQUPXTu3o3D55uXxdrd3k42e4VDR1u5fmUCWa2l+ZFOPvCB+ocW\nILDWbI2zWENkWeHixUmuX58ilZKKs+GdOwsx6IlElgMHqkmlJHI5Gadz/iwzFEoxPZ3i7NlxwuE0\nuXSGmmoTe55ooG5XNd7ubqoffZT4TJhUOg+ZBM7aSmx1dSSTWU6fHil+MNNpNVeuTBEO5/B63zdG\n8mgRrE68DaWhlYuJCl2trcWpwdT164gmE1V791Lz6KMPVGPGaBR57LEGQqFUwU3pMJQ82BuNcDhN\nNJot2aYoBePvbmMECvqR557zEQ6nEQQNdvvitY9MJhGfr+AKnpyMI4tGHE3NxCcnkfMSoslESmXC\nU+Ph0JOthCa97HlqH0a9mpzJy5nrCYLBQaLRDCaTlvZ2F/m8guCwUd9agZxJF8JpbTbGxqJcvDxF\nNpvH6TTw5JONSJJCZ1sr+uAAibFhjG43nq4uLNUPR1C8GfnmN7/Jb/3Wb2FaIK39Vuezn/0sf/qn\nf7ppjJFkMlcirr9DKJRCUVSIoobqaguVlRZA4fr1KZxOAyaTiF4v8NhjdbS0OEgmJWw2HV6vad77\nymbT8/TTTcVcJA6HocTTmslI/PSnw6QEGyp9jGQywZVr0zTteQxzRQWTkzFOnRolGEwVE0gePtzO\n7TcHiMdz7Hj+eQwWC9ODwzir3bT/m+eo2t017/2rt9loOPQo3rYQ+57ciUpnxOmxIAgbqxbYSigb\nI/dhYiLG5ct+stmC5yCRyHHhwgRer5HKSsuSXGSiVs2t3gBKPo9Wq0aWRQJBidGJJF27QGexoLNY\ncPkgG4+j1mqLlU2Dk9GSlObZbB6328jgYBiv9/0XZiEsbXlr/oJOR8WuXThbW/HF42gEAd1svo2V\ncCcuf6NT0MKUCl6BRYWcgqApJn5bDEVRyESjqLVaRKMRi0XEbBaRqqswejwo+TwanUhdkxuVSkVl\nSyPu+myhIq6o5/jxQuXkeDzL9evTZLN5otEsPp+Dd98dw/ohH7W17xtMk5Mx0qksao1mtuJyoYKp\nzmikqfMw2fhOBL3+nknMysCtW7f40Y9+xM2bN9e7K+vCL/3SL/E7v/M7XLlyhe7u7vXuzn0xm0Us\nFnGeQeL1mohEMvT0BIrvbSjUpmpoiNLWVnhuRFGYV+JiIURRoLrauuDvpqcThIJJ9DYbosVCPpNB\nURTGZyS6pTw9PQGmppLo9QKKojA0FKG62oJeryUQSDKaM+F44sN4jqQRjAaqH2nFcI9lZY1Wi9nr\nZfNLVRdm88cDrTHBYKrkhgbIZPLFF/5iKIrCTF8fmalJYpOThIdHMAtZvG49Dod+ntobCpqAPBr6\n+mZ4++1hpqYSJR/LXE5GFDXs2lWBRlMwGvT6e2sXloJWr8fkdqO32zdlaN+D4nYbaW52MPeULRZx\nSUs8i5EKhRh4801uHTvGrVdeYfLiRfQ6NXv2VGEyadFoBUSjvqineeedYS5fniSezKOzWEil8gSD\naSYmYoyMRBBFDSaTllCoMLvK5WRmZpJAobhf4OpVEsO3mbx0icjICPlc4b6SZQWtVo1aENDb7WVD\n5D58+ctf5otf/CLOLRohdD+0Wi2/+Zu/yV/8xV+sd1eWhFarYe/eqqI+T6UqPNOdnR7i8ey897ai\nsGBY+4OQlyQCV68SvNZD8MZ1IsPDZBMJwoNDBPsHiPhnOPlaD1JOornZjiwXkpR5vUZGRiK0tTnR\n6wVyOZnATBZ/TEN1vWdRfdtWp+wZuQ8Gg3ae0EmtVhUFjosRn5xkoref3r44wYkZ+nv99F8fY+eR\nbroeaaS2dr61nc/LnDkzRm/vNIpC0fOSSuWK0Q7pdI5nn20mlyskXrvjYtxOhsRqoFKp2L+/Grfb\nyNhYDJNJS1OTvcTjtFzkfJ6xM2eIDA0Vt42/9x6CwUBrWxtOp55QKI0gqJmZSXHy5DC52YiZW7eC\nPPVUU8GInUly61aQRCLL9HSKpiY7O3fayOcVVKpCBAwUihWOnTmD1V2Dy6FjcnAQJS9jb2ygqsq8\nonPZTly6dIm33nqLv/zLv1zvrqwrn/nMZ9i9ezff+MY3MK9TJuXlUF9vw2ptYXo6iVqtxus1YTYX\nqqsbDEKJnkSlWrr+7X4Eb95k9PRpdFYrDXVWLr7bjzAxgWA0kszrycQSnHzvKvbWdk6+W1geikYz\neL0mfumX2mhqciKKAoODYXI5mfp6Gw0NtlXp22albIzch6oqM9XVlqKiGqCmxkJl5f0f1MTUFONj\nUc79yzn27uwiGY0z5Y8yNTyB69mOeaFlAFNTCfr7Q0XjJxRK4fWasFp1pNMSVquOlhbn7DpomZWi\n0wm0tbmLrtuVkgoGSQQCJdsUWSbU34+7rQ2324TbbSIQiHPixPuGCBTcyKOjUfJ5BZ/Pid+fYHw8\nik6nQafT0N7uZmAgREWFmaoqC/lcjplbt1BkGSU0yZFDtQyN2QnHZbp2eWjr8JbDdZfIH/7hH/IH\nf/AHm+IDvJbU1dXxxBNP8Pd///d89rOfXe/uLAm73VBS4gEK+q6uLm8xI7MgqGlqsi84AVwucj5f\nLCiZDoVor63EavRx69o4lTubyaSyjF4bwF3l5Py5YSYmCmnnRVFDOJwmGCxE5NXUWKmpWXl/tgpl\nY+Q+mEwijz/ewOBgmGAwhdttoKHBvqSXvFqjIRJOE52OornWy2OHmlDpmjC7XTx6oBqbbb7bPJPJ\nl7gXFaVQuK2mxsLTTzev6rmVWX1UavWCHirVXYK0TCZfzG8yl1QqRzRayHJ75EgdkiSTzyuk0zkM\nBoFHH62hqclR0J9kMsXaMHIuB/4BWhwW9E12Gna6EE3lZZml8Pbbb9PT08MPfvCD9e7KhuBzn/sc\nv/d7v8dnPvOZTettValU7NlTSEgYiWQwGrVUVJgWLIexbBQFeU5NpuzUJA5J4pGaNK4dRr73Ug/Z\ndA5HtYdsJobLZUKjKYhXrVYdsqyQz8tbImvqalK+GkvAatWxa1cFTz7ZSHd3BRbL0kIi9Q4H9Z0N\n6C0mouEE10+cZ+DsZWKxNBbrwiJPi0U3T4iqUoHTuTruxTJri8HpxDI3nwug1mrnFaiyWHTzhLKF\ncTZQUWEinZaYmkoSiWSIxTLodALd3V52764s5m0RdLpCKv45H4xsLFYQ0y0SDZJLpYiOjRH3+5Hz\n85NDbScUReEP/uAP+MpXvoJOVw51hkLxvFgsxrvvvrveXVkRarWKigozra0uamutq2OIUKhM7vT5\nSp47tVqN0eMhn0riqPYgWsyoBYHqxsrZ5V8H9fU27PaCVqxsiMyn7BlZI4K3bzN+9ixWs41Hn32E\nS6dugEaksr2FQ8/uvedavtNZKB1/4cIEiUQOUSzkKamrK7vzNgMqlYqa/fsRjUbCQ0MIOh3ujg7s\nd2WYtdv17NtXxfnzE8RiWURRQ2OjnZoaK/m8wvh4rLhkYzRq2bu3akFPmqezE1mSCA8MoCgKtvp6\nKnbvvmf/YhMTjJ4+TToUQqXRYK2pofbQoXWrtLzevPbaawQCAT71qU+td1c2DGq1mv/wH/4D3/72\nt/k//+f/rHd3NiTu9nby2Syh27dRZBlrTQ2ujg7i4+N0+SKcHBhgpCdC12MHMJr12F1GVKpCpE9H\nx+osCW81NrIPTlGUzZnmNh2N0vfTn5KJRgEw1dSRFGxo7R48DVULxrPfTTCYmp0Ra/B4TNvCklap\nVGzWMV8IKVsItV0sZ0s4nCISySCKhXEWhMI4ZzLSbMVQCbtdf99w4my8kG11saq5+VyOvuPHiU9O\nlmyvPnCAqr17l3Fmq8t6jbssyxw4cIDf//3f51d/9Vcf+vE3MrFYjKamJs6cOUNz89osD2+F5z0b\nj6PIMjqrFUVRuP3GG0RHR8HqJaM2oNOqsVZVoLJ7UatVeL2mJRej3IrMLvst+PEre0bWgEwkQib2\nvuA1MTYCjGA1dVJZuePeO86hkLr4wfN1FGrC5IsZB8s8fATx/i+du8V3hTBuBZ1OoL5+6er6pXg2\n0pEI6XB43vbI0NC6GiPrxQ9+8ANUKhW/8iu/st5d2XBYLBZ+8zd/k29/+9v82Z/92Xp3Z8My97nL\nxuMkp6aQs1mYHkULyEA64af1ox9ddlVrSZJRFGXVlpc2Ouv5pfp14DcAHfC/gL9ax76sKhpRRCOK\nhQRWc9AaH47uY2AgxPXrUyQSOaqrLXR1eeapzctsLCRJ5ubNGW7dmkGSZJqaHHR0uFc1GkYjiggG\nA1K6NNeCuIg3ZasiSRJf+tKX+O///b9vWpHmWvM7v/M7dHd385WvfAWXy7Xe3dnwaEQRQacjO2ci\nCiDo9Wi0S3+OJUnm1q0Zbt6cIZeTaWqy09np2fKRcevp+/974CjwAeC317Efq47R7S5oBOa85HR2\nO/aGBqAQMTEwEKK3dxq/P76qrsrx8SgnTgwzOhojFEpz9eoU77wzSjY7P3KjzMbhTsEvvz/BzEyK\nc+fGuXRp8v47LpFMRmIyKJN0tSFX+BBtBa+LYDDgbmtbteNsFr7zne9QXV3Ns88+u95d2bBUV1fz\nr//1v+Z//I//sd5deahIUp7R0SjXr08xMhJBkpYm8hZ0OjydnajnGB4aUSxsW0bRxf7+IO+8U3gX\nBIMpzp2b4MKFiWWfx2ZjI0wJDMCrFAyTuWxazQgUIhYiQ0PExscRLRYcTU0Y3W6i0QwnTgwVCy/p\n9QL79lXS3V1x77ZyeYLBVDFpz2L6kVOnRujpKc1zodWqee65FqqrN/YMeCusIS+FZDJLJFKIkHE6\nDciywssv38DvT5T8ncUi8q/+VeuSo7cWO97Jk8MMD0eRchJyMkZHs4m2ei2W6mosVVUran+lPOxx\nj0ajtLW1cezYMfbt2/fQjrsZ6evr49ChQ/T29uJ2r67wciM+77lcnnffHeXmzSCSJCMIalpbnRw8\nWLuk5RJFlomMjBAeGkKlUuFobkZldRGPF5JW3q+elaIovPLKTSYm4iXbLRaRD394x4Ii9s3ERtaM\nfBn4DPD/rHM/Vh2twYC7vR13e3vJ9oGBUEkCtXRaoqcnQG2tbcEbNRhMcvr0GIFAApUKqqstHDxY\nWwzvvJt8Xp63TZaSh1IJAAAgAElEQVQVZHljPfTblaGhMGfPjhUjaFpanOzZU7ng+CgKqzJuw8NR\nhoYiKEoh943aYmc0LtBd34LFs/0ytP7Jn/wJzz77bNkQWQItLS382q/9Gl//+tf5b//tv613d9ac\nycl40RCBO8unQRoa7NTV3V/DpVKrsTc0FL3gN25Mc/FkH8lkDp1OoLPTw86d3ntOKBUF8vn5z/x2\neIc/DGOkAviHu7ZNAv8G+GPgG8AbwA+AEnPwC1/4AnZ7oZBRe3s7hw4donE2RHJwcBBg0/08PV24\nyTOZaQB0OjfJZI5bt/rxeEwlf68oCv39MqOj0eLfZzKFcvRVVfkF26+rs3PrVpB4PFBs3+k0kEgE\nGBwMrvv53+/nrUw8nuXdd8eK9TFyOZmengBer4nmZgfT08mSsgN3kiStlJmZ0nYBUilpwYqnW53h\n4WH+4i/+gkuXLq13VzYNX/7yl+nq6uJzn/scLS0t692dNSUazcwrnClJMpFIhrq65bU1M5PkvffG\nSSQKz1kul+XChQncbuM9M8Gq1Sp8PgdTU4l574L7eVU2O+u5TCMC2dk+/Bz4V8Bc5c+mXqa5Fxcu\nTHD27HjJNrNZ5IUXWuZVu41G0xw7dotYrLTMvcOh58UX29Dp5tuSsqzQ2zvNtWsBMpk8LpeRffsq\n8XpXN49EOJwiGs2g1ZaGpK6Ejei2XU1GRyO8+mr/vBlOW5uLQ4dquXzZz+3bIWRZobrawt69VSXG\nSCyWIRRKo9Go8HiMS46UunZtipMnh0u2GQwCzz3nW/X74kF4mOP+sY99jD179vBHf/RHD+V4W4X/\n+l//K6+++ir/8i//smqC3434vA8NhXn99dsl3gmNRsUzzzTT0HD/Cr9z6eub4c03B+dtP3Cgmr17\n7700mskUvOX9/UFkWaGqysK+fVVLmphkMhLT00nyeQWn07BoBfL1YKMu0/w+8CSFaJp/oNQQ2bI0\nNzsYGYnOClcLZew7Oz3zDBEoVKXUaud/5HU64Z4ff7VaRWenh6YmO9lswYuy2jlKbt2a4b33xuck\n67Jx8GDtlld7rxRB0CAI6nnVRI1GLTqdwIEDNXR0eJBlGau1dBY0MhLh1KlRIpE0Go2amhoLhw/X\nLekFVV9vo67OyuhoFEUpaIja2914ttkSzQ9/+EN6e3v5h3+421Fb5n584Qtf4Hvf+x4vvfQSn/70\np9e7O2tGVZUZn89Jf3+QfF5Bo1Hh8zmpqlq+0a7ValCrVfMmH/crsqrTCezfX017u3vBd8G9iETS\nvP32CBMTMWRZweHQc/hw3aapf7MRBKz3Ykt6RgASiSzj4zFSKQm320hlpfmeSdB6evycOTNWtNS1\nWjWPP96wYJG9h0Ekkub48T6i0ffDllUqePzxBtrbVyZw24gzpdUkn5f5xS+GuHUrWNxmsYg880zz\nooZBJiNx/PgtAoFkyfZHHqnikUeql3TsZDLLxEScRCKH02mgstK8Kt6s1eBhjPvMzAy7d+/me9/7\nHo8//viaHmurcuXKFT74wQ/y1ltv0d3dveL2Nurzns1KTEzEiUQyWK06qqrMC3qh70c6LfHWWwOM\njESL21wuA88807wmQtQzZ8a4eLE0Aq+y0swLL7RsmFwlG9Uzsm0xmUR27Fha3H5npwejUcvAQBiN\nRkVzs2NZybBWm1isUMRtLopSEH6t1BjZ6mg0ag4erMHrNTE6GsViKVRgvp+HIhrNEIlk5m0fHY0u\n2RgxGkV8vvUxYNcbWZb5d//u3/GJT3yibIisgO7ubr71rW/xy7/8y7zzzjurHl2zURBFYdlLMguh\n1wscOVJPf38Qvz+By2XA53OsiSGiKAojI5F52yORNNFoBpdr49c2KxsjGxyNRo3P57znh0RKp8lE\no2hNpkWLo60Wd8rZp1KleUtWQ2i5HTAaRbq6vHR1eRf9u7wkkQ6F0Igier0enU4gkyld3tnqgrbV\n4utf/zrT09P88Ic/XO+ubHo+9alPcf36dZ5//nnefPNNrNbNsQSwXlitukX1IauFSqXCbtczM5Mq\n2S6KmgWXhaRMhkwkgmAwLFpC4mFSNkY2MeHBQSbOnycbj6PR6fB2d+Pp7FzTjJJutxGfz8G1a9PF\ntVCn00Bj48pnEmUKxP1+xs6eJR0MotZq8XR20rbDzYVLgaLS32wWaW0tZ8W8Hy+99BLf+c53OHny\nJOIS0vOXuT9f+9rXCIfDPP/887zyyis4ndvT47bR6OhwMzkZL0bvaLVqOjs9mEyl931kZITxc+fI\nRqPFpGyerq5Fa2g9DMqakU1KKhym7/jxktTDGlGk+UMfwlpTs6bHzmYlhocjjIxEsdv1NDbaFxTg\nLpeNuoZ8LxKJLFqtelXr/0iZDH2vvkrC7y9uU6nVNHzwKeKCk/HxGKKoob7etmUEqGs17n/+53/O\n1772Nd58803atmGW2bVElmX+03/6Txw7dozjx4/TMJtXYzlstud9vUilcqhUqvsKXwECgTgjI1Gy\n2Tw1NRZqa20lesRMLMatn/6UTOT9JR21VkvTU08Vc6OsJWXNyBYkHQzOq4GQz2aJT06uuTEyNZXk\n9u0w6bSEJMm43cZVMUY2C5FImkuX/ExMxNBqNbS3u2lrc61K1FIqGCQdCpVsU2SZcH8fvmefXZW1\n7K1OIpHgP/7H/8ibb77JiRMn1qzq7HZGrVbzzW9+k9raWg4ePMhLL73ECy+8sN7d2lIkk1l6egIM\nDoZRq1W0tDjp7PQsKqb1es2LhuunQqFiNfk7yLkcsYmJh2KMLMbGkNOXWTZqQUClnj98mjV2RYfD\nad5+e5jBwTCTk3EGBsKcODHM9HTi/jtvAfJ5mdOnR+ntnSYSyTA9neT06VEGB+dXw30Q1IKAagF3\nqUZf1ofcj1wux9/+7d/S3d1NIpHg7NmzZUNkjfn85z/P97//fT772c/yxS9+kVhsW2RoeChcuuTn\n0iU/kUghv9B7743T2zu9ojbVGs2C342lVBhfa8rGyCbF6PFgqqws2aaz2R6CVyRBOFwa2RGPZ+fV\nVdmqzMyk5p2rJMncvh26xx7Lw+hyYbsr1aOg1+Msf1SLyLLMxMQEp06d4nvf+x5f//rX+fSnP01t\nbS1/+Zd/yUsvvcR3v/tdbLb1izrbTjz++OOcP3+eUChER0cH3/nOd0jfVRm6zPKIxTIMDZVGxyhK\noYjeUgv3LYTR48Fy1zdCNJuxLje97BpQXqbZpGgNBuofe4zgzZvExsfRO52429owlMVka8paV5tX\nqdVUP/ooerud8NAQWpMJd2sr1tratT3wBkJRFILBIP39/dy+fZvBwcHiv4GBAYaHh7FarTQ2Nhb/\nHThwgD/8wz/E5/Otd/e3JR6Ph7/+67/m7bff5mtf+xpf+tKX+MQnPsHHPvYxDh48iL7s2VsVVhqc\nIIgi9R/4ADNuN9HRUXR2O+62Nkwezyr18MEpC1jLLItIJM3PftZX4h0xm0Wee8634lj2zSBoy+dl\n3njjNoOD789aBEHNk0820tzsWMeebV7ujPt3v/tdvvWtb3H79m1UKhU+n4+mpiaam5tLDI+GhgZM\nDyGMvcyD09vby/e//31+8pOfcO3aNbq6uti/fz/f+MY3ih6rzfC8ryd3V2BXqeDgwVp27bp3hfeN\nzmIC1rIxUmbZTEzEuHzZTyiUxmoV2bmzYkkVLe/HZnk5RSJpLl/2FyNb2tvdtLaujoB1O3Jn3Pv7\n+wmFQjQ3N5fDRbcQyWSS8+fPc+7cOX77t38brbZQNmKzPO/rRTKZ5cqVqVkBK7S0uOjsdK9q9N7D\nZlNG0xw9enRN82WU2XiUx3x7Uh737cMXvvCF4v/L474tmZ8mdpaNfCcs2zMyODhYLEm/1mynY+Ul\niduvvUZ0dLS4TS0IND75JI4VCCvvPtZSZkqrfS1Ws70Hacvf08Po6dPMrRfubm+n4Ykn1r1vD6Mt\nePAZ8mr1YyO1s1p9Of/GGyi3b5feV52dNDz22EPvz73auNe4r/SY5f037v6LeUbKfuUy9yU1M0Mi\nECjZJksS4cHB9enQFkHO5wn29ZV8MACio6OkI/ecQJQpsyiyJBEdG5t/X42MkL4rx0SZMhuFjeAZ\n+SLwy8DdFazKmpENQtzvp+/VV8lnSkN6nTt20PTBD67acbbbGrKcz3Pz5ZfnGXqixcKOj3wE/Tap\n+7Hdxn2tkSWJGy+/THJqqmS7aLHQ+pGPoNsg91V53LcfG9kzogN2A+U7cgNjdLkw35XTRK3V4mhq\nWqcebQ3UGg3OHTvmJSGy1ddvG0OkzOqjFgRcra3z7it7Y+OGMUTKlLmb9TZGfgP4G1bJQzP4EJcN\nHtaxFEXh2rWbZDLS/f94FVjovNSCQO2hQ3g6O9Hb7ZgqKqg7cgTbCtMHP8g1XO3rvprtLdZWIpEl\nkcjO2+5qbaXm4EGMbjd6h4PKPXuo3Lv3ofZtPdtaCavVj4fRTiqVIx6fP/5r1ZeYTkfNwYMYXK7C\nfbV3LxW7dy+7ndXoz3LbWOkxy/tvzv3XM5pGCxwF/nwd+7ChCQZTXLgwweDgKNeu5ejo8NDe7l6X\nEFK9zUb9Y4+RS6VQa7VohA0biLWhmFtfAqCpyc7OnRUYDIXwRo1WS8XOnbja2kBREHS69exumVUm\nm5W4cmWKvr4gsqxQW2tlz54KzOa1HWeNIJTvqzKbivXUjHwamAF+ApxgAc3I5z//eez2QmGw9vZ2\nDh06VFTp3rG+turP/f39nD07QTRaKECXyUyj0ah5/vn9NDc71r1/a/FzU1PTlltDPnNmjIsXJ4s/\nq1Swd28V+/dXr2OvNhZbWTtw5YqfU6dGS7SkbW0unniiYduHtW7lcZ9LPp9HluVifpXtzEZNevYN\nYA8FvchB4EvA/zvn99tawOr3xzl+vI9strQOQUuLg6ee2pp1SrbayymVyvHyyzcJh0vrdDgcej76\n0bYllQTfDmy1cb+DLCv88z/fIBAorWVkNot85CM7sNm2d4r0rTruczl37hwvvvgi6XSaH//4xzz+\n+N1z7u3FRhWw/h7wPPACcIVSQ+SB2GqakTsTp0xmes62tbUfN/o13KyakbmoVEurcbNRdR5lzcjS\n21lonBcb+81wTmvdxmbVPNy9fzwe5+Mf/zjf+ta3+O53v8unPvUpUqnUQzv+Ztt/vQWsd3hivTuw\n0XC5jFRWmku2abVqmprWrv5JNpEg7vcTGRkht4SHpsziGAxafD5HycdHpSqkddbp1scrkonFCA8N\nERkdRborVLvM6qJWq2bLBJRaH/X1Nmw2PVI6TWRkhPDQEJlYbJ16WWat+J//83+yf/9+PvGJT/Dh\nD3+Y7u5u/u7v/m69u7Vh2ciLltt6mQYKNVCuXAkwNhZDp9PQ2emhpcW5Jt6R2MQEw2+/TToUQqVS\nYfJ6qTtyBKPLterHuhdb0W2byUhcuzbF7dshAHw+Jx0d7nUxRqKjo4ycOkU6HEalVmOqqKD+yBEM\njvUt8LcVx/0OkpTnxo0Zbt6cQZJkGhvtdHV5UGUSDL/9Ngm/H0WW0dvt1B0+vK2qM2/lcc/lctTV\n1fH666/T3d0NwLFjx/jqV7/KqVOn1rl368dG1Yzcj21vjNwhnZYQBBWCoFmT9mVJou+114jNpnvX\nmkxoDQbMVVXUHjr00IR2W/nllM0WQrOXU+RKzufJxuMIev2KoyGkbJb+V18lPjlZst27cyd1hw+v\nqO2VspXH/Q65XB5ZVopG6Mg77xC4cqXkb8yVlbS88AKaFQgdFUUhE4uh0WrRGgwr6vNas5XH/dVX\nX+U//+f/XGJ45HI5vF4v169fp/KuvE3bhY2qGVl1Nrre4UGZnBxdM0MEIBuPkwkXQk9jOh35bJbR\n06e58fLL3H7jjTVLTb6dNCOiKCzLEIn7/Zz6wQ+4dewYt44dY7q3d0Uv7r7r1xccx9j4OHI+v8Ae\n96asGVl+O1qtpmiIyPk8sYmJeX+TjkS4de3aAx8/FQwy8Oab3Dp2jJP/+I/4L19GllaWn6isGXmw\n/b///e/z8Y9/vGS7Vqvlueee49ixY2t+/M24/5YyRso8GILBgKDXoxFF5FyOwZ//nNj4OLl4nFBf\nH2NnzqDI8np3c9uQTSYZeecd4n4/2Xic5PQ0o6dPlxQqXC4anQ5BPz96Q2+3o9asnaFbZj5qjQad\nzTZvu6DXo3lAD1hekhg9fZpQfz/ZWIxsNMrY2bOEBgZW2t0yy0SSJH784x/zq7/6q/N+99xzz/HG\nG2+sQ682PuVlmjIATN+8yUxvL5MXLzJz8yYaUcTV2orB6UQwGNjx4Q+vuX5kK7ttl0NkdJT+V1+d\nZwB6d+2i7tChB2536to1Rt99FzmXAwrLcY1PPom1pmZF/V0p23Hco2NjDP785+QShbBfjShS8+ij\neDo7H6i9eCBA3/Hj8+pH2Rsb8T377Ir7uxZs1XFfaInmDrdu3eLpp59meHh4HXq2/iy2TFNOdFAG\nANeOHejtdhJTU0jZLAa7vVjHQqVWLy0WtcyqoLpH7O/dtUaWi7ujA53VSmxiArUgYK2txeTxrKjN\nMg+GtaYG37PPEh0dRZYkLFVVWFZgFKpUqgW1Xaqy1+uhs9ASzR1aWlrIZDIMDw9TX1//kHu2sdlS\nyzRbVTPycHKaqDB7vWja2nA2N5cU1LLW1q5JxMV20owsB6PbjcnrZXrOLFcwGLDV1T1wm4ODg6hU\nKqy1tdQcOEDV3r0PbIiUNSOr047J46Fq715qDhzAWluLSqV64L4YnM4SY2Y6kykUs2xeWYLEsmZk\neeRyOc6ePbvgEg0U3rNHjhzh5MmTa3L8zbx/2TNSpgRLVRVWt5vpGzfIZ7PYGxrwdHVt+9TVDxNB\np6P+yBFCsow+m0VrMuHt6sJSVbXeXSuzQVFrNNQ8+iiiyURkZARDNkv9o49iny23UObh8MYbb1BX\nV7eo1+Pw4cO8++67fPKTn3yIPdv4rOcXpgv4X0AeuAp87q7flzUjSyQvSaRmZoDCrHo1BImyJCHL\nMoIorritpbLV1pBToRBSOo3OakU0mR6oDSmTQaPVrniJZiOzlcZdliSSwSAoCgaXa10KSkrZLGqN\nZsMLk7fSuN/hN37jN+jq6uJ3f/d37/k3r7/+On/8x3/ML37xi4fYs43BRs0zIgB34s7+Cvgz4MKc\n35eNkSWQCoUYPX2aRCAAUMgNcvAg+lm1fnxyksjICHI+j7WmpugO3ohs1pdTXpKIjowQm5hAazBg\na2ggPDDAzI0bSJkMosVC9b59K3aZb1U267jPJZdKERkeZvjkSVIzM+jtdqz19dQePLjuSeU2Klth\n3OeSy+Woqqri/Pnzi3pGZmZmaG5uJhQKod7Ck4yF2Kh5RuYGwBuA8Eob3Go6jvsdS1EUJi9eJDoy\nQj6TIZ/JEBkcLCZTioyMcPv115m8cIHA5cvcfv11pq9ff39/WSYbj5Ofk4tgI5zXau+z1u1NXrjA\nwJtvcv3cOSbOnWPk1CmGT54kG48j53Kkg0HGzpwhGQoVti0xr8dG1LOsdlsrYaNoRqRslskLFzjz\n058y+NZb+C9fZvLyZYK3buG/dGnBfbLJ5ILp+DfKOa1mO9tFM/LGG2+wY8cO5PukQXC5XNhsNgbu\nEXa9Wc9/pfuvt2bkReBrwHtAOSB+mWTj8XkZNQFiY2PkUimmrl0jl0wWt8u5HIFr17A3NZGJRvFf\nukQqGCxoErq7cTQ1PczubwlSwSAzN2+izBoYgsFAdGiI+MREiSckPDTE5PnzJKemEK1WKnft2lap\nv7cyCb+fuN9Pwu/nzsJIJhIhHQ4Tn5wkG48jmgt1prLxOP6eHiLDw6g0Glw7duDp7FxR1tUyG4PF\nomjuZs+ePVy4cAGfz7fGvdo8bBR//Z8CLwP/Mmeb8vnPfx673Q5Ae3s7hw4donFWkHXH+trOP+ez\nWdKXL5MOBouRF26dDlNFBUJHB6OnTmGZ3X7n91VOJ01PPcW5114jE43ink2yFAJq9u+nY9++dTuf\npqamTee2jY2P0/eznxVzdwh6PXI+z+TFi3i7uoBCAcJgfz/NTz9NcmoKANFioeW55zA4nevW943C\nZnfXz9y8ib+nB/+lS4Ru3y5utzc2UrVvHzs+8pFiOv+hX/yC6d7e4t+o1GpqDx8u3ivbic0+7nNZ\n6hLNHf7oj/6IfD7PV7/61YfQu43DRtWMiEB29v9fBU4Bc/PkljUjSyBw9Sqjp08XZ+ZqrZa6I0dw\nt7YydvYs0dkKvHeSK1lqaqjYuZO+n/0M7rq+1bMhn+vFZnw5ZRMJbv30p6RDoeI2o9dLZHgY7WzG\n07jfj6DT4fD5ikJjgPrHH8fT0QEUlswy8TiCTrfiOjSbjc047gBSOk0+l0PKZBh4802UfJ6BN95A\nSqdRaTR4d+2i9YUXionM0pEIt44dIxuPl7Rj8nppe/HFLS1SXojNOu4LsViis4X40Y9+xP/+3/+b\nV155ZY17trHYqJqR54GfA/8XqAWOr7TBja53WO1j5XM5dHY7no4O9A4HtoYGGp98EktlJUMnThDo\n6SFw7VohIkOvR6XR4OnqWjSB2YOe18xMkqGhMH5/HFle2gtmK2hGRJOJ6kceQWe1Mp3NotZqMTgc\ndP7Kr+DduRNbfT31jz2Gq7WVVDBYsq8kyYyNRRi9McSNV39WUocmPjnJ+ddfZ/rGjVUpLz/3PBVF\nIR4IEB4eJjE9vaK2Vpt0JMJ0by/+y5eJTU4u+rFaL12ELEn4e3q48cor3HzlFQKXL+Pp6CCkKPie\ne47q/ftpfvpp2l98EVdb2/s7qlToHQ6MHg9Grxf9HWHrnOdxKX1JJLKMjEQYHY2QySxce6asGXm4\n+3//+9/n137t15a8f3d3N1evXl2142+F/ddTM/LPs//KLJO8JJGJRglcvkywvx+9zYbOakVrNqOz\n2Zg4f56ZmzeBwsdy+vp16j7wATSiyOTFi1Ts3Im5oqJEbyIYDFiqq8mkUsvqi6Io9PQEuHzZTzKZ\nQ6fT0NrqYv/+arTajR1auFIysRj5XA5bQwMGlwt6e2moq8Po9aIRhGKa9VQkQv/x4yWeKEmjZyAA\nwb5hohdOkJyaosXnwGLVc/2HP8Tb3c3U8DDK7dsYvV4ajx5dVlSGLEkkZ2ZQZLnQt1nyuVzh/rhx\nAymdRms04u3upmL37nWPskpMTTH0f/9v0WgT9HpqHn0Ud3v7uvbrbkIDA4V6TbPeyGAsRj6bxdvV\nRaXTidZoxOhwzPN0JPx+Ji9cYOr6dbQGA+7OTuyNjTh37FiyV2R8NMjVS2Mo6SRqjYbbdifdu6pw\nOjd2hd6tTC6X4yc/+Qlf+cpXlrxPU1MTk5OTJBIJTA8Y9r/V2CiakYUoL9MsQHxykvFz51AUhf7X\nXsPd3o5KrWby/HlyqRStL75IYmKiWBQtPDhIZHgYh89Hxa5dpGZmMHq91B0+jP/yZSLDw8i5HA6f\nD2t9Pba6OkSjccn9CQTi/Oxn/aRS78/QNBoVzzzTTEODfVnntlnctnlJInD5MjM3byJLEka3m6pH\nHlk0o2l0bIxATw/pcBjRaiVuquXKkEKNJcO1fz5GPifhchvZ0WQm0NND1b596Gy24vKaZ+dODE4n\nkcFBdFYrzpaWex4vE40ycuoU8clJFFnG6HZTd/gwRreb8PAwA6+/XlLNVdDr8T33HOaKCrLJJNlY\nDK3RiM5iWd0Ldw/ujPvwyZNM3VW1Vu9wsOPDH37gPC0PSjYeJ5tIIJrN847d/9prhO+a/Ql6PS3P\nP4/J612wvXQkQt/x40THxwn19REbH0djMPDIZz5Dw+OP31fAqigKM7cH6XlvgJuv/5zg2CQmt5vq\n7nbannqcnfs3n/h8szzv92O5SzR32L17N3/1V3/FI488skY923iUa9NsEXKpFCOnTpGcnkZvtxc+\nVIrC9X/6J2RJQqXREB8fJzoygqW2FtFoJDWrZZg788pGo6jUaqofeQQ5nycXjxMdHSU8MICzpYWG\nJ55AvcRkTdFopsQQAcjnFaamkss2RjYL4YEBJs6fLxayiwwPk8/l8D333D2TxFlrajBXViKl00ho\n+OnxftLpNFiLDyjxeJZ0Kks+lytx3Sv5PP5LlzC6XEVtSmR4mOann8bods87VuDqVSJDQ8Wf4xMT\nTFy4QPPTTxMbHycdiaA1GovHldJpMpEImViMyQsXyCWTCHo93u5uPJ2dK/aYKLJMXpLum0AvucCS\nUS6ZJJdIPDRjRFEUpq9fx9/TU/QcVe7ejau1FVmSUODey5yLXKdMNEoqFCIyKzw3V1YCEOrvp+bA\ngRJjJB2JoMgyeru9eO1jExNMD44xeuYso5cLAth0LEkuI2HzOGjbVYcoll/n68HcJZrl0NXVxdWr\nV7eVMbIYW0oxtRF0HGt5rFQwWPgYKQpqrRZ7YyOJqSlkSUJvt2Opri4YKg4H0uyMWms0otHrqdi9\nu6BncLnQGo0Iej2hwUGiw8Okw2G0JhMGl4vh8XESsxEfS0Gv1yIIpbeRSgUWy/0zt25WzUh8chLR\nYkEz5+Oampnh1mx+l3uh1mgQTSZEnYhOV/hwJGQD7oZqAERRg2jQFeqMVFUxMWt4ZOJxTB4Pgl6P\nweXC6PGg1mqJ+f3zjiFls0RHRwGQ83mSwSDR0VFuXLrE5OXLxCcnCVy9ysyNG+Rml+RUGg2yLDN2\n5gzpUIh8JkMmEmH8vfeKS3mKopCYmiIyMsKNy5eXfK3CQ0P0vfoqN37yk0JCsDlC37u584Gei2g2\nI97DQ7MWuoi438/Y2bNkIhHymQzpUIiR06eZuHSJGy+/zM1jxxDNZu6ez1uqq/FHo/c8hqDTFXLO\nhMNI6TS5VAqVIGCtqysYP5cvEx4c5PxbbzH8zjuMvPMOo6dPk5ltMz4xgVrOkJx+/9mUs1nymSwp\n/wRqSnNbrKVmRMpkiI6OEh0bWzBXylLaWM2/X8/97yzRzK1Fs9T9Ozs7uXaXJ3C5x1+Izbp/2ZTe\nRKgEAaPbjXU7H6wAACAASURBVJzPo7NaafzgB/Ffvoy9qYmE38/wyZP0v/46HR/7GI1PPgmKQuWe\nPRhdLqR0mvDgILKiULl3LwogJZNFwWWwr4/E1BRpm410KISlqgpJyjM4GGFoKIwoamhqclBbay3p\nU0WFicZGO/39waIkorLSTE2NdV7/twKBQILeSYGpES3VVQ481jSJkQES09NobTZGczmcO3ZgXCRk\nVxDU7Gm3YJJCJOJxnG3taPVa3CYZd1MlDYcPER0bA0VBpVbj3bmT5NQUI++8g2AwYK+vR6XRcPu1\n15AzGdwdHWgNBc2ARhDQGo2kZmYIDw4WlmryeTJuN8G+PsxVVTQePUpsfLzgAZltT6PVkrsryiOf\nyZAIBDB5PExcuMB0b2/hPgLsKhXe7u5FvSaxiQmGfvELpFmjJx0KkY5EaH7mmQUjhlxtbYV8HYEA\nKApak4nKPXuK5/YwSAYC5O/6wIb6+hB0OrLxOEo+Tz6dxt3aSjoSIZ/NYq2pwdnayuDAAHGzGZVG\nQ/DmTVLhMJaqKpwtLRg9Hhw+H+PnzqERRTSiiKejg7EzZ0hMTeH0+ZBSKdI2G/FQiFQwiNPnQ63R\nUH3gAGpBQEknqa134b89QS5b8J6JeoHqBvc9084risLoaJTBwTB6LXhMORwOfcG4XWAMYuPjhXtP\npSpqnkquz/Q0I++8Q2JqCpVKhdHjoe4DH8A4R5e0nbiT6KzuAYpYdnZ28td//der36lNypYyRu7k\nrNiKx8pEo0yeP8/w7Lpkxc6daEQRc2UlVfv3c/K//BfUajX5TIZkIEByaorWj34UtSBw7R//kZvH\nj5NLJPC0t6O32VAB5ooKDNPTjL77LtGREQCEYJDRM2ewVFdz7XaKCxcmyOcLVsbAQJijRxtKll+0\nWg2HD9dSW2tlaiqB3a6nvt6G2Xx/z8iDXMPVvu7LaW9qKs61cwPIiShGTZax4RAhmxF3Iomo12OV\nJPyXLhEbG6P5mWdKKh/PZbq3l+DZsySv9pFISFh3ddPw2B5M2hze7m5EoxH71BTeUAjBYCA0MMDw\n22+Tz2RQqdUMvvkmjU8+ibWmhvFz55CyWeoOHQIKy3Hujg6C/f0k/H6UfB61KNLs85GYnGTi3Dly\nyYL40d3eTt1jjxU8bH5/waV11xq+oNMRm5gg0NNT1JnYgcmLFzFVVGC+h0YCCktJ0l2C6ITfT3J6\nesEPncHhoPmZZ0gEAsi5XMELtMhHbrXuhbntaO76QOclieT0dKHOy+y1yUQiCDodTR/6EBpBIBUK\nMfyLX5ANh7n+3nsoilLwUgYCxEZHSQQCNH7wg9Q8+ij5XI70zAzZVAqjx0Pc78fs8aAzm0mFQkyf\nPk3t4cMkZo0yQa/H3dGBtaaG0MAADV1NZMMhZoIJRIOehu5mfIf2zhPA3jmngYEQJ04MU2mH8cvv\ncXZknPp6Gzt2NRWMiDnLfMG+vuJ9BjB9/Tr1jz1W/L2iKExeuvS+t4yCx8Z/+TKNTz55T8N0ueO0\n0nF9mPv/0z/907xEZ0vd/84yzUqOvxCbdf8tZYxsZQJXr5IKBqnavZtUJMKlv/kbUKmw1dVha2xk\n/+c+x+ipUziam8nG4wydOEHj0aOEh4cZfOut4qw3cOUKKpUKS1UVgl6P3ukszHI0GgS9HntDA3I2\ny8z4DDdvpoqGCEA6LdHbOz1PC2IwaGltddHaurVnR/5bgwy8/hoRf5BMIoHFbsb66AHM3QcwyfHi\n8lZyeprY+PiCxkhyZobxc+cK+V/GBzAIArHzQTxOkel4HEtlJWJ9PSaPB5PHg5TJMHr6NPb6ehKB\nAMH+flCpSAQCVOzdSyYcJjoyQqarqyg4dTQ10fDEEyDLyPk8tro68rkcPX/3dxicTjSiiKIoTF2/\nTuNTTxUEyxUV8yKsDC4X5upqQv39JYJXACmVIhMOL2qMKAukxVZkeVHRomgyIa5jJmBLVRUGl+v9\nfDCKgrWuDpVGU3I+UiaDavY8Rk+fLupdYhMThG/fpvlDH0IwGJBSKaKjoyQDAay1tXh37WLy4kWk\nXI7pa9foO34ctVqN0evF2dyM0e1GEEX0DgdqjaZQVyqXw+h2U3vwIKGBAbosFjKRCEaPB3d7O7Z7\nzMplWeH69Wn0eoHkwFUmbhSSXI+PhHDZtQjGizQ//TQqlYp8Lkfg6tUSr5A0m8XZVleHWhDIJRLF\npH1zSQQC5FKpZQnftwK5XI4f//jHfPnLX36g/X0+H+Pj4ySTSYzb7NotRFkzsgmOdfPaNeJ+P9HR\nUfKSRGR4GI0oImcyoFIR6Okh4fej1mgIXL1KqK8Pg8uFzmYjNjqKLMsokoQiSaAoxCYmgMIL1VJV\nhberC293N97ubpKzH7RMTiaXK62hYjRq0WhU3LgxTX9/kHg8O6+vy2EzaUbyksT4+YtE/IWwU53J\nRDankJ4OoLPZSQQCTKfTxb+/11p6JhIhl0iQz+UKws5slmwshqIoiGYzY2fPMnHhAqlQqNA3lQqV\nWo3R7cbh82F0uzF5vYVMr2qRpLGaGbWHqZl08SOvUqkwV1Zira/HWltLNpHAH40WtUGyJCFLElqD\ngUwkAoBoNFL/xBNU7t2LuaoK786dNB49iv5OxeE5s97pTKZovC6GtbYW9V1RIganc9Vc+muhi9BZ\nrTQePYp3507MVVXUHDhAy/PPz8sRY6uvRzSbSYfDxWs4nckUM/GGh4aKy0tKPl805lzNzVi8Xowu\nF5HR0WKhtGw8zvj58whtbZirq9FZragFAYfPRzIUInD1KoJeT/0HPkDL88+z85OfxPehDy1oiEhS\nnrNnr3L9+hQajRqPQ0t0bHzO72UkSSE5NVVMwCal0yWlI+4w5vcXBNUUvEaaBcZcazCU6KcWu75L\nYbNoHt566y18Pt+8jKtL3V8QBFpaWuidk5F3Ofvfi826f9kzssFJR6OFglv//M9MXb1K49NPM/jW\nW9jq64uuY4PdjkarRWs0ks5I4KjEe+goWZ0No9eLwekkNTNTzItgqqhAMBgwOBzFpZ7sncRamUwh\n90SNE+eowthYYbtOp0EUNVy4MMnt22FAwWbTc/RoI5WV5nW6Og+PXDKJWkoSjRWih0RRg8kkIqfi\n6Mky1/TQiOI9w241ooh6VtehFgRkScJaV0dqeprx8+dxzmZpDfX3o2lrQxBFnC0tjIVCmLxe3I8c\nJnjjGt7Dj3HynXF6z93C3dnFYMLBnj0yu3ZVAGDyeLDW1jJ19SqyJCGazVTu24eg06HWaDB6PJi8\n3pIoFYPdTs2BA/P6bKmunuc1sdbVYaqoWPSaWWtrqTt8mMDVq0jpNEaXi8q9e5etAclmJTKZPCaT\niFq99tkIjG53yfJFLpVCmi1CqSgKtvp6KnbtAgrLWBqttuhR0FmtqDQadGZzsSCiaLGgt7/vTbT7\nfISHhhBmn71UJEpOrUdjVKN3uRk7f4HJs2cKOp50GpVKhUqlInD1Ko1PPrmoNyqblXj33TF6esYR\nhDRjY1Gammx4m2sJTRS8N2aziEEvFPo+a0SIJhNGl+v998AsOru9aHRqtFq8XV2MhMPks4WJiEan\nK9TWWWL03VZioSWa5dLV1cW1a9fYN1uGYzuznnfQQeBbgAycBf5/9t4sSK4zPc98zsl937fKqsra\nV1QV9o0Ed7JpqZvdklrutmSHbMdceUZjxcT4YkK3czXhC4U9F57whT0jta3o1S31xuZOgiR2oFZU\nFWqvyn3fM0+ezDMXWUiyCBAECJAEW3ojEMFM5n/+c/6Tlef7v+/93vd/e9gD/i5yRsqJBK21NVRa\nLZr9VN7t4ME9Pk6r0UCWJEJPP43W4SIXjmH0BSjqfPz2tS1OjIwQPHkSlUZDMRZDb7Mx+s1vYuvu\nxuT1IpVKBI4doxiJUEkkCOl0bVE0t4vjx3XI8h6ZTBWn08DKShqdTk2pJLG2liEeL7G3V+D55/s5\ndMiLWv1gImePE2ekuu+oq9brMbrdd9a/1VoErRGTSUuhUKdcllCrBYam+nGFuqjF9/CWy52WWHMg\ncGB4U5Ypx+M0ZRmDy0VTkrAEg5SiUZxDQ6Rv3cLkdqPfL+3ENiPY9B4uVffo8vXgPmXk6ocbrK3m\nsfueAKWLre01TP4AaoOBcrHG/Hyc7m4rTqehTXw8dgxrMEi9UEBjMpF0u8nv7HSIsSafD8tduBu3\noSgKtVwORVEIPf00+Z0datksvR4Ptt7ez5StFwQB99gY9r4+5HodrdncDqDvE4qisLaWYXExQbUq\n43IZOXzYh9drPnDvHhafdRyNwUDP6dNt/xhFOVB+09vtOIeHic/O4tbpUDQafNPTdJ85Q6Naxej1\n4hocpF4sUs1k0DudWPx+3GNjhC9dwjE8jKqsUKk2sPk9eFw+Lq2/g713ALVOQ6MlEJ5bZPDZZyju\nbpNeWblnMBKNllhdTaNWtwnUTqeR1dUMA0+PYppfRS00CYXsqHRaPBMTnXsoiCK+mRmkUqmTBTK4\n3Yw/+eSBvwXn0BBqvZ787i7Cfpn4Xt+h+1nfh/38VzFelmV+9rOfcfny5Yeaf2Ji4g7eyNfh+r+I\n8V9lMLIFPEvbn+ZvgEPAvXsjfwfx8dT63SCVSjQlCVGrZeSVV1DpdOhtNuJzcyAI1AoFgidO4J2a\n4tqrF8hnS8jLMdRGE96xw6zEdJz9/VcIHDlCvVTC2tWFtbcXrclEfG6O1M2bNBsNtBYLgWPHsPb0\ndPQgfD4zL788RCZTpVZrkMlUKZUkZmcTLC+nkGWFGzfi1GrtneupU19PF9rE4iLx2Vmk/WDCNTJC\n4OjRA9oPqUwdfAP4euLYbDpQwOJx4JqYxNHXh8njQSoWURuNtCSJ8KVL1PN5zIEAlmCQ+Oxsu5tJ\nlrEGg7hGR3EOD7eDTJOpTSAWRaRymZqiZXU1jV8bo1p0Eg4XqddlMpKVptZKXRaYW0iCtx9dq0gt\nn6fVkKhU1JTLUkeNU1SpMAe6OmRRo8tFbmuLciKB3uHA0df3qcJmUrlM9OpV8ru7oCiYAwG6TpzA\nNzX1wOur1us/s6RzN0QiRT74YJd6vZ1hKBYlymWJb3xjEKPxswnSjxqftlb+w4cxOBzkd3c7gUr0\n2jWq6TSO4WFyGg2F3V2kYhGtxUL3qVN4p6YY/da32Lq6QDydotXU4vSFCG9naNqC6L1aYtevk9na\nwRLw4RwexeL2HPA2uhvy+foBnpfBoKanx47R5eL3/tfvIyUiiKKAvbcX6ydKPGafj8GXX+7MYXS7\n78hi3Q5APo2n8g8F77zzDn19fQ/94J6YmOCv//qvH81Jfc3xVQYjHxdJaAB3N1l4AGxtbX1pGYuH\nnavZbLG+nmFlJU2zqTA46GBkxNXRn7gNvc1G1WrFtK8Zsffhh2iMRnqffBKtxUL/M8+AIFDY20Mt\nV7EJJUr5GBZTN+ZGnFzNQSEv4tlX7Lwd9GQ3N4lcudIp3cjVKrEbN0g3Ggx/TH5bp1MTCFioVhuY\nTJpONkSW2z94Ho+BXK7GjRtxJic9mM33b/L2edbwUd/j5dlZpPn5Tr1crlZJLCxg9vuxh0Kdz1Wr\nMtGqGe+ZZ2mVMu11NDkp0n5AaU0mIskkPp2Ozbfe6oiT5ba20NlsiBpNh09Q2NtD73Aw+OKLNPbX\nvV4oUE4kUGm1CHYvVlULg0uN3gwNROauRdDJJSqpJKJsxtHVxepSjAG/gFqnR6XTYTBoMBrbAVSx\nWGdnYY3I8gY6vQZdwMqpZ862d/f7DrGtZpOmLN81xZ5cXDzgLptdX0dUq+l7+ukv7e9sb6/QCURu\nI52ukk5XMRq1j+w8HvY4Ko0G59AQBbUaTbXK5f/0nyju7tKSZbbeeYfec+foOn4cqVikWa+TXlvD\n6PXSe+4coqebknUZqSaxm2siV/bIbYRRZWRa9TIGkxary05iaRn11Bjdx+9M5yutFvndXQqRCDQt\nNEoFWhoJna5datLpVPh8ZoI9QRi7t2W91mg8QER9FGv8oMd42Dm/jPE/+tGPPrVE8yDz3y7TfN7x\nDzv/4zT+cSj0TQMeYPmzPvi7hLW1DO+/v4sstxn6yWSZWk3mxImDKU+5WqUlyzRKJVIrK3SfOkUt\nlyMxN4dKp8Ps9dJsNFDpdGQXr3Hzt+92WhAnvvUyod/7p5TWFsnfyBM4erSzsy3s7XUCkduo5XIo\nn2LKZjBomJ72E4uVO+fc32+nu9vGjRsxBgYcSFLzrmMfZ0il0h3EPaXZpJJMHghGbDYdiqKwlVDQ\nat0oioJSh/GjB3f8+d3dAw6+AIn5ebqOHz/w3m3NjfTKCtV0muDJk4QvXSKzvkE9XcB/6hzR9TAa\nOc7oN16gsLWBUCujQmZ3c5Npj5WxqW5axQyWrgA6vYbxcTculxFZbrL03jWu/Y/XqVfapFqNz0jQ\n5cRsM1KKxahms1TicTQmE46BAdxjY51dsCxJ5D6m4HobxUikI8L1ZeBu/BBBuKfQ6VeO6PXrpJeX\nqRcKqDQaavk8m2++SeDwYfQOB0qzSeTSJUqRCJ6JCay9g8QKq1x6c5VCrs6xpwL0Hx1HunUNtSgg\n2myYg92svv42Sq3I0Esv3DFn8uZNwpcu0Wo00Lh8uNQi0XI7GBEF6PaIKLE1trer2EMhrN3dX7kP\n0dcZzWaTn/3sZw8s/343DA0Nsbe3R7VaxfAl6uk8jviqgxEn8B+Bu4aYf/EXf4F9n/g1NjbG6dOn\nOxHXbcbuJ1/fxqf9/0f1+vZ7n2d8q6Vw9eoS5XK1s3up1VLMzxcYG3NjsejY2tqi1WxSvHqV8qVL\nSB4PeUWhNTeHb3q6fbxWC8v16wSOHSOayRDe3UKrFWlITRouO7u7OxzS1SklCsQLBTIXL2Lt6cFg\nt5MoFsnU67j3a8apeh1RreZ0d/ennr9WC3/wB2NYrTr29nYAWF5OYTCo8Xgk0ukoTufgA63HJ+/X\nZ+FR78hDvb1srKzc0bqqNho7HBJRrcbjMXH4sL9jCKjXqxkZcREIfJS67+vrY+/ixTvm+GRbKNA5\nbi2fp1GpoDEa6T59GsfgINVak4bFT+7dWQwWI0Jik75eK5GtKqKgxxIIELm1wx/9+bdR6/RITRGX\ny0gg0OZSpBMFNi5c7wQiAEqmxubb7+Ab7KGWzbLx+uugKDiHhqhmMjQlie5Tp9rnK4p3dMFAu+wj\nqNVfWvaxu9vKzZsparWP7o3bbcTlau/cvyzOyIMc5/Kvf90O2FotlFYLlVZLPZ9HURQEQWD99deB\nNqk1duMGjkKBmWkfC5eMlIoN1uYLHPmzU5jHA1STCcrpLPndPXwj/biGBqlls9g+xtGQKhWSS0ud\nrFsjk2Ay6GXEFkLl6UIjlVDCyySvtzvosuvr9D75JM7Be2dIHuXa/K5xRt599126u7sZGBh46Pk1\nGg2Dg4OsrKxw+PDhBx7/sPM/TuO/ymBETZsr8r8Dibt94K/+6q8+dfAnL/jr9LrVUtDr3eh0HwlC\n6XRu9HotrZbS+Xw5mSSWSLQfhkYj7tHRjoGXTVGoF4voHQ4K4TBd4+PcKpXQ2vTIjRaCIOMxaqln\n2mqWbp0OQRBolMsY7HbGjh5lM5PpZAXcOh22UAjjfhfIvc7/xRcHeOMNWFhIEAxqOHrUz/HjwTse\nzA+zXl8WTD4ftt5eshsbnffUBgPVVIrE3BxaiwXf9DS2nh6mpnwEg1ZKJQm9Xo3HY7xjh2n2+Uio\nVAeyTo6+PnR2e0eLQlCpcAwNYfb724q6soxKq6WWyxG9dg1TsId6y4BKJaDRa8lubXByKkik28r2\nZhatTsXYmJsenw57d9cd1yTX69RKH3239AY1dpNAJRFHd2Sys4uGti6GweUiu7GBZ2ICncWCSq3G\nPTrK7sc6sARRxDk8/KVqSQQCFs6d62VpKUmpJOH1mpia8mEw3NtU7quEa2QEnc1GPZvt2DSEzp3D\n4HIRu36dZqOBPRTqZKGK0SjuXj1PnPQi6PuhIZHf3MTcZWL1/BUMJj2tSgmdVoXBaiG7vo57dLTD\nZ5JrtYOKsYqClI5jFFsMPTHJ1rtzNJoSBpeL1r7bd/LmTex9fQ9EJv5HfIQf/ehHB+TfHxa3Say3\ng5F/qPgqg5E/Bo4D/9f+6/8DuPAwB/y6cEbUapH+fgfpdPWA4GUgYMZq/YhzoSgKZp+P3MwMBkUh\nOT9PJZmk9+mn8c/MUIxE0JhMaAwGDG433adPdzQP5HodWZLQmc3U9tnxGoMBzX4rp8Xvp++ZZ0it\nrFAvFLD19OAaGWF3b+8zrysQsPD97x8iHi8jCGC36z8XoXBlbo6A04nGbMZgvz9TvUd9j/ciEbrP\nnsUSDHYUL2u5HOlbt9oy6sVipzXW4HDgdBo+1a59a2uLnmAQ38wM6ZUVmvU6GpOJrmPHMPp8WAIB\npGIR437brahSYe/vJ7e5SXJxEZ3dTu+TT2J0uynG4tTHHTj0JgZOTJNdu8WQXcvQaTuC0kIUyujM\nd5rHleJxxHoRm8NIYmMHj9+GUEyQKlVxm3qp5/Ptdk6hrbbalKR2wKEoNBuNjtOvra8PjclEZm2N\nRrmMc3AQx9DQF3IP7oX+fge9vTbq9SYGg/pA8Pe4cEY+fhznyAgT3/0uycVFBJWK4MmTtBoNYtev\nI6jVDL70UseJGWiLqgX8qBuL7C0s0zAI+JwevL/3NC8N9pC4cZ3i3i4Wn5fY7Cwmrxfn8DDeiQmg\n3UqsdzjuKDWWdDrkep1qKkX40iUalQq27m6svb2dQOl+gpF/5IwcRLPZ5Kc//Snnz59/ZPN/kjfy\nOF//Fzn+qwxG/vv+v689UqkKiUSJQqGO0ailr8+G1Xrv7oGxMTe1mszWVg67VY3f3MDnqlFOJDC4\nXBT29ignk8iyjEqnI/b++2Q3N6mmUohaLb1PPIF2f7ftm5rC3t9P1/HjrL/6KvViEcfAAMGTJ9tm\naIqCSqfDOzV14KFv7e7G2v2JDphPiDt9GtRq1V39ZxRFIZut0mqBw6FHpbpTV09ptYjPzbF3+TJl\nUURjMOD9HF0ajwpaoxHP+DiefRn1+Oxs+32LpS2HHomw9+GH+I8cwfKJlt1PQqXREDx+HOfAAHKt\nhs5qRWtul0/04+MoikJua4utt95CbTCQWV2lViigMRpRZBm5XsfgclGStehtXRjcvSTVZuReGyax\njpCLolWrcAwMUE2nqeVybb0Qo5FiJMLmW2/RajYZP3uIVqVAJbxNIZ7EdXwce08X66++indmhtzm\nJtVMBq3ZTKNSwTk0RHJpicLODlqLhXIyiUavxzk0RODIEQwOxxd+Hz51TVUiRuOj1WdsNltks9W7\nfj8fBha/n+CJE+hsNnRuP3N/9xq5ZJau4V409RxyvYY1EKBRqWD0erEODFI3ehj91jcJPZUnl4sT\ntJvJzl5EqJfQmQyIPd1Er13D4HCg3/eRcvT3U0kmkRsNXKOjyLUatWwWQRQxeDzUrVY2XnuNYiSC\n1mwmMT9PYm6O0DPPtAMkWYbPaM3+R9yJ8+fPEwgEGNoPzB8FJiYm+MEPfvDIjvd1xePMYlLuJRv9\nWZAkmXC4SC5Xw2bTEwiYv5D0bjRaZG4uzsWLYTY2soDC8eNBvvOdsTtM5e6GfLpI9PIFipvr5HJV\ncmVwDQ/hDflIn38dpSVTTae5+dOf4h4ZaWuMlMvoHQ4GXnqJVqOBJRhEyuep7nuZKM0mgijiP3oU\njdFIo1RqS3v7fF8oca1clrh6Ncrubjs709dn59AhLzbbwcCsGImw/tvfdoSToM2hOPxnf3ZPqfDP\nwu26/MMgvbrK1ttvtzkdGk1bSr9SwTk8jGNggNBTTx0gtn4Wavl8m8yo1WJ0u8ltbbH97ru0ZBmD\nw8HqL36BNRRC0tpJpSrYPDYsM2dZ3aywsJikUof+QReK3KAlSZw6082QX6Rya64tUCUImPY7M+Kz\ns2Ru3QLa62kfGqYQiaI1GlBrNVQzGZKLixj3HYBj16+3HYK7u7H39ZFdW8MaDLL74YcUw2EMTifB\nU6cQ/IM0bN3oDFq6uiw4HI+WaCcIwkPd9wdFOl3h0qUwsUgejVZN/4CTo0cDd/19kCSZtbUs6+sZ\ntFoVE6N2zEIFRW6gt9vvUJNtNZtsvH+RVEVD8tY6a2+9S7MuUWu0GB72YlYKdJ06RWZlha6nnmen\nGWBzLU29VsfqtHJoxELhzR+S31hDazJRjEYZfeUVjG43tVyOZr2Oc3gYuV6nGA6jNJvobDb8hw+j\n1utpShLlRIL43FzbJykaRVCpcI+MsPP++3gPHWLiu9/F2t2Ne3T0y1ryu+LLvu+PAn/+53+O3+/n\nL//yLx/ZMZeWlvjOd77D6urqIzvm44r93+e7/kh/1QTWLwSy3OTChTC3brXbZgWh/WB88skeKhWZ\narWB2azFbn/4H9WtrRxraxlWVz/q/5+fj+P3m/n2t0fRaO6dCq1Ht9l98zVSuzFyhQYmfxc7+RI6\nYZJEvIC/2wGiiNHlopxKYevro7y/q5WKRRrlMnqbjVu/+Q1ak4l6oUCzVmv7l8Tj9L/wAt7JyS+l\nPry8nOoQWs1mLR9+uMe1q2FmJuwMDVhxuszobTYq6fSBQATate/Pi2q1wcpKms3NLHq9mtFRF/39\njs8VmBi9XnR2O6JKRfTatbazrV6PzmKhHI+z9utf4xobQ2s24x4Zuav/TDWbpV4sUs/nKUajbeVS\nRcFz6FBbnr/RQFCpaO2TWpOJMhmphUUrITWsvPV312gYXaTTNapSi+XFCN94rpcbH6wyPWbh0vuX\nCXo1mExaUBTK8Tipmzc7ip+311Mq5KlnUuy+M0+jXEZrseCdmkJjMuHs78fe14dUKqExmdh44y1U\nBjPoTW2ZcqHdtpJu2fnwp3MYggVMbhc2m46nnw7h999dc+NxR7PZ4sN315k7P0+9UESlUZPa6cJs\n1jIz47/j83NzCa5fj6Io0O1Vc+G/vY1dVcNuVaGzWgkcO4Z7ZKRjVFfKFrkyn2d5u4a5GGd5KUNv\nrw2dXBTTiQAAIABJREFUIrG9meHQIS8mt5tWC5J1AwvzO1RTSVqSRDVrJX2zyGGPta2s7PHS6j/K\nm+8nsA7ZCQV99Ha3y2uFnZ3OOdbzefYuXOiQkddefRVFllHr9QiiiFQooLPZ6Dl7FrVeT71QOFgq\n+kfcF1qtFj/5yU94++23H+lxh4aG2NnZoVarof8cejy/K/idCkZu16pisTLr65mO+I+iwNJSEkVR\n2NnJY7PpMZk09PU5mJi4u2z3/cwVCoUolxtEIu122Far1SaJNlqk0xUKhXqH+S/LTVQq8cADstlo\ntLU9VlfZ281RLUnozSbGT0+iESSis/Po5RCtYFfb60RRaJTLFMNhQs88024vbTYpJxJ4xsZQ6XQs\n//znqFQqDC4XUqlEbmMDo8tFQbGwtZVFlhV6e22EQra7pqg/b71PlptsbeUAsFh0vPnmJjQlguY6\nscYucthAqM+Ga6C/zVsRBFK1Wqeb5377NT95foqicPVqhKWlVOe9WKyEIAj09392aeGTxzPY7YSe\nfJL0rVvt7IXT2VGYTC0vo7fbacoyyfl5PNPTjHzrFfItM7FYmXB4h26DQG1jCR11BKWJ3m5Ho9cj\narVUUinKiTZXW63TYXC56Dp1inhWpstmoJRIoekboLQepiEVqWe3yCZU1AsVykUvBk2LRqlAYm0T\ni7oLk8nZOe9SLIZvepri3h5NSULYL3/ltrfJbm5Rdzqwp1KEL15k6k//tF3yy+URBQHFYCZfgUY2\nQ11tIp2qYHfocQZ6mFtMUc5X0PvbgU4+X+eDD+b5wz88e1/364vE5/muplMlbl1Zohxv3we5CpnW\nTZZnXUxPH8wcJvcSzH6wQjFfxe53oSkkEMo5KsioFTXVWpPsb96kL5PD4nWTV6mQakZ29krsrmeY\nGrAgKC12d/NMHfJSKlRpKrB2/iLR9Qjl7irxaJ1yNgelDOauLgRtjVaoF9RacoZu3vrtOoqi4DeX\niYXzOL//BEYhicHtplEud1yRsxsbncC4USqRV6kw5XK0ZJliJEIxGsXodGLt6aEpSRg+Jnf/IGvc\nkuWPjPFMJkxe7x2OwZ91jAed80HxRY3/4IMPcLvdjIyMPNL5tVptp6NmZmbmsb3+L3r871Qwchvl\nskSj8VErZaUicf16jGy2RjxeolqVOXkyiCwreL1GHA4D6XSFZlPB5TKg1d7fsgiCgNdrxGrVddRJ\nVSqB3l4bVqsOg0FNJlNlaSlJLFbCatUxMeHplG8q6TStVotqvoBao+XoK08gF7LsvPUm3adPMfbc\naeJXLiKgMPHHf0xmbQ2t2czIt79N3zPPIJVK3PrlL9Ho9ejsdlrNFoGTZ4heuoAgijgGBqjl88R3\nElzaSFMutzso1tcznDgR7PiYPAoIgoDJpKFel0kmyxSLEjMDKlQ7t1i6sAyyzLEnhug7OsngN76B\n2e8n9bF2XkvXnV0h94Nstsr2dv7Ae4VCnevXo3i9pnb24C5QFIVMpko6XcHrlQ4QcC1dXRg9Hmr5\nPKVIBEEUye/uIlerqLu6yG9v02w0yK2vE7m1x2paz6XraZzmPPPXb6BR6jz54iGyF98itbyM99Ah\nVBoNoaefxt7XB6JIJZEgevky9oEBLNl1dt9+n/xehME/DWK1aEhEM7RqFRoVVdsdVythtRtRqwRE\njQaBjznI1mo0ZZliIokpEEBptVCbzKR3ImwtbKDVWamW61g0Ina/HwWIRstsr8YQRRG9MYt3aJhS\neA+T1USrViG3l8N3zkl5t4Zar0Nr+qiLpliUkOUWavWdD6HG/sPxQf1nviy0qmWaterB95otlHrp\nQCCSWVsjurxFem2LfKaEWQgiOirc+s1vqWRzWNR1jB4PM3/yffI1FcVoma10AUVwkdgMI0oK125I\nTD97hujcIga3G0e3Gv9UHxd+8HNUag3Bfh8f/OLv0drsWKxG5EoFq9cGrSZNi5elpSzFTBGr10Vd\nVhg/PEg5sks4ukQtncQ5NITGaiezF6NeqaG0WjSqVQSNhnouh6ZaxdbXh1yrYevtxejxYOvpQWsy\nHeA+VXM58tvb1AsFzPvdZXdTzG02GoQvXSK9ukprX9vIMzlJ4MiRfxCdOfcSOntYTExMsLS0xMzM\nzBdy/K8DfqeCkdvRmNWqQ6tVdUS40ukq2WyN6WkdW1s5ZLnF/HycQMBMPt9WDw2HC7RaCm63kdOn\nu/F47uxUuNtcvb02hoedXLwYplyWMBg0mM1aTCYN+Xydy5cjxGJtZ8xMpkoyWebFFwfa/hr7WgSe\n8THcWgOxa1ex+b24hoYo7IUxu12MvfIKl/7Df6Dne9/jxL/5N6Ru3qReKpFcWmL3vfcoJRKodTo8\ndieKRkchU0DTM4Z3agiN0UglkyFXUqhUGp1zbzYVlpdTDA05Og/hRKJELFZGEAwkk+V7Xn8mU2V1\nNU0sViIYtDDUb0Ws5ugzZnHTpOq2EovZcKljzF6+jkHXzgjVS2V233+fruPHCT31FLaeHirpNEaP\nB8d9RtKfjLibTaXTDq0oCpFIkXC4SLEo7ZOJ7YyNuQ/wSSRJ5saNGKVUhlY+xaW1KAPTg/SOf3Rs\npdXCNzNDq9HoiJjZQiGMDgfJdJa8YmZ7V0JMVMmXRZLJCsM+M7FMkZmzY7QqRaqFUltnolBAZ7EQ\nn59n5l/8C/YuXODWr36FJRikUa+z+urruIeH0Vht5GcvEvQeJrdXxufpwuVR43X0Md5v4OhhPzuL\nGww9cQJ1dofrH65id1rQCRJWnZNL77yO1arFN9KPrrcLWVVEkkWKuTJGixHMRlR6PZkiSHo7NWmP\nSqlMKp3m92cmGRkfYm92kfE/+A6F7S3UUgm7w0HN4OmQcAH6+/vvCESkSoXE/Dz5fbE0x+Ag3kOH\nPtO/5jZWV9OsrbXJ04ODDgYHnXcNdu71XbgfmA0iw6MeriTzne+NFiMjwx9xPxrVKvG5OcRmk0C3\nnXymhE6USS4ukouncdj1SPkcrWiEajqFEZHN5SQ3t2qcOWsnm6lgspkoVtR8sCgxMf0Ew98Yw6KH\n7Pu/weG1IysqfC41/VP9lCQ1GlULpdng+KmjDAZbRDUyGsmMSiWQrWspJjI0NkrMbm1w+EiAwt4e\ne1dv0Pvs80iKBuv4DHuLt1BKORwT06Rfe4taU8Tv8TExPY2lu5tqMolreLgjelYuS0Q3oyz/+nWq\n6RQejxGLtW2H0PvEE23F3Y+tcTESIbW83Gn3btbrJBcWsAaD9yR2P+h9etjunS9ifKvV4sc//jGv\n7+vEPOr5JycnOx41j+P1fxnjH+tgpNVqd2aIovBApDmv18TEhJulpRSS1KTVUjh9Okg+X+2oh94W\nrtrczLOxkcVi0aLTqWk0WqyspHE6DffFtFepROx2A//2354iEikSj5fQaFRcvRpBEATW1tIHJNLL\n5QbpdAVRFGhhoNUCSyCAc2gYRZLQ6rTc/MlPyUViOHr8PPnv/h0v/vt/T71QoBAO72dAmoiiSCWT\noZxMond52F1awzF5FHtXkJ5Dh8gns5gUDZ7JSdZKZhSlXUpSq0V0OhU6nUguVyMWK5HP17l2Ldop\na5lMGs6dC9Hba7vjestliXff3SKRqBDw6NDkdtn4zRaxix+gUqsoZIoYfEGePfMchb0Wel17DS12\nIxpFolGp0qrX0e+T7j4LstwiEinsS4BrCAatmM0fZTEcDgNut5Hd3QL5fJ3t7bbAVF+fnVSq3AlQ\ncrkaDoee8XE3lUqDYjTO3vn3yEaTAOxcusaL/+qb+CfHSN+61XG7NQcCeCYnCZ45Q2Jujt0LF8jU\ndKTzdYweH5EM3NxIYTCocPtsfPOPDkMhSXa2vXs1ut0YnE4ElQq1Vkt2c5PNN99s+5SYzWTX12lV\nK5TicfQ2J5LcYiykY/TwKWJ7WcRGBU0tR+Lt9zBOTTAyOoK3P0gxHyDkz+Cw66gWS4iNCn1DHmav\n7LJ08wqTLxmJZVr0PvEE22+/hVzKEd7dwH3oEKmcTMPgZuaVF2hUKsTSTer2Hm5du0gmVsJkt+Ac\nmMTdY+XUdDdLYZFKrc29crmMdy1tJubnO11I0PZmEUSRwJEjn3mPAd57b7vz/YtGizQaTQ4dunfm\nrlKR2pkd/f3/jOntdiZHbJiMY6yvZ9HpVIyMuBgc/phLb6WCVC7TrNeZGu2h2QqiERrIcovQaDfV\nZIwm4B4apJqMs3vxKpvXbzE4EiLgGeDs8+NceGcZs16DfcDP8JgHVSUDlSqFZAb/ydNYR8axWfW8\n8k9VJFNV6nWZvok+yvPvc+XvLmBwu6lgwW9zoFQ1SC2R3dl5fG4tQquBpTcEFieJjV1Czz2Hq6+H\nnSvXScWLVG/m8IYm6Ds6icrpw+bRU1heQGezYXC0uVSy3GR2NoaSiZDPVSlkJDLpCmPjHpSbN9E7\nnajUaoxud8eBuprJ3KHa3JQk6oXCZ3aZfd1x4cIFHA4H4+PjX8jxJyYm+Nu//dsv5NhfFzzWwcgb\nb2wQj5cRRYFQyPapjPfbuF2rUqlEjh3roqfHRqFQp1Lp4ubNJOfPf0T6cjoNeDxG1tYyiGLblKvN\nK2lnO9xuA2Njn84nuT2XoijE4yV0OjXz83EKBYlCoY7JpEGSmjQaTYJuERVNaooOUaNldjZOtVyj\nsL3Dock+tNYKtXwOi9fF1tvv0JRqGG1G+p56ivClS0heLx69HrXBgNnnQ2sykY3HGf3Od4jOzrNx\neR6bz4Z9bBJVcIiGK8DyTYmNio4BsxuHy4hqp4TDYUCWW+RyVbxeE6+9toHZrGVhIUE0WmJ42IlW\nWwTcLCzECQYtdwRkmUyVcrnBYL+VoBilkUmi1qkZfOEFVn/1S+rRHUS5SmuvC7fXj6fbQ1Oq0xs0\nQ72ALRRC73QeWMNPg6IoXLsWYWEhiSy3EAQwmcp885unOnosarXIyZNBRFEgl6vicOgZG3NjNLY1\nKS5fjgDg95tJpSrEYiXGxtwU1lfIRpPIBgF1VSGbzLN16TpGm5m9Dz/sCEnVslmMbjcDL71Es15H\narRobcYxuqrYRya4slNFo9Pi0CsIUpjswnXCV64QnBwhvbJCa2CgLZoWClHY3aUcj6PSaDB6PBg9\nHkxuN76ZGSx9g+zltSzd2GVvrsTkKRGtEifxm19gdVrxjc+gcXrx+a3IOjvvXl+FJpwaFyhv3KK0\nsYos6unqCrG5WyaZLPPzX+7wzVfGOfWv/4y1y+dxaPT0PPU8P/77DWav7CKIIofPTdLVYyOVraOt\n1igks1TzeRxaF+VEDaOi8NILT1OoKKhUIg6zSHRvFZtptFOKkcplcp9U0FWUtpDa5GTHePFe+Li5\nW7OpsLKSZnj4Tq8maAfE8/MJlpZuYbF4GRpyMjHhuetnPwm1TkfXoTHU4hJ9bgVRq6Wo0WDt6mq7\nFGezyLUa5kCAws4OreQux4ccaL0DJAw58haR5KYZjVqgWa8jq00IhRS1zZukDFVqaz6muxQG/3AI\nwWxHLhXYefeXpAeGKfhDZLtOI4kOElEF7c01iqkMelULt65M4fwCO3u7SDt77NxYInj8GIVslN4T\nT5Kta9DJFoang1jdNvLhKI6gBWuol53dNGtLUaa/933e/2+/RFeu0vD7eP+9TQr1Hb79Z8/i9Pux\n9/d3MlyZZJFGeJ387EVa8SS9w0Nk8w1K2TzF1V1MPh/FWJxIRWboxBMYu0MY9caOPs1tiGp1x038\no1vfJlVXMxnUej0pSTrgd/VZeBw5Dw8idPZ55v94ZuRxvP4vY/xjHYxsbuY6/724mMRo1HDkyP1F\n4CqVSCBg6Zi85fM1Dh3yEo22A4dnngkxOelhfj5BoVDn5z9f6QgrKQpcuhQhGLRisdw7zWy16gkG\nraRSZZLJCtWqjCC0ZaudNg0D+gTxdy/QqEt4B3vQjR0lU5NpFrKktsO8cWuDI0+OcXzCRqNapV4s\nYvb78c/MkNvcoJbLoZmcZPvNNzn0ve8Ru3YNwWBm49IsNr8XR3+I8e8dYmm7wfkrWeSdHOl8klOn\numk0mmxuF8gVJA4f9vPBB7tcvx5leNjF9naefL7GE0/0ksvVKJUkIpEit79DxaJEpVhBziQoJ5Oo\ndDoalQrh9TBDnl4MxW22LrxPcW+PyOXL2HuC9D71FDqbnejSLZS1HQa6ezn7rTMUtzdoVSvoHQG6\nz5zp7LQ+C6lUhZWVdCebpSjtktvOTu7ArtnlMvLCCwMEg1ZWV9NIUpNUqorHY2RrK8fQ0EdEz2JR\nolKuU8/nDsylUgkoUpViNHpQ0ZL2jrCWzeIeHSW6cJPY+i674RKJV2/Sf+oo3vGT9DqblCKrNHN5\nnEE/Fr+f0NNPU47HMTgcbL7xBlKpROTyZfzHT9AS1bz3X37EoZefRahX2M1pefs3CzSbLXrOnGVh\nKYtFVBh8/kV28wbmV1JULq3Qc1jFzIu96DQirUadZirN1f/3B6hooegt1IRlRl55hZLWTEVW8+Mf\nL+H5n09hCg3gdTmJJGqUyzKiKJDNlrl2ZQ9UKl55ZZS8MQXVIk6XEbu9zRnQ2+14Ag48QOrmTfYu\nzRPLZmmtrRE4cuS+ZcUfFLLcQpZbd5XCmJ2NsbCQpF6XkOUaV65EUKnE++ZAGd1uQufO0SiXEbVa\n9iIR5FqN6LVrHWdlALPfTzEWoyKr2VzNYgkeorCTR+dVMBpFaqUael8XG6+9hs1hwu628eH//f9g\n9jhQ6Y1ojEbGv/kyytHDqOweVCYrXq+RosZDOtfg1de3CN/cwOYwcuKJAY6HtFTmZtGpBTRqkfzW\nBlpRR9DepM/pwnbiLLV4mOv/5b+ye22WRl1i6IXnGP2jP6ZRltmJVFmLCVTSFeTwTYwaGya/n52F\nNVSmLMr+NZk8HjLLSyy+9i5WoUxscYXk6jqT33qZSqSIXrfvw7SVYydbpph+H/sJNS6nHruvi2o8\nAorS4aWZ/Qe7kBKLi8SuXWt3yAkCZbOZnkAAve3OTOvXAYqi8JOf/IRf//rXX9gcw8PD7OzsUP/E\nb88/JHyVwUgA+CUwDpiA1r0/DpubWaamfJ9aS/60aMxg0PDkkyFGR91IUhOLRYfT2eZGBAJmbt3K\ndNxBJamJ3a6jXpfJ5+vIcrszRqUS8XpNqFQipZKEz/eRP8TRo36Wl9P09lrZ2Sng8Zjo6bFCLoYm\ns4XYrNGSm7i9ZrLrc2jSOZw2M2MvDxHbjNJIxWhpfPinp9npfZdKNovJ4yG1sozWakWdziLavZQy\nOQStgVJFxtUfopjOo602MU6fpJzaQlZbuLkYYzcu4fOZOXasi0ymSrHYli9vNhXGxjz09dk4f36X\nXK5OoVDH7TaRTFb2Cbg+NBqRYMDE5o1VUosL6FslRFHBPz1N13AvDanJxtsfgCwRvniBWj5PORZB\n1OmwDw5h8vvQ2t2sXt9i5PlzDB8+jNioYnS7sQSDiPsusZ8VPddq8gFfEmjL5mcyd7YBq1QioZCN\ntbU0hUK9s4EzmzUHVG0BNFo1zp4uYuth1FUFhHamzOZ1tJVWXa52V1S12m6BFAQQRYrhMHK5SEUw\nEc+XELQmwsubHJ+ewmPTITZs7Iky0aVFKpFdPJOTjH372+2dts9HZHcXUadH4+9j9/y7GB12mi2o\npHPc3NSiILR3kisruI+epKz4MMwMsvyff4Vcq6HS6CjXBOZm4wyOeDE3tdRurjH27Fl2r86hMhip\nFUGUykQTZWwWDd3dLvLZElNPnsVMgSu/vUhPPU/v0QBZuhCNVia6FcyNNF1np/D7TeQ2N0FRMPl8\n+A8fRhAEitEo4cuXadbrOESRWibD3oULHa0No9tNbHYWFAW9w9FWqx0cPJAVyedrpFIVBEFo8xPu\nEegHg9a7ko+LxXqHsHzb10lRYG0tzcSEG7X6/oiUgiB0sgR9fX3EFxZILi11dv2KopBL5rBMn2Vl\nJc3W1h7yWpaRY09j0TUJ9dpJrW9w690LSJUqE89Okby5jNluQlCpMNlMlHIlKtkCQu8U0UQZZWcb\nt7FGQqiytFElsh4hHU1TrdR49ccppv7P72Ku1cFgxDXgwD48iqg34p8YpVWvYrIaSV27gFQq4uzp\notlskrp5E9vFCwz9k99npyrSEgRS4TSHnjtB19gQogh9IzasLRMtSSJ67Rr+o0ehlGFoIohKrcFo\nMbJ16QaZtVt0j/Zi93vIJnIkEmXUjRaVXAF3q87iqsTzTx3FNz5CLZfD6HJhCQY70vTQ1tVJzM9/\n1KqvKJiKRbIbG/ddsnvcOA8XL17EbDYzue92/UXMr9Vq6e/vZ2Vlhenp6Qce/7DzPw7jv8pgJAM8\nB/zsfgdoNKq7OnneD9Rq8YB3CrRt4avVBocOeVlby9BstnC5jB0r9my2ynvvbVMsSthsOgIBM4WC\nBCjodGpCIRsjI27MZh3Hj3fhdOq5fDlCpdLA6TQgpLfxe410+U2oLXZqqV12zy9j6umnVoxz8Sf/\nHa3NgcZqozxqQSoWCRw7Rn5nB425LfOudXpIrG6i93gRVWoiN2bZ3khhNOvxD3Rj7+5i9laevKSl\nnK/RbDRwO/UUCrUD3bKtloLR2L4utVrEZmt3AEUiRQ4f9pPPV2k0Wuh0Kvr7HUT3Urzx6tugNdI9\n4GXMJ7H805/iP3oUg8NBNREns7YOTRmD1YJUFqnn80j5PN4jJ8k1DOhUejYSAkavl/HDD95CbTJp\nMRo1nS6g2/B6706utVh0PP10H2trGdLpKoGAmWKxfsCGXqtV0dVlJeQ5gVDNE98MY7NqCfb78U1O\nUoxEiF69it7pxD44SEtvRUZNDT3NYgy1SmSg30EuVyOXq6FWC/g9WlQGI3qHHXt3kPjVK1SSSXbe\new+zz4eo09FqNlHpdDTdfawt7JDYSNBz6hSFVJJKpUVdatEoV0AUqKtMSDtpzCYtV6/skWsYUeVi\nGCxmFLWW5asr+FUOYuvL5K5+iN2hZ+i5p9CYzdgiecKxKgmKaGoZRnucRFd3KPeBXEmRWl0lshlH\nbVjlqX/5R+RiW4TfC2NPu7G47HSdOIF7fBxaLQxOZ6dLopxI3JExapTL7axRLkejVsPR309mbQ2p\nWPzoOPsIhwucP79DPt8OFJ1OA+fO9baJ3MDQkJNIpIiiKHR1We6Z5bibfszDit3dDsCgrUWys5Mn\nFt6kp+ljayfH8IibbKrE4uU1XGPjOIc89E4IFJYXaLh0+IYGSF29hFQo0mxIWCwGNCYzs+cXESed\nbM2ukgtHmTkzim/czY0fvIHNbiK9K1IvVdHYDGxupjj+J3/CzrvvUC1WiMwu0HPmLBvXbxIYHURJ\npIgvLbeN9xDQmM3kwltU0mnMDhs+k56X/+XL1OTfZ+1mjPfeWsbhMuF3aTA7RFZ/8Qssfj/FcJjN\nt9+mUqhQlNSEzpxg7OXnsJg1DD51htTiIuVMAXm/I9FoM9MQdCiKRDwjM3Bm+FPX8ePtxh/HbV+m\nryN++MMffmFdNB/HbY+ahw1Gvq74KoOR+v6/T8XHy5NqtcjYmPuewciD1qrMZi2ViozFomVkxEky\nWaFWk9Hr1fT321ldTVMsttt1XS4Df/M3c2xu5nC5jAwPC5w+PYXVqsfvb/+gDgw46eqyks1W0elU\nFBeTpG62xdAMJh251TRTT81g9PqY/+nfI5UrGG0WBkf9LP3wh3QdP465bxCN3YXeYsQW6qMpaFAN\n9WPXGVHrdEhViWqhhNZsZmtpm+BTz4DWgKgXyEUTTEwF2YnWAIFGo/0Q9niMeL1GDAY11apMsSgx\nNeUlm61hNGpoSXW+/WIXTq+VTD7F5maKW8tx3JMzCIUEl3/2OvlhB4e61Nz6xS8Inj6NymBAUIlU\nkimMXg96mw3X6CjWvgEMvQPko2UMvSPsJWqdroUHvV9Op4HpaR83bsSoVmVUKgGbrUpv76cr2zoc\nBk6cCH7stZ5r16IUixI6nYrJSS/BoAVBsPL0v/ojVubm6PJ4MLpcpFdXydy6hWNoiNzOHhf/83/F\n3j+IaWiCkn4Ln7vttOt0GRgaclKvyVgcJrx+GxgsSGKOgZdewtLVRfjiRTRGI/7jx6nE44S3t9H3\njhBJNVDECka3l71YFa/ZQDm9Q9/EGIlYAZXBRDKSwm4P0t8vIjRlYmmJ6WNnKCxeI3JzDYPVQnwp\niVnbxDE0yNxv3qU7Xab33Dl8p88x1BtiNFNld05k/co1Jk4fIhvbwCbVeer732D5+ialUp3S1gbl\neAKv24FOp0YqlYjNzjL8e7/XMcSTJYlSNEqz0aBeKKDW68nuGy8iCAiiSHxhgUo8jtZspvvUqbb+\nzb6wG7RLLjduxMjn23/ut8ttCwsJnn22HVg++2wfmUy1cw8/7e/cYtERCtmYn09Qr6fQ6dwIQjuY\nud+sCLR38AgCequVra2tA63IuVyNcLiIRStgFsrsvPEae28oHHtiiKFQPxmpTqPRwjIQpO/J05gc\nFqqZFA2fl9zcAihN5Fod76lzOEYmWdvcoxrZpac/QEPUExzwoTVoUVkdDB7X06xV6BntJTQzTsOY\nZfBP/icSuymcpQKZ+WvoK1US+TjOUBDX4ADRuQWkuoxR26Lr+DG6jh1BFjW8/84aG2tJIjk1Hr/C\niXMjzP/2fX76H6/zrT8+gtrZFvRb/dWvEFUqRLmG22altLrAyMsvoTO31ZrLiQQaJPQGNbJZh29m\nhlip1Sk/34ZUqdDYF83T7nteaYxG1AZDWx14H6l6na771DWBx4vzcLuL5kFKNJ93/pmZGW7cuMGZ\nM2cem+v/Msc/1pyRs2d7WFvLoNG0Ge8DA4/WH8PpNHD0aIDt7Rxnz/Z0duADA3YCAQvr6+2WTodD\nz+xsnPfe20GjUdFotKhWqxiNCYaGnJ1gBECvV3cyMOrBQXLb26g0GsxdXXhqNXI7O5S38hRW5uke\nHMTqdSEXsogaLdpAH+/8f79k6/oS/SenOfzMEZIrq5h9XroHBylFI/ScOUVFXKSaK2INeNBa7Yxq\nkavxAAAgAElEQVSHXKg0BRxmKDUUvF4LQ0MOFhcThEJ2AgETigJHjvi5dSuDUajhdgqc/F+maBZz\nJOeu04wXKG4ZSGLm0gc11tdyVLJZDk246BoIsru2yfEjU+xdvMjGa6/R//zzGOx2MqurHSt6x+AQ\n5qlT5LUBaj6IJ9rBjs9nvnPx7xOHDnnx+Uzk83V0OjW1WuqBTPl6e+34fGZKuRKCXMXitHR20Vqz\nGUtXF66+Pmr5PNmNDVRaLSqtlp0bi5RKTZrhBJmmFWOugea5F/AOjCDubBAKKdTKNUyBLuRMDINq\nj/DaKjVJoiXLTP/zf045m0Wt0eAeG6PVbLK2sE1DqmJ3Owk9d5rNDy/j7g+yfXWOPinNmRemuTaX\n4Og/mcDuc1LNbqIVdVhdNop1NVg8iKLIQMiMtLxEXq1D7/HRd/oo3VOTrKX1hF/bxT+uJ7e9y/iA\nkZmZAKO9sL28Cc0mol6PKrnGoWeeZ+/SVXxeI1pVnfzuLlqzGalSIb+9jS0UopJIsPHGG6RXVzHv\na6/ktrZoms2g02H2+doicNUqCAJyvY5ULoOi0JJlmpKESq2mUpE6gcjHkUpVO+33giB0BAI/CzMz\nPlQqkcXFAhaLnqEhF6Ojrs8eCNSLReILCxR2d2lJEiafj7rLRdfICIVwmGa9TqkooVKJ9B8ZYfmD\na5TzJWrlGvF1HbpknqHv/gnBLhPx2evkNjdxjoyy/PO/w9rdg+bwFIVIlEa1jjXYRcFgJbY8h294\nkPXtIqZyCv9Iglf+2RmuXw1jNHhppcIYpAw2Ocn2doWdjTTz71xFqFc49eQAIVOV6NWr1DNpgmfP\n4tmOsvHu+6hk6D96Et+Js9yKCaQqWnR2N9nZeWp5BVVVoXfAw+5yhVJDy7GXXqAS3kMURbRmC+r/\nn7s3DZLrPO/9ft19et/37ulZevYZzAxmww4QIEACEClKlC3Tpn2vl1u+cRJ/iW8lt8qVLzeVKiWV\nOFVRua5Tjq+s8MqSbVqWLIoUJe4kCBD7NgBmX3vf971P98mHBkekSFogaYmU/1X40N3n7efMeQ/e\n8/Tz/N//X29ALrVpSxIKhQy5XE5mbQ2L349MLqfriIvFaIlU24YoigwN2ejp6fA+0mtrxG7fplku\nI2g0uPfuxTE2hsZiwTU5SfTGjU4lTSZDa7Nh7e9/oPn5vOHKlSsfq0XzaTA7O8uf//mf/8LjfF7x\nuU5G/st/+d+w3Dd2KxTGEIRDuxnX9n32/s++fhcf9fnPvlarTQSDBWKxICqVwOjoIAMDNhKJMO12\nFug8vGKxEBZLjXJZT6FQR6FosLW1Rbs9+qHff/v2EqVsia7pw4jhNa489xyleByfx4Olrw/NcB81\nhYTHbKAUj9NwuWkY1Gh1AmqrjVStwc3FAFN7xlCYbBT0aqLFLTweH4f/YIpALEY+XaBUaWF3Fhnu\nLpNxm0ik1Hi8RjKZGIVCnkBAhsWi4fbtVfbt8zLbU6OaTBJa2qEc0uPQamkmwuyEQpTSBVq5Bo9+\n6SkSoQ10PjV3r2/z5a/sQWxlyLeaSO02+UCApRs38J88ydmvf51KKkUOsE5M4BmaJrWQpFQKYjAI\nHD06hcOhe+D5+ll0hOUMu+V8+PgkuHI4QOLWLRrlMoJW21k476sovns+9ZpIq9VGLgikVlcRKxXa\nyBBFCSWQj6aoZvNYj81g8Tgox+NIQC2ToVFKsvr664i1GjK3G6ndZuO11xh94gnyOztsvf46OoeD\nua9+ka1QDZXDTXY7gGtqkmyxybE//vektoNYdDJ+/98fpt5SIG9WSBaHiWUlTp3x0JYpufd2jIe+\nOIujneSNV8OIGguBS+vsP3uQvLabUD7PzlYC71AVnbxGuShxYEBH4uoFTFot1uFhdDYbvfPT1CNb\nDMyPE7hwgWIuh9poJL2ygt7tphAKkVpeJvjOOzSrVeSCwM4bb+yaMeqLRTwzM5h6elCoVFiHh8lv\nb9OsVtFYLB3lWrt9t9qg1SrR65WUSu+3ADCb1T/XLuHDoNOpOHDAx9SUC7lc9kC7aACazRaxxRUW\nn32WyLVr0G5jGxlh4qmnUPf303/qFOm1NRqaNNZpO410kuC1W1j1RioqPSqNEo/fjbO6QfbyKmKt\nhlyppFKqofX4qK0u03vkCAqtlkalhmlojOvnInhH+nD0utnjV1EK7KAJ3sQzNsHY7+zl9k/eBlsd\nr1kkv7PD5Vd3ULu66JudoBCL8c6rd/D+3lEMXV6MfX0kohnGf/O32fu7/5ZGoUhZsHBjuUwkVeD6\n7RRTMz5MXjeZnTCBepSeOSulSBiZOEby7l00Rj35VB4NKtpmL2aHGZtJidpsphgKdVSeKxVUJhN6\nnYIDe/toqs0IGi1utx6lUkH5XSfg+5LyrXqdyNWraKxWjB4PrslJdA4H1XQaQaPB4PXuVk4eBJ8n\nzsMnadF80vizs7PcvHmTvo/hffUvGf+zHv95SUY+tCb79a9//SMH/Owf/Ele12oiL764hiSB291D\ntdrkzp0ESqWCo0d7OHzYwqVLYdptCZnMAhRQKjtun7kcjI7aMBpVH/j+hRtBzv3wHvl0EeoV+txy\n3HIlNUlLIlHGPKBidHqG3PY2ocuXKSZSeOfmkIfCjB/eS6PRZnNhnWYkjVMs07VvH3dvJbFrzaRi\neWR3F6iks7j37MFs0XP5h2/T1efGNX+MdK7EwkKca9diNJttdLoAU5MubAYrRkmAaonkzWvoNRrs\nXjeVZBK1yUS3y0UkW+HOrRvYR0eZHPPz6stryNU6VEYjE3122NnB2t9Po1Ijc+cukUSC+sgI41/9\nKiNDQ5h7ewE47TZSrfai0Qi7ZOOPOz8fB41Kher9nrTWbn/fwldJpwldvLi7cIrVKuHLl9GYzRjc\nbrLZKrdvx2k0RIxoSd+4iiBrUkvGkAta7BMjJGotVDo1ap2KViLEyg++D3R2lxQjUQZOP0roynW0\ndhuGri6QKToaIpub3HrmGdqiSCEUwr24jvnUb5IIplh+8XV6Zie5eS9PrVCgx+9kfs7E63/9Peq1\nJjaHgarKwVrRQl2m4atPTRIVSixfWuL0lyZxDvRSrrZRhrIo5G3WVtPUSg3OPtKHVZ1CdLbROXSo\nXSasAzkSd+4QiEYpxmLM/Lt/h9RqYR0cJHrjRsf9N58nFwgwcPo0sZUNJL2dSl2imU4jViqI1Sqh\nixexDgygMhgQdDq233wTrdVKIRwmtbJCORZD0GjoO3ECz/T0bgVKqVQwNeWmWAzuiu8ZjSomJ12f\nmAMGPLDxpSRJrK2lCW4mibz0Mql7cVyeHmqRHdJLS4SvXsU6MIBzfBxzTw/ucoM3X7hBejvSWZlq\nBYb6XEztG6RVKVBLRIlGkqy9/CqCSolrYhz3kB/13gkKgRBGjwur34+528X0jBKZVk/uxnne+vvn\n0Chl6A0qRh85ztTjjzCiCVPKxihtVWlZHqWQzuP2dpNZXkSSwDs1iaS3M/nkl9h86zyXX7xIS1Lg\nPzRD78On+e63r+NyGRjdP46iWSO8GsTqtpNYXsPUY6ScyWC06HA7VFRjEWILd/DumyN2b4WKVCVd\nUTJ3cqbTO5OkjkGkILD1yitoLBbMvb3oPR48x47tJo61TOYD3jZirUYlkcDo8SCTyTB6vb/y2iOf\npEXzadDV1YVMJiMSieDz+X7+gH9l+CyTEQH4CTANvAT8z8CVT/OFH7dXVSzWd3+tFQp11tYy96Xk\nW8jlMvbudXPmzACpVAVB6Ci6rq5mUCrljI0pOHXqp7EaDZFUqkKl0uTOtQ3KmSwtUUZmK4hW7qLo\nGuXahefQu13U/BpOnn4M4+ICglaHvd2mnM5x9W+eZfzMSfpGu9hZ6ehAWDwO6vI6Rx4eIZvM4+l1\nUonHaJZLhBNNfvTsJQx6gXqtjqHdWXR1OhVGowqVSs6JI172DqpBlMhXROrRIrquHtRqgXv/8A/E\nbt1CJpdj7O7G3D+I8/AslXSKiUOzrKxYcfd5mTvQR+XaKplsm6EvPkk9n8c5O4dcBj375rAPDWHq\n7t69FgqF/H3CZP9S8/VhY8rJJIHz56mm00iShEKjwTE6SrNcxtTdTbvZ/ODCWa1STiRQWWxcevMi\nFoMdtdaAzN6F1j+CUdPGFQzTRIFMUCCTy+ieHGZ0by9r3/or7v7t3zJw+jSBCxcw9/TQajQx9/dR\n0+sRK1WSq6s4hoc7qrPVOrRETN3dlAI79EtJ7L3DvJPM48pkMJv17KxGmZ3zceuF1zE5LEwc9bO9\nHCaZjvHQ8XFurDd4/eU1jjz6ENfevEulKvHoH/8bmtUawwvbqI1G8gEZbnOC1MJ1AuEguXCUqROz\nTI48xuL587S7u0n9+McMfuEL1PJ5NBYLxXCY3lOnqYSDFCNhBk6fpm7u5eLrK9SaKUo7MvbO7Ee6\n8wYKtZp2u41Yq7EdCHTaM/U69XyenXPnMHV14ZycBElCrFZpNztJhyRJ1HI5uuxyHntskHC4hFwu\nw+s1PHBb5tPeP4FAngsXgjj1TWIbIaIbUeo+B/4uH6LYJtGUqIs/TYqEdp0eQwnHgXEa4Q3kjTIm\nnYjZZaUQqdKSZDREibbBwfrCMq7xUeQKObFMgXYiTvT6NXQOB6NPPonPbMHY7eb5/+82OiUIggQK\ngci9ZUaPztKWK4kWlURjNfwjLdp2E82WjHqhQL1YpFku4f/vTlHZWqBUbuIZGySfKpAJZ2je3UGw\nOvH26ej2qNl/sJtoKEPPoBWbaQ8To33IMiFOnt1D+u2XMHvdRBZX2HfoCKahPZRqMrB6qJocNKWO\n+J/SYCB8+TKNYhFTTw/JahUpEiGzsUHX/Hzn+mi1u95X7yU1Kz5CbfdX1Zvmk7ZoPml8mUzG7Ows\n586d47d/+7c/9vhPG/+zHv9ZJiMi8OgvMkA2W6Xdlj6SEKfVKtFoFNRqItFokXK5k5jY7Try+TrX\nrkV47LEhPB4jjUaLkRE7TqcelUqBTlem1eoY41UqDe7dS7C+nmFrK8va3QgT4704tCIUUzTVZgrR\nIntOHSV4b503/vr7uExfQR1ZI3r7FmKlSqOQp9kEtdmMf2YK98wMWoMeWavB1sY6Bm+VdGwDxcQo\nGrWBO997kVuXA3T12vF3axnf14/GI2fI0aRUKDA/JHD8oW70hQDxV64iGIw4xsZQymuUigViV+6x\n8vzzKNRq9E4n5VgMZDJ8M/MoGiryWxtMjVnZ//AABnkZYe8hDPuNhNMN8I4hdIHTY8I/2/1zZbt/\nUZAkifjCApVkZyGt5fOklpcpRSJYBwbIbm5iGxr6gFDTu2PXXnuTxNI6a2UT2RJkIwlc3XYeeXSQ\n6d/zEL1+HUkmZ+7kaSwjo7SyMWrFIiNf+hJd+/ej93ZRiETxzM5QjIS5c/ESLaUapVaNwdtFo1JB\nb7N2iJIWMyiUSJUCNpsOl13D8js36d2/D5fXhN2hp/vYFFIhSWX1DjaNEeNML7VYgIluD/19Nmzm\nBrbHxzG77chUTcRMkqkTs2yvxjh+zMrtH9xBIVaR6mX84z143TrCly6isViQORyM/S//K6Ebd7j4\n7I/xToyj1Klx9veh0GjQud2k01We/6tnia11KmAGr5cr7+xwZHov9dXr6Oz2Tgmz3e6oACuVVLNZ\npFaLajaLqbcXuUKB1G7TqFSo5fNEr1/v2NjLZJj9fsZnZ3/pvjWBQJ5ms01LocXS00V8eZVGo0nD\nPER4O4G9bWBho0ZNm2Zw0Ear2SRz/R2qySRTB0fIh0IYvV5Sy8tsX7iETK0jvrpJ36lTNBsili43\nqcV71FQqihubNMsl5EqB6MJtnHv2IvjcHPrqo8jVGuIr68RXt5Ar5Bg9HsrlOsaCHElTxCA0mHto\nnK1NCe/UHmzKCqOzg2hqKWKpLHfevoN3YoiqICewHKNHtc6eI4/Q54btYJmqqMBgtzE65kTelWbA\nnCdfSbL2zH+lEAww8/u/i6TUE1oNImqtSL49FLMabEqB+cMTZNq1TjJZr2Pp70djNlO6n2wUo1HE\nRoP06iqpxUVyOzsYu7pQ6vXUMhm0dvuvfCXkZ/Gd73yHp59++pcac3Z2lrW1tV9qzM8LPi9tmn8R\nvJuNVSoNbtyIsrOTp1JpotUq8fvN6PUq+vutu4JOBoOKyUk3ly4FKZUayGTg91vYs8dJPF6iVGpT\nLjdRqQRsNh0+n+m+ZHwLm82CTieg1QrEYiWWl9P87d/ewenQcfVSkEvnt/hv/vtDHHr8AJnNHVIr\nW9Css2fERMJnJ5Fq4DdaKewEaCOnVigxcPIY7WqJrTfeIr68jrxVwzY8QjEUptXtY+zUMVRakXS9\nyaGvnsXtX0TdKuEc6qews0Xy3l0ePXiQaFpLz5CX2Ms/4N5rL9Os1dGYjAyePoPJ56WWTVNJJmnV\naigEAbFSQWUwoBCUjI0Nk9jYpn96Ao3VhtJgwtTdzdtvbhDfKoJShbJcQyaTka8UGJ8QEYQHJ5R+\n2Hx90jHNavV9WwYrySStep1yIoFteBip1aJRLqPU62mWSrvHae5LYidXVtHofVy+HaMuqcklRcrU\neOXHyxwbbaMyGHDPzKCQiVDKUEkmyW5u0iyVCF69hkKlwdTXy/VvfJPRLz1Buy2RD0cRlALdRw4T\nvHQVlc1JIRggHwgiU8gZOnOG6FaUuTOHWb+xiNXUYv6pYfrnRrn9zH8lux0kn6sS3YnjHR/ikT/9\nD2y9eY7QC2sUTCpMPT3oLPtpygTSy6us/f23aYsiE089hVuRxdpvpmnx0kgnqG0tIRw+xNDZs2yd\nO0+k0mblJ69iG/RTyJUI3w5wyKjDOzlBNZUgk6pSKnQM1wqhECqzGUN3H5LTSL/P1PE6SqVwmUzI\nFQoa9XrnWsrlnZ0196+vQq1GZTQSu3mTzPr67nVP3r2LUqPBOzf3sef9590LD4JcqUXvkaOUkhms\nZiWBnTQqjYaB2YNshUvcXV3iyJEe+i1VWvU64StXCF+9in10FIVSSSXVsZdo1YtItTKpOwsMH5hH\nIcjIbW8jaLVU0ymktkRmbR3H8DDF7Q1alQIL3/42MqWKid98mlIkTM/sFLmdLSJ3V5FV6oxP99Es\nF9G1KowcG0Kv97L2o+eJ/NN5sgYNrokpBo/MEri3hbPLicPWR9eUH+eUjds3gkSycuT1IoN9VmTN\nCl02C5FLb6I16uh7+ATlZILUyhq+qTGsQ0NUDT7aOhs2pRyzAarxKDqnE7XRSL9MRjkaBcCh0YAk\nYfR6Sd671+HaSBJyQSC5tIR3dhbP7CzW/v5d1+BPO0+fB85DvV7n7//+77l69eovNf7s7CzPPvvs\nJx7/aeN/luN/5ZORdLpCItGRjHe79VgsWpaWUiwupqjXRZaXU+TzdebmvPT0dMiqjzzSvyuoND7u\nwGxW43DoEEWJZrPNzZtRnE49fr8Zna7Tl/Z6DYRC2l1lyHa7zcCAFZtNRyCQ5+rVMGaTEo9TzaNn\nRwkHM/T1GjBV11h640coBAGFRkNwaZXRLz5GWVLinpqka/8+UotLKI1GfPv2k1q8h9ZmJXblIgq1\nGrFWY+jMabav3MQxKyDKlPSO9SHI2piePEN6O4Qg1WgLavRGkY2/+X+xjY6iMEwTePUnNCsVavkC\n+e0tlFot47/+a4jVjty1ymikWamgdTgQtFoc42O0JBl9hw+gdPYSTEuUEgIjljoyQcXqVolaTcRg\n6HjE9PdbHrhv/3HxUa6w74WgUqHU6ajnOyJY7wotqQwGJEmi1WhQTaXoOXaMUjTaUUN1OHCMjRG/\nfRuL3cR2SsnqappcpozBpKWQLuJ396KxWEhfvk01k8E+MoJcLid06RIyi4dybodMOINeK8czOUG+\nVmfxhZcY/+IZ7MM5lDo9xVSWwTOnadVKNHJpTF43vn3z1IolSskY7tk5HHYVG+cvEboUxmiQI9Wr\n5PM1jAaBqs2AVquilY6RXrpHZnmRXLuBweNBQMQxOY1teJjQm69i7vKQDwQwmFSUwmEK68uUMjmK\nSPQeO0q9UECU5IiZLJVMZ4eYaY+FXCpPcCnA5BNn2QwGMPu86OwRBI0GsVajmk5jHx7Gf2Qf2vg9\nkvfuYRsZwTk+TjEaRWOxIFcqce/d23GLVSiQ5ArUPj/ZfIPY2jbCewwKAbJbW7j27kUh/PKWnr4+\nC+vrHWHDjMrBsT/6t5S215EM21gHBnjpxWW2dvKMzY+QiempLq5j7O6l9/hxEnfvIpPLaZRKiI0G\npp5uUlsh3HvGaDfrWD1OCrEI7qkpUktL1NJpTD3dtOoKNFYr2a1N5IICqS1RDAZZff6HHPqTP6Ge\nyxK8co2KqKd3fJCVHz4PbRHB5sHdbtMoJhEKMeqlHC2ti0IowNjRk9RrLWLrAQxuF0b/IDa3lf7h\nJsbbNwhubJKMKune38d2LIJJ2SK1E0HndDD6G79Du1FHqZBI1zU0JCM7oTLXL+9gNws4WxHmxvQ4\nHBp0djuWoWHS+RaNlgyDSYOpu4edt97crTCq7m/nlclkuKenH0jy/1cJP/rRj5iYmPjUD+aPi5mZ\nGf70T//0lxrz84IHXRGO0REpWwQeBvYBN4HXfjGn9WDY2clx4UJwl/ehVBZ4/PF9uzLyhUJHYfTd\nY4eGrIBEKJTHbtdhNmtQKhX4fCbqdZFvfesW6+s5bDYtuVwdh0O3682iVgscPtxDLlejVmsSiQTx\n+YyIYgutVkm/34TVIGNlKcHQoIWHvzqAVwyw+eLzmIUakXAehVKJq8tNZmOd8TMnidy8wcRTv4mg\nUSMXBHKBIJLGRKNawzE8gChKNFpywk0lC+9sc2rvEeqlAjqHlVo8RvbKOQSNFp3VhF7e4Nbf/S1y\nhQzD/ZJyNZVCYzYjiSKSBPlogrYEMqUKncPJyJe+RPjqNSSZDNfUXtzHThGqgMfo58Uf7rC6WUKh\nkHHqVD99fWb0+o4QXK0mYrPpGBtzfCqxqQ/rLcZiJRYXE2QyNZzOjinbex2E3ztGLgi4Jiep5XKI\n1Spam42WKGIbGiJ67RqVVArb0BAKpZKeI0fI5+uoVHI0KjlIEo1yCUFnpJQt0mqImB1ejhzrRZdY\nZPviGum33kCs1XCOjzP/R39EOFQgtJlBTBZIpevULHr89QamoRHSWwFS1Ro6UaS4toqgj6BUqbCP\njCEXVKh0WjRmE5VkCqPJQLuQ5uJffhNDdw+JopzuaJx6rc74sVkqiSjWbi8FnZF6No3QLKHTqVAb\nbVQyWSI3bmDs7cO5Zw/9J46js9tQG434Dh5k+bkfUslkkavUWIZHUegtJNa3oN+PQybgGhmg1ZbR\nbtRQG02o9ToquSLmgWGSdxfoG/WxtRRCoVIh6HTYbVo01SRam42+48dpFIvcu3IFbaGA1Grh3beP\nkS9/GZlCQb1YJlmUsZqSI19Ikd/MYRCadHebdu8TuSB8aoGyf+7++TD09Jg4erSHxcWOx5FC1kZS\nallZzzHilqPQtXj0sJPM1g2yF9eRGyU0HjuSJOEYG0OSK5Cr1DQSabKBKFqXF5nFRv+YH6xOlCIY\nzVqyyHCVqrSbDZwjQ+hcLlqNBkqdnpHHv4hcJVAt1cFgJXhjhWpNZOLEXm49+13Wz11EY9BhPKBl\nxKwmencLlVZDU6tF6/ZSaOlpRcvop49w8PhxzDoJZCLZ5Xukb29w8R9fZmBqkJH9Y6y//gpqrwWt\nUUs+VyVTTCBcu0k2XWJg/yQlVKQqDWqVJhMTLu6ev0P3pI10Jo8sE6I9ICIMzRMqlckVEhgaVpTR\nKq2fMckDaLdaH2iBftJ5+qTH/yLGP/PMM/zBH/zBLz3+8PAwWq2WbDaL1frJpCw+D9fvF8UZ+d+B\nk4ACeAM4TkfG/T8Bc8Cffeyo/wJoNlvcvh1/33bBUqnBxkYWpVJOq9Umn68Ti3UIcz09JrRagatX\no7zyyiY2m5Z9+7zMzXXh85lIJis4nXoGB+0kkxXK5cb98UUMBhUbGxm2tnLUai2USjmRSIALF0pM\nT7uZmnJitWr5/rMLOOxqVi/eJrGq5zef6EWqValGgzhMZrL5CjqNgMNvpbR8k3Y6jM7uIHzjFtVc\nDsfQEPHVdfoPzFBHg9qkIZ6oQCpPSwKUaoZnhlj//j8SeOcdpDa0RJHJp76KQqmgUSphdLuoZDId\nQzqrFYVSiVwQqDXaGJVKNA43t37wY4aOHKD3+Anc+w9h9HqRWxz8zT9sUKHBFx7vJp5uotMpUSrl\n3LvXMRA8dqx3V55doZDRbv9cBf9dSJJEIlGmXG6i1QofqaJ67tw2uVwngcxkqqTTVU6fHvhI6XBr\nfz+CRkMxEsE1NUWr0WDn7bcpJxLoXS7sIyOE18NcvF0gnW8hVkr4zCJ+p5rc1haqAStTM10Igoy9\nE3Z8pjzRe2uoPQa0PYOks3UCKYlJmZYWCmRqDRqbFSmSoioqqCtNNBtFrH09YPUQCm/h8A5i1EmE\nLpzraFl0ddGq17n5139Nbnsb/6On6Tp4CP/cHlqNBr4hJyargVSrSTmZYu2ty+gNasxHDiGXy6hn\nU+itZiK373R2/TgsBC9dRmsyYe7rJXnnDjtvn8c6PIRtYJDp3/s9coks7VaLRChGZKdAuW7FZdDi\nPvIwS29epsfhYLTbwuSJvRQjEYy9fVidFg73WnE5NCTTDfomB/Boq0ReeR7/yZPQbnck3+8b/LVb\nLeqZDIYjR9CYzWxv57h2fZNWS8JoVGEdGCRw5RoWiwajUY1MocAxOrqr6vpxUak0iMfL1OstbDYN\n0kc8BAuFOhsbGaLRImq1cF/csMH4uAOXS09te4XqSowTT+xDbnFRa2ZZev4cdRGUkhOFrkq7lMZq\ntxO/d49iIs3EU0/RbMsJ31lC5ekhkZcz0DPCq//5W7hcetyz86QFD6NP/yH2LgeCSomSOhqLheXv\nfY/IzVvI1Fr6T55CJghk8y0C6zmGH5ZQiFXMdiNKnQ6jSU0znepU9poNlCYzK3dCFCowZuIQHbsA\nACAASURBVOtifXGFxWqNwwfc5K++jv/M46jEEvO/9STBYImWxoTGbEGQt8jHEqy+eZXxEweQ1Sv0\nDPvIikbevhRjcatKtdZmeMTJmV+bJ3/zAue+/QKHHxqiqVCjyF5GLbZoZsto5RLZnAGbzU3zPWJm\nAJa+PoSPIK7+qiKZTHL+/Hm+853v/NJjy+VyhoaGuH79Oo8++gulVH7u8CDJyJPAXkAFxIFuIA/8\nX8BlPqNkpFxuUiy+X0hJrXYQj5cZHXVw40aUUqkjBS6KbUZH7bz1VoArV0IYjRqy2RqJRBmFQoFG\nI1Crifh8Zq5cCRMIdMr+a2sZNBoFg4M2XnxxnVyuSjhcYns7yyOPDFCvF6hWmyiVci69E6CFDKXU\nZHMlzJGTe1hfTzEwuYfotSsYFQocNiMms5qeqRFygRBdx79C4OJlln/yGpIEtv5+DHYbhXQRU28v\nxUSa4YePIhls/MZ//D3MLgPlwDabr73ekeHO53CO72HlhR8x9dtPY/APkU6VyK5E8J98hKHHH6cY\nCqHQGdB219nz61/l3isX6TpwGL2/H53PRWEzQrWi4bVLBW6tNRgYcRGMdgzqHA4tExMuajWRcLiA\nViuQy/3UF0aSHuwXbrstcfNmlHv3ktRqIiqVgpERGwcO9Hzg2HcTkXfxbhvu3WTkwzLu924jzAcC\nVDMZXBMTHQVQs5vXLmVZWgtgNKoRiglubC7zxaeP0DU/j76p4uwTE6iqae69coGBExMUtjfR4CVe\nUdNWCEgqHZFoiaETR1C//QZiTUerVqPckCPqHWjUKgxj07z12hrbV5cYO74fD1GErUWQ2ij1OjJr\nazQqFRRGC1JbInzjNuqufm69chWbt4HSaMZ//CEK0QRqs5muqVE843uoVWq4JyaJ3byB1Gqh1qjw\nzsxSiEZJb6yjs5hZ/O53aZQriI0GYqVC7NZtXAePUogmyOcqjB6d48qFdc6tbzEw0cvM7zyNfbCX\nQKhCWSbHrKyTunkN58wcckHAaFRhcDoQq1WSS+sIajVqk4l2s4nB49n1IpErFNQKBcrxOGqTiXi8\ntOu+Wyw20Dn89D+kRt1KY3AYsI+MdAjFnwD5fI23394hGi0hSaDVCszPd33guFpN5Pz5AKFQgUKh\nzvJyCqdTx8GD3aytBRgasjE/4sRg1JC5e4uqY4TK0ha5nR2G5sagDTWFCZ0Eiv5pGrI+hse6sdrV\naG12hh4+Rl2hZzsO4XwZa08XktbIW+ejiOUi4jEb2e0aoe0Q//F/PEjkhR8TvnEbuVxGGznldIbs\nxiaOiQlSoQjFZAbX2CiFzXUMXhdSPEas0cD/8HFufevb6PpHKFXrOPw9yMwugj98kVK2hEkYx12u\noFbLsYyM8uqzC4S204CErirHKZegJaK3mpCqRcxdHkLRApeDO7z0/F1kBhtNmYr1rQL79lqRNatM\nnNjHwNFxdE4nl7/7E5RaLU2lhY3QNfpqNfq+fBKdRkExHAaZDHNvL86JCcR6nWo2i0wuR2e3fyDZ\n/FXjjHz/+9/nd3/3dzEajT//4F9A/NHRUS5duvSJk5HP+vr9IjkjDTo7X0Rgg04iAlDlAcztflHQ\n65UYjeoP+JYYjWq8Xj0zMx7W1zP4fCZMJhUKhZxAII9G0yGdQmfBjMdLpNMV/H4LwWBgNxGBjkLr\nzZtRWi2Jl1/eoNVq02p13l9cTHLwoI9aTby/8DWQA1qdEptVR6VUJ5tsoB4w4j/5MNVMFrlGw+hj\nZ2m25ASv3aTelNi4voJ9fIJGvUEqWabr+EmMehVmlw2dw46EjLU33yF64U1WggEGTxzrKIWq1Zj6\n+mmUyx0vmz/6b1F3D2LUZGnLBN7+xzd45I+ewjU5RaMlQ6XTEF8PgEqFaHQRKqpQWQbZUZu5dilK\nPF7B53fichtJpcq7lYuOk68Fq1VDs9nercharRrs9gfbFZFIlLh7N/E+M8KlpRQ+n4m+Pss/O1aS\n3m8v/8HPO1tHJUlCa7XSajZ3d9cIrm7WN6ucf22NqihDarcxqkRcejOLN7exzhjQa7UM+Fzc+uEd\ndPI68rbI8L49xONFVAYtwWgVj9WAyaojW1fR88jjFHe26D10AIXZSbMlobfb+btvnKOQyCI3mNm+\nuch2PsmjDw2TuX4BvdNJ8MJFvPP7yMXSVGsipWIdszpLCxmbt9YppPI88T88Tf/YKG1kFGMxNt66\ngHV6HyO//huozRYMPRtY+gcopNOdB1s0hsagR6FSodboUZktNCpVFAoFSpmIXGpiHxoi29DiH/Ji\n7/aQKKsQ3UPcDbdYe+suI/snOHNygpp7ksubJQqVFl2uHoYkFbJsBI3JhM5uxzk2RjmVIr+zs3vd\ny4kE5VQKS18fhUgEnWngfXMTTzUwGr3MP3YEh6PDL2i3WpSTSZCkjvfNA3JHNjezRCI/JSFXqyIL\nC3G6u42YTJr33GtlIpHOr/dcroootgkGC0xMNFCpFASDeWZmhmmLItlIknKsSv+Am3rMh82mIpst\n0DbZWNlukHHWCCdVXLt+lfEBHebkAjqvF938I6yERVq1Nn1HH0Vv1LDz2jL2njlEk4lzL6yg1qjY\nWgzSkAT6Tp1CJjZoyVSIChWRpXWkPSeYe/JRlNUMereH2T/8Q2K3bgFg6unF1DeA76GHUTncMKRC\nVJtZuLxOWy7QarURW50kvFkusxOXU8lkcTs1ZMMx+uZGqEZDqIUySrWSrrkZmpKcukzH+nK8Y9xo\nBbEpISEnk28wNdlLcuEW6dV1Apeu4PA6aCn1xAMVNBqB1OYOtJr0HT9OvVAA6Oy2SSQIX7pEJZ1G\nJpdj6u7Gd/AgasMnV13+LFGpVPjGN77BxYsXP7NzOHToEM8888xnFv+zwoOsBHVAB1TotGXehYXP\nMBlRKhVMT7splRrv44xMTo7QaLSpVpv091vvE1Cl+667OpLJCuFwAY1GidGoum++J8fnM2Iyqe67\n27bv63QoyGY7rZ5Cod7hXeTrZDJVjh0zIAgKTCYF6XQFg0lLNJTBpDYhtiCXyjP9G0dIvPodxEYT\n/6lTqOwuZBod5WIbhcVJIlqgkMySjSbpmd/LhYtRjig1TB0cRmPQkbyzQHYniGJ4CGO7zvJzz2Gw\nmfDs28+d7z1Hv9NFo97E0NtPVVSg6J+i1VhGbTZj0Bt551KYPeMOlK5u7kbbeAe9lGUp7uwUEYxG\nbAWRUklEFNt0dRloNts4nQ10Oiebm3nqdRG328DYmAO3W0+xWEevV6JUKpid9fyzrqvvRT7/frM6\n6CQYq6sb9PXNv+/9d/1z3oXRqHqfH8Z7+5GNcpnojRvkAwGQJAxeL86JCdRWK81SiUxFIJcsIlfK\noSUhSRLJWA7nHgf9Y07aYobt7W0GlUrmHpogfusm5eXreKenaepTFAJ5hme8DE35uXk9wve/dR69\nUcPcyRkspjb7D0gYlTUWFzu+K2qbilS4jqRoIpbryMxOVAYj1VKFpthC0BnIxVcw+odYur7GVx4/\nS13tILG8jGd8lJbeSb2YxepzUYuG0I8PYDMqqGVzDJw+i9Jxi+TSCjtLEbRqGa7hAdQWC7ViGc/8\nPJn1TVrNOr59+9HYHVSDGXRaEy/81U+wDznZc/wkN95IUrwcxemxUBUsJLcClE9P8NLby7z63A1K\nlTYqlYInf2MvXz07SmttAfvICHqXC4VaTcpsJpxIoK9UyG5sYB8ZoVmrUQiFMA4r8bqtROMdjxm5\nXEZ3twmrVdfRXCkUCF+5QjESAUDvduM7ePCB7qF4vPyB97LZKOVy324yIkkSzWaLRkMkm60Tj3eI\n7SZTx4VbpepoBdUrDVQGA5a+PhLLCRQeK2OjVjZuLtNuSpTlTTR2H+tbZSSgEovw+q0kv/b0PIvh\nOqtffwHT+DTb0QbpPiNnvzhE25Sl1KoSuF0lGsqi1WuoN32sL2zTzsbpHnQTDwSoVtuM9gxRSJWJ\n7mywd64bhclGKRyi+8hRKnodfX4/5/7zN0ktL9N34mHCjS7SpSwiSjRWO5JcxdhcP0bRRDlfoooL\ny8AgUqWAWq9hNQLdg4NMzRzHtx3E2u9n5+4qgqTG5jR2ZA5qZby9fVQlFaMjNkyZIHWbiWKhhqmv\nl50b9xg9c5ql+CZSVaTPpsVsUiGTydCYOyrIbVEkev06pVjsp3OysYHGbKZr374P/T/7IPgsOQ/P\nPPMMp0+fZugTVvA+bXyA3t5eLl26hPQz5O9fVvzPM2fkBPBubf69yYcA/P7HjvgviL4+CwaDimSy\nglwuo9FI4/EYqddFdDoliURl13xrcNCCw6Gj3W5TqYhUKiI2W+fXvcOhQxAUTE97CAYLVKsiWq3A\nwkIcuVyGTCYjHi/R1WVCrVZQKjWw2XQ0GiL9/dYOIdah4+QXJohGckw8fICpITWGegxhYBDXnnGa\n1To777xDu1LB89AjDD3+BNGtCM5eD8FrN6mgw9erwe3SYfJ4OPe1r1GMRMiHYxgPHuDQrz2J/+gh\nqrk8PUeOsfLjl2k3mzhGRvA9+kWCJT3BjIB79jgyQUk0UqLVbKJ091JuaYikCtxbzxAOl3A4DIx0\nmbh9O8bDD/dz5EgPjUaLTKbK2toGCoWcL3xhCIVCRihUYH09QzRaQq2Ws3evh7173bvE3geBTqdE\noZC9r8Ihk7G7U+m9OHy4h4WFOJVKE6NRxcyMB5vtwyswycVFUktLu6+zGxvIFQr8x4+TuHOHWFii\nKbbYe3iMi68vIbU6CcHQWBf6WoiVV16A/n7yKhW1fB6FXEb81i2SKxtM/PF/QD6uQd6skCrX+cHf\nvEKj3kSQS4QXNyi67ExPOoisXsXoP4Bj0E8huYVvbBAqeVoGAZPdjPnIURRaPYNnz5IJRuk9epRG\nW8HoaR/3lrMsvLWM2awjv1OlK5bFLGUR+vcyNTnNlee+z+ZPXkSSwD4+jm1kDLlGS9dwD75jx8Hk\nJK1Usf8//R9UV2/SajTQ+fx4p8ZZOneDnet3sM+IuPvclKtVQoubjIwN47LIWF+JkAhmmRvtIpko\n88bLK+QrMur5EnWViheeW+HhR8eYPHMGo8eDXBDQ2e30nzxJ+fJl5OEwvceOoXM6dytR5e1VDp46\nS6bqoljsEMB9PuPurqj4nTtkNzd35yu/s/PAfAOnU/e+qiVwX+9HST4YJLW8TKNUQj0wRSZdYXUt\nS6FQJ52u0NVlpKfHzM5ODqtVg9mmp+ZwYLXHMdhqtCUZBl8Pmq0kGoWAdWyESE4gGU6jVUM10/HH\nMvcPErl0nkapglbo8C2q9RaFZBarskx0J4LbPojZbkKpkFjbLDHxpbOs/uCfyG1somhD7+w+DEOT\nbG6XGe81Ezr/Nkuvvo13oIu+2XFawxME8hrcZ34d2+g9arEwB4762choSexEwO9jen8fXSaRfFBF\n3/wUlZ02qytJvEM9GEw6SrEoLUSauTQqalh7vMSieUpbAQ4dnCBfaBJPlNEZ1Az5XYz1KLn94yus\nXbhGqVTD3e2g58B+qpUG3X47+obI1OExjK73O2/XCgWq6fQH5iq3s4N3bq6z5ftXCJVKha997Wt8\n85vf/EzPw+l0olar2draYmBg4OcP+FeCB0lGah/xfur+v0+D/xuYB24Af/IgAxoNkVKpgVarRKtV\nYrfr3qPk2DHLUqsF9u/3celSiFyuhkrVqX7s2ePA6dSztJRCqxUYH3fQ3W3c1R3x+Uzs3+/j/PkA\n8XgJpVLO9LSH9fU0J074WVxM4HLpmZvzcvz4JLlcjdFRB3I5pKI5VNSYm3bj9JjoH7HgUqVI1svU\ni2UWn/sh6fUtHEN+IleuUNNvI4zuJ19TMv7kE1DKYLCZ8Y4NsfHySxQiUdotaNTqNO7dI+Cw4//C\nE1z9p1fo7xvnoa/9nxg0MoTeMZ5/bploMs7yrQAGq4HH/81xgoUGA4NdrCTVXLgQ4ORJP1pdlUKh\n4zhaq4kEg3mKxQbz8170ehV37sR54w0FCws7OBxaJiddxOMlens7rZR6vc3ycor+fgsWy4MLV7nd\nevr7rWxsZJCkTiLS02Nmdrb3A8d2zLhMlMsNDAYVKtX7b9F3M26x0SD3IX42xWgU79xch3C5mSby\nVoAxhx69TsHS9U1sHhsnHu5m6+9ewXZfwl6h0VAPBjH6fAgWO5lImnpwE7X/CPdeuonSZKVeayIo\nZLs8CZPbTjZXI7UUZHr6EP39Vu7myuRTMQb2jHH06CO4VEUKKTvliohxfD+ycZF2uYDFaaGxEOHF\nv/weOpsNhcOH2WnGN+wjGrFQzCjJrK/QShQ7Yl31KrVcgdTSPdzThykrrbz2TohaIYJzuB9Zpc6h\n00/TUN0gnGkQTxpx9w0ju7WIt9dOuhDFhIaHn5wn09Ty3b98CdHowd9vZnLaRyjXoF0pIsjltHV6\nmuUS+XSObK6Kpef9dvF6l4uDX/oSsdu3Sdy5Qzke/+mHkoRGkBgb+6BDq1irdbgGHzJfD4KBASvB\nYJ5ksoIkgVqtYG5uAkUtz8abb+7a1je0EfpccjIpAbGQw+xVMDPvot1q4/Ua2bvXjU6n6uzCymYZ\naiuoZvNEl9ew7NlLq9kGk5NXvvkSXXMz2F1O8m0Jk1WPIGuRy9eJxwpIGzHUDglBanLphSVm9zpp\nl41oTRIH97mRFErylQbi5DSH/qcRxNgmOiXY90yQbwhgEXEJGV57dpFWU8TQ3UPFN8et1zdR25tU\nKnVcnn5OPH2WVLLE1LwbzdEBbr9+lcv/+DImi5bpY1PcWSnTPdrLo7/1ENcuB7lzK4Xf7+PEySGk\nZopEI057M8XAgRlyBRGhmubMmUHSNRUGu5kTDw/QCt8in8qitLsw6Bs0ZALJ7RAjMwdpxrJ0j3TT\ne/jQB5ILQaX60DabSq9/37G/KpyRv/iLv+DQoUOcPXv2M4n/3vEHDx7k0qVLnygZ+dfMGflFYQ7Q\n09md8//Q2S587Z8bEAoVuH49QqFQR6sVmJx0Mzpq/9BSls9n4rHHhshmayiVchKJMuvrGcxmDadO\ndezKV1fTKJUC+Xyd6elO28FoVDEwYEWnc5HPV9nYyLG+nkWnE3jssRF6e82MjzuYm/OgUimo11us\n31xDVY7R5zQjKCvE7kVwW8bRl5bYfP1NBKWC+MIdJr/6FUzdPvQuNwZvFyafh2oqRTYYoaJQcPcn\nb5FeXkKr1yCXyVBZTaiTOlptiVy6gClTReHs4aWfrGHxeTl4ZobrN8LcWYjQ3W2mf3qQXFXBpesp\njh3rw2hUkc3W2L/fx+3bCTY2MiwsxAkGC3R3m/j9358mkSixvJzEbtexvZ3j8OFudnY63JpSqfkB\nye5yuUmp1PhYyYhKJXDkSA+9vWbS6QoWi4bubtNHuu+q1cLPNT+Ty+UoPkTbQCaXIxME5AoFvf0O\npvNNlpfT2D02znzZhMdQR4quUYnHUer1lBIJDG43rXodhVJJ3+kvYA7FCF27TpdKx4FHp6lVGrSe\nPkA01CHpeVwauof7GNzTC5kptHoV+/0NRr1d3LvVYu+8G72YYOG7Pya5voPg6CJe0WKdO0xG08MB\nt5uZ091IaiPx7RBk4+ybsXDu+WssLqXoPTBP7eo1pGoL//A8rVKFpk6N0aLHPtDL9mKRdlvC6HZR\ny+bJxdP80z8sMOBVs371JqlkkbH5Ieaf+CKJWJpyOMTBL5/EYtVw8TtvcfTUOAaLAavdwLWra/TM\n2Zg9Mowkybl9K0psp8rQuBezsVO5qpfLVJJJ6sUiMqWSptKMTG2k2Xg/X0vncKD7CKt4mSAg/5D5\nkisfTKfGatXyyCMDxGIlqlURp1OHx2MgePHibiICUK212L56h8k9I0x0O2k1m6SCawjjJk6emUSt\n7qjG1rJZ7ON7kJx9tMsFpHySUi7Cxt0QNn8v+09OUNVYEJQKho/OM+Rq04xsojHoMXRpyZUlBvwa\nQrc3GJx3cPFb/4R/0o9WkeWhyXFso2O8fW6Hcz+5QyOwgqfPxcEvP0Tl7irlRALDvkco5VVoewfx\nzU3jm5vhe8+8RTlfQu9MYuz1E061eP3VdWRaHQNKB4urSdQyD0d/qxdtM8fW7TUq5RrNRB+Cf5JM\ntobdbsDlNnDz/D3GegUKkSjZrBWt1cLhrzxELluj2ZYha7fRaeX4esyEVquYXU7isSLlSotWroZg\ntqLxduMbmWF4sgeNWfOBOVEZDNhHR4ne6JCroSN45xgff99x7VaLciJBvVBApdejd7t3SdCfF+Tz\nef7sz/6Mt95667M+FaDDG7l8+TK/8/9z915Bkp3nmeZz0ntvK7OysrK8r/ZoAzTQcARAgqIROKKW\nQ0qiViFppdXsRGzEXmyEeKEJTcRqRzEbWuliZXa0GlJDUhRFAiA8iO5Ge1ve2/Tensw8eTL3IhsN\nEY4AaJqc9yoz6/z1n8r/nDrf/33v975f/OK9PpWfG+5lMHIMePHO65eB43xAMFIs1jl/fveuFbko\ntrh0aR+zWUMg0FX+e2etymDQ3H3gdXdT3W6QW7cS7OwU75QBBBYXM3Q6cPRogN3dAs2mjCDAwkIa\nl8vIU08NkcmISJJMT4+Zw4d72NzYRJZMGKpRvPI++9om0ZU1NAY9Dp8DnyrPzvV5LH1hkOrMPPM5\npFqNWipJq1JBa9CxeuUi688/j0KtweD1YvGF2Lh4g8lHToLOgCyKWEMh2sEg7uEJjOEhzJogq/MF\nbt+qYwgUuHAti+Top2bQkIqLaHRqPB4Dk5MeWi2Z9fUcXq+JhYUUS0vpu99VJlNDljuoVAK3b6do\ntdq43UZisV18vgB6vYpisU4mU70rEAfdHek7A4VKpYlSKXygAJpOp2Jw0MHgoOPuZz+JN41CpcI1\nMkItk7n7j1BQKHAODaExdAMolUrBoUM9hMM26nUZRaNM7uo5lDod1r4+xGyWdK2GvtlEa7Ggs1i4\n+vVnqaSz6IQmvukpPCEf+3PX0Key9Bs0TJw5xtKlJaJXLmInS9+gj53XfwjVHKlKhdlTpzHqWkTP\nXmfr0m1a7Q7KchNPZJDs5iraMS+NaoPVUp3Hnp5i92yBym4KWRS5/uYq1ZYGczxNeHyci6+eRR0t\nk1teoi42OfXMI4TaTXLxPLGbt9DotDgHI4gtBbvXVuh9bAhnpJ+2LktdacU8e4za3AJhZy/KgQA1\nWYOxL0IuX0dvs7G4VSdkN1C++AIjgky+ruTXn5ni6i0np073MzDoIr20RHppicSNG0hiHXUgQlJt\nQeMYJuAbQ1PcR6OQMXo8eKen37fsolSpcI+OspfL0W51OUGCUolrdPRDr313s/D279/e3obmjzoB\nq9t1WrUqe2v7NMsVDCYdgeEQlUqTSxf2cNuUEF2kFt3rdsflwHt0HF3vAHp3GVNvGCSRWb8flb+P\nRr2Fsu3A39PlU/zqmJVzF5O88eoqBr2KIycHUBb3EcsVVla3UBXmeDJoolPpIX3hVdooUZksZEtt\nzj13lYcfidDCwtf/03cZHu+hUlcQ6OmlUq5TyuTR2BQISiXpxUVsw2OYxyeYPNhHtiQzMWyhHt+j\nuB3lhb/5r9gcRgaPTNBsylx97gqJmMDwmAdrfZ+t21cpXJI4cLAHi1VH7NoNxEUZ71AYk1pJbCtJ\nvAbphhFDR4vR46J3tE1ibRulzoFzaIhiScJpK2CzdbNjstymUmmi0729WfBMTaE1myns7HQdnPv7\nf8SnqtNuc+2ll1AnEsjNJgqVCvvAAMH77vux9/jHxccZ/2d/9mc89dRTjI2N/UJwLo4dO8a3vvWt\nezb/Lypn5GcFG/BWAbkIfKAbUT5fvxuIvIVGQyaRqNx9wH4QVCoFfX0Wrl9PIMsdgkELU1Oeu2TJ\nQqHO+nqO1dUcoigxMuJiYsLDD36wTk+PmSNHug/o6REThbnrLJ+/Qa9Jg2Won3ZmlyFNifCIAZPH\niMNvIr+/g/3oacSKSM9wH5UbZ9l943U8k5OkE3NU4jEaxSKZ5RV0Tiel/X0cYyJGp5tmQ2LqmS+w\n+fyzKCxWVBNTWGdP88Mrebx9Ply9BhTmOoJC4MTJED/4wQZ78QbZbIORESNarYqtrTzXrydotdr0\n9dnIZmuEQjZkuc3hwz3Icge/30yx2MBu17G+3v27TSbNXbE4r9dIINDVa0mlatTrEvff34da3c1E\nFYt1bt5MkEhUUKkUDA05GR93oVJ9PB2JjwrH0BCCQkF2bY22LOMYHHxX66ggCLhc3c6gzEqcRrGI\n2mgkePx4VxitWkVrNuM/eBCt1cqRX9eTiedx99ix+L28/h/+FHv/ABpZwuXzkjj7GsPTs2xcX0JQ\nqVn83g+Q1UYEtRqt2czeay8x+PgnaNVquAYjrNzeolMTMbnz9AwHCEw7WFhLUyuU2J+X8HRy6ON7\nGA/0o9BbSG6XMaequHxBAmP91PfjCAoB/1gETXicYlOLtceHOTxIeWsNQalGazXgC3bIbmxRLjax\nB3uQDB5WNirkCzqmD48iCTVuL+YQHAGOHLNTzlVI7G+wPP8m1d0trE4LBn8P3uYWf/g/PYIj6MWk\nFIneWGb9hRdIz89TkzVIinm00zP0zNhYavQwPHiI8QNutHfUOD8IzuFhlBoNuY0N6HSwRyLYfsKU\nsDUUIrex8fbOvJrh2OlRlrZE8pUqoYkIi8t5tFsZ3ANNSrvbTI076TObEYp1ivEU2mgc38QJrp5b\npRxP4vIFOBjuo7lxi6v/8C36Ds1ie/pTNIt5Ni9eImJ3MPFbkyj0FlwWB9/7z+dRGc3YQx68w1p8\nQyFu3VggNbeAymhC7faTTpQYOjyM3unm9RfPo1JBW6Vm/IGjaDtVKskkzoCLpkqmtBdFZ7Ui5TOM\nj7lQqhRUKiKr8wk6YpN+v5H+w1PsXLyCopTCMDBGYj/G8PAgM4N6Ln79BzQ6DQJWA6XNVbbeOEf/\nmQeJLs5Rj20RPP0Il8+tE3ngFM18BqXYQudwYKrWGDxxEIPFhO/gQYROjWIsTadzJrcCJgAAIABJ\nREFUmGSywvXrcfL5OlarjolRG36PDq3Z/J733VuopFIUt7ex3ynbtFstcmtrdx2+fxGQSqX4i7/4\nC65du3avT+UuDh06xNzcHPV6HZ3u3Vmp/x5xL4ORIvBWFGEFCu884I/+6I+w2bp8BY+nj04ngFrd\n5YU0Gl26ikrVtVrefgd/4K334XCYvb0iL7xwjU6nQyjkx2TSYLPVKZeztFoWNBolhUKCV17ZZn9f\nQS4nkkjsc/BgD1/60jTZrIhSWcTl0FOcWya2vIlcKrIVK5Cbu44l2Etsfxtbb5Dq7XUCA59jw9HL\njdeuU9kv4Z+WsVusOB99nNZWl22+n0x2Teo8Hpq1Gu1AkFSlgs8/SDZbRz8cYuD3fx+3t5eG2syL\nb6zgCuqZm89waz5DZEBBu6Nifr5BKGSl3c7jdivw+cx4vUZWVtaJRrPcuFHHbtcxNaVhd7dEtWqk\n1WojyzlaLStWay9Wqwartau7EggMks2KNBoZyuUKjz12gBs3Emg0FUymrhz+q6/uMDqqZGkpgyDY\nUauVlEoJbt/OYDCoGRx0/Mj3/871+KD1+nH41xG3QqnEOTyMc3j4Q43VWiwoNRqkahWVXk/vyZP0\nCgLuiQns4TAr81G2gZwhQEVlYQQRo81Kq5ij0bFQTSVY/sErzJgtpBYWGT00xPr1ZXRODyaPG+VG\nlHKtgGNwg0ZLQWlvB0/Ix8bcNtlsleHBXqqSgu31JKX1FSwOM0vRbc48NIRNqhIa8pGrdOjoTVye\nrxLyzXDmkfspJ+JUO0ZeupAislVCZzEhWN2o+nWIpTLhQzO4Twxw47k30FoM3TKg3cT4iAXLfQGi\nsTI3zyfQ6HUYLTVupTMMTvfjdet56eYWXq+JFkpaTYlOIYUuv4nG2ibbFJB1NioiGLw+0uspGvU8\npmyOZi6BIuBna6fM6LgXnenHs/4FhQJ7JIL9p0TKC4fDtFsteg4dIrO8jCxJ6Ox2Zid6CEVqKA1j\nrGyJ6IUYCoWCjiBQL1VYmmvSc9qP0VjA6bVit/p4/WwUGQuWARsGl4mbiyn6VRr6jhwkcmyGG3/7\nt5T391B5gmwurqJb3mDgsUcxjozwyd/+JCuvvI4stQnNjuEcGiJQ28XSG0CWOygFGU/ATmgsglpo\n4R7oY2FrjfVX9zh2vI9HHhyF5k3ue+wgr/231ykn0hgcTqYemMHuMPDi2Tjf/Zc18ru7uFxGcv0a\nQjYvQ9P9KKQazWyCySkfeVmglsvQqjdRdmD4iIPCzVXapTIWgwK13UxyYRHX4RPMfP5XKMt6xOw+\nBoeFmnIKQd9LLZej1hHI/fAa5b0dpn/lSfKZMufP75PNilgtGtTFfS7+l5cIBYz4BoL4Z2fftzzX\nLJfvBiJvodNuvyfx9V+v6096XXwU/Omf/ilf/OIX7477ReFcjI+Pc+3aNU6ePHlP5v95j7+XwcgF\n4HeAbwIPA3/7zgP+/M///O5rUZR46aVNEomu1oBW6/qREs07vwC3u4d4vMzNmwmy2Rpms4disUE2\nKxKLlYnHYWKi61RqsWhIp43odCaCwRbVapOFBYl8PseZMxZmZ/1MTY1T3N9n4+Zlms0WqlKVrTdv\nslWtcN8XAji1WnxuF7rhIfKVDnOvriDIBhTKKtVcge2z83z63xxFSsYRs1lsQGlrG2u4j+z6OoZ6\nHUFQorM7SORkjHObjH3xaS4viexsrdE/1sc//dMSi/NJFFodCaOd69dF/H4j09M+otFu+aNalXjx\nxU3sdh3NpgWNpsWLL27yG78xQ7O5d8fzRcDpDHPhQpnDhwvMzHix2XyMjpruaKl0cDqHmJ72UijU\nKZfrGAwuHA4DWm2XY9Pp2LBYlOzsFMjn67RaqjulnhyDg453rcdHff9xIYoSW6tJoltJrFYt4UE3\nnl4v0CVfuicmSC8udm3uWy2cw8MIVi/XbiR59tktNBolNpuZaKJKPVOl9/Ah8gu30BrVFKJJBIUC\nhUKByaimXq5iMuvQu2zoNR3KlTI2lx2t3QmiEr3bi85spD0aIHLiCN7ZWb793D61YpVcsoBS6OAe\nGKBiCiDUSnjCPoa0HlRGM5ZGG61OyYWLMbaWdjB4fWT2s5gbMuWGAv9gCM9IL+GQBWUpjsbmgE+c\nJFYQyKZKjPUbSV86T2n4IH/5H5+n3lEj6MxoVW0ee2IErUZArVWhszuRVErUJj2NQg4x3aAYS7G3\nvIPa5sRgt6L2hWg3fTilVeJr23QApVqDQqlEpVKg0fx8MmHvBYVKhW92FvvAAHKj0W11zufJrr5C\nYTFJdF9PWwJbeAiVRoNKr6cuirQVGrT+PtxmJW2rj7FghsrOKq14BZvaj8rjQa4Y6B0JUd5cQ9zf\nRKXWoWmVCQfsWEJOXG491y/v4vL7OPxbv4GYzlAUBf7mb27x0OOjzH7qEdaudV2kQxN9nHp0go5U\n5eKbu9y6vkdLksllStREiacfGkJ643mOH3LSOh6h7/AMRrOWaKLOpTc36XTauNxmxFKZhmAlV6gS\n6Q9SWp3H3qxw6MAI0ZaXWnQHjVaJ36OnmslRzFZoV0u0qhXQGFAGRtjcKbOtkrCbWgwE3WQyZW7f\n2Ce1sMDGlTmUWi1HHzmAJp4jvraHMFBif7+E0ajBqS6z+so5mmIDtWRBJzRpiSIDjz32niU6tdGI\nQq2mLf0rfpEgoL3THnyvEY1G+bu/+zsWFhbu9am8C6dOneLs2bMfORj5ZcW9DEZu0O3UeePO6w8k\nr+r1ak6dCrG0lCaRqGCz6Rgbc7+nBkWp1OCHP9wmkajQaMisrmY4cMCP2ayhXG7i9RppNmVsNh0K\nhcDIiJNGI0m53EQUuwRNq1WHwaBGr9dw61YSn8+EWpZpt2SqVYl4vkApV0FAplxr4zp4jNr+JvV8\nnpSUYeW5VzD7/YTPnKEci2FwuUnuJPHq9BRrdXzTU6BSE781h396GksggP/YcWJ5UFX38R86QKph\n4KVvPI+srNMQWzQqIkePh6kUqqjNBhYX0xw44Gd+Ps32dh6zWUsqVeX27RRms5rjx3vp67PSaHQ7\nZwIBExMTbl58cfNOFqiIWq3k2LHuDs5u1yNJWY4fH7mTLarz2mvbnD+/i9GoIZcTmZz04HYbkOU2\ntZrEG2/sEo9XMBrVzMx4iUa7qrQfxkDvJ+GMvBeazRY/fGmZS98/T7PWbQKLTAR54rOH6BnpR6FU\n0nPoEJbeXpqVChqDgc1UgRsXYsRiZVYW48j1BoGQjf6QmWxOZGBoDF18j3IshqolcuSZp+m0atit\nGhIbu4w+fIpCpoSuVSHeaWFuQ6slU04kcU1MMHD8EI2OhljNyHJSzd5ukbYoIhZLJFoSJp+fZAmS\n2TJqpwGvz4XTb8frs7Kyvsn8loxap6WNkqMnImxcvkVL7+S1b58lPORh+Hce4Nz/9X+jNhoZPX2E\nR5/8FV5+tcTrr2/z6c+d4vLtEti8GNVV1uazNJsyff0u7jsNTZeDiSMRyukcJkMbk9NBtdWh3NaR\nXr1NJXcN99gYu2+cxdzjI3joIFKzRdPpxBweoFiWGR93f2i9mZ82/vW1oDWb4Y5iZn6zex8q1Wr6\nIm6i57ZolkroLBYsgQCaRh6j1cT8SgGzVQ/1fZb/+VmK0QQ2t53cbhyzz8Oxzz+GKqWgWSogtRW0\nahIbSysMnzjAwoUlLCUtN5a6LbLh44cZGdfz7LNbxBI1Li7c4rOfGeYzvzuCyaBAqGZpbt9iXbRh\nMysYm+kjES+h0iiJZyR0/gC2SD+VRIqRsJtqZg/ZOMD8QgqTUUtxMYPZrKHd7gq7TZwZx+3MYNTI\neKYG0fUHWLyUQ5YVHHlwkoWr15ByLQxmC70HR4mv79ESRZQOP3Z/ABIy3/ovVxgfd9FSaDGrZDoK\nFUaHnWq1ydpSnNPHhkmLVZwNmf39EgcP+invrdEUu+VyxZ1kWC2TQcxmMfe8WxHX5PHQcLnQpFLd\nUpogYO3r+xFeyQet6096Xfw4/Mmf/Alf/epX8d9RcP55z/9B4++//37+9m/ftUf/uc3/8x5/r117\nP1Q771twOPScPBlCltsfqHOxtZUnHu9mUNTq7k72xo0EDz0UplxuolQqGB628cADIQRBgUqloFhs\nMDeXolJpIssdNBol/f12Op0OtZpEPl+nz+9AZTaTT2zSLFVoVioER/tQWuzs7xZor29i8zqQpRpK\noUNxd5fc+jpStYrB46Z3epD8m7t4jx4neHCa0P33Ez69BzojpvAw6ymIZaJUOmbkWBtDLU21IuHu\nM9FsSqzN71CXOqgUHZDVCEJX6CmbrbG0lCEctuH1mpBlmVKpw/Z2AbNZyxNPDOHxGBDFFn/91ze4\ndi2OJLWZnfXS12fl1q0kktTmwoU9gsE2kUgLrVbFzk6BcrmBxaJlYyNPNiuSz9d5/PEIyWSVs2d3\nWVnppltLpQaFgshXv3qQcrn5M3Pz/SCkUjVuv7lwNxAB2FqMsjXuwx3yodbrERQKzD7f3Z9vX9kl\nkVBSL1epxOK0WzK7lSI2fRANTcyDs0iVCuZwik6riXt8lFKqgMpgoKm24j9xHE8hRWFtmbDbjbZQ\nYvl7z1JSufBY3URbLr7zvS20pgajkxq0Bg2VloXgzASlZIpyVWJAIbK8naK612T5xhtMnLmPgUE7\nJbHIQ08dJOjTkE6UOPfqKsbIGJlomp6xQTwDfor7CbKpInqDyN6lq6DS4VD6GHlyBtloJZ1LU28p\nsBg1CEolCkFGQoFSCa+/EeWRh+/HLMZYv7ZENi/hnJgkWdNSqwu0mhKirMYYClNNxDDYLRz94qfJ\n6h0Y/AFOzRiJRD6emdfPCs1KhcLW1l1J8j6vlvxsH/vRAnR68PX7OXZommSizH65jjO7h9FcRyoW\nqNeaZOMZ1JUmdQkalQpVhQOVO4jZ52VzbhOrx0kHBaVSBaHWJroRI9BrZ/v2BlpTH29ez5EvNJFa\nHbajNzl21M///JuDvPG//a+ETz9AxjaLot1isN9EZKyHjkqL261DqopUGwqsw2M0lXragkRB5UWl\nLuL1W0hGbyN57Xg9HiTaBPtcKPRGDM4QueQWjfg1dnZtzF3Z4LOfn8Q71aC5n2XmwScxaTvc/G//\njKO/j55Tp4nj4PUXrlApilTFDrLQoiG30JtM6D0+lDURZ9CLymKiruoK1jkceur1Fvo7JRe1RoHN\n/q866t6HL6S4Q1x2Tk8j5nJoLRbMPT2o9R++G+9nhWQyyde//nVWV1fv9am8J06ePMlv//Zv0263\nUfySabZ8HNzrYORj4f0CkbeisWz27VY/QRAIBCxsb+fv3i8Oh46ZGR9q9dt//sSEh2pVolRqYDJp\n6O21MDTkoNVqE/aAVsojKHvomZ1h+eo67oaVyOcewT01SzJdw+B00EyaqWSLyOU9Zk6OcfvSGpIo\nYu4J0D8VQWU143/4SdavLKKq6mka3MjBfubnU5Rv79GsVLoeJm2BXzs1Rb6m5tRnHuD21U36hvzM\nHqtTE2VCgz7Wt8qMjbkZH3cDHUqlBul0lUJB5JOfHCGfF7HZdNhsOiIRG81mC41GRy5Xx27Xo9Eo\nOH68l2azTS5X59Klfer1FjMzPqzWFJGInWKxcbeD4a2OmUZDwuUyIkky1WoTh0NPtdpEELrdDuVy\nE5PpwwUiHyd6/qAxtWqTWuFHjbw6nQ7FXBVJFH/kH2Cn0+nqntTVWNs5eoJ65v0WkrECUrOF3Gqj\n93lYuLVPuWwnMjSCFNtk/+wyqnaddlVk4JET1NVmtEE7WlOQ/kaB+MVzaCwWfBYT4089wrNvVkkU\nBSqxIjuxGo8+EkGsNWmKXnTCIANDLvYXNtAF+insphmeDGI0abFYjdTrMkIpQVNvQWqCKGjZWN5F\npdFisZuJDDhYe+kfqZVF7G4rBosRoS0RHrCwslckeSuDWG/RE7CSztToHzXTrtd46OEhClWBmUNB\nLAEbGxt6Kn4D0cIeb35vDYcJjh0KYbOb2dotk0urcbqGMXp9TH/6MdQ63U/NefcnwXtdC+80z2um\nohyIOJmaHsI+MoDDaUSS2nzzOxtIYovoxg7hgJ4enx6dTkU6XcNsUBIOmymXmogaJ0YhT+ThM1Sb\nKhTI2EK9BAN2fvjyOgpFt8tE6MiYDC4mBmLkKnq2dmsYjBqUSiXKjsTpf/8HqA16vLYhlmMLJLNV\nAh4b8WQVjbrJVlIm1RlEk5ZwWAS2t0WiC5v8yq/OcvH8Nl/6zWNs7pRp1hs8/sQwOoOG5//pPFqT\niVNPHMBQy3Nm0E+p1GB+vYqqpKNYsJC/kCPibmEcP8zYEyeJ51WsrZSQOwrQm9jYqfLEpye5cnYV\nb1+AYr5GutBkOuiikCsweugoiUSJBx7oI58XMdhDuHe38Lg0WO+0+5q83vfljAAMDHW7cWx9fR97\nXT8KPuz4v/qrv+KZZ57B7f5RMbdfFM6Fz+fD6XSysLDA1NTUz33+n/f4X8pgBLop+Wq16yz7zlZT\nt9vA+nru7nurVcvhwz1MTXmpViUUCqFrXNXudKWRAYtFy0MPhRkedrK0lO4+fDsSnegS6Z0NVHNt\nYlYz3okJemYnackTqBslLv/TixQTaWY/8QBjn3yS1//jn2HQK/HKq3zmyw9gmjiKrLexv7LD//N/\nPEdwuI9jDx9jOa1ibm6TpSvLjB2McObRYRZv7uA6OkZfxM3AWICX3ojz7e/vINUabMfmOfOJCQwm\nHcWyhNNjpr/fTr0uMTTkJJcTSSar3LyZpNGQefrpUTqdbutuPl/j9u0UTzwxxFe+MsPycpaeHhM6\nnRKVSsV3vrNErSaRTFbZ3i6g16s4diyI3a5FEMBk0jA87ECWuwJmNpuOZlMmEDAjy23K5SYKhYBG\no6Svz/q++iE/a9jsOhx+N8m1t6XDVWolnh4rmnd4ZSSTFWLLm9RuX+Dm+WXMBgWnTpxkN2wjkxG7\npEy9hqXtBns7FeZ3khw5FKHneC8+l5pbl7dY2GpQjxa5divFxpvXGBrx8tCj9+EemqG1u0zbYGd1\nfZ/lxQTVShOtQU82I/LlfzvF2CEnuxspelxqrmzFaCuMFNZXkZpNwkM+Dk4O8ebyRVa/l2BdpWTw\n0Ciff/oIq6M2qtUmw9NhXNIe39/cJDzkIzAURO/yoHX7WduucXk+g6QycPj4ANlcA3tHoDdoYXDQ\njtllI1dskq+0Qa3j5df3aDVa6CQ1lZqMUa+iipnIWIAr3ziLVqNErVWjstpJXL9Os1zGNTr6E3fC\n/CygNZux9vWRmpvrftDp0MhlCQxE8IW7vKrV1SySJNNBoCO3UeoM7G2l0SnbmFUgV9vsJJs4tRZe\n+WGUx88MYdMUmf2CC7QG2q0Wz//lWdLxPIGhAFqLGYdDT8jZJr+5Tr0mcWR8gOB4hMNhmdzl14nf\nXkQyuFCHK0wdGOD6tRilisT0bA9aQeLbf/0qGqsDsa3i8OEgksqGRtXGYlRhNylwu5wcOtaHJNaY\nu7ZHYqmGo7eHxbUSt/7zBRyaKjNnDvPpZw5y8/I2eVUHZaWBXS9z6dlLDB+dYERlQ60TsdoMVBoC\nsWiRwWEP1VKdUw+PoVN3iAx76ekxY9J2qDYV7O/lcYUdrK5mMJm0aKwORh57EEV2F62yjcnnwzM1\n9QunG/LjUK/X+cu//EteffXVe30qH4hTp05x7ty5jxSM/LLilzIY2d0tcONGousMauhyFQYGHHdr\nVV3TuxKxWFccSqdTcfRol9C6tpYjk6lRrUpMTro5cMCHz2eiWGzQarWx23XMjFlZW4pDMcX+6i10\n9SyZ3SxGt5tqMolzZJyF1U3it7bYi9ZwBfpZX4rj6PUx/YXPk1tfxRYK4R4apKDRcu7yLlsxiZ5j\nx1EpBdajbeymJj0OAd8nZxgcD6LWKXni84fptFpkMjX2k3WWljLojDocbhlZtpDMNnn8cC+SJHPu\n3C6FQp1KRSKTqWAwaPjsZ0eZnHRTKjX4h3+Yw2hU8ZnPjJFOiywspO/oqvhRq5U4HDoUCgUXLuyT\nz9dpNGTa7Q5DQwpqtW6mo1ZrEYnY7/j/SKhUCgYG7CiVAjqdmqkpD0aj5u53Fwxa3tNJ9f3w0+aM\nuN1GTjw+ww/rIrn9JHqjjukjESLjvajeIbhVKdXIzt+mXC8S6LURXd1m8bvf4+Hf+iy+T82gFSS+\n+YMEa3vNO+aAbV47F+fppyKkt8vcvBHFN9jHm5eX2dyr4bR5iCai/Mu3qswM6bj/wUmqNRmXy0i9\nJqEQFOj1GgqlBjqDjmypw9B0GKNc5FP/w4Ncefk6uYCbwECA++8P0dqew6CtILWbCJKCeipBc2+F\n4emDONxm2pU8BsHDp//33yOztUc8KaIJB4klaijNJjQmI5mCgpW1ArMHA1gsIn5/EKtVh0ajZH09\nSzxW4drlPcxGFQVJZi+vRB8aROsx4hryUcmucnTKQrNUxNZnp1xXUG4qaBWzVJI/JKJSfWDt/2eN\n97sWvNPTIAgUd3YQBAH7wMC7hLisVi3ptEzvxCjR+Ar+YyfoJDZJ7qYITE9RdE2xut8lXUptBTWM\niNSoF9tQF3nsk1OsjfZSLtWwB31MRAxU9m7ye79/jNvzGaqVJg8ds9Jau4pUrRFNNUlktsm9us4j\nv/frDPZq0Zt0NFoiCq0ay8AQYq5IqE+Nxmzh0IyXdKJCXeqwvFZk6eZtLE4zNVFmfNzDfQ9NsrWR\nI5pI4nAaaFTKZON5LP46T35qjCtX5nGeOElHLOMfjZCKl7h+YZ1PPXMUzE16eu2EgmaMRjUbayns\njhB9fXbknIjb0mFzV2RlvYAzqKXRalOvt5GkOvl8nZhGw+jwESZm3WgNhnd9/x92nX5ax3+c8d/8\n5jeZmZlhfHz8nsz/Ycfff//9vPLKK/zu7/7uPZn/5zn+ly4YyeVEzp/fI58XKRYbiGKXnPn5z799\nUZnN3SzHWwRWu11HrSaxspIllxNZWspQLNaZn0+SyYiYzWqGB6xUk0kchhaUcoT8TlJb60jLlyhk\nMigUCiRRRJXJEDhyFCm9j9etp1SzI4l1ZFFm/fY2x776ZYxTKaJXb5C8sUcakbUruxh8fmJpI7G1\nPZwuE//j792HMh9l6NgkhbaRa1dj/P0/LCA1Wzz+5AiHDtlptTp4vUZcLhWbm9yRYrfj8RixWvW4\n3UbW1rLMzPh5/fUtrlyJ4fWa2N4uIssyk5M9TE66SSar9PfbkaQOxWIdQRDodMDjMeJy6TGbNXQ6\nTQYGvNjtTeLxKsViV0/g8GE/stzG7zeRydRYXc2yuZnnS1+aJhSy0deXY3+/iMWiZWjIidd779w6\nBUHg8H39BHttFDIlNKoO/qAd/TuY+6IoUU4X2Fzao06DsMuE3zNKOZWG2AqGXj1KuxeFzoAgSHdT\n/waDGpdDyzeeW0LnGWQ726Ha0SHToGOyYHHoqBUUeA6MoO2xs7cdxes18sgnRtnZK6PVqhgatKPT\nCmh1Kv7x/7uODhGvW0f/ZJjDJwZYubyIVMiSfPMNtKoONqVEMVcmt16i3FRhVIR47Y19KgURm0NP\nIDRK+MAopniS6PI62wvbPPqVSZIKNfWVNDaLirrYZHMjzvq6jCx3GB11UyyKtBoNqpUOjzwyRDor\nIjVatDuQyYkYXC68XqioZbIFNytbOSrXvsXMoyeQdBpcJshvb9/TYOT9oDEa6b3vPrzT0wiC8C5+\ngk6npFSqd1tVwz5Csyo2L20RPn4/kac9XF7v8L3ntvjCF7z0h604bWqahTL2YC8WMyi1RnL7CRw9\nJQSlgt4+O7eee41sR4nF0eLoyQiKVoOwp8P1c0kKRYmWxkK9U8Zg1pFf3+TCxSRmj5NiDR54MILX\nb2e9oSZTqVDfLiOoFGjVAi/81x9y8MgkWqOO2H6B4SkXBw4HuTkXZXMjh8JgpWfAi0JyonG7uHQl\nht2hZX4xy8rcDqEePQ6Xgb6hPnrDTnZSLXZ2Cpw+HUapFKjVmsT2S1y6HGV1NcvMmI18pcLtKxs4\nQz0YLXqWl3M4HHqUd3g4zabM1k6J8Ukv94a6/JPj7//+7/nqV796r0/jx+LUqVN87Wtfu9en8XPB\nL10wksnUKBTqbG4WSKWqtNtdoubAgJ1HHx24e5xer6a//21y3Y0bcWS5QyrVfdAmEhVarQ6pVIVz\nZ9P4f20IbWGP6LVVjC47lv5+CtkKuXwDtaCiGI2islgRxCYYbThcAeqZJOEeHRurKRr1Jg6fi/n5\nJNpKgvlrW2jMJppmK/VGi62ra1j7IkgKLdlMmdtXNnEq22ytJsh0mrxxbpdioYHFquW559bJZkVM\nJjXz8ymWlrq+GgMDdq5ejfL66zscO9aDXq/C5zNy5UoUnU7Nyy9vEok4OHjQh8djoK/Pxs5OgZWV\nLC+8sMHv/M4hdndLbGzkyGZFPvGJQY4dC5LLdXc8yWSFvT0Fs7N65uZS6PUqBgbs7OwU6XRApVIS\nDFrRaBRIUhuTqWtkNzvre6+l+rH4aXNG3oIvYMcX6K59o9Eimayg06mwWnV0Oh2uXo2RjtWQBTXR\npQRZXZmpKQ9Wr5PA+GA37Wy28mA9htuqoKNUo9BoCfdZqZRr7CdE6pJIMGhFoVLT7KgoliTS0Rou\nt5mSCKVskXatSjpeZS9aJhCw0Gy2UCpBSZtzLy1y68YevX4D1UyOmy/ucOz0CDtvXqVv+FMUMiWo\nlUjnmpRLdRpSkhPjU0RzEhcu7NMUm/gCNl5+dZdPPj3KsdkIK7dj3PdrnwJnEFsuR7NWR61xcP7N\nKE+e6aFTyVEu1qmmYWI2wuSYAxB45eUNNraK7G7lmD7g5yu/eZhKqcrKm3OkdpPE97JIlTI+r55m\nOo5lfBaVRfzRds17gB93LWjeY9cuihLz8ylGR90IgoJYokYoPITvVD+3V7MsXkqjVit5+OEIJ04E\n2d3O8epz8ygbJUp7O5x68gj5ioRRo0RvUKNWa0hlami8Id74xwXWV1ZRKhXpcDw8AAAgAElEQVTM\nHO7l9/6XM2RKUMrVie/lMDkdVPIVWiiolKrojRomZseIL61iGZlGrVFx65bI6dMCW9slHn9skNJ+\nnNvXdjB5XIxOmRgbdXP1eoxKrorPb+PWrRS511YZjFhJFmTUej2lkoTB0kNbvUvPUB+XLu/x+tVl\nHnygj16/loOHg/y/fz/PmUcG+e53V4hGS8i1Cr1BM5lMnSefGiSaE9jI5phS2RBFCa1WiUbzdlD3\nYSwbPuw6/aTHf9Tx8XicK1eu8N3vfveezP9Rxg8NDSGKIru7u4Q+pFDcL9L5fxT80gUjSqVwl6zZ\nbnd3rO12l8CZSFTo67O95zizuct/aDRkyuUmrVYHo1GNRqPComtT3Vohev0c6WuXMfQNkk0U8Y2P\noLU7iV+/ik6rpZ4vMvPlf8vyag59ZJJcssDK+TcxuV34p3oJH5nh5Td2UBaj7G3nKIsZjjwZwBdy\nU5XLuH02VAaJIwdcbNxYIPjoKPFkg41cnnJZolyREBQKZLnDzk6RT3xikHpd5jvfWeLUqV4yGZFy\nuYHH01W73N8vYrXqWVnJ8vjjA3zuc+PcvJmg0ZAJBi0Ui3UsFg0bG3m++MVJqlWJCxf2OHDAh9tt\npFptks+LfPnLMywspDl/fhePx4hGo2R3t0gkYieTqd314FEoBPT67iXzTqLgLyL29opcvhxle7tI\nudxgfNzFzIyPzc08CoWCmUePY1TL1Mpd1+fwZITw6QcwuN1EL11CWtvBpHIyvxhHoTOg1ysRy3Wc\nbhPZXIMjx4JsbORRa5SUS3X243UOPDpAq1Ilut9m48o8p3/lUTRmK9FoGZvNyAOn+1HR4sqrt+i0\nwTQVxGFsgdwkkW7QMzlBPpEhcuIIy69dRKNto9GpkVVKfJNjPP9SGr1OhZoWao0KhUrBlctRwmEb\n1/dUFLU1nPEYi1dWOXZqFKmt5BOn3ZRuvsn6rU0azTZGh4UDY1+gY/bw3e8s8i/fvsXIVBCXQ8fu\nZpYLF/Y580CAlkmgoOzaBJj7rVj6Imzm2yhXKminbUxN9N7rJf7IyGbFu512AwN2hoYcKBQCExNu\nrFYtDocetbqrJiyKEnNzKSwKmUI0htmgRmF1osptsvTiWVRKBS2NgcHJEPrwKBvLcZoS1Ko1CqUW\nt7ZljMF+SoVFOioNNquW0JCfdFODWqdmYDLMiQfCiLUe6kojiWqer3xlFp1GycJ8kgsX97HZXFx9\n7QY9w3DwoJ/VtSzRaIUet5ZgwIReLRPdLTA128PWRoYHHhljcy1JNlvn3/z6QV56aR29UYfZpCW+\nl+Xsc1vQOsaTjwQpNVvcuJHAZFITCjjQKRvE72STBYUCtUbP3l6JmRkvtZrE8nIaSWrj9Zo4eNBH\no9H60AHJLxK+8Y1v8OlPfxr9L0BHz4+DIAh3eSP/vfvU3Du1oh+PP/7jP/7jd32oVitYXc2xs/O2\nnbjPZ2RgwEG1miYS8b9rDIBKaJFNFCkUG2xtFxgcdPDEE4PIcof7ZiwkL59HrpQxmbVU23oqmRw2\nnwvnyAg6ox6t3UnoyCHcs4fZLWpYTVcZnBhCbnfFtFSuAPpAiO9/d45QxMPe7RXKtQ6pvQxf+vdP\nozRbqUkKenrMWO16wsM92D02zC4H61sVLl2KUizWkeU2nU7X1TabrTE97WV8XMX4eIibN5MsL2do\ntdrYbDokqU2r1aZalVheznD6dB8TE+475RcjDz0UptGQGRpycuVKjOXlDNeuxclmawSDVoaGnJRK\nTYaHHUQiDlQqgWYziyxrCQTMGI0aenosdzwp3t4F6/UqZmd9mEw/GVF1e3v7rsIuwNe+9jXea80/\naMz7oVJp8tpr2ywvZ1haSpPNimxu5vH7TWxs5HG7jbR1FlpGFQaLC9dAhNHT9+EMBShHo8QuXwab\nl2tX9rHaDSiFNp6Ak3xJYvZAgFxe5NnvrzI66mJywsuRowEePOPErIJXvn0RlUZFNVvAGuihgZbR\nUTdKpYJKpYFGCds7JZpiA7/XQDpbxzM0iC/kRhTrOPuClDI59KMRBsb6cQ/0M/nEGQz9I5SbSpQq\nJdU6RKNlKpUmrZaMLMn0h604HEZiuxmEXBStVoXN56IV36LaqmBze1FrlOgUEnZ9G9/4EP/8T/Nk\n0jU0aoG23ELQdtufHzwTwa1vIJWLSC1wTU7xwnNLFKqgtCgoVxRonW5CIetP3FnzYdb9Lchym1Sq\nQipVZWtrG6/X9ZHmL5cbrK/nkOUO9XoLUWyRz8fx+12cORPhwAE/U1Me7HY9tVoLqdWhJdYQanls\n/f2o1UouffMFEjspWgiodVqy0QzOvgAtq4F6XY0zFMAWCrGzV6F/JoLeZmXiQB+mcD9jp49itel4\n8On7QG4xf3GZFipMXh8dFJw7N8fzz+0hNlqYTRqsVi0Go5bxqR7m5tI4XUauXo2RjOcRK00OHPAS\nGXAxPumjP2xjP1ZCrLWJ7u+g1prZ2yvj9RhYXojhcpnRGTRo1FBK55k+3E8qXUOvVyMIHQw6BQ6P\nlUjExm60hqDRoVaXsNnsnDgRpNXqoNWqsFg0iGKX8F6vt3C7P9gK4P3u2fdb9w97j3/U+d7CH/zB\nH/Dv/t2/Y2Bg4D1//rOe/6OOj8Vi3Lx5k6eeeuqezP/THH+n5PSedadfurDWbNby8MP9NBot4vEK\nLpeBwcEuydLne++HY25jg/iNG/RrTXgfCjA95SYaLfHC80uUyzLOp7zE9gqM9NtIJ5XsRkuoVAIH\nbDbKJRGlw0urJoNWR7VQQoGNubkM+aQLMamgI1aoXd6hZ2YSi8PCZkrB0H0zpPfTHHriBFduZFle\nK6PSa2nkG3z323McPNzDcMRCaLSX0VEXVqsWSer6a7hceoJBC+vrWZLJCg5HE6WyiFIpUK1K+HxG\narUWpVKT3l4rnU4HWW4jSW1isQpOpx5ZbnP27C6pVJVEokKnA5OTHtbX8wiCQDRa4uTJXjodcDgM\nKBTCHeM8BUZjd8eg1Srp7bUQClm4dStJLidiNGqYmvLcU27Ih0E+L1IodMtxstzN4khSm2i0jN2u\npdPp8P3vr6JUltBonIR1VqRbZT7hb1IvFEAQaCm12LxOXnh+mUS0SO/NHJNHBjCbdZw9t4tapWBu\nLo1Gk8XhMDDUL3HpuWVqdRlvwIFjqpc3l+rMz+8RClkxmTTcf3+I9bUso4eGiG9bMVrUaO06itUO\ngbCTpUqD8z+o8sShXuTiJjtbFUZOzpLReLl+tcDQkBujUcuLP1jHbNXjcRt54qlhblzdY3QkgEEh\nEetIIEtsL2xw5NEDLEb17KfbpKMVIoNBDo+b0CkrILcYmw5RFTso6ab4G20l4bCNVqvNwNFDyGIN\ni6/I7X0Jc48f38ggZmcHk8XPzk6JiYk6DsfPZ4cpSTJXr8ZYWemKt7XbeWTZwsGD/g/UHfrXcDoN\nuN3Gu0rOABpNt/woCAI6nQqdToXZ3O0YW1pKY/L5sFuUvPrCCr/6jANaEo2mTDpVQW+zYjJqEHN5\nxI6erMKFoiWQWclz4kSIpqzklUsljh5w4vS7qSqtmLwK1tfzbMYhVjQT3e7g6+TRaJQUSw1SaRGz\nVUe93sLr0XPy/oN8/9kNFhdTWO9sQnRGLYVKi8SbO4yO2KnH96h1tKyt5LDbtDgcBjKZbnt/LFqm\n0xZYX0mSiOYYn/CiUktItSqTYw72d3M0W3r6B5047Xr6BtyM5lp3srB67HY95XITm01HIlFhcTGN\n1arjwQfDXL8ex+nUfyh/sF8ErKysEI1GOXPmzL0+lQ+NU6dOfSzxs1823Mtg5Ang/wQywP0fZWB/\nv4377w+xt1ei2ZQpFBoMDNg5eDDwrmPFXI7opUs0KxX0ToHmlecJThzn4mYKqw4sahDbCnRmE/ly\ni/h+HrPLjX1knJtJMxpzkMDpccJqkdjiCks3d5h8epRrGy1uzqd4+MAs7cQG9iOD6IwGnvjcIS69\nuUdDM8wnn3mS3f0K16/vsbNXpl6XcTgN9I/2gFqHwmzj4qUYJ0708od/eIylpW7Hy9iYG7fbQE+P\niViszPi4G6/XiFqtQJZlQiE7167FGB11MTzs4FvfWmRkxMUbb2zT6QgYDGoaDZmXX96gv99BLldn\nYyPLE08M8/nPj7K/X8Zs1mIyaThwwI/T2a2tHz/ey82bqjuiZSomJ734fCYEQcDjMVGrSXfagX86\nCbWfNmekLcs0SiWUGg0qlQKlUqDV6gYi3bKSgCAITE15WVhI026DINgwmTTo9SryebEbcJnNaIxG\nTE4HN64tkI4XUaiU1OptqpUmhUIdp9NILFam0egGkPF4mYMHhxg4aeLBHiOhPiuSrMCRiTM66kKr\nVXH0aIB2u4PZoiM04WFswsvaaoaBkA2Xx0gsVrnDc+qg6w9jIsTgSRUXr+V449lNBIWS8aSIz2fi\nT/7Do2xsZsnl6xQKNR59fIBWrYZe3eGxR8M8+/UowUgfi4sZVtfy5PZqNGotoptJhoecBANGtAY9\nT39mnGKlxdpaDlFsMTho7ZYDVnOEwwOMfvJJwsUixVf20AQktPq3KYvdAFj+yGv4cZFIVFha6mYG\nARQKO/8/d+8VJMl13nv+KjPLe1/V1dXezrSZHtcYg9EYGAKkKFBQULQi5UhJjN1QxN7Q0z4pFKEb\netCVVqEN8e4NUbEUyCUpgRQEEQRhZoDxfqZnpr2v7i7vvc19yEZTICj44QD8v8xUdZ+u05nZmd/5\nzt/cvRujrc38rh+GOp3E4cNBpqYiZLNVbDYdFoufWq1JoVB7U7evrc3M4KCTlZUMWlsbNdUaxarM\n6EQ7t2pV6mgQRYH+ASede3uZLlcZHVVCI6uVBo880ovcavBbX9jH3HwKo8PChQtbtAfN5BoakgUB\nb18QQRS5cmWTEye68fuDTN1epFSuKwRRo561tSyrqxkEUSAcLvAnf7KfmekE1Wqd8ad2IVZznPnh\nRYKj/Xz2syOcfnGaoeFBuntdVKtNXnlliXqpxMJMmIFBD/l0nrpGhcUs0dcGjYyM1qhlZNDI2GQ/\n8/MJ+vsdiKJif2A0qsnllI6SRiMyOOhiczMHKGTWRKL0tsf/o8QZeeaZZ/jc5z63Q8b9ZX/++xm/\nZ88eVlZWSKfT2O3vbDL4UZv/u8WDzqYZB155rwMlSWR01IvHYyKfV0zKfD4TavVbL7ByJkOtoKyC\nVIJAamEBleBCFUvhs3uQkRDVWvqPHSJ8/TrOgAffwYd47Wqa5dshGoTp6rLx+OO9SP4h+sZ02J1m\nHjsRRJSbaLw2Og7sYnYqxPW5Mi25Qne7lmIqw9StMKFYA7vTxPpaBodDRyyWZ3jYg8GkQ6eTcLn0\nTE1F8XqNTE4GkCSRaLRINlulUmmQyVS4ezeOLMPJk910ddlIpcocP96F12tkeTnNZz+7G5/PxOnT\nqyQSZZaXlfThZlNGEKCz00qrJdNsNpmcDNLebsVu13HoUDsm088eLl1dNvx+E/l8DaNR/SYXVUFQ\nfeBtmfuJYjxO+Pp1Ssmk4vo4todgu5nFRR0bG1ny+RptbSbsdi1qtcDu3YoEWhBUGI3K7yUIKiRJ\npKKysdb009gqobY5sPsrFEpNYqk63kSJ7m4HIyNuOjutFIt1LBYN3d02PB4jS0sZCuUWKlFNR8DE\n0JCLqakoU1NR9HqR115bx+HQYxvTs7qawWDSkS/WufDcHI8+0ouKFrKshA+uRaAVb/Ds88uoVAL1\nhoxOnwaUrcnNrTzZTJX+AQerK1kkoUUzEcLl0PP0Vx5G721jdj6N+sgIDruGlXtr5LJVbtzY4sDJ\nx2kKGsxm+P3fn2BlJYMsKx49qVQZUVR8Y9R6NWq9nuE9AukLIf4zVcjh0P/SuiLAdgZS603v1est\ncrkqgbeuQ/5LuFwGTpzoZm0tw6VLGywspFCplK7Jww934HYrKc+CoKKjw4Ykieh0Il/930+SjiSx\nDe5mqNqiWKjS3mHFGgyymtHR1WWgu9u2rSxzMT0dZW42CSq2fXt0qCWZ4WE3586V6ex20pKhUmmw\nf38bJpOGr31tH16PAa9Hz8ljAf75/36Z/acm8PqMXL2mLFz+x/+4hM2m48iRIEsrWdoCZn73//wc\nqXCMf/3WOQKdPvZMBLg9FWViwsepU73cuanjoUk/QqvJretr7Dk0QD5ToZyvcPxYO36niLqeJejX\n43J1srmZo15vodWKXLgQ4uLFELFYiUikwMSEj/3723Z4Yzrdx6PBLssyzzzzDN/73vce9FTeE9Rq\nNZOTk1y4cOFdb9V8HPEgr6K3pPS+F6jVIu3tb67Gf5G+WZQkVKK4EzHeqFQwCQ0kuQ75FCogFdah\nHuhhz2930CgXmV1vkGi2yJVK+P1aGo0WU1NRnnqinUY+y/kXbyFZRb74hVFq5TIv/tttyoUqequR\nSq5E1Wyize9kfatILpzi0KNjzM5EUalUNBogiAI6ncS9e3FKpToPPRRkfl4xWpuejqPXq7mwfeN/\n7LEebt+eRZIETCYNd+5E6etz8vrrq0SjRfbs8REMWrBYNDSbijX84cNBUqkKly5tsG+fn1qtRa2m\nbGsVCjV6euzbnI+3CvPC4Y0PXBm/W3xYPiONWo2NS5cohMM7721ePM/YsUdQCV1IkoDNqmWkS6S0\nNYuothEY6CbaY2djYx1Q3CO7uqw0qlVeenGeYhEcNlnhS3S145SVlXk0nMHrG2BhUYUkqTCbNZhM\nGlwuA4uLy9jtVmRZxcJCiv5+J9FogbNn1+npsfFv/zbP7GyCP/qj/dy5E+Pu3RgAExM+fu1YJy+/\nvMTCYorIVp6JCR8DQ2p8vgC1OtRqdYrFGuPjXmRZRq9X4/OZMRq1qGSYmY3jd6khXyOSgpatQWVp\ng2vXI4TDeY4dtdFtcnDn5gZqn5cXzyfp64PHHusll6uxtpahXm+xspJBFFUcOBB4UzHa1+cgl6uy\nvJymUIgRCAQ5cCDwCxcA9wsmk2bHrBCU5G6Dwb1TTL4XNJsy9+7FyeVqVKsJtFoXiUSJu3djHD/e\nRaXS4Nq1LVZW0lgsOrLZCplMhfZ2J9js9Lf50TfzeLv8XJqu8sw/zzEwIOL3txOPl0inqyQSRZ79\n4Sy5XJVSqcHhw+1YrDp+9MMZNreUTunUVJRmU6avz8HIiAejMY/dosYgV0jMzbKr14jJIKFRC3zx\ni2NEInni8RJWq45kssS1a2FsNh3xaJCeHhuf+sqjhBMVXvzpDTY2VIgCzM+nOHbQSTO5RSYS5/O/\nNYA5EOD2rQ2K+RJGvYhLI9Iqp2k1GlgsZopFHdeubZFKhTl3TsmwamszUS7XiUQKBAJmIpEibrcB\nv//tt2w/Kj4jly9fRpIk9u3b90A+/4OMf4PE+m6KkY/i/N8NPh4l7QeA0ePB7PeT29gAFOtiTSHG\nnsO7uDe1pahqHDb8bRYaejVbaYm7ixtsbJWRZTCZtESjRSwWLS1BzU9+cIVmvYmr20DLZ+T2pSXC\nl+5SrskY7DYks5VKqcxQd5CBoJrV2wniG0ke/cQgpVIDnU6kr8/J/LzidZJKVchmK3R12YlGi1it\nOmKx4k4aarMp8+ijveRyykptfNzPf//v59jYyNFsymxt5Xn66WEKhRrXr2+xtJSmXK7z5JMDVCp1\nVCq4cydKLFZgzx4lVK/RaDEy4nmTA+3HGeVkklIi8ab35EaD7NIskqaPEye6MNXizL10hnKhTHJa\nxUR8jT0Tk8iyBVnW09trx6vOcf30dRbOztISJFS7+xg/0MErLy8jt2RCq0kGh9zo9Yr0c3ExRbXa\nZP/+NjY2cmxuVqlWy0iSgNutdK3sdh0dHVYqFYXv8OUvj9FotHjhhQUSiTKSpGJ2NsnXv76PSLSA\nz2PEZBBpD1rJpFMMDupxuQyEQlmGhlyUSnXcbiOXLm3wgx9M8+ST/YTrDW5dWcF0tIPNu2G8gz28\n8OMF+ncHMBgUxdjr50Ls3buLdN1An9XM3FyKcrnJY4/10ttrR60WWF5O02zKdHfbCAQsJBJFNBoR\ni0WHVitx6JDCb1pbUzM01LNNCk5hNmtxuQz33SLe7zfR0WHZkZqrVNDdbcfrNb7nn1Us1shmq296\nT60WyOWqzM8nWV3N8OMfL9DXZ2d+PkU0qmy/xGJFegNqLLoUyfV1SjWYulFkcrKdYjHG3/3dVQYH\nndTrLXp77Zw61cPaWpbp6QRHjnSwtVXk/Lk1Tj3axz/+401KpQadnVZqtSayLNNqqRja5UbdqrJx\n6wrL0xuYvR52DTmRBZH2gBmVSrWtHlRsCvL5GolUhavXZ/mt3xqmt9fJ1NQ8oqgnHi/z9JMBrn3/\neQqxGLVShfzKIhOPHCS9liO2kSQyI5A/0MUnnuhDazZTqTS4dGljpztbrTap1Zp0ddl2ruVmU2Z0\n1ENPjx2LRfdhneL7imeeeYYvfvGLH4kog/eKo0ePvmuS98cVv4xixAv8fz/3XgT4/DsN/NM//dMd\nVu7Q0BAPPfTQTsW1uroK8JbXb+A/f73j6FHuXr5MKptl8KmnyK6uAlUOPdKJ1dOJtztIvZEinc6j\n06kZHnaSTG5hsehotdR4PEZ8vgbReAS12YpYKdLVaWN1+jbVTIO2Xj/GTicqUaJZFCg3BErlBGKj\nwsnPTHLuSoJ0McTBg+3YbF5eemkJg6HIgQNOlpYM/Md/zHPsmJVUqkS5bMJoVDM6qkGlUpFKldnY\n0FEsbmKz1dBqnVSrDbq6oNGQqVSavPLKCk884aKtrcWxYxOEQlny+Qhf/Wo3y8sywWCJ/fv1bG6u\nsbkpkUqVgSx9fXZOnNj7luPVasmsrKwgisI7Hu8P+vrnz9c74RdV3CpRRPULgqRUgkSp1KBWqRGZ\nukEyquxzG4xqGpUqtY0lfuPTT4JKoJyIE7owTXyrxsZamlq9QWQzw8DD+3jykwMIAhw/0YXVpicS\nKfODH9zbXskqqc7z8wnyechm4zSbMlqtiN9vpKPDwuCgg6WlNF/72j66uqycPbuOyaSlXG7QaLRo\nazOxuprB57MgN2qY9DpCa0mcbjNWq5Yvf3mUO3fiZDJl1tezfO5zI3zzm9dQq0VKpRqCICBIEsVS\nk6YMbUEHvbtNuNxGstkq3d02zpyREUUVTz01SD5fJ5EooVKpqNdbqFQqOjttO7L4SKTASy8tkclU\nkCSB/n4H/f0ONBoJu12PTtfHhQsbrK5maDRaGAxq9uzxMjLifVfn8P3ijeTu7u486XQFh6ObQMD8\nvuSl1WoDt1uPXi/RaLQjScK2sqa8U5TlclWq1RZzcwnUaoFIpIhOqyJ0r8pXvzqOEFqlmEyye7iN\noqznekjHl740RjJZJJOpsrKS5sSJ7m1vmzDZbBWNVkJv1NBqysiyCrVaWXSYTBoWFlJ4PUHGx/QY\ntBrUu3eTK7YwOBxceG2LXKGGy2mkt9fORijLlath4vEyY2MewuECjUaLTKZCIGCmUjFy714EtVog\ntZTBoavQ1u+kUatTa4lMX7xL1559bKyliacriAsFRk/Y0UYVwncmo2yJeTwB9PoS5XKDQkEhzGu1\nIvv2+fH5zO/qWH8UOCP1ep3vf//7nD9//oF8/gcdf+jQIW7dukWpVMLwDq63H8X5vxv8MoqRKHDi\n/Qz8m7/5m//yaz//C7/da63Fwr5HH9153ThwgGo2i6TXK9HjwL17dZaWiohiA7fbwMmTe9gKZUin\ny/T0uDh5xE8lneTUp8aweF1UZq6yenmRoQMnePVqgdM/WqGQr9K7q53f/r0jBIUwq6sZbs9uMDLe\njc05SKFQ41vfuq1EgO92s7KSYHDQte1c6kOWCywuJunosHPpUgpZlnE6q9y4EcZo1NBq1XA6s/T1\nOVlaUhGJFBgYEKjVmlitXvr7Jb71rVs4nXrCYSOi6GB4WGk/nzsXIp0usXdvG3a7DrPZQyYjUSzW\nMBo1dHV1Ua8r6oH5+SStltI6fsNL4L0c7w/j9XuBwenEEgiQXl7eeU/UavEO9ZPahNhmmWqhtPM1\nl1OPpBaplUo0azU0BgOlRIJcLI7B4KbelGk2ZfLJLJsLW1gdVjr7HJw+vUq+2MRs1jIy4uXWre0t\nkGOddHTY+PGPF6jXW1QqyjFTiMMpOjpsVCpNvve9e5TLAW7ejDA/n6S93UKrJbOwoPjE5HJl6nU1\nkqQis5igXq4iqRr4vAZiMQPHjnVw61aE5aUUpVIDs1lDKJTn1KkuSqUa3UNuTjw2QKkiMzUV4ebN\nLQwGNfsPtPPwwx3o9WpisQLJZBlBENi1y4XL9bMbWyql+Ni89toqGxt5BEGFKKq4fn2LI0cUw6Xe\nXodiIb6U2uGPlEp1bt+O0tZmue8cEoNBQ3+/832Pl2WZu3djTE1FWV/PEo+XOHiwjVqtwfJyBpVK\nxdmz6zzxRD8+n4lGo0WrJTM/n1S4I6KKRCbDxmaBoeEe5lZqXDq/QkWy8tzzi+h0Er/3exP4/YqM\nWC2CzykyMmDB4zGwvBDlxLEOMvk6gYB5p+PSaDRZW8vyxBO9/NtzMwwOuMilaxx76nHOnV/jzt0Y\nyWgWh12D3WnmkU8MMDcXY3zcy/iYh1dPr/CZzwwjSUpCucWi49OfHqTZlImEFqnkmuzf50arUzMz\nkyAWytLpsFGxdWB0qVA5bKxulsmVI4yMeBBFxdiwXm9y6FA7N29G0OkkjEY1IyMffTXdz+Pll1+m\nu7ubvr6+Bz2V9wWj0cj4+DgXL17k1KlTD3o69wUPMpd4H/ASMAL8FD64s/C7XV1LWi1Gj2enEEkk\nity6FaFQqJPNVqlV6vi1GR47YOALn27jE7sq5M4/T+jMK1z57o8IX77ERjJN2/g4mXSZrY00cqul\nrNAEieXVHIa2DoKjQ8h6O1vRKq1Wi1deWaa314bTqd/+w9bQ1+fg2LFO/vVf7yEI0NZmIZst0dvr\nYHDQycCAE5OpxNpamnJZya2x27VUq00CAQvRaJF9+/yATD5f5StfGeFAWHEAACAASURBVGdw0InL\nZcRgUFOrNanV6mg0AmNjPmRZplCocfduHEFQUanUyWYrTE/HefXVFa5cucv6epbXXlvj+9+/x7Vr\nWx/0tHzg8/VOYwRRJDA5iW/PHvQOB5b2djqPHcMaDDI66qW9242rsw2dXqKj04rBqGF2Nk6yKHL1\nwk3iy2uoBIFCpkwrG+PQsV6MOhCaFbxeA8P9ZpamN4lGi8TjJV58cZFwOI/fbyKZLDM1FcHnM/HI\nI3YcDv2O2uull5aQZRUXL26QzVaIRwuEQpkd9VIqVaaz04YoCtvjFAXD6vwWpXgMnz3H+ecuUEun\n+PVP9iBJAtFogUi0wPi4B4ddh9WqXEOf/exuREFAFFRsrqdxWLVkkkWmb23yk+em6eqSGRpyUirV\nsdl0PP54D4880rPTVZibS/Dii4vMzyd5/vl5Tp9eYWkpxdWrW4RCOTY38xgMahYXk9y5M/8WKW2p\nVKdQqL7l3NxPvJ/rJxYrcvNmhGKxjtNpoK3NzPT0/HaXsYFGIzIx4SOTqTA5GcDnM9JotJBlFUaj\nGp1WxGLWUSuXyTcNzC0kKYa3aPPqOXXcQmeHkhCu0QjYLWrsZoFWscBvPOZnyFUioMtRT2zS7tPz\n5Cd6OXasg+5uO+Vyg9/8zWHy+Rg/+rcFzl/YoFCWmV/OEUnU6egwMzpsx+XUEwyacTv1fONPDvLQ\npJ/ZmQiPnurCaJQ4e3ada9fCFIsxlpfTDAw4GNzXj7/NwsZmgZXVLA6ngUC3h82kTLYElaaE3WFg\nZibB2lpmu1Nm3T5emxgMGh5/vJcvf3mMJ57oZ3zc9562Ot7reXo/5/Wdxj/zzDN86UtfemCf/2GM\nP378OGfOnHlgn3+/xz9Izsh14NF3/K5fAgqFOsViHbVaQJIEPOo0hlaJ9IXX0Rn1zDz3PHq7HfPg\nCDN3EtjEMj2PHURIxNlKNIjeuondasXaFcDk1DF9O8zBA350JgOrm0sUK2VAWQEPDbmZnAyQTlcw\nm7V4PEYuXgzhcCjeIfv2+dFoRFotJVn29OlVVKoGpZJSRLjdBrq7PYpLogra260cPBggm61gMmn4\n7nfvotNJtLWZuXx5kxMnuvjDP9zHCy8ssbKiKHq8XhO3b0cxGCQOHGjjzJk1YjGlIMvnowwPK5Hf\nKysZfvrTJQYGHLjdH+2VkNZsJnDwIP69e5Vtm+2bpdGoYe/eNro8xwn5NKQ3la5EsNuDSpS48uxL\nrBl1PPTEJBa3ndlzC2jVah7e78DSPoK1PUAqUWQrlKTNZ0HSSAQCFi5dCvG1r+1DqxVxOPQYjRJ6\nvUQwaKHVanHzZhiXy0ChUGVpMUWw3UhPt5VUUpFBPvxwB3emoui0Inv3+lChJCyf/LUg616Z2IaE\nztBkPabi2X+5y29qDXgCdj71yX6uXd/CYdciN5oE2y3UKzXuziVo5VKEKiZOPzfFvoeHGRhwsbau\nxm7TIgmQzVbo73dis+kwm7U7suRMpsyNG2EkSbUdt1All6tRqzXJZiu4XAby+QrXrm0higKdnTJ2\nu5V4/GfdpvdiD/4gkU5XqFQaO68FQcXaWhazuUiz2SIazePzmSkUqqhUMqOjXkRR4MyZVer1Jlaj\nyECHl9h6GL/dR7Nex2ER2bg7h9kqYFJVKGZ1VMsWHj3VyWCbzGwohCaW5tpPztM3cQhBZcNoFujs\ncHDqVBe3puIMDDgoFmvcuRNFElXo9WoymSrpjBJSaTVrWVkJYXLaeOm523jsavo6DRzY62Oo34bZ\npObFny5hNqqpN8Fq1XHy5CgajUgqJmPt7Se/vsbtmxvsP9zL6GN7WcoYOHBAhYY6lWSY0HqaYspP\nV5edo0eDOBx67t4t4vMZ6e93/kL5brFYY2UlTTRaxGbT0dNjx27/aDmbFgoFnn/+ef76r//6QU/l\nA+H48eP8+Z//+YOexn3DR//u8R7wflv9ep1In0+mnkthsJrQyjKRy1Os/fRV/OMjJBaWsXidNCU9\nfV1BxHKK6twCapcNZ2cAz+4RNEY9DUHH3N0Q/k4f9UqdlduLdPs1vHQ2QqPRZPduD41Gi9u3o+Ry\nVUZGPMzPJ5mairGxkaOz08rCQhKdTs3FiyEmJ9tpNJo0GiaCQYFKRVnVTk/H6e21Mzzs5vXX1/mn\nf7rFH/3RfjY28gSDVvR6CVFUIYoC8XiJYNDGoUPt2Gw6ZmcT3L0bZc8eL4GAmbm5JMlkGVmWKZcb\nLC9DqRRmcjJAIlEin68Rj5fuSzHyfs7XO40RpF98STva/Vg+/Ulmby6h3VWlHN7gztkbqKp1ksUG\noalZeiYnOGDzcefVK4iSQDJdp6avsJUoc+XcEpY2P6WaivZ2C1/84hjlstJar1abbGzksFp93Lp1\ni1isyN69fpxOPfPzKQRRhcWio9Fo4HIauXxxlYlxL7/71TFcTj03r61z7/oKXUPt5LJlxYBvOMC1\nKyF++uN7WB1WLl/eJJlc5MjDnQwP2DFqYXdQpGPAz7WrWwjZCHM3l9l3cg9Gm4XL51Zxu7SUmhoS\n4TSVUz1shZNshssMDCgEyzt3Yuh0IpHlTerhFew+CznZzNiYl7Nn16nXmzgc+m05p5+pqSitlkyr\n5eb4cdNOMSKKKvr7HTuS2F8W3s/1o9NJb1LkpFJlEgktxWKdCxdC5PN1rFYtf/zH+7lyZZNkssxv\n/MYQdrtiNgYQ30xgMbVjMTTZva+bs68ssDm9js6ow+11MbrXQUevHZtQ4LVvfp9GsUSnf5JCPE3l\n6hWK2g7yhTov3w5z9IlxyjUdUzc2yJWamIxG2oMt9kz4WFtOUq3UGB52sRHK4PLbmZtN4HEb8DjU\nnP7uy2i0asZO7sXd3oWREnqDAUeHH51Ow+uvr6NWC3R22qjZ+hG0Hk4dOEKhoebmep2jR13oKXLp\n1QUsNi39/Q6MBpliVpH1jo56GR39r3lA1WqD8+fXWV39mRv22lqWU6e6sVp/Rmp90JyRZ599locf\nfhiPx/NAPv/DGn/48GFu3rz5jryRj+r83wm/UsXI+0UzvET62llCKwmaLdgz7kUtQrNaQWs2Yw74\nsfnc6K16jCao5gVqxTLTFy8T/PRvoxIEpq/MozFb0JjN7D3Ug92q5l9evcuBR/byhKGHe/NZPvnJ\nftLpMpcubeLzmTCbtbz88hI2mx6rVUtbm5lnn53B4dDx5JMDRCIFjh3rAmRUKvB6TdRqLX7wg2mC\nQSvLy2kaDZlduzz4/Was1tQ20a6Ax2PEbtfhcump15tEIgVu344Qi5VotWRu344yMuKlUKgBinfL\nG/v92Wx1R7LZ1WXbuXF/HNFotEilSsgyOJ16Mk0TuVKdaiyNs7cHmg3KqST1ao1caJ2RJz6F2h3g\n4iv3EAUVgiiiqueo12VklUA8XsTlMtJqyczMxHA49MTjRc6dC/H44/382Z8d4caNMMGghVyuSqFQ\n59q1Leanw3R2OTCatewZ91EpFJGoE9mq4nZokTQiZ15ZRKuVuHl2iVimiddrYfduD7LeRiJRZOrm\nJm6njjvn77Bnog2DxQRaDbN3N2nkSzi7OlCptYwd6OH8a4vUKjXKNZnhXW4W5+I4vFbcbsUvRpIE\nBAGi8yusXbzC1ItTGIwa7O1+Jh8+vi2XlTEaNRSLivS31VJIsCoV2O06Hn64Y6dbFwhYPhbKLJ/P\nRHu7hfV15QFaLjfw+82sr2coFhuEw3m2tnIUizVGRtzcuBHh5s0wPV0WohtJGvUmew90UG2AChlz\nbgqv18iWzUA8ViDY2cJvqqPTCtRbevo+9WlaxSypQpJcTUKfK6Dx1LF4zeiNSZZnQnT0tbFn0EAk\n3cLTZufUIz3cuxvlO9++hdmi4U//j2OMjbdRKzlo73TisanYuDuPUCtSrgqsXJliT4+IU07QrNto\ntdqYnVUsAs6dW+cHP7jH3r1+DAYNY2MejEaBzc08UqvJ8kISd4ePrUiJhVAeg1RHNlp3umZvh1is\nSCiUe9N7iUSJzc38m4qRB41vf/vb/OEf/uGDnsYHhtFoZGxsjEuXLn2sHGTfLX6lipH3o28up1Ik\npu8R8OrQCHZC61kKG2s4OtoRdXoko5F9v/MlkgtziIJIoVzEO9hLUaumXmtRuneF3/39TzK3uotM\nroGnzUqg3UY2U8ZgNnH9tbt0jA1iMGi4dy8OyMiyTK3W5MKFEHNzST7zmSHa2szbq04Zn8+kJMvG\ni5jNWh5/3Em1aiadrqDRiHzmM0NotRKxWBGzWUMuV+PZZ2cIBCzodBL9/Q70egmzWYNWqyaVKhON\nlggGLezZ42N1NUMkUiCfr9Debt32NJFxu/WMjWmo1SxoNAL79/vp7rbdtxvLh+Uz8l8hm1W8VjY3\ncySTZXQ6SeHXaHQsprQs3QthdKoYHezC2QFqowGdQYvXbyVgrtBqtrh9PUO1AY89tYeFtTKOUpPB\nQSdqtUCt1kCWVQSDViqVBjduTLNv3xBtbSa0WgmHQ+DVV1eQZZmZ6STZbIUv/s4E+54epFXKU62r\niCUrpNI1RElkZjaD3WVm36E+spkS8/NhBna1kSlCqSHj8DkQNGo8bXaMXh+jY36iKyEGd/t56ccZ\nFmeWmZtLMjbZz+99/SGS4RSyqIZ6hbVwmL5dbTSaRXK5Km63nrXlBDcXlnA5jBz+jSPMXp2Dcp7E\nzDQ6Yzf9/Q6sVh0//vHiNklai89nwmQqodVK9PS8sxvk/cT7uX50OomjRztYW8sQj5fo7bVz7twU\nL7+cQq8Xt38vG5ubOUwmLZlMhXK+RPTKXQqxBP0DLkzRMFpXL+dvFxmQyowEmuwdmyBbLSCVZSS7\nmavXY4RWEixPLdHZ4+KrXx1HK1eIrW3hnpjg2p0EvXsHGdvXSSlXor1HxWNtVlKpCMvrMj/5yRI9\n/W6CQTM3r2/QN+DmC58fYW5qnTM/nkKlsVNVm6mmkgzv8iCkN3nsySHKkpW51QqGQZF/fz6yIz+f\nn0/SbMocPNhGtdrE5TJw5fIGnV1WLl2NcfnCCmqNGr/fyOJcnFAoi8djfNtjXKs1d6IW/jNKpTen\nOT9In5GNjQ2uX7/Oc88990A+/8Me/wZv5O2KkY/y/N8Ov1LFyPtBrVSiUS6jVos4nQYS8RI1wQCC\nQPDIYeztATYvXaSaz6K12Og59BA1RKr1JpqeESIaP1d+cAHfUB/7joygE1W8/C+vozFZGT8yzL//\nv68xMKnB59NRq9VxOAykUlGSyTJ9fXampqLcuRPj8cd7mZjwMTMTR6tVVjThcAG1WqC3V8XVqyGe\nemqYwUEn58+v09lpxWzWcu7cGplMFVmGjo4CJ050cebMKvF4mcFBFxaLhm996xbJpOKqub6e48SJ\nLkBGrVbUNG/ICtPpCj09dsbGBlGp2Jadmmlre3cSvo8apqairK1lCYWyrK1labVkvF4TW1s5QrEm\npUIFWWwxfTtE78AE3SM9CKKIrDdj6B9FquYYsMncms7REHRMTioqDodDx8ZGHofDQKslY7fruHUr\nisVSYX4+zU9+ssDnPjdKuVwnlVIKSJfPis2moxhPISXL3L0d5sxP7yFp9fhGdpEqyPzayV5m5tNY\njCqMeiOpQp3BsQ4uXQ1TyZbweM2M723H5zGwvJLhhf+YQaLOE091MXagSiFfQRJVaDQC1WKJPQc6\nmbq5ycJKnuG9PsXWO5mjs93EKz9eoTNoIrq0xXrIyPC+HrofOkC9VKS/346uu5dGQ8Zm07J/v59M\npoIoCgiCCo2mhcv10eIFvBeYTBp271Za9plMiXv3Fra7jkqXpL/fSSJRRhRFzGYNHmON5QuzNOsN\njGKVQMCCqtxk9+4xyKvI3H6FxtoWJanJxORerkdUhKMlZElL20AnpWKRS5fDHNo7hrd/P6dfXkRr\nNOJuc/P9793FaNJiMWvxe3LotRnUkpfeHiUrR9VqEo8V0Rm0hCMFzG4HapePtYUwLreLY79+AJvL\nxFqhgK1QR9MMkb0xi28syK4+J9evh9FohO1IBwPlcoN4vMjwsIvZexEmhoxIagGHy0SrKeMN2Onq\ndbK6mmF83Pe2x9Fm02E0qikWf1Z8SJKAx/P20tNfJr7zne/w9NNPfywSet8Njh8/zl/8xV886Gnc\nF/xKFSPvpxpT6/VIOh31krLas1i1JOJNerv60feNkLz0Glu376B3OgnH68zPPMfxr3wKr9NDaayN\nK8/fRGe3c3cdXp+d4beeHmTkyBjx9TBOp44vfOMR4iUtn5j0oFIpe9VqtciVKxvodBJ//Mf7KRRq\nWK06trYKjI56uXMnCoBGI2y7qWoplbIUClWMRg2HDwdZWkpx6dIm0WgJm00RIt2+HcHnM3L4cDu5\nXI1du1x8//vTVKsNDAYNs7OKRbzZrMVi0XL0aJC1tSzDw26Gh900Gi28XiPj416KxTp6vfq+SjXv\nB2fkDZRKdba28tRqTaLR4s5WUzpdZmsrh87lYaTTSbOkSFhzggNbZycATqeRMgZyVZGOIQvnbt3j\nwktLeL0m3G4DTz01hM2mZ31dMd9Sq0UkSWBsbIjXX1/dUb2Mj3vR6yUkScBs1uNyG7HqW4RWEty6\nsko1lUJtUlNYEalZe9mMlHG5jBQW1xDlFhN7hiiVq8TDOSrVBsNj7VQqTV746Rp2q0RsLYIkyKhf\nXcHjt3Hy1ydw2STKNbh4JYLGbCZVVPHIr48RCJhZX4xw9CEv0UgBbS1NKpTB4rKxtFnn3/91iiee\n6OPepWlE68N85hMuDAbF2VSjkbh7N0Y+X8Nu1zE+PvCRMLp6N9dCo9EkHC6QyVQwmzX4/YovSbPZ\nIputoFYLTE7upl5fo9VSpL+zswkmJ9uJRoscezhIK3YPjQSiVk2zqXQ1NeU8Qr1CUe1APXgAIR3F\nJIJ5YITk/Do3bkQolRpUKzV8bj2jahOGtg5++vwSFZ2bPQfaef75eaZuhjBbtNgdBgRZ5vf+YAKP\ny4DdpmErlMVituO26TAY1KTTFV59dZVarcHhU7sZH3Fw+fQ016/MYBbKlNJpdh8Zw9XmJHp9kY6A\nirExL/PzKYJBK1arwgsZGnJhMmkIhwu01Do0QotgmwGVKOD3mzE7FC8RQVC97TF2Og3s29fGrVsR\nisUaOp3E0JCLtrY3E10fFGdElmW+/e1v8/d///cP5PPvx/jDhw9z48aNt+WNfJTn/3b4lSpG3g8M\nTifuXbuITk3RrNUItFtx93YhBIbIbmxRLDcQHV5yFZlcroRWI1DMFXAP7WXm/DQap5uKZGJ+IYvZ\naeHc+U3a201U6laODnYiqiVMkSLpdIW5uQSSJNLfb2dyMoAgqGg0WjQaTV56aZnZ2QSf/exuXC49\nbrdxR3o7NRXDZNLQ3W1ndjaBSgXj437C4aJCTqs1WV5Oo9dLJBIl4nFFeTM87CYaLWE0qkmnlc6I\nIKgolep0ddlYWEhup3uWUKlApVLRbLa2yZcG1OoHqfz+YNBoBLRaxcH2P3NelPAvFfl8ha4uL5Lk\nBsBo/9kNVGnlKwXf9etK0N2RI0G0WglZltnayuH3W3jqqSGq1SbJZInBQSeRSJFqtYXLZSQaLWA0\nBnnyyX7W17NYrVri8RKqfIKaxkSmJOPoCKDTCogaDZ1ddpqCCo9bR1ByQiFFd7DB9FKBow95KFRV\nJDMVpqai2BwGJEnA0e6nVmuQyrWwu2WuXY+xa5ebO3diaLUS1WqTYrHBxYshTp7sJrkRY/Vmivbh\nbuR6nXK1hdHZTja1giwr0vRAt49MRWJrq0BfnwOAzk7FkbVabaDXqz8W3BBQOntXrmwyO5uk0Wgh\nCCp6emzs2uVhakrhT4miivFxD6dO9TAzk0ClUvHkk/07RPF6vUUr2qJYqhOPl8hkqyQTJUYmBxga\nDTC3mCPbNBIpefD5TBTqaprNFqKoXH+iqKXSUGFxmCnVVaQzNbxeI+VynfnFFKWqjFiqE+xQ08xn\nqaZT2L1NnnqimxdeXsXtNZMttLDbdeTzNZLJErdvR3ZSh1fiAo5gB83oCpLFwfXLq3z604PEVjbR\nFhNM7h9jeNiNXq9cux0dVgYGHLRaCnm3Wm0ycrCfM68sImoknH4nWp2aoSH3uzrPQ0Mu/H4ThYJS\njLwhW/8o4PLly5TLZY4ePfqgp/KhwWQy/cryRn6lipH3u1fl27MHk89HOZVC0usx+f00VRJTxSJb\nghXR4oJYHIdNh683gMVhZfbKJdZvh1me3cLd2UawZ5C6oN7+g1dMrmLJKqOjNrw+My+8sIjFoqPZ\nlInHyyQSStjd88/PsbaW5ezZdXp7HXz3u3f40pdGGRvzcONGmHK5yeHDZjo7OymVaoTDhZ297t5e\nO7dvRzCZtAwMOInHS+zd69+5cYVCObxeI5VKnUJBMesymzVMTPjQ6STi8SJut1JwyDLbdtRpZmYS\nrK5mMBrV7Nrl3k6S/fBxPzkjkiQyPOwmlSpjteqoVApotSI+n5lisU4kUkSSRKrVBGaz9y38B4fD\ngNGobF+JokCrJXPu3DrpdJnRUS8dHSKrqxkOHWqnt9fGzZtR4vFN3G4DoqjC41F8Xo4cCTIx4ada\nreP3m1HHF0htxOgb9JJP5VDKJIFyscKRk1045DixuoqW1sK9OzNkFhO0XF3MLjbQu9x0eczkchUi\nkQJjYz4lZdioZnzcRy5XJZ9XHgqjo14WF9OsrKTJZqt43DVMOiuiVcDf4aSht2PQi7QECVu7n84O\nCzafG8nuRq3XUyzWfu54CkiS5n2ft/uBd5pHLFZkbi65E67XaslkMlXOnFkll/uZJ8qrr97i5MkJ\nPv/50TeN1+kkpqfjqId3MXVxHpNJgyxDtSVQtwfRmww89JCV3l47m5sFNjfXaW+3cPhwkOXlNKFQ\nDr/fjNttQKMRKBbrfOITfdy4sUW12kSnU1OpyeyZ8GAVC8zNzZOK6LhwaxOd3c5XvnScWKrJZrRC\noVBjcTFFV5eN1dUMkiQoickqATRqtAY9cqtJtVRjI1whUiwz0mVgfI+ftVCeQMBCIGBhdNS7Q04/\nerSDqakoDoeez31pL/l8DZfLQH+/g64u27s6xqDIiN+OV/agOCPf/OY3+frXv47wC9yZfxmff7/G\nnzx5kpdeeum/LEY+6vP/r/ArVYy8F8iyEipXqTQxmzVY29owt7W96Xs6hjvILg9gdluRywVS65u0\nTY6Ri8apZLIcPtZLOpFDqJXwGBsUtXoGBpyk01Xm5xPMzMS5cmWL8XEvJpOGixc3qNdb2Gw6AgEz\nGxtZjhzpwGpVwrI0GhGrVcff//01HA4Du3e7sdnA6VQC0qamYpw9u4bBoCGVKtPebiGfVyLtC4Ua\n+/cr7qr37sV2VBCHDweJxQrcvRtHkhTXTZVKxdxckocfDiKKIul0GVBuKoJQ3ZFwFos1cjklFdlk\n0uxsR3xc0N/vRKMR8ftNbG7mt91GZQ4daqdebxGJFKjXjUxOdhIMWt8yXqNRipdotMC///s8q6sZ\nmk2ZdLqCx6N0J15+eRmv14QgwK5dbtrb9VSrCtlzczNHpdLg+PEums0W1WoTi2cAfS2NztHJ6dPL\nrC3HcXa00Tfgp9On4af/ss71Cwuomg2sfi3t3g56ehzcSza4fTvCiRNd1GoN9HoNBoN62zBNh0oF\ne/e2odWKLC4mkWWZUqlOLlel0WhRq8vcXc1w9HCAbK7OwG4/S4tJ/C4b/UYLPp+Jy1NJnE4DPT3G\n+7bCbTWbCG8T3/5holis7chx34Asy6yuZt60/SjLsLSUZtcuD/V6k5WVDMvLaVQq6O21k0iI7Hn6\nU6TX19Fotei9PsI1Pel0Bb2+yaVLmyQSJSqVLJnMBlarjuPHu7DZdKyuZlhaSnPnToxEokx/v4PO\nThuCoOLAAR8ejwGfU830qzfo7vdiNUJN1SCzsYWYj3Hzag6Ty4XdrmzjtrWZOXIkSEeHFbtdz717\nMco1CYvZQStXwNNmwyDW8PqtWHr6uXorth182M7goOtNwYZer4lTp5TFilYrvcXI7uOMdDrND3/4\nQ/7qr/7qQU/lQ8cTTzzBN77xDf7yL//yQU/lQ8WD7Ld+Dfjd7f//X8B3f+7r8hsR1R826vUmN2+G\nmZtLUqs1MRjUTEz4GRpy7XxPo9Hk2qVVNLkNNq9eIxtP4xsdxd7dxcv/z79g11Sxex3ktD7WNwto\nXH5Mnb243QaeeeYOyWQZh0NHW5uZUqnBI490s7mZZ24uCSgy0y98YYTeXic3bmyxsZFnZiaG3a7n\n7/7uCgaDwtcoleq0t1s4dqwTtVrg2WdnkWWZ//bfDvOG9DKXq1Is1nf+L8syarXA8LCLer2JLKsQ\nBEV2d/NmmOXlNH19zp3gM0kSkGUZWYZXX1UyaUwmDeVyHYdDTyZTBhQjpt273fT02O9L2JRKpeJ+\nnfNWSyadLm/LUvWoVCoqlQa5nNKqttn0mM1vNQGORAp861u3uHEjzNZWDq1W2laZaBkZ8RCPFwkG\nbWQyFXQ6ke5uG0tLaTIZpQjo63MwMxPHYtEq2SQagVOTNshEiCSqNHQOii0tM/Npjj3k4Z//+kfE\no3mSiTJmiwaz1cSjnxohKXgol+t4vSYsFi2hUAZJUh4ssgyvvLLMww93cuJEF6+/vk44rHBhFhZS\nO1tvogCtRoMr55bYvduNRq1i974eOrvtPP/8AolECafTwGc+M8TRox0f6sMpv7VFfGaGSiaD2e/H\nNTyM3q50o+7XeQ+H87z44hK12s9kqm63gVAo95bY+44OK5/4RB9TU1GuXt3cUYlIkkAwaOb06VX8\nfjOxWJGFhRQul57/7eujzN8Jcf31adR6PTqXh9VIg2DQSrXaIJOpcObMKoGAGbNZS7PZYn4+yZ/9\n2RGsVi1arcStWxEykSSVcIi+bjMLF2/Q12nEYtbiGR6k2TGOWqvh9OkVnn12llZL5umnh+nqstLZ\naWNqKsbp0ytoJJjYZWa4W8/qnSUEq4tk00qgXXFp/vznRxkcO9yAoAAAIABJREFUdPFRwv38e//b\nv/1bLl++zHe+85378vMfJBqNBl6vl6mpKQKBwIOeznvC9nPjFz48HmRn5EXgf27P4RJvLUbuG7a2\n8ty5E9u54eTzSuKt223YWRGm0xUy8zNsXrvB0lIKQVBxb/EyJ37Hjc5sIp+rY2vUcBuz9BxuQxvo\n5vRUjVKpRi5TJh7N0Wo2GR52odEojqC7d7sRBNjaUnxAnE4D6XQZs1nLvXuL9PQ4sNl0PPKIkvSp\nUim+CNWqEqg2O5vYVtFotj0fBLRaifX1OMlkCbfbiMWiweczEQ7nuXUrilotMDLiYdcuFz/5yRJu\ntwm73UC5rPhfNBotHn+8D0kS2NhQvBd0OolXX13B4dCxuZknk6lw8GAAq1VHOl1Gq5Vob3+rG+NH\nGYKgetNqv1Cocv58iM3NPM1mC4tFy0MPte+Exb0Bl8tAR4fCl3jDGrxabVKtNpEkkdFRhewbDFrQ\n6UTm5lLMzyfp6LDi85lYX88yM5Ogo8NKKJSl2ZTR6SS6u4O8PLVErZYkm62iUqmwGCX0Rj25XBKV\noEKr12Jzmth1cJBUWeLs2bWdbTq7XY/FosbtNvIP/3CNhx5qR6+X+F//6yYTEz48HiPFYo1Pf7KH\noEeiki9g8vn5x3+aIldWkcjJ1BpN5n40xze+cZATJ7pptRTZeV+ffacQKcbjFGMxBEnC5PWis735\n+LwbFONxVs+coVZQeA7lZJJSMknPI4+gvo8qB4/HyNCQk5mZBPV6C1FU4febcTj0zM8nd7J11GqB\n3m4z8dUNbl1cplyU0ZgUk79Go0UolGd42MWlS5tcuxZGpYJdA1ZmXrvKvdk05WyeeqFIKpxAdHSw\nvNzk+PFuVlfTuN0GbDY9y8spxsa8TE4GABXXr21x6FCA3bs9VDt0rJxZZvq1K5gMIrNzKfbtb0Pn\nCxAttWjkimSzVex2xY9o1y4XN29GeOmlFQYHnXzhC6PbW3RVJLeTNbnG3XNxGo0cBw8GOHKk/W3/\nXt/guPyqQJZl/uEf/oFvfvObD3oq9wWSJPHYY4/xwgsv8Ad/8AcPejofGh5kMbK2/W8TaLzdN75b\nvNu9qmi0+BZ9fLGo5NK88cBqVcsk5heRWzLVapNKpY7QrDP78lkCo4Ms3bhKcm0Ta4dA94SVss2F\nKEQx61Xo1DJaSWZ02I7TrudWKMbCQpLduz0MDTkZGnLT3m7m3Ll1ZFl5+DcaMnNzCYaHXTgcOlIp\n5aFfKFTp6lK2cIJBC/39DkKhPFqtiNms3SZKqrl5M0ssVmL/fj9LS2nm55OMjnpoteDevTiyDLdu\nRVhf/5lJkU6nWJvXag0kSYPTacBkKjI1lSaVKvNGwqzVqhQlFotiIb6+nvlQipH77TPyBur1Jsmk\n0hVxOpXtlYWF1LZ7agKt1kU2W+X69TBer+lNq2Zla8tNqVTH5dITiRRJJkuMjXk4eNDPmTPrLC+n\nkSQBu72MSmVnaSlFpdLA5dITjRZotWQKhSrNpozJpMFu15NMlpiaiuHxGBFFAVH8/9t78+C4rvPA\n93e7b+/7ikZja2wEuIAbQBKURImiZFGylOh55MyMHHvieF5cfiNHznOSmky9vBfFcXnKlakoVtWU\npXmx68U1kR1viSKF1mKPJWsjJVAkKJIghZUgdnQ3et+X98cFmgQBLgAaG3l/VSqhL/uc8/X9zr33\nu+d8i0AyA5baWowDQeoaXVQ0WRgdV/HhmRBGs459+6qIRKSts/7+IDMzSTo7q6iuthCPZ/nZz3pK\nzsx791Zy/yEvudA0l35zipyQoG73QZTFHEqNBoVKjaKYx+GQqjjPGVlarVhayg/29zPy/vtkE1Km\nVa3Nhu+++5hOJJakg8joaMkQmSM+OUnC78dSU7MkXV7NzeaCUqmgo0M6P5FIGrNZjdstJayzWLQM\nDs6g0YgYdSGE4TOMRtJMX5wmHE5ia2jA4JKcmwUB6uutvPXWMF6vEZtNR0uNyEDXAOmCmanJGBqt\niN4O+VgEq7ea06fHAejrkxITTk3FS/48L/38LCfeG8JkuBtRUcTqMFC/q4nUTIBAPIbTYMa7YytZ\nnRMTSkDN4OAMarWSffsqOXlynAsXAgwOhhgcnOHDD8c4fNjHqVNjBIMpPB4TkcgkAwPSVpXTaWBi\nIkZjo33e+QkEEvT0+JmcjGG369i61bmgEm85/IPW2mfkpZdeQhAEDh06tKz2m8Hn4tFHH+XnP//5\nosbIZpB/MTaCz8hXgH9eywENBtWCY6I4F31RYGBghpg/RCKeIRZNS1k2p/KkwhGi034uTTbRfF8n\nxngMs9tO3eH7mPBnMaouo07H2d/h4SMhh6PCxM9+fg5RJeL3xxkfj3HkiA9RVDI6GiWbLVAsgtUq\nhRqKohKjUcP99zegUl1iZiZFU5MNrzfP6dN+2tu9DA2FueeeWjweAx98ME5PzxR79lTy6KNb+M1v\nhkincwwPh6mrs5QeKvl8kZ4eP42N9nnGSDqdw2zWSE55s5ESVVUWPv54Gq1WqjXicOhQq0WSySy5\nXAGVSskqrayuCsFggvffH5EiWQSorDTS2VnD6GiEQkEK0xRF6c0wEkkTDqfQauenvm9tdZJK5Rga\nCmGz6fB4jOzdW8nJk2NMTMSIxzOcOzeN2ZzkySfr8HpNBINJpqbiuFwG/H4pA+yWLQ5EUUFPjx+v\n18g999TO1oJJMTQUYutWBzWtdeSUGixmLR+duoiocdNzMUg0muHwYR81NWbsdi1Go5qPP55kbCxG\nR4eXt94aIh7PzupNycR4hPd/HWFXi4GGBjuf9EVJTk1Q5xaJZ/RXFWtUYTComJpKIIoKtmxx4HIZ\nyKXTTHZ3lwwRgNTMDFPnziHU1y9JB4XcwneNYrFIMX/zLJ8rRRQVVFebCYWS9PXNcPr0BA6HnuZm\nB7t2VSAIAh8eO0Z4ZASt1Yq31kqwK0zk8ghaiwWl+kqVYINBhVJpQBAEkokMA+eGOfDYIfyTYfxT\nUVRGNWa3mt3tlbz99iUGB0P8m3/TSiyWxes1olAIHDxYzbPf/jUCcGlohv0dHk6fvEwOJVs67sWl\nnKGpsZ5YQc/57mm0WhVbt7p48MEG3ntvBKtVx7lz01itWoxGFSAQCCSJxzM0NNgxmdTkckVyuQIe\nj5nGRhuTkzH6+oKllw+QjJS3377E1JSk30BAmq8PPdS44WrLLJWf/exnPPXUU6uylbxROHr0KF/9\n6ldJJpO3TQ6VtTBGKoAfXXNsHPgccAB4GPjfyjHQrVpj1dVmnE4ppHWO2loLLpee3t4g7747jMWi\nwdfWwJlfn8Tl0mOzqJgS49R37ERhMxPvv8TI2BR1LSn2qJU0NBjZu6eCrjc+YmdrLXfdd5j/9eYl\nvF6L5Pk+W5NmYiLKZz+7HaNRhcOhw+9PkkrluPvu2tlcDtIb3Je/3IHfL2XLDASS/N7vmXC7DRiN\nagwGFW+8McC5c1NMTcV59dU+Ojq8/Pt/v4N8Xtq+0enmG1yCUMTns9HfP8PISGS2yJ6ZqioT//qv\nvSgUsGWLk927W5iYELHZdLhcerZvd9PbG0SvVyGKClQqBbW1C509V1Nfy21TLBb56KNxRkejpWND\nQ2GMRg0mk4aengHi8Rxq9RRVVSYaGmwLfAkAdDoVBw/WsH27i3y+iNWqxe9PMD4ubbcJgsDYWBRB\nkHKPPPbYFrq7J0mnc3R21mCzafH740xNJejqGqOhwUYikSEYTNLR4eXkyXEqKw04HAYaGqw0N9t5\n9dV+NIZKFApIpfK43QZ6e4Ok0zk++SQ467BaSSiUJBZLUVtr4YEH6slmC2g0SuLhOIV8EZfbgDku\nYleryUxPcOSedrbnHRQK0u9oaXGi1YrMzKRwOnVUVpoQBIFMPD7PEJkjGQjQusQ3TlNlJdNqNfnM\nlQgdjdmM1m6/Qaubc6tzIZnM8s47w4yNSaszY2MxxsaiPPhgAxaLFmMqRQJIhcNsra8hm6lmbDSM\nWixS32Rn164Kstk8W7e6OHlyDKNRhT+mwF3lID99icP31zMdzKBSidz16H4CsSIOhx6TScO+fd7Z\nkgRJursnGR+LUuez43brmRn3k09ZOXy4jt+8O85EVEVr61ZefnOUs2cvUFNj4fBhH8Fgkk9/uhmL\nRYtarUSrVeH1mtBolPT2BgHJD0qrVaJUKujqGuPSJQGvV9pmPHNmiomJGCaThro6C9u3u5iais8r\ndAhSGYixseg8Y6QcUVNrmWekt7eXV199leeff37ZfWyGPB0ul4v29naOHTvGE088sebjr0b7tTBG\nJoH7FzleBfw34LeBRd+1/+iP/gjr7B51a2srnZ2dpR86V6Z4OZ8tFi3NzQqMRhBFOx6PAUEI03f2\nY6L+AjX2IuPhKQp6K9sO7SE5NYHRo6Hp7kaMxgrGB8ZIWXU4Kppo3OZDpdUyPHIZqy3DQw/UMJnQ\nMhMfxWxOotOLqFQiIyPDCEIGUTQxNhZhcnKEbdtcOBwWAoEkMMPevTo6O1uxWrVMT4/h9cLOnXWI\nooKJiREgQV2dm1OnxvH7xzAa40xNSQ6MFy/2YbensdkqaWiwlX6vRuNEqRSoqYHJyRH27fPS0VFJ\nPD6NWq0s+YSk034mJ0fR6drZu9dDIDCG3x9l926peqcghNDr4+zfv53qavOKzv+NPpeTaDS94IYL\nMDg4Q0ODbTaPS45UKkc+X+TQodobhihenejr6pcuvV7EbNaQyeRxOHQUCgW8XiP19TZ27/awc2cF\nAwMz/OQn52htdZLLFSgUYOtWF3a7js9/vo1oNItWqyQUklK1ezxGKXQTKdfM3MrNxESMVCqHzaZj\nYGCGw4frEAR4990RLl0KSW/IdRbMFg172l14LHmysQzbtrpIpXPUNBh4YF8bsVgWne5Kpd1rFzvU\nBgMqo3GBQaJ3ua5bjPB6mLxeqjs7mTx7llwyidZioXLvXrTmtfE7mpyMMTERn3csEEgyNibVUNE7\nnST8figWKUyPsLfBxq6dzVTs3IbbYynl2/h3/247jY02hodDDA2FufuJo4QudDP+cQ8V9R5aDu5h\nS1sN+XQSh1XDL4718vJLF0lnpYy1tbUWivk81RUigYkpFIKA06Gl2RKi7j/sYnomy8svf8I771xG\npVIyM5Pivfcu8+CDDSiVCj7zmVb8/iTJZI5EQvJTqqmxkM8X6OysJpvNkU7n8XiMHDxYg1arpK9P\n2rJVqRTk8wXOnJmkWCxit+sWXeGcC4PerHznO9/hy1/+MgbD2hZtXA+efPJJfvjDHy4wRjYr67lN\n838DbuDns58fAVJXf+Fv//Zvr9v4WuvL5/PNe6At9u9X09bWQttsWoFiscjUxxOMnvmY7vcHKAgi\nVbu2k3M3EVN7cPpa2dvuRVnIMvJRN8N6F0O9QygLeoomEdNoDJ/PR6G6mk+6LvDuS+9jdNqx2yqJ\nRfsJBKNcupTHbNZTW2vho48m0OtVmM1KisUolZVGMpkK2ttrqKoyz94sPCiVCgwG9YI9uFQqh0bj\nxOGwEgj4Z53X9FitHqqqTDQ22mczukYRRYGWFietrU7i8QzDw2Gi0QwWi5OhoRBjY9KqgUYjedp3\ndZ3nyScP8ZnPHGR6Oo5CIXD//T4EQUCjUaJWi7d0fm/l8430dT2Wsh+pUikXTdxWKBTx+xMcPuxj\nZGQYsOLxGJe0PG2366msNDEwMIPBMJfZM0o6neenP+1BqxUJBlNEoxnuvbcWr9dEY6OjFEZtMKhR\nKgXsdj1HjjRw7twk58756e6WnI6l6rJh4nEDyWQOUVRQUWFAqxXZscOA0aghEEgwPh5nYCAord4c\n8DI1EUZJgccea2ZbjUDk/CkoFplKpjAbHUSVDs6fn6a21loyRBZD1Gjw7NrFyPvvS/4egoDObse1\nbduS94QFQcDZ2oqlrk7KdGw2o1Qt3CpdKrcqRzZbWLTY41yUTcJsRme3kwwGKRYK5BNxqtp24PTO\nd9a12XQ8+GADg4MhzpyZYHgqTm+4DoXRxeCEkpHTk2hdYzBwEoVSxd6tbtTFFEm0NDRJK1Bjo2Gq\nKw04zQpaWpzUGqOoDSbqt1eSPD2JIIRKfkuiqCAUSpFIZNFolJjNWsxmKQX76dMTpfD+HTvc+HxW\nXnutj1gsQ39/kN7eQUIhLY2NNurqLKVt6HC4yOBgiNpayRE+Gr2yWqXVilRUzH+IbyafkWAwyD/8\nwz/wxhtvLLltOcZf6/ZPPPEEf/zHf0w4HMZiubJavVnkv5b1NEa+so5jzyM+Pc1EdzfFTAq7XcfI\n5QhDH5xm62MVDEW0VFTYsVZID+tiLRAcplqjQqtxkcgpOXFidNb5Uw2WCgy1jfQPhtjuUXLo3jq6\nuqT6EPv2VRGLpclmC9hsOtxuPZcuhWludlBTY8Fu1xEOpzh1aqIUmtnc7MBkmr+37vWa6Onxo9NJ\n6ZfD4RQmk4a2Nje1tVIOg3vvrSMWy6BSKUoPHatVh9UqPXADgQSnT09c95zY7bpVTQW/Fuh0Klpb\nnZw4cSVUUwp5dnH27CSZTAGVSoHBoGVmJjW7EnFrKBQC+/dXodOJjIxEZhPJGenuTuLzWbFatWg0\nIpcvhxkbi1Fba8bl0pPPX3nzFARpezCTyRMOZzh2TAqvdbsNHDlSjyAYiUalNi0tUgrvqak4RqOa\ndDqPw6HH7TYQCCSIhRN49ClqGpVQBFV8kvRInMrduykUigT7RomKVfSei5HNRujrm+HIEV9pPiyG\nrb4ejdlMwu9HUCoxVlSgMZmYjsev2+ZGqHS6VY2euR52u25BDRWNRonLJT14dVYrngcfJDYxQT6b\nxeByYfQsXpdFEATGx6MYjVLhyw9PTpLJ5Nm924NGI3LxYoAtdhfZ8UHUyRkaXXY0TgMZtRqdTuTg\nXXUUD1SjETLY9EX0Rg1GjwdBocBs1uB2GwiHi6Wkc4LAbPXtK5FgFRVGPvWpxpKRMucbVlVl5gc/\n6MbvT2C1qsnl1Jw/P80XvrALg0E1b1vabNZw1101nDo1TjSaQa9X0dbmXuDAupl44YUXePzxx3E6\nN1YI82phs9k4evQoP/jBD/jDP/zD9RZnxWwEB9aysVxrLptMUixIDwmv10Qumyc4kyIXCdHSsp2d\nOysA+OQTPy+90k9vbwCDQcXOnSI2m4ZIJE0olMJoVKPTq8iLWkIJgXfeG+XQoRq++MXd9PUFCAZT\nDA+HsNm0tLRITnEWi/SmY7frKBSKfPjhGAMDMyXZTp8e57775v+u6moze/Z4uHDBj1qtpKrKTHt7\n5YKwVKNRfd3fbLfrqKoylfacQUqV3t6+dVnncDmsts8ISFsher0UjaBUCtTX23A69Vy+HJ7dwrHN\n1uERF9TUuBlms4a7764lmcwiigoGB0OMjg7N+06xCJFIGrVaZP/+Kj74YJSZmSSiqKChQcqi29sb\n4OLFACqVsrSN8/HHk+zcWcuWLU5GRyMMDc3wzjvD2Gw6OjurgUypj7GxKIp0jIlzA6UNz7YdbhSK\nJLlUCk3DdqbOCcSDVx7Gfn+C4eHwDY0RkMol6B2OecfK4UdQDm5VDodDz4EDUoRLLJadzVDrprLS\nOK+fWw1bNhrVTEzEZrP7avD5rKhUCn79v4Kko8M8dLiSnQ1uJi+dZ3L4IhVNNajbDjE6GiUez/LI\nI02lHDFXU1FhoKGhAYUixPR0nEQiS0uLk/b2ytKK5BwKhbDg+jYa1bOZchVEo3qqqvT4fBZisTSF\nQoFstoAgQEODDb1eTV2dlAYgFpOMkWv9zK4+NythLXxGEokEzz33HK+99tqm9ZlYTvunn36aL33p\nSzz11FOlTLObSf6rua2MkaWSDAaZGRwkcvkySrUarcUC09M0NTtIJnP49tRStbMWhUIgGExy4v1L\npGMxtGqBSCTN8eOX+fSnm1Grr2wHeDxGqqstnDo1QbEIb711mUOHati1y1NK4+zzWTGbpVolcyG6\nIBVxm6s5AWA2q1EqFRw71svWrVI4cE2NGYNBw549km9IKiVFxCx2I7kRgiCwb58XrVbk8uUIKpUU\nSdHQsDKnwo2GUik9sK9N9z6XCtvvT5SquHo8xuv0cmPmzr3ZrEajUZJOX1lhkbZipAe+x2Pk4Ycb\nmZlJoSjmMWqLCMU8o6NRWpqt2FUxwsMjxBNZtJ5qCoUCUJwtyCcVPZucjHP+/BQPPdRIba0Vl0vP\nyEiEczNhFKKIgiK77msjEIWP++P4dgo02hZf9YlEMguO3a40Ndnxeo2lVYDFEtzdKrW10gO+rVmP\nmE/h8Jp46aWLKACTtkgwkOT4xBgtjR6Kl/yoDAZyOclKjMezpRw112IyabjvvjoqK43E41LxzMZG\n+7wVykKhyODgDL29AeKBEFUuJV6bgKXCgdEoFcELhVIUi6DXS3VyamosZDI5VColDQ02tm1zlfrT\naMQbbtdtFl544QUOHjzIzp0711uUNeXuu+/GbDbzT//0T5ved2Tzz8KrWMpeVTIUYvDXvyYZCFDI\n5wn29WHyerH6fCQDAdyNtVQ0+VAopCyBY30j9L93kmQsRSFRxFVjJRC14Pcn2LmzorSMKi3ZVpBK\nZZmaSuB26zGbtYyMRDh6tJHJyQSffOJnejqBViuyfburtFysUAglx0hRVKBQKHjjjX5aWkT6+5W8\n8UY/1dVmDh/2sXWrc7YmxPLPl9Go4eDBGnbvzqJUCqjV4prWHVmrPCOL4XJJWyEXL/bR1NRYljT3\niYSfHTvcnD07RTqdR6VS0NwsPQTnUKmUKGdGmDx7lvFUCn1FBTplFSffHqTnxEVsDj1eh5Kxd39D\n5+8eIRQyzTM0q6pMZDJSnSG9XsoJcvBgNZWVRvo8IjazSM+FAJfO9qPS6ckNp5hOjKDTxclkrjzU\nBIEF/gG3ymapTXMter26VIl4Rf0osziivUxP9+Ar5hBQU+PVkyeK3ewgn00TDcVRGbyYHFbMjVu4\nFJBq4czVqRkZiZDJ5DCZNDid+lIYajQ6hc/n4MyZSQYGZggEkrS1uUshuf39QalG0sg4wb5+uily\n4N4m6ky9uNvaaGiwcfFigHTaj0LhxG7Xs29fVSmdwVINj83gM5JMJvnrv/5rjh07tqz2Kx1/PdsL\ngsC3vvUtnnrqKX7rt34LtXqhj+Fqjl/O9reVMbIUIiMjJANSanaFUomtvp50LCalqm5txVJbW8rC\nGB0dJTU5CrkMolDAoMxSiExT6XbT0uJk927J2XR8PMo77wyTyxXQ6aSiebFYhmJRqnHhdBqoqDDi\n8RhIJLKYTJpSdV4Aq1VLba2Fnh4/ZrOGixf92O160ukEp04NA5SSd4mi5PtQDpa6qnK7IAgCWq2q\nbPV2FAqBPXsqZ2sGpdHrVbjdxnn9R8fHGTl+nHwmg6BQ4I8KvPHKm4STEA9HCU7OwLYqDnTUYhRi\nCBYtIGXGTSSy9PcHKRSK+HxWzpyZpLOzmvp6G1u3umhutNB7bpSZ9y5j9fnQ2myo9XqSyRwWi4hC\nIfnGqNVKGhqsZQvRvtOYOH2a+PAAJk2BtKFIRohTZc5StFgoFg04PTbyNi2+tka82xr55HIOyOJ2\n69m61ck771xmcDBELldAr1exe3cFO3ZIW8GxWIYPPrhEKCQZL+FwmpmZJA8/3ITFouXCBT/pVJbo\n+DjFfJ48cLFniuq7HAQuXqTjyEM4nXp6elLU1npoaLBtet+vm/HCCy+wf/9+du/evd6irAsPPfQQ\nLS0tfPOb3+Qb3/jGeouzbG4rY2Qp1lj2Gic8pVqN3m7H5PViqqllZCTCxPkRjEY1msAwmkyIxhYP\nF86MoNWqIA/bWqzs3u1Bp5OWQ0+dmmBmRgoIcjr17N1bicWioabGjNNpKKVcvp5vgiAI7N1biU6n\nIhRKlpJQdXdnEYQcer0KtVpJMJji448naW11lj2xz1q+8a6Fz8hy+8vnC4yORhgfj2EyqdFoRNRq\nJWaz5rrhv3N9VVQYqahYfMsnOjZWyrehMhjoG4mSDocwWZ2EkAzDdCyOu64ep1jE0mBjYGCGaDTD\n1FS8lJo/lysQjWY4dWoCj8eITqdCVKvR2aw0dmwnGs3Mq8lSV+ejrs5COJwuOW8uNwX4RlgVgfLJ\nsZR+0pEIkdFRQPL3ymYT5HR5rPoiGb0Dp0vShWerF6XFTjKYZMcODW63EaNRzfR0nIGBmZJDdSKR\npbt7Eq/XTDabJ502MjZ2ad4KTjSamc0ToiaTyVPI5ShkrySSy2fzFIoK8qk4KmWR7dvdbN/uXvNz\nU64+lvL9YDDIt771LX71q18te7yVjL9R2v/d3/0d7e3t7Nq1a8XbNbLPyBpjcLsRlMp5WSDVRiMa\ns5nu7klOn56YXeEQ8QpRxMnL7NrSgMfTysRkDJtNz5776rBapQdTPC5VzwXJEIlG05w+PYHBoOKx\nx7bgdN7akrjBoKajw0s2m8du1zE0JL0VG41qAoEkkUiKmZkUoigwOhqmunrptUJkbs65c9OcPDmG\nxaLh8uUIAwMz1NRIZdj37auiqWl5vjXX5ugoFqQwWp1RquQMoNVpUKqUmGsqcbkMPPBAPQMDIXK5\nPDt2uNHpxFL+lGg0XQrPvHgxwLlzUwwPh6mvt6HXqwiFUmg0Stxuw7xoKpnlISiVCLOOgoIgSFus\nyhh1v91KylJHOJLBbFYTDKZ4993LKJUKXC49Fy4EEASBeDyDw6EjHE6XfIt0OpHjxy8TDCYRRSVn\nz06XahvNUSyCKCqpq7MSCCTRmE3kklKYeGWNDXUhgb6iApV+daotb1SeeeYZPvvZz9I2l6fhDsXj\n8fDKK6/wyCOPcPHiRf70T/8UVRnC59eS26c6EktLnGWuqcHd1oZKr0dQKtGYzVR2dJBR6rl40V9K\n/pNM5sgbnYRTCrJTo7iKk+ypzWOzJamovvJA0mpF9HoRk0mN35/gV78aZGBghtHRKO+/PzIvauVW\nUKmUbN3qoq7OTGOjglyuQCCQwGzWolQK1NZa6eqaIBZsVu52AAATMUlEQVQrrxPiaiQfK+dY5ZZv\nsf6i0TTnz08DkE7n6eoaIxBIMjEh1Rfp6hojEkktaHcrspmrqkrbf9l4nNoaE+ZKN6bKSjRGI0ql\nkqqGCjxVdiKzhovbbaSzs5r9+6vIZPLzErlJ805Fd/cEH344SjyepVAo8u67wygU4HRKNW1SKf8y\nzs7irOUcuRHlkmMp/agNBuyNjfOy3gmAp8qGy53jwQcbyOfnnI6lsNwPPhjltdf6GR2VjNq5ek/A\n7BaewIULARKJHNlsAItFw/BwmERCuraNRnXJv2frVietrQ4qWxtw1HrYsrOGtlYLKoMBz65dpZXS\n9Tg35erjVr9/+vRpfvSjHy3YmlipzJu1/Z49ezhx4gTd3d34fD7+7M/+jLfeeotsNnvzxmUYf6Xt\n79iVEaUoUrVvH/aGBnKpFGqzGa3ZzMREbF40BMBkVKSl8x6M6XHC00HMHi8quxVRe2W5Xq0WaWur\n4Pz5abq6xigUimg0SrxeE4WCVASvudm+pKVxnU7F3r1eBCGC2ZzGbNaiUgmzKbyVBINJwuHUDUN4\nZZZOMpkjEkmjUAhcvhwuZapMJKSLOhbLEIlk5mVkvVUMLhd1993HdE8P6VAIT72dxxpb6B2M4fA6\nsJuV7N7tobLWxaXh4Xlta2ut9PfPlLZfVCqpiF+hUGBwMFSS0+UyYLFoyeeLfPrTzej1aoaGlpcb\nRGYh7rY2lBoNM/39CAoFji1bsDc1ER8ZASjl8xAEqS7UpUthlEqBbLaA3a5nejpBNJpGrVai04lk\ns3n0euktNpHIcvfdtfT0TKPRiNjtWrZtc2M2S9E/BoOaQ4fq2LHDTTazDb2QgnwOndOJqL5z7gOp\nVIovfOEL/M3f/M0dk1fkVqirq+Pb3/420WiUn/zkJ/zJn/wJAwMDPP7443z5y1+ms7NzvUW8LutZ\nSeg/AP8R0AD/A/j+Nf9eLK5DRbZEQko+FQxeefMtFouzxbKKJOJplKKSpiZHqYDW1QwNzfDTn/YQ\nDqewWLSlm4jTqeO3f7tl0ZC+W+H06QkGBoKAQDKZLeXGeOSRplveAtroCIIUubSeFItFenuD/PjH\nZwkEktjtOrq6xjGZ1NTWWvD5rGi1Ig8/3ITbvbLzXsjlSts2mUyOTKaAwaC6oR9QMJhkdDRCJpOn\nosKI12siHE5x7FjvvKReIEVuPP54a8lBeqOyEfS+HIqFAgjCAn199NE4XV1jKBQCFouGl166iNGo\nZscON2q1klQqx7ZtThwOPXa7jmAwyYcfjpXai6ICq1WqIzMxIfkJmc0a9u+vuq4v0mZkJXp/+umn\nGR0d5ac//eltXRCvHIyMjPDjH/+Y73znO+zcuZPvfve7VFdXr4sss7paVGHruU3zInAfcBfwn9ZR\njnno9Wra270lI0IUFTidepLJLH19M4yNJ7h8OcoHH4zi9y9826yrs9LR4aWmxlLqQxCgvt62bEME\npERnuVwBvz9BPJ5FoRBoarLjcNxZe8SrzcREjK6uMVpbXYiiAr1ehcWinl0qlyqvNjbacLlWft6v\n9h9Rq0WMRvVNb6x2u462tgra271UV5tRKASsVu2CHCmCAI2N9g1viGxmBIViUX01NdmprbUgCNJ2\na22tmbo6C2q1dP1brVp27HCzZ4+UqLC+3jovw2o+LyUnk5LoSYnSxsdjnDgxSiazsALyncYLL7zA\n66+/zve+9z3ZELkFqqur+frXv84nn3zCgQMH2Lt3Ly+//PJ6i7WA9TRG5q4qDVCWNeRy7ZPW19t4\n5JEmjh5t5OjRRrZtc5VquMwRDI7PWz2ZYy4iprnZjsGgwmSS3ohaW5e/lDg0NITTqeeBBxro6PCy\nbZuT++/30d5eWfaL8U73GZmaihOLZUgkstx1Vw1btjj4vd/bzb/9t9vZu9fD4cM+Ojq8i573tfBn\nWQxBEOjo8NLYaCvNuZ07K9iy5crKXTllu5N9Rm6lH7NZw5EjPh5+uIn29kq++MU9bNvmQq9X4XTq\n6eysnpd23WrVcf/9Pg4cqMLjyXL4sA+Xy7Dg/hIMJhe956zFb1rLPm70/RdffJFnnnmGV155pVRE\ndaXj3SntNRoNf/7nf87LL7/MV77yFZ577rk1Hf9mrLfPyP8D/AHw5+XuOJfLEwymEEUFNpt2yQ9t\nKaGY5BMQjfrnVbhUKgUUCq6bn8Js1nD4sI9wOI1CwbJ8CxbD4dDLKyFlIpcrMDMj+dwUi8XS/JhL\nCjVXzRekVYajR6WMpxsVi0XLkSP1hELSnF9JhlGZlaNWi6VEZQA+n4VQKEU+X0SnW3jbtdl02Gw6\nLJYUPp+D0dHIgu8olULZcuJsRp5//nn+6q/+il/+8pc0NTWttziblgMHDvDee+/x6KOP0tfXx7PP\nPotSufxV+3KxFmtcFcCPrjk2ATw5+7ca+BVS1d7YVd9Zts/I9HScEydGCASSKJUKfD4L7e3eZSf3\nikTSvPFGP+m05GiWSuWwWrXs3+/FbpeNg3KxVr4DwWCCEydGmZ5OoFAI1NSY6ejwYjCoCYdT/PKX\nAwQCydL3PR4jDzxQj8GwsR0EM5kcExNSTROrVcptsRm2aTarz8hSGB+XtnbnjMWmJjt79njm1ZzJ\n5wtMTsaJRNLk8wX6+2dK5SEEAVpbndxzT+1tszVxq3pPpVI8/fTTvPPOO7z00ks0NzevgXS3P6FQ\niCeeeAKj0ciLL76IwbD6voc38hlZz1mtBjKzMrwJPAZcvRdS/NrXvlZaimttbaWzs7OUUGVuKeja\nz9XVNbz2Wj8DA4MAaDTO2eJQAo2N9pu2v97n7u4L9PcH6epKUCwKOBxpvF4jjz66H4tFu+T+5M8L\nP9fX16/6Q6lQKPKrXw0wOBiad7y9vZL2di8gRUN88kkAvz+Bx2OkudmOzbax83Mkk1nee+8yQ0Mh\n8nkpkmvHDjd795Z/K6/c3O7GSDqd49ix3nkh2YIA995bR0uLtH2bzxfo6hrj/PlpstkCoqjA7dbj\ndErRNz6flaYm+22VLflW9H7ixAl+//d/nx07dvC9730Pk2nzVhXeiGQyGf7gD/6Anp4e/uVf/gXP\ndapVl4uNaoz8BXAYyWfkR8C1G1hLXhkZGhrCaHTxi1/0kUzOd/SqqDDw+OOtyxY2Hs/wyiufEA5L\naZrTaT8ajXPeQ2y1GNrg9WLKNdat3JxWKt/MTHJe5MmcHp1OHY8/3rrsrKTlkG0l/fX2BnjzzaF5\n24k6ncjRo1LUTzllK/fvXK4xUi45Vruf8fEor77aRzZbmHe8vt7Kpz7VCMDYWJTXXusjFptCo5EM\nFKVS4IEHGvD5lr49uJHOzfX6uJ7eh4aGUCgU/OVf/iXHjh3jueee47Of/ewtG9UrlflOa18sFvnG\nN77BCy+8wPPPP8/OnTtXbfyNGk3zl8D9SNE0i3vSLJHjx48jispFHygrfaOIRjPzDJze3m6AeVV2\nV4vjx4+v+hibZayVyqdSzZ8fc3rUaMQVb2mU+9wtpb9AIMm19/VkMkc8nllyX+WUazUplxyr3Y8o\nKhb19dBqr2zRRKNpstlCaT6ClKNkLqtzuWRZj35utY98Ps+bb77JU089xZ49e6isrKSnp4ff+Z3f\nWdLq3kplvtPaC4LAX/zFX/CP//iPfP3rX+dLX/oSx48fX/Zq5XLlv628oS5cuIDVqqWhwXp1gkQ0\nGiUtLQtzgiwFg0E17+YxONgHMC8kb7W4cOHCqo+xWcZaqXxGo5rm5ishr4ODfahUirLU+Sn3uVtK\nf3NlCa5Go1GWjPByyraWc+RGlEuO1e7H4dAvKEqo04k0NtpKnw0GNaKoKN1XQCq8OJceoFyyrEc/\nN+qjUCjw93//93zuc5+joqKCr33ta+TzeXp7e/nmN7953YiZ5Y4nt78+hw4d4ty5c+h0Oj7/+c+z\nZcsWvvrVr/L973+f119/nVOnTjEwMMDk5CTxeJxCobBoP8sdf72jaVaFPXsqMZs1DA6G0GrFUtz/\nSjCZNLS1uenqGitlaHU69TQ3L69Gicz60dbmxmBQMzAwg9Wq5fBh37KWwjcSNTVmamrMjIxEZuuY\nKGhpcaw4MZvMylEoBPbvr8Ju13HpUgiDQU1zs2NewUyPx0Bzs71kECsUAj6fFa/39vaRUCgUHD9+\nnCNHjvDtb3+bmpoannnmGex2+b66Hmg0Gvbt28crr7zCyZMnefvtt3nzzTcZHx9namqKSCRCPB4n\nFouRSqXQ6/UYDAaMRmPp/xMTE3R3d5c+Hzp0iN/93d+96di3lTESCklOiRqNyLZtbrZtK0/lyjm2\nbXNht+uYmorz/vsKHnywYdlvLkth7netBRt9rHLIp1aLtLY6aW118vrrCurrbTdvdAuU+9wtpT+D\nQc1999UxNhYjFstgt2uprDSVVoDKKdtazpEbUS451qIfnU5FW1sFbW0Vi/67KCo5cKAKt1vJ/v1V\nmM0avF7TvNXYcsmy1v3crI/vfve7ZR1Tbr/y9lLuog46Ojqu+718Pk8ikSgZJ/F4nHg8zrPPPsvn\nPve50jGXy3VL425kN/s3kTK0ytw5hIGVLWHJbEbigLyEc+chX+93Hm8hBa7IyMjIyMjIyMjIyMjI\nyMjIyMjIXJf96y2AzKog6/XOQtb35uWO1N1G9hlZDlpgeYH5S0cDpFeh3w7gIGAFQsD7QNcqjLNY\nWLcAvAY8uArj7UAqjnh13FcnsJSgdCOSjNGbfXEJlHvOLHdelEvvq6HXcuhujj1Iv28Q+BRSJuZf\nAIvHCV6fcs+FcsyD5eh+pXovp77Lpefl6rhcOl2pLpeix5Xorxy6W6nOynU9zvEU8N+X03CzGiNP\nAn+MpIR/Br4NFIFfIyVSWwteBx4qc59/izQZfskV564HkH7n18o8VpLFJ+wuoNxxdX8DuIEs4AK+\nBExxc319CfhPSA6O3wf+d6SL5GcsPVHeWs2Z5cyLcuq93Hpdru4W47tIN3od0sMiCkSAauCLN2lb\nrrmwmvNgqbovh97Lpe9y6XkpOl6pTldLl7eqx5Xqb6W6W6nOVnI9AryNdL6vtiO2A2eBe2+h/W3B\n+0hhyQLwfwAvATYkJZSbt6/z38wqjPWbJR5fCR8hWfPX8stVGOvtq/7eieRRvY+b6+s40tuDDriM\ndOELwHvLkKHcc6ac86Kcei+3Xperu8W4+vd8fNXfb91C23LNhXLMg3Lpvhx6L5e+y6Xnpeh4pTpd\nqS5XqseV6m+lulupzlZyPQL8n8D/x3zD5xe32HYBmznPyFxu9u8iKfVfkKzEcuNEslQz1xx/YxXG\nOgn8DyTLPAqYkSztj1ZhrEeRLPNreXgVxlJwpTDiGeAzwP9EsqJvRBrpTSkJ/L9c0cFyt8fKOWfK\nOS/Kqfdy63W5uluMq+uU/19X/X0reafLORdWOg/Kpfty6L1c+i6Xnpei43LodCW6XKkeV6q/lepu\npTpbyfUI8CzSysp/BL4CvMgKdluUN//KhkQJ+JGWxgBGkSZELfBKmccaACZZuAd5Hhgv81ivIf2W\nLUA90u/8ZyTrs9zEgPwix5e7V3gjziHdYOKzn5PAPwLDSEt616Mw27bAFWtdDdRw69b7HOWeM+Wc\nF+XUe7n1ulzdLcYJpLfOAnBx9pgamL7q8/Uo11woxzwol+7Lofdy6btcel6Kjleq05XqcqV6XKn+\nVqq7lepsJdfjHHngQ6RVqU6kLaPVWF3fNLy4hmP9cA3HkplPOc99ueeMPC/WlnKd73LMA1n35WGl\n53GlupT1uI7cLoXyKtdwLM8ajiUzn3Ke+3LPGXlerC3lOt/lmAey7svDSs/jSnUp63EduV2MERkZ\nGRkZGZlNimyMyMjIyMjIyKwrsjEiIyMjIyMjI1MGFq/LvfnHkplPOc99ufUoz4u1pVznuxz9yLov\nDys9j+vdXkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGZtPyMFIp6F7gP6+zLDJr\nw/eRUlJ/fLMvytw21CAVMzuHlLb76fUVR2aN0CKlYD+NlHL+v66vODIyi6ME+gAfoEKasFvXUyCZ\nNeEQsAfZGLmT8AC7Z/82ItUBka/1OwP97P9FpKrF96yjLBsKOc/IxmE/kjEyhFRs6EfA4+spkMya\nsJzS8zKbmwmklw2QiqX1AN71E0dmDUnM/l+N9AIaXEdZNhSyMbJxqAIuX/V5ZPaYjIzM7YsPaWXs\nxDrLIbM2KJAM0Umkrbrz6yvOxkE2RjYOxfUWQEZGZk0xAj8Fvoa0QiJz+1NA2qKrBu4FDq+rNBsI\n2RjZOIwiObbNUYO0OiIjI3P7oQJ+BvxP4J/XWRaZtScM/CvQsd6CyMhciwj0Iy3bqpEdWO8kfMgO\nrHcSAvAD4Nn1FkRmTXEC1tm/dcBvgAfWTxwZmevzCJJnfR/wX9ZZFpm14YfAGJBG8hn6/fUVR2YN\nuAdpuf40cGr2v4fXVSKZtaAN+AhJ72eAP11fcWRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRk\nZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGTuIP5/xRHll/wr\nALgAAAAASUVORK5CYII=\n", "text": [ - "<matplotlib.figure.Figure at 0x1154b4310>" + "<matplotlib.figure.Figure at 0x1155cf1d0>" ] } ], @@ -98,7 +99,7 @@ "output_type": "stream", "stream": "stdout", "text": [ - "Accuracy: 0.764\n" + "Accuracy: 0.763\n" ] } ], @@ -154,8 +155,8 @@ "output_type": "stream", "stream": "stdout", "text": [ - "I0904 17:54:31.724112 2129298192 caffe.cpp:90] Starting Optimization\r\n", - "I0904 17:54:31.725520 2129298192 solver.cpp:32] Initializing solver from parameters: \r\n", + "I0905 01:07:27.099238 2129298192 caffe.cpp:90] Starting Optimization\r\n", + "I0905 01:07:27.100469 2129298192 solver.cpp:32] Initializing solver from parameters: \r\n", "test_iter: 1000\r\n", "test_interval: 1000\r\n", "base_lr: 0.01\r\n", @@ -170,10 +171,16 @@ "snapshot_prefix: \"examples/hdf5_classification/data/train\"\r\n", "solver_mode: CPU\r\n", "net: \"examples/hdf5_classification/train_val.prototxt\"\r\n", - "I0904 17:54:31.725751 2129298192 solver.cpp:72] Creating training net from net file: examples/hdf5_classification/train_val.prototxt\r\n", - "I0904 17:54:31.726464 2129298192 net.cpp:275] The NetState phase (0) differed from the phase (1) specified by a rule in layer data\r\n", - "I0904 17:54:31.726560 2129298192 net.cpp:275] The NetState phase (0) differed from the phase (1) specified by a rule in layer accuracy\r\n", - "I0904 17:54:31.726586 2129298192 net.cpp:39] Initializing net from parameters: \r\n", + "I0905 01:07:27.100630 2129298192 solver.cpp:72] Creating training net from net file: examples/hdf5_classification/train_val.prototxt\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0905 01:07:27.100988 2129298192 net.cpp:275] The NetState phase (0) differed from the phase (1) specified by a rule in layer data\r\n", + "I0905 01:07:27.101011 2129298192 net.cpp:275] The NetState phase (0) differed from the phase (1) specified by a rule in layer accuracy\r\n", + "I0905 01:07:27.101022 2129298192 net.cpp:39] Initializing net from parameters: \r\n", "name: \"LogisticRegressionNet\"\r\n", "layers {\r\n", " top: \"data\"\r\n", @@ -219,39 +226,39 @@ "state {\r\n", " phase: TRAIN\r\n", "}\r\n", - "I0904 17:54:31.727036 2129298192 net.cpp:67] Creating Layer data\r\n", - "I0904 17:54:31.727066 2129298192 net.cpp:356] data -> data\r\n", - "I0904 17:54:31.727125 2129298192 net.cpp:356] data -> label\r\n", - "I0904 17:54:31.727144 2129298192 net.cpp:96] Setting up data\r\n", - "I0904 17:54:31.727429 2129298192 hdf5_data_layer.cpp:57] Loading filename from examples/hdf5_classification/data/train.txt\r\n", - "I0904 17:54:31.727666 2129298192 hdf5_data_layer.cpp:69] Number of files: 2\r\n", - "I0904 17:54:31.727689 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.731825 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.731884 2129298192 hdf5_data_layer.cpp:81] output data size: 10,4,1,1\r\n", - "I0904 17:54:31.731904 2129298192 net.cpp:103] Top shape: 10 4 1 1 (40)\r\n", - "I0904 17:54:31.731912 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", - "I0904 17:54:31.731935 2129298192 net.cpp:67] Creating Layer fc1\r\n", - "I0904 17:54:31.731942 2129298192 net.cpp:394] fc1 <- data\r\n", - "I0904 17:54:31.731964 2129298192 net.cpp:356] fc1 -> fc1\r\n", - "I0904 17:54:31.731992 2129298192 net.cpp:96] Setting up fc1\r\n", - "I0904 17:54:31.738070 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", - "I0904 17:54:31.738148 2129298192 net.cpp:67] Creating Layer loss\r\n", - "I0904 17:54:31.738158 2129298192 net.cpp:394] loss <- fc1\r\n", - "I0904 17:54:31.738172 2129298192 net.cpp:394] loss <- label\r\n", - "I0904 17:54:31.738185 2129298192 net.cpp:356] loss -> loss\r\n", - "I0904 17:54:31.738201 2129298192 net.cpp:96] Setting up loss\r\n", - "I0904 17:54:31.738327 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", - "I0904 17:54:31.738343 2129298192 net.cpp:109] with loss weight 1\r\n", - "I0904 17:54:31.738368 2129298192 net.cpp:170] loss needs backward computation.\r\n", - "I0904 17:54:31.738378 2129298192 net.cpp:170] fc1 needs backward computation.\r\n", - "I0904 17:54:31.738386 2129298192 net.cpp:172] data does not need backward computation.\r\n", - "I0904 17:54:31.738392 2129298192 net.cpp:208] This network produces output loss\r\n", - "I0904 17:54:31.738402 2129298192 net.cpp:467] Collecting Learning Rate and Weight Decay.\r\n", - "I0904 17:54:31.738410 2129298192 net.cpp:219] Network initialization done.\r\n", - "I0904 17:54:31.738415 2129298192 net.cpp:220] Memory required for data: 284\r\n", - "I0904 17:54:31.738785 2129298192 solver.cpp:156] Creating test net (#0) specified by net file: examples/hdf5_classification/train_val.prototxt\r\n", - "I0904 17:54:31.738836 2129298192 net.cpp:275] The NetState phase (1) differed from the phase (0) specified by a rule in layer data\r\n", - "I0904 17:54:31.738858 2129298192 net.cpp:39] Initializing net from parameters: \r\n", + "I0905 01:07:27.105614 2129298192 net.cpp:67] Creating Layer data\r\n", + "I0905 01:07:27.105664 2129298192 net.cpp:356] data -> data\r\n", + "I0905 01:07:27.105698 2129298192 net.cpp:356] data -> label\r\n", + "I0905 01:07:27.105710 2129298192 net.cpp:96] Setting up data\r\n", + "I0905 01:07:27.105717 2129298192 hdf5_data_layer.cpp:57] Loading filename from examples/hdf5_classification/data/train.txt\r\n", + "I0905 01:07:27.105813 2129298192 hdf5_data_layer.cpp:69] Number of files: 2\r\n", + "I0905 01:07:27.105828 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.109418 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.109501 2129298192 hdf5_data_layer.cpp:81] output data size: 10,4,1,1\r\n", + "I0905 01:07:27.109522 2129298192 net.cpp:103] Top shape: 10 4 1 1 (40)\r\n", + "I0905 01:07:27.109531 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0905 01:07:27.109560 2129298192 net.cpp:67] Creating Layer fc1\r\n", + "I0905 01:07:27.109570 2129298192 net.cpp:394] fc1 <- data\r\n", + "I0905 01:07:27.109590 2129298192 net.cpp:356] fc1 -> fc1\r\n", + "I0905 01:07:27.109618 2129298192 net.cpp:96] Setting up fc1\r\n", + "I0905 01:07:27.115136 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0905 01:07:27.115190 2129298192 net.cpp:67] Creating Layer loss\r\n", + "I0905 01:07:27.115198 2129298192 net.cpp:394] loss <- fc1\r\n", + "I0905 01:07:27.115206 2129298192 net.cpp:394] loss <- label\r\n", + "I0905 01:07:27.115214 2129298192 net.cpp:356] loss -> loss\r\n", + "I0905 01:07:27.115224 2129298192 net.cpp:96] Setting up loss\r\n", + "I0905 01:07:27.115237 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", + "I0905 01:07:27.115244 2129298192 net.cpp:109] with loss weight 1\r\n", + "I0905 01:07:27.115260 2129298192 net.cpp:170] loss needs backward computation.\r\n", + "I0905 01:07:27.115267 2129298192 net.cpp:170] fc1 needs backward computation.\r\n", + "I0905 01:07:27.115273 2129298192 net.cpp:172] data does not need backward computation.\r\n", + "I0905 01:07:27.115278 2129298192 net.cpp:208] This network produces output loss\r\n", + "I0905 01:07:27.115288 2129298192 net.cpp:467] Collecting Learning Rate and Weight Decay.\r\n", + "I0905 01:07:27.115295 2129298192 net.cpp:219] Network initialization done.\r\n", + "I0905 01:07:27.115301 2129298192 net.cpp:220] Memory required for data: 284\r\n", + "I0905 01:07:27.115622 2129298192 solver.cpp:156] Creating test net (#0) specified by net file: examples/hdf5_classification/train_val.prototxt\r\n", + "I0905 01:07:27.115644 2129298192 net.cpp:275] The NetState phase (1) differed from the phase (0) specified by a rule in layer data\r\n", + "I0905 01:07:27.115656 2129298192 net.cpp:39] Initializing net from parameters: \r\n", "name: \"LogisticRegressionNet\"\r\n", "layers {\r\n", " top: \"data\"\r\n", @@ -307,184 +314,618 @@ "state {\r\n", " phase: TEST\r\n", "}\r\n", - "I0904 17:54:31.739138 2129298192 net.cpp:67] Creating Layer data\r\n", - "I0904 17:54:31.739156 2129298192 net.cpp:356] data -> data\r\n", - "I0904 17:54:31.739235 2129298192 net.cpp:356] data -> label\r\n", - "I0904 17:54:31.739249 2129298192 net.cpp:96] Setting up data\r\n", - "I0904 17:54:31.739256 2129298192 hdf5_data_layer.cpp:57] Loading filename from examples/hdf5_classification/data/test.txt\r\n", - "I0904 17:54:31.739305 2129298192 hdf5_data_layer.cpp:69] Number of files: 1\r\n", - "I0904 17:54:31.739315 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/test.h5\r\n", - "I0904 17:54:31.740720 2129298192 hdf5_data_layer.cpp:49] Successully loaded 2500 rows\r\n", - "I0904 17:54:31.740757 2129298192 hdf5_data_layer.cpp:81] output data size: 10,4,1,1\r\n", - "I0904 17:54:31.740768 2129298192 net.cpp:103] Top shape: 10 4 1 1 (40)\r\n", - "I0904 17:54:31.740774 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", - "I0904 17:54:31.740795 2129298192 net.cpp:67] Creating Layer label_data_1_split\r\n", - "I0904 17:54:31.740803 2129298192 net.cpp:394] label_data_1_split <- label\r\n", - "I0904 17:54:31.740813 2129298192 net.cpp:356] label_data_1_split -> label_data_1_split_0\r\n", - "I0904 17:54:31.740826 2129298192 net.cpp:356] label_data_1_split -> label_data_1_split_1\r\n", - "I0904 17:54:31.740835 2129298192 net.cpp:96] Setting up label_data_1_split\r\n", - "I0904 17:54:31.740842 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", - "I0904 17:54:31.740849 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", - "I0904 17:54:31.740859 2129298192 net.cpp:67] Creating Layer fc1\r\n", - "I0904 17:54:31.740865 2129298192 net.cpp:394] fc1 <- data\r\n", - "I0904 17:54:31.740877 2129298192 net.cpp:356] fc1 -> fc1\r\n", - "I0904 17:54:31.740887 2129298192 net.cpp:96] Setting up fc1\r\n", - "I0904 17:54:31.740906 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", - "I0904 17:54:31.740921 2129298192 net.cpp:67] Creating Layer fc1_fc1_0_split\r\n", - "I0904 17:54:31.740926 2129298192 net.cpp:394] fc1_fc1_0_split <- fc1\r\n", - "I0904 17:54:31.740934 2129298192 net.cpp:356] fc1_fc1_0_split -> fc1_fc1_0_split_0\r\n", - "I0904 17:54:31.740943 2129298192 net.cpp:356] fc1_fc1_0_split -> fc1_fc1_0_split_1\r\n", - "I0904 17:54:31.741047 2129298192 net.cpp:96] Setting up fc1_fc1_0_split\r\n", - "I0904 17:54:31.741065 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", - "I0904 17:54:31.741070 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", - "I0904 17:54:31.741081 2129298192 net.cpp:67] Creating Layer loss\r\n", - "I0904 17:54:31.741087 2129298192 net.cpp:394] loss <- fc1_fc1_0_split_0\r\n", - "I0904 17:54:31.741094 2129298192 net.cpp:394] loss <- label_data_1_split_0\r\n", - "I0904 17:54:31.741102 2129298192 net.cpp:356] loss -> loss\r\n", - "I0904 17:54:31.741111 2129298192 net.cpp:96] Setting up loss\r\n", - "I0904 17:54:31.741128 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", - "I0904 17:54:31.741139 2129298192 net.cpp:109] with loss weight 1\r\n", - "I0904 17:54:31.741159 2129298192 net.cpp:67] Creating Layer accuracy\r\n", - "I0904 17:54:31.741166 2129298192 net.cpp:394] accuracy <- fc1_fc1_0_split_1\r\n", - "I0904 17:54:31.741173 2129298192 net.cpp:394] accuracy <- label_data_1_split_1\r\n", - "I0904 17:54:31.741181 2129298192 net.cpp:356] accuracy -> accuracy\r\n", - "I0904 17:54:31.741190 2129298192 net.cpp:96] Setting up accuracy\r\n", - "I0904 17:54:31.741197 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", - "I0904 17:54:31.741204 2129298192 net.cpp:172] accuracy does not need backward computation.\r\n", - "I0904 17:54:31.741209 2129298192 net.cpp:170] loss needs backward computation.\r\n", - "I0904 17:54:31.741245 2129298192 net.cpp:170] fc1_fc1_0_split needs backward computation.\r\n", - "I0904 17:54:31.741252 2129298192 net.cpp:170] fc1 needs backward computation.\r\n", - "I0904 17:54:31.741257 2129298192 net.cpp:172] label_data_1_split does not need backward computation.\r\n", - "I0904 17:54:31.741263 2129298192 net.cpp:172] data does not need backward computation.\r\n", - "I0904 17:54:31.741269 2129298192 net.cpp:208] This network produces output accuracy\r\n", - "I0904 17:54:31.741336 2129298192 net.cpp:208] This network produces output loss\r\n", - "I0904 17:54:31.741353 2129298192 net.cpp:467] Collecting Learning Rate and Weight Decay.\r\n", - "I0904 17:54:31.741360 2129298192 net.cpp:219] Network initialization done.\r\n", - "I0904 17:54:31.741366 2129298192 net.cpp:220] Memory required for data: 528\r\n", - "I0904 17:54:31.741401 2129298192 solver.cpp:46] Solver scaffolding done.\r\n", - "I0904 17:54:31.741408 2129298192 solver.cpp:165] Solving LogisticRegressionNet\r\n", - "I0904 17:54:31.741426 2129298192 solver.cpp:251] Iteration 0, Testing net (#0)\r\n", - "I0904 17:54:31.747434 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.366799\r\n", - "I0904 17:54:31.747484 2129298192 solver.cpp:302] Test net output #1: loss = 0.700084 (* 1 = 0.700084 loss)\r\n", - "I0904 17:54:31.747532 2129298192 solver.cpp:195] Iteration 0, loss = 0.701716\r\n", - "I0904 17:54:31.747545 2129298192 solver.cpp:210] Train net output #0: loss = 0.701716 (* 1 = 0.701716 loss)\r\n", - "I0904 17:54:31.747561 2129298192 solver.cpp:405] Iteration 0, lr = 0.01\r\n", - "I0904 17:54:31.750849 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.752188 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.753466 2129298192 solver.cpp:251] Iteration 1000, Testing net (#0)\r\n", - "I0904 17:54:31.760200 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.5632\r\n", - "I0904 17:54:31.760282 2129298192 solver.cpp:302] Test net output #1: loss = 0.619953 (* 1 = 0.619953 loss)\r\n", - "I0904 17:54:31.760310 2129298192 solver.cpp:195] Iteration 1000, loss = 0.520827\r\n", - "I0904 17:54:31.760323 2129298192 solver.cpp:210] Train net output #0: loss = 0.520827 (* 1 = 0.520827 loss)\r\n", - "I0904 17:54:31.760334 2129298192 solver.cpp:405] Iteration 1000, lr = 0.01\r\n", - "I0904 17:54:31.762578 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", - "I0904 17:54:31.762634 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.763407 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.765583 2129298192 solver.cpp:251] Iteration 2000, Testing net (#0)\r\n", - "I0904 17:54:31.772900 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.768\r\n", - "I0904 17:54:31.773041 2129298192 solver.cpp:302] Test net output #1: loss = 0.596873 (* 1 = 0.596873 loss)\r\n", - "I0904 17:54:31.773085 2129298192 solver.cpp:195] Iteration 2000, loss = 0.483448\r\n", - "I0904 17:54:31.773109 2129298192 solver.cpp:210] Train net output #0: loss = 0.483448 (* 1 = 0.483448 loss)\r\n", - "I0904 17:54:31.773128 2129298192 solver.cpp:405] Iteration 2000, lr = 0.01\r\n", - "I0904 17:54:31.774942 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.776607 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n" + "I0905 01:07:27.115854 2129298192 net.cpp:67] Creating Layer data\r\n", + "I0905 01:07:27.115864 2129298192 net.cpp:356] data -> data\r\n", + "I0905 01:07:27.116004 2129298192 net.cpp:356] data -> label\r\n", + "I0905 01:07:27.116024 2129298192 net.cpp:96] Setting up data\r\n", + "I0905 01:07:27.116030 2129298192 hdf5_data_layer.cpp:57] Loading filename from examples/hdf5_classification/data/test.txt\r\n", + "I0905 01:07:27.116080 2129298192 hdf5_data_layer.cpp:69] Number of files: 1\r\n", + "I0905 01:07:27.116089 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/test.h5\r\n", + "I0905 01:07:27.117313 2129298192 hdf5_data_layer.cpp:49] Successully loaded 2500 rows\r\n", + "I0905 01:07:27.117348 2129298192 hdf5_data_layer.cpp:81] output data size: 10,4,1,1\r\n", + "I0905 01:07:27.117357 2129298192 net.cpp:103] Top shape: 10 4 1 1 (40)\r\n", + "I0905 01:07:27.117364 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0905 01:07:27.117377 2129298192 net.cpp:67] Creating Layer label_data_1_split\r\n", + "I0905 01:07:27.117384 2129298192 net.cpp:394] label_data_1_split <- label\r\n", + "I0905 01:07:27.117393 2129298192 net.cpp:356] label_data_1_split -> label_data_1_split_0\r\n", + "I0905 01:07:27.117409 2129298192 net.cpp:356] label_data_1_split -> label_data_1_split_1\r\n", + "I0905 01:07:27.117419 2129298192 net.cpp:96] Setting up label_data_1_split\r\n", + "I0905 01:07:27.117427 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0905 01:07:27.117434 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0905 01:07:27.117444 2129298192 net.cpp:67] Creating Layer fc1\r\n", + "I0905 01:07:27.117449 2129298192 net.cpp:394] fc1 <- data\r\n", + "I0905 01:07:27.117470 2129298192 net.cpp:356] fc1 -> fc1\r\n", + "I0905 01:07:27.117478 2129298192 net.cpp:96] Setting up fc1\r\n", + "I0905 01:07:27.117506 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0905 01:07:27.117519 2129298192 net.cpp:67] Creating Layer fc1_fc1_0_split\r\n", + "I0905 01:07:27.117527 2129298192 net.cpp:394] fc1_fc1_0_split <- fc1\r\n", + "I0905 01:07:27.117534 2129298192 net.cpp:356] fc1_fc1_0_split -> fc1_fc1_0_split_0\r\n", + "I0905 01:07:27.117543 2129298192 net.cpp:356] fc1_fc1_0_split -> fc1_fc1_0_split_1\r\n", + "I0905 01:07:27.117640 2129298192 net.cpp:96] Setting up fc1_fc1_0_split\r\n", + "I0905 01:07:27.117655 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0905 01:07:27.117662 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0905 01:07:27.117673 2129298192 net.cpp:67] Creating Layer loss\r\n", + "I0905 01:07:27.117679 2129298192 net.cpp:394] loss <- fc1_fc1_0_split_0\r\n", + "I0905 01:07:27.117687 2129298192 net.cpp:394] loss <- label_data_1_split_0\r\n", + "I0905 01:07:27.117696 2129298192 net.cpp:356] loss -> loss\r\n", + "I0905 01:07:27.117704 2129298192 net.cpp:96] Setting up loss\r\n", + "I0905 01:07:27.117717 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", + "I0905 01:07:27.117723 2129298192 net.cpp:109] with loss weight 1\r\n", + "I0905 01:07:27.117743 2129298192 net.cpp:67] Creating Layer accuracy\r\n", + "I0905 01:07:27.117749 2129298192 net.cpp:394] accuracy <- fc1_fc1_0_split_1\r\n", + "I0905 01:07:27.117756 2129298192 net.cpp:394] accuracy <- label_data_1_split_1\r\n", + "I0905 01:07:27.117764 2129298192 net.cpp:356] accuracy -> accuracy\r\n", + "I0905 01:07:27.117774 2129298192 net.cpp:96] Setting up accuracy\r\n", + "I0905 01:07:27.117781 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", + "I0905 01:07:27.117789 2129298192 net.cpp:172] accuracy does not need backward computation.\r\n", + "I0905 01:07:27.117794 2129298192 net.cpp:170] loss needs backward computation.\r\n", + "I0905 01:07:27.117835 2129298192 net.cpp:170] fc1_fc1_0_split needs backward computation.\r\n", + "I0905 01:07:27.117842 2129298192 net.cpp:170] fc1 needs backward computation.\r\n", + "I0905 01:07:27.117848 2129298192 net.cpp:172] label_data_1_split does not need backward computation.\r\n", + "I0905 01:07:27.117854 2129298192 net.cpp:172] data does not need backward computation.\r\n", + "I0905 01:07:27.117861 2129298192 net.cpp:208] This network produces output accuracy\r\n", + "I0905 01:07:27.117866 2129298192 net.cpp:208] This network produces output loss\r\n", + "I0905 01:07:27.117877 2129298192 net.cpp:467] Collecting Learning Rate and Weight Decay.\r\n", + "I0905 01:07:27.117926 2129298192 net.cpp:219] Network initialization done.\r\n", + "I0905 01:07:27.117938 2129298192 net.cpp:220] Memory required for data: 528\r\n", + "I0905 01:07:27.117985 2129298192 solver.cpp:46] Solver scaffolding done.\r\n", + "I0905 01:07:27.117992 2129298192 solver.cpp:165] Solving LogisticRegressionNet\r\n", + "I0905 01:07:27.118026 2129298192 solver.cpp:251] Iteration 0, Testing net (#0)\r\n", + "I0905 01:07:27.123764 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.646801\r\n", + "I0905 01:07:27.123847 2129298192 solver.cpp:302] Test net output #1: loss = 0.690777 (* 1 = 0.690777 loss)\r\n", + "I0905 01:07:27.123888 2129298192 solver.cpp:195] Iteration 0, loss = 0.689469\r\n", + "I0905 01:07:27.123898 2129298192 solver.cpp:210] Train net output #0: loss = 0.689469 (* 1 = 0.689469 loss)\r\n", + "I0905 01:07:27.123915 2129298192 solver.cpp:405] Iteration 0, lr = 0.01\r\n", + "I0905 01:07:27.127096 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.128094 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.129258 2129298192 solver.cpp:251] Iteration 1000, Testing net (#0)\r\n", + "I0905 01:07:27.135226 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.745599\r\n", + "I0905 01:07:27.135296 2129298192 solver.cpp:302] Test net output #1: loss = 0.573658 (* 1 = 0.573658 loss)\r\n", + "I0905 01:07:27.135315 2129298192 solver.cpp:195] Iteration 1000, loss = 0.49682\r\n", + "I0905 01:07:27.135325 2129298192 solver.cpp:210] Train net output #0: loss = 0.49682 (* 1 = 0.49682 loss)\r\n", + "I0905 01:07:27.135334 2129298192 solver.cpp:405] Iteration 1000, lr = 0.01\r\n", + "I0905 01:07:27.137315 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.137358 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.138335 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.140410 2129298192 solver.cpp:251] Iteration 2000, Testing net (#0)\r\n", + "I0905 01:07:27.147435 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.746399\r\n", + "I0905 01:07:27.147514 2129298192 solver.cpp:302] Test net output #1: loss = 0.582127 (* 1 = 0.582127 loss)\r\n", + "I0905 01:07:27.147541 2129298192 solver.cpp:195] Iteration 2000, loss = 0.555272\r\n", + "I0905 01:07:27.147553 2129298192 solver.cpp:210] Train net output #0: loss = 0.555272 (* 1 = 0.555272 loss)\r\n", + "I0905 01:07:27.147565 2129298192 solver.cpp:405] Iteration 2000, lr = 0.01\r\n", + "I0905 01:07:27.148572 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.149441 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.152377 2129298192 solver.cpp:251] Iteration 3000, Testing net (#0)\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "I0904 17:54:31.781949 2129298192 solver.cpp:251] Iteration 3000, Testing net (#0)\r\n", - "I0904 17:54:31.788913 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7376\r\n", - "I0904 17:54:31.788986 2129298192 solver.cpp:302] Test net output #1: loss = 0.596472 (* 1 = 0.596472 loss)\r\n", - "I0904 17:54:31.789000 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", - "I0904 17:54:31.789005 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.789858 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.789932 2129298192 solver.cpp:195] Iteration 3000, loss = 0.42153\r\n", - "I0904 17:54:31.789959 2129298192 solver.cpp:210] Train net output #0: loss = 0.42153 (* 1 = 0.42153 loss)\r\n", - "I0904 17:54:31.790071 2129298192 solver.cpp:405] Iteration 3000, lr = 0.01\r\n", - "I0904 17:54:31.793167 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.794184 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.795362 2129298192 solver.cpp:251] Iteration 4000, Testing net (#0)\r\n", - "I0904 17:54:31.802089 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.5632\r\n", - "I0904 17:54:31.802183 2129298192 solver.cpp:302] Test net output #1: loss = 0.619953 (* 1 = 0.619953 loss)\r\n", - "I0904 17:54:31.802232 2129298192 solver.cpp:195] Iteration 4000, loss = 0.520827\r\n", - "I0904 17:54:31.802254 2129298192 solver.cpp:210] Train net output #0: loss = 0.520827 (* 1 = 0.520827 loss)\r\n", - "I0904 17:54:31.802275 2129298192 solver.cpp:405] Iteration 4000, lr = 0.01\r\n", - "I0904 17:54:31.805856 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", - "I0904 17:54:31.805949 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.807231 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.809342 2129298192 solver.cpp:251] Iteration 5000, Testing net (#0)\r\n", - "I0904 17:54:31.815631 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.768\r\n", - "I0904 17:54:31.815783 2129298192 solver.cpp:302] Test net output #1: loss = 0.596873 (* 1 = 0.596873 loss)\r\n", - "I0904 17:54:31.815820 2129298192 solver.cpp:195] Iteration 5000, loss = 0.483448\r\n", - "I0904 17:54:31.815835 2129298192 solver.cpp:210] Train net output #0: loss = 0.483448 (* 1 = 0.483448 loss)\r\n", - "I0904 17:54:31.815853 2129298192 solver.cpp:405] Iteration 5000, lr = 0.001\r\n", - "I0904 17:54:31.816906 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.818512 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.823189 2129298192 solver.cpp:251] Iteration 6000, Testing net (#0)\r\n" + "I0905 01:07:27.158655 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.696\r\n", + "I0905 01:07:27.158746 2129298192 solver.cpp:302] Test net output #1: loss = 0.580239 (* 1 = 0.580239 loss)\r\n", + "I0905 01:07:27.158761 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.158768 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.159765 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.159843 2129298192 solver.cpp:195] Iteration 3000, loss = 0.476517\r\n", + "I0905 01:07:27.159873 2129298192 solver.cpp:210] Train net output #0: loss = 0.476517 (* 1 = 0.476517 loss)\r\n", + "I0905 01:07:27.159983 2129298192 solver.cpp:405] Iteration 3000, lr = 0.01\r\n", + "I0905 01:07:27.163079 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.163602 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.164567 2129298192 solver.cpp:251] Iteration 4000, Testing net (#0)\r\n", + "I0905 01:07:27.170277 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.745599\r\n", + "I0905 01:07:27.170344 2129298192 solver.cpp:302] Test net output #1: loss = 0.573658 (* 1 = 0.573658 loss)\r\n", + "I0905 01:07:27.170364 2129298192 solver.cpp:195] Iteration 4000, loss = 0.49682\r\n", + "I0905 01:07:27.170375 2129298192 solver.cpp:210] Train net output #0: loss = 0.49682 (* 1 = 0.49682 loss)\r\n", + "I0905 01:07:27.170385 2129298192 solver.cpp:405] Iteration 4000, lr = 0.01\r\n", + "I0905 01:07:27.172350 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.172374 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.173084 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.175192 2129298192 solver.cpp:251] Iteration 5000, Testing net (#0)\r\n", + "I0905 01:07:27.181659 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.746399\r\n", + "I0905 01:07:27.181710 2129298192 solver.cpp:302] Test net output #1: loss = 0.582127 (* 1 = 0.582127 loss)\r\n", + "I0905 01:07:27.181730 2129298192 solver.cpp:195] Iteration 5000, loss = 0.555272\r\n", + "I0905 01:07:27.181740 2129298192 solver.cpp:210] Train net output #0: loss = 0.555272 (* 1 = 0.555272 loss)\r\n", + "I0905 01:07:27.181748 2129298192 solver.cpp:405] Iteration 5000, lr = 0.001\r\n", + "I0905 01:07:27.182734 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.183248 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.186180 2129298192 solver.cpp:251] Iteration 6000, Testing net (#0)\r\n", + "I0905 01:07:27.192646 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7684\r\n", + "I0905 01:07:27.192751 2129298192 solver.cpp:302] Test net output #1: loss = 0.574538 (* 1 = 0.574538 loss)\r\n", + "I0905 01:07:27.192766 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.192773 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.193936 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.194007 2129298192 solver.cpp:195] Iteration 6000, loss = 0.464052\r\n", + "I0905 01:07:27.194036 2129298192 solver.cpp:210] Train net output #0: loss = 0.464052 (* 1 = 0.464052 loss)\r\n", + "I0905 01:07:27.194051 2129298192 solver.cpp:405] Iteration 6000, lr = 0.001\r\n", + "I0905 01:07:27.197053 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.198092 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.199162 2129298192 solver.cpp:251] Iteration 7000, Testing net (#0)\r\n", + "I0905 01:07:27.205195 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7684\r\n", + "I0905 01:07:27.205298 2129298192 solver.cpp:302] Test net output #1: loss = 0.574549 (* 1 = 0.574549 loss)\r\n", + "I0905 01:07:27.205327 2129298192 solver.cpp:195] Iteration 7000, loss = 0.495483\r\n", + "I0905 01:07:27.205338 2129298192 solver.cpp:210] Train net output #0: loss = 0.495483 (* 1 = 0.495483 loss)\r\n", + "I0905 01:07:27.205353 2129298192 solver.cpp:405] Iteration 7000, lr = 0.001\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "I0904 17:54:31.833202 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7716\r\n", - "I0904 17:54:31.833345 2129298192 solver.cpp:302] Test net output #1: loss = 0.591513 (* 1 = 0.591513 loss)\r\n", - "I0904 17:54:31.833375 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", - "I0904 17:54:31.833389 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.835263 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.835388 2129298192 solver.cpp:195] Iteration 6000, loss = 0.444828\r\n", - "I0904 17:54:31.835438 2129298192 solver.cpp:210] Train net output #0: loss = 0.444828 (* 1 = 0.444828 loss)\r\n", - "I0904 17:54:31.835461 2129298192 solver.cpp:405] Iteration 6000, lr = 0.001\r\n", - "I0904 17:54:31.840736 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.842892 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.844861 2129298192 solver.cpp:251] Iteration 7000, Testing net (#0)\r\n", - "I0904 17:54:31.852855 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7468\r\n", - "I0904 17:54:31.853005 2129298192 solver.cpp:302] Test net output #1: loss = 0.593044 (* 1 = 0.593044 loss)\r\n", - "I0904 17:54:31.853076 2129298192 solver.cpp:195] Iteration 7000, loss = 0.489475\r\n", - "I0904 17:54:31.853099 2129298192 solver.cpp:210] Train net output #0: loss = 0.489475 (* 1 = 0.489475 loss)\r\n", - "I0904 17:54:31.853118 2129298192 solver.cpp:405] Iteration 7000, lr = 0.001\r\n", - "I0904 17:54:31.855607 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", - "I0904 17:54:31.855667 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.856359 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.858321 2129298192 solver.cpp:251] Iteration 8000, Testing net (#0)\r\n", - "I0904 17:54:31.864265 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7632\r\n", - "I0904 17:54:31.864409 2129298192 solver.cpp:302] Test net output #1: loss = 0.592058 (* 1 = 0.592058 loss)\r\n", - "I0904 17:54:31.864442 2129298192 solver.cpp:195] Iteration 8000, loss = 0.525746\r\n", - "I0904 17:54:31.864454 2129298192 solver.cpp:210] Train net output #0: loss = 0.525746 (* 1 = 0.525746 loss)\r\n", - "I0904 17:54:31.864466 2129298192 solver.cpp:405] Iteration 8000, lr = 0.001\r\n", - "I0904 17:54:31.865531 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.866392 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.869691 2129298192 solver.cpp:251] Iteration 9000, Testing net (#0)\r\n", - "I0904 17:54:31.876518 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7708\r\n", - "I0904 17:54:31.876603 2129298192 solver.cpp:302] Test net output #1: loss = 0.591526 (* 1 = 0.591526 loss)\r\n", - "I0904 17:54:31.876616 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", - "I0904 17:54:31.876624 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", - "I0904 17:54:31.877727 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.877826 2129298192 solver.cpp:195] Iteration 9000, loss = 0.445997\r\n", - "I0904 17:54:31.877867 2129298192 solver.cpp:210] Train net output #0: loss = 0.445997 (* 1 = 0.445997 loss)\r\n", - "I0904 17:54:31.877882 2129298192 solver.cpp:405] Iteration 9000, lr = 0.001\r\n", - "I0904 17:54:31.881119 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n" + "I0905 01:07:27.207471 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.207489 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.208534 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.210860 2129298192 solver.cpp:251] Iteration 8000, Testing net (#0)\r\n", + "I0905 01:07:27.216624 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.762\r\n", + "I0905 01:07:27.216704 2129298192 solver.cpp:302] Test net output #1: loss = 0.574515 (* 1 = 0.574515 loss)\r\n", + "I0905 01:07:27.216723 2129298192 solver.cpp:195] Iteration 8000, loss = 0.524565\r\n", + "I0905 01:07:27.216733 2129298192 solver.cpp:210] Train net output #0: loss = 0.524565 (* 1 = 0.524565 loss)\r\n", + "I0905 01:07:27.216743 2129298192 solver.cpp:405] Iteration 8000, lr = 0.001\r\n", + "I0905 01:07:27.217738 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.218291 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.221294 2129298192 solver.cpp:251] Iteration 9000, Testing net (#0)\r\n", + "I0905 01:07:27.227104 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7688\r\n", + "I0905 01:07:27.227171 2129298192 solver.cpp:302] Test net output #1: loss = 0.574278 (* 1 = 0.574278 loss)\r\n", + "I0905 01:07:27.227183 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.227190 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.228143 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.228210 2129298192 solver.cpp:195] Iteration 9000, loss = 0.461831\r\n", + "I0905 01:07:27.228240 2129298192 solver.cpp:210] Train net output #0: loss = 0.461831 (* 1 = 0.461831 loss)\r\n", + "I0905 01:07:27.228252 2129298192 solver.cpp:405] Iteration 9000, lr = 0.001\r\n", + "I0905 01:07:27.231314 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.232293 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.233417 2129298192 solver.cpp:319] Snapshotting to examples/hdf5_classification/data/train_iter_10000\r\n", + "I0905 01:07:27.233680 2129298192 solver.cpp:326] Snapshotting solver state to examples/hdf5_classification/data/train_iter_10000.solverstate\r\n", + "I0905 01:07:27.233795 2129298192 solver.cpp:232] Iteration 10000, loss = 0.49554\r\n", + "I0905 01:07:27.233814 2129298192 solver.cpp:251] Iteration 10000, Testing net (#0)\r\n", + "I0905 01:07:27.240015 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.768\r\n", + "I0905 01:07:27.240099 2129298192 solver.cpp:302] Test net output #1: loss = 0.574488 (* 1 = 0.574488 loss)\r\n", + "I0905 01:07:27.240110 2129298192 solver.cpp:237] Optimization Done.\r\n", + "I0905 01:07:27.240118 2129298192 caffe.cpp:114] Optimization Done.\r\n" + ] + } + ], + "prompt_number": 6 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you look at the `train_val.prototxt`, you'll see that it's simple logistic regression.\n", + "We can make it a little more advanced by introducing a non-linearity between weights that take the input and weights that give the output -- now we have a two-layer neural network.\n", + "That network is given in `train_val2.prototxt`, and that's the only change made in `solver2.prototxt` which we will now use.\n", + "\n", + "The final accuracy of the network we'll train below should be higher than for the network above!" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "!cd .. && ./build/tools/caffe train -solver examples/hdf5_classification/solver2.prototxt" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0905 01:07:27.466722 2129298192 caffe.cpp:90] Starting Optimization\r\n", + "I0905 01:07:27.468166 2129298192 solver.cpp:32] Initializing solver from parameters: \r\n", + "test_iter: 1000\r\n", + "test_interval: 1000\r\n", + "base_lr: 0.01\r\n", + "display: 1000\r\n", + "max_iter: 10000\r\n", + "lr_policy: \"step\"\r\n", + "gamma: 0.1\r\n", + "momentum: 0.9\r\n", + "weight_decay: 0.0005\r\n", + "stepsize: 5000\r\n", + "snapshot: 10000\r\n", + "snapshot_prefix: \"examples/hdf5_classification/data/train\"\r\n", + "solver_mode: CPU\r\n", + "net: \"examples/hdf5_classification/train_val2.prototxt\"\r\n", + "I0905 01:07:27.468351 2129298192 solver.cpp:72] Creating training net from net file: examples/hdf5_classification/train_val2.prototxt\r\n", + "I0905 01:07:27.469081 2129298192 net.cpp:275] The NetState phase (0) differed from the phase (1) specified by a rule in layer data\r\n", + "I0905 01:07:27.469100 2129298192 net.cpp:275] The NetState phase (0) differed from the phase (1) specified by a rule in layer accuracy\r\n", + "I0905 01:07:27.469110 2129298192 net.cpp:39] Initializing net from parameters: \r\n", + "name: \"LogisticRegressionNet\"\r\n", + "layers {\r\n", + " top: \"data\"\r\n", + " top: \"label\"\r\n", + " name: \"data\"\r\n", + " type: HDF5_DATA\r\n", + " hdf5_data_param {\r\n", + " source: \"examples/hdf5_classification/data/train.txt\"\r\n", + " batch_size: 10\r\n", + " }\r\n", + " include {\r\n", + " phase: TRAIN\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"data\"\r\n", + " top: \"fc1\"\r\n", + " name: \"fc1\"\r\n", + " type: INNER_PRODUCT\r\n", + " blobs_lr: 1\r\n", + " blobs_lr: 2\r\n", + " weight_decay: 1\r\n", + " weight_decay: 0\r\n", + " inner_product_param {\r\n", + " num_output: 40\r\n", + " weight_filler {\r\n", + " type: \"gaussian\"\r\n", + " std: 0.01\r\n", + " }\r\n", + " bias_filler {\r\n", + " type: \"constant\"\r\n", + " value: 0\r\n", + " }\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc1\"\r\n", + " top: \"fc1\"\r\n", + " name: \"relu1\"\r\n", + " type: RELU\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc1\"\r\n", + " top: \"fc2\"\r\n", + " name: \"fc2\"\r\n", + " type: INNER_PRODUCT\r\n", + " blobs_lr: 1\r\n", + " blobs_lr: 2\r\n", + " weight_decay: 1\r\n", + " weight_decay: 0\r\n", + " inner_product_param {\r\n", + " num_output: 2\r\n", + " weight_filler {\r\n", + " type: \"gaussian\"\r\n", + " std: 0.01\r\n", + " }\r\n", + " bias_filler {\r\n", + " type: \"constant\"\r\n", + " value: 0\r\n", + " }\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc2\"\r\n", + " bottom: \"label\"\r\n", + " top: \"loss\"\r\n", + " name: \"loss\"\r\n", + " type: SOFTMAX_LOSS\r\n", + "}\r\n", + "state {\r\n", + " phase: TRAIN\r\n", + "}\r\n", + "I0905 01:07:27.469447 2129298192 net.cpp:67] Creating Layer data\r\n", + "I0905 01:07:27.469467 2129298192 net.cpp:356] data -> data\r\n", + "I0905 01:07:27.469493 2129298192 net.cpp:356] data -> label\r\n", + "I0905 01:07:27.469503 2129298192 net.cpp:96] Setting up data\r\n", + "I0905 01:07:27.469511 2129298192 hdf5_data_layer.cpp:57] Loading filename from examples/hdf5_classification/data/train.txt\r\n", + "I0905 01:07:27.469558 2129298192 hdf5_data_layer.cpp:69] Number of files: 2\r\n", + "I0905 01:07:27.469569 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.471978 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.471997 2129298192 hdf5_data_layer.cpp:81] output data size: 10,4,1,1\r\n", + "I0905 01:07:27.472008 2129298192 net.cpp:103] Top shape: 10 4 1 1 (40)\r\n", + "I0905 01:07:27.472015 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0905 01:07:27.472026 2129298192 net.cpp:67] Creating Layer fc1\r\n", + "I0905 01:07:27.472033 2129298192 net.cpp:394] fc1 <- data\r\n", + "I0905 01:07:27.472045 2129298192 net.cpp:356] fc1 -> fc1\r\n", + "I0905 01:07:27.472060 2129298192 net.cpp:96] Setting up fc1\r\n", + "I0905 01:07:27.476827 2129298192 net.cpp:103] Top shape: 10 40 1 1 (400)\r\n", + "I0905 01:07:27.476857 2129298192 net.cpp:67] Creating Layer relu1\r\n", + "I0905 01:07:27.476865 2129298192 net.cpp:394] relu1 <- fc1\r\n", + "I0905 01:07:27.476872 2129298192 net.cpp:345] relu1 -> fc1 (in-place)\r\n", + "I0905 01:07:27.476881 2129298192 net.cpp:96] Setting up relu1\r\n", + "I0905 01:07:27.476888 2129298192 net.cpp:103] Top shape: 10 40 1 1 (400)\r\n", + "I0905 01:07:27.476896 2129298192 net.cpp:67] Creating Layer fc2\r\n", + "I0905 01:07:27.476902 2129298192 net.cpp:394] fc2 <- fc1\r\n", + "I0905 01:07:27.476909 2129298192 net.cpp:356] fc2 -> fc2\r\n", + "I0905 01:07:27.476918 2129298192 net.cpp:96] Setting up fc2\r\n", + "I0905 01:07:27.476932 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0905 01:07:27.476955 2129298192 net.cpp:67] Creating Layer loss\r\n", + "I0905 01:07:27.476963 2129298192 net.cpp:394] loss <- fc2\r\n", + "I0905 01:07:27.476969 2129298192 net.cpp:394] loss <- label\r\n", + "I0905 01:07:27.476975 2129298192 net.cpp:356] loss -> loss\r\n", + "I0905 01:07:27.476984 2129298192 net.cpp:96] Setting up loss\r\n", + "I0905 01:07:27.477005 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", + "I0905 01:07:27.477040 2129298192 net.cpp:109] with loss weight 1\r\n", + "I0905 01:07:27.477051 2129298192 net.cpp:170] loss needs backward computation.\r\n", + "I0905 01:07:27.477058 2129298192 net.cpp:170] fc2 needs backward computation.\r\n", + "I0905 01:07:27.477063 2129298192 net.cpp:170] relu1 needs backward computation.\r\n", + "I0905 01:07:27.477069 2129298192 net.cpp:170] fc1 needs backward computation.\r\n", + "I0905 01:07:27.477076 2129298192 net.cpp:172] data does not need backward computation.\r\n", + "I0905 01:07:27.477080 2129298192 net.cpp:208] This network produces output loss\r\n", + "I0905 01:07:27.477099 2129298192 net.cpp:467] Collecting Learning Rate and Weight Decay.\r\n", + "I0905 01:07:27.477105 2129298192 net.cpp:219] Network initialization done.\r\n", + "I0905 01:07:27.477112 2129298192 net.cpp:220] Memory required for data: 3484\r\n", + "I0905 01:07:27.477455 2129298192 solver.cpp:156] Creating test net (#0) specified by net file: examples/hdf5_classification/train_val2.prototxt\r\n", + "I0905 01:07:27.477480 2129298192 net.cpp:275] The NetState phase (1) differed from the phase (0) specified by a rule in layer data\r\n", + "I0905 01:07:27.477494 2129298192 net.cpp:39] Initializing net from parameters: \r\n", + "name: \"LogisticRegressionNet\"\r\n", + "layers {\r\n", + " top: \"data\"\r\n", + " top: \"label\"\r\n", + " name: \"data\"\r\n", + " type: HDF5_DATA\r\n", + " hdf5_data_param {\r\n", + " source: \"examples/hdf5_classification/data/test.txt\"\r\n", + " batch_size: 10\r\n", + " }\r\n", + " include {\r\n", + " phase: TEST\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"data\"\r\n", + " top: \"fc1\"\r\n", + " name: \"fc1\"\r\n", + " type: INNER_PRODUCT\r\n", + " blobs_lr: 1\r\n", + " blobs_lr: 2\r\n", + " weight_decay: 1\r\n", + " weight_decay: 0\r\n", + " inner_product_param {\r\n", + " num_output: 40\r\n", + " weight_filler {\r\n", + " type: \"gaussian\"\r\n", + " std: 0.01\r\n", + " }\r\n", + " bias_filler {\r\n", + " type: \"constant\"\r\n", + " value: 0\r\n", + " }\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc1\"\r\n", + " top: \"fc1\"\r\n", + " name: \"relu1\"\r\n", + " type: RELU\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc1\"\r\n", + " top: \"fc2\"\r\n", + " name: \"fc2\"\r\n", + " type: INNER_PRODUCT\r\n", + " blobs_lr: 1\r\n", + " blobs_lr: 2\r\n", + " weight_decay: 1\r\n", + " weight_decay: 0\r\n", + " inner_product_param {\r\n", + " num_output: 2\r\n", + " weight_filler {\r\n", + " type: \"gaussian\"\r\n", + " std: 0.01\r\n", + " }\r\n", + " bias_filler {\r\n", + " type: \"constant\"\r\n", + " value: 0\r\n", + " }\r\n", + " }\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc2\"\r\n", + " bottom: \"label\"\r\n", + " top: \"loss\"\r\n", + " name: \"loss\"\r\n", + " type: SOFTMAX_LOSS\r\n", + "}\r\n", + "layers {\r\n", + " bottom: \"fc2\"\r\n", + " bottom: \"label\"\r\n", + " top: \"accuracy\"\r\n", + " name: \"accuracy\"\r\n", + " type: ACCURACY\r\n", + " include {\r\n", + " phase: TEST\r\n", + " }\r\n", + "}\r\n", + "state {\r\n", + " phase: TEST\r\n", + "}\r\n", + "I0905 01:07:27.477839 2129298192 net.cpp:67] Creating Layer data\r\n", + "I0905 01:07:27.477850 2129298192 net.cpp:356] data -> data\r\n", + "I0905 01:07:27.477861 2129298192 net.cpp:356] data -> label\r\n", + "I0905 01:07:27.477870 2129298192 net.cpp:96] Setting up data\r\n", + "I0905 01:07:27.477876 2129298192 hdf5_data_layer.cpp:57] Loading filename from examples/hdf5_classification/data/test.txt\r\n", + "I0905 01:07:27.477902 2129298192 hdf5_data_layer.cpp:69] Number of files: 1\r\n" ] }, { "output_type": "stream", "stream": "stdout", "text": [ - "I0904 17:54:31.882143 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", - "I0904 17:54:31.883280 2129298192 solver.cpp:319] Snapshotting to examples/hdf5_classification/data/train_iter_10000\r\n", - "I0904 17:54:31.883776 2129298192 solver.cpp:326] Snapshotting solver state to examples/hdf5_classification/data/train_iter_10000.solverstate\r\n", - "I0904 17:54:31.884004 2129298192 solver.cpp:232] Iteration 10000, loss = 0.489453\r\n", - "I0904 17:54:31.884037 2129298192 solver.cpp:251] Iteration 10000, Testing net (#0)\r\n", - "I0904 17:54:31.890312 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7468\r\n", - "I0904 17:54:31.890403 2129298192 solver.cpp:302] Test net output #1: loss = 0.593055 (* 1 = 0.593055 loss)\r\n", - "I0904 17:54:31.890415 2129298192 solver.cpp:237] Optimization Done.\r\n", - "I0904 17:54:31.890422 2129298192 caffe.cpp:114] Optimization Done.\r\n" + "I0905 01:07:27.477910 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/test.h5\r\n", + "I0905 01:07:27.478999 2129298192 hdf5_data_layer.cpp:49] Successully loaded 2500 rows\r\n", + "I0905 01:07:27.479014 2129298192 hdf5_data_layer.cpp:81] output data size: 10,4,1,1\r\n", + "I0905 01:07:27.479022 2129298192 net.cpp:103] Top shape: 10 4 1 1 (40)\r\n", + "I0905 01:07:27.479028 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0905 01:07:27.479038 2129298192 net.cpp:67] Creating Layer label_data_1_split\r\n", + "I0905 01:07:27.479044 2129298192 net.cpp:394] label_data_1_split <- label\r\n", + "I0905 01:07:27.479058 2129298192 net.cpp:356] label_data_1_split -> label_data_1_split_0\r\n", + "I0905 01:07:27.479069 2129298192 net.cpp:356] label_data_1_split -> label_data_1_split_1\r\n", + "I0905 01:07:27.479079 2129298192 net.cpp:96] Setting up label_data_1_split\r\n", + "I0905 01:07:27.479086 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0905 01:07:27.479092 2129298192 net.cpp:103] Top shape: 10 1 1 1 (10)\r\n", + "I0905 01:07:27.479100 2129298192 net.cpp:67] Creating Layer fc1\r\n", + "I0905 01:07:27.480850 2129298192 net.cpp:394] fc1 <- data\r\n", + "I0905 01:07:27.480871 2129298192 net.cpp:356] fc1 -> fc1\r\n", + "I0905 01:07:27.480887 2129298192 net.cpp:96] Setting up fc1\r\n", + "I0905 01:07:27.480908 2129298192 net.cpp:103] Top shape: 10 40 1 1 (400)\r\n", + "I0905 01:07:27.480978 2129298192 net.cpp:67] Creating Layer relu1\r\n", + "I0905 01:07:27.480986 2129298192 net.cpp:394] relu1 <- fc1\r\n", + "I0905 01:07:27.480994 2129298192 net.cpp:345] relu1 -> fc1 (in-place)\r\n", + "I0905 01:07:27.481003 2129298192 net.cpp:96] Setting up relu1\r\n", + "I0905 01:07:27.481009 2129298192 net.cpp:103] Top shape: 10 40 1 1 (400)\r\n", + "I0905 01:07:27.481017 2129298192 net.cpp:67] Creating Layer fc2\r\n", + "I0905 01:07:27.481024 2129298192 net.cpp:394] fc2 <- fc1\r\n", + "I0905 01:07:27.481031 2129298192 net.cpp:356] fc2 -> fc2\r\n", + "I0905 01:07:27.481041 2129298192 net.cpp:96] Setting up fc2\r\n", + "I0905 01:07:27.481055 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0905 01:07:27.481065 2129298192 net.cpp:67] Creating Layer fc2_fc2_0_split\r\n", + "I0905 01:07:27.481343 2129298192 net.cpp:394] fc2_fc2_0_split <- fc2\r\n", + "I0905 01:07:27.481360 2129298192 net.cpp:356] fc2_fc2_0_split -> fc2_fc2_0_split_0\r\n", + "I0905 01:07:27.481371 2129298192 net.cpp:356] fc2_fc2_0_split -> fc2_fc2_0_split_1\r\n", + "I0905 01:07:27.481379 2129298192 net.cpp:96] Setting up fc2_fc2_0_split\r\n", + "I0905 01:07:27.481387 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0905 01:07:27.481392 2129298192 net.cpp:103] Top shape: 10 2 1 1 (20)\r\n", + "I0905 01:07:27.481401 2129298192 net.cpp:67] Creating Layer loss\r\n", + "I0905 01:07:27.481407 2129298192 net.cpp:394] loss <- fc2_fc2_0_split_0\r\n", + "I0905 01:07:27.481413 2129298192 net.cpp:394] loss <- label_data_1_split_0\r\n", + "I0905 01:07:27.481421 2129298192 net.cpp:356] loss -> loss\r\n", + "I0905 01:07:27.481434 2129298192 net.cpp:96] Setting up loss\r\n", + "I0905 01:07:27.481446 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", + "I0905 01:07:27.481452 2129298192 net.cpp:109] with loss weight 1\r\n", + "I0905 01:07:27.481466 2129298192 net.cpp:67] Creating Layer accuracy\r\n", + "I0905 01:07:27.481472 2129298192 net.cpp:394] accuracy <- fc2_fc2_0_split_1\r\n", + "I0905 01:07:27.481504 2129298192 net.cpp:394] accuracy <- label_data_1_split_1\r\n", + "I0905 01:07:27.481513 2129298192 net.cpp:356] accuracy -> accuracy\r\n", + "I0905 01:07:27.481521 2129298192 net.cpp:96] Setting up accuracy\r\n", + "I0905 01:07:27.481528 2129298192 net.cpp:103] Top shape: 1 1 1 1 (1)\r\n", + "I0905 01:07:27.481534 2129298192 net.cpp:172] accuracy does not need backward computation.\r\n", + "I0905 01:07:27.481540 2129298192 net.cpp:170] loss needs backward computation.\r\n", + "I0905 01:07:27.481545 2129298192 net.cpp:170] fc2_fc2_0_split needs backward computation.\r\n", + "I0905 01:07:27.481551 2129298192 net.cpp:170] fc2 needs backward computation.\r\n", + "I0905 01:07:27.481557 2129298192 net.cpp:170] relu1 needs backward computation.\r\n", + "I0905 01:07:27.481562 2129298192 net.cpp:170] fc1 needs backward computation.\r\n", + "I0905 01:07:27.481569 2129298192 net.cpp:172] label_data_1_split does not need backward computation.\r\n", + "I0905 01:07:27.481575 2129298192 net.cpp:172] data does not need backward computation.\r\n", + "I0905 01:07:27.481730 2129298192 net.cpp:208] This network produces output accuracy\r\n", + "I0905 01:07:27.481742 2129298192 net.cpp:208] This network produces output loss\r\n", + "I0905 01:07:27.481758 2129298192 net.cpp:467] Collecting Learning Rate and Weight Decay.\r\n", + "I0905 01:07:27.481766 2129298192 net.cpp:219] Network initialization done.\r\n", + "I0905 01:07:27.481771 2129298192 net.cpp:220] Memory required for data: 3728\r\n", + "I0905 01:07:27.481814 2129298192 solver.cpp:46] Solver scaffolding done.\r\n", + "I0905 01:07:27.481822 2129298192 solver.cpp:165] Solving LogisticRegressionNet\r\n", + "I0905 01:07:27.481844 2129298192 solver.cpp:251] Iteration 0, Testing net (#0)\r\n", + "I0905 01:07:27.488900 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.4924\r\n", + "I0905 01:07:27.488932 2129298192 solver.cpp:302] Test net output #1: loss = 0.693168 (* 1 = 0.693168 loss)\r\n", + "I0905 01:07:27.488962 2129298192 solver.cpp:195] Iteration 0, loss = 0.692972\r\n", + "I0905 01:07:27.488973 2129298192 solver.cpp:210] Train net output #0: loss = 0.692972 (* 1 = 0.692972 loss)\r\n", + "I0905 01:07:27.488984 2129298192 solver.cpp:405] Iteration 0, lr = 0.01\r\n", + "I0905 01:07:27.495033 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.495604 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.497684 2129298192 solver.cpp:251] Iteration 1000, Testing net (#0)\r\n", + "I0905 01:07:27.504875 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.7744\r\n", + "I0905 01:07:27.504930 2129298192 solver.cpp:302] Test net output #1: loss = 0.486552 (* 1 = 0.486552 loss)\r\n", + "I0905 01:07:27.504955 2129298192 solver.cpp:195] Iteration 1000, loss = 0.660151\r\n", + "I0905 01:07:27.504966 2129298192 solver.cpp:210] Train net output #0: loss = 0.660151 (* 1 = 0.660151 loss)\r\n", + "I0905 01:07:27.504976 2129298192 solver.cpp:405] Iteration 1000, lr = 0.01\r\n", + "I0905 01:07:27.509419 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.509467 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.510288 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.514822 2129298192 solver.cpp:251] Iteration 2000, Testing net (#0)\r\n", + "I0905 01:07:27.522342 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.8004\r\n", + "I0905 01:07:27.522444 2129298192 solver.cpp:302] Test net output #1: loss = 0.447153 (* 1 = 0.447153 loss)\r\n", + "I0905 01:07:27.522483 2129298192 solver.cpp:195] Iteration 2000, loss = 0.505697\r\n", + "I0905 01:07:27.522495 2129298192 solver.cpp:210] Train net output #0: loss = 0.505697 (* 1 = 0.505697 loss)\r\n", + "I0905 01:07:27.522507 2129298192 solver.cpp:405] Iteration 2000, lr = 0.01\r\n", + "I0905 01:07:27.524762 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.525921 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0905 01:07:27.533335 2129298192 solver.cpp:251] Iteration 3000, Testing net (#0)\r\n", + "I0905 01:07:27.541055 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.8144\r\n", + "I0905 01:07:27.541146 2129298192 solver.cpp:302] Test net output #1: loss = 0.421441 (* 1 = 0.421441 loss)\r\n", + "I0905 01:07:27.541160 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.541167 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.542178 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.542261 2129298192 solver.cpp:195] Iteration 3000, loss = 0.242177\r\n", + "I0905 01:07:27.542284 2129298192 solver.cpp:210] Train net output #0: loss = 0.242177 (* 1 = 0.242177 loss)\r\n", + "I0905 01:07:27.542310 2129298192 solver.cpp:405] Iteration 3000, lr = 0.01\r\n", + "I0905 01:07:27.549348 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.550144 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.552340 2129298192 solver.cpp:251] Iteration 4000, Testing net (#0)\r\n", + "I0905 01:07:27.560089 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.784001\r\n", + "I0905 01:07:27.560227 2129298192 solver.cpp:302] Test net output #1: loss = 0.4395 (* 1 = 0.4395 loss)\r\n", + "I0905 01:07:27.560286 2129298192 solver.cpp:195] Iteration 4000, loss = 1.01631\r\n", + "I0905 01:07:27.560302 2129298192 solver.cpp:210] Train net output #0: loss = 1.01631 (* 1 = 1.01631 loss)\r\n", + "I0905 01:07:27.560315 2129298192 solver.cpp:405] Iteration 4000, lr = 0.01\r\n", + "I0905 01:07:27.565016 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.565101 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.566145 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.570286 2129298192 solver.cpp:251] Iteration 5000, Testing net (#0)\r\n", + "I0905 01:07:27.577373 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.802\r\n", + "I0905 01:07:27.577426 2129298192 solver.cpp:302] Test net output #1: loss = 0.463582 (* 1 = 0.463582 loss)\r\n", + "I0905 01:07:27.577452 2129298192 solver.cpp:195] Iteration 5000, loss = 0.632809\r\n", + "I0905 01:07:27.577463 2129298192 solver.cpp:210] Train net output #0: loss = 0.632809 (* 1 = 0.632809 loss)\r\n", + "I0905 01:07:27.577564 2129298192 solver.cpp:405] Iteration 5000, lr = 0.001\r\n", + "I0905 01:07:27.579649 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.580368 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0905 01:07:27.586956 2129298192 solver.cpp:251] Iteration 6000, Testing net (#0)\r\n", + "I0905 01:07:27.594288 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.822\r\n", + "I0905 01:07:27.594327 2129298192 solver.cpp:302] Test net output #1: loss = 0.407026 (* 1 = 0.407026 loss)\r\n", + "I0905 01:07:27.594338 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.594344 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.594861 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.594897 2129298192 solver.cpp:195] Iteration 6000, loss = 0.214342\r\n", + "I0905 01:07:27.594910 2129298192 solver.cpp:210] Train net output #0: loss = 0.214342 (* 1 = 0.214342 loss)\r\n", + "I0905 01:07:27.594919 2129298192 solver.cpp:405] Iteration 6000, lr = 0.001\r\n", + "I0905 01:07:27.601003 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.601380 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.603358 2129298192 solver.cpp:251] Iteration 7000, Testing net (#0)\r\n", + "I0905 01:07:27.610307 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.8264\r\n", + "I0905 01:07:27.610323 2129298192 solver.cpp:302] Test net output #1: loss = 0.403283 (* 1 = 0.403283 loss)\r\n", + "I0905 01:07:27.610342 2129298192 solver.cpp:195] Iteration 7000, loss = 0.894732\r\n", + "I0905 01:07:27.610352 2129298192 solver.cpp:210] Train net output #0: loss = 0.894732 (* 1 = 0.894732 loss)\r\n", + "I0905 01:07:27.610359 2129298192 solver.cpp:405] Iteration 7000, lr = 0.001\r\n", + "I0905 01:07:27.614289 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.614297 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.614701 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.618602 2129298192 solver.cpp:251] Iteration 8000, Testing net (#0)\r\n", + "I0905 01:07:27.625637 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.8216\r\n", + "I0905 01:07:27.625661 2129298192 solver.cpp:302] Test net output #1: loss = 0.402446 (* 1 = 0.402446 loss)\r\n", + "I0905 01:07:27.625680 2129298192 solver.cpp:195] Iteration 8000, loss = 0.500503\r\n", + "I0905 01:07:27.625690 2129298192 solver.cpp:210] Train net output #0: loss = 0.500503 (* 1 = 0.500503 loss)\r\n", + "I0905 01:07:27.625707 2129298192 solver.cpp:405] Iteration 8000, lr = 0.001\r\n", + "I0905 01:07:27.627665 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.628075 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n" + ] + }, + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "I0905 01:07:27.634202 2129298192 solver.cpp:251] Iteration 9000, Testing net (#0)\r\n", + "I0905 01:07:27.641368 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.8252\r\n", + "I0905 01:07:27.641412 2129298192 solver.cpp:302] Test net output #1: loss = 0.404175 (* 1 = 0.404175 loss)\r\n", + "I0905 01:07:27.641422 2129298192 hdf5_data_layer.cpp:99] looping around to first file\r\n", + "I0905 01:07:27.641428 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.641960 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.642004 2129298192 solver.cpp:195] Iteration 9000, loss = 0.201587\r\n", + "I0905 01:07:27.642016 2129298192 solver.cpp:210] Train net output #0: loss = 0.201587 (* 1 = 0.201587 loss)\r\n", + "I0905 01:07:27.642026 2129298192 solver.cpp:405] Iteration 9000, lr = 0.001\r\n", + "I0905 01:07:27.648680 2129298192 hdf5_data_layer.cpp:29] Loading HDF5 file/Users/sergeyk/work/caffe/examples/hdf5_classification/data/train.h5\r\n", + "I0905 01:07:27.649211 2129298192 hdf5_data_layer.cpp:49] Successully loaded 7500 rows\r\n", + "I0905 01:07:27.651327 2129298192 solver.cpp:319] Snapshotting to examples/hdf5_classification/data/train_iter_10000\r\n", + "I0905 01:07:27.651476 2129298192 solver.cpp:326] Snapshotting solver state to examples/hdf5_classification/data/train_iter_10000.solverstate\r\n", + "I0905 01:07:27.651564 2129298192 solver.cpp:232] Iteration 10000, loss = 0.935422\r\n", + "I0905 01:07:27.651582 2129298192 solver.cpp:251] Iteration 10000, Testing net (#0)\r\n", + "I0905 01:07:27.658738 2129298192 solver.cpp:302] Test net output #0: accuracy = 0.826\r\n", + "I0905 01:07:27.658782 2129298192 solver.cpp:302] Test net output #1: loss = 0.400826 (* 1 = 0.400826 loss)\r\n", + "I0905 01:07:27.658790 2129298192 solver.cpp:237] Optimization Done.\r\n", + "I0905 01:07:27.658797 2129298192 caffe.cpp:114] Optimization Done.\r\n" ] } ], - "prompt_number": 6 + "prompt_number": 7 }, { "cell_type": "code", @@ -496,10 +937,10 @@ "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 7 + "prompt_number": 8 } ], "metadata": {} } ] -} +} \ No newline at end of file diff --git a/examples/hdf5_classification/solver2.prototxt b/examples/hdf5_classification/solver2.prototxt new file mode 100644 index 00000000000..32a3693b4a1 --- /dev/null +++ b/examples/hdf5_classification/solver2.prototxt @@ -0,0 +1,14 @@ +net: "examples/hdf5_classification/train_val2.prototxt" +test_iter: 1000 +test_interval: 1000 +base_lr: 0.01 +lr_policy: "step" +gamma: 0.1 +stepsize: 5000 +display: 1000 +max_iter: 10000 +momentum: 0.9 +weight_decay: 0.0005 +snapshot: 10000 +snapshot_prefix: "examples/hdf5_classification/data/train" +solver_mode: CPU diff --git a/examples/hdf5_classification/train_val2.prototxt b/examples/hdf5_classification/train_val2.prototxt new file mode 100644 index 00000000000..b6a75650ad3 --- /dev/null +++ b/examples/hdf5_classification/train_val2.prototxt @@ -0,0 +1,86 @@ +name: "LogisticRegressionNet" +layers { + name: "data" + type: HDF5_DATA + top: "data" + top: "label" + hdf5_data_param { + source: "examples/hdf5_classification/data/train.txt" + batch_size: 10 + } + include: { phase: TRAIN } +} +layers { + name: "data" + type: HDF5_DATA + top: "data" + top: "label" + hdf5_data_param { + source: "examples/hdf5_classification/data/test.txt" + batch_size: 10 + } + include: { phase: TEST } +} +layers { + name: "fc1" + type: INNER_PRODUCT + bottom: "data" + top: "fc1" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 40 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "relu1" + type: RELU + bottom: "fc1" + top: "fc1" +} +layers { + name: "fc2" + type: INNER_PRODUCT + bottom: "fc1" + top: "fc2" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "fc2" + bottom: "label" + top: "loss" +} +layers { + name: "accuracy" + type: ACCURACY + bottom: "fc2" + bottom: "label" + top: "accuracy" + include: { phase: TEST } +} From 7c78cdbd47b3bbc25cbcbb1471f427a16d27a15e Mon Sep 17 00:00:00 2001 From: qipeng <pengrobertqi@163.com> Date: Thu, 4 Sep 2014 17:20:35 -0700 Subject: [PATCH 0682/2053] Gradient-based solver test fix --- src/caffe/test/test_gradient_based_solver.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/caffe/test/test_gradient_based_solver.cpp b/src/caffe/test/test_gradient_based_solver.cpp index 9c21499ea5e..d196e581230 100644 --- a/src/caffe/test/test_gradient_based_solver.cpp +++ b/src/caffe/test/test_gradient_based_solver.cpp @@ -356,7 +356,7 @@ TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdateWithMomentumMultiIter) { const Dtype kLearningRate = 1.0; const Dtype kWeightDecay = 0.0; const Dtype kMomentum = 0.5; - const int kNumIters = 5; + const int kNumIters = 4; for (int i = 0; i <= kNumIters; ++i) { this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); } @@ -367,7 +367,7 @@ TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdateWithEverything) { const Dtype kLearningRate = 0.01; const Dtype kWeightDecay = 0.1; const Dtype kMomentum = 0.9; - const int kNumIters = 5; + const int kNumIters = 4; for (int i = 0; i <= kNumIters; ++i) { this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); } @@ -412,7 +412,7 @@ TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdateWithEverything) { const Dtype kLearningRate = 0.01; const Dtype kWeightDecay = 0.1; const Dtype kMomentum = 0.0; - const int kNumIters = 5; + const int kNumIters = 4; for (int i = 0; i <= kNumIters; ++i) { this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); } @@ -468,7 +468,7 @@ TYPED_TEST(NesterovSolverTest, TestLeastSquaresUpdateWithMomentumMultiIter) { const Dtype kLearningRate = 1.0; const Dtype kWeightDecay = 0.0; const Dtype kMomentum = 0.5; - const int kNumIters = 5; + const int kNumIters = 4; for (int i = 0; i <= kNumIters; ++i) { this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); } @@ -479,7 +479,7 @@ TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdateWithEverything) { const Dtype kLearningRate = 0.01; const Dtype kWeightDecay = 0.1; const Dtype kMomentum = 0.9; - const int kNumIters = 5; + const int kNumIters = 4; for (int i = 0; i <= kNumIters; ++i) { this->TestLeastSquaresUpdate(kLearningRate, kWeightDecay, kMomentum, i); } From e82e72811cc24b198b6456fce12ada5335c95fca Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 5 Sep 2014 10:40:39 -0700 Subject: [PATCH 0683/2053] [docs] add titles --- docs/development.md | 2 +- docs/index.md | 2 ++ docs/model_zoo.md | 1 + docs/tutorial/convolution.md | 1 + docs/tutorial/data.md | 1 + docs/tutorial/forward_backward.md | 1 + docs/tutorial/index.md | 1 + docs/tutorial/interfaces.md | 1 + docs/tutorial/layers.md | 1 + docs/tutorial/loss.md | 1 + docs/tutorial/net_layer_blob.md | 1 + docs/tutorial/solver.md | 1 + 12 files changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/development.md b/docs/development.md index d65c126cf14..160e005dfb1 100644 --- a/docs/development.md +++ b/docs/development.md @@ -1,5 +1,5 @@ --- -title: Development +title: Developing and Contributing --- # Development diff --git a/docs/index.md b/docs/index.md index af4b50c323b..f33bd4f9e2e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,5 +1,7 @@ --- +title: Deep Learning Framework --- + # Caffe Caffe is a deep learning framework developed with cleanliness, readability, and speed in mind. diff --git a/docs/model_zoo.md b/docs/model_zoo.md index 0b7daa0bf17..5603c62c6bb 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -1,4 +1,5 @@ --- +title: Model Zoo --- # Caffe Model Zoo diff --git a/docs/tutorial/convolution.md b/docs/tutorial/convolution.md index 6a86e3afcfd..a02fe4ef927 100644 --- a/docs/tutorial/convolution.md +++ b/docs/tutorial/convolution.md @@ -1,4 +1,5 @@ --- +title: Convolution --- # Caffeinated Convolution diff --git a/docs/tutorial/data.md b/docs/tutorial/data.md index 87954e1da63..40605f7cd73 100644 --- a/docs/tutorial/data.md +++ b/docs/tutorial/data.md @@ -1,4 +1,5 @@ --- +title: Data --- # Data: Ins and Outs diff --git a/docs/tutorial/forward_backward.md b/docs/tutorial/forward_backward.md index 699a26c8953..f58b9cac19e 100644 --- a/docs/tutorial/forward_backward.md +++ b/docs/tutorial/forward_backward.md @@ -1,4 +1,5 @@ --- +title: Forward and Backward for Inference and Learning --- # Forward and Backward diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md index fd21a440cee..7d4e77b1d5f 100644 --- a/docs/tutorial/index.md +++ b/docs/tutorial/index.md @@ -1,4 +1,5 @@ --- +title: Caffe Tutorial --- # Caffe Tutorial diff --git a/docs/tutorial/interfaces.md b/docs/tutorial/interfaces.md index 334d27e8137..6b0ec347dfe 100644 --- a/docs/tutorial/interfaces.md +++ b/docs/tutorial/interfaces.md @@ -1,4 +1,5 @@ --- +title: Interfaces --- # Interfaces diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index c6040255dc5..fdc0b4b4720 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -1,4 +1,5 @@ --- +title: Layer Catalogue --- # Layers diff --git a/docs/tutorial/loss.md b/docs/tutorial/loss.md index 3591858ad31..aac561774bb 100644 --- a/docs/tutorial/loss.md +++ b/docs/tutorial/loss.md @@ -1,4 +1,5 @@ --- +title: Loss --- # Loss diff --git a/docs/tutorial/net_layer_blob.md b/docs/tutorial/net_layer_blob.md index 21b8ddece64..8b68ffada06 100644 --- a/docs/tutorial/net_layer_blob.md +++ b/docs/tutorial/net_layer_blob.md @@ -1,4 +1,5 @@ --- +title: Nets, Layers, and Blobs --- # Nets, Layers, and Blobs: anatomy of a Caffe model diff --git a/docs/tutorial/solver.md b/docs/tutorial/solver.md index d90470c467b..8884ea0e1e8 100644 --- a/docs/tutorial/solver.md +++ b/docs/tutorial/solver.md @@ -1,4 +1,5 @@ --- +title: Solver / Model Optimization --- # Solver From 530ec45bdac01c1d48c81ffe4050ba16e73a860a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 5 Sep 2014 10:41:20 -0700 Subject: [PATCH 0684/2053] [docs] link tutorial --- docs/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/index.md b/docs/index.md index f33bd4f9e2e..b93606acdf0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -38,6 +38,8 @@ Consult performance [details](/performance_hardware.html). Slides about the Caffe architecture, *updated 03/14*. - [ACM MM paper](http://ucb-icsi-vision-group.github.io/caffe-paper/caffe.pdf)<br /> A 4-page report for the ACM Multimedia Open Source competition. +- [Caffe Tutorial](/tutorial)<br /> +DIY deep learning with this hands-on tutorial to Caffe. - [Installation instructions](/installation.html)<br /> Tested on Ubuntu, Red Hat, OS X. * [Model Zoo](/model_zoo.html)<br /> From ec861a5563d605379c23d1592247a17ce7dce509 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 5 Sep 2014 10:42:45 -0700 Subject: [PATCH 0685/2053] [docs] fix br code --- docs/development.md | 2 +- docs/index.md | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/development.md b/docs/development.md index 160e005dfb1..dfed3308eeb 100644 --- a/docs/development.md +++ b/docs/development.md @@ -3,7 +3,7 @@ title: Developing and Contributing --- # Development -Caffe is developed with active participation of the community.<br /> +Caffe is developed with active participation of the community.<br> The [BVLC](http://bvlc.eecs.berkeley.edu/) maintainers welcome all contributions! The exact details of contributions are recorded by versioning and cited in our [acknowledgements](http://caffe.berkeleyvision.org/#acknowledgements). diff --git a/docs/index.md b/docs/index.md index b93606acdf0..f9072303d99 100644 --- a/docs/index.md +++ b/docs/index.md @@ -34,33 +34,33 @@ Consult performance [details](/performance_hardware.html). ## Documentation -- [Introductory slides](http://dl.caffe.berkeleyvision.org/caffe-presentation.pdf)<br /> +- [Introductory slides](http://dl.caffe.berkeleyvision.org/caffe-presentation.pdf)<br> Slides about the Caffe architecture, *updated 03/14*. -- [ACM MM paper](http://ucb-icsi-vision-group.github.io/caffe-paper/caffe.pdf)<br /> +- [ACM MM paper](http://ucb-icsi-vision-group.github.io/caffe-paper/caffe.pdf)<br> A 4-page report for the ACM Multimedia Open Source competition. -- [Caffe Tutorial](/tutorial)<br /> +- [Caffe Tutorial](/tutorial)<br> DIY deep learning with this hands-on tutorial to Caffe. -- [Installation instructions](/installation.html)<br /> +- [Installation instructions](/installation.html)<br> Tested on Ubuntu, Red Hat, OS X. -* [Model Zoo](/model_zoo.html)<br /> +* [Model Zoo](/model_zoo.html)<br> BVLC suggests a standard distribution format for Caffe models, and provides trained models. -* [Developing & Contributing](/development.html)<br /> +* [Developing & Contributing](/development.html)<br> Guidelines for development and contributing to Caffe. -* [API Documentation](/doxygen/)<br /> +* [API Documentation](/doxygen/)<br> Developer documentation automagically generated from code comments. ### Examples {% assign examples = site.pages | where:'category','example' | sort: 'priority' %} {% for page in examples %} -- <div><a href="{{page.url}}">{{page.title}}</a><br />{{page.description}}</div> +- <div><a href="{{page.url}}">{{page.title}}</a><br>{{page.description}}</div> {% endfor %} ### Notebook examples {% assign notebooks = site.pages | where:'category','notebook' %} {% for page in notebooks %} -- <div><a href="http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/{{page.original_path}}">{{page.title}}</a><br />{{page.description}}</div> +- <div><a href="http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/{{page.original_path}}">{{page.title}}</a><br>{{page.description}}</div> {% endfor %} ## Citing Caffe From ced3a37aeda1aed4d3e068ed445773a493c0b626 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Fri, 5 Sep 2014 11:06:26 -0700 Subject: [PATCH 0686/2053] relu,sigmoid,tanh --- docs/tutorial/layers.md | 56 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index fdc0b4b4720..e3c84a37e33 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -108,17 +108,65 @@ Loss drives learning by comparing an output to a target and assigning cost to mi ### Activation / Neuron Layers -#### ReLU / Rectified-Linear and Leaky ReLU +#### ReLU / Rectified-Linear -`RELU` +* LayerType: `RELU` +* CPU implementation: `./src/caffe/layers/relu_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/relu_layer.cu` +* Input + - $n \times c \times h \times w$ +* Output + - $n \times c \times h \times w$ +* Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) + + layers { + name: "relu1" + type: RELU + bottom: "conv1" + top: "conv1" + } + +The `RELU` layer computes the element-wise max of 0 and the input. It also supports in-place computation, meaning that the bottom and the top blob could be the same to preserve memory consumption. #### Sigmoid -`SIGMOID` +* LayerType: `SIGMOID` +* CPU implementation: `./src/caffe/layers/sigmoid_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/sigmoid_layer.cu` +* Input + - $n \times c \times h \times w$ +* Output + - $n \times c \times h \times w$ +* Sample (as seen in `./examples/imagenet/mnist_autoencoder.prototxt`) + + layers { + name: "encode1neuron" + bottom: "encode1" + top: "encode1neuron" + type: SIGMOID + } + +The `SIGMOID` layer computes the output as sigmoid(x) for each input element x. #### TanH / Hyperbolic Tangent -`TANH` +* LayerType: `TANH` +* CPU implementation: `./src/caffe/layers/tanh_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/tanh_layer.cu` +* Input + - $n \times c \times h \times w$ +* Output + - $n \times c \times h \times w$ +* Sample + + layers { + name: "encode1neuron" + bottom: "encode1" + top: "encode1neuron" + type: TANH + } + +The `TANH` layer computes the output as tanh(x) for each input element x. #### Absolute Value From 4880a2b313b69899ade957ef62e8dabd189c4530 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Fri, 5 Sep 2014 12:58:28 -0700 Subject: [PATCH 0687/2053] more blob details --- docs/tutorial/net_layer_blob.md | 87 +++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 26 deletions(-) diff --git a/docs/tutorial/net_layer_blob.md b/docs/tutorial/net_layer_blob.md index 8b68ffada06..0c86c49745c 100644 --- a/docs/tutorial/net_layer_blob.md +++ b/docs/tutorial/net_layer_blob.md @@ -1,17 +1,69 @@ --- -title: Nets, Layers, and Blobs +title: Blobs, Layers, and Nets --- -# Nets, Layers, and Blobs: anatomy of a Caffe model +# Blobs, Layers, and Nets: anatomy of a Caffe model -Deep networks are compositional models that are naturally represented as a collection of inter-connected layers. Caffe defines a net layer-by-layer in its own model schema. The network defines the entire model bottom-to-top from input data to loss. As data and derivatives flow through the network in the [forward and backward passes](forward_backward.html) Caffe stores, communicates, and manipulates the information as *blobs*: the blob is the standard array and unified memory interface for the framework. +Deep networks are compositional models that are naturally represented as a collection of inter-connected layers that work on chunks of data. Caffe defines a net layer-by-layer in its own model schema. The network defines the entire model bottom-to-top from input data to loss. As data and derivatives flow through the network in the [forward and backward passes](forward_backward.html) Caffe stores, communicates, and manipulates the information as *blobs*: the blob is the standard array and unified memory interface for the framework. The layer comes next as the foundation of both model and computation. The net follows as the collection and connection of layers. The details of blob describe how information is stored and communicated in and across layers and nets. [Solving](solver.html) is configured separately to decouple modeling and optimization. -The layer comes first as the foundation of both model and computation. The net follows as the collection and connection of layers. The details of blob describe how information is stored and communicated in and across layers and nets. +We will go over the details of these components in more detail. + +## Blob storage and communication + +A Blob is a wrapper over the actual data being processed and passed along by Caffe, and also under the hood provides synchronization capability between the CPU and the GPU. Mathematically, a blob is a 4-dimensional array that stores things in the order of (Num, Channels, Height and Width), from major to minor, and stored in a C-contiguous fashion. The main reason for putting Num (the name is due to legacy reasons, and is equivalent to the notation of "batch" as in minibatch SGD). + +Caffe stores and communicates data in 4-dimensional arrays called blobs. Blobs provide a unified memory interface, holding data e.g. batches of images, model parameters, and derivatives for optimization. + +Blobs conceal the computational and mental overhead of mixed CPU/GPU operation by synchronizing from the CPU host to the GPU device as needed. Memory on the host and device is allocated on demand (lazily) for efficient memory usage. + +The conventional blob dimensions for data are number N x channel K x height H x width W. Blob memory is row-major in layout so the last / rightmost dimension changes fastest. For example, the value at index (n, k, h, w) is physically located at index ((n * K + k) * H + h) * W + w. + +- Number / N is the batch size of the data. Batch processing achieves better throughput for communication and device processing. For an ImageNet training batch of 256 images B = 256. +- Channel / K is the feature dimension e.g. for RGB images K = 3. + +Note that although we have designed blobs with its dimensions corresponding to image applications, they are named purely for notational purpose and it is totally valid for you to do non-image applications. For example, if you simply need fully-connected networks like the conventional multi-layer perceptron, use blobs of dimensions (Num, Channels, 1, 1) and call the InnerProductLayer (which we will cover soon). + +Caffe operations are general with respect to the channel dimension / K. Grayscale and hyperspectral imagery are fine. Caffe can likewise model and process arbitrary vectors in blobs with singleton. That is, the shape of blob holding 1000 vectors of 16 feature dimensions is 1000 x 16 x 1 x 1. + +Parameter blob dimensions vary according to the type and configuration of the layer. For a convolution layer with 96 filters of 11 x 11 spatial dimension and 3 inputs the blob is 96 x 3 x 11 x 11. For an inner product / fully-connected layer with 1000 output channels and 1024 input channels the parameter blob is 1 x 1 x 1000 x 4096. + +For custom data it may be necessary to hack your own input preparation tool or data layer. However once your data is in your job is done. The modularity of layers accomplishes the rest of the work for you. + +### Implementation Details + +As we are often interested in the values as well as the gradients of the blob, a Blob stores two chunks of memories, *data* and *diff*. The former is the normal data that we pass along, and the latter is the gradient computed by the network. + +Further, as the actual values could be stored either on the CPU and on the GPU, there are two different ways to access them: the const way, which does not change the values, and the mutable way, which changes the values: + + const Dtype* cpu_data() const; + Dtype* mutable_cpu_data(); + +(similarly for gpu and diff). + +The reason for such design is that, a Blob uses a SyncedMem class to synchronize values between the CPU and GPU in order to hide the synchronization details and to minimize data transfer. A rule of thumb is, always use the const call if you do not want to change the values, and never store the pointers in your own object. Every time you work on a blob, call the functions to get the pointers, as the SyncedMem will need this to figure out when to copy data. + +In practice when GPUs are present, one loads data from the disk to a blob in CPU code, calls a device kernel to do GPU computation, and ferries the blob off to the next layer, ignoring low-level details while maintaining a high level of performance. As long as all layers have GPU implementations, all the intermediate data and gradients will remain in the GPU. + +If you want to check out when a Blob will copy data, here is an illustrative example: + + // Assuming that data are on the CPU initially, and we have a blob. + const Dtype* foo; + Dtype* bar; + foo = blob.gpu_data(); // data copied cpu->gpu. + foo = blob.cpu_data(); // no data copied since both have up-to-date contents. + bar = blob.mutable_gpu_data(); // no data copied. + // ... some operations ... + bar = blob.mutable_gpu_data(); // no data copied when we are still on GPU. + foo = blob.cpu_data(); // data copied gpu->cpu, since the gpu side has modified the data + foo = blob.gpu_data(); // no data copied since both have up-to-date contents + bar = blob.mutable_cpu_data(); // still no data copied. + bar = blob.mutable_gpu_data(); // data copied cpu->gpu. + bar = blob.mutable_cpu_data(); // data copied gpu->cpu. ## Layer computation and connections -The layer is the essence of a model and the fundamental unit of computation. Layers convolve filters, pool, take inner products, apply nonlinearities like rectified-linear and sigmoid and other elementwise transformations, normalize, load data, and compute losses like softmax and hinge. [See the layer catalogue](layers.html) for all operations. All the types needed for state-of-the-art deep learning tasks are there. +The layer is the essence of a model and the fundamental unit of computation. Layers convolve filters, pool, take inner products, apply nonlinearities like rectified-linear and sigmoid and other elementwise transformations, normalize, load data, and compute losses like softmax and hinge. [See the layer catalogue](layers.html) for all operations. Most of the types needed for state-of-the-art deep learning tasks are there. <img src="fig/layer.jpg" alt="A layer with bottom and top blob." width="256"> @@ -23,6 +75,8 @@ Each layer type defines three critical computations: *setup*, *forward*, and *ba - Forward: given input from bottom compute the output and send to the top. - Backward: given the gradient w.r.t. the top output compute the gradient w.r.t. to the input and send to the bottom. A layer with parameters computes the gradient w.r.t. to its parameters and stores it internally. +More specifically, there will be two Forward and Backward functions implemented, one for CPU and one for GPU. If you do not implement a GPU version, the layer will fall back to the CPU functions as a backup option. This may come handy if you would like to do quick experiments, although it may come with additional data transfer cost (its inputs will be copied from GPU to CPU, and its outputs will be copied back from CPU to GPU). + Layers have two key responsibilities for the operation of the network as a whole: a *forward pass* that takes the inputs and produces the outputs, and a *backward pass* that takes the gradient with respect to the output, and computes the gradients with respect to the parameters and to the inputs, which are in turn back-propagated to earlier layers. These passes are simply the composition of each layer's forward and backward. Developing custom layers requires minimal effort by the compositionality of the network and modularity of the code. Define the setup, forward, and backward for the layer and it is ready for inclusion in a net. @@ -107,31 +161,12 @@ The Net explains its initialization as it goes: Model initialization is handled by `Net::Init()`. -The network is run on CPU or GPU by setting a single switch. Layers come with corresponding CPU and GPU routines that produce identical results (with tests to prove it). The CPU / GPU switch is seamless and independent of the model definition. For research and deployment alike it is best to divide model and implementation. - -## Blob storage and communication - -Caffe stores and communicates data in 4-dimensional arrays called blobs. Blobs provide a unified memory interface, holding data e.g. batches of images, model parameters, and derivatives for optimization. - -Blobs conceal the computational and mental overhead of mixed CPU/GPU operation by synchronizing from the CPU host to the GPU device as needed. In practice, one loads data from the disk to a blob in CPU code, calls a device kernel to do GPU computation, and ferries the blob off to the next layer, ignoring low-level details while maintaining a high level of performance. - -Memory on the host and device is allocated on demand (lazily) for efficient memory usage. - -The conventional blob dimensions for data are number N x channel K x height H x width W. Blob memory is row-major in layout so the last / rightmost dimension changes fastest. - -- Number / N is the batch size of the data. Batch processing achieves better throughput for communication and device processing. For an ImageNet training batch of 256 images B = 256. -- Channel / K is the feature dimension e.g. for RGB images K = 3. - -Caffe operations are general with respect to the channel dimension / K. Grayscale and hyperspectral imagery are fine. Caffe can likewise model and process arbitrary vectors in blobs with singleton. That is, the shape of blob holding 1000 vectors of 16 feature dimensions is 1000 x 16 x 1 x 1. - -Parameter blob dimensions vary according to the type and configuration of the layer. For a convolution layer with 96 filters of 11 x 11 spatial dimension and 3 inputs the blob is 96 x 3 x 11 x 11. For an inner product / fully-connected layer with 1000 output channels and 1024 input channels the parameter blob is 1 x 1 x 1000 x 4096. - -For custom data it may be necessary to hack your own input preparation tool or data layer. However once your data is in your job is done. The modularity of layers accomplishes the rest of the work for you. +The network is run on CPU or GPU by setting a single switch. Layers come with corresponding CPU and GPU routines that produce identical results (up to numerical errors, and with tests to guard it). The CPU / GPU switch is seamless and independent of the model definition. For research and deployment alike it is best to divide model and implementation. ### Model format The models are defined in plaintext protocol buffer schema (prototxt) while the learned models are serialized as binary protocol buffer (binaryproto) .caffemodel files. -The model format is defined by the protobuf schema in [caffe.proto](https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto). +The model format is defined by the protobuf schema in [caffe.proto](https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto). The source file is mostly self-explanatory so one is encouraged to check it out. Caffe speaks [Google Protocol Buffer](https://code.google.com/p/protobuf/) for the following strengths: minimal-size binary strings when serialized, efficient serialization, a human-readable text format compatible with the binary version, and efficient interface implementations in multiple languages, most notably C++ and Python. This all contributes to the flexibility and extensibility of modeling in Caffe. From 1f641483eb1778f75b1fe1758ade247dd316a076 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Fri, 5 Sep 2014 13:05:35 -0700 Subject: [PATCH 0688/2053] fix leaky relu --- docs/tutorial/layers.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index e3c84a37e33..d22e33428cd 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -27,7 +27,7 @@ In contrast, other layers (with few exceptions) ignore the spatial structure of * CPU implementation: `./src/caffe/layers/convolution_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/convolution_layer.cu` * Options (`ConvolutionParameter convolution_param`) - - Required | `num_output` ($c_o$), the number of filters + - Required: `num_output` ($c_o$), the number of filters - Required: `kernel_size` or (`kernel_h`, `kernel_w`), specifies height & width of each filter - Strongly recommended (default `type: 'constant' value: 0`): `weight_filler` - Optional (default `true`): `bias_term`, specifies whether to learn and apply a set of additive biases to the filter outputs @@ -108,11 +108,13 @@ Loss drives learning by comparing an output to a target and assigning cost to mi ### Activation / Neuron Layers -#### ReLU / Rectified-Linear +#### ReLU / Rectified-Linear and Leaky-ReLU * LayerType: `RELU` * CPU implementation: `./src/caffe/layers/relu_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/relu_layer.cu` +* Options (`ReLUParameter relu_param`) + - Optional (default 0): `negative_slope`, specifies whether to leak the negative part by multiplying it with the slope value rather than setting it to 0. * Input - $n \times c \times h \times w$ * Output @@ -126,7 +128,7 @@ Loss drives learning by comparing an output to a target and assigning cost to mi top: "conv1" } -The `RELU` layer computes the element-wise max of 0 and the input. It also supports in-place computation, meaning that the bottom and the top blob could be the same to preserve memory consumption. +Given an input value x, The `RELU` layer computes the output as x if x > 0 and negative_slope * x if x <= 0. When the negative slope parameter is not set, it is equivalent to the standard ReLU function of taking max(x, 0). It also supports in-place computation, meaning that the bottom and the top blob could be the same to preserve memory consumption. #### Sigmoid From cb4ae5e875c2eb31c9b3dd1b68daa535ba910b97 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Fri, 5 Sep 2014 13:47:11 -0700 Subject: [PATCH 0689/2053] update net --- docs/tutorial/net_layer_blob.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/tutorial/net_layer_blob.md b/docs/tutorial/net_layer_blob.md index 0c86c49745c..b500aaa64d5 100644 --- a/docs/tutorial/net_layer_blob.md +++ b/docs/tutorial/net_layer_blob.md @@ -122,7 +122,7 @@ is defined by top: "loss" } -The Net explains its initialization as it goes: +Model initialization is handled by `Net::Init()`. The initialization mainly does two things: scaffolding the overall DAG by creating the blobs and layers (for C++ geeks: the network will retain ownership of the blobs and layers during its lifetime), and calls the layers' `SetUp()` function. It also does a set of other bookkeeping things, such as validating the correctness of the overall network architecture. Also, during initialization the Net explains its initialization by logging to INFO as it goes: I0902 22:52:17.931977 2079114000 net.cpp:39] Initializing net from parameters: name: "LogReg" @@ -159,9 +159,7 @@ The Net explains its initialization as it goes: I0902 22:52:17.941818 2079114000 net.cpp:219] Network initialization done. I0902 22:52:17.941824 2079114000 net.cpp:220] Memory required for data: 201476 -Model initialization is handled by `Net::Init()`. - -The network is run on CPU or GPU by setting a single switch. Layers come with corresponding CPU and GPU routines that produce identical results (up to numerical errors, and with tests to guard it). The CPU / GPU switch is seamless and independent of the model definition. For research and deployment alike it is best to divide model and implementation. +Note that the construction of the network is device agnostic - recall our earlier explanation that blobs and layers hide implementation details from the model definition. After construction, the network is run on either CPU or GPU by setting a single switch defined in `Caffe::mode()` and set by `Caffe::set_mode()`. Layers come with corresponding CPU and GPU routines that produce identical results (up to numerical errors, and with tests to guard it). The CPU / GPU switch is seamless and independent of the model definition. For research and deployment alike it is best to divide model and implementation. ### Model format From f12a74af9569042082cc117311b299a0b0867738 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Fri, 5 Sep 2014 16:44:06 -0700 Subject: [PATCH 0690/2053] neuron layers doc --- docs/tutorial/layers.md | 120 +++++++++++++++++++++++++++++++++------- 1 file changed, 101 insertions(+), 19 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index d22e33428cd..72db52c81ce 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -72,7 +72,48 @@ The `CONVOLUTION` layer convolves the input image with a set of learnable filter #### Local Response Normalization -`LRN` +* LayerType: `LRN` +* CPU implementation: `./src/caffe/layers/lrn_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/lrn_layer.cu` +* Options (`ConvolutionParameter convolution_param`) + - Required: `num_output` ($c_o$), the number of filters + - Required: `kernel_size` or (`kernel_h`, `kernel_w`), specifies height & width of each filter + - Strongly recommended (default `type: 'constant' value: 0`): `weight_filler` + - Optional (default `true`): `bias_term`, specifies whether to learn and apply a set of additive biases to the filter outputs + - Optional (default 0): `pad` or (`pad_h`, `pad_w`), specifies the number of pixels to (implicitly) add to each side of the input + - Optional (default 1): `stride` or (`stride_h`, `stride_w`), specifies the intervals at which to apply the filters to the input + - Optional (default 1): `group` ($g$) if $>1$, restricts the connectivity of each filter to a subset of the input. In particular, the input to the $i^{th}$ group of $n_f / g$ filters is the $i^{th}$ group of $c_i / g$ input channels. +* Input + - $n \times c_i \times h_i \times w_i$ (repeated $K \ge 1$ times) +* Output + - $n \times c_o \times h_o \times w_o$ (repeated $K$ times) +* Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) + + layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + blobs_lr: 1 # learning rate multiplier for the filters + blobs_lr: 2 # learning rate multiplier for the biases + weight_decay: 1 # weight decay multiplier for the filters + weight_decay: 0 # weight decay multiplier for the biases + convolution_param { + num_output: 96 # learn 96 filters + kernel_size: 11 # each filter is 11x11 + stride: 4 # step 4 pixels between each filter application + weight_filler { + type: "gaussian" # initialize the filters from a Gaussian + std: 0.01 # distribution with stdev 0.01 (default mean: 0) + } + bias_filler { + type: "constant" # initialize the biases to zero (0) + value: 0 + } + } + } + +The `CONVOLUTION` layer convolves the input image with a set of learnable filters, each producing one feature map in the output image. #### im2col @@ -108,6 +149,13 @@ Loss drives learning by comparing an output to a target and assigning cost to mi ### Activation / Neuron Layers +In general, activation / Neuron layers are element-wise operators, taking one bottom blob and producing one top blob of the same size. In the layers below, we will ignore the input and out sizes as they are identical: + +* Input + - $n \times c \times h \times w$ +* Output + - $n \times c \times h \times w$ + #### ReLU / Rectified-Linear and Leaky-ReLU * LayerType: `RELU` @@ -115,10 +163,6 @@ Loss drives learning by comparing an output to a target and assigning cost to mi * CUDA GPU implementation: `./src/caffe/layers/relu_layer.cu` * Options (`ReLUParameter relu_param`) - Optional (default 0): `negative_slope`, specifies whether to leak the negative part by multiplying it with the slope value rather than setting it to 0. -* Input - - $n \times c \times h \times w$ -* Output - - $n \times c \times h \times w$ * Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) layers { @@ -135,10 +179,6 @@ Given an input value x, The `RELU` layer computes the output as x if x > 0 and n * LayerType: `SIGMOID` * CPU implementation: `./src/caffe/layers/sigmoid_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/sigmoid_layer.cu` -* Input - - $n \times c \times h \times w$ -* Output - - $n \times c \times h \times w$ * Sample (as seen in `./examples/imagenet/mnist_autoencoder.prototxt`) layers { @@ -155,16 +195,12 @@ The `SIGMOID` layer computes the output as sigmoid(x) for each input element x. * LayerType: `TANH` * CPU implementation: `./src/caffe/layers/tanh_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/tanh_layer.cu` -* Input - - $n \times c \times h \times w$ -* Output - - $n \times c \times h \times w$ * Sample layers { - name: "encode1neuron" - bottom: "encode1" - top: "encode1neuron" + name: "layer" + bottom: "in" + top: "out" type: TANH } @@ -172,15 +208,61 @@ The `TANH` layer computes the output as tanh(x) for each input element x. #### Absolute Value -`ABSVAL` +* LayerType: `ABSVAL` +* CPU implementation: `./src/caffe/layers/absval_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/absval_layer.cu` +* Sample + + layers { + name: "layer" + bottom: "in" + top: "out" + type: ABSVAL + } + +The `ABSVAL` layer computes the output as abs(x) for each input element x. #### Power -`POWER` +* LayerType: `POWER` +* CPU implementation: `./src/caffe/layers/power_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/power_layer.cu` +* Options (`PowerParameter power_param`) + - Optional (default 1): `power` + - Optional (default 1): `scale` + - Optional (default 0): `shift` +* Sample + + layers { + name: "layer" + bottom: "in" + top: "out" + type: POWER + power_param { + power: 1 + scale: 1 + shift: 0 + } + } + +The `POWER` layer computes the output as (shift + scale * x) ^ power for each input element x. #### BNLL -`BNLL` +* LayerType: `BNLL` +* CPU implementation: `./src/caffe/layers/bnll_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/bnll_layer.cu` +* Sample + + layers { + name: "layer" + bottom: "in" + top: "out" + type: BNLL + } + +The `BNLL` (binomial normal log likelihood) layer computes the output as log(1 + exp(x)) for each input element x. + ### Data Layers From f15fc364400d7d21d0a21030d4547ae00f7034bb Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Fri, 5 Sep 2014 17:03:29 -0700 Subject: [PATCH 0691/2053] conv and pooling --- docs/tutorial/layers.md | 77 ++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 47 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 72db52c81ce..d1eb83f2fd7 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -18,7 +18,7 @@ A typical "image" in the real-world may have one color channel ($c = 1$), as in But in this context, the distinguishing characteristic of an image is its spatial structure: usually an image has some non-trivial height $h > 1$ and width $w > 1$. This 2D geometry naturally lends itself to certain decisions about how to process the input. In particular, most of the vision layers work by applying a particular operation to some region of the input to produce a corresponding region of the output. -In contrast, other layers (with few exceptions) ignore the spatial structure of the input, treating it as "one big vector" with dimension $$ c h w $$. +In contrast, other layers (with few exceptions) ignore the spatial structure of the input, effectively treating it as "one big vector" with dimension $$ c h w $$. #### Convolution @@ -27,17 +27,17 @@ In contrast, other layers (with few exceptions) ignore the spatial structure of * CPU implementation: `./src/caffe/layers/convolution_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/convolution_layer.cu` * Options (`ConvolutionParameter convolution_param`) - - Required: `num_output` ($c_o$), the number of filters + - Required: `num_output` (`c_o`), the number of filters - Required: `kernel_size` or (`kernel_h`, `kernel_w`), specifies height & width of each filter - Strongly recommended (default `type: 'constant' value: 0`): `weight_filler` - Optional (default `true`): `bias_term`, specifies whether to learn and apply a set of additive biases to the filter outputs - Optional (default 0): `pad` or (`pad_h`, `pad_w`), specifies the number of pixels to (implicitly) add to each side of the input - Optional (default 1): `stride` or (`stride_h`, `stride_w`), specifies the intervals at which to apply the filters to the input - - Optional (default 1): `group` ($g$) if $>1$, restricts the connectivity of each filter to a subset of the input. In particular, the input to the $i^{th}$ group of $n_f / g$ filters is the $i^{th}$ group of $c_i / g$ input channels. + - Optional (default 1): `group` (g). If g > 1, we restrict the connectivity of each filter to a subset of the input. Specifically, the input and output channels are separated to g groups separately, and the i-th output group channels will be only connected to the i-th input group channels. * Input - - $n \times c_i \times h_i \times w_i$ (repeated $K \ge 1$ times) + - `n * c_i * h_i * w_i` * Output - - $n \times c_o \times h_o \times w_o$ (repeated $K$ times) + - `n * c_o * h_o * w_o`, where `h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1` and `w_o` likewise. * Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) layers { @@ -66,58 +66,41 @@ In contrast, other layers (with few exceptions) ignore the spatial structure of The `CONVOLUTION` layer convolves the input image with a set of learnable filters, each producing one feature map in the output image. -#### Pooling** +#### Pooling -`POOLING` - -#### Local Response Normalization - -* LayerType: `LRN` -* CPU implementation: `./src/caffe/layers/lrn_layer.cpp` -* CUDA GPU implementation: `./src/caffe/layers/lrn_layer.cu` -* Options (`ConvolutionParameter convolution_param`) - - Required: `num_output` ($c_o$), the number of filters +* LayerType: `POOLING` +* CPU implementation: `./src/caffe/layers/pooling_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/pooling_layer.cu` +* Options (`PoolingParameter pooling_param`) + - Optional (default MAX): `pool`, the pooling method. Currently MAX, AVE, or STOCHASTIC - Required: `kernel_size` or (`kernel_h`, `kernel_w`), specifies height & width of each filter - - Strongly recommended (default `type: 'constant' value: 0`): `weight_filler` - - Optional (default `true`): `bias_term`, specifies whether to learn and apply a set of additive biases to the filter outputs - Optional (default 0): `pad` or (`pad_h`, `pad_w`), specifies the number of pixels to (implicitly) add to each side of the input - Optional (default 1): `stride` or (`stride_h`, `stride_w`), specifies the intervals at which to apply the filters to the input - - Optional (default 1): `group` ($g$) if $>1$, restricts the connectivity of each filter to a subset of the input. In particular, the input to the $i^{th}$ group of $n_f / g$ filters is the $i^{th}$ group of $c_i / g$ input channels. * Input - - $n \times c_i \times h_i \times w_i$ (repeated $K \ge 1$ times) + - `n * c * h_i * w_i` * Output - - $n \times c_o \times h_o \times w_o$ (repeated $K$ times) + - `n * c * h_o * w_o`, where h_o and w_o are computed in the same way as convolution. * Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) - layers { - name: "conv1" - type: CONVOLUTION - bottom: "data" - top: "conv1" - blobs_lr: 1 # learning rate multiplier for the filters - blobs_lr: 2 # learning rate multiplier for the biases - weight_decay: 1 # weight decay multiplier for the filters - weight_decay: 0 # weight decay multiplier for the biases - convolution_param { - num_output: 96 # learn 96 filters - kernel_size: 11 # each filter is 11x11 - stride: 4 # step 4 pixels between each filter application - weight_filler { - type: "gaussian" # initialize the filters from a Gaussian - std: 0.01 # distribution with stdev 0.01 (default mean: 0) - } - bias_filler { - type: "constant" # initialize the biases to zero (0) - value: 0 - } - } - } + layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } + } -The `CONVOLUTION` layer convolves the input image with a set of learnable filters, each producing one feature map in the output image. +#### Local Response Normalization (LRN) + +`LRN` #### im2col -`IM2COL` is a helper for doing the image-to-column transformation that you most likely do not need to know about. +`IM2COL` is a helper for doing the image-to-column transformation that you most likely do not need to know about. This is used in Caffe's original convolution to do matrix multiplication by laying out all patches into a matrix. ### Loss Layers @@ -152,9 +135,9 @@ Loss drives learning by comparing an output to a target and assigning cost to mi In general, activation / Neuron layers are element-wise operators, taking one bottom blob and producing one top blob of the same size. In the layers below, we will ignore the input and out sizes as they are identical: * Input - - $n \times c \times h \times w$ + - n * c * h * w * Output - - $n \times c \times h \times w$ + - n * c * h * w #### ReLU / Rectified-Linear and Leaky-ReLU From 5eb8dd3558474536f115d4e951e08683cf6be4d9 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sat, 6 Sep 2014 09:35:13 -0700 Subject: [PATCH 0692/2053] more layers --- docs/tutorial/layers.md | 69 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index d1eb83f2fd7..56fc338f972 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -281,23 +281,82 @@ The `BNLL` (binomial normal log likelihood) layer computes the output as log(1 + #### Inner Product -`INNER_PRODUCT` +* LayerType: `INNER_PRODUCT` +* CPU implementation: `./src/caffe/layers/inner_product_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/inner_product_layer.cu` +* Options (`InnerProductParameter inner_product_param`) + - Required: `num_output` (`c_o`), the number of filters + - Strongly recommended (default `type: 'constant' value: 0`): `weight_filler` + - Optional (default `type: 'constant' value: 0`): `bias_filler` + - Optional (default `true`): `bias_term`, specifies whether to learn and apply a set of additive biases to the filter outputs +* Input + - `n * c_i * h_i * w_i` +* Output + - `n * c_o * 1 * 1` +* Sample + + layers { + name: "fc8" + type: INNER_PRODUCT + blobs_lr: 1 # learning rate multiplier for the filters + blobs_lr: 2 # learning rate multiplier for the biases + weight_decay: 1 # weight decay multiplier for the filters + weight_decay: 0 # weight decay multiplier for the biases + inner_product_param { + num_output: 1000 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } + bottom: "fc7" + top: "fc8" + } + +The `INNER_PRODUCT` layer (also usually referred to as the fully connected layer) treats the input as a simple vector and produces an output in the form of a single vector (with the blob's height and width set to 1). #### Splitting -`SPLIT` +The `SPLIT` layer is a utility layer that splits an input blob to multiple output blobs. This is used when a blob is fed into multiple output layers. #### Flattening -`FLATTEN` +The `FLATTEN` layer is a utility layer that flattens an input of shape `n * c * h * w` to a simple vector output of shape `n * (c*h*w) * 1 * 1`. #### Concatenation -`CONCAT` +* LayerType: `CONCAT` +* CPU implementation: `./src/caffe/layers/concat_layer.cpp` +* CUDA GPU implementation: `./src/caffe/layers/concat_layer.cu` +* Options (`ConcatParameter concat_param`) + - Optional (default 1): `concat_dim`, 0 for concatenation along num and 1 for channels. +* Input + - `n_i * c_i * h * w` for each input blob i from 1 to K. +* Output + - if `concat_dim = 0`: `(n_1 + n_2 + ... + n_K) * c_1 * h * w`, and all input `c_i` should be the same. + - if `concat_dim = 1`: `n_1 * (c_1 + c_2 + ... + c_K) * h * w`, and all input `n_i` should be the same. +* Sample + + layers { + name: "concat" + bottom: "in1" + bottom: "in2" + top: "out" + type: CONCAT + concat_param { + concat_dim: 1 + } + } + +The `CONCAT` layer is a utility layer that concatenates its multiple input blobs to one single output blob. Currently, the layer supports concatenation along num or channels only. #### Slicing -`SLICE` +The `SLICE` layer is a utility layer that slices an input layer to multiple output layers along a given dimension (currently num or channel only) with given slice indices. #### Elementwise Operations From 3578d91da9ea45e52c049c5bfaec83aedea3f06b Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Sat, 6 Sep 2014 16:30:32 -0700 Subject: [PATCH 0693/2053] Added initial Hinge Loss --- docs/tutorial/layers.md | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 56fc338f972..42ae5986fb6 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -116,7 +116,37 @@ Loss drives learning by comparing an output to a target and assigning cost to mi #### Hinge / Margin -`HINGE_LOSS` +* LayerType: `HINGE_LOSS` +* CPU implementation: `./src/caffe/layers/hinge_loss_layer.cpp` +* CUDA GPU implementation: `NOT_AVAILABLE` +* Options (`HingeLossParameter hinge_loss_param`) + - Optional (default L1): `norm`, the norm used. Currently L1, L2 +* Inputs + - `n * c * h * w` Predictions + - `n * 1 * 1 * 1` Labels +* Output + - `1 * 1 * 1 * 1` Computed Loss +* Samples + + # L1 Norm + layers { + name: "loss" + type: HINGE_LOSS + bottom: "pred" + bottom: "label" + } + + # L2 Norm + layers { + name: "loss" + type: HINGE_LOSS + bottom: "pred" + bottom: "label" + top: "loss" + hinge_loss_param { + norm: L2 + } + } #### Sigmoid Cross-Entropy From 64fa7caf1e74ff47456c559c008e3e39156b3ca3 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 15:43:36 -0700 Subject: [PATCH 0694/2053] shift CUDA code out of common --- include/caffe/common.hpp | 57 ------------------------- include/caffe/util/device_alternate.hpp | 57 +++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 683d1d68f1d..9c6eb4d6834 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -41,41 +41,6 @@ private:\ // is executed we will see a fatal log. #define NOT_IMPLEMENTED LOG(FATAL) << "Not Implemented Yet" -#ifndef CPU_ONLY - -// CUDA: various checks for different function calls. -#define CUDA_CHECK(condition) \ - /* Code block avoids redefinition of cudaError_t error */ \ - do { \ - cudaError_t error = condition; \ - CHECK_EQ(error, cudaSuccess) << " " << cudaGetErrorString(error); \ - } while (0) - -#define CUBLAS_CHECK(condition) \ - do { \ - cublasStatus_t status = condition; \ - CHECK_EQ(status, CUBLAS_STATUS_SUCCESS) << " " \ - << caffe::cublasGetErrorString(status); \ - } while (0) - -#define CURAND_CHECK(condition) \ - do { \ - curandStatus_t status = condition; \ - CHECK_EQ(status, CURAND_STATUS_SUCCESS) << " " \ - << caffe::curandGetErrorString(status); \ - } while (0) - -// CUDA: grid stride looping -#define CUDA_KERNEL_LOOP(i, n) \ - for (int i = blockIdx.x * blockDim.x + threadIdx.x; \ - i < (n); \ - i += blockDim.x * gridDim.x) - -// CUDA: check for error after kernel execution and exit loudly if there is one. -#define CUDA_POST_KERNEL_CHECK CUDA_CHECK(cudaPeekAtLastError()) - -#endif // CPU_ONLY - namespace caffe { // We will use the boost shared_ptr instead of the new C++11 one mainly @@ -181,28 +146,6 @@ class Caffe { DISABLE_COPY_AND_ASSIGN(Caffe); }; -#ifndef CPU_ONLY - -// NVIDIA_CUDA-5.5_Samples/common/inc/helper_cuda.h -const char* cublasGetErrorString(cublasStatus_t error); -const char* curandGetErrorString(curandStatus_t error); - -// CUDA: thread number configuration. -// Use 1024 threads per block, which requires cuda sm_2x or above, -// or fall back to attempt compatibility (best of luck to you). -#if __CUDA_ARCH__ >= 200 - const int CAFFE_CUDA_NUM_THREADS = 1024; -#else - const int CAFFE_CUDA_NUM_THREADS = 512; -#endif - -// CUDA: number of blocks for threads. -inline int CAFFE_GET_BLOCKS(const int N) { - return (N + CAFFE_CUDA_NUM_THREADS - 1) / CAFFE_CUDA_NUM_THREADS; -} - -#endif // CPU_ONLY - } // namespace caffe #endif // CAFFE_COMMON_HPP_ diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index aa359e007cb..bb3ac61648b 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -37,6 +37,63 @@ void classname<Dtype>::funcname##_##gpu(const vector<Blob<Dtype>*>& top, \ #include <curand.h> #include <driver_types.h> // cuda driver types +// +// CUDA macros +// + +// CUDA: various checks for different function calls. +#define CUDA_CHECK(condition) \ + /* Code block avoids redefinition of cudaError_t error */ \ + do { \ + cudaError_t error = condition; \ + CHECK_EQ(error, cudaSuccess) << " " << cudaGetErrorString(error); \ + } while (0) + +#define CUBLAS_CHECK(condition) \ + do { \ + cublasStatus_t status = condition; \ + CHECK_EQ(status, CUBLAS_STATUS_SUCCESS) << " " \ + << caffe::cublasGetErrorString(status); \ + } while (0) + +#define CURAND_CHECK(condition) \ + do { \ + curandStatus_t status = condition; \ + CHECK_EQ(status, CURAND_STATUS_SUCCESS) << " " \ + << caffe::curandGetErrorString(status); \ + } while (0) + +// CUDA: grid stride looping +#define CUDA_KERNEL_LOOP(i, n) \ + for (int i = blockIdx.x * blockDim.x + threadIdx.x; \ + i < (n); \ + i += blockDim.x * gridDim.x) + +// CUDA: check for error after kernel execution and exit loudly if there is one. +#define CUDA_POST_KERNEL_CHECK CUDA_CHECK(cudaPeekAtLastError()) + +namespace caffe { + +// CUDA: library error reporting. +const char* cublasGetErrorString(cublasStatus_t error); +const char* curandGetErrorString(curandStatus_t error); + +// CUDA: thread number configuration. +// Use 1024 threads per block, which requires cuda sm_2x or above, +// or fall back to attempt compatibility (best of luck to you). +#if __CUDA_ARCH__ >= 200 + const int CAFFE_CUDA_NUM_THREADS = 1024; +#else + const int CAFFE_CUDA_NUM_THREADS = 512; +#endif + +// CUDA: number of blocks for threads. +inline int CAFFE_GET_BLOCKS(const int N) { + return (N + CAFFE_CUDA_NUM_THREADS - 1) / CAFFE_CUDA_NUM_THREADS; +} + +} // namespace caffe + #endif // CPU_ONLY #endif // CAFFE_UTIL_DEVICE_ALTERNATE_H_ From cd52392d31e5f235d04cfccb722483c260c3cf1e Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 16:54:01 -0700 Subject: [PATCH 0695/2053] groom proto: sort layer type parameters, put loss_weight after basics --- src/caffe/proto/caffe.proto | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 77f74a33cbf..38db12b6400 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -202,10 +202,6 @@ message NetStateRule { message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs - // The amount of weight to assign each top blob in the objective. - // Each layer assigns a default value, usually of either 0 or 1, - // to each top blob. - repeated float loss_weight = 35; optional string name = 4; // the layer name // Rules controlling whether and when a layer is included in the network, @@ -288,6 +284,11 @@ message LayerParameter { // The weight decay that is multiplied on the global weight decay. repeated float weight_decay = 8; + // The amount of weight to assign each top blob in the objective. + // Each layer assigns a default value, usually of either 0 or 1, + // to each top blob. + repeated float loss_weight = 35; + optional AccuracyParameter accuracy_param = 27; optional ArgMaxParameter argmax_param = 23; optional ConcatParameter concat_param = 9; @@ -298,19 +299,19 @@ message LayerParameter { optional EltwiseParameter eltwise_param = 24; optional HDF5DataParameter hdf5_data_param = 13; optional HDF5OutputParameter hdf5_output_param = 14; + optional HingeLossParameter hinge_loss_param = 29; optional ImageDataParameter image_data_param = 15; optional InfogainLossParameter infogain_loss_param = 16; optional InnerProductParameter inner_product_param = 17; optional LRNParameter lrn_param = 18; optional MemoryDataParameter memory_data_param = 22; + optional MVNParameter mvn_param = 34; optional PoolingParameter pooling_param = 19; optional PowerParameter power_param = 21; optional ReLUParameter relu_param = 30; - optional WindowDataParameter window_data_param = 20; - optional ThresholdParameter threshold_param = 25; - optional HingeLossParameter hinge_loss_param = 29; optional SliceParameter slice_param = 31; - optional MVNParameter mvn_param = 34; + optional ThresholdParameter threshold_param = 25; + optional WindowDataParameter window_data_param = 20; // Parameters for data pre-processing. optional TransformationParameter transform_param = 36; From a3dcca2a2cc7bd891d13c2303372286e55596fd4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 17:15:33 -0700 Subject: [PATCH 0696/2053] add engine parameter for multiple computational strategies add `engine` switch to layers for selecting a computational backend when there is a choice. Currently the standard Caffe implementation is the only backend. --- Makefile | 5 +++ Makefile.config.example | 3 ++ src/caffe/layers/conv_layer.cpp | 7 ++++ src/caffe/layers/pooling_layer.cpp | 6 ++++ src/caffe/layers/relu_layer.cpp | 9 ++++- src/caffe/layers/sigmoid_layer.cpp | 7 ++++ src/caffe/layers/softmax_layer.cpp | 7 ++++ src/caffe/layers/tanh_layer.cpp | 7 ++++ src/caffe/proto/caffe.proto | 54 ++++++++++++++++++++++++++++-- 9 files changed, 102 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 546de931f7e..89f7347b9f4 100644 --- a/Makefile +++ b/Makefile @@ -257,6 +257,11 @@ else COMMON_FLAGS += -DNDEBUG -O2 endif +# Computation engine configuration +ifeq ($(ENGINE), caffe) + COMMON_FLAGS += -DCAFFE_ENGINE +endif + # CPU-only configuration ifeq ($(CPU_ONLY), 1) OBJS := $(PROTO_OBJS) $(CXX_OBJS) diff --git a/Makefile.config.example b/Makefile.config.example index 7c96d8a9356..12c44477c11 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -1,6 +1,9 @@ ## Refer to http://caffe.berkeleyvision.org/installation.html # Contributions simplifying and improving our build system are welcome! +# Computation engine switch: currently only the standard Caffe engine. +ENGINE := caffe + # CPU-only switch (uncomment to build without GPU support). # CPU_ONLY := 1 diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 1a1248f3dda..43ec6dee9fa 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -12,6 +12,7 @@ template <typename Dtype> void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { ConvolutionParameter conv_param = this->layer_param_.convolution_param(); + // Check configuration. CHECK(!conv_param.has_kernel_size() != !(conv_param.has_kernel_h() && conv_param.has_kernel_w())) << "Filter size is kernel_size OR kernel_h and kernel_w; not both"; @@ -112,6 +113,12 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, caffe_set(N_, Dtype(1), bias_multiplier_.mutable_cpu_data()); } this->param_propagate_down_.resize(this->blobs_.size(), true); + // Default computation engine. +#ifdef CAFFE_ENGINE + if (conv_param.engine() == ConvolutionParameter_Engine_DEFAULT) { + conv_param.set_engine(ConvolutionParameter_Engine_CAFFE); + } +#endif } diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 9e77fa28a45..fd13b1de4d9 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -96,6 +96,12 @@ void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, rand_idx_.Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); } + // Default computation engine. +#ifdef CAFFE_ENGINE + if (pool_param.engine() == PoolingParameter_Engine_DEFAULT) { + pool_param.set_engine(PoolingParameter_Engine_CAFFE); + } +#endif } // TODO(Yangqing): Is there a faster way to do pooling in the channel-first diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index b50352f8526..7b41f7a5236 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -9,14 +9,21 @@ namespace caffe { template <typename Dtype> void ReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + ReLUParameter relu_param = this->layer_param_.relu_param(); const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); const int count = bottom[0]->count(); - Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); + Dtype negative_slope = relu_param.negative_slope(); for (int i = 0; i < count; ++i) { top_data[i] = std::max(bottom_data[i], Dtype(0)) + negative_slope * std::min(bottom_data[i], Dtype(0)); } + // Default computation engine. +#ifdef CAFFE_ENGINE + if (relu_param.engine() == ReLUParameter_Engine_DEFAULT) { + relu_param.set_engine(ReLUParameter_Engine_CAFFE); + } +#endif } template <typename Dtype> diff --git a/src/caffe/layers/sigmoid_layer.cpp b/src/caffe/layers/sigmoid_layer.cpp index d7bba7fbfc3..e045b7ef860 100644 --- a/src/caffe/layers/sigmoid_layer.cpp +++ b/src/caffe/layers/sigmoid_layer.cpp @@ -15,12 +15,19 @@ inline Dtype sigmoid(Dtype x) { template <typename Dtype> void SigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + SigmoidParameter sigmoid_param = this->layer_param_.sigmoid_param(); const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { top_data[i] = sigmoid(bottom_data[i]); } + // Default computation engine. +#ifdef CAFFE_ENGINE + if (sigmoid_param.engine() == SigmoidParameter_Engine_DEFAULT) { + sigmoid_param.set_engine(SigmoidParameter_Engine_CAFFE); + } +#endif } template <typename Dtype> diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 29767ac775c..bfc41164eee 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -11,6 +11,7 @@ namespace caffe { template <typename Dtype> void SoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + SoftmaxParameter softmax_param = this->layer_param_.softmax_param(); (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); sum_multiplier_.Reshape(1, bottom[0]->channels(), 1, 1); @@ -19,6 +20,12 @@ void SoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, multiplier_data[i] = 1.; } scale_.Reshape(bottom[0]->num(), 1, bottom[0]->height(), bottom[0]->width()); + // Default computation engine. +#ifdef CAFFE_ENGINE + if (softmax_param.engine() == SoftmaxParameter_Engine_DEFAULT) { + softmax_param.set_engine(SoftmaxParameter_Engine_CAFFE); + } +#endif } template <typename Dtype> diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp index 8dae0054aed..1ea00736ef0 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -12,6 +12,7 @@ namespace caffe { template <typename Dtype> void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + TanHParameter tanh_param = this->layer_param_.tanh_param(); const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); Dtype exp2x; @@ -20,6 +21,12 @@ void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, exp2x = exp(2 * bottom_data[i]); top_data[i] = (exp2x - Dtype(1)) / (exp2x + Dtype(1)); } + // Default computation engine. +#ifdef CAFFE_ENGINE + if (tanh_param.engine() == TanHParameter_Engine_DEFAULT) { + tanh_param.set_engine(TanHParameter_Engine_CAFFE); + } +#endif } template <typename Dtype> diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 38db12b6400..082feb831b0 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -198,7 +198,7 @@ message NetStateRule { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 37 (last added: transform_param) +// LayerParameter next available ID: 40 (last added: softmax_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs @@ -309,13 +309,21 @@ message LayerParameter { optional PoolingParameter pooling_param = 19; optional PowerParameter power_param = 21; optional ReLUParameter relu_param = 30; + optional SigmoidParameter sigmoid_param = 38; + optional SoftmaxParameter softmax_param = 39; optional SliceParameter slice_param = 31; + optional TanHParameter tanh_param = 37; optional ThresholdParameter threshold_param = 25; optional WindowDataParameter window_data_param = 20; - + // Parameters for data pre-processing. optional TransformationParameter transform_param = 36; + // Note: certain layers may have more than one computational engine + // for their implementation. These layers include an Engine type and + // engine parameter for selecting the implementation. + // The default for the engine is set by the ENGINE switch at compile-time. + // DEPRECATED: The layer parameters specified as a V0LayerParameter. // This should never be used by any code except to upgrade to the new // LayerParameter specification. @@ -377,6 +385,11 @@ message ConvolutionParameter { optional uint32 stride_w = 14; // The stride width optional FillerParameter weight_filler = 7; // The filler for the weight optional FillerParameter bias_filler = 8; // The filler for the bias + enum Engine { + DEFAULT = 0; + CAFFE = 1; + } + optional Engine engine = 15 [default = DEFAULT]; } // Message that stores parameters used by DataLayer @@ -563,6 +576,11 @@ message PoolingParameter { optional uint32 stride = 3 [default = 1]; // The stride (equal in Y, X) optional uint32 stride_h = 7; // The stride height optional uint32 stride_w = 8; // The stride width + enum Engine { + DEFAULT = 0; + CAFFE = 1; + } + optional Engine engine = 11 [default = DEFAULT]; } // Message that stores parameters used by PowerLayer @@ -581,6 +599,20 @@ message ReLUParameter { // improve neural network acoustic models. In ICML Workshop on Deep Learning // for Audio, Speech, and Language Processing. optional float negative_slope = 1 [default = 0]; + enum Engine { + DEFAULT = 0; + CAFFE = 1; + } + optional Engine engine = 2 [default = DEFAULT]; +} + +// Message that stores parameters used by SigmoidLayer +message SigmoidParameter { + enum Engine { + DEFAULT = 0; + CAFFE = 1; + } + optional Engine engine = 1 [default = DEFAULT]; } // Message that stores parameters used by SliceLayer @@ -593,6 +625,24 @@ message SliceParameter { repeated uint32 slice_point = 2; } +// Message that stores parameters used by SoftmaxLayer, SoftMaxWithLossLayer +message SoftmaxParameter { + enum Engine { + DEFAULT = 0; + CAFFE = 1; + } + optional Engine engine = 1 [default = DEFAULT]; +} + +// Message that stores parameters used by SigmoidLayer +message TanHParameter { + enum Engine { + DEFAULT = 0; + CAFFE = 1; + } + optional Engine engine = 1 [default = DEFAULT]; +} + // Message that stores parameters used by WindowDataLayer message WindowDataParameter { // Specify the data source. From 237560cc34b5fec399e6cdd3ab380c75e9a64dd5 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 17:44:50 -0700 Subject: [PATCH 0697/2053] ifdef engine default --- src/caffe/layers/conv_layer.cpp | 7 ------- src/caffe/layers/pooling_layer.cpp | 6 ------ src/caffe/layers/relu_layer.cpp | 9 +-------- src/caffe/layers/sigmoid_layer.cpp | 7 ------- src/caffe/layers/softmax_layer.cpp | 7 ------- src/caffe/layers/tanh_layer.cpp | 7 ------- 6 files changed, 1 insertion(+), 42 deletions(-) diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 43ec6dee9fa..1a1248f3dda 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -12,7 +12,6 @@ template <typename Dtype> void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { ConvolutionParameter conv_param = this->layer_param_.convolution_param(); - // Check configuration. CHECK(!conv_param.has_kernel_size() != !(conv_param.has_kernel_h() && conv_param.has_kernel_w())) << "Filter size is kernel_size OR kernel_h and kernel_w; not both"; @@ -113,12 +112,6 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, caffe_set(N_, Dtype(1), bias_multiplier_.mutable_cpu_data()); } this->param_propagate_down_.resize(this->blobs_.size(), true); - // Default computation engine. -#ifdef CAFFE_ENGINE - if (conv_param.engine() == ConvolutionParameter_Engine_DEFAULT) { - conv_param.set_engine(ConvolutionParameter_Engine_CAFFE); - } -#endif } diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index fd13b1de4d9..9e77fa28a45 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -96,12 +96,6 @@ void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, rand_idx_.Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); } - // Default computation engine. -#ifdef CAFFE_ENGINE - if (pool_param.engine() == PoolingParameter_Engine_DEFAULT) { - pool_param.set_engine(PoolingParameter_Engine_CAFFE); - } -#endif } // TODO(Yangqing): Is there a faster way to do pooling in the channel-first diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index 7b41f7a5236..b50352f8526 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -9,21 +9,14 @@ namespace caffe { template <typename Dtype> void ReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - ReLUParameter relu_param = this->layer_param_.relu_param(); const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); const int count = bottom[0]->count(); - Dtype negative_slope = relu_param.negative_slope(); + Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); for (int i = 0; i < count; ++i) { top_data[i] = std::max(bottom_data[i], Dtype(0)) + negative_slope * std::min(bottom_data[i], Dtype(0)); } - // Default computation engine. -#ifdef CAFFE_ENGINE - if (relu_param.engine() == ReLUParameter_Engine_DEFAULT) { - relu_param.set_engine(ReLUParameter_Engine_CAFFE); - } -#endif } template <typename Dtype> diff --git a/src/caffe/layers/sigmoid_layer.cpp b/src/caffe/layers/sigmoid_layer.cpp index e045b7ef860..d7bba7fbfc3 100644 --- a/src/caffe/layers/sigmoid_layer.cpp +++ b/src/caffe/layers/sigmoid_layer.cpp @@ -15,19 +15,12 @@ inline Dtype sigmoid(Dtype x) { template <typename Dtype> void SigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - SigmoidParameter sigmoid_param = this->layer_param_.sigmoid_param(); const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { top_data[i] = sigmoid(bottom_data[i]); } - // Default computation engine. -#ifdef CAFFE_ENGINE - if (sigmoid_param.engine() == SigmoidParameter_Engine_DEFAULT) { - sigmoid_param.set_engine(SigmoidParameter_Engine_CAFFE); - } -#endif } template <typename Dtype> diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index bfc41164eee..29767ac775c 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -11,7 +11,6 @@ namespace caffe { template <typename Dtype> void SoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - SoftmaxParameter softmax_param = this->layer_param_.softmax_param(); (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); sum_multiplier_.Reshape(1, bottom[0]->channels(), 1, 1); @@ -20,12 +19,6 @@ void SoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, multiplier_data[i] = 1.; } scale_.Reshape(bottom[0]->num(), 1, bottom[0]->height(), bottom[0]->width()); - // Default computation engine. -#ifdef CAFFE_ENGINE - if (softmax_param.engine() == SoftmaxParameter_Engine_DEFAULT) { - softmax_param.set_engine(SoftmaxParameter_Engine_CAFFE); - } -#endif } template <typename Dtype> diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp index 1ea00736ef0..8dae0054aed 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -12,7 +12,6 @@ namespace caffe { template <typename Dtype> void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - TanHParameter tanh_param = this->layer_param_.tanh_param(); const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); Dtype exp2x; @@ -21,12 +20,6 @@ void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, exp2x = exp(2 * bottom_data[i]); top_data[i] = (exp2x - Dtype(1)) / (exp2x + Dtype(1)); } - // Default computation engine. -#ifdef CAFFE_ENGINE - if (tanh_param.engine() == TanHParameter_Engine_DEFAULT) { - tanh_param.set_engine(TanHParameter_Engine_CAFFE); - } -#endif } template <typename Dtype> From 98b4cd36ad3992f7ebc4fdf23ff10b653457687c Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 18:56:08 -0700 Subject: [PATCH 0698/2053] strategize Caffe convolution --- include/caffe/vision_layers.hpp | 41 ++++- src/caffe/layer_factory.cpp | 23 ++- src/caffe/layers/caffe_conv_layer.cpp | 144 ++++++++++++++++++ .../{conv_layer.cu => caffe_conv_layer.cu} | 49 +++--- src/caffe/layers/conv_layer.cpp | 140 ++--------------- src/caffe/test/test_convolution_layer.cpp | 18 +-- 6 files changed, 245 insertions(+), 170 deletions(-) create mode 100644 src/caffe/layers/caffe_conv_layer.cpp rename src/caffe/layers/{conv_layer.cu => caffe_conv_layer.cu} (68%) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 86a54ceddaf..5bdd4f75f34 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -39,13 +39,13 @@ class ConvolutionLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + vector<Blob<Dtype>*>* top) = 0; virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + vector<Blob<Dtype>*>* top) = 0; virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; int kernel_h_, kernel_w_; int stride_h_, stride_w_; @@ -56,12 +56,41 @@ class ConvolutionLayer : public Layer<Dtype> { int width_; int num_output_; int group_; - Blob<Dtype> col_buffer_; - Blob<Dtype> bias_multiplier_; bool bias_term_; + int height_out_; + int width_out_; +}; + +template <typename Dtype> +class CaffeConvolutionLayer : public ConvolutionLayer<Dtype> { + public: + explicit CaffeConvolutionLayer(const LayerParameter& param) + : ConvolutionLayer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_CONVOLUTION; + } + virtual inline int MinBottomBlobs() const { return 1; } + virtual inline int MinTopBlobs() const { return 1; } + virtual inline bool EqualNumBottomTopBlobs() const { return true; } + + protected: + virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + int M_; int K_; int N_; + Blob<Dtype> col_buffer_; + Blob<Dtype> bias_multiplier_; }; /** diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 4bb7cd7cd7f..ae9ff3621de 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -6,6 +6,27 @@ namespace caffe { +// GetLayer() defines the overall layer factory. The Get*Layer() functions +// define factories for layers with multiple computational engines. + +// Get convolution layer according to engine. +template <typename Dtype> +ConvolutionLayer<Dtype>* GetConvolutionLayer(const string& name, + const LayerParameter& param) { + ConvolutionParameter_Engine engine = param.convolution_param().engine(); + if (engine == ConvolutionParameter_Engine_CAFFE) { + return new CaffeConvolutionLayer<Dtype>(param); + } else { + LOG(FATAL) << "Layer " << name << " has unknown engine."; + } +} + +template ConvolutionLayer<float>* GetConvolutionLayer(const string& name, + const LayerParameter& param); +template ConvolutionLayer<double>* GetConvolutionLayer(const string& name, + const LayerParameter& param); + + // A function to get a specific layer from the specification given in // LayerParameter. Ideally this would be replaced by a factory pattern, // but we will leave it this way for now. @@ -25,7 +46,7 @@ Layer<Dtype>* GetLayer(const LayerParameter& param) { case LayerParameter_LayerType_CONCAT: return new ConcatLayer<Dtype>(param); case LayerParameter_LayerType_CONVOLUTION: - return new ConvolutionLayer<Dtype>(param); + return GetConvolutionLayer<Dtype>(name, param); case LayerParameter_LayerType_DATA: return new DataLayer<Dtype>(param); case LayerParameter_LayerType_DROPOUT: diff --git a/src/caffe/layers/caffe_conv_layer.cpp b/src/caffe/layers/caffe_conv_layer.cpp new file mode 100644 index 00000000000..759a06ee9f0 --- /dev/null +++ b/src/caffe/layers/caffe_conv_layer.cpp @@ -0,0 +1,144 @@ +#include <vector> + +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CaffeConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& + bottom, vector<Blob<Dtype>*>* top) { + ConvolutionLayer<Dtype>::LayerSetUp(bottom, top); + // Figure out the dimensions for individual gemms. + M_ = this->num_output_ / this->group_; + K_ = this->channels_ * this->kernel_h_ * this->kernel_w_ / this->group_; + N_ = this->height_out_ * this->width_out_; + // The im2col result buffer would only hold one image at a time to avoid + // overly large memory usage. + col_buffer_.Reshape(1, this->channels_ * this->kernel_h_ * this->kernel_w_, + this->height_out_, this->width_out_); + // Set up the all ones "bias multiplier" for adding bias using blas + if (this->bias_term_) { + bias_multiplier_.Reshape(1, 1, 1, N_); + caffe_set(N_, Dtype(1), bias_multiplier_.mutable_cpu_data()); + } +} + +template <typename Dtype> +void CaffeConvolutionLayer<Dtype>::Forward_cpu( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->cpu_data(); + Dtype* top_data = (*top)[i]->mutable_cpu_data(); + Dtype* col_data = col_buffer_.mutable_cpu_data(); + const Dtype* weight = this->blobs_[0]->cpu_data(); + int weight_offset = M_ * K_; + int col_offset = K_ * N_; + int top_offset = M_ * N_; + for (int n = 0; n < this->num_; ++n) { + // First, im2col + im2col_cpu(bottom_data + bottom[i]->offset(n), this->channels_, + this->height_, this->width_, this->kernel_h_, this->kernel_w_, + this->pad_h_, this->pad_w_, this->stride_h_, this->stride_w_, + col_data); + // Second, innerproduct with groups + for (int g = 0; g < this->group_; ++g) { + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, + (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, + (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); + } + // third, add bias + if (this->bias_term_) { + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, this->num_output_, + N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), + bias_multiplier_.cpu_data(), + (Dtype)1., top_data + (*top)[i]->offset(n)); + } + } + } +} + +template <typename Dtype> +void CaffeConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const Dtype* weight = NULL; + Dtype* weight_diff = NULL; + if (this->param_propagate_down_[0]) { + weight = this->blobs_[0]->cpu_data(); + weight_diff = this->blobs_[0]->mutable_cpu_diff(); + caffe_set(this->blobs_[0]->count(), Dtype(0), weight_diff); + } + Dtype* bias_diff = NULL; + if (this->bias_term_ && this->param_propagate_down_[1]) { + bias_diff = this->blobs_[1]->mutable_cpu_diff(); + caffe_set(this->blobs_[1]->count(), Dtype(0), bias_diff); + } + const int weight_offset = M_ * K_; + const int col_offset = K_ * N_; + const int top_offset = M_ * N_; + for (int i = 0; i < top.size(); ++i) { + const Dtype* top_diff = NULL; + // Bias gradient, if necessary. + if (this->bias_term_ && this->param_propagate_down_[1]) { + top_diff = top[i]->cpu_diff(); + for (int n = 0; n < this->num_; ++n) { + caffe_cpu_gemv<Dtype>(CblasNoTrans, this->num_output_, N_, + 1., top_diff + top[0]->offset(n), + bias_multiplier_.cpu_data(), 1., + bias_diff); + } + } + if (this->param_propagate_down_[0] || propagate_down[i]) { + if (!top_diff) { + top_diff = top[i]->cpu_diff(); + } + Dtype* col_data = col_buffer_.mutable_cpu_data(); + Dtype* col_diff = col_buffer_.mutable_cpu_diff(); + const Dtype* bottom_data = (*bottom)[i]->cpu_data(); + Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); + for (int n = 0; n < this->num_; ++n) { + // Since we saved memory in the forward pass by not storing all col + // data, we will need to recompute them. + im2col_cpu(bottom_data + (*bottom)[i]->offset(n), this->channels_, + this->height_, this->width_, this->kernel_h_, this->kernel_w_, + this->pad_h_, this->pad_w_, this->stride_h_, this->stride_w_, + col_data); + // gradient w.r.t. weight. Note that we will accumulate diffs. + if (this->param_propagate_down_[0]) { + for (int g = 0; g < this->group_; ++g) { + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, K_, N_, + (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, + col_data + col_offset * g, (Dtype)1., + weight_diff + weight_offset * g); + } + } + // gradient w.r.t. bottom data, if necessary + if (propagate_down[i]) { + for (int g = 0; g < this->group_; ++g) { + caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, + (Dtype)1., weight + weight_offset * g, + top_diff + top[i]->offset(n) + top_offset * g, + (Dtype)0., col_diff + col_offset * g); + } + // col2im back to the data + col2im_cpu(col_diff, this->channels_, this->height_, this->width_, + this->kernel_h_, this->kernel_w_, this->pad_h_, this->pad_w_, + this->stride_h_, this->stride_w_, bottom_diff + + (*bottom)[i]->offset(n)); + } + } + } + } +} + +#ifdef CPU_ONLY +STUB_GPU(CaffeConvolutionLayer); +#endif + +INSTANTIATE_CLASS(CaffeConvolutionLayer); + +} // namespace caffe + diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/caffe_conv_layer.cu similarity index 68% rename from src/caffe/layers/conv_layer.cu rename to src/caffe/layers/caffe_conv_layer.cu index f7f393badba..44a9f9737ab 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/caffe_conv_layer.cu @@ -9,8 +9,8 @@ namespace caffe { template <typename Dtype> -void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { +void CaffeConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& + bottom, vector<Blob<Dtype>*>* top) { for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); Dtype* top_data = (*top)[i]->mutable_gpu_data(); @@ -19,20 +19,21 @@ void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, int weight_offset = M_ * K_; int col_offset = K_ * N_; int top_offset = M_ * N_; - for (int n = 0; n < num_; ++n) { + for (int n = 0; n < this->num_; ++n) { // First, im2col - im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, + im2col_gpu(bottom_data + bottom[i]->offset(n), this->channels_, + this->height_, this->width_, this->kernel_h_, this->kernel_w_, + this->pad_h_, this->pad_w_, this->stride_h_, this->stride_w_, col_data); // Second, innerproduct with groups - for (int g = 0; g < group_; ++g) { + for (int g = 0; g < this->group_; ++g) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); } // third, add bias - if (bias_term_) { - caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, + if (this->bias_term_) { + caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, this->num_output_, N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), bias_multiplier_.gpu_data(), (Dtype)1., top_data + (*top)[i]->offset(n)); @@ -42,7 +43,7 @@ void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } template <typename Dtype> -void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void CaffeConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { const Dtype* weight = NULL; Dtype* weight_diff = NULL; @@ -52,7 +53,7 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, caffe_gpu_set(this->blobs_[0]->count(), Dtype(0), weight_diff); } Dtype* bias_diff = NULL; - if (bias_term_ && this->param_propagate_down_[1]) { + if (this->bias_term_ && this->param_propagate_down_[1]) { bias_diff = this->blobs_[1]->mutable_gpu_diff(); caffe_gpu_set(this->blobs_[1]->count(), Dtype(0), bias_diff); } @@ -62,10 +63,10 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, for (int i = 0; i < top.size(); ++i) { const Dtype* top_diff = NULL; // Bias gradient, if necessary. - if (bias_term_ && this->param_propagate_down_[1]) { + if (this->bias_term_ && this->param_propagate_down_[1]) { top_diff = top[i]->gpu_diff(); - for (int n = 0; n < num_; ++n) { - caffe_gpu_gemv<Dtype>(CblasNoTrans, num_output_, N_, + for (int n = 0; n < this->num_; ++n) { + caffe_gpu_gemv<Dtype>(CblasNoTrans, this->num_output_, N_, 1., top_diff + top[0]->offset(n), bias_multiplier_.gpu_data(), 1., bias_diff); @@ -79,15 +80,16 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, Dtype* col_diff = col_buffer_.mutable_gpu_diff(); const Dtype* bottom_data = (*bottom)[i]->gpu_data(); Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); - for (int n = 0; n < num_; ++n) { + for (int n = 0; n < this->num_; ++n) { // Since we saved memory in the forward pass by not storing all col // data, we will need to recompute them. - im2col_gpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, col_data); + im2col_gpu(bottom_data + (*bottom)[i]->offset(n), this->channels_, + this->height_, this->width_, this->kernel_h_, this->kernel_w_, + this->pad_h_, this->pad_w_, this->stride_h_, this->stride_w_, + col_data); // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { - for (int g = 0; g < group_; ++g) { + for (int g = 0; g < this->group_; ++g) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, K_, N_, (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, col_data + col_offset * g, (Dtype)1., @@ -96,16 +98,17 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } // gradient w.r.t. bottom data, if necessary if (propagate_down[i]) { - for (int g = 0; g < group_; ++g) { + for (int g = 0; g < this->group_; ++g) { caffe_gpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, (Dtype)1., weight + weight_offset * g, top_diff + top[i]->offset(n) + top_offset * g, (Dtype)0., col_diff + col_offset * g); } // col2im back to the data - col2im_gpu(col_diff, channels_, height_, width_, - kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - bottom_diff + (*bottom)[i]->offset(n)); + col2im_gpu(col_diff, this->channels_, this->height_, this->width_, + this->kernel_h_, this->kernel_w_, this->pad_h_, this->pad_w_, + this->stride_h_, this->stride_w_, bottom_diff + + (*bottom)[i]->offset(n)); } } } @@ -113,6 +116,6 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } -INSTANTIATE_CLASS(ConvolutionLayer); +INSTANTIATE_CLASS(CaffeConvolutionLayer); } // namespace caffe diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 1a1248f3dda..a2ab13301e6 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -46,7 +46,7 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, stride_h_ = conv_param.stride_h(); stride_w_ = conv_param.stride_w(); } - group_ = this->layer_param_.convolution_param().group(); + group_ = conv_param.group(); num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); @@ -61,26 +61,18 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK_EQ(width_, bottom[bottom_id]->width()) << "Inputs must have same width."; } - num_output_ = this->layer_param_.convolution_param().num_output(); + num_output_ = conv_param.num_output(); CHECK_GT(num_output_, 0); CHECK_EQ(channels_ % group_, 0); - // The im2col result buffer would only hold one image at a time to avoid - // overly large memory usage. - int height_out = - (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; - int width_out = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; - col_buffer_.Reshape( - 1, channels_ * kernel_h_ * kernel_w_, height_out, width_out); + // Calculate output dimensions. + height_out_ = (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; + width_out_ = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; // Set the parameters CHECK_EQ(num_output_ % group_, 0) << "Number of output should be multiples of group."; - bias_term_ = this->layer_param_.convolution_param().bias_term(); - // Figure out the dimensions for individual gemms. - M_ = num_output_ / group_; - K_ = channels_ * kernel_h_ * kernel_w_ / group_; - N_ = height_out * width_out; + bias_term_ = conv_param.bias_term(); for (int top_id = 0; top_id < top->size(); ++top_id) { - (*top)[top_id]->Reshape(num_, num_output_, height_out, width_out); + (*top)[top_id]->Reshape(num_, num_output_, height_out_, width_out_); } // Check if we need to set up the weights if (this->blobs_.size() > 0) { @@ -96,133 +88,19 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, num_output_, channels_ / group_, kernel_h_, kernel_w_)); // fill the weights shared_ptr<Filler<Dtype> > weight_filler(GetFiller<Dtype>( - this->layer_param_.convolution_param().weight_filler())); + conv_param.weight_filler())); weight_filler->Fill(this->blobs_[0].get()); // If necessary, initialize and fill the bias term if (bias_term_) { this->blobs_[1].reset(new Blob<Dtype>(1, 1, 1, num_output_)); shared_ptr<Filler<Dtype> > bias_filler(GetFiller<Dtype>( - this->layer_param_.convolution_param().bias_filler())); + conv_param.bias_filler())); bias_filler->Fill(this->blobs_[1].get()); } } - // Set up the all ones "bias multiplier" for adding bias using blas - if (bias_term_) { - bias_multiplier_.Reshape(1, 1, 1, N_); - caffe_set(N_, Dtype(1), bias_multiplier_.mutable_cpu_data()); - } this->param_propagate_down_.resize(this->blobs_.size(), true); } - -template <typename Dtype> -void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - for (int i = 0; i < bottom.size(); ++i) { - const Dtype* bottom_data = bottom[i]->cpu_data(); - Dtype* top_data = (*top)[i]->mutable_cpu_data(); - Dtype* col_data = col_buffer_.mutable_cpu_data(); - const Dtype* weight = this->blobs_[0]->cpu_data(); - int weight_offset = M_ * K_; - int col_offset = K_ * N_; - int top_offset = M_ * N_; - for (int n = 0; n < num_; ++n) { - // First, im2col - im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - col_data); - // Second, innerproduct with groups - for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, - (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, - (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); - } - // third, add bias - if (bias_term_) { - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, - N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), - bias_multiplier_.cpu_data(), - (Dtype)1., top_data + (*top)[i]->offset(n)); - } - } - } -} - -template <typename Dtype> -void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { - const Dtype* weight = NULL; - Dtype* weight_diff = NULL; - if (this->param_propagate_down_[0]) { - weight = this->blobs_[0]->cpu_data(); - weight_diff = this->blobs_[0]->mutable_cpu_diff(); - caffe_set(this->blobs_[0]->count(), Dtype(0), weight_diff); - } - Dtype* bias_diff = NULL; - if (bias_term_ && this->param_propagate_down_[1]) { - bias_diff = this->blobs_[1]->mutable_cpu_diff(); - caffe_set(this->blobs_[1]->count(), Dtype(0), bias_diff); - } - const int weight_offset = M_ * K_; - const int col_offset = K_ * N_; - const int top_offset = M_ * N_; - for (int i = 0; i < top.size(); ++i) { - const Dtype* top_diff = NULL; - // Bias gradient, if necessary. - if (bias_term_ && this->param_propagate_down_[1]) { - top_diff = top[i]->cpu_diff(); - for (int n = 0; n < num_; ++n) { - caffe_cpu_gemv<Dtype>(CblasNoTrans, num_output_, N_, - 1., top_diff + top[0]->offset(n), - bias_multiplier_.cpu_data(), 1., - bias_diff); - } - } - if (this->param_propagate_down_[0] || propagate_down[i]) { - if (!top_diff) { - top_diff = top[i]->cpu_diff(); - } - Dtype* col_data = col_buffer_.mutable_cpu_data(); - Dtype* col_diff = col_buffer_.mutable_cpu_diff(); - const Dtype* bottom_data = (*bottom)[i]->cpu_data(); - Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); - for (int n = 0; n < num_; ++n) { - // Since we saved memory in the forward pass by not storing all col - // data, we will need to recompute them. - im2col_cpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, col_data); - // gradient w.r.t. weight. Note that we will accumulate diffs. - if (this->param_propagate_down_[0]) { - for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, K_, N_, - (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, - col_data + col_offset * g, (Dtype)1., - weight_diff + weight_offset * g); - } - } - // gradient w.r.t. bottom data, if necessary - if (propagate_down[i]) { - for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, - (Dtype)1., weight + weight_offset * g, - top_diff + top[i]->offset(n) + top_offset * g, - (Dtype)0., col_diff + col_offset * g); - } - // col2im back to the data - col2im_cpu(col_diff, channels_, height_, width_, - kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, bottom_diff + (*bottom)[i]->offset(n)); - } - } - } - } -} - -#ifdef CPU_ONLY -STUB_GPU(ConvolutionLayer); -#endif - INSTANTIATE_CLASS(ConvolutionLayer); } // namespace caffe diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index 5a7ea80467e..3489ead8123 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -62,7 +62,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { this->blob_bottom_vec_.push_back(this->blob_bottom_2_); this->blob_top_vec_.push_back(this->blob_top_2_); shared_ptr<Layer<Dtype> > layer( - new ConvolutionLayer<Dtype>(layer_param)); + new CaffeConvolutionLayer<Dtype>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 4); @@ -75,7 +75,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { // setting group should not change the shape convolution_param->set_num_output(3); convolution_param->set_group(3); - layer.reset(new ConvolutionLayer<Dtype>(layer_param)); + layer.reset(new CaffeConvolutionLayer<Dtype>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 3); @@ -111,7 +111,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) { convolution_param->mutable_bias_filler()->set_type("constant"); convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<Dtype> > layer( - new ConvolutionLayer<Dtype>(layer_param)); + new CaffeConvolutionLayer<Dtype>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // After the convolution, the output should all have output values 27.1 @@ -154,7 +154,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) { convolution_param->mutable_bias_filler()->set_type("constant"); convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<Dtype> > layer( - new ConvolutionLayer<Dtype>(layer_param)); + new CaffeConvolutionLayer<Dtype>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // After the convolution, the output should all have output values 9.1 @@ -192,7 +192,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSobelConvolution) { convolution_param->set_num_output(1); convolution_param->set_bias_term(false); shared_ptr<Layer<Dtype> > layer( - new ConvolutionLayer<Dtype>(layer_param)); + new CaffeConvolutionLayer<Dtype>(layer_param)); layer->blobs().resize(1); layer->blobs()[0].reset(new Blob<Dtype>(1, 3, 3, 3)); Dtype* weights = layer->blobs()[0]->mutable_cpu_data(); @@ -225,7 +225,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSobelConvolution) { convolution_param->set_stride_w(1); convolution_param->set_num_output(1); convolution_param->set_bias_term(false); - layer.reset(new ConvolutionLayer<Dtype>(layer_param)); + layer.reset(new CaffeConvolutionLayer<Dtype>(layer_param)); layer->blobs().resize(1); layer->blobs()[0].reset(new Blob<Dtype>(1, 3, 3, 1)); Dtype* weights_1 = layer->blobs()[0]->mutable_cpu_data(); @@ -247,7 +247,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSobelConvolution) { convolution_param->set_stride_w(2); convolution_param->set_num_output(1); convolution_param->set_bias_term(false); - layer.reset(new ConvolutionLayer<Dtype>(layer_param)); + layer.reset(new CaffeConvolutionLayer<Dtype>(layer_param)); layer->blobs().resize(1); layer->blobs()[0].reset(new Blob<Dtype>(1, 3, 1, 3)); Dtype* weights_2 = layer->blobs()[0]->mutable_cpu_data(); @@ -279,7 +279,7 @@ TYPED_TEST(ConvolutionLayerTest, TestGradient) { convolution_param->set_num_output(2); convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("gaussian"); - ConvolutionLayer<Dtype> layer(layer_param); + CaffeConvolutionLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -296,7 +296,7 @@ TYPED_TEST(ConvolutionLayerTest, TestGradientGroup) { convolution_param->set_group(3); convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("gaussian"); - ConvolutionLayer<Dtype> layer(layer_param); + CaffeConvolutionLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); From 63323765f5d3192cfa3e3dc06fba79a475374ab2 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 20:27:33 -0700 Subject: [PATCH 0699/2053] strategize pooling Scaffold engine switching for pooling. The Caffe pooling is instantiated without regard for engine in: - LRNLayer - PoolingLayer tests - StochasticPoolingLayer tests - MaxPoolingDropout tests --- include/caffe/vision_layers.hpp | 44 +++- src/caffe/layer_factory.cpp | 18 +- src/caffe/layers/caffe_pooling_layer.cpp | 230 ++++++++++++++++++ ...ooling_layer.cu => caffe_pooling_layer.cu} | 55 +++-- src/caffe/layers/lrn_layer.cpp | 2 +- src/caffe/layers/pooling_layer.cpp | 206 +--------------- .../test/test_maxpool_dropout_layers.cpp | 6 +- src/caffe/test/test_pooling_layer.cpp | 22 +- src/caffe/test/test_stochastic_pooling.cpp | 8 +- 9 files changed, 337 insertions(+), 254 deletions(-) create mode 100644 src/caffe/layers/caffe_pooling_layer.cpp rename src/caffe/layers/{pooling_layer.cu => caffe_pooling_layer.cu} (86%) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 5bdd4f75f34..46df807fbd6 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -238,13 +238,13 @@ class PoolingLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + vector<Blob<Dtype>*>* top) = 0; virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + vector<Blob<Dtype>*>* top) = 0; virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; int kernel_h_, kernel_w_; int stride_h_, stride_w_; @@ -258,6 +258,42 @@ class PoolingLayer : public Layer<Dtype> { Blob<int> max_idx_; }; +/* PoolingLayer +*/ +template <typename Dtype> +class CaffePoolingLayer : public PoolingLayer<Dtype> { + public: + explicit CaffePoolingLayer(const LayerParameter& param) + : PoolingLayer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_POOLING; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int MinTopBlobs() const { return 1; } + // MAX POOL layers can output an extra top blob for the mask; + // others can only output the pooled inputs. + virtual inline int MaxTopBlobs() const { + return (this->layer_param_.pooling_param().pool() == + PoolingParameter_PoolMethod_MAX) ? 2 : 1; + } + + protected: + virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + + Blob<Dtype> rand_idx_; + Blob<int> max_idx_; +}; + } // namespace caffe #endif // CAFFE_VISION_LAYERS_HPP_ diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index ae9ff3621de..2ffb7f8558a 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -26,6 +26,22 @@ template ConvolutionLayer<float>* GetConvolutionLayer(const string& name, template ConvolutionLayer<double>* GetConvolutionLayer(const string& name, const LayerParameter& param); +// Get pooling layer according to engine. +template <typename Dtype> +PoolingLayer<Dtype>* GetPoolingLayer(const string& name, + const LayerParameter& param) { + PoolingParameter_Engine engine = param.pooling_param().engine(); + if (engine == PoolingParameter_Engine_CAFFE) { + return new CaffePoolingLayer<Dtype>(param); + } else { + LOG(FATAL) << "Layer " << name << " has unknown engine."; + } +} + +template PoolingLayer<float>* GetPoolingLayer(const string& name, + const LayerParameter& param); +template PoolingLayer<double>* GetPoolingLayer(const string& name, + const LayerParameter& param); // A function to get a specific layer from the specification given in // LayerParameter. Ideally this would be replaced by a factory pattern, @@ -82,7 +98,7 @@ Layer<Dtype>* GetLayer(const LayerParameter& param) { case LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS: return new MultinomialLogisticLossLayer<Dtype>(param); case LayerParameter_LayerType_POOLING: - return new PoolingLayer<Dtype>(param); + return GetPoolingLayer<Dtype>(name, param); case LayerParameter_LayerType_POWER: return new PowerLayer<Dtype>(param); case LayerParameter_LayerType_RELU: diff --git a/src/caffe/layers/caffe_pooling_layer.cpp b/src/caffe/layers/caffe_pooling_layer.cpp new file mode 100644 index 00000000000..5756b740159 --- /dev/null +++ b/src/caffe/layers/caffe_pooling_layer.cpp @@ -0,0 +1,230 @@ +#include <algorithm> +#include <cfloat> +#include <vector> + +#include "caffe/common.hpp" +#include "caffe/layer.hpp" +#include "caffe/syncedmem.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +using std::min; +using std::max; + +template <typename Dtype> +void CaffePoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + PoolingLayer<Dtype>::LayerSetUp(bottom, top); + PoolingParameter pool_param = this->layer_param_.pooling_param(); + // If max pooling, we will initialize the vector index part. + if (this->layer_param_.pooling_param().pool() == + PoolingParameter_PoolMethod_MAX && top->size() == 1) { + max_idx_.Reshape(bottom[0]->num(), this->channels_, this->pooled_height_, + this->pooled_width_); + } + // If stochastic pooling, we will initialize the random index part. + if (this->layer_param_.pooling_param().pool() == + PoolingParameter_PoolMethod_STOCHASTIC) { + rand_idx_.Reshape(bottom[0]->num(), this->channels_, this->pooled_height_, + this->pooled_width_); + } +} + +// TODO(Yangqing): Is there a faster way to do pooling in the channel-first +// case? +template <typename Dtype> +void CaffePoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const int top_count = (*top)[0]->count(); + // We'll output the mask to top[1] if it's of size >1. + const bool use_top_mask = top->size() > 1; + int* mask = NULL; // suppress warnings about uninitalized variables + Dtype* top_mask = NULL; + // Different pooling methods. We explicitly do the switch outside the for + // loop to save time, although this results in more code. + switch (this->layer_param_.pooling_param().pool()) { + case PoolingParameter_PoolMethod_MAX: + // Initialize + if (use_top_mask) { + top_mask = (*top)[1]->mutable_cpu_data(); + caffe_set(top_count, Dtype(-1), top_mask); + } else { + mask = max_idx_.mutable_cpu_data(); + caffe_set(top_count, -1, mask); + } + caffe_set(top_count, Dtype(-FLT_MAX), top_data); + // The main loop + for (int n = 0; n < bottom[0]->num(); ++n) { + for (int c = 0; c < this->channels_; ++c) { + for (int ph = 0; ph < this->pooled_height_; ++ph) { + for (int pw = 0; pw < this->pooled_width_; ++pw) { + int hstart = ph * this->stride_h_ - this->pad_h_; + int wstart = pw * this->stride_w_ - this->pad_w_; + int hend = min(hstart + this->kernel_h_, this->height_); + int wend = min(wstart + this->kernel_w_, this->width_); + hstart = max(hstart, 0); + wstart = max(wstart, 0); + const int pool_index = ph * this->pooled_width_ + pw; + for (int h = hstart; h < hend; ++h) { + for (int w = wstart; w < wend; ++w) { + const int index = h * this->width_ + w; + if (bottom_data[index] > top_data[pool_index]) { + top_data[pool_index] = bottom_data[index]; + if (use_top_mask) { + top_mask[pool_index] = static_cast<Dtype>(index); + } else { + mask[pool_index] = index; + } + } + } + } + } + } + // compute offset + bottom_data += bottom[0]->offset(0, 1); + top_data += (*top)[0]->offset(0, 1); + if (use_top_mask) { + top_mask += (*top)[0]->offset(0, 1); + } else { + mask += (*top)[0]->offset(0, 1); + } + } + } + break; + case PoolingParameter_PoolMethod_AVE: + for (int i = 0; i < top_count; ++i) { + top_data[i] = 0; + } + // The main loop + for (int n = 0; n < bottom[0]->num(); ++n) { + for (int c = 0; c < this->channels_; ++c) { + for (int ph = 0; ph < this->pooled_height_; ++ph) { + for (int pw = 0; pw < this->pooled_width_; ++pw) { + int hstart = ph * this->stride_h_ - this->pad_h_; + int wstart = pw * this->stride_w_ - this->pad_w_; + int hend = min(hstart + this->kernel_h_, + this->height_ + this->pad_h_); + int wend = min(wstart + this->kernel_w_, + this->width_ + this->pad_w_); + int pool_size = (hend - hstart) * (wend - wstart); + hstart = max(hstart, 0); + wstart = max(wstart, 0); + hend = min(hend, this->height_); + wend = min(wend, this->width_); + for (int h = hstart; h < hend; ++h) { + for (int w = wstart; w < wend; ++w) { + top_data[ph * this->pooled_width_ + pw] += + bottom_data[h * this->width_ + w]; + } + } + top_data[ph * this->pooled_width_ + pw] /= pool_size; + } + } + // compute offset + bottom_data += bottom[0]->offset(0, 1); + top_data += (*top)[0]->offset(0, 1); + } + } + break; + case PoolingParameter_PoolMethod_STOCHASTIC: + NOT_IMPLEMENTED; + break; + default: + LOG(FATAL) << "Unknown pooling method."; + } +} + +template <typename Dtype> +void CaffePoolingLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + if (!propagate_down[0]) { + return; + } + const Dtype* top_diff = top[0]->cpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + // Different pooling methods. We explicitly do the switch outside the for + // loop to save time, although this results in more codes. + caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); + // We'll output the mask to top[1] if it's of size >1. + const bool use_top_mask = top.size() > 1; + const int* mask = NULL; // suppress warnings about uninitialized variables + const Dtype* top_mask = NULL; + switch (this->layer_param_.pooling_param().pool()) { + case PoolingParameter_PoolMethod_MAX: + // The main loop + if (use_top_mask) { + top_mask = top[1]->cpu_data(); + } else { + mask = max_idx_.cpu_data(); + } + for (int n = 0; n < top[0]->num(); ++n) { + for (int c = 0; c < this->channels_; ++c) { + for (int ph = 0; ph < this->pooled_height_; ++ph) { + for (int pw = 0; pw < this->pooled_width_; ++pw) { + const int index = ph * this->pooled_width_ + pw; + const int bottom_index = + use_top_mask ? top_mask[index] : mask[index]; + bottom_diff[bottom_index] += top_diff[index]; + } + } + bottom_diff += (*bottom)[0]->offset(0, 1); + top_diff += top[0]->offset(0, 1); + if (use_top_mask) { + top_mask += top[0]->offset(0, 1); + } else { + mask += top[0]->offset(0, 1); + } + } + } + break; + case PoolingParameter_PoolMethod_AVE: + // The main loop + for (int n = 0; n < top[0]->num(); ++n) { + for (int c = 0; c < this->channels_; ++c) { + for (int ph = 0; ph < this->pooled_height_; ++ph) { + for (int pw = 0; pw < this->pooled_width_; ++pw) { + int hstart = ph * this->stride_h_ - this->pad_h_; + int wstart = pw * this->stride_w_ - this->pad_w_; + int hend = min(hstart + this->kernel_h_, + this->height_ + this->pad_h_); + int wend = min(wstart + this->kernel_w_, + this->width_ + this->pad_w_); + int pool_size = (hend - hstart) * (wend - wstart); + hstart = max(hstart, 0); + wstart = max(wstart, 0); + hend = min(hend, this->height_); + wend = min(wend, this->width_); + for (int h = hstart; h < hend; ++h) { + for (int w = wstart; w < wend; ++w) { + bottom_diff[h * this->width_ + w] += + top_diff[ph * this->pooled_width_ + pw] / pool_size; + } + } + } + } + // offset + bottom_diff += (*bottom)[0]->offset(0, 1); + top_diff += top[0]->offset(0, 1); + } + } + break; + case PoolingParameter_PoolMethod_STOCHASTIC: + NOT_IMPLEMENTED; + break; + default: + LOG(FATAL) << "Unknown pooling method."; + } +} + +#ifdef CPU_ONLY +STUB_GPU(CaffePoolingLayer); +#endif + +INSTANTIATE_CLASS(CaffePoolingLayer); + +} // namespace caffe + diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/caffe_pooling_layer.cu similarity index 86% rename from src/caffe/layers/pooling_layer.cu rename to src/caffe/layers/caffe_pooling_layer.cu index e64128b87f2..7a8c351e3a1 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/caffe_pooling_layer.cu @@ -151,7 +151,7 @@ __global__ void StoPoolForwardTest(const int nthreads, template <typename Dtype> -void PoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, +void CaffePoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -169,17 +169,18 @@ void PoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_h_, - kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data, - mask, top_mask); + count, bottom_data, bottom[0]->num(), this->channels_, this->height_, + this->width_, this->pooled_height_, this->pooled_width_, + this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, + this->pad_h_, this->pad_w_, top_data, mask, top_mask); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) AvePoolForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_h_, - kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data); + count, bottom_data, bottom[0]->num(), this->channels_, this->height_, + this->width_, this->pooled_height_, this->pooled_width_, + this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, + this->pad_h_, this->pad_w_, top_data); break; case PoolingParameter_PoolMethod_STOCHASTIC: if (Caffe::phase() == Caffe::TRAIN) { @@ -189,17 +190,18 @@ void PoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, // NOLINT_NEXT_LINE(whitespace/operators) StoPoolForwardTrain<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_h_, - kernel_w_, stride_h_, stride_w_, + count, bottom_data, bottom[0]->num(), this->channels_, this->height_, + this->width_, this->pooled_height_, this->pooled_width_, + this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, rand_idx_.mutable_gpu_data(), top_data); } else { // NOLINT_NEXT_LINE(whitespace/operators) StoPoolForwardTest<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, bottom_data, bottom[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_h_, - kernel_w_, stride_h_, stride_w_, top_data); + count, bottom_data, bottom[0]->num(), this->channels_, this->height_, + this->width_, this->pooled_height_, this->pooled_width_, + this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, + top_data); } break; default: @@ -324,7 +326,7 @@ __global__ void StoPoolBackward(const int nthreads, template <typename Dtype> -void PoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void CaffePoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (!propagate_down[0]) { return; @@ -346,24 +348,25 @@ void PoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, top_diff, mask, top_mask, top[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, - kernel_h_, kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, - bottom_diff); + count, top_diff, mask, top_mask, top[0]->num(), this->channels_, + this->height_, this->width_, this->pooled_height_, this->pooled_width_, + this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, + this->pad_h_, this->pad_w_, bottom_diff); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) AvePoolBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, top_diff, top[0]->num(), channels_, - height_, width_, pooled_height_, pooled_width_, kernel_h_, - kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, bottom_diff); + count, top_diff, top[0]->num(), this->channels_, this->height_, + this->width_, this->pooled_height_, this->pooled_width_, + this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, + this->pad_h_, this->pad_w_, bottom_diff); break; case PoolingParameter_PoolMethod_STOCHASTIC: // NOLINT_NEXT_LINE(whitespace/operators) StoPoolBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, rand_idx_.gpu_data(), top_diff, - top[0]->num(), channels_, height_, width_, pooled_height_, - pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, + count, rand_idx_.gpu_data(), top_diff, top[0]->num(), this->channels_, + this->height_, this->width_, this->pooled_height_, this->pooled_width_, + this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, bottom_diff); break; default: @@ -373,7 +376,7 @@ void PoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } -INSTANTIATE_CLASS(PoolingLayer); +INSTANTIATE_CLASS(CaffePoolingLayer); } // namespace caffe diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index e81a32ba84f..c792f65069f 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -53,7 +53,7 @@ void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, PoolingParameter_PoolMethod_AVE); pool_param.mutable_pooling_param()->set_pad(pre_pad_); pool_param.mutable_pooling_param()->set_kernel_size(size_); - pool_layer_.reset(new PoolingLayer<Dtype>(pool_param)); + pool_layer_.reset(new CaffePoolingLayer<Dtype>(pool_param)); pool_layer_->SetUp(square_top_vec_, &pool_top_vec_); CHECK_EQ(pool_output_.num(), num_); CHECK_EQ(pool_output_.channels(), channels_); diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 9e77fa28a45..04f47762f9d 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -52,9 +52,9 @@ void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, stride_w_ = pool_param.stride_w(); } if (pad_h_ != 0 || pad_w_ != 0) { - CHECK(this->layer_param_.pooling_param().pool() + CHECK(pool_param.pool() == PoolingParameter_PoolMethod_AVE - || this->layer_param_.pooling_param().pool() + || pool_param.pool() == PoolingParameter_PoolMethod_MAX) << "Padding implemented only for average and max pooling."; CHECK_LT(pad_h_, kernel_h_); @@ -84,210 +84,8 @@ void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, if (top->size() > 1) { (*top)[1]->ReshapeLike(*(*top)[0]); } - // If max pooling, we will initialize the vector index part. - if (this->layer_param_.pooling_param().pool() == - PoolingParameter_PoolMethod_MAX && top->size() == 1) { - max_idx_.Reshape(bottom[0]->num(), channels_, pooled_height_, - pooled_width_); - } - // If stochastic pooling, we will initialize the random index part. - if (this->layer_param_.pooling_param().pool() == - PoolingParameter_PoolMethod_STOCHASTIC) { - rand_idx_.Reshape(bottom[0]->num(), channels_, pooled_height_, - pooled_width_); - } -} - -// TODO(Yangqing): Is there a faster way to do pooling in the channel-first -// case? -template <typename Dtype> -void PoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - const int top_count = (*top)[0]->count(); - // We'll output the mask to top[1] if it's of size >1. - const bool use_top_mask = top->size() > 1; - int* mask = NULL; // suppress warnings about uninitalized variables - Dtype* top_mask = NULL; - // Different pooling methods. We explicitly do the switch outside the for - // loop to save time, although this results in more code. - switch (this->layer_param_.pooling_param().pool()) { - case PoolingParameter_PoolMethod_MAX: - // Initialize - if (use_top_mask) { - top_mask = (*top)[1]->mutable_cpu_data(); - caffe_set(top_count, Dtype(-1), top_mask); - } else { - mask = max_idx_.mutable_cpu_data(); - caffe_set(top_count, -1, mask); - } - caffe_set(top_count, Dtype(-FLT_MAX), top_data); - // The main loop - for (int n = 0; n < bottom[0]->num(); ++n) { - for (int c = 0; c < channels_; ++c) { - for (int ph = 0; ph < pooled_height_; ++ph) { - for (int pw = 0; pw < pooled_width_; ++pw) { - int hstart = ph * stride_h_ - pad_h_; - int wstart = pw * stride_w_ - pad_w_; - int hend = min(hstart + kernel_h_, height_); - int wend = min(wstart + kernel_w_, width_); - hstart = max(hstart, 0); - wstart = max(wstart, 0); - const int pool_index = ph * pooled_width_ + pw; - for (int h = hstart; h < hend; ++h) { - for (int w = wstart; w < wend; ++w) { - const int index = h * width_ + w; - if (bottom_data[index] > top_data[pool_index]) { - top_data[pool_index] = bottom_data[index]; - if (use_top_mask) { - top_mask[pool_index] = static_cast<Dtype>(index); - } else { - mask[pool_index] = index; - } - } - } - } - } - } - // compute offset - bottom_data += bottom[0]->offset(0, 1); - top_data += (*top)[0]->offset(0, 1); - if (use_top_mask) { - top_mask += (*top)[0]->offset(0, 1); - } else { - mask += (*top)[0]->offset(0, 1); - } - } - } - break; - case PoolingParameter_PoolMethod_AVE: - for (int i = 0; i < top_count; ++i) { - top_data[i] = 0; - } - // The main loop - for (int n = 0; n < bottom[0]->num(); ++n) { - for (int c = 0; c < channels_; ++c) { - for (int ph = 0; ph < pooled_height_; ++ph) { - for (int pw = 0; pw < pooled_width_; ++pw) { - int hstart = ph * stride_h_ - pad_h_; - int wstart = pw * stride_w_ - pad_w_; - int hend = min(hstart + kernel_h_, height_ + pad_h_); - int wend = min(wstart + kernel_w_, width_ + pad_w_); - int pool_size = (hend - hstart) * (wend - wstart); - hstart = max(hstart, 0); - wstart = max(wstart, 0); - hend = min(hend, height_); - wend = min(wend, width_); - for (int h = hstart; h < hend; ++h) { - for (int w = wstart; w < wend; ++w) { - top_data[ph * pooled_width_ + pw] += - bottom_data[h * width_ + w]; - } - } - top_data[ph * pooled_width_ + pw] /= pool_size; - } - } - // compute offset - bottom_data += bottom[0]->offset(0, 1); - top_data += (*top)[0]->offset(0, 1); - } - } - break; - case PoolingParameter_PoolMethod_STOCHASTIC: - NOT_IMPLEMENTED; - break; - default: - LOG(FATAL) << "Unknown pooling method."; - } } -template <typename Dtype> -void PoolingLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { - if (!propagate_down[0]) { - return; - } - const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - // Different pooling methods. We explicitly do the switch outside the for - // loop to save time, although this results in more codes. - caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); - // We'll output the mask to top[1] if it's of size >1. - const bool use_top_mask = top.size() > 1; - const int* mask = NULL; // suppress warnings about uninitialized variables - const Dtype* top_mask = NULL; - switch (this->layer_param_.pooling_param().pool()) { - case PoolingParameter_PoolMethod_MAX: - // The main loop - if (use_top_mask) { - top_mask = top[1]->cpu_data(); - } else { - mask = max_idx_.cpu_data(); - } - for (int n = 0; n < top[0]->num(); ++n) { - for (int c = 0; c < channels_; ++c) { - for (int ph = 0; ph < pooled_height_; ++ph) { - for (int pw = 0; pw < pooled_width_; ++pw) { - const int index = ph * pooled_width_ + pw; - const int bottom_index = - use_top_mask ? top_mask[index] : mask[index]; - bottom_diff[bottom_index] += top_diff[index]; - } - } - bottom_diff += (*bottom)[0]->offset(0, 1); - top_diff += top[0]->offset(0, 1); - if (use_top_mask) { - top_mask += top[0]->offset(0, 1); - } else { - mask += top[0]->offset(0, 1); - } - } - } - break; - case PoolingParameter_PoolMethod_AVE: - // The main loop - for (int n = 0; n < top[0]->num(); ++n) { - for (int c = 0; c < channels_; ++c) { - for (int ph = 0; ph < pooled_height_; ++ph) { - for (int pw = 0; pw < pooled_width_; ++pw) { - int hstart = ph * stride_h_ - pad_h_; - int wstart = pw * stride_w_ - pad_w_; - int hend = min(hstart + kernel_h_, height_ + pad_h_); - int wend = min(wstart + kernel_w_, width_ + pad_w_); - int pool_size = (hend - hstart) * (wend - wstart); - hstart = max(hstart, 0); - wstart = max(wstart, 0); - hend = min(hend, height_); - wend = min(wend, width_); - for (int h = hstart; h < hend; ++h) { - for (int w = wstart; w < wend; ++w) { - bottom_diff[h * width_ + w] += - top_diff[ph * pooled_width_ + pw] / pool_size; - } - } - } - } - // offset - bottom_diff += (*bottom)[0]->offset(0, 1); - top_diff += top[0]->offset(0, 1); - } - } - break; - case PoolingParameter_PoolMethod_STOCHASTIC: - NOT_IMPLEMENTED; - break; - default: - LOG(FATAL) << "Unknown pooling method."; - } -} - - -#ifdef CPU_ONLY -STUB_GPU(PoolingLayer); -#endif - INSTANTIATE_CLASS(PoolingLayer); - } // namespace caffe diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp index 311c7781be5..ffafbec4515 100644 --- a/src/caffe/test/test_maxpool_dropout_layers.cpp +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -46,7 +46,7 @@ TYPED_TEST(MaxPoolingDropoutTest, TestSetup) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - PoolingLayer<Dtype> max_layer(layer_param); + CaffePoolingLayer<Dtype> max_layer(layer_param); max_layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); DropoutLayer<Dtype> dropout_layer(layer_param); dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); @@ -63,7 +63,7 @@ TYPED_TEST(MaxPoolingDropoutTest, TestForward) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); const Dtype* top_data = this->blob_top_->cpu_data(); @@ -93,7 +93,7 @@ TYPED_TEST(MaxPoolingDropoutTest, TestBackward) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); for (int i = 0; i < this->blob_top_->count(); ++i) { diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index 5be01f77b32..4361949a897 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -72,7 +72,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { blob_bottom_->mutable_cpu_data()[i + 13] = 2; blob_bottom_->mutable_cpu_data()[i + 14] = 3; } - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); layer.SetUp(blob_bottom_vec_, &blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); @@ -170,7 +170,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { blob_bottom_->mutable_cpu_data()[i + 34] = 18; blob_bottom_->mutable_cpu_data()[i + 35] = 11; } - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); layer.SetUp(blob_bottom_vec_, &blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); @@ -295,7 +295,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { blob_bottom_->mutable_cpu_data()[i + 34] = 18; blob_bottom_->mutable_cpu_data()[i + 35] = 11; } - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); layer.SetUp(blob_bottom_vec_, &blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); @@ -376,7 +376,7 @@ TYPED_TEST(PoolingLayerTest, TestSetup) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); @@ -392,7 +392,7 @@ TYPED_TEST(PoolingLayerTest, TestSetupPadded) { pooling_param->set_stride(2); pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); @@ -450,7 +450,7 @@ TYPED_TEST(PoolingLayerTest, TestGradientMax) { pooling_param->set_stride(2); pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-4, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -480,7 +480,7 @@ TYPED_TEST(PoolingLayerTest, TestForwardMaxPadded) { this->blob_bottom_->mutable_cpu_data()[6] = 4; this->blob_bottom_->mutable_cpu_data()[7] = 2; this->blob_bottom_->mutable_cpu_data()[8] = 1; - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); @@ -514,7 +514,7 @@ TYPED_TEST(PoolingLayerTest, TestGradientMaxTopMask) { pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); this->blob_top_vec_.push_back(this->blob_top_mask_); - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-4, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -536,7 +536,7 @@ TYPED_TEST(PoolingLayerTest, TestForwardAve) { filler_param.set_value(Dtype(2)); ConstantFiller<Dtype> filler(filler_param); filler.Fill(this->blob_bottom_); - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); @@ -565,7 +565,7 @@ TYPED_TEST(PoolingLayerTest, TestGradientAve) { pooling_param->set_kernel_w(kernel_w); pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -584,7 +584,7 @@ TYPED_TEST(PoolingLayerTest, TestGradientAvePadded) { pooling_param->set_stride(2); pooling_param->set_pad(2); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - PoolingLayer<Dtype> layer(layer_param); + CaffePoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); diff --git a/src/caffe/test/test_stochastic_pooling.cpp b/src/caffe/test/test_stochastic_pooling.cpp index 4f13981bd82..51edbb3d626 100644 --- a/src/caffe/test/test_stochastic_pooling.cpp +++ b/src/caffe/test/test_stochastic_pooling.cpp @@ -52,7 +52,7 @@ TYPED_TEST(StochasticPoolingLayerTest, TestSetup) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - PoolingLayer<TypeParam> layer(layer_param); + CaffePoolingLayer<TypeParam> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); @@ -68,7 +68,7 @@ TYPED_TEST(StochasticPoolingLayerTest, TestStochasticGPU) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_STOCHASTIC); - PoolingLayer<TypeParam> layer(layer_param); + CaffePoolingLayer<TypeParam> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -112,7 +112,7 @@ TYPED_TEST(StochasticPoolingLayerTest, TestStochasticGPUTestPhase) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_STOCHASTIC); - PoolingLayer<TypeParam> layer(layer_param); + CaffePoolingLayer<TypeParam> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -150,7 +150,7 @@ TYPED_TEST(StochasticPoolingLayerTest, TestGradientGPU) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_STOCHASTIC); - PoolingLayer<TypeParam> layer(layer_param); + CaffePoolingLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-4, 1e-2); // it is too expensive to call curand multiple times, so we don't do an // exhaustive gradient check. From 8e8872ddfd7d9eb865953e5019487b47740f3fd4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 21:01:11 -0700 Subject: [PATCH 0700/2053] strategize relu, sigmoid, tanh --- include/caffe/loss_layers.hpp | 4 +- include/caffe/neuron_layers.hpp | 87 +++++++++++++++++-- src/caffe/layer_factory.cpp | 57 +++++++++++- .../{relu_layer.cpp => caffe_relu_layer.cpp} | 10 +-- .../{relu_layer.cu => caffe_relu_layer.cu} | 8 +- ...moid_layer.cpp => caffe_sigmoid_layer.cpp} | 8 +- ...igmoid_layer.cu => caffe_sigmoid_layer.cu} | 6 +- .../{tanh_layer.cpp => caffe_tanh_layer.cpp} | 11 +-- .../{tanh_layer.cu => caffe_tanh_layer.cu} | 10 +-- src/caffe/test/test_neuron_layer.cpp | 44 ++++++++-- src/caffe/test/test_tanh_layer.cpp | 74 ---------------- 11 files changed, 196 insertions(+), 123 deletions(-) rename src/caffe/layers/{relu_layer.cpp => caffe_relu_layer.cpp} (84%) rename src/caffe/layers/{relu_layer.cu => caffe_relu_layer.cu} (91%) rename src/caffe/layers/{sigmoid_layer.cpp => caffe_sigmoid_layer.cpp} (82%) rename src/caffe/layers/{sigmoid_layer.cu => caffe_sigmoid_layer.cu} (90%) rename src/caffe/layers/{tanh_layer.cpp => caffe_tanh_layer.cpp} (77%) rename src/caffe/layers/{tanh_layer.cu => caffe_tanh_layer.cu} (85%) delete mode 100644 src/caffe/test/test_tanh_layer.cpp diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index a29c445d51e..555c06e4ed3 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -506,7 +506,7 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { public: explicit SigmoidCrossEntropyLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param), - sigmoid_layer_(new SigmoidLayer<Dtype>(param)), + sigmoid_layer_(new CaffeSigmoidLayer<Dtype>(param)), sigmoid_output_(new Blob<Dtype>()) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); @@ -558,7 +558,7 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); /// The internal SigmoidLayer used to map predictions to probabilities. - shared_ptr<SigmoidLayer<Dtype> > sigmoid_layer_; + shared_ptr<CaffeSigmoidLayer<Dtype> > sigmoid_layer_; /// sigmoid_output stores the output of the SigmoidLayer. shared_ptr<Blob<Dtype> > sigmoid_output_; /// bottom vector holder to call the underlying SigmoidLayer::Forward diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 8c882eec125..f1d8f51e247 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -318,9 +318,9 @@ class ReLULayer : public NeuronLayer<Dtype> { * the computed outputs are @f$ y = \max(0, x) + \nu \min(0, x) @f$. */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + vector<Blob<Dtype>*>* top) = 0; virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + vector<Blob<Dtype>*>* top) = 0; /** * @brief Computes the error gradient w.r.t. the ReLU inputs. @@ -350,6 +350,31 @@ class ReLULayer : public NeuronLayer<Dtype> { * \end{array} \right. * @f$. */ + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; +}; + +/** + * @brief standard Caffe implementation of ReLULayer. + */ +template <typename Dtype> +class CaffeReLULayer : public ReLULayer<Dtype> { + public: + explicit CaffeReLULayer(const LayerParameter& param) + : ReLULayer<Dtype>(param) {} + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_RELU; + } + + protected: + virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, @@ -386,9 +411,9 @@ class SigmoidLayer : public NeuronLayer<Dtype> { * @f$ */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + vector<Blob<Dtype>*>* top) = 0; virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + vector<Blob<Dtype>*>* top) = 0; /** * @brief Computes the error gradient w.r.t. the sigmoid inputs. @@ -407,6 +432,31 @@ class SigmoidLayer : public NeuronLayer<Dtype> { * = \frac{\partial E}{\partial y} y (1 - y) * @f$ if propagate_down[0] */ + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; +}; + +/** + * @brief standard Caffe implementation of SigmoidLayer. + */ +template <typename Dtype> +class CaffeSigmoidLayer : public SigmoidLayer<Dtype> { + public: + explicit CaffeSigmoidLayer(const LayerParameter& param) + : SigmoidLayer<Dtype>(param) {} + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SIGMOID; + } + + protected: + virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, @@ -443,9 +493,9 @@ class TanHLayer : public NeuronLayer<Dtype> { * @f$ */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + vector<Blob<Dtype>*>* top) = 0; virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + vector<Blob<Dtype>*>* top) = 0; /** * @brief Computes the error gradient w.r.t. the sigmoid inputs. @@ -466,6 +516,31 @@ class TanHLayer : public NeuronLayer<Dtype> { * = \frac{\partial E}{\partial y} (1 - y^2) * @f$ if propagate_down[0] */ + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; +}; + +/** + * @brief standard Caffe implementation of TanHLayer. + */ +template <typename Dtype> +class CaffeTanHLayer : public TanHLayer<Dtype> { + public: + explicit CaffeTanHLayer(const LayerParameter& param) + : TanHLayer<Dtype>(param) {} + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_TANH; + } + + protected: + virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 2ffb7f8558a..3a535f51ab1 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -43,6 +43,57 @@ template PoolingLayer<float>* GetPoolingLayer(const string& name, template PoolingLayer<double>* GetPoolingLayer(const string& name, const LayerParameter& param); +// Get relu layer according to engine. +template <typename Dtype> +ReLULayer<Dtype>* GetReLULayer(const string& name, + const LayerParameter& param) { + ReLUParameter_Engine engine = param.relu_param().engine(); + if (engine == ReLUParameter_Engine_CAFFE) { + return new CaffeReLULayer<Dtype>(param); + } else { + LOG(FATAL) << "Layer " << name << " has unknown engine."; + } +} + +template ReLULayer<float>* GetReLULayer(const string& name, + const LayerParameter& param); +template ReLULayer<double>* GetReLULayer(const string& name, + const LayerParameter& param); + +// Get sigmoid layer according to engine. +template <typename Dtype> +SigmoidLayer<Dtype>* GetSigmoidLayer(const string& name, + const LayerParameter& param) { + SigmoidParameter_Engine engine = param.sigmoid_param().engine(); + if (engine == SigmoidParameter_Engine_CAFFE) { + return new CaffeSigmoidLayer<Dtype>(param); + } else { + LOG(FATAL) << "Layer " << name << " has unknown engine."; + } +} + +template SigmoidLayer<float>* GetSigmoidLayer(const string& name, + const LayerParameter& param); +template SigmoidLayer<double>* GetSigmoidLayer(const string& name, + const LayerParameter& param); + +// Get tanh layer according to engine. +template <typename Dtype> +TanHLayer<Dtype>* GetTanHLayer(const string& name, + const LayerParameter& param) { + TanHParameter_Engine engine = param.tanh_param().engine(); + if (engine == TanHParameter_Engine_CAFFE) { + return new CaffeTanHLayer<Dtype>(param); + } else { + LOG(FATAL) << "Layer " << name << " has unknown engine."; + } +} + +template TanHLayer<float>* GetTanHLayer(const string& name, + const LayerParameter& param); +template TanHLayer<double>* GetTanHLayer(const string& name, + const LayerParameter& param); + // A function to get a specific layer from the specification given in // LayerParameter. Ideally this would be replaced by a factory pattern, // but we will leave it this way for now. @@ -102,11 +153,11 @@ Layer<Dtype>* GetLayer(const LayerParameter& param) { case LayerParameter_LayerType_POWER: return new PowerLayer<Dtype>(param); case LayerParameter_LayerType_RELU: - return new ReLULayer<Dtype>(param); + return GetReLULayer<Dtype>(name, param); case LayerParameter_LayerType_SILENCE: return new SilenceLayer<Dtype>(param); case LayerParameter_LayerType_SIGMOID: - return new SigmoidLayer<Dtype>(param); + return GetSigmoidLayer<Dtype>(name, param); case LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS: return new SigmoidCrossEntropyLossLayer<Dtype>(param); case LayerParameter_LayerType_SLICE: @@ -118,7 +169,7 @@ Layer<Dtype>* GetLayer(const LayerParameter& param) { case LayerParameter_LayerType_SPLIT: return new SplitLayer<Dtype>(param); case LayerParameter_LayerType_TANH: - return new TanHLayer<Dtype>(param); + return GetTanHLayer<Dtype>(name, param); case LayerParameter_LayerType_WINDOW_DATA: return new WindowDataLayer<Dtype>(param); case LayerParameter_LayerType_NONE: diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/caffe_relu_layer.cpp similarity index 84% rename from src/caffe/layers/relu_layer.cpp rename to src/caffe/layers/caffe_relu_layer.cpp index b50352f8526..d708b3f3166 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/caffe_relu_layer.cpp @@ -7,7 +7,7 @@ namespace caffe { template <typename Dtype> -void ReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, +void CaffeReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -20,7 +20,7 @@ void ReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } template <typename Dtype> -void ReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, +void CaffeReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -36,12 +36,10 @@ void ReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } } - #ifdef CPU_ONLY -STUB_GPU(ReLULayer); +STUB_GPU(CaffeReLULayer); #endif -INSTANTIATE_CLASS(ReLULayer); - +INSTANTIATE_CLASS(CaffeReLULayer); } // namespace caffe diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/caffe_relu_layer.cu similarity index 91% rename from src/caffe/layers/relu_layer.cu rename to src/caffe/layers/caffe_relu_layer.cu index def2bbcd7b9..ad89968d3a3 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/caffe_relu_layer.cu @@ -15,7 +15,7 @@ __global__ void ReLUForward(const int n, const Dtype* in, Dtype* out, } template <typename Dtype> -void ReLULayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, +void CaffeReLULayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -42,7 +42,7 @@ __global__ void ReLUBackward(const int n, const Dtype* in_diff, } template <typename Dtype> -void ReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void CaffeReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -58,8 +58,6 @@ void ReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } - -INSTANTIATE_CLASS(ReLULayer); - +INSTANTIATE_CLASS(CaffeReLULayer); } // namespace caffe diff --git a/src/caffe/layers/sigmoid_layer.cpp b/src/caffe/layers/caffe_sigmoid_layer.cpp similarity index 82% rename from src/caffe/layers/sigmoid_layer.cpp rename to src/caffe/layers/caffe_sigmoid_layer.cpp index d7bba7fbfc3..b5bb0e3fd93 100644 --- a/src/caffe/layers/sigmoid_layer.cpp +++ b/src/caffe/layers/caffe_sigmoid_layer.cpp @@ -13,7 +13,7 @@ inline Dtype sigmoid(Dtype x) { } template <typename Dtype> -void SigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, +void CaffeSigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -24,7 +24,7 @@ void SigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } template <typename Dtype> -void SigmoidLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, +void CaffeSigmoidLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -40,10 +40,10 @@ void SigmoidLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } #ifdef CPU_ONLY -STUB_GPU(SigmoidLayer); +STUB_GPU(CaffeSigmoidLayer); #endif -INSTANTIATE_CLASS(SigmoidLayer); +INSTANTIATE_CLASS(CaffeSigmoidLayer); } // namespace caffe diff --git a/src/caffe/layers/sigmoid_layer.cu b/src/caffe/layers/caffe_sigmoid_layer.cu similarity index 90% rename from src/caffe/layers/sigmoid_layer.cu rename to src/caffe/layers/caffe_sigmoid_layer.cu index e1ebb1f6c41..030d34ed8c7 100644 --- a/src/caffe/layers/sigmoid_layer.cu +++ b/src/caffe/layers/caffe_sigmoid_layer.cu @@ -15,7 +15,7 @@ __global__ void SigmoidForward(const int n, const Dtype* in, Dtype* out) { } template <typename Dtype> -void SigmoidLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, +void CaffeSigmoidLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -41,7 +41,7 @@ __global__ void SigmoidBackward(const int n, const Dtype* in_diff, } template <typename Dtype> -void SigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void CaffeSigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -56,7 +56,7 @@ void SigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(SigmoidLayer); +INSTANTIATE_CLASS(CaffeSigmoidLayer); } // namespace caffe diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/caffe_tanh_layer.cpp similarity index 77% rename from src/caffe/layers/tanh_layer.cpp rename to src/caffe/layers/caffe_tanh_layer.cpp index 8dae0054aed..a7433395dba 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/caffe_tanh_layer.cpp @@ -1,6 +1,3 @@ -// TanH neuron activation function layer. -// Adapted from ReLU layer code written by Yangqing Jia - #include <algorithm> #include <vector> @@ -10,7 +7,7 @@ namespace caffe { template <typename Dtype> -void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, +void CaffeTanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -23,7 +20,7 @@ void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } template <typename Dtype> -void TanHLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, +void CaffeTanHLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -40,9 +37,9 @@ void TanHLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } #ifdef CPU_ONLY -STUB_GPU(TanHLayer); +STUB_GPU(CaffeTanHLayer); #endif -INSTANTIATE_CLASS(TanHLayer); +INSTANTIATE_CLASS(CaffeTanHLayer); } // namespace caffe diff --git a/src/caffe/layers/tanh_layer.cu b/src/caffe/layers/caffe_tanh_layer.cu similarity index 85% rename from src/caffe/layers/tanh_layer.cu rename to src/caffe/layers/caffe_tanh_layer.cu index bdb7a94978e..f2096e68120 100644 --- a/src/caffe/layers/tanh_layer.cu +++ b/src/caffe/layers/caffe_tanh_layer.cu @@ -1,6 +1,3 @@ -// TanH neuron activation function layer. -// Adapted from ReLU layer code written by Yangqing Jia - #include <algorithm> #include <vector> @@ -18,7 +15,7 @@ __global__ void TanHForward(const int n, const Dtype* in, Dtype* out) { } template <typename Dtype> -void TanHLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, +void CaffeTanHLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -39,7 +36,7 @@ __global__ void TanHBackward(const int n, const Dtype* in_diff, } template <typename Dtype> -void TanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void CaffeTanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -54,7 +51,6 @@ void TanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(TanHLayer); - +INSTANTIATE_CLASS(CaffeTanHLayer); } // namespace caffe diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 29dcec5d889..322e497b82d 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -96,7 +96,7 @@ TYPED_TEST(NeuronLayerTest, TestAbsGradient) { TYPED_TEST(NeuronLayerTest, TestReLU) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - ReLULayer<Dtype> layer(layer_param); + CaffeReLULayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values @@ -111,7 +111,7 @@ TYPED_TEST(NeuronLayerTest, TestReLU) { TYPED_TEST(NeuronLayerTest, TestReLUGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - ReLULayer<Dtype> layer(layer_param); + CaffeReLULayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -121,7 +121,7 @@ TYPED_TEST(NeuronLayerTest, TestReLUWithNegativeSlope) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; layer_param.ParseFromString("relu_param{negative_slope:0.01}"); - ReLULayer<Dtype> layer(layer_param); + CaffeReLULayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values @@ -137,7 +137,7 @@ TYPED_TEST(NeuronLayerTest, TestReLUGradientWithNegativeSlope) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; layer_param.ParseFromString("relu_param{negative_slope:0.01}"); - ReLULayer<Dtype> layer(layer_param); + CaffeReLULayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -146,7 +146,7 @@ TYPED_TEST(NeuronLayerTest, TestReLUGradientWithNegativeSlope) { TYPED_TEST(NeuronLayerTest, TestSigmoid) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - SigmoidLayer<Dtype> layer(layer_param); + CaffeSigmoidLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values @@ -163,12 +163,44 @@ TYPED_TEST(NeuronLayerTest, TestSigmoid) { TYPED_TEST(NeuronLayerTest, TestSigmoidGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - SigmoidLayer<Dtype> layer(layer_param); + CaffeSigmoidLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } +TYPED_TEST(NeuronLayerTest, TestTanH) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + CaffeTanHLayer<Dtype> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Test exact values + for (int i = 0; i < this->blob_bottom_->num(); ++i) { + for (int j = 0; j < this->blob_bottom_->channels(); ++j) { + for (int k = 0; k < this->blob_bottom_->height(); ++k) { + for (int l = 0; l < this->blob_bottom_->width(); ++l) { + EXPECT_GE(this->blob_top_->data_at(i, j, k, l) + 1e-4, + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); + EXPECT_LE(this->blob_top_->data_at(i, j, k, l) - 1e-4, + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); + } + } + } + } +} + +TYPED_TEST(NeuronLayerTest, TestTanHGradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + CaffeTanHLayer<Dtype> layer(layer_param); + GradientChecker<Dtype> checker(1e-2, 1e-3); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + TYPED_TEST(NeuronLayerTest, TestDropoutHalf) { const float kDropoutRatio = 0.5; this->TestDropoutForward(kDropoutRatio); diff --git a/src/caffe/test/test_tanh_layer.cpp b/src/caffe/test/test_tanh_layer.cpp deleted file mode 100644 index 9b8e745b8a7..00000000000 --- a/src/caffe/test/test_tanh_layer.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// Adapted from other test files - -#include <cmath> -#include <cstring> -#include <vector> - -#include "gtest/gtest.h" - -#include "caffe/blob.hpp" -#include "caffe/common.hpp" -#include "caffe/filler.hpp" -#include "caffe/vision_layers.hpp" - -#include "caffe/test/test_caffe_main.hpp" -#include "caffe/test/test_gradient_check_util.hpp" - -namespace caffe { - -template <typename TypeParam> -class TanHLayerTest : public MultiDeviceTest<TypeParam> { - typedef typename TypeParam::Dtype Dtype; - protected: - TanHLayerTest() - : blob_bottom_(new Blob<Dtype>(2, 10, 1, 1)), - blob_top_(new Blob<Dtype>()) { - // fill the values - FillerParameter filler_param; - GaussianFiller<Dtype> filler(filler_param); - filler.Fill(this->blob_bottom_); - blob_bottom_vec_.push_back(blob_bottom_); - blob_top_vec_.push_back(blob_top_); - } - virtual ~TanHLayerTest() { delete blob_bottom_; delete blob_top_; } - Blob<Dtype>* const blob_bottom_; - Blob<Dtype>* const blob_top_; - vector<Blob<Dtype>*> blob_bottom_vec_; - vector<Blob<Dtype>*> blob_top_vec_; -}; - -TYPED_TEST_CASE(TanHLayerTest, TestDtypesAndDevices); - -TYPED_TEST(TanHLayerTest, TestForward) { - typedef typename TypeParam::Dtype Dtype; - LayerParameter layer_param; - TanHLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // Test exact values - for (int i = 0; i < this->blob_bottom_->num(); ++i) { - for (int j = 0; j < this->blob_bottom_->channels(); ++j) { - for (int k = 0; k < this->blob_bottom_->height(); ++k) { - for (int l = 0; l < this->blob_bottom_->width(); ++l) { - EXPECT_GE(this->blob_top_->data_at(i, j, k, l) + 1e-4, - (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / - (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); - EXPECT_LE(this->blob_top_->data_at(i, j, k, l) - 1e-4, - (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / - (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); - } - } - } - } -} - -TYPED_TEST(TanHLayerTest, TestGradient) { - typedef typename TypeParam::Dtype Dtype; - LayerParameter layer_param; - TanHLayer<Dtype> layer(layer_param); - GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); -} - -} // namespace caffe From dd958e041078c3b66a95b46a01cb7203e9272bab Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 21:29:50 -0700 Subject: [PATCH 0701/2053] strategize softmax --- include/caffe/common_layers.hpp | 25 +++++ include/caffe/loss_layers.hpp | 8 +- src/caffe/layer_factory.cpp | 19 +++- src/caffe/layers/caffe_softmax_layer.cpp | 97 +++++++++++++++++++ ...oftmax_layer.cu => caffe_softmax_layer.cu} | 7 +- src/caffe/layers/softmax_layer.cpp | 78 --------------- src/caffe/test/test_softmax_layer.cpp | 4 +- 7 files changed, 149 insertions(+), 89 deletions(-) create mode 100644 src/caffe/layers/caffe_softmax_layer.cpp rename src/caffe/layers/{softmax_layer.cu => caffe_softmax_layer.cu} (96%) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 37535920992..b3f698103ca 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -359,6 +359,31 @@ class SoftmaxLayer : public Layer<Dtype> { virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } + protected: + virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) = 0; + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) = 0; + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; +}; + +template <typename Dtype> +class CaffeSoftmaxLayer : public SoftmaxLayer<Dtype> { + public: + explicit CaffeSoftmaxLayer(const LayerParameter& param) + : SoftmaxLayer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_SOFTMAX; + } + virtual inline int ExactNumBottomBlobs() const { return 1; } + virtual inline int ExactNumTopBlobs() const { return 1; } + protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 555c06e4ed3..30a4c37ec83 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -567,8 +567,8 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { vector<Blob<Dtype>*> sigmoid_top_vec_; }; -// Forward declare SoftmaxLayer for use in SoftmaxWithLossLayer. -template <typename Dtype> class SoftmaxLayer; +// Forward declare CaffeSoftmaxLayer for use in SoftmaxWithLossLayer. +template <typename Dtype> class CaffeSoftmaxLayer; /** * @brief Computes the multinomial logistic loss for a one-of-many @@ -603,7 +603,7 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { public: explicit SoftmaxWithLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param), - softmax_layer_(new SoftmaxLayer<Dtype>(param)) {} + softmax_layer_(new CaffeSoftmaxLayer<Dtype>(param)) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); @@ -657,7 +657,7 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); /// The internal SoftmaxLayer used to map predictions to a distribution. - shared_ptr<SoftmaxLayer<Dtype> > softmax_layer_; + shared_ptr<CaffeSoftmaxLayer<Dtype> > softmax_layer_; /// prob stores the output probability predictions from the SoftmaxLayer. Blob<Dtype> prob_; /// bottom vector holder used in call to the underlying SoftmaxLayer::Forward diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 3a535f51ab1..afb530ae3a2 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -94,6 +94,23 @@ template TanHLayer<float>* GetTanHLayer(const string& name, template TanHLayer<double>* GetTanHLayer(const string& name, const LayerParameter& param); +// Get softmax layer according to engine. +template <typename Dtype> +SoftmaxLayer<Dtype>* GetSoftmaxLayer(const string& name, + const LayerParameter& param) { + SoftmaxParameter_Engine engine = param.softmax_param().engine(); + if (engine == SoftmaxParameter_Engine_CAFFE) { + return new CaffeSoftmaxLayer<Dtype>(param); + } else { + LOG(FATAL) << "Layer " << name << " has unknown engine."; + } +} + +template SoftmaxLayer<float>* GetSoftmaxLayer(const string& name, + const LayerParameter& param); +template SoftmaxLayer<double>* GetSoftmaxLayer(const string& name, + const LayerParameter& param); + // A function to get a specific layer from the specification given in // LayerParameter. Ideally this would be replaced by a factory pattern, // but we will leave it this way for now. @@ -163,7 +180,7 @@ Layer<Dtype>* GetLayer(const LayerParameter& param) { case LayerParameter_LayerType_SLICE: return new SliceLayer<Dtype>(param); case LayerParameter_LayerType_SOFTMAX: - return new SoftmaxLayer<Dtype>(param); + return GetSoftmaxLayer<Dtype>(name, param); case LayerParameter_LayerType_SOFTMAX_LOSS: return new SoftmaxWithLossLayer<Dtype>(param); case LayerParameter_LayerType_SPLIT: diff --git a/src/caffe/layers/caffe_softmax_layer.cpp b/src/caffe/layers/caffe_softmax_layer.cpp new file mode 100644 index 00000000000..64d027c8011 --- /dev/null +++ b/src/caffe/layers/caffe_softmax_layer.cpp @@ -0,0 +1,97 @@ +// +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CaffeSoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + SoftmaxLayer<Dtype>::LayerSetUp(bottom, top); + sum_multiplier_.Reshape(1, bottom[0]->channels(), 1, 1); + Dtype* multiplier_data = sum_multiplier_.mutable_cpu_data(); + for (int i = 0; i < sum_multiplier_.count(); ++i) { + multiplier_data[i] = 1.; + } + scale_.Reshape(bottom[0]->num(), 1, bottom[0]->height(), bottom[0]->width()); +} + +template <typename Dtype> +void CaffeSoftmaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* scale_data = scale_.mutable_cpu_data(); + int num = bottom[0]->num(); + int channels = bottom[0]->channels(); + int dim = bottom[0]->count() / bottom[0]->num(); + int spatial_dim = bottom[0]->height() * bottom[0]->width(); + caffe_copy(bottom[0]->count(), bottom_data, top_data); + // We need to subtract the max to avoid numerical issues, compute the exp, + // and then normalize. + for (int i = 0; i < num; ++i) { + // initialize scale_data to the first plane + caffe_copy(spatial_dim, bottom_data + i * dim, scale_data); + for (int j = 0; j < channels; j++) { + for (int k = 0; k < spatial_dim; k++) { + scale_data[k] = std::max(scale_data[k], + bottom_data[i * dim + j * spatial_dim + k]); + } + } + // subtraction + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, channels, spatial_dim, + 1, -1., sum_multiplier_.cpu_data(), scale_data, 1., top_data + i * dim); + // exponentiation + caffe_exp<Dtype>(dim, top_data + i * dim, top_data + i * dim); + // sum after exp + caffe_cpu_gemv<Dtype>(CblasTrans, channels, spatial_dim, 1., + top_data + i * dim, sum_multiplier_.cpu_data(), 0., scale_data); + // division + for (int j = 0; j < channels; j++) { + caffe_div(spatial_dim, top_data + (*top)[0]->offset(i, j), scale_data, + top_data + (*top)[0]->offset(i, j)); + } + } +} + +template <typename Dtype> +void CaffeSoftmaxLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, + vector<Blob<Dtype>*>* bottom) { + const Dtype* top_diff = top[0]->cpu_diff(); + const Dtype* top_data = top[0]->cpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* scale_data = scale_.mutable_cpu_data(); + int num = top[0]->num(); + int channels = top[0]->channels(); + int dim = top[0]->count() / top[0]->num(); + int spatial_dim = top[0]->height() * top[0]->width(); + caffe_copy(top[0]->count(), top_diff, bottom_diff); + for (int i = 0; i < num; ++i) { + // compute dot(top_diff, top_data) and subtract them from the bottom diff + for (int k = 0; k < spatial_dim; ++k) { + scale_data[k] = caffe_cpu_strided_dot<Dtype>(channels, + bottom_diff + i * dim + k, spatial_dim, + top_data + i * dim + k, spatial_dim); + } + // subtraction + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, channels, spatial_dim, 1, + -1., sum_multiplier_.cpu_data(), scale_data, 1., bottom_diff + i * dim); + } + // elementwise multiplication + caffe_mul(top[0]->count(), bottom_diff, top_data, bottom_diff); +} + + +#ifdef CPU_ONLY +STUB_GPU(CaffeSoftmaxLayer); +#endif + +INSTANTIATE_CLASS(CaffeSoftmaxLayer); + + +} // namespace caffe diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/caffe_softmax_layer.cu similarity index 96% rename from src/caffe/layers/softmax_layer.cu rename to src/caffe/layers/caffe_softmax_layer.cu index f97eafcedb0..74f6a7d16bc 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/caffe_softmax_layer.cu @@ -86,7 +86,7 @@ __global__ void kernel_channel_dot(const int num, const int channels, } template <typename Dtype> -void SoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, +void CaffeSoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -125,7 +125,7 @@ void SoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } template <typename Dtype> -void SoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void CaffeSoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* top_data = top[0]->gpu_data(); @@ -148,7 +148,6 @@ void SoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, caffe_gpu_mul<Dtype>(top[0]->count(), bottom_diff, top_data, bottom_diff); } -INSTANTIATE_CLASS(SoftmaxLayer); - +INSTANTIATE_CLASS(CaffeSoftmaxLayer); } // namespace caffe diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 29767ac775c..06b5e2b74a0 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -13,86 +13,8 @@ void SoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); - sum_multiplier_.Reshape(1, bottom[0]->channels(), 1, 1); - Dtype* multiplier_data = sum_multiplier_.mutable_cpu_data(); - for (int i = 0; i < sum_multiplier_.count(); ++i) { - multiplier_data[i] = 1.; - } - scale_.Reshape(bottom[0]->num(), 1, bottom[0]->height(), bottom[0]->width()); } -template <typename Dtype> -void SoftmaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - Dtype* scale_data = scale_.mutable_cpu_data(); - int num = bottom[0]->num(); - int channels = bottom[0]->channels(); - int dim = bottom[0]->count() / bottom[0]->num(); - int spatial_dim = bottom[0]->height() * bottom[0]->width(); - caffe_copy(bottom[0]->count(), bottom_data, top_data); - // We need to subtract the max to avoid numerical issues, compute the exp, - // and then normalize. - for (int i = 0; i < num; ++i) { - // initialize scale_data to the first plane - caffe_copy(spatial_dim, bottom_data + i * dim, scale_data); - for (int j = 0; j < channels; j++) { - for (int k = 0; k < spatial_dim; k++) { - scale_data[k] = std::max(scale_data[k], - bottom_data[i * dim + j * spatial_dim + k]); - } - } - // subtraction - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, channels, spatial_dim, - 1, -1., sum_multiplier_.cpu_data(), scale_data, 1., top_data + i * dim); - // exponentiation - caffe_exp<Dtype>(dim, top_data + i * dim, top_data + i * dim); - // sum after exp - caffe_cpu_gemv<Dtype>(CblasTrans, channels, spatial_dim, 1., - top_data + i * dim, sum_multiplier_.cpu_data(), 0., scale_data); - // division - for (int j = 0; j < channels; j++) { - caffe_div(spatial_dim, top_data + (*top)[0]->offset(i, j), scale_data, - top_data + (*top)[0]->offset(i, j)); - } - } -} - -template <typename Dtype> -void SoftmaxLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { - const Dtype* top_diff = top[0]->cpu_diff(); - const Dtype* top_data = top[0]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - Dtype* scale_data = scale_.mutable_cpu_data(); - int num = top[0]->num(); - int channels = top[0]->channels(); - int dim = top[0]->count() / top[0]->num(); - int spatial_dim = top[0]->height() * top[0]->width(); - caffe_copy(top[0]->count(), top_diff, bottom_diff); - for (int i = 0; i < num; ++i) { - // compute dot(top_diff, top_data) and subtract them from the bottom diff - for (int k = 0; k < spatial_dim; ++k) { - scale_data[k] = caffe_cpu_strided_dot<Dtype>(channels, - bottom_diff + i * dim + k, spatial_dim, - top_data + i * dim + k, spatial_dim); - } - // subtraction - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, channels, spatial_dim, 1, - -1., sum_multiplier_.cpu_data(), scale_data, 1., bottom_diff + i * dim); - } - // elementwise multiplication - caffe_mul(top[0]->count(), bottom_diff, top_data, bottom_diff); -} - - -#ifdef CPU_ONLY -STUB_GPU(SoftmaxLayer); -#endif - INSTANTIATE_CLASS(SoftmaxLayer); - } // namespace caffe diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index 9f45f762cdb..18c68b33915 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -40,7 +40,7 @@ TYPED_TEST_CASE(SoftmaxLayerTest, TestDtypesAndDevices); TYPED_TEST(SoftmaxLayerTest, TestForward) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - SoftmaxLayer<Dtype> layer(layer_param); + CaffeSoftmaxLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Test sum @@ -74,7 +74,7 @@ TYPED_TEST(SoftmaxLayerTest, TestForward) { TYPED_TEST(SoftmaxLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - SoftmaxLayer<Dtype> layer(layer_param); + CaffeSoftmaxLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); From 791243f4a0663690c3026d5062cb91ca2cf3408b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 22:21:33 -0700 Subject: [PATCH 0702/2053] grooming: drop pointless overrides, stub layer comments --- include/caffe/common_layers.hpp | 8 ++---- include/caffe/neuron_layers.hpp | 12 --------- include/caffe/vision_layers.hpp | 45 ++++++++------------------------- 3 files changed, 12 insertions(+), 53 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index b3f698103ca..3e3725bb4d3 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -370,6 +370,8 @@ class SoftmaxLayer : public Layer<Dtype> { const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; }; +/* CaffeSoftmaxLayer +*/ template <typename Dtype> class CaffeSoftmaxLayer : public SoftmaxLayer<Dtype> { public: @@ -378,12 +380,6 @@ class CaffeSoftmaxLayer : public SoftmaxLayer<Dtype> { virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SOFTMAX; - } - virtual inline int ExactNumBottomBlobs() const { return 1; } - virtual inline int ExactNumTopBlobs() const { return 1; } - protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index f1d8f51e247..883b122ec32 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -365,10 +365,6 @@ class CaffeReLULayer : public ReLULayer<Dtype> { explicit CaffeReLULayer(const LayerParameter& param) : ReLULayer<Dtype>(param) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_RELU; - } - protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); @@ -447,10 +443,6 @@ class CaffeSigmoidLayer : public SigmoidLayer<Dtype> { explicit CaffeSigmoidLayer(const LayerParameter& param) : SigmoidLayer<Dtype>(param) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SIGMOID; - } - protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); @@ -531,10 +523,6 @@ class CaffeTanHLayer : public TanHLayer<Dtype> { explicit CaffeTanHLayer(const LayerParameter& param) : TanHLayer<Dtype>(param) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_TANH; - } - protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 46df807fbd6..3143c33d57b 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -52,15 +52,15 @@ class ConvolutionLayer : public Layer<Dtype> { int num_; int channels_; int pad_h_, pad_w_; - int height_; - int width_; - int num_output_; + int height_, width_; int group_; + int num_output_; + int height_out_, width_out_; bool bias_term_; - int height_out_; - int width_out_; }; +/* CaffeConvolutionLayer +*/ template <typename Dtype> class CaffeConvolutionLayer : public ConvolutionLayer<Dtype> { public: @@ -69,13 +69,6 @@ class CaffeConvolutionLayer : public ConvolutionLayer<Dtype> { virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_CONVOLUTION; - } - virtual inline int MinBottomBlobs() const { return 1; } - virtual inline int MinTopBlobs() const { return 1; } - virtual inline bool EqualNumBottomTopBlobs() const { return true; } - protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); @@ -86,9 +79,7 @@ class CaffeConvolutionLayer : public ConvolutionLayer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); - int M_; - int K_; - int N_; + int M_, K_, N_; Blob<Dtype> col_buffer_; Blob<Dtype> bias_multiplier_; }; @@ -127,8 +118,7 @@ class Im2colLayer : public Layer<Dtype> { int kernel_h_, kernel_w_; int stride_h_, stride_w_; int channels_; - int height_; - int width_; + int height_, width_; int pad_h_, pad_w_; }; @@ -227,14 +217,6 @@ class PoolingLayer : public Layer<Dtype> { virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_POOLING; } - virtual inline int ExactNumBottomBlobs() const { return 1; } - virtual inline int MinTopBlobs() const { return 1; } - // MAX POOL layers can output an extra top blob for the mask; - // others can only output the pooled inputs. - virtual inline int MaxTopBlobs() const { - return (this->layer_param_.pooling_param().pool() == - PoolingParameter_PoolMethod_MAX) ? 2 : 1; - } protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, @@ -250,15 +232,11 @@ class PoolingLayer : public Layer<Dtype> { int stride_h_, stride_w_; int pad_h_, pad_w_; int channels_; - int height_; - int width_; - int pooled_height_; - int pooled_width_; - Blob<Dtype> rand_idx_; - Blob<int> max_idx_; + int height_, width_; + int pooled_height_, pooled_width_; }; -/* PoolingLayer +/* CaffePoolingLayer */ template <typename Dtype> class CaffePoolingLayer : public PoolingLayer<Dtype> { @@ -268,9 +246,6 @@ class CaffePoolingLayer : public PoolingLayer<Dtype> { virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_POOLING; - } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int MinTopBlobs() const { return 1; } // MAX POOL layers can output an extra top blob for the mask; From 347fdbd60999551286c75ac92d3b2d72bbec0d54 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 3 Sep 2014 15:47:35 -0700 Subject: [PATCH 0703/2053] default engine to Caffe according to compile flag --- src/caffe/layer_factory.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index afb530ae3a2..587d9207a23 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -14,6 +14,11 @@ template <typename Dtype> ConvolutionLayer<Dtype>* GetConvolutionLayer(const string& name, const LayerParameter& param) { ConvolutionParameter_Engine engine = param.convolution_param().engine(); + if (engine == ConvolutionParameter_Engine_DEFAULT) { +#ifdef CAFFE_ENGINE + engine = ConvolutionParameter_Engine_CAFFE; +#endif + } if (engine == ConvolutionParameter_Engine_CAFFE) { return new CaffeConvolutionLayer<Dtype>(param); } else { @@ -31,6 +36,11 @@ template <typename Dtype> PoolingLayer<Dtype>* GetPoolingLayer(const string& name, const LayerParameter& param) { PoolingParameter_Engine engine = param.pooling_param().engine(); + if (engine == PoolingParameter_Engine_DEFAULT) { +#ifdef CAFFE_ENGINE + engine = PoolingParameter_Engine_CAFFE; +#endif + } if (engine == PoolingParameter_Engine_CAFFE) { return new CaffePoolingLayer<Dtype>(param); } else { @@ -48,6 +58,11 @@ template <typename Dtype> ReLULayer<Dtype>* GetReLULayer(const string& name, const LayerParameter& param) { ReLUParameter_Engine engine = param.relu_param().engine(); + if (engine == ReLUParameter_Engine_DEFAULT) { +#ifdef CAFFE_ENGINE + engine = ReLUParameter_Engine_CAFFE; +#endif + } if (engine == ReLUParameter_Engine_CAFFE) { return new CaffeReLULayer<Dtype>(param); } else { @@ -65,6 +80,11 @@ template <typename Dtype> SigmoidLayer<Dtype>* GetSigmoidLayer(const string& name, const LayerParameter& param) { SigmoidParameter_Engine engine = param.sigmoid_param().engine(); + if (engine == SigmoidParameter_Engine_DEFAULT) { +#ifdef CAFFE_ENGINE + engine = SigmoidParameter_Engine_CAFFE; +#endif + } if (engine == SigmoidParameter_Engine_CAFFE) { return new CaffeSigmoidLayer<Dtype>(param); } else { @@ -82,6 +102,11 @@ template <typename Dtype> TanHLayer<Dtype>* GetTanHLayer(const string& name, const LayerParameter& param) { TanHParameter_Engine engine = param.tanh_param().engine(); + if (engine == TanHParameter_Engine_DEFAULT) { +#ifdef CAFFE_ENGINE + engine = TanHParameter_Engine_CAFFE; +#endif + } if (engine == TanHParameter_Engine_CAFFE) { return new CaffeTanHLayer<Dtype>(param); } else { @@ -99,6 +124,11 @@ template <typename Dtype> SoftmaxLayer<Dtype>* GetSoftmaxLayer(const string& name, const LayerParameter& param) { SoftmaxParameter_Engine engine = param.softmax_param().engine(); + if (engine == SoftmaxParameter_Engine_DEFAULT) { +#ifdef CAFFE_ENGINE + engine = SoftmaxParameter_Engine_CAFFE; +#endif + } if (engine == SoftmaxParameter_Engine_CAFFE) { return new CaffeSoftmaxLayer<Dtype>(param); } else { From d5605ec466e07fd9740a05a81877c82c02754da7 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 3 Sep 2014 17:14:59 -0700 Subject: [PATCH 0704/2053] default engine to Caffe in case config is missing --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 89f7347b9f4..41793a94edd 100644 --- a/Makefile +++ b/Makefile @@ -257,7 +257,8 @@ else COMMON_FLAGS += -DNDEBUG -O2 endif -# Computation engine configuration +# Computation engine configuration (default is standard Caffe) +ENGINE ?= caffe ifeq ($(ENGINE), caffe) COMMON_FLAGS += -DCAFFE_ENGINE endif From e05428f1af54324415723a92b3cc72907378e35f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 5 Sep 2014 19:16:55 -0700 Subject: [PATCH 0705/2053] revert engine switch for build to always include caffe engine --- Makefile | 6 ------ Makefile.config.example | 3 --- src/caffe/layer_factory.cpp | 12 ------------ 3 files changed, 21 deletions(-) diff --git a/Makefile b/Makefile index 41793a94edd..546de931f7e 100644 --- a/Makefile +++ b/Makefile @@ -257,12 +257,6 @@ else COMMON_FLAGS += -DNDEBUG -O2 endif -# Computation engine configuration (default is standard Caffe) -ENGINE ?= caffe -ifeq ($(ENGINE), caffe) - COMMON_FLAGS += -DCAFFE_ENGINE -endif - # CPU-only configuration ifeq ($(CPU_ONLY), 1) OBJS := $(PROTO_OBJS) $(CXX_OBJS) diff --git a/Makefile.config.example b/Makefile.config.example index 12c44477c11..7c96d8a9356 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -1,9 +1,6 @@ ## Refer to http://caffe.berkeleyvision.org/installation.html # Contributions simplifying and improving our build system are welcome! -# Computation engine switch: currently only the standard Caffe engine. -ENGINE := caffe - # CPU-only switch (uncomment to build without GPU support). # CPU_ONLY := 1 diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 587d9207a23..24eff754ff6 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -15,9 +15,7 @@ ConvolutionLayer<Dtype>* GetConvolutionLayer(const string& name, const LayerParameter& param) { ConvolutionParameter_Engine engine = param.convolution_param().engine(); if (engine == ConvolutionParameter_Engine_DEFAULT) { -#ifdef CAFFE_ENGINE engine = ConvolutionParameter_Engine_CAFFE; -#endif } if (engine == ConvolutionParameter_Engine_CAFFE) { return new CaffeConvolutionLayer<Dtype>(param); @@ -37,9 +35,7 @@ PoolingLayer<Dtype>* GetPoolingLayer(const string& name, const LayerParameter& param) { PoolingParameter_Engine engine = param.pooling_param().engine(); if (engine == PoolingParameter_Engine_DEFAULT) { -#ifdef CAFFE_ENGINE engine = PoolingParameter_Engine_CAFFE; -#endif } if (engine == PoolingParameter_Engine_CAFFE) { return new CaffePoolingLayer<Dtype>(param); @@ -59,9 +55,7 @@ ReLULayer<Dtype>* GetReLULayer(const string& name, const LayerParameter& param) { ReLUParameter_Engine engine = param.relu_param().engine(); if (engine == ReLUParameter_Engine_DEFAULT) { -#ifdef CAFFE_ENGINE engine = ReLUParameter_Engine_CAFFE; -#endif } if (engine == ReLUParameter_Engine_CAFFE) { return new CaffeReLULayer<Dtype>(param); @@ -81,9 +75,7 @@ SigmoidLayer<Dtype>* GetSigmoidLayer(const string& name, const LayerParameter& param) { SigmoidParameter_Engine engine = param.sigmoid_param().engine(); if (engine == SigmoidParameter_Engine_DEFAULT) { -#ifdef CAFFE_ENGINE engine = SigmoidParameter_Engine_CAFFE; -#endif } if (engine == SigmoidParameter_Engine_CAFFE) { return new CaffeSigmoidLayer<Dtype>(param); @@ -103,9 +95,7 @@ TanHLayer<Dtype>* GetTanHLayer(const string& name, const LayerParameter& param) { TanHParameter_Engine engine = param.tanh_param().engine(); if (engine == TanHParameter_Engine_DEFAULT) { -#ifdef CAFFE_ENGINE engine = TanHParameter_Engine_CAFFE; -#endif } if (engine == TanHParameter_Engine_CAFFE) { return new CaffeTanHLayer<Dtype>(param); @@ -125,9 +115,7 @@ SoftmaxLayer<Dtype>* GetSoftmaxLayer(const string& name, const LayerParameter& param) { SoftmaxParameter_Engine engine = param.softmax_param().engine(); if (engine == SoftmaxParameter_Engine_DEFAULT) { -#ifdef CAFFE_ENGINE engine = SoftmaxParameter_Engine_CAFFE; -#endif } if (engine == SoftmaxParameter_Engine_CAFFE) { return new CaffeSoftmaxLayer<Dtype>(param); From e922d119b2101ba40c7ab5e129260a6b0d7c8fe4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 5 Sep 2014 19:36:35 -0700 Subject: [PATCH 0706/2053] revert separate strategies: engines will extend the caffe standards --- include/caffe/common_layers.hpp | 21 -- include/caffe/loss_layers.hpp | 12 +- include/caffe/neuron_layers.hpp | 75 +----- include/caffe/vision_layers.hpp | 66 +---- src/caffe/layer_factory.cpp | 12 +- src/caffe/layers/caffe_conv_layer.cpp | 144 ----------- src/caffe/layers/caffe_pooling_layer.cpp | 230 ------------------ src/caffe/layers/caffe_softmax_layer.cpp | 97 -------- src/caffe/layers/conv_layer.cpp | 140 ++++++++++- .../{caffe_conv_layer.cu => conv_layer.cu} | 49 ++-- src/caffe/layers/lrn_layer.cpp | 2 +- src/caffe/layers/pooling_layer.cpp | 206 +++++++++++++++- ...affe_pooling_layer.cu => pooling_layer.cu} | 55 ++--- .../{caffe_relu_layer.cpp => relu_layer.cpp} | 10 +- .../{caffe_relu_layer.cu => relu_layer.cu} | 8 +- ...fe_sigmoid_layer.cpp => sigmoid_layer.cpp} | 8 +- ...affe_sigmoid_layer.cu => sigmoid_layer.cu} | 6 +- src/caffe/layers/softmax_layer.cpp | 78 ++++++ ...affe_softmax_layer.cu => softmax_layer.cu} | 7 +- .../{caffe_tanh_layer.cpp => tanh_layer.cpp} | 11 +- .../{caffe_tanh_layer.cu => tanh_layer.cu} | 10 +- src/caffe/test/test_convolution_layer.cpp | 18 +- .../test/test_maxpool_dropout_layers.cpp | 6 +- src/caffe/test/test_neuron_layer.cpp | 16 +- src/caffe/test/test_pooling_layer.cpp | 22 +- src/caffe/test/test_softmax_layer.cpp | 4 +- src/caffe/test/test_stochastic_pooling.cpp | 8 +- 27 files changed, 565 insertions(+), 756 deletions(-) delete mode 100644 src/caffe/layers/caffe_conv_layer.cpp delete mode 100644 src/caffe/layers/caffe_pooling_layer.cpp delete mode 100644 src/caffe/layers/caffe_softmax_layer.cpp rename src/caffe/layers/{caffe_conv_layer.cu => conv_layer.cu} (68%) rename src/caffe/layers/{caffe_pooling_layer.cu => pooling_layer.cu} (86%) rename src/caffe/layers/{caffe_relu_layer.cpp => relu_layer.cpp} (84%) rename src/caffe/layers/{caffe_relu_layer.cu => relu_layer.cu} (91%) rename src/caffe/layers/{caffe_sigmoid_layer.cpp => sigmoid_layer.cpp} (82%) rename src/caffe/layers/{caffe_sigmoid_layer.cu => sigmoid_layer.cu} (90%) rename src/caffe/layers/{caffe_softmax_layer.cu => softmax_layer.cu} (96%) rename src/caffe/layers/{caffe_tanh_layer.cpp => tanh_layer.cpp} (77%) rename src/caffe/layers/{caffe_tanh_layer.cu => tanh_layer.cu} (85%) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 3e3725bb4d3..37535920992 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -359,27 +359,6 @@ class SoftmaxLayer : public Layer<Dtype> { virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } - protected: - virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; - virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; - virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; - virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; -}; - -/* CaffeSoftmaxLayer -*/ -template <typename Dtype> -class CaffeSoftmaxLayer : public SoftmaxLayer<Dtype> { - public: - explicit CaffeSoftmaxLayer(const LayerParameter& param) - : SoftmaxLayer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 30a4c37ec83..a29c445d51e 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -506,7 +506,7 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { public: explicit SigmoidCrossEntropyLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param), - sigmoid_layer_(new CaffeSigmoidLayer<Dtype>(param)), + sigmoid_layer_(new SigmoidLayer<Dtype>(param)), sigmoid_output_(new Blob<Dtype>()) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); @@ -558,7 +558,7 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); /// The internal SigmoidLayer used to map predictions to probabilities. - shared_ptr<CaffeSigmoidLayer<Dtype> > sigmoid_layer_; + shared_ptr<SigmoidLayer<Dtype> > sigmoid_layer_; /// sigmoid_output stores the output of the SigmoidLayer. shared_ptr<Blob<Dtype> > sigmoid_output_; /// bottom vector holder to call the underlying SigmoidLayer::Forward @@ -567,8 +567,8 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { vector<Blob<Dtype>*> sigmoid_top_vec_; }; -// Forward declare CaffeSoftmaxLayer for use in SoftmaxWithLossLayer. -template <typename Dtype> class CaffeSoftmaxLayer; +// Forward declare SoftmaxLayer for use in SoftmaxWithLossLayer. +template <typename Dtype> class SoftmaxLayer; /** * @brief Computes the multinomial logistic loss for a one-of-many @@ -603,7 +603,7 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { public: explicit SoftmaxWithLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param), - softmax_layer_(new CaffeSoftmaxLayer<Dtype>(param)) {} + softmax_layer_(new SoftmaxLayer<Dtype>(param)) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); @@ -657,7 +657,7 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); /// The internal SoftmaxLayer used to map predictions to a distribution. - shared_ptr<CaffeSoftmaxLayer<Dtype> > softmax_layer_; + shared_ptr<SoftmaxLayer<Dtype> > softmax_layer_; /// prob stores the output probability predictions from the SoftmaxLayer. Blob<Dtype> prob_; /// bottom vector holder used in call to the underlying SoftmaxLayer::Forward diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 883b122ec32..8c882eec125 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -318,9 +318,9 @@ class ReLULayer : public NeuronLayer<Dtype> { * the computed outputs are @f$ y = \max(0, x) + \nu \min(0, x) @f$. */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; + vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; + vector<Blob<Dtype>*>* top); /** * @brief Computes the error gradient w.r.t. the ReLU inputs. @@ -350,27 +350,6 @@ class ReLULayer : public NeuronLayer<Dtype> { * \end{array} \right. * @f$. */ - virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; - virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; -}; - -/** - * @brief standard Caffe implementation of ReLULayer. - */ -template <typename Dtype> -class CaffeReLULayer : public ReLULayer<Dtype> { - public: - explicit CaffeReLULayer(const LayerParameter& param) - : ReLULayer<Dtype>(param) {} - - protected: - virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, @@ -407,9 +386,9 @@ class SigmoidLayer : public NeuronLayer<Dtype> { * @f$ */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; + vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; + vector<Blob<Dtype>*>* top); /** * @brief Computes the error gradient w.r.t. the sigmoid inputs. @@ -428,27 +407,6 @@ class SigmoidLayer : public NeuronLayer<Dtype> { * = \frac{\partial E}{\partial y} y (1 - y) * @f$ if propagate_down[0] */ - virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; - virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; -}; - -/** - * @brief standard Caffe implementation of SigmoidLayer. - */ -template <typename Dtype> -class CaffeSigmoidLayer : public SigmoidLayer<Dtype> { - public: - explicit CaffeSigmoidLayer(const LayerParameter& param) - : SigmoidLayer<Dtype>(param) {} - - protected: - virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, @@ -485,9 +443,9 @@ class TanHLayer : public NeuronLayer<Dtype> { * @f$ */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; + vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; + vector<Blob<Dtype>*>* top); /** * @brief Computes the error gradient w.r.t. the sigmoid inputs. @@ -508,27 +466,6 @@ class TanHLayer : public NeuronLayer<Dtype> { * = \frac{\partial E}{\partial y} (1 - y^2) * @f$ if propagate_down[0] */ - virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; - virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; -}; - -/** - * @brief standard Caffe implementation of TanHLayer. - */ -template <typename Dtype> -class CaffeTanHLayer : public TanHLayer<Dtype> { - public: - explicit CaffeTanHLayer(const LayerParameter& param) - : TanHLayer<Dtype>(param) {} - - protected: - virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 3143c33d57b..2dca2bf73ed 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -39,13 +39,13 @@ class ConvolutionLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; + vector<Blob<Dtype>*>* top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; + vector<Blob<Dtype>*>* top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); int kernel_h_, kernel_w_; int stride_h_, stride_w_; @@ -57,28 +57,7 @@ class ConvolutionLayer : public Layer<Dtype> { int num_output_; int height_out_, width_out_; bool bias_term_; -}; - -/* CaffeConvolutionLayer -*/ -template <typename Dtype> -class CaffeConvolutionLayer : public ConvolutionLayer<Dtype> { - public: - explicit CaffeConvolutionLayer(const LayerParameter& param) - : ConvolutionLayer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - - protected: - virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); - virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); - + // For the Caffe matrix multiplication convolution. int M_, K_, N_; Blob<Dtype> col_buffer_; Blob<Dtype> bias_multiplier_; @@ -217,35 +196,6 @@ class PoolingLayer : public Layer<Dtype> { virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_POOLING; } - - protected: - virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; - virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; - virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; - virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) = 0; - - int kernel_h_, kernel_w_; - int stride_h_, stride_w_; - int pad_h_, pad_w_; - int channels_; - int height_, width_; - int pooled_height_, pooled_width_; -}; - -/* CaffePoolingLayer -*/ -template <typename Dtype> -class CaffePoolingLayer : public PoolingLayer<Dtype> { - public: - explicit CaffePoolingLayer(const LayerParameter& param) - : PoolingLayer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); - virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int MinTopBlobs() const { return 1; } // MAX POOL layers can output an extra top blob for the mask; @@ -265,6 +215,12 @@ class CaffePoolingLayer : public PoolingLayer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + int kernel_h_, kernel_w_; + int stride_h_, stride_w_; + int pad_h_, pad_w_; + int channels_; + int height_, width_; + int pooled_height_, pooled_width_; Blob<Dtype> rand_idx_; Blob<int> max_idx_; }; diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 24eff754ff6..09b0f900d95 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -18,7 +18,7 @@ ConvolutionLayer<Dtype>* GetConvolutionLayer(const string& name, engine = ConvolutionParameter_Engine_CAFFE; } if (engine == ConvolutionParameter_Engine_CAFFE) { - return new CaffeConvolutionLayer<Dtype>(param); + return new ConvolutionLayer<Dtype>(param); } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } @@ -38,7 +38,7 @@ PoolingLayer<Dtype>* GetPoolingLayer(const string& name, engine = PoolingParameter_Engine_CAFFE; } if (engine == PoolingParameter_Engine_CAFFE) { - return new CaffePoolingLayer<Dtype>(param); + return new PoolingLayer<Dtype>(param); } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } @@ -58,7 +58,7 @@ ReLULayer<Dtype>* GetReLULayer(const string& name, engine = ReLUParameter_Engine_CAFFE; } if (engine == ReLUParameter_Engine_CAFFE) { - return new CaffeReLULayer<Dtype>(param); + return new ReLULayer<Dtype>(param); } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } @@ -78,7 +78,7 @@ SigmoidLayer<Dtype>* GetSigmoidLayer(const string& name, engine = SigmoidParameter_Engine_CAFFE; } if (engine == SigmoidParameter_Engine_CAFFE) { - return new CaffeSigmoidLayer<Dtype>(param); + return new SigmoidLayer<Dtype>(param); } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } @@ -98,7 +98,7 @@ TanHLayer<Dtype>* GetTanHLayer(const string& name, engine = TanHParameter_Engine_CAFFE; } if (engine == TanHParameter_Engine_CAFFE) { - return new CaffeTanHLayer<Dtype>(param); + return new TanHLayer<Dtype>(param); } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } @@ -118,7 +118,7 @@ SoftmaxLayer<Dtype>* GetSoftmaxLayer(const string& name, engine = SoftmaxParameter_Engine_CAFFE; } if (engine == SoftmaxParameter_Engine_CAFFE) { - return new CaffeSoftmaxLayer<Dtype>(param); + return new SoftmaxLayer<Dtype>(param); } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } diff --git a/src/caffe/layers/caffe_conv_layer.cpp b/src/caffe/layers/caffe_conv_layer.cpp deleted file mode 100644 index 759a06ee9f0..00000000000 --- a/src/caffe/layers/caffe_conv_layer.cpp +++ /dev/null @@ -1,144 +0,0 @@ -#include <vector> - -#include "caffe/filler.hpp" -#include "caffe/layer.hpp" -#include "caffe/util/im2col.hpp" -#include "caffe/util/math_functions.hpp" -#include "caffe/vision_layers.hpp" - -namespace caffe { - -template <typename Dtype> -void CaffeConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& - bottom, vector<Blob<Dtype>*>* top) { - ConvolutionLayer<Dtype>::LayerSetUp(bottom, top); - // Figure out the dimensions for individual gemms. - M_ = this->num_output_ / this->group_; - K_ = this->channels_ * this->kernel_h_ * this->kernel_w_ / this->group_; - N_ = this->height_out_ * this->width_out_; - // The im2col result buffer would only hold one image at a time to avoid - // overly large memory usage. - col_buffer_.Reshape(1, this->channels_ * this->kernel_h_ * this->kernel_w_, - this->height_out_, this->width_out_); - // Set up the all ones "bias multiplier" for adding bias using blas - if (this->bias_term_) { - bias_multiplier_.Reshape(1, 1, 1, N_); - caffe_set(N_, Dtype(1), bias_multiplier_.mutable_cpu_data()); - } -} - -template <typename Dtype> -void CaffeConvolutionLayer<Dtype>::Forward_cpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - for (int i = 0; i < bottom.size(); ++i) { - const Dtype* bottom_data = bottom[i]->cpu_data(); - Dtype* top_data = (*top)[i]->mutable_cpu_data(); - Dtype* col_data = col_buffer_.mutable_cpu_data(); - const Dtype* weight = this->blobs_[0]->cpu_data(); - int weight_offset = M_ * K_; - int col_offset = K_ * N_; - int top_offset = M_ * N_; - for (int n = 0; n < this->num_; ++n) { - // First, im2col - im2col_cpu(bottom_data + bottom[i]->offset(n), this->channels_, - this->height_, this->width_, this->kernel_h_, this->kernel_w_, - this->pad_h_, this->pad_w_, this->stride_h_, this->stride_w_, - col_data); - // Second, innerproduct with groups - for (int g = 0; g < this->group_; ++g) { - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, - (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, - (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); - } - // third, add bias - if (this->bias_term_) { - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, this->num_output_, - N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), - bias_multiplier_.cpu_data(), - (Dtype)1., top_data + (*top)[i]->offset(n)); - } - } - } -} - -template <typename Dtype> -void CaffeConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { - const Dtype* weight = NULL; - Dtype* weight_diff = NULL; - if (this->param_propagate_down_[0]) { - weight = this->blobs_[0]->cpu_data(); - weight_diff = this->blobs_[0]->mutable_cpu_diff(); - caffe_set(this->blobs_[0]->count(), Dtype(0), weight_diff); - } - Dtype* bias_diff = NULL; - if (this->bias_term_ && this->param_propagate_down_[1]) { - bias_diff = this->blobs_[1]->mutable_cpu_diff(); - caffe_set(this->blobs_[1]->count(), Dtype(0), bias_diff); - } - const int weight_offset = M_ * K_; - const int col_offset = K_ * N_; - const int top_offset = M_ * N_; - for (int i = 0; i < top.size(); ++i) { - const Dtype* top_diff = NULL; - // Bias gradient, if necessary. - if (this->bias_term_ && this->param_propagate_down_[1]) { - top_diff = top[i]->cpu_diff(); - for (int n = 0; n < this->num_; ++n) { - caffe_cpu_gemv<Dtype>(CblasNoTrans, this->num_output_, N_, - 1., top_diff + top[0]->offset(n), - bias_multiplier_.cpu_data(), 1., - bias_diff); - } - } - if (this->param_propagate_down_[0] || propagate_down[i]) { - if (!top_diff) { - top_diff = top[i]->cpu_diff(); - } - Dtype* col_data = col_buffer_.mutable_cpu_data(); - Dtype* col_diff = col_buffer_.mutable_cpu_diff(); - const Dtype* bottom_data = (*bottom)[i]->cpu_data(); - Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); - for (int n = 0; n < this->num_; ++n) { - // Since we saved memory in the forward pass by not storing all col - // data, we will need to recompute them. - im2col_cpu(bottom_data + (*bottom)[i]->offset(n), this->channels_, - this->height_, this->width_, this->kernel_h_, this->kernel_w_, - this->pad_h_, this->pad_w_, this->stride_h_, this->stride_w_, - col_data); - // gradient w.r.t. weight. Note that we will accumulate diffs. - if (this->param_propagate_down_[0]) { - for (int g = 0; g < this->group_; ++g) { - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, K_, N_, - (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, - col_data + col_offset * g, (Dtype)1., - weight_diff + weight_offset * g); - } - } - // gradient w.r.t. bottom data, if necessary - if (propagate_down[i]) { - for (int g = 0; g < this->group_; ++g) { - caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, - (Dtype)1., weight + weight_offset * g, - top_diff + top[i]->offset(n) + top_offset * g, - (Dtype)0., col_diff + col_offset * g); - } - // col2im back to the data - col2im_cpu(col_diff, this->channels_, this->height_, this->width_, - this->kernel_h_, this->kernel_w_, this->pad_h_, this->pad_w_, - this->stride_h_, this->stride_w_, bottom_diff + - (*bottom)[i]->offset(n)); - } - } - } - } -} - -#ifdef CPU_ONLY -STUB_GPU(CaffeConvolutionLayer); -#endif - -INSTANTIATE_CLASS(CaffeConvolutionLayer); - -} // namespace caffe - diff --git a/src/caffe/layers/caffe_pooling_layer.cpp b/src/caffe/layers/caffe_pooling_layer.cpp deleted file mode 100644 index 5756b740159..00000000000 --- a/src/caffe/layers/caffe_pooling_layer.cpp +++ /dev/null @@ -1,230 +0,0 @@ -#include <algorithm> -#include <cfloat> -#include <vector> - -#include "caffe/common.hpp" -#include "caffe/layer.hpp" -#include "caffe/syncedmem.hpp" -#include "caffe/util/math_functions.hpp" -#include "caffe/vision_layers.hpp" - -namespace caffe { - -using std::min; -using std::max; - -template <typename Dtype> -void CaffePoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - PoolingLayer<Dtype>::LayerSetUp(bottom, top); - PoolingParameter pool_param = this->layer_param_.pooling_param(); - // If max pooling, we will initialize the vector index part. - if (this->layer_param_.pooling_param().pool() == - PoolingParameter_PoolMethod_MAX && top->size() == 1) { - max_idx_.Reshape(bottom[0]->num(), this->channels_, this->pooled_height_, - this->pooled_width_); - } - // If stochastic pooling, we will initialize the random index part. - if (this->layer_param_.pooling_param().pool() == - PoolingParameter_PoolMethod_STOCHASTIC) { - rand_idx_.Reshape(bottom[0]->num(), this->channels_, this->pooled_height_, - this->pooled_width_); - } -} - -// TODO(Yangqing): Is there a faster way to do pooling in the channel-first -// case? -template <typename Dtype> -void CaffePoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - const int top_count = (*top)[0]->count(); - // We'll output the mask to top[1] if it's of size >1. - const bool use_top_mask = top->size() > 1; - int* mask = NULL; // suppress warnings about uninitalized variables - Dtype* top_mask = NULL; - // Different pooling methods. We explicitly do the switch outside the for - // loop to save time, although this results in more code. - switch (this->layer_param_.pooling_param().pool()) { - case PoolingParameter_PoolMethod_MAX: - // Initialize - if (use_top_mask) { - top_mask = (*top)[1]->mutable_cpu_data(); - caffe_set(top_count, Dtype(-1), top_mask); - } else { - mask = max_idx_.mutable_cpu_data(); - caffe_set(top_count, -1, mask); - } - caffe_set(top_count, Dtype(-FLT_MAX), top_data); - // The main loop - for (int n = 0; n < bottom[0]->num(); ++n) { - for (int c = 0; c < this->channels_; ++c) { - for (int ph = 0; ph < this->pooled_height_; ++ph) { - for (int pw = 0; pw < this->pooled_width_; ++pw) { - int hstart = ph * this->stride_h_ - this->pad_h_; - int wstart = pw * this->stride_w_ - this->pad_w_; - int hend = min(hstart + this->kernel_h_, this->height_); - int wend = min(wstart + this->kernel_w_, this->width_); - hstart = max(hstart, 0); - wstart = max(wstart, 0); - const int pool_index = ph * this->pooled_width_ + pw; - for (int h = hstart; h < hend; ++h) { - for (int w = wstart; w < wend; ++w) { - const int index = h * this->width_ + w; - if (bottom_data[index] > top_data[pool_index]) { - top_data[pool_index] = bottom_data[index]; - if (use_top_mask) { - top_mask[pool_index] = static_cast<Dtype>(index); - } else { - mask[pool_index] = index; - } - } - } - } - } - } - // compute offset - bottom_data += bottom[0]->offset(0, 1); - top_data += (*top)[0]->offset(0, 1); - if (use_top_mask) { - top_mask += (*top)[0]->offset(0, 1); - } else { - mask += (*top)[0]->offset(0, 1); - } - } - } - break; - case PoolingParameter_PoolMethod_AVE: - for (int i = 0; i < top_count; ++i) { - top_data[i] = 0; - } - // The main loop - for (int n = 0; n < bottom[0]->num(); ++n) { - for (int c = 0; c < this->channels_; ++c) { - for (int ph = 0; ph < this->pooled_height_; ++ph) { - for (int pw = 0; pw < this->pooled_width_; ++pw) { - int hstart = ph * this->stride_h_ - this->pad_h_; - int wstart = pw * this->stride_w_ - this->pad_w_; - int hend = min(hstart + this->kernel_h_, - this->height_ + this->pad_h_); - int wend = min(wstart + this->kernel_w_, - this->width_ + this->pad_w_); - int pool_size = (hend - hstart) * (wend - wstart); - hstart = max(hstart, 0); - wstart = max(wstart, 0); - hend = min(hend, this->height_); - wend = min(wend, this->width_); - for (int h = hstart; h < hend; ++h) { - for (int w = wstart; w < wend; ++w) { - top_data[ph * this->pooled_width_ + pw] += - bottom_data[h * this->width_ + w]; - } - } - top_data[ph * this->pooled_width_ + pw] /= pool_size; - } - } - // compute offset - bottom_data += bottom[0]->offset(0, 1); - top_data += (*top)[0]->offset(0, 1); - } - } - break; - case PoolingParameter_PoolMethod_STOCHASTIC: - NOT_IMPLEMENTED; - break; - default: - LOG(FATAL) << "Unknown pooling method."; - } -} - -template <typename Dtype> -void CaffePoolingLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { - if (!propagate_down[0]) { - return; - } - const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - // Different pooling methods. We explicitly do the switch outside the for - // loop to save time, although this results in more codes. - caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); - // We'll output the mask to top[1] if it's of size >1. - const bool use_top_mask = top.size() > 1; - const int* mask = NULL; // suppress warnings about uninitialized variables - const Dtype* top_mask = NULL; - switch (this->layer_param_.pooling_param().pool()) { - case PoolingParameter_PoolMethod_MAX: - // The main loop - if (use_top_mask) { - top_mask = top[1]->cpu_data(); - } else { - mask = max_idx_.cpu_data(); - } - for (int n = 0; n < top[0]->num(); ++n) { - for (int c = 0; c < this->channels_; ++c) { - for (int ph = 0; ph < this->pooled_height_; ++ph) { - for (int pw = 0; pw < this->pooled_width_; ++pw) { - const int index = ph * this->pooled_width_ + pw; - const int bottom_index = - use_top_mask ? top_mask[index] : mask[index]; - bottom_diff[bottom_index] += top_diff[index]; - } - } - bottom_diff += (*bottom)[0]->offset(0, 1); - top_diff += top[0]->offset(0, 1); - if (use_top_mask) { - top_mask += top[0]->offset(0, 1); - } else { - mask += top[0]->offset(0, 1); - } - } - } - break; - case PoolingParameter_PoolMethod_AVE: - // The main loop - for (int n = 0; n < top[0]->num(); ++n) { - for (int c = 0; c < this->channels_; ++c) { - for (int ph = 0; ph < this->pooled_height_; ++ph) { - for (int pw = 0; pw < this->pooled_width_; ++pw) { - int hstart = ph * this->stride_h_ - this->pad_h_; - int wstart = pw * this->stride_w_ - this->pad_w_; - int hend = min(hstart + this->kernel_h_, - this->height_ + this->pad_h_); - int wend = min(wstart + this->kernel_w_, - this->width_ + this->pad_w_); - int pool_size = (hend - hstart) * (wend - wstart); - hstart = max(hstart, 0); - wstart = max(wstart, 0); - hend = min(hend, this->height_); - wend = min(wend, this->width_); - for (int h = hstart; h < hend; ++h) { - for (int w = wstart; w < wend; ++w) { - bottom_diff[h * this->width_ + w] += - top_diff[ph * this->pooled_width_ + pw] / pool_size; - } - } - } - } - // offset - bottom_diff += (*bottom)[0]->offset(0, 1); - top_diff += top[0]->offset(0, 1); - } - } - break; - case PoolingParameter_PoolMethod_STOCHASTIC: - NOT_IMPLEMENTED; - break; - default: - LOG(FATAL) << "Unknown pooling method."; - } -} - -#ifdef CPU_ONLY -STUB_GPU(CaffePoolingLayer); -#endif - -INSTANTIATE_CLASS(CaffePoolingLayer); - -} // namespace caffe - diff --git a/src/caffe/layers/caffe_softmax_layer.cpp b/src/caffe/layers/caffe_softmax_layer.cpp deleted file mode 100644 index 64d027c8011..00000000000 --- a/src/caffe/layers/caffe_softmax_layer.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// -#include <algorithm> -#include <vector> - -#include "caffe/layer.hpp" -#include "caffe/util/math_functions.hpp" -#include "caffe/vision_layers.hpp" - -namespace caffe { - -template <typename Dtype> -void CaffeSoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - SoftmaxLayer<Dtype>::LayerSetUp(bottom, top); - sum_multiplier_.Reshape(1, bottom[0]->channels(), 1, 1); - Dtype* multiplier_data = sum_multiplier_.mutable_cpu_data(); - for (int i = 0; i < sum_multiplier_.count(); ++i) { - multiplier_data[i] = 1.; - } - scale_.Reshape(bottom[0]->num(), 1, bottom[0]->height(), bottom[0]->width()); -} - -template <typename Dtype> -void CaffeSoftmaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - Dtype* scale_data = scale_.mutable_cpu_data(); - int num = bottom[0]->num(); - int channels = bottom[0]->channels(); - int dim = bottom[0]->count() / bottom[0]->num(); - int spatial_dim = bottom[0]->height() * bottom[0]->width(); - caffe_copy(bottom[0]->count(), bottom_data, top_data); - // We need to subtract the max to avoid numerical issues, compute the exp, - // and then normalize. - for (int i = 0; i < num; ++i) { - // initialize scale_data to the first plane - caffe_copy(spatial_dim, bottom_data + i * dim, scale_data); - for (int j = 0; j < channels; j++) { - for (int k = 0; k < spatial_dim; k++) { - scale_data[k] = std::max(scale_data[k], - bottom_data[i * dim + j * spatial_dim + k]); - } - } - // subtraction - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, channels, spatial_dim, - 1, -1., sum_multiplier_.cpu_data(), scale_data, 1., top_data + i * dim); - // exponentiation - caffe_exp<Dtype>(dim, top_data + i * dim, top_data + i * dim); - // sum after exp - caffe_cpu_gemv<Dtype>(CblasTrans, channels, spatial_dim, 1., - top_data + i * dim, sum_multiplier_.cpu_data(), 0., scale_data); - // division - for (int j = 0; j < channels; j++) { - caffe_div(spatial_dim, top_data + (*top)[0]->offset(i, j), scale_data, - top_data + (*top)[0]->offset(i, j)); - } - } -} - -template <typename Dtype> -void CaffeSoftmaxLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { - const Dtype* top_diff = top[0]->cpu_diff(); - const Dtype* top_data = top[0]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - Dtype* scale_data = scale_.mutable_cpu_data(); - int num = top[0]->num(); - int channels = top[0]->channels(); - int dim = top[0]->count() / top[0]->num(); - int spatial_dim = top[0]->height() * top[0]->width(); - caffe_copy(top[0]->count(), top_diff, bottom_diff); - for (int i = 0; i < num; ++i) { - // compute dot(top_diff, top_data) and subtract them from the bottom diff - for (int k = 0; k < spatial_dim; ++k) { - scale_data[k] = caffe_cpu_strided_dot<Dtype>(channels, - bottom_diff + i * dim + k, spatial_dim, - top_data + i * dim + k, spatial_dim); - } - // subtraction - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, channels, spatial_dim, 1, - -1., sum_multiplier_.cpu_data(), scale_data, 1., bottom_diff + i * dim); - } - // elementwise multiplication - caffe_mul(top[0]->count(), bottom_diff, top_data, bottom_diff); -} - - -#ifdef CPU_ONLY -STUB_GPU(CaffeSoftmaxLayer); -#endif - -INSTANTIATE_CLASS(CaffeSoftmaxLayer); - - -} // namespace caffe diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index a2ab13301e6..1a1248f3dda 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -46,7 +46,7 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, stride_h_ = conv_param.stride_h(); stride_w_ = conv_param.stride_w(); } - group_ = conv_param.group(); + group_ = this->layer_param_.convolution_param().group(); num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); @@ -61,18 +61,26 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK_EQ(width_, bottom[bottom_id]->width()) << "Inputs must have same width."; } - num_output_ = conv_param.num_output(); + num_output_ = this->layer_param_.convolution_param().num_output(); CHECK_GT(num_output_, 0); CHECK_EQ(channels_ % group_, 0); - // Calculate output dimensions. - height_out_ = (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; - width_out_ = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; + // The im2col result buffer would only hold one image at a time to avoid + // overly large memory usage. + int height_out = + (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; + int width_out = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; + col_buffer_.Reshape( + 1, channels_ * kernel_h_ * kernel_w_, height_out, width_out); // Set the parameters CHECK_EQ(num_output_ % group_, 0) << "Number of output should be multiples of group."; - bias_term_ = conv_param.bias_term(); + bias_term_ = this->layer_param_.convolution_param().bias_term(); + // Figure out the dimensions for individual gemms. + M_ = num_output_ / group_; + K_ = channels_ * kernel_h_ * kernel_w_ / group_; + N_ = height_out * width_out; for (int top_id = 0; top_id < top->size(); ++top_id) { - (*top)[top_id]->Reshape(num_, num_output_, height_out_, width_out_); + (*top)[top_id]->Reshape(num_, num_output_, height_out, width_out); } // Check if we need to set up the weights if (this->blobs_.size() > 0) { @@ -88,19 +96,133 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, num_output_, channels_ / group_, kernel_h_, kernel_w_)); // fill the weights shared_ptr<Filler<Dtype> > weight_filler(GetFiller<Dtype>( - conv_param.weight_filler())); + this->layer_param_.convolution_param().weight_filler())); weight_filler->Fill(this->blobs_[0].get()); // If necessary, initialize and fill the bias term if (bias_term_) { this->blobs_[1].reset(new Blob<Dtype>(1, 1, 1, num_output_)); shared_ptr<Filler<Dtype> > bias_filler(GetFiller<Dtype>( - conv_param.bias_filler())); + this->layer_param_.convolution_param().bias_filler())); bias_filler->Fill(this->blobs_[1].get()); } } + // Set up the all ones "bias multiplier" for adding bias using blas + if (bias_term_) { + bias_multiplier_.Reshape(1, 1, 1, N_); + caffe_set(N_, Dtype(1), bias_multiplier_.mutable_cpu_data()); + } this->param_propagate_down_.resize(this->blobs_.size(), true); } + +template <typename Dtype> +void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->cpu_data(); + Dtype* top_data = (*top)[i]->mutable_cpu_data(); + Dtype* col_data = col_buffer_.mutable_cpu_data(); + const Dtype* weight = this->blobs_[0]->cpu_data(); + int weight_offset = M_ * K_; + int col_offset = K_ * N_; + int top_offset = M_ * N_; + for (int n = 0; n < num_; ++n) { + // First, im2col + im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, + col_data); + // Second, innerproduct with groups + for (int g = 0; g < group_; ++g) { + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, + (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, + (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); + } + // third, add bias + if (bias_term_) { + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, + N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), + bias_multiplier_.cpu_data(), + (Dtype)1., top_data + (*top)[i]->offset(n)); + } + } + } +} + +template <typename Dtype> +void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const Dtype* weight = NULL; + Dtype* weight_diff = NULL; + if (this->param_propagate_down_[0]) { + weight = this->blobs_[0]->cpu_data(); + weight_diff = this->blobs_[0]->mutable_cpu_diff(); + caffe_set(this->blobs_[0]->count(), Dtype(0), weight_diff); + } + Dtype* bias_diff = NULL; + if (bias_term_ && this->param_propagate_down_[1]) { + bias_diff = this->blobs_[1]->mutable_cpu_diff(); + caffe_set(this->blobs_[1]->count(), Dtype(0), bias_diff); + } + const int weight_offset = M_ * K_; + const int col_offset = K_ * N_; + const int top_offset = M_ * N_; + for (int i = 0; i < top.size(); ++i) { + const Dtype* top_diff = NULL; + // Bias gradient, if necessary. + if (bias_term_ && this->param_propagate_down_[1]) { + top_diff = top[i]->cpu_diff(); + for (int n = 0; n < num_; ++n) { + caffe_cpu_gemv<Dtype>(CblasNoTrans, num_output_, N_, + 1., top_diff + top[0]->offset(n), + bias_multiplier_.cpu_data(), 1., + bias_diff); + } + } + if (this->param_propagate_down_[0] || propagate_down[i]) { + if (!top_diff) { + top_diff = top[i]->cpu_diff(); + } + Dtype* col_data = col_buffer_.mutable_cpu_data(); + Dtype* col_diff = col_buffer_.mutable_cpu_diff(); + const Dtype* bottom_data = (*bottom)[i]->cpu_data(); + Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); + for (int n = 0; n < num_; ++n) { + // Since we saved memory in the forward pass by not storing all col + // data, we will need to recompute them. + im2col_cpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, col_data); + // gradient w.r.t. weight. Note that we will accumulate diffs. + if (this->param_propagate_down_[0]) { + for (int g = 0; g < group_; ++g) { + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, K_, N_, + (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, + col_data + col_offset * g, (Dtype)1., + weight_diff + weight_offset * g); + } + } + // gradient w.r.t. bottom data, if necessary + if (propagate_down[i]) { + for (int g = 0; g < group_; ++g) { + caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, + (Dtype)1., weight + weight_offset * g, + top_diff + top[i]->offset(n) + top_offset * g, + (Dtype)0., col_diff + col_offset * g); + } + // col2im back to the data + col2im_cpu(col_diff, channels_, height_, width_, + kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, bottom_diff + (*bottom)[i]->offset(n)); + } + } + } + } +} + +#ifdef CPU_ONLY +STUB_GPU(ConvolutionLayer); +#endif + INSTANTIATE_CLASS(ConvolutionLayer); } // namespace caffe diff --git a/src/caffe/layers/caffe_conv_layer.cu b/src/caffe/layers/conv_layer.cu similarity index 68% rename from src/caffe/layers/caffe_conv_layer.cu rename to src/caffe/layers/conv_layer.cu index 44a9f9737ab..f7f393badba 100644 --- a/src/caffe/layers/caffe_conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -9,8 +9,8 @@ namespace caffe { template <typename Dtype> -void CaffeConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& - bottom, vector<Blob<Dtype>*>* top) { +void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); Dtype* top_data = (*top)[i]->mutable_gpu_data(); @@ -19,21 +19,20 @@ void CaffeConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& int weight_offset = M_ * K_; int col_offset = K_ * N_; int top_offset = M_ * N_; - for (int n = 0; n < this->num_; ++n) { + for (int n = 0; n < num_; ++n) { // First, im2col - im2col_gpu(bottom_data + bottom[i]->offset(n), this->channels_, - this->height_, this->width_, this->kernel_h_, this->kernel_w_, - this->pad_h_, this->pad_w_, this->stride_h_, this->stride_w_, + im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_data); // Second, innerproduct with groups - for (int g = 0; g < this->group_; ++g) { + for (int g = 0; g < group_; ++g) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); } // third, add bias - if (this->bias_term_) { - caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, this->num_output_, + if (bias_term_) { + caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), bias_multiplier_.gpu_data(), (Dtype)1., top_data + (*top)[i]->offset(n)); @@ -43,7 +42,7 @@ void CaffeConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& } template <typename Dtype> -void CaffeConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { const Dtype* weight = NULL; Dtype* weight_diff = NULL; @@ -53,7 +52,7 @@ void CaffeConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, caffe_gpu_set(this->blobs_[0]->count(), Dtype(0), weight_diff); } Dtype* bias_diff = NULL; - if (this->bias_term_ && this->param_propagate_down_[1]) { + if (bias_term_ && this->param_propagate_down_[1]) { bias_diff = this->blobs_[1]->mutable_gpu_diff(); caffe_gpu_set(this->blobs_[1]->count(), Dtype(0), bias_diff); } @@ -63,10 +62,10 @@ void CaffeConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, for (int i = 0; i < top.size(); ++i) { const Dtype* top_diff = NULL; // Bias gradient, if necessary. - if (this->bias_term_ && this->param_propagate_down_[1]) { + if (bias_term_ && this->param_propagate_down_[1]) { top_diff = top[i]->gpu_diff(); - for (int n = 0; n < this->num_; ++n) { - caffe_gpu_gemv<Dtype>(CblasNoTrans, this->num_output_, N_, + for (int n = 0; n < num_; ++n) { + caffe_gpu_gemv<Dtype>(CblasNoTrans, num_output_, N_, 1., top_diff + top[0]->offset(n), bias_multiplier_.gpu_data(), 1., bias_diff); @@ -80,16 +79,15 @@ void CaffeConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, Dtype* col_diff = col_buffer_.mutable_gpu_diff(); const Dtype* bottom_data = (*bottom)[i]->gpu_data(); Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); - for (int n = 0; n < this->num_; ++n) { + for (int n = 0; n < num_; ++n) { // Since we saved memory in the forward pass by not storing all col // data, we will need to recompute them. - im2col_gpu(bottom_data + (*bottom)[i]->offset(n), this->channels_, - this->height_, this->width_, this->kernel_h_, this->kernel_w_, - this->pad_h_, this->pad_w_, this->stride_h_, this->stride_w_, - col_data); + im2col_gpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, col_data); // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { - for (int g = 0; g < this->group_; ++g) { + for (int g = 0; g < group_; ++g) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, K_, N_, (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, col_data + col_offset * g, (Dtype)1., @@ -98,17 +96,16 @@ void CaffeConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } // gradient w.r.t. bottom data, if necessary if (propagate_down[i]) { - for (int g = 0; g < this->group_; ++g) { + for (int g = 0; g < group_; ++g) { caffe_gpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, (Dtype)1., weight + weight_offset * g, top_diff + top[i]->offset(n) + top_offset * g, (Dtype)0., col_diff + col_offset * g); } // col2im back to the data - col2im_gpu(col_diff, this->channels_, this->height_, this->width_, - this->kernel_h_, this->kernel_w_, this->pad_h_, this->pad_w_, - this->stride_h_, this->stride_w_, bottom_diff + - (*bottom)[i]->offset(n)); + col2im_gpu(col_diff, channels_, height_, width_, + kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, + bottom_diff + (*bottom)[i]->offset(n)); } } } @@ -116,6 +113,6 @@ void CaffeConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } -INSTANTIATE_CLASS(CaffeConvolutionLayer); +INSTANTIATE_CLASS(ConvolutionLayer); } // namespace caffe diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index c792f65069f..e81a32ba84f 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -53,7 +53,7 @@ void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, PoolingParameter_PoolMethod_AVE); pool_param.mutable_pooling_param()->set_pad(pre_pad_); pool_param.mutable_pooling_param()->set_kernel_size(size_); - pool_layer_.reset(new CaffePoolingLayer<Dtype>(pool_param)); + pool_layer_.reset(new PoolingLayer<Dtype>(pool_param)); pool_layer_->SetUp(square_top_vec_, &pool_top_vec_); CHECK_EQ(pool_output_.num(), num_); CHECK_EQ(pool_output_.channels(), channels_); diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 04f47762f9d..9e77fa28a45 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -52,9 +52,9 @@ void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, stride_w_ = pool_param.stride_w(); } if (pad_h_ != 0 || pad_w_ != 0) { - CHECK(pool_param.pool() + CHECK(this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_AVE - || pool_param.pool() + || this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_MAX) << "Padding implemented only for average and max pooling."; CHECK_LT(pad_h_, kernel_h_); @@ -84,8 +84,210 @@ void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, if (top->size() > 1) { (*top)[1]->ReshapeLike(*(*top)[0]); } + // If max pooling, we will initialize the vector index part. + if (this->layer_param_.pooling_param().pool() == + PoolingParameter_PoolMethod_MAX && top->size() == 1) { + max_idx_.Reshape(bottom[0]->num(), channels_, pooled_height_, + pooled_width_); + } + // If stochastic pooling, we will initialize the random index part. + if (this->layer_param_.pooling_param().pool() == + PoolingParameter_PoolMethod_STOCHASTIC) { + rand_idx_.Reshape(bottom[0]->num(), channels_, pooled_height_, + pooled_width_); + } +} + +// TODO(Yangqing): Is there a faster way to do pooling in the channel-first +// case? +template <typename Dtype> +void PoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const int top_count = (*top)[0]->count(); + // We'll output the mask to top[1] if it's of size >1. + const bool use_top_mask = top->size() > 1; + int* mask = NULL; // suppress warnings about uninitalized variables + Dtype* top_mask = NULL; + // Different pooling methods. We explicitly do the switch outside the for + // loop to save time, although this results in more code. + switch (this->layer_param_.pooling_param().pool()) { + case PoolingParameter_PoolMethod_MAX: + // Initialize + if (use_top_mask) { + top_mask = (*top)[1]->mutable_cpu_data(); + caffe_set(top_count, Dtype(-1), top_mask); + } else { + mask = max_idx_.mutable_cpu_data(); + caffe_set(top_count, -1, mask); + } + caffe_set(top_count, Dtype(-FLT_MAX), top_data); + // The main loop + for (int n = 0; n < bottom[0]->num(); ++n) { + for (int c = 0; c < channels_; ++c) { + for (int ph = 0; ph < pooled_height_; ++ph) { + for (int pw = 0; pw < pooled_width_; ++pw) { + int hstart = ph * stride_h_ - pad_h_; + int wstart = pw * stride_w_ - pad_w_; + int hend = min(hstart + kernel_h_, height_); + int wend = min(wstart + kernel_w_, width_); + hstart = max(hstart, 0); + wstart = max(wstart, 0); + const int pool_index = ph * pooled_width_ + pw; + for (int h = hstart; h < hend; ++h) { + for (int w = wstart; w < wend; ++w) { + const int index = h * width_ + w; + if (bottom_data[index] > top_data[pool_index]) { + top_data[pool_index] = bottom_data[index]; + if (use_top_mask) { + top_mask[pool_index] = static_cast<Dtype>(index); + } else { + mask[pool_index] = index; + } + } + } + } + } + } + // compute offset + bottom_data += bottom[0]->offset(0, 1); + top_data += (*top)[0]->offset(0, 1); + if (use_top_mask) { + top_mask += (*top)[0]->offset(0, 1); + } else { + mask += (*top)[0]->offset(0, 1); + } + } + } + break; + case PoolingParameter_PoolMethod_AVE: + for (int i = 0; i < top_count; ++i) { + top_data[i] = 0; + } + // The main loop + for (int n = 0; n < bottom[0]->num(); ++n) { + for (int c = 0; c < channels_; ++c) { + for (int ph = 0; ph < pooled_height_; ++ph) { + for (int pw = 0; pw < pooled_width_; ++pw) { + int hstart = ph * stride_h_ - pad_h_; + int wstart = pw * stride_w_ - pad_w_; + int hend = min(hstart + kernel_h_, height_ + pad_h_); + int wend = min(wstart + kernel_w_, width_ + pad_w_); + int pool_size = (hend - hstart) * (wend - wstart); + hstart = max(hstart, 0); + wstart = max(wstart, 0); + hend = min(hend, height_); + wend = min(wend, width_); + for (int h = hstart; h < hend; ++h) { + for (int w = wstart; w < wend; ++w) { + top_data[ph * pooled_width_ + pw] += + bottom_data[h * width_ + w]; + } + } + top_data[ph * pooled_width_ + pw] /= pool_size; + } + } + // compute offset + bottom_data += bottom[0]->offset(0, 1); + top_data += (*top)[0]->offset(0, 1); + } + } + break; + case PoolingParameter_PoolMethod_STOCHASTIC: + NOT_IMPLEMENTED; + break; + default: + LOG(FATAL) << "Unknown pooling method."; + } } +template <typename Dtype> +void PoolingLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + if (!propagate_down[0]) { + return; + } + const Dtype* top_diff = top[0]->cpu_diff(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + // Different pooling methods. We explicitly do the switch outside the for + // loop to save time, although this results in more codes. + caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); + // We'll output the mask to top[1] if it's of size >1. + const bool use_top_mask = top.size() > 1; + const int* mask = NULL; // suppress warnings about uninitialized variables + const Dtype* top_mask = NULL; + switch (this->layer_param_.pooling_param().pool()) { + case PoolingParameter_PoolMethod_MAX: + // The main loop + if (use_top_mask) { + top_mask = top[1]->cpu_data(); + } else { + mask = max_idx_.cpu_data(); + } + for (int n = 0; n < top[0]->num(); ++n) { + for (int c = 0; c < channels_; ++c) { + for (int ph = 0; ph < pooled_height_; ++ph) { + for (int pw = 0; pw < pooled_width_; ++pw) { + const int index = ph * pooled_width_ + pw; + const int bottom_index = + use_top_mask ? top_mask[index] : mask[index]; + bottom_diff[bottom_index] += top_diff[index]; + } + } + bottom_diff += (*bottom)[0]->offset(0, 1); + top_diff += top[0]->offset(0, 1); + if (use_top_mask) { + top_mask += top[0]->offset(0, 1); + } else { + mask += top[0]->offset(0, 1); + } + } + } + break; + case PoolingParameter_PoolMethod_AVE: + // The main loop + for (int n = 0; n < top[0]->num(); ++n) { + for (int c = 0; c < channels_; ++c) { + for (int ph = 0; ph < pooled_height_; ++ph) { + for (int pw = 0; pw < pooled_width_; ++pw) { + int hstart = ph * stride_h_ - pad_h_; + int wstart = pw * stride_w_ - pad_w_; + int hend = min(hstart + kernel_h_, height_ + pad_h_); + int wend = min(wstart + kernel_w_, width_ + pad_w_); + int pool_size = (hend - hstart) * (wend - wstart); + hstart = max(hstart, 0); + wstart = max(wstart, 0); + hend = min(hend, height_); + wend = min(wend, width_); + for (int h = hstart; h < hend; ++h) { + for (int w = wstart; w < wend; ++w) { + bottom_diff[h * width_ + w] += + top_diff[ph * pooled_width_ + pw] / pool_size; + } + } + } + } + // offset + bottom_diff += (*bottom)[0]->offset(0, 1); + top_diff += top[0]->offset(0, 1); + } + } + break; + case PoolingParameter_PoolMethod_STOCHASTIC: + NOT_IMPLEMENTED; + break; + default: + LOG(FATAL) << "Unknown pooling method."; + } +} + + +#ifdef CPU_ONLY +STUB_GPU(PoolingLayer); +#endif + INSTANTIATE_CLASS(PoolingLayer); + } // namespace caffe diff --git a/src/caffe/layers/caffe_pooling_layer.cu b/src/caffe/layers/pooling_layer.cu similarity index 86% rename from src/caffe/layers/caffe_pooling_layer.cu rename to src/caffe/layers/pooling_layer.cu index 7a8c351e3a1..e64128b87f2 100644 --- a/src/caffe/layers/caffe_pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -151,7 +151,7 @@ __global__ void StoPoolForwardTest(const int nthreads, template <typename Dtype> -void CaffePoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, +void PoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -169,18 +169,17 @@ void CaffePoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, bottom_data, bottom[0]->num(), this->channels_, this->height_, - this->width_, this->pooled_height_, this->pooled_width_, - this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, - this->pad_h_, this->pad_w_, top_data, mask, top_mask); + count, bottom_data, bottom[0]->num(), channels_, + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data, + mask, top_mask); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) AvePoolForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, bottom_data, bottom[0]->num(), this->channels_, this->height_, - this->width_, this->pooled_height_, this->pooled_width_, - this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, - this->pad_h_, this->pad_w_, top_data); + count, bottom_data, bottom[0]->num(), channels_, + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, top_data); break; case PoolingParameter_PoolMethod_STOCHASTIC: if (Caffe::phase() == Caffe::TRAIN) { @@ -190,18 +189,17 @@ void CaffePoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, // NOLINT_NEXT_LINE(whitespace/operators) StoPoolForwardTrain<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, bottom_data, bottom[0]->num(), this->channels_, this->height_, - this->width_, this->pooled_height_, this->pooled_width_, - this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, + count, bottom_data, bottom[0]->num(), channels_, + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, rand_idx_.mutable_gpu_data(), top_data); } else { // NOLINT_NEXT_LINE(whitespace/operators) StoPoolForwardTest<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, bottom_data, bottom[0]->num(), this->channels_, this->height_, - this->width_, this->pooled_height_, this->pooled_width_, - this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, - top_data); + count, bottom_data, bottom[0]->num(), channels_, + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, top_data); } break; default: @@ -326,7 +324,7 @@ __global__ void StoPoolBackward(const int nthreads, template <typename Dtype> -void CaffePoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void PoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (!propagate_down[0]) { return; @@ -348,25 +346,24 @@ void CaffePoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } // NOLINT_NEXT_LINE(whitespace/operators) MaxPoolBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, top_diff, mask, top_mask, top[0]->num(), this->channels_, - this->height_, this->width_, this->pooled_height_, this->pooled_width_, - this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, - this->pad_h_, this->pad_w_, bottom_diff); + count, top_diff, mask, top_mask, top[0]->num(), channels_, + height_, width_, pooled_height_, pooled_width_, + kernel_h_, kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, + bottom_diff); break; case PoolingParameter_PoolMethod_AVE: // NOLINT_NEXT_LINE(whitespace/operators) AvePoolBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, top_diff, top[0]->num(), this->channels_, this->height_, - this->width_, this->pooled_height_, this->pooled_width_, - this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, - this->pad_h_, this->pad_w_, bottom_diff); + count, top_diff, top[0]->num(), channels_, + height_, width_, pooled_height_, pooled_width_, kernel_h_, + kernel_w_, stride_h_, stride_w_, pad_h_, pad_w_, bottom_diff); break; case PoolingParameter_PoolMethod_STOCHASTIC: // NOLINT_NEXT_LINE(whitespace/operators) StoPoolBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( - count, rand_idx_.gpu_data(), top_diff, top[0]->num(), this->channels_, - this->height_, this->width_, this->pooled_height_, this->pooled_width_, - this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_, + count, rand_idx_.gpu_data(), top_diff, + top[0]->num(), channels_, height_, width_, pooled_height_, + pooled_width_, kernel_h_, kernel_w_, stride_h_, stride_w_, bottom_diff); break; default: @@ -376,7 +373,7 @@ void CaffePoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } -INSTANTIATE_CLASS(CaffePoolingLayer); +INSTANTIATE_CLASS(PoolingLayer); } // namespace caffe diff --git a/src/caffe/layers/caffe_relu_layer.cpp b/src/caffe/layers/relu_layer.cpp similarity index 84% rename from src/caffe/layers/caffe_relu_layer.cpp rename to src/caffe/layers/relu_layer.cpp index d708b3f3166..b50352f8526 100644 --- a/src/caffe/layers/caffe_relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -7,7 +7,7 @@ namespace caffe { template <typename Dtype> -void CaffeReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, +void ReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -20,7 +20,7 @@ void CaffeReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } template <typename Dtype> -void CaffeReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, +void ReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -36,10 +36,12 @@ void CaffeReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } } + #ifdef CPU_ONLY -STUB_GPU(CaffeReLULayer); +STUB_GPU(ReLULayer); #endif -INSTANTIATE_CLASS(CaffeReLULayer); +INSTANTIATE_CLASS(ReLULayer); + } // namespace caffe diff --git a/src/caffe/layers/caffe_relu_layer.cu b/src/caffe/layers/relu_layer.cu similarity index 91% rename from src/caffe/layers/caffe_relu_layer.cu rename to src/caffe/layers/relu_layer.cu index ad89968d3a3..def2bbcd7b9 100644 --- a/src/caffe/layers/caffe_relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -15,7 +15,7 @@ __global__ void ReLUForward(const int n, const Dtype* in, Dtype* out, } template <typename Dtype> -void CaffeReLULayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, +void ReLULayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -42,7 +42,7 @@ __global__ void ReLUBackward(const int n, const Dtype* in_diff, } template <typename Dtype> -void CaffeReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void ReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -58,6 +58,8 @@ void CaffeReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(CaffeReLULayer); + +INSTANTIATE_CLASS(ReLULayer); + } // namespace caffe diff --git a/src/caffe/layers/caffe_sigmoid_layer.cpp b/src/caffe/layers/sigmoid_layer.cpp similarity index 82% rename from src/caffe/layers/caffe_sigmoid_layer.cpp rename to src/caffe/layers/sigmoid_layer.cpp index b5bb0e3fd93..d7bba7fbfc3 100644 --- a/src/caffe/layers/caffe_sigmoid_layer.cpp +++ b/src/caffe/layers/sigmoid_layer.cpp @@ -13,7 +13,7 @@ inline Dtype sigmoid(Dtype x) { } template <typename Dtype> -void CaffeSigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, +void SigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -24,7 +24,7 @@ void CaffeSigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } template <typename Dtype> -void CaffeSigmoidLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, +void SigmoidLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -40,10 +40,10 @@ void CaffeSigmoidLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } #ifdef CPU_ONLY -STUB_GPU(CaffeSigmoidLayer); +STUB_GPU(SigmoidLayer); #endif -INSTANTIATE_CLASS(CaffeSigmoidLayer); +INSTANTIATE_CLASS(SigmoidLayer); } // namespace caffe diff --git a/src/caffe/layers/caffe_sigmoid_layer.cu b/src/caffe/layers/sigmoid_layer.cu similarity index 90% rename from src/caffe/layers/caffe_sigmoid_layer.cu rename to src/caffe/layers/sigmoid_layer.cu index 030d34ed8c7..e1ebb1f6c41 100644 --- a/src/caffe/layers/caffe_sigmoid_layer.cu +++ b/src/caffe/layers/sigmoid_layer.cu @@ -15,7 +15,7 @@ __global__ void SigmoidForward(const int n, const Dtype* in, Dtype* out) { } template <typename Dtype> -void CaffeSigmoidLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, +void SigmoidLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -41,7 +41,7 @@ __global__ void SigmoidBackward(const int n, const Dtype* in_diff, } template <typename Dtype> -void CaffeSigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void SigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -56,7 +56,7 @@ void CaffeSigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(CaffeSigmoidLayer); +INSTANTIATE_CLASS(SigmoidLayer); } // namespace caffe diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 06b5e2b74a0..29767ac775c 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -13,8 +13,86 @@ void SoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); + sum_multiplier_.Reshape(1, bottom[0]->channels(), 1, 1); + Dtype* multiplier_data = sum_multiplier_.mutable_cpu_data(); + for (int i = 0; i < sum_multiplier_.count(); ++i) { + multiplier_data[i] = 1.; + } + scale_.Reshape(bottom[0]->num(), 1, bottom[0]->height(), bottom[0]->width()); } +template <typename Dtype> +void SoftmaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* scale_data = scale_.mutable_cpu_data(); + int num = bottom[0]->num(); + int channels = bottom[0]->channels(); + int dim = bottom[0]->count() / bottom[0]->num(); + int spatial_dim = bottom[0]->height() * bottom[0]->width(); + caffe_copy(bottom[0]->count(), bottom_data, top_data); + // We need to subtract the max to avoid numerical issues, compute the exp, + // and then normalize. + for (int i = 0; i < num; ++i) { + // initialize scale_data to the first plane + caffe_copy(spatial_dim, bottom_data + i * dim, scale_data); + for (int j = 0; j < channels; j++) { + for (int k = 0; k < spatial_dim; k++) { + scale_data[k] = std::max(scale_data[k], + bottom_data[i * dim + j * spatial_dim + k]); + } + } + // subtraction + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, channels, spatial_dim, + 1, -1., sum_multiplier_.cpu_data(), scale_data, 1., top_data + i * dim); + // exponentiation + caffe_exp<Dtype>(dim, top_data + i * dim, top_data + i * dim); + // sum after exp + caffe_cpu_gemv<Dtype>(CblasTrans, channels, spatial_dim, 1., + top_data + i * dim, sum_multiplier_.cpu_data(), 0., scale_data); + // division + for (int j = 0; j < channels; j++) { + caffe_div(spatial_dim, top_data + (*top)[0]->offset(i, j), scale_data, + top_data + (*top)[0]->offset(i, j)); + } + } +} + +template <typename Dtype> +void SoftmaxLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, + vector<Blob<Dtype>*>* bottom) { + const Dtype* top_diff = top[0]->cpu_diff(); + const Dtype* top_data = top[0]->cpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* scale_data = scale_.mutable_cpu_data(); + int num = top[0]->num(); + int channels = top[0]->channels(); + int dim = top[0]->count() / top[0]->num(); + int spatial_dim = top[0]->height() * top[0]->width(); + caffe_copy(top[0]->count(), top_diff, bottom_diff); + for (int i = 0; i < num; ++i) { + // compute dot(top_diff, top_data) and subtract them from the bottom diff + for (int k = 0; k < spatial_dim; ++k) { + scale_data[k] = caffe_cpu_strided_dot<Dtype>(channels, + bottom_diff + i * dim + k, spatial_dim, + top_data + i * dim + k, spatial_dim); + } + // subtraction + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, channels, spatial_dim, 1, + -1., sum_multiplier_.cpu_data(), scale_data, 1., bottom_diff + i * dim); + } + // elementwise multiplication + caffe_mul(top[0]->count(), bottom_diff, top_data, bottom_diff); +} + + +#ifdef CPU_ONLY +STUB_GPU(SoftmaxLayer); +#endif + INSTANTIATE_CLASS(SoftmaxLayer); + } // namespace caffe diff --git a/src/caffe/layers/caffe_softmax_layer.cu b/src/caffe/layers/softmax_layer.cu similarity index 96% rename from src/caffe/layers/caffe_softmax_layer.cu rename to src/caffe/layers/softmax_layer.cu index 74f6a7d16bc..f97eafcedb0 100644 --- a/src/caffe/layers/caffe_softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -86,7 +86,7 @@ __global__ void kernel_channel_dot(const int num, const int channels, } template <typename Dtype> -void CaffeSoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, +void SoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -125,7 +125,7 @@ void CaffeSoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } template <typename Dtype> -void CaffeSoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void SoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* top_data = top[0]->gpu_data(); @@ -148,6 +148,7 @@ void CaffeSoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, caffe_gpu_mul<Dtype>(top[0]->count(), bottom_diff, top_data, bottom_diff); } -INSTANTIATE_CLASS(CaffeSoftmaxLayer); +INSTANTIATE_CLASS(SoftmaxLayer); + } // namespace caffe diff --git a/src/caffe/layers/caffe_tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp similarity index 77% rename from src/caffe/layers/caffe_tanh_layer.cpp rename to src/caffe/layers/tanh_layer.cpp index a7433395dba..8dae0054aed 100644 --- a/src/caffe/layers/caffe_tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -1,3 +1,6 @@ +// TanH neuron activation function layer. +// Adapted from ReLU layer code written by Yangqing Jia + #include <algorithm> #include <vector> @@ -7,7 +10,7 @@ namespace caffe { template <typename Dtype> -void CaffeTanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, +void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); @@ -20,7 +23,7 @@ void CaffeTanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } template <typename Dtype> -void CaffeTanHLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, +void TanHLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -37,9 +40,9 @@ void CaffeTanHLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } #ifdef CPU_ONLY -STUB_GPU(CaffeTanHLayer); +STUB_GPU(TanHLayer); #endif -INSTANTIATE_CLASS(CaffeTanHLayer); +INSTANTIATE_CLASS(TanHLayer); } // namespace caffe diff --git a/src/caffe/layers/caffe_tanh_layer.cu b/src/caffe/layers/tanh_layer.cu similarity index 85% rename from src/caffe/layers/caffe_tanh_layer.cu rename to src/caffe/layers/tanh_layer.cu index f2096e68120..bdb7a94978e 100644 --- a/src/caffe/layers/caffe_tanh_layer.cu +++ b/src/caffe/layers/tanh_layer.cu @@ -1,3 +1,6 @@ +// TanH neuron activation function layer. +// Adapted from ReLU layer code written by Yangqing Jia + #include <algorithm> #include <vector> @@ -15,7 +18,7 @@ __global__ void TanHForward(const int n, const Dtype* in, Dtype* out) { } template <typename Dtype> -void CaffeTanHLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, +void TanHLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); @@ -36,7 +39,7 @@ __global__ void TanHBackward(const int n, const Dtype* in_diff, } template <typename Dtype> -void CaffeTanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, +void TanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { if (propagate_down[0]) { @@ -51,6 +54,7 @@ void CaffeTanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(CaffeTanHLayer); +INSTANTIATE_CLASS(TanHLayer); + } // namespace caffe diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index 3489ead8123..5a7ea80467e 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -62,7 +62,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { this->blob_bottom_vec_.push_back(this->blob_bottom_2_); this->blob_top_vec_.push_back(this->blob_top_2_); shared_ptr<Layer<Dtype> > layer( - new CaffeConvolutionLayer<Dtype>(layer_param)); + new ConvolutionLayer<Dtype>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 4); @@ -75,7 +75,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { // setting group should not change the shape convolution_param->set_num_output(3); convolution_param->set_group(3); - layer.reset(new CaffeConvolutionLayer<Dtype>(layer_param)); + layer.reset(new ConvolutionLayer<Dtype>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 3); @@ -111,7 +111,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) { convolution_param->mutable_bias_filler()->set_type("constant"); convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<Dtype> > layer( - new CaffeConvolutionLayer<Dtype>(layer_param)); + new ConvolutionLayer<Dtype>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // After the convolution, the output should all have output values 27.1 @@ -154,7 +154,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) { convolution_param->mutable_bias_filler()->set_type("constant"); convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<Dtype> > layer( - new CaffeConvolutionLayer<Dtype>(layer_param)); + new ConvolutionLayer<Dtype>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // After the convolution, the output should all have output values 9.1 @@ -192,7 +192,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSobelConvolution) { convolution_param->set_num_output(1); convolution_param->set_bias_term(false); shared_ptr<Layer<Dtype> > layer( - new CaffeConvolutionLayer<Dtype>(layer_param)); + new ConvolutionLayer<Dtype>(layer_param)); layer->blobs().resize(1); layer->blobs()[0].reset(new Blob<Dtype>(1, 3, 3, 3)); Dtype* weights = layer->blobs()[0]->mutable_cpu_data(); @@ -225,7 +225,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSobelConvolution) { convolution_param->set_stride_w(1); convolution_param->set_num_output(1); convolution_param->set_bias_term(false); - layer.reset(new CaffeConvolutionLayer<Dtype>(layer_param)); + layer.reset(new ConvolutionLayer<Dtype>(layer_param)); layer->blobs().resize(1); layer->blobs()[0].reset(new Blob<Dtype>(1, 3, 3, 1)); Dtype* weights_1 = layer->blobs()[0]->mutable_cpu_data(); @@ -247,7 +247,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSobelConvolution) { convolution_param->set_stride_w(2); convolution_param->set_num_output(1); convolution_param->set_bias_term(false); - layer.reset(new CaffeConvolutionLayer<Dtype>(layer_param)); + layer.reset(new ConvolutionLayer<Dtype>(layer_param)); layer->blobs().resize(1); layer->blobs()[0].reset(new Blob<Dtype>(1, 3, 1, 3)); Dtype* weights_2 = layer->blobs()[0]->mutable_cpu_data(); @@ -279,7 +279,7 @@ TYPED_TEST(ConvolutionLayerTest, TestGradient) { convolution_param->set_num_output(2); convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("gaussian"); - CaffeConvolutionLayer<Dtype> layer(layer_param); + ConvolutionLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -296,7 +296,7 @@ TYPED_TEST(ConvolutionLayerTest, TestGradientGroup) { convolution_param->set_group(3); convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("gaussian"); - CaffeConvolutionLayer<Dtype> layer(layer_param); + ConvolutionLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp index ffafbec4515..311c7781be5 100644 --- a/src/caffe/test/test_maxpool_dropout_layers.cpp +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -46,7 +46,7 @@ TYPED_TEST(MaxPoolingDropoutTest, TestSetup) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - CaffePoolingLayer<Dtype> max_layer(layer_param); + PoolingLayer<Dtype> max_layer(layer_param); max_layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); DropoutLayer<Dtype> dropout_layer(layer_param); dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); @@ -63,7 +63,7 @@ TYPED_TEST(MaxPoolingDropoutTest, TestForward) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); const Dtype* top_data = this->blob_top_->cpu_data(); @@ -93,7 +93,7 @@ TYPED_TEST(MaxPoolingDropoutTest, TestBackward) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); for (int i = 0; i < this->blob_top_->count(); ++i) { diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 322e497b82d..2333c3a7dab 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -96,7 +96,7 @@ TYPED_TEST(NeuronLayerTest, TestAbsGradient) { TYPED_TEST(NeuronLayerTest, TestReLU) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - CaffeReLULayer<Dtype> layer(layer_param); + ReLULayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values @@ -111,7 +111,7 @@ TYPED_TEST(NeuronLayerTest, TestReLU) { TYPED_TEST(NeuronLayerTest, TestReLUGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - CaffeReLULayer<Dtype> layer(layer_param); + ReLULayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -121,7 +121,7 @@ TYPED_TEST(NeuronLayerTest, TestReLUWithNegativeSlope) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; layer_param.ParseFromString("relu_param{negative_slope:0.01}"); - CaffeReLULayer<Dtype> layer(layer_param); + ReLULayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values @@ -137,7 +137,7 @@ TYPED_TEST(NeuronLayerTest, TestReLUGradientWithNegativeSlope) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; layer_param.ParseFromString("relu_param{negative_slope:0.01}"); - CaffeReLULayer<Dtype> layer(layer_param); + ReLULayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -146,7 +146,7 @@ TYPED_TEST(NeuronLayerTest, TestReLUGradientWithNegativeSlope) { TYPED_TEST(NeuronLayerTest, TestSigmoid) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - CaffeSigmoidLayer<Dtype> layer(layer_param); + SigmoidLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Now, check values @@ -163,7 +163,7 @@ TYPED_TEST(NeuronLayerTest, TestSigmoid) { TYPED_TEST(NeuronLayerTest, TestSigmoidGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - CaffeSigmoidLayer<Dtype> layer(layer_param); + SigmoidLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -172,7 +172,7 @@ TYPED_TEST(NeuronLayerTest, TestSigmoidGradient) { TYPED_TEST(NeuronLayerTest, TestTanH) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - CaffeTanHLayer<Dtype> layer(layer_param); + TanHLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Test exact values @@ -195,7 +195,7 @@ TYPED_TEST(NeuronLayerTest, TestTanH) { TYPED_TEST(NeuronLayerTest, TestTanHGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - CaffeTanHLayer<Dtype> layer(layer_param); + TanHLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index 4361949a897..5be01f77b32 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -72,7 +72,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { blob_bottom_->mutable_cpu_data()[i + 13] = 2; blob_bottom_->mutable_cpu_data()[i + 14] = 3; } - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); layer.SetUp(blob_bottom_vec_, &blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); @@ -170,7 +170,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { blob_bottom_->mutable_cpu_data()[i + 34] = 18; blob_bottom_->mutable_cpu_data()[i + 35] = 11; } - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); layer.SetUp(blob_bottom_vec_, &blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); @@ -295,7 +295,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { blob_bottom_->mutable_cpu_data()[i + 34] = 18; blob_bottom_->mutable_cpu_data()[i + 35] = 11; } - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); layer.SetUp(blob_bottom_vec_, &blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); @@ -376,7 +376,7 @@ TYPED_TEST(PoolingLayerTest, TestSetup) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); @@ -392,7 +392,7 @@ TYPED_TEST(PoolingLayerTest, TestSetupPadded) { pooling_param->set_stride(2); pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); @@ -450,7 +450,7 @@ TYPED_TEST(PoolingLayerTest, TestGradientMax) { pooling_param->set_stride(2); pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-4, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -480,7 +480,7 @@ TYPED_TEST(PoolingLayerTest, TestForwardMaxPadded) { this->blob_bottom_->mutable_cpu_data()[6] = 4; this->blob_bottom_->mutable_cpu_data()[7] = 2; this->blob_bottom_->mutable_cpu_data()[8] = 1; - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); @@ -514,7 +514,7 @@ TYPED_TEST(PoolingLayerTest, TestGradientMaxTopMask) { pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); this->blob_top_vec_.push_back(this->blob_top_mask_); - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-4, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -536,7 +536,7 @@ TYPED_TEST(PoolingLayerTest, TestForwardAve) { filler_param.set_value(Dtype(2)); ConstantFiller<Dtype> filler(filler_param); filler.Fill(this->blob_bottom_); - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); @@ -565,7 +565,7 @@ TYPED_TEST(PoolingLayerTest, TestGradientAve) { pooling_param->set_kernel_w(kernel_w); pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); @@ -584,7 +584,7 @@ TYPED_TEST(PoolingLayerTest, TestGradientAvePadded) { pooling_param->set_stride(2); pooling_param->set_pad(2); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); - CaffePoolingLayer<Dtype> layer(layer_param); + PoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index 18c68b33915..9f45f762cdb 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -40,7 +40,7 @@ TYPED_TEST_CASE(SoftmaxLayerTest, TestDtypesAndDevices); TYPED_TEST(SoftmaxLayerTest, TestForward) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - CaffeSoftmaxLayer<Dtype> layer(layer_param); + SoftmaxLayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); // Test sum @@ -74,7 +74,7 @@ TYPED_TEST(SoftmaxLayerTest, TestForward) { TYPED_TEST(SoftmaxLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - CaffeSoftmaxLayer<Dtype> layer(layer_param); + SoftmaxLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); diff --git a/src/caffe/test/test_stochastic_pooling.cpp b/src/caffe/test/test_stochastic_pooling.cpp index 51edbb3d626..4f13981bd82 100644 --- a/src/caffe/test/test_stochastic_pooling.cpp +++ b/src/caffe/test/test_stochastic_pooling.cpp @@ -52,7 +52,7 @@ TYPED_TEST(StochasticPoolingLayerTest, TestSetup) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(2); - CaffePoolingLayer<TypeParam> layer(layer_param); + PoolingLayer<TypeParam> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); @@ -68,7 +68,7 @@ TYPED_TEST(StochasticPoolingLayerTest, TestStochasticGPU) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_STOCHASTIC); - CaffePoolingLayer<TypeParam> layer(layer_param); + PoolingLayer<TypeParam> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -112,7 +112,7 @@ TYPED_TEST(StochasticPoolingLayerTest, TestStochasticGPUTestPhase) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_STOCHASTIC); - CaffePoolingLayer<TypeParam> layer(layer_param); + PoolingLayer<TypeParam> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); @@ -150,7 +150,7 @@ TYPED_TEST(StochasticPoolingLayerTest, TestGradientGPU) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_STOCHASTIC); - CaffePoolingLayer<TypeParam> layer(layer_param); + PoolingLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-4, 1e-2); // it is too expensive to call curand multiple times, so we don't do an // exhaustive gradient check. From 68849e4aab6747207394a42a5211829b4509464b Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 6 Sep 2014 20:14:28 -0700 Subject: [PATCH 0707/2053] [docs] fixup the MathJax notation in tutorial/layers --- docs/tutorial/layers.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 42ae5986fb6..4f0eae5cf3c 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -14,11 +14,11 @@ TODO complete list of layers linking to headings * Header: `./include/caffe/vision_layers.hpp` Vision layers usually take *images* as input and produce other *images* as output. -A typical "image" in the real-world may have one color channel ($c = 1$), as in a grayscale image, or three color channels ($c = 3$) as in an RGB (red, green, blue) image. -But in this context, the distinguishing characteristic of an image is its spatial structure: usually an image has some non-trivial height $h > 1$ and width $w > 1$. +A typical "image" in the real-world may have one color channel ($$c = 1$$), as in a grayscale image, or three color channels ($$c = 3$$) as in an RGB (red, green, blue) image. +But in this context, the distinguishing characteristic of an image is its spatial structure: usually an image has some non-trivial height $$h > 1$$ and width $$w > 1$$. This 2D geometry naturally lends itself to certain decisions about how to process the input. In particular, most of the vision layers work by applying a particular operation to some region of the input to produce a corresponding region of the output. -In contrast, other layers (with few exceptions) ignore the spatial structure of the input, effectively treating it as "one big vector" with dimension $$ c h w $$. +In contrast, other layers (with few exceptions) ignore the spatial structure of the input, effectively treating it as "one big vector" with dimension $$chw$$. #### Convolution From c099fd8b2e431b4b62a0ea3774b955f38c993b48 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 6 Sep 2014 20:23:55 -0700 Subject: [PATCH 0708/2053] [doc] minor edits to convolution layer in tutorial --- docs/tutorial/layers.md | 50 ++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 4f0eae5cf3c..4e65017dfd6 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -28,41 +28,41 @@ In contrast, other layers (with few exceptions) ignore the spatial structure of * CUDA GPU implementation: `./src/caffe/layers/convolution_layer.cu` * Options (`ConvolutionParameter convolution_param`) - Required: `num_output` (`c_o`), the number of filters - - Required: `kernel_size` or (`kernel_h`, `kernel_w`), specifies height & width of each filter + - Required: `kernel_size` (or `kernel_h` and `kernel_w`), specifies height and width of each filter - Strongly recommended (default `type: 'constant' value: 0`): `weight_filler` - Optional (default `true`): `bias_term`, specifies whether to learn and apply a set of additive biases to the filter outputs - - Optional (default 0): `pad` or (`pad_h`, `pad_w`), specifies the number of pixels to (implicitly) add to each side of the input - - Optional (default 1): `stride` or (`stride_h`, `stride_w`), specifies the intervals at which to apply the filters to the input - - Optional (default 1): `group` (g). If g > 1, we restrict the connectivity of each filter to a subset of the input. Specifically, the input and output channels are separated to g groups separately, and the i-th output group channels will be only connected to the i-th input group channels. + - Optional (default 0): `pad` (or `pad_h` and `pad_w`), specifies the number of pixels to (implicitly) add to each side of the input + - Optional (default 1): `stride` (or `stride_h` and `stride_w`), specifies the intervals at which to apply the filters to the input + - Optional (default 1): `group` (g). If g > 1, we restrict the connectivity of each filter to a subset of the input. Specifically, the input and output channels are separated into g groups, and the $$i$$th output group channels will be only connected to the $$i$$th input group channels. * Input - `n * c_i * h_i * w_i` * Output - `n * c_o * h_o * w_o`, where `h_o = (h_i + 2 * pad_h - kernel_h) / stride_h + 1` and `w_o` likewise. * Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) - layers { - name: "conv1" - type: CONVOLUTION - bottom: "data" - top: "conv1" - blobs_lr: 1 # learning rate multiplier for the filters - blobs_lr: 2 # learning rate multiplier for the biases - weight_decay: 1 # weight decay multiplier for the filters - weight_decay: 0 # weight decay multiplier for the biases - convolution_param { - num_output: 96 # learn 96 filters - kernel_size: 11 # each filter is 11x11 - stride: 4 # step 4 pixels between each filter application - weight_filler { - type: "gaussian" # initialize the filters from a Gaussian - std: 0.01 # distribution with stdev 0.01 (default mean: 0) - } - bias_filler { - type: "constant" # initialize the biases to zero (0) - value: 0 - } + layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + blobs_lr: 1 # learning rate multiplier for the filters + blobs_lr: 2 # learning rate multiplier for the biases + weight_decay: 1 # weight decay multiplier for the filters + weight_decay: 0 # weight decay multiplier for the biases + convolution_param { + num_output: 96 # learn 96 filters + kernel_size: 11 # each filter is 11x11 + stride: 4 # step 4 pixels between each filter application + weight_filler { + type: "gaussian" # initialize the filters from a Gaussian + std: 0.01 # distribution with stdev 0.01 (default mean: 0) + } + bias_filler { + type: "constant" # initialize the biases to zero (0) + value: 0 } } + } The `CONVOLUTION` layer convolves the input image with a set of learnable filters, each producing one feature map in the output image. From 4f977d0514454a19f8ae98b770239c132ea361d2 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 6 Sep 2014 20:28:02 -0700 Subject: [PATCH 0709/2053] [docs] fix pooling markdown and add some comments in tutorial --- docs/tutorial/layers.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 4e65017dfd6..9ac3913da7e 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -82,17 +82,17 @@ The `CONVOLUTION` layer convolves the input image with a set of learnable filter - `n * c * h_o * w_o`, where h_o and w_o are computed in the same way as convolution. * Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) - layers { - name: "pool1" - type: POOLING - bottom: "conv1" - top: "pool1" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 + layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 3 # pool over a 3x3 region + stride: 2 # step two pixels (in the bottom blob) between pooling regions + } } - } #### Local Response Normalization (LRN) From 85c93659fc668b0105d8458c6e9d7f0f86545df4 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 6 Sep 2014 21:05:56 -0700 Subject: [PATCH 0710/2053] [docs] add LRN layer to tutorial/layers --- docs/tutorial/layers.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 9ac3913da7e..fb6f26181dd 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -96,7 +96,16 @@ The `CONVOLUTION` layer convolves the input image with a set of learnable filter #### Local Response Normalization (LRN) -`LRN` +* LayerType: `LRN` +* CPU Implementation: `./src/caffe/layers/lrn_layer.cpp` +* CUDA GPU Implementation: `./src/caffe/layers/lrn_layer.cu` +* Options (`LRNParameter lrn_param`) + - Optional (default 5): `local_size`, the number of channels to sum over (for cross channel LRN) or the side length of the square region to sum over (for within channel LRN) + - Optional (default 1): `alpha`, the scaling parameter (see below) + - Optional (default 5): `beta`, the exponent (see below) + - Optional (default `ACROSS_CHANNELS`): `norm_region`, whether to sum over adjacent channels (`ACROSS_CHANNELS`) or nearby spatial locaitons (`WITHIN_CHANNEL`) + +The local response normalization layer performs a kind of "lateral inhibition" by normalizing over local input regions. In `ACROSS_CHANNELS` mode, the local regions extend across nearby channels, but have no spatial extent (i.e., they have shape `local_size x 1 x 1`). In `WITHIN_CHANNEL` mode, the local regions extend spatially, but are in separate channels (i.e., they have shape `1 x local_size x local_size`). Each input value is divided by $$(1 + (\alpha/n) \sum_i x_i)^\beta$$, where $$n$$ is the size of each local region, and the sum is taken over the region centered at that value (zero padding is added where necessary). #### im2col From 853d65a8a5e0dce881c7b82389c61a4c4f32697f Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 6 Sep 2014 21:20:36 -0700 Subject: [PATCH 0711/2053] [docs] split layer params in required/optional Also, make the parameter name come first. This makes it much easier to find/scan parameters. --- docs/tutorial/layers.md | 63 +++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index fb6f26181dd..f77349b6934 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -27,13 +27,16 @@ In contrast, other layers (with few exceptions) ignore the spatial structure of * CPU implementation: `./src/caffe/layers/convolution_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/convolution_layer.cu` * Options (`ConvolutionParameter convolution_param`) - - Required: `num_output` (`c_o`), the number of filters - - Required: `kernel_size` (or `kernel_h` and `kernel_w`), specifies height and width of each filter - - Strongly recommended (default `type: 'constant' value: 0`): `weight_filler` - - Optional (default `true`): `bias_term`, specifies whether to learn and apply a set of additive biases to the filter outputs - - Optional (default 0): `pad` (or `pad_h` and `pad_w`), specifies the number of pixels to (implicitly) add to each side of the input - - Optional (default 1): `stride` (or `stride_h` and `stride_w`), specifies the intervals at which to apply the filters to the input - - Optional (default 1): `group` (g). If g > 1, we restrict the connectivity of each filter to a subset of the input. Specifically, the input and output channels are separated into g groups, and the $$i$$th output group channels will be only connected to the $$i$$th input group channels. + - Required + - `num_output` (`c_o`): the number of filters + - `kernel_size` (or `kernel_h` and `kernel_w`): specifies height and width of each filter + - Strongly Recommended + - `weight_filler` [default `type: 'constant' value: 0`] + - Optional + - `bias_term` [default `true`]: specifies whether to learn and apply a set of additive biases to the filter outputs + - `pad` (or `pad_h` and `pad_w`) [default 0]: specifies the number of pixels to (implicitly) add to each side of the input + - `stride` (or `stride_h` and `stride_w`) [default 1]: specifies the intervals at which to apply the filters to the input + - `group` (g) [default 1]: If g > 1, we restrict the connectivity of each filter to a subset of the input. Specifically, the input and output channels are separated into g groups, and the $$i$$th output group channels will be only connected to the $$i$$th input group channels. * Input - `n * c_i * h_i * w_i` * Output @@ -72,10 +75,12 @@ The `CONVOLUTION` layer convolves the input image with a set of learnable filter * CPU implementation: `./src/caffe/layers/pooling_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/pooling_layer.cu` * Options (`PoolingParameter pooling_param`) - - Optional (default MAX): `pool`, the pooling method. Currently MAX, AVE, or STOCHASTIC - - Required: `kernel_size` or (`kernel_h`, `kernel_w`), specifies height & width of each filter - - Optional (default 0): `pad` or (`pad_h`, `pad_w`), specifies the number of pixels to (implicitly) add to each side of the input - - Optional (default 1): `stride` or (`stride_h`, `stride_w`), specifies the intervals at which to apply the filters to the input + - Required + - `kernel_size` (or `kernel_h` and `kernel_w`): specifies height and width of each filter + - Optional + - `pool` [default MAX]: the pooling method. Currently MAX, AVE, or STOCHASTIC + - `pad` (or `pad_h` and `pad_w`) [default 0]: specifies the number of pixels to (implicitly) add to each side of the input + - `stride` (or `stride_h` and `stride_w`) [default 1]: specifies the intervals at which to apply the filters to the input * Input - `n * c * h_i * w_i` * Output @@ -100,10 +105,11 @@ The `CONVOLUTION` layer convolves the input image with a set of learnable filter * CPU Implementation: `./src/caffe/layers/lrn_layer.cpp` * CUDA GPU Implementation: `./src/caffe/layers/lrn_layer.cu` * Options (`LRNParameter lrn_param`) - - Optional (default 5): `local_size`, the number of channels to sum over (for cross channel LRN) or the side length of the square region to sum over (for within channel LRN) - - Optional (default 1): `alpha`, the scaling parameter (see below) - - Optional (default 5): `beta`, the exponent (see below) - - Optional (default `ACROSS_CHANNELS`): `norm_region`, whether to sum over adjacent channels (`ACROSS_CHANNELS`) or nearby spatial locaitons (`WITHIN_CHANNEL`) + - Optional + - `local_size` [default 5]: the number of channels to sum over (for cross channel LRN) or the side length of the square region to sum over (for within channel LRN) + - `alpha` [default 1]: the scaling parameter (see below) + - `beta` [default 5]: the exponent (see below) + - `norm_region` [default `ACROSS_CHANNELS`]: whether to sum over adjacent channels (`ACROSS_CHANNELS`) or nearby spatial locaitons (`WITHIN_CHANNEL`) The local response normalization layer performs a kind of "lateral inhibition" by normalizing over local input regions. In `ACROSS_CHANNELS` mode, the local regions extend across nearby channels, but have no spatial extent (i.e., they have shape `local_size x 1 x 1`). In `WITHIN_CHANNEL` mode, the local regions extend spatially, but are in separate channels (i.e., they have shape `1 x local_size x local_size`). Each input value is divided by $$(1 + (\alpha/n) \sum_i x_i)^\beta$$, where $$n$$ is the size of each local region, and the sum is taken over the region centered at that value (zero padding is added where necessary). @@ -129,7 +135,8 @@ Loss drives learning by comparing an output to a target and assigning cost to mi * CPU implementation: `./src/caffe/layers/hinge_loss_layer.cpp` * CUDA GPU implementation: `NOT_AVAILABLE` * Options (`HingeLossParameter hinge_loss_param`) - - Optional (default L1): `norm`, the norm used. Currently L1, L2 + - Optional + - `norm` [default L1]: the norm used. Currently L1, L2 * Inputs - `n * c * h * w` Predictions - `n * 1 * 1 * 1` Labels @@ -184,7 +191,8 @@ In general, activation / Neuron layers are element-wise operators, taking one bo * CPU implementation: `./src/caffe/layers/relu_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/relu_layer.cu` * Options (`ReLUParameter relu_param`) - - Optional (default 0): `negative_slope`, specifies whether to leak the negative part by multiplying it with the slope value rather than setting it to 0. + - Optional + - `negative_slope` [default 0]: specifies whether to leak the negative part by multiplying it with the slope value rather than setting it to 0. * Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) layers { @@ -250,9 +258,10 @@ The `ABSVAL` layer computes the output as abs(x) for each input element x. * CPU implementation: `./src/caffe/layers/power_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/power_layer.cu` * Options (`PowerParameter power_param`) - - Optional (default 1): `power` - - Optional (default 1): `scale` - - Optional (default 0): `shift` + - Optional + - `power` [default 1] + - `scale` [default 1] + - `shift` [default 0] * Sample layers { @@ -324,10 +333,13 @@ The `BNLL` (binomial normal log likelihood) layer computes the output as log(1 + * CPU implementation: `./src/caffe/layers/inner_product_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/inner_product_layer.cu` * Options (`InnerProductParameter inner_product_param`) - - Required: `num_output` (`c_o`), the number of filters - - Strongly recommended (default `type: 'constant' value: 0`): `weight_filler` - - Optional (default `type: 'constant' value: 0`): `bias_filler` - - Optional (default `true`): `bias_term`, specifies whether to learn and apply a set of additive biases to the filter outputs + - Required + - `num_output` (`c_o`): the number of filters + - Strongly recommended + - `weight_filler` [default `type: 'constant' value: 0`] + - Optional + - `bias_filler` [default `type: 'constant' value: 0`] + - `bias_term` [default `true`]: specifies whether to learn and apply a set of additive biases to the filter outputs * Input - `n * c_i * h_i * w_i` * Output @@ -372,7 +384,8 @@ The `FLATTEN` layer is a utility layer that flattens an input of shape `n * c * * CPU implementation: `./src/caffe/layers/concat_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/concat_layer.cu` * Options (`ConcatParameter concat_param`) - - Optional (default 1): `concat_dim`, 0 for concatenation along num and 1 for channels. + - Optional + - `concat_dim` [default 1]: 0 for concatenation along num and 1 for channels. * Input - `n_i * c_i * h * w` for each input blob i from 1 to K. * Output From 40fa5be9b11c17c289789bc14c37a6ce06f14451 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 6 Sep 2014 21:22:23 -0700 Subject: [PATCH 0712/2053] [docs] in tutorial/layers, Options -> Parameters It sounds funny to have optional options, and "parameters" is more in line with the internal usage. --- docs/tutorial/layers.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index f77349b6934..11ca70e50b9 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -26,7 +26,7 @@ In contrast, other layers (with few exceptions) ignore the spatial structure of * LayerType: `CONVOLUTION` * CPU implementation: `./src/caffe/layers/convolution_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/convolution_layer.cu` -* Options (`ConvolutionParameter convolution_param`) +* Parameters (`ConvolutionParameter convolution_param`) - Required - `num_output` (`c_o`): the number of filters - `kernel_size` (or `kernel_h` and `kernel_w`): specifies height and width of each filter @@ -74,7 +74,7 @@ The `CONVOLUTION` layer convolves the input image with a set of learnable filter * LayerType: `POOLING` * CPU implementation: `./src/caffe/layers/pooling_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/pooling_layer.cu` -* Options (`PoolingParameter pooling_param`) +* Parameters (`PoolingParameter pooling_param`) - Required - `kernel_size` (or `kernel_h` and `kernel_w`): specifies height and width of each filter - Optional @@ -104,7 +104,7 @@ The `CONVOLUTION` layer convolves the input image with a set of learnable filter * LayerType: `LRN` * CPU Implementation: `./src/caffe/layers/lrn_layer.cpp` * CUDA GPU Implementation: `./src/caffe/layers/lrn_layer.cu` -* Options (`LRNParameter lrn_param`) +* Parameters (`LRNParameter lrn_param`) - Optional - `local_size` [default 5]: the number of channels to sum over (for cross channel LRN) or the side length of the square region to sum over (for within channel LRN) - `alpha` [default 1]: the scaling parameter (see below) @@ -134,7 +134,7 @@ Loss drives learning by comparing an output to a target and assigning cost to mi * LayerType: `HINGE_LOSS` * CPU implementation: `./src/caffe/layers/hinge_loss_layer.cpp` * CUDA GPU implementation: `NOT_AVAILABLE` -* Options (`HingeLossParameter hinge_loss_param`) +* Parameters (`HingeLossParameter hinge_loss_param`) - Optional - `norm` [default L1]: the norm used. Currently L1, L2 * Inputs @@ -190,7 +190,7 @@ In general, activation / Neuron layers are element-wise operators, taking one bo * LayerType: `RELU` * CPU implementation: `./src/caffe/layers/relu_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/relu_layer.cu` -* Options (`ReLUParameter relu_param`) +* Parameters (`ReLUParameter relu_param`) - Optional - `negative_slope` [default 0]: specifies whether to leak the negative part by multiplying it with the slope value rather than setting it to 0. * Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) @@ -257,7 +257,7 @@ The `ABSVAL` layer computes the output as abs(x) for each input element x. * LayerType: `POWER` * CPU implementation: `./src/caffe/layers/power_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/power_layer.cu` -* Options (`PowerParameter power_param`) +* Parameters (`PowerParameter power_param`) - Optional - `power` [default 1] - `scale` [default 1] @@ -332,7 +332,7 @@ The `BNLL` (binomial normal log likelihood) layer computes the output as log(1 + * LayerType: `INNER_PRODUCT` * CPU implementation: `./src/caffe/layers/inner_product_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/inner_product_layer.cu` -* Options (`InnerProductParameter inner_product_param`) +* Parameters (`InnerProductParameter inner_product_param`) - Required - `num_output` (`c_o`): the number of filters - Strongly recommended @@ -383,7 +383,7 @@ The `FLATTEN` layer is a utility layer that flattens an input of shape `n * c * * LayerType: `CONCAT` * CPU implementation: `./src/caffe/layers/concat_layer.cpp` * CUDA GPU implementation: `./src/caffe/layers/concat_layer.cu` -* Options (`ConcatParameter concat_param`) +* Parameters (`ConcatParameter concat_param`) - Optional - `concat_dim` [default 1]: 0 for concatenation along num and 1 for channels. * Input From 15456286da9378df6af796496ced5313ad7169f4 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 6 Sep 2014 21:39:56 -0700 Subject: [PATCH 0713/2053] [docs] tutorial/layers: brief descriptions of some loss layers --- docs/tutorial/layers.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 11ca70e50b9..036d9adc292 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -123,17 +123,21 @@ Loss drives learning by comparing an output to a target and assigning cost to mi #### Softmax -`SOFTMAX_LOSS` +* LayerType: `SOFTMAX_LOSS` + +The softmax loss layer computes the multinomial logistic loss of the softmax of its inputs. It's conceptually identical to a softmax layer followed by a multinomial logistic loss layer, but provides a more numerically stable gradient. #### Sum-of-Squares / Euclidean -`EUCLIDEAN_LOSS` +* LayerType: `EUCLIDEAN_LOSS` + +The Euclidean loss layer computes the sum of squares of differences of its two inputs, $$\frac 1 {2N} \sum_{i=1}^N \| x^1_i - x^2_i \|_2^2$$. #### Hinge / Margin * LayerType: `HINGE_LOSS` * CPU implementation: `./src/caffe/layers/hinge_loss_layer.cpp` -* CUDA GPU implementation: `NOT_AVAILABLE` +* CUDA GPU implementation: none yet * Parameters (`HingeLossParameter hinge_loss_param`) - Optional - `norm` [default L1]: the norm used. Currently L1, L2 @@ -164,6 +168,8 @@ Loss drives learning by comparing an output to a target and assigning cost to mi } } +The hinge loss layer computes a one-vs-all hinge or squared hinge loss. + #### Sigmoid Cross-Entropy `SIGMOID_CROSS_ENTROPY_LOSS` From bd13f32123dfe4f9a945367b94710a02172e3615 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 6 Sep 2014 21:42:35 -0700 Subject: [PATCH 0714/2053] [docs] tutorial/layers: clean up sample markdown --- docs/tutorial/layers.md | 98 ++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 036d9adc292..733ff96e523 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -201,12 +201,12 @@ In general, activation / Neuron layers are element-wise operators, taking one bo - `negative_slope` [default 0]: specifies whether to leak the negative part by multiplying it with the slope value rather than setting it to 0. * Sample (as seen in `./examples/imagenet/imagenet_train_val.prototxt`) - layers { - name: "relu1" - type: RELU - bottom: "conv1" - top: "conv1" - } + layers { + name: "relu1" + type: RELU + bottom: "conv1" + top: "conv1" + } Given an input value x, The `RELU` layer computes the output as x if x > 0 and negative_slope * x if x <= 0. When the negative slope parameter is not set, it is equivalent to the standard ReLU function of taking max(x, 0). It also supports in-place computation, meaning that the bottom and the top blob could be the same to preserve memory consumption. @@ -217,12 +217,12 @@ Given an input value x, The `RELU` layer computes the output as x if x > 0 and n * CUDA GPU implementation: `./src/caffe/layers/sigmoid_layer.cu` * Sample (as seen in `./examples/imagenet/mnist_autoencoder.prototxt`) - layers { - name: "encode1neuron" - bottom: "encode1" - top: "encode1neuron" - type: SIGMOID - } + layers { + name: "encode1neuron" + bottom: "encode1" + top: "encode1neuron" + type: SIGMOID + } The `SIGMOID` layer computes the output as sigmoid(x) for each input element x. @@ -233,12 +233,12 @@ The `SIGMOID` layer computes the output as sigmoid(x) for each input element x. * CUDA GPU implementation: `./src/caffe/layers/tanh_layer.cu` * Sample - layers { - name: "layer" - bottom: "in" - top: "out" - type: TANH - } + layers { + name: "layer" + bottom: "in" + top: "out" + type: TANH + } The `TANH` layer computes the output as tanh(x) for each input element x. @@ -249,12 +249,12 @@ The `TANH` layer computes the output as tanh(x) for each input element x. * CUDA GPU implementation: `./src/caffe/layers/absval_layer.cu` * Sample - layers { - name: "layer" - bottom: "in" - top: "out" - type: ABSVAL - } + layers { + name: "layer" + bottom: "in" + top: "out" + type: ABSVAL + } The `ABSVAL` layer computes the output as abs(x) for each input element x. @@ -270,17 +270,17 @@ The `ABSVAL` layer computes the output as abs(x) for each input element x. - `shift` [default 0] * Sample - layers { - name: "layer" - bottom: "in" - top: "out" - type: POWER - power_param { - power: 1 - scale: 1 - shift: 0 - } + layers { + name: "layer" + bottom: "in" + top: "out" + type: POWER + power_param { + power: 1 + scale: 1 + shift: 0 } + } The `POWER` layer computes the output as (shift + scale * x) ^ power for each input element x. @@ -291,12 +291,12 @@ The `POWER` layer computes the output as (shift + scale * x) ^ power for each in * CUDA GPU implementation: `./src/caffe/layers/bnll_layer.cu` * Sample - layers { - name: "layer" - bottom: "in" - top: "out" - type: BNLL - } + layers { + name: "layer" + bottom: "in" + top: "out" + type: BNLL + } The `BNLL` (binomial normal log likelihood) layer computes the output as log(1 + exp(x)) for each input element x. @@ -399,16 +399,16 @@ The `FLATTEN` layer is a utility layer that flattens an input of shape `n * c * - if `concat_dim = 1`: `n_1 * (c_1 + c_2 + ... + c_K) * h * w`, and all input `n_i` should be the same. * Sample - layers { - name: "concat" - bottom: "in1" - bottom: "in2" - top: "out" - type: CONCAT - concat_param { - concat_dim: 1 - } + layers { + name: "concat" + bottom: "in1" + bottom: "in2" + top: "out" + type: CONCAT + concat_param { + concat_dim: 1 } + } The `CONCAT` layer is a utility layer that concatenates its multiple input blobs to one single output blob. Currently, the layer supports concatenation along num or channels only. From cbc50e1c6621dff7221247429db9569d7318cec0 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 6 Sep 2014 22:09:13 -0700 Subject: [PATCH 0715/2053] [docs] tutorial/layers: describe some more data layers --- docs/tutorial/layers.md | 45 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 733ff96e523..266be934e82 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -303,25 +303,60 @@ The `BNLL` (binomial normal log likelihood) layer computes the output as log(1 + ### Data Layers +Data enters Caffe through data layers: they lie at the bottom of nets. Data can come from efficient databases (LevelDB or LMDB), directly from memory, or, when efficiency is not critical, from files on disk in HDF5 or common image formats. + +Common input preprocessing (mean subtraction, scaling, random cropping, and mirroring) is available by specifying `TransformationParameter`s. + #### Database -`DATA` +* LayerType: `DATA` +* Parameters + - Required + - `source`: the name of the directory containing the database + - `batch_size`: the number of inputs to process at one time + - Optional + - `rand_skip`: skip up to this number of inputs at the beginning; useful for asynchronous sgd + - `backend` [default `LEVELDB`]: choose whether to use a `LEVELDB` or `LMDB` + + #### In-Memory -`MEMORY_DATA` +* LayerType: `MEMORY_DATA` +* Parameters + - Required + - `batch_size`, `channels`, `height`, `width`: specify the size of input chunks to read from memory + +The memory data layer reads data directly from memory, without copying it. In order to use it, one must call `MemoryDataLayer::Reset` (from C++) or `Net.set_input_arrays` (from Python) in order to specify a source of contiguous data (as 4D row major array), which is read one batch-sized chunk at a time. #### HDF5 Input -`HDF5_DATA` +* LayerType: `HDF5_DATA` +* Parameters + - Required + - `source`: the name of the file to read from + - `batch_size` #### HDF5 Output -`HDF5_OUTPUT` +* LayerType: `HDF5_OUTPUT` +* Parameters + - Required + - `file_name`: name of file to write to + +The HDF5 output layer performs the opposite function of the other layers in this section: it writes its input blobs to disk. #### Images -`IMAGE_DATA` +* LayerType: `IMAGE_DATA` +* Parameters + - Required + - `source`: name of a text file, with each line giving an image filename and label + - `batch_size`: number of images to batch together + - Optional + - `rand_skip` + - `shuffle` [default false] + - `new_height`, `new_width`: if provided, resize all images to this size #### Windows From b37f4f9f68a6a3870dabfb71130f5a830652e24d Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 6 Sep 2014 22:10:29 -0700 Subject: [PATCH 0716/2053] [docs] tutorial/layers: fix inner product sample --- docs/tutorial/layers.md | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 266be934e82..8dd67275f58 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -387,27 +387,27 @@ The HDF5 output layer performs the opposite function of the other layers in this - `n * c_o * 1 * 1` * Sample - layers { - name: "fc8" - type: INNER_PRODUCT - blobs_lr: 1 # learning rate multiplier for the filters - blobs_lr: 2 # learning rate multiplier for the biases - weight_decay: 1 # weight decay multiplier for the filters - weight_decay: 0 # weight decay multiplier for the biases - inner_product_param { - num_output: 1000 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 0 + layers { + name: "fc8" + type: INNER_PRODUCT + blobs_lr: 1 # learning rate multiplier for the filters + blobs_lr: 2 # learning rate multiplier for the biases + weight_decay: 1 # weight decay multiplier for the filters + weight_decay: 0 # weight decay multiplier for the biases + inner_product_param { + num_output: 1000 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } } + bottom: "fc7" + top: "fc8" } - bottom: "fc7" - top: "fc8" - } The `INNER_PRODUCT` layer (also usually referred to as the fully connected layer) treats the input as a simple vector and produces an output in the form of a single vector (with the blob's height and width set to 1). From 3cf3df829eb9be6394203f257863469050b43ed4 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sun, 7 Sep 2014 09:44:58 +0200 Subject: [PATCH 0717/2053] fix transform_param in mnist_autoencoder.prototxt --- examples/mnist/mnist_autoencoder.prototxt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/mnist/mnist_autoencoder.prototxt b/examples/mnist/mnist_autoencoder.prototxt index b4345e71ce4..0b33781a16f 100644 --- a/examples/mnist/mnist_autoencoder.prototxt +++ b/examples/mnist/mnist_autoencoder.prototxt @@ -38,9 +38,9 @@ layers { source: "examples/mnist/mnist_test_lmdb" backend: LMDB batch_size: 100 - transform_param { - scale: 0.0039215684 - } + } + transform_param { + scale: 0.0039215684 } include: { phase: TEST From fb0a3d0275107e56a0337cc009bcacd84997337c Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Fri, 5 Sep 2014 05:01:46 -0700 Subject: [PATCH 0718/2053] remove uses of tmpnam --- include/caffe/util/io.hpp | 27 +++++++++++++ src/caffe/test/test_data_layer.cpp | 5 ++- src/caffe/test/test_hdf5_output_layer.cpp | 4 +- src/caffe/test/test_image_data_layer.cpp | 15 +++---- src/caffe/test/test_window_data_layer.cpp | 49 ----------------------- 5 files changed, 41 insertions(+), 59 deletions(-) delete mode 100644 src/caffe/test/test_window_data_layer.cpp diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 546c3d6af80..8dd338d2603 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -1,6 +1,7 @@ #ifndef CAFFE_UTIL_IO_H_ #define CAFFE_UTIL_IO_H_ +#include <unistd.h> #include <string> #include "google/protobuf/message.h" @@ -21,6 +22,32 @@ namespace caffe { using ::google::protobuf::Message; +inline void MakeTempFilename(string* temp_filename) { + temp_filename->clear(); + *temp_filename = "/tmp/caffe_test.XXXXXX"; + char* temp_filename_cstr = new char[temp_filename->size()]; + // NOLINT_NEXT_LINE(runtime/printf) + strcpy(temp_filename_cstr, temp_filename->c_str()); + int fd = mkstemp(temp_filename_cstr); + CHECK_GE(fd, 0) << "Failed to open a temporary file at: " << *temp_filename; + close(fd); + *temp_filename = temp_filename_cstr; + delete temp_filename_cstr; +} + +inline void MakeTempDir(string* temp_dirname) { + temp_dirname->clear(); + *temp_dirname = "/tmp/caffe_test.XXXXXX"; + char* temp_dirname_cstr = new char[temp_dirname->size()]; + // NOLINT_NEXT_LINE(runtime/printf) + strcpy(temp_dirname_cstr, temp_dirname->c_str()); + char* mkdtemp_result = mkdtemp(temp_dirname_cstr); + CHECK(mkdtemp_result != NULL) + << "Failed to create a temporary directory at: " << *temp_dirname; + *temp_dirname = temp_dirname_cstr; + delete temp_dirname_cstr; +} + bool ReadProtoFromTextFile(const char* filename, Message* proto); inline bool ReadProtoFromTextFile(const string& filename, Message* proto) { diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index e01932b7f1f..887124aa5bc 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -8,6 +8,7 @@ #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" #include "caffe/test/test_caffe_main.hpp" @@ -21,11 +22,13 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { protected: DataLayerTest() : backend_(DataParameter_DB_LEVELDB), - filename_(new string(tmpnam(NULL))), blob_top_data_(new Blob<Dtype>()), blob_top_label_(new Blob<Dtype>()), seed_(1701) {} virtual void SetUp() { + filename_.reset(new string()); + MakeTempDir(filename_.get()); + *filename_ += "/db"; blob_top_vec_.push_back(blob_top_data_); blob_top_vec_.push_back(blob_top_label_); } diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index b2a511d1d09..eb09c8d1f3a 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -22,8 +22,7 @@ class HDF5OutputLayerTest : public MultiDeviceTest<TypeParam> { protected: HDF5OutputLayerTest() - : output_file_name_(tmpnam(NULL)), - input_file_name_( + : input_file_name_( CMAKE_SOURCE_DIR "caffe/test/test_data/sample_data.h5"), blob_data_(new Blob<Dtype>()), blob_label_(new Blob<Dtype>()), @@ -31,6 +30,7 @@ class HDF5OutputLayerTest : public MultiDeviceTest<TypeParam> { channels_(8), height_(5), width_(5) { + MakeTempFilename(&output_file_name_); } virtual ~HDF5OutputLayerTest() { diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index ab2365c6556..d098c765258 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -8,6 +8,7 @@ #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" #include "caffe/test/test_caffe_main.hpp" @@ -21,16 +22,16 @@ class ImageDataLayerTest : public MultiDeviceTest<TypeParam> { protected: ImageDataLayerTest() : seed_(1701), - filename_(new string(tmpnam(NULL))), blob_top_data_(new Blob<Dtype>()), blob_top_label_(new Blob<Dtype>()) {} virtual void SetUp() { + MakeTempFilename(&filename_); blob_top_vec_.push_back(blob_top_data_); blob_top_vec_.push_back(blob_top_label_); Caffe::set_random_seed(seed_); // Create a Vector of files with labels - std::ofstream outfile(filename_->c_str(), std::ofstream::out); - LOG(INFO) << "Using temporary file " << *filename_; + std::ofstream outfile(filename_.c_str(), std::ofstream::out); + LOG(INFO) << "Using temporary file " << filename_; for (int i = 0; i < 5; ++i) { outfile << EXAMPLES_SOURCE_DIR "images/cat.jpg " << i; } @@ -43,7 +44,7 @@ class ImageDataLayerTest : public MultiDeviceTest<TypeParam> { } int seed_; - shared_ptr<string> filename_; + string filename_; Blob<Dtype>* const blob_top_data_; Blob<Dtype>* const blob_top_label_; vector<Blob<Dtype>*> blob_bottom_vec_; @@ -57,7 +58,7 @@ TYPED_TEST(ImageDataLayerTest, TestRead) { LayerParameter param; ImageDataParameter* image_data_param = param.mutable_image_data_param(); image_data_param->set_batch_size(5); - image_data_param->set_source(this->filename_->c_str()); + image_data_param->set_source(this->filename_.c_str()); image_data_param->set_shuffle(false); ImageDataLayer<Dtype> layer(param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); @@ -83,7 +84,7 @@ TYPED_TEST(ImageDataLayerTest, TestResize) { LayerParameter param; ImageDataParameter* image_data_param = param.mutable_image_data_param(); image_data_param->set_batch_size(5); - image_data_param->set_source(this->filename_->c_str()); + image_data_param->set_source(this->filename_.c_str()); image_data_param->set_new_height(256); image_data_param->set_new_width(256); image_data_param->set_shuffle(false); @@ -111,7 +112,7 @@ TYPED_TEST(ImageDataLayerTest, TestShuffle) { LayerParameter param; ImageDataParameter* image_data_param = param.mutable_image_data_param(); image_data_param->set_batch_size(5); - image_data_param->set_source(this->filename_->c_str()); + image_data_param->set_source(this->filename_.c_str()); image_data_param->set_shuffle(true); ImageDataLayer<Dtype> layer(param); layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); diff --git a/src/caffe/test/test_window_data_layer.cpp b/src/caffe/test/test_window_data_layer.cpp deleted file mode 100644 index 47591b60154..00000000000 --- a/src/caffe/test/test_window_data_layer.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include <string> -#include <vector> - -#include "gtest/gtest.h" - -#include "caffe/blob.hpp" -#include "caffe/common.hpp" -#include "caffe/data_layers.hpp" -#include "caffe/proto/caffe.pb.h" - -#include "caffe/test/test_caffe_main.hpp" - -namespace caffe { - -template <typename TypeParam> -class WindowDataLayerTest : public MultiDeviceTest<TypeParam> { - typedef typename TypeParam::Dtype Dtype; - - protected: - WindowDataLayerTest() - : seed_(1701), - filename_(new string(tmpnam(NULL))), - blob_top_data_(new Blob<Dtype>()), - blob_top_label_(new Blob<Dtype>()) {} - virtual void SetUp() { - blob_top_vec_.push_back(blob_top_data_); - blob_top_vec_.push_back(blob_top_label_); - Caffe::set_random_seed(seed_); - } - - virtual ~WindowDataLayerTest() { - delete blob_top_data_; - delete blob_top_label_; - } - - int seed_; - shared_ptr<string> filename_; - Blob<Dtype>* const blob_top_data_; - Blob<Dtype>* const blob_top_label_; - vector<Blob<Dtype>*> blob_bottom_vec_; - vector<Blob<Dtype>*> blob_top_vec_; -}; - -TYPED_TEST_CASE(WindowDataLayerTest, TestDtypesAndDevices); - -TYPED_TEST(WindowDataLayerTest, TestNothing) { -} - -} // namespace caffe From 3182b1c330c8d1bc2abee0e1de537e0babb2ae85 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sun, 7 Sep 2014 11:47:31 +0200 Subject: [PATCH 0719/2053] add <cuda>/lib64 only if exists to suppress linker warnings --- Makefile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 546de931f7e..525e7e9ea8b 100644 --- a/Makefile +++ b/Makefile @@ -151,7 +151,13 @@ NONEMPTY_WARN_REPORT := $(BUILD_DIR)/$(WARNS_EXT) # Derive include and lib directories ############################## CUDA_INCLUDE_DIR := $(CUDA_DIR)/include -CUDA_LIB_DIR := $(CUDA_DIR)/lib64 $(CUDA_DIR)/lib + +CUDA_LIB_DIR := +# add <cuda>/lib64 only if it exists +ifneq ("$(wildcard $(CUDA_DIR)/lib64)","") + CUDA_LIB_DIR += $(CUDA_DIR)/lib64 +endif +CUDA_LIB_DIR += $(CUDA_DIR)/lib INCLUDE_DIRS += $(BUILD_INCLUDE_DIR) ./src ./include ifneq ($(CPU_ONLY), 1) From 1cb704025eb1f70dba5355fd374110f65ab7c365 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek <kosiorek.adam@gmail.com> Date: Sat, 6 Sep 2014 01:23:02 +0200 Subject: [PATCH 0720/2053] enabled object file reusing in test builds --- src/caffe/test/CMakeLists.txt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index ffcc58f5463..8ff6390677f 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -10,6 +10,7 @@ set(TEST_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) # test executables are go set(TEST_EXT .testbin) # test executable extension set(ALL_TEST test${TEST_EXT}) # name of an executable comprising of all tests set(RUN_TEST runtest) # dummy target for running tests +set(TEST_MAIN_LIB test_main_lib) # name of a dummy lib containing main function # Generate config files add_definitions(-DCMAKE_BUILD) # definition needed in order to include CMake's generated files @@ -42,20 +43,30 @@ if(NOT CPU_ONLY) set(TEST_CPP_SOURCES ${TEST_CPP_SOURCES} ${TEST_CU_SOURCES}) endif() +add_library(${TEST_MAIN_LIB} EXCLUDE_FROM_ALL ${TEST_MAIN}) +target_link_libraries(${TEST_MAIN_LIB} gtest caffe) + # Build each test separately foreach(source ${TEST_CPP_SOURCES}) get_filename_component(name ${source} NAME_WE) set(TEST_NAME ${name}${TEST_EXT}) - add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_MAIN} ${source} ../blob.cpp) - target_link_libraries(${TEST_NAME} gtest caffe) + + add_library(${TEST_NAME}.lib OBJECT ${source}) + set(TEST_OBJ_LIB $<TARGET_OBJECTS:${TEST_NAME}.lib>) + add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_OBJ_LIB}) + + target_link_libraries(${TEST_NAME} ${TEST_MAIN_LIB}) # output dir set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) + + # Targets and object libs set(TEST_TARGETS ${TEST_TARGETS} ${TEST_NAME}) + set(TEST_OBJ_LIBS ${TEST_OBJ_LIBS} ${TEST_OBJ_LIB}) endforeach() # Build a compound test excluded from the ALL target -add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_CPP_SOURCES} ${TEST_MAIN}) -target_link_libraries(${ALL_TEST} gtest caffe) +add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_OBJ_LIBS} ) +target_link_libraries(${ALL_TEST} ${TEST_MAIN_LIB}) add_dependencies(${ALL_TEST} ${TEST_TARGETS}) # output dir set_target_properties(${ALL_TEST} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIRECTORY}) From 37e55faef8566b3ae99cbf44805bd344135bffc1 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek <kosiorek.adam@gmail.com> Date: Sat, 6 Sep 2014 14:40:54 +0200 Subject: [PATCH 0721/2053] cpp and cu files processed separately in test build --- src/caffe/test/CMakeLists.txt | 58 ++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index 8ff6390677f..7a2a5305b54 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -10,7 +10,7 @@ set(TEST_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) # test executables are go set(TEST_EXT .testbin) # test executable extension set(ALL_TEST test${TEST_EXT}) # name of an executable comprising of all tests set(RUN_TEST runtest) # dummy target for running tests -set(TEST_MAIN_LIB test_main_lib) # name of a dummy lib containing main function +set(TEST_MAIN test_caffe_main.cpp) # main test file (with main function) # Generate config files add_definitions(-DCMAKE_BUILD) # definition needed in order to include CMake's generated files @@ -36,26 +36,28 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ) -set(TEST_MAIN test_caffe_main.cpp) +# Remove main from test sources and prepare an Object lib with main +file(GLOB TEST_MAIN ${TEST_MAIN}) list(REMOVE_ITEM TEST_CPP_SOURCES ${TEST_MAIN}) +add_library(main_obj EXCLUDE_FROM_ALL OBJECT ${TEST_MAIN}) -if(NOT CPU_ONLY) - set(TEST_CPP_SOURCES ${TEST_CPP_SOURCES} ${TEST_CU_SOURCES}) -endif() - -add_library(${TEST_MAIN_LIB} EXCLUDE_FROM_ALL ${TEST_MAIN}) -target_link_libraries(${TEST_MAIN_LIB} gtest caffe) +#if(NOT CPU_ONLY) +# set(TEST_CPP_SOURCES ${TEST_CPP_SOURCES} ${TEST_CU_SOURCES}) +#endif() -# Build each test separately +# Build each test separately from *.cpp files foreach(source ${TEST_CPP_SOURCES}) + # get_filename_component(name ${source} NAME_WE) set(TEST_NAME ${name}${TEST_EXT}) - add_library(${TEST_NAME}.lib OBJECT ${source}) - set(TEST_OBJ_LIB $<TARGET_OBJECTS:${TEST_NAME}.lib>) - add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_OBJ_LIB}) + # + add_library(${TEST_NAME}.obj OBJECT ${source}) + set(TEST_OBJ_LIB $<TARGET_OBJECTS:${TEST_NAME}.obj>) + + add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_OBJ_LIB} $<TARGET_OBJECTS:main_obj>) + target_link_libraries(${TEST_NAME} gtest caffe) - target_link_libraries(${TEST_NAME} ${TEST_MAIN_LIB}) # output dir set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) @@ -64,10 +66,36 @@ foreach(source ${TEST_CPP_SOURCES}) set(TEST_OBJ_LIBS ${TEST_OBJ_LIBS} ${TEST_OBJ_LIB}) endforeach() +# Build each test separately from *.cu files +if(NOT CPU_ONLY) + foreach(source ${TEST_CU_SOURCES}) + # + get_filename_component(name ${source} NAME_WE) + set(TEST_NAME ${name}${TEST_EXT}) + + # + add_library(${TEST_NAME}.lib ${source}) + + add_executable(${TEST_NAME} EXCLUDE_FROM_ALL $<TARGET_OBJECTS:main_obj>) + target_link_libraries(${TEST_NAME} ${TEST_NAME}.lib gtest caffe) + + # output dir + set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) + + # Targets and object libs + set(TEST_TARGETS ${TEST_TARGETS} ${TEST_NAME}) + set(TEST_CU_LIBS ${TEST_CU_LIBS} ${TEST_NAME}.lib) + endforeach() +endif() + # Build a compound test excluded from the ALL target -add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_OBJ_LIBS} ) -target_link_libraries(${ALL_TEST} ${TEST_MAIN_LIB}) +add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_OBJ_LIBS} $<TARGET_OBJECTS:main_obj>) +if(NOT CPU_ONLY) + target_link_libraries(${ALL_TEST} ${TEST_CU_LIBS}) +endif() +target_link_libraries(${ALL_TEST} gtest caffe) add_dependencies(${ALL_TEST} ${TEST_TARGETS}) + # output dir set_target_properties(${ALL_TEST} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIRECTORY}) # Test command From 9086df9e20fd45b001abd1d2ecd3082d8e1dc183 Mon Sep 17 00:00:00 2001 From: Adam Kosiorek <kosiorek.adam@gmail.com> Date: Sun, 7 Sep 2014 19:03:44 +0200 Subject: [PATCH 0722/2053] added common.cpp explicitly to tests --- src/caffe/test/CMakeLists.txt | 58 +++++++++++++++++------------------ 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index 7a2a5305b54..20a1d084d6a 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -19,6 +19,14 @@ set(GEN_EXT .gen.cmake) # generated output file extension set(TEST_DEFINES_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp) set(TEST_DATA_FILE ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt) +# Function prepares name of a test executable +# @output_name - output variable's name +# @filename - test_*.cpp file path +function(test_name output_name filename) + get_filename_component(name ${filename} NAME_WE) + set(${output_name} ${name}${TEST_EXT} PARENT_SCOPE) +endfunction() + set(IN_FILES # generator input files ${TEST_DEFINES_FILE} ${TEST_DATA_FILE} @@ -39,20 +47,14 @@ include_directories( # Remove main from test sources and prepare an Object lib with main file(GLOB TEST_MAIN ${TEST_MAIN}) list(REMOVE_ITEM TEST_CPP_SOURCES ${TEST_MAIN}) -add_library(main_obj EXCLUDE_FROM_ALL OBJECT ${TEST_MAIN}) - -#if(NOT CPU_ONLY) -# set(TEST_CPP_SOURCES ${TEST_CPP_SOURCES} ${TEST_CU_SOURCES}) -#endif() +add_library(main_obj EXCLUDE_FROM_ALL OBJECT ${TEST_MAIN} ../common.cpp) # Build each test separately from *.cpp files foreach(source ${TEST_CPP_SOURCES}) - # - get_filename_component(name ${source} NAME_WE) - set(TEST_NAME ${name}${TEST_EXT}) + test_name(TEST_NAME ${source}) # - add_library(${TEST_NAME}.obj OBJECT ${source}) + add_library(${TEST_NAME}.obj EXCLUDE_FROM_ALL OBJECT ${source}) set(TEST_OBJ_LIB $<TARGET_OBJECTS:${TEST_NAME}.obj>) add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_OBJ_LIB} $<TARGET_OBJECTS:main_obj>) @@ -67,26 +69,21 @@ foreach(source ${TEST_CPP_SOURCES}) endforeach() # Build each test separately from *.cu files -if(NOT CPU_ONLY) - foreach(source ${TEST_CU_SOURCES}) - # - get_filename_component(name ${source} NAME_WE) - set(TEST_NAME ${name}${TEST_EXT}) - - # - add_library(${TEST_NAME}.lib ${source}) - - add_executable(${TEST_NAME} EXCLUDE_FROM_ALL $<TARGET_OBJECTS:main_obj>) - target_link_libraries(${TEST_NAME} ${TEST_NAME}.lib gtest caffe) - - # output dir - set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) - - # Targets and object libs - set(TEST_TARGETS ${TEST_TARGETS} ${TEST_NAME}) - set(TEST_CU_LIBS ${TEST_CU_LIBS} ${TEST_NAME}.lib) - endforeach() -endif() +foreach(source ${TEST_CU_SOURCES}) + test_name(TEST_NAME ${source}) + + cuda_add_library(${TEST_NAME}.lib EXCLUDE_FROM_ALL ${source}) + + add_executable(${TEST_NAME} EXCLUDE_FROM_ALL $<TARGET_OBJECTS:main_obj>) + target_link_libraries(${TEST_NAME} ${TEST_NAME}.lib gtest caffe) + + # output dir + set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) + + # Targets and object libs + set(TEST_TARGETS ${TEST_TARGETS} ${TEST_NAME}) + set(TEST_CU_LIBS ${TEST_CU_LIBS} ${TEST_NAME}.lib) +endforeach() # Build a compound test excluded from the ALL target add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_OBJ_LIBS} $<TARGET_OBJECTS:main_obj>) @@ -96,8 +93,9 @@ endif() target_link_libraries(${ALL_TEST} gtest caffe) add_dependencies(${ALL_TEST} ${TEST_TARGETS}) -# output dir +# Output directory set_target_properties(${ALL_TEST} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIRECTORY}) + # Test command set(TEST_ARGS --gtest_shuffle) if(CPU_ONLY) From 77d91242cd08b3671e2165769928f729e6ec4f17 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 14:51:24 -0700 Subject: [PATCH 0723/2053] add cuDNN to build --- Makefile | 9 ++- Makefile.config.example | 3 + include/caffe/util/cudnn.hpp | 92 +++++++++++++++++++++++++ include/caffe/util/device_alternate.hpp | 3 + src/caffe/layer_factory.cpp | 18 +++++ src/caffe/proto/caffe.proto | 6 ++ 6 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 include/caffe/util/cudnn.hpp diff --git a/Makefile b/Makefile index 546de931f7e..ab57088292f 100644 --- a/Makefile +++ b/Makefile @@ -253,10 +253,17 @@ endif # Debugging ifeq ($(DEBUG), 1) COMMON_FLAGS += -DDEBUG -g -O0 + NVCCFLAGS += -G else COMMON_FLAGS += -DNDEBUG -O2 endif +# cuDNN acceleration configuration. +ifeq ($(USE_CUDNN), 1) + LIBRARIES += cudnn + COMMON_FLAGS += -DUSE_CUDNN +endif + # CPU-only configuration ifeq ($(CPU_ONLY), 1) OBJS := $(PROTO_OBJS) $(CXX_OBJS) @@ -299,7 +306,7 @@ LIBRARY_DIRS += $(BLAS_LIB) # Complete build flags. COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir)) CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) -NVCCFLAGS := -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) +NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) # mex may invoke an older gcc that is too liberal with -Wuninitalized MATLAB_CXXFLAGS := $(CXXFLAGS) -Wno-uninitialized LINKFLAGS += -fPIC $(COMMON_FLAGS) $(WARNINGS) diff --git a/Makefile.config.example b/Makefile.config.example index 7c96d8a9356..5cb0b243aca 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -1,6 +1,9 @@ ## Refer to http://caffe.berkeleyvision.org/installation.html # Contributions simplifying and improving our build system are welcome! +# cuDNN acceleration switch (uncomment to build with cuDNN). +# USE_CUDNN := 1 + # CPU-only switch (uncomment to build without GPU support). # CPU_ONLY := 1 diff --git a/include/caffe/util/cudnn.hpp b/include/caffe/util/cudnn.hpp new file mode 100644 index 00000000000..1fe72f1e8bc --- /dev/null +++ b/include/caffe/util/cudnn.hpp @@ -0,0 +1,92 @@ +#ifndef CAFFE_UTIL_CUDNN_H_ +#define CAFFE_UTIL_CUDNN_H_ +#ifdef USE_CUDNN + +#include <cudnn.h> + +#include "caffe/proto/caffe.pb.h" + +#define CUDNN_CHECK(condition) \ + do { \ + cudnnStatus_t status = condition; \ + CHECK_EQ(status, CUDNN_STATUS_SUCCESS) << " cuDNN error."; \ + } while (0) + +namespace caffe { + +// TODO(cudnn): check existence, add to CUDN_CHECK +// const char* cudnnGetErrorString(curandStatus_t error); +// +namespace cudnn { + +template <typename Dtype> class dataType; +template<> class dataType<float> { + public: + static const cudnnDataType_t type = CUDNN_DATA_FLOAT; +}; +template<> class dataType<double> { + public: + static const cudnnDataType_t type = CUDNN_DATA_DOUBLE; +}; + +template <typename Dtype> +inline void createTensor4dDesc(cudnnTensor4dDescriptor_t* desc, + int n, int c, int h, int w, + int stride_n, int stride_c, int stride_h, int stride_w) { + CUDNN_CHECK(cudnnCreateTensor4dDescriptor(desc)); + CUDNN_CHECK(cudnnSetTensor4dDescriptorEx(*desc, dataType<Dtype>::type, + n, c, h, w, stride_n, stride_c, stride_h, stride_w)); +} + +template <typename Dtype> +inline void createTensor4dDesc(cudnnTensor4dDescriptor_t* desc, + int n, int c, int h, int w) { + const int stride_w = 1; + const int stride_h = w * stride_w; + const int stride_c = h * stride_h; + const int stride_n = c * stride_c; + createTensor4dDesc<Dtype>(desc, n, c, h, w, + stride_n, stride_c, stride_h, stride_w); +} + +template <typename Dtype> +inline void createFilterDesc(cudnnFilterDescriptor_t* desc, + int n, int c, int h, int w) { + CUDNN_CHECK(cudnnCreateFilterDescriptor(desc)); + CUDNN_CHECK(cudnnSetFilterDescriptor(*desc, dataType<Dtype>::type, + n, c, h, w)); +} + +template <typename Dtype> +inline void createConvolutionDesc(cudnnConvolutionDescriptor_t* conv, + cudnnTensor4dDescriptor_t bottom, cudnnFilterDescriptor_t filter, + int pad_h, int pad_w, int stride_h, int stride_w) { + CUDNN_CHECK(cudnnCreateConvolutionDescriptor(conv)); + CUDNN_CHECK(cudnnSetConvolutionDescriptor(*conv, bottom, filter, + pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION)); +} + +template <typename Dtype> +inline void createPoolingDesc(cudnnPoolingDescriptor_t* conv, + PoolingParameter_PoolMethod poolmethod, cudnnPoolingMode_t* mode, + int h, int w, int stride_h, int stride_w) { + switch (poolmethod) { + case PoolingParameter_PoolMethod_MAX: + *mode = CUDNN_POOLING_MAX; + break; + case PoolingParameter_PoolMethod_AVE: + *mode = CUDNN_POOLING_AVERAGE; + break; + default: + LOG(FATAL) << "Unknown pooling method."; + } + CUDNN_CHECK(cudnnCreatePoolingDescriptor(conv)); + CUDNN_CHECK(cudnnSetPoolingDescriptor(*conv, *mode, h, w, + stride_h, stride_w)); +} + +} // namespace cudnn +} // namespace caffe + +#endif // USE_CUDNN +#endif // CAFFE_UTIL_CUDNN_H_ diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index bb3ac61648b..3df28a49ac3 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -36,6 +36,9 @@ void classname<Dtype>::funcname##_##gpu(const vector<Blob<Dtype>*>& top, \ #include <cuda_runtime.h> #include <curand.h> #include <driver_types.h> // cuda driver types +#ifdef USE_CUDNN // cuDNN acceleration library. +#include "caffe/util/cudnn.hpp" +#endif // // CUDA macros diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 09b0f900d95..b7b10988a3f 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -16,6 +16,9 @@ ConvolutionLayer<Dtype>* GetConvolutionLayer(const string& name, ConvolutionParameter_Engine engine = param.convolution_param().engine(); if (engine == ConvolutionParameter_Engine_DEFAULT) { engine = ConvolutionParameter_Engine_CAFFE; +#ifdef USE_CUDNN + engine = ConvolutionParameter_Engine_CUDNN; +#endif } if (engine == ConvolutionParameter_Engine_CAFFE) { return new ConvolutionLayer<Dtype>(param); @@ -36,6 +39,9 @@ PoolingLayer<Dtype>* GetPoolingLayer(const string& name, PoolingParameter_Engine engine = param.pooling_param().engine(); if (engine == PoolingParameter_Engine_DEFAULT) { engine = PoolingParameter_Engine_CAFFE; +#ifdef USE_CUDNN + engine = PoolingParameter_Engine_CUDNN; +#endif } if (engine == PoolingParameter_Engine_CAFFE) { return new PoolingLayer<Dtype>(param); @@ -56,6 +62,9 @@ ReLULayer<Dtype>* GetReLULayer(const string& name, ReLUParameter_Engine engine = param.relu_param().engine(); if (engine == ReLUParameter_Engine_DEFAULT) { engine = ReLUParameter_Engine_CAFFE; +#ifdef USE_CUDNN + engine = ReLUParameter_Engine_CUDNN; +#endif } if (engine == ReLUParameter_Engine_CAFFE) { return new ReLULayer<Dtype>(param); @@ -76,6 +85,9 @@ SigmoidLayer<Dtype>* GetSigmoidLayer(const string& name, SigmoidParameter_Engine engine = param.sigmoid_param().engine(); if (engine == SigmoidParameter_Engine_DEFAULT) { engine = SigmoidParameter_Engine_CAFFE; +#ifdef USE_CUDNN + engine = SigmoidParameter_Engine_CUDNN; +#endif } if (engine == SigmoidParameter_Engine_CAFFE) { return new SigmoidLayer<Dtype>(param); @@ -96,6 +108,9 @@ TanHLayer<Dtype>* GetTanHLayer(const string& name, TanHParameter_Engine engine = param.tanh_param().engine(); if (engine == TanHParameter_Engine_DEFAULT) { engine = TanHParameter_Engine_CAFFE; +#ifdef USE_CUDNN + engine = TanHParameter_Engine_CUDNN; +#endif } if (engine == TanHParameter_Engine_CAFFE) { return new TanHLayer<Dtype>(param); @@ -116,6 +131,9 @@ SoftmaxLayer<Dtype>* GetSoftmaxLayer(const string& name, SoftmaxParameter_Engine engine = param.softmax_param().engine(); if (engine == SoftmaxParameter_Engine_DEFAULT) { engine = SoftmaxParameter_Engine_CAFFE; +#ifdef USE_CUDNN + engine = SoftmaxParameter_Engine_CUDNN; +#endif } if (engine == SoftmaxParameter_Engine_CAFFE) { return new SoftmaxLayer<Dtype>(param); diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 082feb831b0..8cb82cebe22 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -388,6 +388,7 @@ message ConvolutionParameter { enum Engine { DEFAULT = 0; CAFFE = 1; + CUDNN = 2; } optional Engine engine = 15 [default = DEFAULT]; } @@ -579,6 +580,7 @@ message PoolingParameter { enum Engine { DEFAULT = 0; CAFFE = 1; + CUDNN = 2; } optional Engine engine = 11 [default = DEFAULT]; } @@ -602,6 +604,7 @@ message ReLUParameter { enum Engine { DEFAULT = 0; CAFFE = 1; + CUDNN = 2; } optional Engine engine = 2 [default = DEFAULT]; } @@ -611,6 +614,7 @@ message SigmoidParameter { enum Engine { DEFAULT = 0; CAFFE = 1; + CUDNN = 2; } optional Engine engine = 1 [default = DEFAULT]; } @@ -630,6 +634,7 @@ message SoftmaxParameter { enum Engine { DEFAULT = 0; CAFFE = 1; + CUDNN = 2; } optional Engine engine = 1 [default = DEFAULT]; } @@ -639,6 +644,7 @@ message TanHParameter { enum Engine { DEFAULT = 0; CAFFE = 1; + CUDNN = 2; } optional Engine engine = 1 [default = DEFAULT]; } From 8819f5953b903ec8b48e541271737e89a2cd24e6 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 3 Sep 2014 17:45:14 -0700 Subject: [PATCH 0724/2053] call __signbit for CUDA >= 6.5 implementation --- src/caffe/util/math_functions.cu | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index 4ae4bba6029..176da93161c 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -329,7 +329,12 @@ void caffe_gpu_powx<double>(const int N, const double* a, DEFINE_AND_INSTANTIATE_GPU_UNARY_FUNC(sign, y[index] = (Dtype(0) < x[index]) - (x[index] < Dtype(0))); +#if CUDA_VERSION >= 6050 +// __signbit to pick up the CUDA function. +DEFINE_AND_INSTANTIATE_GPU_UNARY_FUNC(sgnbit, y[index] = __signbit(x[index])); +#else DEFINE_AND_INSTANTIATE_GPU_UNARY_FUNC(sgnbit, y[index] = signbit(x[index])); +#endif __global__ void popc_kernel(const int n, const float* a, const float* b, uint8_t* y) { From d1b38ee630e3d83d70d5b8e51b416d5f94fb23cb Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 1 Sep 2014 22:05:43 -0700 Subject: [PATCH 0725/2053] strategize cuDNN convolution --- include/caffe/vision_layers.hpp | 30 +++ src/caffe/layer_factory.cpp | 4 + src/caffe/layers/conv_layer.cpp | 10 +- src/caffe/layers/cudnn_conv_layer.cpp | 113 +++++++++ src/caffe/layers/cudnn_conv_layer.cu | 121 +++++++++ src/caffe/test/test_convolution_layer.cpp | 291 ++++++++++++++++++++++ 6 files changed, 564 insertions(+), 5 deletions(-) create mode 100644 src/caffe/layers/cudnn_conv_layer.cpp create mode 100644 src/caffe/layers/cudnn_conv_layer.cu diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 2dca2bf73ed..4269163afff 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -63,6 +63,36 @@ class ConvolutionLayer : public Layer<Dtype> { Blob<Dtype> bias_multiplier_; }; +#ifdef USE_CUDNN +/* + * @brief cuDNN implementation of ConvolutionLayer. + * Fallback to ConvolutionLayer for CPU mode. +*/ +template <typename Dtype> +class CuDNNConvolutionLayer : public ConvolutionLayer<Dtype> { + public: + explicit CuDNNConvolutionLayer(const LayerParameter& param) + : ConvolutionLayer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual ~CuDNNConvolutionLayer(); + + protected: + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + + cudnnHandle_t* handle_; + cudaStream_t* stream_; + vector<cudnnTensor4dDescriptor_t> bottom_descs_, top_descs_; + cudnnTensor4dDescriptor_t bias_desc_; + cudnnFilterDescriptor_t filter_desc_; + vector<cudnnConvolutionDescriptor_t> conv_descs_; + int bottom_offset_, top_offset_, weight_offset_, bias_offset_; +}; +#endif + /** * @brief A helper for image operations that rearranges image regions into * column vectors. Used by ConvolutionLayer to perform convolution diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index b7b10988a3f..ef1b7564518 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -22,6 +22,10 @@ ConvolutionLayer<Dtype>* GetConvolutionLayer(const string& name, } if (engine == ConvolutionParameter_Engine_CAFFE) { return new ConvolutionLayer<Dtype>(param); +#ifdef USE_CUDNN + } else if (engine == ConvolutionParameter_Engine_CUDNN) { + return new CuDNNConvolutionLayer<Dtype>(param); +#endif } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 1a1248f3dda..81ad4f968fb 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -66,11 +66,11 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK_EQ(channels_ % group_, 0); // The im2col result buffer would only hold one image at a time to avoid // overly large memory usage. - int height_out = + height_out_ = (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; - int width_out = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; + width_out_ = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; col_buffer_.Reshape( - 1, channels_ * kernel_h_ * kernel_w_, height_out, width_out); + 1, channels_ * kernel_h_ * kernel_w_, height_out_, width_out_); // Set the parameters CHECK_EQ(num_output_ % group_, 0) << "Number of output should be multiples of group."; @@ -78,9 +78,9 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, // Figure out the dimensions for individual gemms. M_ = num_output_ / group_; K_ = channels_ * kernel_h_ * kernel_w_ / group_; - N_ = height_out * width_out; + N_ = height_out_ * width_out_; for (int top_id = 0; top_id < top->size(); ++top_id) { - (*top)[top_id]->Reshape(num_, num_output_, height_out, width_out); + (*top)[top_id]->Reshape(num_, num_output_, height_out_, width_out_); } // Check if we need to set up the weights if (this->blobs_.size() > 0) { diff --git a/src/caffe/layers/cudnn_conv_layer.cpp b/src/caffe/layers/cudnn_conv_layer.cpp new file mode 100644 index 00000000000..a27d19ce04a --- /dev/null +++ b/src/caffe/layers/cudnn_conv_layer.cpp @@ -0,0 +1,113 @@ +#ifdef USE_CUDNN +#include <vector> + +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +// Set to three for the benefit of the backward pass, which +// can use separate streams for calculating the gradient w.r.t. +// bias, filter weights, and bottom data for each group independently +#define CUDNN_STREAMS_PER_GROUP 3 + +/** + * TODO(dox) explain cuDNN interface + */ +template <typename Dtype> +void CuDNNConvolutionLayer<Dtype>::LayerSetUp( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + ConvolutionLayer<Dtype>::LayerSetUp(bottom, top); + // Initialize CUDA streams and cuNN. + stream_ = new cudaStream_t[this->group_ * CUDNN_STREAMS_PER_GROUP]; + handle_ = new cudnnHandle_t[this->group_ * CUDNN_STREAMS_PER_GROUP]; + + for (int g = 0; g < this->group_ * CUDNN_STREAMS_PER_GROUP; g++) { + // TODO(cudnn) check + cudaError_t err = cudaStreamCreate(&stream_[g]); + CHECK_EQ(err, cudaSuccess) << "Error creating a CUDA stream."; + + // TODO(cudnn) check + cudnnStatus_t stat; + stat = cudnnCreate(&handle_[g]); + CHECK_EQ(stat, CUDNN_STATUS_SUCCESS) << "Could not create a CUDNN handle."; + stat = cudnnSetStream(handle_[g], stream_[g]); + CHECK_EQ(stat, CUDNN_STATUS_SUCCESS) << "Could not set CUDNN stream."; + } + + // Set the indexing parameters. + bottom_offset_ = (this->channels_ / this->group_) + * this->height_ * this->width_; + top_offset_ = (this->num_output_ / this->group_) + * this->height_out_ * this->width_out_; + weight_offset_ = (this->num_output_ / this->group_) + * (this->channels_ / this->group_) * this->kernel_h_ * this->kernel_w_; + bias_offset_ = (this->num_output_ / this->group_); + + // Create filter descriptor. + cudnn::createFilterDesc<Dtype>(&filter_desc_, + this->num_output_ / this->group_, this->channels_ / this->group_, + this->kernel_h_, this->kernel_w_); + + // Create tensor descriptor(s) for data and corresponding convolution(s). + for (int i = 0; i < bottom.size(); i++) { + cudnnTensor4dDescriptor_t bottom_desc; + cudnn::createTensor4dDesc<Dtype>(&bottom_desc, + this->num_, + this->channels_ / this->group_, + this->height_, this->width_, + this->channels_ * this->height_ * this->width_, + this->height_ * this->width_, + this->width_, 1); + bottom_descs_.push_back(bottom_desc); + cudnnTensor4dDescriptor_t top_desc; + cudnn::createTensor4dDesc<Dtype>(&top_desc, + this->num_, + this->num_output_ / this->group_, + this->height_out_, this->width_out_, + this->num_output_ * this->height_out_ * this->width_out_, + this->height_out_ * this->width_out_, + this->width_out_, 1); + top_descs_.push_back(top_desc); + cudnnConvolutionDescriptor_t conv_desc; + cudnn::createConvolutionDesc<Dtype>(&conv_desc, bottom_desc, + filter_desc_, this->pad_h_, this->pad_w_, + this->stride_h_, this->stride_w_); + conv_descs_.push_back(conv_desc); + } + + // Tensor descriptor for bias. + if (this->bias_term_) { + cudnn::createTensor4dDesc<Dtype>(&bias_desc_, + 1, this->num_output_ / this->group_, 1, 1); + } +} + +template <typename Dtype> +CuDNNConvolutionLayer<Dtype>::~CuDNNConvolutionLayer() { + for (int i = 0; i < bottom_descs_.size(); i++) { + cudnnDestroyTensor4dDescriptor(bottom_descs_[i]); + cudnnDestroyTensor4dDescriptor(top_descs_[i]); + cudnnDestroyConvolutionDescriptor(conv_descs_[i]); + } + if (this->bias_term_) { + cudnnDestroyTensor4dDescriptor(bias_desc_); + } + cudnnDestroyFilterDescriptor(filter_desc_); + + for (int g = 0; g < this->group_ * CUDNN_STREAMS_PER_GROUP; g++) { + cudaStreamDestroy(stream_[g]); + cudnnDestroy(handle_[g]); + } + + delete [] stream_; + delete [] handle_; +} + +INSTANTIATE_CLASS(CuDNNConvolutionLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/cudnn_conv_layer.cu b/src/caffe/layers/cudnn_conv_layer.cu new file mode 100644 index 00000000000..9a654553b25 --- /dev/null +++ b/src/caffe/layers/cudnn_conv_layer.cu @@ -0,0 +1,121 @@ +#ifdef USE_CUDNN +#include <vector> + +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +__global__ void sync_conv_groups() { } + +template <typename Dtype> +void CuDNNConvolutionLayer<Dtype>::Forward_gpu( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->gpu_data(); + Dtype* top_data = (*top)[i]->mutable_gpu_data(); + const Dtype* weight = this->blobs_[0]->gpu_data(); + + // Forward through cuDNN in parallel over groups. + for (int g = 0; g < this->group_; g++) { + cudnnStatus_t stat; + + // Filters. + stat = cudnnConvolutionForward(handle_[g], + bottom_descs_[i], bottom_data + bottom_offset_ * g, + filter_desc_, weight + weight_offset_ * g, + conv_descs_[i], + top_descs_[i], top_data + top_offset_ * g, + CUDNN_RESULT_NO_ACCUMULATE); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Error in cudnnConvolutionForward"; + + // Bias. + if (this->bias_term_) { + const Dtype* bias_data = this->blobs_[1]->gpu_data(); + Dtype alpha = 1.; + stat = cudnnAddTensor4d(handle_[g], CUDNN_ADD_SAME_C, &alpha, + bias_desc_, bias_data + bias_offset_ * g, + top_descs_[i], top_data + top_offset_ * g); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Error in cudnnAddTensor4d"; + } + } + + // Synchronize the work across groups, each of which went into its own + // stream, by launching an empty kernel into the default (null) stream. + // NOLINT_NEXT_LINE(whitespace/operators) + sync_conv_groups<<<1, 1>>>(); + } +} + +template <typename Dtype> +void CuDNNConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const Dtype* weight = NULL; + Dtype* weight_diff = NULL; + if (this->param_propagate_down_[0]) { + weight = this->blobs_[0]->gpu_data(); + weight_diff = this->blobs_[0]->mutable_gpu_diff(); + caffe_gpu_set(this->blobs_[0]->count(), Dtype(0), weight_diff); + } + Dtype* bias_diff = NULL; + if (this->bias_term_ && this->param_propagate_down_[1]) { + bias_diff = this->blobs_[1]->mutable_gpu_diff(); + caffe_gpu_set(this->blobs_[1]->count(), Dtype(0), bias_diff); + } + for (int i = 0; i < top.size(); ++i) { + const Dtype* top_diff = top[i]->gpu_diff(); + // Backward through cuDNN in parallel over groups and gradients. + for (int g = 0; g < this->group_; g++) { + cudnnStatus_t stat; + + // Gradient w.r.t. bias. + if (this->bias_term_ && this->param_propagate_down_[1]) { + stat = cudnnConvolutionBackwardBias(handle_[0*this->group_ + g], + top_descs_[i], top_diff + top_offset_ * g, + bias_desc_, bias_diff + bias_offset_ * g, + CUDNN_RESULT_ACCUMULATE); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) + << "Error in cudnnConvolutionBackwardBias."; + } + + // Gradient w.r.t. weights. + if (this->param_propagate_down_[0]) { + const Dtype* bottom_data = (*bottom)[i]->gpu_data(); + stat = cudnnConvolutionBackwardFilter(handle_[1*this->group_ + g], + bottom_descs_[i], bottom_data + bottom_offset_ * g, + top_descs_[i], top_diff + top_offset_ * g, + conv_descs_[i], + filter_desc_, weight_diff + weight_offset_ * g, + CUDNN_RESULT_ACCUMULATE); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) + << "Error in cudnnConvolutionBackwardFilter."; + } + + // Gradient w.r.t. bottom data. + if (propagate_down[i]) { + Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); + stat = cudnnConvolutionBackwardData(handle_[2*this->group_ + g], + filter_desc_, weight + weight_offset_ * g, + top_descs_[i], top_diff + top_offset_ * g, + conv_descs_[i], + bottom_descs_[i], bottom_diff + bottom_offset_ * g, + CUDNN_RESULT_NO_ACCUMULATE); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) + << "Error in cudnnConvolutionBackwardData."; + } + } + + // Synchronize the work across groups, each of which went into its own + // stream, by launching an empty kernel into the default (null) stream. + // NOLINT_NEXT_LINE(whitespace/operators) + sync_conv_groups<<<1, 1>>>(); + } +} + +INSTANTIATE_CLASS(CuDNNConvolutionLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index 5a7ea80467e..0e7a8da567b 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -302,4 +302,295 @@ TYPED_TEST(ConvolutionLayerTest, TestGradientGroup) { &(this->blob_top_vec_)); } +#ifdef USE_CUDNN + +template <typename Dtype> +class CuDNNConvolutionLayerTest : public ::testing::Test { + protected: + CuDNNConvolutionLayerTest() + : blob_bottom_(new Blob<Dtype>(2, 3, 6, 4)), + blob_bottom_2_(new Blob<Dtype>(2, 3, 6, 4)), + blob_top_(new Blob<Dtype>()), + blob_top_2_(new Blob<Dtype>()) {} + virtual void SetUp() { + // fill the values + FillerParameter filler_param; + filler_param.set_value(1.); + GaussianFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_bottom_); + filler.Fill(this->blob_bottom_2_); + blob_bottom_vec_.push_back(blob_bottom_); + blob_top_vec_.push_back(blob_top_); + } + + virtual ~CuDNNConvolutionLayerTest() { + delete blob_bottom_; + delete blob_bottom_2_; + delete blob_top_; + delete blob_top_2_; + } + + Blob<Dtype>* const blob_bottom_; + Blob<Dtype>* const blob_bottom_2_; + Blob<Dtype>* const blob_top_; + Blob<Dtype>* const blob_top_2_; + vector<Blob<Dtype>*> blob_bottom_vec_; + vector<Blob<Dtype>*> blob_top_vec_; +}; + +TYPED_TEST_CASE(CuDNNConvolutionLayerTest, TestDtypes); + +TYPED_TEST(CuDNNConvolutionLayerTest, TestSetupCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_size(3); + convolution_param->set_stride(2); + convolution_param->set_num_output(4); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); + shared_ptr<Layer<TypeParam> > layer( + new CuDNNConvolutionLayer<TypeParam>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), 2); + EXPECT_EQ(this->blob_top_->channels(), 4); + EXPECT_EQ(this->blob_top_->height(), 2); + EXPECT_EQ(this->blob_top_->width(), 1); + EXPECT_EQ(this->blob_top_2_->num(), 2); + EXPECT_EQ(this->blob_top_2_->channels(), 4); + EXPECT_EQ(this->blob_top_2_->height(), 2); + EXPECT_EQ(this->blob_top_2_->width(), 1); + // setting group should not change the shape + convolution_param->set_num_output(3); + convolution_param->set_group(3); + layer.reset(new CuDNNConvolutionLayer<TypeParam>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), 2); + EXPECT_EQ(this->blob_top_->channels(), 3); + EXPECT_EQ(this->blob_top_->height(), 2); + EXPECT_EQ(this->blob_top_->width(), 1); + EXPECT_EQ(this->blob_top_2_->num(), 2); + EXPECT_EQ(this->blob_top_2_->channels(), 3); + EXPECT_EQ(this->blob_top_2_->height(), 2); + EXPECT_EQ(this->blob_top_2_->width(), 1); +} + +TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionCuDNN) { + // We will simply see if the convolution layer carries out averaging well. + Caffe::set_mode(Caffe::GPU); + shared_ptr<ConstantFiller<TypeParam> > filler; + FillerParameter filler_param; + filler_param.set_value(1.); + filler.reset(new ConstantFiller<TypeParam>(filler_param)); + filler->Fill(this->blob_bottom_); + filler_param.set_value(2.); + filler.reset(new ConstantFiller<TypeParam>(filler_param)); + filler->Fill(this->blob_bottom_2_); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_size(3); + convolution_param->set_stride(2); + convolution_param->set_num_output(4); + convolution_param->mutable_weight_filler()->set_type("constant"); + convolution_param->mutable_weight_filler()->set_value(1); + convolution_param->mutable_bias_filler()->set_type("constant"); + convolution_param->mutable_bias_filler()->set_value(0.1); + shared_ptr<Layer<TypeParam> > layer( + new CuDNNConvolutionLayer<TypeParam>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // After the convolution, the output should all have output values 27.1 + const TypeParam* top_data = this->blob_top_->cpu_data(); + for (int i = 0; i < this->blob_top_->count(); ++i) { + EXPECT_NEAR(top_data[i], 27.1, 1e-4); + } + top_data = this->blob_top_2_->cpu_data(); + for (int i = 0; i < this->blob_top_2_->count(); ++i) { + EXPECT_NEAR(top_data[i], 54.1, 1e-4); + } +} + +TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionGroupCuDNN) { + // We will simply see if the convolution layer carries out averaging well. + Caffe::set_mode(Caffe::GPU); + FillerParameter filler_param; + filler_param.set_value(1.); + ConstantFiller<TypeParam> filler(filler_param); + filler.Fill(this->blob_bottom_); + TypeParam* bottom_data = this->blob_bottom_->mutable_cpu_data(); + for (int n = 0; n < this->blob_bottom_->num(); ++n) { + for (int c = 0; c < this->blob_bottom_->channels(); ++c) { + for (int h = 0; h < this->blob_bottom_->height(); ++h) { + for (int w = 0; w < this->blob_bottom_->width(); ++w) { + bottom_data[this->blob_bottom_->offset(n, c, h, w)] = c; + } + } + } + } + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_size(3); + convolution_param->set_stride(2); + convolution_param->set_num_output(3); + convolution_param->set_group(3); + convolution_param->mutable_weight_filler()->set_type("constant"); + convolution_param->mutable_weight_filler()->set_value(1); + convolution_param->mutable_bias_filler()->set_type("constant"); + convolution_param->mutable_bias_filler()->set_value(0.1); + shared_ptr<Layer<TypeParam> > layer( + new CuDNNConvolutionLayer<TypeParam>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // After the convolution, the output should all have output values 9.1 + const TypeParam* top_data = this->blob_top_->cpu_data(); + for (int n = 0; n < this->blob_top_->num(); ++n) { + for (int c = 0; c < this->blob_top_->channels(); ++c) { + for (int h = 0; h < this->blob_top_->height(); ++h) { + for (int w = 0; w < this->blob_top_->width(); ++w) { + TypeParam data = top_data[this->blob_top_->offset(n, c, h, w)]; + EXPECT_NEAR(data, c * 9 + 0.1, 1e-4); + } + } + } + } +} + +TYPED_TEST(CuDNNConvolutionLayerTest, TestSobelConvolutionCuDNN) { + // Test separable convolution by computing the Sobel operator + // as a single filter then comparing the result + // as the convolution of two rectangular filters. + Caffe::set_mode(Caffe::GPU); + // Fill bottoms with identical Gaussian noise. + shared_ptr<GaussianFiller<TypeParam> > filler; + FillerParameter filler_param; + filler_param.set_value(1.); + filler.reset(new GaussianFiller<TypeParam>(filler_param)); + filler->Fill(this->blob_bottom_); + this->blob_bottom_2_->CopyFrom(*this->blob_bottom_); + // Compute Sobel G_x operator as 3 x 3 convolution. + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_size(3); + convolution_param->set_stride(2); + convolution_param->set_num_output(1); + convolution_param->set_bias_term(false); + shared_ptr<Layer<TypeParam> > layer( + new CuDNNConvolutionLayer<TypeParam>(layer_param)); + layer->blobs().resize(1); + layer->blobs()[0].reset(new Blob<TypeParam>(1, 3, 3, 3)); + TypeParam* weights = layer->blobs()[0]->mutable_cpu_data(); + for (int c = 0; c < 3; ++c) { + int i = c * 9; // 3 x 3 filter + weights[i + 0] = -1; + weights[i + 1] = 0; + weights[i + 2] = 1; + weights[i + 3] = -2; + weights[i + 4] = 0; + weights[i + 5] = 2; + weights[i + 6] = -1; + weights[i + 7] = 0; + weights[i + 8] = 1; + } + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Compute Sobel G_x operator as separable 3 x 1 and 1 x 3 convolutions. + // (1) the [1 2 1] column filter + vector<Blob<TypeParam>*> sep_blob_bottom_vec; + vector<Blob<TypeParam>*> sep_blob_top_vec; + shared_ptr<Blob<TypeParam> > blob_sep(new Blob<TypeParam>()); + sep_blob_bottom_vec.push_back(this->blob_bottom_2_); + sep_blob_top_vec.push_back(this->blob_top_2_); + convolution_param->clear_kernel_size(); + convolution_param->clear_stride(); + convolution_param->set_kernel_h(3); + convolution_param->set_kernel_w(1); + convolution_param->set_stride_h(2); + convolution_param->set_stride_w(1); + convolution_param->set_num_output(1); + convolution_param->set_bias_term(false); + layer.reset(new CuDNNConvolutionLayer<TypeParam>(layer_param)); + layer->blobs().resize(1); + layer->blobs()[0].reset(new Blob<TypeParam>(1, 3, 3, 1)); + TypeParam* weights_1 = layer->blobs()[0]->mutable_cpu_data(); + for (int c = 0; c < 3; ++c) { + int i = c * 3; // 3 x 1 filter + weights_1[i + 0] = 1; + weights_1[i + 1] = 2; + weights_1[i + 2] = 1; + } + layer->SetUp(sep_blob_bottom_vec, &(sep_blob_top_vec)); + layer->Forward(sep_blob_bottom_vec, &(sep_blob_top_vec)); + // (2) the [-1 0 1] row filter + blob_sep->CopyFrom(*this->blob_top_2_, false, true); + sep_blob_bottom_vec.clear(); + sep_blob_bottom_vec.push_back(blob_sep.get()); + convolution_param->set_kernel_h(1); + convolution_param->set_kernel_w(3); + convolution_param->set_stride_h(1); + convolution_param->set_stride_w(2); + convolution_param->set_num_output(1); + convolution_param->set_bias_term(false); + layer.reset(new CuDNNConvolutionLayer<TypeParam>(layer_param)); + layer->blobs().resize(1); + layer->blobs()[0].reset(new Blob<TypeParam>(1, 3, 1, 3)); + TypeParam* weights_2 = layer->blobs()[0]->mutable_cpu_data(); + for (int c = 0; c < 3; ++c) { + int i = c * 3; // 1 x 3 filter + weights_2[i + 0] = -1; + weights_2[i + 1] = 0; + weights_2[i + 2] = 1; + } + layer->SetUp(sep_blob_bottom_vec, &(sep_blob_top_vec)); + layer->Forward(sep_blob_bottom_vec, &(sep_blob_top_vec)); + // Test equivalence of full and separable filters. + const TypeParam* top_data = this->blob_top_->cpu_data(); + const TypeParam* sep_top_data = this->blob_top_2_->cpu_data(); + for (int i = 0; i < this->blob_top_->count(); ++i) { + EXPECT_NEAR(top_data[i], sep_top_data[i], 1e-4); + } +} + +TYPED_TEST(CuDNNConvolutionLayerTest, TestGradientCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); + convolution_param->set_kernel_size(3); + convolution_param->set_stride(2); + convolution_param->set_num_output(2); + convolution_param->mutable_weight_filler()->set_type("gaussian"); + convolution_param->mutable_bias_filler()->set_type("gaussian"); + CuDNNConvolutionLayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +TYPED_TEST(CuDNNConvolutionLayerTest, TestGradientGroupCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_size(3); + convolution_param->set_stride(2); + convolution_param->set_num_output(3); + convolution_param->set_group(3); + convolution_param->mutable_weight_filler()->set_type("gaussian"); + convolution_param->mutable_bias_filler()->set_type("gaussian"); + CuDNNConvolutionLayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +#endif + } // namespace caffe From 00f5fa6bf9287615724a99d7f423807bad576a39 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 5 Sep 2014 21:47:56 -0700 Subject: [PATCH 0726/2053] strategize cuDNN pooling --- include/caffe/vision_layers.hpp | 30 +- src/caffe/layer_factory.cpp | 4 + src/caffe/layers/cudnn_pooling_layer.cpp | 40 ++ src/caffe/layers/cudnn_pooling_layer.cu | 55 +++ src/caffe/test/test_pooling_layer.cpp | 582 +++++++++++++++++++++++ 5 files changed, 710 insertions(+), 1 deletion(-) create mode 100644 src/caffe/layers/cudnn_pooling_layer.cpp create mode 100644 src/caffe/layers/cudnn_pooling_layer.cu diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 4269163afff..4dd2e9df99a 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -69,7 +69,8 @@ class ConvolutionLayer : public Layer<Dtype> { * Fallback to ConvolutionLayer for CPU mode. */ template <typename Dtype> -class CuDNNConvolutionLayer : public ConvolutionLayer<Dtype> { +class CuDNNConvolutionLayer : public ConvolutionLayer<Dtype> +{ public: explicit CuDNNConvolutionLayer(const LayerParameter& param) : ConvolutionLayer<Dtype>(param) {} @@ -255,6 +256,33 @@ class PoolingLayer : public Layer<Dtype> { Blob<int> max_idx_; }; +#ifdef USE_CUDNN +/* + * @brief cuDNN implementation of PoolingLayer. + * Fallback to PoolingLayer for CPU mode. +*/ +template <typename Dtype> +class CuDNNPoolingLayer : public PoolingLayer<Dtype> { + public: + explicit CuDNNPoolingLayer(const LayerParameter& param) + : PoolingLayer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual ~CuDNNPoolingLayer(); + + protected: + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + + cudnnHandle_t handle_; + cudnnTensor4dDescriptor_t bottom_desc_, top_desc_; + cudnnPoolingDescriptor_t pooling_desc_; + cudnnPoolingMode_t mode_; +}; +#endif + } // namespace caffe #endif // CAFFE_VISION_LAYERS_HPP_ diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index ef1b7564518..516fe87bdcd 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -49,6 +49,10 @@ PoolingLayer<Dtype>* GetPoolingLayer(const string& name, } if (engine == PoolingParameter_Engine_CAFFE) { return new PoolingLayer<Dtype>(param); +#ifdef USE_CUDNN + } else if (engine == PoolingParameter_Engine_CUDNN) { + return new CuDNNPoolingLayer<Dtype>(param); +#endif } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } diff --git a/src/caffe/layers/cudnn_pooling_layer.cpp b/src/caffe/layers/cudnn_pooling_layer.cpp new file mode 100644 index 00000000000..c360b63b1f0 --- /dev/null +++ b/src/caffe/layers/cudnn_pooling_layer.cpp @@ -0,0 +1,40 @@ +#ifdef USE_CUDNN +#include <vector> + +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CuDNNPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + PoolingLayer<Dtype>::LayerSetUp(bottom, top); + + // TODO(cudnn) check + cudnnStatus_t stat = cudnnCreate(&handle_); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Could not create a CUDNN handle."; + cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, bottom[0]->num(), + this->channels_, this->height_, this->width_); + cudnn::createTensor4dDesc<Dtype>(&top_desc_, bottom[0]->num(), + this->channels_, this->pooled_height_, this->pooled_width_); + cudnn::createPoolingDesc<Dtype>(&pooling_desc_, + this->layer_param_.pooling_param().pool(), &mode_, + this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_); +} + +template <typename Dtype> +CuDNNPoolingLayer<Dtype>::~CuDNNPoolingLayer() { + cudnnDestroyTensor4dDescriptor(bottom_desc_); + cudnnDestroyTensor4dDescriptor(top_desc_); + cudnnDestroyPoolingDescriptor(pooling_desc_); + cudnnDestroy(handle_); +} + +INSTANTIATE_CLASS(CuDNNPoolingLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/cudnn_pooling_layer.cu b/src/caffe/layers/cudnn_pooling_layer.cu new file mode 100644 index 00000000000..8f807ac811c --- /dev/null +++ b/src/caffe/layers/cudnn_pooling_layer.cu @@ -0,0 +1,55 @@ +#ifdef USE_CUDNN +#include <vector> + +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CuDNNPoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + // Fallback to Caffe for padded pooling, max top mask. + if ((this->pad_h_ > 0 || this->pad_w_ > 0) || (*top).size() > 1) { + LOG(WARNING) << "Falling back to standard Caffe for padded pooling."; + return PoolingLayer<Dtype>::Forward_gpu(bottom, top); + } + + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + cudnnStatus_t stat = cudnnPoolingForward(handle_, pooling_desc_, + bottom_desc_, bottom_data, top_desc_, top_data); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) + << "Error in cudnnPoolingForward."; +} + +template <typename Dtype> +void CuDNNPoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + if (!propagate_down[0]) { + return; + } + + // Fallback to Caffe for padded pooling, max top mask. + if ((this->pad_h_ > 0 || this->pad_w_ > 0) || top.size() > 1) { + LOG(WARNING) << "Falling back to standard Caffe for padded pooling."; + return PoolingLayer<Dtype>::Backward_gpu(top, propagate_down, bottom); + } + + const Dtype* top_diff = top[0]->gpu_diff(); + const Dtype* top_data = top[0]->gpu_data(); + const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + cudnnStatus_t stat = cudnnPoolingBackward(handle_, pooling_desc_, + top_desc_, top_data, top_desc_, top_diff, + bottom_desc_, bottom_data, bottom_desc_, bottom_diff); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Error in cudnnPoolingBackward."; +} + +INSTANTIATE_CLASS(CuDNNPoolingLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index 5be01f77b32..ec23a682c2f 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -592,5 +592,587 @@ TYPED_TEST(PoolingLayerTest, TestGradientAvePadded) { } } +#ifdef USE_CUDNN +template <typename Dtype> +class CuDNNPoolingLayerTest : public ::testing::Test { + protected: + CuDNNPoolingLayerTest() + : blob_bottom_(new Blob<Dtype>()), + blob_top_(new Blob<Dtype>()), + blob_top_mask_(new Blob<Dtype>()) {} + virtual void SetUp() { + Caffe::set_random_seed(1701); + blob_bottom_->Reshape(2, 3, 6, 5); + // fill the values + FillerParameter filler_param; + GaussianFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_bottom_); + blob_bottom_vec_.push_back(blob_bottom_); + blob_top_vec_.push_back(blob_top_); + } + virtual ~CuDNNPoolingLayerTest() { + delete blob_bottom_; + delete blob_top_; + delete blob_top_mask_; + } + Blob<Dtype>* const blob_bottom_; + Blob<Dtype>* const blob_top_; + Blob<Dtype>* const blob_top_mask_; + vector<Blob<Dtype>*> blob_bottom_vec_; + vector<Blob<Dtype>*> blob_top_vec_; + // Test for 2x 2 square pooling layer + void TestForwardSquare() { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + const int num = 2; + const int channels = 2; + blob_bottom_->Reshape(num, channels, 3, 5); + // Input: 2x 2 channels of: + // [1 2 5 2 3] + // [9 4 1 4 8] + // [1 2 5 2 3] + for (int i = 0; i < 15 * num * channels; i += 15) { + blob_bottom_->mutable_cpu_data()[i + 0] = 1; + blob_bottom_->mutable_cpu_data()[i + 1] = 2; + blob_bottom_->mutable_cpu_data()[i + 2] = 5; + blob_bottom_->mutable_cpu_data()[i + 3] = 2; + blob_bottom_->mutable_cpu_data()[i + 4] = 3; + blob_bottom_->mutable_cpu_data()[i + 5] = 9; + blob_bottom_->mutable_cpu_data()[i + 6] = 4; + blob_bottom_->mutable_cpu_data()[i + 7] = 1; + blob_bottom_->mutable_cpu_data()[i + 8] = 4; + blob_bottom_->mutable_cpu_data()[i + 9] = 8; + blob_bottom_->mutable_cpu_data()[i + 10] = 1; + blob_bottom_->mutable_cpu_data()[i + 11] = 2; + blob_bottom_->mutable_cpu_data()[i + 12] = 5; + blob_bottom_->mutable_cpu_data()[i + 13] = 2; + blob_bottom_->mutable_cpu_data()[i + 14] = 3; + } + CuDNNPoolingLayer<Dtype> layer(layer_param); + layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + EXPECT_EQ(blob_top_->num(), num); + EXPECT_EQ(blob_top_->channels(), channels); + EXPECT_EQ(blob_top_->height(), 2); + EXPECT_EQ(blob_top_->width(), 4); + if (blob_top_vec_.size() > 1) { + EXPECT_EQ(blob_top_mask_->num(), num); + EXPECT_EQ(blob_top_mask_->channels(), channels); + EXPECT_EQ(blob_top_mask_->height(), 2); + EXPECT_EQ(blob_top_mask_->width(), 4); + } + layer.Forward(blob_bottom_vec_, &blob_top_vec_); + // Expected output: 2x 2 channels of: + // [9 5 5 8] + // [9 5 5 8] + for (int i = 0; i < 8 * num * channels; i += 8) { + EXPECT_EQ(blob_top_->cpu_data()[i + 0], 9); + EXPECT_EQ(blob_top_->cpu_data()[i + 1], 5); + EXPECT_EQ(blob_top_->cpu_data()[i + 2], 5); + EXPECT_EQ(blob_top_->cpu_data()[i + 3], 8); + EXPECT_EQ(blob_top_->cpu_data()[i + 4], 9); + EXPECT_EQ(blob_top_->cpu_data()[i + 5], 5); + EXPECT_EQ(blob_top_->cpu_data()[i + 6], 5); + EXPECT_EQ(blob_top_->cpu_data()[i + 7], 8); + } + if (blob_top_vec_.size() > 1) { + // Expected mask output: 2x 2 channels of: + // [5 2 2 9] + // [5 12 12 9] + for (int i = 0; i < 8 * num * channels; i += 8) { + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 0], 5); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 1], 2); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 2], 2); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 3], 9); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 4], 5); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 5], 12); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 6], 12); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 7], 9); + } + } + } + // Test for 3x 2 rectangular pooling layer with kernel_h > kernel_w + void TestForwardRectHigh() { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(3); + pooling_param->set_kernel_w(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + const int num = 2; + const int channels = 2; + blob_bottom_->Reshape(num, channels, 6, 6); + // Input: 2x 2 channels of: + // [35 1 6 26 19 24] + // [ 3 32 7 21 23 25] + // [31 9 2 22 27 20] + // [ 8 28 33 17 10 15] + // [30 5 34 12 14 16] + // [ 4 36 29 13 18 11] + // (this is generated by magic(6) in MATLAB) + for (int i = 0; i < 36 * num * channels; i += 36) { + blob_bottom_->mutable_cpu_data()[i + 0] = 35; + blob_bottom_->mutable_cpu_data()[i + 1] = 1; + blob_bottom_->mutable_cpu_data()[i + 2] = 6; + blob_bottom_->mutable_cpu_data()[i + 3] = 26; + blob_bottom_->mutable_cpu_data()[i + 4] = 19; + blob_bottom_->mutable_cpu_data()[i + 5] = 24; + blob_bottom_->mutable_cpu_data()[i + 6] = 3; + blob_bottom_->mutable_cpu_data()[i + 7] = 32; + blob_bottom_->mutable_cpu_data()[i + 8] = 7; + blob_bottom_->mutable_cpu_data()[i + 9] = 21; + blob_bottom_->mutable_cpu_data()[i + 10] = 23; + blob_bottom_->mutable_cpu_data()[i + 11] = 25; + blob_bottom_->mutable_cpu_data()[i + 12] = 31; + blob_bottom_->mutable_cpu_data()[i + 13] = 9; + blob_bottom_->mutable_cpu_data()[i + 14] = 2; + blob_bottom_->mutable_cpu_data()[i + 15] = 22; + blob_bottom_->mutable_cpu_data()[i + 16] = 27; + blob_bottom_->mutable_cpu_data()[i + 17] = 20; + blob_bottom_->mutable_cpu_data()[i + 18] = 8; + blob_bottom_->mutable_cpu_data()[i + 19] = 28; + blob_bottom_->mutable_cpu_data()[i + 20] = 33; + blob_bottom_->mutable_cpu_data()[i + 21] = 17; + blob_bottom_->mutable_cpu_data()[i + 22] = 10; + blob_bottom_->mutable_cpu_data()[i + 23] = 15; + blob_bottom_->mutable_cpu_data()[i + 24] = 30; + blob_bottom_->mutable_cpu_data()[i + 25] = 5; + blob_bottom_->mutable_cpu_data()[i + 26] = 34; + blob_bottom_->mutable_cpu_data()[i + 27] = 12; + blob_bottom_->mutable_cpu_data()[i + 28] = 14; + blob_bottom_->mutable_cpu_data()[i + 29] = 16; + blob_bottom_->mutable_cpu_data()[i + 30] = 4; + blob_bottom_->mutable_cpu_data()[i + 31] = 36; + blob_bottom_->mutable_cpu_data()[i + 32] = 29; + blob_bottom_->mutable_cpu_data()[i + 33] = 13; + blob_bottom_->mutable_cpu_data()[i + 34] = 18; + blob_bottom_->mutable_cpu_data()[i + 35] = 11; + } + CuDNNPoolingLayer<Dtype> layer(layer_param); + layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + EXPECT_EQ(blob_top_->num(), num); + EXPECT_EQ(blob_top_->channels(), channels); + EXPECT_EQ(blob_top_->height(), 4); + EXPECT_EQ(blob_top_->width(), 5); + if (blob_top_vec_.size() > 1) { + EXPECT_EQ(blob_top_mask_->num(), num); + EXPECT_EQ(blob_top_mask_->channels(), channels); + EXPECT_EQ(blob_top_mask_->height(), 4); + EXPECT_EQ(blob_top_mask_->width(), 5); + } + layer.Forward(blob_bottom_vec_, &blob_top_vec_); + // Expected output: 2x 2 channels of: + // [35 32 26 27 27] + // [32 33 33 27 27] + // [31 34 34 27 27] + // [36 36 34 18 18] + for (int i = 0; i < 20 * num * channels; i += 20) { + EXPECT_EQ(blob_top_->cpu_data()[i + 0], 35); + EXPECT_EQ(blob_top_->cpu_data()[i + 1], 32); + EXPECT_EQ(blob_top_->cpu_data()[i + 2], 26); + EXPECT_EQ(blob_top_->cpu_data()[i + 3], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 4], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 5], 32); + EXPECT_EQ(blob_top_->cpu_data()[i + 6], 33); + EXPECT_EQ(blob_top_->cpu_data()[i + 7], 33); + EXPECT_EQ(blob_top_->cpu_data()[i + 8], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 9], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 10], 31); + EXPECT_EQ(blob_top_->cpu_data()[i + 11], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 12], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 13], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 14], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 15], 36); + EXPECT_EQ(blob_top_->cpu_data()[i + 16], 36); + EXPECT_EQ(blob_top_->cpu_data()[i + 17], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 18], 18); + EXPECT_EQ(blob_top_->cpu_data()[i + 19], 18); + } + if (blob_top_vec_.size() > 1) { + // [ 1 8 4 17 17] + // [ 8 21 21 17 17] + // [13 27 27 17 17] + // [32 32 27 35 35] + for (int i = 0; i < 20 * num * channels; i += 20) { + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 0], 0); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 1], 7); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 2], 3); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 3], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 4], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 5], 7); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 6], 20); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 7], 20); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 8], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 9], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 10], 12); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 11], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 12], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 13], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 14], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 15], 31); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 16], 31); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 17], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 18], 34); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 19], 34); + } + } + } + // Test for rectangular pooling layer with kernel_w > kernel_h + void TestForwardRectWide() { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(2); + pooling_param->set_kernel_w(3); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + const int num = 2; + const int channels = 2; + blob_bottom_->Reshape(num, channels, 6, 6); + // Input: 2x 2 channels of: + // [35 1 6 26 19 24] + // [ 3 32 7 21 23 25] + // [31 9 2 22 27 20] + // [ 8 28 33 17 10 15] + // [30 5 34 12 14 16] + // [ 4 36 29 13 18 11] + // (this is generated by magic(6) in MATLAB) + for (int i = 0; i < 36 * num * channels; i += 36) { + blob_bottom_->mutable_cpu_data()[i + 0] = 35; + blob_bottom_->mutable_cpu_data()[i + 1] = 1; + blob_bottom_->mutable_cpu_data()[i + 2] = 6; + blob_bottom_->mutable_cpu_data()[i + 3] = 26; + blob_bottom_->mutable_cpu_data()[i + 4] = 19; + blob_bottom_->mutable_cpu_data()[i + 5] = 24; + blob_bottom_->mutable_cpu_data()[i + 6] = 3; + blob_bottom_->mutable_cpu_data()[i + 7] = 32; + blob_bottom_->mutable_cpu_data()[i + 8] = 7; + blob_bottom_->mutable_cpu_data()[i + 9] = 21; + blob_bottom_->mutable_cpu_data()[i + 10] = 23; + blob_bottom_->mutable_cpu_data()[i + 11] = 25; + blob_bottom_->mutable_cpu_data()[i + 12] = 31; + blob_bottom_->mutable_cpu_data()[i + 13] = 9; + blob_bottom_->mutable_cpu_data()[i + 14] = 2; + blob_bottom_->mutable_cpu_data()[i + 15] = 22; + blob_bottom_->mutable_cpu_data()[i + 16] = 27; + blob_bottom_->mutable_cpu_data()[i + 17] = 20; + blob_bottom_->mutable_cpu_data()[i + 18] = 8; + blob_bottom_->mutable_cpu_data()[i + 19] = 28; + blob_bottom_->mutable_cpu_data()[i + 20] = 33; + blob_bottom_->mutable_cpu_data()[i + 21] = 17; + blob_bottom_->mutable_cpu_data()[i + 22] = 10; + blob_bottom_->mutable_cpu_data()[i + 23] = 15; + blob_bottom_->mutable_cpu_data()[i + 24] = 30; + blob_bottom_->mutable_cpu_data()[i + 25] = 5; + blob_bottom_->mutable_cpu_data()[i + 26] = 34; + blob_bottom_->mutable_cpu_data()[i + 27] = 12; + blob_bottom_->mutable_cpu_data()[i + 28] = 14; + blob_bottom_->mutable_cpu_data()[i + 29] = 16; + blob_bottom_->mutable_cpu_data()[i + 30] = 4; + blob_bottom_->mutable_cpu_data()[i + 31] = 36; + blob_bottom_->mutable_cpu_data()[i + 32] = 29; + blob_bottom_->mutable_cpu_data()[i + 33] = 13; + blob_bottom_->mutable_cpu_data()[i + 34] = 18; + blob_bottom_->mutable_cpu_data()[i + 35] = 11; + } + CuDNNPoolingLayer<Dtype> layer(layer_param); + layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + EXPECT_EQ(blob_top_->num(), num); + EXPECT_EQ(blob_top_->channels(), channels); + EXPECT_EQ(blob_top_->height(), 5); + EXPECT_EQ(blob_top_->width(), 4); + if (blob_top_vec_.size() > 1) { + EXPECT_EQ(blob_top_mask_->num(), num); + EXPECT_EQ(blob_top_mask_->channels(), channels); + EXPECT_EQ(blob_top_mask_->height(), 5); + EXPECT_EQ(blob_top_mask_->width(), 4); + } + layer.Forward(blob_bottom_vec_, &blob_top_vec_); + // Expected output: 2x 2 channels of: + // [35 32 26 26] + // [32 32 27 27] + // [33 33 33 27] + // [34 34 34 17] + // [36 36 34 18] + for (int i = 0; i < 20 * num * channels; i += 20) { + EXPECT_EQ(blob_top_->cpu_data()[i + 0], 35); + EXPECT_EQ(blob_top_->cpu_data()[i + 1], 32); + EXPECT_EQ(blob_top_->cpu_data()[i + 2], 26); + EXPECT_EQ(blob_top_->cpu_data()[i + 3], 26); + EXPECT_EQ(blob_top_->cpu_data()[i + 4], 32); + EXPECT_EQ(blob_top_->cpu_data()[i + 5], 32); + EXPECT_EQ(blob_top_->cpu_data()[i + 6], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 7], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 8], 33); + EXPECT_EQ(blob_top_->cpu_data()[i + 9], 33); + EXPECT_EQ(blob_top_->cpu_data()[i + 10], 33); + EXPECT_EQ(blob_top_->cpu_data()[i + 11], 27); + EXPECT_EQ(blob_top_->cpu_data()[i + 12], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 13], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 14], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 15], 17); + EXPECT_EQ(blob_top_->cpu_data()[i + 16], 36); + EXPECT_EQ(blob_top_->cpu_data()[i + 17], 36); + EXPECT_EQ(blob_top_->cpu_data()[i + 18], 34); + EXPECT_EQ(blob_top_->cpu_data()[i + 19], 18); + } + if (blob_top_vec_.size() > 1) { + // [ 1 8 4 4] + // [ 8 8 17 17] + // [21 21 21 17] + // [27 27 27 22] + // [32 32 27 35] + for (int i = 0; i < 20 * num * channels; i += 20) { + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 0], 0); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 1], 7); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 2], 3); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 3], 3); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 4], 7); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 5], 7); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 6], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 7], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 8], 20); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 9], 20); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 10], 20); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 11], 16); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 12], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 13], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 14], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 15], 21); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 16], 31); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 17], 31); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 18], 26); + EXPECT_EQ(blob_top_mask_->cpu_data()[i + 19], 34); + } + } + } +}; + +TYPED_TEST_CASE(CuDNNPoolingLayerTest, TestDtypes); + +TYPED_TEST(CuDNNPoolingLayerTest, TestSetupCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); + CuDNNPoolingLayer<TypeParam> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); + EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); + EXPECT_EQ(this->blob_top_->height(), 3); + EXPECT_EQ(this->blob_top_->width(), 2); +} + +TYPED_TEST(CuDNNPoolingLayerTest, TestSetupPaddedCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); + pooling_param->set_pad(1); + pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); + CuDNNPoolingLayer<TypeParam> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); + EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); + EXPECT_EQ(this->blob_top_->height(), 4); + EXPECT_EQ(this->blob_top_->width(), 3); +} + +/* +TYPED_TEST(CuDNNPoolingLayerTest, PrintBackwardCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + layer_param.set_kernelsize(3); + layer_param.set_stride(2); + layer_param.set_pool(LayerParameter_PoolMethod_MAX); + CuDNNPoolingLayer<TypeParam> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + cout << "bottom data " << i << " " << this->blob_bottom_->cpu_data()[i] << endl; + } + for (int i = 0; i < this->blob_top_->count(); ++i) { + cout << "top data " << i << " " << this->blob_top_->cpu_data()[i] << endl; + } + + for (int i = 0; i < this->blob_top_->count(); ++i) { + this->blob_top_->mutable_cpu_diff()[i] = i; + } + layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + cout << "bottom diff " << i << " " << this->blob_bottom_->cpu_diff()[i] << endl; + } +} +*/ + +TYPED_TEST(CuDNNPoolingLayerTest, TestForwardMaxCuDNN) { + Caffe::set_mode(Caffe::GPU); + this->TestForwardSquare(); + this->TestForwardRectHigh(); + this->TestForwardRectWide(); +} + +TYPED_TEST(CuDNNPoolingLayerTest, TestForwardMaxTopMaskCuDNN) { + Caffe::set_mode(Caffe::GPU); + this->blob_top_vec_.push_back(this->blob_top_mask_); + this->TestForwardSquare(); + this->TestForwardRectHigh(); + this->TestForwardRectWide(); +} + +TYPED_TEST(CuDNNPoolingLayerTest, TestGradientMaxCuDNN) { + Caffe::set_mode(Caffe::GPU); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pad(1); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + CuDNNPoolingLayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-4, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + } + } +} + +TYPED_TEST(CuDNNPoolingLayerTest, TestForwardMaxPaddedCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(2); + pooling_param->set_pad(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + this->blob_bottom_->Reshape(1, 1, 3, 3); + // Input: + // [ 1 2 4 ] + // [ 2 3 2 ] + // [ 4 2 1 ] + this->blob_bottom_->mutable_cpu_data()[0] = 1; + this->blob_bottom_->mutable_cpu_data()[1] = 2; + this->blob_bottom_->mutable_cpu_data()[2] = 4; + this->blob_bottom_->mutable_cpu_data()[3] = 2; + this->blob_bottom_->mutable_cpu_data()[4] = 3; + this->blob_bottom_->mutable_cpu_data()[5] = 2; + this->blob_bottom_->mutable_cpu_data()[6] = 4; + this->blob_bottom_->mutable_cpu_data()[7] = 2; + this->blob_bottom_->mutable_cpu_data()[8] = 1; + CuDNNPoolingLayer<TypeParam> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), 1); + EXPECT_EQ(this->blob_top_->channels(), 1); + EXPECT_EQ(this->blob_top_->height(), 3); + EXPECT_EQ(this->blob_top_->width(), 3); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + TypeParam epsilon = 1e-8; + // Output: + // [ 1 4 4 ] + // [ 4 4 4 ] + // [ 4 4 1 ] + EXPECT_NEAR(this->blob_top_->cpu_data()[0], 1, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[1], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[2], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[3], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[4], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[5], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[6], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[7], 4, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[8], 1, epsilon); +} + +TYPED_TEST(CuDNNPoolingLayerTest, TestGradientMaxTopMaskCuDNN) { + Caffe::set_mode(Caffe::GPU); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); + this->blob_top_vec_.push_back(this->blob_top_mask_); + CuDNNPoolingLayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-4, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + this->blob_top_vec_.pop_back(); + } + } +} + +TYPED_TEST(CuDNNPoolingLayerTest, TestForwardAveCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_size(3); + pooling_param->set_stride(1); + pooling_param->set_pad(1); + pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); + this->blob_bottom_->Reshape(1, 1, 3, 3); + FillerParameter filler_param; + filler_param.set_value(TypeParam(2)); + ConstantFiller<TypeParam> filler(filler_param); + filler.Fill(this->blob_bottom_); + CuDNNPoolingLayer<TypeParam> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + EXPECT_EQ(this->blob_top_->num(), 1); + EXPECT_EQ(this->blob_top_->channels(), 1); + EXPECT_EQ(this->blob_top_->height(), 3); + EXPECT_EQ(this->blob_top_->width(), 3); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + TypeParam epsilon = 1e-5; + EXPECT_NEAR(this->blob_top_->cpu_data()[0], 8.0 / 9, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[1], 4.0 / 3, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[2], 8.0 / 9, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[3], 4.0 / 3, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[4], 2.0 , epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[5], 4.0 / 3, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[6], 8.0 / 9, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[7], 4.0 / 3, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[8], 8.0 / 9, epsilon); +} + +TYPED_TEST(CuDNNPoolingLayerTest, TestGradientAveCuDNN) { + Caffe::set_mode(Caffe::GPU); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); + CuDNNPoolingLayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-2, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + } + } +} + +TYPED_TEST(CuDNNPoolingLayerTest, TestGradientAvePaddedCuDNN) { + Caffe::set_mode(Caffe::GPU); + for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { + for (int kernel_w = 3; kernel_w <= 4; kernel_w++) { + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_kernel_h(kernel_h); + pooling_param->set_kernel_w(kernel_w); + pooling_param->set_stride(2); + pooling_param->set_pad(2); + pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); + CuDNNPoolingLayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-2, 1e-2); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); + } + } +} + +#endif } // namespace caffe From 14a9198ae1bf75f0de35409a9f14cbb8ece375a9 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 5 Sep 2014 22:43:58 -0700 Subject: [PATCH 0727/2053] strategize cuDNN activations: ReLU, Sigmoid, TanH --- include/caffe/neuron_layers.hpp | 75 +++++++++++++ src/caffe/layer_factory.cpp | 12 +++ src/caffe/layers/cudnn_relu_layer.cpp | 34 ++++++ src/caffe/layers/cudnn_relu_layer.cu | 55 ++++++++++ src/caffe/layers/cudnn_sigmoid_layer.cpp | 34 ++++++ src/caffe/layers/cudnn_sigmoid_layer.cu | 45 ++++++++ src/caffe/layers/cudnn_tanh_layer.cpp | 34 ++++++ src/caffe/layers/cudnn_tanh_layer.cu | 45 ++++++++ src/caffe/test/test_neuron_layer.cpp | 132 +++++++++++++++++++++++ 9 files changed, 466 insertions(+) create mode 100644 src/caffe/layers/cudnn_relu_layer.cpp create mode 100644 src/caffe/layers/cudnn_relu_layer.cu create mode 100644 src/caffe/layers/cudnn_sigmoid_layer.cpp create mode 100644 src/caffe/layers/cudnn_sigmoid_layer.cu create mode 100644 src/caffe/layers/cudnn_tanh_layer.cpp create mode 100644 src/caffe/layers/cudnn_tanh_layer.cu diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 8c882eec125..36acf96e5af 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -356,6 +356,31 @@ class ReLULayer : public NeuronLayer<Dtype> { const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); }; +#ifdef USE_CUDNN +/** + * @brief CuDNN acceleration of ReLULayer. + */ +template <typename Dtype> +class CuDNNReLULayer : public ReLULayer<Dtype> { + public: + explicit CuDNNReLULayer(const LayerParameter& param) + : ReLULayer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual ~CuDNNReLULayer(); + + protected: + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + + cudnnHandle_t handle_; + cudnnTensor4dDescriptor_t bottom_desc_; + cudnnTensor4dDescriptor_t top_desc_; +}; +#endif + /** * @brief Sigmoid function non-linearity @f$ * y = (1 + \exp(-x))^{-1} @@ -413,6 +438,31 @@ class SigmoidLayer : public NeuronLayer<Dtype> { const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); }; +#ifdef USE_CUDNN +/** + * @brief CuDNN acceleration of SigmoidLayer. + */ +template <typename Dtype> +class CuDNNSigmoidLayer : public SigmoidLayer<Dtype> { + public: + explicit CuDNNSigmoidLayer(const LayerParameter& param) + : SigmoidLayer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual ~CuDNNSigmoidLayer(); + + protected: + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + + cudnnHandle_t handle_; + cudnnTensor4dDescriptor_t bottom_desc_; + cudnnTensor4dDescriptor_t top_desc_; +}; +#endif + /** * @brief TanH hyperbolic tangent non-linearity @f$ * y = \frac{\exp(2x) - 1}{\exp(2x) + 1} @@ -472,6 +522,31 @@ class TanHLayer : public NeuronLayer<Dtype> { const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); }; +#ifdef USE_CUDNN +/** + * @brief CuDNN acceleration of TanHLayer. + */ +template <typename Dtype> +class CuDNNTanHLayer : public TanHLayer<Dtype> { + public: + explicit CuDNNTanHLayer(const LayerParameter& param) + : TanHLayer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual ~CuDNNTanHLayer(); + + protected: + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + + cudnnHandle_t handle_; + cudnnTensor4dDescriptor_t bottom_desc_; + cudnnTensor4dDescriptor_t top_desc_; +}; +#endif + /** * @brief Tests whether the input exceeds a threshold: outputs 1 for inputs * above threshold; 0 otherwise. diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 516fe87bdcd..c5194853cbf 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -76,6 +76,10 @@ ReLULayer<Dtype>* GetReLULayer(const string& name, } if (engine == ReLUParameter_Engine_CAFFE) { return new ReLULayer<Dtype>(param); +#ifdef USE_CUDNN + } else if (engine == ReLUParameter_Engine_CUDNN) { + return new CuDNNReLULayer<Dtype>(param); +#endif } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } @@ -99,6 +103,10 @@ SigmoidLayer<Dtype>* GetSigmoidLayer(const string& name, } if (engine == SigmoidParameter_Engine_CAFFE) { return new SigmoidLayer<Dtype>(param); +#ifdef USE_CUDNN + } else if (engine == SigmoidParameter_Engine_CUDNN) { + return new CuDNNSigmoidLayer<Dtype>(param); +#endif } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } @@ -122,6 +130,10 @@ TanHLayer<Dtype>* GetTanHLayer(const string& name, } if (engine == TanHParameter_Engine_CAFFE) { return new TanHLayer<Dtype>(param); +#ifdef USE_CUDNN + } else if (engine == TanHParameter_Engine_CUDNN) { + return new CuDNNTanHLayer<Dtype>(param); +#endif } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } diff --git a/src/caffe/layers/cudnn_relu_layer.cpp b/src/caffe/layers/cudnn_relu_layer.cpp new file mode 100644 index 00000000000..f8bf77f1844 --- /dev/null +++ b/src/caffe/layers/cudnn_relu_layer.cpp @@ -0,0 +1,34 @@ +#ifdef USE_CUDNN +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CuDNNReLULayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + ReLULayer<Dtype>::LayerSetUp(bottom, top); + // initialize cuDNN + CUDNN_CHECK(cudnnCreate(&handle_)); + const int N = bottom[0]->num(); + const int K = bottom[0]->channels(); + const int H = bottom[0]->height(); + const int W = bottom[0]->width(); + cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); + cudnn::createTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); +} + +template <typename Dtype> +CuDNNReLULayer<Dtype>::~CuDNNReLULayer() { + cudnnDestroyTensor4dDescriptor(this->bottom_desc_); + cudnnDestroyTensor4dDescriptor(this->top_desc_); + cudnnDestroy(this->handle_); +} + +INSTANTIATE_CLASS(CuDNNReLULayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/cudnn_relu_layer.cu b/src/caffe/layers/cudnn_relu_layer.cu new file mode 100644 index 00000000000..8c8ca58140e --- /dev/null +++ b/src/caffe/layers/cudnn_relu_layer.cu @@ -0,0 +1,55 @@ +#ifdef USE_CUDNN +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CuDNNReLULayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + // Fallback to standard Caffe for leaky ReLU. + if (ReLULayer<Dtype>::layer_param_.relu_param().negative_slope() != 0) { + return ReLULayer<Dtype>::Forward_gpu(bottom, top); + } + + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + cudnnStatus_t stat = cudnnActivationForward(this->handle_, + CUDNN_ACTIVATION_RELU, + this->bottom_desc_, bottom_data, this->top_desc_, top_data); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) + << "Error in cudnnActivationForward."; +} + +template <typename Dtype> +void CuDNNReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, + vector<Blob<Dtype>*>* bottom) { + if (!propagate_down[0]) { + return; + } + + // Fallback to standard Caffe for leaky ReLU. + if (ReLULayer<Dtype>::layer_param_.relu_param().negative_slope() != 0) { + return ReLULayer<Dtype>::Backward_gpu(top, propagate_down, bottom); + } + + const Dtype* top_data = top[0]->gpu_data(); + const Dtype* top_diff = top[0]->gpu_diff(); + const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + cudnnStatus_t stat = cudnnActivationBackward(this->handle_, + CUDNN_ACTIVATION_RELU, + this->top_desc_, top_data, this->top_desc_, top_diff, + this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) + << "Error in cudnnActivationBackward."; +} + +INSTANTIATE_CLASS(CuDNNReLULayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/cudnn_sigmoid_layer.cpp b/src/caffe/layers/cudnn_sigmoid_layer.cpp new file mode 100644 index 00000000000..488c7545dba --- /dev/null +++ b/src/caffe/layers/cudnn_sigmoid_layer.cpp @@ -0,0 +1,34 @@ +#ifdef USE_CUDNN +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CuDNNSigmoidLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + SigmoidLayer<Dtype>::LayerSetUp(bottom, top); + // initialize cuDNN + CUDNN_CHECK(cudnnCreate(&handle_)); + const int N = bottom[0]->num(); + const int K = bottom[0]->channels(); + const int H = bottom[0]->height(); + const int W = bottom[0]->width(); + cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); + cudnn::createTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); +} + +template <typename Dtype> +CuDNNSigmoidLayer<Dtype>::~CuDNNSigmoidLayer() { + cudnnDestroyTensor4dDescriptor(this->bottom_desc_); + cudnnDestroyTensor4dDescriptor(this->top_desc_); + cudnnDestroy(this->handle_); +} + +INSTANTIATE_CLASS(CuDNNSigmoidLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/cudnn_sigmoid_layer.cu b/src/caffe/layers/cudnn_sigmoid_layer.cu new file mode 100644 index 00000000000..c548a02dab3 --- /dev/null +++ b/src/caffe/layers/cudnn_sigmoid_layer.cu @@ -0,0 +1,45 @@ +#ifdef USE_CUDNN +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CuDNNSigmoidLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + cudnnStatus_t stat = cudnnActivationForward(this->handle_, + CUDNN_ACTIVATION_SIGMOID, + this->bottom_desc_, bottom_data, this->top_desc_, top_data); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) + << "Error in cudnnActivationForward."; +} + +template <typename Dtype> +void CuDNNSigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, + vector<Blob<Dtype>*>* bottom) { + if (!propagate_down[0]) { + return; + } + + const Dtype* top_data = top[0]->gpu_data(); + const Dtype* top_diff = top[0]->gpu_diff(); + const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + cudnnStatus_t stat = cudnnActivationBackward(this->handle_, + CUDNN_ACTIVATION_SIGMOID, + this->top_desc_, top_data, this->top_desc_, top_diff, + this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) + << "Error in cudnnActivationBackward."; +} + +INSTANTIATE_CLASS(CuDNNSigmoidLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/cudnn_tanh_layer.cpp b/src/caffe/layers/cudnn_tanh_layer.cpp new file mode 100644 index 00000000000..32b6611e40b --- /dev/null +++ b/src/caffe/layers/cudnn_tanh_layer.cpp @@ -0,0 +1,34 @@ +#ifdef USE_CUDNN +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CuDNNTanHLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + TanHLayer<Dtype>::LayerSetUp(bottom, top); + // initialize cuDNN + CUDNN_CHECK(cudnnCreate(&handle_)); + const int N = bottom[0]->num(); + const int K = bottom[0]->channels(); + const int H = bottom[0]->height(); + const int W = bottom[0]->width(); + cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); + cudnn::createTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); +} + +template <typename Dtype> +CuDNNTanHLayer<Dtype>::~CuDNNTanHLayer() { + cudnnDestroyTensor4dDescriptor(this->bottom_desc_); + cudnnDestroyTensor4dDescriptor(this->top_desc_); + cudnnDestroy(this->handle_); +} + +INSTANTIATE_CLASS(CuDNNTanHLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/cudnn_tanh_layer.cu b/src/caffe/layers/cudnn_tanh_layer.cu new file mode 100644 index 00000000000..090b38b4ca7 --- /dev/null +++ b/src/caffe/layers/cudnn_tanh_layer.cu @@ -0,0 +1,45 @@ +#ifdef USE_CUDNN +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CuDNNTanHLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + cudnnStatus_t stat = cudnnActivationForward(this->handle_, + CUDNN_ACTIVATION_TANH, + this->bottom_desc_, bottom_data, this->top_desc_, top_data); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) + << "Error in cudnnActivationForward."; +} + +template <typename Dtype> +void CuDNNTanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, + vector<Blob<Dtype>*>* bottom) { + if (!propagate_down[0]) { + return; + } + + const Dtype* top_data = top[0]->gpu_data(); + const Dtype* top_diff = top[0]->gpu_diff(); + const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + cudnnStatus_t stat = cudnnActivationBackward(this->handle_, + CUDNN_ACTIVATION_TANH, + this->top_desc_, top_data, this->top_desc_, top_diff, + this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) + << "Error in cudnnActivationBackward."; +} + +INSTANTIATE_CLASS(CuDNNTanHLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 2333c3a7dab..4c19d3f9bae 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -272,5 +272,137 @@ TYPED_TEST(NeuronLayerTest, TestBNLLGradient) { &(this->blob_top_vec_)); } +#ifdef USE_CUDNN +template <typename Dtype> +class CuDNNNeuronLayerTest : public ::testing::Test { + protected: + CuDNNNeuronLayerTest() + : blob_bottom_(new Blob<Dtype>(2, 3, 4, 5)), + blob_top_(new Blob<Dtype>()) { + Caffe::set_random_seed(1701); + // fill the values + FillerParameter filler_param; + GaussianFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_bottom_); + blob_bottom_vec_.push_back(blob_bottom_); + blob_top_vec_.push_back(blob_top_); + } + virtual ~CuDNNNeuronLayerTest() { delete blob_bottom_; delete blob_top_; } + Blob<Dtype>* const blob_bottom_; + Blob<Dtype>* const blob_top_; + vector<Blob<Dtype>*> blob_bottom_vec_; + vector<Blob<Dtype>*> blob_top_vec_; +}; + +TYPED_TEST_CASE(CuDNNNeuronLayerTest, TestDtypes); + +TYPED_TEST(CuDNNNeuronLayerTest, TestReLUCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + CuDNNReLULayer<TypeParam> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + EXPECT_GE(top_data[i], 0.); + EXPECT_TRUE(top_data[i] == 0 || top_data[i] == bottom_data[i]); + } +} + +TYPED_TEST(CuDNNNeuronLayerTest, TestReLUGradientCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + CuDNNReLULayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-2, 1e-3, 1701, 0., 0.01); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +TYPED_TEST(CuDNNNeuronLayerTest, TestReLUWithNegativeSlopeCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + layer_param.ParseFromString("relu_param{negative_slope:0.01}"); + CuDNNReLULayer<TypeParam> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + EXPECT_GE(top_data[i], 0.); + EXPECT_TRUE(top_data[i] == 0 || top_data[i] == bottom_data[i]); + } +} + +TYPED_TEST(CuDNNNeuronLayerTest, TestReLUGradientWithNegativeSlopeCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + layer_param.ParseFromString("relu_param{negative_slope:0.01}"); + CuDNNReLULayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-2, 1e-3, 1701, 0., 0.01); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +TYPED_TEST(CuDNNNeuronLayerTest, TestSigmoidCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + CuDNNSigmoidLayer<TypeParam> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Now, check values + const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); + const TypeParam* top_data = this->blob_top_->cpu_data(); + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + EXPECT_FLOAT_EQ(top_data[i], 1. / (1 + exp(-bottom_data[i]))); + // check that we squashed the value between 0 and 1 + EXPECT_GE(top_data[i], 0.); + EXPECT_LE(top_data[i], 1.); + } +} + +TYPED_TEST(CuDNNNeuronLayerTest, TestSigmoidGradientCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + CuDNNSigmoidLayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-2, 1e-3, 1701, 0., 0.01); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +TYPED_TEST(CuDNNNeuronLayerTest, TestTanHCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + CuDNNTanHLayer<TypeParam> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Test exact values + for (int i = 0; i < this->blob_bottom_->num(); ++i) { + for (int j = 0; j < this->blob_bottom_->channels(); ++j) { + for (int k = 0; k < this->blob_bottom_->height(); ++k) { + for (int l = 0; l < this->blob_bottom_->width(); ++l) { + EXPECT_GE(this->blob_top_->data_at(i, j, k, l) + 1e-4, + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); + EXPECT_LE(this->blob_top_->data_at(i, j, k, l) - 1e-4, + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) - 1) / + (exp(2*this->blob_bottom_->data_at(i, j, k, l)) + 1)); + } + } + } + } +} + +TYPED_TEST(CuDNNNeuronLayerTest, TestTanHGradientCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + CuDNNTanHLayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-2, 1e-3); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} +#endif } // namespace caffe From 84bd1f5e98b9bd59be96f7af8c116123cee967f8 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 5 Sep 2014 23:53:04 -0700 Subject: [PATCH 0728/2053] strategize cuDNN softmax --- include/caffe/common_layers.hpp | 26 +++++++++ src/caffe/layer_factory.cpp | 4 ++ src/caffe/layers/cudnn_softmax_layer.cpp | 39 ++++++++++++++ src/caffe/layers/cudnn_softmax_layer.cu | 43 +++++++++++++++ src/caffe/layers/softmax_layer.cpp | 1 - src/caffe/test/test_softmax_layer.cpp | 68 ++++++++++++++++++++++++ 6 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 src/caffe/layers/cudnn_softmax_layer.cpp create mode 100644 src/caffe/layers/cudnn_softmax_layer.cu diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 37535920992..c170742308c 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -375,6 +375,32 @@ class SoftmaxLayer : public Layer<Dtype> { Blob<Dtype> scale_; }; +#ifdef USE_CUDNN +/** + * @brief cuDNN implementation of SoftmaxLayer. + * Fallback to SoftmaxLayer for CPU mode. + */ +template <typename Dtype> +class CuDNNSoftmaxLayer : public SoftmaxLayer<Dtype> { + public: + explicit CuDNNSoftmaxLayer(const LayerParameter& param) + : SoftmaxLayer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual ~CuDNNSoftmaxLayer(); + + protected: + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + + cudnnHandle_t handle_; + cudnnTensor4dDescriptor_t bottom_desc_; + cudnnTensor4dDescriptor_t top_desc_; +}; +#endif + /** * @brief Creates a "split" path in the network by copying the bottom Blob * into multiple top Blob%s to be used by multiple consuming layers. diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index c5194853cbf..41c547b8ad4 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -157,6 +157,10 @@ SoftmaxLayer<Dtype>* GetSoftmaxLayer(const string& name, } if (engine == SoftmaxParameter_Engine_CAFFE) { return new SoftmaxLayer<Dtype>(param); +#ifdef USE_CUDNN + } else if (engine == SoftmaxParameter_Engine_CUDNN) { + return new CuDNNSoftmaxLayer<Dtype>(param); +#endif } else { LOG(FATAL) << "Layer " << name << " has unknown engine."; } diff --git a/src/caffe/layers/cudnn_softmax_layer.cpp b/src/caffe/layers/cudnn_softmax_layer.cpp new file mode 100644 index 00000000000..58b3a783859 --- /dev/null +++ b/src/caffe/layers/cudnn_softmax_layer.cpp @@ -0,0 +1,39 @@ +#ifdef USE_CUDNN +#include <algorithm> +#include <cfloat> +#include <vector> + +#include "thrust/device_vector.h" + +#include "caffe/layer.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CuDNNSoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + SoftmaxLayer<Dtype>::LayerSetUp(bottom, top); + // Initialize CUDNN. + cudnnStatus_t stat = cudnnCreate(&handle_); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Could not create a CUDNN handle."; + int N = bottom[0]->num(); + int K = bottom[0]->channels(); + int H = bottom[0]->height(); + int W = bottom[0]->width(); + cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); + cudnn::createTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); +} + +template <typename Dtype> +CuDNNSoftmaxLayer<Dtype>::~CuDNNSoftmaxLayer() { + cudnnDestroyTensor4dDescriptor(bottom_desc_); + cudnnDestroyTensor4dDescriptor(top_desc_); + cudnnDestroy(handle_); +} + +INSTANTIATE_CLASS(CuDNNSoftmaxLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/cudnn_softmax_layer.cu b/src/caffe/layers/cudnn_softmax_layer.cu new file mode 100644 index 00000000000..c333774458c --- /dev/null +++ b/src/caffe/layers/cudnn_softmax_layer.cu @@ -0,0 +1,43 @@ +#ifdef USE_CUDNN +#include <algorithm> +#include <cfloat> +#include <vector> + +#include "thrust/device_vector.h" + +#include "caffe/layer.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void CuDNNSoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = (*top)[0]->mutable_gpu_data(); + cudnnStatus_t stat = cudnnSoftmaxForward(handle_, CUDNN_SOFTMAX_ACCURATE, + CUDNN_SOFTMAX_MODE_CHANNEL, + bottom_desc_, bottom_data, top_desc_, top_data); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Error in cudnnSoftmaxBackward."; +} + +template <typename Dtype> +void CuDNNSoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + if (propagate_down[0]) { + const Dtype* top_data = top[0]->gpu_data(); + const Dtype* top_diff = top[0]->gpu_diff(); + const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + cudnnStatus_t stat = cudnnSoftmaxBackward(handle_, CUDNN_SOFTMAX_ACCURATE, + CUDNN_SOFTMAX_MODE_CHANNEL, + top_desc_, top_data, top_desc_, top_diff, bottom_desc_, bottom_diff)); + CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Error in cudnnSoftmaxBackward."; + } +} + +INSTANTIATE_CLASS(CuDNNSoftmaxLayer); + +} // namespace caffe +#endif diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 29767ac775c..952db74a4b6 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -1,4 +1,3 @@ -// #include <algorithm> #include <vector> diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index 9f45f762cdb..41f643f4e2a 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -80,4 +80,72 @@ TYPED_TEST(SoftmaxLayerTest, TestGradient) { &(this->blob_top_vec_)); } +#ifdef USE_CUDNN +template <typename Dtype> +class CuDNNSoftmaxLayerTest : public ::testing::Test { + protected: + CuDNNSoftmaxLayerTest() + : blob_bottom_(new Blob<Dtype>(2, 10, 2, 3)), + blob_top_(new Blob<Dtype>()) { + // fill the values + FillerParameter filler_param; + GaussianFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_bottom_); + blob_bottom_vec_.push_back(blob_bottom_); + blob_top_vec_.push_back(blob_top_); + } + virtual ~CuDNNSoftmaxLayerTest() { delete blob_bottom_; delete blob_top_; } + Blob<Dtype>* const blob_bottom_; + Blob<Dtype>* const blob_top_; + vector<Blob<Dtype>*> blob_bottom_vec_; + vector<Blob<Dtype>*> blob_top_vec_; +}; + +TYPED_TEST_CASE(CuDNNSoftmaxLayerTest, TestDtypes); + +TYPED_TEST(CuDNNSoftmaxLayerTest, TestForwardCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + CuDNNSoftmaxLayer<TypeParam> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + // Test sum + for (int i = 0; i < this->blob_bottom_->num(); ++i) { + for (int k = 0; k < this->blob_bottom_->height(); ++k) { + for (int l = 0; l < this->blob_bottom_->width(); ++l) { + TypeParam sum = 0; + for (int j = 0; j < this->blob_top_->channels(); ++j) { + sum += this->blob_top_->data_at(i, j, k, l); + } + EXPECT_GE(sum, 0.999); + EXPECT_LE(sum, 1.001); + // Test exact values + TypeParam scale = 0; + for (int j = 0; j < this->blob_bottom_->channels(); ++j) { + scale += exp(this->blob_bottom_->data_at(i, j, k, l)); + } + for (int j = 0; j < this->blob_bottom_->channels(); ++j) { + EXPECT_GE(this->blob_top_->data_at(i, j, k, l) + 1e-4, + exp(this->blob_bottom_->data_at(i, j, k, l)) / scale) + << "debug: " << i << " " << j; + EXPECT_LE(this->blob_top_->data_at(i, j, k, l) - 1e-4, + exp(this->blob_bottom_->data_at(i, j, k, l)) / scale) + << "debug: " << i << " " << j; + } + } + } + } +} + +TYPED_TEST(CuDNNSoftmaxLayerTest, TestGradientCuDNN) { + Caffe::set_mode(Caffe::GPU); + LayerParameter layer_param; + CuDNNSoftmaxLayer<TypeParam> layer(layer_param); + GradientChecker<TypeParam> checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + +#endif + } // namespace caffe From 9e3d86f3b621ba2b7f45c67a0b2076a9953ddd6f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sat, 6 Sep 2014 00:18:10 -0700 Subject: [PATCH 0729/2053] CUDNN_CHECK --- src/caffe/layers/cudnn_conv_layer.cpp | 13 +++------ src/caffe/layers/cudnn_conv_layer.cu | 34 ++++++++---------------- src/caffe/layers/cudnn_pooling_layer.cpp | 4 +-- src/caffe/layers/cudnn_pooling_layer.cu | 11 +++----- src/caffe/layers/cudnn_relu_layer.cu | 12 +++------ src/caffe/layers/cudnn_sigmoid_layer.cu | 12 +++------ src/caffe/layers/cudnn_softmax_layer.cpp | 3 +-- src/caffe/layers/cudnn_softmax_layer.cu | 8 +++--- src/caffe/layers/cudnn_tanh_layer.cu | 12 +++------ 9 files changed, 35 insertions(+), 74 deletions(-) diff --git a/src/caffe/layers/cudnn_conv_layer.cpp b/src/caffe/layers/cudnn_conv_layer.cpp index a27d19ce04a..eaacddcb0cc 100644 --- a/src/caffe/layers/cudnn_conv_layer.cpp +++ b/src/caffe/layers/cudnn_conv_layer.cpp @@ -26,16 +26,9 @@ void CuDNNConvolutionLayer<Dtype>::LayerSetUp( handle_ = new cudnnHandle_t[this->group_ * CUDNN_STREAMS_PER_GROUP]; for (int g = 0; g < this->group_ * CUDNN_STREAMS_PER_GROUP; g++) { - // TODO(cudnn) check - cudaError_t err = cudaStreamCreate(&stream_[g]); - CHECK_EQ(err, cudaSuccess) << "Error creating a CUDA stream."; - - // TODO(cudnn) check - cudnnStatus_t stat; - stat = cudnnCreate(&handle_[g]); - CHECK_EQ(stat, CUDNN_STATUS_SUCCESS) << "Could not create a CUDNN handle."; - stat = cudnnSetStream(handle_[g], stream_[g]); - CHECK_EQ(stat, CUDNN_STATUS_SUCCESS) << "Could not set CUDNN stream."; + CUDA_CHECK(cudaStreamCreate(&stream_[g])); + CUDNN_CHECK(cudnnCreate(&handle_[g])); + CUDNN_CHECK(cudnnSetStream(handle_[g], stream_[g])); } // Set the indexing parameters. diff --git a/src/caffe/layers/cudnn_conv_layer.cu b/src/caffe/layers/cudnn_conv_layer.cu index 9a654553b25..2af13309e18 100644 --- a/src/caffe/layers/cudnn_conv_layer.cu +++ b/src/caffe/layers/cudnn_conv_layer.cu @@ -21,25 +21,21 @@ void CuDNNConvolutionLayer<Dtype>::Forward_gpu( // Forward through cuDNN in parallel over groups. for (int g = 0; g < this->group_; g++) { - cudnnStatus_t stat; - // Filters. - stat = cudnnConvolutionForward(handle_[g], + CUDNN_CHECK(cudnnConvolutionForward(handle_[g], bottom_descs_[i], bottom_data + bottom_offset_ * g, filter_desc_, weight + weight_offset_ * g, conv_descs_[i], top_descs_[i], top_data + top_offset_ * g, - CUDNN_RESULT_NO_ACCUMULATE); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Error in cudnnConvolutionForward"; + CUDNN_RESULT_NO_ACCUMULATE)); // Bias. if (this->bias_term_) { const Dtype* bias_data = this->blobs_[1]->gpu_data(); Dtype alpha = 1.; - stat = cudnnAddTensor4d(handle_[g], CUDNN_ADD_SAME_C, &alpha, - bias_desc_, bias_data + bias_offset_ * g, - top_descs_[i], top_data + top_offset_ * g); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Error in cudnnAddTensor4d"; + CUDNN_CHECK(cudnnAddTensor4d(handle_[g], CUDNN_ADD_SAME_C, &alpha, + bias_desc_, bias_data + bias_offset_ * g, + top_descs_[i], top_data + top_offset_ * g)); } } @@ -69,42 +65,34 @@ void CuDNNConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const Dtype* top_diff = top[i]->gpu_diff(); // Backward through cuDNN in parallel over groups and gradients. for (int g = 0; g < this->group_; g++) { - cudnnStatus_t stat; - // Gradient w.r.t. bias. if (this->bias_term_ && this->param_propagate_down_[1]) { - stat = cudnnConvolutionBackwardBias(handle_[0*this->group_ + g], + CUDNN_CHECK(cudnnConvolutionBackwardBias(handle_[0*this->group_ + g], top_descs_[i], top_diff + top_offset_ * g, bias_desc_, bias_diff + bias_offset_ * g, - CUDNN_RESULT_ACCUMULATE); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) - << "Error in cudnnConvolutionBackwardBias."; + CUDNN_RESULT_ACCUMULATE)); } // Gradient w.r.t. weights. if (this->param_propagate_down_[0]) { const Dtype* bottom_data = (*bottom)[i]->gpu_data(); - stat = cudnnConvolutionBackwardFilter(handle_[1*this->group_ + g], + CUDNN_CHECK(cudnnConvolutionBackwardFilter(handle_[1*this->group_ + g], bottom_descs_[i], bottom_data + bottom_offset_ * g, top_descs_[i], top_diff + top_offset_ * g, conv_descs_[i], filter_desc_, weight_diff + weight_offset_ * g, - CUDNN_RESULT_ACCUMULATE); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) - << "Error in cudnnConvolutionBackwardFilter."; + CUDNN_RESULT_ACCUMULATE)); } // Gradient w.r.t. bottom data. if (propagate_down[i]) { Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); - stat = cudnnConvolutionBackwardData(handle_[2*this->group_ + g], + CUDNN_CHECK(cudnnConvolutionBackwardData(handle_[2*this->group_ + g], filter_desc_, weight + weight_offset_ * g, top_descs_[i], top_diff + top_offset_ * g, conv_descs_[i], bottom_descs_[i], bottom_diff + bottom_offset_ * g, - CUDNN_RESULT_NO_ACCUMULATE); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) - << "Error in cudnnConvolutionBackwardData."; + CUDNN_RESULT_NO_ACCUMULATE)); } } diff --git a/src/caffe/layers/cudnn_pooling_layer.cpp b/src/caffe/layers/cudnn_pooling_layer.cpp index c360b63b1f0..23c52012f1e 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cpp +++ b/src/caffe/layers/cudnn_pooling_layer.cpp @@ -14,9 +14,7 @@ void CuDNNPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { PoolingLayer<Dtype>::LayerSetUp(bottom, top); - // TODO(cudnn) check - cudnnStatus_t stat = cudnnCreate(&handle_); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Could not create a CUDNN handle."; + CUDNN_CHECK(cudnnCreate(&handle_)); cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, bottom[0]->num(), this->channels_, this->height_, this->width_); cudnn::createTensor4dDesc<Dtype>(&top_desc_, bottom[0]->num(), diff --git a/src/caffe/layers/cudnn_pooling_layer.cu b/src/caffe/layers/cudnn_pooling_layer.cu index 8f807ac811c..99c409dcc96 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cu +++ b/src/caffe/layers/cudnn_pooling_layer.cu @@ -20,10 +20,8 @@ void CuDNNPoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); - cudnnStatus_t stat = cudnnPoolingForward(handle_, pooling_desc_, - bottom_desc_, bottom_data, top_desc_, top_data); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) - << "Error in cudnnPoolingForward."; + CUDNN_CHECK(cudnnPoolingForward(handle_, pooling_desc_, + bottom_desc_, bottom_data, top_desc_, top_data)); } template <typename Dtype> @@ -43,10 +41,9 @@ void CuDNNPoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const Dtype* top_data = top[0]->gpu_data(); const Dtype* bottom_data = (*bottom)[0]->gpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - cudnnStatus_t stat = cudnnPoolingBackward(handle_, pooling_desc_, + CUDNN_CHECK(cudnnPoolingBackward(handle_, pooling_desc_, top_desc_, top_data, top_desc_, top_diff, - bottom_desc_, bottom_data, bottom_desc_, bottom_diff); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Error in cudnnPoolingBackward."; + bottom_desc_, bottom_data, bottom_desc_, bottom_diff)); } INSTANTIATE_CLASS(CuDNNPoolingLayer); diff --git a/src/caffe/layers/cudnn_relu_layer.cu b/src/caffe/layers/cudnn_relu_layer.cu index 8c8ca58140e..a8519f340cc 100644 --- a/src/caffe/layers/cudnn_relu_layer.cu +++ b/src/caffe/layers/cudnn_relu_layer.cu @@ -17,11 +17,9 @@ void CuDNNReLULayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); - cudnnStatus_t stat = cudnnActivationForward(this->handle_, + CUDNN_CHECK(cudnnActivationForward(this->handle_, CUDNN_ACTIVATION_RELU, - this->bottom_desc_, bottom_data, this->top_desc_, top_data); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) - << "Error in cudnnActivationForward."; + this->bottom_desc_, bottom_data, this->top_desc_, top_data)); } template <typename Dtype> @@ -41,12 +39,10 @@ void CuDNNReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* bottom_data = (*bottom)[0]->gpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - cudnnStatus_t stat = cudnnActivationBackward(this->handle_, + CUDNN_CHECK(cudnnActivationBackward(this->handle_, CUDNN_ACTIVATION_RELU, this->top_desc_, top_data, this->top_desc_, top_diff, - this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) - << "Error in cudnnActivationBackward."; + this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff)); } INSTANTIATE_CLASS(CuDNNReLULayer); diff --git a/src/caffe/layers/cudnn_sigmoid_layer.cu b/src/caffe/layers/cudnn_sigmoid_layer.cu index c548a02dab3..43019bd78ae 100644 --- a/src/caffe/layers/cudnn_sigmoid_layer.cu +++ b/src/caffe/layers/cudnn_sigmoid_layer.cu @@ -12,11 +12,9 @@ void CuDNNSigmoidLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); - cudnnStatus_t stat = cudnnActivationForward(this->handle_, + CUDNN_CHECK(cudnnActivationForward(this->handle_, CUDNN_ACTIVATION_SIGMOID, - this->bottom_desc_, bottom_data, this->top_desc_, top_data); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) - << "Error in cudnnActivationForward."; + this->bottom_desc_, bottom_data, this->top_desc_, top_data)); } template <typename Dtype> @@ -31,12 +29,10 @@ void CuDNNSigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* bottom_data = (*bottom)[0]->gpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - cudnnStatus_t stat = cudnnActivationBackward(this->handle_, + CUDNN_CHECK(cudnnActivationBackward(this->handle_, CUDNN_ACTIVATION_SIGMOID, this->top_desc_, top_data, this->top_desc_, top_diff, - this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) - << "Error in cudnnActivationBackward."; + this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff)); } INSTANTIATE_CLASS(CuDNNSigmoidLayer); diff --git a/src/caffe/layers/cudnn_softmax_layer.cpp b/src/caffe/layers/cudnn_softmax_layer.cpp index 58b3a783859..6dab2d6ac32 100644 --- a/src/caffe/layers/cudnn_softmax_layer.cpp +++ b/src/caffe/layers/cudnn_softmax_layer.cpp @@ -16,8 +16,7 @@ void CuDNNSoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { SoftmaxLayer<Dtype>::LayerSetUp(bottom, top); // Initialize CUDNN. - cudnnStatus_t stat = cudnnCreate(&handle_); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Could not create a CUDNN handle."; + CUDNN_CHECK(cudnnCreate(&handle_)); int N = bottom[0]->num(); int K = bottom[0]->channels(); int H = bottom[0]->height(); diff --git a/src/caffe/layers/cudnn_softmax_layer.cu b/src/caffe/layers/cudnn_softmax_layer.cu index c333774458c..300bdc496c8 100644 --- a/src/caffe/layers/cudnn_softmax_layer.cu +++ b/src/caffe/layers/cudnn_softmax_layer.cu @@ -16,10 +16,9 @@ void CuDNNSoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); - cudnnStatus_t stat = cudnnSoftmaxForward(handle_, CUDNN_SOFTMAX_ACCURATE, + CUDNN_CHECK(cudnnSoftmaxForward(handle_, CUDNN_SOFTMAX_ACCURATE, CUDNN_SOFTMAX_MODE_CHANNEL, - bottom_desc_, bottom_data, top_desc_, top_data); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Error in cudnnSoftmaxBackward."; + bottom_desc_, bottom_data, top_desc_, top_data)); } template <typename Dtype> @@ -30,10 +29,9 @@ void CuDNNSoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* bottom_data = (*bottom)[0]->gpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - cudnnStatus_t stat = cudnnSoftmaxBackward(handle_, CUDNN_SOFTMAX_ACCURATE, + CUDNN_CHECK(cudnnSoftmaxBackward(handle_, CUDNN_SOFTMAX_ACCURATE, CUDNN_SOFTMAX_MODE_CHANNEL, top_desc_, top_data, top_desc_, top_diff, bottom_desc_, bottom_diff)); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) << "Error in cudnnSoftmaxBackward."; } } diff --git a/src/caffe/layers/cudnn_tanh_layer.cu b/src/caffe/layers/cudnn_tanh_layer.cu index 090b38b4ca7..c475b08c0ee 100644 --- a/src/caffe/layers/cudnn_tanh_layer.cu +++ b/src/caffe/layers/cudnn_tanh_layer.cu @@ -12,11 +12,9 @@ void CuDNNTanHLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); - cudnnStatus_t stat = cudnnActivationForward(this->handle_, + CUDNN_CHECK(cudnnActivationForward(this->handle_, CUDNN_ACTIVATION_TANH, - this->bottom_desc_, bottom_data, this->top_desc_, top_data); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) - << "Error in cudnnActivationForward."; + this->bottom_desc_, bottom_data, this->top_desc_, top_data)); } template <typename Dtype> @@ -31,12 +29,10 @@ void CuDNNTanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* bottom_data = (*bottom)[0]->gpu_data(); Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - cudnnStatus_t stat = cudnnActivationBackward(this->handle_, + CUDNN_CHECK(cudnnActivationBackward(this->handle_, CUDNN_ACTIVATION_TANH, this->top_desc_, top_data, this->top_desc_, top_diff, - this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff); - CHECK_EQ(stat,CUDNN_STATUS_SUCCESS) - << "Error in cudnnActivationBackward."; + this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff)); } INSTANTIATE_CLASS(CuDNNTanHLayer); From c65d5a035707b544cfa7a03ffc78a18ba81e921e Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sat, 6 Sep 2014 00:27:51 -0700 Subject: [PATCH 0730/2053] report cuDNN error string --- include/caffe/util/cudnn.hpp | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/include/caffe/util/cudnn.hpp b/include/caffe/util/cudnn.hpp index 1fe72f1e8bc..e7ddea73e6b 100644 --- a/include/caffe/util/cudnn.hpp +++ b/include/caffe/util/cudnn.hpp @@ -9,14 +9,40 @@ #define CUDNN_CHECK(condition) \ do { \ cudnnStatus_t status = condition; \ - CHECK_EQ(status, CUDNN_STATUS_SUCCESS) << " cuDNN error."; \ + CHECK_EQ(status, CUDNN_STATUS_SUCCESS) << " "\ + << cudnnGetErrorString(status); \ } while (0) +inline const char* cudnnGetErrorString(cudnnStatus_t status) { + switch (status) { + case CUDNN_STATUS_SUCCESS: + return "CUDNN_STATUS_SUCCESS"; + case CUDNN_STATUS_NOT_INITIALIZED: + return "CUDNN_STATUS_NOT_INITIALIZED"; + case CUDNN_STATUS_ALLOC_FAILED: + return "CUDNN_STATUS_ALLOC_FAILED"; + case CUDNN_STATUS_BAD_PARAM: + return "CUDNN_STATUS_BAD_PARAM"; + case CUDNN_STATUS_INTERNAL_ERROR: + return "CUDNN_STATUS_INTERNAL_ERROR"; + case CUDNN_STATUS_INVALID_VALUE: + return "CUDNN_STATUS_INVALID_VALUE"; + case CUDNN_STATUS_ARCH_MISMATCH: + return "CUDNN_STATUS_ARCH_MISMATCH"; + case CUDNN_STATUS_MAPPING_ERROR: + return "CUDNN_STATUS_MAPPING_ERROR"; + case CUDNN_STATUS_EXECUTION_FAILED: + return "CUDNN_STATUS_EXECUTION_FAILED"; + case CUDNN_STATUS_NOT_SUPPORTED: + return "CUDNN_STATUS_NOT_SUPPORTED"; + case CUDNN_STATUS_LICENSE_ERROR: + return "CUDNN_STATUS_LICENSE_ERROR"; + } + return "Unknown cudnn status"; +} + namespace caffe { -// TODO(cudnn): check existence, add to CUDN_CHECK -// const char* cudnnGetErrorString(curandStatus_t error); -// namespace cudnn { template <typename Dtype> class dataType; @@ -86,6 +112,7 @@ inline void createPoolingDesc(cudnnPoolingDescriptor_t* conv, } } // namespace cudnn + } // namespace caffe #endif // USE_CUDNN From 359197b039f7dfb60fb9bc83f44f75b5477faf78 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sun, 7 Sep 2014 18:59:40 +0200 Subject: [PATCH 0731/2053] [docs] include cuDNN in installation and performance reference --- docs/installation.md | 18 ++++++++++++------ docs/performance_hardware.md | 20 ++++++++++++++++---- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 82a22d5cde3..dbf73d2c067 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -15,7 +15,7 @@ We have installed Caffe on Ubuntu 14.04, Ubuntu 12.04, OS X 10.9, and OS X 10.8. Caffe depends on several software packages. -* [CUDA](https://developer.nvidia.com/cuda-zone) library version 6.0, 5.5, or 5.0 and the latest driver version for CUDA 6 or 319.* for CUDA 5 (and NOT 331.*) +* [CUDA](https://developer.nvidia.com/cuda-zone) library version 6.5 (recommended), 6.0, 5.5, or 5.0 and the latest driver version for CUDA 6 or 319.* for CUDA 5 (and NOT 331.*) * [BLAS](http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) (provided via ATLAS, MKL, or OpenBLAS). * [OpenCV](http://opencv.org/). * [Boost](http://www.boost.org/) (>= 1.55, although only 1.55 is tested) @@ -25,13 +25,17 @@ Caffe depends on several software packages. * For the MATLAB wrapper * MATLAB with the `mex` compiler. -**CPU-only Caffe**: for cold-brewed CPU-only Caffe uncomment the `CPU_ONLY := 1` in `Makefile.config` to configure and build Caffe without CUDA. This is helpful for cloud or cluster deployment. +**cuDNN Caffe**: for fastest operation Caffe is accelerated by drop-in integration of [NVIDIA cuDNN](https://developer.nvidia.com/cudnn). To speed up your Caffe models, install cuDNN then uncomment the `USE_CUDNN := 1` flag in `Makefile.config` when installing Caffe. Acceleration is automatic. + +**CPU-only Caffe**: for cold-brewed CPU-only Caffe uncomment the `CPU_ONLY := 1` flag in `Makefile.config` to configure and build Caffe without CUDA. This is helpful for cloud or cluster deployment. ### CUDA and BLAS Caffe requires the CUDA `nvcc` compiler to compile its GPU code and CUDA driver for GPU operation. To install CUDA, go to the [NVIDIA CUDA website](https://developer.nvidia.com/cuda-downloads) and follow installation instructions there. Install the library and the latest standalone driver separately; the driver bundled with the library is usually out-of-date. **Warning!** The 331.* CUDA driver series has a critical performance issue: do not use it. +For best performance, Caffe can be accelerated by [NVIDIA cuDNN](https://developer.nvidia.com/cudnn). Register for free at the cuDNN site, install it, then continue with these installation instructions. To compile with cuDNN set the `USE_CUDNN := 1` flag set in your `Makefile.config`. + Caffe requires BLAS as the backend of its matrix and vector computations. There are several implementations of this library. The choice is yours: @@ -92,7 +96,7 @@ Keep reading to find out how to manually build and install the Google flags libr On **CentOS / RHEL / Fedora**, most of the dependencies can be installed with sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel - + The Google flags library, Google logging library and LMDB already made their ways into newer versions of **CentOS / RHEL / Fedora** so it is better to first attempt to install them using `yum` sudo yum install gflags-devel glog-devel lmdb-devel @@ -192,7 +196,7 @@ If you're not using Anaconda, include `hdf5` in the list above. **Note** that in order to build the caffe python wrappers you must install boost using the --with-python option: brew install --build-from-source --with-python --fresh -vd boost - + **Note** that Homebrew maintains itself as a separate git repository and making the above `brew edit FORMULA` changes will change files in your local copy of homebrew's master branch. By default, this will prevent you from updating Homebrew using `brew update`, as you will get an error message like the following: $ brew update @@ -201,7 +205,7 @@ If you're not using Anaconda, include `hdf5` in the list above. Please, commit your changes or stash them before you can merge. Aborting Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master - + One solution is to commit your changes to a separate Homebrew branch, run `brew update`, and rebase your changes onto the updated master, as follows: cd /usr/local @@ -213,7 +217,7 @@ One solution is to commit your changes to a separate Homebrew branch, run `brew git rebase master caffe # Resolve any merge conflicts here git checkout caffe - + At this point, you should be running the latest Homebrew packages and your Caffe-related modifications will remain in place. You may still get the following error: $ brew update @@ -240,6 +244,8 @@ The defaults should work, but uncomment the relevant lines if using Anaconda Pyt make test make runtest +To compile with cuDNN acceleration, you should uncomment the `USE_CUDNN := 1` switch in `Makefile.config`. + If there is no GPU in your machine, you should switch to CPU-only Caffe by uncommenting `CPU_ONLY := 1` in `Makefile.config`. To compile the Python and MATLAB wrappers do `make pycaffe` and `make matcaffe` respectively. diff --git a/docs/performance_hardware.md b/docs/performance_hardware.md index 62385431751..b35246feabd 100644 --- a/docs/performance_hardware.md +++ b/docs/performance_hardware.md @@ -4,7 +4,7 @@ title: Performance and Hardware Configuration # Performance and Hardware Configuration -To measure performance on different NVIDIA GPUs we use the Caffe reference ImageNet model. +To measure performance on different NVIDIA GPUs we use CaffeNet, the Caffe reference ImageNet model. For training, each time point is 20 iterations/minibatches of 256 images for 5,120 images total. For testing, a 50,000 image validation set is classified. @@ -14,11 +14,16 @@ For training, each time point is 20 iterations/minibatches of 256 images for 5,1 Performance is best with ECC off and boost clock enabled. While ECC makes a negligible difference in speed, disabling it frees ~1 GB of GPU memory. -Best settings with ECC off and maximum clock speed: +Best settings with ECC off and maximum clock speed in standard Caffe: * Training is 26.5 secs / 20 iterations (5,120 images) * Testing is 100 secs / validation set (50,000 images) +Best settings with Caffe + [cuDNN acceleration](http://nvidia.com/cudnn): + +* Training is 19.2 secs / 20 iterations (5,120 images) +* Testing is 60.7 secs / validation set (50,000 images) + Other settings: * ECC on, max speed: training 26.7 secs / 20 iterations, test 101 secs / validation set @@ -50,12 +55,19 @@ but note that this configuration resets across driver reloading / rebooting. Inc Training: 26.26 secs / 20 iterations (5,120 images). Testing: 100 secs / validation set (50,000 images). +cuDNN Training: 20.25 secs / 20 iterations (5,120 images). +cuDNN Testing: 66.3 secs / validation set (50,000 images). + + ## NVIDIA K20 Training: 36.0 secs / 20 iterations (5,120 images). -Testing: 133 secs / validation set (50,000 images) +Testing: 133 secs / validation set (50,000 images). ## NVIDIA GTX 770 Training: 33.0 secs / 20 iterations (5,120 images). -Testing: 129 secs / validation set (50,000 images) +Testing: 129 secs / validation set (50,000 images). + +cuDNN Training: 24.3 secs / 20 iterations (5,120 images). +cuDNN Testing: 104 secs / validation set (50,000 images). From 396da71569124a2362efe034764fffd679f51f00 Mon Sep 17 00:00:00 2001 From: J Yegerlehner <jyegerlehner@yahoo.com> Date: Sun, 7 Sep 2014 21:46:38 -0500 Subject: [PATCH 0732/2053] Repair crash in conv_layer due to weight pointer being NULL. --- src/caffe/layers/conv_layer.cpp | 3 +++ src/caffe/layers/conv_layer.cu | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 1a1248f3dda..be7a57402bc 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -203,6 +203,9 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } // gradient w.r.t. bottom data, if necessary if (propagate_down[i]) { + if(weight==NULL) { + weight = this->blobs_[0]->cpu_data(); + } for (int g = 0; g < group_; ++g) { caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, (Dtype)1., weight + weight_offset * g, diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index f7f393badba..02cfdb3b80c 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -96,6 +96,9 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } // gradient w.r.t. bottom data, if necessary if (propagate_down[i]) { + if (weight == NULL) { + weight = this->blobs_[0]->gpu_data(); + } for (int g = 0; g < group_; ++g) { caffe_gpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, (Dtype)1., weight + weight_offset * g, From a739cdadbbca18e5d7c4f97b144e9cda8503037a Mon Sep 17 00:00:00 2001 From: J Yegerlehner <jyegerlehner@yahoo.com> Date: Sun, 7 Sep 2014 23:10:33 -0500 Subject: [PATCH 0733/2053] Fix more lint. --- src/caffe/layers/conv_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index be7a57402bc..1d3686b936a 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -203,7 +203,7 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } // gradient w.r.t. bottom data, if necessary if (propagate_down[i]) { - if(weight==NULL) { + if (weight == NULL) { weight = this->blobs_[0]->cpu_data(); } for (int g = 0; g < group_; ++g) { From 68e26576d864406762c3ebf361c4227767cefbd8 Mon Sep 17 00:00:00 2001 From: ZhiHeng NIU <niuzhiheng@gmail.com> Date: Mon, 8 Sep 2014 14:46:43 +0800 Subject: [PATCH 0734/2053] Fixed CMake script of FindOpenBLAS. --- CMakeScripts/FindOpenBLAS.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeScripts/FindOpenBLAS.cmake b/CMakeScripts/FindOpenBLAS.cmake index 297a7b6bc43..b8434927a4d 100644 --- a/CMakeScripts/FindOpenBLAS.cmake +++ b/CMakeScripts/FindOpenBLAS.cmake @@ -26,7 +26,7 @@ SET(Open_BLAS_LIB_SEARCH_PATHS $ENV{OpenBLAS_HOME}/lib ) -FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${ATLAS_POSSIBLE_INCLUDE_PATHS}) +FIND_PATH(OpenBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Open_BLAS_INCLUDE_SEARCH_PATHS}) FIND_LIBRARY(OpenBLAS_LIB NAMES openblas PATHS ${Open_BLAS_LIB_SEARCH_PATHS}) SET(OpenBLAS_FOUND ON) From 99c4ed5bb7fbd961a19f564611166c4b702ca717 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 8 Sep 2014 10:03:55 +0200 Subject: [PATCH 0735/2053] [lint] cuDNN conv declaration --- include/caffe/vision_layers.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 4dd2e9df99a..8c2db8824ed 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -69,8 +69,7 @@ class ConvolutionLayer : public Layer<Dtype> { * Fallback to ConvolutionLayer for CPU mode. */ template <typename Dtype> -class CuDNNConvolutionLayer : public ConvolutionLayer<Dtype> -{ +class CuDNNConvolutionLayer : public ConvolutionLayer<Dtype> { public: explicit CuDNNConvolutionLayer(const LayerParameter& param) : ConvolutionLayer<Dtype>(param) {} From 2d881032159c0ce66f88dc28942f9cf19d037fb3 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 8 Sep 2014 10:42:55 +0200 Subject: [PATCH 0736/2053] linecount counts more dirs than just src/ --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 546de931f7e..436a300bede 100644 --- a/Makefile +++ b/Makefile @@ -330,7 +330,9 @@ all: $(NAME) $(STATIC_NAME) tools examples everything: all py$(PROJECT) mat$(PROJECT) test warn lint runtest linecount: - cloc --read-lang-def=$(PROJECT).cloc src/$(PROJECT)/ + cloc --read-lang-def=$(PROJECT).cloc \ + src/$(PROJECT) include/$(PROJECT) tools examples \ + python matlab lint: $(EMPTY_LINT_REPORT) From 63bad310c1c2c11e29326cf87b635c1600149a0a Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 8 Sep 2014 11:02:31 +0200 Subject: [PATCH 0737/2053] Revert "call __signbit for CUDA >= 6.5 implementation" -- doesn't compile on OSX w/ CUDA 6.5 This reverts commit 8819f5953b903ec8b48e541271737e89a2cd24e6. --- src/caffe/util/math_functions.cu | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index 176da93161c..4ae4bba6029 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -329,12 +329,7 @@ void caffe_gpu_powx<double>(const int N, const double* a, DEFINE_AND_INSTANTIATE_GPU_UNARY_FUNC(sign, y[index] = (Dtype(0) < x[index]) - (x[index] < Dtype(0))); -#if CUDA_VERSION >= 6050 -// __signbit to pick up the CUDA function. -DEFINE_AND_INSTANTIATE_GPU_UNARY_FUNC(sgnbit, y[index] = __signbit(x[index])); -#else DEFINE_AND_INSTANTIATE_GPU_UNARY_FUNC(sgnbit, y[index] = signbit(x[index])); -#endif __global__ void popc_kernel(const int n, const float* a, const float* b, uint8_t* y) { From 64c8dcbd1dc6b5a66033a8f20e5497bdc6ff99e6 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 8 Sep 2014 12:44:21 +0200 Subject: [PATCH 0738/2053] [docs] replace intro slides with caffe tutorial --- docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.md b/docs/index.md index 67b424ceefd..360f61a978f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -33,8 +33,8 @@ Consult performance [details](/performance_hardware.html). ## Documentation -- [Introductory slides](http://dl.caffe.berkeleyvision.org/caffe-presentation.pdf)<br /> -Slides about the Caffe architecture, *updated 03/14*. +- [DIY Deep Learning for Vision with Caffe](https://docs.google.com/presentation/d/1UeKXVgRvvxg9OUdh_UiC5G71UMscNPlvArsWER41PsU/edit#slide=id.p)<br /> +Caffe tutorial slides. - [ACM MM paper](http://ucb-icsi-vision-group.github.io/caffe-paper/caffe.pdf)<br /> A 4-page report for the ACM Multimedia Open Source competition. - [Installation instructions](/installation.html)<br /> From 761c81505e86ef9e263820d38448cac5bf81f838 Mon Sep 17 00:00:00 2001 From: to3i <tobias.dencker@gmail.com> Date: Fri, 11 Jul 2014 13:19:23 +0200 Subject: [PATCH 0739/2053] Implemented elementwise max layer --- include/caffe/common_layers.hpp | 1 + src/caffe/layers/eltwise_layer.cpp | 50 ++++++++++++++++++++ src/caffe/layers/eltwise_layer.cu | 67 ++++++++++++++++++++++++--- src/caffe/proto/caffe.proto | 1 + src/caffe/test/test_eltwise_layer.cpp | 32 +++++++++++++ 5 files changed, 145 insertions(+), 6 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index c170742308c..190b5c24b05 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -178,6 +178,7 @@ class EltwiseLayer : public Layer<Dtype> { EltwiseParameter_EltwiseOp op_; vector<Dtype> coeffs_; + shared_ptr<Blob<int> > max_idx_; bool stable_prod_grad_; }; diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 56a1920e32f..b25611aa6c3 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -1,4 +1,5 @@ #include <vector> +#include <cfloat> #include "caffe/layer.hpp" #include "caffe/util/math_functions.hpp" @@ -36,11 +37,20 @@ void EltwiseLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, } } stable_prod_grad_ = this->layer_param_.eltwise_param().stable_prod_grad(); + // If max operation, we will initialize the vector index part. + if (this->layer_param_.eltwise_param().operation() == + EltwiseParameter_EltwiseOp_MAX && top->size() == 1) { + max_idx_.reset(new Blob<int>(bottom[0]->num(), channels, + height, width)); + } } template <typename Dtype> void EltwiseLayer<Dtype>::Forward_cpu( const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + int* mask = NULL; + const Dtype* bottom_data_a = NULL; + const Dtype* bottom_data_b = NULL; const int count = (*top)[0]->count(); Dtype* top_data = (*top)[0]->mutable_cpu_data(); switch (op_) { @@ -57,6 +67,35 @@ void EltwiseLayer<Dtype>::Forward_cpu( caffe_axpy(count, coeffs_[i], bottom[i]->cpu_data(), top_data); } break; + case EltwiseParameter_EltwiseOp_MAX: + // Initialize + mask = max_idx_->mutable_cpu_data(); + caffe_set(count, -1, mask); + caffe_set(count, Dtype(-FLT_MAX), top_data); + // bottom 0 & 1 + bottom_data_a = bottom[0]->cpu_data(); + bottom_data_b = bottom[1]->cpu_data(); + for (int idx = 0; idx < count; ++idx) { + if (bottom_data_a[idx] > bottom_data_b[idx]) { + top_data[idx] = bottom_data_a[idx]; // maxval + mask[idx] = 0; // maxid + } else { + top_data[idx] = bottom_data_b[idx]; // maxval + mask[idx] = 1; // maxid + } + } + // bottom 2++ + bottom_data_a = top_data; + for (int blob_idx = 2; blob_idx < bottom.size(); ++blob_idx) { + bottom_data_b = bottom[blob_idx]->cpu_data(); + for (int idx = 0; idx < count; ++idx) { + if (bottom_data_a[idx] < bottom_data_b[idx]) { + top_data[idx] = bottom_data_b[idx]; // maxval + mask[idx] = blob_idx; // maxid + } + } + } + break; default: LOG(FATAL) << "Unknown elementwise operation."; } @@ -65,6 +104,7 @@ void EltwiseLayer<Dtype>::Forward_cpu( template <typename Dtype> void EltwiseLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const int* mask = NULL; const int count = top[0]->count(); const Dtype* top_data = top[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); @@ -98,6 +138,16 @@ void EltwiseLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, caffe_cpu_scale(count, coeffs_[i], top_diff, bottom_diff); } break; + case EltwiseParameter_EltwiseOp_MAX: + mask = max_idx_->cpu_data(); + for (int index = 0; index < count; ++index) { + Dtype gradient = 0; + if (mask[index] == i) { + gradient += top_diff[index]; + } + bottom_diff[index] = gradient; + } + break; default: LOG(FATAL) << "Unknown elementwise operation."; } diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index e005cb91122..78f911ba263 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -1,4 +1,5 @@ #include <vector> +#include <cfloat> #include "caffe/layer.hpp" #include "caffe/util/math_functions.hpp" @@ -7,14 +8,39 @@ namespace caffe { template <typename Dtype> -void EltwiseLayer<Dtype>::Forward_gpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { +__global__ void MaxForward(const int nthreads, const Dtype* bottom_data_a, + const Dtype* bottom_data_b, const int blob_idx, Dtype* top_data, + int* mask) { + CUDA_KERNEL_LOOP(index, nthreads) { + Dtype maxval = -FLT_MAX; + int maxidx = -1; + if (bottom_data_a[index] > bottom_data_b[index]) { + // only update for very first bottom_data blob (blob_idx == 0) + if (blob_idx == 0) { + maxval = bottom_data_a[index]; + top_data[index] = maxval; + maxidx = blob_idx; + mask[index] = maxidx; + } + } else { + maxval = bottom_data_b[index]; + top_data[index] = maxval; + maxidx = blob_idx + 1; + mask[index] = maxidx; + } + } +} + +template<typename Dtype> +void EltwiseLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + int* mask = NULL; const int count = (*top)[0]->count(); Dtype* top_data = (*top)[0]->mutable_gpu_data(); switch (op_) { case EltwiseParameter_EltwiseOp_PROD: - caffe_gpu_mul(count, bottom[0]->gpu_data(), - bottom[1]->gpu_data(), top_data); + caffe_gpu_mul(count, bottom[0]->gpu_data(), bottom[1]->gpu_data(), + top_data); for (int i = 2; i < bottom.size(); ++i) { caffe_gpu_mul(count, top_data, bottom[i]->gpu_data(), top_data); } @@ -26,14 +52,38 @@ void EltwiseLayer<Dtype>::Forward_gpu( caffe_gpu_axpy(count, coeffs_[i], bottom[i]->gpu_data(), top_data); } break; + case EltwiseParameter_EltwiseOp_MAX: + mask = max_idx_->mutable_gpu_data(); + // NOLINT_NEXT_LINE(whitespace/operators) + MaxForward<Dtype> <<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( + count, bottom[0]->gpu_data(), bottom[1]->gpu_data(), 0, top_data, mask); + for (int i = 2; i < bottom.size(); ++i) { + // NOLINT_NEXT_LINE(whitespace/operators) + MaxForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( + count, top_data, bottom[i]->gpu_data(), i-1, top_data, mask); + } + break; default: LOG(FATAL) << "Unknown elementwise operation."; } } -template <typename Dtype> +template<typename Dtype> +__global__ void MaxBackward(const int nthreads, const Dtype* top_diff, + const int blob_idx, const int* mask, Dtype* bottom_diff) { + CUDA_KERNEL_LOOP(index, nthreads) { + Dtype gradient = 0; + if (mask[index] == blob_idx) { + gradient += top_diff[index]; + } + bottom_diff[index] = gradient; + } +} + +template<typename Dtype> void EltwiseLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const int* mask = NULL; const int count = top[0]->count(); const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); @@ -67,6 +117,12 @@ void EltwiseLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, caffe_gpu_scale(count, coeffs_[i], top_diff, bottom_diff); } break; + case EltwiseParameter_EltwiseOp_MAX: + mask = max_idx_->gpu_data(); + // NOLINT_NEXT_LINE(whitespace/operators) + MaxBackward<Dtype> <<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( + count, top_diff, i, mask, bottom_diff); + break; default: LOG(FATAL) << "Unknown elementwise operation."; } @@ -76,5 +132,4 @@ void EltwiseLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, INSTANTIATE_CLASS(EltwiseLayer); - } // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 8cb82cebe22..0e9ecf72728 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -450,6 +450,7 @@ message EltwiseParameter { enum EltwiseOp { PROD = 0; SUM = 1; + MAX = 2; } optional EltwiseOp operation = 1 [default = SUM]; // element-wise operation repeated float coeff = 2; // blob-wise coefficient for SUM operation diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index da5e3538131..3c617281504 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -173,4 +173,36 @@ TYPED_TEST(EltwiseLayerTest, TestSumCoeffGradient) { &(this->blob_top_vec_)); } +TYPED_TEST(EltwiseLayerTest, TestMax) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_MAX); + shared_ptr<EltwiseLayer<Dtype> > layer( + new EltwiseLayer<Dtype>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + const Dtype* data = this->blob_top_->cpu_data(); + const int count = this->blob_top_->count(); + const Dtype* in_data_a = this->blob_bottom_a_->cpu_data(); + const Dtype* in_data_b = this->blob_bottom_b_->cpu_data(); + const Dtype* in_data_c = this->blob_bottom_c_->cpu_data(); + for (int i = 0; i < count; ++i) { + EXPECT_GE(data[i], in_data_a[i]); + EXPECT_GE(data[i], in_data_b[i]); + EXPECT_GE(data[i], in_data_c[i]); + } +} + +TYPED_TEST(EltwiseLayerTest, TestMaxGradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_MAX); + EltwiseLayer<Dtype> layer(layer_param); + GradientChecker<Dtype> checker(1e-2, 1e-3); + checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_)); +} + } // namespace caffe From 6bda40640bba5e3e4751ae5fa6161da7df941ebe Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 8 Sep 2014 17:49:42 +0200 Subject: [PATCH 0740/2053] lint & reduce gradient check stepsize to pass checks --- src/caffe/layers/eltwise_layer.cpp | 13 ++++++------- src/caffe/layers/eltwise_layer.cu | 12 ++++++------ src/caffe/test/test_eltwise_layer.cpp | 9 +++++---- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index b25611aa6c3..46034be4784 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -1,5 +1,5 @@ -#include <vector> #include <cfloat> +#include <vector> #include "caffe/layer.hpp" #include "caffe/util/math_functions.hpp" @@ -77,19 +77,18 @@ void EltwiseLayer<Dtype>::Forward_cpu( bottom_data_b = bottom[1]->cpu_data(); for (int idx = 0; idx < count; ++idx) { if (bottom_data_a[idx] > bottom_data_b[idx]) { - top_data[idx] = bottom_data_a[idx]; // maxval - mask[idx] = 0; // maxid + top_data[idx] = bottom_data_a[idx]; // maxval + mask[idx] = 0; // maxid } else { - top_data[idx] = bottom_data_b[idx]; // maxval - mask[idx] = 1; // maxid + top_data[idx] = bottom_data_b[idx]; // maxval + mask[idx] = 1; // maxid } } // bottom 2++ - bottom_data_a = top_data; for (int blob_idx = 2; blob_idx < bottom.size(); ++blob_idx) { bottom_data_b = bottom[blob_idx]->cpu_data(); for (int idx = 0; idx < count; ++idx) { - if (bottom_data_a[idx] < bottom_data_b[idx]) { + if (bottom_data_b[idx] > top_data[idx]) { top_data[idx] = bottom_data_b[idx]; // maxval mask[idx] = blob_idx; // maxid } diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index 78f911ba263..c0d47fd413b 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -1,5 +1,5 @@ -#include <vector> #include <cfloat> +#include <vector> #include "caffe/layer.hpp" #include "caffe/util/math_functions.hpp" @@ -31,7 +31,7 @@ __global__ void MaxForward(const int nthreads, const Dtype* bottom_data_a, } } -template<typename Dtype> +template <typename Dtype> void EltwiseLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { int* mask = NULL; @@ -68,7 +68,7 @@ void EltwiseLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } } -template<typename Dtype> +template <typename Dtype> __global__ void MaxBackward(const int nthreads, const Dtype* top_diff, const int blob_idx, const int* mask, Dtype* bottom_diff) { CUDA_KERNEL_LOOP(index, nthreads) { @@ -80,7 +80,7 @@ __global__ void MaxBackward(const int nthreads, const Dtype* top_diff, } } -template<typename Dtype> +template <typename Dtype> void EltwiseLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { const int* mask = NULL; @@ -119,8 +119,8 @@ void EltwiseLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, break; case EltwiseParameter_EltwiseOp_MAX: mask = max_idx_->gpu_data(); - // NOLINT_NEXT_LINE(whitespace/operators) - MaxBackward<Dtype> <<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( + MaxBackward<Dtype> // NOLINT_NEXT_LINE(whitespace/operators) + <<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( count, top_diff, i, mask, bottom_diff); break; default: diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index 3c617281504..d5cf08229ab 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -1,3 +1,4 @@ +#include <algorithm> #include <vector> #include "gtest/gtest.h" @@ -23,6 +24,7 @@ class EltwiseLayerTest : public MultiDeviceTest<TypeParam> { blob_bottom_c_(new Blob<Dtype>(2, 3, 4, 5)), blob_top_(new Blob<Dtype>()) { // fill the values + Caffe::set_random_seed(1701); FillerParameter filler_param; UniformFiller<Dtype> filler(filler_param); filler.Fill(this->blob_bottom_a_); @@ -188,9 +190,8 @@ TYPED_TEST(EltwiseLayerTest, TestMax) { const Dtype* in_data_b = this->blob_bottom_b_->cpu_data(); const Dtype* in_data_c = this->blob_bottom_c_->cpu_data(); for (int i = 0; i < count; ++i) { - EXPECT_GE(data[i], in_data_a[i]); - EXPECT_GE(data[i], in_data_b[i]); - EXPECT_GE(data[i], in_data_c[i]); + EXPECT_EQ(data[i], + std::max(in_data_a[i], std::max(in_data_b[i], in_data_c[i]))); } } @@ -200,7 +201,7 @@ TYPED_TEST(EltwiseLayerTest, TestMaxGradient) { EltwiseParameter* eltwise_param = layer_param.mutable_eltwise_param(); eltwise_param->set_operation(EltwiseParameter_EltwiseOp_MAX); EltwiseLayer<Dtype> layer(layer_param); - GradientChecker<Dtype> checker(1e-2, 1e-3); + GradientChecker<Dtype> checker(1e-4, 1e-3); checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), &(this->blob_top_vec_)); } From d149c9a98d783eb64cefbbfeb02c6859dd81cfa6 Mon Sep 17 00:00:00 2001 From: Nick Carlevaris-Bianco <carlevar@umich.edu> Date: Thu, 21 Aug 2014 09:32:10 -0400 Subject: [PATCH 0741/2053] Added contrastive loss layer, associated tests, and a siamese network example using shared weights and the contrastive loss. --- .../siamese/convert_mnist_siamese_data.cpp | 123 +++++++ examples/siamese/create_mnist_siamese.sh | 21 ++ examples/siamese/mnist_siamese.ipynb | 169 ++++++++++ examples/siamese/mnist_siamese.prototxt | 95 ++++++ .../siamese/mnist_siamese_solver.prototxt | 25 ++ .../siamese/mnist_siamese_train_test.prototxt | 313 ++++++++++++++++++ examples/siamese/readme.md | 179 ++++++++++ examples/siamese/train_mnist_siamese.sh | 5 + include/caffe/loss_layers.hpp | 87 +++++ src/caffe/layer_factory.cpp | 2 + src/caffe/layers/contrastive_loss_layer.cpp | 101 ++++++ src/caffe/layers/contrastive_loss_layer.cu | 91 +++++ src/caffe/proto/caffe.proto | 12 +- .../test/test_contrastive_loss_layer.cpp | 102 ++++++ 14 files changed, 1323 insertions(+), 2 deletions(-) create mode 100644 examples/siamese/convert_mnist_siamese_data.cpp create mode 100755 examples/siamese/create_mnist_siamese.sh create mode 100644 examples/siamese/mnist_siamese.ipynb create mode 100644 examples/siamese/mnist_siamese.prototxt create mode 100644 examples/siamese/mnist_siamese_solver.prototxt create mode 100644 examples/siamese/mnist_siamese_train_test.prototxt create mode 100644 examples/siamese/readme.md create mode 100755 examples/siamese/train_mnist_siamese.sh create mode 100644 src/caffe/layers/contrastive_loss_layer.cpp create mode 100644 src/caffe/layers/contrastive_loss_layer.cu create mode 100644 src/caffe/test/test_contrastive_loss_layer.cpp diff --git a/examples/siamese/convert_mnist_siamese_data.cpp b/examples/siamese/convert_mnist_siamese_data.cpp new file mode 100644 index 00000000000..400d15a2705 --- /dev/null +++ b/examples/siamese/convert_mnist_siamese_data.cpp @@ -0,0 +1,123 @@ +// +// This script converts the MNIST dataset to the leveldb format used +// by caffe to train siamese network. +// Usage: +// convert_mnist_data input_image_file input_label_file output_db_file +// The MNIST dataset could be downloaded at +// http://yann.lecun.com/exdb/mnist/ +#include <fstream> // NOLINT(readability/streams) +#include <string> + +#include "glog/logging.h" +#include "google/protobuf/text_format.h" +#include "leveldb/db.h" +#include "stdint.h" + +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/math_functions.hpp" + +uint32_t swap_endian(uint32_t val) { + val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF); + return (val << 16) | (val >> 16); +} + +void read_image(std::ifstream* image_file, std::ifstream* label_file, + uint32_t index, uint32_t rows, uint32_t cols, + char* pixels, char* label) { + image_file->seekg(index * rows * cols + 16); + image_file->read(pixels, rows * cols); + label_file->seekg(index + 8); + label_file->read(label, 1); +} + +void convert_dataset(const char* image_filename, const char* label_filename, + const char* db_filename) { + // Open files + std::ifstream image_file(image_filename, std::ios::in | std::ios::binary); + std::ifstream label_file(label_filename, std::ios::in | std::ios::binary); + CHECK(image_file) << "Unable to open file " << image_filename; + CHECK(label_file) << "Unable to open file " << label_file; + // Read the magic and the meta data + uint32_t magic; + uint32_t num_items; + uint32_t num_labels; + uint32_t rows; + uint32_t cols; + + image_file.read(reinterpret_cast<char*>(&magic), 4); + magic = swap_endian(magic); + CHECK_EQ(magic, 2051) << "Incorrect image file magic."; + label_file.read(reinterpret_cast<char*>(&magic), 4); + magic = swap_endian(magic); + CHECK_EQ(magic, 2049) << "Incorrect label file magic."; + image_file.read(reinterpret_cast<char*>(&num_items), 4); + num_items = swap_endian(num_items); + label_file.read(reinterpret_cast<char*>(&num_labels), 4); + num_labels = swap_endian(num_labels); + CHECK_EQ(num_items, num_labels); + image_file.read(reinterpret_cast<char*>(&rows), 4); + rows = swap_endian(rows); + image_file.read(reinterpret_cast<char*>(&cols), 4); + cols = swap_endian(cols); + + // Open leveldb + leveldb::DB* db; + leveldb::Options options; + options.create_if_missing = true; + options.error_if_exists = true; + leveldb::Status status = leveldb::DB::Open( + options, db_filename, &db); + CHECK(status.ok()) << "Failed to open leveldb " << db_filename + << ". Is it already existing?"; + + char label_i; + char label_j; + char* pixels = new char[2 * rows * cols]; + const int kMaxKeyLength = 10; + char key[kMaxKeyLength]; + std::string value; + + caffe::Datum datum; + datum.set_channels(2); // one channel for each image in the pair + datum.set_height(rows); + datum.set_width(cols); + LOG(INFO) << "A total of " << num_items << " items."; + LOG(INFO) << "Rows: " << rows << " Cols: " << cols; + for (int itemid = 0; itemid < num_items; ++itemid) { + int i = caffe::caffe_rng_rand() % num_items; // pick a random pair + int j = caffe::caffe_rng_rand() % num_items; + read_image(&image_file, &label_file, i, rows, cols, + pixels, &label_i); + read_image(&image_file, &label_file, j, rows, cols, + pixels + (rows * cols), &label_j); + datum.set_data(pixels, 2*rows*cols); + if (label_i == label_j) { + datum.set_label(1); + } else { + datum.set_label(0); + } + datum.SerializeToString(&value); + snprintf(key, kMaxKeyLength, "%08d", itemid); + db->Put(leveldb::WriteOptions(), std::string(key), value); + } + + delete db; + delete pixels; +} + +int main(int argc, char** argv) { + if (argc != 4) { + printf("This script converts the MNIST dataset to the leveldb format used\n" + "by caffe to train a siamese network.\n" + "Usage:\n" + " convert_mnist_data input_image_file input_label_file " + "output_db_file\n" + "The MNIST dataset could be downloaded at\n" + " http://yann.lecun.com/exdb/mnist/\n" + "You should gunzip them after downloading.\n"); + } else { + google::InitGoogleLogging(argv[0]); + convert_dataset(argv[1], argv[2], argv[3]); + } + return 0; +} diff --git a/examples/siamese/create_mnist_siamese.sh b/examples/siamese/create_mnist_siamese.sh new file mode 100755 index 00000000000..43ad6b184a7 --- /dev/null +++ b/examples/siamese/create_mnist_siamese.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env sh +# This script converts the mnist data into leveldb format. + +EXAMPLES=./build/examples/siamese +DATA=./data/mnist + +echo "Creating leveldb..." + +rm -rf ./examples/siamese/mnist_siamese_train_leveldb +rm -rf ./examples/siamese/mnist_siamese_test_leveldb + +$EXAMPLES/convert_mnist_siamese_data.bin \ + $DATA/train-images-idx3-ubyte \ + $DATA/train-labels-idx1-ubyte \ + ./examples/siamese/mnist_siamese_train_leveldb +$EXAMPLES/convert_mnist_siamese_data.bin \ + $DATA/t10k-images-idx3-ubyte \ + $DATA/t10k-labels-idx1-ubyte \ + ./examples/siamese/mnist_siamese_test_leveldb + +echo "Done." diff --git a/examples/siamese/mnist_siamese.ipynb b/examples/siamese/mnist_siamese.ipynb new file mode 100644 index 00000000000..66776fe14bd --- /dev/null +++ b/examples/siamese/mnist_siamese.ipynb @@ -0,0 +1,169 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:ea70e3c13ccbae495d73f30e18b8e01e68ec8c7dc8bbb3635e6139b801c921a9" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setup and import caffe" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "# Make sure that caffe is on the python path:\n", + "caffe_root = '../../' # this file is expected to be in {caffe_root}/examples/siamese\n", + "import sys\n", + "sys.path.insert(0, caffe_root + 'python')\n", + "\n", + "import caffe" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 1 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load the trained net." + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "MODEL_FILE = 'mnist_siamese.prototxt'\n", + "# decrease if you want to preview during training\n", + "PRETRAINED_FILE = 'mnist_siamese_iter_50000.caffemodel' \n", + "net = caffe.Net(MODEL_FILE, PRETRAINED_FILE)\n", + "net.set_phase_test()\n", + "net.set_mode_cpu()\n", + "net.set_input_scale('data', 0.00390625)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load some MNIST test data" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "TEST_DATA_FILE = '../../data/mnist/t10k-images-idx3-ubyte'\n", + "TEST_LABEL_FILE = '../../data/mnist/t10k-labels-idx1-ubyte'\n", + "n = 10000\n", + "\n", + "with open(TEST_DATA_FILE, 'rb') as f:\n", + " f.read(16) # skip the header\n", + " raw_data = np.fromstring(f.read(n * 28*28), dtype=np.uint8)\n", + "\n", + "with open(TEST_LABEL_FILE, 'rb') as f:\n", + " f.read(8) # skip the header\n", + " labels = np.fromstring(f.read(n), dtype=np.uint8)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 3 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Run the data through the net" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# reshape and preprocess\n", + "caffe_in = raw_data.reshape(n, 28, 28).transpose((1,2,0))\n", + "caffe_in = net.preprocess('data', caffe_in) \n", + "caffe_in = caffe_in.reshape((n,1,28,28))\n", + "# pass data through network\n", + "out = net.forward_all(data=caffe_in)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 4 + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plot the results" + ] + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "feat = out['feat']\n", + "f = plt.figure(figsize=(16,9))\n", + "c = ['#ff0000', '#ffff00', '#00ff00', '#00ffff', '#0000ff', \n", + " '#ff00ff', '#990000', '#999900', '#009900', '#009999']\n", + "for i in range(10):\n", + " plt.plot(feat[labels==i,0].flatten(), feat[labels==i,1].flatten(), '.', c=c[i])\n", + "plt.legend(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])\n", + "plt.grid()\n", + "plt.show()" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nUY4FBTlxUW+v7Fl89135f23bahlpeTm43XKM6Nq1chZgMwmx9OS8IyPJ86H2ytbXy0RVHGv08N9o\nTtNJX83IYos52Ve69Q/v26d4+xacX0r/f1rryPINEI3FiHR1sX3VKkOJrnFSmv0c6O2lxjvEO48/\nSajSXHmT7OyMZiX/TZGX9skZYn0un1J7c0HZAvrHZBnv8prlSrKjo58eZXRqNKm9Om8dlyfkxEae\nEg/1ZfUsqVhCmbuMrv4uw9qdVlHhrmBscowppvhc4HN0bezi37/+7/nV735lKlZVXQ/UDGpjbtxV\nNUwjJZHmSnclVyevUu4qZ2J6QmlTTx79wEsPKPLpjaGN7F2/13T/QqIb9AVZVr2MKm+Vsl4V7goe\nmP8Au9fttkVCWyhpuW2wW9+X7yQwdrYfAX6DXBPzHuS4zEIu0TpksrkCOc5U3bcYpzbxUi7ur0Sb\nHzTB/34I/j6gGW6YzJJT9TFBZMJs1jb1Xmsx0ZcDBybhJDBykBFWazEZeZfNeNuELFVPVivaNOO9\n1h6TqW9tsiW1N1XtWbz3Xti0KZXkqL2lLtdMXdIXXzSfEEst521slPsQHsHly2Ui+vrrHYBMiJcv\nn+lTT4YqxhyPy+eKNsQcpJPvZpLFChmyGFtDgxwDa3fiomyRbo+ovX1v/C+rkuZ3rtYZzRcCPh+7\n1q5NGytqnJRmDa1Ll3L2W3+SVyIq2xlgs3uzZbKg9q5VeCoUb2mVR5ZWNAWbeKNlxtMqvKcHeg8Q\nm0omlivqVrAiuEJ5HZfiSu3R9r5224goyF5GQTp7hnvYdHgT//jJP6YlosJ768JFtVdH828A1xRc\n8U1yMXYJCYn5vvmsu2UdG0Mbea/1PYK+INemrilEtCnYxLHOYwSeCVD/bL1Sb7XWV6t8viO8w9J4\nhSfbVeJSarl6XV7qffWMTI4oZWTsgNbjqk3WVHTI4OWzfI3Kt6fIzvZFOZZBZFJYaE+rSEqkJaKg\nm3ip47sd2fUjvJlx6NoIf3gI9gR0hmtGcqo+ptHE8Wqo95peX4VOBpRjf9f77/eNAIeMOgCsyTnN\nZCpWy1IXLEiWrGbbr5m+t26Fz3xG7nPPnmQSIyS/FRWybQcOyMmP1P2qZaTehFzH74c//EP5bzOx\njm1tMiHauHEmM68gVSIzcDzhzBgago8+kiXERqRcjLm9XfbSqrMLRyIzNVmHhuSMxOq5zCSLVcdk\n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\nAABJRU5ErkJggg==\n", + "text": [ + "<matplotlib.figure.Figure at 0x7f31d5144c50>" + ] + } + ], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [], + "language": "python", + "metadata": {}, + "outputs": [] + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/examples/siamese/mnist_siamese.prototxt b/examples/siamese/mnist_siamese.prototxt new file mode 100644 index 00000000000..8dd42e9c1b5 --- /dev/null +++ b/examples/siamese/mnist_siamese.prototxt @@ -0,0 +1,95 @@ +name: "mnist_siamese" +input: "data" +input_dim: 10000 +input_dim: 1 +input_dim: 28 +input_dim: 28 + +layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + blobs_lr: 1 + blobs_lr: 2 + convolution_param { + num_output: 20 + kernel_size: 5 + stride: 1 + } +} +layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layers { + name: "conv2" + type: CONVOLUTION + bottom: "pool1" + top: "conv2" + blobs_lr: 1 + blobs_lr: 2 + convolution_param { + num_output: 50 + kernel_size: 5 + stride: 1 + } +} +layers { + name: "pool2" + type: POOLING + bottom: "conv2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layers { + name: "ip1" + type: INNER_PRODUCT + bottom: "pool2" + top: "ip1" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 500 + } +} +layers { + name: "relu1" + type: RELU + bottom: "ip1" + top: "ip1" +} +layers { + name: "ip2" + type: INNER_PRODUCT + bottom: "ip1" + top: "ip2" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 10 + } +} + +layers { + name: "feat" + type: INNER_PRODUCT + bottom: "ip2" + top: "feat" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 2 + } +} diff --git a/examples/siamese/mnist_siamese_solver.prototxt b/examples/siamese/mnist_siamese_solver.prototxt new file mode 100644 index 00000000000..d4d994d1389 --- /dev/null +++ b/examples/siamese/mnist_siamese_solver.prototxt @@ -0,0 +1,25 @@ +# The train/test net protocol buffer definition +net: "examples/siamese/mnist_siamese_train_test.prototxt" +# test_iter specifies how many forward passes the test should carry out. +# In the case of MNIST, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 500 training iterations. +test_interval: 500 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.01 +momentum: 0.9 +weight_decay: 0.0000 +# The learning rate policy +lr_policy: "inv" +gamma: 0.0001 +power: 0.75 +# Display every 100 iterations +display: 100 +# The maximum number of iterations +max_iter: 50000 +# snapshot intermediate results +snapshot: 5000 +snapshot_prefix: "examples/siamese/mnist_siamese" +# solver mode: CPU or GPU +solver_mode: GPU diff --git a/examples/siamese/mnist_siamese_train_test.prototxt b/examples/siamese/mnist_siamese_train_test.prototxt new file mode 100644 index 00000000000..92361c31dc7 --- /dev/null +++ b/examples/siamese/mnist_siamese_train_test.prototxt @@ -0,0 +1,313 @@ +name: "mnist_siamese_train_test" +layers { + name: "pair_data" + type: DATA + top: "pair_data" + top: "sim" + data_param { + source: "examples/siamese/mnist_siamese_train_leveldb" + scale: 0.00390625 + batch_size: 64 + } + include: { phase: TRAIN } +} +layers { + name: "pair_data" + type: DATA + top: "pair_data" + top: "sim" + data_param { + source: "examples/siamese/mnist_siamese_test_leveldb" + scale: 0.00390625 + batch_size: 100 + } + include: { phase: TEST } +} +layers { + name: "slice_pair" + type: SLICE + bottom: "pair_data" + top: "data" + top: "data_p" + slice_param { + slice_dim: 1 + slice_point: 1 + } +} + + + + +layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + blobs_lr: 1 + blobs_lr: 2 + convolution_param { + num_output: 20 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + param: "conv1_w" + param: "conv1_b" +} +layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layers { + name: "conv2" + type: CONVOLUTION + bottom: "pool1" + top: "conv2" + blobs_lr: 1 + blobs_lr: 2 + convolution_param { + num_output: 50 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + param: "conv2_w" + param: "conv2_b" +} +layers { + name: "pool2" + type: POOLING + bottom: "conv2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layers { + name: "ip1" + type: INNER_PRODUCT + bottom: "pool2" + top: "ip1" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 500 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + param: "ip1_w" + param: "ip1_b" +} +layers { + name: "relu1" + type: RELU + bottom: "ip1" + top: "ip1" +} +layers { + name: "ip2" + type: INNER_PRODUCT + bottom: "ip1" + top: "ip2" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 10 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + param: "ip2_w" + param: "ip2_b" +} + +layers { + name: "feat" + type: INNER_PRODUCT + bottom: "ip2" + top: "feat" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + param: "feat_w" + param: "feat_b" +} + + + +layers { + name: "conv1_p" + type: CONVOLUTION + bottom: "data_p" + top: "conv1_p" + blobs_lr: 1 + blobs_lr: 2 + convolution_param { + num_output: 20 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + param: "conv1_w" + param: "conv1_b" +} +layers { + name: "pool1_p" + type: POOLING + bottom: "conv1_p" + top: "pool1_p" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layers { + name: "conv2_p" + type: CONVOLUTION + bottom: "pool1_p" + top: "conv2_p" + blobs_lr: 1 + blobs_lr: 2 + convolution_param { + num_output: 50 + kernel_size: 5 + stride: 1 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + param: "conv2_w" + param: "conv2_b" +} +layers { + name: "pool2_p" + type: POOLING + bottom: "conv2_p" + top: "pool2_p" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layers { + name: "ip1_p" + type: INNER_PRODUCT + bottom: "pool2_p" + top: "ip1_p" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 500 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + param: "ip1_w" + param: "ip1_b" +} +layers { + name: "relu1_p" + type: RELU + bottom: "ip1_p" + top: "ip1_p" +} +layers { + name: "ip2_p" + type: INNER_PRODUCT + bottom: "ip1_p" + top: "ip2_p" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 10 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + param: "ip2_w" + param: "ip2_b" +} + +layers { + name: "feat_p" + type: INNER_PRODUCT + bottom: "ip2_p" + top: "feat_p" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 2 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + } + } + param: "feat_w" + param: "feat_b" +} + + + +layers { + name: "loss" + type: CONTRASTIVE_LOSS + contrastive_loss_param { + margin: 1.0 + } + bottom: "feat" + bottom: "feat_p" + bottom: "sim" + top: "loss" +} diff --git a/examples/siamese/readme.md b/examples/siamese/readme.md new file mode 100644 index 00000000000..ce98ec10819 --- /dev/null +++ b/examples/siamese/readme.md @@ -0,0 +1,179 @@ +--- +title: Siamese Network Tutorial +description: Train and test a siamese network on MNIST data. +category: example +include_in_docs: true +layout: default +priority: 100 +--- + +# Siamese Network Training with Caffe +This example shows how you can use weight sharing and a contrastive loss +function to learn a model using a siamese network in Caffe. + +We will assume that you have caffe successfully compiled. If not, please refer +to the [Installation page](../../installation.html). This example builds on the +[MNIST tutorial](mnist.html) so it would be a good idea to read that before +continuing. + +*The guide specifies all paths and assumes all commands are executed from the +root caffe directory* + +## Prepare Datasets + +You will first need to download and convert the data from the MNIST +website. To do this, simply run the following commands: + + ./data/mnist/get_mnist.sh + ./examples/siamese/create_mnist_siamese.sh + +After running the script there should be two datasets, +`./examples/siamese/mnist_siamese_train_leveldb`, and +`./examples/siamese/mnist_siamese_test_leveldb`. + +## The Model +First, we will define the model that we want to train using the siamese network. +We will use the convolutional net defined in +`./examples/siamese/mnist_siamese.prototxt`. This model is almost +exactly the same as the [LeNet model](mnist.html), the only difference is that +we have replaced the top layers that produced probabilities over the 10 digit +classes with a linear "feature" layer that produces a 2 dimensional vector. + + layers { + name: "feat" + type: INNER_PRODUCT + bottom: "ip2" + top: "feat" + blobs_lr: 1 + blobs_lr: 2 + inner_product_param { + num_output: 2 + } + } + +## Define the Siamese Network + +In this section we will define the siamese network used for training. The +resulting network is defined in +`./examples/siamese/mnist_siamese_train_test.prototxt`. + +### Reading in the Pair Data + +We start with a data layer that reads from the LevelDB database we created +earlier. Each entry in this database contains the image data for a pair of +images (`pair_data`) and a binary label saying if they belong to the same class +or different classes (`sim`). + + layers { + name: "pair_data" + type: DATA + top: "pair_data" + top: "sim" + data_param { + source: "examples/siamese/mnist-siamese-train-leveldb" + scale: 0.00390625 + batch_size: 64 + } + include: { phase: TRAIN } + } + +In order to pack a pair of images into the same blob in the database we pack one +image per channel. We want to be able to work with these two images separately, +so we add a slice layer after the data layer. This takes the `pair_data` and +slices it along the channel dimension so that we have a single image in `data` +and its paired image in `data_p.` + + layers { + name: "slice_pair" + type: SLICE + bottom: "pair_data" + top: "data" + top: "data_p" + slice_param { + slice_dim: 1 + slice_point: 1 + } + } + +### Building the First Side of the Siamese Net + +Now we can specify the first side of the siamese net. This side operates on +`data` and produces `feat`. Starting from the net in +`./examples/siamese/mnist_siamese.prototxt` we add default weight fillers. Then +we name the parameters of the convolutional and inner product layers. Naming the +parameters allows Caffe to share the parameters between layers on both sides of +the siamese net. In the definition this looks like: + + ... + param: "conv1_w" + param: "conv1_b" + ... + param: "conv2_w" + param: "conv2_b" + ... + param: "ip1_w" + param: "ip1_b" + ... + param: "ip2_w" + param: "ip2_b" + ... + +### Building the Second Side of the Siamese Net + +Now we need to create the second path that operates on `data_p` and produces +`feat_p`. This path is exactly the same as the first. So we can just copy and +paste it. Then we change the name of each layer, input, and output by appending +`_p` to differentiate the "paired" layers from the originals. + +### Adding the Contrastive Loss Function + +To train the network we will optimize a contrastive loss function proposed in: +Raia Hadsell, Sumit Chopra, and Yann LeCun "Dimensionality Reduction by Learning +an Invariant Mapping". This loss function encourages matching pairs to be close +together in feature space while pushing non-matching pairs apart. This cost +function is implemented with the `CONTRASTIVE_LOSS` layer: + + layers { + name: "loss" + type: CONTRASTIVE_LOSS + contrastive_loss_param { + margin: 1.0 + } + bottom: "feat" + bottom: "feat_p" + bottom: "sim" + top: "loss" + } + +## Define the Solver + +Nothing special needs to be done to the solver besides pointing it at the +correct model file. The solver is defined in +`./examples/siamese/mnist_siamese_solver.prototxt`. + +## Training and Testing the Model + +Training the model is simple after you have written the network definition +protobuf and solver protobuf files. Simply run +`./examples/siamese/train_mnist_siamese.sh`: + + ./examples/siamese/train_mnist_siamese.sh + +# Plotting the results + +First, we can draw the model and siamese networks by running the following +commands that draw the DAGs defined in the .prototxt files: + + ./python/draw_net.py \ + ./examples/siamese/mnist_siamese.prototxt \ + ./examples/siamese/mnist_siamese.png + + ./python/draw_net.py \ + ./examples/siamese/mnist_siamese_train_test.prototxt \ + ./examples/siamese/mnist_siamese_train_test.png + +Second, we can load the learned model and plot the features using the iPython +notebook: + + ipython notebook ./examples/siamese/mnist_siamese.ipynb + diff --git a/examples/siamese/train_mnist_siamese.sh b/examples/siamese/train_mnist_siamese.sh new file mode 100755 index 00000000000..84a30a8ac44 --- /dev/null +++ b/examples/siamese/train_mnist_siamese.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env sh + +TOOLS=./build/tools + +$TOOLS/caffe train --solver=examples/siamese/mnist_siamese_solver.prototxt diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index a29c445d51e..c911d1a7312 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -117,6 +117,93 @@ class LossLayer : public Layer<Dtype> { } }; +/** + * @brief Computes the contrastive loss @f$ + * E = \frac{1}{2N} \sum\limits_{n=1}^N \left(y\right) d + + * \left(1-y\right) \max \left(margin-d, 0\right) + * @f$ where @f$ + * d = \left| \left| a_n - b_n \right| \right|_2^2 @f$. This can be + * used to train siamese networks. + * + * @param bottom input Blob vector (length 3) + * -# @f$ (N \times C \times 1 \times 1) @f$ + * the features @f$ a \in [-\infty, +\infty]@f$ + * -# @f$ (N \times C \times 1 \times 1) @f$ + * the features @f$ b \in [-\infty, +\infty]@f$ + * -# @f$ (N \times 1 \times 1 \times 1) @f$ + * the binary similarity @f$ s \in [0, 1]@f$ + * @param top output Blob vector (length 1) + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * the computed contrastive loss: @f$ E = + * \frac{1}{2N} \sum\limits_{n=1}^N \left(y\right) d + + * \left(1-y\right) \max \left(margin-d, 0\right) + * @f$ where @f$ + * d = \left| \left| a_n - b_n \right| \right|_2^2 @f$. + * This can be used to train siamese networks. + */ +template <typename Dtype> +class ContrastiveLossLayer : public LossLayer<Dtype> { + public: + explicit ContrastiveLossLayer(const LayerParameter& param) + : LossLayer<Dtype>(param), diff_() {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + + virtual inline int ExactNumBottomBlobs() const { return 3; } + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_CONTRASTIVE_LOSS; + } + /** + * Unlike most loss layers, in the ContrastiveLossLayer we can backpropagate + * to the first two inputs. + */ + virtual inline bool AllowForceBackward(const int bottom_index) const { + return bottom_index != 2; + } + + protected: + /// @copydoc ContrastiveLossLayer + virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); + + /** + * @brief Computes the Contrastive error gradient w.r.t. the inputs. + * + * Computes the gradients with respect to the two input vectors (bottom[0] and + * bottom[1]), but not the similarity label (bottom[2]). + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (1 \times 1 \times 1 \times 1) @f$ + * This Blob's diff will simply contain the loss_weight* @f$ \lambda @f$, + * as @f$ \lambda @f$ is the coefficient of this layer's output + * @f$\ell_i@f$ in the overall Net loss + * @f$ E = \lambda_i \ell_i + \mbox{other loss terms}@f$; hence + * @f$ \frac{\partial E}{\partial \ell_i} = \lambda_i @f$. + * (*Assuming that this top Blob is not used as a bottom (input) by any + * other layer of the Net.) + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length 2) + * -# @f$ (N \times C \times 1 \times 1) @f$ + * the features @f$a@f$; Backward fills their diff with + * gradients if propagate_down[0] + * -# @f$ (N \times C \times 1 \times 1) @f$ + * the features @f$b@f$; Backward fills their diff with gradients if + * propagate_down[1] + */ + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + + Blob<Dtype> diff_; // cached for backward pass + Blob<Dtype> dist_sq_; // cached for backward pass + Blob<Dtype> diff_sq_; // tmp storage for gpu forward pass + Blob<Dtype> summer_vec_; // tmp storage for gpu forward pass +}; + /** * @brief Computes the Euclidean (L2) loss @f$ * E = \frac{1}{2N} \sum\limits_{n=1}^N \left| \left| \hat{y}_n - y_n diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 41c547b8ad4..b78167f21eb 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -189,6 +189,8 @@ Layer<Dtype>* GetLayer(const LayerParameter& param) { return new BNLLLayer<Dtype>(param); case LayerParameter_LayerType_CONCAT: return new ConcatLayer<Dtype>(param); + case LayerParameter_LayerType_CONTRASTIVE_LOSS: + return new ContrastiveLossLayer<Dtype>(param); case LayerParameter_LayerType_CONVOLUTION: return GetConvolutionLayer<Dtype>(name, param); case LayerParameter_LayerType_DATA: diff --git a/src/caffe/layers/contrastive_loss_layer.cpp b/src/caffe/layers/contrastive_loss_layer.cpp new file mode 100644 index 00000000000..072a5a535be --- /dev/null +++ b/src/caffe/layers/contrastive_loss_layer.cpp @@ -0,0 +1,101 @@ +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/loss_layers.hpp" +#include "caffe/util/io.hpp" +#include "caffe/util/math_functions.hpp" + +namespace caffe { + +template <typename Dtype> +void ContrastiveLossLayer<Dtype>::LayerSetUp( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + LossLayer<Dtype>::LayerSetUp(bottom, top); + CHECK_EQ(bottom[0]->channels(), bottom[1]->channels()); + CHECK_EQ(bottom[0]->height(), 1); + CHECK_EQ(bottom[0]->width(), 1); + CHECK_EQ(bottom[1]->height(), 1); + CHECK_EQ(bottom[1]->width(), 1); + CHECK_EQ(bottom[2]->channels(), 1); + CHECK_EQ(bottom[2]->height(), 1); + CHECK_EQ(bottom[2]->width(), 1); + diff_.Reshape(bottom[0]->num(), bottom[0]->channels(), 1, 1); + diff_sq_.Reshape(bottom[0]->num(), bottom[0]->channels(), 1, 1); + dist_sq_.Reshape(bottom[0]->num(), 1, 1, 1); + // vector of ones used to sum along channels + summer_vec_.Reshape(bottom[0]->channels(), 1, 1, 1); + for (int i = 0; i < bottom[0]->channels(); ++i) + summer_vec_.mutable_cpu_data()[i] = Dtype(1); +} + +template <typename Dtype> +void ContrastiveLossLayer<Dtype>::Forward_cpu( + const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + int count = bottom[0]->count(); + caffe_sub( + count, + bottom[0]->cpu_data(), // a + bottom[1]->cpu_data(), // b + diff_.mutable_cpu_data()); // a_i-b_i + const int channels = bottom[0]->channels(); + Dtype margin = this->layer_param_.contrastive_loss_param().margin(); + Dtype loss(0.0); + for (int i = 0; i < bottom[0]->num(); ++i) { + dist_sq_.mutable_cpu_data()[i] = caffe_cpu_dot(channels, + diff_.cpu_data() + (i*channels), diff_.cpu_data() + (i*channels)); + if (static_cast<int>(bottom[2]->cpu_data()[i])) { // similar pairs + loss += dist_sq_.cpu_data()[i]; + } else { // dissimilar pairs + loss += std::max(margin-dist_sq_.cpu_data()[i], Dtype(0.0)); + } + } + loss = loss / static_cast<Dtype>(bottom[0]->num()) / Dtype(2); + (*top)[0]->mutable_cpu_data()[0] = loss; +} + +template <typename Dtype> +void ContrastiveLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + Dtype margin = this->layer_param_.contrastive_loss_param().margin(); + for (int i = 0; i < 2; ++i) { + if (propagate_down[i]) { + const Dtype sign = (i == 0) ? 1 : -1; + const Dtype alpha = sign * top[0]->cpu_diff()[0] / + static_cast<Dtype>((*bottom)[i]->num()); + int num = (*bottom)[i]->num(); + int channels = (*bottom)[i]->channels(); + for (int j = 0; j < num; ++j) { + Dtype* bout = (*bottom)[i]->mutable_cpu_diff(); + if (static_cast<int>((*bottom)[2]->cpu_data()[j])) { // similar pairs + caffe_cpu_axpby( + channels, + alpha, + diff_.cpu_data() + (j*channels), + Dtype(0.0), + bout + (j*channels)); + } else { // dissimilar pairs + if ((margin-dist_sq_.cpu_data()[j]) > Dtype(0.0)) { + caffe_cpu_axpby( + channels, + -alpha, + diff_.cpu_data() + (j*channels), + Dtype(0.0), + bout + (j*channels)); + } else { + caffe_set(channels, Dtype(0), bout + (j*channels)); + } + } + } + } + } +} + +#ifdef CPU_ONLY +STUB_GPU(ContrastiveLossLayer); +#endif + +INSTANTIATE_CLASS(ContrastiveLossLayer); + +} // namespace caffe diff --git a/src/caffe/layers/contrastive_loss_layer.cu b/src/caffe/layers/contrastive_loss_layer.cu new file mode 100644 index 00000000000..672ad5bc2f8 --- /dev/null +++ b/src/caffe/layers/contrastive_loss_layer.cu @@ -0,0 +1,91 @@ +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/util/io.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void ContrastiveLossLayer<Dtype>::Forward_gpu( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const int count = bottom[0]->count(); + caffe_gpu_sub( + count, + bottom[0]->gpu_data(), // a + bottom[1]->gpu_data(), // b + diff_.mutable_gpu_data()); // a_i-b_i + caffe_gpu_powx( + count, + diff_.mutable_gpu_data(), // a_i-b_i + Dtype(2), + diff_sq_.mutable_gpu_data()); // (a_i-b_i)^2 + caffe_gpu_gemv( + CblasNoTrans, + bottom[0]->num(), + bottom[0]->channels(), + Dtype(1.0), + diff_sq_.gpu_data(), // (a_i-b_i)^2 + summer_vec_.gpu_data(), + Dtype(0.0), + dist_sq_.mutable_gpu_data()); // \Sum (a_i-b_i)^2 + Dtype margin = this->layer_param_.contrastive_loss_param().margin(); + Dtype loss(0.0); + for (int i = 0; i < bottom[0]->num(); ++i) { + if (static_cast<int>(bottom[2]->cpu_data()[i])) { // similar pairs + loss += dist_sq_.cpu_data()[i]; + } else { // dissimilar pairs + loss += std::max(margin-dist_sq_.cpu_data()[i], Dtype(0.0)); + } + } + loss = loss / static_cast<Dtype>(bottom[0]->num()) / Dtype(2); + (*top)[0]->mutable_cpu_data()[0] = loss; +} + +template <typename Dtype> +__global__ void CLLForward(const int count, const int channels, + const Dtype margin, const Dtype alpha, + const Dtype* y, const Dtype* diff, const Dtype* dist_sq, + Dtype *bottom_diff) { + CUDA_KERNEL_LOOP(i, count) { + int n = i / channels; // the num index, to access y and dist_sq + if (static_cast<int>(y[n])) { // similar pairs + bottom_diff[i] = alpha * diff[i]; + } else { // dissimilar pairs + if ((margin-dist_sq[n]) > 0.0) { + bottom_diff[i] = -alpha * diff[i]; + } else { + bottom_diff[i] = 0; + } + } + } +} + +template <typename Dtype> +void ContrastiveLossLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + for (int i = 0; i < 2; ++i) { + if (propagate_down[i]) { + const int count = (*bottom)[0]->count(); + const int channels = (*bottom)[0]->channels(); + Dtype margin = this->layer_param_.contrastive_loss_param().margin(); + const Dtype sign = (i == 0) ? 1 : -1; + const Dtype alpha = sign * top[0]->cpu_diff()[0] / + static_cast<Dtype>((*bottom)[0]->num()); + // NOLINT_NEXT_LINE(whitespace/operators) + CLLForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( + count, channels, margin, alpha, + (*bottom)[2]->gpu_data(), // pair similarity 0 or 1 + diff_.gpu_data(), // the cached eltwise difference between a and b + dist_sq_.gpu_data(), // the cached square distance between a and b + (*bottom)[i]->mutable_gpu_diff()); + CUDA_POST_KERNEL_CHECK; + } + } +} + +INSTANTIATE_CLASS(ContrastiveLossLayer); + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 8cb82cebe22..37972e72b47 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -198,7 +198,7 @@ message NetStateRule { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 40 (last added: softmax_param) +// LayerParameter next available ID: 41 (last added: contrastive_loss_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs @@ -219,7 +219,7 @@ message LayerParameter { // line above the enum. Update the next available ID when you add a new // LayerType. // - // LayerType next available ID: 37 (last added: SILENCE) + // LayerType next available ID: 38 (last added: CONTRASTIVE_LOSS) enum LayerType { // "NONE" layer type is 0th enum element so that we don't cause confusion // by defaulting to an existent LayerType (instead, should usually error if @@ -230,6 +230,7 @@ message LayerParameter { ARGMAX = 30; BNLL = 2; CONCAT = 3; + CONTRASTIVE_LOSS = 37; CONVOLUTION = 4; DATA = 5; DROPOUT = 6; @@ -292,6 +293,7 @@ message LayerParameter { optional AccuracyParameter accuracy_param = 27; optional ArgMaxParameter argmax_param = 23; optional ConcatParameter concat_param = 9; + optional ContrastiveLossParameter contrastive_loss_param = 40; optional ConvolutionParameter convolution_param = 10; optional DataParameter data_param = 11; optional DropoutParameter dropout_param = 12; @@ -367,6 +369,12 @@ message ConcatParameter { optional uint32 concat_dim = 1 [default = 1]; } +// Message that stores parameters used by ContrastiveLossLayer +message ContrastiveLossParameter { + //margin for dissimilar pair + optional float margin = 1 [default = 1.0]; +} + // Message that stores parameters used by ConvolutionLayer message ConvolutionParameter { optional uint32 num_output = 1; // The number of outputs for the layer diff --git a/src/caffe/test/test_contrastive_loss_layer.cpp b/src/caffe/test/test_contrastive_loss_layer.cpp new file mode 100644 index 00000000000..a5bef4c9826 --- /dev/null +++ b/src/caffe/test/test_contrastive_loss_layer.cpp @@ -0,0 +1,102 @@ +#include <algorithm> +#include <cmath> +#include <cstdlib> +#include <cstring> +#include <vector> + +#include "gtest/gtest.h" + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" + +#include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +namespace caffe { + +template <typename TypeParam> +class ContrastiveLossLayerTest : public MultiDeviceTest<TypeParam> { + typedef typename TypeParam::Dtype Dtype; + + protected: + ContrastiveLossLayerTest() + : blob_bottom_data_i_(new Blob<Dtype>(128, 10, 1, 1)), + blob_bottom_data_j_(new Blob<Dtype>(128, 10, 1, 1)), + blob_bottom_y_(new Blob<Dtype>(128, 1, 1, 1)), + blob_top_loss_(new Blob<Dtype>()) { + // fill the values + FillerParameter filler_param; + filler_param.set_mean(0.0); + filler_param.set_std(0.3); // distances~=1.0 to test both sides of margin + GaussianFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_bottom_data_i_); + blob_bottom_vec_.push_back(blob_bottom_data_i_); + filler.Fill(this->blob_bottom_data_j_); + blob_bottom_vec_.push_back(blob_bottom_data_j_); + for (int i = 0; i < blob_bottom_y_->count(); ++i) { + blob_bottom_y_->mutable_cpu_data()[i] = caffe_rng_rand() % 2; // 0 or 1 + } + blob_bottom_vec_.push_back(blob_bottom_y_); + blob_top_vec_.push_back(blob_top_loss_); + } + virtual ~ContrastiveLossLayerTest() { + delete blob_bottom_data_i_; + delete blob_bottom_data_j_; + delete blob_bottom_y_; + delete blob_top_loss_; + } + + Blob<Dtype>* const blob_bottom_data_i_; + Blob<Dtype>* const blob_bottom_data_j_; + Blob<Dtype>* const blob_bottom_y_; + Blob<Dtype>* const blob_top_loss_; + vector<Blob<Dtype>*> blob_bottom_vec_; + vector<Blob<Dtype>*> blob_top_vec_; +}; + +TYPED_TEST_CASE(ContrastiveLossLayerTest, TestDtypesAndDevices); + +TYPED_TEST(ContrastiveLossLayerTest, TestForward) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + ContrastiveLossLayer<Dtype> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + // manually compute to compare + const Dtype margin = layer_param.contrastive_loss_param().margin(); + const int num = this->blob_bottom_data_i_->num(); + const int channels = this->blob_bottom_data_i_->channels(); + Dtype loss(0); + for (int i = 0; i < num; ++i) { + Dtype dist_sq(0); + for (int j = 0; j < channels; ++j) { + Dtype diff = this->blob_bottom_data_i_->cpu_data()[i*channels+j] - + this->blob_bottom_data_j_->cpu_data()[i*channels+j]; + dist_sq += diff*diff; + } + if (this->blob_bottom_y_->cpu_data()[i]) { // similar pairs + loss += dist_sq; + } else { + loss += std::max(margin-dist_sq, Dtype(0)); + } + } + loss /= static_cast<Dtype>(num) * Dtype(2); + EXPECT_NEAR(this->blob_top_loss_->cpu_data()[0], loss, 1e-6); +} + +TYPED_TEST(ContrastiveLossLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + ContrastiveLossLayer<Dtype> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + GradientChecker<Dtype> checker(1e-2, 1e-2, 1701); + // check the gradient for the first two bottom layers + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 0); + checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), + &(this->blob_top_vec_), 1); +} + +} // namespace caffe From be9c5bd9327f862b2141535ca0ec36f7a28142f4 Mon Sep 17 00:00:00 2001 From: bhack <s.fabri@email.it> Date: Thu, 11 Sep 2014 00:36:04 +0200 Subject: [PATCH 0742/2053] Fix lmbdb travis with openldap --- scripts/travis/travis_install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/travis/travis_install.sh b/scripts/travis/travis_install.sh index 753bae879af..ef84e5dd9f4 100755 --- a/scripts/travis/travis_install.sh +++ b/scripts/travis/travis_install.sh @@ -67,12 +67,12 @@ if $WITH_CUDA; then fi # Install LMDB -LMDB_URL=https://gitorious.org/mdb/mdb/archive/7f038d0f15bec57b4c07aa3f31cd5564c88a1897.tar.gz -LMDB_FILE=/tmp/mdb.tar.gz +LMDB_URL=ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.39.tgz +LMDB_FILE=/tmp/openldap.tgz pushd . curl $LMDB_URL -o $LMDB_FILE && \ tar -C /tmp -xzvf $LMDB_FILE && \ - cd /tmp/mdb-mdb/libraries/liblmdb/ && \ + cd /tmp/openldap*/libraries/liblmdb/ && \ make && sudo make install || \ (echo "LMDB install failed"; exit 1) popd From 4ce6e43140819588d2e47c22ca13c05a8030f57d Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 8 Sep 2014 11:11:41 +0200 Subject: [PATCH 0743/2053] restore "red X" build failures in Travis --- .travis.yml | 9 +- scripts/travis/travis_build.sh | 18 ---- scripts/travis/travis_build_and_test.sh | 35 +++++--- scripts/travis/travis_install.sh | 84 ++++++++++--------- .../travis/travis_setup_makefile_config.sh | 2 + 5 files changed, 73 insertions(+), 75 deletions(-) delete mode 100755 scripts/travis/travis_build.sh diff --git a/.travis.yml b/.travis.yml index 46dfc117975..3deb45a2f0c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,19 +16,16 @@ compiler: gcc before_install: - export NUM_THREADS=4 - - alias make="make --jobs=$NUM_THREADS" - export SCRIPTS=./scripts/travis - - set -e # fail when a script fails install: - - source $SCRIPTS/travis_install.sh + - sudo -E $SCRIPTS/travis_install.sh before_script: - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib - - if ! $WITH_CMAKE; then source $SCRIPTS/travis_setup_makefile_config.sh; fi + - if ! $WITH_CMAKE; then $SCRIPTS/travis_setup_makefile_config.sh; fi -script: - - if $WITH_CUDA; then source $SCRIPTS/travis_build.sh; else source $SCRIPTS/travis_build_and_test.sh; fi +script: $SCRIPTS/travis_build_and_test.sh notifications: # Emails are sent to the committer's git-configured email address by default, diff --git a/scripts/travis/travis_build.sh b/scripts/travis/travis_build.sh deleted file mode 100755 index 06b4e24bb98..00000000000 --- a/scripts/travis/travis_build.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -# Script called by Travis to do a full build of Caffe, -# including CUDA functionality. - -if $WITH_CMAKE; then - mkdir build - cd build - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release .. - make --keep-going - cd - -else - export CPU_ONLY=0 - make --keep-going all test pycaffe warn - make all - make test - make pycaffe - make warn -fi diff --git a/scripts/travis/travis_build_and_test.sh b/scripts/travis/travis_build_and_test.sh index 6b7c85e9d2d..dec4d097c17 100755 --- a/scripts/travis/travis_build_and_test.sh +++ b/scripts/travis/travis_build_and_test.sh @@ -1,22 +1,33 @@ #!/bin/bash # Script called by Travis to do a CPU-only build of and test Caffe. +set -e +MAKE="make --jobs=$NUM_THREADS --keep-going" + if $WITH_CMAKE; then mkdir build cd build cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. - make --keep-going - make runtest - make lint - make clean + $MAKE + if ! $WITH_CUDA; then + $MAKE runtest + $MAKE lint + fi + $MAKE clean cd - else - export CPU_ONLY=1 - make --keep-going all test pycaffe warn lint - make runtest - make all - make test - make pycaffe - make warn - make lint + if ! $WITH_CUDA; then + export CPU_ONLY=1 + fi + $MAKE all test pycaffe warn lint || true + if ! $WITH_CUDA; then + $MAKE runtest + fi + $MAKE all + $MAKE test + $MAKE pycaffe + $MAKE warn + if ! $WITH_CUDA; then + $MAKE lint + fi fi diff --git a/scripts/travis/travis_install.sh b/scripts/travis/travis_install.sh index ef84e5dd9f4..15cafbe9b84 100755 --- a/scripts/travis/travis_install.sh +++ b/scripts/travis/travis_install.sh @@ -1,8 +1,13 @@ #!/bin/bash +# This script must be run with sudo. + +set -e + +MAKE="make --jobs=$NUM_THREADS" # Install apt packages where the Ubuntu 12.04 default works for Caffe -sudo apt-get -y update -sudo apt-get install \ +apt-get -y update +apt-get install \ wget git curl \ python-dev python-numpy \ libleveldb-dev libsnappy-dev libopencv-dev \ @@ -16,64 +21,65 @@ sudo apt-get install \ # if needed. By default, Aptitude in Ubuntu 12.04 installs CMake 2.8.7, but # Caffe requires a minimum CMake version of 2.8.8. if $WITH_CMAKE; then - sudo add-apt-repository -y ppa:ubuntu-sdk-team/ppa - sudo apt-get -y update - sudo apt-get -y install cmake || (echo "CMake install failed"; exit 1) + add-apt-repository -y ppa:ubuntu-sdk-team/ppa + apt-get -y update + apt-get -y install cmake fi # Install glog GLOG_URL=https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz GLOG_FILE=/tmp/glog-0.3.3.tar.gz pushd . -wget $GLOG_URL -O $GLOG_FILE && \ - tar -C /tmp -xzvf $GLOG_FILE && \ - rm $GLOG_FILE && \ - cd /tmp/glog-0.3.3 && \ - ./configure && make && sudo make install || \ - (echo "glog install failed"; exit 1) +wget $GLOG_URL -O $GLOG_FILE +tar -C /tmp -xzvf $GLOG_FILE +rm $GLOG_FILE +cd /tmp/glog-0.3.3 +./configure +$MAKE +$MAKE install popd # Install gflags GFLAGS_URL=https://github.com/schuhschuh/gflags/archive/master.zip GFLAGS_FILE=/tmp/gflags-master.zip pushd . -wget $GFLAGS_URL -O $GFLAGS_FILE && \ - cd /tmp/ && unzip gflags-master.zip && \ - cd gflags-master && \ - mkdir build && \ - cd build && \ - export CXXFLAGS="-fPIC" && \ - cmake .. && make VERBOSE=1 && sudo make install || \ - (echo "gflags install failed"; exit 1) +wget $GFLAGS_URL -O $GFLAGS_FILE +cd /tmp/ +unzip gflags-master.zip +cd gflags-master +mkdir build +cd build +export CXXFLAGS="-fPIC" +cmake .. +$MAKE VERBOSE=1 +$MAKE install popd # Install CUDA, if needed -CUDA_URL=http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb -CUDA_FILE=/tmp/cuda_install.deb if $WITH_CUDA; then - curl $CUDA_URL -o $CUDA_FILE && \ - sudo dpkg -i $CUDA_FILE || - (echo "CUDA install failed"; exit 1) - rm -f $CUDA_FILE - sudo apt-get -y update - # Install the minimal CUDA subpackages required to test Caffe build. - # For a full CUDA installation, add 'cuda' to the list of packages. - sudo apt-get -y install cuda-core-6-0 cuda-extra-libs-6-0 - # Create CUDA symlink at /usr/local/cuda - # (This would normally be created by the CUDA installer, but we create it - # manually since we did a partial installation.) - sudo ln -s /usr/local/cuda-6.0 /usr/local/cuda || - (echo "CUDA symlink creation failed"; exit 1) + CUDA_URL=http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb + CUDA_FILE=/tmp/cuda_install.deb + curl $CUDA_URL -o $CUDA_FILE + dpkg -i $CUDA_FILE + rm -f $CUDA_FILE + apt-get -y update + # Install the minimal CUDA subpackages required to test Caffe build. + # For a full CUDA installation, add 'cuda' to the list of packages. + apt-get -y install cuda-core-6-0 cuda-extra-libs-6-0 + # Create CUDA symlink at /usr/local/cuda + # (This would normally be created by the CUDA installer, but we create it + # manually since we did a partial installation.) + ln -s /usr/local/cuda-6.0 /usr/local/cuda fi # Install LMDB LMDB_URL=ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release/openldap-2.4.39.tgz LMDB_FILE=/tmp/openldap.tgz pushd . -curl $LMDB_URL -o $LMDB_FILE && \ - tar -C /tmp -xzvf $LMDB_FILE && \ - cd /tmp/openldap*/libraries/liblmdb/ && \ - make && sudo make install || \ - (echo "LMDB install failed"; exit 1) +curl $LMDB_URL -o $LMDB_FILE +tar -C /tmp -xzvf $LMDB_FILE +cd /tmp/openldap*/libraries/liblmdb/ +$MAKE +$MAKE install popd rm -f $LMDB_FILE diff --git a/scripts/travis/travis_setup_makefile_config.sh b/scripts/travis/travis_setup_makefile_config.sh index fa86e92a131..a309bb3d6fe 100755 --- a/scripts/travis/travis_setup_makefile_config.sh +++ b/scripts/travis/travis_setup_makefile_config.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -e + mv Makefile.config.example Makefile.config if $WITH_CUDA; then From f036ef4ded93e1164b640f210b16b63cac1a5d83 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 11 Sep 2014 16:08:12 +0200 Subject: [PATCH 0744/2053] add -fPIC flag to CMake build --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 64250eea0f2..3cb7d583504 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,9 +25,9 @@ endif() ### Configuration ########################################################################### # Compiler Flags set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall) -set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} )#set global flags here) -set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} )#set debug flags here) -set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} )#set release flags here) +set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC) # set global flags +set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) # set debug flags +set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) # set release flags # Global Definitions if(CPU_ONLY) From 3a69e22b540d0dbd3f062e43e114ebfdf44ce68f Mon Sep 17 00:00:00 2001 From: bhack <s.fabri@email.it> Date: Fri, 12 Sep 2014 19:50:15 +0200 Subject: [PATCH 0745/2053] Add ppa for gflag and glog --- scripts/travis/travis_install.sh | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/scripts/travis/travis_install.sh b/scripts/travis/travis_install.sh index 15cafbe9b84..36c63b9d699 100755 --- a/scripts/travis/travis_install.sh +++ b/scripts/travis/travis_install.sh @@ -6,6 +6,7 @@ set -e MAKE="make --jobs=$NUM_THREADS" # Install apt packages where the Ubuntu 12.04 default works for Caffe +add-apt-repository -y ppa:tuleu/precise-backports apt-get -y update apt-get install \ wget git curl \ @@ -14,7 +15,7 @@ apt-get install \ libboost-dev libboost-system-dev libboost-python-dev libboost-thread-dev \ libprotobuf-dev protobuf-compiler \ libatlas-dev libatlas-base-dev \ - libhdf5-serial-dev \ + libhdf5-serial-dev libgflags-dev libgoogle-glog-dev \ bc # Add a special apt-repository to install CMake 2.8.9 for CMake Caffe build, @@ -26,35 +27,6 @@ if $WITH_CMAKE; then apt-get -y install cmake fi -# Install glog -GLOG_URL=https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz -GLOG_FILE=/tmp/glog-0.3.3.tar.gz -pushd . -wget $GLOG_URL -O $GLOG_FILE -tar -C /tmp -xzvf $GLOG_FILE -rm $GLOG_FILE -cd /tmp/glog-0.3.3 -./configure -$MAKE -$MAKE install -popd - -# Install gflags -GFLAGS_URL=https://github.com/schuhschuh/gflags/archive/master.zip -GFLAGS_FILE=/tmp/gflags-master.zip -pushd . -wget $GFLAGS_URL -O $GFLAGS_FILE -cd /tmp/ -unzip gflags-master.zip -cd gflags-master -mkdir build -cd build -export CXXFLAGS="-fPIC" -cmake .. -$MAKE VERBOSE=1 -$MAKE install -popd - # Install CUDA, if needed if $WITH_CUDA; then CUDA_URL=http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb From 431a516f2c12ec5b7aa791155fde9f5eb149bd0d Mon Sep 17 00:00:00 2001 From: Kai Li <kaili_kloud@163.com> Date: Sat, 13 Sep 2014 00:21:06 +0800 Subject: [PATCH 0746/2053] Update CUDA to version 6.5 in the Travis install script --- scripts/travis/travis_install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/travis/travis_install.sh b/scripts/travis/travis_install.sh index 15cafbe9b84..c3bed8976ff 100755 --- a/scripts/travis/travis_install.sh +++ b/scripts/travis/travis_install.sh @@ -57,7 +57,7 @@ popd # Install CUDA, if needed if $WITH_CUDA; then - CUDA_URL=http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.0-37_amd64.deb + CUDA_URL=http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1204/x86_64/cuda-repo-ubuntu1204_6.5-14_amd64.deb CUDA_FILE=/tmp/cuda_install.deb curl $CUDA_URL -o $CUDA_FILE dpkg -i $CUDA_FILE @@ -65,11 +65,11 @@ if $WITH_CUDA; then apt-get -y update # Install the minimal CUDA subpackages required to test Caffe build. # For a full CUDA installation, add 'cuda' to the list of packages. - apt-get -y install cuda-core-6-0 cuda-extra-libs-6-0 + apt-get -y install cuda-core-6-5 cuda-cublas-6-5 cuda-cublas-dev-6-5 cuda-cudart-6-5 cuda-cudart-dev-6-5 cuda-curand-6-5 cuda-curand-dev-6-5 # Create CUDA symlink at /usr/local/cuda # (This would normally be created by the CUDA installer, but we create it # manually since we did a partial installation.) - ln -s /usr/local/cuda-6.0 /usr/local/cuda + ln -s /usr/local/cuda-6.5 /usr/local/cuda fi # Install LMDB From d54846c83efb974d8809b211c003bd63f89092e1 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 13 Sep 2014 18:30:32 -0700 Subject: [PATCH 0747/2053] fix out-of-date next ID comment for SolverParameter --- src/caffe/proto/caffe.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 0e9ecf72728..896df03333a 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -63,7 +63,7 @@ message NetParameter { // NOTE // Update the next available ID when you add a new SolverParameter field. // -// SolverParameter next available ID: 32 (last added: delta) +// SolverParameter next available ID: 33 (last added: test_initialization) message SolverParameter { ////////////////////////////////////////////////////////////////////////////// // Specifying the train and test networks From e294f6a6e4f5dfc0cc260301a1b04f86c042f7c0 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 13 Sep 2014 18:30:52 -0700 Subject: [PATCH 0748/2053] fix spelling error in caffe.proto --- src/caffe/proto/caffe.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 896df03333a..493bfa7ab17 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -120,7 +120,7 @@ message SolverParameter { optional float momentum = 11; // The momentum value. optional float weight_decay = 12; // The weight decay. // regularization types supported: L1 and L2 - // controled by weight_decay + // controlled by weight_decay optional string regularization_type = 29 [default = "L2"]; optional int32 stepsize = 13; // the stepsize for learning rate policy "step" optional int32 snapshot = 14 [default = 0]; // The snapshot interval From 503ac0b7892faa03b5633999c729a2641461b690 Mon Sep 17 00:00:00 2001 From: bhack <bhack@users.noreply.github.com> Date: Sun, 14 Sep 2014 21:16:38 +0200 Subject: [PATCH 0749/2053] Fix comments --- scripts/travis/travis_install.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/travis/travis_install.sh b/scripts/travis/travis_install.sh index 36c63b9d699..f1dc5a66516 100755 --- a/scripts/travis/travis_install.sh +++ b/scripts/travis/travis_install.sh @@ -5,8 +5,10 @@ set -e MAKE="make --jobs=$NUM_THREADS" -# Install apt packages where the Ubuntu 12.04 default works for Caffe -add-apt-repository -y ppa:tuleu/precise-backports +# Install apt packages where the Ubuntu 12.04 default and ppa works for Caffe + +#This ppa is for gflags and glog +add-aptrepository -y ppa:tuleu/precise-backports apt-get -y update apt-get install \ wget git curl \ From 8de9ab04e832491adf06386a81de0f54f3d62422 Mon Sep 17 00:00:00 2001 From: bhack <bhack@users.noreply.github.com> Date: Sun, 14 Sep 2014 22:19:51 +0200 Subject: [PATCH 0750/2053] Fix a little typo --- scripts/travis/travis_install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/travis/travis_install.sh b/scripts/travis/travis_install.sh index f1dc5a66516..b1a59e09d95 100755 --- a/scripts/travis/travis_install.sh +++ b/scripts/travis/travis_install.sh @@ -7,8 +7,8 @@ MAKE="make --jobs=$NUM_THREADS" # Install apt packages where the Ubuntu 12.04 default and ppa works for Caffe -#This ppa is for gflags and glog -add-aptrepository -y ppa:tuleu/precise-backports +# This ppa is for gflags and glog +add-apt-repository -y ppa:tuleu/precise-backports apt-get -y update apt-get install \ wget git curl \ From bbd166e07313a6b30c68f3a7557e81316adb3d14 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 15 Sep 2014 14:15:58 -0700 Subject: [PATCH 0751/2053] fix caffe train GPU initialization Previously, the solver constructed nets before the caffe train tool read the --gpu flag, which can cause errors due to LayerSetUp executing on the wrong device (breaking cuDNN, for example). --- src/caffe/solver.cpp | 5 ----- tools/caffe.cpp | 15 +++++++++++---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 6b5570641e8..fc2576bc120 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -32,11 +32,6 @@ void Solver<Dtype>::Init(const SolverParameter& param) { LOG(INFO) << "Initializing solver from parameters: " << std::endl << param.DebugString(); param_ = param; - if (param_.solver_mode() == SolverParameter_SolverMode_GPU && - param_.has_device_id()) { - Caffe::SetDevice(param_.device_id()); - } - Caffe::set_mode(Caffe::Brew(param_.solver_mode())); if (param_.random_seed() >= 0) { Caffe::set_random_seed(param_.random_seed()); } diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 10ba70d152e..fa27fdf2118 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -87,20 +87,27 @@ int train() { caffe::SolverParameter solver_param; caffe::ReadProtoFromTextFileOrDie(FLAGS_solver, &solver_param); - LOG(INFO) << "Starting Optimization"; - shared_ptr<caffe::Solver<float> > - solver(caffe::GetSolver<float>(solver_param)); + // If the gpu flag is not provided, allow the mode and device to be set + // in the solver prototxt. + if (FLAGS_gpu < 0 + && solver_param.solver_mode() == caffe::SolverParameter_SolverMode_GPU) { + FLAGS_gpu = solver_param.device_id(); + } // Set device id and mode if (FLAGS_gpu >= 0) { LOG(INFO) << "Use GPU with device ID " << FLAGS_gpu; Caffe::SetDevice(FLAGS_gpu); Caffe::set_mode(Caffe::GPU); - } else if (!solver_param.has_solver_mode()) { + } else { LOG(INFO) << "Use CPU."; Caffe::set_mode(Caffe::CPU); } + LOG(INFO) << "Starting Optimization"; + shared_ptr<caffe::Solver<float> > + solver(caffe::GetSolver<float>(solver_param)); + if (FLAGS_snapshot.size()) { LOG(INFO) << "Resuming from " << FLAGS_snapshot; solver->Solve(FLAGS_snapshot); From 012047626efa78847d35a41b802796df20aa89aa Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Tue, 16 Sep 2014 08:13:17 -0700 Subject: [PATCH 0752/2053] [example] update paths in net surgery --- ...totxt => bvlc_caffenet_full_conv.prototxt} | 0 examples/net_surgery.ipynb | 46 ++++++++++--------- 2 files changed, 24 insertions(+), 22 deletions(-) rename examples/imagenet/{imagenet_full_conv.prototxt => bvlc_caffenet_full_conv.prototxt} (100%) diff --git a/examples/imagenet/imagenet_full_conv.prototxt b/examples/imagenet/bvlc_caffenet_full_conv.prototxt similarity index 100% rename from examples/imagenet/imagenet_full_conv.prototxt rename to examples/imagenet/bvlc_caffenet_full_conv.prototxt diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 0854018af4a..e4f4f985992 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -2,7 +2,8 @@ "metadata": { "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "example_name": "Editing model parameters", - "include_in_docs": true + "include_in_docs": true, + "signature": "sha256:179fb20339497f5e64f6fbeb57987f27a962b7ae6d940c8fede2631aba9bffaf" }, "nbformat": 3, "nbformat_minor": 0, @@ -35,47 +36,48 @@ "output_type": "stream", "stream": "stdout", "text": [ - "1c1\r\n", + "1,2c1\r\n", + "< # This file is for the net_surgery.ipynb example notebook.\r\n", "< name: \"CaffeNetConv\"\r\n", "---\r\n", "> name: \"CaffeNet\"\r\n", - "3c3\r\n", + "4c3\r\n", "< input_dim: 1\r\n", "---\r\n", "> input_dim: 10\r\n", - "5,6c5,6\r\n", + "6,7c5,6\r\n", "< input_dim: 451\r\n", "< input_dim: 451\r\n", "---\r\n", "> input_dim: 227\r\n", "> input_dim: 227\r\n", - "151,152c151,152\r\n", + "152,153c151,152\r\n", "< name: \"fc6-conv\"\r\n", "< type: CONVOLUTION\r\n", "---\r\n", "> name: \"fc6\"\r\n", "> type: INNER_PRODUCT\r\n", - "154,155c154,155\r\n", + "155,156c154,155\r\n", "< top: \"fc6-conv\"\r\n", "< convolution_param {\r\n", "---\r\n", "> top: \"fc6\"\r\n", "> inner_product_param {\r\n", - "157d156\r\n", + "158d156\r\n", "< kernel_size: 6\r\n", - "163,164c162,163\r\n", + "164,165c162,163\r\n", "< bottom: \"fc6-conv\"\r\n", "< top: \"fc6-conv\"\r\n", "---\r\n", "> bottom: \"fc6\"\r\n", "> top: \"fc6\"\r\n", - "169,170c168,169\r\n", + "170,171c168,169\r\n", "< bottom: \"fc6-conv\"\r\n", "< top: \"fc6-conv\"\r\n", "---\r\n", "> bottom: \"fc6\"\r\n", "> top: \"fc6\"\r\n", - "176,180c175,179\r\n", + "177,181c175,179\r\n", "< name: \"fc7-conv\"\r\n", "< type: CONVOLUTION\r\n", "< bottom: \"fc6-conv\"\r\n", @@ -87,21 +89,21 @@ "> bottom: \"fc6\"\r\n", "> top: \"fc7\"\r\n", "> inner_product_param {\r\n", - "182d180\r\n", + "183d180\r\n", "< kernel_size: 1\r\n", - "188,189c186,187\r\n", + "189,190c186,187\r\n", "< bottom: \"fc7-conv\"\r\n", "< top: \"fc7-conv\"\r\n", "---\r\n", "> bottom: \"fc7\"\r\n", "> top: \"fc7\"\r\n", - "194,195c192,193\r\n", + "195,196c192,193\r\n", "< bottom: \"fc7-conv\"\r\n", "< top: \"fc7-conv\"\r\n", "---\r\n", "> bottom: \"fc7\"\r\n", "> top: \"fc7\"\r\n", - "201,205c199,203\r\n", + "202,206c199,203\r\n", "< name: \"fc8-conv\"\r\n", "< type: CONVOLUTION\r\n", "< bottom: \"fc7-conv\"\r\n", @@ -113,9 +115,9 @@ "> bottom: \"fc7\"\r\n", "> top: \"fc8\"\r\n", "> inner_product_param {\r\n", - "207d204\r\n", + "208d204\r\n", "< kernel_size: 1\r\n", - "213c210\r\n", + "214c210\r\n", "< bottom: \"fc8-conv\"\r\n", "---\r\n", "> bottom: \"fc8\"\r\n" @@ -143,7 +145,7 @@ "import caffe\n", "\n", "# Load the original network and extract the fully-connected layers' parameters.\n", - "net = caffe.Net('../models/bvlc_reference_caffenet/deploy.prototxt', 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')\n", + "net = caffe.Net('../models/bvlc_reference_caffenet/deploy.prototxt', '../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')\n", "params = ['fc6', 'fc7', 'fc8']\n", "# fc_params = {name: (weights, biases)}\n", "fc_params = {pr: (net.params[pr][0].data, net.params[pr][1].data) for pr in params}\n", @@ -178,7 +180,7 @@ "collapsed": false, "input": [ "# Load the fully-convolutional network to transplant the parameters.\n", - "net_full_conv = caffe.Net('imagenet/imagenet_full_conv.prototxt', '../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')\n", + "net_full_conv = caffe.Net('imagenet/bvlc_caffenet_full_conv.prototxt', '../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')\n", "params_full_conv = ['fc6-conv', 'fc7-conv', 'fc8-conv']\n", "# conv_params = {name: (weights, biases)}\n", "conv_params = {pr: (net_full_conv.params[pr][0].data, net_full_conv.params[pr][1].data) for pr in params_full_conv}\n", @@ -254,7 +256,7 @@ "cell_type": "code", "collapsed": false, "input": [ - "net_full_conv.save('imagenet/caffe_imagenet_full_conv')" + "net_full_conv.save('imagenet/bvlc_caffenet_full_conv.caffemodel')" ], "language": "python", "metadata": {}, @@ -313,7 +315,7 @@ "output_type": "pyout", "prompt_number": 7, "text": [ - "<matplotlib.image.AxesImage at 0x14c8050d0>" + "<matplotlib.image.AxesImage at 0x7f283815ce50>" ] }, { @@ -321,7 +323,7 @@ "output_type": "display_data", "png": "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\n", "text": [ - "<matplotlib.figure.Figure at 0x10a00e310>" + "<matplotlib.figure.Figure at 0x7f285ddfca50>" ] } ], @@ -349,4 +351,4 @@ "metadata": {} } ] -} +} \ No newline at end of file From 4e6d977e8b087a0107fc79618170f36785c38676 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Tue, 16 Sep 2014 08:19:02 -0700 Subject: [PATCH 0753/2053] [fix] snapshot model weights as .caffemodel, solver state as .solverstate --- src/caffe/solver.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index fc2576bc120..0ea4edcf9b8 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -308,20 +308,21 @@ void Solver<Dtype>::Snapshot() { // For intermediate results, we will also dump the gradient values. net_->ToProto(&net_param, param_.snapshot_diff()); string filename(param_.snapshot_prefix()); + string model_filename, snapshot_filename; const int kBufferSize = 20; char iter_str_buffer[kBufferSize]; snprintf(iter_str_buffer, kBufferSize, "_iter_%d", iter_); filename += iter_str_buffer; - filename += ".caffemodel"; - LOG(INFO) << "Snapshotting to " << filename; - WriteProtoToBinaryFile(net_param, filename.c_str()); + model_filename = filename + ".caffemodel"; + LOG(INFO) << "Snapshotting to " << model_filename; + WriteProtoToBinaryFile(net_param, model_filename.c_str()); SolverState state; SnapshotSolverState(&state); state.set_iter(iter_); - state.set_learned_net(filename); - filename += ".solverstate"; - LOG(INFO) << "Snapshotting solver state to " << filename; - WriteProtoToBinaryFile(state, filename.c_str()); + state.set_learned_net(model_filename); + snapshot_filename = filename + ".solverstate"; + LOG(INFO) << "Snapshotting solver state to " << snapshot_filename; + WriteProtoToBinaryFile(state, snapshot_filename.c_str()); } template <typename Dtype> From 06d7310aa8957d21cde86c3812325dfd9532c980 Mon Sep 17 00:00:00 2001 From: Ronghang Hu <huronghang@hotmail.com> Date: Tue, 16 Sep 2014 09:56:11 -0700 Subject: [PATCH 0754/2053] set up datum size for WindowDataLayer --- src/caffe/layers/window_data_layer.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 4284c327681..a24d7de3daa 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -158,6 +158,12 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, LOG(INFO) << "output data size: " << (*top)[0]->num() << "," << (*top)[0]->channels() << "," << (*top)[0]->height() << "," << (*top)[0]->width(); + // datum size + this->datum_channels_ = (*top)[0]->channels(); + this->datum_height_ = (*top)[0]->height(); + this->datum_width_ = (*top)[0]->width(); + this->datum_size_ = + (*top)[0]->channels() * (*top)[0]->height() * (*top)[0]->width(); // label (*top)[1]->Reshape(batch_size, 1, 1, 1); this->prefetch_label_.Reshape(batch_size, 1, 1, 1); From aecab61ff762eb4fb595b59948b25a5d10cd5505 Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Tue, 9 Sep 2014 13:42:40 -0700 Subject: [PATCH 0755/2053] [Bugfix] Move error checking closer to file read Previously, if (height > 0 && width > 0) was true, the cv::resize() function would be called before cv_img_origin was confirmed valid; if the image file/filename was not valid, this caused an opencv assert error like this: terminate called after throwing an instance of 'cv::Exception' what(): /tmp/A3p0_4200_32550/batserve/A3p0/glnxa64/OpenCV/modules/imgproc/src/imgwarp.cpp:1725: error: (-215) ssize.area() > 0 in function resize --- src/caffe/util/io.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 7b6c67cf633..ad835e35d66 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -71,16 +71,18 @@ bool ReadImageToDatum(const string& filename, const int label, cv::Mat cv_img; int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : CV_LOAD_IMAGE_GRAYSCALE); - if (height > 0 && width > 0) { - cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); - cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); - } else { - cv_img = cv::imread(filename, cv_read_flag); - } - if (!cv_img.data) { + + cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); + if (!cv_img_origin.data) { LOG(ERROR) << "Could not open or find file " << filename; return false; } + if (height > 0 && width > 0) { + cv::resize(cv_img_origin, cv_img, cv::Size(height, width)); + } else { + cv_img = cv_img_origin; + } + int num_channels = (is_color ? 3 : 1); datum->set_channels(num_channels); datum->set_height(cv_img.rows); From 03e0e01fce7361194b599c53c1f23d77cbb07086 Mon Sep 17 00:00:00 2001 From: qipeng <pengrobertqi@163.com> Date: Tue, 16 Sep 2014 19:59:53 -0700 Subject: [PATCH 0756/2053] Display averaged loss over the last several iterations --- src/caffe/proto/caffe.proto | 4 +++- src/caffe/solver.cpp | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 493bfa7ab17..ba4c41cbf67 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -63,7 +63,7 @@ message NetParameter { // NOTE // Update the next available ID when you add a new SolverParameter field. // -// SolverParameter next available ID: 33 (last added: test_initialization) +// SolverParameter next available ID: 34 (last added: average_loss) message SolverParameter { ////////////////////////////////////////////////////////////////////////////// // Specifying the train and test networks @@ -113,6 +113,8 @@ message SolverParameter { // the number of iterations between displaying info. If display = 0, no info // will be displayed. optional int32 display = 6; + // Display the cost averaged over the last average_cost iterations + optional int32 average_loss = 33 [default = 1]; optional int32 max_iter = 7; // the maximum number of iterations optional string lr_policy = 8; // The learning rate decay policy. optional float gamma = 9; // The parameter to compute the learning rate. diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 0ea4edcf9b8..0810f487fab 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -169,6 +169,13 @@ void Solver<Dtype>::Solve(const char* resume_file) { // resume_file above. const int start_iter = iter_; + int average_loss = this->param_.average_loss(); + + CHECK_GE(average_loss, 1) << "average_cost should be non-negative."; + + vector<Dtype> losses; + Dtype smoothed_loss; + // For a network that is trained by the solver, no bottom or top vecs // should be given, and we will just provide dummy vecs. vector<Blob<Dtype>*> bottom_vec; @@ -187,8 +194,17 @@ void Solver<Dtype>::Solve(const char* resume_file) { const bool display = param_.display() && iter_ % param_.display() == 0; net_->set_debug_info(display && param_.debug_info()); Dtype loss = net_->ForwardBackward(bottom_vec); + if (losses.size() < average_loss) { + losses.push_back(loss); + int size = losses.size(); + smoothed_loss = (smoothed_loss * (size - 1) + loss) / size; + } else { + int idx = (iter_ - start_iter) % average_loss; + smoothed_loss += (loss - losses[idx]) / average_loss; + losses[idx] = loss; + } if (display) { - LOG(INFO) << "Iteration " << iter_ << ", loss = " << loss; + LOG(INFO) << "Iteration " << iter_ << ", loss = " << smoothed_loss; const vector<Blob<Dtype>*>& result = net_->output_blobs(); int score_index = 0; for (int j = 0; j < result.size(); ++j) { From 3fc22b35b5fe1b08fb42dd631492270bd1ee4060 Mon Sep 17 00:00:00 2001 From: Christos Nikolaou <christnn@auth.gr> Date: Wed, 17 Sep 2014 21:28:51 +0300 Subject: [PATCH 0757/2053] Update readme.md files of cifar10 and mnist examples. Fixed broken links. --- examples/cifar10/readme.md | 6 +++--- examples/mnist/readme.md | 20 +++++++++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/examples/cifar10/readme.md b/examples/cifar10/readme.md index 86fd5ea2967..a329b49c5ea 100644 --- a/examples/cifar10/readme.md +++ b/examples/cifar10/readme.md @@ -11,7 +11,7 @@ Alex's CIFAR-10 tutorial, Caffe style Alex Krizhevsky's [cuda-convnet](https://code.google.com/p/cuda-convnet/) details the model definitions, parameters, and training procedure for good performance on CIFAR-10. This example reproduces his results in Caffe. -We will assume that you have Caffe successfully compiled. If not, please refer to the [Installation page](installation.html). In this tutorial, we will assume that your caffe installation is located at `CAFFE_ROOT`. +We will assume that you have Caffe successfully compiled. If not, please refer to the [Installation page](/installation.html). In this tutorial, we will assume that your caffe installation is located at `CAFFE_ROOT`. We thank @chyojn for the pull request that defined the model schemas and solver configurations. @@ -32,12 +32,12 @@ If it complains that `wget` or `gunzip` are not installed, you need to install t The Model --------- -The CIFAR-10 model is a CNN that composes layers of convolution, pooling, rectified linear unit (ReLU) nonlinearities, and local contrast normalization with a linear classifier on top of it all. We have defined the model in the `CAFFE_ROOT/examples/cifar10` directory's `cifar10_quick_train.prototxt`. +The CIFAR-10 model is a CNN that composes layers of convolution, pooling, rectified linear unit (ReLU) nonlinearities, and local contrast normalization with a linear classifier on top of it all. We have defined the model in the `CAFFE_ROOT/examples/cifar10` directory's `cifar10_quick_train_test.prototxt`. Training and Testing the "Quick" Model -------------------------------------- -Training the model is simple after you have written the network definition protobuf and solver protobuf files. Simply run `train_quick.sh`, or the following command directly: +Training the model is simple after you have written the network definition protobuf and solver protobuf files (refer to [MNIST Tutorial](../examples/mnist.html)). Simply run `train_quick.sh`, or the following command directly: cd $CAFFE_ROOT/examples/cifar10 ./train_quick.sh diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 5a8e8cab3f5..2985240e2f9 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -8,7 +8,7 @@ priority: 1 # Training MNIST with Caffe -We will assume that you have caffe successfully compiled. If not, please refer to the [Installation page](installation.html). In this tutorial, we will assume that your caffe installation is located at `CAFFE_ROOT`. +We will assume that you have caffe successfully compiled. If not, please refer to the [Installation page](/installation.html). In this tutorial, we will assume that your caffe installation is located at `CAFFE_ROOT`. ## Prepare Datasets @@ -29,7 +29,7 @@ The design of LeNet contains the essence of CNNs that are still used in larger m ## Define the MNIST Network -This section explains the prototxt file `lenet_train.prototxt` used in the MNIST demo. We assume that you are familiar with [Google Protobuf](https://developers.google.com/protocol-buffers/docs/overview), and assume that you have read the protobuf definitions used by Caffe, which can be found at `$CAFFE_ROOT/src/caffe/proto/caffe.proto`. +This section explains the prototxt file `lenet.prototxt` used in the MNIST demo. We assume that you are familiar with [Google Protobuf](https://developers.google.com/protocol-buffers/docs/overview), and assume that you have read the protobuf definitions used by Caffe, which can be found at `$CAFFE_ROOT/src/caffe/proto/caffe.proto`. Specifically, we will write a `caffe::NetParameter` (or in python, `caffe.proto.caffe_pb2.NetParameter`) protobuf. We will start by giving the network a name: @@ -203,9 +203,23 @@ Check out the comments explaining each line in the prototxt `$CAFFE_ROOT/example # solver mode: CPU or GPU solver_mode: GPU +## Additional Notes + +Note that the train and test protocol definition for the network is in the `lenet_train_test.prototxt` file which differs from the `lenet.prototxt` file. In `lenet_train_test.prototxt file`, layers may include one additional definition, like the one below: + + + layers { + + // Other layer definitions + + include: { phase: TRAIN } + } + +This layer will be used only in training phase. If we change `TRAIN` with `TEST`, then this layer will be used only in test phase. Otherwise this layer will be used in both training and test phase. Thus `lenet_train_test.prototxt` has two `DATA` layers defined (with different `batch_size`), one for training and one for testing. + ## Training and Testing the Model -Training the model is simple after you have written the network definition protobuf and solver protobuf files. Simply run `train_mnist.sh`, or the following command directly: +Training the model is simple after you have written the network definition protobuf and solver protobuf files. Simply run `train_lenet.sh`, or the following command directly: cd $CAFFE_ROOT/examples/mnist ./train_lenet.sh From 1096ddefbaff09d4af4147dabd7d4a448334b074 Mon Sep 17 00:00:00 2001 From: Christos Nikolaou <christnn@auth.gr> Date: Thu, 18 Sep 2014 12:49:17 +0300 Subject: [PATCH 0758/2053] Updated mnist/readme.md file with additional information. --- examples/mnist/readme.md | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 2985240e2f9..fe6e36a12f8 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -173,6 +173,22 @@ Finally, we will write the loss! The `softmax_loss` layer implements both the softmax and the multinomial logistic loss (that saves time and improves numerical stability). It takes two blobs, the first one being the prediction and the second one being the `label` provided by the data layer (remember it?). It does not produce any outputs - all it does is to compute the loss function value, report it when backpropagation starts, and initiates the gradient with respect to `ip2`. This is where all magic starts. + +### Additional Notes: Writing Layer Rules + +The train and test protocol definition for the network is in the `lenet_train_test.prototxt` file, which differs from the `lenet.prototxt` file. In `lenet_train_test.prototxt` file, layers may include an additional definition, like the one below: + + + layers { + // Other layer definitions + include: { phase: TRAIN } + } + +This definition is a rule, which controls whether and when a layer is included in the network, based on current network's state. You can refeer to `$CAFFE_ROOT/src/caffe/proto/caffe.proto` for more information about layer's parameters. + +In the above example, this layer will be included only in `TRAIN` phase. If we change `TRAIN` with `TEST`, then this layer will be used only in test phase. Otherwise this layer will be used in both training and test phase. Thus, `lenet_train_test.prototxt` has two `DATA` layers defined (with different `batch_size`), one for the training phase and one for the testing phase. Also, there is an `ACCURACY` layer which is included only in `TEST` phase, because we want our network to report its accuracy every 100 iteration, as defined in `lenet_solver.prototxt`. + + ## Define the MNIST Solver Check out the comments explaining each line in the prototxt `$CAFFE_ROOT/examples/mnist/lenet_solver.prototxt`: @@ -203,19 +219,6 @@ Check out the comments explaining each line in the prototxt `$CAFFE_ROOT/example # solver mode: CPU or GPU solver_mode: GPU -## Additional Notes - -Note that the train and test protocol definition for the network is in the `lenet_train_test.prototxt` file which differs from the `lenet.prototxt` file. In `lenet_train_test.prototxt file`, layers may include one additional definition, like the one below: - - - layers { - - // Other layer definitions - - include: { phase: TRAIN } - } - -This layer will be used only in training phase. If we change `TRAIN` with `TEST`, then this layer will be used only in test phase. Otherwise this layer will be used in both training and test phase. Thus `lenet_train_test.prototxt` has two `DATA` layers defined (with different `batch_size`), one for training and one for testing. ## Training and Testing the Model From e4d48c560de0bb70be84054b098984293434a123 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 17 Sep 2014 15:10:18 -0700 Subject: [PATCH 0759/2053] test convolution against explicit reference implementation To thoroughly check convolution, the output is compared against a reference implementation by explicit looping. Simple and group convolution by the Caffe and cuDNN engines are checked against the reference. --- src/caffe/test/test_convolution_layer.cpp | 217 +++++++++++++++------- 1 file changed, 149 insertions(+), 68 deletions(-) diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index 0e7a8da567b..0849a3a4591 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -13,6 +13,93 @@ namespace caffe { +// Reference convolution for checking results: +// accumulate through explicit loops over input, output, and filters. +template <typename Dtype> +void caffe_conv(const Blob<Dtype>* in, ConvolutionParameter* conv_param, + const vector<shared_ptr<Blob<Dtype> > >& weights, + Blob<Dtype>* out) { + // Kernel size, stride, and pad + int kernel_h, kernel_w; + if (conv_param->has_kernel_size()) { + kernel_h = kernel_w = conv_param->kernel_size(); + } else { + kernel_h = conv_param->kernel_h(); + kernel_w = conv_param->kernel_w(); + } + int pad_h, pad_w; + if (!conv_param->has_pad_h()) { + pad_h = pad_w = conv_param->pad(); + } else { + pad_h = conv_param->pad_h(); + pad_w = conv_param->pad_w(); + } + int stride_h, stride_w; + if (!conv_param->has_stride_h()) { + stride_h = stride_w = conv_param->stride(); + } else { + stride_h = conv_param->stride_h(); + stride_w = conv_param->stride_w(); + } + // Groups + int groups = conv_param->group(); + int o_g = out->channels() / groups; + int k_g = in->channels() / groups; + int o_head, k_head; + // Convolution + const Dtype* in_data = in->cpu_data(); + const Dtype* weight_data = weights[0]->cpu_data(); + Dtype* out_data = out->mutable_cpu_data(); + for (int n = 0; n < out->num(); n++) { + for (int g = 0; g < groups; g++) { + o_head = o_g * g; + k_head = k_g * g; + for (int o = 0; o < o_g; o++) { + for (int k = 0; k < k_g; k++) { + for (int y = 0; y < out->height(); y++) { + for (int x = 0; x < out->width(); x++) { + for (int p = 0; p < kernel_h; p++) { + for (int q = 0; q < kernel_w; q++) { + int in_y = y * stride_h - pad_h + p; + int in_x = x * stride_w - pad_w + q; + if (in_y >= 0 && in_y < in->height() + && in_x >= 0 && in_x < in->width()) { + out_data[out->offset(n, o + o_head, y, x)] += + in_data[in->offset(n, k + k_head, in_y, in_x)] + * weight_data[weights[0]->offset(o + o_head, k, p, q)]; + } + } + } + } + } + } + } + } + } + // Bias + if (conv_param->bias_term()) { + const Dtype* bias_data = weights[1]->cpu_data(); + for (int n = 0; n < out->num(); n++) { + for (int o = 0; o < out->channels(); o++) { + for (int y = 0; y < out->height(); y++) { + for (int x = 0; x < out->width(); x++) { + out_data[out->offset(n, o, y, x)] += bias_data[o]; + } + } + } + } + } +} + +template void caffe_conv(const Blob<float>* in, + ConvolutionParameter* conv_param, + const vector<shared_ptr<Blob<float> > >& weights, + Blob<float>* out); +template void caffe_conv(const Blob<double>* in, + ConvolutionParameter* conv_param, + const vector<shared_ptr<Blob<double> > >& weights, + Blob<double>* out); + template <typename TypeParam> class ConvolutionLayerTest : public MultiDeviceTest<TypeParam> { typedef typename TypeParam::Dtype Dtype; @@ -41,10 +128,17 @@ class ConvolutionLayerTest : public MultiDeviceTest<TypeParam> { delete blob_top_2_; } + virtual Blob<Dtype>* MakeReferenceTop(Blob<Dtype>* top) { + this->ref_blob_top_.reset(new Blob<Dtype>()); + this->ref_blob_top_->ReshapeLike(*top); + return this->ref_blob_top_.get(); + } + Blob<Dtype>* const blob_bottom_; Blob<Dtype>* const blob_bottom_2_; Blob<Dtype>* const blob_top_; Blob<Dtype>* const blob_top_2_; + shared_ptr<Blob<Dtype> > ref_blob_top_; vector<Blob<Dtype>*> blob_bottom_vec_; vector<Blob<Dtype>*> blob_top_vec_; }; @@ -90,14 +184,6 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) { // We will simply see if the convolution layer carries out averaging well. typedef typename TypeParam::Dtype Dtype; - shared_ptr<ConstantFiller<Dtype> > filler; - FillerParameter filler_param; - filler_param.set_value(1.); - filler.reset(new ConstantFiller<Dtype>(filler_param)); - filler->Fill(this->blob_bottom_); - filler_param.set_value(2.); - filler.reset(new ConstantFiller<Dtype>(filler_param)); - filler->Fill(this->blob_bottom_2_); this->blob_bottom_vec_.push_back(this->blob_bottom_2_); this->blob_top_vec_.push_back(this->blob_top_2_); LayerParameter layer_param; @@ -114,34 +200,28 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) { new ConvolutionLayer<Dtype>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // After the convolution, the output should all have output values 27.1 - const Dtype* top_data = this->blob_top_->cpu_data(); + // Check against reference convolution. + const Dtype* top_data; + const Dtype* ref_top_data; + caffe_conv(this->blob_bottom_, convolution_param, layer->blobs(), + this->MakeReferenceTop(this->blob_top_)); + top_data = this->blob_top_->cpu_data(); + ref_top_data = this->ref_blob_top_->cpu_data(); for (int i = 0; i < this->blob_top_->count(); ++i) { - EXPECT_NEAR(top_data[i], 27.1, 1e-4); + EXPECT_NEAR(top_data[i], ref_top_data[i], 1e-4); } + caffe_conv(this->blob_bottom_2_, convolution_param, layer->blobs(), + this->MakeReferenceTop(this->blob_top_2_)); top_data = this->blob_top_2_->cpu_data(); - for (int i = 0; i < this->blob_top_2_->count(); ++i) { - EXPECT_NEAR(top_data[i], 54.1, 1e-4); + ref_top_data = this->ref_blob_top_->cpu_data(); + for (int i = 0; i < this->blob_top_->count(); ++i) { + EXPECT_NEAR(top_data[i], ref_top_data[i], 1e-4); } } TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) { // We will simply see if the convolution layer carries out averaging well. typedef typename TypeParam::Dtype Dtype; - FillerParameter filler_param; - filler_param.set_value(1.); - ConstantFiller<Dtype> filler(filler_param); - filler.Fill(this->blob_bottom_); - Dtype* bottom_data = this->blob_bottom_->mutable_cpu_data(); - for (int n = 0; n < this->blob_bottom_->num(); ++n) { - for (int c = 0; c < this->blob_bottom_->channels(); ++c) { - for (int h = 0; h < this->blob_bottom_->height(); ++h) { - for (int w = 0; w < this->blob_bottom_->width(); ++w) { - bottom_data[this->blob_bottom_->offset(n, c, h, w)] = c; - } - } - } - } LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); @@ -157,17 +237,15 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) { new ConvolutionLayer<Dtype>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // After the convolution, the output should all have output values 9.1 - const Dtype* top_data = this->blob_top_->cpu_data(); - for (int n = 0; n < this->blob_top_->num(); ++n) { - for (int c = 0; c < this->blob_top_->channels(); ++c) { - for (int h = 0; h < this->blob_top_->height(); ++h) { - for (int w = 0; w < this->blob_top_->width(); ++w) { - Dtype data = top_data[this->blob_top_->offset(n, c, h, w)]; - EXPECT_NEAR(data, c * 9 + 0.1, 1e-4); - } - } - } + // Check against reference convolution. + const Dtype* top_data; + const Dtype* ref_top_data; + caffe_conv(this->blob_bottom_, convolution_param, layer->blobs(), + this->MakeReferenceTop(this->blob_top_)); + top_data = this->blob_top_->cpu_data(); + ref_top_data = this->ref_blob_top_->cpu_data(); + for (int i = 0; i < this->blob_top_->count(); ++i) { + EXPECT_NEAR(top_data[i], ref_top_data[i], 1e-4); } } @@ -330,10 +408,17 @@ class CuDNNConvolutionLayerTest : public ::testing::Test { delete blob_top_2_; } + virtual Blob<Dtype>* MakeReferenceTop(Blob<Dtype>* top) { + this->ref_blob_top_.reset(new Blob<Dtype>()); + this->ref_blob_top_->ReshapeLike(*top); + return this->ref_blob_top_.get(); + } + Blob<Dtype>* const blob_bottom_; Blob<Dtype>* const blob_bottom_2_; Blob<Dtype>* const blob_top_; Blob<Dtype>* const blob_top_2_; + shared_ptr<Blob<Dtype> > ref_blob_top_; vector<Blob<Dtype>*> blob_bottom_vec_; vector<Blob<Dtype>*> blob_top_vec_; }; @@ -342,6 +427,8 @@ TYPED_TEST_CASE(CuDNNConvolutionLayerTest, TestDtypes); TYPED_TEST(CuDNNConvolutionLayerTest, TestSetupCuDNN) { Caffe::set_mode(Caffe::GPU); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); @@ -379,6 +466,8 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSetupCuDNN) { TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionCuDNN) { // We will simply see if the convolution layer carries out averaging well. Caffe::set_mode(Caffe::GPU); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); shared_ptr<ConstantFiller<TypeParam> > filler; FillerParameter filler_param; filler_param.set_value(1.); @@ -403,34 +492,28 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionCuDNN) { new CuDNNConvolutionLayer<TypeParam>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // After the convolution, the output should all have output values 27.1 - const TypeParam* top_data = this->blob_top_->cpu_data(); + // Check against reference convolution. + const TypeParam* top_data; + const TypeParam* ref_top_data; + caffe_conv(this->blob_bottom_, convolution_param, layer->blobs(), + this->MakeReferenceTop(this->blob_top_)); + top_data = this->blob_top_->cpu_data(); + ref_top_data = this->ref_blob_top_->cpu_data(); for (int i = 0; i < this->blob_top_->count(); ++i) { - EXPECT_NEAR(top_data[i], 27.1, 1e-4); + EXPECT_NEAR(top_data[i], ref_top_data[i], 1e-4); } + caffe_conv(this->blob_bottom_2_, convolution_param, layer->blobs(), + this->MakeReferenceTop(this->blob_top_2_)); top_data = this->blob_top_2_->cpu_data(); - for (int i = 0; i < this->blob_top_2_->count(); ++i) { - EXPECT_NEAR(top_data[i], 54.1, 1e-4); + ref_top_data = this->ref_blob_top_->cpu_data(); + for (int i = 0; i < this->blob_top_->count(); ++i) { + EXPECT_NEAR(top_data[i], ref_top_data[i], 1e-4); } } TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionGroupCuDNN) { // We will simply see if the convolution layer carries out averaging well. Caffe::set_mode(Caffe::GPU); - FillerParameter filler_param; - filler_param.set_value(1.); - ConstantFiller<TypeParam> filler(filler_param); - filler.Fill(this->blob_bottom_); - TypeParam* bottom_data = this->blob_bottom_->mutable_cpu_data(); - for (int n = 0; n < this->blob_bottom_->num(); ++n) { - for (int c = 0; c < this->blob_bottom_->channels(); ++c) { - for (int h = 0; h < this->blob_bottom_->height(); ++h) { - for (int w = 0; w < this->blob_bottom_->width(); ++w) { - bottom_data[this->blob_bottom_->offset(n, c, h, w)] = c; - } - } - } - } LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); @@ -446,17 +529,15 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionGroupCuDNN) { new CuDNNConvolutionLayer<TypeParam>(layer_param)); layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); - // After the convolution, the output should all have output values 9.1 - const TypeParam* top_data = this->blob_top_->cpu_data(); - for (int n = 0; n < this->blob_top_->num(); ++n) { - for (int c = 0; c < this->blob_top_->channels(); ++c) { - for (int h = 0; h < this->blob_top_->height(); ++h) { - for (int w = 0; w < this->blob_top_->width(); ++w) { - TypeParam data = top_data[this->blob_top_->offset(n, c, h, w)]; - EXPECT_NEAR(data, c * 9 + 0.1, 1e-4); - } - } - } + // Check against reference convolution. + const TypeParam* top_data; + const TypeParam* ref_top_data; + caffe_conv(this->blob_bottom_, convolution_param, layer->blobs(), + this->MakeReferenceTop(this->blob_top_)); + top_data = this->blob_top_->cpu_data(); + ref_top_data = this->ref_blob_top_->cpu_data(); + for (int i = 0; i < this->blob_top_->count(); ++i) { + EXPECT_NEAR(top_data[i], ref_top_data[i], 1e-4); } } From 355af161c2d04f474b5f9a26fef7c2822e3b88bc Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 18 Sep 2014 08:40:00 -0700 Subject: [PATCH 0760/2053] test convolution by random weights for robustness --- src/caffe/test/test_convolution_layer.cpp | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index 0849a3a4591..a38ad3fd1a8 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -192,8 +192,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) { convolution_param->set_kernel_size(3); convolution_param->set_stride(2); convolution_param->set_num_output(4); - convolution_param->mutable_weight_filler()->set_type("constant"); - convolution_param->mutable_weight_filler()->set_value(1); + convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("constant"); convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<Dtype> > layer( @@ -229,8 +228,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) { convolution_param->set_stride(2); convolution_param->set_num_output(3); convolution_param->set_group(3); - convolution_param->mutable_weight_filler()->set_type("constant"); - convolution_param->mutable_weight_filler()->set_value(1); + convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("constant"); convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<Dtype> > layer( @@ -468,24 +466,13 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionCuDNN) { Caffe::set_mode(Caffe::GPU); this->blob_bottom_vec_.push_back(this->blob_bottom_2_); this->blob_top_vec_.push_back(this->blob_top_2_); - shared_ptr<ConstantFiller<TypeParam> > filler; - FillerParameter filler_param; - filler_param.set_value(1.); - filler.reset(new ConstantFiller<TypeParam>(filler_param)); - filler->Fill(this->blob_bottom_); - filler_param.set_value(2.); - filler.reset(new ConstantFiller<TypeParam>(filler_param)); - filler->Fill(this->blob_bottom_2_); - this->blob_bottom_vec_.push_back(this->blob_bottom_2_); - this->blob_top_vec_.push_back(this->blob_top_2_); LayerParameter layer_param; ConvolutionParameter* convolution_param = layer_param.mutable_convolution_param(); convolution_param->set_kernel_size(3); convolution_param->set_stride(2); convolution_param->set_num_output(4); - convolution_param->mutable_weight_filler()->set_type("constant"); - convolution_param->mutable_weight_filler()->set_value(1); + convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("constant"); convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<TypeParam> > layer( @@ -521,8 +508,7 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionGroupCuDNN) { convolution_param->set_stride(2); convolution_param->set_num_output(3); convolution_param->set_group(3); - convolution_param->mutable_weight_filler()->set_type("constant"); - convolution_param->mutable_weight_filler()->set_value(1); + convolution_param->mutable_weight_filler()->set_type("gaussian"); convolution_param->mutable_bias_filler()->set_type("constant"); convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<TypeParam> > layer( From 18ca3625c6accd021a4e05e6fdb77c8b6b06dc8e Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 17 Sep 2014 23:38:31 -0700 Subject: [PATCH 0761/2053] [docs] comment ConvolutionLayer --- include/caffe/vision_layers.hpp | 62 +++++++++++++++++++++++++++++++-- src/caffe/layers/conv_layer.cpp | 58 +++++++++++++++++------------- src/caffe/layers/conv_layer.cu | 9 +++-- 3 files changed, 98 insertions(+), 31 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 8c2db8824ed..9c8656f1f2b 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -20,11 +20,49 @@ namespace caffe { * @brief Convolves the input image with a bank of learned filters, * and (optionally) adds biases. * - * TODO(dox): thorough documentation for Forward, Backward, and proto params. + * Caffe convolves by reduction to matrix multiplication. This achieves + * high-throughput and generality of input and filter dimensions but comes at + * the cost of memory for matrices. This makes use of efficiency in BLAS. + * + * The input is "im2col" transformed to a channel K' x H x W data matrix + * for multiplication with the N x K' x H x W filter matrix to yield a + * N' x H x W output matrix that is then "col2im" restored. K' is the + * input channel * kernel height * kernel width dimension of the unrolled + * inputs so that the im2col matrix has a column for each input region to + * be filtered. col2im restores the output spatial structure by rolling up + * the output channel N' columns of the output matrix. */ template <typename Dtype> class ConvolutionLayer : public Layer<Dtype> { public: + /** + * @param param provides ConvolutionParameter convolution_param, + * with ConvolutionLayer options: + * - num_output. The number of filters. + * - kernel_size / kernel_h / kernel_w. The filter dimensions, given by + * kernel_size for square filters or kernel_h and kernel_w for rectangular + * filters. + * - stride / stride_h / stride_w (\b optional, default 1). The filter + * stride, given by stride_size for equal dimensions or stride_h and stride_w + * for different strides. By default the convolution is dense with stride 1. + * - pad / pad_h / pad_w (\b optional, default 0). The zero-padding for + * convolution, given by pad for equal dimensions or pad_h and pad_w for + * different padding. Input padding is computed implicitly instead of + * actually padding. + * - group (\b optional, default 1). The number of filter groups. Group + * convolution is a method for reducing parameterization by selectively + * connecting input and output channels. The input and output channel dimensions must be divisible + * by the number of groups. For group @f$ \geq 1 @f$, the + * convolutional filters' input and output channels are separated s.t. each + * group takes 1 / group of the input channels and makes 1 / group of the + * output channels. Concretely 4 input channels, 8 output channels, and + * 2 groups separate input channels 1-2 and output channels 1-4 into the + * first group and input channels 3-4 and output channels 5-8 into the second + * group. + * - bias_term (\b optional, default true). Whether to have a bias. + * - engine: convolution has CAFFE (matrix multiplication) and CUDNN (library + * kernels + stream parallelism) engines. + */ explicit ConvolutionLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, @@ -57,8 +95,16 @@ class ConvolutionLayer : public Layer<Dtype> { int num_output_; int height_out_, width_out_; bool bias_term_; - // For the Caffe matrix multiplication convolution. - int M_, K_, N_; + + /// M_ is the channel dimension of the output for a single group, which is the + /// leading dimension of the filter matrix. + int M_; + /// K_ is the dimension of an unrolled input for a single group, which is the + /// leading dimension of the data matrix. + int K_; + /// N_ is the spatial dimension of the output, the H x W, which are the last + /// dimensions of the data and filter matrices. + int N_; Blob<Dtype> col_buffer_; Blob<Dtype> bias_multiplier_; }; @@ -67,6 +113,16 @@ class ConvolutionLayer : public Layer<Dtype> { /* * @brief cuDNN implementation of ConvolutionLayer. * Fallback to ConvolutionLayer for CPU mode. + * + * cuDNN accelerates convolution through forward kernels for filtering and bias + * plus backward kernels for the gradient w.r.t. the filters, biases, and + * inputs. Caffe + cuDNN further speeds up the computation through forward + * parallelism across groups and backward parallelism across gradients. + * + * The CUDNN engine does not have memory overhead for matrix buffers. For many + * input and filter regimes the CUDNN engine is faster than the CAFFE engine, + * but for fully-convolutional models and large inputs the CAFFE engine can be + * faster as long as it fits in memory. */ template <typename Dtype> class CuDNNConvolutionLayer : public ConvolutionLayer<Dtype> { diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 16b6a688968..769dfa671f6 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -11,6 +11,7 @@ namespace caffe { template <typename Dtype> void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + // Configure the kernel size, padding, stride, and inputs. ConvolutionParameter conv_param = this->layer_param_.convolution_param(); CHECK(!conv_param.has_kernel_size() != !(conv_param.has_kernel_h() && conv_param.has_kernel_w())) @@ -46,7 +47,6 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, stride_h_ = conv_param.stride_h(); stride_w_ = conv_param.stride_w(); } - group_ = this->layer_param_.convolution_param().group(); num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); @@ -61,28 +61,33 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK_EQ(width_, bottom[bottom_id]->width()) << "Inputs must have same width."; } + // Configure output channels, groups, and spatial dimensions. num_output_ = this->layer_param_.convolution_param().num_output(); CHECK_GT(num_output_, 0); + group_ = this->layer_param_.convolution_param().group(); CHECK_EQ(channels_ % group_, 0); - // The im2col result buffer would only hold one image at a time to avoid - // overly large memory usage. + CHECK_EQ(num_output_ % group_, 0) + << "Number of output should be multiples of group."; height_out_ = (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; width_out_ = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; - col_buffer_.Reshape( - 1, channels_ * kernel_h_ * kernel_w_, height_out_, width_out_); - // Set the parameters - CHECK_EQ(num_output_ % group_, 0) - << "Number of output should be multiples of group."; - bias_term_ = this->layer_param_.convolution_param().bias_term(); - // Figure out the dimensions for individual gemms. - M_ = num_output_ / group_; - K_ = channels_ * kernel_h_ * kernel_w_ / group_; - N_ = height_out_ * width_out_; for (int top_id = 0; top_id < top->size(); ++top_id) { (*top)[top_id]->Reshape(num_, num_output_, height_out_, width_out_); } - // Check if we need to set up the weights + // Prepare the matrix multiplication computation. + // Each input will be convolved as a single GEMM. + M_ = num_output_ / group_; + K_ = channels_ * kernel_h_ * kernel_w_ / group_; + N_ = height_out_ * width_out_; + // The im2col result buffer holds one image at a time to avoid + // overly large memory usage. + col_buffer_.Reshape( + 1, channels_ * kernel_h_ * kernel_w_, height_out_, width_out_); + // Handle the parameters: weights and biases. + // - blobs_[0] holds the filter weights + // - blobs_[1] holds the biases (optional) + bias_term_ = this->layer_param_.convolution_param().bias_term(); + // Check if we need to set up the weights. if (this->blobs_.size() > 0) { LOG(INFO) << "Skipping parameter initialization"; } else { @@ -91,14 +96,15 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, } else { this->blobs_.resize(1); } - // Intialize the weight + // Initialize and fill the weights: + // output channels x input channels per-group x kernel height x kernel width this->blobs_[0].reset(new Blob<Dtype>( num_output_, channels_ / group_, kernel_h_, kernel_w_)); - // fill the weights shared_ptr<Filler<Dtype> > weight_filler(GetFiller<Dtype>( this->layer_param_.convolution_param().weight_filler())); weight_filler->Fill(this->blobs_[0].get()); - // If necessary, initialize and fill the bias term + // If necessary, initialize and fill the biases: + // 1 x 1 x 1 x output channels if (bias_term_) { this->blobs_[1].reset(new Blob<Dtype>(1, 1, 1, num_output_)); shared_ptr<Filler<Dtype> > bias_filler(GetFiller<Dtype>( @@ -106,11 +112,12 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, bias_filler->Fill(this->blobs_[1].get()); } } - // Set up the all ones "bias multiplier" for adding bias using blas + // Set up the all ones "bias multiplier" for adding biases by BLAS if (bias_term_) { bias_multiplier_.Reshape(1, 1, 1, N_); caffe_set(N_, Dtype(1), bias_multiplier_.mutable_cpu_data()); } + // Propagate gradients to the parameters (as directed by backward pass). this->param_propagate_down_.resize(this->blobs_.size(), true); } @@ -123,21 +130,22 @@ void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, Dtype* top_data = (*top)[i]->mutable_cpu_data(); Dtype* col_data = col_buffer_.mutable_cpu_data(); const Dtype* weight = this->blobs_[0]->cpu_data(); - int weight_offset = M_ * K_; - int col_offset = K_ * N_; - int top_offset = M_ * N_; + int weight_offset = M_ * K_; // number of filter parameters in a group + int col_offset = K_ * N_; // number of values in an input region / column + int top_offset = M_ * N_; // number of values in an output region / column for (int n = 0; n < num_; ++n) { - // First, im2col + // im2col transformation: unroll input regions for filtering + // into column matrix for multplication. im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_data); - // Second, innerproduct with groups + // Take inner products for groups. for (int g = 0; g < group_; ++g) { caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); } - // third, add bias + // Add bias. if (bias_term_) { caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), @@ -201,7 +209,7 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, weight_diff + weight_offset * g); } } - // gradient w.r.t. bottom data, if necessary + // gradient w.r.t. bottom data, if necessary. if (propagate_down[i]) { if (weight == NULL) { weight = this->blobs_[0]->cpu_data(); diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 02cfdb3b80c..43f76a2368f 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -8,6 +8,7 @@ namespace caffe { +/// @brief refer to CPU forward -- the BLAS implementation is the same. template <typename Dtype> void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { @@ -20,17 +21,18 @@ void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, int col_offset = K_ * N_; int top_offset = M_ * N_; for (int n = 0; n < num_; ++n) { - // First, im2col + // im2col transformation: unroll input regions for filtering + // into column matrix for multplication. im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_data); - // Second, innerproduct with groups + // Take inner products for groups. for (int g = 0; g < group_; ++g) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); } - // third, add bias + // Add bias. if (bias_term_) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), @@ -41,6 +43,7 @@ void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } } +/// @brief refer to CPU backward -- the BLAS implementation is the same. template <typename Dtype> void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { From 9a7f0a081d066fcc9f2b86288f75bd5b0f4cb2f6 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 18 Sep 2014 09:41:19 -0700 Subject: [PATCH 0762/2053] [docs] lenet grooming --- examples/mnist/readme.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index fe6e36a12f8..ac1a0b7d7ea 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -8,7 +8,7 @@ priority: 1 # Training MNIST with Caffe -We will assume that you have caffe successfully compiled. If not, please refer to the [Installation page](/installation.html). In this tutorial, we will assume that your caffe installation is located at `CAFFE_ROOT`. +We will assume that you have Caffe successfully compiled. If not, please refer to the [Installation page](/installation.html). In this tutorial, we will assume that your Caffe installation is located at `CAFFE_ROOT`. ## Prepare Datasets @@ -29,7 +29,7 @@ The design of LeNet contains the essence of CNNs that are still used in larger m ## Define the MNIST Network -This section explains the prototxt file `lenet.prototxt` used in the MNIST demo. We assume that you are familiar with [Google Protobuf](https://developers.google.com/protocol-buffers/docs/overview), and assume that you have read the protobuf definitions used by Caffe, which can be found at `$CAFFE_ROOT/src/caffe/proto/caffe.proto`. +This section explains the `lenet_train_test.prototxt` model definition that specifies the LeNet model for MNIST handwritten digit classification. We assume that you are familiar with [Google Protobuf](https://developers.google.com/protocol-buffers/docs/overview), and assume that you have read the protobuf definitions used by Caffe, which can be found at `$CAFFE_ROOT/src/caffe/proto/caffe.proto`. Specifically, we will write a `caffe::NetParameter` (or in python, `caffe.proto.caffe_pb2.NetParameter`) protobuf. We will start by giving the network a name: @@ -176,18 +176,21 @@ The `softmax_loss` layer implements both the softmax and the multinomial logisti ### Additional Notes: Writing Layer Rules -The train and test protocol definition for the network is in the `lenet_train_test.prototxt` file, which differs from the `lenet.prototxt` file. In `lenet_train_test.prototxt` file, layers may include an additional definition, like the one below: - +Layer definitions can include rules for whether and when they are included in the network definition, like the one below: layers { - // Other layer definitions + // ...layer definition... include: { phase: TRAIN } } -This definition is a rule, which controls whether and when a layer is included in the network, based on current network's state. You can refeer to `$CAFFE_ROOT/src/caffe/proto/caffe.proto` for more information about layer's parameters. - -In the above example, this layer will be included only in `TRAIN` phase. If we change `TRAIN` with `TEST`, then this layer will be used only in test phase. Otherwise this layer will be used in both training and test phase. Thus, `lenet_train_test.prototxt` has two `DATA` layers defined (with different `batch_size`), one for the training phase and one for the testing phase. Also, there is an `ACCURACY` layer which is included only in `TEST` phase, because we want our network to report its accuracy every 100 iteration, as defined in `lenet_solver.prototxt`. +This is a rule, which controls layer inclusion in the network, based on current network's state. +You can refer to `$CAFFE_ROOT/src/caffe/proto/caffe.proto` for more information about layer rules and model schema. +In the above example, this layer will be included only in `TRAIN` phase. +If we change `TRAIN` with `TEST`, then this layer will be used only in test phase. +By default, that is without layer rules, a layer is always included in the network. +Thus, `lenet_train_test.prototxt` has two `DATA` layers defined (with different `batch_size`), one for the training phase and one for the testing phase. +Also, there is an `ACCURACY` layer which is included only in `TEST` phase for reporting the model accuracy every 100 iteration, as defined in `lenet_solver.prototxt`. ## Define the MNIST Solver From 69bf6b54107306653b0be7f6cac5ae8a1f737ebd Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Sep 2014 22:06:15 -0700 Subject: [PATCH 0763/2053] use Blob directly instead of shared_ptr for EltwiseLayer::max_idx_ This is in keeping with #742. --- include/caffe/common_layers.hpp | 2 +- src/caffe/layers/eltwise_layer.cpp | 7 +++---- src/caffe/layers/eltwise_layer.cu | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 190b5c24b05..deb4a572702 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -178,7 +178,7 @@ class EltwiseLayer : public Layer<Dtype> { EltwiseParameter_EltwiseOp op_; vector<Dtype> coeffs_; - shared_ptr<Blob<int> > max_idx_; + Blob<int> max_idx_; bool stable_prod_grad_; }; diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 46034be4784..ca157a8212a 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -40,8 +40,7 @@ void EltwiseLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, // If max operation, we will initialize the vector index part. if (this->layer_param_.eltwise_param().operation() == EltwiseParameter_EltwiseOp_MAX && top->size() == 1) { - max_idx_.reset(new Blob<int>(bottom[0]->num(), channels, - height, width)); + max_idx_.Reshape(bottom[0]->num(), channels, height, width); } } @@ -69,7 +68,7 @@ void EltwiseLayer<Dtype>::Forward_cpu( break; case EltwiseParameter_EltwiseOp_MAX: // Initialize - mask = max_idx_->mutable_cpu_data(); + mask = max_idx_.mutable_cpu_data(); caffe_set(count, -1, mask); caffe_set(count, Dtype(-FLT_MAX), top_data); // bottom 0 & 1 @@ -138,7 +137,7 @@ void EltwiseLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } break; case EltwiseParameter_EltwiseOp_MAX: - mask = max_idx_->cpu_data(); + mask = max_idx_.cpu_data(); for (int index = 0; index < count; ++index) { Dtype gradient = 0; if (mask[index] == i) { diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index c0d47fd413b..16cb6cc77e3 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -53,7 +53,7 @@ void EltwiseLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } break; case EltwiseParameter_EltwiseOp_MAX: - mask = max_idx_->mutable_gpu_data(); + mask = max_idx_.mutable_gpu_data(); // NOLINT_NEXT_LINE(whitespace/operators) MaxForward<Dtype> <<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( count, bottom[0]->gpu_data(), bottom[1]->gpu_data(), 0, top_data, mask); @@ -118,7 +118,7 @@ void EltwiseLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } break; case EltwiseParameter_EltwiseOp_MAX: - mask = max_idx_->gpu_data(); + mask = max_idx_.gpu_data(); MaxBackward<Dtype> // NOLINT_NEXT_LINE(whitespace/operators) <<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( count, top_diff, i, mask, bottom_diff); From 3194bb1ccf09efefbf9d2e47b080f723690191ad Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Sep 2014 14:43:11 -0700 Subject: [PATCH 0764/2053] add abstract Layer::Reshape, and document the new method protocol --- include/caffe/layer.hpp | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 59e6ccf4ef9..9bd42e787b3 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -48,7 +48,7 @@ class Layer { * * @param bottom the preshaped input blobs * @param top - * the allocated but unshaped output blobs, to be shaped by LayerSetUp + * the allocated but unshaped output blobs, to be shaped by Reshape * * Checks that the number of bottom and top blobs is correct. * Calls LayerSetUp to do special layer setup for individual layer types. @@ -62,22 +62,39 @@ class Layer { } /** - * @brief Does layer-specific setup: your layer should implement this. + * @brief Does layer-specific setup: your layer should implement this function + * as well as Reshape. * * @param bottom * the preshaped input blobs, whose data fields store the input data for * this layer * @param top - * the allocated but unshaped output blobs, to be initialized by LayerSetUp + * the allocated but unshaped output blobs * - * This method should be used to do layer-specific setup. At a minimum, this - * includes reshaping the empty top blobs to the shape as dictated by the - * shapes of the bottom blobs and any relevant parameters from the - * <code>layer_param_</code>. + * This method should do one-time layer specific setup. This includes reading + * and processing relevent parameters from the <code>layer_param_</code>. + * Setting up the shapes of top blobs and internal buffers should be done in + * <code>Reshape</code>, which will be called before the forward pass to + * adjust the top blob sizes. */ virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { NOT_IMPLEMENTED; } + /** + * @brief Adjust the shapes of top blobs and internal buffers to accomodate + * the shapes of the bottom blobs. + * + * @param bottom the input blobs, with the requested input shapes + * @param top the top blobs, which should be reshaped as needed + * + * This method should reshape top blobs as needed according to the shapes + * of the bottom (input) blobs, as well as reshaping any internal buffers + * and making any other necessary adjustments so that the layer can + * accomodate the bottom blobs. + */ + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) = 0; + /** * @brief Given the bottom blobs, compute the top blobs and the loss. * From 4fff9663600d2384d07593dec8077627d5693933 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 2 Jul 2014 13:08:26 -0700 Subject: [PATCH 0765/2053] don't reallocate blobs when shrinking memory use This allows nets to be reshaped very quickly (essentially for free) as long as sufficient memory has been allocated. Calling Blob::Reshape in order to free up memory becomes impossible; however, this is not a normal use case (and deleting blobs does free memory). --- include/caffe/blob.hpp | 3 ++- src/caffe/blob.cpp | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index b2a5c2f697d..c4f8b9e0f70 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -20,7 +20,7 @@ class Blob { public: Blob() : data_(), diff_(), num_(0), channels_(0), height_(0), width_(0), - count_(0) {} + count_(0), capacity_(0) {} explicit Blob(const int num, const int channels, const int height, const int width); void Reshape(const int num, const int channels, const int height, @@ -120,6 +120,7 @@ class Blob { int height_; int width_; int count_; + int capacity_; DISABLE_COPY_AND_ASSIGN(Blob); }; // class Blob diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index 9fd1232a9ad..cfffc379eb1 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -17,12 +17,10 @@ void Blob<Dtype>::Reshape(const int num, const int channels, const int height, height_ = height; width_ = width; count_ = num_ * channels_ * height_ * width_; - if (count_) { - data_.reset(new SyncedMemory(count_ * sizeof(Dtype))); - diff_.reset(new SyncedMemory(count_ * sizeof(Dtype))); - } else { - data_.reset(reinterpret_cast<SyncedMemory*>(NULL)); - diff_.reset(reinterpret_cast<SyncedMemory*>(NULL)); + if (count_ > capacity_) { + capacity_ = count_; + data_.reset(new SyncedMemory(capacity_ * sizeof(Dtype))); + diff_.reset(new SyncedMemory(capacity_ * sizeof(Dtype))); } } @@ -33,7 +31,9 @@ void Blob<Dtype>::ReshapeLike(const Blob<Dtype>& other) { template <typename Dtype> Blob<Dtype>::Blob(const int num, const int channels, const int height, - const int width) { + const int width) + // capacity_ must be initialized before calling Reshape + : capacity_(0) { Reshape(num, channels, height, width); } From 87de5edec8208f8726700c4301081cae9559a7fc Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Sep 2014 14:51:58 -0700 Subject: [PATCH 0766/2053] enable reshaping in the forward pass Note that calling Reshape when no reshape is necessary should be effectively a no-op, so this is not a performance regression. --- src/caffe/net.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index a3e7122c2c4..a8db4938a01 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -504,6 +504,7 @@ Dtype Net<Dtype>::ForwardFromTo(int start, int end) { Dtype loss = 0; for (int i = start; i <= end; ++i) { // LOG(ERROR) << "Forwarding " << layer_names_[i]; + layers_[i]->Reshape(bottom_vecs_[i], &top_vecs_[i]); Dtype layer_loss = layers_[i]->Forward(bottom_vecs_[i], &top_vecs_[i]); loss += layer_loss; if (debug_info_) { ForwardDebugInfo(i); } From 5ce519c44c34e4c14193220d7aea5fdf760c5231 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Sep 2014 21:51:58 -0700 Subject: [PATCH 0767/2053] separate setTensor4dDesc from createTensor4dDesc This will make it possible to add reshaping to cuDNN layers. --- include/caffe/util/cudnn.hpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/include/caffe/util/cudnn.hpp b/include/caffe/util/cudnn.hpp index e7ddea73e6b..aef3e21676d 100644 --- a/include/caffe/util/cudnn.hpp +++ b/include/caffe/util/cudnn.hpp @@ -56,22 +56,26 @@ template<> class dataType<double> { }; template <typename Dtype> -inline void createTensor4dDesc(cudnnTensor4dDescriptor_t* desc, +inline void createTensor4dDesc(cudnnTensor4dDescriptor_t* desc) { + CUDNN_CHECK(cudnnCreateTensor4dDescriptor(desc)); +} + +template <typename Dtype> +inline void setTensor4dDesc(cudnnTensor4dDescriptor_t* desc, int n, int c, int h, int w, int stride_n, int stride_c, int stride_h, int stride_w) { - CUDNN_CHECK(cudnnCreateTensor4dDescriptor(desc)); CUDNN_CHECK(cudnnSetTensor4dDescriptorEx(*desc, dataType<Dtype>::type, n, c, h, w, stride_n, stride_c, stride_h, stride_w)); } template <typename Dtype> -inline void createTensor4dDesc(cudnnTensor4dDescriptor_t* desc, +inline void setTensor4dDesc(cudnnTensor4dDescriptor_t* desc, int n, int c, int h, int w) { const int stride_w = 1; const int stride_h = w * stride_w; const int stride_c = h * stride_h; const int stride_n = c * stride_c; - createTensor4dDesc<Dtype>(desc, n, c, h, w, + setTensor4dDesc<Dtype>(desc, n, c, h, w, stride_n, stride_c, stride_h, stride_w); } From d7e8f2a3a377cd3f5c07c59056df3c6c3315cab0 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Sep 2014 23:15:22 -0700 Subject: [PATCH 0768/2053] separate setConvolutionDesc from createConvolutionDesc --- include/caffe/util/cudnn.hpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/include/caffe/util/cudnn.hpp b/include/caffe/util/cudnn.hpp index aef3e21676d..aca5bd713fc 100644 --- a/include/caffe/util/cudnn.hpp +++ b/include/caffe/util/cudnn.hpp @@ -88,10 +88,14 @@ inline void createFilterDesc(cudnnFilterDescriptor_t* desc, } template <typename Dtype> -inline void createConvolutionDesc(cudnnConvolutionDescriptor_t* conv, +inline void createConvolutionDesc(cudnnConvolutionDescriptor_t* conv) { + CUDNN_CHECK(cudnnCreateConvolutionDescriptor(conv)); +} + +template <typename Dtype> +inline void setConvolutionDesc(cudnnConvolutionDescriptor_t* conv, cudnnTensor4dDescriptor_t bottom, cudnnFilterDescriptor_t filter, int pad_h, int pad_w, int stride_h, int stride_w) { - CUDNN_CHECK(cudnnCreateConvolutionDescriptor(conv)); CUDNN_CHECK(cudnnSetConvolutionDescriptor(*conv, bottom, filter, pad_h, pad_w, stride_h, stride_w, 1, 1, CUDNN_CROSS_CORRELATION)); } From 4b34c72254a891a8e14c0bd9dcb0eeac23b80ce7 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Sep 2014 14:57:07 -0700 Subject: [PATCH 0769/2053] split off Reshape for data layers --- include/caffe/data_layers.hpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 15158029436..8e2637b0658 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -40,6 +40,9 @@ class BaseDataLayer : public Layer<Dtype> { vector<Blob<Dtype>*>* top); virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) {} + // Data layers have no bottoms, so reshaping is trivial. + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) {} virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) {} @@ -134,6 +137,9 @@ class DummyDataLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + // Data layers have no bottoms, so reshaping is trivial. + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) {} virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_DUMMY_DATA; @@ -166,6 +172,9 @@ class HDF5DataLayer : public Layer<Dtype> { virtual ~HDF5DataLayer(); virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + // Data layers have no bottoms, so reshaping is trivial. + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) {} virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_HDF5_DATA; @@ -204,6 +213,9 @@ class HDF5OutputLayer : public Layer<Dtype> { virtual ~HDF5OutputLayer(); virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) {} + // Data layers have no bottoms, so reshaping is trivial. + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) {} virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_HDF5_OUTPUT; From 62bc0a8c1c9c8cdf4c6ff8638c465a9e739faf0f Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Sep 2014 21:30:05 -0700 Subject: [PATCH 0770/2053] split off Reshape for loss layers --- include/caffe/loss_layers.hpp | 14 ++++++++++++-- src/caffe/layers/accuracy_layer.cpp | 5 +++++ src/caffe/layers/euclidean_loss_layer.cpp | 4 ++-- src/caffe/layers/infogain_loss_layer.cpp | 16 ++++++++++++---- src/caffe/layers/loss_layer.cpp | 11 ++++++++--- .../layers/multinomial_logistic_loss_layer.cpp | 4 ++-- .../layers/sigmoid_cross_entropy_loss_layer.cpp | 11 +++++++++-- src/caffe/layers/softmax_loss_layer.cpp | 7 +++++++ 8 files changed, 57 insertions(+), 15 deletions(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index a29c445d51e..b95e919c25f 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -34,6 +34,8 @@ class AccuracyLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_ACCURACY; @@ -97,6 +99,8 @@ class LossLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp( const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual inline int ExactNumBottomBlobs() const { return 2; } @@ -148,7 +152,7 @@ class EuclideanLossLayer : public LossLayer<Dtype> { public: explicit EuclideanLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param), diff_() {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { @@ -339,6 +343,8 @@ class InfogainLossLayer : public LossLayer<Dtype> { : LossLayer<Dtype>(param), infogain_() {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); // InfogainLossLayer takes 2-3 bottom Blobs; if there are 3 the third should // be the infogain matrix. (Otherwise the infogain matrix is loaded from a @@ -428,7 +434,7 @@ class MultinomialLogisticLossLayer : public LossLayer<Dtype> { public: explicit MultinomialLogisticLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { @@ -510,6 +516,8 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { sigmoid_output_(new Blob<Dtype>()) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS; @@ -606,6 +614,8 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { softmax_layer_(new SoftmaxLayer<Dtype>(param)) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SOFTMAX_LOSS; diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 062e927183b..3e69bc84faa 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -14,6 +14,11 @@ template <typename Dtype> void AccuracyLayer<Dtype>::LayerSetUp( const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { top_k_ = this->layer_param_.accuracy_param().top_k(); +} + +template <typename Dtype> +void AccuracyLayer<Dtype>::Reshape( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; CHECK_LE(top_k_, bottom[0]->count() / bottom[0]->num()) diff --git a/src/caffe/layers/euclidean_loss_layer.cpp b/src/caffe/layers/euclidean_loss_layer.cpp index be83601f5a1..1b4a13d2ddc 100644 --- a/src/caffe/layers/euclidean_loss_layer.cpp +++ b/src/caffe/layers/euclidean_loss_layer.cpp @@ -8,9 +8,9 @@ namespace caffe { template <typename Dtype> -void EuclideanLossLayer<Dtype>::LayerSetUp( +void EuclideanLossLayer<Dtype>::Reshape( const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - LossLayer<Dtype>::LayerSetUp(bottom, top); + LossLayer<Dtype>::Reshape(bottom, top); CHECK_EQ(bottom[0]->channels(), bottom[1]->channels()); CHECK_EQ(bottom[0]->height(), bottom[1]->height()); CHECK_EQ(bottom[0]->width(), bottom[1]->width()); diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index 91dd89240e4..894cb69811a 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -14,10 +14,6 @@ template <typename Dtype> void InfogainLossLayer<Dtype>::LayerSetUp( const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { LossLayer<Dtype>::LayerSetUp(bottom, top); - CHECK_EQ(bottom[1]->channels(), 1); - CHECK_EQ(bottom[1]->height(), 1); - CHECK_EQ(bottom[1]->width(), 1); - Blob<Dtype>* infogain = NULL; if (bottom.size() < 3) { CHECK(this->layer_param_.infogain_loss_param().has_source()) << "Infogain matrix source must be specified."; @@ -25,10 +21,22 @@ void InfogainLossLayer<Dtype>::LayerSetUp( ReadProtoFromBinaryFile( this->layer_param_.infogain_loss_param().source(), &blob_proto); infogain_.FromProto(blob_proto); + } +} + +template <typename Dtype> +void InfogainLossLayer<Dtype>::Reshape( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + LossLayer<Dtype>::Reshape(bottom, top); + Blob<Dtype>* infogain = NULL; + if (bottom.size() < 3) { infogain = &infogain_; } else { infogain = bottom[2]; } + CHECK_EQ(bottom[1]->channels(), 1); + CHECK_EQ(bottom[1]->height(), 1); + CHECK_EQ(bottom[1]->width(), 1); const int num = bottom[0]->num(); const int dim = bottom[0]->count() / num; CHECK_EQ(infogain->num(), 1); diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index 89d8c91e342..9eb9dbd5c5b 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -13,15 +13,20 @@ namespace caffe { template <typename Dtype> void LossLayer<Dtype>::LayerSetUp( const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - CHECK_EQ(bottom[0]->num(), bottom[1]->num()) - << "The data and label should have the same number."; - (*top)[0]->Reshape(1, 1, 1, 1); // LossLayers have a non-zero (1) loss by default. if (this->layer_param_.loss_weight_size() == 0) { this->layer_param_.add_loss_weight(Dtype(1)); } } +template <typename Dtype> +void LossLayer<Dtype>::Reshape( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + CHECK_EQ(bottom[0]->num(), bottom[1]->num()) + << "The data and label should have the same number."; + (*top)[0]->Reshape(1, 1, 1, 1); +} + INSTANTIATE_CLASS(LossLayer); } // namespace caffe diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index cf96bfe73ed..c0fe1966a4d 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -11,9 +11,9 @@ namespace caffe { template <typename Dtype> -void MultinomialLogisticLossLayer<Dtype>::LayerSetUp( +void MultinomialLogisticLossLayer<Dtype>::Reshape( const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - LossLayer<Dtype>::LayerSetUp(bottom, top); + LossLayer<Dtype>::Reshape(bottom, top); CHECK_EQ(bottom[1]->channels(), 1); CHECK_EQ(bottom[1]->height(), 1); CHECK_EQ(bottom[1]->width(), 1); diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index 6e440a820c4..6a48099ae8b 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -12,8 +12,6 @@ template <typename Dtype> void SigmoidCrossEntropyLossLayer<Dtype>::LayerSetUp( const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { LossLayer<Dtype>::LayerSetUp(bottom, top); - CHECK_EQ(bottom[0]->count(), bottom[1]->count()) << - "SIGMOID_CROSS_ENTROPY_LOSS layer inputs must have the same count."; sigmoid_bottom_vec_.clear(); sigmoid_bottom_vec_.push_back(bottom[0]); sigmoid_top_vec_.clear(); @@ -21,6 +19,15 @@ void SigmoidCrossEntropyLossLayer<Dtype>::LayerSetUp( sigmoid_layer_->SetUp(sigmoid_bottom_vec_, &sigmoid_top_vec_); } +template <typename Dtype> +void SigmoidCrossEntropyLossLayer<Dtype>::Reshape( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + LossLayer<Dtype>::Reshape(bottom, top); + CHECK_EQ(bottom[0]->count(), bottom[1]->count()) << + "SIGMOID_CROSS_ENTROPY_LOSS layer inputs must have the same count."; + sigmoid_layer_->Reshape(sigmoid_bottom_vec_, &sigmoid_top_vec_); +} + template <typename Dtype> void SigmoidCrossEntropyLossLayer<Dtype>::Forward_cpu( const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index e07c8dc9df9..55392c37ca0 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -17,6 +17,13 @@ void SoftmaxWithLossLayer<Dtype>::LayerSetUp( softmax_top_vec_.clear(); softmax_top_vec_.push_back(&prob_); softmax_layer_->SetUp(softmax_bottom_vec_, &softmax_top_vec_); +} + +template <typename Dtype> +void SoftmaxWithLossLayer<Dtype>::Reshape( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + LossLayer<Dtype>::Reshape(bottom, top); + softmax_layer_->Reshape(softmax_bottom_vec_, &softmax_top_vec_); if (top->size() >= 2) { // softmax output (*top)[1]->ReshapeLike(*bottom[0]); From 256209da4def9f54a6401c19802501bde5cbf1ba Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Sep 2014 21:48:51 -0700 Subject: [PATCH 0771/2053] split off Reshape for neuron layers --- include/caffe/neuron_layers.hpp | 10 +++++++++- src/caffe/layers/cudnn_relu_layer.cpp | 12 ++++++++++-- src/caffe/layers/cudnn_sigmoid_layer.cpp | 12 ++++++++++-- src/caffe/layers/cudnn_tanh_layer.cpp | 12 ++++++++++-- src/caffe/layers/dropout_layer.cpp | 12 +++++++++--- src/caffe/layers/neuron_layer.cpp | 8 ++------ 6 files changed, 50 insertions(+), 16 deletions(-) diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 36acf96e5af..0968a2007dc 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -26,7 +26,7 @@ class NeuronLayer : public Layer<Dtype> { public: explicit NeuronLayer(const LayerParameter& param) : Layer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { @@ -170,6 +170,8 @@ class DropoutLayer : public NeuronLayer<Dtype> { : NeuronLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_DROPOUT; @@ -367,6 +369,8 @@ class CuDNNReLULayer : public ReLULayer<Dtype> { : ReLULayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual ~CuDNNReLULayer(); protected: @@ -449,6 +453,8 @@ class CuDNNSigmoidLayer : public SigmoidLayer<Dtype> { : SigmoidLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual ~CuDNNSigmoidLayer(); protected: @@ -533,6 +539,8 @@ class CuDNNTanHLayer : public TanHLayer<Dtype> { : TanHLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual ~CuDNNTanHLayer(); protected: diff --git a/src/caffe/layers/cudnn_relu_layer.cpp b/src/caffe/layers/cudnn_relu_layer.cpp index f8bf77f1844..083868f572f 100644 --- a/src/caffe/layers/cudnn_relu_layer.cpp +++ b/src/caffe/layers/cudnn_relu_layer.cpp @@ -13,12 +13,20 @@ void CuDNNReLULayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, ReLULayer<Dtype>::LayerSetUp(bottom, top); // initialize cuDNN CUDNN_CHECK(cudnnCreate(&handle_)); + cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); + cudnn::createTensor4dDesc<Dtype>(&top_desc_); +} + +template <typename Dtype> +void CuDNNReLULayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + ReLULayer<Dtype>::Reshape(bottom, top); const int N = bottom[0]->num(); const int K = bottom[0]->channels(); const int H = bottom[0]->height(); const int W = bottom[0]->width(); - cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); - cudnn::createTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); + cudnn::setTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); + cudnn::setTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); } template <typename Dtype> diff --git a/src/caffe/layers/cudnn_sigmoid_layer.cpp b/src/caffe/layers/cudnn_sigmoid_layer.cpp index 488c7545dba..3fe800db6f4 100644 --- a/src/caffe/layers/cudnn_sigmoid_layer.cpp +++ b/src/caffe/layers/cudnn_sigmoid_layer.cpp @@ -13,12 +13,20 @@ void CuDNNSigmoidLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, SigmoidLayer<Dtype>::LayerSetUp(bottom, top); // initialize cuDNN CUDNN_CHECK(cudnnCreate(&handle_)); + cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); + cudnn::createTensor4dDesc<Dtype>(&top_desc_); +} + +template <typename Dtype> +void CuDNNSigmoidLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + SigmoidLayer<Dtype>::Reshape(bottom, top); const int N = bottom[0]->num(); const int K = bottom[0]->channels(); const int H = bottom[0]->height(); const int W = bottom[0]->width(); - cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); - cudnn::createTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); + cudnn::setTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); + cudnn::setTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); } template <typename Dtype> diff --git a/src/caffe/layers/cudnn_tanh_layer.cpp b/src/caffe/layers/cudnn_tanh_layer.cpp index 32b6611e40b..7a5c06f6596 100644 --- a/src/caffe/layers/cudnn_tanh_layer.cpp +++ b/src/caffe/layers/cudnn_tanh_layer.cpp @@ -13,12 +13,20 @@ void CuDNNTanHLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, TanHLayer<Dtype>::LayerSetUp(bottom, top); // initialize cuDNN CUDNN_CHECK(cudnnCreate(&handle_)); + cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); + cudnn::createTensor4dDesc<Dtype>(&top_desc_); +} + +template <typename Dtype> +void CuDNNTanHLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + TanHLayer<Dtype>::Reshape(bottom, top); const int N = bottom[0]->num(); const int K = bottom[0]->channels(); const int H = bottom[0]->height(); const int W = bottom[0]->width(); - cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); - cudnn::createTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); + cudnn::setTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); + cudnn::setTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); } template <typename Dtype> diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index 52537d1aba9..47feb1d2543 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -14,9 +14,6 @@ template <typename Dtype> void DropoutLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { NeuronLayer<Dtype>::LayerSetUp(bottom, top); - // Set up the cache for random number generation - rand_vec_.Reshape(bottom[0]->num(), bottom[0]->channels(), - bottom[0]->height(), bottom[0]->width()); threshold_ = this->layer_param_.dropout_param().dropout_ratio(); DCHECK(threshold_ > 0.); DCHECK(threshold_ < 1.); @@ -24,6 +21,15 @@ void DropoutLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, uint_thres_ = static_cast<unsigned int>(UINT_MAX * threshold_); } +template <typename Dtype> +void DropoutLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + NeuronLayer<Dtype>::Reshape(bottom, top); + // Set up the cache for random number generation + rand_vec_.Reshape(bottom[0]->num(), bottom[0]->channels(), + bottom[0]->height(), bottom[0]->width()); +} + template <typename Dtype> void DropoutLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { diff --git a/src/caffe/layers/neuron_layer.cpp b/src/caffe/layers/neuron_layer.cpp index eff7948a616..c28e36ea23b 100644 --- a/src/caffe/layers/neuron_layer.cpp +++ b/src/caffe/layers/neuron_layer.cpp @@ -6,13 +6,9 @@ namespace caffe { template <typename Dtype> -void NeuronLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, +void NeuronLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - // NeuronLayer allows in-place computations. If the computation is not - // in-place, we will need to initialize the top blob. - if ((*top)[0] != bottom[0]) { - (*top)[0]->ReshapeLike(*bottom[0]); - } + (*top)[0]->ReshapeLike(*bottom[0]); } INSTANTIATE_CLASS(NeuronLayer); From 07d6246adf02f8a9f674698b66ca3720c22e2443 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Sep 2014 22:42:45 -0700 Subject: [PATCH 0772/2053] split off Reshape for common layers --- include/caffe/common_layers.hpp | 22 +++++++++++++++++----- src/caffe/layers/argmax_layer.cpp | 5 +++++ src/caffe/layers/concat_layer.cpp | 4 ++++ src/caffe/layers/cudnn_softmax_layer.cpp | 12 ++++++++++-- src/caffe/layers/eltwise_layer.cpp | 23 ++++++++++++++--------- src/caffe/layers/flatten_layer.cpp | 2 +- src/caffe/layers/inner_product_layer.cpp | 19 +++++++++++++------ src/caffe/layers/mvn_layer.cpp | 2 +- src/caffe/layers/slice_layer.cpp | 6 +++++- src/caffe/layers/softmax_layer.cpp | 2 +- src/caffe/layers/split_layer.cpp | 2 +- 11 files changed, 72 insertions(+), 27 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index deb4a572702..1f945ca34e9 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -40,6 +40,8 @@ class ArgMaxLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_ARGMAX; @@ -81,6 +83,8 @@ class ConcatLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_CONCAT; @@ -159,6 +163,8 @@ class EltwiseLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_ELTWISE; @@ -198,7 +204,7 @@ class FlattenLayer : public Layer<Dtype> { public: explicit FlattenLayer(const LayerParameter& param) : Layer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { @@ -251,6 +257,8 @@ class InnerProductLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_INNER_PRODUCT; @@ -285,7 +293,7 @@ class MVNLayer : public Layer<Dtype> { public: explicit MVNLayer(const LayerParameter& param) : Layer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { @@ -319,7 +327,7 @@ class SilenceLayer : public Layer<Dtype> { public: explicit SilenceLayer(const LayerParameter& param) : Layer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) {} virtual inline LayerParameter_LayerType type() const { @@ -351,7 +359,7 @@ class SoftmaxLayer : public Layer<Dtype> { public: explicit SoftmaxLayer(const LayerParameter& param) : Layer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { @@ -388,6 +396,8 @@ class CuDNNSoftmaxLayer : public SoftmaxLayer<Dtype> { : SoftmaxLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual ~CuDNNSoftmaxLayer(); protected: @@ -413,7 +423,7 @@ class SplitLayer : public Layer<Dtype> { public: explicit SplitLayer(const LayerParameter& param) : Layer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { @@ -448,6 +458,8 @@ class SliceLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SLICE; diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index 4b67f24cb9a..0d1a107257b 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -16,6 +16,11 @@ void ArgMaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK_GE(top_k_, 1) << " top k must not be less than 1."; CHECK_LE(top_k_, bottom[0]->count() / bottom[0]->num()) << "top_k must be less than or equal to the number of classes."; +} + +template <typename Dtype> +void ArgMaxLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { if (out_max_val_) { // Produces max_ind and max_val (*top)[0]->Reshape(bottom[0]->num(), 2, top_k_, 1); diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index 73d28b17850..10a11f1bb7c 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -14,7 +14,11 @@ void ConcatLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, "concat_dim should be >= 0"; CHECK_LE(concat_dim_, 1) << "For now concat_dim <=1, it can only concat num and channels"; +} +template <typename Dtype> +void ConcatLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { // Initialize with the first blob. count_ = bottom[0]->count(); num_ = bottom[0]->num(); diff --git a/src/caffe/layers/cudnn_softmax_layer.cpp b/src/caffe/layers/cudnn_softmax_layer.cpp index 6dab2d6ac32..79ba5237ae3 100644 --- a/src/caffe/layers/cudnn_softmax_layer.cpp +++ b/src/caffe/layers/cudnn_softmax_layer.cpp @@ -17,12 +17,20 @@ void CuDNNSoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, SoftmaxLayer<Dtype>::LayerSetUp(bottom, top); // Initialize CUDNN. CUDNN_CHECK(cudnnCreate(&handle_)); + cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); + cudnn::createTensor4dDesc<Dtype>(&top_desc_); +} + +template <typename Dtype> +void CuDNNSoftmaxLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + SoftmaxLayer<Dtype>::Reshape(bottom, top); int N = bottom[0]->num(); int K = bottom[0]->channels(); int H = bottom[0]->height(); int W = bottom[0]->width(); - cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); - cudnn::createTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); + cudnn::setTensor4dDesc<Dtype>(&bottom_desc_, N, K, H, W); + cudnn::setTensor4dDesc<Dtype>(&top_desc_, N, K, H, W); } template <typename Dtype> diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index ca157a8212a..569560f97d3 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -17,6 +17,20 @@ void EltwiseLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, == EltwiseParameter_EltwiseOp_PROD && this->layer_param().eltwise_param().coeff_size())) << "Eltwise layer only takes coefficients for summation."; + op_ = this->layer_param_.eltwise_param().operation(); + // Blob-wise coefficients for the elementwise operation. + coeffs_ = vector<Dtype>(bottom.size(), 1); + if (this->layer_param().eltwise_param().coeff_size()) { + for (int i = 0; i < bottom.size(); ++i) { + coeffs_[i] = this->layer_param().eltwise_param().coeff(i); + } + } + stable_prod_grad_ = this->layer_param_.eltwise_param().stable_prod_grad(); +} + +template <typename Dtype> +void EltwiseLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { const int num = bottom[0]->num(); const int channels = bottom[0]->channels(); const int height = bottom[0]->height(); @@ -28,15 +42,6 @@ void EltwiseLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK_EQ(width, bottom[i]->width()); } (*top)[0]->Reshape(num, channels, height, width); - op_ = this->layer_param_.eltwise_param().operation(); - // Blob-wise coefficients for the elementwise operation. - coeffs_ = vector<Dtype>(bottom.size(), 1); - if (this->layer_param().eltwise_param().coeff_size()) { - for (int i = 0; i < bottom.size(); ++i) { - coeffs_[i] = this->layer_param().eltwise_param().coeff(i); - } - } - stable_prod_grad_ = this->layer_param_.eltwise_param().stable_prod_grad(); // If max operation, we will initialize the vector index part. if (this->layer_param_.eltwise_param().operation() == EltwiseParameter_EltwiseOp_MAX && top->size() == 1) { diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index 8c1fc74e159..65310cd1669 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -7,7 +7,7 @@ namespace caffe { template <typename Dtype> -void FlattenLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, +void FlattenLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { int channels_out = bottom[0]->channels() * bottom[0]->height() * bottom[0]->width(); diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index 3ba0e1f29f6..ecd05a030db 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -14,11 +14,8 @@ void InnerProductLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { const int num_output = this->layer_param_.inner_product_param().num_output(); bias_term_ = this->layer_param_.inner_product_param().bias_term(); - // Figure out the dimensions - M_ = bottom[0]->num(); - K_ = bottom[0]->count() / bottom[0]->num(); N_ = num_output; - (*top)[0]->Reshape(bottom[0]->num(), num_output, 1, 1); + K_ = bottom[0]->count() / bottom[0]->num(); // Check if we need to set up the weights if (this->blobs_.size() > 0) { LOG(INFO) << "Skipping parameter initialization"; @@ -42,12 +39,22 @@ void InnerProductLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, bias_filler->Fill(this->blobs_[1].get()); } } // parameter initialization - // Setting up the bias multiplier + this->param_propagate_down_.resize(this->blobs_.size(), true); +} + +template <typename Dtype> +void InnerProductLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + // Figure out the dimensions + M_ = bottom[0]->num(); + CHECK_EQ(bottom[0]->count() / bottom[0]->num(), K_) << "Input size " + "incompatible with inner product parameters."; + (*top)[0]->Reshape(bottom[0]->num(), N_, 1, 1); + // Set up the bias multiplier if (bias_term_) { bias_multiplier_.Reshape(1, 1, 1, M_); caffe_set(M_, Dtype(1), bias_multiplier_.mutable_cpu_data()); } - this->param_propagate_down_.resize(this->blobs_.size(), true); } template <typename Dtype> diff --git a/src/caffe/layers/mvn_layer.cpp b/src/caffe/layers/mvn_layer.cpp index 4d90702fd55..6a57b3ea7fc 100644 --- a/src/caffe/layers/mvn_layer.cpp +++ b/src/caffe/layers/mvn_layer.cpp @@ -8,7 +8,7 @@ namespace caffe { template <typename Dtype> -void MVNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, +void MVNLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp index 9fa127528a0..ed679a9169e 100644 --- a/src/caffe/layers/slice_layer.cpp +++ b/src/caffe/layers/slice_layer.cpp @@ -18,6 +18,11 @@ void SliceLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, std::copy(slice_param.slice_point().begin(), slice_param.slice_point().end(), std::back_inserter(slice_point_)); +} + +template <typename Dtype> +void SliceLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { count_ = 0; num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); @@ -50,7 +55,6 @@ void SliceLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, count_ += (*top)[i]->count(); } } - } else { if (slice_dim_ == 0) { CHECK_EQ(num_ % top->size(), 0) diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 952db74a4b6..60668a3f8ce 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -8,7 +8,7 @@ namespace caffe { template <typename Dtype> -void SoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, +void SoftmaxLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index 3bed347ea6c..40d3600ff17 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -7,7 +7,7 @@ namespace caffe { template <typename Dtype> -void SplitLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, +void SplitLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { count_ = bottom[0]->count(); for (int i = 0; i < top->size(); ++i) { From 6c63b8ce0835590caf58abe155ad3cbeca476576 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Sep 2014 23:31:33 -0700 Subject: [PATCH 0773/2053] split off Reshape for vision layers Note that we are dropping some checks from LRN layer. However, these checks are fairly redundant; something is very wrong if these layers are producing top blobs that are different sizes than their inputs, and tests are the right place to catch that. The thing that really should be checked (that isn't) is that that local_size needs to be odd; this will be added in a future commit. --- include/caffe/vision_layers.hpp | 12 ++ src/caffe/layers/conv_layer.cpp | 75 +++++++------ src/caffe/layers/cudnn_conv_layer.cpp | 45 +++++--- src/caffe/layers/cudnn_pooling_layer.cpp | 16 ++- src/caffe/layers/im2col_layer.cpp | 5 + src/caffe/layers/lrn_layer.cpp | 134 +++++++++++------------ src/caffe/layers/pooling_layer.cpp | 5 + 7 files changed, 170 insertions(+), 122 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 9c8656f1f2b..1e7f3fcb297 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -67,6 +67,8 @@ class ConvolutionLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_CONVOLUTION; @@ -131,6 +133,8 @@ class CuDNNConvolutionLayer : public ConvolutionLayer<Dtype> { : ConvolutionLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual ~CuDNNConvolutionLayer(); protected: @@ -163,6 +167,8 @@ class Im2colLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_IM2COL; @@ -203,6 +209,8 @@ class LRNLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_LRN; @@ -278,6 +286,8 @@ class PoolingLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_POOLING; @@ -323,6 +333,8 @@ class CuDNNPoolingLayer : public PoolingLayer<Dtype> { : PoolingLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top); virtual ~CuDNNPoolingLayer(); protected: diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 769dfa671f6..58918fd4baf 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -47,47 +47,18 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, stride_h_ = conv_param.stride_h(); stride_w_ = conv_param.stride_w(); } - num_ = bottom[0]->num(); + // Configure output channels and groups. channels_ = bottom[0]->channels(); - height_ = bottom[0]->height(); - width_ = bottom[0]->width(); - // TODO: generalize to handle inputs of different shapes. - for (int bottom_id = 1; bottom_id < bottom.size(); ++bottom_id) { - CHECK_EQ(num_, bottom[bottom_id]->num()) << "Inputs must have same num."; - CHECK_EQ(channels_, bottom[bottom_id]->channels()) - << "Inputs must have same channels."; - CHECK_EQ(height_, bottom[bottom_id]->height()) - << "Inputs must have same height."; - CHECK_EQ(width_, bottom[bottom_id]->width()) - << "Inputs must have same width."; - } - // Configure output channels, groups, and spatial dimensions. num_output_ = this->layer_param_.convolution_param().num_output(); CHECK_GT(num_output_, 0); group_ = this->layer_param_.convolution_param().group(); CHECK_EQ(channels_ % group_, 0); CHECK_EQ(num_output_ % group_, 0) << "Number of output should be multiples of group."; - height_out_ = - (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; - width_out_ = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; - for (int top_id = 0; top_id < top->size(); ++top_id) { - (*top)[top_id]->Reshape(num_, num_output_, height_out_, width_out_); - } - // Prepare the matrix multiplication computation. - // Each input will be convolved as a single GEMM. - M_ = num_output_ / group_; - K_ = channels_ * kernel_h_ * kernel_w_ / group_; - N_ = height_out_ * width_out_; - // The im2col result buffer holds one image at a time to avoid - // overly large memory usage. - col_buffer_.Reshape( - 1, channels_ * kernel_h_ * kernel_w_, height_out_, width_out_); // Handle the parameters: weights and biases. // - blobs_[0] holds the filter weights // - blobs_[1] holds the biases (optional) bias_term_ = this->layer_param_.convolution_param().bias_term(); - // Check if we need to set up the weights. if (this->blobs_.size() > 0) { LOG(INFO) << "Skipping parameter initialization"; } else { @@ -112,16 +83,54 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, bias_filler->Fill(this->blobs_[1].get()); } } + // Propagate gradients to the parameters (as directed by backward pass). + this->param_propagate_down_.resize(this->blobs_.size(), true); +} + +template <typename Dtype> +void ConvolutionLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + num_ = bottom[0]->num(); + height_ = bottom[0]->height(); + width_ = bottom[0]->width(); + CHECK_EQ(bottom[0]->channels(), channels_) << "Input size incompatible with" + " convolution kernel."; + // TODO: generalize to handle inputs of different shapes. + for (int bottom_id = 1; bottom_id < bottom.size(); ++bottom_id) { + CHECK_EQ(num_, bottom[bottom_id]->num()) << "Inputs must have same num."; + CHECK_EQ(channels_, bottom[bottom_id]->channels()) + << "Inputs must have same channels."; + CHECK_EQ(height_, bottom[bottom_id]->height()) + << "Inputs must have same height."; + CHECK_EQ(width_, bottom[bottom_id]->width()) + << "Inputs must have same width."; + } + // Shape the tops. + height_out_ = + (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; + width_out_ = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; + for (int top_id = 0; top_id < top->size(); ++top_id) { + (*top)[top_id]->Reshape(num_, num_output_, height_out_, width_out_); + } + // Prepare the matrix multiplication computation. + // Each input will be convolved as a single GEMM. + M_ = num_output_ / group_; + K_ = channels_ * kernel_h_ * kernel_w_ / group_; + N_ = height_out_ * width_out_; + // The im2col result buffer will only hold one image at a time to avoid + // overly large memory usage. + col_buffer_.Reshape( + 1, channels_ * kernel_h_ * kernel_w_, height_out_, width_out_); + for (int top_id = 0; top_id < top->size(); ++top_id) { + (*top)[top_id]->Reshape(num_, num_output_, height_out_, width_out_); + } // Set up the all ones "bias multiplier" for adding biases by BLAS if (bias_term_) { bias_multiplier_.Reshape(1, 1, 1, N_); caffe_set(N_, Dtype(1), bias_multiplier_.mutable_cpu_data()); } - // Propagate gradients to the parameters (as directed by backward pass). - this->param_propagate_down_.resize(this->blobs_.size(), true); } - template <typename Dtype> void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { diff --git a/src/caffe/layers/cudnn_conv_layer.cpp b/src/caffe/layers/cudnn_conv_layer.cpp index eaacddcb0cc..137bbab1976 100644 --- a/src/caffe/layers/cudnn_conv_layer.cpp +++ b/src/caffe/layers/cudnn_conv_layer.cpp @@ -21,7 +21,7 @@ template <typename Dtype> void CuDNNConvolutionLayer<Dtype>::LayerSetUp( const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { ConvolutionLayer<Dtype>::LayerSetUp(bottom, top); - // Initialize CUDA streams and cuNN. + // Initialize CUDA streams and cuDNN. stream_ = new cudaStream_t[this->group_ * CUDNN_STREAMS_PER_GROUP]; handle_ = new cudnnHandle_t[this->group_ * CUDNN_STREAMS_PER_GROUP]; @@ -32,10 +32,6 @@ void CuDNNConvolutionLayer<Dtype>::LayerSetUp( } // Set the indexing parameters. - bottom_offset_ = (this->channels_ / this->group_) - * this->height_ * this->width_; - top_offset_ = (this->num_output_ / this->group_) - * this->height_out_ * this->width_out_; weight_offset_ = (this->num_output_ / this->group_) * (this->channels_ / this->group_) * this->kernel_h_ * this->kernel_w_; bias_offset_ = (this->num_output_ / this->group_); @@ -48,33 +44,54 @@ void CuDNNConvolutionLayer<Dtype>::LayerSetUp( // Create tensor descriptor(s) for data and corresponding convolution(s). for (int i = 0; i < bottom.size(); i++) { cudnnTensor4dDescriptor_t bottom_desc; - cudnn::createTensor4dDesc<Dtype>(&bottom_desc, + cudnn::createTensor4dDesc<Dtype>(&bottom_desc); + bottom_descs_.push_back(bottom_desc); + cudnnTensor4dDescriptor_t top_desc; + cudnn::createTensor4dDesc<Dtype>(&top_desc); + top_descs_.push_back(top_desc); + cudnnConvolutionDescriptor_t conv_desc; + cudnn::createConvolutionDesc<Dtype>(&conv_desc); + conv_descs_.push_back(conv_desc); + } + + // Tensor descriptor for bias. + if (this->bias_term_) { + cudnn::createTensor4dDesc<Dtype>(&bias_desc_); + } +} + +template <typename Dtype> +void CuDNNConvolutionLayer<Dtype>::Reshape( + const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + ConvolutionLayer<Dtype>::Reshape(bottom, top); + bottom_offset_ = (this->channels_ / this->group_) + * this->height_ * this->width_; + top_offset_ = (this->num_output_ / this->group_) + * this->height_out_ * this->width_out_; + + for (int i = 0; i < bottom.size(); i++) { + cudnn::setTensor4dDesc<Dtype>(&bottom_descs_[i], this->num_, this->channels_ / this->group_, this->height_, this->width_, this->channels_ * this->height_ * this->width_, this->height_ * this->width_, this->width_, 1); - bottom_descs_.push_back(bottom_desc); - cudnnTensor4dDescriptor_t top_desc; - cudnn::createTensor4dDesc<Dtype>(&top_desc, + cudnn::setTensor4dDesc<Dtype>(&top_descs_[i], this->num_, this->num_output_ / this->group_, this->height_out_, this->width_out_, this->num_output_ * this->height_out_ * this->width_out_, this->height_out_ * this->width_out_, this->width_out_, 1); - top_descs_.push_back(top_desc); - cudnnConvolutionDescriptor_t conv_desc; - cudnn::createConvolutionDesc<Dtype>(&conv_desc, bottom_desc, + cudnn::setConvolutionDesc<Dtype>(&conv_descs_[i], bottom_descs_[i], filter_desc_, this->pad_h_, this->pad_w_, this->stride_h_, this->stride_w_); - conv_descs_.push_back(conv_desc); } // Tensor descriptor for bias. if (this->bias_term_) { - cudnn::createTensor4dDesc<Dtype>(&bias_desc_, + cudnn::setTensor4dDesc<Dtype>(&bias_desc_, 1, this->num_output_ / this->group_, 1, 1); } } diff --git a/src/caffe/layers/cudnn_pooling_layer.cpp b/src/caffe/layers/cudnn_pooling_layer.cpp index 23c52012f1e..5aea0dc886e 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cpp +++ b/src/caffe/layers/cudnn_pooling_layer.cpp @@ -15,15 +15,23 @@ void CuDNNPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, PoolingLayer<Dtype>::LayerSetUp(bottom, top); CUDNN_CHECK(cudnnCreate(&handle_)); - cudnn::createTensor4dDesc<Dtype>(&bottom_desc_, bottom[0]->num(), - this->channels_, this->height_, this->width_); - cudnn::createTensor4dDesc<Dtype>(&top_desc_, bottom[0]->num(), - this->channels_, this->pooled_height_, this->pooled_width_); + cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); + cudnn::createTensor4dDesc<Dtype>(&top_desc_); cudnn::createPoolingDesc<Dtype>(&pooling_desc_, this->layer_param_.pooling_param().pool(), &mode_, this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_); } +template <typename Dtype> +void CuDNNPoolingLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + PoolingLayer<Dtype>::Reshape(bottom, top); + cudnn::setTensor4dDesc<Dtype>(&bottom_desc_, bottom[0]->num(), + this->channels_, this->height_, this->width_); + cudnn::setTensor4dDesc<Dtype>(&top_desc_, bottom[0]->num(), + this->channels_, this->pooled_height_, this->pooled_width_); +} + template <typename Dtype> CuDNNPoolingLayer<Dtype>::~CuDNNPoolingLayer() { cudnnDestroyTensor4dDescriptor(bottom_desc_); diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index 02f33f1cff4..870d5a9bde3 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -45,6 +45,11 @@ void Im2colLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, stride_h_ = conv_param.stride_h(); stride_w_ = conv_param.stride_w(); } +} + +template <typename Dtype> +void Im2colLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index e81a32ba84f..55b7673a21f 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -9,88 +9,80 @@ namespace caffe { template <typename Dtype> void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - num_ = bottom[0]->num(); - channels_ = bottom[0]->channels(); - height_ = bottom[0]->height(); - width_ = bottom[0]->width(); size_ = this->layer_param_.lrn_param().local_size(); pre_pad_ = (size_ - 1) / 2; alpha_ = this->layer_param_.lrn_param().alpha(); beta_ = this->layer_param_.lrn_param().beta(); + if (this->layer_param_.lrn_param().norm_region() == + LRNParameter_NormRegion_WITHIN_CHANNEL) { + // Set up split_layer_ to use inputs in the numerator and denominator. + split_top_vec_.clear(); + split_top_vec_.push_back(&product_input_); + split_top_vec_.push_back(&square_input_); + LayerParameter split_param; + split_layer_.reset(new SplitLayer<Dtype>(split_param)); + split_layer_->SetUp(bottom, &split_top_vec_); + // Set up square_layer_ to square the inputs. + square_bottom_vec_.clear(); + square_top_vec_.clear(); + square_bottom_vec_.push_back(&square_input_); + square_top_vec_.push_back(&square_output_); + LayerParameter square_param; + square_param.mutable_power_param()->set_power(Dtype(2)); + square_layer_.reset(new PowerLayer<Dtype>(square_param)); + square_layer_->SetUp(square_bottom_vec_, &square_top_vec_); + // Set up pool_layer_ to sum over square neighborhoods of the input. + pool_top_vec_.clear(); + pool_top_vec_.push_back(&pool_output_); + LayerParameter pool_param; + pool_param.mutable_pooling_param()->set_pool( + PoolingParameter_PoolMethod_AVE); + pool_param.mutable_pooling_param()->set_pad(pre_pad_); + pool_param.mutable_pooling_param()->set_kernel_size(size_); + pool_layer_.reset(new PoolingLayer<Dtype>(pool_param)); + pool_layer_->SetUp(square_top_vec_, &pool_top_vec_); + // Set up power_layer_ to compute (1 + alpha_/N^2 s)^-beta_, where s is + // the sum of a squared neighborhood (the output of pool_layer_). + power_top_vec_.clear(); + power_top_vec_.push_back(&power_output_); + LayerParameter power_param; + power_param.mutable_power_param()->set_power(-beta_); + power_param.mutable_power_param()->set_scale(alpha_); + power_param.mutable_power_param()->set_shift(Dtype(1)); + power_layer_.reset(new PowerLayer<Dtype>(power_param)); + power_layer_->SetUp(pool_top_vec_, &power_top_vec_); + // Set up a product_layer_ to compute outputs by multiplying inputs by the + // inverse demoninator computed by the power layer. + product_bottom_vec_.clear(); + product_bottom_vec_.push_back(&product_input_); + product_bottom_vec_.push_back(&power_output_); + LayerParameter product_param; + EltwiseParameter* eltwise_param = product_param.mutable_eltwise_param(); + eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); + product_layer_.reset(new EltwiseLayer<Dtype>(product_param)); + product_layer_->SetUp(product_bottom_vec_, top); + } +} + +template <typename Dtype> +void LRNLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { + num_ = bottom[0]->num(); + channels_ = bottom[0]->channels(); + height_ = bottom[0]->height(); + width_ = bottom[0]->width(); switch (this->layer_param_.lrn_param().norm_region()) { case LRNParameter_NormRegion_ACROSS_CHANNELS: (*top)[0]->Reshape(num_, channels_, height_, width_); scale_.Reshape(num_, channels_, height_, width_); break; case LRNParameter_NormRegion_WITHIN_CHANNEL: - { - // Set up split_layer_ to use inputs in the numerator and denominator. - split_top_vec_.clear(); - split_top_vec_.push_back(&product_input_); - split_top_vec_.push_back(&square_input_); - LayerParameter split_param; - split_layer_.reset(new SplitLayer<Dtype>(split_param)); - split_layer_->SetUp(bottom, &split_top_vec_); - // Set up square_layer_ to square the inputs. - square_input_.Reshape(num_, channels_, height_, width_); - square_bottom_vec_.clear(); - square_top_vec_.clear(); - square_bottom_vec_.push_back(&square_input_); - square_top_vec_.push_back(&square_output_); - LayerParameter square_param; - square_param.mutable_power_param()->set_power(Dtype(2)); - square_layer_.reset(new PowerLayer<Dtype>(square_param)); - square_layer_->SetUp(square_bottom_vec_, &square_top_vec_); - CHECK_EQ(square_output_.num(), num_); - CHECK_EQ(square_output_.channels(), channels_); - CHECK_EQ(square_output_.height(), height_); - CHECK_EQ(square_output_.width(), width_); - // Set up pool_layer_ to sum over square neighborhoods of the input. - pool_top_vec_.clear(); - pool_top_vec_.push_back(&pool_output_); - LayerParameter pool_param; - pool_param.mutable_pooling_param()->set_pool( - PoolingParameter_PoolMethod_AVE); - pool_param.mutable_pooling_param()->set_pad(pre_pad_); - pool_param.mutable_pooling_param()->set_kernel_size(size_); - pool_layer_.reset(new PoolingLayer<Dtype>(pool_param)); - pool_layer_->SetUp(square_top_vec_, &pool_top_vec_); - CHECK_EQ(pool_output_.num(), num_); - CHECK_EQ(pool_output_.channels(), channels_); - CHECK_EQ(pool_output_.height(), height_); - CHECK_EQ(pool_output_.width(), width_); - // Set up power_layer_ to compute (1 + alpha_/N^2 s)^-beta_, where s is - // the sum of a squared neighborhood (the output of pool_layer_). - power_top_vec_.clear(); - power_top_vec_.push_back(&power_output_); - LayerParameter power_param; - power_param.mutable_power_param()->set_power(-beta_); - power_param.mutable_power_param()->set_scale(alpha_); - power_param.mutable_power_param()->set_shift(Dtype(1)); - power_layer_.reset(new PowerLayer<Dtype>(power_param)); - power_layer_->SetUp(pool_top_vec_, &power_top_vec_); - CHECK_EQ(power_output_.num(), num_); - CHECK_EQ(power_output_.channels(), channels_); - CHECK_EQ(power_output_.height(), height_); - CHECK_EQ(power_output_.width(), width_); - // Set up a product_layer_ to compute outputs by multiplying inputs by the - // inverse demoninator computed by the power layer. - product_bottom_vec_.clear(); - product_bottom_vec_.push_back(&product_input_); - product_bottom_vec_.push_back(&power_output_); - LayerParameter product_param; - EltwiseParameter* eltwise_param = product_param.mutable_eltwise_param(); - eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); - product_layer_.reset(new EltwiseLayer<Dtype>(product_param)); - product_layer_->SetUp(product_bottom_vec_, top); - CHECK_EQ((*top)[0]->num(), num_); - CHECK_EQ((*top)[0]->channels(), channels_); - CHECK_EQ((*top)[0]->height(), height_); - CHECK_EQ((*top)[0]->width(), width_); - } + split_layer_->Reshape(bottom, &split_top_vec_); + square_layer_->Reshape(square_bottom_vec_, &square_top_vec_); + pool_layer_->Reshape(square_top_vec_, &pool_top_vec_); + power_layer_->Reshape(pool_top_vec_, &power_top_vec_); + product_layer_->Reshape(product_bottom_vec_, top); break; - default: - LOG(FATAL) << "Unknown normalization region."; } } diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 9e77fa28a45..8e8ffad66a0 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -60,6 +60,11 @@ void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK_LT(pad_h_, kernel_h_); CHECK_LT(pad_w_, kernel_w_); } +} + +template <typename Dtype> +void PoolingLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + vector<Blob<Dtype>*>* top) { channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); From d2de2ee54386500701527450145dd7cb7512a3e4 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Fri, 12 Sep 2014 13:56:38 -0700 Subject: [PATCH 0774/2053] call Reshape in Layer::SetUp Strictly speaking, Reshape doesn't need to be called until the first Forward call; however, much existing code (especially tests) assumes that top blobs will be set up in SetUp, so we may as well do it there. --- include/caffe/layer.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 9bd42e787b3..b05c332f81b 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -51,13 +51,15 @@ class Layer { * the allocated but unshaped output blobs, to be shaped by Reshape * * Checks that the number of bottom and top blobs is correct. - * Calls LayerSetUp to do special layer setup for individual layer types. + * Calls LayerSetUp to do special layer setup for individual layer types, + * followed by Reshape to set up sizes of top blobs and internal buffers. * Sets up the loss weight multiplier blobs for any non-zero loss weights. * This method may not be overridden. */ void SetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { CheckBlobCounts(bottom, *top); LayerSetUp(bottom, top); + Reshape(bottom, top); SetLossWeights(top); } From 4f1b66857175ec12b11452da4f819145618b0a10 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Fri, 12 Sep 2014 13:58:10 -0700 Subject: [PATCH 0775/2053] default LayerSetUp to no-op instead of NOT_IMPLEMENTED Now that top blobs are set up in Layer::Reshape, it's Reshape that is mandatory, and simple layers often don't need to implement LayerSetUp. Reshape is (already) declared abstract, so not implementing it is a compile-time error. --- include/caffe/layer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index b05c332f81b..e160075b939 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -80,7 +80,7 @@ class Layer { * adjust the top blob sizes. */ virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { NOT_IMPLEMENTED; } + vector<Blob<Dtype>*>* top) {} /** * @brief Adjust the shapes of top blobs and internal buffers to accomodate From db5bb1581f6d5b9422a1b608463aa94c84cc0d2c Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 2 Jul 2014 12:21:10 -0700 Subject: [PATCH 0776/2053] test net reshaping --- src/caffe/test/test_net.cpp | 121 ++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 24f72aef3af..9b10d100afb 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -7,6 +7,7 @@ #include "gtest/gtest.h" #include "caffe/common.hpp" +#include "caffe/filler.hpp" #include "caffe/net.hpp" #include "caffe/util/math_functions.hpp" @@ -533,6 +534,68 @@ class NetTest : public MultiDeviceTest<TypeParam> { InitNetFromProtoString(proto); } + virtual void InitReshapableNet() { + const string& proto = + "name: 'ReshapableNetwork' " + "input: 'data' " + "input_dim: 1 " + "input_dim: 3 " + "input_dim: 100 " + "input_dim: 100 " + "layers: { " + " name: 'conv1' " + " type: CONVOLUTION " + " bottom: 'data' " + " top: 'conv1' " + " convolution_param { " + " num_output: 5 " + " kernel_size: 3 " + " stride: 2 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 0.2 " + " } " + " } " + "} " + "layers: { " + " name: 'relu1' " + " type: RELU " + " bottom: 'conv1' " + " top: 'conv1' " + "} " + "layers: { " + " name: 'pool1' " + " type: POOLING " + " bottom: 'conv1' " + " top: 'pool1' " + " pooling_param { " + " pool: MAX " + " kernel_size: 2 " + " stride: 2 " + " } " + "} " + "layers: { " + " name: 'norm1' " + " type: LRN " + " bottom: 'pool1' " + " top: 'norm1' " + " lrn_param { " + " local_size: 3 " + " } " + "} " + "layers: { " + " name: 'softmax' " + " type: SOFTMAX " + " bottom: 'norm1' " + " top: 'softmax' " + "} "; + InitNetFromProtoString(proto); + } + int seed_; shared_ptr<Net<Dtype> > net_; }; @@ -2028,4 +2091,62 @@ TEST_F(FilterNetTest, TestFilterInOutByExcludeMultiRule) { this->RunFilterNetTest(input_proto_test, output_proto_test); } +TYPED_TEST(NetTest, TestReshape) { + typedef typename TypeParam::Dtype Dtype; + // We set up bottom blobs of two different sizes, switch between + // them, and check that forward and backward both run and the results + // are the same. + Caffe::set_random_seed(this->seed_); + Caffe::set_mode(Caffe::CPU); + FillerParameter filler_param; + filler_param.set_std(1); + GaussianFiller<Dtype> filler(filler_param); + Blob<Dtype> blob1(4, 3, 9, 11); + Blob<Dtype> blob2(2, 3, 12, 10); + filler.Fill(&blob1); + filler.Fill(&blob2); + + this->InitReshapableNet(); + Blob<Dtype>* input_blob = this->net_->input_blobs()[0]; + Blob<Dtype>* output_blob = this->net_->output_blobs()[0]; + input_blob->Reshape(blob1.num(), blob1.channels(), blob1.height(), + blob1.width()); + caffe_copy(blob1.count(), blob1.cpu_data(), input_blob->mutable_cpu_data()); + this->net_->ForwardPrefilled(); + // call backward just to make sure it runs + this->net_->Backward(); + Blob<Dtype> output1(output_blob->num(), output_blob->channels(), + output_blob->height(), output_blob->width()); + caffe_copy(output1.count(), output_blob->cpu_data(), + output1.mutable_cpu_data()); + + input_blob->Reshape(blob2.num(), blob2.channels(), blob2.height(), + blob2.width()); + caffe_copy(blob2.count(), blob2.cpu_data(), input_blob->mutable_cpu_data()); + this->net_->ForwardPrefilled(); + this->net_->Backward(); + Blob<Dtype> output2(output_blob->num(), output_blob->channels(), + output_blob->height(), output_blob->width()); + caffe_copy(output2.count(), output_blob->cpu_data(), + output2.mutable_cpu_data()); + + input_blob->Reshape(blob1.num(), blob1.channels(), blob1.height(), + blob1.width()); + caffe_copy(blob1.count(), blob1.cpu_data(), input_blob->mutable_cpu_data()); + this->net_->ForwardPrefilled(); + this->net_->Backward(); + for (int i = 0; i < output1.count(); ++i) { + CHECK_EQ(*(output1.cpu_data() + i), *(output_blob->cpu_data() + i)); + } + + input_blob->Reshape(blob2.num(), blob2.channels(), blob2.height(), + blob2.width()); + caffe_copy(blob2.count(), blob2.cpu_data(), input_blob->mutable_cpu_data()); + this->net_->ForwardPrefilled(); + this->net_->Backward(); + for (int i = 0; i < output2.count(); ++i) { + CHECK_EQ(*(output2.cpu_data() + i), *(output_blob->cpu_data() + i)); + } +} + } // namespace caffe From 24350a6f404b6f8988f742c91fbc07c1541480b7 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Fri, 12 Sep 2014 14:34:16 -0700 Subject: [PATCH 0777/2053] include Reshape in caffe time Since we are now calling Reshape in the Forward pass, it's only fair to include it when timing. Reshape calls should normally be four or so orders of magnitude faster than Forward calls; this change also makes it easy to notice a mistake that causes something slow to happen in Reshape. --- tools/caffe.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index fa27fdf2118..c8c8c1a6b4c 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -235,6 +235,9 @@ int time() { const caffe::string& layername = layers[i]->layer_param().name(); timer.Start(); for (int j = 0; j < FLAGS_iterations; ++j) { + // Although Reshape should be essentially free, we include it here + // so that we will notice Reshape performance bugs. + layers[i]->Reshape(bottom_vecs[i], &top_vecs[i]); layers[i]->Forward(bottom_vecs[i], &top_vecs[i]); } LOG(INFO) << layername << "\tforward: " << timer.MilliSeconds() << From 490077e372c92ac493611cfa2ee80fc1a09973fc Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Fri, 12 Sep 2014 15:20:52 -0700 Subject: [PATCH 0778/2053] add Net::Reshape for only reshaping Note that it is not normally necessary to call this function when using reshapable nets, but sometimes it can be useful to compute the sizes of intermediate layers without waiting for the forward pass. --- include/caffe/net.hpp | 8 ++++++++ src/caffe/net.cpp | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 3dcd0d5d598..1d06dc45533 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -67,6 +67,14 @@ class Net { void BackwardFrom(int start); void BackwardTo(int end); + /** + * @brief Reshape all layers from bottom to top. + * + * This is useful to propagate changes to layer sizes without running + * a forward pass, e.g. to compute output feature size. + */ + void Reshape(); + Dtype ForwardBackward(const vector<Blob<Dtype>* > & bottom) { Dtype loss; Forward(bottom, &loss); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index a8db4938a01..6f4a651fb10 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -680,6 +680,13 @@ void Net<Dtype>::Backward() { BackwardFromTo(layers_.size() - 1, 0); } +template <typename Dtype> +void Net<Dtype>::Reshape() { + for (int i = 0; i < layers_.size(); ++i) { + layers_[i]->Reshape(bottom_vecs_[i], &top_vecs_[i]); + } +} + template <typename Dtype> void Net<Dtype>::CopyTrainedLayersFrom(const NetParameter& param) { int num_source_layers = param.layers_size(); From fdf2de1672fff44fd544a4dc925d41ffc8b16139 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Fri, 12 Sep 2014 15:23:11 -0700 Subject: [PATCH 0779/2053] [pycaffe] expose Net::Reshape --- python/caffe/_caffe.cpp | 1 + python/caffe/_caffe.hpp | 1 + 2 files changed, 2 insertions(+) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 39e5d09077c..5a81a42329b 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -149,6 +149,7 @@ BOOST_PYTHON_MODULE(_caffe) { .def(bp::init<string>()) .def("_forward", &PyNet::Forward) .def("_backward", &PyNet::Backward) + .def("reshape", &PyNet::Reshape) .def("set_mode_cpu", &PyNet::set_mode_cpu) .def("set_mode_gpu", &PyNet::set_mode_gpu) .def("set_phase_train", &PyNet::set_phase_train) diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index 5884900fcfe..ba04d276351 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -98,6 +98,7 @@ class PyNet { void Forward(int start, int end) { net_->ForwardFromTo(start, end); } void Backward(int start, int end) { net_->BackwardFromTo(start, end); } + void Reshape() { net_->Reshape(); } void set_input_arrays(bp::object data_obj, bp::object labels_obj); From 0b5e11d604851dde2f353e8ba207bcac601cbc47 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Fri, 12 Sep 2014 15:33:49 -0700 Subject: [PATCH 0780/2053] [docs] clarify the use of Blob::Reshape a bit --- include/caffe/blob.hpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index c4f8b9e0f70..ef10aea53f0 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -23,6 +23,20 @@ class Blob { count_(0), capacity_(0) {} explicit Blob(const int num, const int channels, const int height, const int width); + /** + * @brief Change the dimensions of the blob, allocating new memory if + * necessary. + * + * This function can be called both to create an initial allocation + * of memory, and to adjust the dimensions of a top blob during Layer::Reshape + * or Layer::Forward. When changing the size of blob, memory will only be + * reallocated if sufficient memory does not already exist, and excess memory + * will never be freed. + * + * Note that reshaping an input blob and immediately calling Net::Backward is + * an error; either Net::Forward or Net::Reshape need to be called to + * propagate the new input shape to higher layers. + */ void Reshape(const int num, const int channels, const int height, const int width); void ReshapeLike(const Blob& other); From d833ab3493c83a10f32f5c5012875d4aba807b56 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Fri, 12 Sep 2014 16:07:34 -0700 Subject: [PATCH 0781/2053] check that LRN's local_size is odd as the current implementation requires --- src/caffe/layers/lrn_layer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index 55b7673a21f..d9e41e9c137 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -10,6 +10,7 @@ template <typename Dtype> void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { size_ = this->layer_param_.lrn_param().local_size(); + CHECK_EQ(size_ % 2, 1) << "LRN only supports odd values for local_size"; pre_pad_ = (size_ - 1) / 2; alpha_ = this->layer_param_.lrn_param().alpha(); beta_ = this->layer_param_.lrn_param().beta(); From 7a688c70f04498ee7cb34cbede2176800c11544d Mon Sep 17 00:00:00 2001 From: qipeng <pengrobertqi@163.com> Date: Thu, 18 Sep 2014 15:13:44 -0700 Subject: [PATCH 0782/2053] fix warning --- src/caffe/solver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 0810f487fab..cca32998d62 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -174,7 +174,7 @@ void Solver<Dtype>::Solve(const char* resume_file) { CHECK_GE(average_loss, 1) << "average_cost should be non-negative."; vector<Dtype> losses; - Dtype smoothed_loss; + Dtype smoothed_loss = 0; // For a network that is trained by the solver, no bottom or top vecs // should be given, and we will just provide dummy vecs. From 08d7f8c6398cd9103cceb128aff8e3e7e3fd94cb Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Thu, 18 Sep 2014 16:11:07 -0700 Subject: [PATCH 0783/2053] [model zoo] download gist script --- docs/model_zoo.md | 2 +- scripts/download_model_from_gist.sh | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100755 scripts/download_model_from_gist.sh diff --git a/docs/model_zoo.md b/docs/model_zoo.md index 5603c62c6bb..330850cbbd6 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -43,7 +43,7 @@ Github Gist is a good format for model info distribution because it can contain Try doing `scripts/upload_model_to_gist.sh models/bvlc_alexnet` to test the uploading (don't forget to delete the uploaded gist afterward). -Downloading models is not yet supported as a script (there is no good commandline tool for this right now), so simply go to the Gist URL and click "Download Gist" for now. +Downloading model info is done just as easily with `scripts/download_model_from_gist.sh <gist_id> <dirname>`. ### Hosting trained models diff --git a/scripts/download_model_from_gist.sh b/scripts/download_model_from_gist.sh new file mode 100755 index 00000000000..61d995fbe69 --- /dev/null +++ b/scripts/download_model_from_gist.sh @@ -0,0 +1,16 @@ +echo "usage: download_model_from_gist.sh <gist_id> <dirname>" + +GIST=$1 +DIRNAME=$2 + +if [ -d "$DIRNAME/$GIST" ]; then + echo "$DIRNAME/$GIST already exists! Please make sure you're not overwriting anything important!" + exit +fi + +echo "Downloading Caffe model info to $DIRNAME/$GIST ..." +mkdir -p $DIRNAME/$GIST +wget https://gist.github.com/$GIST/download -O $DIRNAME/$GIST/gist.tar.gz +tar xzf $DIRNAME/$GIST/gist.tar.gz --directory=$DIRNAME/$GIST --strip-components=1 +rm $DIRNAME/$GIST/gist.tar.gz +echo "Done" From 4e02e06a6d7887539d2e96858d64c6905e883e3a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 18 Sep 2014 20:06:24 -0700 Subject: [PATCH 0784/2053] [model zoo] download from gist grooming - invoke by shell - default download dir to models/ - save to flat dir of owner-gist instead of nested owner/gist --- scripts/download_model_from_gist.sh | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/scripts/download_model_from_gist.sh b/scripts/download_model_from_gist.sh index 61d995fbe69..a1dccf78b5b 100755 --- a/scripts/download_model_from_gist.sh +++ b/scripts/download_model_from_gist.sh @@ -1,16 +1,24 @@ -echo "usage: download_model_from_gist.sh <gist_id> <dirname>" +#!/usr/bin/env sh GIST=$1 -DIRNAME=$2 +DIRNAME=${2:-./models} -if [ -d "$DIRNAME/$GIST" ]; then - echo "$DIRNAME/$GIST already exists! Please make sure you're not overwriting anything important!" +if [ -z $GIST ]; then + echo "usage: download_model_from_gist.sh <gist_id> <dirname>" + exit +fi + +GIST_DIR=$(echo $GIST | tr '/' '-') +MODEL_DIR="$DIRNAME/$GIST_DIR" + +if [ -d $MODEL_DIR ]; then + echo "$MODEL_DIR already exists! Please make sure you're not overwriting anything important!" exit fi -echo "Downloading Caffe model info to $DIRNAME/$GIST ..." -mkdir -p $DIRNAME/$GIST -wget https://gist.github.com/$GIST/download -O $DIRNAME/$GIST/gist.tar.gz -tar xzf $DIRNAME/$GIST/gist.tar.gz --directory=$DIRNAME/$GIST --strip-components=1 -rm $DIRNAME/$GIST/gist.tar.gz +echo "Downloading Caffe model info to $MODEL_DIR ..." +mkdir -p $MODEL_DIR +wget https://gist.github.com/$GIST/download -O $MODEL_DIR/gist.tar.gz +tar xzf $MODEL_DIR/gist.tar.gz --directory=$MODEL_DIR --strip-components=1 +rm $MODEL_DIR/gist.tar.gz echo "Done" From 7a507d6c1d83965faf46857a01616288f1b5d7dc Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 18 Sep 2014 20:15:50 -0700 Subject: [PATCH 0785/2053] [model zoo] ignore models -- only for reference or zoo --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index cf92e5fd4db..fa279f9071b 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ Makefile.config # 1. reference, and not casually committed # 2. custom, and live on their own unless they're deliberated contributed data/* +models/* *.caffemodel *.solverstate *.binaryproto From a920a14718fcb169f900ecab9197bbe17266d566 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 18 Sep 2014 20:24:19 -0700 Subject: [PATCH 0786/2053] [example] resurrect imagenet training scripts --- examples/imagenet/resume_training.sh | 5 +++++ examples/imagenet/train_caffenet.sh | 4 ++++ 2 files changed, 9 insertions(+) create mode 100755 examples/imagenet/resume_training.sh create mode 100755 examples/imagenet/train_caffenet.sh diff --git a/examples/imagenet/resume_training.sh b/examples/imagenet/resume_training.sh new file mode 100755 index 00000000000..d1febff8d39 --- /dev/null +++ b/examples/imagenet/resume_training.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env sh + +./build/tools/caffe train \ + --solver=models/bvlc_reference_caffenet/solver.prototxt \ + --snapshot=models/bvlc_reference_caffenet/caffenet_train_10000.solverstate diff --git a/examples/imagenet/train_caffenet.sh b/examples/imagenet/train_caffenet.sh new file mode 100755 index 00000000000..94558ec5466 --- /dev/null +++ b/examples/imagenet/train_caffenet.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env sh + +./build/tools/caffe train \ + --solver=models/bvlc_reference_caffenet/solver.prototxt From e146423f2d5454a2229ad642706b57a7e7f9ed70 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 18 Sep 2014 21:25:10 -0700 Subject: [PATCH 0787/2053] [docs] order ipython notebooks --- docs/index.md | 2 +- examples/classification.ipynb | 3 ++- examples/detection.ipynb | 3 ++- examples/filter_visualization.ipynb | 3 ++- examples/hdf5_classification.ipynb | 5 +++-- examples/net_surgery.ipynb | 3 ++- 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/docs/index.md b/docs/index.md index e89d8428739..e90b06b4d22 100644 --- a/docs/index.md +++ b/docs/index.md @@ -58,7 +58,7 @@ Developer documentation automagically generated from code comments. ### Notebook examples -{% assign notebooks = site.pages | where:'category','notebook' %} +{% assign notebooks = site.pages | where:'category','notebook' | sort: 'priority' %} {% for page in notebooks %} - <div><a href="http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/{{page.original_path}}">{{page.title}}</a><br>{{page.description}}</div> {% endfor %} diff --git a/examples/classification.ipynb b/examples/classification.ipynb index 9c9d247a0cf..fb44da8958f 100644 --- a/examples/classification.ipynb +++ b/examples/classification.ipynb @@ -2,7 +2,8 @@ "metadata": { "description": "Use the pre-trained ImageNet model to classify images with the Python interface.", "example_name": "ImageNet classification", - "include_in_docs": true + "include_in_docs": true, + "priority": 1 }, "nbformat": 3, "nbformat_minor": 0, diff --git a/examples/detection.ipynb b/examples/detection.ipynb index 62263b66809..d05c0c22052 100644 --- a/examples/detection.ipynb +++ b/examples/detection.ipynb @@ -2,7 +2,8 @@ "metadata": { "description": "Run a pretrained model as a detector in Python.", "example_name": "R-CNN detection", - "include_in_docs": true + "include_in_docs": true, + "priority": 3 }, "nbformat": 3, "nbformat_minor": 0, diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index abf4c0dd796..09b416fb4ca 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -2,7 +2,8 @@ "metadata": { "description": "Extracting features and visualizing trained filters with an example image, viewed layer-by-layer.", "example_name": "Filter visualization", - "include_in_docs": true + "include_in_docs": true, + "priority": 2 }, "nbformat": 3, "nbformat_minor": 0, diff --git a/examples/hdf5_classification.ipynb b/examples/hdf5_classification.ipynb index 2059e6ff3a6..51d854fa142 100644 --- a/examples/hdf5_classification.ipynb +++ b/examples/hdf5_classification.ipynb @@ -1,8 +1,9 @@ { "metadata": { "description": "Use Caffe as a generic SGD optimizer to train logistic regression on non-image HDF5 data.", - "example_name": "Classification with HDF5 data", + "example_name": "Off-the-shelf SGD for classification", "include_in_docs": true, + "priority": 4, "signature": "sha256:c3b84add3bb83e91137f396a48f46d46bf7921b242fc42c58390b30806e5a028" }, "nbformat": 3, @@ -943,4 +944,4 @@ "metadata": {} } ] -} \ No newline at end of file +} diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index e4f4f985992..64310016101 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -3,6 +3,7 @@ "description": "How to do net surgery and manually change model parameters, making a fully-convolutional classifier for dense feature extraction.", "example_name": "Editing model parameters", "include_in_docs": true, + "priority": 5, "signature": "sha256:179fb20339497f5e64f6fbeb57987f27a962b7ae6d940c8fede2631aba9bffaf" }, "nbformat": 3, @@ -351,4 +352,4 @@ "metadata": {} } ] -} \ No newline at end of file +} From 403b56ba30ad3f2e3c640bbe8e486e0b1a8a634b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 18 Sep 2014 20:46:49 -0700 Subject: [PATCH 0788/2053] [example] groom siamese notebook --- examples/siamese/mnist_siamese.ipynb | 37 ++++++++++------------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/examples/siamese/mnist_siamese.ipynb b/examples/siamese/mnist_siamese.ipynb index 66776fe14bd..5abd0469ba6 100644 --- a/examples/siamese/mnist_siamese.ipynb +++ b/examples/siamese/mnist_siamese.ipynb @@ -1,7 +1,9 @@ { "metadata": { - "name": "", - "signature": "sha256:ea70e3c13ccbae495d73f30e18b8e01e68ec8c7dc8bbb3635e6139b801c921a9" + "description": "Extracting features and plotting the Siamese network embedding.", + "example_name": "Siamese network embedding", + "include_in_docs": true, + "priority": 6 }, "nbformat": 3, "nbformat_minor": 0, @@ -12,7 +14,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Setup and import caffe" + "### Setup\n", + "\n", + "Import Caffe and the usual modules." ] }, { @@ -39,7 +43,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Load the trained net." + "### Load the trained net\n", + "\n", + "Load the model definition and weights and set to CPU mode TEST phase computation with input scaling." ] }, { @@ -91,7 +97,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Run the data through the net" + "### Generate the Siamese features" ] }, { @@ -114,7 +120,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Plot the results" + "### Visualize the learned Siamese embedding" ] }, { @@ -144,26 +150,9 @@ } ], "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 5 - }, - { - "cell_type": "code", - "collapsed": false, - "input": [], - "language": "python", - "metadata": {}, - "outputs": [] } ], "metadata": {} } ] -} \ No newline at end of file +} From 89fd7da77983d5bbbb045f3802821c8372722c5f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 18 Sep 2014 22:07:01 -0700 Subject: [PATCH 0789/2053] relax precision of gradient-based solver tests --- src/caffe/test/test_gradient_based_solver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/test/test_gradient_based_solver.cpp b/src/caffe/test/test_gradient_based_solver.cpp index d196e581230..3040eb134a4 100644 --- a/src/caffe/test/test_gradient_based_solver.cpp +++ b/src/caffe/test/test_gradient_based_solver.cpp @@ -234,7 +234,7 @@ class GradientBasedSolverTest : public MultiDeviceTest<TypeParam> { ASSERT_EQ(2, param_blobs.size()); const Blob<Dtype>& solver_updated_weights = *param_blobs[0]; ASSERT_EQ(D, solver_updated_weights.count()); - const double kPrecision = 1e-3; + const double kPrecision = 1e-2; const double kMinPrecision = 1e-7; for (int i = 0; i < D; ++i) { const Dtype expected_updated_weight = updated_weights.cpu_data()[i]; From 2077516b0fdfc6dd0517f5c05ddf2e166cacc432 Mon Sep 17 00:00:00 2001 From: rickardnorlander <rickardnorlander@gmail.com> Date: Fri, 19 Sep 2014 20:47:44 +0200 Subject: [PATCH 0790/2053] Fix typo in LRN-expression in docs This is more consistent with krizhevsky2012, and it seems to be what the code does. --- docs/tutorial/layers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 8dd67275f58..5f8f519cdc4 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -111,7 +111,7 @@ The `CONVOLUTION` layer convolves the input image with a set of learnable filter - `beta` [default 5]: the exponent (see below) - `norm_region` [default `ACROSS_CHANNELS`]: whether to sum over adjacent channels (`ACROSS_CHANNELS`) or nearby spatial locaitons (`WITHIN_CHANNEL`) -The local response normalization layer performs a kind of "lateral inhibition" by normalizing over local input regions. In `ACROSS_CHANNELS` mode, the local regions extend across nearby channels, but have no spatial extent (i.e., they have shape `local_size x 1 x 1`). In `WITHIN_CHANNEL` mode, the local regions extend spatially, but are in separate channels (i.e., they have shape `1 x local_size x local_size`). Each input value is divided by $$(1 + (\alpha/n) \sum_i x_i)^\beta$$, where $$n$$ is the size of each local region, and the sum is taken over the region centered at that value (zero padding is added where necessary). +The local response normalization layer performs a kind of "lateral inhibition" by normalizing over local input regions. In `ACROSS_CHANNELS` mode, the local regions extend across nearby channels, but have no spatial extent (i.e., they have shape `local_size x 1 x 1`). In `WITHIN_CHANNEL` mode, the local regions extend spatially, but are in separate channels (i.e., they have shape `1 x local_size x local_size`). Each input value is divided by $$(1 + (\alpha/n) \sum_i x_i^2)^\beta$$, where $$n$$ is the size of each local region, and the sum is taken over the region centered at that value (zero padding is added where necessary). #### im2col From 8fd17a32e45f4e9b01ea58e87514acefcde0b6f4 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Fri, 19 Sep 2014 12:38:39 -0700 Subject: [PATCH 0791/2053] fix cifar10 paths so they can be run from caffe root --- examples/cifar10/train_full.sh | 13 +++++++------ examples/cifar10/train_quick.sh | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/examples/cifar10/train_full.sh b/examples/cifar10/train_full.sh index 9dd9ad79822..4285a5d6468 100755 --- a/examples/cifar10/train_full.sh +++ b/examples/cifar10/train_full.sh @@ -1,15 +1,16 @@ #!/usr/bin/env sh -TOOLS=../../build/tools +TOOLS=./build/tools -$TOOLS/caffe train --solver=cifar10_full_solver.prototxt +$TOOLS/caffe train \ + --solver=examples/cifar10/cifar10_full_solver.prototxt # reduce learning rate by factor of 10 $TOOLS/caffe train \ - --solver=cifar10_full_solver_lr1.prototxt \ - --snapshot=cifar10_full_iter_60000.solverstate + --solver=examples/cifar10/cifar10_full_solver_lr1.prototxt \ + --snapshot=examples/cifar10/cifar10_full_iter_60000.solverstate # reduce learning rate by factor of 10 $TOOLS/caffe train \ - --solver=cifar10_full_solver_lr2.prototxt \ - --snapshot=cifar10_full_iter_65000.solverstate + --solver=examples/cifar10/cifar10_full_solver_lr2.prototxt \ + --snapshot=examples/cifar10/cifar10_full_iter_65000.solverstate diff --git a/examples/cifar10/train_quick.sh b/examples/cifar10/train_quick.sh index e348e12fd94..2830c40945c 100755 --- a/examples/cifar10/train_quick.sh +++ b/examples/cifar10/train_quick.sh @@ -1,10 +1,11 @@ #!/usr/bin/env sh -TOOLS=../../build/tools +TOOLS=./build/tools -$TOOLS/caffe.bin train --solver=cifar10_quick_solver.prototxt +$TOOLS/caffe train \ + --solver=examples/cifar10/cifar10_quick_solver.prototxt -# reduce learning rate by fctor of 10 after 8 epochs -$TOOLS/caffe.bin train \ - --solver=cifar10_quick_solver_lr1.prototxt \ - --snapshot=cifar10_quick_iter_4000.solverstate +# reduce learning rate by factor of 10 after 8 epochs +$TOOLS/caffe train \ + --solver=examples/cifar10/cifar10_quick_solver_lr1.prototxt \ + --snapshot=examples/cifar10/cifar10_quick_iter_4000.solverstate From 31326a111bcb5ac5a9adeec13cfe6330e78ef31e Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Fri, 19 Sep 2014 16:04:37 -0700 Subject: [PATCH 0792/2053] fix types of (Layer)SetUp, Reshape, Forward, and Backward calls Using the type vector<Blob<Dtype*>* for outputs allows modification of the vector itself, while it is only okay to modify the blobs pointed to by the elements of the vector. Switching the types to const vector<Blob<Dtype>*>& makes them more correct. --- include/caffe/common_layers.hpp | 114 +++++++++--------- include/caffe/data_layers.hpp | 60 ++++----- include/caffe/layer.hpp | 51 ++++---- include/caffe/loss_layers.hpp | 74 ++++++------ include/caffe/neuron_layers.hpp | 98 +++++++-------- .../caffe/test/test_gradient_check_util.hpp | 85 ++++++------- include/caffe/util/device_alternate.hpp | 8 +- include/caffe/vision_layers.hpp | 76 ++++++------ src/caffe/layers/absval_layer.cpp | 16 +-- src/caffe/layers/absval_layer.cu | 12 +- src/caffe/layers/accuracy_layer.cpp | 10 +- src/caffe/layers/argmax_layer.cpp | 16 +-- src/caffe/layers/base_data_layer.cpp | 12 +- src/caffe/layers/base_data_layer.cu | 6 +- src/caffe/layers/bnll_layer.cpp | 12 +- src/caffe/layers/bnll_layer.cu | 12 +- src/caffe/layers/concat_layer.cpp | 26 ++-- src/caffe/layers/concat_layer.cu | 18 +-- src/caffe/layers/contrastive_loss_layer.cpp | 18 +-- src/caffe/layers/contrastive_loss_layer.cu | 16 +-- src/caffe/layers/conv_layer.cpp | 30 ++--- src/caffe/layers/conv_layer.cu | 18 +-- src/caffe/layers/cudnn_conv_layer.cpp | 4 +- src/caffe/layers/cudnn_conv_layer.cu | 10 +- src/caffe/layers/cudnn_pooling_layer.cpp | 4 +- src/caffe/layers/cudnn_pooling_layer.cu | 12 +- src/caffe/layers/cudnn_relu_layer.cpp | 4 +- src/caffe/layers/cudnn_relu_layer.cu | 10 +- src/caffe/layers/cudnn_sigmoid_layer.cpp | 4 +- src/caffe/layers/cudnn_sigmoid_layer.cu | 10 +- src/caffe/layers/cudnn_softmax_layer.cpp | 4 +- src/caffe/layers/cudnn_softmax_layer.cu | 10 +- src/caffe/layers/cudnn_tanh_layer.cpp | 4 +- src/caffe/layers/cudnn_tanh_layer.cu | 10 +- src/caffe/layers/data_layer.cpp | 14 +-- src/caffe/layers/dropout_layer.cpp | 14 +-- src/caffe/layers/dropout_layer.cu | 10 +- src/caffe/layers/dummy_data_layer.cpp | 12 +- src/caffe/layers/eltwise_layer.cpp | 28 ++--- src/caffe/layers/eltwise_layer.cu | 20 +-- src/caffe/layers/euclidean_loss_layer.cpp | 14 +-- src/caffe/layers/euclidean_loss_layer.cu | 12 +- src/caffe/layers/flatten_layer.cpp | 14 +-- src/caffe/layers/flatten_layer.cu | 8 +- src/caffe/layers/hdf5_data_layer.cpp | 22 ++-- src/caffe/layers/hdf5_data_layer.cu | 10 +- src/caffe/layers/hdf5_output_layer.cpp | 4 +- src/caffe/layers/hdf5_output_layer.cu | 4 +- src/caffe/layers/hinge_loss_layer.cpp | 14 +-- src/caffe/layers/im2col_layer.cpp | 18 +-- src/caffe/layers/im2col_layer.cu | 12 +- src/caffe/layers/image_data_layer.cpp | 14 +-- src/caffe/layers/infogain_loss_layer.cpp | 24 ++-- src/caffe/layers/inner_product_layer.cpp | 16 +-- src/caffe/layers/inner_product_layer.cu | 10 +- src/caffe/layers/loss_layer.cpp | 6 +- src/caffe/layers/lrn_layer.cpp | 56 ++++----- src/caffe/layers/lrn_layer.cu | 14 +-- src/caffe/layers/memory_data_layer.cpp | 12 +- .../multinomial_logistic_loss_layer.cpp | 20 +-- src/caffe/layers/mvn_layer.cpp | 20 +-- src/caffe/layers/mvn_layer.cu | 16 +-- src/caffe/layers/neuron_layer.cpp | 4 +- src/caffe/layers/pooling_layer.cpp | 40 +++--- src/caffe/layers/pooling_layer.cu | 16 +-- src/caffe/layers/power_layer.cpp | 14 +-- src/caffe/layers/power_layer.cu | 12 +- src/caffe/layers/relu_layer.cpp | 12 +- src/caffe/layers/relu_layer.cu | 12 +- .../sigmoid_cross_entropy_loss_layer.cpp | 24 ++-- .../sigmoid_cross_entropy_loss_layer.cu | 16 +-- src/caffe/layers/sigmoid_layer.cpp | 10 +- src/caffe/layers/sigmoid_layer.cu | 10 +- src/caffe/layers/silence_layer.cpp | 8 +- src/caffe/layers/silence_layer.cu | 10 +- src/caffe/layers/slice_layer.cpp | 58 ++++----- src/caffe/layers/slice_layer.cu | 18 +-- src/caffe/layers/softmax_layer.cpp | 16 +-- src/caffe/layers/softmax_layer.cu | 8 +- src/caffe/layers/softmax_loss_layer.cpp | 28 ++--- src/caffe/layers/softmax_loss_layer.cu | 4 +- src/caffe/layers/split_layer.cpp | 24 ++-- src/caffe/layers/split_layer.cu | 14 +-- src/caffe/layers/tanh_layer.cpp | 10 +- src/caffe/layers/tanh_layer.cu | 10 +- src/caffe/layers/threshold_layer.cpp | 6 +- src/caffe/layers/threshold_layer.cu | 4 +- src/caffe/layers/window_data_layer.cpp | 20 +-- src/caffe/net.cpp | 10 +- src/caffe/test/test_accuracy_layer.cpp | 12 +- src/caffe/test/test_argmax_layer.cpp | 20 +-- src/caffe/test/test_concat_layer.cpp | 12 +- .../test/test_contrastive_loss_layer.cpp | 14 +-- src/caffe/test/test_convolution_layer.cpp | 64 +++++----- src/caffe/test/test_data_layer.cpp | 24 ++-- src/caffe/test/test_dummy_data_layer.cpp | 14 +-- src/caffe/test/test_eltwise_layer.cpp | 38 +++--- src/caffe/test/test_euclidean_loss_layer.cpp | 14 +-- src/caffe/test/test_flatten_layer.cpp | 10 +- src/caffe/test/test_hdf5_output_layer.cpp | 4 +- src/caffe/test/test_hdf5data_layer.cpp | 6 +- src/caffe/test/test_hinge_loss_layer.cpp | 8 +- src/caffe/test/test_im2col_layer.cpp | 18 +-- src/caffe/test/test_image_data_layer.cpp | 12 +- src/caffe/test/test_infogain_loss_layer.cpp | 4 +- src/caffe/test/test_inner_product_layer.cpp | 10 +- src/caffe/test/test_lrn_layer.cpp | 30 ++--- .../test/test_maxpool_dropout_layers.cpp | 26 ++-- src/caffe/test/test_memory_data_layer.cpp | 10 +- .../test_multinomial_logistic_loss_layer.cpp | 6 +- src/caffe/test/test_mvn_layer.cpp | 24 ++-- src/caffe/test/test_neuron_layer.cpp | 96 +++++++-------- src/caffe/test/test_pooling_layer.cpp | 92 +++++++------- src/caffe/test/test_power_layer.cpp | 8 +- .../test_sigmoid_cross_entropy_loss_layer.cpp | 10 +- src/caffe/test/test_slice_layer.cpp | 20 +-- src/caffe/test/test_softmax_layer.cpp | 16 +-- .../test/test_softmax_with_loss_layer.cpp | 4 +- src/caffe/test/test_split_layer.cpp | 10 +- src/caffe/test/test_stochastic_pooling.cpp | 14 +-- src/caffe/test/test_threshold_layer.cpp | 10 +- tools/caffe.cpp | 6 +- 122 files changed, 1199 insertions(+), 1197 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 1f945ca34e9..9718b825b14 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -39,9 +39,9 @@ class ArgMaxLayer : public Layer<Dtype> { explicit ArgMaxLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_ARGMAX; @@ -62,10 +62,10 @@ class ArgMaxLayer : public Layer<Dtype> { * @f$ (for @f$ K = 1 @f$). */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /// @brief Not implemented (non-differentiable function) virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { NOT_IMPLEMENTED; } bool out_max_val_; @@ -82,9 +82,9 @@ class ConcatLayer : public Layer<Dtype> { explicit ConcatLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_CONCAT; @@ -110,9 +110,9 @@ class ConcatLayer : public Layer<Dtype> { * @f$ */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the error gradient w.r.t. the concatenate inputs. @@ -137,9 +137,9 @@ class ConcatLayer : public Layer<Dtype> { * @f$ */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); Blob<Dtype> col_bob_; int count_; @@ -162,9 +162,9 @@ class EltwiseLayer : public Layer<Dtype> { explicit EltwiseLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_ELTWISE; @@ -174,13 +174,13 @@ class EltwiseLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); EltwiseParameter_EltwiseOp op_; vector<Dtype> coeffs_; @@ -205,7 +205,7 @@ class FlattenLayer : public Layer<Dtype> { explicit FlattenLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_FLATTEN; @@ -223,9 +223,9 @@ class FlattenLayer : public Layer<Dtype> { * the outputs -- i.e., the (virtually) copied, flattened inputs */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the error gradient w.r.t. the concatenate inputs. @@ -237,9 +237,9 @@ class FlattenLayer : public Layer<Dtype> { * gradient is (virtually) copied */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); int count_; }; @@ -256,9 +256,9 @@ class InnerProductLayer : public Layer<Dtype> { explicit InnerProductLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_INNER_PRODUCT; @@ -268,13 +268,13 @@ class InnerProductLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); int M_; int K_; @@ -294,7 +294,7 @@ class MVNLayer : public Layer<Dtype> { explicit MVNLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_MVN; @@ -304,13 +304,13 @@ class MVNLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); Blob<Dtype> mean_, variance_, temp_; @@ -328,7 +328,7 @@ class SilenceLayer : public Layer<Dtype> { explicit SilenceLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) {} + const vector<Blob<Dtype>*>& top) {} virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SILENCE; @@ -338,15 +338,15 @@ class SilenceLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) {} + const vector<Blob<Dtype>*>& top) {} // We can't define Forward_gpu here, since STUB_GPU will provide // its own definition for CPU_ONLY mode. virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); }; /** @@ -360,7 +360,7 @@ class SoftmaxLayer : public Layer<Dtype> { explicit SoftmaxLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SOFTMAX; @@ -370,13 +370,13 @@ class SoftmaxLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); /// sum_multiplier is used to carry out sum using BLAS Blob<Dtype> sum_multiplier_; @@ -395,16 +395,16 @@ class CuDNNSoftmaxLayer : public SoftmaxLayer<Dtype> { explicit CuDNNSoftmaxLayer(const LayerParameter& param) : SoftmaxLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual ~CuDNNSoftmaxLayer(); protected: virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); cudnnHandle_t handle_; cudnnTensor4dDescriptor_t bottom_desc_; @@ -424,7 +424,7 @@ class SplitLayer : public Layer<Dtype> { explicit SplitLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SPLIT; @@ -434,13 +434,13 @@ class SplitLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); int count_; }; @@ -457,9 +457,9 @@ class SliceLayer : public Layer<Dtype> { explicit SliceLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SLICE; @@ -469,13 +469,13 @@ class SliceLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); Blob<Dtype> col_bob_; int count_; diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 8e2637b0658..b3f93cea19e 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -37,17 +37,17 @@ class BaseDataLayer : public Layer<Dtype> { // DataLayerSetUp to do special data layer setup for individual layer types. // This method may not be overridden except by the BasePrefetchingDataLayer. virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) {} + const vector<Blob<Dtype>*>& top) {} // Data layers have no bottoms, so reshaping is trivial. virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) {} + const vector<Blob<Dtype>*>& top) {} virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) {} + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) {} virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) {} + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) {} int datum_channels() const { return datum_channels_; } int datum_height() const { return datum_height_; } @@ -78,12 +78,12 @@ class BasePrefetchingDataLayer : // DataLayerSetUp to do special data layer setup for individual layer types. // This method may not be overridden. void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void CreatePrefetchThread(); virtual void JoinPrefetchThread(); @@ -102,7 +102,7 @@ class DataLayer : public BasePrefetchingDataLayer<Dtype> { : BasePrefetchingDataLayer<Dtype>(param) {} virtual ~DataLayer(); virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_DATA; @@ -136,10 +136,10 @@ class DummyDataLayer : public Layer<Dtype> { explicit DummyDataLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); // Data layers have no bottoms, so reshaping is trivial. virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) {} + const vector<Blob<Dtype>*>& top) {} virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_DUMMY_DATA; @@ -149,11 +149,11 @@ class DummyDataLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) {} + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) {} virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) {} + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) {} vector<shared_ptr<Filler<Dtype> > > fillers_; vector<bool> refill_; @@ -171,10 +171,10 @@ class HDF5DataLayer : public Layer<Dtype> { : Layer<Dtype>(param) {} virtual ~HDF5DataLayer(); virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); // Data layers have no bottoms, so reshaping is trivial. virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) {} + const vector<Blob<Dtype>*>& top) {} virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_HDF5_DATA; @@ -184,13 +184,13 @@ class HDF5DataLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) {} + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) {} virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) {} + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) {} virtual void LoadHDF5FileData(const char* filename); std::vector<std::string> hdf_filenames_; @@ -212,10 +212,10 @@ class HDF5OutputLayer : public Layer<Dtype> { explicit HDF5OutputLayer(const LayerParameter& param); virtual ~HDF5OutputLayer(); virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) {} + const vector<Blob<Dtype>*>& top) {} // Data layers have no bottoms, so reshaping is trivial. virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) {} + const vector<Blob<Dtype>*>& top) {} virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_HDF5_OUTPUT; @@ -228,13 +228,13 @@ class HDF5OutputLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void SaveBlobs(); std::string file_name_; @@ -255,7 +255,7 @@ class ImageDataLayer : public BasePrefetchingDataLayer<Dtype> { : BasePrefetchingDataLayer<Dtype>(param) {} virtual ~ImageDataLayer(); virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_IMAGE_DATA; @@ -283,7 +283,7 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { explicit MemoryDataLayer(const LayerParameter& param) : BaseDataLayer<Dtype>(param), has_new_data_(false) {} virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_MEMORY_DATA; @@ -301,7 +301,7 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); int batch_size_; Dtype* data_; @@ -326,7 +326,7 @@ class WindowDataLayer : public BasePrefetchingDataLayer<Dtype> { : BasePrefetchingDataLayer<Dtype>(param) {} virtual ~WindowDataLayer(); virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_WINDOW_DATA; diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index e160075b939..18ff2743719 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -56,8 +56,9 @@ class Layer { * Sets up the loss weight multiplier blobs for any non-zero loss weights. * This method may not be overridden. */ - void SetUp(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - CheckBlobCounts(bottom, *top); + void SetUp(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top) { + CheckBlobCounts(bottom, top); LayerSetUp(bottom, top); Reshape(bottom, top); SetLossWeights(top); @@ -80,7 +81,7 @@ class Layer { * adjust the top blob sizes. */ virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) {} + const vector<Blob<Dtype>*>& top) {} /** * @brief Adjust the shapes of top blobs and internal buffers to accomodate @@ -95,7 +96,7 @@ class Layer { * accomodate the bottom blobs. */ virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; + const vector<Blob<Dtype>*>& top) = 0; /** * @brief Given the bottom blobs, compute the top blobs and the loss. @@ -115,7 +116,7 @@ class Layer { * Your layer should implement Forward_cpu and (optionally) Forward_gpu. */ inline Dtype Forward(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Given the top blob error gradients, compute the bottom blob error @@ -140,7 +141,7 @@ class Layer { */ inline void Backward(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom); + const vector<Blob<Dtype>*>& bottom); /** * @brief Returns the vector of learnable parameter blobs. @@ -306,13 +307,13 @@ class Layer { /** @brief Using the CPU device, compute the layer output. */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) = 0; + const vector<Blob<Dtype>*>& top) = 0; /** * @brief Using the GPU device, compute the layer output. * Fall back to Forward_cpu() if unavailable. */ virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { // LOG(WARNING) << "Using CPU code as backup."; return Forward_cpu(bottom, top); } @@ -323,7 +324,7 @@ class Layer { */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) = 0; + const vector<Blob<Dtype>*>& bottom) = 0; /** * @brief Using the GPU device, compute the gradients for any parameters and * for the bottom blobs if propagate_down is true. @@ -331,7 +332,7 @@ class Layer { */ virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { // LOG(WARNING) << "Using CPU code as backup."; Backward_cpu(top, propagate_down, bottom); } @@ -384,17 +385,17 @@ class Layer { * Called by SetUp to initialize the weights associated with any top blobs in * the loss function. Store non-zero loss weights in the diff blob. */ - inline void SetLossWeights(vector<Blob<Dtype>*>* top) { + inline void SetLossWeights(const vector<Blob<Dtype>*>& top) { const int num_loss_weights = layer_param_.loss_weight_size(); if (num_loss_weights) { - CHECK_EQ(top->size(), num_loss_weights) << "loss_weight must be " + CHECK_EQ(top.size(), num_loss_weights) << "loss_weight must be " "unspecified or specified once per top blob."; - for (int top_id = 0; top_id < top->size(); ++top_id) { + for (int top_id = 0; top_id < top.size(); ++top_id) { const Dtype loss_weight = layer_param_.loss_weight(top_id); if (loss_weight == Dtype(0)) { continue; } this->set_loss(top_id, loss_weight); - const int count = (*top)[top_id]->count(); - Dtype* loss_multiplier = (*top)[top_id]->mutable_cpu_diff(); + const int count = top[top_id]->count(); + Dtype* loss_multiplier = top[top_id]->mutable_cpu_diff(); caffe_set(count, loss_weight, loss_multiplier); } } @@ -408,27 +409,27 @@ class Layer { // functions. template <typename Dtype> inline Dtype Layer<Dtype>::Forward(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { Dtype loss = 0; switch (Caffe::mode()) { case Caffe::CPU: Forward_cpu(bottom, top); - for (int top_id = 0; top_id < top->size(); ++top_id) { + for (int top_id = 0; top_id < top.size(); ++top_id) { if (!this->loss(top_id)) { continue; } - const int count = (*top)[top_id]->count(); - const Dtype* data = (*top)[top_id]->cpu_data(); - const Dtype* loss_weights = (*top)[top_id]->cpu_diff(); + const int count = top[top_id]->count(); + const Dtype* data = top[top_id]->cpu_data(); + const Dtype* loss_weights = top[top_id]->cpu_diff(); loss += caffe_cpu_dot(count, data, loss_weights); } break; case Caffe::GPU: Forward_gpu(bottom, top); #ifndef CPU_ONLY - for (int top_id = 0; top_id < top->size(); ++top_id) { + for (int top_id = 0; top_id < top.size(); ++top_id) { if (!this->loss(top_id)) { continue; } - const int count = (*top)[top_id]->count(); - const Dtype* data = (*top)[top_id]->gpu_data(); - const Dtype* loss_weights = (*top)[top_id]->gpu_diff(); + const int count = top[top_id]->count(); + const Dtype* data = top[top_id]->gpu_data(); + const Dtype* loss_weights = top[top_id]->gpu_diff(); Dtype blob_loss = 0; caffe_gpu_dot(count, data, loss_weights, &blob_loss); loss += blob_loss; @@ -444,7 +445,7 @@ inline Dtype Layer<Dtype>::Forward(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> inline void Layer<Dtype>::Backward(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { switch (Caffe::mode()) { case Caffe::CPU: Backward_cpu(top, propagate_down, bottom); diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 08aa7752d4a..9fe58cd97bc 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -33,9 +33,9 @@ class AccuracyLayer : public Layer<Dtype> { explicit AccuracyLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_ACCURACY; @@ -70,12 +70,12 @@ class AccuracyLayer : public Layer<Dtype> { * @f$ */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /// @brief Not implemented -- AccuracyLayer cannot be used as a loss. virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { for (int i = 0; i < propagate_down.size(); ++i) { if (propagate_down[i]) { NOT_IMPLEMENTED; } } @@ -98,9 +98,9 @@ class LossLayer : public Layer<Dtype> { explicit LossLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Reshape( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual inline int ExactNumBottomBlobs() const { return 2; } @@ -151,7 +151,7 @@ class ContrastiveLossLayer : public LossLayer<Dtype> { explicit ContrastiveLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param), diff_() {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline int ExactNumBottomBlobs() const { return 3; } virtual inline LayerParameter_LayerType type() const { @@ -168,9 +168,9 @@ class ContrastiveLossLayer : public LossLayer<Dtype> { protected: /// @copydoc ContrastiveLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the Contrastive error gradient w.r.t. the inputs. @@ -198,9 +198,9 @@ class ContrastiveLossLayer : public LossLayer<Dtype> { * propagate_down[1] */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); Blob<Dtype> diff_; // cached for backward pass Blob<Dtype> dist_sq_; // cached for backward pass @@ -240,7 +240,7 @@ class EuclideanLossLayer : public LossLayer<Dtype> { explicit EuclideanLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param), diff_() {} virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_EUCLIDEAN_LOSS; @@ -257,9 +257,9 @@ class EuclideanLossLayer : public LossLayer<Dtype> { protected: /// @copydoc EuclideanLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the Euclidean error gradient w.r.t. the inputs. @@ -295,9 +295,9 @@ class EuclideanLossLayer : public LossLayer<Dtype> { * @f$ if propagate_down[1] */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); Blob<Dtype> diff_; }; @@ -358,7 +358,7 @@ class HingeLossLayer : public LossLayer<Dtype> { protected: /// @copydoc HingeLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the hinge loss error gradient w.r.t. the predictions. @@ -388,7 +388,7 @@ class HingeLossLayer : public LossLayer<Dtype> { * the labels -- ignored as we can't compute their error gradients */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); }; /** @@ -429,9 +429,9 @@ class InfogainLossLayer : public LossLayer<Dtype> { explicit InfogainLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param), infogain_() {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); // InfogainLossLayer takes 2-3 bottom Blobs; if there are 3 the third should // be the infogain matrix. (Otherwise the infogain matrix is loaded from a @@ -447,7 +447,7 @@ class InfogainLossLayer : public LossLayer<Dtype> { protected: /// @copydoc InfogainLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the infogain loss error gradient w.r.t. the predictions. @@ -482,7 +482,7 @@ class InfogainLossLayer : public LossLayer<Dtype> { * gradient computation is not implemented. */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); Blob<Dtype> infogain_; }; @@ -522,7 +522,7 @@ class MultinomialLogisticLossLayer : public LossLayer<Dtype> { explicit MultinomialLogisticLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param) {} virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS; @@ -531,7 +531,7 @@ class MultinomialLogisticLossLayer : public LossLayer<Dtype> { protected: /// @copydoc MultinomialLogisticLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the multinomial logistic loss error gradient w.r.t. the @@ -562,7 +562,7 @@ class MultinomialLogisticLossLayer : public LossLayer<Dtype> { * the labels -- ignored as we can't compute their error gradients */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); }; /** @@ -602,9 +602,9 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { sigmoid_layer_(new SigmoidLayer<Dtype>(param)), sigmoid_output_(new Blob<Dtype>()) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS; @@ -613,9 +613,9 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { protected: /// @copydoc SigmoidCrossEntropyLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the sigmoid cross-entropy loss error gradient w.r.t. the @@ -648,9 +648,9 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { * the labels -- ignored as we can't compute their error gradients */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); /// The internal SigmoidLayer used to map predictions to probabilities. shared_ptr<SigmoidLayer<Dtype> > sigmoid_layer_; @@ -700,9 +700,9 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { : LossLayer<Dtype>(param), softmax_layer_(new SoftmaxLayer<Dtype>(param)) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_SOFTMAX_LOSS; @@ -717,9 +717,9 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { protected: /// @copydoc SoftmaxWithLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the softmax loss error gradient w.r.t. the predictions. @@ -749,9 +749,9 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { * the labels -- ignored as we can't compute their error gradients */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); /// The internal SoftmaxLayer used to map predictions to a distribution. shared_ptr<SoftmaxLayer<Dtype> > softmax_layer_; diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 0968a2007dc..64a1fd325ad 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -27,7 +27,7 @@ class NeuronLayer : public Layer<Dtype> { explicit NeuronLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_NONE; @@ -52,7 +52,7 @@ class AbsValLayer : public NeuronLayer<Dtype> { explicit AbsValLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_ABSVAL; @@ -63,9 +63,9 @@ class AbsValLayer : public NeuronLayer<Dtype> { protected: /// @copydoc AbsValLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the error gradient w.r.t. the absolute value inputs. @@ -85,9 +85,9 @@ class AbsValLayer : public NeuronLayer<Dtype> { * @f$ if propagate_down[0] */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); }; /** @@ -120,9 +120,9 @@ class BNLLLayer : public NeuronLayer<Dtype> { protected: /// @copydoc BNLLLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the error gradient w.r.t. the BNLL inputs. @@ -141,9 +141,9 @@ class BNLLLayer : public NeuronLayer<Dtype> { * @f$ if propagate_down[0] */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); }; /** @@ -169,9 +169,9 @@ class DropoutLayer : public NeuronLayer<Dtype> { explicit DropoutLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_DROPOUT; @@ -195,13 +195,13 @@ class DropoutLayer : public NeuronLayer<Dtype> { * @f$ y_{\mbox{test}} = \mathbb{E}[y_{\mbox{train}}] = x @f$. */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); /// when divided by UINT_MAX, the randomly generated values @f$u\sim U(0,1)@f$ Blob<unsigned int> rand_vec_; @@ -230,7 +230,7 @@ class PowerLayer : public NeuronLayer<Dtype> { explicit PowerLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_POWER; @@ -248,9 +248,9 @@ class PowerLayer : public NeuronLayer<Dtype> { * @f$ */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the error gradient w.r.t. the power inputs. @@ -273,9 +273,9 @@ class PowerLayer : public NeuronLayer<Dtype> { * @f$ if propagate_down[0] */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); /// @brief @f$ \gamma @f$ from layer_param_.power_param() Dtype power_; @@ -320,9 +320,9 @@ class ReLULayer : public NeuronLayer<Dtype> { * the computed outputs are @f$ y = \max(0, x) + \nu \min(0, x) @f$. */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the error gradient w.r.t. the ReLU inputs. @@ -353,9 +353,9 @@ class ReLULayer : public NeuronLayer<Dtype> { * @f$. */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); }; #ifdef USE_CUDNN @@ -368,16 +368,16 @@ class CuDNNReLULayer : public ReLULayer<Dtype> { explicit CuDNNReLULayer(const LayerParameter& param) : ReLULayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual ~CuDNNReLULayer(); protected: virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); cudnnHandle_t handle_; cudnnTensor4dDescriptor_t bottom_desc_; @@ -415,9 +415,9 @@ class SigmoidLayer : public NeuronLayer<Dtype> { * @f$ */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the error gradient w.r.t. the sigmoid inputs. @@ -437,9 +437,9 @@ class SigmoidLayer : public NeuronLayer<Dtype> { * @f$ if propagate_down[0] */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); }; #ifdef USE_CUDNN @@ -452,16 +452,16 @@ class CuDNNSigmoidLayer : public SigmoidLayer<Dtype> { explicit CuDNNSigmoidLayer(const LayerParameter& param) : SigmoidLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual ~CuDNNSigmoidLayer(); protected: virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); cudnnHandle_t handle_; cudnnTensor4dDescriptor_t bottom_desc_; @@ -499,9 +499,9 @@ class TanHLayer : public NeuronLayer<Dtype> { * @f$ */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /** * @brief Computes the error gradient w.r.t. the sigmoid inputs. @@ -523,9 +523,9 @@ class TanHLayer : public NeuronLayer<Dtype> { * @f$ if propagate_down[0] */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); }; #ifdef USE_CUDNN @@ -538,16 +538,16 @@ class CuDNNTanHLayer : public TanHLayer<Dtype> { explicit CuDNNTanHLayer(const LayerParameter& param) : TanHLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual ~CuDNNTanHLayer(); protected: virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); cudnnHandle_t handle_; cudnnTensor4dDescriptor_t bottom_desc_; @@ -571,7 +571,7 @@ class ThresholdLayer : public NeuronLayer<Dtype> { explicit ThresholdLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_THRESHOLD; @@ -593,12 +593,12 @@ class ThresholdLayer : public NeuronLayer<Dtype> { * @f$ */ virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); /// @brief Not implemented (non-differentiable function) virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { NOT_IMPLEMENTED; } diff --git a/include/caffe/test/test_gradient_check_util.hpp b/include/caffe/test/test_gradient_check_util.hpp index 5a8d382ff26..22937711b58 100644 --- a/include/caffe/test/test_gradient_check_util.hpp +++ b/include/caffe/test/test_gradient_check_util.hpp @@ -30,24 +30,24 @@ class GradientChecker { // layers. // Note that after the gradient check, we do not guarantee that the data // stored in the layer parameters and the blobs are unchanged. - void CheckGradient(Layer<Dtype>* layer, vector<Blob<Dtype>*>* bottom, - vector<Blob<Dtype>*>* top, int check_bottom = -1) { - layer->SetUp(*bottom, top); + void CheckGradient(Layer<Dtype>* layer, const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top, int check_bottom = -1) { + layer->SetUp(bottom, top); CheckGradientSingle(layer, bottom, top, check_bottom, -1, -1); } void CheckGradientExhaustive(Layer<Dtype>* layer, - vector<Blob<Dtype>*>* bottom, vector<Blob<Dtype>*>* top, + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top, int check_bottom = -1); // CheckGradientEltwise can be used to test layers that perform element-wise // computation only (e.g., neuron layers) -- where (d y_i) / (d x_j) = 0 when // i != j. void CheckGradientEltwise(Layer<Dtype>* layer, - vector<Blob<Dtype>*>* bottom, vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - void CheckGradientSingle(Layer<Dtype>* layer, vector<Blob<Dtype>*>* bottom, - vector<Blob<Dtype>*>* top, int check_bottom, int top_id, - int top_data_id, bool element_wise = false); + void CheckGradientSingle(Layer<Dtype>* layer, + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top, + int check_bottom, int top_id, int top_data_id, bool element_wise = false); // Checks the gradient of a network. This network should not have any data // layers or loss layers, since the function does not explicitly deal with @@ -57,8 +57,8 @@ class GradientChecker { const vector<Blob<Dtype>*>& input); protected: - Dtype GetObjAndGradient(const Layer<Dtype>& layer, vector<Blob<Dtype>*>* top, - int top_id = -1, int top_data_id = -1); + Dtype GetObjAndGradient(const Layer<Dtype>& layer, + const vector<Blob<Dtype>*>& top, int top_id = -1, int top_data_id = -1); Dtype stepsize_; Dtype threshold_; unsigned int seed_; @@ -69,40 +69,40 @@ class GradientChecker { template <typename Dtype> void GradientChecker<Dtype>::CheckGradientSingle(Layer<Dtype>* layer, - vector<Blob<Dtype>*>* bottom, vector<Blob<Dtype>*>* top, + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top, int check_bottom, int top_id, int top_data_id, bool element_wise) { if (element_wise) { CHECK_EQ(0, layer->blobs().size()); CHECK_LE(0, top_id); CHECK_LE(0, top_data_id); - const int top_count = (*top)[top_id]->count(); - for (int blob_id = 0; blob_id < bottom->size(); ++blob_id) { - CHECK_EQ(top_count, (*bottom)[blob_id]->count()); + const int top_count = top[top_id]->count(); + for (int blob_id = 0; blob_id < bottom.size(); ++blob_id) { + CHECK_EQ(top_count, bottom[blob_id]->count()); } } // First, figure out what blobs we need to check against. vector<Blob<Dtype>*> blobs_to_check; - vector<bool> propagate_down(bottom->size(), check_bottom < 0); + vector<bool> propagate_down(bottom.size(), check_bottom < 0); for (int i = 0; i < layer->blobs().size(); ++i) { blobs_to_check.push_back(layer->blobs()[i].get()); } if (check_bottom < 0) { - for (int i = 0; i < bottom->size(); ++i) { - blobs_to_check.push_back((*bottom)[i]); + for (int i = 0; i < bottom.size(); ++i) { + blobs_to_check.push_back(bottom[i]); } } else { - CHECK_LT(check_bottom, bottom->size()); - blobs_to_check.push_back((*bottom)[check_bottom]); + CHECK_LT(check_bottom, bottom.size()); + blobs_to_check.push_back(bottom[check_bottom]); propagate_down[check_bottom] = true; } // Compute the gradient analytically using Backward Caffe::set_random_seed(seed_); // Ignore the loss from the layer (it's just the weighted sum of the losses // from the top blobs, whose gradients we may want to test individually). - layer->Forward(*bottom, top); + layer->Forward(bottom, top); // Get additional loss from the objective GetObjAndGradient(*layer, top, top_id, top_data_id); - layer->Backward(*top, propagate_down, bottom); + layer->Backward(top, propagate_down, bottom); // Store computed gradients for all checked blobs vector<shared_ptr<Blob<Dtype> > > computed_gradient_blobs(blobs_to_check.size()); @@ -127,8 +127,8 @@ void GradientChecker<Dtype>::CheckGradientSingle(Layer<Dtype>* layer, // << current_blob->count() << " parameters."; for (int feat_id = 0; feat_id < current_blob->count(); ++feat_id) { // For an element-wise layer, we only need to do finite differencing to - // compute the derivative of (*top)[top_id][top_data_id] w.r.t. - // (*bottom)[blob_id][i] only for i == top_data_id. For any other + // compute the derivative of top[top_id][top_data_id] w.r.t. + // bottom[blob_id][i] only for i == top_data_id. For any other // i != top_data_id, we know the derivative is 0 by definition, and simply // check that that's true. Dtype estimated_gradient = 0; @@ -139,13 +139,13 @@ void GradientChecker<Dtype>::CheckGradientSingle(Layer<Dtype>* layer, // Compute loss with stepsize_ added to input. current_blob->mutable_cpu_data()[feat_id] += stepsize_; Caffe::set_random_seed(seed_); - layer->Forward(*bottom, top); + layer->Forward(bottom, top); positive_objective = GetObjAndGradient(*layer, top, top_id, top_data_id); // Compute loss with stepsize_ subtracted from input. current_blob->mutable_cpu_data()[feat_id] -= stepsize_ * 2; Caffe::set_random_seed(seed_); - layer->Forward(*bottom, top); + layer->Forward(bottom, top); negative_objective = GetObjAndGradient(*layer, top, top_id, top_data_id); // Recover original input value. @@ -179,13 +179,14 @@ void GradientChecker<Dtype>::CheckGradientSingle(Layer<Dtype>* layer, template <typename Dtype> void GradientChecker<Dtype>::CheckGradientExhaustive(Layer<Dtype>* layer, - vector<Blob<Dtype>*>* bottom, vector<Blob<Dtype>*>* top, int check_bottom) { - layer->SetUp(*bottom, top); - CHECK_GT(top->size(), 0) << "Exhaustive mode requires at least one top blob."; + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top, + int check_bottom) { + layer->SetUp(bottom, top); + CHECK_GT(top.size(), 0) << "Exhaustive mode requires at least one top blob."; // LOG(ERROR) << "Exhaustive Mode."; - for (int i = 0; i < top->size(); ++i) { + for (int i = 0; i < top.size(); ++i) { // LOG(ERROR) << "Exhaustive: blob " << i << " size " << top[i]->count(); - for (int j = 0; j < (*top)[i]->count(); ++j) { + for (int j = 0; j < top[i]->count(); ++j) { // LOG(ERROR) << "Exhaustive: blob " << i << " data " << j; CheckGradientSingle(layer, bottom, top, check_bottom, i, j); } @@ -194,13 +195,13 @@ void GradientChecker<Dtype>::CheckGradientExhaustive(Layer<Dtype>* layer, template <typename Dtype> void GradientChecker<Dtype>::CheckGradientEltwise(Layer<Dtype>* layer, - vector<Blob<Dtype>*>* bottom, vector<Blob<Dtype>*>* top) { - layer->SetUp(*bottom, top); - CHECK_GT(top->size(), 0) << "Eltwise mode requires at least one top blob."; + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { + layer->SetUp(bottom, top); + CHECK_GT(top.size(), 0) << "Eltwise mode requires at least one top blob."; const int check_bottom = -1; const bool element_wise = true; - for (int i = 0; i < top->size(); ++i) { - for (int j = 0; j < (*top)[i]->count(); ++j) { + for (int i = 0; i < top.size(); ++i) { + for (int j = 0; j < top[i]->count(); ++j) { CheckGradientSingle(layer, bottom, top, check_bottom, i, j, element_wise); } } @@ -221,12 +222,12 @@ void GradientChecker<Dtype>::CheckGradientNet( template <typename Dtype> Dtype GradientChecker<Dtype>::GetObjAndGradient(const Layer<Dtype>& layer, - vector<Blob<Dtype>*>* top, int top_id, int top_data_id) { + const vector<Blob<Dtype>*>& top, int top_id, int top_data_id) { Dtype loss = 0; if (top_id < 0) { // the loss will be half of the sum of squares of all outputs - for (int i = 0; i < top->size(); ++i) { - Blob<Dtype>* top_blob = (*top)[i]; + for (int i = 0; i < top.size(); ++i) { + Blob<Dtype>* top_blob = top[i]; const Dtype* top_blob_data = top_blob->cpu_data(); Dtype* top_blob_diff = top_blob->mutable_cpu_diff(); int count = top_blob->count(); @@ -239,14 +240,14 @@ Dtype GradientChecker<Dtype>::GetObjAndGradient(const Layer<Dtype>& layer, loss /= 2.; } else { // the loss will be the top_data_id-th element in the top_id-th blob. - for (int i = 0; i < top->size(); ++i) { - Blob<Dtype>* top_blob = (*top)[i]; + for (int i = 0; i < top.size(); ++i) { + Blob<Dtype>* top_blob = top[i]; Dtype* top_blob_diff = top_blob->mutable_cpu_diff(); caffe_set(top_blob->count(), Dtype(0), top_blob_diff); } const Dtype loss_weight = 2; - loss = (*top)[top_id]->cpu_data()[top_data_id] * loss_weight; - (*top)[top_id]->mutable_cpu_diff()[top_data_id] = loss_weight; + loss = top[top_id]->cpu_data()[top_data_id] * loss_weight; + top[top_id]->mutable_cpu_diff()[top_data_id] = loss_weight; } return loss; } diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index 3df28a49ac3..5a45691bb17 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -12,22 +12,22 @@ #define STUB_GPU(classname) \ template <typename Dtype> \ void classname<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, \ - vector<Blob<Dtype>*>* top) { NO_GPU; } \ + const vector<Blob<Dtype>*>& top) { NO_GPU; } \ template <typename Dtype> \ void classname<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, \ const vector<bool>& propagate_down, \ - vector<Blob<Dtype>*>* bottom) { NO_GPU; } \ + const vector<Blob<Dtype>*>& bottom) { NO_GPU; } \ #define STUB_GPU_FORWARD(classname, funcname) \ template <typename Dtype> \ void classname<Dtype>::funcname##_##gpu(const vector<Blob<Dtype>*>& bottom, \ - vector<Blob<Dtype>*>* top) { NO_GPU; } \ + const vector<Blob<Dtype>*>& top) { NO_GPU; } \ #define STUB_GPU_BACKWARD(classname, funcname) \ template <typename Dtype> \ void classname<Dtype>::funcname##_##gpu(const vector<Blob<Dtype>*>& top, \ const vector<bool>& propagate_down, \ - vector<Blob<Dtype>*>* bottom) { NO_GPU; } \ + const vector<Blob<Dtype>*>& bottom) { NO_GPU; } \ #else // Normal GPU + CPU Caffe. diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 1e7f3fcb297..0f1b2d9e529 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -66,9 +66,9 @@ class ConvolutionLayer : public Layer<Dtype> { explicit ConvolutionLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_CONVOLUTION; @@ -79,13 +79,13 @@ class ConvolutionLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); int kernel_h_, kernel_w_; int stride_h_, stride_w_; @@ -132,16 +132,16 @@ class CuDNNConvolutionLayer : public ConvolutionLayer<Dtype> { explicit CuDNNConvolutionLayer(const LayerParameter& param) : ConvolutionLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual ~CuDNNConvolutionLayer(); protected: virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); cudnnHandle_t* handle_; cudaStream_t* stream_; @@ -166,9 +166,9 @@ class Im2colLayer : public Layer<Dtype> { explicit Im2colLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_IM2COL; @@ -178,13 +178,13 @@ class Im2colLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); int kernel_h_, kernel_w_; int stride_h_, stride_w_; @@ -208,9 +208,9 @@ class LRNLayer : public Layer<Dtype> { explicit LRNLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_LRN; @@ -220,26 +220,26 @@ class LRNLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void CrossChannelForward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void CrossChannelForward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void WithinChannelForward(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void CrossChannelBackward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void CrossChannelBackward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void WithinChannelBackward(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); int size_; int pre_pad_; @@ -285,9 +285,9 @@ class PoolingLayer : public Layer<Dtype> { explicit PoolingLayer(const LayerParameter& param) : Layer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_POOLING; @@ -303,13 +303,13 @@ class PoolingLayer : public Layer<Dtype> { protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); int kernel_h_, kernel_w_; int stride_h_, stride_w_; @@ -332,16 +332,16 @@ class CuDNNPoolingLayer : public PoolingLayer<Dtype> { explicit CuDNNPoolingLayer(const LayerParameter& param) : PoolingLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual ~CuDNNPoolingLayer(); protected: virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top); + const vector<Blob<Dtype>*>& top); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); cudnnHandle_t handle_; cudnnTensor4dDescriptor_t bottom_desc_, top_desc_; diff --git a/src/caffe/layers/absval_layer.cpp b/src/caffe/layers/absval_layer.cpp index ce9d05cc764..54e484b115d 100644 --- a/src/caffe/layers/absval_layer.cpp +++ b/src/caffe/layers/absval_layer.cpp @@ -8,29 +8,29 @@ namespace caffe { template <typename Dtype> void AbsValLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { NeuronLayer<Dtype>::LayerSetUp(bottom, top); - CHECK_NE((*top)[0], bottom[0]) << this->type_name() << " Layer does not " + CHECK_NE(top[0], bottom[0]) << this->type_name() << " Layer does not " "allow in-place computation."; } template <typename Dtype> void AbsValLayer<Dtype>::Forward_cpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - const int count = (*top)[0]->count(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { + const int count = top[0]->count(); + Dtype* top_data = top[0]->mutable_cpu_data(); caffe_abs(count, bottom[0]->cpu_data(), top_data); } template <typename Dtype> void AbsValLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const int count = top[0]->count(); const Dtype* top_data = top[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); if (propagate_down[0]) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); caffe_div(count, top_data, bottom_data, bottom_diff); caffe_mul(count, bottom_diff, top_diff, bottom_diff); } diff --git a/src/caffe/layers/absval_layer.cu b/src/caffe/layers/absval_layer.cu index 46778aa79b1..48c766465fa 100644 --- a/src/caffe/layers/absval_layer.cu +++ b/src/caffe/layers/absval_layer.cu @@ -8,21 +8,21 @@ namespace caffe { template <typename Dtype> void AbsValLayer<Dtype>::Forward_gpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - const int count = (*top)[0]->count(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { + const int count = top[0]->count(); + Dtype* top_data = top[0]->mutable_gpu_data(); caffe_gpu_abs(count, bottom[0]->gpu_data(), top_data); } template <typename Dtype> void AbsValLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const int count = top[0]->count(); const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); if (propagate_down[0]) { - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); caffe_gpu_div(count, top_data, bottom_data, bottom_diff); caffe_gpu_mul(count, bottom_diff, top_diff, bottom_diff); } diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 3e69bc84faa..399cf2a3585 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -12,13 +12,13 @@ namespace caffe { template <typename Dtype> void AccuracyLayer<Dtype>::LayerSetUp( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { top_k_ = this->layer_param_.accuracy_param().top_k(); } template <typename Dtype> void AccuracyLayer<Dtype>::Reshape( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; CHECK_LE(top_k_, bottom[0]->count() / bottom[0]->num()) @@ -26,12 +26,12 @@ void AccuracyLayer<Dtype>::Reshape( CHECK_EQ(bottom[1]->channels(), 1); CHECK_EQ(bottom[1]->height(), 1); CHECK_EQ(bottom[1]->width(), 1); - (*top)[0]->Reshape(1, 1, 1, 1); + top[0]->Reshape(1, 1, 1, 1); } template <typename Dtype> void AccuracyLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { Dtype accuracy = 0; const Dtype* bottom_data = bottom[0]->cpu_data(); const Dtype* bottom_label = bottom[1]->cpu_data(); @@ -59,7 +59,7 @@ void AccuracyLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } // LOG(INFO) << "Accuracy: " << accuracy; - (*top)[0]->mutable_cpu_data()[0] = accuracy / num; + top[0]->mutable_cpu_data()[0] = accuracy / num; // Accuracy layer should not be used as a loss function. } diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index 0d1a107257b..dbe0a834aa5 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -10,7 +10,7 @@ namespace caffe { template <typename Dtype> void ArgMaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { out_max_val_ = this->layer_param_.argmax_param().out_max_val(); top_k_ = this->layer_param_.argmax_param().top_k(); CHECK_GE(top_k_, 1) << " top k must not be less than 1."; @@ -20,21 +20,21 @@ void ArgMaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void ArgMaxLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { if (out_max_val_) { // Produces max_ind and max_val - (*top)[0]->Reshape(bottom[0]->num(), 2, top_k_, 1); + top[0]->Reshape(bottom[0]->num(), 2, top_k_, 1); } else { // Produces only max_ind - (*top)[0]->Reshape(bottom[0]->num(), 1, top_k_, 1); + top[0]->Reshape(bottom[0]->num(), 1, top_k_, 1); } } template <typename Dtype> void ArgMaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); int num = bottom[0]->num(); int dim = bottom[0]->count() / bottom[0]->num(); for (int i = 0; i < num; ++i) { @@ -47,11 +47,11 @@ void ArgMaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, bottom_data_vector.begin(), bottom_data_vector.begin() + top_k_, bottom_data_vector.end(), std::greater<std::pair<Dtype, int> >()); for (int j = 0; j < top_k_; ++j) { - top_data[(*top)[0]->offset(i, 0, j)] = bottom_data_vector[j].second; + top_data[top[0]->offset(i, 0, j)] = bottom_data_vector[j].second; } if (out_max_val_) { for (int j = 0; j < top_k_; ++j) { - top_data[(*top)[0]->offset(i, 1, j)] = bottom_data_vector[j].first; + top_data[top[0]->offset(i, 1, j)] = bottom_data_vector[j].first; } } } diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 9b1d55831a7..86abbae8f4c 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -15,8 +15,8 @@ BaseDataLayer<Dtype>::BaseDataLayer(const LayerParameter& param) template <typename Dtype> void BaseDataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - if (top->size() == 1) { + const vector<Blob<Dtype>*>& top) { + if (top.size() == 1) { output_labels_ = false; } else { output_labels_ = true; @@ -51,7 +51,7 @@ void BaseDataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void BasePrefetchingDataLayer<Dtype>::LayerSetUp( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { BaseDataLayer<Dtype>::LayerSetUp(bottom, top); // Now, start the prefetch thread. Before calling prefetch, we make two // cpu_data calls so that the prefetch thread does not accidentally make @@ -80,15 +80,15 @@ void BasePrefetchingDataLayer<Dtype>::JoinPrefetchThread() { template <typename Dtype> void BasePrefetchingDataLayer<Dtype>::Forward_cpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // First, join the thread JoinPrefetchThread(); // Copy the data caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), - (*top)[0]->mutable_cpu_data()); + top[0]->mutable_cpu_data()); if (this->output_labels_) { caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), - (*top)[1]->mutable_cpu_data()); + top[1]->mutable_cpu_data()); } // Start a new prefetch thread CreatePrefetchThread(); diff --git a/src/caffe/layers/base_data_layer.cu b/src/caffe/layers/base_data_layer.cu index 8189c79c9d4..ff1510361b6 100644 --- a/src/caffe/layers/base_data_layer.cu +++ b/src/caffe/layers/base_data_layer.cu @@ -6,15 +6,15 @@ namespace caffe { template <typename Dtype> void BasePrefetchingDataLayer<Dtype>::Forward_gpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // First, join the thread JoinPrefetchThread(); // Copy the data caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), - (*top)[0]->mutable_gpu_data()); + top[0]->mutable_gpu_data()); if (this->output_labels_) { caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), - (*top)[1]->mutable_gpu_data()); + top[1]->mutable_gpu_data()); } // Start a new prefetch thread CreatePrefetchThread(); diff --git a/src/caffe/layers/bnll_layer.cpp b/src/caffe/layers/bnll_layer.cpp index ef98326a23e..bae692509e3 100644 --- a/src/caffe/layers/bnll_layer.cpp +++ b/src/caffe/layers/bnll_layer.cpp @@ -10,9 +10,9 @@ const float kBNLL_THRESHOLD = 50.; template <typename Dtype> void BNLLLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { top_data[i] = bottom_data[i] > 0 ? @@ -24,12 +24,12 @@ void BNLLLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void BNLLLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + const int count = bottom[0]->count(); Dtype expval; for (int i = 0; i < count; ++i) { expval = exp(std::min(bottom_data[i], Dtype(kBNLL_THRESHOLD))); diff --git a/src/caffe/layers/bnll_layer.cu b/src/caffe/layers/bnll_layer.cu index b940133b4b3..3993bccd9b5 100644 --- a/src/caffe/layers/bnll_layer.cu +++ b/src/caffe/layers/bnll_layer.cu @@ -19,9 +19,9 @@ __global__ void BNLLForward(const int n, const Dtype* in, Dtype* out) { template <typename Dtype> void BNLLLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); const int count = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) BNLLForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( @@ -41,12 +41,12 @@ __global__ void BNLLBackward(const int n, const Dtype* in_diff, template <typename Dtype> void BNLLLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + const Dtype* bottom_data = bottom[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); + const int count = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) BNLLBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( count, top_diff, bottom_data, bottom_diff); diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index 10a11f1bb7c..f8f73564a6f 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -8,7 +8,7 @@ namespace caffe { template <typename Dtype> void ConcatLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { concat_dim_ = this->layer_param_.concat_param().concat_dim(); CHECK_GE(concat_dim_, 0) << "concat_dim should be >= 0"; @@ -18,7 +18,7 @@ void ConcatLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void ConcatLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { // Initialize with the first blob. count_ = bottom[0]->count(); num_ = bottom[0]->num(); @@ -37,20 +37,20 @@ void ConcatLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, width_ += bottom[i]->width(); } } - (*top)[0]->Reshape(num_, channels_, height_, width_); - CHECK_EQ(count_, (*top)[0]->count()); + top[0]->Reshape(num_, channels_, height_, width_); + CHECK_EQ(count_, top[0]->count()); } template <typename Dtype> void ConcatLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const vector<Blob<Dtype>*>& top) { + Dtype* top_data = top[0]->mutable_cpu_data(); if (concat_dim_== 0) { int offset_num = 0; for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->cpu_data(); int num_elem = bottom[i]->count(); - caffe_copy(num_elem, bottom_data, top_data+(*top)[0]->offset(offset_num)); + caffe_copy(num_elem, bottom_data, top_data+top[0]->offset(offset_num)); offset_num += bottom[i]->num(); } } else if (concat_dim_ == 1) { @@ -61,7 +61,7 @@ void ConcatLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, bottom[i]->channels()*bottom[i]->height()*bottom[i]->width(); for (int n = 0; n < num_; ++n) { caffe_copy(num_elem, bottom_data+bottom[i]->offset(n), - top_data+(*top)[0]->offset(n, offset_channel)); + top_data+top[0]->offset(n, offset_channel)); } offset_channel += bottom[i]->channels(); } // concat_dim_ is guaranteed to be 0 or 1 by LayerSetUp. @@ -70,12 +70,12 @@ void ConcatLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void ConcatLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const Dtype* top_diff = top[0]->cpu_diff(); if (concat_dim_ == 0) { int offset_num = 0; - for (int i = 0; i < bottom->size(); ++i) { - Blob<Dtype>* blob = (*bottom)[i]; + for (int i = 0; i < bottom.size(); ++i) { + Blob<Dtype>* blob = bottom[i]; if (propagate_down[i]) { Dtype* bottom_diff = blob->mutable_cpu_diff(); caffe_copy(blob->count(), top_diff + top[0]->offset(offset_num), @@ -85,8 +85,8 @@ void ConcatLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } } else if (concat_dim_ == 1) { int offset_channel = 0; - for (int i = 0; i < bottom->size(); ++i) { - Blob<Dtype>* blob = (*bottom)[i]; + for (int i = 0; i < bottom.size(); ++i) { + Blob<Dtype>* blob = bottom[i]; if (propagate_down[i]) { Dtype* bottom_diff = blob->mutable_cpu_diff(); int num_elem = blob->channels()*blob->height()*blob->width(); diff --git a/src/caffe/layers/concat_layer.cu b/src/caffe/layers/concat_layer.cu index 99c55da25cb..1b4e40aa415 100644 --- a/src/caffe/layers/concat_layer.cu +++ b/src/caffe/layers/concat_layer.cu @@ -8,14 +8,14 @@ namespace caffe { template <typename Dtype> void ConcatLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + const vector<Blob<Dtype>*>& top) { + Dtype* top_data = top[0]->mutable_gpu_data(); if (concat_dim_ == 0) { int offset_num = 0; for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); caffe_copy(bottom[i]->count(), bottom_data, - top_data + (*top)[0]->offset(offset_num)); + top_data + top[0]->offset(offset_num)); offset_num += bottom[i]->num(); } } else if (concat_dim_ == 1) { @@ -26,7 +26,7 @@ void ConcatLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, bottom[i]->channels() * bottom[i]->height() * bottom[i]->width(); for (int n = 0; n < num_; ++n) { caffe_copy(num_elem, bottom_data+bottom[i]->offset(n), - top_data + (*top)[0]->offset(n, offset_channel)); + top_data + top[0]->offset(n, offset_channel)); } offset_channel += bottom[i]->channels(); } @@ -38,12 +38,12 @@ void ConcatLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void ConcatLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const Dtype* top_diff = top[0]->gpu_diff(); if (concat_dim_ == 0) { int offset_num = 0; - for (int i = 0; i < bottom->size(); ++i) { - Blob<Dtype>* blob = (*bottom)[i]; + for (int i = 0; i < bottom.size(); ++i) { + Blob<Dtype>* blob = bottom[i]; if (propagate_down[i]) { Dtype* bottom_diff = blob->mutable_gpu_diff(); caffe_copy(blob->count(), top_diff + top[0]->offset(offset_num), @@ -53,8 +53,8 @@ void ConcatLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } else if (concat_dim_ == 1) { int offset_channel = 0; - for (int i = 0; i < bottom->size(); ++i) { - Blob<Dtype>* blob = (*bottom)[i]; + for (int i = 0; i < bottom.size(); ++i) { + Blob<Dtype>* blob = bottom[i]; if (propagate_down[i]) { Dtype* bottom_diff = blob->mutable_gpu_diff(); int num_elem = blob->channels()*blob->height()*blob->width(); diff --git a/src/caffe/layers/contrastive_loss_layer.cpp b/src/caffe/layers/contrastive_loss_layer.cpp index 072a5a535be..d716d140ea0 100644 --- a/src/caffe/layers/contrastive_loss_layer.cpp +++ b/src/caffe/layers/contrastive_loss_layer.cpp @@ -10,7 +10,7 @@ namespace caffe { template <typename Dtype> void ContrastiveLossLayer<Dtype>::LayerSetUp( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::LayerSetUp(bottom, top); CHECK_EQ(bottom[0]->channels(), bottom[1]->channels()); CHECK_EQ(bottom[0]->height(), 1); @@ -32,7 +32,7 @@ void ContrastiveLossLayer<Dtype>::LayerSetUp( template <typename Dtype> void ContrastiveLossLayer<Dtype>::Forward_cpu( const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { int count = bottom[0]->count(); caffe_sub( count, @@ -52,23 +52,23 @@ void ContrastiveLossLayer<Dtype>::Forward_cpu( } } loss = loss / static_cast<Dtype>(bottom[0]->num()) / Dtype(2); - (*top)[0]->mutable_cpu_data()[0] = loss; + top[0]->mutable_cpu_data()[0] = loss; } template <typename Dtype> void ContrastiveLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { Dtype margin = this->layer_param_.contrastive_loss_param().margin(); for (int i = 0; i < 2; ++i) { if (propagate_down[i]) { const Dtype sign = (i == 0) ? 1 : -1; const Dtype alpha = sign * top[0]->cpu_diff()[0] / - static_cast<Dtype>((*bottom)[i]->num()); - int num = (*bottom)[i]->num(); - int channels = (*bottom)[i]->channels(); + static_cast<Dtype>(bottom[i]->num()); + int num = bottom[i]->num(); + int channels = bottom[i]->channels(); for (int j = 0; j < num; ++j) { - Dtype* bout = (*bottom)[i]->mutable_cpu_diff(); - if (static_cast<int>((*bottom)[2]->cpu_data()[j])) { // similar pairs + Dtype* bout = bottom[i]->mutable_cpu_diff(); + if (static_cast<int>(bottom[2]->cpu_data()[j])) { // similar pairs caffe_cpu_axpby( channels, alpha, diff --git a/src/caffe/layers/contrastive_loss_layer.cu b/src/caffe/layers/contrastive_loss_layer.cu index 672ad5bc2f8..14b55b37173 100644 --- a/src/caffe/layers/contrastive_loss_layer.cu +++ b/src/caffe/layers/contrastive_loss_layer.cu @@ -10,7 +10,7 @@ namespace caffe { template <typename Dtype> void ContrastiveLossLayer<Dtype>::Forward_gpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { const int count = bottom[0]->count(); caffe_gpu_sub( count, @@ -41,7 +41,7 @@ void ContrastiveLossLayer<Dtype>::Forward_gpu( } } loss = loss / static_cast<Dtype>(bottom[0]->num()) / Dtype(2); - (*top)[0]->mutable_cpu_data()[0] = loss; + top[0]->mutable_cpu_data()[0] = loss; } template <typename Dtype> @@ -65,22 +65,22 @@ __global__ void CLLForward(const int count, const int channels, template <typename Dtype> void ContrastiveLossLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { for (int i = 0; i < 2; ++i) { if (propagate_down[i]) { - const int count = (*bottom)[0]->count(); - const int channels = (*bottom)[0]->channels(); + const int count = bottom[0]->count(); + const int channels = bottom[0]->channels(); Dtype margin = this->layer_param_.contrastive_loss_param().margin(); const Dtype sign = (i == 0) ? 1 : -1; const Dtype alpha = sign * top[0]->cpu_diff()[0] / - static_cast<Dtype>((*bottom)[0]->num()); + static_cast<Dtype>(bottom[0]->num()); // NOLINT_NEXT_LINE(whitespace/operators) CLLForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( count, channels, margin, alpha, - (*bottom)[2]->gpu_data(), // pair similarity 0 or 1 + bottom[2]->gpu_data(), // pair similarity 0 or 1 diff_.gpu_data(), // the cached eltwise difference between a and b dist_sq_.gpu_data(), // the cached square distance between a and b - (*bottom)[i]->mutable_gpu_diff()); + bottom[i]->mutable_gpu_diff()); CUDA_POST_KERNEL_CHECK; } } diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 58918fd4baf..8c08c100bd5 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -10,7 +10,7 @@ namespace caffe { template <typename Dtype> void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { // Configure the kernel size, padding, stride, and inputs. ConvolutionParameter conv_param = this->layer_param_.convolution_param(); CHECK(!conv_param.has_kernel_size() != @@ -89,7 +89,7 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void ConvolutionLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { num_ = bottom[0]->num(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); @@ -109,8 +109,8 @@ void ConvolutionLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, height_out_ = (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; width_out_ = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; - for (int top_id = 0; top_id < top->size(); ++top_id) { - (*top)[top_id]->Reshape(num_, num_output_, height_out_, width_out_); + for (int top_id = 0; top_id < top.size(); ++top_id) { + top[top_id]->Reshape(num_, num_output_, height_out_, width_out_); } // Prepare the matrix multiplication computation. // Each input will be convolved as a single GEMM. @@ -121,8 +121,8 @@ void ConvolutionLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, // overly large memory usage. col_buffer_.Reshape( 1, channels_ * kernel_h_ * kernel_w_, height_out_, width_out_); - for (int top_id = 0; top_id < top->size(); ++top_id) { - (*top)[top_id]->Reshape(num_, num_output_, height_out_, width_out_); + for (int top_id = 0; top_id < top.size(); ++top_id) { + top[top_id]->Reshape(num_, num_output_, height_out_, width_out_); } // Set up the all ones "bias multiplier" for adding biases by BLAS if (bias_term_) { @@ -133,10 +133,10 @@ void ConvolutionLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->cpu_data(); - Dtype* top_data = (*top)[i]->mutable_cpu_data(); + Dtype* top_data = top[i]->mutable_cpu_data(); Dtype* col_data = col_buffer_.mutable_cpu_data(); const Dtype* weight = this->blobs_[0]->cpu_data(); int weight_offset = M_ * K_; // number of filter parameters in a group @@ -152,14 +152,14 @@ void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, for (int g = 0; g < group_; ++g) { caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, - (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); + (Dtype)0., top_data + top[i]->offset(n) + top_offset * g); } // Add bias. if (bias_term_) { caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), bias_multiplier_.cpu_data(), - (Dtype)1., top_data + (*top)[i]->offset(n)); + (Dtype)1., top_data + top[i]->offset(n)); } } } @@ -167,7 +167,7 @@ void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const Dtype* weight = NULL; Dtype* weight_diff = NULL; if (this->param_propagate_down_[0]) { @@ -201,12 +201,12 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } Dtype* col_data = col_buffer_.mutable_cpu_data(); Dtype* col_diff = col_buffer_.mutable_cpu_diff(); - const Dtype* bottom_data = (*bottom)[i]->cpu_data(); - Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); + const Dtype* bottom_data = bottom[i]->cpu_data(); + Dtype* bottom_diff = bottom[i]->mutable_cpu_diff(); for (int n = 0; n < num_; ++n) { // Since we saved memory in the forward pass by not storing all col // data, we will need to recompute them. - im2col_cpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, + im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_data); // gradient w.r.t. weight. Note that we will accumulate diffs. @@ -232,7 +232,7 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, // col2im back to the data col2im_cpu(col_diff, channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, bottom_diff + (*bottom)[i]->offset(n)); + stride_h_, stride_w_, bottom_diff + bottom[i]->offset(n)); } } } diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 43f76a2368f..908f5a65855 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -11,10 +11,10 @@ namespace caffe { /// @brief refer to CPU forward -- the BLAS implementation is the same. template <typename Dtype> void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); - Dtype* top_data = (*top)[i]->mutable_gpu_data(); + Dtype* top_data = top[i]->mutable_gpu_data(); Dtype* col_data = col_buffer_.mutable_gpu_data(); const Dtype* weight = this->blobs_[0]->gpu_data(); int weight_offset = M_ * K_; @@ -30,14 +30,14 @@ void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, for (int g = 0; g < group_; ++g) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, - (Dtype)0., top_data + (*top)[i]->offset(n) + top_offset * g); + (Dtype)0., top_data + top[i]->offset(n) + top_offset * g); } // Add bias. if (bias_term_) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), bias_multiplier_.gpu_data(), - (Dtype)1., top_data + (*top)[i]->offset(n)); + (Dtype)1., top_data + top[i]->offset(n)); } } } @@ -46,7 +46,7 @@ void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, /// @brief refer to CPU backward -- the BLAS implementation is the same. template <typename Dtype> void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const Dtype* weight = NULL; Dtype* weight_diff = NULL; if (this->param_propagate_down_[0]) { @@ -80,12 +80,12 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } Dtype* col_data = col_buffer_.mutable_gpu_data(); Dtype* col_diff = col_buffer_.mutable_gpu_diff(); - const Dtype* bottom_data = (*bottom)[i]->gpu_data(); - Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); + const Dtype* bottom_data = bottom[i]->gpu_data(); + Dtype* bottom_diff = bottom[i]->mutable_gpu_diff(); for (int n = 0; n < num_; ++n) { // Since we saved memory in the forward pass by not storing all col // data, we will need to recompute them. - im2col_gpu(bottom_data + (*bottom)[i]->offset(n), channels_, height_, + im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_data); // gradient w.r.t. weight. Note that we will accumulate diffs. @@ -111,7 +111,7 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, // col2im back to the data col2im_gpu(col_diff, channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - bottom_diff + (*bottom)[i]->offset(n)); + bottom_diff + bottom[i]->offset(n)); } } } diff --git a/src/caffe/layers/cudnn_conv_layer.cpp b/src/caffe/layers/cudnn_conv_layer.cpp index 137bbab1976..f74a3dbb02f 100644 --- a/src/caffe/layers/cudnn_conv_layer.cpp +++ b/src/caffe/layers/cudnn_conv_layer.cpp @@ -19,7 +19,7 @@ namespace caffe { */ template <typename Dtype> void CuDNNConvolutionLayer<Dtype>::LayerSetUp( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { ConvolutionLayer<Dtype>::LayerSetUp(bottom, top); // Initialize CUDA streams and cuDNN. stream_ = new cudaStream_t[this->group_ * CUDNN_STREAMS_PER_GROUP]; @@ -62,7 +62,7 @@ void CuDNNConvolutionLayer<Dtype>::LayerSetUp( template <typename Dtype> void CuDNNConvolutionLayer<Dtype>::Reshape( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { ConvolutionLayer<Dtype>::Reshape(bottom, top); bottom_offset_ = (this->channels_ / this->group_) * this->height_ * this->width_; diff --git a/src/caffe/layers/cudnn_conv_layer.cu b/src/caffe/layers/cudnn_conv_layer.cu index 2af13309e18..6961bbeaba5 100644 --- a/src/caffe/layers/cudnn_conv_layer.cu +++ b/src/caffe/layers/cudnn_conv_layer.cu @@ -13,10 +13,10 @@ __global__ void sync_conv_groups() { } template <typename Dtype> void CuDNNConvolutionLayer<Dtype>::Forward_gpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); - Dtype* top_data = (*top)[i]->mutable_gpu_data(); + Dtype* top_data = top[i]->mutable_gpu_data(); const Dtype* weight = this->blobs_[0]->gpu_data(); // Forward through cuDNN in parallel over groups. @@ -48,7 +48,7 @@ void CuDNNConvolutionLayer<Dtype>::Forward_gpu( template <typename Dtype> void CuDNNConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const Dtype* weight = NULL; Dtype* weight_diff = NULL; if (this->param_propagate_down_[0]) { @@ -75,7 +75,7 @@ void CuDNNConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, // Gradient w.r.t. weights. if (this->param_propagate_down_[0]) { - const Dtype* bottom_data = (*bottom)[i]->gpu_data(); + const Dtype* bottom_data = bottom[i]->gpu_data(); CUDNN_CHECK(cudnnConvolutionBackwardFilter(handle_[1*this->group_ + g], bottom_descs_[i], bottom_data + bottom_offset_ * g, top_descs_[i], top_diff + top_offset_ * g, @@ -86,7 +86,7 @@ void CuDNNConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, // Gradient w.r.t. bottom data. if (propagate_down[i]) { - Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); + Dtype* bottom_diff = bottom[i]->mutable_gpu_diff(); CUDNN_CHECK(cudnnConvolutionBackwardData(handle_[2*this->group_ + g], filter_desc_, weight + weight_offset_ * g, top_descs_[i], top_diff + top_offset_ * g, diff --git a/src/caffe/layers/cudnn_pooling_layer.cpp b/src/caffe/layers/cudnn_pooling_layer.cpp index 5aea0dc886e..2af9d21be26 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cpp +++ b/src/caffe/layers/cudnn_pooling_layer.cpp @@ -11,7 +11,7 @@ namespace caffe { template <typename Dtype> void CuDNNPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { PoolingLayer<Dtype>::LayerSetUp(bottom, top); CUDNN_CHECK(cudnnCreate(&handle_)); @@ -24,7 +24,7 @@ void CuDNNPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void CuDNNPoolingLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { PoolingLayer<Dtype>::Reshape(bottom, top); cudnn::setTensor4dDesc<Dtype>(&bottom_desc_, bottom[0]->num(), this->channels_, this->height_, this->width_); diff --git a/src/caffe/layers/cudnn_pooling_layer.cu b/src/caffe/layers/cudnn_pooling_layer.cu index 99c409dcc96..9d270ed25d5 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cu +++ b/src/caffe/layers/cudnn_pooling_layer.cu @@ -11,22 +11,22 @@ namespace caffe { template <typename Dtype> void CuDNNPoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { // Fallback to Caffe for padded pooling, max top mask. - if ((this->pad_h_ > 0 || this->pad_w_ > 0) || (*top).size() > 1) { + if ((this->pad_h_ > 0 || this->pad_w_ > 0) || top.size() > 1) { LOG(WARNING) << "Falling back to standard Caffe for padded pooling."; return PoolingLayer<Dtype>::Forward_gpu(bottom, top); } const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); CUDNN_CHECK(cudnnPoolingForward(handle_, pooling_desc_, bottom_desc_, bottom_data, top_desc_, top_data)); } template <typename Dtype> void CuDNNPoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (!propagate_down[0]) { return; } @@ -39,8 +39,8 @@ void CuDNNPoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* top_data = top[0]->gpu_data(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); CUDNN_CHECK(cudnnPoolingBackward(handle_, pooling_desc_, top_desc_, top_data, top_desc_, top_diff, bottom_desc_, bottom_data, bottom_desc_, bottom_diff)); diff --git a/src/caffe/layers/cudnn_relu_layer.cpp b/src/caffe/layers/cudnn_relu_layer.cpp index 083868f572f..20f486f6bcf 100644 --- a/src/caffe/layers/cudnn_relu_layer.cpp +++ b/src/caffe/layers/cudnn_relu_layer.cpp @@ -9,7 +9,7 @@ namespace caffe { template <typename Dtype> void CuDNNReLULayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { ReLULayer<Dtype>::LayerSetUp(bottom, top); // initialize cuDNN CUDNN_CHECK(cudnnCreate(&handle_)); @@ -19,7 +19,7 @@ void CuDNNReLULayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void CuDNNReLULayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { ReLULayer<Dtype>::Reshape(bottom, top); const int N = bottom[0]->num(); const int K = bottom[0]->channels(); diff --git a/src/caffe/layers/cudnn_relu_layer.cu b/src/caffe/layers/cudnn_relu_layer.cu index a8519f340cc..e3900f37ab9 100644 --- a/src/caffe/layers/cudnn_relu_layer.cu +++ b/src/caffe/layers/cudnn_relu_layer.cu @@ -9,14 +9,14 @@ namespace caffe { template <typename Dtype> void CuDNNReLULayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { // Fallback to standard Caffe for leaky ReLU. if (ReLULayer<Dtype>::layer_param_.relu_param().negative_slope() != 0) { return ReLULayer<Dtype>::Forward_gpu(bottom, top); } const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); CUDNN_CHECK(cudnnActivationForward(this->handle_, CUDNN_ACTIVATION_RELU, this->bottom_desc_, bottom_data, this->top_desc_, top_data)); @@ -25,7 +25,7 @@ void CuDNNReLULayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void CuDNNReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (!propagate_down[0]) { return; } @@ -37,8 +37,8 @@ void CuDNNReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); CUDNN_CHECK(cudnnActivationBackward(this->handle_, CUDNN_ACTIVATION_RELU, this->top_desc_, top_data, this->top_desc_, top_diff, diff --git a/src/caffe/layers/cudnn_sigmoid_layer.cpp b/src/caffe/layers/cudnn_sigmoid_layer.cpp index 3fe800db6f4..a94c0040a28 100644 --- a/src/caffe/layers/cudnn_sigmoid_layer.cpp +++ b/src/caffe/layers/cudnn_sigmoid_layer.cpp @@ -9,7 +9,7 @@ namespace caffe { template <typename Dtype> void CuDNNSigmoidLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { SigmoidLayer<Dtype>::LayerSetUp(bottom, top); // initialize cuDNN CUDNN_CHECK(cudnnCreate(&handle_)); @@ -19,7 +19,7 @@ void CuDNNSigmoidLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void CuDNNSigmoidLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { SigmoidLayer<Dtype>::Reshape(bottom, top); const int N = bottom[0]->num(); const int K = bottom[0]->channels(); diff --git a/src/caffe/layers/cudnn_sigmoid_layer.cu b/src/caffe/layers/cudnn_sigmoid_layer.cu index 43019bd78ae..50bf5fcb9e0 100644 --- a/src/caffe/layers/cudnn_sigmoid_layer.cu +++ b/src/caffe/layers/cudnn_sigmoid_layer.cu @@ -9,9 +9,9 @@ namespace caffe { template <typename Dtype> void CuDNNSigmoidLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); CUDNN_CHECK(cudnnActivationForward(this->handle_, CUDNN_ACTIVATION_SIGMOID, this->bottom_desc_, bottom_data, this->top_desc_, top_data)); @@ -20,15 +20,15 @@ void CuDNNSigmoidLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void CuDNNSigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (!propagate_down[0]) { return; } const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); CUDNN_CHECK(cudnnActivationBackward(this->handle_, CUDNN_ACTIVATION_SIGMOID, this->top_desc_, top_data, this->top_desc_, top_diff, diff --git a/src/caffe/layers/cudnn_softmax_layer.cpp b/src/caffe/layers/cudnn_softmax_layer.cpp index 79ba5237ae3..1a0f406bf38 100644 --- a/src/caffe/layers/cudnn_softmax_layer.cpp +++ b/src/caffe/layers/cudnn_softmax_layer.cpp @@ -13,7 +13,7 @@ namespace caffe { template <typename Dtype> void CuDNNSoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { SoftmaxLayer<Dtype>::LayerSetUp(bottom, top); // Initialize CUDNN. CUDNN_CHECK(cudnnCreate(&handle_)); @@ -23,7 +23,7 @@ void CuDNNSoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void CuDNNSoftmaxLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { SoftmaxLayer<Dtype>::Reshape(bottom, top); int N = bottom[0]->num(); int K = bottom[0]->channels(); diff --git a/src/caffe/layers/cudnn_softmax_layer.cu b/src/caffe/layers/cudnn_softmax_layer.cu index 300bdc496c8..aef66730bff 100644 --- a/src/caffe/layers/cudnn_softmax_layer.cu +++ b/src/caffe/layers/cudnn_softmax_layer.cu @@ -13,9 +13,9 @@ namespace caffe { template <typename Dtype> void CuDNNSoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); CUDNN_CHECK(cudnnSoftmaxForward(handle_, CUDNN_SOFTMAX_ACCURATE, CUDNN_SOFTMAX_MODE_CHANNEL, bottom_desc_, bottom_data, top_desc_, top_data)); @@ -23,12 +23,12 @@ void CuDNNSoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void CuDNNSoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); CUDNN_CHECK(cudnnSoftmaxBackward(handle_, CUDNN_SOFTMAX_ACCURATE, CUDNN_SOFTMAX_MODE_CHANNEL, top_desc_, top_data, top_desc_, top_diff, bottom_desc_, bottom_diff)); diff --git a/src/caffe/layers/cudnn_tanh_layer.cpp b/src/caffe/layers/cudnn_tanh_layer.cpp index 7a5c06f6596..39a3e14b3c8 100644 --- a/src/caffe/layers/cudnn_tanh_layer.cpp +++ b/src/caffe/layers/cudnn_tanh_layer.cpp @@ -9,7 +9,7 @@ namespace caffe { template <typename Dtype> void CuDNNTanHLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { TanHLayer<Dtype>::LayerSetUp(bottom, top); // initialize cuDNN CUDNN_CHECK(cudnnCreate(&handle_)); @@ -19,7 +19,7 @@ void CuDNNTanHLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void CuDNNTanHLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { TanHLayer<Dtype>::Reshape(bottom, top); const int N = bottom[0]->num(); const int K = bottom[0]->channels(); diff --git a/src/caffe/layers/cudnn_tanh_layer.cu b/src/caffe/layers/cudnn_tanh_layer.cu index c475b08c0ee..20f887de8d0 100644 --- a/src/caffe/layers/cudnn_tanh_layer.cu +++ b/src/caffe/layers/cudnn_tanh_layer.cu @@ -9,9 +9,9 @@ namespace caffe { template <typename Dtype> void CuDNNTanHLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); CUDNN_CHECK(cudnnActivationForward(this->handle_, CUDNN_ACTIVATION_TANH, this->bottom_desc_, bottom_data, this->top_desc_, top_data)); @@ -20,15 +20,15 @@ void CuDNNTanHLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void CuDNNTanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (!propagate_down[0]) { return; } const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); CUDNN_CHECK(cudnnActivationBackward(this->handle_, CUDNN_ACTIVATION_TANH, this->top_desc_, top_data, this->top_desc_, top_diff, diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index d2071e2fa4f..b3b6bf3d64f 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -34,7 +34,7 @@ DataLayer<Dtype>::~DataLayer<Dtype>() { template <typename Dtype> void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { // Initialize DB switch (this->layer_param_.data_param().backend()) { case DataParameter_DB_LEVELDB: @@ -114,23 +114,23 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // image int crop_size = this->layer_param_.transform_param().crop_size(); if (crop_size > 0) { - (*top)[0]->Reshape(this->layer_param_.data_param().batch_size(), + top[0]->Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), crop_size, crop_size); this->prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), crop_size, crop_size); } else { - (*top)[0]->Reshape( + top[0]->Reshape( this->layer_param_.data_param().batch_size(), datum.channels(), datum.height(), datum.width()); this->prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), datum.height(), datum.width()); } - LOG(INFO) << "output data size: " << (*top)[0]->num() << "," - << (*top)[0]->channels() << "," << (*top)[0]->height() << "," - << (*top)[0]->width(); + LOG(INFO) << "output data size: " << top[0]->num() << "," + << top[0]->channels() << "," << top[0]->height() << "," + << top[0]->width(); // label if (this->output_labels_) { - (*top)[1]->Reshape(this->layer_param_.data_param().batch_size(), 1, 1, 1); + top[1]->Reshape(this->layer_param_.data_param().batch_size(), 1, 1, 1); this->prefetch_label_.Reshape(this->layer_param_.data_param().batch_size(), 1, 1, 1); } diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index 47feb1d2543..f88027c7062 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -12,7 +12,7 @@ namespace caffe { template <typename Dtype> void DropoutLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { NeuronLayer<Dtype>::LayerSetUp(bottom, top); threshold_ = this->layer_param_.dropout_param().dropout_ratio(); DCHECK(threshold_ > 0.); @@ -23,7 +23,7 @@ void DropoutLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void DropoutLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { NeuronLayer<Dtype>::Reshape(bottom, top); // Set up the cache for random number generation rand_vec_.Reshape(bottom[0]->num(), bottom[0]->channels(), @@ -32,9 +32,9 @@ void DropoutLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void DropoutLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); unsigned int* mask = rand_vec_.mutable_cpu_data(); const int count = bottom[0]->count(); if (Caffe::phase() == Caffe::TRAIN) { @@ -51,13 +51,13 @@ void DropoutLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void DropoutLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); if (Caffe::phase() == Caffe::TRAIN) { const unsigned int* mask = rand_vec_.cpu_data(); - const int count = (*bottom)[0]->count(); + const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { bottom_diff[i] = top_diff[i] * mask[i] * scale_; } diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index 9756c862183..fa737b86a89 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -22,9 +22,9 @@ __global__ void DropoutForward(const int n, const Dtype* in, template <typename Dtype> void DropoutLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); const int count = bottom[0]->count(); if (Caffe::phase() == Caffe::TRAIN) { unsigned int* mask = @@ -52,14 +52,14 @@ __global__ void DropoutBackward(const int n, const Dtype* in_diff, template <typename Dtype> void DropoutLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { const Dtype* top_diff = top[0]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); if (Caffe::phase() == Caffe::TRAIN) { const unsigned int* mask = static_cast<const unsigned int*>(rand_vec_.gpu_data()); - const int count = (*bottom)[0]->count(); + const int count = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) DropoutBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( diff --git a/src/caffe/layers/dummy_data_layer.cpp b/src/caffe/layers/dummy_data_layer.cpp index 883f2528ef8..6aeba5487b8 100644 --- a/src/caffe/layers/dummy_data_layer.cpp +++ b/src/caffe/layers/dummy_data_layer.cpp @@ -8,8 +8,8 @@ namespace caffe { template <typename Dtype> void DummyDataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - const int num_top = top->size(); + const vector<Blob<Dtype>*>& top) { + const int num_top = top.size(); const DummyDataParameter& param = this->layer_param_.dummy_data_param(); const int num_data_filler = param.data_filler_size(); CHECK(num_data_filler == 0 || num_data_filler == 1 || @@ -70,7 +70,7 @@ void DummyDataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, (param.height_size() == 1) ? param.height(0) : param.height(i); const int width = (param.width_size() == 1) ? param.width(0) : param.width(i); - (*top)[i]->Reshape(num, channels, height, width); + top[i]->Reshape(num, channels, height, width); } // Run Forward once, with refill_ inverted, to fill the constant Blobs. this->Forward(bottom, top); @@ -83,11 +83,11 @@ void DummyDataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void DummyDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - for (int i = 0; i < top->size(); ++i) { + const vector<Blob<Dtype>*>& top) { + for (int i = 0; i < top.size(); ++i) { const int filler_id = (fillers_.size() > 1) ? i : 0; if (refill_[filler_id]) { - fillers_[filler_id]->Fill((*top)[i]); + fillers_[filler_id]->Fill(top[i]); } } } diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 569560f97d3..2830d6db195 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -9,7 +9,7 @@ namespace caffe { template <typename Dtype> void EltwiseLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { CHECK(this->layer_param().eltwise_param().coeff_size() == 0 || this->layer_param().eltwise_param().coeff_size() == bottom.size()) << "Eltwise Layer takes one coefficient per bottom blob."; @@ -30,7 +30,7 @@ void EltwiseLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void EltwiseLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const int num = bottom[0]->num(); const int channels = bottom[0]->channels(); const int height = bottom[0]->height(); @@ -41,22 +41,22 @@ void EltwiseLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, CHECK_EQ(height, bottom[i]->height()); CHECK_EQ(width, bottom[i]->width()); } - (*top)[0]->Reshape(num, channels, height, width); + top[0]->Reshape(num, channels, height, width); // If max operation, we will initialize the vector index part. if (this->layer_param_.eltwise_param().operation() == - EltwiseParameter_EltwiseOp_MAX && top->size() == 1) { + EltwiseParameter_EltwiseOp_MAX && top.size() == 1) { max_idx_.Reshape(bottom[0]->num(), channels, height, width); } } template <typename Dtype> void EltwiseLayer<Dtype>::Forward_cpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { int* mask = NULL; const Dtype* bottom_data_a = NULL; const Dtype* bottom_data_b = NULL; - const int count = (*top)[0]->count(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const int count = top[0]->count(); + Dtype* top_data = top[0]->mutable_cpu_data(); switch (op_) { case EltwiseParameter_EltwiseOp_PROD: caffe_mul(count, bottom[0]->cpu_data(), bottom[1]->cpu_data(), top_data); @@ -106,26 +106,26 @@ void EltwiseLayer<Dtype>::Forward_cpu( template <typename Dtype> void EltwiseLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const int* mask = NULL; const int count = top[0]->count(); const Dtype* top_data = top[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); - for (int i = 0; i < bottom->size(); ++i) { + for (int i = 0; i < bottom.size(); ++i) { if (propagate_down[i]) { - const Dtype* bottom_data = (*bottom)[i]->cpu_data(); - Dtype* bottom_diff = (*bottom)[i]->mutable_cpu_diff(); + const Dtype* bottom_data = bottom[i]->cpu_data(); + Dtype* bottom_diff = bottom[i]->mutable_cpu_diff(); switch (op_) { case EltwiseParameter_EltwiseOp_PROD: if (stable_prod_grad_) { bool initialized = false; - for (int j = 0; j < bottom->size(); ++j) { + for (int j = 0; j < bottom.size(); ++j) { if (i == j) { continue; } if (!initialized) { - caffe_copy(count, (*bottom)[j]->cpu_data(), bottom_diff); + caffe_copy(count, bottom[j]->cpu_data(), bottom_diff); initialized = true; } else { - caffe_mul(count, (*bottom)[j]->cpu_data(), bottom_diff, + caffe_mul(count, bottom[j]->cpu_data(), bottom_diff, bottom_diff); } } diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index 16cb6cc77e3..9295cc6ad11 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -33,10 +33,10 @@ __global__ void MaxForward(const int nthreads, const Dtype* bottom_data_a, template <typename Dtype> void EltwiseLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { int* mask = NULL; - const int count = (*top)[0]->count(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + const int count = top[0]->count(); + Dtype* top_data = top[0]->mutable_gpu_data(); switch (op_) { case EltwiseParameter_EltwiseOp_PROD: caffe_gpu_mul(count, bottom[0]->gpu_data(), bottom[1]->gpu_data(), @@ -82,26 +82,26 @@ __global__ void MaxBackward(const int nthreads, const Dtype* top_diff, template <typename Dtype> void EltwiseLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const int* mask = NULL; const int count = top[0]->count(); const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); - for (int i = 0; i < bottom->size(); ++i) { + for (int i = 0; i < bottom.size(); ++i) { if (propagate_down[i]) { - const Dtype* bottom_data = (*bottom)[i]->gpu_data(); - Dtype* bottom_diff = (*bottom)[i]->mutable_gpu_diff(); + const Dtype* bottom_data = bottom[i]->gpu_data(); + Dtype* bottom_diff = bottom[i]->mutable_gpu_diff(); switch (op_) { case EltwiseParameter_EltwiseOp_PROD: if (stable_prod_grad_) { bool initialized = false; - for (int j = 0; j < bottom->size(); ++j) { + for (int j = 0; j < bottom.size(); ++j) { if (i == j) { continue; } if (!initialized) { - caffe_copy(count, (*bottom)[j]->gpu_data(), bottom_diff); + caffe_copy(count, bottom[j]->gpu_data(), bottom_diff); initialized = true; } else { - caffe_gpu_mul(count, (*bottom)[j]->gpu_data(), bottom_diff, + caffe_gpu_mul(count, bottom[j]->gpu_data(), bottom_diff, bottom_diff); } } diff --git a/src/caffe/layers/euclidean_loss_layer.cpp b/src/caffe/layers/euclidean_loss_layer.cpp index 1b4a13d2ddc..abc8610eef6 100644 --- a/src/caffe/layers/euclidean_loss_layer.cpp +++ b/src/caffe/layers/euclidean_loss_layer.cpp @@ -9,7 +9,7 @@ namespace caffe { template <typename Dtype> void EuclideanLossLayer<Dtype>::Reshape( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::Reshape(bottom, top); CHECK_EQ(bottom[0]->channels(), bottom[1]->channels()); CHECK_EQ(bottom[0]->height(), bottom[1]->height()); @@ -20,7 +20,7 @@ void EuclideanLossLayer<Dtype>::Reshape( template <typename Dtype> void EuclideanLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { int count = bottom[0]->count(); caffe_sub( count, @@ -29,22 +29,22 @@ void EuclideanLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, diff_.mutable_cpu_data()); Dtype dot = caffe_cpu_dot(count, diff_.cpu_data(), diff_.cpu_data()); Dtype loss = dot / bottom[0]->num() / Dtype(2); - (*top)[0]->mutable_cpu_data()[0] = loss; + top[0]->mutable_cpu_data()[0] = loss; } template <typename Dtype> void EuclideanLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { for (int i = 0; i < 2; ++i) { if (propagate_down[i]) { const Dtype sign = (i == 0) ? 1 : -1; - const Dtype alpha = sign * top[0]->cpu_diff()[0] / (*bottom)[i]->num(); + const Dtype alpha = sign * top[0]->cpu_diff()[0] / bottom[i]->num(); caffe_cpu_axpby( - (*bottom)[i]->count(), // count + bottom[i]->count(), // count alpha, // alpha diff_.cpu_data(), // a Dtype(0), // beta - (*bottom)[i]->mutable_cpu_diff()); // b + bottom[i]->mutable_cpu_diff()); // b } } } diff --git a/src/caffe/layers/euclidean_loss_layer.cu b/src/caffe/layers/euclidean_loss_layer.cu index 70b1b9ee9ea..0f0c1a86f9d 100644 --- a/src/caffe/layers/euclidean_loss_layer.cu +++ b/src/caffe/layers/euclidean_loss_layer.cu @@ -9,7 +9,7 @@ namespace caffe { template <typename Dtype> void EuclideanLossLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { int count = bottom[0]->count(); caffe_gpu_sub( count, @@ -19,22 +19,22 @@ void EuclideanLossLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, Dtype dot; caffe_gpu_dot(count, diff_.gpu_data(), diff_.gpu_data(), &dot); Dtype loss = dot / bottom[0]->num() / Dtype(2); - (*top)[0]->mutable_cpu_data()[0] = loss; + top[0]->mutable_cpu_data()[0] = loss; } template <typename Dtype> void EuclideanLossLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { for (int i = 0; i < 2; ++i) { if (propagate_down[i]) { const Dtype sign = (i == 0) ? 1 : -1; - const Dtype alpha = sign * top[0]->cpu_diff()[0] / (*bottom)[i]->num(); + const Dtype alpha = sign * top[0]->cpu_diff()[0] / bottom[i]->num(); caffe_gpu_axpby( - (*bottom)[i]->count(), // count + bottom[i]->count(), // count alpha, // alpha diff_.gpu_data(), // a Dtype(0), // beta - (*bottom)[i]->mutable_gpu_diff()); // b + bottom[i]->mutable_gpu_diff()); // b } } } diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index 65310cd1669..44df96d8436 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -8,25 +8,25 @@ namespace caffe { template <typename Dtype> void FlattenLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { int channels_out = bottom[0]->channels() * bottom[0]->height() * bottom[0]->width(); - (*top)[0]->Reshape(bottom[0]->num(), channels_out, 1, 1); + top[0]->Reshape(bottom[0]->num(), channels_out, 1, 1); count_ = bottom[0]->num() * channels_out; CHECK_EQ(count_, bottom[0]->count()); - CHECK_EQ(count_, (*top)[0]->count()); + CHECK_EQ(count_, top[0]->count()); } template <typename Dtype> void FlattenLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - (*top)[0]->ShareData(*bottom[0]); + const vector<Blob<Dtype>*>& top) { + top[0]->ShareData(*bottom[0]); } template <typename Dtype> void FlattenLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { - (*bottom)[0]->ShareDiff(*top[0]); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { + bottom[0]->ShareDiff(*top[0]); } #ifdef CPU_ONLY diff --git a/src/caffe/layers/flatten_layer.cu b/src/caffe/layers/flatten_layer.cu index ff23f523fee..ef89bab6ff4 100644 --- a/src/caffe/layers/flatten_layer.cu +++ b/src/caffe/layers/flatten_layer.cu @@ -8,14 +8,14 @@ namespace caffe { template <typename Dtype> void FlattenLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - (*top)[0]->ShareData(*bottom[0]); + const vector<Blob<Dtype>*>& top) { + top[0]->ShareData(*bottom[0]); } template <typename Dtype> void FlattenLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { - (*bottom)[0]->ShareDiff(*top[0]); + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { + bottom[0]->ShareDiff(*top[0]); } INSTANTIATE_CLASS(FlattenLayer); diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 1f2a83582f2..ff25cbb621f 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -51,7 +51,7 @@ void HDF5DataLayer<Dtype>::LoadHDF5FileData(const char* filename) { template <typename Dtype> void HDF5DataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { // Read the source to parse the filenames. const string& source = this->layer_param_.hdf5_data_param().source(); LOG(INFO) << "Loading filename from " << source; @@ -74,21 +74,21 @@ void HDF5DataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, // Reshape blobs. const int batch_size = this->layer_param_.hdf5_data_param().batch_size(); - (*top)[0]->Reshape(batch_size, data_blob_.channels(), + top[0]->Reshape(batch_size, data_blob_.channels(), data_blob_.width(), data_blob_.height()); - (*top)[1]->Reshape(batch_size, label_blob_.channels(), + top[1]->Reshape(batch_size, label_blob_.channels(), label_blob_.width(), label_blob_.height()); - LOG(INFO) << "output data size: " << (*top)[0]->num() << "," - << (*top)[0]->channels() << "," << (*top)[0]->height() << "," - << (*top)[0]->width(); + LOG(INFO) << "output data size: " << top[0]->num() << "," + << top[0]->channels() << "," << top[0]->height() << "," + << top[0]->width(); } template <typename Dtype> void HDF5DataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const int batch_size = this->layer_param_.hdf5_data_param().batch_size(); - const int data_count = (*top)[0]->count() / (*top)[0]->num(); - const int label_data_count = (*top)[1]->count() / (*top)[1]->num(); + const int data_count = top[0]->count() / top[0]->num(); + const int label_data_count = top[1]->count() / top[1]->num(); for (int i = 0; i < batch_size; ++i, ++current_row_) { if (current_row_ == data_blob_.num()) { @@ -103,10 +103,10 @@ void HDF5DataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, current_row_ = 0; } caffe_copy(data_count, &data_blob_.cpu_data()[current_row_ * data_count], - &(*top)[0]->mutable_cpu_data()[i * data_count]); + &top[0]->mutable_cpu_data()[i * data_count]); caffe_copy(label_data_count, &label_blob_.cpu_data()[current_row_ * label_data_count], - &(*top)[1]->mutable_cpu_data()[i * label_data_count]); + &top[1]->mutable_cpu_data()[i * label_data_count]); } } diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu index 79cc536eb28..f671ea12d76 100644 --- a/src/caffe/layers/hdf5_data_layer.cu +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -18,10 +18,10 @@ namespace caffe { template <typename Dtype> void HDF5DataLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const int batch_size = this->layer_param_.hdf5_data_param().batch_size(); - const int data_count = (*top)[0]->count() / (*top)[0]->num(); - const int label_data_count = (*top)[1]->count() / (*top)[1]->num(); + const int data_count = top[0]->count() / top[0]->num(); + const int label_data_count = top[1]->count() / top[1]->num(); for (int i = 0; i < batch_size; ++i, ++current_row_) { if (current_row_ == data_blob_.num()) { @@ -39,10 +39,10 @@ void HDF5DataLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } caffe_copy(data_count, &data_blob_.cpu_data()[current_row_ * data_count], - &(*top)[0]->mutable_gpu_data()[i * data_count]); + &top[0]->mutable_gpu_data()[i * data_count]); caffe_copy(label_data_count, &label_blob_.cpu_data()[current_row_ * label_data_count], - &(*top)[1]->mutable_gpu_data()[i * label_data_count]); + &top[1]->mutable_gpu_data()[i * label_data_count]); } } diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index 3cdbbb31a6a..b41d387a786 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -40,7 +40,7 @@ void HDF5OutputLayer<Dtype>::SaveBlobs() { template <typename Dtype> void HDF5OutputLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { CHECK_GE(bottom.size(), 2); CHECK_EQ(bottom[0]->num(), bottom[1]->num()); data_blob_.Reshape(bottom[0]->num(), bottom[0]->channels(), @@ -61,7 +61,7 @@ void HDF5OutputLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void HDF5OutputLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { return; } diff --git a/src/caffe/layers/hdf5_output_layer.cu b/src/caffe/layers/hdf5_output_layer.cu index 0813c02a440..929c1ad8e22 100644 --- a/src/caffe/layers/hdf5_output_layer.cu +++ b/src/caffe/layers/hdf5_output_layer.cu @@ -13,7 +13,7 @@ namespace caffe { template <typename Dtype> void HDF5OutputLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { CHECK_GE(bottom.size(), 2); CHECK_EQ(bottom[0]->num(), bottom[1]->num()); data_blob_.Reshape(bottom[0]->num(), bottom[0]->channels(), @@ -34,7 +34,7 @@ void HDF5OutputLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void HDF5OutputLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { return; } diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index 8022aae279c..f09916e2556 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -12,7 +12,7 @@ namespace caffe { template <typename Dtype> void HingeLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); const Dtype* label = bottom[1]->cpu_data(); @@ -30,7 +30,7 @@ void HingeLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, Dtype(0), 1 + bottom_diff[i * dim + j]); } } - Dtype* loss = (*top)[0]->mutable_cpu_data(); + Dtype* loss = top[0]->mutable_cpu_data(); switch (this->layer_param_.hinge_loss_param().norm()) { case HingeLossParameter_Norm_L1: loss[0] = caffe_cpu_asum(count, bottom_diff) / num; @@ -45,16 +45,16 @@ void HingeLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void HingeLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { LOG(FATAL) << this->type_name() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const Dtype* label = (*bottom)[1]->cpu_data(); - int num = (*bottom)[0]->num(); - int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + const Dtype* label = bottom[1]->cpu_data(); + int num = bottom[0]->num(); + int count = bottom[0]->count(); int dim = count / num; for (int i = 0; i < num; ++i) { diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index 870d5a9bde3..10588cebe7f 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -9,7 +9,7 @@ namespace caffe { template <typename Dtype> void Im2colLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { ConvolutionParameter conv_param = this->layer_param_.convolution_param(); CHECK(!conv_param.has_kernel_size() != !(conv_param.has_kernel_h() && conv_param.has_kernel_w())) @@ -49,11 +49,11 @@ void Im2colLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void Im2colLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); - (*top)[0]->Reshape( + top[0]->Reshape( bottom[0]->num(), channels_ * kernel_h_ * kernel_w_, (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1, (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1); @@ -61,25 +61,25 @@ void Im2colLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void Im2colLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); for (int n = 0; n < bottom[0]->num(); ++n) { im2col_cpu(bottom_data + bottom[0]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, top_data + (*top)[0]->offset(n)); + stride_h_, stride_w_, top_data + top[0]->offset(n)); } } template <typename Dtype> void Im2colLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); for (int n = 0; n < top[0]->num(); ++n) { col2im_cpu(top_diff + top[0]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, bottom_diff + (*bottom)[0]->offset(n)); + stride_h_, stride_w_, bottom_diff + bottom[0]->offset(n)); } } diff --git a/src/caffe/layers/im2col_layer.cu b/src/caffe/layers/im2col_layer.cu index 8df061d88e1..bad789c17fe 100644 --- a/src/caffe/layers/im2col_layer.cu +++ b/src/caffe/layers/im2col_layer.cu @@ -9,25 +9,25 @@ namespace caffe { template <typename Dtype> void Im2colLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); for (int n = 0; n < bottom[0]->num(); ++n) { im2col_gpu(bottom_data + bottom[0]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, top_data + (*top)[0]->offset(n)); + stride_h_, stride_w_, top_data + top[0]->offset(n)); } } template <typename Dtype> void Im2colLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const Dtype* top_diff = top[0]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); for (int n = 0; n < top[0]->num(); ++n) { col2im_gpu(top_diff + top[0]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, bottom_diff + (*bottom)[0]->offset(n)); + stride_h_, stride_w_, bottom_diff + bottom[0]->offset(n)); } } diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index e4a575bec93..dc972f13799 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -19,7 +19,7 @@ ImageDataLayer<Dtype>::~ImageDataLayer<Dtype>() { template <typename Dtype> void ImageDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const int new_height = this->layer_param_.image_data_param().new_height(); const int new_width = this->layer_param_.image_data_param().new_width(); CHECK((new_height == 0 && new_width == 0) || @@ -61,20 +61,20 @@ void ImageDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const int crop_size = this->layer_param_.transform_param().crop_size(); const int batch_size = this->layer_param_.image_data_param().batch_size(); if (crop_size > 0) { - (*top)[0]->Reshape(batch_size, datum.channels(), crop_size, crop_size); + top[0]->Reshape(batch_size, datum.channels(), crop_size, crop_size); this->prefetch_data_.Reshape(batch_size, datum.channels(), crop_size, crop_size); } else { - (*top)[0]->Reshape(batch_size, datum.channels(), datum.height(), + top[0]->Reshape(batch_size, datum.channels(), datum.height(), datum.width()); this->prefetch_data_.Reshape(batch_size, datum.channels(), datum.height(), datum.width()); } - LOG(INFO) << "output data size: " << (*top)[0]->num() << "," - << (*top)[0]->channels() << "," << (*top)[0]->height() << "," - << (*top)[0]->width(); + LOG(INFO) << "output data size: " << top[0]->num() << "," + << top[0]->channels() << "," << top[0]->height() << "," + << top[0]->width(); // label - (*top)[1]->Reshape(batch_size, 1, 1, 1); + top[1]->Reshape(batch_size, 1, 1, 1); this->prefetch_label_.Reshape(batch_size, 1, 1, 1); // datum size this->datum_channels_ = datum.channels(); diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index 894cb69811a..c4dc1b4513a 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -12,7 +12,7 @@ namespace caffe { template <typename Dtype> void InfogainLossLayer<Dtype>::LayerSetUp( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::LayerSetUp(bottom, top); if (bottom.size() < 3) { CHECK(this->layer_param_.infogain_loss_param().has_source()) @@ -26,7 +26,7 @@ void InfogainLossLayer<Dtype>::LayerSetUp( template <typename Dtype> void InfogainLossLayer<Dtype>::Reshape( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::Reshape(bottom, top); Blob<Dtype>* infogain = NULL; if (bottom.size() < 3) { @@ -48,7 +48,7 @@ void InfogainLossLayer<Dtype>::Reshape( template <typename Dtype> void InfogainLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); const Dtype* bottom_label = bottom[1]->cpu_data(); const Dtype* infogain_mat = NULL; @@ -67,13 +67,13 @@ void InfogainLossLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, loss -= infogain_mat[label * dim + j] * log(prob); } } - (*top)[0]->mutable_cpu_data()[0] = loss / num; + top[0]->mutable_cpu_data()[0] = loss / num; } template <typename Dtype> void InfogainLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { LOG(FATAL) << this->type_name() << " Layer cannot backpropagate to label inputs."; @@ -83,17 +83,17 @@ void InfogainLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, << " Layer cannot backpropagate to infogain inputs."; } if (propagate_down[0]) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - const Dtype* bottom_label = (*bottom)[1]->cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); + const Dtype* bottom_label = bottom[1]->cpu_data(); const Dtype* infogain_mat = NULL; - if (bottom->size() < 3) { + if (bottom.size() < 3) { infogain_mat = infogain_.cpu_data(); } else { - infogain_mat = (*bottom)[2]->cpu_data(); + infogain_mat = bottom[2]->cpu_data(); } - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - int num = (*bottom)[0]->num(); - int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + int num = bottom[0]->num(); + int dim = bottom[0]->count() / bottom[0]->num(); const Dtype scale = - top[0]->cpu_diff()[0] / num; for (int i = 0; i < num; ++i) { const int label = static_cast<int>(bottom_label[i]); diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index ecd05a030db..ffd872c5a70 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -11,7 +11,7 @@ namespace caffe { template <typename Dtype> void InnerProductLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const int num_output = this->layer_param_.inner_product_param().num_output(); bias_term_ = this->layer_param_.inner_product_param().bias_term(); N_ = num_output; @@ -44,12 +44,12 @@ void InnerProductLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void InnerProductLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { // Figure out the dimensions M_ = bottom[0]->num(); CHECK_EQ(bottom[0]->count() / bottom[0]->num(), K_) << "Input size " "incompatible with inner product parameters."; - (*top)[0]->Reshape(bottom[0]->num(), N_, 1, 1); + top[0]->Reshape(bottom[0]->num(), N_, 1, 1); // Set up the bias multiplier if (bias_term_) { bias_multiplier_.Reshape(1, 1, 1, M_); @@ -59,9 +59,9 @@ void InnerProductLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void InnerProductLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); const Dtype* weight = this->blobs_[0]->cpu_data(); caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, N_, K_, (Dtype)1., bottom_data, weight, (Dtype)0., top_data); @@ -75,10 +75,10 @@ void InnerProductLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void InnerProductLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (this->param_propagate_down_[0]) { const Dtype* top_diff = top[0]->cpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); // Gradient with respect to weight caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1., top_diff, bottom_data, (Dtype)0., this->blobs_[0]->mutable_cpu_diff()); @@ -95,7 +95,7 @@ void InnerProductLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, // Gradient with respect to bottom data caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, K_, N_, (Dtype)1., top_diff, this->blobs_[0]->cpu_data(), (Dtype)0., - (*bottom)[0]->mutable_cpu_diff()); + bottom[0]->mutable_cpu_diff()); } } diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu index 3a0d4388352..2164b4d4f16 100644 --- a/src/caffe/layers/inner_product_layer.cu +++ b/src/caffe/layers/inner_product_layer.cu @@ -11,9 +11,9 @@ namespace caffe { template <typename Dtype> void InnerProductLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); const Dtype* weight = this->blobs_[0]->gpu_data(); caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, N_, K_, (Dtype)1., bottom_data, weight, (Dtype)0., top_data); @@ -27,10 +27,10 @@ void InnerProductLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void InnerProductLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (this->param_propagate_down_[0]) { const Dtype* top_diff = top[0]->gpu_diff(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + const Dtype* bottom_data = bottom[0]->gpu_data(); // Gradient with respect to weight caffe_gpu_gemm<Dtype>(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1., top_diff, bottom_data, (Dtype)0., this->blobs_[0]->mutable_gpu_diff()); @@ -47,7 +47,7 @@ void InnerProductLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, // Gradient with respect to bottom data caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, K_, N_, (Dtype)1., top_diff, this->blobs_[0]->gpu_data(), (Dtype)0., - (*bottom)[0]->mutable_gpu_diff()); + bottom[0]->mutable_gpu_diff()); } } diff --git a/src/caffe/layers/loss_layer.cpp b/src/caffe/layers/loss_layer.cpp index 9eb9dbd5c5b..a5b6d11b065 100644 --- a/src/caffe/layers/loss_layer.cpp +++ b/src/caffe/layers/loss_layer.cpp @@ -12,7 +12,7 @@ namespace caffe { template <typename Dtype> void LossLayer<Dtype>::LayerSetUp( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // LossLayers have a non-zero (1) loss by default. if (this->layer_param_.loss_weight_size() == 0) { this->layer_param_.add_loss_weight(Dtype(1)); @@ -21,10 +21,10 @@ void LossLayer<Dtype>::LayerSetUp( template <typename Dtype> void LossLayer<Dtype>::Reshape( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { CHECK_EQ(bottom[0]->num(), bottom[1]->num()) << "The data and label should have the same number."; - (*top)[0]->Reshape(1, 1, 1, 1); + top[0]->Reshape(1, 1, 1, 1); } INSTANTIATE_CLASS(LossLayer); diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index d9e41e9c137..fb74b03dc88 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -8,7 +8,7 @@ namespace caffe { template <typename Dtype> void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { size_ = this->layer_param_.lrn_param().local_size(); CHECK_EQ(size_ % 2, 1) << "LRN only supports odd values for local_size"; pre_pad_ = (size_ - 1) / 2; @@ -22,7 +22,7 @@ void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, split_top_vec_.push_back(&square_input_); LayerParameter split_param; split_layer_.reset(new SplitLayer<Dtype>(split_param)); - split_layer_->SetUp(bottom, &split_top_vec_); + split_layer_->SetUp(bottom, split_top_vec_); // Set up square_layer_ to square the inputs. square_bottom_vec_.clear(); square_top_vec_.clear(); @@ -31,7 +31,7 @@ void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, LayerParameter square_param; square_param.mutable_power_param()->set_power(Dtype(2)); square_layer_.reset(new PowerLayer<Dtype>(square_param)); - square_layer_->SetUp(square_bottom_vec_, &square_top_vec_); + square_layer_->SetUp(square_bottom_vec_, square_top_vec_); // Set up pool_layer_ to sum over square neighborhoods of the input. pool_top_vec_.clear(); pool_top_vec_.push_back(&pool_output_); @@ -41,7 +41,7 @@ void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, pool_param.mutable_pooling_param()->set_pad(pre_pad_); pool_param.mutable_pooling_param()->set_kernel_size(size_); pool_layer_.reset(new PoolingLayer<Dtype>(pool_param)); - pool_layer_->SetUp(square_top_vec_, &pool_top_vec_); + pool_layer_->SetUp(square_top_vec_, pool_top_vec_); // Set up power_layer_ to compute (1 + alpha_/N^2 s)^-beta_, where s is // the sum of a squared neighborhood (the output of pool_layer_). power_top_vec_.clear(); @@ -51,7 +51,7 @@ void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, power_param.mutable_power_param()->set_scale(alpha_); power_param.mutable_power_param()->set_shift(Dtype(1)); power_layer_.reset(new PowerLayer<Dtype>(power_param)); - power_layer_->SetUp(pool_top_vec_, &power_top_vec_); + power_layer_->SetUp(pool_top_vec_, power_top_vec_); // Set up a product_layer_ to compute outputs by multiplying inputs by the // inverse demoninator computed by the power layer. product_bottom_vec_.clear(); @@ -67,21 +67,21 @@ void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void LRNLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); switch (this->layer_param_.lrn_param().norm_region()) { case LRNParameter_NormRegion_ACROSS_CHANNELS: - (*top)[0]->Reshape(num_, channels_, height_, width_); + top[0]->Reshape(num_, channels_, height_, width_); scale_.Reshape(num_, channels_, height_, width_); break; case LRNParameter_NormRegion_WITHIN_CHANNEL: - split_layer_->Reshape(bottom, &split_top_vec_); - square_layer_->Reshape(square_bottom_vec_, &square_top_vec_); - pool_layer_->Reshape(square_top_vec_, &pool_top_vec_); - power_layer_->Reshape(pool_top_vec_, &power_top_vec_); + split_layer_->Reshape(bottom, split_top_vec_); + square_layer_->Reshape(square_bottom_vec_, square_top_vec_); + pool_layer_->Reshape(square_top_vec_, pool_top_vec_); + power_layer_->Reshape(pool_top_vec_, power_top_vec_); product_layer_->Reshape(product_bottom_vec_, top); break; } @@ -89,7 +89,7 @@ void LRNLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void LRNLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { switch (this->layer_param_.lrn_param().norm_region()) { case LRNParameter_NormRegion_ACROSS_CHANNELS: CrossChannelForward_cpu(bottom, top); @@ -104,9 +104,9 @@ void LRNLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void LRNLayer<Dtype>::CrossChannelForward_cpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); Dtype* scale_data = scale_.mutable_cpu_data(); // start with the constant value for (int i = 0; i < scale_.count(); ++i) { @@ -151,17 +151,17 @@ void LRNLayer<Dtype>::CrossChannelForward_cpu( template <typename Dtype> void LRNLayer<Dtype>::WithinChannelForward( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { - split_layer_->Forward(bottom, &split_top_vec_); - square_layer_->Forward(square_bottom_vec_, &square_top_vec_); - pool_layer_->Forward(square_top_vec_, &pool_top_vec_); - power_layer_->Forward(pool_top_vec_, &power_top_vec_); + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { + split_layer_->Forward(bottom, split_top_vec_); + square_layer_->Forward(square_bottom_vec_, square_top_vec_); + pool_layer_->Forward(square_top_vec_, pool_top_vec_); + power_layer_->Forward(pool_top_vec_, power_top_vec_); product_layer_->Forward(product_bottom_vec_, top); } template <typename Dtype> void LRNLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { switch (this->layer_param_.lrn_param().norm_region()) { case LRNParameter_NormRegion_ACROSS_CHANNELS: CrossChannelBackward_cpu(top, propagate_down, bottom); @@ -177,12 +177,12 @@ void LRNLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, template <typename Dtype> void LRNLayer<Dtype>::CrossChannelBackward_cpu( const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { const Dtype* top_diff = top[0]->cpu_diff(); const Dtype* top_data = top[0]->cpu_data(); - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); const Dtype* scale_data = scale_.cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); Blob<Dtype> padded_ratio(1, channels_ + size_ - 1, height_, width_); Blob<Dtype> accum_ratio(1, 1, height_, width_); Dtype* padded_ratio_data = padded_ratio.mutable_cpu_data(); @@ -232,14 +232,14 @@ void LRNLayer<Dtype>::CrossChannelBackward_cpu( template <typename Dtype> void LRNLayer<Dtype>::WithinChannelBackward( const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { vector<bool> product_propagate_down(2, true); - product_layer_->Backward(top, product_propagate_down, &product_bottom_vec_); - power_layer_->Backward(power_top_vec_, propagate_down, &pool_top_vec_); - pool_layer_->Backward(pool_top_vec_, propagate_down, &square_top_vec_); + product_layer_->Backward(top, product_propagate_down, product_bottom_vec_); + power_layer_->Backward(power_top_vec_, propagate_down, pool_top_vec_); + pool_layer_->Backward(pool_top_vec_, propagate_down, square_top_vec_); square_layer_->Backward(square_top_vec_, propagate_down, - &square_bottom_vec_); + square_bottom_vec_); split_layer_->Backward(split_top_vec_, propagate_down, bottom); } } diff --git a/src/caffe/layers/lrn_layer.cu b/src/caffe/layers/lrn_layer.cu index d6cb23bf245..ee5e359ff0b 100644 --- a/src/caffe/layers/lrn_layer.cu +++ b/src/caffe/layers/lrn_layer.cu @@ -55,7 +55,7 @@ __global__ void LRNFillScale(const int nthreads, const Dtype* in, template <typename Dtype> void LRNLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { switch (this->layer_param_.lrn_param().norm_region()) { case LRNParameter_NormRegion_ACROSS_CHANNELS: CrossChannelForward_gpu(bottom, top); @@ -79,10 +79,10 @@ __global__ void LRNComputeOutput(const int nthreads, const Dtype* in, template <typename Dtype> void LRNLayer<Dtype>::CrossChannelForward_gpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // First, compute scale const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); Dtype* scale_data = scale_.mutable_gpu_data(); // We will launch one kernel for each pixel location, and have the kernel // go through all the channels. @@ -102,7 +102,7 @@ void LRNLayer<Dtype>::CrossChannelForward_gpu( template <typename Dtype> void LRNLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { switch (this->layer_param_.lrn_param().norm_region()) { case LRNParameter_NormRegion_ACROSS_CHANNELS: CrossChannelBackward_gpu(top, propagate_down, bottom); @@ -179,14 +179,14 @@ __global__ void LRNComputeDiff(const int nthreads, const Dtype* bottom_data, template <typename Dtype> void LRNLayer<Dtype>::CrossChannelBackward_gpu( const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { int n_threads = num_ * height_ * width_; // NOLINT_NEXT_LINE(whitespace/operators) LRNComputeDiff<<<CAFFE_GET_BLOCKS(n_threads), CAFFE_CUDA_NUM_THREADS>>>( - n_threads, (*bottom)[0]->gpu_data(), top[0]->gpu_data(), + n_threads, bottom[0]->gpu_data(), top[0]->gpu_data(), scale_.gpu_data(), top[0]->gpu_diff(), num_, channels_, height_, width_, size_, -beta_, Dtype(2. * alpha_ * beta_ / size_), - (*bottom)[0]->mutable_gpu_diff()); + bottom[0]->mutable_gpu_diff()); } diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index ab631a884fb..d254da34322 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -8,7 +8,7 @@ namespace caffe { template <typename Dtype> void MemoryDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { batch_size_ = this->layer_param_.memory_data_param().batch_size(); this->datum_channels_ = this->layer_param_.memory_data_param().channels(); this->datum_height_ = this->layer_param_.memory_data_param().height(); @@ -18,9 +18,9 @@ void MemoryDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK_GT(batch_size_ * this->datum_size_, 0) << "batch_size, channels, height, and width must be specified and" " positive in memory_data_param"; - (*top)[0]->Reshape(batch_size_, this->datum_channels_, this->datum_height_, + top[0]->Reshape(batch_size_, this->datum_channels_, this->datum_height_, this->datum_width_); - (*top)[1]->Reshape(batch_size_, 1, 1, 1); + top[1]->Reshape(batch_size_, 1, 1, 1); added_data_.Reshape(batch_size_, this->datum_channels_, this->datum_height_, this->datum_width_); added_label_.Reshape(batch_size_, 1, 1, 1); @@ -66,10 +66,10 @@ void MemoryDataLayer<Dtype>::Reset(Dtype* data, Dtype* labels, int n) { template <typename Dtype> void MemoryDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { CHECK(data_) << "MemoryDataLayer needs to be initalized by calling Reset"; - (*top)[0]->set_cpu_data(data_ + pos_ * this->datum_size_); - (*top)[1]->set_cpu_data(labels_ + pos_); + top[0]->set_cpu_data(data_ + pos_ * this->datum_size_); + top[1]->set_cpu_data(labels_ + pos_); pos_ = (pos_ + batch_size_) % n_; has_new_data_ = false; } diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index c0fe1966a4d..66f9ba813aa 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -12,7 +12,7 @@ namespace caffe { template <typename Dtype> void MultinomialLogisticLossLayer<Dtype>::Reshape( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::Reshape(bottom, top); CHECK_EQ(bottom[1]->channels(), 1); CHECK_EQ(bottom[1]->height(), 1); @@ -21,7 +21,7 @@ void MultinomialLogisticLossLayer<Dtype>::Reshape( template <typename Dtype> void MultinomialLogisticLossLayer<Dtype>::Forward_cpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); const Dtype* bottom_label = bottom[1]->cpu_data(); int num = bottom[0]->num(); @@ -33,24 +33,24 @@ void MultinomialLogisticLossLayer<Dtype>::Forward_cpu( bottom_data[i * dim + label], Dtype(kLOG_THRESHOLD)); loss -= log(prob); } - (*top)[0]->mutable_cpu_data()[0] = loss / num; + top[0]->mutable_cpu_data()[0] = loss / num; } template <typename Dtype> void MultinomialLogisticLossLayer<Dtype>::Backward_cpu( const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { LOG(FATAL) << this->type_name() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - const Dtype* bottom_label = (*bottom)[1]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - int num = (*bottom)[0]->num(); - int dim = (*bottom)[0]->count() / (*bottom)[0]->num(); - caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); + const Dtype* bottom_data = bottom[0]->cpu_data(); + const Dtype* bottom_label = bottom[1]->cpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + int num = bottom[0]->num(); + int dim = bottom[0]->count() / bottom[0]->num(); + caffe_set(bottom[0]->count(), Dtype(0), bottom_diff); const Dtype scale = - top[0]->cpu_diff()[0] / num; for (int i = 0; i < num; ++i) { int label = static_cast<int>(bottom_label[i]); diff --git a/src/caffe/layers/mvn_layer.cpp b/src/caffe/layers/mvn_layer.cpp index 6a57b3ea7fc..419f170ad7c 100644 --- a/src/caffe/layers/mvn_layer.cpp +++ b/src/caffe/layers/mvn_layer.cpp @@ -9,8 +9,8 @@ namespace caffe { template <typename Dtype> void MVNLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), + const vector<Blob<Dtype>*>& top) { + top[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); mean_.Reshape(bottom[0]->num(), bottom[0]->channels(), 1, 1); @@ -26,9 +26,9 @@ void MVNLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void MVNLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); int num; if (this->layer_param_.mvn_param().across_channels()) num = bottom[0]->num(); @@ -89,19 +89,19 @@ void MVNLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void MVNLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { const Dtype* top_diff = top[0]->cpu_diff(); const Dtype* top_data = top[0]->cpu_data(); - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); int num; if (this->layer_param_.mvn_param().across_channels()) - num = (*bottom)[0]->num(); + num = bottom[0]->num(); else - num = (*bottom)[0]->num() * (*bottom)[0]->channels(); + num = bottom[0]->num() * bottom[0]->channels(); - int dim = (*bottom)[0]->count() / num; + int dim = bottom[0]->count() / num; Dtype eps = 1e-10; if (this->layer_param_.mvn_param().normalize_variance()) { diff --git a/src/caffe/layers/mvn_layer.cu b/src/caffe/layers/mvn_layer.cu index 2c02dfe1ddc..c2a241f093f 100644 --- a/src/caffe/layers/mvn_layer.cu +++ b/src/caffe/layers/mvn_layer.cu @@ -9,9 +9,9 @@ namespace caffe { template <typename Dtype> void MVNLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); int num; if (this->layer_param_.mvn_param().across_channels()) num = bottom[0]->num(); @@ -73,19 +73,19 @@ void MVNLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void MVNLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* top_data = top[0]->gpu_data(); - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); int num; if (this->layer_param_.mvn_param().across_channels()) - num = (*bottom)[0]->num(); + num = bottom[0]->num(); else - num = (*bottom)[0]->num() * (*bottom)[0]->channels(); + num = bottom[0]->num() * bottom[0]->channels(); - int dim = (*bottom)[0]->count() / num; + int dim = bottom[0]->count() / num; Dtype eps = 1e-10; diff --git a/src/caffe/layers/neuron_layer.cpp b/src/caffe/layers/neuron_layer.cpp index c28e36ea23b..ba67b43878e 100644 --- a/src/caffe/layers/neuron_layer.cpp +++ b/src/caffe/layers/neuron_layer.cpp @@ -7,8 +7,8 @@ namespace caffe { template <typename Dtype> void NeuronLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - (*top)[0]->ReshapeLike(*bottom[0]); + const vector<Blob<Dtype>*>& top) { + top[0]->ReshapeLike(*bottom[0]); } INSTANTIATE_CLASS(NeuronLayer); diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 8e8ffad66a0..26c92c13b63 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -15,7 +15,7 @@ using std::max; template <typename Dtype> void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { PoolingParameter pool_param = this->layer_param_.pooling_param(); CHECK(!pool_param.has_kernel_size() != !(pool_param.has_kernel_h() && pool_param.has_kernel_w())) @@ -64,7 +64,7 @@ void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void PoolingLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); @@ -84,14 +84,14 @@ void PoolingLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, CHECK_LT((pooled_height_ - 1) * stride_h_, height_ + pad_h_); CHECK_LT((pooled_width_ - 1) * stride_w_, width_ + pad_w_); } - (*top)[0]->Reshape(bottom[0]->num(), channels_, pooled_height_, + top[0]->Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); - if (top->size() > 1) { - (*top)[1]->ReshapeLike(*(*top)[0]); + if (top.size() > 1) { + top[1]->ReshapeLike(*top[0]); } // If max pooling, we will initialize the vector index part. if (this->layer_param_.pooling_param().pool() == - PoolingParameter_PoolMethod_MAX && top->size() == 1) { + PoolingParameter_PoolMethod_MAX && top.size() == 1) { max_idx_.Reshape(bottom[0]->num(), channels_, pooled_height_, pooled_width_); } @@ -107,12 +107,12 @@ void PoolingLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, // case? template <typename Dtype> void PoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); - const int top_count = (*top)[0]->count(); + Dtype* top_data = top[0]->mutable_cpu_data(); + const int top_count = top[0]->count(); // We'll output the mask to top[1] if it's of size >1. - const bool use_top_mask = top->size() > 1; + const bool use_top_mask = top.size() > 1; int* mask = NULL; // suppress warnings about uninitalized variables Dtype* top_mask = NULL; // Different pooling methods. We explicitly do the switch outside the for @@ -121,7 +121,7 @@ void PoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, case PoolingParameter_PoolMethod_MAX: // Initialize if (use_top_mask) { - top_mask = (*top)[1]->mutable_cpu_data(); + top_mask = top[1]->mutable_cpu_data(); caffe_set(top_count, Dtype(-1), top_mask); } else { mask = max_idx_.mutable_cpu_data(); @@ -157,11 +157,11 @@ void PoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } // compute offset bottom_data += bottom[0]->offset(0, 1); - top_data += (*top)[0]->offset(0, 1); + top_data += top[0]->offset(0, 1); if (use_top_mask) { - top_mask += (*top)[0]->offset(0, 1); + top_mask += top[0]->offset(0, 1); } else { - mask += (*top)[0]->offset(0, 1); + mask += top[0]->offset(0, 1); } } } @@ -195,7 +195,7 @@ void PoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } // compute offset bottom_data += bottom[0]->offset(0, 1); - top_data += (*top)[0]->offset(0, 1); + top_data += top[0]->offset(0, 1); } } break; @@ -209,15 +209,15 @@ void PoolingLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void PoolingLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (!propagate_down[0]) { return; } const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); // Different pooling methods. We explicitly do the switch outside the for // loop to save time, although this results in more codes. - caffe_set((*bottom)[0]->count(), Dtype(0), bottom_diff); + caffe_set(bottom[0]->count(), Dtype(0), bottom_diff); // We'll output the mask to top[1] if it's of size >1. const bool use_top_mask = top.size() > 1; const int* mask = NULL; // suppress warnings about uninitialized variables @@ -240,7 +240,7 @@ void PoolingLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, bottom_diff[bottom_index] += top_diff[index]; } } - bottom_diff += (*bottom)[0]->offset(0, 1); + bottom_diff += bottom[0]->offset(0, 1); top_diff += top[0]->offset(0, 1); if (use_top_mask) { top_mask += top[0]->offset(0, 1); @@ -274,7 +274,7 @@ void PoolingLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } } // offset - bottom_diff += (*bottom)[0]->offset(0, 1); + bottom_diff += bottom[0]->offset(0, 1); top_diff += top[0]->offset(0, 1); } } diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index e64128b87f2..aec985a7864 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -152,18 +152,18 @@ __global__ void StoPoolForwardTest(const int nthreads, template <typename Dtype> void PoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); - int count = (*top)[0]->count(); + Dtype* top_data = top[0]->mutable_gpu_data(); + int count = top[0]->count(); // We'll output the mask to top[1] if it's of size >1. - const bool use_top_mask = top->size() > 1; + const bool use_top_mask = top.size() > 1; int* mask = NULL; Dtype* top_mask = NULL; switch (this->layer_param_.pooling_param().pool()) { case PoolingParameter_PoolMethod_MAX: if (use_top_mask) { - top_mask = (*top)[1]->mutable_gpu_data(); + top_mask = top[1]->mutable_gpu_data(); } else { mask = max_idx_.mutable_gpu_data(); } @@ -325,13 +325,13 @@ __global__ void StoPoolBackward(const int nthreads, template <typename Dtype> void PoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (!propagate_down[0]) { return; } const Dtype* top_diff = top[0]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); + const int count = bottom[0]->count(); caffe_gpu_set(count, Dtype(0.), bottom_diff); // We'll output the mask to top[1] if it's of size >1. const bool use_top_mask = top.size() > 1; diff --git a/src/caffe/layers/power_layer.cpp b/src/caffe/layers/power_layer.cpp index bf61955d065..04c612296aa 100644 --- a/src/caffe/layers/power_layer.cpp +++ b/src/caffe/layers/power_layer.cpp @@ -9,7 +9,7 @@ namespace caffe { template <typename Dtype> void PowerLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { NeuronLayer<Dtype>::LayerSetUp(bottom, top); power_ = this->layer_param_.power_param().power(); scale_ = this->layer_param_.power_param().scale(); @@ -20,8 +20,8 @@ void PowerLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, // Compute y = (shift + scale * x)^power template <typename Dtype> void PowerLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + const vector<Blob<Dtype>*>& top) { + Dtype* top_data = top[0]->mutable_cpu_data(); const int count = bottom[0]->count(); // Special case where we can ignore the input: scale or power is 0. if (diff_scale_ == Dtype(0)) { @@ -45,15 +45,15 @@ void PowerLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void PowerLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + const int count = bottom[0]->count(); const Dtype* top_diff = top[0]->cpu_diff(); if (diff_scale_ == Dtype(0) || power_ == Dtype(1)) { caffe_set(count, diff_scale_, bottom_diff); } else { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); // Compute dy/dx = scale * power * (shift + scale * x)^(power - 1) // = diff_scale * y / (shift + scale * x) if (power_ == Dtype(2)) { diff --git a/src/caffe/layers/power_layer.cu b/src/caffe/layers/power_layer.cu index a40bc75829d..367320a9b1f 100644 --- a/src/caffe/layers/power_layer.cu +++ b/src/caffe/layers/power_layer.cu @@ -9,8 +9,8 @@ namespace caffe { template <typename Dtype> void PowerLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + const vector<Blob<Dtype>*>& top) { + Dtype* top_data = top[0]->mutable_gpu_data(); const int count = bottom[0]->count(); // Special case where we can ignore the input: scale or power is 0. if (diff_scale_ == Dtype(0)) { @@ -34,15 +34,15 @@ void PowerLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void PowerLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); + const int count = bottom[0]->count(); const Dtype* top_diff = top[0]->gpu_diff(); if (diff_scale_ == Dtype(0) || power_ == Dtype(1)) { caffe_gpu_set(count, diff_scale_, bottom_diff); } else { - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + const Dtype* bottom_data = bottom[0]->gpu_data(); // Compute dy/dx = scale * power * (shift + scale * x)^(power - 1) // = diff_scale * y / (shift + scale * x) if (power_ == Dtype(2)) { diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index b50352f8526..7d5e6034589 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -8,9 +8,9 @@ namespace caffe { template <typename Dtype> void ReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); const int count = bottom[0]->count(); Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); for (int i = 0; i < count; ++i) { @@ -22,12 +22,12 @@ void ReLULayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void ReLULayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { - const Dtype* bottom_data = (*bottom)[0]->cpu_data(); + const Dtype* bottom_data = bottom[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + const int count = bottom[0]->count(); Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); for (int i = 0; i < count; ++i) { bottom_diff[i] = top_diff[i] * ((bottom_data[i] > 0) diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index def2bbcd7b9..22d5f4b5c5e 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -16,9 +16,9 @@ __global__ void ReLUForward(const int n, const Dtype* in, Dtype* out, template <typename Dtype> void ReLULayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); const int count = bottom[0]->count(); Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); // NOLINT_NEXT_LINE(whitespace/operators) @@ -44,12 +44,12 @@ __global__ void ReLUBackward(const int n, const Dtype* in_diff, template <typename Dtype> void ReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { - const Dtype* bottom_data = (*bottom)[0]->gpu_data(); + const Dtype* bottom_data = bottom[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); + const int count = bottom[0]->count(); Dtype negative_slope = this->layer_param_.relu_param().negative_slope(); // NOLINT_NEXT_LINE(whitespace/operators) ReLUBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index 6a48099ae8b..11850ac68e3 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -10,30 +10,30 @@ namespace caffe { template <typename Dtype> void SigmoidCrossEntropyLossLayer<Dtype>::LayerSetUp( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::LayerSetUp(bottom, top); sigmoid_bottom_vec_.clear(); sigmoid_bottom_vec_.push_back(bottom[0]); sigmoid_top_vec_.clear(); sigmoid_top_vec_.push_back(sigmoid_output_.get()); - sigmoid_layer_->SetUp(sigmoid_bottom_vec_, &sigmoid_top_vec_); + sigmoid_layer_->SetUp(sigmoid_bottom_vec_, sigmoid_top_vec_); } template <typename Dtype> void SigmoidCrossEntropyLossLayer<Dtype>::Reshape( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::Reshape(bottom, top); CHECK_EQ(bottom[0]->count(), bottom[1]->count()) << "SIGMOID_CROSS_ENTROPY_LOSS layer inputs must have the same count."; - sigmoid_layer_->Reshape(sigmoid_bottom_vec_, &sigmoid_top_vec_); + sigmoid_layer_->Reshape(sigmoid_bottom_vec_, sigmoid_top_vec_); } template <typename Dtype> void SigmoidCrossEntropyLossLayer<Dtype>::Forward_cpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // The forward pass computes the sigmoid outputs. sigmoid_bottom_vec_[0] = bottom[0]; - sigmoid_layer_->Forward(sigmoid_bottom_vec_, &sigmoid_top_vec_); + sigmoid_layer_->Forward(sigmoid_bottom_vec_, sigmoid_top_vec_); // Compute the loss (negative log likelihood) const int count = bottom[0]->count(); const int num = bottom[0]->num(); @@ -45,24 +45,24 @@ void SigmoidCrossEntropyLossLayer<Dtype>::Forward_cpu( loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) - log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0))); } - (*top)[0]->mutable_cpu_data()[0] = loss / num; + top[0]->mutable_cpu_data()[0] = loss / num; } template <typename Dtype> void SigmoidCrossEntropyLossLayer<Dtype>::Backward_cpu( const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { LOG(FATAL) << this->type_name() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { // First, compute the diff - const int count = (*bottom)[0]->count(); - const int num = (*bottom)[0]->num(); + const int count = bottom[0]->count(); + const int num = bottom[0]->num(); const Dtype* sigmoid_output_data = sigmoid_output_->cpu_data(); - const Dtype* target = (*bottom)[1]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + const Dtype* target = bottom[1]->cpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); caffe_sub(count, sigmoid_output_data, target, bottom_diff); // Scale down gradient const Dtype loss_weight = top[0]->cpu_diff()[0]; diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu index 8d0fdc6fac4..175f6f86574 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu @@ -10,10 +10,10 @@ namespace caffe { template <typename Dtype> void SigmoidCrossEntropyLossLayer<Dtype>::Forward_gpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // The forward pass computes the sigmoid outputs. sigmoid_bottom_vec_[0] = bottom[0]; - sigmoid_layer_->Forward(sigmoid_bottom_vec_, &sigmoid_top_vec_); + sigmoid_layer_->Forward(sigmoid_bottom_vec_, sigmoid_top_vec_); // Compute the loss (negative log likelihood) const int count = bottom[0]->count(); const int num = bottom[0]->num(); @@ -25,24 +25,24 @@ void SigmoidCrossEntropyLossLayer<Dtype>::Forward_gpu( loss -= input_data[i] * (target[i] - (input_data[i] >= 0)) - log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0))); } - (*top)[0]->mutable_cpu_data()[0] = loss / num; + top[0]->mutable_cpu_data()[0] = loss / num; } template <typename Dtype> void SigmoidCrossEntropyLossLayer<Dtype>::Backward_gpu( const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { LOG(FATAL) << this->type_name() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { // First, compute the diff - const int count = (*bottom)[0]->count(); - const int num = (*bottom)[0]->num(); + const int count = bottom[0]->count(); + const int num = bottom[0]->num(); const Dtype* sigmoid_output_data = sigmoid_output_->gpu_data(); - const Dtype* target = (*bottom)[1]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + const Dtype* target = bottom[1]->gpu_data(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); caffe_copy(count, sigmoid_output_data, bottom_diff); caffe_gpu_axpy(count, Dtype(-1), target, bottom_diff); // Scale down gradient diff --git a/src/caffe/layers/sigmoid_layer.cpp b/src/caffe/layers/sigmoid_layer.cpp index d7bba7fbfc3..48c384905bf 100644 --- a/src/caffe/layers/sigmoid_layer.cpp +++ b/src/caffe/layers/sigmoid_layer.cpp @@ -14,9 +14,9 @@ inline Dtype sigmoid(Dtype x) { template <typename Dtype> void SigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { top_data[i] = sigmoid(bottom_data[i]); @@ -26,12 +26,12 @@ void SigmoidLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void SigmoidLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { const Dtype* top_data = top[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { const Dtype sigmoid_x = top_data[i]; bottom_diff[i] = top_diff[i] * sigmoid_x * (1. - sigmoid_x); diff --git a/src/caffe/layers/sigmoid_layer.cu b/src/caffe/layers/sigmoid_layer.cu index e1ebb1f6c41..6879ff7f570 100644 --- a/src/caffe/layers/sigmoid_layer.cu +++ b/src/caffe/layers/sigmoid_layer.cu @@ -16,9 +16,9 @@ __global__ void SigmoidForward(const int n, const Dtype* in, Dtype* out) { template <typename Dtype> void SigmoidLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); const int count = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) SigmoidForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( @@ -43,12 +43,12 @@ __global__ void SigmoidBackward(const int n, const Dtype* in_diff, template <typename Dtype> void SigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); + const int count = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) SigmoidBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( count, top_diff, top_data, bottom_diff); diff --git a/src/caffe/layers/silence_layer.cpp b/src/caffe/layers/silence_layer.cpp index 75dbbf31f0d..0fd88580eaf 100644 --- a/src/caffe/layers/silence_layer.cpp +++ b/src/caffe/layers/silence_layer.cpp @@ -8,11 +8,11 @@ namespace caffe { template <typename Dtype> void SilenceLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { - for (int i = 0; i < bottom->size(); ++i) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { + for (int i = 0; i < bottom.size(); ++i) { if (propagate_down[i]) { - caffe_set((*bottom)[i]->count(), Dtype(0), - (*bottom)[i]->mutable_cpu_data()); + caffe_set(bottom[i]->count(), Dtype(0), + bottom[i]->mutable_cpu_data()); } } } diff --git a/src/caffe/layers/silence_layer.cu b/src/caffe/layers/silence_layer.cu index 735abe61eaf..b350b1950bd 100644 --- a/src/caffe/layers/silence_layer.cu +++ b/src/caffe/layers/silence_layer.cu @@ -8,17 +8,17 @@ namespace caffe { template <typename Dtype> void SilenceLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { // Do nothing. } template <typename Dtype> void SilenceLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { - for (int i = 0; i < bottom->size(); ++i) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { + for (int i = 0; i < bottom.size(); ++i) { if (propagate_down[i]) { - caffe_gpu_set((*bottom)[i]->count(), Dtype(0), - (*bottom)[i]->mutable_gpu_data()); + caffe_gpu_set(bottom[i]->count(), Dtype(0), + bottom[i]->mutable_gpu_data()); } } } diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp index ed679a9169e..17144c1a280 100644 --- a/src/caffe/layers/slice_layer.cpp +++ b/src/caffe/layers/slice_layer.cpp @@ -9,7 +9,7 @@ namespace caffe { template <typename Dtype> void SliceLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const SliceParameter& slice_param = this->layer_param_.slice_param(); slice_dim_ = slice_param.slice_dim(); CHECK_GE(slice_dim_, 0); @@ -22,18 +22,18 @@ void SliceLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void SliceLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { count_ = 0; num_ = bottom[0]->num(); channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); if (slice_point_.size() != 0) { - CHECK_EQ(slice_point_.size(), top->size() - 1); + CHECK_EQ(slice_point_.size(), top.size() - 1); if (slice_dim_ == 0) { - CHECK_LE(top->size(), num_); + CHECK_LE(top.size(), num_); } else { - CHECK_LE(top->size(), channels_); + CHECK_LE(top.size(), channels_); } int prev = 0; vector<int> slices; @@ -44,32 +44,32 @@ void SliceLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, } if (slice_dim_ == 0) { slices.push_back(num_ - prev); - for (int i = 0; i < top->size(); ++i) { - (*top)[i]->Reshape(slices[i], channels_, height_, width_); - count_ += (*top)[i]->count(); + for (int i = 0; i < top.size(); ++i) { + top[i]->Reshape(slices[i], channels_, height_, width_); + count_ += top[i]->count(); } } else { slices.push_back(channels_ - prev); - for (int i = 0; i < top->size(); ++i) { - (*top)[i]->Reshape(num_, slices[i], height_, width_); - count_ += (*top)[i]->count(); + for (int i = 0; i < top.size(); ++i) { + top[i]->Reshape(num_, slices[i], height_, width_); + count_ += top[i]->count(); } } } else { if (slice_dim_ == 0) { - CHECK_EQ(num_ % top->size(), 0) - << "Number of top blobs (" << top->size() << ") " + CHECK_EQ(num_ % top.size(), 0) + << "Number of top blobs (" << top.size() << ") " << "should evenly divide input num ( " << num_ << ")"; - num_ = num_ / top->size(); + num_ = num_ / top.size(); } else { - CHECK_EQ(channels_ % top->size(), 0) - << "Number of top blobs (" << top->size() << ") " + CHECK_EQ(channels_ % top.size(), 0) + << "Number of top blobs (" << top.size() << ") " << "should evenly divide input channels ( " << channels_ << ")"; - channels_ = channels_ / top->size(); + channels_ = channels_ / top.size(); } - for (int i = 0; i < top->size(); ++i) { - (*top)[i]->Reshape(num_, channels_, height_, width_); - count_ += (*top)[i]->count(); + for (int i = 0; i < top.size(); ++i) { + top[i]->Reshape(num_, channels_, height_, width_); + count_ += top[i]->count(); } } CHECK_EQ(count_, bottom[0]->count()); @@ -77,12 +77,12 @@ void SliceLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void SliceLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->mutable_cpu_data(); if (slice_dim_ == 0) { int offset_num = 0; - for (int i = 0; i < top->size(); ++i) { - Blob<Dtype>* blob = (*top)[i]; + for (int i = 0; i < top.size(); ++i) { + Blob<Dtype>* blob = top[i]; Dtype* top_data = blob->mutable_cpu_data(); caffe_copy(blob->count(), bottom_data + bottom[0]->offset(offset_num), top_data); @@ -90,8 +90,8 @@ void SliceLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } } else if (slice_dim_ == 1) { int offset_channel = 0; - for (int i = 0; i < top->size(); ++i) { - Blob<Dtype>* blob = (*top)[i]; + for (int i = 0; i < top.size(); ++i) { + Blob<Dtype>* blob = top[i]; Dtype* top_data = blob->mutable_cpu_data(); const int num_elem = blob->channels() * blob->height() * blob->width(); for (int n = 0; n < num_; ++n) { @@ -105,16 +105,16 @@ void SliceLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void SliceLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (!propagate_down[0]) { return; } - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); if (slice_dim_ == 0) { int offset_num = 0; for (int i = 0; i < top.size(); ++i) { Blob<Dtype>* blob = top[i]; const Dtype* top_diff = blob->cpu_diff(); caffe_copy(blob->count(), top_diff, - bottom_diff + (*bottom)[0]->offset(offset_num)); + bottom_diff + bottom[0]->offset(offset_num)); offset_num += blob->num(); } } else if (slice_dim_ == 1) { @@ -125,7 +125,7 @@ void SliceLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const int num_elem = blob->channels() * blob->height() * blob->width(); for (int n = 0; n < num_; ++n) { caffe_copy(num_elem, top_diff + blob->offset(n), - bottom_diff + (*bottom)[0]->offset(n, offset_channel)); + bottom_diff + bottom[0]->offset(n, offset_channel)); } offset_channel += blob->channels(); } diff --git a/src/caffe/layers/slice_layer.cu b/src/caffe/layers/slice_layer.cu index f64e5754890..657840809f6 100644 --- a/src/caffe/layers/slice_layer.cu +++ b/src/caffe/layers/slice_layer.cu @@ -8,12 +8,12 @@ namespace caffe { template <typename Dtype> void SliceLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->mutable_gpu_data(); if (slice_dim_ == 0) { int offset_num = 0; - for (int i = 0; i < top->size(); ++i) { - Blob<Dtype>* blob = (*top)[i]; + for (int i = 0; i < top.size(); ++i) { + Blob<Dtype>* blob = top[i]; Dtype* top_data = blob->mutable_gpu_data(); caffe_copy(blob->count(), bottom_data + bottom[0]->offset(offset_num), top_data); @@ -21,8 +21,8 @@ void SliceLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } } else if (slice_dim_ == 1) { int offset_channel = 0; - for (int i = 0; i < top->size(); ++i) { - Blob<Dtype>* blob = (*top)[i]; + for (int i = 0; i < top.size(); ++i) { + Blob<Dtype>* blob = top[i]; Dtype* top_data = blob->mutable_gpu_data(); const int num_elem = blob->channels() * blob->height() * blob->width(); for (int n = 0; n < num_; ++n) { @@ -36,16 +36,16 @@ void SliceLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void SliceLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (!propagate_down[0]) { return; } - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); if (slice_dim_ == 0) { int offset_num = 0; for (int i = 0; i < top.size(); ++i) { Blob<Dtype>* blob = top[i]; const Dtype* top_diff = blob->gpu_diff(); caffe_copy(blob->count(), top_diff, - bottom_diff + (*bottom)[0]->offset(offset_num)); + bottom_diff + bottom[0]->offset(offset_num)); offset_num += blob->num(); } } else if (slice_dim_ == 1) { @@ -56,7 +56,7 @@ void SliceLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const int num_elem = blob->channels() * blob->height() * blob->width(); for (int n = 0; n < num_; ++n) { caffe_copy(num_elem, top_diff + blob->offset(n), - bottom_diff + (*bottom)[0]->offset(n, offset_channel)); + bottom_diff + bottom[0]->offset(n, offset_channel)); } offset_channel += blob->channels(); } diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 60668a3f8ce..04e8c4f35fc 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -9,8 +9,8 @@ namespace caffe { template <typename Dtype> void SoftmaxLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - (*top)[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), + const vector<Blob<Dtype>*>& top) { + top[0]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); sum_multiplier_.Reshape(1, bottom[0]->channels(), 1, 1); Dtype* multiplier_data = sum_multiplier_.mutable_cpu_data(); @@ -22,9 +22,9 @@ void SoftmaxLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void SoftmaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); Dtype* scale_data = scale_.mutable_cpu_data(); int num = bottom[0]->num(); int channels = bottom[0]->channels(); @@ -52,8 +52,8 @@ void SoftmaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, top_data + i * dim, sum_multiplier_.cpu_data(), 0., scale_data); // division for (int j = 0; j < channels; j++) { - caffe_div(spatial_dim, top_data + (*top)[0]->offset(i, j), scale_data, - top_data + (*top)[0]->offset(i, j)); + caffe_div(spatial_dim, top_data + top[0]->offset(i, j), scale_data, + top_data + top[0]->offset(i, j)); } } } @@ -61,10 +61,10 @@ void SoftmaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void SoftmaxLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { const Dtype* top_diff = top[0]->cpu_diff(); const Dtype* top_data = top[0]->cpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); Dtype* scale_data = scale_.mutable_cpu_data(); int num = top[0]->num(); int channels = top[0]->channels(); diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index f97eafcedb0..8ba31d75951 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -87,9 +87,9 @@ __global__ void kernel_channel_dot(const int num, const int channels, template <typename Dtype> void SoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); Dtype* scale_data = scale_.mutable_gpu_data(); int num = bottom[0]->num(); int channels = bottom[0]->channels(); @@ -126,10 +126,10 @@ void SoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void SoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* top_data = top[0]->gpu_data(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); Dtype* scale_data = scale_.mutable_gpu_data(); int num = top[0]->num(); int channels = top[0]->channels(); diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 55392c37ca0..651320c77f8 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -10,31 +10,31 @@ namespace caffe { template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::LayerSetUp( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::LayerSetUp(bottom, top); softmax_bottom_vec_.clear(); softmax_bottom_vec_.push_back(bottom[0]); softmax_top_vec_.clear(); softmax_top_vec_.push_back(&prob_); - softmax_layer_->SetUp(softmax_bottom_vec_, &softmax_top_vec_); + softmax_layer_->SetUp(softmax_bottom_vec_, softmax_top_vec_); } template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::Reshape( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::Reshape(bottom, top); - softmax_layer_->Reshape(softmax_bottom_vec_, &softmax_top_vec_); - if (top->size() >= 2) { + softmax_layer_->Reshape(softmax_bottom_vec_, softmax_top_vec_); + if (top.size() >= 2) { // softmax output - (*top)[1]->ReshapeLike(*bottom[0]); + top[1]->ReshapeLike(*bottom[0]); } } template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::Forward_cpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // The forward pass computes the softmax prob values. - softmax_layer_->Forward(softmax_bottom_vec_, &softmax_top_vec_); + softmax_layer_->Forward(softmax_bottom_vec_, softmax_top_vec_); const Dtype* prob_data = prob_.cpu_data(); const Dtype* label = bottom[1]->cpu_data(); int num = prob_.num(); @@ -48,25 +48,25 @@ void SoftmaxWithLossLayer<Dtype>::Forward_cpu( Dtype(FLT_MIN))); } } - (*top)[0]->mutable_cpu_data()[0] = loss / num / spatial_dim; - if (top->size() == 2) { - (*top)[1]->ShareData(prob_); + top[0]->mutable_cpu_data()[0] = loss / num / spatial_dim; + if (top.size() == 2) { + top[1]->ShareData(prob_); } } template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { LOG(FATAL) << this->type_name() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); const Dtype* prob_data = prob_.cpu_data(); caffe_copy(prob_.count(), prob_data, bottom_diff); - const Dtype* label = (*bottom)[1]->cpu_data(); + const Dtype* label = bottom[1]->cpu_data(); int num = prob_.num(); int dim = prob_.count() / num; int spatial_dim = prob_.height() * prob_.width(); diff --git a/src/caffe/layers/softmax_loss_layer.cu b/src/caffe/layers/softmax_loss_layer.cu index 9ef8dd23615..060dc24d06e 100644 --- a/src/caffe/layers/softmax_loss_layer.cu +++ b/src/caffe/layers/softmax_loss_layer.cu @@ -10,13 +10,13 @@ namespace caffe { template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::Forward_gpu( - const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { Forward_cpu(bottom, top); } template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { // TODO(Yangqing): implement the GPU version of softmax. Backward_cpu(top, propagate_down, bottom); } diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index 40d3600ff17..ee6b5a91d3c 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -8,44 +8,44 @@ namespace caffe { template <typename Dtype> void SplitLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { count_ = bottom[0]->count(); - for (int i = 0; i < top->size(); ++i) { + for (int i = 0; i < top.size(); ++i) { // Do not allow in-place computation in the SplitLayer. Instead, share data // by reference in the forward pass, and keep separate diff allocations in // the backward pass. (Technically, it should be possible to share the diff // blob of the first split output with the input, but this seems to cause // some strange effects in practice...) - CHECK_NE((*top)[i], bottom[0]) << this->type_name() << " Layer does not " + CHECK_NE(top[i], bottom[0]) << this->type_name() << " Layer does not " "allow in-place computation."; - (*top)[i]->Reshape(bottom[0]->num(), bottom[0]->channels(), + top[i]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); - CHECK_EQ(count_, (*top)[i]->count()); + CHECK_EQ(count_, top[i]->count()); } } template <typename Dtype> void SplitLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - for (int i = 0; i < top->size(); ++i) { - (*top)[i]->ShareData(*bottom[0]); + const vector<Blob<Dtype>*>& top) { + for (int i = 0; i < top.size(); ++i) { + top[i]->ShareData(*bottom[0]); } } template <typename Dtype> void SplitLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (!propagate_down[0]) { return; } if (top.size() == 1) { - caffe_copy(count_, top[0]->cpu_diff(), (*bottom)[0]->mutable_cpu_diff()); + caffe_copy(count_, top[0]->cpu_diff(), bottom[0]->mutable_cpu_diff()); return; } caffe_add(count_, top[0]->cpu_diff(), top[1]->cpu_diff(), - (*bottom)[0]->mutable_cpu_diff()); + bottom[0]->mutable_cpu_diff()); // Add remaining top blob diffs. for (int i = 2; i < top.size(); ++i) { const Dtype* top_diff = top[i]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); caffe_axpy(count_, Dtype(1.), top_diff, bottom_diff); } } diff --git a/src/caffe/layers/split_layer.cu b/src/caffe/layers/split_layer.cu index fcc0917e67d..0513b204d91 100644 --- a/src/caffe/layers/split_layer.cu +++ b/src/caffe/layers/split_layer.cu @@ -8,26 +8,26 @@ namespace caffe { template <typename Dtype> void SplitLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { - for (int i = 0; i < top->size(); ++i) { - (*top)[i]->ShareData(*bottom[0]); + const vector<Blob<Dtype>*>& top) { + for (int i = 0; i < top.size(); ++i) { + top[i]->ShareData(*bottom[0]); } } template <typename Dtype> void SplitLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, vector<Blob<Dtype>*>* bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (!propagate_down[0]) { return; } if (top.size() == 1) { - caffe_copy(count_, top[0]->gpu_diff(), (*bottom)[0]->mutable_gpu_diff()); + caffe_copy(count_, top[0]->gpu_diff(), bottom[0]->mutable_gpu_diff()); return; } caffe_gpu_add(count_, top[0]->gpu_diff(), top[1]->gpu_diff(), - (*bottom)[0]->mutable_gpu_diff()); + bottom[0]->mutable_gpu_diff()); // Add remaining top blob diffs. for (int i = 2; i < top.size(); ++i) { const Dtype* top_diff = top[i]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); caffe_gpu_axpy(count_, Dtype(1.), top_diff, bottom_diff); } } diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp index 8dae0054aed..18413d9b181 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -11,9 +11,9 @@ namespace caffe { template <typename Dtype> void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); Dtype exp2x; const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { @@ -25,12 +25,12 @@ void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void TanHLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { const Dtype* top_data = top[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_cpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + const int count = bottom[0]->count(); Dtype tanhx; for (int i = 0; i < count; ++i) { tanhx = top_data[i]; diff --git a/src/caffe/layers/tanh_layer.cu b/src/caffe/layers/tanh_layer.cu index bdb7a94978e..a141f8e872e 100644 --- a/src/caffe/layers/tanh_layer.cu +++ b/src/caffe/layers/tanh_layer.cu @@ -19,9 +19,9 @@ __global__ void TanHForward(const int n, const Dtype* in, Dtype* out) { template <typename Dtype> void TanHLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); const int count = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) TanHForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( @@ -41,12 +41,12 @@ __global__ void TanHBackward(const int n, const Dtype* in_diff, template <typename Dtype> void TanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, - vector<Blob<Dtype>*>* bottom) { + const vector<Blob<Dtype>*>& bottom) { if (propagate_down[0]) { const Dtype* top_data = top[0]->gpu_data(); const Dtype* top_diff = top[0]->gpu_diff(); - Dtype* bottom_diff = (*bottom)[0]->mutable_gpu_diff(); - const int count = (*bottom)[0]->count(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); + const int count = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) TanHBackward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( count, top_diff, top_data, bottom_diff); diff --git a/src/caffe/layers/threshold_layer.cpp b/src/caffe/layers/threshold_layer.cpp index 180ea6a322b..b4b2df51bc9 100644 --- a/src/caffe/layers/threshold_layer.cpp +++ b/src/caffe/layers/threshold_layer.cpp @@ -8,16 +8,16 @@ namespace caffe { template <typename Dtype> void ThresholdLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { NeuronLayer<Dtype>::LayerSetUp(bottom, top); threshold_ = this->layer_param_.threshold_param().threshold(); } template <typename Dtype> void ThresholdLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); - Dtype* top_data = (*top)[0]->mutable_cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { top_data[i] = (bottom_data[i] > threshold_) ? Dtype(1) : Dtype(0); diff --git a/src/caffe/layers/threshold_layer.cu b/src/caffe/layers/threshold_layer.cu index 93430815900..7e651290897 100644 --- a/src/caffe/layers/threshold_layer.cu +++ b/src/caffe/layers/threshold_layer.cu @@ -16,9 +16,9 @@ __global__ void ThresholdForward(const int n, const Dtype threshold, template <typename Dtype> void ThresholdLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->gpu_data(); - Dtype* top_data = (*top)[0]->mutable_gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); const int count = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) ThresholdForward<Dtype><<<CAFFE_GET_BLOCKS(count), CAFFE_CUDA_NUM_THREADS>>>( diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index a24d7de3daa..cf1f386e454 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -30,7 +30,7 @@ WindowDataLayer<Dtype>::~WindowDataLayer<Dtype>() { template <typename Dtype> void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, - vector<Blob<Dtype>*>* top) { + const vector<Blob<Dtype>*>& top) { // LayerSetUp runs through the window_file and creates two structures // that hold windows: one for foreground (object) windows and one // for background (non-object) windows. We use an overlap threshold @@ -152,20 +152,20 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, int crop_size = this->layer_param_.window_data_param().crop_size(); CHECK_GT(crop_size, 0); const int batch_size = this->layer_param_.window_data_param().batch_size(); - (*top)[0]->Reshape(batch_size, channels, crop_size, crop_size); + top[0]->Reshape(batch_size, channels, crop_size, crop_size); this->prefetch_data_.Reshape(batch_size, channels, crop_size, crop_size); - LOG(INFO) << "output data size: " << (*top)[0]->num() << "," - << (*top)[0]->channels() << "," << (*top)[0]->height() << "," - << (*top)[0]->width(); + LOG(INFO) << "output data size: " << top[0]->num() << "," + << top[0]->channels() << "," << top[0]->height() << "," + << top[0]->width(); // datum size - this->datum_channels_ = (*top)[0]->channels(); - this->datum_height_ = (*top)[0]->height(); - this->datum_width_ = (*top)[0]->width(); + this->datum_channels_ = top[0]->channels(); + this->datum_height_ = top[0]->height(); + this->datum_width_ = top[0]->width(); this->datum_size_ = - (*top)[0]->channels() * (*top)[0]->height() * (*top)[0]->width(); + top[0]->channels() * top[0]->height() * top[0]->width(); // label - (*top)[1]->Reshape(batch_size, 1, 1, 1); + top[1]->Reshape(batch_size, 1, 1, 1); this->prefetch_label_.Reshape(batch_size, 1, 1, 1); } diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 6f4a651fb10..21ab15fd31b 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -94,7 +94,7 @@ void Net<Dtype>::Init(const NetParameter& in_param) { } // After this layer is connected, set it up. LOG(INFO) << "Setting up " << layer_names_[layer_id]; - layers_[layer_id]->SetUp(bottom_vecs_[layer_id], &top_vecs_[layer_id]); + layers_[layer_id]->SetUp(bottom_vecs_[layer_id], top_vecs_[layer_id]); for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { if (blob_loss_weights_.size() <= top_id_vecs_[layer_id][top_id]) { blob_loss_weights_.resize(top_id_vecs_[layer_id][top_id] + 1, Dtype(0)); @@ -504,8 +504,8 @@ Dtype Net<Dtype>::ForwardFromTo(int start, int end) { Dtype loss = 0; for (int i = start; i <= end; ++i) { // LOG(ERROR) << "Forwarding " << layer_names_[i]; - layers_[i]->Reshape(bottom_vecs_[i], &top_vecs_[i]); - Dtype layer_loss = layers_[i]->Forward(bottom_vecs_[i], &top_vecs_[i]); + layers_[i]->Reshape(bottom_vecs_[i], top_vecs_[i]); + Dtype layer_loss = layers_[i]->Forward(bottom_vecs_[i], top_vecs_[i]); loss += layer_loss; if (debug_info_) { ForwardDebugInfo(i); } } @@ -570,7 +570,7 @@ void Net<Dtype>::BackwardFromTo(int start, int end) { for (int i = start; i >= end; --i) { if (layer_need_backward_[i]) { layers_[i]->Backward( - top_vecs_[i], bottom_need_backward_[i], &bottom_vecs_[i]); + top_vecs_[i], bottom_need_backward_[i], bottom_vecs_[i]); if (debug_info_) { BackwardDebugInfo(i); } } } @@ -683,7 +683,7 @@ void Net<Dtype>::Backward() { template <typename Dtype> void Net<Dtype>::Reshape() { for (int i = 0; i < layers_.size(); ++i) { - layers_[i]->Reshape(bottom_vecs_[i], &top_vecs_[i]); + layers_[i]->Reshape(bottom_vecs_[i], top_vecs_[i]); } } diff --git a/src/caffe/test/test_accuracy_layer.cpp b/src/caffe/test/test_accuracy_layer.cpp index e11e3f2a981..fa59fab1e8a 100644 --- a/src/caffe/test/test_accuracy_layer.cpp +++ b/src/caffe/test/test_accuracy_layer.cpp @@ -59,7 +59,7 @@ TYPED_TEST_CASE(AccuracyLayerTest, TestDtypes); TYPED_TEST(AccuracyLayerTest, TestSetup) { LayerParameter layer_param; AccuracyLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); EXPECT_EQ(this->blob_top_->height(), 1); @@ -72,7 +72,7 @@ TYPED_TEST(AccuracyLayerTest, TestSetupTopK) { layer_param.mutable_accuracy_param(); accuracy_param->set_top_k(5); AccuracyLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); EXPECT_EQ(this->blob_top_->height(), 1); @@ -83,8 +83,8 @@ TYPED_TEST(AccuracyLayerTest, TestForwardCPU) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); AccuracyLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); TypeParam max_value; int max_id; @@ -111,8 +111,8 @@ TYPED_TEST(AccuracyLayerTest, TestForwardCPUTopK) { AccuracyParameter* accuracy_param = layer_param.mutable_accuracy_param(); accuracy_param->set_top_k(this->top_k_); AccuracyLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); TypeParam current_value; int current_rank; diff --git a/src/caffe/test/test_argmax_layer.cpp b/src/caffe/test/test_argmax_layer.cpp index fb3951c3098..3487d42f21e 100644 --- a/src/caffe/test/test_argmax_layer.cpp +++ b/src/caffe/test/test_argmax_layer.cpp @@ -41,7 +41,7 @@ TYPED_TEST_CASE(ArgMaxLayerTest, TestDtypes); TYPED_TEST(ArgMaxLayerTest, TestSetup) { LayerParameter layer_param; ArgMaxLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), 1); } @@ -51,7 +51,7 @@ TYPED_TEST(ArgMaxLayerTest, TestSetupMaxVal) { ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_out_max_val(true); ArgMaxLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), 2); } @@ -59,8 +59,8 @@ TYPED_TEST(ArgMaxLayerTest, TestSetupMaxVal) { TYPED_TEST(ArgMaxLayerTest, TestCPU) { LayerParameter layer_param; ArgMaxLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); @@ -84,8 +84,8 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUMaxVal) { ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_out_max_val(true); ArgMaxLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); @@ -110,8 +110,8 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUTopK) { ArgMaxParameter* argmax_param = layer_param.mutable_argmax_param(); argmax_param->set_top_k(this->top_k_); ArgMaxLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values int max_ind; TypeParam max_val; @@ -140,8 +140,8 @@ TYPED_TEST(ArgMaxLayerTest, TestCPUMaxValTopK) { argmax_param->set_out_max_val(true); argmax_param->set_top_k(this->top_k_); ArgMaxLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values int max_ind; TypeParam max_val; diff --git a/src/caffe/test/test_concat_layer.cpp b/src/caffe/test/test_concat_layer.cpp index c60b7f744cc..f14f1d2fa4f 100644 --- a/src/caffe/test/test_concat_layer.cpp +++ b/src/caffe/test/test_concat_layer.cpp @@ -63,7 +63,7 @@ TYPED_TEST(ConcatLayerTest, TestSetupNum) { LayerParameter layer_param; layer_param.mutable_concat_param()->set_concat_dim(0); ConcatLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_1, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_1, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_0->num() + this->blob_bottom_2->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_0->channels()); @@ -75,7 +75,7 @@ TYPED_TEST(ConcatLayerTest, TestSetupChannels) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ConcatLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_0, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_0, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_0->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_0->channels()+this->blob_bottom_1->channels()); @@ -88,8 +88,8 @@ TYPED_TEST(ConcatLayerTest, TestNum) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ConcatLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_0, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_0, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_0, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_0, this->blob_top_vec_); for (int n = 0; n < this->blob_top_->num(); ++n) { for (int c = 0; c < this->blob_bottom_0->channels(); ++c) { for (int h = 0; h < this->blob_top_->height(); ++h) { @@ -115,8 +115,8 @@ TYPED_TEST(ConcatLayerTest, TestGradient) { LayerParameter layer_param; ConcatLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); - checker.CheckGradient(&layer, &(this->blob_bottom_vec_0), - &(this->blob_top_vec_)); + checker.CheckGradient(&layer, this->blob_bottom_vec_0, + this->blob_top_vec_); } } // namespace caffe diff --git a/src/caffe/test/test_contrastive_loss_layer.cpp b/src/caffe/test/test_contrastive_loss_layer.cpp index a5bef4c9826..d269fbc26f2 100644 --- a/src/caffe/test/test_contrastive_loss_layer.cpp +++ b/src/caffe/test/test_contrastive_loss_layer.cpp @@ -62,8 +62,8 @@ TYPED_TEST(ContrastiveLossLayerTest, TestForward) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ContrastiveLossLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // manually compute to compare const Dtype margin = layer_param.contrastive_loss_param().margin(); const int num = this->blob_bottom_data_i_->num(); @@ -90,13 +90,13 @@ TYPED_TEST(ContrastiveLossLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ContrastiveLossLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); GradientChecker<Dtype> checker(1e-2, 1e-2, 1701); // check the gradient for the first two bottom layers - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 1); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 1); } } // namespace caffe diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index a38ad3fd1a8..aef9092d8fe 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -157,7 +157,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { this->blob_top_vec_.push_back(this->blob_top_2_); shared_ptr<Layer<Dtype> > layer( new ConvolutionLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 4); EXPECT_EQ(this->blob_top_->height(), 2); @@ -170,7 +170,7 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { convolution_param->set_num_output(3); convolution_param->set_group(3); layer.reset(new ConvolutionLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 3); EXPECT_EQ(this->blob_top_->height(), 2); @@ -197,8 +197,8 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) { convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<Dtype> > layer( new ConvolutionLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Check against reference convolution. const Dtype* top_data; const Dtype* ref_top_data; @@ -233,8 +233,8 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) { convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<Dtype> > layer( new ConvolutionLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Check against reference convolution. const Dtype* top_data; const Dtype* ref_top_data; @@ -284,8 +284,8 @@ TYPED_TEST(ConvolutionLayerTest, TestSobelConvolution) { weights[i + 7] = 0; weights[i + 8] = 1; } - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Compute Sobel G_x operator as separable 3 x 1 and 1 x 3 convolutions. // (1) the [1 2 1] column filter vector<Blob<Dtype>*> sep_blob_bottom_vec; @@ -311,8 +311,8 @@ TYPED_TEST(ConvolutionLayerTest, TestSobelConvolution) { weights_1[i + 1] = 2; weights_1[i + 2] = 1; } - layer->SetUp(sep_blob_bottom_vec, &(sep_blob_top_vec)); - layer->Forward(sep_blob_bottom_vec, &(sep_blob_top_vec)); + layer->SetUp(sep_blob_bottom_vec, sep_blob_top_vec); + layer->Forward(sep_blob_bottom_vec, sep_blob_top_vec); // (2) the [-1 0 1] row filter blob_sep->CopyFrom(*this->blob_top_2_, false, true); sep_blob_bottom_vec.clear(); @@ -333,8 +333,8 @@ TYPED_TEST(ConvolutionLayerTest, TestSobelConvolution) { weights_2[i + 1] = 0; weights_2[i + 2] = 1; } - layer->SetUp(sep_blob_bottom_vec, &(sep_blob_top_vec)); - layer->Forward(sep_blob_bottom_vec, &(sep_blob_top_vec)); + layer->SetUp(sep_blob_bottom_vec, sep_blob_top_vec); + layer->Forward(sep_blob_bottom_vec, sep_blob_top_vec); // Test equivalence of full and separable filters. const Dtype* top_data = this->blob_top_->cpu_data(); const Dtype* sep_top_data = this->blob_top_2_->cpu_data(); @@ -357,8 +357,8 @@ TYPED_TEST(ConvolutionLayerTest, TestGradient) { convolution_param->mutable_bias_filler()->set_type("gaussian"); ConvolutionLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(ConvolutionLayerTest, TestGradientGroup) { @@ -374,8 +374,8 @@ TYPED_TEST(ConvolutionLayerTest, TestGradientGroup) { convolution_param->mutable_bias_filler()->set_type("gaussian"); ConvolutionLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } #ifdef USE_CUDNN @@ -437,7 +437,7 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSetupCuDNN) { this->blob_top_vec_.push_back(this->blob_top_2_); shared_ptr<Layer<TypeParam> > layer( new CuDNNConvolutionLayer<TypeParam>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 4); EXPECT_EQ(this->blob_top_->height(), 2); @@ -450,7 +450,7 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSetupCuDNN) { convolution_param->set_num_output(3); convolution_param->set_group(3); layer.reset(new CuDNNConvolutionLayer<TypeParam>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 3); EXPECT_EQ(this->blob_top_->height(), 2); @@ -477,8 +477,8 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionCuDNN) { convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<TypeParam> > layer( new CuDNNConvolutionLayer<TypeParam>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Check against reference convolution. const TypeParam* top_data; const TypeParam* ref_top_data; @@ -513,8 +513,8 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionGroupCuDNN) { convolution_param->mutable_bias_filler()->set_value(0.1); shared_ptr<Layer<TypeParam> > layer( new CuDNNConvolutionLayer<TypeParam>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Check against reference convolution. const TypeParam* top_data; const TypeParam* ref_top_data; @@ -564,8 +564,8 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSobelConvolutionCuDNN) { weights[i + 7] = 0; weights[i + 8] = 1; } - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Compute Sobel G_x operator as separable 3 x 1 and 1 x 3 convolutions. // (1) the [1 2 1] column filter vector<Blob<TypeParam>*> sep_blob_bottom_vec; @@ -591,8 +591,8 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSobelConvolutionCuDNN) { weights_1[i + 1] = 2; weights_1[i + 2] = 1; } - layer->SetUp(sep_blob_bottom_vec, &(sep_blob_top_vec)); - layer->Forward(sep_blob_bottom_vec, &(sep_blob_top_vec)); + layer->SetUp(sep_blob_bottom_vec, sep_blob_top_vec); + layer->Forward(sep_blob_bottom_vec, sep_blob_top_vec); // (2) the [-1 0 1] row filter blob_sep->CopyFrom(*this->blob_top_2_, false, true); sep_blob_bottom_vec.clear(); @@ -613,8 +613,8 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSobelConvolutionCuDNN) { weights_2[i + 1] = 0; weights_2[i + 2] = 1; } - layer->SetUp(sep_blob_bottom_vec, &(sep_blob_top_vec)); - layer->Forward(sep_blob_bottom_vec, &(sep_blob_top_vec)); + layer->SetUp(sep_blob_bottom_vec, sep_blob_top_vec); + layer->Forward(sep_blob_bottom_vec, sep_blob_top_vec); // Test equivalence of full and separable filters. const TypeParam* top_data = this->blob_top_->cpu_data(); const TypeParam* sep_top_data = this->blob_top_2_->cpu_data(); @@ -637,8 +637,8 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestGradientCuDNN) { convolution_param->mutable_bias_filler()->set_type("gaussian"); CuDNNConvolutionLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(CuDNNConvolutionLayerTest, TestGradientGroupCuDNN) { @@ -654,8 +654,8 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestGradientGroupCuDNN) { convolution_param->mutable_bias_filler()->set_type("gaussian"); CuDNNConvolutionLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } #endif diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 887124aa5bc..657ffdea68c 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -125,7 +125,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { transform_param->set_scale(scale); DataLayer<Dtype> layer(param); - layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer.SetUp(blob_bottom_vec_, blob_top_vec_); EXPECT_EQ(blob_top_data_->num(), 5); EXPECT_EQ(blob_top_data_->channels(), 2); EXPECT_EQ(blob_top_data_->height(), 3); @@ -136,7 +136,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { EXPECT_EQ(blob_top_label_->width(), 1); for (int iter = 0; iter < 100; ++iter) { - layer.Forward(blob_bottom_vec_, &blob_top_vec_); + layer.Forward(blob_bottom_vec_, blob_top_vec_); for (int i = 0; i < 5; ++i) { EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); } @@ -165,7 +165,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { transform_param->set_crop_size(1); DataLayer<Dtype> layer(param); - layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer.SetUp(blob_bottom_vec_, blob_top_vec_); EXPECT_EQ(blob_top_data_->num(), 5); EXPECT_EQ(blob_top_data_->channels(), 2); EXPECT_EQ(blob_top_data_->height(), 1); @@ -176,7 +176,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { EXPECT_EQ(blob_top_label_->width(), 1); for (int iter = 0; iter < 2; ++iter) { - layer.Forward(blob_bottom_vec_, &blob_top_vec_); + layer.Forward(blob_bottom_vec_, blob_top_vec_); for (int i = 0; i < 5; ++i) { EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); } @@ -219,9 +219,9 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { vector<vector<Dtype> > crop_sequence; { DataLayer<Dtype> layer1(param); - layer1.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer1.SetUp(blob_bottom_vec_, blob_top_vec_); for (int iter = 0; iter < 2; ++iter) { - layer1.Forward(blob_bottom_vec_, &blob_top_vec_); + layer1.Forward(blob_bottom_vec_, blob_top_vec_); for (int i = 0; i < 5; ++i) { EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); } @@ -240,9 +240,9 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { // Check that the sequence is the same as the original. Caffe::set_random_seed(seed_); DataLayer<Dtype> layer2(param); - layer2.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer2.SetUp(blob_bottom_vec_, blob_top_vec_); for (int iter = 0; iter < 2; ++iter) { - layer2.Forward(blob_bottom_vec_, &blob_top_vec_); + layer2.Forward(blob_bottom_vec_, blob_top_vec_); for (int i = 0; i < 5; ++i) { EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); } @@ -274,9 +274,9 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { vector<vector<Dtype> > crop_sequence; { DataLayer<Dtype> layer1(param); - layer1.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer1.SetUp(blob_bottom_vec_, blob_top_vec_); for (int iter = 0; iter < 2; ++iter) { - layer1.Forward(blob_bottom_vec_, &blob_top_vec_); + layer1.Forward(blob_bottom_vec_, blob_top_vec_); for (int i = 0; i < 5; ++i) { EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); } @@ -295,9 +295,9 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { // srand with 1701. Check that the sequence differs from the original. srand(seed_); DataLayer<Dtype> layer2(param); - layer2.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer2.SetUp(blob_bottom_vec_, blob_top_vec_); for (int iter = 0; iter < 2; ++iter) { - layer2.Forward(blob_bottom_vec_, &blob_top_vec_); + layer2.Forward(blob_bottom_vec_, blob_top_vec_); for (int i = 0; i < 5; ++i) { EXPECT_EQ(i, blob_top_label_->cpu_data()[i]); } diff --git a/src/caffe/test/test_dummy_data_layer.cpp b/src/caffe/test/test_dummy_data_layer.cpp index 4188bb68c9e..da121fa5d99 100644 --- a/src/caffe/test/test_dummy_data_layer.cpp +++ b/src/caffe/test/test_dummy_data_layer.cpp @@ -56,7 +56,7 @@ TYPED_TEST(DummyDataLayerTest, TestOneTopConstant) { dummy_data_param->add_width(4); this->blob_top_vec_.resize(1); DummyDataLayer<TypeParam> layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_a_->num(), 5); EXPECT_EQ(this->blob_top_a_->channels(), 3); EXPECT_EQ(this->blob_top_a_->height(), 2); @@ -68,7 +68,7 @@ TYPED_TEST(DummyDataLayerTest, TestOneTopConstant) { EXPECT_EQ(0, this->blob_top_vec_[i]->cpu_data()[j]); } } - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < this->blob_top_vec_.size(); ++i) { for (int j = 0; j < this->blob_top_vec_[i]->count(); ++j) { EXPECT_EQ(0, this->blob_top_vec_[i]->cpu_data()[j]); @@ -92,7 +92,7 @@ TYPED_TEST(DummyDataLayerTest, TestTwoTopConstant) { data_filler_param->set_value(7); this->blob_top_vec_.resize(2); DummyDataLayer<TypeParam> layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_a_->num(), 5); EXPECT_EQ(this->blob_top_a_->channels(), 3); EXPECT_EQ(this->blob_top_a_->height(), 2); @@ -107,7 +107,7 @@ TYPED_TEST(DummyDataLayerTest, TestTwoTopConstant) { EXPECT_EQ(7, this->blob_top_vec_[i]->cpu_data()[j]); } } - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < this->blob_top_vec_.size(); ++i) { for (int j = 0; j < this->blob_top_vec_[i]->count(); ++j) { EXPECT_EQ(7, this->blob_top_vec_[i]->cpu_data()[j]); @@ -134,7 +134,7 @@ TYPED_TEST(DummyDataLayerTest, TestThreeTopConstantGaussianConstant) { FillerParameter* data_filler_param_c = dummy_data_param->add_data_filler(); data_filler_param_c->set_value(9); DummyDataLayer<TypeParam> layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_a_->num(), 5); EXPECT_EQ(this->blob_top_a_->channels(), 3); EXPECT_EQ(this->blob_top_a_->height(), 2); @@ -160,7 +160,7 @@ TYPED_TEST(DummyDataLayerTest, TestThreeTopConstantGaussianConstant) { } // Do a Forward pass to fill in Blob b with Gaussian data. - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < this->blob_top_a_->count(); ++i) { EXPECT_EQ(7, this->blob_top_a_->cpu_data()[i]); } @@ -180,7 +180,7 @@ TYPED_TEST(DummyDataLayerTest, TestThreeTopConstantGaussianConstant) { // Do another Forward pass to fill in Blob b with Gaussian data again, // checking that we get different values. - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < this->blob_top_a_->count(); ++i) { EXPECT_EQ(7, this->blob_top_a_->cpu_data()[i]); } diff --git a/src/caffe/test/test_eltwise_layer.cpp b/src/caffe/test/test_eltwise_layer.cpp index d5cf08229ab..be0c1347709 100644 --- a/src/caffe/test/test_eltwise_layer.cpp +++ b/src/caffe/test/test_eltwise_layer.cpp @@ -58,7 +58,7 @@ TYPED_TEST(EltwiseLayerTest, TestSetUp) { eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); shared_ptr<EltwiseLayer<Dtype> > layer( new EltwiseLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 3); EXPECT_EQ(this->blob_top_->height(), 4); @@ -72,8 +72,8 @@ TYPED_TEST(EltwiseLayerTest, TestProd) { eltwise_param->set_operation(EltwiseParameter_EltwiseOp_PROD); shared_ptr<EltwiseLayer<Dtype> > layer( new EltwiseLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* data = this->blob_top_->cpu_data(); const int count = this->blob_top_->count(); const Dtype* in_data_a = this->blob_bottom_a_->cpu_data(); @@ -91,8 +91,8 @@ TYPED_TEST(EltwiseLayerTest, TestSum) { eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); shared_ptr<EltwiseLayer<Dtype> > layer( new EltwiseLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* data = this->blob_top_->cpu_data(); const int count = this->blob_top_->count(); const Dtype* in_data_a = this->blob_bottom_a_->cpu_data(); @@ -113,8 +113,8 @@ TYPED_TEST(EltwiseLayerTest, TestSumCoeff) { eltwise_param->add_coeff(2); shared_ptr<EltwiseLayer<Dtype> > layer( new EltwiseLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* data = this->blob_top_->cpu_data(); const int count = this->blob_top_->count(); const Dtype* in_data_a = this->blob_bottom_a_->cpu_data(); @@ -134,8 +134,8 @@ TYPED_TEST(EltwiseLayerTest, TestStableProdGradient) { eltwise_param->set_stable_prod_grad(true); EltwiseLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(EltwiseLayerTest, TestUnstableProdGradient) { @@ -146,8 +146,8 @@ TYPED_TEST(EltwiseLayerTest, TestUnstableProdGradient) { eltwise_param->set_stable_prod_grad(false); EltwiseLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(EltwiseLayerTest, TestSumGradient) { @@ -157,8 +157,8 @@ TYPED_TEST(EltwiseLayerTest, TestSumGradient) { eltwise_param->set_operation(EltwiseParameter_EltwiseOp_SUM); EltwiseLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(EltwiseLayerTest, TestSumCoeffGradient) { @@ -171,8 +171,8 @@ TYPED_TEST(EltwiseLayerTest, TestSumCoeffGradient) { eltwise_param->add_coeff(2); EltwiseLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(EltwiseLayerTest, TestMax) { @@ -182,8 +182,8 @@ TYPED_TEST(EltwiseLayerTest, TestMax) { eltwise_param->set_operation(EltwiseParameter_EltwiseOp_MAX); shared_ptr<EltwiseLayer<Dtype> > layer( new EltwiseLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* data = this->blob_top_->cpu_data(); const int count = this->blob_top_->count(); const Dtype* in_data_a = this->blob_bottom_a_->cpu_data(); @@ -202,8 +202,8 @@ TYPED_TEST(EltwiseLayerTest, TestMaxGradient) { eltwise_param->set_operation(EltwiseParameter_EltwiseOp_MAX); EltwiseLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-4, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } } // namespace caffe diff --git a/src/caffe/test/test_euclidean_loss_layer.cpp b/src/caffe/test/test_euclidean_loss_layer.cpp index d7d2de7e9d4..1949742bbcb 100644 --- a/src/caffe/test/test_euclidean_loss_layer.cpp +++ b/src/caffe/test/test_euclidean_loss_layer.cpp @@ -44,18 +44,18 @@ class EuclideanLossLayerTest : public MultiDeviceTest<TypeParam> { // equivalent to explicitly specifiying a weight of 1. LayerParameter layer_param; EuclideanLossLayer<Dtype> layer_weight_1(layer_param); - layer_weight_1.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer_weight_1.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype loss_weight_1 = - layer_weight_1.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer_weight_1.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Get the loss again with a different objective weight; check that it is // scaled appropriately. const Dtype kLossWeight = 3.7; layer_param.add_loss_weight(kLossWeight); EuclideanLossLayer<Dtype> layer_weight_2(layer_param); - layer_weight_2.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer_weight_2.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype loss_weight_2 = - layer_weight_2.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer_weight_2.Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype kErrorMargin = 1e-5; EXPECT_NEAR(loss_weight_1 * kLossWeight, loss_weight_2, kErrorMargin); // Make sure the loss is non-trivial. @@ -82,10 +82,10 @@ TYPED_TEST(EuclideanLossLayerTest, TestGradient) { const Dtype kLossWeight = 3.7; layer_param.add_loss_weight(kLossWeight); EuclideanLossLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); GradientChecker<Dtype> checker(1e-2, 1e-2, 1701); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } } // namespace caffe diff --git a/src/caffe/test/test_flatten_layer.cpp b/src/caffe/test/test_flatten_layer.cpp index cbd01f245f2..3042d293cf7 100644 --- a/src/caffe/test/test_flatten_layer.cpp +++ b/src/caffe/test/test_flatten_layer.cpp @@ -41,7 +41,7 @@ TYPED_TEST(FlattenLayerTest, TestSetup) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; FlattenLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 3 * 6 * 5); EXPECT_EQ(this->blob_top_->height(), 1); @@ -52,8 +52,8 @@ TYPED_TEST(FlattenLayerTest, Test) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; FlattenLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int c = 0; c < 3 * 6 * 5; ++c) { EXPECT_EQ(this->blob_top_->data_at(0, c, 0, 0), this->blob_bottom_->data_at(0, c / (6 * 5), (c / 5) % 6, c % 5)); @@ -67,8 +67,8 @@ TYPED_TEST(FlattenLayerTest, TestGradient) { LayerParameter layer_param; FlattenLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index eb09c8d1f3a..c8282233e5b 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -96,8 +96,8 @@ TYPED_TEST(HDF5OutputLayerTest, TestForward) { { HDF5OutputLayer<Dtype> layer(param); EXPECT_EQ(layer.file_name(), this->output_file_name_); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); } file_id = H5Fopen(this->output_file_name_.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index acca75b19b1..db9068b32ed 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -67,7 +67,7 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { // Test that the layer setup got the correct parameters. HDF5DataLayer<Dtype> layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_data_->num(), batch_size); EXPECT_EQ(this->blob_top_data_->channels(), num_cols); EXPECT_EQ(this->blob_top_data_->height(), height); @@ -78,12 +78,12 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { EXPECT_EQ(this->blob_top_label_->height(), 1); EXPECT_EQ(this->blob_top_label_->width(), 1); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); // Go through the data 10 times (5 batches). const int data_size = num_cols * height * width; for (int iter = 0; iter < 10; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // On even iterations, we're reading the first half of the data. // On odd iterations, we're reading the second half of the data. diff --git a/src/caffe/test/test_hinge_loss_layer.cpp b/src/caffe/test/test_hinge_loss_layer.cpp index 3c11b9ac491..b6a99022905 100644 --- a/src/caffe/test/test_hinge_loss_layer.cpp +++ b/src/caffe/test/test_hinge_loss_layer.cpp @@ -57,8 +57,8 @@ TYPED_TEST(HingeLossLayerTest, TestGradientL1) { LayerParameter layer_param; HingeLossLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 2e-3, 1701, 1, 0.01); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); } TYPED_TEST(HingeLossLayerTest, TestGradientL2) { @@ -69,8 +69,8 @@ TYPED_TEST(HingeLossLayerTest, TestGradientL2) { hinge_loss_param->set_norm(HingeLossParameter_Norm_L2); HingeLossLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2, 1701); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); } } // namespace caffe diff --git a/src/caffe/test/test_im2col_layer.cpp b/src/caffe/test/test_im2col_layer.cpp index 32cf6369361..f50abe103f8 100644 --- a/src/caffe/test/test_im2col_layer.cpp +++ b/src/caffe/test/test_im2col_layer.cpp @@ -44,7 +44,7 @@ TYPED_TEST(Im2colLayerTest, TestSetup) { convolution_param->set_kernel_size(3); convolution_param->set_stride(2); Im2colLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 27); EXPECT_EQ(this->blob_top_->height(), 2); @@ -59,8 +59,8 @@ TYPED_TEST(Im2colLayerTest, TestForward) { convolution_param->set_kernel_size(3); convolution_param->set_stride(2); Im2colLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // We are lazy and will only check the top left block for (int c = 0; c < 27; ++c) { EXPECT_EQ(this->blob_bottom_->data_at(0, (c / 9), (c / 3) % 3, c % 3), @@ -77,8 +77,8 @@ TYPED_TEST(Im2colLayerTest, TestGradient) { convolution_param->set_stride(2); Im2colLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } @@ -91,8 +91,8 @@ TYPED_TEST(Im2colLayerTest, TestRect) { convolution_param->set_kernel_w(3); convolution_param->set_stride(2); Im2colLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // We are lazy and will only check the top left block for (int c = 0; c < 45; ++c) { EXPECT_EQ(this->blob_top_->data_at(0, c, 0, 0), @@ -111,8 +111,8 @@ TYPED_TEST(Im2colLayerTest, TestRectGradient) { convolution_param->set_stride(2); Im2colLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } } // namespace caffe diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index d098c765258..77523ef8c18 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -61,7 +61,7 @@ TYPED_TEST(ImageDataLayerTest, TestRead) { image_data_param->set_source(this->filename_.c_str()); image_data_param->set_shuffle(false); ImageDataLayer<Dtype> layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_data_->num(), 5); EXPECT_EQ(this->blob_top_data_->channels(), 3); EXPECT_EQ(this->blob_top_data_->height(), 360); @@ -72,7 +72,7 @@ TYPED_TEST(ImageDataLayerTest, TestRead) { EXPECT_EQ(this->blob_top_label_->width(), 1); // Go through the data twice for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < 5; ++i) { EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); } @@ -89,7 +89,7 @@ TYPED_TEST(ImageDataLayerTest, TestResize) { image_data_param->set_new_width(256); image_data_param->set_shuffle(false); ImageDataLayer<Dtype> layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_data_->num(), 5); EXPECT_EQ(this->blob_top_data_->channels(), 3); EXPECT_EQ(this->blob_top_data_->height(), 256); @@ -100,7 +100,7 @@ TYPED_TEST(ImageDataLayerTest, TestResize) { EXPECT_EQ(this->blob_top_label_->width(), 1); // Go through the data twice for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < 5; ++i) { EXPECT_EQ(i, this->blob_top_label_->cpu_data()[i]); } @@ -115,7 +115,7 @@ TYPED_TEST(ImageDataLayerTest, TestShuffle) { image_data_param->set_source(this->filename_.c_str()); image_data_param->set_shuffle(true); ImageDataLayer<Dtype> layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_data_->num(), 5); EXPECT_EQ(this->blob_top_data_->channels(), 3); EXPECT_EQ(this->blob_top_data_->height(), 360); @@ -126,7 +126,7 @@ TYPED_TEST(ImageDataLayerTest, TestShuffle) { EXPECT_EQ(this->blob_top_label_->width(), 1); // Go through the data twice for (int iter = 0; iter < 2; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); map<Dtype, int> values_to_indices; int num_in_order = 0; for (int i = 0; i < 5; ++i) { diff --git a/src/caffe/test/test_infogain_loss_layer.cpp b/src/caffe/test/test_infogain_loss_layer.cpp index de2f901af31..7ec2f8073c1 100644 --- a/src/caffe/test/test_infogain_loss_layer.cpp +++ b/src/caffe/test/test_infogain_loss_layer.cpp @@ -63,8 +63,8 @@ TYPED_TEST(InfogainLossLayerTest, TestGradient) { LayerParameter layer_param; InfogainLossLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-4, 2e-2, 1701, 1, 0.01); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); } } // namespace caffe diff --git a/src/caffe/test/test_inner_product_layer.cpp b/src/caffe/test/test_inner_product_layer.cpp index 5f9729c4f90..c03df17383a 100644 --- a/src/caffe/test/test_inner_product_layer.cpp +++ b/src/caffe/test/test_inner_product_layer.cpp @@ -48,7 +48,7 @@ TYPED_TEST(InnerProductLayerTest, TestSetUp) { inner_product_param->set_num_output(10); shared_ptr<InnerProductLayer<Dtype> > layer( new InnerProductLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->height(), 1); EXPECT_EQ(this->blob_top_->width(), 1); @@ -73,8 +73,8 @@ TYPED_TEST(InnerProductLayerTest, TestForward) { inner_product_param->mutable_bias_filler()->set_max(2); shared_ptr<InnerProductLayer<Dtype> > layer( new InnerProductLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* data = this->blob_top_->cpu_data(); const int count = this->blob_top_->count(); for (int i = 0; i < count; ++i) { @@ -103,8 +103,8 @@ TYPED_TEST(InnerProductLayerTest, TestGradient) { inner_product_param->mutable_bias_filler()->set_max(2); InnerProductLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } else { LOG(ERROR) << "Skipping test due to old architecture."; } diff --git a/src/caffe/test/test_lrn_layer.cpp b/src/caffe/test/test_lrn_layer.cpp index 3bd62fd9e18..07425df9b3a 100644 --- a/src/caffe/test/test_lrn_layer.cpp +++ b/src/caffe/test/test_lrn_layer.cpp @@ -116,7 +116,7 @@ TYPED_TEST(LRNLayerTest, TestSetupAcrossChannels) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; LRNLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 7); EXPECT_EQ(this->blob_top_->height(), 3); @@ -127,8 +127,8 @@ TYPED_TEST(LRNLayerTest, TestForwardAcrossChannels) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; LRNLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); Blob<Dtype> top_reference; this->ReferenceLRNForward(*(this->blob_bottom_), layer_param, &top_reference); @@ -143,20 +143,20 @@ TYPED_TEST(LRNLayerTest, TestGradientAcrossChannels) { LayerParameter layer_param; LRNLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } vector<bool> propagate_down(this->blob_bottom_vec_.size(), true); layer.Backward(this->blob_top_vec_, propagate_down, - &(this->blob_bottom_vec_)); + this->blob_bottom_vec_); // for (int i = 0; i < this->blob_bottom_->count(); ++i) { // std::cout << "CPU diff " << this->blob_bottom_->cpu_diff()[i] // << std::endl; // } - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(LRNLayerTest, TestSetupWithinChannel) { @@ -166,7 +166,7 @@ TYPED_TEST(LRNLayerTest, TestSetupWithinChannel) { LRNParameter_NormRegion_WITHIN_CHANNEL); layer_param.mutable_lrn_param()->set_local_size(3); LRNLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 2); EXPECT_EQ(this->blob_top_->channels(), 7); EXPECT_EQ(this->blob_top_->height(), 3); @@ -180,8 +180,8 @@ TYPED_TEST(LRNLayerTest, TestForwardWithinChannel) { LRNParameter_NormRegion_WITHIN_CHANNEL); layer_param.mutable_lrn_param()->set_local_size(3); LRNLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); Blob<Dtype> top_reference; this->ReferenceLRNForward(*(this->blob_bottom_), layer_param, &top_reference); @@ -199,13 +199,13 @@ TYPED_TEST(LRNLayerTest, TestGradientWithinChannel) { layer_param.mutable_lrn_param()->set_local_size(3); LRNLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } diff --git a/src/caffe/test/test_maxpool_dropout_layers.cpp b/src/caffe/test/test_maxpool_dropout_layers.cpp index 311c7781be5..b1f4e4eac9a 100644 --- a/src/caffe/test/test_maxpool_dropout_layers.cpp +++ b/src/caffe/test/test_maxpool_dropout_layers.cpp @@ -47,9 +47,9 @@ TYPED_TEST(MaxPoolingDropoutTest, TestSetup) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); PoolingLayer<Dtype> max_layer(layer_param); - max_layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + max_layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); DropoutLayer<Dtype> dropout_layer(layer_param); - dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); + dropout_layer.SetUp(this->blob_top_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); EXPECT_EQ(this->blob_top_->height(), 3); @@ -64,8 +64,8 @@ TYPED_TEST(MaxPoolingDropoutTest, TestForward) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); PoolingLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* top_data = this->blob_top_->cpu_data(); Dtype sum = 0.; for (int i = 0; i < this->blob_top_->count(); ++i) { @@ -74,8 +74,8 @@ TYPED_TEST(MaxPoolingDropoutTest, TestForward) { EXPECT_EQ(sum, this->blob_top_->count()); // Dropout in-place DropoutLayer<Dtype> dropout_layer(layer_param); - dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); - dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); + dropout_layer.SetUp(this->blob_top_vec_, this->blob_top_vec_); + dropout_layer.Forward(this->blob_top_vec_, this->blob_top_vec_); sum = 0.; Dtype scale = 1. / (1. - layer_param.dropout_param().dropout_ratio()); top_data = this->blob_top_->cpu_data(); @@ -94,14 +94,14 @@ TYPED_TEST(MaxPoolingDropoutTest, TestBackward) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); PoolingLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = 1.; } vector<bool> propagate_down(this->blob_bottom_vec_.size(), true); layer.Backward(this->blob_top_vec_, propagate_down, - &(this->blob_bottom_vec_)); + this->blob_bottom_vec_); const Dtype* bottom_diff = this->blob_bottom_->cpu_diff(); Dtype sum = 0.; for (int i = 0; i < this->blob_bottom_->count(); ++i) { @@ -110,12 +110,12 @@ TYPED_TEST(MaxPoolingDropoutTest, TestBackward) { EXPECT_EQ(sum, this->blob_top_->count()); // Dropout in-place DropoutLayer<Dtype> dropout_layer(layer_param); - dropout_layer.SetUp(this->blob_top_vec_, &(this->blob_top_vec_)); - dropout_layer.Forward(this->blob_top_vec_, &(this->blob_top_vec_)); + dropout_layer.SetUp(this->blob_top_vec_, this->blob_top_vec_); + dropout_layer.Forward(this->blob_top_vec_, this->blob_top_vec_); dropout_layer.Backward(this->blob_top_vec_, propagate_down, - &(this->blob_top_vec_)); + this->blob_top_vec_); layer.Backward(this->blob_top_vec_, propagate_down, - &(this->blob_bottom_vec_)); + this->blob_bottom_vec_); Dtype sum_with_dropout = 0.; bottom_diff = this->blob_bottom_->cpu_diff(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index 3dc00345743..497ab0d15e7 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -70,7 +70,7 @@ TYPED_TEST(MemoryDataLayerTest, TestSetup) { md_param->set_width(this->width_); shared_ptr<Layer<Dtype> > layer( new MemoryDataLayer<Dtype>(layer_param)); - layer->SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->data_blob_->num(), this->batch_size_); EXPECT_EQ(this->data_blob_->channels(), this->channels_); EXPECT_EQ(this->data_blob_->height(), this->height_); @@ -93,12 +93,12 @@ TYPED_TEST(MemoryDataLayerTest, TestForward) { md_param->set_width(this->width_); shared_ptr<MemoryDataLayer<Dtype> > layer( new MemoryDataLayer<Dtype>(layer_param)); - layer->DataLayerSetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->DataLayerSetUp(this->blob_bottom_vec_, this->blob_top_vec_); layer->Reset(this->data_->mutable_cpu_data(), this->labels_->mutable_cpu_data(), this->data_->num()); for (int i = 0; i < this->batches_ * 6; ++i) { int batch_num = i % this->batches_; - layer->Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int j = 0; j < this->data_blob_->count(); ++j) { EXPECT_EQ(this->data_blob_->cpu_data()[j], this->data_->cpu_data()[ @@ -121,7 +121,7 @@ TYPED_TEST(MemoryDataLayerTest, AddDatumVectorDefaultTransform) { memory_data_param->set_height(this->height_); memory_data_param->set_width(this->width_); MemoryDataLayer<Dtype> layer(param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); vector<Datum> datum_vector(this->batch_size_); const size_t count = this->channels_ * this->height_ * this->width_; @@ -144,7 +144,7 @@ TYPED_TEST(MemoryDataLayerTest, AddDatumVectorDefaultTransform) { int data_index; // Go through the data 5 times for (int iter = 0; iter < 5; ++iter) { - layer.Forward(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* data = this->data_blob_->cpu_data(); size_t index = 0; for (int i = 0; i < this->batch_size_; ++i) { diff --git a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp index 1fc4c42f0f4..9038017e3e2 100644 --- a/src/caffe/test/test_multinomial_logistic_loss_layer.cpp +++ b/src/caffe/test/test_multinomial_logistic_loss_layer.cpp @@ -53,10 +53,10 @@ TYPED_TEST(MultinomialLogisticLossLayerTest, TestGradientCPU) { LayerParameter layer_param; Caffe::set_mode(Caffe::CPU); MultinomialLogisticLossLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); GradientChecker<TypeParam> checker(1e-2, 2*1e-2, 1701, 0, 0.05); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); } } // namespace caffe diff --git a/src/caffe/test/test_mvn_layer.cpp b/src/caffe/test/test_mvn_layer.cpp index d3d8012f09f..933b4326417 100644 --- a/src/caffe/test/test_mvn_layer.cpp +++ b/src/caffe/test/test_mvn_layer.cpp @@ -40,8 +40,8 @@ TYPED_TEST(MVNLayerTest, TestForward) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; MVNLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Test mean int num = this->blob_bottom_->num(); int channels = this->blob_bottom_->channels(); @@ -75,8 +75,8 @@ TYPED_TEST(MVNLayerTest, TestForwardMeanOnly) { LayerParameter layer_param; layer_param.ParseFromString("mvn_param{normalize_variance: false}"); MVNLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Test mean int num = this->blob_bottom_->num(); int channels = this->blob_bottom_->channels(); @@ -107,8 +107,8 @@ TYPED_TEST(MVNLayerTest, TestForwardAcrossChannels) { LayerParameter layer_param; layer_param.ParseFromString("mvn_param{across_channels: true}"); MVNLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Test mean int num = this->blob_bottom_->num(); int channels = this->blob_bottom_->channels(); @@ -142,8 +142,8 @@ TYPED_TEST(MVNLayerTest, TestGradient) { LayerParameter layer_param; MVNLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(MVNLayerTest, TestGradientMeanOnly) { @@ -152,8 +152,8 @@ TYPED_TEST(MVNLayerTest, TestGradientMeanOnly) { layer_param.ParseFromString("mvn_param{normalize_variance: false}"); MVNLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(MVNLayerTest, TestGradientAcrossChannels) { @@ -162,8 +162,8 @@ TYPED_TEST(MVNLayerTest, TestGradientAcrossChannels) { layer_param.ParseFromString("mvn_param{across_channels: true}"); MVNLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } } // namespace caffe diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 4c19d3f9bae..fdbb63cb3e5 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -44,8 +44,8 @@ class NeuronLayerTest : public MultiDeviceTest<TypeParam> { } Caffe::set_phase(Caffe::TRAIN); DropoutLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); @@ -74,8 +74,8 @@ TYPED_TEST(NeuronLayerTest, TestAbsVal) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; AbsValLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); const int count = this->blob_bottom_->count(); @@ -89,16 +89,16 @@ TYPED_TEST(NeuronLayerTest, TestAbsGradient) { LayerParameter layer_param; AbsValLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(NeuronLayerTest, TestReLU) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ReLULayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); @@ -113,8 +113,8 @@ TYPED_TEST(NeuronLayerTest, TestReLUGradient) { LayerParameter layer_param; ReLULayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(NeuronLayerTest, TestReLUWithNegativeSlope) { @@ -122,8 +122,8 @@ TYPED_TEST(NeuronLayerTest, TestReLUWithNegativeSlope) { LayerParameter layer_param; layer_param.ParseFromString("relu_param{negative_slope:0.01}"); ReLULayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); @@ -139,16 +139,16 @@ TYPED_TEST(NeuronLayerTest, TestReLUGradientWithNegativeSlope) { layer_param.ParseFromString("relu_param{negative_slope:0.01}"); ReLULayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(NeuronLayerTest, TestSigmoid) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; SigmoidLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); @@ -165,16 +165,16 @@ TYPED_TEST(NeuronLayerTest, TestSigmoidGradient) { LayerParameter layer_param; SigmoidLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(NeuronLayerTest, TestTanH) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; TanHLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Test exact values for (int i = 0; i < this->blob_bottom_->num(); ++i) { for (int j = 0; j < this->blob_bottom_->channels(); ++j) { @@ -197,8 +197,8 @@ TYPED_TEST(NeuronLayerTest, TestTanHGradient) { LayerParameter layer_param; TanHLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(NeuronLayerTest, TestDropoutHalf) { @@ -216,8 +216,8 @@ TYPED_TEST(NeuronLayerTest, TestDropoutTestPhase) { LayerParameter layer_param; Caffe::set_phase(Caffe::TEST); DropoutLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); @@ -234,8 +234,8 @@ TYPED_TEST(NeuronLayerTest, TestDropoutGradient) { Caffe::set_phase(Caffe::TRAIN); DropoutLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(NeuronLayerTest, TestDropoutGradientTest) { @@ -244,16 +244,16 @@ TYPED_TEST(NeuronLayerTest, TestDropoutGradientTest) { Caffe::set_phase(Caffe::TEST); DropoutLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(NeuronLayerTest, TestBNLL) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; BNLLLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); @@ -268,8 +268,8 @@ TYPED_TEST(NeuronLayerTest, TestBNLLGradient) { LayerParameter layer_param; BNLLLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } #ifdef USE_CUDNN @@ -300,8 +300,8 @@ TYPED_TEST(CuDNNNeuronLayerTest, TestReLUCuDNN) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; CuDNNReLULayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); @@ -316,8 +316,8 @@ TYPED_TEST(CuDNNNeuronLayerTest, TestReLUGradientCuDNN) { LayerParameter layer_param; CuDNNReLULayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(CuDNNNeuronLayerTest, TestReLUWithNegativeSlopeCuDNN) { @@ -325,8 +325,8 @@ TYPED_TEST(CuDNNNeuronLayerTest, TestReLUWithNegativeSlopeCuDNN) { LayerParameter layer_param; layer_param.ParseFromString("relu_param{negative_slope:0.01}"); CuDNNReLULayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); @@ -342,16 +342,16 @@ TYPED_TEST(CuDNNNeuronLayerTest, TestReLUGradientWithNegativeSlopeCuDNN) { layer_param.ParseFromString("relu_param{negative_slope:0.01}"); CuDNNReLULayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(CuDNNNeuronLayerTest, TestSigmoidCuDNN) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; CuDNNSigmoidLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); @@ -368,16 +368,16 @@ TYPED_TEST(CuDNNNeuronLayerTest, TestSigmoidGradientCuDNN) { LayerParameter layer_param; CuDNNSigmoidLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-2, 1e-3, 1701, 0., 0.01); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } TYPED_TEST(CuDNNNeuronLayerTest, TestTanHCuDNN) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; CuDNNTanHLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Test exact values for (int i = 0; i < this->blob_bottom_->num(); ++i) { for (int j = 0; j < this->blob_bottom_->channels(); ++j) { @@ -400,8 +400,8 @@ TYPED_TEST(CuDNNNeuronLayerTest, TestTanHGradientCuDNN) { LayerParameter layer_param; CuDNNTanHLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-2, 1e-3); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } #endif diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index ec23a682c2f..e2980331dc0 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -73,7 +73,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { blob_bottom_->mutable_cpu_data()[i + 14] = 3; } PoolingLayer<Dtype> layer(layer_param); - layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer.SetUp(blob_bottom_vec_, blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); EXPECT_EQ(blob_top_->height(), 2); @@ -84,7 +84,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { EXPECT_EQ(blob_top_mask_->height(), 2); EXPECT_EQ(blob_top_mask_->width(), 4); } - layer.Forward(blob_bottom_vec_, &blob_top_vec_); + layer.Forward(blob_bottom_vec_, blob_top_vec_); // Expected output: 2x 2 channels of: // [9 5 5 8] // [9 5 5 8] @@ -171,7 +171,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { blob_bottom_->mutable_cpu_data()[i + 35] = 11; } PoolingLayer<Dtype> layer(layer_param); - layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer.SetUp(blob_bottom_vec_, blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); EXPECT_EQ(blob_top_->height(), 4); @@ -182,7 +182,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { EXPECT_EQ(blob_top_mask_->height(), 4); EXPECT_EQ(blob_top_mask_->width(), 5); } - layer.Forward(blob_bottom_vec_, &blob_top_vec_); + layer.Forward(blob_bottom_vec_, blob_top_vec_); // Expected output: 2x 2 channels of: // [35 32 26 27 27] // [32 33 33 27 27] @@ -296,7 +296,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { blob_bottom_->mutable_cpu_data()[i + 35] = 11; } PoolingLayer<Dtype> layer(layer_param); - layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer.SetUp(blob_bottom_vec_, blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); EXPECT_EQ(blob_top_->height(), 5); @@ -307,7 +307,7 @@ class PoolingLayerTest : public MultiDeviceTest<TypeParam> { EXPECT_EQ(blob_top_mask_->height(), 5); EXPECT_EQ(blob_top_mask_->width(), 4); } - layer.Forward(blob_bottom_vec_, &blob_top_vec_); + layer.Forward(blob_bottom_vec_, blob_top_vec_); // Expected output: 2x 2 channels of: // [35 32 26 26] // [32 32 27 27] @@ -377,7 +377,7 @@ TYPED_TEST(PoolingLayerTest, TestSetup) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); PoolingLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); EXPECT_EQ(this->blob_top_->height(), 3); @@ -393,7 +393,7 @@ TYPED_TEST(PoolingLayerTest, TestSetupPadded) { pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); PoolingLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); EXPECT_EQ(this->blob_top_->height(), 4); @@ -407,8 +407,8 @@ TYPED_TEST(PoolingLayerTest, PrintBackward) { layer_param.set_stride(2); layer_param.set_pool(LayerParameter_PoolMethod_MAX); PoolingLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < this->blob_bottom_->count(); ++i) { cout << "bottom data " << i << " " << this->blob_bottom_->cpu_data()[i] << endl; } @@ -419,7 +419,7 @@ TYPED_TEST(PoolingLayerTest, PrintBackward) { for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = i; } - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + layer.Backward(this->blob_top_vec_, true, this->blob_bottom_vec_); for (int i = 0; i < this->blob_bottom_->count(); ++i) { cout << "bottom diff " << i << " " << this->blob_bottom_->cpu_diff()[i] << endl; } @@ -452,8 +452,8 @@ TYPED_TEST(PoolingLayerTest, TestGradientMax) { pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); PoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } } } @@ -481,12 +481,12 @@ TYPED_TEST(PoolingLayerTest, TestForwardMaxPadded) { this->blob_bottom_->mutable_cpu_data()[7] = 2; this->blob_bottom_->mutable_cpu_data()[8] = 1; PoolingLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); EXPECT_EQ(this->blob_top_->height(), 3); EXPECT_EQ(this->blob_top_->width(), 3); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); Dtype epsilon = 1e-8; // Output: // [ 1 4 4 ] @@ -516,8 +516,8 @@ TYPED_TEST(PoolingLayerTest, TestGradientMaxTopMask) { this->blob_top_vec_.push_back(this->blob_top_mask_); PoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); this->blob_top_vec_.pop_back(); } } @@ -537,12 +537,12 @@ TYPED_TEST(PoolingLayerTest, TestForwardAve) { ConstantFiller<Dtype> filler(filler_param); filler.Fill(this->blob_bottom_); PoolingLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); EXPECT_EQ(this->blob_top_->height(), 3); EXPECT_EQ(this->blob_top_->width(), 3); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); Dtype epsilon = 1e-5; EXPECT_NEAR(this->blob_top_->cpu_data()[0], 8.0 / 9, epsilon); EXPECT_NEAR(this->blob_top_->cpu_data()[1], 4.0 / 3, epsilon); @@ -567,8 +567,8 @@ TYPED_TEST(PoolingLayerTest, TestGradientAve) { pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); PoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } } } @@ -586,8 +586,8 @@ TYPED_TEST(PoolingLayerTest, TestGradientAvePadded) { pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); PoolingLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } } } @@ -651,7 +651,7 @@ class CuDNNPoolingLayerTest : public ::testing::Test { blob_bottom_->mutable_cpu_data()[i + 14] = 3; } CuDNNPoolingLayer<Dtype> layer(layer_param); - layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer.SetUp(blob_bottom_vec_, blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); EXPECT_EQ(blob_top_->height(), 2); @@ -662,7 +662,7 @@ class CuDNNPoolingLayerTest : public ::testing::Test { EXPECT_EQ(blob_top_mask_->height(), 2); EXPECT_EQ(blob_top_mask_->width(), 4); } - layer.Forward(blob_bottom_vec_, &blob_top_vec_); + layer.Forward(blob_bottom_vec_, blob_top_vec_); // Expected output: 2x 2 channels of: // [9 5 5 8] // [9 5 5 8] @@ -749,7 +749,7 @@ class CuDNNPoolingLayerTest : public ::testing::Test { blob_bottom_->mutable_cpu_data()[i + 35] = 11; } CuDNNPoolingLayer<Dtype> layer(layer_param); - layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer.SetUp(blob_bottom_vec_, blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); EXPECT_EQ(blob_top_->height(), 4); @@ -760,7 +760,7 @@ class CuDNNPoolingLayerTest : public ::testing::Test { EXPECT_EQ(blob_top_mask_->height(), 4); EXPECT_EQ(blob_top_mask_->width(), 5); } - layer.Forward(blob_bottom_vec_, &blob_top_vec_); + layer.Forward(blob_bottom_vec_, blob_top_vec_); // Expected output: 2x 2 channels of: // [35 32 26 27 27] // [32 33 33 27 27] @@ -874,7 +874,7 @@ class CuDNNPoolingLayerTest : public ::testing::Test { blob_bottom_->mutable_cpu_data()[i + 35] = 11; } CuDNNPoolingLayer<Dtype> layer(layer_param); - layer.SetUp(blob_bottom_vec_, &blob_top_vec_); + layer.SetUp(blob_bottom_vec_, blob_top_vec_); EXPECT_EQ(blob_top_->num(), num); EXPECT_EQ(blob_top_->channels(), channels); EXPECT_EQ(blob_top_->height(), 5); @@ -885,7 +885,7 @@ class CuDNNPoolingLayerTest : public ::testing::Test { EXPECT_EQ(blob_top_mask_->height(), 5); EXPECT_EQ(blob_top_mask_->width(), 4); } - layer.Forward(blob_bottom_vec_, &blob_top_vec_); + layer.Forward(blob_bottom_vec_, blob_top_vec_); // Expected output: 2x 2 channels of: // [35 32 26 26] // [32 32 27 27] @@ -955,7 +955,7 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestSetupCuDNN) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); CuDNNPoolingLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); EXPECT_EQ(this->blob_top_->height(), 3); @@ -971,7 +971,7 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestSetupPaddedCuDNN) { pooling_param->set_pad(1); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); CuDNNPoolingLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); EXPECT_EQ(this->blob_top_->height(), 4); @@ -986,8 +986,8 @@ TYPED_TEST(CuDNNPoolingLayerTest, PrintBackwardCuDNN) { layer_param.set_stride(2); layer_param.set_pool(LayerParameter_PoolMethod_MAX); CuDNNPoolingLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < this->blob_bottom_->count(); ++i) { cout << "bottom data " << i << " " << this->blob_bottom_->cpu_data()[i] << endl; } @@ -998,7 +998,7 @@ TYPED_TEST(CuDNNPoolingLayerTest, PrintBackwardCuDNN) { for (int i = 0; i < this->blob_top_->count(); ++i) { this->blob_top_->mutable_cpu_diff()[i] = i; } - layer.Backward(this->blob_top_vec_, true, &(this->blob_bottom_vec_)); + layer.Backward(this->blob_top_vec_, true, this->blob_bottom_vec_); for (int i = 0; i < this->blob_bottom_->count(); ++i) { cout << "bottom diff " << i << " " << this->blob_bottom_->cpu_diff()[i] << endl; } @@ -1033,8 +1033,8 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestGradientMaxCuDNN) { pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); CuDNNPoolingLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } } } @@ -1062,12 +1062,12 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestForwardMaxPaddedCuDNN) { this->blob_bottom_->mutable_cpu_data()[7] = 2; this->blob_bottom_->mutable_cpu_data()[8] = 1; CuDNNPoolingLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); EXPECT_EQ(this->blob_top_->height(), 3); EXPECT_EQ(this->blob_top_->width(), 3); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); TypeParam epsilon = 1e-8; // Output: // [ 1 4 4 ] @@ -1097,8 +1097,8 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestGradientMaxTopMaskCuDNN) { this->blob_top_vec_.push_back(this->blob_top_mask_); CuDNNPoolingLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-4, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); this->blob_top_vec_.pop_back(); } } @@ -1118,12 +1118,12 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestForwardAveCuDNN) { ConstantFiller<TypeParam> filler(filler_param); filler.Fill(this->blob_bottom_); CuDNNPoolingLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); EXPECT_EQ(this->blob_top_->height(), 3); EXPECT_EQ(this->blob_top_->width(), 3); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); TypeParam epsilon = 1e-5; EXPECT_NEAR(this->blob_top_->cpu_data()[0], 8.0 / 9, epsilon); EXPECT_NEAR(this->blob_top_->cpu_data()[1], 4.0 / 3, epsilon); @@ -1148,8 +1148,8 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestGradientAveCuDNN) { pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); CuDNNPoolingLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } } } @@ -1167,8 +1167,8 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestGradientAvePaddedCuDNN) { pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); CuDNNPoolingLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-2, 1e-2); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } } } diff --git a/src/caffe/test/test_power_layer.cpp b/src/caffe/test/test_power_layer.cpp index 0c104c20b7c..0d52fa1c8e2 100644 --- a/src/caffe/test/test_power_layer.cpp +++ b/src/caffe/test/test_power_layer.cpp @@ -37,8 +37,8 @@ class PowerLayerTest : public MultiDeviceTest<TypeParam> { layer_param.mutable_power_param()->set_scale(scale); layer_param.mutable_power_param()->set_shift(shift); PowerLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); @@ -75,8 +75,8 @@ class PowerLayerTest : public MultiDeviceTest<TypeParam> { } } GradientChecker<Dtype> checker(1e-2, 1e-2, 1701, 0., 0.01); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } Blob<Dtype>* const blob_bottom_; diff --git a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp index 47ccdea1538..e5737e43f6e 100644 --- a/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/test/test_sigmoid_cross_entropy_loss_layer.cpp @@ -79,9 +79,9 @@ class SigmoidCrossEntropyLossLayerTest : public MultiDeviceTest<TypeParam> { // Fill the targets vector targets_filler.Fill(this->blob_bottom_targets_); SigmoidCrossEntropyLossLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); Dtype layer_loss = - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); const int count = this->blob_bottom_data_->count(); const int num = this->blob_bottom_data_->num(); const Dtype* blob_bottom_data = this->blob_bottom_data_->cpu_data(); @@ -112,10 +112,10 @@ TYPED_TEST(SigmoidCrossEntropyLossLayerTest, TestGradient) { const Dtype kLossWeight = 3.7; layer_param.add_loss_weight(kLossWeight); SigmoidCrossEntropyLossLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &this->blob_top_vec_); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); GradientChecker<Dtype> checker(1e-2, 1e-2, 1701); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); } diff --git a/src/caffe/test/test_slice_layer.cpp b/src/caffe/test/test_slice_layer.cpp index ee8818781f5..395be280089 100644 --- a/src/caffe/test/test_slice_layer.cpp +++ b/src/caffe/test/test_slice_layer.cpp @@ -64,7 +64,7 @@ TYPED_TEST(SliceLayerTest, TestSetupNum) { LayerParameter layer_param; layer_param.mutable_slice_param()->set_slice_dim(0); SliceLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_1_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_1_); EXPECT_EQ(this->blob_bottom_->num(), 3 * this->blob_top_0_->num()); EXPECT_EQ(this->blob_top_0_->num(), this->blob_top_1_->num()); EXPECT_EQ(this->blob_top_0_->num(), this->blob_top_2_->num()); @@ -78,7 +78,7 @@ TYPED_TEST(SliceLayerTest, TestSetupChannels) { LayerParameter layer_param; layer_param.mutable_slice_param()->add_slice_point(3); SliceLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_0_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_0_); EXPECT_EQ(this->blob_top_0_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_0_->channels(), 3); EXPECT_EQ(this->blob_top_1_->channels(), 9); @@ -93,11 +93,11 @@ TYPED_TEST(SliceLayerTest, TestSliceAcrossNum) { LayerParameter layer_param; layer_param.mutable_slice_param()->set_slice_dim(0); SliceLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_0_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_0_); const int top_num = this->blob_bottom_->num() / 2; ASSERT_EQ(top_num, this->blob_top_0_->num()); ASSERT_EQ(top_num, this->blob_top_1_->num()); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_0_)); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_0_); for (int n = 0; n < top_num; ++n) { for (int c = 0; c < this->blob_top_0_->channels(); ++c) { for (int h = 0; h < this->blob_bottom_->height(); ++h) { @@ -127,12 +127,12 @@ TYPED_TEST(SliceLayerTest, TestSliceAcrossChannels) { layer_param.mutable_slice_param()->add_slice_point(kSlicePoint0); layer_param.mutable_slice_param()->add_slice_point(kSlicePoint1); SliceLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_1_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_1_); ASSERT_EQ(kSlicePoint0, this->blob_top_0_->channels()); ASSERT_EQ(kSlicePoint1 - kSlicePoint0, this->blob_top_1_->channels()); ASSERT_EQ(this->blob_bottom_->channels() - kSlicePoint1, this->blob_top_2_->channels()); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_1_)); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_1_); for (int n = 0; n < this->blob_bottom_->num(); ++n) { for (int c = 0; c < this->blob_top_0_->channels(); ++c) { for (int h = 0; h < this->blob_bottom_->height(); ++h) { @@ -169,8 +169,8 @@ TYPED_TEST(SliceLayerTest, TestGradientAcrossNum) { layer_param.mutable_slice_param()->set_slice_dim(0); SliceLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_0_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_0_); } TYPED_TEST(SliceLayerTest, TestGradientAcrossChannels) { @@ -182,8 +182,8 @@ TYPED_TEST(SliceLayerTest, TestGradientAcrossChannels) { layer_param.mutable_slice_param()->add_slice_point(kSlicePoint); SliceLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_0_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_0_); } } // namespace caffe diff --git a/src/caffe/test/test_softmax_layer.cpp b/src/caffe/test/test_softmax_layer.cpp index 41f643f4e2a..f6674422e56 100644 --- a/src/caffe/test/test_softmax_layer.cpp +++ b/src/caffe/test/test_softmax_layer.cpp @@ -41,8 +41,8 @@ TYPED_TEST(SoftmaxLayerTest, TestForward) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; SoftmaxLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Test sum for (int i = 0; i < this->blob_bottom_->num(); ++i) { for (int k = 0; k < this->blob_bottom_->height(); ++k) { @@ -76,8 +76,8 @@ TYPED_TEST(SoftmaxLayerTest, TestGradient) { LayerParameter layer_param; SoftmaxLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } #ifdef USE_CUDNN @@ -107,8 +107,8 @@ TYPED_TEST(CuDNNSoftmaxLayerTest, TestForwardCuDNN) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; CuDNNSoftmaxLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Test sum for (int i = 0; i < this->blob_bottom_->num(); ++i) { for (int k = 0; k < this->blob_bottom_->height(); ++k) { @@ -142,8 +142,8 @@ TYPED_TEST(CuDNNSoftmaxLayerTest, TestGradientCuDNN) { LayerParameter layer_param; CuDNNSoftmaxLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-2, 1e-3); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } #endif diff --git a/src/caffe/test/test_softmax_with_loss_layer.cpp b/src/caffe/test/test_softmax_with_loss_layer.cpp index 246d64e116a..badda3b5503 100644 --- a/src/caffe/test/test_softmax_with_loss_layer.cpp +++ b/src/caffe/test/test_softmax_with_loss_layer.cpp @@ -57,8 +57,8 @@ TYPED_TEST(SoftmaxWithLossLayerTest, TestGradient) { layer_param.add_loss_weight(3); SoftmaxWithLossLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2, 1701); - checker.CheckGradientExhaustive(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_), 0); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); } } // namespace caffe diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index e9b942c5c51..38e762195a2 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -52,7 +52,7 @@ TYPED_TEST(SplitLayerTest, TestSetup) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; SplitLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_a_->num(), 2); EXPECT_EQ(this->blob_top_a_->channels(), 3); EXPECT_EQ(this->blob_top_a_->height(), 6); @@ -67,8 +67,8 @@ TYPED_TEST(SplitLayerTest, Test) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; SplitLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); for (int i = 0; i < this->blob_bottom_->count(); ++i) { Dtype bottom_value = this->blob_bottom_->cpu_data()[i]; EXPECT_EQ(bottom_value, this->blob_top_a_->cpu_data()[i]); @@ -81,8 +81,8 @@ TYPED_TEST(SplitLayerTest, TestGradient) { LayerParameter layer_param; SplitLayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-2); - checker.CheckGradientEltwise(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } diff --git a/src/caffe/test/test_stochastic_pooling.cpp b/src/caffe/test/test_stochastic_pooling.cpp index 4f13981bd82..ad5151007c2 100644 --- a/src/caffe/test/test_stochastic_pooling.cpp +++ b/src/caffe/test/test_stochastic_pooling.cpp @@ -53,7 +53,7 @@ TYPED_TEST(StochasticPoolingLayerTest, TestSetup) { pooling_param->set_kernel_size(3); pooling_param->set_stride(2); PoolingLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); EXPECT_EQ(this->blob_top_->height(), 3); @@ -69,8 +69,8 @@ TYPED_TEST(StochasticPoolingLayerTest, TestStochasticGPU) { pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_STOCHASTIC); PoolingLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Check if the output is correct - it should do random sampling const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); @@ -113,8 +113,8 @@ TYPED_TEST(StochasticPoolingLayerTest, TestStochasticGPUTestPhase) { pooling_param->set_stride(2); pooling_param->set_pool(PoolingParameter_PoolMethod_STOCHASTIC); PoolingLayer<TypeParam> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Check if the output is correct - it should do random sampling const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); @@ -154,8 +154,8 @@ TYPED_TEST(StochasticPoolingLayerTest, TestGradientGPU) { GradientChecker<TypeParam> checker(1e-4, 1e-2); // it is too expensive to call curand multiple times, so we don't do an // exhaustive gradient check. - checker.CheckGradient(&layer, &(this->blob_bottom_vec_), - &(this->blob_top_vec_)); + checker.CheckGradient(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); } diff --git a/src/caffe/test/test_threshold_layer.cpp b/src/caffe/test/test_threshold_layer.cpp index 32dfbeeac92..05ce82120e6 100644 --- a/src/caffe/test/test_threshold_layer.cpp +++ b/src/caffe/test/test_threshold_layer.cpp @@ -40,7 +40,7 @@ TYPED_TEST(ThresholdLayerTest, TestSetup) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ThresholdLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); EXPECT_EQ(this->blob_top_->height(), this->blob_bottom_->height()); @@ -51,8 +51,8 @@ TYPED_TEST(ThresholdLayerTest, Test) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ThresholdLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); @@ -76,8 +76,8 @@ TYPED_TEST(ThresholdLayerTest, Test2) { layer_param.mutable_threshold_param(); threshold_param->set_threshold(0.5); ThresholdLayer<Dtype> layer(layer_param); - layer.SetUp(this->blob_bottom_vec_, &(this->blob_top_vec_)); - layer.Forward(this->blob_bottom_vec_, &(this->blob_top_vec_)); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); // Now, check values const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); diff --git a/tools/caffe.cpp b/tools/caffe.cpp index c8c8c1a6b4c..bfcd9f19cec 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -237,8 +237,8 @@ int time() { for (int j = 0; j < FLAGS_iterations; ++j) { // Although Reshape should be essentially free, we include it here // so that we will notice Reshape performance bugs. - layers[i]->Reshape(bottom_vecs[i], &top_vecs[i]); - layers[i]->Forward(bottom_vecs[i], &top_vecs[i]); + layers[i]->Reshape(bottom_vecs[i], top_vecs[i]); + layers[i]->Forward(bottom_vecs[i], top_vecs[i]); } LOG(INFO) << layername << "\tforward: " << timer.MilliSeconds() << " milliseconds."; @@ -252,7 +252,7 @@ int time() { timer.Start(); for (int j = 0; j < FLAGS_iterations; ++j) { layers[i]->Backward(top_vecs[i], bottom_need_backward[i], - &bottom_vecs[i]); + bottom_vecs[i]); } LOG(INFO) << layername << "\tbackward: " << timer.MilliSeconds() << " milliseconds."; From 7cfc3627c7e65251d4a559ca8bfe963f43398ae8 Mon Sep 17 00:00:00 2001 From: Ronghang Hu <huronghang@hotmail.com> Date: Sat, 20 Sep 2014 07:55:32 +0800 Subject: [PATCH 0793/2053] fix directory in finetune pascal example --- .../pascal_finetune_solver.prototxt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt b/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt index 54ba6350448..83f5abdf891 100644 --- a/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt +++ b/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt @@ -1,5 +1,5 @@ -train_net: "examples/finetuning_pascal_detection/pascal_finetune_train.prototxt" -test_net: "examples/finetuning_pascal_detection/pascal_finetune_val.prototxt" +train_net: "examples/finetune_pascal_detection/pascal_finetune_train.prototxt" +test_net: "examples/finetune_pascal_detection/pascal_finetune_val.prototxt" test_iter: 100 test_interval: 1000 base_lr: 0.001 @@ -11,4 +11,4 @@ max_iter: 100000 momentum: 0.9 weight_decay: 0.0005 snapshot: 10000 -snapshot_prefix: "examples/finetuning_pascal_detection/pascal_det_finetune" +snapshot_prefix: "examples/finetune_pascal_detection/pascal_det_finetune" From 2f45b2109b1fb6080abe035d1a8e0684cda13bb5 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 19 Sep 2014 21:32:16 -0700 Subject: [PATCH 0794/2053] drop out-of-date conv test comments --- src/caffe/test/test_convolution_layer.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index aef9092d8fe..c2e0a86271a 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -182,7 +182,6 @@ TYPED_TEST(ConvolutionLayerTest, TestSetup) { } TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) { - // We will simply see if the convolution layer carries out averaging well. typedef typename TypeParam::Dtype Dtype; this->blob_bottom_vec_.push_back(this->blob_bottom_2_); this->blob_top_vec_.push_back(this->blob_top_2_); @@ -219,7 +218,6 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) { } TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) { - // We will simply see if the convolution layer carries out averaging well. typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; ConvolutionParameter* convolution_param = @@ -462,7 +460,6 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSetupCuDNN) { } TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionCuDNN) { - // We will simply see if the convolution layer carries out averaging well. Caffe::set_mode(Caffe::GPU); this->blob_bottom_vec_.push_back(this->blob_bottom_2_); this->blob_top_vec_.push_back(this->blob_top_2_); @@ -499,7 +496,6 @@ TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionCuDNN) { } TYPED_TEST(CuDNNConvolutionLayerTest, TestSimpleConvolutionGroupCuDNN) { - // We will simply see if the convolution layer carries out averaging well. Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; ConvolutionParameter* convolution_param = From 8109a6e56ed18e1f40b48e494a30e290019eefb4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 19 Sep 2014 18:59:38 -0700 Subject: [PATCH 0795/2053] optimize 1x1 convolution for Network-in-Network style layers 1x1 convolution with stride 1 is a special case of Caffe matrix multiplication convolution for which im2col / col2im transformations are actually the identity. For this special case the memory and transformation are skipped. --- include/caffe/vision_layers.hpp | 1 + src/caffe/layers/conv_layer.cpp | 46 +++++++++++++++++------ src/caffe/layers/conv_layer.cu | 42 +++++++++++++++------ src/caffe/test/test_convolution_layer.cpp | 45 ++++++++++++++++++++++ 4 files changed, 110 insertions(+), 24 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 0f1b2d9e529..fa516144d25 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -97,6 +97,7 @@ class ConvolutionLayer : public Layer<Dtype> { int num_output_; int height_out_, width_out_; bool bias_term_; + bool is_1x1_; /// M_ is the channel dimension of the output for a single group, which is the /// leading dimension of the filter matrix. diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 8c08c100bd5..d33aa05e961 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -47,6 +47,10 @@ void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, stride_h_ = conv_param.stride_h(); stride_w_ = conv_param.stride_w(); } + // Special case: im2col is the identity for 1x1 convolution with stride 1 + // and no padding, so flag for skipping the buffer and transformation. + is_1x1_ = kernel_w_ == 1 && kernel_h_ == 1 + && stride_h_ == 1 && stride_w_ == 1 && pad_h_ == 0 && pad_w_ == 0; // Configure output channels and groups. channels_ = bottom[0]->channels(); num_output_ = this->layer_param_.convolution_param().num_output(); @@ -137,7 +141,10 @@ void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->cpu_data(); Dtype* top_data = top[i]->mutable_cpu_data(); - Dtype* col_data = col_buffer_.mutable_cpu_data(); + Dtype* col_data = NULL; + if (!is_1x1_) { + col_data = col_buffer_.mutable_cpu_data(); + } const Dtype* weight = this->blobs_[0]->cpu_data(); int weight_offset = M_ * K_; // number of filter parameters in a group int col_offset = K_ * N_; // number of values in an input region / column @@ -145,9 +152,13 @@ void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, for (int n = 0; n < num_; ++n) { // im2col transformation: unroll input regions for filtering // into column matrix for multplication. - im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - col_data); + if (!is_1x1_) { + im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, + col_data); + } else { // special case for 1x1 convolution + col_data = bottom[i]->mutable_cpu_data() + bottom[i]->offset(n); + } // Take inner products for groups. for (int g = 0; g < group_; ++g) { caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, @@ -199,16 +210,25 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, if (!top_diff) { top_diff = top[i]->cpu_diff(); } - Dtype* col_data = col_buffer_.mutable_cpu_data(); - Dtype* col_diff = col_buffer_.mutable_cpu_diff(); + Dtype* col_data = NULL; + Dtype* col_diff = NULL; + if (!is_1x1_) { + col_data = col_buffer_.mutable_cpu_data(); + col_diff = col_buffer_.mutable_cpu_diff(); + } const Dtype* bottom_data = bottom[i]->cpu_data(); Dtype* bottom_diff = bottom[i]->mutable_cpu_diff(); for (int n = 0; n < num_; ++n) { // Since we saved memory in the forward pass by not storing all col // data, we will need to recompute them. - im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, col_data); + if (!is_1x1_) { + im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, col_data); + } else { + col_data = bottom[i]->mutable_cpu_data() + bottom[i]->offset(n); + col_diff = bottom[i]->mutable_cpu_diff() + bottom[i]->offset(n); + } // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { for (int g = 0; g < group_; ++g) { @@ -230,9 +250,11 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, (Dtype)0., col_diff + col_offset * g); } // col2im back to the data - col2im_cpu(col_diff, channels_, height_, width_, - kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, bottom_diff + bottom[i]->offset(n)); + if (!is_1x1_) { + col2im_cpu(col_diff, channels_, height_, width_, + kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, bottom_diff + bottom[i]->offset(n)); + } } } } diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 908f5a65855..885d90a47d3 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -15,7 +15,10 @@ void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); Dtype* top_data = top[i]->mutable_gpu_data(); - Dtype* col_data = col_buffer_.mutable_gpu_data(); + Dtype* col_data = NULL; + if (!is_1x1_) { + col_data = col_buffer_.mutable_gpu_data(); + } const Dtype* weight = this->blobs_[0]->gpu_data(); int weight_offset = M_ * K_; int col_offset = K_ * N_; @@ -23,9 +26,13 @@ void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, for (int n = 0; n < num_; ++n) { // im2col transformation: unroll input regions for filtering // into column matrix for multplication. - im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - col_data); + if (!is_1x1_) { + im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, + col_data); + } else { + col_data = bottom[i]->mutable_gpu_data() + bottom[i]->offset(n); + } // Take inner products for groups. for (int g = 0; g < group_; ++g) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, @@ -78,16 +85,25 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, if (!top_diff) { top_diff = top[i]->gpu_diff(); } - Dtype* col_data = col_buffer_.mutable_gpu_data(); - Dtype* col_diff = col_buffer_.mutable_gpu_diff(); + Dtype* col_data = NULL; + Dtype* col_diff = NULL; + if (!is_1x1_) { + col_data = col_buffer_.mutable_gpu_data(); + col_diff = col_buffer_.mutable_gpu_diff(); + } const Dtype* bottom_data = bottom[i]->gpu_data(); Dtype* bottom_diff = bottom[i]->mutable_gpu_diff(); for (int n = 0; n < num_; ++n) { // Since we saved memory in the forward pass by not storing all col // data, we will need to recompute them. - im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, col_data); + if (!is_1x1_) { + im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, + width_, kernel_h_, kernel_w_, pad_h_, pad_w_, + stride_h_, stride_w_, col_data); + } else { + col_data = bottom[i]->mutable_gpu_data() + bottom[i]->offset(n); + col_diff = bottom[i]->mutable_gpu_diff() + bottom[i]->offset(n); + } // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { for (int g = 0; g < group_; ++g) { @@ -109,9 +125,11 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, (Dtype)0., col_diff + col_offset * g); } // col2im back to the data - col2im_gpu(col_diff, channels_, height_, width_, - kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - bottom_diff + bottom[i]->offset(n)); + if (!is_1x1_) { + col2im_gpu(col_diff, channels_, height_, width_, + kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, + bottom_diff + bottom[i]->offset(n)); + } } } } diff --git a/src/caffe/test/test_convolution_layer.cpp b/src/caffe/test/test_convolution_layer.cpp index c2e0a86271a..c1fe3b58c58 100644 --- a/src/caffe/test/test_convolution_layer.cpp +++ b/src/caffe/test/test_convolution_layer.cpp @@ -217,6 +217,33 @@ TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolution) { } } +TYPED_TEST(ConvolutionLayerTest, Test1x1Convolution) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_size(1); + convolution_param->set_stride(1); + convolution_param->set_num_output(4); + convolution_param->mutable_weight_filler()->set_type("gaussian"); + convolution_param->mutable_bias_filler()->set_type("constant"); + convolution_param->mutable_bias_filler()->set_value(0.1); + shared_ptr<Layer<Dtype> > layer( + new ConvolutionLayer<Dtype>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); + // Check against reference convolution. + const Dtype* top_data; + const Dtype* ref_top_data; + caffe_conv(this->blob_bottom_, convolution_param, layer->blobs(), + this->MakeReferenceTop(this->blob_top_)); + top_data = this->blob_top_->cpu_data(); + ref_top_data = this->ref_blob_top_->cpu_data(); + for (int i = 0; i < this->blob_top_->count(); ++i) { + EXPECT_NEAR(top_data[i], ref_top_data[i], 1e-4); + } +} + TYPED_TEST(ConvolutionLayerTest, TestSimpleConvolutionGroup) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; @@ -359,6 +386,24 @@ TYPED_TEST(ConvolutionLayerTest, TestGradient) { this->blob_top_vec_); } +TYPED_TEST(ConvolutionLayerTest, Test1x1Gradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); + convolution_param->set_kernel_size(1); + convolution_param->set_stride(1); + convolution_param->set_num_output(2); + convolution_param->mutable_weight_filler()->set_type("gaussian"); + convolution_param->mutable_bias_filler()->set_type("gaussian"); + ConvolutionLayer<Dtype> layer(layer_param); + GradientChecker<Dtype> checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); +} + TYPED_TEST(ConvolutionLayerTest, TestGradientGroup) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; From e8ba4c83902196c44f1390f77cbe9c5fc74b711d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 19 Sep 2014 23:12:12 -0700 Subject: [PATCH 0796/2053] combine col_{data,diff} into single col_buff to halve memory usage conv forward / backward only need one of the im2col data and diff at-a-time so consolidating the two saves a lazy allocation. --- src/caffe/layers/conv_layer.cpp | 33 +++++++++++++++++---------------- src/caffe/layers/conv_layer.cu | 30 +++++++++++++++--------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index d33aa05e961..e6d6588096b 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -122,7 +122,8 @@ void ConvolutionLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, K_ = channels_ * kernel_h_ * kernel_w_ / group_; N_ = height_out_ * width_out_; // The im2col result buffer will only hold one image at a time to avoid - // overly large memory usage. + // overly large memory usage. In the special case of 1x1 convolution + // it goes lazily unused to save memory. col_buffer_.Reshape( 1, channels_ * kernel_h_ * kernel_w_, height_out_, width_out_); for (int top_id = 0; top_id < top.size(); ++top_id) { @@ -141,9 +142,9 @@ void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->cpu_data(); Dtype* top_data = top[i]->mutable_cpu_data(); - Dtype* col_data = NULL; + Dtype* col_buff = NULL; if (!is_1x1_) { - col_data = col_buffer_.mutable_cpu_data(); + col_buff = col_buffer_.mutable_cpu_data(); } const Dtype* weight = this->blobs_[0]->cpu_data(); int weight_offset = M_ * K_; // number of filter parameters in a group @@ -155,14 +156,14 @@ void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, if (!is_1x1_) { im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - col_data); + col_buff); } else { // special case for 1x1 convolution - col_data = bottom[i]->mutable_cpu_data() + bottom[i]->offset(n); + col_buff = bottom[i]->mutable_cpu_data() + bottom[i]->offset(n); } // Take inner products for groups. for (int g = 0; g < group_; ++g) { caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, - (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, + (Dtype)1., weight + weight_offset * g, col_buff + col_offset * g, (Dtype)0., top_data + top[i]->offset(n) + top_offset * g); } // Add bias. @@ -210,11 +211,9 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, if (!top_diff) { top_diff = top[i]->cpu_diff(); } - Dtype* col_data = NULL; - Dtype* col_diff = NULL; + Dtype* col_buff = NULL; if (!is_1x1_) { - col_data = col_buffer_.mutable_cpu_data(); - col_diff = col_buffer_.mutable_cpu_diff(); + col_buff = col_buffer_.mutable_cpu_data(); } const Dtype* bottom_data = bottom[i]->cpu_data(); Dtype* bottom_diff = bottom[i]->mutable_cpu_diff(); @@ -224,17 +223,16 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, if (!is_1x1_) { im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, col_data); + stride_h_, stride_w_, col_buff); } else { - col_data = bottom[i]->mutable_cpu_data() + bottom[i]->offset(n); - col_diff = bottom[i]->mutable_cpu_diff() + bottom[i]->offset(n); + col_buff = bottom[i]->mutable_cpu_data() + bottom[i]->offset(n); } // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { for (int g = 0; g < group_; ++g) { caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, K_, N_, (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, - col_data + col_offset * g, (Dtype)1., + col_buff + col_offset * g, (Dtype)1., weight_diff + weight_offset * g); } } @@ -243,15 +241,18 @@ void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, if (weight == NULL) { weight = this->blobs_[0]->cpu_data(); } + if (is_1x1_) { + col_buff = bottom[i]->mutable_cpu_diff() + bottom[i]->offset(n); + } for (int g = 0; g < group_; ++g) { caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, (Dtype)1., weight + weight_offset * g, top_diff + top[i]->offset(n) + top_offset * g, - (Dtype)0., col_diff + col_offset * g); + (Dtype)0., col_buff + col_offset * g); } // col2im back to the data if (!is_1x1_) { - col2im_cpu(col_diff, channels_, height_, width_, + col2im_cpu(col_buff, channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, bottom_diff + bottom[i]->offset(n)); } diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 885d90a47d3..27d6500d6ef 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -15,9 +15,9 @@ void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); Dtype* top_data = top[i]->mutable_gpu_data(); - Dtype* col_data = NULL; + Dtype* col_buff = NULL; if (!is_1x1_) { - col_data = col_buffer_.mutable_gpu_data(); + col_buff = col_buffer_.mutable_gpu_data(); } const Dtype* weight = this->blobs_[0]->gpu_data(); int weight_offset = M_ * K_; @@ -29,14 +29,14 @@ void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, if (!is_1x1_) { im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - col_data); + col_buff); } else { - col_data = bottom[i]->mutable_gpu_data() + bottom[i]->offset(n); + col_buff = bottom[i]->mutable_gpu_data() + bottom[i]->offset(n); } // Take inner products for groups. for (int g = 0; g < group_; ++g) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, - (Dtype)1., weight + weight_offset * g, col_data + col_offset * g, + (Dtype)1., weight + weight_offset * g, col_buff + col_offset * g, (Dtype)0., top_data + top[i]->offset(n) + top_offset * g); } // Add bias. @@ -85,11 +85,9 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, if (!top_diff) { top_diff = top[i]->gpu_diff(); } - Dtype* col_data = NULL; - Dtype* col_diff = NULL; + Dtype* col_buff = NULL; if (!is_1x1_) { - col_data = col_buffer_.mutable_gpu_data(); - col_diff = col_buffer_.mutable_gpu_diff(); + col_buff = col_buffer_.mutable_gpu_data(); } const Dtype* bottom_data = bottom[i]->gpu_data(); Dtype* bottom_diff = bottom[i]->mutable_gpu_diff(); @@ -99,17 +97,16 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, if (!is_1x1_) { im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, col_data); + stride_h_, stride_w_, col_buff); } else { - col_data = bottom[i]->mutable_gpu_data() + bottom[i]->offset(n); - col_diff = bottom[i]->mutable_gpu_diff() + bottom[i]->offset(n); + col_buff = bottom[i]->mutable_gpu_data() + bottom[i]->offset(n); } // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { for (int g = 0; g < group_; ++g) { caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, K_, N_, (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, - col_data + col_offset * g, (Dtype)1., + col_buff + col_offset * g, (Dtype)1., weight_diff + weight_offset * g); } } @@ -118,15 +115,18 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, if (weight == NULL) { weight = this->blobs_[0]->gpu_data(); } + if (is_1x1_) { + col_buff = bottom[i]->mutable_gpu_diff() + bottom[i]->offset(n); + } for (int g = 0; g < group_; ++g) { caffe_gpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, (Dtype)1., weight + weight_offset * g, top_diff + top[i]->offset(n) + top_offset * g, - (Dtype)0., col_diff + col_offset * g); + (Dtype)0., col_buff + col_offset * g); } // col2im back to the data if (!is_1x1_) { - col2im_gpu(col_diff, channels_, height_, width_, + col2im_gpu(col_buff, channels_, height_, width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, bottom_diff + bottom[i]->offset(n)); } From d3126f2f061c7a36461e58df8eed550877a1ecc4 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sun, 21 Sep 2014 09:52:51 -0700 Subject: [PATCH 0797/2053] include WindowDataLayer in data param upgrade --- src/caffe/util/upgrade_proto.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index c3d854c0595..c69c58eb340 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -522,6 +522,13 @@ bool NetNeedsDataUpgrade(const NetParameter& net_param) { if (layer_param.has_crop_size()) { return true; } if (layer_param.has_mirror()) { return true; } } + if (net_param.layers(i).type() == LayerParameter_LayerType_WINDOW_DATA) { + WindowDataParameter layer_param = net_param.layers(i).window_data_param(); + if (layer_param.has_scale()) { return true; } + if (layer_param.has_mean_file()) { return true; } + if (layer_param.has_crop_size()) { return true; } + if (layer_param.has_mirror()) { return true; } + } } return false; } @@ -556,6 +563,7 @@ void UpgradeNetDataTransformation(NetParameter* net_param) { for (int i = 0; i < net_param->layers_size(); ++i) { CONVERT_LAYER_TRANSFORM_PARAM(DATA, Data, data); CONVERT_LAYER_TRANSFORM_PARAM(IMAGE_DATA, ImageData, image_data); + CONVERT_LAYER_TRANSFORM_PARAM(WINDOW_DATA, WindowData, window_data); } } From 6435b7e103e4bfe9fb683bb81390ed40fa85a418 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sun, 21 Sep 2014 10:29:39 -0700 Subject: [PATCH 0798/2053] load transform params in window data layer --- src/caffe/layers/window_data_layer.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index a24d7de3daa..afb430468cc 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -55,8 +55,8 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, << this->layer_param_.window_data_param().fg_fraction(); const bool prefetch_needs_rand = - this->layer_param_.window_data_param().mirror() || - this->layer_param_.window_data_param().crop_size(); + this->transform_param_.mirror() || + this->transform_param_.crop_size(); if (prefetch_needs_rand) { const unsigned int prefetch_rng_seed = caffe_rng_rand(); prefetch_rng_.reset(new Caffe::RNG(prefetch_rng_seed)); @@ -149,7 +149,7 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, << this->layer_param_.window_data_param().crop_mode(); // image - int crop_size = this->layer_param_.window_data_param().crop_size(); + const int crop_size = this->transform_param_.crop_size(); CHECK_GT(crop_size, 0); const int batch_size = this->layer_param_.window_data_param().batch_size(); (*top)[0]->Reshape(batch_size, channels, crop_size, crop_size); @@ -187,9 +187,9 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); const Dtype scale = this->layer_param_.window_data_param().scale(); const int batch_size = this->layer_param_.window_data_param().batch_size(); - const int crop_size = this->layer_param_.window_data_param().crop_size(); const int context_pad = this->layer_param_.window_data_param().context_pad(); - const bool mirror = this->layer_param_.window_data_param().mirror(); + const int crop_size = this->transform_param_.crop_size(); + const bool mirror = this->transform_param_.mirror(); const float fg_fraction = this->layer_param_.window_data_param().fg_fraction(); const Dtype* mean = this->data_mean_.cpu_data(); From 28800ef7789a5bdbb5cd7ee38a38c7b233ef5961 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sun, 21 Sep 2014 11:38:20 -0700 Subject: [PATCH 0799/2053] define up-to-date all-in-one model for pascal finetuning --- .../pascal_finetune_solver.prototxt | 3 +- .../pascal_finetune_train.prototxt | 321 ------------------ ...=> pascal_finetune_trainval_test.prototxt} | 43 ++- 3 files changed, 34 insertions(+), 333 deletions(-) delete mode 100644 examples/finetune_pascal_detection/pascal_finetune_train.prototxt rename examples/finetune_pascal_detection/{pascal_finetune_val.prototxt => pascal_finetune_trainval_test.prototxt} (89%) diff --git a/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt b/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt index 83f5abdf891..829b2005921 100644 --- a/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt +++ b/examples/finetune_pascal_detection/pascal_finetune_solver.prototxt @@ -1,5 +1,4 @@ -train_net: "examples/finetune_pascal_detection/pascal_finetune_train.prototxt" -test_net: "examples/finetune_pascal_detection/pascal_finetune_val.prototxt" +net: "examples/finetune_pascal_detection/pascal_finetune_trainval_test.prototxt" test_iter: 100 test_interval: 1000 base_lr: 0.001 diff --git a/examples/finetune_pascal_detection/pascal_finetune_train.prototxt b/examples/finetune_pascal_detection/pascal_finetune_train.prototxt deleted file mode 100644 index ae7ee4ccf88..00000000000 --- a/examples/finetune_pascal_detection/pascal_finetune_train.prototxt +++ /dev/null @@ -1,321 +0,0 @@ -name: "CaffeNet" -layers { - name: "data" - type: WINDOW_DATA - top: "data" - top: "label" - window_data_param { - source: "examples/finetune_pascal_detection/window_file_2007_trainval.txt" - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - batch_size: 128 - crop_size: 227 - mirror: true - fg_threshold: 0.5 - bg_threshold: 0.5 - fg_fraction: 0.25 - context_pad: 16 - crop_mode: "warp" - } -} -layers { - name: "conv1" - type: CONVOLUTION - bottom: "data" - top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - convolution_param { - num_output: 96 - kernel_size: 11 - stride: 4 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 0 - } - } -} -layers { - name: "relu1" - type: RELU - bottom: "conv1" - top: "conv1" -} -layers { - name: "pool1" - type: POOLING - bottom: "conv1" - top: "pool1" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "norm1" - type: LRN - bottom: "pool1" - top: "norm1" - lrn_param { - local_size: 5 - alpha: 0.0001 - beta: 0.75 - } -} -layers { - name: "conv2" - type: CONVOLUTION - bottom: "norm1" - top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - convolution_param { - num_output: 256 - pad: 2 - kernel_size: 5 - group: 2 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 1 - } - } -} -layers { - name: "relu2" - type: RELU - bottom: "conv2" - top: "conv2" -} -layers { - name: "pool2" - type: POOLING - bottom: "conv2" - top: "pool2" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "norm2" - type: LRN - bottom: "pool2" - top: "norm2" - lrn_param { - local_size: 5 - alpha: 0.0001 - beta: 0.75 - } -} -layers { - name: "conv3" - type: CONVOLUTION - bottom: "norm2" - top: "conv3" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - convolution_param { - num_output: 384 - pad: 1 - kernel_size: 3 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 0 - } - } -} -layers { - name: "relu3" - type: RELU - bottom: "conv3" - top: "conv3" -} -layers { - name: "conv4" - type: CONVOLUTION - bottom: "conv3" - top: "conv4" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - convolution_param { - num_output: 384 - pad: 1 - kernel_size: 3 - group: 2 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 1 - } - } -} -layers { - name: "relu4" - type: RELU - bottom: "conv4" - top: "conv4" -} -layers { - name: "conv5" - type: CONVOLUTION - bottom: "conv4" - top: "conv5" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - convolution_param { - num_output: 256 - pad: 1 - kernel_size: 3 - group: 2 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 1 - } - } -} -layers { - name: "relu5" - type: RELU - bottom: "conv5" - top: "conv5" -} -layers { - name: "pool5" - type: POOLING - bottom: "conv5" - top: "pool5" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "fc6" - type: INNER_PRODUCT - bottom: "pool5" - top: "fc6" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - inner_product_param { - num_output: 4096 - weight_filler { - type: "gaussian" - std: 0.005 - } - bias_filler { - type: "constant" - value: 1 - } - } -} -layers { - name: "relu6" - type: RELU - bottom: "fc6" - top: "fc6" -} -layers { - name: "drop6" - type: DROPOUT - bottom: "fc6" - top: "fc6" - dropout_param { - dropout_ratio: 0.5 - } -} -layers { - name: "fc7" - type: INNER_PRODUCT - bottom: "fc6" - top: "fc7" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - inner_product_param { - num_output: 4096 - weight_filler { - type: "gaussian" - std: 0.005 - } - bias_filler { - type: "constant" - value: 1 - } - } -} -layers { - name: "relu7" - type: RELU - bottom: "fc7" - top: "fc7" -} -layers { - name: "drop7" - type: DROPOUT - bottom: "fc7" - top: "fc7" - dropout_param { - dropout_ratio: 0.5 - } -} -layers { - name: "fc8_pascal" - type: INNER_PRODUCT - bottom: "fc7" - top: "fc8_pascal" - blobs_lr: 10 - blobs_lr: 20 - weight_decay: 1 - weight_decay: 0 - inner_product_param { - num_output: 21 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 0 - } - } -} -layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "fc8_pascal" - bottom: "label" -} diff --git a/examples/finetune_pascal_detection/pascal_finetune_val.prototxt b/examples/finetune_pascal_detection/pascal_finetune_trainval_test.prototxt similarity index 89% rename from examples/finetune_pascal_detection/pascal_finetune_val.prototxt rename to examples/finetune_pascal_detection/pascal_finetune_trainval_test.prototxt index 30dd164c4fa..5cd605bbf11 100644 --- a/examples/finetune_pascal_detection/pascal_finetune_val.prototxt +++ b/examples/finetune_pascal_detection/pascal_finetune_trainval_test.prototxt @@ -5,17 +5,41 @@ layers { top: "data" top: "label" window_data_param { - source: "examples/finetune_pascal_detection/window_file_2007_test.txt" - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + source: "examples/finetune_pascal_detection/window_file_2007_trainval.txt" batch_size: 128 - crop_size: 227 + fg_threshold: 0.5 + bg_threshold: 0.5 + fg_fraction: 0.25 + context_pad: 16 + crop_mode: "warp" + } + transform_param { mirror: true + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + } + include: { phase: TRAIN } +} +layers { + name: "data" + type: WINDOW_DATA + top: "data" + top: "label" + window_data_param { + source: "examples/finetune_pascal_detection/window_file_2007_test.txt" + batch_size: 128 fg_threshold: 0.5 bg_threshold: 0.5 fg_fraction: 0.25 context_pad: 16 crop_mode: "warp" } + transform_param { + mirror: true + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + } + include: { phase: TEST } } layers { name: "conv1" @@ -314,17 +338,16 @@ layers { } } layers { - name: "accuracy" - type: ACCURACY + name: "loss" + type: SOFTMAX_LOSS bottom: "fc8_pascal" bottom: "label" - top: "accuracy" } layers { - name: "prob" - type: SOFTMAX_LOSS + name: "accuracy" + type: ACCURACY bottom: "fc8_pascal" bottom: "label" - top: "loss" + top: "accuracy" + include { phase: TEST } } - From a6693464787b63d805f077961cb39eb96698807f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sun, 21 Sep 2014 15:20:47 -0700 Subject: [PATCH 0800/2053] default backend to lmdb for image conversion and mean computation lmdb is 10-15% faster than leveldb although it takes ~1.1x the storage. This is usually irrelevant in prefetching since both are fast enough, but more important lmdb allows multiple, concurrent reads for training and evaluation several models on the same data. --- tools/compute_image_mean.cpp | 4 ++-- tools/convert_imageset.cpp | 15 +++++---------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index fe3497fa87d..20f1ff81f1c 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -17,12 +17,12 @@ using std::max; int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); if (argc < 3 || argc > 4) { - LOG(ERROR) << "Usage: compute_image_mean input_leveldb output_file" + LOG(ERROR) << "Usage: compute_image_mean input_db output_file" << " db_backend[leveldb or lmdb]"; return 1; } - string db_backend = "leveldb"; + string db_backend = "lmdb"; if (argc == 4) { db_backend = string(argv[3]); } diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 1c58f3de33f..7e1e83d9d0c 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -1,17 +1,12 @@ -// This program converts a set of images to a leveldb by storing them as Datum -// proto buffers. +// This program converts a set of images to a lmdb/leveldb by storing them +// as Datum proto buffers. // Usage: -// convert_imageset [-g] ROOTFOLDER/ LISTFILE DB_NAME RANDOM_SHUFFLE[0 or 1] -// [resize_height] [resize_width] +// convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME +// // where ROOTFOLDER is the root folder that holds all the images, and LISTFILE // should be a list of files as well as their labels, in the format as // subfolder1/file1.JPEG 7 // .... -// if RANDOM_SHUFFLE is 1, a random shuffle will be carried out before we -// process the file lines. -// Optional flag -g indicates the images should be read as -// single-channel grayscale. If omitted, grayscale images will be -// converted to color. #include <gflags/gflags.h> #include <glog/logging.h> @@ -38,7 +33,7 @@ DEFINE_bool(gray, false, "When this option is on, treat images as grayscale ones"); DEFINE_bool(shuffle, false, "Randomly shuffle the order of images and their labels"); -DEFINE_string(backend, "leveldb", "The backend for storing the result"); +DEFINE_string(backend, "lmdb", "The backend for storing the result"); DEFINE_int32(resize_width, 0, "Width images are resized to"); DEFINE_int32(resize_height, 0, "Height images are resized to"); From 315ce1d706e6bb7e891862c0ac16087c46a1e406 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Fri, 19 Sep 2014 12:38:39 -0700 Subject: [PATCH 0801/2053] fix cifar10 paths so they can be run from caffe root --- examples/cifar10/train_full.sh | 13 +++++++------ examples/cifar10/train_quick.sh | 13 +++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/examples/cifar10/train_full.sh b/examples/cifar10/train_full.sh index 9dd9ad79822..4285a5d6468 100755 --- a/examples/cifar10/train_full.sh +++ b/examples/cifar10/train_full.sh @@ -1,15 +1,16 @@ #!/usr/bin/env sh -TOOLS=../../build/tools +TOOLS=./build/tools -$TOOLS/caffe train --solver=cifar10_full_solver.prototxt +$TOOLS/caffe train \ + --solver=examples/cifar10/cifar10_full_solver.prototxt # reduce learning rate by factor of 10 $TOOLS/caffe train \ - --solver=cifar10_full_solver_lr1.prototxt \ - --snapshot=cifar10_full_iter_60000.solverstate + --solver=examples/cifar10/cifar10_full_solver_lr1.prototxt \ + --snapshot=examples/cifar10/cifar10_full_iter_60000.solverstate # reduce learning rate by factor of 10 $TOOLS/caffe train \ - --solver=cifar10_full_solver_lr2.prototxt \ - --snapshot=cifar10_full_iter_65000.solverstate + --solver=examples/cifar10/cifar10_full_solver_lr2.prototxt \ + --snapshot=examples/cifar10/cifar10_full_iter_65000.solverstate diff --git a/examples/cifar10/train_quick.sh b/examples/cifar10/train_quick.sh index e348e12fd94..2830c40945c 100755 --- a/examples/cifar10/train_quick.sh +++ b/examples/cifar10/train_quick.sh @@ -1,10 +1,11 @@ #!/usr/bin/env sh -TOOLS=../../build/tools +TOOLS=./build/tools -$TOOLS/caffe.bin train --solver=cifar10_quick_solver.prototxt +$TOOLS/caffe train \ + --solver=examples/cifar10/cifar10_quick_solver.prototxt -# reduce learning rate by fctor of 10 after 8 epochs -$TOOLS/caffe.bin train \ - --solver=cifar10_quick_solver_lr1.prototxt \ - --snapshot=cifar10_quick_iter_4000.solverstate +# reduce learning rate by factor of 10 after 8 epochs +$TOOLS/caffe train \ + --solver=examples/cifar10/cifar10_quick_solver_lr1.prototxt \ + --snapshot=examples/cifar10/cifar10_quick_iter_4000.solverstate From 73f1de4b9c6b21b894639f75fb4438fa2e61a052 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sun, 21 Sep 2014 15:32:03 -0700 Subject: [PATCH 0802/2053] switch examples to lmdb (except for custom data loaders) --- examples/cifar10/create_cifar10.sh | 2 +- examples/imagenet/create_imagenet.sh | 10 +++++----- examples/mnist/convert_mnist_data.cpp | 7 +++---- examples/mnist/create_mnist.sh | 2 +- examples/mnist/readme.md | 9 +++++---- models/bvlc_alexnet/train_val.prototxt | 6 ++++-- models/bvlc_reference_caffenet/train_val.prototxt | 6 ++++-- 7 files changed, 23 insertions(+), 19 deletions(-) diff --git a/examples/cifar10/create_cifar10.sh b/examples/cifar10/create_cifar10.sh index ad5038e0c3e..dfba7cca48a 100755 --- a/examples/cifar10/create_cifar10.sh +++ b/examples/cifar10/create_cifar10.sh @@ -13,6 +13,6 @@ rm -rf $EXAMPLE/cifar10_train_leveldb $EXAMPLE/cifar10_test_leveldb echo "Computing image mean..." ./build/tools/compute_image_mean $EXAMPLE/cifar10_train_leveldb \ - $EXAMPLE/mean.binaryproto + $EXAMPLE/mean.binaryproto leveldb echo "Done." diff --git a/examples/imagenet/create_imagenet.sh b/examples/imagenet/create_imagenet.sh index a286b8fe74c..e912ac43cd7 100755 --- a/examples/imagenet/create_imagenet.sh +++ b/examples/imagenet/create_imagenet.sh @@ -1,5 +1,5 @@ #!/usr/bin/env sh -# Create the imagenet leveldb inputs +# Create the imagenet lmdb inputs # N.B. set the path to the imagenet train + val data dirs EXAMPLE=examples/imagenet @@ -34,7 +34,7 @@ if [ ! -d "$VAL_DATA_ROOT" ]; then exit 1 fi -echo "Creating train leveldb..." +echo "Creating train lmdb..." GLOG_logtostderr=1 $TOOLS/convert_imageset \ --resize_height=$RESIZE_HEIGHT \ @@ -42,9 +42,9 @@ GLOG_logtostderr=1 $TOOLS/convert_imageset \ --shuffle \ $TRAIN_DATA_ROOT \ $DATA/train.txt \ - $EXAMPLE/ilsvrc12_train_leveldb + $EXAMPLE/ilsvrc12_train_lmdb -echo "Creating val leveldb..." +echo "Creating val lmdb..." GLOG_logtostderr=1 $TOOLS/convert_imageset \ --resize_height=$RESIZE_HEIGHT \ @@ -52,6 +52,6 @@ GLOG_logtostderr=1 $TOOLS/convert_imageset \ --shuffle \ $VAL_DATA_ROOT \ $DATA/val.txt \ - $EXAMPLE/ilsvrc12_val_leveldb + $EXAMPLE/ilsvrc12_val_lmdb echo "Done." diff --git a/examples/mnist/convert_mnist_data.cpp b/examples/mnist/convert_mnist_data.cpp index 19040153c86..2749e4521b6 100644 --- a/examples/mnist/convert_mnist_data.cpp +++ b/examples/mnist/convert_mnist_data.cpp @@ -1,6 +1,5 @@ -// -// This script converts the MNIST dataset to the leveldb format used -// by caffe to perform classification. +// This script converts the MNIST dataset to a lmdb (default) or +// leveldb (--backend=leveldb) format used by caffe to load data. // Usage: // convert_mnist_data [FLAGS] input_image_file input_label_file // output_db_file @@ -176,7 +175,7 @@ int main(int argc, char** argv) { #endif gflags::SetUsageMessage("This script converts the MNIST dataset to\n" - "the leveldb/lmdb format used by Caffe to perform classification.\n" + "the lmdb/leveldb format used by Caffe to load data.\n" "Usage:\n" " convert_mnist_data [FLAGS] input_image_file input_label_file " "output_db_file\n" diff --git a/examples/mnist/create_mnist.sh b/examples/mnist/create_mnist.sh index 8c43dc3391f..06ecc27de63 100755 --- a/examples/mnist/create_mnist.sh +++ b/examples/mnist/create_mnist.sh @@ -1,5 +1,5 @@ #!/usr/bin/env sh -# This script converts the mnist data into leveldb/lmdb format, +# This script converts the mnist data into lmdb/leveldb format, # depending on the value assigned to $BACKEND. EXAMPLE=examples/mnist diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index ac1a0b7d7ea..44e0091f420 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -19,7 +19,7 @@ You will first need to download and convert the data format from the MNIST websi cd $CAFFE_ROOT/examples/mnist ./create_mnist.sh -If it complains that `wget` or `gunzip` are not installed, you need to install them respectively. After running the script there should be two datasets, `mnist-train-leveldb`, and `mnist-test-leveldb`. +If it complains that `wget` or `gunzip` are not installed, you need to install them respectively. After running the script there should be two datasets, `mnist_train_lmdb`, and `mnist_test_lmdb`. ## LeNet: the MNIST Classification Model @@ -37,13 +37,14 @@ Specifically, we will write a `caffe::NetParameter` (or in python, `caffe.proto. ### Writing the Data Layer -Currently, we will read the MNIST data from the leveldb we created earlier in the demo. This is defined by a data layer: +Currently, we will read the MNIST data from the lmdb we created earlier in the demo. This is defined by a data layer: layers { name: "mnist" type: DATA data_param { - source: "mnist-train-leveldb" + source: "mnist_train_lmdb" + backend: LMDB batch_size: 64 scale: 0.00390625 } @@ -51,7 +52,7 @@ Currently, we will read the MNIST data from the leveldb we created earlier in th top: "label" } -Specifically, this layer has name `mnist`, type `data`, and it reads the data from the given leveldb source. We will use a batch size of 64, and scale the incoming pixels so that they are in the range \[0,1\). Why 0.00390625? It is 1 divided by 256. And finally, this layer produces two blobs, one is the `data` blob, and one is the `label` blob. +Specifically, this layer has name `mnist`, type `data`, and it reads the data from the given lmdb source. We will use a batch size of 64, and scale the incoming pixels so that they are in the range \[0,1\). Why 0.00390625? It is 1 divided by 256. And finally, this layer produces two blobs, one is the `data` blob, and one is the `label` blob. ### Writing the Convolution Layer diff --git a/models/bvlc_alexnet/train_val.prototxt b/models/bvlc_alexnet/train_val.prototxt index 69b8916d769..717b6fa447c 100644 --- a/models/bvlc_alexnet/train_val.prototxt +++ b/models/bvlc_alexnet/train_val.prototxt @@ -5,7 +5,8 @@ layers { top: "data" top: "label" data_param { - source: "examples/imagenet/ilsvrc12_train_leveldb" + source: "examples/imagenet/ilsvrc12_train_lmdb" + backend: LMDB batch_size: 256 } transform_param { @@ -21,7 +22,8 @@ layers { top: "data" top: "label" data_param { - source: "examples/imagenet/ilsvrc12_val_leveldb" + source: "examples/imagenet/ilsvrc12_val_lmdb" + backend: LMDB batch_size: 50 } transform_param { diff --git a/models/bvlc_reference_caffenet/train_val.prototxt b/models/bvlc_reference_caffenet/train_val.prototxt index d6d64073619..073d8aeff4a 100644 --- a/models/bvlc_reference_caffenet/train_val.prototxt +++ b/models/bvlc_reference_caffenet/train_val.prototxt @@ -5,7 +5,8 @@ layers { top: "data" top: "label" data_param { - source: "examples/imagenet/ilsvrc12_train_leveldb" + source: "examples/imagenet/ilsvrc12_train_lmdb" + backend: LMDB batch_size: 256 } transform_param { @@ -21,7 +22,8 @@ layers { top: "data" top: "label" data_param { - source: "examples/imagenet/ilsvrc12_val_leveldb" + source: "examples/imagenet/ilsvrc12_val_lmdb" + backend: LMDB batch_size: 50 } transform_param { From 2c8d946b67d5024ec56d6abc85ea53ed33df8fa4 Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Sun, 21 Sep 2014 22:53:30 -0700 Subject: [PATCH 0803/2053] web demo fix, closes #1002 --- examples/web_demo/app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/web_demo/app.py b/examples/web_demo/app.py index d33fc92f078..e456526fa55 100644 --- a/examples/web_demo/app.py +++ b/examples/web_demo/app.py @@ -112,7 +112,7 @@ class ImagenetClassifier(object): if not os.path.exists(val): raise Exception( "File for {} is missing. Should be at: {}".format(key, val)) - default_args['image_dim'] = 227 + default_args['image_dim'] = 256 default_args['raw_scale'] = 255. default_args['gpu_mode'] = False From 502141dd43500cd38fd78a4bc1f3262a45d95db7 Mon Sep 17 00:00:00 2001 From: Karen Simonyan <karen@robots.ox.ac.uk> Date: Thu, 18 Sep 2014 01:08:56 +0100 Subject: [PATCH 0804/2053] adds a parameter to the LRN layer (denoted as "k" in [Krizhevsky et al., NIPS 2012]) --- include/caffe/vision_layers.hpp | 1 + src/caffe/layers/lrn_layer.cpp | 3 ++- src/caffe/layers/lrn_layer.cu | 10 +++++----- src/caffe/proto/caffe.proto | 1 + 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index fa516144d25..a3c8bc0a31f 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -246,6 +246,7 @@ class LRNLayer : public Layer<Dtype> { int pre_pad_; Dtype alpha_; Dtype beta_; + Dtype k_; int num_; int channels_; int height_; diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index fb74b03dc88..a09a47940d2 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -14,6 +14,7 @@ void LRNLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, pre_pad_ = (size_ - 1) / 2; alpha_ = this->layer_param_.lrn_param().alpha(); beta_ = this->layer_param_.lrn_param().beta(); + k_ = this->layer_param_.lrn_param().k(); if (this->layer_param_.lrn_param().norm_region() == LRNParameter_NormRegion_WITHIN_CHANNEL) { // Set up split_layer_ to use inputs in the numerator and denominator. @@ -110,7 +111,7 @@ void LRNLayer<Dtype>::CrossChannelForward_cpu( Dtype* scale_data = scale_.mutable_cpu_data(); // start with the constant value for (int i = 0; i < scale_.count(); ++i) { - scale_data[i] = 1.; + scale_data[i] = k_; } Blob<Dtype> padded_square(1, channels_ + size_ - 1, height_, width_); Dtype* padded_square_data = padded_square.mutable_cpu_data(); diff --git a/src/caffe/layers/lrn_layer.cu b/src/caffe/layers/lrn_layer.cu index ee5e359ff0b..47b003bc4aa 100644 --- a/src/caffe/layers/lrn_layer.cu +++ b/src/caffe/layers/lrn_layer.cu @@ -10,7 +10,7 @@ template <typename Dtype> __global__ void LRNFillScale(const int nthreads, const Dtype* in, const int num, const int channels, const int height, const int width, const int size, const Dtype alpha_over_size, - Dtype* scale) { + const Dtype k, Dtype* scale) { CUDA_KERNEL_LOOP(index, nthreads) { // find out the local offset int w = index % width; @@ -33,20 +33,20 @@ __global__ void LRNFillScale(const int nthreads, const Dtype* in, // until we reach size, nothing needs to be subtracted while (head < size) { accum_scale += in[head * step] * in[head * step]; - scale[(head - post_pad) * step] = 1. + accum_scale * alpha_over_size; + scale[(head - post_pad) * step] = k + accum_scale * alpha_over_size; ++head; } // both add and subtract while (head < channels) { accum_scale += in[head * step] * in[head * step]; accum_scale -= in[(head - size) * step] * in[(head - size) * step]; - scale[(head - post_pad) * step] = 1. + accum_scale * alpha_over_size; + scale[(head - post_pad) * step] = k + accum_scale * alpha_over_size; ++head; } // subtract only while (head < channels + post_pad) { accum_scale -= in[(head - size) * step] * in[(head - size) * step]; - scale[(head - post_pad) * step] = 1. + accum_scale * alpha_over_size; + scale[(head - post_pad) * step] = k + accum_scale * alpha_over_size; ++head; } } @@ -90,7 +90,7 @@ void LRNLayer<Dtype>::CrossChannelForward_gpu( // NOLINT_NEXT_LINE(whitespace/operators) LRNFillScale<<<CAFFE_GET_BLOCKS(n_threads), CAFFE_CUDA_NUM_THREADS>>>( n_threads, bottom_data, num_, channels_, height_, width_, size_, - alpha_ / size_, scale_data); + alpha_ / size_, k_, scale_data); CUDA_POST_KERNEL_CHECK; n_threads = bottom[0]->count(); // NOLINT_NEXT_LINE(whitespace/operators) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 9395c38f3e9..b9712fa7414 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -548,6 +548,7 @@ message LRNParameter { WITHIN_CHANNEL = 1; } optional NormRegion norm_region = 4 [default = ACROSS_CHANNELS]; + optional float k = 5 [default = 1.]; } // Message that stores parameters used by MemoryDataLayer From aeb0e984a168030769c107e278d223cae5f8c0ea Mon Sep 17 00:00:00 2001 From: Karen Simonyan <karen@robots.ox.ac.uk> Date: Sun, 21 Sep 2014 17:58:41 +0100 Subject: [PATCH 0805/2053] added support for "k" LRN parameter to upgrade_proto --- src/caffe/proto/caffe.proto | 1 + src/caffe/util/upgrade_proto.cpp | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index b9712fa7414..01a516ee3b9 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -716,6 +716,7 @@ message V0LayerParameter { optional uint32 local_size = 13 [default = 5]; // for local response norm optional float alpha = 14 [default = 1.]; // for local response norm optional float beta = 15 [default = 0.75]; // for local response norm + optional float k = 22 [default = 1.]; // For data layers, specify the data source optional string source = 16; diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index c69c58eb340..cbd6003c948 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -285,6 +285,14 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, is_fully_compatible = false; } } + if (v0_layer_param.has_k()) { + if (type == "lrn") { + layer_param->mutable_lrn_param()->set_k(v0_layer_param.k()); + } else { + LOG(ERROR) << "Unknown parameter k for layer type " << type; + is_fully_compatible = false; + } + } if (v0_layer_param.has_source()) { if (type == "data") { layer_param->mutable_data_param()->set_source(v0_layer_param.source()); From 90584bd86fda189a1b5597bbeb7803dd5546f769 Mon Sep 17 00:00:00 2001 From: Karen Simonyan <karen@robots.ox.ac.uk> Date: Sun, 21 Sep 2014 17:59:25 +0100 Subject: [PATCH 0806/2053] added matcaffe_demo for the VGG models (RGB input) --- matlab/caffe/matcaffe_demo_vgg.m | 109 +++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 matlab/caffe/matcaffe_demo_vgg.m diff --git a/matlab/caffe/matcaffe_demo_vgg.m b/matlab/caffe/matcaffe_demo_vgg.m new file mode 100644 index 00000000000..698c26b9a79 --- /dev/null +++ b/matlab/caffe/matcaffe_demo_vgg.m @@ -0,0 +1,109 @@ +function [scores, maxlabel] = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file) +% scores = matcaffe_demo(im, use_gpu) +% +% Demo of the matlab wrapper using the ILSVRC network. +% +% input +% im color image as uint8 HxWx3 +% use_gpu 1 to use the GPU, 0 to use the CPU +% +% output +% scores 1000-dimensional ILSVRC score vector +% +% You may need to do the following before you start matlab: +% $ export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda-5.5/lib64 +% $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 +% Or the equivalent based on where things are installed on your system +% +% Usage: +% im = imread('../../examples/images/cat.jpg'); +% scores = matcaffe_demo(im, 1); +% [score, class] = max(scores); +% Five things to be aware of: +% caffe uses row-major order +% matlab uses column-major order +% caffe uses BGR color channel order +% matlab uses RGB color channel order +% images need to have the data mean subtracted + +% Data coming in from matlab needs to be in the order +% [width, height, channels, images] +% where width is the fastest dimension. +% Here is the rough matlab for putting image data into the correct +% format: +% % convert from uint8 to single +% im = single(im); +% % reshape to a fixed size (e.g., 227x227) +% im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear'); +% % permute from RGB to BGR and subtract the data mean (already in BGR) +% im = im(:,:,[3 2 1]) - data_mean; +% % flip width and height to make width the fastest dimension +% im = permute(im, [2 1 3]); + +% If you have multiple images, cat them with cat(4, ...) + +% The actual forward function. It takes in a cell array of 4-D arrays as +% input and outputs a cell array. + + +% init caffe network (spews logging info) +matcaffe_init(use_gpu, model_def_file, model_file); + +% prepare oversampled input +% input_data is Height x Width x Channel x Num +tic; +input_data = {prepare_image(im, mean_file)}; +toc; + +% do forward pass to get scores +% scores are now Width x Height x Channels x Num +tic; +scores = caffe('forward', input_data); +toc; + +scores = scores{1}; +% size(scores) +scores = squeeze(scores); +% scores = mean(scores,2); + +% [~,maxlabel] = max(scores); + +% ------------------------------------------------------------------------ +function images = prepare_image(im, mean_file) +% ------------------------------------------------------------------------ +IMAGE_DIM = 256; +CROPPED_DIM = 224; + +d = load(mean_file); +IMAGE_MEAN = d.image_mean; + +% resize to fixed input size +im = single(im); + +if size(im, 1) < size(im, 2) + im = imresize(im, [IMAGE_DIM NaN]); +else + im = imresize(im, [NaN IMAGE_DIM]); +end + +% oversample (4 corners, center, and their x-axis flips) +images = zeros(CROPPED_DIM, CROPPED_DIM, 3, 10, 'single'); + +indices_y = [0 size(im,1)-CROPPED_DIM] + 1; +indices_x = [0 size(im,2)-CROPPED_DIM] + 1; +center_y = floor(indices_y(2) / 2)+1; +center_x = floor(indices_x(2) / 2)+1; + +curr = 1; +for i = indices_y + for j = indices_x + images(:, :, :, curr) = ... + permute(im(i:i+CROPPED_DIM-1, j:j+CROPPED_DIM-1, :)-IMAGE_MEAN, [2 1 3]); + images(:, :, :, curr+5) = images(end:-1:1, :, :, curr); + curr = curr + 1; + end +end +images(:,:,:,5) = ... + permute(im(center_y:center_y+CROPPED_DIM-1,center_x:center_x+CROPPED_DIM-1,:)-IMAGE_MEAN, ... + [2 1 3]); +images(:,:,:,10) = images(end:-1:1, :, :, curr); From 536335939d2b35da7ca76509969eda90d9220278 Mon Sep 17 00:00:00 2001 From: Karen Simonyan <karen@robots.ox.ac.uk> Date: Mon, 22 Sep 2014 20:09:35 +0100 Subject: [PATCH 0807/2053] added comments to the Matlab demo script --- matlab/caffe/matcaffe_demo_vgg.m | 47 ++++++++------------------------ 1 file changed, 12 insertions(+), 35 deletions(-) diff --git a/matlab/caffe/matcaffe_demo_vgg.m b/matlab/caffe/matcaffe_demo_vgg.m index 698c26b9a79..3e25618164a 100644 --- a/matlab/caffe/matcaffe_demo_vgg.m +++ b/matlab/caffe/matcaffe_demo_vgg.m @@ -1,11 +1,15 @@ -function [scores, maxlabel] = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file) -% scores = matcaffe_demo(im, use_gpu) +function scores = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file) +% s = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file) % -% Demo of the matlab wrapper using the ILSVRC network. +% Demo of the matlab wrapper using the VGG networks: https://gist.github.com/ksimonyan/5c9129cfb8f0359eaf67 +% described in the BMVC-2014 paper "Return of the Devil in the Details: Delving Deep into Convolutional Nets" % % input -% im color image as uint8 HxWx3 -% use_gpu 1 to use the GPU, 0 to use the CPU +% im - color image as uint8 HxWx3 +% use_gpu - 1 to use the GPU, 0 to use the CPU +% model_def_file - network configuration (.prototxt file) +% model_file - network weights (.caffemodel file) +% mean_file - mean RGB image as uint8 HxWx3 (.mat file) % % output % scores 1000-dimensional ILSVRC score vector @@ -15,36 +19,9 @@ % $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 % Or the equivalent based on where things are installed on your system % -% Usage: -% im = imread('../../examples/images/cat.jpg'); -% scores = matcaffe_demo(im, 1); -% [score, class] = max(scores); -% Five things to be aware of: -% caffe uses row-major order -% matlab uses column-major order -% caffe uses BGR color channel order -% matlab uses RGB color channel order -% images need to have the data mean subtracted - -% Data coming in from matlab needs to be in the order -% [width, height, channels, images] -% where width is the fastest dimension. -% Here is the rough matlab for putting image data into the correct -% format: -% % convert from uint8 to single -% im = single(im); -% % reshape to a fixed size (e.g., 227x227) -% im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear'); -% % permute from RGB to BGR and subtract the data mean (already in BGR) -% im = im(:,:,[3 2 1]) - data_mean; -% % flip width and height to make width the fastest dimension -% im = permute(im, [2 1 3]); - -% If you have multiple images, cat them with cat(4, ...) - -% The actual forward function. It takes in a cell array of 4-D arrays as -% input and outputs a cell array. - +% NOTES +% the network is trained on RGB images and expects an RGB input +% the image crops are prepared as described in the paper (the aspect ratio is preserved) % init caffe network (spews logging info) matcaffe_init(use_gpu, model_def_file, model_file); From 5d2a9399ae03d9862c4962c770237393dbcafeb6 Mon Sep 17 00:00:00 2001 From: Karen Simonyan <karen@robots.ox.ac.uk> Date: Mon, 22 Sep 2014 20:39:37 +0100 Subject: [PATCH 0808/2053] added example usage to the Matlab script --- matlab/caffe/matcaffe_demo_vgg.m | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/matlab/caffe/matcaffe_demo_vgg.m b/matlab/caffe/matcaffe_demo_vgg.m index 3e25618164a..d396f50bb84 100644 --- a/matlab/caffe/matcaffe_demo_vgg.m +++ b/matlab/caffe/matcaffe_demo_vgg.m @@ -1,27 +1,36 @@ function scores = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file) -% s = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file) +% scores = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file) % % Demo of the matlab wrapper using the VGG networks: https://gist.github.com/ksimonyan/5c9129cfb8f0359eaf67 % described in the BMVC-2014 paper "Return of the Devil in the Details: Delving Deep into Convolutional Nets" % -% input +% INPUT % im - color image as uint8 HxWx3 % use_gpu - 1 to use the GPU, 0 to use the CPU % model_def_file - network configuration (.prototxt file) % model_file - network weights (.caffemodel file) % mean_file - mean RGB image as uint8 HxWx3 (.mat file) % -% output +% OUTPUT % scores 1000-dimensional ILSVRC score vector % -% You may need to do the following before you start matlab: -% $ export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda-5.5/lib64 -% $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 -% Or the equivalent based on where things are installed on your system -% +% EXAMPLE USAGE +% model_def_file = 'zoo/VGG_CNN_F_deploy.prototxt'; +% model_file = 'zoo/VGG_CNN_F.caffemodel'; +% mean_file = 'zoo/VGG_mean.mat'; +% use_gpu = true; +% im = imread('../../examples/images/cat.jpg'); +% scores = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file); +% % NOTES % the network is trained on RGB images and expects an RGB input % the image crops are prepared as described in the paper (the aspect ratio is preserved) +% +% PREREQUISITES +% You may need to do the following before you start matlab: +% $ export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda/lib64 +% $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 +% Or the equivalent based on where things are installed on your system % init caffe network (spews logging info) matcaffe_init(use_gpu, model_def_file, model_file); From 60d47bf5344cde5c376cbcb354260e6366a4da1e Mon Sep 17 00:00:00 2001 From: Karen Simonyan <karen@robots.ox.ac.uk> Date: Tue, 23 Sep 2014 16:39:08 +0100 Subject: [PATCH 0809/2053] RGB -> BGR in the matlab demo --- matlab/caffe/matcaffe_demo_vgg.m | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/matlab/caffe/matcaffe_demo_vgg.m b/matlab/caffe/matcaffe_demo_vgg.m index d396f50bb84..4e5a98eb5f4 100644 --- a/matlab/caffe/matcaffe_demo_vgg.m +++ b/matlab/caffe/matcaffe_demo_vgg.m @@ -1,15 +1,14 @@ function scores = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file) % scores = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file) % -% Demo of the matlab wrapper using the VGG networks: https://gist.github.com/ksimonyan/5c9129cfb8f0359eaf67 -% described in the BMVC-2014 paper "Return of the Devil in the Details: Delving Deep into Convolutional Nets" +% Demo of the matlab wrapper using the networks described in the BMVC-2014 paper "Return of the Devil in the Details: Delving Deep into Convolutional Nets" % % INPUT % im - color image as uint8 HxWx3 % use_gpu - 1 to use the GPU, 0 to use the CPU % model_def_file - network configuration (.prototxt file) % model_file - network weights (.caffemodel file) -% mean_file - mean RGB image as uint8 HxWx3 (.mat file) +% mean_file - mean BGR image as uint8 HxWx3 (.mat file) % % OUTPUT % scores 1000-dimensional ILSVRC score vector @@ -23,7 +22,6 @@ % scores = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file, mean_file); % % NOTES -% the network is trained on RGB images and expects an RGB input % the image crops are prepared as described in the paper (the aspect ratio is preserved) % % PREREQUISITES @@ -72,6 +70,9 @@ im = imresize(im, [NaN IMAGE_DIM]); end +% RGB -> BGR +im = im(:, :, [3 2 1]); + % oversample (4 corners, center, and their x-axis flips) images = zeros(CROPPED_DIM, CROPPED_DIM, 3, 10, 'single'); From cc96b0b80965cc2d8d3b94a9e52347aa5917cc9f Mon Sep 17 00:00:00 2001 From: savy-91 <savy91@gmail.com> Date: Tue, 23 Sep 2014 21:57:16 +0200 Subject: [PATCH 0810/2053] Changed "blas" to "openblas" The change was made because openblas has to be linked as "-lopenblas" and not "-lblas". This caused an error when compiling. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 5020b4109d6..e85f338ed23 100644 --- a/Makefile +++ b/Makefile @@ -291,7 +291,7 @@ ifeq ($(BLAS), mkl) BLAS_LIB ?= $(MKL_DIR)/lib $(MKL_DIR)/lib/intel64 else ifeq ($(BLAS), open) # OpenBLAS - LIBRARIES += blas + LIBRARIES += openblas else # ATLAS ifeq ($(LINUX), 1) From 9007d96a2d6258b233fe201102f610cd2ed73586 Mon Sep 17 00:00:00 2001 From: Karen Simonyan <karen@robots.ox.ac.uk> Date: Wed, 24 Sep 2014 22:08:46 +0100 Subject: [PATCH 0811/2053] added a Matlab demo with mean BGR pixel subtraction instead of the mean image subtraction --- matlab/caffe/matcaffe_demo_vgg_mean_pix.m | 102 ++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 matlab/caffe/matcaffe_demo_vgg_mean_pix.m diff --git a/matlab/caffe/matcaffe_demo_vgg_mean_pix.m b/matlab/caffe/matcaffe_demo_vgg_mean_pix.m new file mode 100644 index 00000000000..5f7898a7029 --- /dev/null +++ b/matlab/caffe/matcaffe_demo_vgg_mean_pix.m @@ -0,0 +1,102 @@ +function scores = matcaffe_demo_vgg_mean_pix(im, use_gpu, model_def_file, model_file) +% scores = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file) +% +% Demo of the matlab wrapper based on the networks used for the "VGG" entry +% in the ILSVRC-2014 competition and described in the tech. report +% "Very Deep Convolutional Networks for Large-Scale Image Recognition" +% http://arxiv.org/abs/1409.1556/ +% +% INPUT +% im - color image as uint8 HxWx3 +% use_gpu - 1 to use the GPU, 0 to use the CPU +% model_def_file - network configuration (.prototxt file) +% model_file - network weights (.caffemodel file) +% +% OUTPUT +% scores 1000-dimensional ILSVRC score vector +% +% EXAMPLE USAGE +% model_def_file = 'zoo/deploy.prototxt'; +% model_file = 'zoo/model.caffemodel'; +% use_gpu = true; +% im = imread('../../examples/images/cat.jpg'); +% scores = matcaffe_demo_vgg(im, use_gpu, model_def_file, model_file); +% +% NOTES +% mean pixel subtraction is used instead of the mean image subtraction +% +% PREREQUISITES +% You may need to do the following before you start matlab: +% $ export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda/lib64 +% $ export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 +% Or the equivalent based on where things are installed on your system + +% init caffe network (spews logging info) +matcaffe_init(use_gpu, model_def_file, model_file); + +% mean BGR pixel +mean_pix = [103.939, 116.779, 123.68]; + +% prepare oversampled input +% input_data is Height x Width x Channel x Num +tic; +input_data = {prepare_image(im, mean_pix)}; +toc; + +% do forward pass to get scores +% scores are now Width x Height x Channels x Num +tic; +scores = caffe('forward', input_data); +toc; + +scores = scores{1}; +% size(scores) +scores = squeeze(scores); +% scores = mean(scores,2); + +% [~,maxlabel] = max(scores); + +% ------------------------------------------------------------------------ +function images = prepare_image(im, mean_pix) +% ------------------------------------------------------------------------ +IMAGE_DIM = 256; +CROPPED_DIM = 224; + +% resize to fixed input size +im = single(im); + +if size(im, 1) < size(im, 2) + im = imresize(im, [IMAGE_DIM NaN]); +else + im = imresize(im, [NaN IMAGE_DIM]); +end + +% RGB -> BGR +im = im(:, :, [3 2 1]); + +% oversample (4 corners, center, and their x-axis flips) +images = zeros(CROPPED_DIM, CROPPED_DIM, 3, 10, 'single'); + +indices_y = [0 size(im,1)-CROPPED_DIM] + 1; +indices_x = [0 size(im,2)-CROPPED_DIM] + 1; +center_y = floor(indices_y(2) / 2)+1; +center_x = floor(indices_x(2) / 2)+1; + +curr = 1; +for i = indices_y + for j = indices_x + images(:, :, :, curr) = ... + permute(im(i:i+CROPPED_DIM-1, j:j+CROPPED_DIM-1, :), [2 1 3]); + images(:, :, :, curr+5) = images(end:-1:1, :, :, curr); + curr = curr + 1; + end +end +images(:,:,:,5) = ... + permute(im(center_y:center_y+CROPPED_DIM-1,center_x:center_x+CROPPED_DIM-1,:), ... + [2 1 3]); +images(:,:,:,10) = images(end:-1:1, :, :, curr); + +% mean BGR pixel subtraction +for c = 1:3 + images(:, :, c, :) = images(:, :, c, :) - mean_pix(c); +end From 71e731e1c6b564ca58f7f469882500ae93f1add3 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Wed, 24 Sep 2014 14:27:57 -0700 Subject: [PATCH 0812/2053] Fixed param order of cv::Size in cv::resize --- src/caffe/util/io.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index ad835e35d66..4a22e18725d 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -78,7 +78,7 @@ bool ReadImageToDatum(const string& filename, const int label, return false; } if (height > 0 && width > 0) { - cv::resize(cv_img_origin, cv_img, cv::Size(height, width)); + cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); } else { cv_img = cv_img_origin; } From 98db2dc31e5fec4ae7eb4c026348a4b69d50a670 Mon Sep 17 00:00:00 2001 From: "D.Mishkin" <ducha.aiki@gmail.com> Date: Thu, 25 Sep 2014 17:30:48 +0300 Subject: [PATCH 0813/2053] Removed unnecessary "mutable" --- tools/extract_features.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 49e8f98971c..9b0288a4d5a 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -148,14 +148,14 @@ int feature_extraction_pipeline(int argc, char** argv) { ->blob_by_name(blob_names[i]); int batch_size = feature_blob->num(); int dim_features = feature_blob->count() / batch_size; - Dtype* feature_blob_data; + const Dtype* feature_blob_data; for (int n = 0; n < batch_size; ++n) { datum.set_height(dim_features); datum.set_width(1); datum.set_channels(1); datum.clear_data(); datum.clear_float_data(); - feature_blob_data = feature_blob->mutable_cpu_data() + + feature_blob_data = feature_blob->cpu_data() + feature_blob->offset(n); for (int d = 0; d < dim_features; ++d) { datum.add_float_data(feature_blob_data[d]); From f1a1426580a1279282e2d16998cb46d9755351c8 Mon Sep 17 00:00:00 2001 From: Alireza Shafaei <alireza@shafaei.net> Date: Tue, 23 Sep 2014 22:35:00 -0700 Subject: [PATCH 0814/2053] Random crop bugfix and abstracting random number generation inside data_transformer --- include/caffe/data_transformer.hpp | 10 +++++++++- src/caffe/data_transformer.cpp | 11 ++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 5d5134f5db5..3ca99e7b62c 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -39,7 +39,15 @@ class DataTransformer { const Dtype* mean, Dtype* transformed_data); protected: - virtual unsigned int Rand(); + /** + * @brief Generates a random integer from Uniform({0, 1, ..., n-1}). + * + * @param n + * The upperbound (exclusive) value of the random number. + * @return + * A uniformly random integer value from ({0, 1, ..., n-1}). + */ + virtual int Rand(int n); // Tranformation parameters TransformationParameter param_; diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 7150fd99c18..e52c3b6a55d 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -31,13 +31,13 @@ void DataTransformer<Dtype>::Transform(const int batch_item_id, int h_off, w_off; // We only do random crop when we do training. if (phase_ == Caffe::TRAIN) { - h_off = Rand() % (height - crop_size); - w_off = Rand() % (width - crop_size); + h_off = Rand(height - crop_size + 1); + w_off = Rand(width - crop_size + 1); } else { h_off = (height - crop_size) / 2; w_off = (width - crop_size) / 2; } - if (mirror && Rand() % 2) { + if (mirror && (Rand(2) == 1)) { // Copy mirrored version for (int c = 0; c < channels; ++c) { for (int h = 0; h < crop_size; ++h) { @@ -99,11 +99,12 @@ void DataTransformer<Dtype>::InitRand() { } template <typename Dtype> -unsigned int DataTransformer<Dtype>::Rand() { +int DataTransformer<Dtype>::Rand(int n) { CHECK(rng_); + CHECK_GT(n, 0); caffe::rng_t* rng = static_cast<caffe::rng_t*>(rng_->generator()); - return (*rng)(); + return ((*rng)() % n); } INSTANTIATE_CLASS(DataTransformer); From 3ea823c461884c259c07c441d07c99c68cf91298 Mon Sep 17 00:00:00 2001 From: jjkjkj <jjkjkj42@gmail.com> Date: Fri, 26 Sep 2014 12:39:49 +0300 Subject: [PATCH 0815/2053] Update layer_factory.cpp --- src/caffe/layer_factory.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index b78167f21eb..69c8c9ed70b 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -251,6 +251,8 @@ Layer<Dtype>* GetLayer(const LayerParameter& param) { return GetTanHLayer<Dtype>(name, param); case LayerParameter_LayerType_WINDOW_DATA: return new WindowDataLayer<Dtype>(param); + case LayerParameter_LayerType_THRESHOLD: + return new ThresholdLayer<Dtype>(param); case LayerParameter_LayerType_NONE: LOG(FATAL) << "Layer " << name << " has unspecified type."; default: From e31d0ac1e033cff4b6bd42e9b0f9fb3060508073 Mon Sep 17 00:00:00 2001 From: Chiyuan Zhang <pluskid@gmail.com> Date: Fri, 26 Sep 2014 13:18:38 -0400 Subject: [PATCH 0816/2053] tweak test case to expose bug. --- src/caffe/test/test_data/generate_sample_data.py | 2 +- src/caffe/test/test_hdf5data_layer.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_data/generate_sample_data.py b/src/caffe/test/test_data/generate_sample_data.py index 0516eff9158..2ab238611d8 100644 --- a/src/caffe/test/test_data/generate_sample_data.py +++ b/src/caffe/test/test_data/generate_sample_data.py @@ -7,7 +7,7 @@ num_cols = 8 num_rows = 10 -height = 5 +height = 6 width = 5 total_size = num_cols * num_rows * height * width diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index acca75b19b1..78a45223b90 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -62,7 +62,7 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { hdf5_data_param->set_batch_size(batch_size); hdf5_data_param->set_source(*(this->filename)); int num_cols = 8; - int height = 5; + int height = 6; int width = 5; // Test that the layer setup got the correct parameters. From c85b14b02c425937a3937080d83a49da9e59fece Mon Sep 17 00:00:00 2001 From: Chiyuan Zhang <pluskid@gmail.com> Date: Fri, 26 Sep 2014 15:21:45 -0400 Subject: [PATCH 0817/2053] update HDF5 layer test data. --- src/caffe/test/test_data/sample_data.h5 | Bin 10184 -> 11784 bytes .../test/test_data/sample_data_2_gzip.h5 | Bin 9992 -> 10548 bytes src/caffe/test/test_hdf5data_layer.cpp | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_data/sample_data.h5 b/src/caffe/test/test_data/sample_data.h5 index cb327573cae5de98cb1008eb38a3372c229a499c..90eaaa56ec773b5de2303100a5611786c8d78766 100644 GIT binary patch delta 1685 zcmWmBy^bC=6b4}D+w5iuf6GE7x|kvmAqDvYC|s}&4HJoy!WE(%uHbV?X|y-sl5)`A zfJ@4`1Q%Su6jTs?9*XD4nlta)oZr6r>AUvwbp6GzpMQGs=<5FU#dGt=i`S?6;{MI$ z$B%#i<;AxT^Wye&ny>EvxQtK!{}93t51(A!oqiry58q#Z`TYFnS0R!qR62u6_{*M5 zq0$*l!W(-sg-T~I34hy@DO5Ux$vOPv2Qr09XD|u>+LI|%I)h0Fcj1OeBC}9fsWdtp zgPq9{?#>}RQa~h;StzVj8l8>7&g3AR<cTCQ3x$<Rqq8yCnH;CHf(r#i5}Ad<N~O`+ z80<_A!ee<NiOfP_rPAnZ40a~R*$9^kh$J!#g_TO9voYA29E2-*B8kjGVWraOYz%fL z=fen36c9;d778nsMrUKNGdT#?@<bAug~Cdu(b*X6%xm{QJi=QFh$J!#g_TO9voYA2 z9E7LxL=u^W!b+vl*%<81r|y4vgtrwCNn{oZE0soPW3V$h2=B-fNn{oZE0soPW3V&N z#zA;j0g*&zp|DbEbT$S%lY{V{Jds3Zp|DbEbT$S%=V=^-_Z1LHWEKi5l}2Y{uroOb zH}XUhnT5hirP0|K>^JT|Jr2SL3Wy{!3x$<Rqq8yCnH+>$c_N9-LSd!S=xhx3Tlb$H z2jN2nL=u^W!b+vl*%<6h4#G$BL=u^W!b+vl*%<6!8<T_ZOaYNZW}&cBX>>LQJCozt J-F^S;<$tE%fV=<z delta 74 zcmeB(IpIG+gXx6&MlCgFM%KxJ%<@38kU5aaL4NWdRtc6jN3R8Me!wim#I!(t@)uSG cc8~xAL&j!BHdm&J2iP{JaoEUDex$1g0G1{hA^-pY diff --git a/src/caffe/test/test_data/sample_data_2_gzip.h5 b/src/caffe/test/test_data/sample_data_2_gzip.h5 index b3d187cb1da4445a6a2f5510dc98ba4b25e8ec75..ff49db4ea742f207cbea04de3027087f4994215a 100644 GIT binary patch literal 10548 zcmeI13rtg27{^arp@8zREL1@r0|c3(^0G{Mx+28^1!Pg9GM=m37!Sp?IE1l|VbcI< z8r&EH^R-D9x3SC!2~$Bq*hHK<F&Qc_Cg2t<Fh|MIuDAEzEaw~8X3G-e?j^b3`JL~a zkMI1?IZfeHh=iN0tsJco@mN@(1<20Oq+dGf3G^X*Xr}$CRD(s?gOokVCL1h7{2;W1 z>R(L7hvSlyqN0#~Bpsi&)HEdHku5ws+RNByT>(*4WCF3qZPY^P^VCJ1GkX1*X$5IS zJ3B2sD_d{ra~VN&{)2~wxMU0}5DSS6QCJJe4)WsYuMQR4oU&$=HRk8&Zw3)*v74*@ z?h%h0;#(koiJ^^<nLaY%XLHCj7V7;3vxpaA4Sp8N%z7<5tssjWr0=(&#&OtYYst8X zNQFp~NRdd-(9JV+kva{ZT%P>bP1TQ><00-Taii(`Nn3Mzp>xcctLwZy-b+uPPe*DE z_#}oH1sDYw1sDYw1sDYw1sDYw1sDYw1sDaMdIh$`i-j!2rvCaw$c^*ll<EKbbUHtI z-2crhV_Dx46h!!C97?NL8d^Gb)a-hcAO<BCuYJV(XzbmDW%p0iItT^3BKA~9SGWZ2 zzcD&dX)r2@taG|Zc||pDJt%qP)^8V+X=CMGy-BjRWm|T8?@fD*Pt}Xu_a+242CkQP zccj}FR|5VVa6RC&fJ*@%0j$FLD2~NVfE9on0oMR-0lZD@sd{n6;bh0Uw&C<9%X1rX zmhN{~T#g((er<G-7hf5ttp@xG;2!`70X_|QAK-^Li*VFh1FirZ2e=2YFW^&v-@>`M z4?hdJfU8Cop8ni2_2y#%AMRYWZZP_xkXIvbk2&%E(%97wwVDh(oYom|9pGI!cj2hL z4LB6=H-HZShDYxleik0TgR{$T_-eRdb>+Zc4*b!;57oH@{Fku#PUS)1W;R^KccbbT zTz&C<z+-^H_+GGky<mPKeicgM0jB_t1PtfL0RMKtQ5feZmO0^f?=!HSZvwUqRSEBX zoR{=^fw@}Q;WfJtur=T~z`i(#0QtPJ?WxtA0W1aEDFyy%;GYJ5Tg>lNbtCU3?4wDS zfaznY69EPvWjZ17Cj*WJyc6eMATJ;A2Y|N%?gK0U?1Rfay947+?i<?YbDEd$i5{xI z%;8o&S07yX$>heLs;@Z7rCzQ(i@wsPPsM4azqbq?>T*`R?Qgp*BuO?jT=VV1immH& z7u~5T%A4pOQuYW2@BTRQ{tkDk=XiHWo<=mNP)lA|6PPmA>L-&-wsm+b*Q~qyo-Vb) zDM!(-YWAKw-{w)~9bezrdR2B}s&k;Oo6B!lb@o<~{o`W?j3*>EA)#<n5=u9oP|B}+ zFZil9@TN0ef@Q}w7rO(h`Ho){+*#5ZFf%Zu?%>zvwwIjlwLT*p7xk+P2L@E__TIh8 zDZ5**6=rCz49k^bhgY-DTIzbj1pT}gk9_gHQhBtM_;ARU!Xp!#M=IJjsBKq=Z7*t? z@tT$X(VzG7aOK6&8m^6tPe}e`?9XMLE9(U24`RcbwV4wg_i8oaCM2Z$+JuC@Ga;c| zqX{{Me|o_-->5{oCKEF1Ga;jJqZ!p|uA6W^Bt~U?&@j`c<K8}*HuCo>)e6HGVHTS# z6VcTbs%T^=1rY;i{_m<#WOa+f=G=54znT-N5WjYw>Qe+c>R-O+t5SIxiEBeux#?k0 zH>L_jE5leu0Y(8v0Y(8v0Y(8vfoDSj87m`o_m`5?)I8+wmV<`OB8t#KSL7%6;K-5P M%3wAs@i!0n6Fk~8`Tzg` literal 9992 zcmeI1X-HI26vyv-qd8f*71<(<TiS+JMz(7;W0Oh~DP|BcV`CN!B{Ux_q9LqQG$f-9 zu~O4EE0@xWGAkq_%52fTTC|a&B$3dRz5CvM)H#(x5wzSl%)9rU-#zEt_kZ^=%gr(B zV}`hoawqiAYKaT+lDq1ummS(r#iCxT+{`)xYqME<TvR#&p)W#4FuOO4kH;l0GZ=_8 zQjM>+%#CFDC_OkkmGbsqSHNhPzm(o%GP_ZAJvFg)rry8RVz<z~&61L8lUj9MMpNTY z90GAuVz590G0IT{7sa3yj#N4<wkvA;;~J?lXe4icom6}D@F%`n;_Hz6gt$tPDHk=$ zGzLkWUJLX@TbT>Qn!3hjv8O77B)gW4(}=E<mAHgXg-(-Bk-lZKk8DzO>S%0D_)@9T zi0>S<PH9D}^{KXx+`coo4^zWX2>a8C-2-&uS6l(E09Sx3z!l&Ma0R#mTmh~CSAZ+< z$19Mq#H1I9$bNki;;-p@%Ig0<4Ws)W_rK8$VMwcCIH_2bW$9>bUf(Fa3|HDbI+8k) zY@K;yD_!<A_#}&Q=7D){(z^1tz9{<Gyv^%V_ridJ6ZVk8xSsIY2V>K!FK+Lx-J=+E zs^L5{L@`5GdzY|VU%qsmeZZc^=jofa=ieW?*y_GFCT;Qxo5%h|J!|Je+yZej!Ve(M zfY@{oVm-nrw-sTOI}u@&+YWIv${lSA-aS5XRM9nS)y$P++9TfSeGV=tYZ)0oyzs^| z?|E?$*C4zI;*AKKAnt~^9_1c{un~IaBCLlv4&iu+Z$n&i$QYP#eA=wcTPYha%(=e& zWlr$a9kHbm2PRF=x*fEo4B=N0pNF^&d7nlYd0&Az5_y**jJ#_gu0!6Z5Qg5ta4~FX zgA36E;?9Q<haubw@fd_3K|Bv(lv{vUhjIrXjB<M;40AVa4$O%!zW;J?Nba5Xx7w)k z(1NC66L#G-S3mX(%kO%Ma52OvwdZTF7@S9;;wGrL^Bly@@Oe2a5JujYAr430Xc>nC z?;BM+J+r@F*3N1e?JSCR5@8T6$ax9k4amD3VdPy4aVPRVgD~>0hggTaivgaK*scK& z+;J2>(VOsrJ4zrvhA>(#FAzq{Wk14YFnAlnr4ZL4d<^3E5ceMW8hajoh(5*~sER^i znK)1t`63Lfs3#I(RKcDQ=YwbTp((3Z=M=BL%@9_b*H)&P&FLi2e?58P8oh;N>&TSM zAWbImnm9uwj;RA8<gYs4?oW(U?4q(kp#HDUwhQD<06IXu{(buo%D#q1)ZFuvXC$Yl xX@9Wq5Uq^*#q*E$Cqnv(yBB@0#JchQhkgX)m@B{);0kaBxB^@OuE1ZWz-OO4{r&&| diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index 78a45223b90..29e70c9417f 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -93,8 +93,8 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { // Every two iterations we are reading the second file, // which has the same labels, but data is offset by total data size, - // which is 2000 (see generate_sample_data). - int file_offset = (iter % 4 < 2) ? 0 : 2000; + // which is 2400 (see generate_sample_data). + int file_offset = (iter % 4 < 2) ? 0 : 2400; for (int i = 0; i < batch_size; ++i) { EXPECT_EQ( From e8589c6cdf7bbe8becea08ee209779317dca744a Mon Sep 17 00:00:00 2001 From: Chiyuan Zhang <pluskid@gmail.com> Date: Fri, 26 Sep 2014 15:21:57 -0400 Subject: [PATCH 0818/2053] fix hdf5 data layer bug --- src/caffe/layers/hdf5_data_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 1f2a83582f2..3f1396a9acc 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -75,9 +75,9 @@ void HDF5DataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, // Reshape blobs. const int batch_size = this->layer_param_.hdf5_data_param().batch_size(); (*top)[0]->Reshape(batch_size, data_blob_.channels(), - data_blob_.width(), data_blob_.height()); + data_blob_.height(), data_blob_.width()); (*top)[1]->Reshape(batch_size, label_blob_.channels(), - label_blob_.width(), label_blob_.height()); + label_blob_.height(), label_blob_.width()); LOG(INFO) << "output data size: " << (*top)[0]->num() << "," << (*top)[0]->channels() << "," << (*top)[0]->height() << "," << (*top)[0]->width(); From 6d80a633f43f41f2188aee9e05917b7e0dc6363c Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sat, 27 Sep 2014 20:10:13 -0700 Subject: [PATCH 0819/2053] cudnn pooling fallback option --- src/caffe/layer_factory.cpp | 6 +++++- src/caffe/layers/cudnn_pooling_layer.cpp | 5 ++++- src/caffe/layers/cudnn_pooling_layer.cu | 13 ------------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index b78167f21eb..19e111cbcc8 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -40,7 +40,8 @@ template ConvolutionLayer<double>* GetConvolutionLayer(const string& name, template <typename Dtype> PoolingLayer<Dtype>* GetPoolingLayer(const string& name, const LayerParameter& param) { - PoolingParameter_Engine engine = param.pooling_param().engine(); + const PoolingParameter& p_param = param.pooling_param(); + const PoolingParameter_Engine& engine = p_param.engine(); if (engine == PoolingParameter_Engine_DEFAULT) { engine = PoolingParameter_Engine_CAFFE; #ifdef USE_CUDNN @@ -51,6 +52,9 @@ PoolingLayer<Dtype>* GetPoolingLayer(const string& name, return new PoolingLayer<Dtype>(param); #ifdef USE_CUDNN } else if (engine == PoolingParameter_Engine_CUDNN) { + if (p_param.pad_h() || p_param.pad_w() || param.top_size() > 1) { + return new PoolingLayer<DType>(param); + } return new CuDNNPoolingLayer<Dtype>(param); #endif } else { diff --git a/src/caffe/layers/cudnn_pooling_layer.cpp b/src/caffe/layers/cudnn_pooling_layer.cpp index 2af9d21be26..b61ed2a7ede 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cpp +++ b/src/caffe/layers/cudnn_pooling_layer.cpp @@ -13,7 +13,10 @@ template <typename Dtype> void CuDNNPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { PoolingLayer<Dtype>::LayerSetUp(bottom, top); - + // Sanity check: CUDNN currently only supports pad=0 and top.size()=1 cases. + CHECK_EQ(pad_h_, 0); + CHECK_EQ(pad_w_, 0); + CHECK_EQ(top.size(), 1); CUDNN_CHECK(cudnnCreate(&handle_)); cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); cudnn::createTensor4dDesc<Dtype>(&top_desc_); diff --git a/src/caffe/layers/cudnn_pooling_layer.cu b/src/caffe/layers/cudnn_pooling_layer.cu index 9d270ed25d5..8b9e7f1bf10 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cu +++ b/src/caffe/layers/cudnn_pooling_layer.cu @@ -12,12 +12,6 @@ namespace caffe { template <typename Dtype> void CuDNNPoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { - // Fallback to Caffe for padded pooling, max top mask. - if ((this->pad_h_ > 0 || this->pad_w_ > 0) || top.size() > 1) { - LOG(WARNING) << "Falling back to standard Caffe for padded pooling."; - return PoolingLayer<Dtype>::Forward_gpu(bottom, top); - } - const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = top[0]->mutable_gpu_data(); CUDNN_CHECK(cudnnPoolingForward(handle_, pooling_desc_, @@ -30,13 +24,6 @@ void CuDNNPoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, if (!propagate_down[0]) { return; } - - // Fallback to Caffe for padded pooling, max top mask. - if ((this->pad_h_ > 0 || this->pad_w_ > 0) || top.size() > 1) { - LOG(WARNING) << "Falling back to standard Caffe for padded pooling."; - return PoolingLayer<Dtype>::Backward_gpu(top, propagate_down, bottom); - } - const Dtype* top_diff = top[0]->gpu_diff(); const Dtype* top_data = top[0]->gpu_data(); const Dtype* bottom_data = bottom[0]->gpu_data(); From 560bd7ee646da7659471d142b4156a8e86e0e8b8 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sat, 27 Sep 2014 20:22:10 -0700 Subject: [PATCH 0820/2053] const fix --- src/caffe/layer_factory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 19e111cbcc8..3f15825bd88 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -41,7 +41,7 @@ template <typename Dtype> PoolingLayer<Dtype>* GetPoolingLayer(const string& name, const LayerParameter& param) { const PoolingParameter& p_param = param.pooling_param(); - const PoolingParameter_Engine& engine = p_param.engine(); + PoolingParameter_Engine engine = p_param.engine(); if (engine == PoolingParameter_Engine_DEFAULT) { engine = PoolingParameter_Engine_CAFFE; #ifdef USE_CUDNN From 7accbeeed51c76bfc94d65366b857aa1b81bd4f4 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sun, 28 Sep 2014 15:33:52 -0700 Subject: [PATCH 0821/2053] message --- src/caffe/layer_factory.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 3f15825bd88..9e62e9528fb 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -53,6 +53,8 @@ PoolingLayer<Dtype>* GetPoolingLayer(const string& name, #ifdef USE_CUDNN } else if (engine == PoolingParameter_Engine_CUDNN) { if (p_param.pad_h() || p_param.pad_w() || param.top_size() > 1) { + LOG(INFO) << "CUDNN does not support padding or multiple tops. " + << "Using Caffe's own pooling layer."; return new PoolingLayer<DType>(param); } return new CuDNNPoolingLayer<Dtype>(param); From d316628f8dfffb6910fe8010b9c50085ba7196a8 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq@google.com> Date: Fri, 26 Sep 2014 13:58:45 -0700 Subject: [PATCH 0822/2053] running factory. --- Makefile | 38 +++--- include/caffe/layer.hpp | 5 +- include/caffe/layer_factory.hpp | 85 +++++++++++++ src/caffe/layer_factory.cpp | 205 ++++++++++---------------------- 4 files changed, 165 insertions(+), 168 deletions(-) create mode 100644 include/caffe/layer_factory.hpp diff --git a/Makefile b/Makefile index 5020b4109d6..243650b2ad1 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,6 @@ endif # The target shared library and static library name LIB_BUILD_DIR := $(BUILD_DIR)/lib NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so -STATIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).a ############################## # Get all source files @@ -338,7 +337,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo py mat py$(PROJECT) mat$(PROJECT) proto runtest \ superclean supercleanlist supercleanfiles warn everything -all: $(NAME) $(STATIC_NAME) tools examples +all: $(NAME) tools examples everything: all py$(PROJECT) mat$(PROJECT) test warn lint runtest @@ -387,16 +386,16 @@ py$(PROJECT): py py: $(PY$(PROJECT)_SO) $(PROTO_GEN_PY) -$(PY$(PROJECT)_SO): $(STATIC_NAME) $(PY$(PROJECT)_SRC) $(PY$(PROJECT)_HXX_SRC) +$(PY$(PROJECT)_SO): $(OBJS) $(PY$(PROJECT)_SRC) $(PY$(PROJECT)_HXX_SRC) $(CXX) -shared -o $@ $(PY$(PROJECT)_SRC) \ - $(STATIC_NAME) $(LINKFLAGS) $(PYTHON_LDFLAGS) + $(OBJS) $(LINKFLAGS) $(PYTHON_LDFLAGS) @ echo mat$(PROJECT): mat mat: $(MAT$(PROJECT)_SO) -$(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) +$(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(OBJS) @ if [ -z "$(MATLAB_DIR)" ]; then \ echo "MATLAB_DIR must be specified in $(CONFIG_FILE)" \ "to build mat$(PROJECT)."; \ @@ -405,7 +404,7 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) $(MATLAB_DIR)/bin/mex $(MAT$(PROJECT)_SRC) \ CXX="$(CXX)" \ CXXFLAGS="\$$CXXFLAGS $(MATLAB_CXXFLAGS)" \ - CXXLIBS="\$$CXXLIBS $(STATIC_NAME) $(LDFLAGS)" -output $@ + CXXLIBS="\$$CXXLIBS $(OBJS) $(LDFLAGS)" -output $@ @ echo runtest: $(TEST_ALL_BIN) @@ -443,14 +442,10 @@ $(BUILD_DIR)/.linked: $(ALL_BUILD_DIRS): | $(BUILD_DIR_LINK) @ mkdir -p $@ -$(NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) +$(NAME): $(OBJS) | $(LIB_BUILD_DIR) $(CXX) -shared -o $@ $(OBJS) $(LINKFLAGS) $(LDFLAGS) @ echo -$(STATIC_NAME): $(PROTO_OBJS) $(OBJS) | $(LIB_BUILD_DIR) - ar rcs $@ $(PROTO_OBJS) $(OBJS) - @ echo - $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HXX_SRCS) \ | $(TEST_BUILD_DIR) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ @@ -465,21 +460,21 @@ $(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HXX_SRCS) \ @ cat $@.$(WARNS_EXT) @ echo -$(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ +$(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(OBJS) \ | $(TEST_BIN_DIR) - $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ + $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(OBJS) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo -$(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.cuo $(GTEST_OBJ) $(STATIC_NAME) \ +$(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.cuo $(GTEST_OBJ) $(OBJS) \ | $(TEST_BIN_DIR) - $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_NAME) \ + $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(OBJS) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo -$(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) $(STATIC_NAME) \ +$(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) $(OBJS) \ | $(TEST_BIN_DIR) - $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_NAME) \ + $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(OBJS) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo @@ -488,12 +483,12 @@ $(TOOL_BUILD_DIR)/%: $(TOOL_BUILD_DIR)/%.bin | $(TOOL_BUILD_DIR) @ $(RM) $@ @ ln -s $(abspath $<) $@ -$(TOOL_BINS): %.bin : %.o $(STATIC_NAME) - $(CXX) $< $(STATIC_NAME) -o $@ $(LINKFLAGS) $(LDFLAGS) +$(TOOL_BINS): %.bin : %.o $(OBJS) + $(CXX) $< $(OBJS) -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo -$(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) - $(CXX) $< $(STATIC_NAME) -o $@ $(LINKFLAGS) $(LDFLAGS) +$(EXAMPLE_BINS): %.bin : %.o $(OBJS) + $(CXX) $< $(OBJS) -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo $(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \ @@ -612,6 +607,5 @@ $(DISTRIBUTE_DIR): all py $(HXX_SRCS) | $(DISTRIBUTE_SUBDIRS) cp $(EXAMPLE_BINS) $(DISTRIBUTE_DIR)/bin # add libraries cp $(NAME) $(DISTRIBUTE_DIR)/lib - cp $(STATIC_NAME) $(DISTRIBUTE_DIR)/lib # add python - it's not the standard way, indeed... cp -r python $(DISTRIBUTE_DIR)/python diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 18ff2743719..8a8330bca57 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -7,6 +7,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" +#include "caffe/layer_factory.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/device_alternate.hpp" @@ -469,10 +470,6 @@ void Layer<Dtype>::ToProto(LayerParameter* param, bool write_diff) { } } -// The layer factory function -template <typename Dtype> -Layer<Dtype>* GetLayer(const LayerParameter& param); - } // namespace caffe #endif // CAFFE_LAYER_H_ diff --git a/include/caffe/layer_factory.hpp b/include/caffe/layer_factory.hpp new file mode 100644 index 00000000000..08e3e6d3ad8 --- /dev/null +++ b/include/caffe/layer_factory.hpp @@ -0,0 +1,85 @@ +#ifndef CAFFE_LAYER_FACTORY_H_ +#define CAFFE_LAYER_FACTORY_H_ + +#include <map> + +#include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +template <typename Dtype> +class Layer; + +template <typename Dtype> +class LayerRegistry { + public: + typedef Layer<Dtype>* (*Creator)(const LayerParameter&); + typedef std::map<LayerParameter_LayerType, Creator> CreatorRegistry; + + // Adds a creator. + static void AddCreator(const LayerParameter_LayerType& type, + Creator creator) { + CHECK_EQ(registry_.count(type), 0) + << "Layer type " << type << " already registered."; + registry_[type] = creator; + } + + // Get a layer using a LayerParameter. + static Layer<Dtype>* CreateLayer(const LayerParameter& param) { + LOG(INFO) << "Creating layer " << param.name(); + const LayerParameter_LayerType& type = param.type(); + CHECK_EQ(registry_.count(type), 1); + return registry_[type](param); + } + + private: + // Layer registry should never be instantiated - everything is done with its + // static variables. + LayerRegistry() {} + static CreatorRegistry registry_; +}; + +// Static variables for the templated layer factory registry. +template <typename Dtype> +typename LayerRegistry<Dtype>::CreatorRegistry LayerRegistry<Dtype>::registry_; + +template <typename Dtype> +class LayerRegisterer { + public: + LayerRegisterer(const LayerParameter_LayerType& type, + Layer<Dtype>* (*creator)(const LayerParameter&)) { + LOG(INFO) << "Registering layer type: " << type; + LayerRegistry<Dtype>::AddCreator(type, creator); + } +}; + + +#define REGISTER_LAYER_CREATOR(type, creator, classname) \ + static LayerRegisterer<float> g_creator_f_##classname(type, creator<float>); \ + static LayerRegisterer<double> g_creator_d_##classname(type, creator<double>) + +#define REGISTER_LAYER_CLASS(type, clsname) \ + template <typename Dtype> \ + Layer<Dtype>* Creator_##clsname(const LayerParameter& param) { \ + return new clsname<Dtype>(param); \ + } \ + static LayerRegisterer<float> g_creator_f_##clsname( \ + type, Creator_##clsname<float>); \ + static LayerRegisterer<double> g_creator_d_##clsname( \ + type, Creator_##clsname<double>) + +// A function to get a specific layer from the specification given in +// LayerParameter. Ideally this would be replaced by a factory pattern, +// but we will leave it this way for now. +// Yangqing's note: With LayerRegistry, we no longer need this thin wrapper any +// more. It is provided here for backward compatibility and should be removed in +// the future. +template <typename Dtype> +Layer<Dtype>* GetLayer(const LayerParameter& param) { + return LayerRegistry<Dtype>::CreateLayer(param); +} + +} // namespace caffe + +#endif // CAFFE_LAYER_FACTORY_H_ diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 566162911ef..79a732b965b 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -1,6 +1,7 @@ #include <string> #include "caffe/layer.hpp" +#include "caffe/layer_factory.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/vision_layers.hpp" @@ -11,7 +12,7 @@ namespace caffe { // Get convolution layer according to engine. template <typename Dtype> -ConvolutionLayer<Dtype>* GetConvolutionLayer(const string& name, +Layer<Dtype>* GetConvolutionLayer( const LayerParameter& param) { ConvolutionParameter_Engine engine = param.convolution_param().engine(); if (engine == ConvolutionParameter_Engine_DEFAULT) { @@ -27,21 +28,14 @@ ConvolutionLayer<Dtype>* GetConvolutionLayer(const string& name, return new CuDNNConvolutionLayer<Dtype>(param); #endif } else { - LOG(FATAL) << "Layer " << name << " has unknown engine."; + LOG(FATAL) << "Layer " << param.name() << " has unknown engine."; } } -template ConvolutionLayer<float>* GetConvolutionLayer(const string& name, - const LayerParameter& param); -template ConvolutionLayer<double>* GetConvolutionLayer(const string& name, - const LayerParameter& param); - // Get pooling layer according to engine. template <typename Dtype> -PoolingLayer<Dtype>* GetPoolingLayer(const string& name, - const LayerParameter& param) { - const PoolingParameter& p_param = param.pooling_param(); - PoolingParameter_Engine engine = p_param.engine(); +Layer<Dtype>* GetPoolingLayer(const LayerParameter& param) { + PoolingParameter_Engine engine = param.pooling_param().engine(); if (engine == PoolingParameter_Engine_DEFAULT) { engine = PoolingParameter_Engine_CAFFE; #ifdef USE_CUDNN @@ -60,19 +54,13 @@ PoolingLayer<Dtype>* GetPoolingLayer(const string& name, return new CuDNNPoolingLayer<Dtype>(param); #endif } else { - LOG(FATAL) << "Layer " << name << " has unknown engine."; + LOG(FATAL) << "Layer " << param.name() << " has unknown engine."; } } -template PoolingLayer<float>* GetPoolingLayer(const string& name, - const LayerParameter& param); -template PoolingLayer<double>* GetPoolingLayer(const string& name, - const LayerParameter& param); - // Get relu layer according to engine. template <typename Dtype> -ReLULayer<Dtype>* GetReLULayer(const string& name, - const LayerParameter& param) { +Layer<Dtype>* GetReLULayer(const LayerParameter& param) { ReLUParameter_Engine engine = param.relu_param().engine(); if (engine == ReLUParameter_Engine_DEFAULT) { engine = ReLUParameter_Engine_CAFFE; @@ -87,19 +75,13 @@ ReLULayer<Dtype>* GetReLULayer(const string& name, return new CuDNNReLULayer<Dtype>(param); #endif } else { - LOG(FATAL) << "Layer " << name << " has unknown engine."; + LOG(FATAL) << "Layer " << param.name() << " has unknown engine."; } } -template ReLULayer<float>* GetReLULayer(const string& name, - const LayerParameter& param); -template ReLULayer<double>* GetReLULayer(const string& name, - const LayerParameter& param); - // Get sigmoid layer according to engine. template <typename Dtype> -SigmoidLayer<Dtype>* GetSigmoidLayer(const string& name, - const LayerParameter& param) { +Layer<Dtype>* GetSigmoidLayer(const LayerParameter& param) { SigmoidParameter_Engine engine = param.sigmoid_param().engine(); if (engine == SigmoidParameter_Engine_DEFAULT) { engine = SigmoidParameter_Engine_CAFFE; @@ -114,19 +96,13 @@ SigmoidLayer<Dtype>* GetSigmoidLayer(const string& name, return new CuDNNSigmoidLayer<Dtype>(param); #endif } else { - LOG(FATAL) << "Layer " << name << " has unknown engine."; + LOG(FATAL) << "Layer " << param.name() << " has unknown engine."; } } -template SigmoidLayer<float>* GetSigmoidLayer(const string& name, - const LayerParameter& param); -template SigmoidLayer<double>* GetSigmoidLayer(const string& name, - const LayerParameter& param); - // Get tanh layer according to engine. template <typename Dtype> -TanHLayer<Dtype>* GetTanHLayer(const string& name, - const LayerParameter& param) { +Layer<Dtype>* GetTanHLayer(const LayerParameter& param) { TanHParameter_Engine engine = param.tanh_param().engine(); if (engine == TanHParameter_Engine_DEFAULT) { engine = TanHParameter_Engine_CAFFE; @@ -141,19 +117,13 @@ TanHLayer<Dtype>* GetTanHLayer(const string& name, return new CuDNNTanHLayer<Dtype>(param); #endif } else { - LOG(FATAL) << "Layer " << name << " has unknown engine."; + LOG(FATAL) << "Layer " << param.name() << " has unknown engine."; } } -template TanHLayer<float>* GetTanHLayer(const string& name, - const LayerParameter& param); -template TanHLayer<double>* GetTanHLayer(const string& name, - const LayerParameter& param); - // Get softmax layer according to engine. template <typename Dtype> -SoftmaxLayer<Dtype>* GetSoftmaxLayer(const string& name, - const LayerParameter& param) { +Layer<Dtype>* GetSoftmaxLayer(const LayerParameter& param) { SoftmaxParameter_Engine engine = param.softmax_param().engine(); if (engine == SoftmaxParameter_Engine_DEFAULT) { engine = SoftmaxParameter_Engine_CAFFE; @@ -168,107 +138,58 @@ SoftmaxLayer<Dtype>* GetSoftmaxLayer(const string& name, return new CuDNNSoftmaxLayer<Dtype>(param); #endif } else { - LOG(FATAL) << "Layer " << name << " has unknown engine."; - } -} - -template SoftmaxLayer<float>* GetSoftmaxLayer(const string& name, - const LayerParameter& param); -template SoftmaxLayer<double>* GetSoftmaxLayer(const string& name, - const LayerParameter& param); - -// A function to get a specific layer from the specification given in -// LayerParameter. Ideally this would be replaced by a factory pattern, -// but we will leave it this way for now. -template <typename Dtype> -Layer<Dtype>* GetLayer(const LayerParameter& param) { - const string& name = param.name(); - const LayerParameter_LayerType& type = param.type(); - switch (type) { - case LayerParameter_LayerType_ACCURACY: - return new AccuracyLayer<Dtype>(param); - case LayerParameter_LayerType_ABSVAL: - return new AbsValLayer<Dtype>(param); - case LayerParameter_LayerType_ARGMAX: - return new ArgMaxLayer<Dtype>(param); - case LayerParameter_LayerType_BNLL: - return new BNLLLayer<Dtype>(param); - case LayerParameter_LayerType_CONCAT: - return new ConcatLayer<Dtype>(param); - case LayerParameter_LayerType_CONTRASTIVE_LOSS: - return new ContrastiveLossLayer<Dtype>(param); - case LayerParameter_LayerType_CONVOLUTION: - return GetConvolutionLayer<Dtype>(name, param); - case LayerParameter_LayerType_DATA: - return new DataLayer<Dtype>(param); - case LayerParameter_LayerType_DROPOUT: - return new DropoutLayer<Dtype>(param); - case LayerParameter_LayerType_DUMMY_DATA: - return new DummyDataLayer<Dtype>(param); - case LayerParameter_LayerType_EUCLIDEAN_LOSS: - return new EuclideanLossLayer<Dtype>(param); - case LayerParameter_LayerType_ELTWISE: - return new EltwiseLayer<Dtype>(param); - case LayerParameter_LayerType_FLATTEN: - return new FlattenLayer<Dtype>(param); - case LayerParameter_LayerType_HDF5_DATA: - return new HDF5DataLayer<Dtype>(param); - case LayerParameter_LayerType_HDF5_OUTPUT: - return new HDF5OutputLayer<Dtype>(param); - case LayerParameter_LayerType_HINGE_LOSS: - return new HingeLossLayer<Dtype>(param); - case LayerParameter_LayerType_IMAGE_DATA: - return new ImageDataLayer<Dtype>(param); - case LayerParameter_LayerType_IM2COL: - return new Im2colLayer<Dtype>(param); - case LayerParameter_LayerType_INFOGAIN_LOSS: - return new InfogainLossLayer<Dtype>(param); - case LayerParameter_LayerType_INNER_PRODUCT: - return new InnerProductLayer<Dtype>(param); - case LayerParameter_LayerType_LRN: - return new LRNLayer<Dtype>(param); - case LayerParameter_LayerType_MEMORY_DATA: - return new MemoryDataLayer<Dtype>(param); - case LayerParameter_LayerType_MVN: - return new MVNLayer<Dtype>(param); - case LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS: - return new MultinomialLogisticLossLayer<Dtype>(param); - case LayerParameter_LayerType_POOLING: - return GetPoolingLayer<Dtype>(name, param); - case LayerParameter_LayerType_POWER: - return new PowerLayer<Dtype>(param); - case LayerParameter_LayerType_RELU: - return GetReLULayer<Dtype>(name, param); - case LayerParameter_LayerType_SILENCE: - return new SilenceLayer<Dtype>(param); - case LayerParameter_LayerType_SIGMOID: - return GetSigmoidLayer<Dtype>(name, param); - case LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS: - return new SigmoidCrossEntropyLossLayer<Dtype>(param); - case LayerParameter_LayerType_SLICE: - return new SliceLayer<Dtype>(param); - case LayerParameter_LayerType_SOFTMAX: - return GetSoftmaxLayer<Dtype>(name, param); - case LayerParameter_LayerType_SOFTMAX_LOSS: - return new SoftmaxWithLossLayer<Dtype>(param); - case LayerParameter_LayerType_SPLIT: - return new SplitLayer<Dtype>(param); - case LayerParameter_LayerType_TANH: - return GetTanHLayer<Dtype>(name, param); - case LayerParameter_LayerType_WINDOW_DATA: - return new WindowDataLayer<Dtype>(param); - case LayerParameter_LayerType_THRESHOLD: - return new ThresholdLayer<Dtype>(param); - case LayerParameter_LayerType_NONE: - LOG(FATAL) << "Layer " << name << " has unspecified type."; - default: - LOG(FATAL) << "Layer " << name << " has unknown type " << type; + LOG(FATAL) << "Layer " << param.name() << " has unknown engine."; } - // just to suppress old compiler warnings. - return (Layer<Dtype>*)(NULL); } -template Layer<float>* GetLayer(const LayerParameter& param); -template Layer<double>* GetLayer(const LayerParameter& param); +// Layers that have a specific creator function. +REGISTER_LAYER_CREATOR(LayerParameter_LayerType_CONVOLUTION, + GetConvolutionLayer, ConvolutionLayer); +REGISTER_LAYER_CREATOR(LayerParameter_LayerType_POOLING, + GetPoolingLayer, PoolingLayer); +REGISTER_LAYER_CREATOR(LayerParameter_LayerType_RELU, + GetReLULayer, ReLULayer); +REGISTER_LAYER_CREATOR(LayerParameter_LayerType_SIGMOID, + GetSigmoidLayer, SigmoidLayer); +REGISTER_LAYER_CREATOR(LayerParameter_LayerType_SOFTMAX, + GetSoftmaxLayer, SoftmaxLayer); +REGISTER_LAYER_CREATOR(LayerParameter_LayerType_TANH, + GetTanHLayer, TanHLayer); +// Layers that use their constructor as their default creator. +REGISTER_LAYER_CLASS(LayerParameter_LayerType_ACCURACY, AccuracyLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_ABSVAL, AbsValLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_ARGMAX, ArgMaxLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_BNLL, BNLLLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_CONCAT, ConcatLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_CONTRASTIVE_LOSS, + ContrastiveLossLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_DATA, DataLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_DROPOUT, DropoutLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_DUMMY_DATA, DummyDataLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_EUCLIDEAN_LOSS, + EuclideanLossLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_ELTWISE, EltwiseLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_FLATTEN, FlattenLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_HDF5_DATA, HDF5DataLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_HDF5_OUTPUT, HDF5OutputLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_HINGE_LOSS, HingeLossLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_IMAGE_DATA, ImageDataLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_IM2COL, Im2colLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_INFOGAIN_LOSS, InfogainLossLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_INNER_PRODUCT, InnerProductLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_LRN, LRNLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_MEMORY_DATA, MemoryDataLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_MVN, MVNLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS, + MultinomialLogisticLossLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_POWER, PowerLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_SILENCE, SilenceLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS, + SigmoidCrossEntropyLossLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_SLICE, SliceLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_SOFTMAX_LOSS, + SoftmaxWithLossLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_SPLIT, SplitLayer); +REGISTER_LAYER_CLASS(LayerParameter_LayerType_WINDOW_DATA, WindowDataLayer); } // namespace caffe From 076980625023d99f8fa20ac32a2b19c6ae0a1ffb Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq@google.com> Date: Fri, 26 Sep 2014 16:17:04 -0700 Subject: [PATCH 0823/2053] more docs --- include/caffe/layer_factory.hpp | 50 ++++++++++++++++++-- src/caffe/layer_factory.cpp | 84 +++++++++++++++------------------ 2 files changed, 82 insertions(+), 52 deletions(-) diff --git a/include/caffe/layer_factory.hpp b/include/caffe/layer_factory.hpp index 08e3e6d3ad8..a2c4ab56a89 100644 --- a/include/caffe/layer_factory.hpp +++ b/include/caffe/layer_factory.hpp @@ -1,3 +1,41 @@ +// This file defines a layer factory that allows one to register layers. During +// runtime, registered layers could be called by passing a LayerParameter: +// LayerRegistry<Dtype>::CreateLayer(param); +// +// There are two ways to register a layer. Assuming that we have a layer like: +// +// template <typename Dtype> +// class MyAwesomeLayer : public Layer<Dtype> { +// // your implementations +// }; +// +// and its type is defined in the protobuffer as +// +// enum LayerType { +// // other definitions +// AWESOME = 46, +// } +// +// If the layer is going to be created simply by its constructor, in your c++ +// file, add the following line: +// +// REGISTER_LAYER_CLASS(AWESOME, MyAwesomeLayer); +// +// Or, if the layer is going to be created by another creator function, in the +// format of: +// +// template <typename Dtype> +// Layer<Dtype*> GetMyAwesomeLayer(const LayerParameter& param) { +// // your implementation +// } +// +// (for example, when your layer has multiple backends, see GetConvolutionLayer +// for a use case), then you can register the creator function instead, like +// +// REGISTER_LAYER_CREATOR(AWESOME, GetMyAwesomeLayer) +// +// Note that each layer type should only be registered once. + #ifndef CAFFE_LAYER_FACTORY_H_ #define CAFFE_LAYER_FACTORY_H_ @@ -55,9 +93,11 @@ class LayerRegisterer { }; -#define REGISTER_LAYER_CREATOR(type, creator, classname) \ - static LayerRegisterer<float> g_creator_f_##classname(type, creator<float>); \ - static LayerRegisterer<double> g_creator_d_##classname(type, creator<double>) +#define REGISTER_LAYER_CREATOR(type, creator) \ + static LayerRegisterer<float> g_creator_f_##type( \ + LayerParameter_LayerType_##type, creator<float>); \ + static LayerRegisterer<double> g_creator_d_##type( \ + LayerParameter_LayerType_##type, creator<double>) #define REGISTER_LAYER_CLASS(type, clsname) \ template <typename Dtype> \ @@ -65,9 +105,9 @@ class LayerRegisterer { return new clsname<Dtype>(param); \ } \ static LayerRegisterer<float> g_creator_f_##clsname( \ - type, Creator_##clsname<float>); \ + LayerParameter_LayerType_##type, Creator_##clsname<float>); \ static LayerRegisterer<double> g_creator_d_##clsname( \ - type, Creator_##clsname<double>) + LayerParameter_LayerType_##type, Creator_##clsname<double>) // A function to get a specific layer from the specification given in // LayerParameter. Ideally this would be replaced by a factory pattern, diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 79a732b965b..b60b3b6fdb7 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -143,53 +143,43 @@ Layer<Dtype>* GetSoftmaxLayer(const LayerParameter& param) { } // Layers that have a specific creator function. -REGISTER_LAYER_CREATOR(LayerParameter_LayerType_CONVOLUTION, - GetConvolutionLayer, ConvolutionLayer); -REGISTER_LAYER_CREATOR(LayerParameter_LayerType_POOLING, - GetPoolingLayer, PoolingLayer); -REGISTER_LAYER_CREATOR(LayerParameter_LayerType_RELU, - GetReLULayer, ReLULayer); -REGISTER_LAYER_CREATOR(LayerParameter_LayerType_SIGMOID, - GetSigmoidLayer, SigmoidLayer); -REGISTER_LAYER_CREATOR(LayerParameter_LayerType_SOFTMAX, - GetSoftmaxLayer, SoftmaxLayer); -REGISTER_LAYER_CREATOR(LayerParameter_LayerType_TANH, - GetTanHLayer, TanHLayer); +REGISTER_LAYER_CREATOR(CONVOLUTION, GetConvolutionLayer); +REGISTER_LAYER_CREATOR(POOLING, GetPoolingLayer); +REGISTER_LAYER_CREATOR(RELU, GetReLULayer); +REGISTER_LAYER_CREATOR(SIGMOID, GetSigmoidLayer); +REGISTER_LAYER_CREATOR(SOFTMAX, GetSoftmaxLayer); +REGISTER_LAYER_CREATOR(TANH, GetTanHLayer); + // Layers that use their constructor as their default creator. -REGISTER_LAYER_CLASS(LayerParameter_LayerType_ACCURACY, AccuracyLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_ABSVAL, AbsValLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_ARGMAX, ArgMaxLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_BNLL, BNLLLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_CONCAT, ConcatLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_CONTRASTIVE_LOSS, - ContrastiveLossLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_DATA, DataLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_DROPOUT, DropoutLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_DUMMY_DATA, DummyDataLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_EUCLIDEAN_LOSS, - EuclideanLossLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_ELTWISE, EltwiseLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_FLATTEN, FlattenLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_HDF5_DATA, HDF5DataLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_HDF5_OUTPUT, HDF5OutputLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_HINGE_LOSS, HingeLossLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_IMAGE_DATA, ImageDataLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_IM2COL, Im2colLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_INFOGAIN_LOSS, InfogainLossLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_INNER_PRODUCT, InnerProductLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_LRN, LRNLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_MEMORY_DATA, MemoryDataLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_MVN, MVNLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS, - MultinomialLogisticLossLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_POWER, PowerLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_SILENCE, SilenceLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS, - SigmoidCrossEntropyLossLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_SLICE, SliceLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_SOFTMAX_LOSS, - SoftmaxWithLossLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_SPLIT, SplitLayer); -REGISTER_LAYER_CLASS(LayerParameter_LayerType_WINDOW_DATA, WindowDataLayer); +REGISTER_LAYER_CLASS(ACCURACY, AccuracyLayer); +REGISTER_LAYER_CLASS(ABSVAL, AbsValLayer); +REGISTER_LAYER_CLASS(ARGMAX, ArgMaxLayer); +REGISTER_LAYER_CLASS(BNLL, BNLLLayer); +REGISTER_LAYER_CLASS(CONCAT, ConcatLayer); +REGISTER_LAYER_CLASS(CONTRASTIVE_LOSS, ContrastiveLossLayer); +REGISTER_LAYER_CLASS(DATA, DataLayer); +REGISTER_LAYER_CLASS(DROPOUT, DropoutLayer); +REGISTER_LAYER_CLASS(DUMMY_DATA, DummyDataLayer); +REGISTER_LAYER_CLASS(EUCLIDEAN_LOSS, EuclideanLossLayer); +REGISTER_LAYER_CLASS(ELTWISE, EltwiseLayer); +REGISTER_LAYER_CLASS(FLATTEN, FlattenLayer); +REGISTER_LAYER_CLASS(HDF5_DATA, HDF5DataLayer); +REGISTER_LAYER_CLASS(HDF5_OUTPUT, HDF5OutputLayer); +REGISTER_LAYER_CLASS(HINGE_LOSS, HingeLossLayer); +REGISTER_LAYER_CLASS(IMAGE_DATA, ImageDataLayer); +REGISTER_LAYER_CLASS(IM2COL, Im2colLayer); +REGISTER_LAYER_CLASS(INFOGAIN_LOSS, InfogainLossLayer); +REGISTER_LAYER_CLASS(INNER_PRODUCT, InnerProductLayer); +REGISTER_LAYER_CLASS(LRN, LRNLayer); +REGISTER_LAYER_CLASS(MEMORY_DATA, MemoryDataLayer); +REGISTER_LAYER_CLASS(MVN, MVNLayer); +REGISTER_LAYER_CLASS(MULTINOMIAL_LOGISTIC_LOSS, MultinomialLogisticLossLayer); +REGISTER_LAYER_CLASS(POWER, PowerLayer); +REGISTER_LAYER_CLASS(SILENCE, SilenceLayer); +REGISTER_LAYER_CLASS(SIGMOID_CROSS_ENTROPY_LOSS, SigmoidCrossEntropyLossLayer); +REGISTER_LAYER_CLASS(SLICE, SliceLayer); +REGISTER_LAYER_CLASS(SOFTMAX_LOSS, SoftmaxWithLossLayer); +REGISTER_LAYER_CLASS(SPLIT, SplitLayer); +REGISTER_LAYER_CLASS(WINDOW_DATA, WindowDataLayer); } // namespace caffe From 6f15c7a8b6acbc239a9fbf8104d56d9a7301c8f5 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sat, 27 Sep 2014 12:06:10 -0700 Subject: [PATCH 0824/2053] Pre-lunch fun: add a dynamic library guard test. --- Makefile | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 243650b2ad1..72fca4655b6 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,3 @@ -# The makefile for caffe. Pretty hacky. PROJECT := caffe CONFIG_FILE := Makefile.config @@ -17,9 +16,9 @@ else OTHER_BUILD_DIR := $(DEBUG_BUILD_DIR) endif -# The target shared library and static library name +# The target shared library name LIB_BUILD_DIR := $(BUILD_DIR)/lib -NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so +LIBRARY_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so ############################## # Get all source files @@ -127,7 +126,10 @@ TEST_CU_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ TEST_CXX_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ $(foreach obj,$(TEST_CXX_OBJS),$(basename $(notdir $(obj)))))) TEST_BINS := $(TEST_CXX_BINS) $(TEST_CU_BINS) +# TEST_ALL_BIN is the test binary that links caffe source objects directly. TEST_ALL_BIN := $(TEST_BIN_DIR)/test_all.testbin +# TEST_ALL_DYNINK_BIN is the test binary that links caffe as a dynamic library. +TEST_ALL_DYNLINK_BIN := $(TEST_BIN_DIR)/test_all_dynamic_link.testbin ############################## # Derive compiler warning dump locations @@ -308,6 +310,8 @@ endif INCLUDE_DIRS += $(BLAS_INCLUDE) LIBRARY_DIRS += $(BLAS_LIB) +LIBRARY_DIRS += $(LIB_BUILD_DIR) + # Complete build flags. COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir)) CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) @@ -337,7 +341,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo py mat py$(PROJECT) mat$(PROJECT) proto runtest \ superclean supercleanlist supercleanfiles warn everything -all: $(NAME) tools examples +all: $(LIBRARY_NAME) tools examples everything: all py$(PROJECT) mat$(PROJECT) test warn lint runtest @@ -376,7 +380,7 @@ $(LINT_OUTPUTS): $(LINT_OUTPUT_DIR)/%.lint.txt : % $(LINT_SCRIPT) | $(LINT_OUTPU > $@ \ || true -test: $(TEST_ALL_BIN) $(TEST_BINS) +test: $(TEST_ALL_BIN) $(TEST_ALL_DYNLINK_BIN) $(TEST_BINS) tools: $(TOOL_BINS) $(TOOL_BIN_LINKS) @@ -407,8 +411,9 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(OBJS) CXXLIBS="\$$CXXLIBS $(OBJS) $(LDFLAGS)" -output $@ @ echo -runtest: $(TEST_ALL_BIN) - $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) +runtest: $(TEST_ALL_BIN) $(TEST_ALL_DYNLINK_BIN) + $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) && \ + $(TEST_ALL_DYNLINK_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) warn: $(EMPTY_WARN_REPORT) @@ -442,7 +447,7 @@ $(BUILD_DIR)/.linked: $(ALL_BUILD_DIRS): | $(BUILD_DIR_LINK) @ mkdir -p $@ -$(NAME): $(OBJS) | $(LIB_BUILD_DIR) +$(LIBRARY_NAME): $(OBJS) | $(LIB_BUILD_DIR) $(CXX) -shared -o $@ $(OBJS) $(LINKFLAGS) $(LDFLAGS) @ echo @@ -466,6 +471,13 @@ $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(OBJS) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo +$(TEST_ALL_DYNLINK_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(LIBRARY_NAME) \ + | $(TEST_BIN_DIR) + $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) \ + -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(PROJECT) -Wl,-rpath,$(LIB_BUILD_DIR) + @ echo + + $(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.cuo $(GTEST_OBJ) $(OBJS) \ | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(OBJS) \ @@ -606,6 +618,6 @@ $(DISTRIBUTE_DIR): all py $(HXX_SRCS) | $(DISTRIBUTE_SUBDIRS) cp $(TOOL_BINS) $(DISTRIBUTE_DIR)/bin cp $(EXAMPLE_BINS) $(DISTRIBUTE_DIR)/bin # add libraries - cp $(NAME) $(DISTRIBUTE_DIR)/lib + cp $(LIBRARY_NAME) $(DISTRIBUTE_DIR)/lib # add python - it's not the standard way, indeed... cp -r python $(DISTRIBUTE_DIR)/python From f0fdb8cf7432cf11d10f9bfce7e03e45cff9b1cf Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sat, 27 Sep 2014 13:17:33 -0700 Subject: [PATCH 0825/2053] Add back static library. Using -Wl,--whole-archive will allow us to preserve all symbols. --- Makefile | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 72fca4655b6..ad87e9b4ca2 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,9 @@ endif # The target shared library name LIB_BUILD_DIR := $(BUILD_DIR)/lib -LIBRARY_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so +STATIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).a +DYNAMIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so +STATIC_LINK_COMMAND := -Wl,--whole-archive $(STATIC_NAME) -Wl,--no-whole-archive ############################## # Get all source files @@ -126,7 +128,7 @@ TEST_CU_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ TEST_CXX_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ $(foreach obj,$(TEST_CXX_OBJS),$(basename $(notdir $(obj)))))) TEST_BINS := $(TEST_CXX_BINS) $(TEST_CU_BINS) -# TEST_ALL_BIN is the test binary that links caffe source objects directly. +# TEST_ALL_BIN is the test binary that links caffe statically. TEST_ALL_BIN := $(TEST_BIN_DIR)/test_all.testbin # TEST_ALL_DYNINK_BIN is the test binary that links caffe as a dynamic library. TEST_ALL_DYNLINK_BIN := $(TEST_BIN_DIR)/test_all_dynamic_link.testbin @@ -341,7 +343,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo py mat py$(PROJECT) mat$(PROJECT) proto runtest \ superclean supercleanlist supercleanfiles warn everything -all: $(LIBRARY_NAME) tools examples +all: $(STATIC_NAME) $(DYNAMIC_NAME) tools examples everything: all py$(PROJECT) mat$(PROJECT) test warn lint runtest @@ -390,16 +392,16 @@ py$(PROJECT): py py: $(PY$(PROJECT)_SO) $(PROTO_GEN_PY) -$(PY$(PROJECT)_SO): $(OBJS) $(PY$(PROJECT)_SRC) $(PY$(PROJECT)_HXX_SRC) +$(PY$(PROJECT)_SO): $(STATIC_NAME) $(PY$(PROJECT)_SRC) $(PY$(PROJECT)_HXX_SRC) $(CXX) -shared -o $@ $(PY$(PROJECT)_SRC) \ - $(OBJS) $(LINKFLAGS) $(PYTHON_LDFLAGS) + $(STATIC_LINK_COMMAND) $(LINKFLAGS) $(PYTHON_LDFLAGS) @ echo mat$(PROJECT): mat mat: $(MAT$(PROJECT)_SO) -$(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(OBJS) +$(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) @ if [ -z "$(MATLAB_DIR)" ]; then \ echo "MATLAB_DIR must be specified in $(CONFIG_FILE)" \ "to build mat$(PROJECT)."; \ @@ -408,7 +410,7 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(OBJS) $(MATLAB_DIR)/bin/mex $(MAT$(PROJECT)_SRC) \ CXX="$(CXX)" \ CXXFLAGS="\$$CXXFLAGS $(MATLAB_CXXFLAGS)" \ - CXXLIBS="\$$CXXLIBS $(OBJS) $(LDFLAGS)" -output $@ + CXXLIBS="\$$CXXLIBS $(STATIC_LINK_COMMAND) $(LDFLAGS)" -output $@ @ echo runtest: $(TEST_ALL_BIN) $(TEST_ALL_DYNLINK_BIN) @@ -447,10 +449,14 @@ $(BUILD_DIR)/.linked: $(ALL_BUILD_DIRS): | $(BUILD_DIR_LINK) @ mkdir -p $@ -$(LIBRARY_NAME): $(OBJS) | $(LIB_BUILD_DIR) +$(DYNAMIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) $(CXX) -shared -o $@ $(OBJS) $(LINKFLAGS) $(LDFLAGS) @ echo +$(STATIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) + ar rcs $@ $(OBJS) + @ echo + $(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HXX_SRCS) \ | $(TEST_BUILD_DIR) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ @@ -465,28 +471,28 @@ $(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HXX_SRCS) \ @ cat $@.$(WARNS_EXT) @ echo -$(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(OBJS) \ +$(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) - $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(OBJS) \ + $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo -$(TEST_ALL_DYNLINK_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(LIBRARY_NAME) \ +$(TEST_ALL_DYNLINK_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(DYNAMIC_NAME) \ | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) \ -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(PROJECT) -Wl,-rpath,$(LIB_BUILD_DIR) @ echo -$(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.cuo $(GTEST_OBJ) $(OBJS) \ +$(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.cuo $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) - $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(OBJS) \ + $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo -$(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) $(OBJS) \ +$(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) - $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(OBJS) \ + $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo @@ -495,12 +501,12 @@ $(TOOL_BUILD_DIR)/%: $(TOOL_BUILD_DIR)/%.bin | $(TOOL_BUILD_DIR) @ $(RM) $@ @ ln -s $(abspath $<) $@ -$(TOOL_BINS): %.bin : %.o $(OBJS) - $(CXX) $< $(OBJS) -o $@ $(LINKFLAGS) $(LDFLAGS) +$(TOOL_BINS): %.bin : %.o $(STATIC_NAME) + $(CXX) $< $(STATIC_LINK_COMMAND) -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo -$(EXAMPLE_BINS): %.bin : %.o $(OBJS) - $(CXX) $< $(OBJS) -o $@ $(LINKFLAGS) $(LDFLAGS) +$(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) + $(CXX) $< $(STATIC_LINK_COMMAND) -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo $(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \ @@ -618,6 +624,7 @@ $(DISTRIBUTE_DIR): all py $(HXX_SRCS) | $(DISTRIBUTE_SUBDIRS) cp $(TOOL_BINS) $(DISTRIBUTE_DIR)/bin cp $(EXAMPLE_BINS) $(DISTRIBUTE_DIR)/bin # add libraries - cp $(LIBRARY_NAME) $(DISTRIBUTE_DIR)/lib + cp $(STATIC_NAME) $(DISTRIBUTE_DIR)/lib + cp $(DYNAMIC_NAME) $(DISTRIBUTE_DIR)/lib # add python - it's not the standard way, indeed... cp -r python $(DISTRIBUTE_DIR)/python From 319a95f06a469de1c6bf4ebcd4cf5ff17c6126fc Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sat, 27 Sep 2014 13:18:27 -0700 Subject: [PATCH 0826/2053] Mute factory registration message --- include/caffe/layer_factory.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/caffe/layer_factory.hpp b/include/caffe/layer_factory.hpp index a2c4ab56a89..24b427643d5 100644 --- a/include/caffe/layer_factory.hpp +++ b/include/caffe/layer_factory.hpp @@ -87,7 +87,7 @@ class LayerRegisterer { public: LayerRegisterer(const LayerParameter_LayerType& type, Layer<Dtype>* (*creator)(const LayerParameter&)) { - LOG(INFO) << "Registering layer type: " << type; + // LOG(INFO) << "Registering layer type: " << type; LayerRegistry<Dtype>::AddCreator(type, creator); } }; @@ -105,7 +105,7 @@ class LayerRegisterer { return new clsname<Dtype>(param); \ } \ static LayerRegisterer<float> g_creator_f_##clsname( \ - LayerParameter_LayerType_##type, Creator_##clsname<float>); \ + LayerParameter_LayerType_##type, Creator_##clsname<float>); \ static LayerRegisterer<double> g_creator_d_##clsname( \ LayerParameter_LayerType_##type, Creator_##clsname<double>) From c9fb1f4a0ae92593b4e82983285921037f1db823 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sun, 28 Sep 2014 00:11:05 -0700 Subject: [PATCH 0827/2053] cmake. --- python/CMakeLists.txt | 3 ++- src/caffe/test/CMakeLists.txt | 10 ++++++---- tools/CMakeLists.txt | 4 +++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 8642c39367a..5024dbfea5d 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -10,6 +10,7 @@ include_directories(${Boost_INCLUDE_DIRS}) file(GLOB_RECURSE Python_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +set(CAFFE_WHOLE_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive) add_library(pycaffe SHARED ${Python_SOURCES}) target_link_libraries(pycaffe caffe ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}) @@ -17,4 +18,4 @@ target_link_libraries(pycaffe caffe ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}) install(DIRECTORY caffe DESTINATION python) install(FILES requirements.txt DESTINATION python) -install(TARGETS pycaffe DESTINATION python/caffe) \ No newline at end of file +install(TARGETS pycaffe DESTINATION python/caffe) diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index 20a1d084d6a..7b308bff168 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -47,7 +47,9 @@ include_directories( # Remove main from test sources and prepare an Object lib with main file(GLOB TEST_MAIN ${TEST_MAIN}) list(REMOVE_ITEM TEST_CPP_SOURCES ${TEST_MAIN}) -add_library(main_obj EXCLUDE_FROM_ALL OBJECT ${TEST_MAIN} ../common.cpp) +add_library(main_obj EXCLUDE_FROM_ALL OBJECT ${TEST_MAIN}) + +set(CAFFE_WHOLE_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive) # Build each test separately from *.cpp files foreach(source ${TEST_CPP_SOURCES}) @@ -58,7 +60,7 @@ foreach(source ${TEST_CPP_SOURCES}) set(TEST_OBJ_LIB $<TARGET_OBJECTS:${TEST_NAME}.obj>) add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_OBJ_LIB} $<TARGET_OBJECTS:main_obj>) - target_link_libraries(${TEST_NAME} gtest caffe) + target_link_libraries(${TEST_NAME} gtest ${CAFFE_WHOLE_LINK}) # output dir set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) @@ -75,7 +77,7 @@ foreach(source ${TEST_CU_SOURCES}) cuda_add_library(${TEST_NAME}.lib EXCLUDE_FROM_ALL ${source}) add_executable(${TEST_NAME} EXCLUDE_FROM_ALL $<TARGET_OBJECTS:main_obj>) - target_link_libraries(${TEST_NAME} ${TEST_NAME}.lib gtest caffe) + target_link_libraries(${TEST_NAME} ${TEST_NAME}.lib gtest ${CAFFE_WHOLE_LINK}) # output dir set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) @@ -90,7 +92,7 @@ add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_OBJ_LIBS} $<TARGET_OBJECTS:ma if(NOT CPU_ONLY) target_link_libraries(${ALL_TEST} ${TEST_CU_LIBS}) endif() -target_link_libraries(${ALL_TEST} gtest caffe) +target_link_libraries(${ALL_TEST} gtest ${CAFFE_WHOLE_LINK}) add_dependencies(${ALL_TEST} ${TEST_TARGETS}) # Output directory diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 0da19fbadc8..118443a86a0 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -3,12 +3,14 @@ project( Tools ) # Find all source files file(GLOB_RECURSE TOOLS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +set (CAFFE_WHOLE_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive) + # Build each source file independently foreach(source ${TOOLS_SOURCES}) get_filename_component(name ${source} NAME_WE) add_executable(${name}.bin ${source}) set_target_properties(${name}.bin PROPERTIES OUTPUT_NAME ${name}) - target_link_libraries(${name}.bin caffe) + target_link_libraries(${name}.bin ${CAFFE_WHOLE_LINK}) ### Install ################################################################################# From 20b79f69a1dd9291fd1a8b0b1c7389d426b2cb4b Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sun, 28 Sep 2014 15:46:03 -0700 Subject: [PATCH 0828/2053] consolidate duplicate code --- include/caffe/layer_factory.hpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/include/caffe/layer_factory.hpp b/include/caffe/layer_factory.hpp index 24b427643d5..5f44d97ca27 100644 --- a/include/caffe/layer_factory.hpp +++ b/include/caffe/layer_factory.hpp @@ -104,10 +104,7 @@ class LayerRegisterer { Layer<Dtype>* Creator_##clsname(const LayerParameter& param) { \ return new clsname<Dtype>(param); \ } \ - static LayerRegisterer<float> g_creator_f_##clsname( \ - LayerParameter_LayerType_##type, Creator_##clsname<float>); \ - static LayerRegisterer<double> g_creator_d_##clsname( \ - LayerParameter_LayerType_##type, Creator_##clsname<double>) + REGISTER_LAYER_CREATOR(type, Creator_##clsname) // A function to get a specific layer from the specification given in // LayerParameter. Ideally this would be replaced by a factory pattern, From 1dacdd819544bd491a1c7e00349ea1acae5bc66c Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sun, 28 Sep 2014 16:04:53 -0700 Subject: [PATCH 0829/2053] add long-ignored threshold layer --- src/caffe/layer_factory.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index b60b3b6fdb7..d0bbd3f27d4 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -180,6 +180,7 @@ REGISTER_LAYER_CLASS(SIGMOID_CROSS_ENTROPY_LOSS, SigmoidCrossEntropyLossLayer); REGISTER_LAYER_CLASS(SLICE, SliceLayer); REGISTER_LAYER_CLASS(SOFTMAX_LOSS, SoftmaxWithLossLayer); REGISTER_LAYER_CLASS(SPLIT, SplitLayer); +REGISTER_LAYER_CLASS(THRESHOLD, ThresholdLayer); REGISTER_LAYER_CLASS(WINDOW_DATA, WindowDataLayer); } // namespace caffe From 57a7ae1d539ffdbf30ca13f6ab0d4214f8f2aa2d Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sun, 28 Sep 2014 18:11:35 -0700 Subject: [PATCH 0830/2053] add explicit declaration - does that help the flakyness? --- src/caffe/layer_factory.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index d0bbd3f27d4..f37d10511ee 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -7,6 +7,11 @@ namespace caffe { +template <> +LayerRegistry<float>::CreatorRegistry LayerRegistry<float>::registry_; +template <> +LayerRegistry<double>::CreatorRegistry LayerRegistry<double>::registry_; + // GetLayer() defines the overall layer factory. The Get*Layer() functions // define factories for layers with multiple computational engines. From 4d54cade5a6d7aca4e98eeb20984aa9925509a76 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sun, 28 Sep 2014 19:16:01 -0700 Subject: [PATCH 0831/2053] static initialization order fiasco --- include/caffe/layer_factory.hpp | 19 +++++++++++-------- src/caffe/layer_factory.cpp | 5 ----- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/include/caffe/layer_factory.hpp b/include/caffe/layer_factory.hpp index 5f44d97ca27..dd896453f41 100644 --- a/include/caffe/layer_factory.hpp +++ b/include/caffe/layer_factory.hpp @@ -55,32 +55,35 @@ class LayerRegistry { typedef Layer<Dtype>* (*Creator)(const LayerParameter&); typedef std::map<LayerParameter_LayerType, Creator> CreatorRegistry; + static CreatorRegistry& Registry() { + static CreatorRegistry* g_registry_ = new CreatorRegistry(); + return *g_registry_; + } + // Adds a creator. static void AddCreator(const LayerParameter_LayerType& type, Creator creator) { - CHECK_EQ(registry_.count(type), 0) + CreatorRegistry& registry = Registry(); + CHECK_EQ(registry.count(type), 0) << "Layer type " << type << " already registered."; - registry_[type] = creator; + registry[type] = creator; } // Get a layer using a LayerParameter. static Layer<Dtype>* CreateLayer(const LayerParameter& param) { LOG(INFO) << "Creating layer " << param.name(); const LayerParameter_LayerType& type = param.type(); - CHECK_EQ(registry_.count(type), 1); - return registry_[type](param); + CreatorRegistry& registry = Registry(); + CHECK_EQ(registry.count(type), 1); + return registry[type](param); } private: // Layer registry should never be instantiated - everything is done with its // static variables. LayerRegistry() {} - static CreatorRegistry registry_; }; -// Static variables for the templated layer factory registry. -template <typename Dtype> -typename LayerRegistry<Dtype>::CreatorRegistry LayerRegistry<Dtype>::registry_; template <typename Dtype> class LayerRegisterer { diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index f37d10511ee..d0bbd3f27d4 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -7,11 +7,6 @@ namespace caffe { -template <> -LayerRegistry<float>::CreatorRegistry LayerRegistry<float>::registry_; -template <> -LayerRegistry<double>::CreatorRegistry LayerRegistry<double>::registry_; - // GetLayer() defines the overall layer factory. The Get*Layer() functions // define factories for layers with multiple computational engines. From c68f9ce858c98e94dc0aa18f07bb838af18192a0 Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Mon, 29 Sep 2014 02:55:22 -0700 Subject: [PATCH 0832/2053] [examples] adding class names and deploy version of Flickr Style net --- .../finetune_flickr_style/style_names.txt | 20 ++ models/finetune_flickr_style/deploy.prototxt | 310 ++++++++++++++++++ 2 files changed, 330 insertions(+) create mode 100644 examples/finetune_flickr_style/style_names.txt create mode 100644 models/finetune_flickr_style/deploy.prototxt diff --git a/examples/finetune_flickr_style/style_names.txt b/examples/finetune_flickr_style/style_names.txt new file mode 100644 index 00000000000..73090c97821 --- /dev/null +++ b/examples/finetune_flickr_style/style_names.txt @@ -0,0 +1,20 @@ +Detailed +Pastel +Melancholy +Noir +HDR +Vintage +Long Exposure +Horror +Sunny +Bright +Hazy +Bokeh +Serene +Texture +Ethereal +Macro +Depth of Field +Geometric Composition +Minimal +Romantic diff --git a/models/finetune_flickr_style/deploy.prototxt b/models/finetune_flickr_style/deploy.prototxt new file mode 100644 index 00000000000..aa2ad961874 --- /dev/null +++ b/models/finetune_flickr_style/deploy.prototxt @@ -0,0 +1,310 @@ +name: "FlickrStyleCaffeNet" +input: "data" +input_dim: 10 +input_dim: 3 +input_dim: 227 +input_dim: 227 +layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 11 + stride: 4 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "relu1" + type: RELU + bottom: "conv1" + top: "conv1" +} +layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "norm1" + type: LRN + bottom: "pool1" + top: "norm1" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + name: "conv2" + type: CONVOLUTION + bottom: "norm1" + top: "conv2" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + pad: 2 + kernel_size: 5 + group: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu2" + type: RELU + bottom: "conv2" + top: "conv2" +} +layers { + name: "pool2" + type: POOLING + bottom: "conv2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "norm2" + type: LRN + bottom: "pool2" + top: "norm2" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + name: "conv3" + type: CONVOLUTION + bottom: "norm2" + top: "conv3" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "relu3" + type: RELU + bottom: "conv3" + top: "conv3" +} +layers { + name: "conv4" + type: CONVOLUTION + bottom: "conv3" + top: "conv4" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + group: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu4" + type: RELU + bottom: "conv4" + top: "conv4" +} +layers { + name: "conv5" + type: CONVOLUTION + bottom: "conv4" + top: "conv5" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + group: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu5" + type: RELU + bottom: "conv5" + top: "conv5" +} +layers { + name: "pool5" + type: POOLING + bottom: "conv5" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "fc6" + type: INNER_PRODUCT + bottom: "pool5" + top: "fc6" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 4096 + weight_filler { + type: "gaussian" + std: 0.005 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu6" + type: RELU + bottom: "fc6" + top: "fc6" +} +layers { + name: "drop6" + type: DROPOUT + bottom: "fc6" + top: "fc6" + dropout_param { + dropout_ratio: 0.5 + } +} +layers { + name: "fc7" + type: INNER_PRODUCT + bottom: "fc6" + top: "fc7" + # Note that blobs_lr can be set to 0 to disable any fine-tuning of this, and any other, layer + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 4096 + weight_filler { + type: "gaussian" + std: 0.005 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu7" + type: RELU + bottom: "fc7" + top: "fc7" +} +layers { + name: "drop7" + type: DROPOUT + bottom: "fc7" + top: "fc7" + dropout_param { + dropout_ratio: 0.5 + } +} +layers { + name: "fc8_flickr" + type: INNER_PRODUCT + bottom: "fc7" + top: "fc8_flickr" + # blobs_lr is set to higher than for other layers, because this layer is starting from random while the others are already trained + blobs_lr: 10 + blobs_lr: 20 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 20 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "prob" + type: SOFTMAX + bottom: "fc8_flickr" + top: "prob" +} From db67d52dcc3567ce636e472fa4554ce43878c84c Mon Sep 17 00:00:00 2001 From: Dmytro Mishkin <ducha.aiki@gmail.com> Date: Mon, 29 Sep 2014 16:10:04 +0300 Subject: [PATCH 0833/2053] Changed linking order: -pthread -> back. Otherwise error: /usr/bin/ld: /usr/local/lib/libgflags.a(gflags.cc.o): undefined reference to symbol 'pthread_rwlock_wrlock@@GLIBC_2.2.5' /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status --- Makefile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 5020b4109d6..929f8d5cea6 100644 --- a/Makefile +++ b/Makefile @@ -165,12 +165,11 @@ ifneq ($(CPU_ONLY), 1) LIBRARY_DIRS += $(CUDA_LIB_DIR) LIBRARIES := cudart cublas curand endif -LIBRARIES += pthread \ - glog gflags protobuf leveldb snappy \ +LIBRARIES += glog gflags protobuf leveldb snappy \ lmdb \ boost_system \ hdf5_hl hdf5 \ - opencv_core opencv_highgui opencv_imgproc + opencv_core opencv_highgui opencv_imgproc pthread PYTHON_LIBRARIES := boost_python python2.7 WARNINGS := -Wall -Wno-sign-compare From f13461801c8912bf2029367554d229f77020bef7 Mon Sep 17 00:00:00 2001 From: Alireza Shafaei <alireza@shafaei.net> Date: Mon, 29 Sep 2014 20:24:00 -0700 Subject: [PATCH 0834/2053] Fixed some errors in layer_factory and cudnn_pooling --- src/caffe/layer_factory.cpp | 2 +- src/caffe/layers/cudnn_pooling_layer.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 566162911ef..539ef84d03e 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -55,7 +55,7 @@ PoolingLayer<Dtype>* GetPoolingLayer(const string& name, if (p_param.pad_h() || p_param.pad_w() || param.top_size() > 1) { LOG(INFO) << "CUDNN does not support padding or multiple tops. " << "Using Caffe's own pooling layer."; - return new PoolingLayer<DType>(param); + return new PoolingLayer<Dtype>(param); } return new CuDNNPoolingLayer<Dtype>(param); #endif diff --git a/src/caffe/layers/cudnn_pooling_layer.cpp b/src/caffe/layers/cudnn_pooling_layer.cpp index b61ed2a7ede..4d7573c7f12 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cpp +++ b/src/caffe/layers/cudnn_pooling_layer.cpp @@ -14,8 +14,8 @@ void CuDNNPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { PoolingLayer<Dtype>::LayerSetUp(bottom, top); // Sanity check: CUDNN currently only supports pad=0 and top.size()=1 cases. - CHECK_EQ(pad_h_, 0); - CHECK_EQ(pad_w_, 0); + CHECK_EQ(this->pad_h_, 0); + CHECK_EQ(this->pad_w_, 0); CHECK_EQ(top.size(), 1); CUDNN_CHECK(cudnnCreate(&handle_)); cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); From c5e404dc2988532906b08eb90b226be91b778ac0 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 29 Sep 2014 21:20:37 -0700 Subject: [PATCH 0835/2053] use method overrides for CuDNNPoolingLayer top blob checking --- include/caffe/vision_layers.hpp | 3 +++ src/caffe/layers/cudnn_pooling_layer.cpp | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index a3c8bc0a31f..58ac5344da4 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -338,6 +338,9 @@ class CuDNNPoolingLayer : public PoolingLayer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual ~CuDNNPoolingLayer(); + // Currently, cuDNN does not support the extra top blob. + virtual inline int MinTopBlobs() const { return -1; } + virtual inline int ExactNumTopBlobs() const { return 1; } protected: virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, diff --git a/src/caffe/layers/cudnn_pooling_layer.cpp b/src/caffe/layers/cudnn_pooling_layer.cpp index 4d7573c7f12..fc0222ac0e3 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cpp +++ b/src/caffe/layers/cudnn_pooling_layer.cpp @@ -13,10 +13,9 @@ template <typename Dtype> void CuDNNPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { PoolingLayer<Dtype>::LayerSetUp(bottom, top); - // Sanity check: CUDNN currently only supports pad=0 and top.size()=1 cases. + // Sanity check: CUDNN currently only supports pad == 0. CHECK_EQ(this->pad_h_, 0); CHECK_EQ(this->pad_w_, 0); - CHECK_EQ(top.size(), 1); CUDNN_CHECK(cudnnCreate(&handle_)); cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); cudnn::createTensor4dDesc<Dtype>(&top_desc_); From 618b92934b4d1449c10b6611c87d56be9a4d75d2 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 29 Sep 2014 21:21:03 -0700 Subject: [PATCH 0836/2053] cuDNN pooling layer tests know that nonzero padding is not supported After #1172, some cuDNN pooling layer tests were failing due to use of padding. (Before #1172, these tests were actually testing PoolingLayer instead of CuDNNPoolingLayer via the fallback.) This commit disables many tests via commenting, so that they can be easily readded when cuDNN gains pooling padding support. --- src/caffe/test/test_pooling_layer.cpp | 35 +++++++++++++++++---------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index e2980331dc0..f52073c4e6f 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -962,6 +962,9 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestSetupCuDNN) { EXPECT_EQ(this->blob_top_->width(), 2); } +// This test and all following cuDNN pooling tests with padding are commented +// for now, since cuDNN pooling does not currently support padding. +/* TYPED_TEST(CuDNNPoolingLayerTest, TestSetupPaddedCuDNN) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; @@ -977,6 +980,7 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestSetupPaddedCuDNN) { EXPECT_EQ(this->blob_top_->height(), 4); EXPECT_EQ(this->blob_top_->width(), 3); } +*/ /* TYPED_TEST(CuDNNPoolingLayerTest, PrintBackwardCuDNN) { @@ -1012,6 +1016,9 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestForwardMaxCuDNN) { this->TestForwardRectWide(); } +// Currently, cuDNN does not support a top mask, so we comment this and +// the corresponding backward test. +/* TYPED_TEST(CuDNNPoolingLayerTest, TestForwardMaxTopMaskCuDNN) { Caffe::set_mode(Caffe::GPU); this->blob_top_vec_.push_back(this->blob_top_mask_); @@ -1019,6 +1026,7 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestForwardMaxTopMaskCuDNN) { this->TestForwardRectHigh(); this->TestForwardRectWide(); } +*/ TYPED_TEST(CuDNNPoolingLayerTest, TestGradientMaxCuDNN) { Caffe::set_mode(Caffe::GPU); @@ -1029,7 +1037,8 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestGradientMaxCuDNN) { pooling_param->set_kernel_h(kernel_h); pooling_param->set_kernel_w(kernel_w); pooling_param->set_stride(2); - pooling_param->set_pad(1); + // currenty, cuDNN pooling does not support padding + pooling_param->set_pad(0); pooling_param->set_pool(PoolingParameter_PoolMethod_MAX); CuDNNPoolingLayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-4, 1e-2); @@ -1039,6 +1048,7 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestGradientMaxCuDNN) { } } +/* TYPED_TEST(CuDNNPoolingLayerTest, TestForwardMaxPaddedCuDNN) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; @@ -1083,7 +1093,9 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestForwardMaxPaddedCuDNN) { EXPECT_NEAR(this->blob_top_->cpu_data()[7], 4, epsilon); EXPECT_NEAR(this->blob_top_->cpu_data()[8], 1, epsilon); } +*/ +/* TYPED_TEST(CuDNNPoolingLayerTest, TestGradientMaxTopMaskCuDNN) { Caffe::set_mode(Caffe::GPU); for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { @@ -1103,6 +1115,7 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestGradientMaxTopMaskCuDNN) { } } } +*/ TYPED_TEST(CuDNNPoolingLayerTest, TestForwardAveCuDNN) { Caffe::set_mode(Caffe::GPU); @@ -1110,7 +1123,9 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestForwardAveCuDNN) { PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); pooling_param->set_kernel_size(3); pooling_param->set_stride(1); - pooling_param->set_pad(1); + // Currently, cuDNN pooling does not support padding, so we use + // a simplified version of this test. + pooling_param->set_pad(0); pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); this->blob_bottom_->Reshape(1, 1, 3, 3); FillerParameter filler_param; @@ -1121,19 +1136,11 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestForwardAveCuDNN) { layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); EXPECT_EQ(this->blob_top_->num(), 1); EXPECT_EQ(this->blob_top_->channels(), 1); - EXPECT_EQ(this->blob_top_->height(), 3); - EXPECT_EQ(this->blob_top_->width(), 3); + EXPECT_EQ(this->blob_top_->height(), 1); + EXPECT_EQ(this->blob_top_->width(), 1); layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); TypeParam epsilon = 1e-5; - EXPECT_NEAR(this->blob_top_->cpu_data()[0], 8.0 / 9, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[1], 4.0 / 3, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[2], 8.0 / 9, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[3], 4.0 / 3, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[4], 2.0 , epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[5], 4.0 / 3, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[6], 8.0 / 9, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[7], 4.0 / 3, epsilon); - EXPECT_NEAR(this->blob_top_->cpu_data()[8], 8.0 / 9, epsilon); + EXPECT_NEAR(this->blob_top_->cpu_data()[0], 2.0, epsilon); } TYPED_TEST(CuDNNPoolingLayerTest, TestGradientAveCuDNN) { @@ -1154,6 +1161,7 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestGradientAveCuDNN) { } } +/* TYPED_TEST(CuDNNPoolingLayerTest, TestGradientAvePaddedCuDNN) { Caffe::set_mode(Caffe::GPU); for (int kernel_h = 3; kernel_h <= 4; kernel_h++) { @@ -1172,6 +1180,7 @@ TYPED_TEST(CuDNNPoolingLayerTest, TestGradientAvePaddedCuDNN) { } } } +*/ #endif From b2c26469703741007a4953a778a0b92a0d3dee57 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq@google.com> Date: Tue, 30 Sep 2014 10:20:36 -0700 Subject: [PATCH 0837/2053] doxygen --- include/caffe/layer_factory.hpp | 78 +++++++++++++++++---------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/include/caffe/layer_factory.hpp b/include/caffe/layer_factory.hpp index dd896453f41..b86d53346d9 100644 --- a/include/caffe/layer_factory.hpp +++ b/include/caffe/layer_factory.hpp @@ -1,40 +1,44 @@ -// This file defines a layer factory that allows one to register layers. During -// runtime, registered layers could be called by passing a LayerParameter: -// LayerRegistry<Dtype>::CreateLayer(param); -// -// There are two ways to register a layer. Assuming that we have a layer like: -// -// template <typename Dtype> -// class MyAwesomeLayer : public Layer<Dtype> { -// // your implementations -// }; -// -// and its type is defined in the protobuffer as -// -// enum LayerType { -// // other definitions -// AWESOME = 46, -// } -// -// If the layer is going to be created simply by its constructor, in your c++ -// file, add the following line: -// -// REGISTER_LAYER_CLASS(AWESOME, MyAwesomeLayer); -// -// Or, if the layer is going to be created by another creator function, in the -// format of: -// -// template <typename Dtype> -// Layer<Dtype*> GetMyAwesomeLayer(const LayerParameter& param) { -// // your implementation -// } -// -// (for example, when your layer has multiple backends, see GetConvolutionLayer -// for a use case), then you can register the creator function instead, like -// -// REGISTER_LAYER_CREATOR(AWESOME, GetMyAwesomeLayer) -// -// Note that each layer type should only be registered once. +/** + * @brief A layer factory that allows one to register layers. + * During runtime, registered layers could be called by passing a LayerParameter + * protobuffer to the CreateLayer function: + * + * LayerRegistry<Dtype>::CreateLayer(param); + * + * There are two ways to register a layer. Assuming that we have a layer like: + * + * template <typename Dtype> + * class MyAwesomeLayer : public Layer<Dtype> { + * // your implementations + * }; + * + * and its type is defined in the protobuffer as + * + * enum LayerType { + * // other definitions + * AWESOME = 46, + * } + * + * If the layer is going to be created simply by its constructor, in your c++ + * file, add the following line: + * + * REGISTER_LAYER_CLASS(AWESOME, MyAwesomeLayer); + * + * Or, if the layer is going to be created by another creator function, in the + * format of: + * + * template <typename Dtype> + * Layer<Dtype*> GetMyAwesomeLayer(const LayerParameter& param) { + * // your implementation + * } + * + * (for example, when your layer has multiple backends, see GetConvolutionLayer + * for a use case), then you can register the creator function instead, like + * + * REGISTER_LAYER_CREATOR(AWESOME, GetMyAwesomeLayer) + * + * Note that each layer type should only be registered once. + */ #ifndef CAFFE_LAYER_FACTORY_H_ #define CAFFE_LAYER_FACTORY_H_ From 10ee219999f53ba0bfc304daf2222c2090481b02 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Tue, 30 Sep 2014 11:00:37 -0700 Subject: [PATCH 0838/2053] test_gradient_based_solver.cpp: removed unused typedefs --- src/caffe/test/test_gradient_based_solver.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/caffe/test/test_gradient_based_solver.cpp b/src/caffe/test/test_gradient_based_solver.cpp index 3040eb134a4..65de52aae4a 100644 --- a/src/caffe/test/test_gradient_based_solver.cpp +++ b/src/caffe/test/test_gradient_based_solver.cpp @@ -323,7 +323,6 @@ class SGDSolverTest : public GradientBasedSolverTest<TypeParam> { TYPED_TEST_CASE(SGDSolverTest, TestDtypesAndDevices); TYPED_TEST(SGDSolverTest, TestLeastSquaresUpdate) { - typedef typename TypeParam::Dtype Dtype; this->TestLeastSquaresUpdate(); } @@ -390,7 +389,6 @@ class AdaGradSolverTest : public GradientBasedSolverTest<TypeParam> { TYPED_TEST_CASE(AdaGradSolverTest, TestDtypesAndDevices); TYPED_TEST(AdaGradSolverTest, TestAdaGradLeastSquaresUpdate) { - typedef typename TypeParam::Dtype Dtype; this->TestLeastSquaresUpdate(); } @@ -435,7 +433,6 @@ class NesterovSolverTest : public GradientBasedSolverTest<TypeParam> { TYPED_TEST_CASE(NesterovSolverTest, TestDtypesAndDevices); TYPED_TEST(NesterovSolverTest, TestNesterovLeastSquaresUpdate) { - typedef typename TypeParam::Dtype Dtype; this->TestLeastSquaresUpdate(); } From a7bce254c32a25f2b1260afb62493dbb4f96dc46 Mon Sep 17 00:00:00 2001 From: Chiyuan Zhang <pluskid@gmail.com> Date: Fri, 26 Sep 2014 11:21:59 -0400 Subject: [PATCH 0839/2053] make HDF5 layer support multiple data output --- include/caffe/data_layers.hpp | 8 +--- src/caffe/layers/hdf5_data_layer.cpp | 55 ++++++++++++++------------ src/caffe/layers/hdf5_data_layer.cu | 19 ++++----- src/caffe/test/test_hdf5data_layer.cpp | 3 ++ 4 files changed, 41 insertions(+), 44 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index b3f93cea19e..c1720b7f8ad 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -20,9 +20,6 @@ namespace caffe { -#define HDF5_DATA_DATASET_NAME "data" -#define HDF5_DATA_LABEL_NAME "label" - /** * @brief Provides base for data layers that feed blobs to the Net. * @@ -180,7 +177,7 @@ class HDF5DataLayer : public Layer<Dtype> { return LayerParameter_LayerType_HDF5_DATA; } virtual inline int ExactNumBottomBlobs() const { return 0; } - virtual inline int ExactNumTopBlobs() const { return 2; } + virtual inline int MinTopBlobs() const { return 1; } protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, @@ -197,8 +194,7 @@ class HDF5DataLayer : public Layer<Dtype> { unsigned int num_files_; unsigned int current_file_; hsize_t current_row_; - Blob<Dtype> data_blob_; - Blob<Dtype> label_blob_; + std::vector<shared_ptr<Blob<Dtype> > > hdf_blobs_; }; /** diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 8fec61789e9..bf771fd093a 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -33,20 +33,27 @@ void HDF5DataLayer<Dtype>::LoadHDF5FileData(const char* filename) { return; } - const int MIN_DATA_DIM = 2; + int top_size = this->layer_param_.top_size(); + hdf_blobs_.resize(top_size); + + const int MIN_DATA_DIM = 1; const int MAX_DATA_DIM = 4; - hdf5_load_nd_dataset( - file_id, "data", MIN_DATA_DIM, MAX_DATA_DIM, &data_blob_); - const int MIN_LABEL_DIM = 1; - const int MAX_LABEL_DIM = 2; - hdf5_load_nd_dataset( - file_id, "label", MIN_LABEL_DIM, MAX_LABEL_DIM, &label_blob_); + for (int i = 0; i < top_size; ++i) { + hdf_blobs_[i] = shared_ptr<Blob<Dtype> >(new Blob<Dtype>()); + hdf5_load_nd_dataset(file_id, this->layer_param_.top(i).c_str(), + MIN_DATA_DIM, MAX_DATA_DIM, hdf_blobs_[i].get()); + } herr_t status = H5Fclose(file_id); CHECK_GE(status, 0) << "Failed to close HDF5 file " << filename; - CHECK_EQ(data_blob_.num(), label_blob_.num()); - LOG(INFO) << "Successully loaded " << data_blob_.num() << " rows"; + + // MinTopBlobs==1 guarantees at least one top blob + int num = hdf_blobs_[0]->num(); + for (int i = 1; i < top_size; ++i) { + CHECK_EQ(hdf_blobs_[i]->num(), num); + } + LOG(INFO) << "Successully loaded " << hdf_blobs_[0]->num() << " rows"; } template <typename Dtype> @@ -74,26 +81,21 @@ void HDF5DataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, // Reshape blobs. const int batch_size = this->layer_param_.hdf5_data_param().batch_size(); - top[0]->Reshape(batch_size, data_blob_.channels(), - data_blob_.height(), data_blob_.width()); - top[1]->Reshape(batch_size, label_blob_.channels(), - label_blob_.height(), label_blob_.width()); - LOG(INFO) << "output data size: " << top[0]->num() << "," - << top[0]->channels() << "," << top[0]->height() << "," - << top[0]->width(); + const int top_size = this->layer_param_.top_size(); + for (int i = 0; i < top_size; ++i) { + top[i]->Reshape(batch_size, hdf_blobs_[i]->channels(), + hdf_blobs_[i]->height(), hdf_blobs_[i]->width()); + } } template <typename Dtype> void HDF5DataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { const int batch_size = this->layer_param_.hdf5_data_param().batch_size(); - const int data_count = top[0]->count() / top[0]->num(); - const int label_data_count = top[1]->count() / top[1]->num(); - for (int i = 0; i < batch_size; ++i, ++current_row_) { - if (current_row_ == data_blob_.num()) { + if (current_row_ == hdf_blobs_[0]->num()) { if (num_files_ > 1) { - current_file_ += 1; + ++current_file_; if (current_file_ == num_files_) { current_file_ = 0; LOG(INFO) << "looping around to first file"; @@ -102,11 +104,12 @@ void HDF5DataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } current_row_ = 0; } - caffe_copy(data_count, &data_blob_.cpu_data()[current_row_ * data_count], - &top[0]->mutable_cpu_data()[i * data_count]); - caffe_copy(label_data_count, - &label_blob_.cpu_data()[current_row_ * label_data_count], - &top[1]->mutable_cpu_data()[i * label_data_count]); + for (int j = 0; j < this->layer_param_.top_size(); ++j) { + int data_dim = top[j]->count() / top[j]->num(); + caffe_copy(data_dim, + &hdf_blobs_[j]->cpu_data()[current_row_ * data_dim], + &top[j]->mutable_cpu_data()[i * data_dim]); + } } } diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu index f671ea12d76..02ec6733d49 100644 --- a/src/caffe/layers/hdf5_data_layer.cu +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -20,29 +20,24 @@ template <typename Dtype> void HDF5DataLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { const int batch_size = this->layer_param_.hdf5_data_param().batch_size(); - const int data_count = top[0]->count() / top[0]->num(); - const int label_data_count = top[1]->count() / top[1]->num(); - for (int i = 0; i < batch_size; ++i, ++current_row_) { - if (current_row_ == data_blob_.num()) { + if (current_row_ == hdf_blobs_[0]->num()) { if (num_files_ > 1) { current_file_ += 1; - if (current_file_ == num_files_) { current_file_ = 0; LOG(INFO) << "looping around to first file"; } - LoadHDF5FileData(hdf_filenames_[current_file_].c_str()); } current_row_ = 0; } - caffe_copy(data_count, - &data_blob_.cpu_data()[current_row_ * data_count], - &top[0]->mutable_gpu_data()[i * data_count]); - caffe_copy(label_data_count, - &label_blob_.cpu_data()[current_row_ * label_data_count], - &top[1]->mutable_gpu_data()[i * label_data_count]); + for (int j = 0; j < this->layer_param_.top_size(); ++j) { + int data_dim = top[j]->count() / top[j]->num(); + caffe_copy(data_dim, + &hdf_blobs_[j]->cpu_data()[current_row_ * data_dim], + &top[j]->mutable_gpu_data()[i * data_dim]); + } } } diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index 9026a91ad85..769c1323ec7 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -57,6 +57,9 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { // The data file we are reading has 10 rows and 8 columns, // with values from 0 to 10*8 reshaped in row-major order. LayerParameter param; + param.add_top("data"); + param.add_top("label"); + HDF5DataParameter* hdf5_data_param = param.mutable_hdf5_data_param(); int batch_size = 5; hdf5_data_param->set_batch_size(batch_size); From 7e8aefb2d76cef014f2576efcb08d79526040544 Mon Sep 17 00:00:00 2001 From: Chiyuan Zhang <pluskid@gmail.com> Date: Fri, 26 Sep 2014 16:20:48 -0400 Subject: [PATCH 0840/2053] added test case to cover new HDF5 behavior --- .../test/test_data/generate_sample_data.py | 9 +++++++++ src/caffe/test/test_data/sample_data.h5 | Bin 11784 -> 11824 bytes .../test/test_data/sample_data_2_gzip.h5 | Bin 10548 -> 15446 bytes src/caffe/test/test_hdf5data_layer.cpp | 16 +++++++++++++++- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/caffe/test/test_data/generate_sample_data.py b/src/caffe/test/test_data/generate_sample_data.py index 2ab238611d8..e5dbc3406d8 100644 --- a/src/caffe/test/test_data/generate_sample_data.py +++ b/src/caffe/test/test_data/generate_sample_data.py @@ -20,12 +20,17 @@ label = 1 + np.arange(num_rows)[:, np.newaxis] label = label.astype('float32') +# We add an extra label2 dataset to test HDF5 layer's ability +# to handle arbitrary number of output ("top") Blobs. +label2 = label + 1 + print data print label with h5py.File(os.path.dirname(__file__) + '/sample_data.h5', 'w') as f: f['data'] = data f['label'] = label + f['label2'] = label2 with h5py.File(os.path.dirname(__file__) + '/sample_data_2_gzip.h5', 'w') as f: f.create_dataset( @@ -36,6 +41,10 @@ 'label', data=label, compression='gzip', compression_opts=1 ) + f.create_dataset( + 'label2', data=label2, + compression='gzip', compression_opts=1 + ) with open(os.path.dirname(__file__) + '/sample_data_list.txt', 'w') as f: f.write(os.path.dirname(__file__) + '/sample_data.h5\n') diff --git a/src/caffe/test/test_data/sample_data.h5 b/src/caffe/test/test_data/sample_data.h5 index 90eaaa56ec773b5de2303100a5611786c8d78766..236e66b0d122523107aac97430a3dfb5bf30ec7c 100644 GIT binary patch delta 127 zcmeB(*$^{9gVA83W;>(A#*OSuj0%%?GN}vZBqpWi7%?y~GC+XE<d00RnGPJBe2+PT zk$JK?OCXm7RH}n*;>Kr_6_|x4cd>S{A2_HQ!oZL*abqr2D1(VZZ}Jyb1(?jnjn<5t N(>NBXPR`)a0009dB}f1O delta 84 zcmdlG(-AX4gOOvRW;>(6#*OSuj1rS~GO2SiGC+XC#Es^Y6`1!hJy|jN9&-dE(`0j& lz=;Pw0L6qRcd>S{KUtv~!oZNRapQN!i3dV9r*SM&1pp~c8@>Pl diff --git a/src/caffe/test/test_data/sample_data_2_gzip.h5 b/src/caffe/test/test_data/sample_data_2_gzip.h5 index ff49db4ea742f207cbea04de3027087f4994215a..a138e0367be3d4b4ce4b51dcf0d7895056018883 100644 GIT binary patch delta 170 zcmdlIbgg2722+^LM6I^TLM(C{58Ps$yn;!9QDO2<CUwD_#H7?5BL)UW1_-d&{E<nT zk?Fv}&3r5ce2mPK>xBZjB%qRfh7&hF+k8Oy6c<QAkK76_l?uk>goFYHC51eON30Gt z3?1?ehRw>%%?twC3>zDj87f;?pKjjBvW<PR0<+NM8?qCb<cua~%gF-`nA{_m#HccH NqdcR@W`6nqoB+w_Ga&!~ delta 71 zcmcasu_b7N29t^AM6EVPfsGs4nHVJ|?_^TvWMqH<hlv}_Co3?&VS2J+GapL<A0yM` WdZECH2R>{*Abg4oB-$glf(rlzSr?rE diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index 769c1323ec7..ed6fed83708 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -25,10 +25,12 @@ class HDF5DataLayerTest : public MultiDeviceTest<TypeParam> { HDF5DataLayerTest() : filename(NULL), blob_top_data_(new Blob<Dtype>()), - blob_top_label_(new Blob<Dtype>()) {} + blob_top_label_(new Blob<Dtype>()), + blob_top_label2_(new Blob<Dtype>()) {} virtual void SetUp() { blob_top_vec_.push_back(blob_top_data_); blob_top_vec_.push_back(blob_top_label_); + blob_top_vec_.push_back(blob_top_label2_); // Check out generate_sample_data.py in the same directory. filename = new string( @@ -39,12 +41,14 @@ class HDF5DataLayerTest : public MultiDeviceTest<TypeParam> { virtual ~HDF5DataLayerTest() { delete blob_top_data_; delete blob_top_label_; + delete blob_top_label2_; delete filename; } string* filename; Blob<Dtype>* const blob_top_data_; Blob<Dtype>* const blob_top_label_; + Blob<Dtype>* const blob_top_label2_; vector<Blob<Dtype>*> blob_bottom_vec_; vector<Blob<Dtype>*> blob_top_vec_; }; @@ -59,6 +63,7 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { LayerParameter param; param.add_top("data"); param.add_top("label"); + param.add_top("label2"); HDF5DataParameter* hdf5_data_param = param.mutable_hdf5_data_param(); int batch_size = 5; @@ -81,6 +86,11 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { EXPECT_EQ(this->blob_top_label_->height(), 1); EXPECT_EQ(this->blob_top_label_->width(), 1); + EXPECT_EQ(this->blob_top_label2_->num(), batch_size); + EXPECT_EQ(this->blob_top_label2_->channels(), 1); + EXPECT_EQ(this->blob_top_label2_->height(), 1); + EXPECT_EQ(this->blob_top_label2_->width(), 1); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); // Go through the data 10 times (5 batches). @@ -92,6 +102,7 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { // On odd iterations, we're reading the second half of the data. // NB: label is 1-indexed int label_offset = 1 + ((iter % 2 == 0) ? 0 : batch_size); + int label2_offset = 1 + label_offset; int data_offset = (iter % 2 == 0) ? 0 : batch_size * data_size; // Every two iterations we are reading the second file, @@ -103,6 +114,9 @@ TYPED_TEST(HDF5DataLayerTest, TestRead) { EXPECT_EQ( label_offset + i, this->blob_top_label_->cpu_data()[i]); + EXPECT_EQ( + label2_offset + i, + this->blob_top_label2_->cpu_data()[i]); } for (int i = 0; i < batch_size; ++i) { for (int j = 0; j < num_cols; ++j) { From 3fde283606b604a8a25becc7958c7a1268fb2249 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Tue, 30 Sep 2014 11:37:55 -0700 Subject: [PATCH 0841/2053] hdf5_data_layer.cpp: fix indentation --- src/caffe/layers/hdf5_data_layer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index bf771fd093a..a2c806699b8 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -40,8 +40,8 @@ void HDF5DataLayer<Dtype>::LoadHDF5FileData(const char* filename) { const int MAX_DATA_DIM = 4; for (int i = 0; i < top_size; ++i) { - hdf_blobs_[i] = shared_ptr<Blob<Dtype> >(new Blob<Dtype>()); - hdf5_load_nd_dataset(file_id, this->layer_param_.top(i).c_str(), + hdf_blobs_[i] = shared_ptr<Blob<Dtype> >(new Blob<Dtype>()); + hdf5_load_nd_dataset(file_id, this->layer_param_.top(i).c_str(), MIN_DATA_DIM, MAX_DATA_DIM, hdf_blobs_[i].get()); } @@ -51,7 +51,7 @@ void HDF5DataLayer<Dtype>::LoadHDF5FileData(const char* filename) { // MinTopBlobs==1 guarantees at least one top blob int num = hdf_blobs_[0]->num(); for (int i = 1; i < top_size; ++i) { - CHECK_EQ(hdf_blobs_[i]->num(), num); + CHECK_EQ(hdf_blobs_[i]->num(), num); } LOG(INFO) << "Successully loaded " << hdf_blobs_[0]->num() << " rows"; } From db50f0749a9ee491ecf3daad783827e4c215bf0e Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Tue, 30 Sep 2014 11:13:59 -0700 Subject: [PATCH 0842/2053] Cleanup HDF5DataLayer log messages. -Only use "DLOG" during Forward/Backward for less noise during training/testing -Cleanup spacing, capitalization, etc. --- src/caffe/layers/hdf5_data_layer.cpp | 14 +++++++------- src/caffe/layers/hdf5_data_layer.cu | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index a2c806699b8..d4173844667 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -26,10 +26,10 @@ HDF5DataLayer<Dtype>::~HDF5DataLayer<Dtype>() { } // Load data and label from HDF5 filename into the class property blobs. template <typename Dtype> void HDF5DataLayer<Dtype>::LoadHDF5FileData(const char* filename) { - LOG(INFO) << "Loading HDF5 file" << filename; + DLOG(INFO) << "Loading HDF5 file: " << filename; hid_t file_id = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) { - LOG(ERROR) << "Failed opening HDF5 file" << filename; + LOG(ERROR) << "Failed opening HDF5 file: " << filename; return; } @@ -46,14 +46,14 @@ void HDF5DataLayer<Dtype>::LoadHDF5FileData(const char* filename) { } herr_t status = H5Fclose(file_id); - CHECK_GE(status, 0) << "Failed to close HDF5 file " << filename; + CHECK_GE(status, 0) << "Failed to close HDF5 file: " << filename; // MinTopBlobs==1 guarantees at least one top blob int num = hdf_blobs_[0]->num(); for (int i = 1; i < top_size; ++i) { CHECK_EQ(hdf_blobs_[i]->num(), num); } - LOG(INFO) << "Successully loaded " << hdf_blobs_[0]->num() << " rows"; + DLOG(INFO) << "Successully loaded " << hdf_blobs_[0]->num() << " rows"; } template <typename Dtype> @@ -61,7 +61,7 @@ void HDF5DataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // Read the source to parse the filenames. const string& source = this->layer_param_.hdf5_data_param().source(); - LOG(INFO) << "Loading filename from " << source; + LOG(INFO) << "Loading list of HDF5 filenames from: " << source; hdf_filenames_.clear(); std::ifstream source_file(source.c_str()); if (source_file.is_open()) { @@ -73,7 +73,7 @@ void HDF5DataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, source_file.close(); num_files_ = hdf_filenames_.size(); current_file_ = 0; - LOG(INFO) << "Number of files: " << num_files_; + LOG(INFO) << "Number of HDF5 files: " << num_files_; // Load the first HDF5 file and initialize the line counter. LoadHDF5FileData(hdf_filenames_[current_file_].c_str()); @@ -98,7 +98,7 @@ void HDF5DataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, ++current_file_; if (current_file_ == num_files_) { current_file_ = 0; - LOG(INFO) << "looping around to first file"; + DLOG(INFO) << "Looping around to first file."; } LoadHDF5FileData(hdf_filenames_[current_file_].c_str()); } diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu index 02ec6733d49..9f5daf230e7 100644 --- a/src/caffe/layers/hdf5_data_layer.cu +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -26,7 +26,7 @@ void HDF5DataLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, current_file_ += 1; if (current_file_ == num_files_) { current_file_ = 0; - LOG(INFO) << "looping around to first file"; + DLOG(INFO) << "Looping around to first file."; } LoadHDF5FileData(hdf_filenames_[current_file_].c_str()); } From fce99474e7803767dbb5ea25696e23fa8002cb50 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Tue, 30 Sep 2014 11:15:21 -0700 Subject: [PATCH 0843/2053] Die on failure to load HDF5 data file. --- src/caffe/layers/hdf5_data_layer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index d4173844667..601fd345f3b 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -29,8 +29,7 @@ void HDF5DataLayer<Dtype>::LoadHDF5FileData(const char* filename) { DLOG(INFO) << "Loading HDF5 file: " << filename; hid_t file_id = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) { - LOG(ERROR) << "Failed opening HDF5 file: " << filename; - return; + LOG(FATAL) << "Failed opening HDF5 file: " << filename; } int top_size = this->layer_param_.top_size(); From 7a223ec3198f3d004155e54cab4790bee19972c7 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Tue, 30 Sep 2014 12:27:09 -0700 Subject: [PATCH 0844/2053] HDF5DataLayer: die on failure to open source file --- src/caffe/layers/hdf5_data_layer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 601fd345f3b..61aa293d2ac 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -68,6 +68,8 @@ void HDF5DataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, while (source_file >> line) { hdf_filenames_.push_back(line); } + } else { + LOG(FATAL) << "Failed to open source file: " << source; } source_file.close(); num_files_ = hdf_filenames_.size(); From e43c079fc33a197942d73a57250d09a26cbb2fab Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Tue, 30 Sep 2014 12:32:34 -0700 Subject: [PATCH 0845/2053] hdf5_load_nd_dataset_helper: check that dataset exists first --- src/caffe/util/io.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 4a22e18725d..43e5c01e36a 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -124,6 +124,9 @@ template <typename Dtype> void hdf5_load_nd_dataset_helper( hid_t file_id, const char* dataset_name_, int min_dim, int max_dim, Blob<Dtype>* blob) { + // Verify that the dataset exists. + CHECK(H5LTfind_dataset(file_id, dataset_name_)) + << "Failed to find HDF5 dataset " << dataset_name_; // Verify that the number of dimensions is in the accepted range. herr_t status; int ndims; From a36cceb3bdbaeb10e1057307b9aa69037de0f031 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 30 Sep 2014 15:28:36 -0700 Subject: [PATCH 0846/2053] fix cuDNN build by readding line deleted in #1167 --- src/caffe/layer_factory.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 96481dd72a4..9b77ca14677 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -46,6 +46,7 @@ Layer<Dtype>* GetPoolingLayer(const LayerParameter& param) { return new PoolingLayer<Dtype>(param); #ifdef USE_CUDNN } else if (engine == PoolingParameter_Engine_CUDNN) { + PoolingParameter p_param = param.pooling_param(); if (p_param.pad_h() || p_param.pad_w() || param.top_size() > 1) { LOG(INFO) << "CUDNN does not support padding or multiple tops. " << "Using Caffe's own pooling layer."; From 4f463bdaa14c8906b03ade524aab154bec712958 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Tue, 30 Sep 2014 15:57:38 -0700 Subject: [PATCH 0847/2053] remove a wrong space in common.hpp --- include/caffe/common.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 9c6eb4d6834..811b45e2c15 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -19,7 +19,7 @@ // gflags 2.1 issue: namespace google was changed to gflags without warning. // Luckily we will be able to use GFLAGS_GFAGS_H_ to detect if it is version -// 2.1. If yes , we will add a temporary solution to redirect the namespace. +// 2.1. If yes, we will add a temporary solution to redirect the namespace. // TODO(Yangqing): Once gflags solves the problem in a more elegant way, let's // remove the following hack. #ifndef GFLAGS_GFLAGS_H_ From a02ec65ce8f07896dfa05d52263dbe8acfbb02cd Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Tue, 30 Sep 2014 17:24:26 -0700 Subject: [PATCH 0848/2053] [fix] check and load weight for backward w.r.t. data fix NULL pointer when back-propagating to the data for fixed i.e. not back-propagated weights. same issue as #1048 --- src/caffe/layers/cudnn_conv_layer.cu | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/caffe/layers/cudnn_conv_layer.cu b/src/caffe/layers/cudnn_conv_layer.cu index 6961bbeaba5..cf8607e1b78 100644 --- a/src/caffe/layers/cudnn_conv_layer.cu +++ b/src/caffe/layers/cudnn_conv_layer.cu @@ -86,6 +86,9 @@ void CuDNNConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, // Gradient w.r.t. bottom data. if (propagate_down[i]) { + if (weight == NULL) { + weight = this->blobs_[0]->gpu_data(); + } Dtype* bottom_diff = bottom[i]->mutable_gpu_diff(); CUDNN_CHECK(cudnnConvolutionBackwardData(handle_[2*this->group_ + g], filter_desc_, weight + weight_offset_ * g, From 08ccc947f128ef88fcd24c3d5807bc7c4338efda Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 30 Sep 2014 19:16:56 -0700 Subject: [PATCH 0849/2053] [pycaffe] fix comment typo --- python/caffe/_caffe.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index ba04d276351..622e887ac78 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -153,7 +153,7 @@ class PyNet { bp::dict channel_swap_; protected: - // The pointer to the internal caffe::Net instant. + // The pointer to the internal caffe::Net instance. shared_ptr<Net<float> > net_; // if taking input from an ndarray, we need to hold references bp::object input_data_; From 2f29ec4672dca2ab4ecafb1ec75d7c597a09cfca Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 30 Sep 2014 16:20:27 -0700 Subject: [PATCH 0850/2053] [pycaffe] add converter for vectors of Nets --- python/caffe/_caffe.cpp | 3 +++ python/caffe/_caffe.hpp | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 5a81a42329b..ce7b726f955 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -189,6 +189,9 @@ BOOST_PYTHON_MODULE(_caffe) { .def("solve", &PySGDSolver::Solve) .def("solve", &PySGDSolver::SolveResume); + bp::class_<vector<shared_ptr<PyNet> > >("NetVec") + .def(bp::vector_indexing_suite<vector<shared_ptr<PyNet> >, true>()); + bp::class_<vector<PyBlob<float> > >("BlobVec") .def(bp::vector_indexing_suite<vector<PyBlob<float> >, true>()); diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index 622e887ac78..0ed0974842e 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -152,6 +152,11 @@ class PyNet { bp::dict raw_scale_; bp::dict channel_swap_; + // this is here only to satisfy boost's vector_indexing_suite + bool operator == (const PyNet &other) { + return this->net_ == other.net_; + } + protected: // The pointer to the internal caffe::Net instance. shared_ptr<Net<float> > net_; From 34e661b27ee0d4554b4377d3fbe5793e858f37c7 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 30 Sep 2014 16:21:18 -0700 Subject: [PATCH 0851/2053] [pycaffe] expose SGDSolver.test_nets --- python/caffe/_caffe.cpp | 11 ++++++++--- python/caffe/_caffe.hpp | 2 ++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index ce7b726f955..1e2dd079ad0 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -2,6 +2,7 @@ // caffe::Caffe functions so that one could easily call it from Python. // Note that for Python, we will simply use float as the data type. +#include <boost/make_shared.hpp> #include <boost/python/suite/indexing/vector_indexing_suite.hpp> // these need to be included after boost on OS X @@ -134,6 +135,9 @@ PySGDSolver::PySGDSolver(const string& param_file) { // we need to explicitly store the net wrapper, rather than constructing // it on the fly, so that it can hold references to Python objects net_.reset(new PyNet(solver_->net())); + for (int i = 0; i < solver_->test_nets().size(); ++i) { + test_nets_.push_back(boost::make_shared<PyNet>(solver_->test_nets()[i])); + } } void PySGDSolver::SolveResume(const string& resume_file) { @@ -185,9 +189,10 @@ BOOST_PYTHON_MODULE(_caffe) { bp::class_<PySGDSolver, boost::noncopyable>( "SGDSolver", bp::init<string>()) - .add_property("net", &PySGDSolver::net) - .def("solve", &PySGDSolver::Solve) - .def("solve", &PySGDSolver::SolveResume); + .add_property("net", &PySGDSolver::net) + .add_property("test_nets", &PySGDSolver::test_nets) + .def("solve", &PySGDSolver::Solve) + .def("solve", &PySGDSolver::SolveResume); bp::class_<vector<shared_ptr<PyNet> > >("NetVec") .def(bp::vector_indexing_suite<vector<shared_ptr<PyNet> >, true>()); diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index 0ed0974842e..bef90e1b359 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -170,11 +170,13 @@ class PySGDSolver { explicit PySGDSolver(const string& param_file); shared_ptr<PyNet> net() { return net_; } + vector<shared_ptr<PyNet> > test_nets() { return test_nets_; } void Solve() { return solver_->Solve(); } void SolveResume(const string& resume_file); protected: shared_ptr<PyNet> net_; + vector<shared_ptr<PyNet> > test_nets_; shared_ptr<SGDSolver<float> > solver_; }; From e222c5776506591715769df087c4b980a391c588 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 30 Sep 2014 20:24:47 -0700 Subject: [PATCH 0852/2053] add accessor for Solver::iter_ This will be useful in code controlling the solver (from pycaffe, for example). --- include/caffe/solver.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 6fd159d0b98..2bad0e2fe1e 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -31,6 +31,7 @@ class Solver { inline const vector<shared_ptr<Net<Dtype> > >& test_nets() { return test_nets_; } + int iter() { return iter_; } protected: // PreSolve is run before any solving iteration starts, allowing one to From 5be4d7681c489d187a2c8fa3cdc746bd37d57ce2 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 30 Sep 2014 20:26:25 -0700 Subject: [PATCH 0853/2053] [pycaffe] expose SGDSolver.iter --- python/caffe/_caffe.cpp | 1 + python/caffe/_caffe.hpp | 1 + 2 files changed, 2 insertions(+) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 1e2dd079ad0..5a8d99d3f22 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -191,6 +191,7 @@ BOOST_PYTHON_MODULE(_caffe) { "SGDSolver", bp::init<string>()) .add_property("net", &PySGDSolver::net) .add_property("test_nets", &PySGDSolver::test_nets) + .add_property("iter", &PySGDSolver::iter) .def("solve", &PySGDSolver::Solve) .def("solve", &PySGDSolver::SolveResume); diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index bef90e1b359..fc7be49af1b 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -171,6 +171,7 @@ class PySGDSolver { shared_ptr<PyNet> net() { return net_; } vector<shared_ptr<PyNet> > test_nets() { return test_nets_; } + int iter() { return solver_->iter(); } void Solve() { return solver_->Solve(); } void SolveResume(const string& resume_file); From ac8a03d297265efd33a73bfd95f16913ea7b3099 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 1 Oct 2014 14:19:30 -0700 Subject: [PATCH 0854/2053] [fix] solver indexing of output blobs was incorrect for non-singleton outputs --- src/caffe/solver.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 0ea4edcf9b8..8d187ea638b 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -285,10 +285,10 @@ void Solver<Dtype>::Test(const int test_net_id) { LOG(INFO) << "Test loss: " << loss; } for (int i = 0; i < test_score.size(); ++i) { - const string& output_name = test_net->blob_names()[ - test_net->output_blob_indices()[test_score_output_id[i]]]; - const Dtype loss_weight = - test_net->blob_loss_weights()[test_net->output_blob_indices()[i]]; + const int output_blob_index = + test_net->output_blob_indices()[test_score_output_id[i]]; + const string& output_name = test_net->blob_names()[output_blob_index]; + const Dtype loss_weight = test_net->blob_loss_weights()[output_blob_index]; ostringstream loss_msg_stream; const Dtype mean_score = test_score[i] / param_.test_iter(test_net_id); if (loss_weight) { From e6ba910ed9e6270e989cb7b634b206034c39f2cd Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 1 Oct 2014 20:53:31 -0700 Subject: [PATCH 0855/2053] caffe.proto: do some minor cleanup (fix comments, alphabetization) --- src/caffe/proto/caffe.proto | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 1f26fd346d5..2dea5a09ee1 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -470,11 +470,6 @@ message EltwiseParameter { optional bool stable_prod_grad = 3 [default = true]; } -// Message that stores parameters used by ThresholdLayer -message ThresholdParameter { - optional float threshold = 1 [default = 0]; // Strictly Positive values -} - // Message that stores parameters used by HDF5DataLayer message HDF5DataParameter { // Specify the data source. @@ -641,7 +636,7 @@ message SliceParameter { repeated uint32 slice_point = 2; } -// Message that stores parameters used by SoftmaxLayer, SoftMaxWithLossLayer +// Message that stores parameters used by SoftmaxLayer, SoftmaxWithLossLayer message SoftmaxParameter { enum Engine { DEFAULT = 0; @@ -651,7 +646,7 @@ message SoftmaxParameter { optional Engine engine = 1 [default = DEFAULT]; } -// Message that stores parameters used by SigmoidLayer +// Message that stores parameters used by TanHLayer message TanHParameter { enum Engine { DEFAULT = 0; @@ -661,6 +656,11 @@ message TanHParameter { optional Engine engine = 1 [default = DEFAULT]; } +// Message that stores parameters used by ThresholdLayer +message ThresholdParameter { + optional float threshold = 1 [default = 0]; // Strictly positive values +} + // Message that stores parameters used by WindowDataLayer message WindowDataParameter { // Specify the data source. From 22515af9a964840a1ab7082eddf27d7733a9956f Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 2 Oct 2014 11:19:05 -0700 Subject: [PATCH 0856/2053] [fix] lint causing travis failures --- matlab/caffe/matcaffe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index db8896da6ae..fc047585cfe 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -372,7 +372,7 @@ static handler_registry handlers[] = { ** matlab entry point: caffe(api_command, arg1, arg2, ...) **/ void mexFunction(MEX_ARGS) { - mexLock(); // Avoid clearing the mex file. + mexLock(); // Avoid clearing the mex file. if (nrhs == 0) { LOG(ERROR) << "No API command given"; mexErrMsgTxt("An API command is requires"); From 4e0868d091718e99f2f3696a61f88240f33503b2 Mon Sep 17 00:00:00 2001 From: Bert <db.bert@gmail.com> Date: Wed, 1 Oct 2014 15:29:24 +0200 Subject: [PATCH 0857/2053] Update detect.py This generator causes an error in detect_windows because it is run twice there. Better store it as a data structure instead. --- python/detect.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/detect.py b/python/detect.py index bc8c0703646..b67b500aafd 100755 --- a/python/detect.py +++ b/python/detect.py @@ -130,10 +130,10 @@ def main(argv): # Detect. if args.crop_mode == 'list': # Unpack sequence of (image filename, windows). - images_windows = ( + images_windows = [ (ix, inputs.iloc[np.where(inputs.index == ix)][COORD_COLS].values) for ix in inputs.index.unique() - ) + ] detections = detector.detect_windows(images_windows) else: detections = detector.detect_selective_search(inputs) From 4b004162622963d2b857ad3adaa76f143278011d Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Thu, 2 Oct 2014 12:11:45 -0700 Subject: [PATCH 0858/2053] add factory header to caffe hpp --- include/caffe/caffe.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/caffe/caffe.hpp b/include/caffe/caffe.hpp index 0af9ef04c43..3c829f2f9b0 100644 --- a/include/caffe/caffe.hpp +++ b/include/caffe/caffe.hpp @@ -8,6 +8,7 @@ #include "caffe/common.hpp" #include "caffe/filler.hpp" #include "caffe/layer.hpp" +#include "caffe/layer_factory.hpp" #include "caffe/net.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/solver.hpp" From ab5e86e2babf22892a241ae06a93b3f389a23db1 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 30 Sep 2014 19:06:18 -0700 Subject: [PATCH 0859/2053] [pycaffe] expose Net::CopyTrainedLayersFrom as Net.copy_from This allows finetuning from Python, for example. --- python/caffe/_caffe.cpp | 1 + python/caffe/_caffe.hpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 5a81a42329b..5696f2625f6 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -147,6 +147,7 @@ BOOST_PYTHON_MODULE(_caffe) { bp::class_<PyNet, shared_ptr<PyNet> >( "Net", bp::init<string, string>()) .def(bp::init<string>()) + .def("copy_from", &PyNet::CopyTrainedLayersFrom) .def("_forward", &PyNet::Forward) .def("_backward", &PyNet::Backward) .def("reshape", &PyNet::Reshape) diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index 622e887ac78..a15144ba999 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -96,6 +96,9 @@ class PyNet { inline void check_contiguous_array(PyArrayObject* arr, string name, int channels, int height, int width); + void CopyTrainedLayersFrom(const string filename) { + net_->CopyTrainedLayersFrom(filename); + } void Forward(int start, int end) { net_->ForwardFromTo(start, end); } void Backward(int start, int end) { net_->BackwardFromTo(start, end); } void Reshape() { net_->Reshape(); } From 0dfda37c7f463b19f1504a08dc026b38bdddf7c6 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Thu, 2 Oct 2014 12:50:32 -0700 Subject: [PATCH 0860/2053] [pycaffe] expose Net::SharedTrainedLayersWith as Net.share_with --- python/caffe/_caffe.cpp | 1 + python/caffe/_caffe.hpp | 3 +++ 2 files changed, 4 insertions(+) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 5696f2625f6..28027bed0a4 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -148,6 +148,7 @@ BOOST_PYTHON_MODULE(_caffe) { "Net", bp::init<string, string>()) .def(bp::init<string>()) .def("copy_from", &PyNet::CopyTrainedLayersFrom) + .def("share_with", &PyNet::ShareTrainedLayersWith) .def("_forward", &PyNet::Forward) .def("_backward", &PyNet::Backward) .def("reshape", &PyNet::Reshape) diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index a15144ba999..780f82e5666 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -99,6 +99,9 @@ class PyNet { void CopyTrainedLayersFrom(const string filename) { net_->CopyTrainedLayersFrom(filename); } + void ShareTrainedLayersWith(PyNet* other) { + net_->ShareTrainedLayersWith(other->net_.get()); + } void Forward(int start, int end) { net_->ForwardFromTo(start, end); } void Backward(int start, int end) { net_->BackwardFromTo(start, end); } void Reshape() { net_->Reshape(); } From 0aae4a509862f7c42b32d7653b5c068f948b462c Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 1 Oct 2014 23:11:41 -0700 Subject: [PATCH 0861/2053] Add caffe_gpu_exp math function --- include/caffe/util/math_functions.hpp | 3 +++ src/caffe/util/math_functions.cu | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 62467fb5c52..a78eb5bc978 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -205,6 +205,9 @@ void caffe_gpu_div(const int N, const Dtype* a, const Dtype* b, Dtype* y); template <typename Dtype> void caffe_gpu_abs(const int n, const Dtype* a, Dtype* y); +template <typename Dtype> +void caffe_gpu_exp(const int n, const Dtype* a, Dtype* y); + template <typename Dtype> void caffe_gpu_powx(const int n, const Dtype* a, const Dtype b, Dtype* y); diff --git a/src/caffe/util/math_functions.cu b/src/caffe/util/math_functions.cu index 4ae4bba6029..43e65eb9a69 100644 --- a/src/caffe/util/math_functions.cu +++ b/src/caffe/util/math_functions.cu @@ -303,6 +303,27 @@ void caffe_gpu_abs<double>(const int N, const double* a, double* y) { } +template <typename Dtype> +__global__ void exp_kernel(const int n, const Dtype* a, Dtype* y) { + CUDA_KERNEL_LOOP(index, n) { + y[index] = exp(a[index]); + } +} + +template <> +void caffe_gpu_exp<float>(const int N, const float* a, float* y) { + // NOLINT_NEXT_LINE(whitespace/operators) + exp_kernel<float><<<CAFFE_GET_BLOCKS(N), CAFFE_CUDA_NUM_THREADS>>>( + N, a, y); +} + +template <> +void caffe_gpu_exp<double>(const int N, const double* a, double* y) { + // NOLINT_NEXT_LINE(whitespace/operators) + exp_kernel<double><<<CAFFE_GET_BLOCKS(N), CAFFE_CUDA_NUM_THREADS>>>( + N, a, y); +} + template <typename Dtype> __global__ void powx_kernel(const int n, const Dtype* a, const Dtype alpha, Dtype* y) { From 7995a38cc14de2560de7611b1e845c4946bcd3dd Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 1 Oct 2014 23:12:06 -0700 Subject: [PATCH 0862/2053] Add ExpLayer to calculate y = base ^ (scale * x + shift) --- include/caffe/neuron_layers.hpp | 66 ++++++++++++++++ src/caffe/layer_factory.cpp | 1 + src/caffe/layers/exp_layer.cpp | 69 ++++++++++++++++ src/caffe/layers/exp_layer.cu | 44 +++++++++++ src/caffe/proto/caffe.proto | 16 +++- src/caffe/test/test_neuron_layer.cpp | 114 +++++++++++++++++++++++++++ 6 files changed, 308 insertions(+), 2 deletions(-) create mode 100644 src/caffe/layers/exp_layer.cpp create mode 100644 src/caffe/layers/exp_layer.cu diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 64a1fd325ad..5daeeefe7ae 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -212,6 +212,72 @@ class DropoutLayer : public NeuronLayer<Dtype> { unsigned int uint_thres_; }; +/** + * @brief Computes @f$ y = \gamma ^ {\alpha x + \beta} @f$, + * as specified by the scale @f$ \alpha @f$, shift @f$ \beta @f$, + * and base @f$ \gamma @f$. + */ +template <typename Dtype> +class ExpLayer : public NeuronLayer<Dtype> { + public: + /** + * @param param provides ExpParameter exp_param, + * with ExpLayer options: + * - scale (\b optional, default 1) the scale @f$ \alpha @f$ + * - shift (\b optional, default 0) the shift @f$ \beta @f$ + * - base (\b optional, default -1 for a value of @f$ e \approx 2.718 @f$) + * the base @f$ \gamma @f$ + */ + explicit ExpLayer(const LayerParameter& param) + : NeuronLayer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top); + + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_EXP; + } + + protected: + /** + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$ + * @param top output Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the computed outputs @f$ + * y = \gamma ^ {\alpha x + \beta} + * @f$ + */ + virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top); + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top); + + /** + * @brief Computes the error gradient w.r.t. the exp inputs. + * + * @param top output Blob vector (length 1), providing the error gradient with + * respect to the outputs + * -# @f$ (N \times C \times H \times W) @f$ + * containing error gradients @f$ \frac{\partial E}{\partial y} @f$ + * with respect to computed outputs @f$ y @f$ + * @param propagate_down see Layer::Backward. + * @param bottom input Blob vector (length 1) + * -# @f$ (N \times C \times H \times W) @f$ + * the inputs @f$ x @f$; Backward fills their diff with + * gradients @f$ + * \frac{\partial E}{\partial x} = + * \frac{\partial E}{\partial y} y \alpha \log_e(gamma) + * @f$ if propagate_down[0] + */ + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + + Dtype inner_scale_, outer_scale_; +}; + /** * @brief Computes @f$ y = (\alpha x + \beta) ^ \gamma @f$, * as specified by the scale @f$ \alpha @f$, shift @f$ \beta @f$, diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 9b77ca14677..8815ddd021d 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -163,6 +163,7 @@ REGISTER_LAYER_CLASS(DROPOUT, DropoutLayer); REGISTER_LAYER_CLASS(DUMMY_DATA, DummyDataLayer); REGISTER_LAYER_CLASS(EUCLIDEAN_LOSS, EuclideanLossLayer); REGISTER_LAYER_CLASS(ELTWISE, EltwiseLayer); +REGISTER_LAYER_CLASS(EXP, ExpLayer); REGISTER_LAYER_CLASS(FLATTEN, FlattenLayer); REGISTER_LAYER_CLASS(HDF5_DATA, HDF5DataLayer); REGISTER_LAYER_CLASS(HDF5_OUTPUT, HDF5OutputLayer); diff --git a/src/caffe/layers/exp_layer.cpp b/src/caffe/layers/exp_layer.cpp new file mode 100644 index 00000000000..25da1201c10 --- /dev/null +++ b/src/caffe/layers/exp_layer.cpp @@ -0,0 +1,69 @@ +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void ExpLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top) { + NeuronLayer<Dtype>::LayerSetUp(bottom, top); + const Dtype base = this->layer_param_.exp_param().base(); + if (base != Dtype(-1)) { + CHECK_GT(base, 0) << "base must be strictly positive."; + } + // If base == -1, interpret the base as e and set log_base = 1 exactly. + // Otherwise, calculate its log explicitly. + const Dtype log_base = (base == Dtype(-1)) ? Dtype(1) : log(base); + CHECK(!std::isnan(log_base)) + << "NaN result: log(base) = log(" << base << ") = " << log_base; + CHECK(!std::isinf(log_base)) + << "Inf result: log(base) = log(" << base << ") = " << log_base; + const Dtype input_scale = this->layer_param_.exp_param().scale(); + const Dtype input_shift = this->layer_param_.exp_param().shift(); + inner_scale_ = log_base * input_scale; + outer_scale_ = (input_shift == Dtype(0)) ? Dtype(1) : pow(base, input_shift); +} + +template <typename Dtype> +void ExpLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top) { + const int count = bottom[0]->count(); + const Dtype* bottom_data = bottom[0]->cpu_data(); + Dtype* top_data = top[0]->mutable_cpu_data(); + if (inner_scale_ == Dtype(1)) { + caffe_exp(count, bottom_data, top_data); + } else { + caffe_cpu_scale(count, inner_scale_, bottom_data, top_data); + caffe_exp(count, top_data, top_data); + } + if (outer_scale_ != Dtype(1)) { + caffe_scal(count, outer_scale_, top_data); + } +} + +template <typename Dtype> +void ExpLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { + if (!propagate_down[0]) { return; } + const int count = bottom[0]->count(); + const Dtype* top_data = top[0]->cpu_data(); + const Dtype* top_diff = top[0]->cpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); + caffe_mul(count, top_data, top_diff, bottom_diff); + if (inner_scale_ != Dtype(1)) { + caffe_scal(count, inner_scale_, bottom_diff); + } +} + +#ifdef CPU_ONLY +STUB_GPU(ExpLayer); +#endif + +INSTANTIATE_CLASS(ExpLayer); + + +} // namespace caffe diff --git a/src/caffe/layers/exp_layer.cu b/src/caffe/layers/exp_layer.cu new file mode 100644 index 00000000000..a0fd672a25a --- /dev/null +++ b/src/caffe/layers/exp_layer.cu @@ -0,0 +1,44 @@ +#include <algorithm> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void ExpLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top) { + const int count = bottom[0]->count(); + const Dtype* bottom_data = bottom[0]->gpu_data(); + Dtype* top_data = top[0]->mutable_gpu_data(); + if (inner_scale_ == Dtype(1)) { + caffe_gpu_exp(count, bottom_data, top_data); + } else { + caffe_gpu_scale(count, inner_scale_, bottom_data, top_data); + caffe_gpu_exp(count, top_data, top_data); + } + if (outer_scale_ != Dtype(1)) { + caffe_gpu_scal(count, outer_scale_, top_data); + } +} + +template <typename Dtype> +void ExpLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { + if (!propagate_down[0]) { return; } + const int count = bottom[0]->count(); + const Dtype* top_data = top[0]->gpu_data(); + const Dtype* top_diff = top[0]->gpu_diff(); + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); + caffe_gpu_mul(count, top_data, top_diff, bottom_diff); + if (inner_scale_ != Dtype(1)) { + caffe_gpu_scal(count, inner_scale_, bottom_diff); + } +} + +INSTANTIATE_CLASS(ExpLayer); + + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 2dea5a09ee1..6944ae847ff 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -200,7 +200,7 @@ message NetStateRule { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 41 (last added: contrastive_loss_param) +// LayerParameter next available ID: 42 (last added: exp_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs @@ -221,7 +221,7 @@ message LayerParameter { // line above the enum. Update the next available ID when you add a new // LayerType. // - // LayerType next available ID: 38 (last added: CONTRASTIVE_LOSS) + // LayerType next available ID: 39 (last added: EXP) enum LayerType { // "NONE" layer type is 0th enum element so that we don't cause confusion // by defaulting to an existent LayerType (instead, should usually error if @@ -239,6 +239,7 @@ message LayerParameter { DUMMY_DATA = 32; EUCLIDEAN_LOSS = 7; ELTWISE = 25; + EXP = 38; FLATTEN = 8; HDF5_DATA = 9; HDF5_OUTPUT = 10; @@ -301,6 +302,7 @@ message LayerParameter { optional DropoutParameter dropout_param = 12; optional DummyDataParameter dummy_data_param = 26; optional EltwiseParameter eltwise_param = 24; + optional ExpParameter exp_param = 41; optional HDF5DataParameter hdf5_data_param = 13; optional HDF5OutputParameter hdf5_output_param = 14; optional HingeLossParameter hinge_loss_param = 29; @@ -470,6 +472,16 @@ message EltwiseParameter { optional bool stable_prod_grad = 3 [default = true]; } +// Message that stores parameters used by ExpLayer +message ExpParameter { + // ExpLayer computes outputs y = base ^ (shift + scale * x), for base > 0. + // Or if base is set to the default (-1), base is set to e, + // so y = exp(shift + scale * x). + optional float base = 1 [default = -1.0]; + optional float scale = 2 [default = 1.0]; + optional float shift = 3 [default = 0.0]; +} + // Message that stores parameters used by HDF5DataLayer message HDF5DataParameter { // Specify the data source. diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index fdbb63cb3e5..34955c3af63 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -66,6 +66,38 @@ class NeuronLayerTest : public MultiDeviceTest<TypeParam> { const Dtype empirical_dropout_ratio = 1 - num_kept / Dtype(count); EXPECT_NEAR(empirical_dropout_ratio, dropout_ratio, 1.96 * std_error); } + + void TestExpForward(const float base, const float scale, const float shift) { + LayerParameter layer_param; + layer_param.mutable_exp_param()->set_base(base); + layer_param.mutable_exp_param()->set_scale(scale); + layer_param.mutable_exp_param()->set_shift(shift); + ExpLayer<Dtype> layer(layer_param); + layer.SetUp(blob_bottom_vec_, blob_top_vec_); + layer.Forward(blob_bottom_vec_, blob_top_vec_); + const Dtype kDelta = 2e-4; + const Dtype* bottom_data = blob_bottom_->cpu_data(); + const Dtype* top_data = blob_top_->cpu_data(); + for (int i = 0; i < blob_bottom_->count(); ++i) { + const Dtype bottom_val = bottom_data[i]; + const Dtype top_val = top_data[i]; + if (base == -1) { + EXPECT_NEAR(top_val, exp(shift + scale * bottom_val), kDelta); + } else { + EXPECT_NEAR(top_val, pow(base, shift + scale * bottom_val), kDelta); + } + } + } + + void TestExpGradient(const float base, const float scale, const float shift) { + LayerParameter layer_param; + layer_param.mutable_exp_param()->set_base(base); + layer_param.mutable_exp_param()->set_scale(scale); + layer_param.mutable_exp_param()->set_shift(shift); + ExpLayer<Dtype> layer(layer_param); + GradientChecker<Dtype> checker(1e-2, 1e-3); + checker.CheckGradientEltwise(&layer, blob_bottom_vec_, blob_top_vec_); + } }; TYPED_TEST_CASE(NeuronLayerTest, TestDtypesAndDevices); @@ -201,6 +233,88 @@ TYPED_TEST(NeuronLayerTest, TestTanHGradient) { this->blob_top_vec_); } +TYPED_TEST(NeuronLayerTest, TestExpLayer) { + typedef typename TypeParam::Dtype Dtype; + // Test default base of "-1" -- should actually set base := e. + const Dtype kBase = -1; + const Dtype kScale = 1; + const Dtype kShift = 0; + this->TestExpForward(kBase, kScale, kShift); +} + +TYPED_TEST(NeuronLayerTest, TestExpGradient) { + typedef typename TypeParam::Dtype Dtype; + // Test default base of "-1" -- should actually set base := e. + const Dtype kBase = -1; + const Dtype kScale = 1; + const Dtype kShift = 0; + this->TestExpGradient(kBase, kScale, kShift); +} + +TYPED_TEST(NeuronLayerTest, TestExpLayerBase2) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kBase = 2; + const Dtype kScale = 1; + const Dtype kShift = 0; + this->TestExpForward(kBase, kScale, kShift); +} + +TYPED_TEST(NeuronLayerTest, TestExpGradientBase2) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kBase = 2; + const Dtype kScale = 1; + const Dtype kShift = 0; + this->TestExpGradient(kBase, kScale, kShift); +} + +TYPED_TEST(NeuronLayerTest, TestExpLayerBase2Shift1) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kBase = 2; + const Dtype kScale = 1; + const Dtype kShift = 1; + this->TestExpForward(kBase, kScale, kShift); +} + +TYPED_TEST(NeuronLayerTest, TestExpGradientBase2Shift1) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kBase = 2; + const Dtype kScale = 1; + const Dtype kShift = 1; + this->TestExpGradient(kBase, kScale, kShift); +} + +TYPED_TEST(NeuronLayerTest, TestExpLayerBase2Scale3) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kBase = 2; + const Dtype kScale = 3; + const Dtype kShift = 0; + this->TestExpForward(kBase, kScale, kShift); +} + +TYPED_TEST(NeuronLayerTest, TestExpGradientBase2Scale3) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kBase = 2; + const Dtype kScale = 3; + const Dtype kShift = 0; + this->TestExpGradient(kBase, kScale, kShift); +} + +TYPED_TEST(NeuronLayerTest, TestExpLayerBase2Shift1Scale3) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kBase = 2; + const Dtype kScale = 3; + const Dtype kShift = 1; + this->TestExpForward(kBase, kScale, kShift); +} + +TYPED_TEST(NeuronLayerTest, TestExpGradientBase2Shift1Scale3) { + typedef typename TypeParam::Dtype Dtype; + const Dtype kBase = 2; + const Dtype kScale = 3; + const Dtype kShift = 1; + this->TestExpGradient(kBase, kScale, kShift); +} + TYPED_TEST(NeuronLayerTest, TestDropoutHalf) { const float kDropoutRatio = 0.5; this->TestDropoutForward(kDropoutRatio); From 159a422aab94d465e73b02a5d377e695c3cefc51 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 2 Oct 2014 16:20:04 -0700 Subject: [PATCH 0863/2053] [fix] comment typo --- src/caffe/test/test_net.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 9b10d100afb..d48a60ece46 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -993,7 +993,7 @@ TYPED_TEST(NetTest, TestSharedWeightsUpdate) { // Check that data blobs of shared weights share the same location in memory. EXPECT_EQ(ip1_weights->cpu_data(), ip2_weights->cpu_data()); // Check that diff blobs of shared weights are at different locations in - // locations. (The diffs should be accumulated at update time.) + // memory. (The diffs should be accumulated at update time.) EXPECT_NE(ip1_weights->cpu_diff(), ip2_weights->cpu_diff()); this->net_->Forward(bottom); this->net_->Backward(); From 4dc5bd0953aee7771487a1d8f989bbef6aecb72d Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 2 Oct 2014 17:11:38 -0700 Subject: [PATCH 0864/2053] save/restore shared weights unit test --- src/caffe/test/test_net.cpp | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index d48a60ece46..930486dd6c5 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -1068,6 +1068,54 @@ TYPED_TEST(NetTest, TestSharedWeightsUpdate) { } } +TYPED_TEST(NetTest, TestSharedWeightsResume) { + typedef typename TypeParam::Dtype Dtype; + + // Create a net with weight sharing; Update it once. + Caffe::set_random_seed(this->seed_); + this->InitDiffDataSharedWeightsNet(); + vector<Blob<Dtype>*> bottom; + EXPECT_EQ(this->net_->layer_names()[1], "innerproduct1"); + EXPECT_EQ(this->net_->layer_names()[2], "innerproduct2"); + Blob<Dtype>* ip1_weights = this->net_->layers()[1]->blobs()[0].get(); + Blob<Dtype>* ip2_weights = this->net_->layers()[2]->blobs()[0].get(); + // Check that data blobs of shared weights share the same location in memory. + EXPECT_EQ(ip1_weights->cpu_data(), ip2_weights->cpu_data()); + // Check that diff blobs of shared weights are at different locations in + // memory. (The diffs should be accumulated at update time.) + EXPECT_NE(ip1_weights->cpu_diff(), ip2_weights->cpu_diff()); + this->net_->ForwardBackward(bottom); + this->net_->Update(); + Blob<Dtype> shared_params; + const bool kReshape = true; + const bool kCopyDiff = false; + shared_params.CopyFrom(*ip1_weights, kCopyDiff, kReshape); + const int count = ip1_weights->count(); + + // Write the net to a NetParameter, as in Solver::Snapshot. + NetParameter net_param; + this->net_->ToProto(&net_param); + + // Reinitialize the net and copy parameters from net_param, as in + // Solver::Restore. + Caffe::set_random_seed(this->seed_); + this->InitDiffDataSharedWeightsNet(); + this->net_->CopyTrainedLayersFrom(net_param); + ip1_weights = this->net_->layers()[1]->blobs()[0].get(); + ip2_weights = this->net_->layers()[2]->blobs()[0].get(); + ASSERT_FALSE(NULL == ip1_weights); + ASSERT_FALSE(NULL == ip2_weights); + EXPECT_NE(ip1_weights, ip2_weights); + // Check that data blobs of shared weights share the same location in memory. + EXPECT_EQ(ip1_weights->cpu_data(), ip2_weights->cpu_data()); + for (int i = 0; i < count; ++i) { + EXPECT_FLOAT_EQ(shared_params.cpu_data()[i], ip1_weights->cpu_data()[i]); + } + // Check that diff blobs of shared weights are at different locations in + // memory. (The diffs should be accumulated at update time.) + EXPECT_NE(ip1_weights->cpu_diff(), ip2_weights->cpu_diff()); +} + TYPED_TEST(NetTest, TestParamPropagateDown) { typedef typename TypeParam::Dtype Dtype; vector<Blob<Dtype>*> bottom; From 7182bfb831c3c4dc37817af7695e6247cb9eae5c Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama <sguada@gmail.com> Date: Fri, 19 Sep 2014 17:10:59 -0700 Subject: [PATCH 0865/2053] Move data_mean into data_transformer remove datum_* from BaseData Conflicts: src/caffe/layers/memory_data_layer.cpp --- include/caffe/data_layers.hpp | 14 ++------------ include/caffe/data_transformer.hpp | 16 ++++++++++++++-- src/caffe/data_transformer.cpp | 18 ++++++++++++++++++ src/caffe/layers/base_data_layer.cpp | 25 +------------------------ src/caffe/layers/data_layer.cpp | 8 ++------ src/caffe/layers/image_data_layer.cpp | 7 +------ src/caffe/layers/memory_data_layer.cpp | 21 +++++++++------------ src/caffe/layers/window_data_layer.cpp | 12 ++++++++++++ 8 files changed, 59 insertions(+), 62 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index c1720b7f8ad..bf06865c7d7 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -46,20 +46,9 @@ class BaseDataLayer : public Layer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) {} - int datum_channels() const { return datum_channels_; } - int datum_height() const { return datum_height_; } - int datum_width() const { return datum_width_; } - int datum_size() const { return datum_size_; } - protected: TransformationParameter transform_param_; DataTransformer<Dtype> data_transformer_; - int datum_channels_; - int datum_height_; - int datum_width_; - int datum_size_; - Blob<Dtype> data_mean_; - const Dtype* mean_; Caffe::Phase phase_; bool output_labels_; }; @@ -299,7 +288,7 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - int batch_size_; + int batch_size_, channels_, height_, width_, size_; Dtype* data_; Dtype* labels_; int n_; @@ -339,6 +328,7 @@ class WindowDataLayer : public BasePrefetchingDataLayer<Dtype> { enum WindowField { IMAGE_INDEX, LABEL, OVERLAP, X1, Y1, X2, Y2, NUM }; vector<vector<float> > fg_windows_; vector<vector<float> > bg_windows_; + Blob<Dtype> data_mean_; }; } // namespace caffe diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 3ca99e7b62c..33afa72359b 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -3,6 +3,7 @@ #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/io.hpp" namespace caffe { @@ -16,6 +17,14 @@ class DataTransformer { explicit DataTransformer(const TransformationParameter& param) : param_(param) { phase_ = Caffe::phase(); + // check if we want to have mean + if (param_.has_mean_file()) { + const string& mean_file = param.mean_file(); + LOG(INFO) << "Loading mean file from" << mean_file; + BlobProto blob_proto; + ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); + data_mean_.FromProto(blob_proto); + } } virtual ~DataTransformer() {} @@ -30,13 +39,13 @@ class DataTransformer { * writing position in the top blob's data * @param datum * Datum containing the data to be transformed. - * @param mean * @param transformed_data * This is meant to be the top blob's data. The transformed data will be * written at the appropriate place within the blob's data. */ + void Transform(const int batch_item_id, const Datum& datum, - const Dtype* mean, Dtype* transformed_data); + Dtype* transformed_data); protected: /** @@ -49,12 +58,15 @@ class DataTransformer { */ virtual int Rand(int n); + void Transform(const int batch_item_id, const Datum& datum, + const Dtype* mean, Dtype* transformed_data); // Tranformation parameters TransformationParameter param_; shared_ptr<Caffe::RNG> rng_; Caffe::Phase phase_; + Blob<Dtype> data_mean_; }; } // namespace caffe diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index e52c3b6a55d..81cb17b5cd0 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -6,6 +6,24 @@ namespace caffe { + +template<typename Dtype> +void DataTransformer<Dtype>::Transform(const int batch_item_id, + const Datum& datum, + Dtype* transformed_data) { + + CHECK_GT(datum.channels(), 0); + CHECK_GE(datum.height(), param_.crop_size()); + CHECK_GE(datum.height(), param_.crop_size()); + const int size = datum.channels() * datum.height() * datum.width(); + if (data_mean_.count() < size) { + data_mean_.Reshape(1, datum.channels(), datum.height(), datum.width()); + LOG(INFO) << "Transform without mean"; + } + const Dtype* mean = data_mean_.cpu_data(); + Transform(batch_item_id, datum, mean, transformed_data); +} + template<typename Dtype> void DataTransformer<Dtype>::Transform(const int batch_item_id, const Datum& datum, diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 86abbae8f4c..5038d532ee1 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -21,31 +21,8 @@ void BaseDataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, } else { output_labels_ = true; } + // The subclasses should setup the size of bottom and top DataLayerSetUp(bottom, top); - // The subclasses should setup the datum channels, height and width - CHECK_GT(datum_channels_, 0); - CHECK_GT(datum_height_, 0); - CHECK_GT(datum_width_, 0); - if (transform_param_.crop_size() > 0) { - CHECK_GE(datum_height_, transform_param_.crop_size()); - CHECK_GE(datum_width_, transform_param_.crop_size()); - } - // check if we want to have mean - if (transform_param_.has_mean_file()) { - const string& mean_file = transform_param_.mean_file(); - LOG(INFO) << "Loading mean file from" << mean_file; - BlobProto blob_proto; - ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); - data_mean_.FromProto(blob_proto); - CHECK_GE(data_mean_.num(), 1); - CHECK_GE(data_mean_.channels(), datum_channels_); - CHECK_GE(data_mean_.height(), datum_height_); - CHECK_GE(data_mean_.width(), datum_width_); - } else { - // Simply initialize an all-empty mean. - data_mean_.Reshape(1, datum_channels_, datum_height_, datum_width_); - } - mean_ = data_mean_.cpu_data(); data_transformer_.InitRand(); } diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index b3b6bf3d64f..3867a87f8b0 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -134,11 +134,7 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, this->prefetch_label_.Reshape(this->layer_param_.data_param().batch_size(), 1, 1, 1); } - // datum size - this->datum_channels_ = datum.channels(); - this->datum_height_ = datum.height(); - this->datum_width_ = datum.width(); - this->datum_size_ = datum.channels() * datum.height() * datum.width(); + } // This function is used to create a thread that prefetches the data. @@ -172,7 +168,7 @@ void DataLayer<Dtype>::InternalThreadEntry() { } // Apply data transformations (mirror, scale, crop...) - this->data_transformer_.Transform(item_id, datum, this->mean_, top_data); + this->data_transformer_.Transform(item_id, datum, top_data); if (this->output_labels_) { top_label[item_id] = datum.label(); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index dc972f13799..a5d46fd0c63 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -76,11 +76,6 @@ void ImageDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // label top[1]->Reshape(batch_size, 1, 1, 1); this->prefetch_label_.Reshape(batch_size, 1, 1, 1); - // datum size - this->datum_channels_ = datum.channels(); - this->datum_height_ = datum.height(); - this->datum_width_ = datum.width(); - this->datum_size_ = datum.channels() * datum.height() * datum.width(); } template <typename Dtype> @@ -114,7 +109,7 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { } // Apply transformations (mirror, crop...) to the data - this->data_transformer_.Transform(item_id, datum, this->mean_, top_data); + this->data_transformer_.Transform(item_id, datum, top_data); top_label[item_id] = datum.label(); // go to the next iter diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index d254da34322..269a2679777 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -10,19 +10,16 @@ template <typename Dtype> void MemoryDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { batch_size_ = this->layer_param_.memory_data_param().batch_size(); - this->datum_channels_ = this->layer_param_.memory_data_param().channels(); - this->datum_height_ = this->layer_param_.memory_data_param().height(); - this->datum_width_ = this->layer_param_.memory_data_param().width(); - this->datum_size_ = this->datum_channels_ * this->datum_height_ * - this->datum_width_; - CHECK_GT(batch_size_ * this->datum_size_, 0) << + channels_ = this->layer_param_.memory_data_param().channels(); + height_ = this->layer_param_.memory_data_param().height(); + width_ = this->layer_param_.memory_data_param().width(); + size_ = channels_ * height_ * width_; + CHECK_GT(batch_size_ * size_, 0) << "batch_size, channels, height, and width must be specified and" " positive in memory_data_param"; - top[0]->Reshape(batch_size_, this->datum_channels_, this->datum_height_, - this->datum_width_); + top[0]->Reshape(batch_size_, channels_, height_, width_); top[1]->Reshape(batch_size_, 1, 1, 1); - added_data_.Reshape(batch_size_, this->datum_channels_, this->datum_height_, - this->datum_width_); + added_data_.Reshape(batch_size_, channels_, height_, width_); added_label_.Reshape(batch_size_, 1, 1, 1); data_ = NULL; labels_ = NULL; @@ -45,7 +42,7 @@ void MemoryDataLayer<Dtype>::AddDatumVector(const vector<Datum>& datum_vector) { for (int batch_item_id = 0; batch_item_id < num; ++batch_item_id) { // Apply data transformations (mirror, scale, crop...) this->data_transformer_.Transform( - batch_item_id, datum_vector[batch_item_id], this->mean_, top_data); + batch_item_id, datum_vector[batch_item_id], top_data); top_label[batch_item_id] = datum_vector[batch_item_id].label(); } // num_images == batch_size_ @@ -68,7 +65,7 @@ template <typename Dtype> void MemoryDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { CHECK(data_) << "MemoryDataLayer needs to be initalized by calling Reset"; - top[0]->set_cpu_data(data_ + pos_ * this->datum_size_); + top[0]->set_cpu_data(data_ + pos_ * size_); top[1]->set_cpu_data(labels_ + pos_); pos_ = (pos_ + batch_size_) % n_; has_new_data_ = false; diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 33a473d64bf..88afe829537 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -167,6 +167,18 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // label top[1]->Reshape(batch_size, 1, 1, 1); this->prefetch_label_.Reshape(batch_size, 1, 1, 1); + + // data mean + if (this->layer_param_.window_data_param().has_mean_file()) { + const string& mean_file = + this->layer_param_.window_data_param().mean_file(); + LOG(INFO) << "Loading mean file from" << mean_file; + BlobProto blob_proto; + ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); + data_mean_.FromProto(blob_proto); + } else { + data_mean_.Reshape(1, channels, crop_size, crop_size); + } } template <typename Dtype> From e9c08e5a8c39508ecff052ef36df63bf883d2dad Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama <sguada@gmail.com> Date: Thu, 11 Sep 2014 15:19:57 -0700 Subject: [PATCH 0866/2053] Fixed MemoryDataLayer to make it work with pycaffe --- include/caffe/data_layers.hpp | 3 +++ include/caffe/data_transformer.hpp | 13 +------------ python/caffe/_caffe.cpp | 4 ++-- src/caffe/data_transformer.cpp | 14 +++++++++++++- src/caffe/layers/data_layer.cpp | 1 - src/caffe/layers/window_data_layer.cpp | 2 +- 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index bf06865c7d7..e598a71db0a 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -283,6 +283,9 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { void Reset(Dtype* data, Dtype* label, int n); int batch_size() { return batch_size_; } + int channels() { return channels_; } + int height() { return height_; } + int width() { return width_; } protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 33afa72359b..fcd101165cf 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -14,18 +14,7 @@ namespace caffe { template <typename Dtype> class DataTransformer { public: - explicit DataTransformer(const TransformationParameter& param) - : param_(param) { - phase_ = Caffe::phase(); - // check if we want to have mean - if (param_.has_mean_file()) { - const string& mean_file = param.mean_file(); - LOG(INFO) << "Loading mean file from" << mean_file; - BlobProto blob_proto; - ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); - data_mean_.FromProto(blob_proto); - } - } + explicit DataTransformer(const TransformationParameter& param); virtual ~DataTransformer() {} void InitRand(); diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 5a8d99d3f22..33e68fe40fa 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -106,8 +106,8 @@ void PyNet::set_input_arrays(bp::object data_obj, bp::object labels_obj) { reinterpret_cast<PyArrayObject*>(data_obj.ptr()); PyArrayObject* labels_arr = reinterpret_cast<PyArrayObject*>(labels_obj.ptr()); - check_contiguous_array(data_arr, "data array", md_layer->datum_channels(), - md_layer->datum_height(), md_layer->datum_width()); + check_contiguous_array(data_arr, "data array", md_layer->channels(), + md_layer->height(), md_layer->width()); check_contiguous_array(labels_arr, "labels array", 1, 1, 1); if (PyArray_DIMS(data_arr)[0] != PyArray_DIMS(labels_arr)[0]) { throw std::runtime_error("data and labels must have the same first" diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 81cb17b5cd0..553717a50da 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -6,12 +6,24 @@ namespace caffe { +template<typename Dtype> +DataTransformer<Dtype>::DataTransformer(const TransformationParameter& param) + : param_(param) { + phase_ = Caffe::phase(); + // check if we want to have mean + if (param_.has_mean_file()) { + const string& mean_file = param.mean_file(); + LOG(INFO) << "Loading mean file from" << mean_file; + BlobProto blob_proto; + ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); + data_mean_.FromProto(blob_proto); + } +} template<typename Dtype> void DataTransformer<Dtype>::Transform(const int batch_item_id, const Datum& datum, Dtype* transformed_data) { - CHECK_GT(datum.channels(), 0); CHECK_GE(datum.height(), param_.crop_size()); CHECK_GE(datum.height(), param_.crop_size()); diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 3867a87f8b0..40c48735b41 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -134,7 +134,6 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, this->prefetch_label_.Reshape(this->layer_param_.data_param().batch_size(), 1, 1, 1); } - } // This function is used to create a thread that prefetches the data. diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 88afe829537..6b70aa3cf22 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -170,7 +170,7 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // data mean if (this->layer_param_.window_data_param().has_mean_file()) { - const string& mean_file = + const string& mean_file = this->layer_param_.window_data_param().mean_file(); LOG(INFO) << "Loading mean file from" << mean_file; BlobProto blob_proto; From 4602439900b616c590b9873f7bebdf3f9ecf716c Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Thu, 25 Sep 2014 19:58:06 -0700 Subject: [PATCH 0867/2053] Initial cv::Mat transformation Added cv::Mat transformation to ImageDataLayer Conflicts: src/caffe/layers/image_data_layer.cpp Added transform Datum to Blob Conflicts: src/caffe/layers/base_data_layer.cpp src/caffe/layers/base_data_layer.cu Added transform cv::Mat to Blob Added transform Vector<Datum> to Blob Conflicts: src/caffe/data_transformer.cpp --- include/caffe/data_layers.hpp | 3 + include/caffe/data_transformer.hpp | 17 +- include/caffe/util/benchmark.hpp | 2 + include/caffe/util/io.hpp | 18 ++ src/caffe/data_transformer.cpp | 393 +++++++++++++++++++++---- src/caffe/layers/base_data_layer.cpp | 7 + src/caffe/layers/base_data_layer.cu | 2 + src/caffe/layers/data_layer.cpp | 17 +- src/caffe/layers/image_data_layer.cpp | 49 +-- src/caffe/layers/memory_data_layer.cpp | 12 +- src/caffe/proto/caffe.proto | 2 + src/caffe/util/benchmark.cpp | 22 ++ src/caffe/util/io.cpp | 17 ++ 13 files changed, 461 insertions(+), 100 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index e598a71db0a..e3ba2d13ccf 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -17,6 +17,7 @@ #include "caffe/internal_thread.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/benchmark.hpp" namespace caffe { @@ -51,6 +52,7 @@ class BaseDataLayer : public Layer<Dtype> { DataTransformer<Dtype> data_transformer_; Caffe::Phase phase_; bool output_labels_; + Timer timer_forward_; }; template <typename Dtype> @@ -79,6 +81,7 @@ class BasePrefetchingDataLayer : protected: Blob<Dtype> prefetch_data_; Blob<Dtype> prefetch_label_; + Blob<Dtype> transformed_data_; }; template <typename Dtype> diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index fcd101165cf..23594217d91 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -1,9 +1,11 @@ #ifndef CAFFE_DATA_TRANSFORMER_HPP #define CAFFE_DATA_TRANSFORMER_HPP +#include <opencv2/core/core.hpp> + +#include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" -#include "caffe/util/io.hpp" namespace caffe { @@ -33,8 +35,15 @@ class DataTransformer { * written at the appropriate place within the blob's data. */ - void Transform(const int batch_item_id, const Datum& datum, - Dtype* transformed_data); + void Transform(const Datum& datum, Dtype* transformed_data); + + void Transform(const Datum& datum, Blob<Dtype>* transformed_blob); + + void Transform(const vector<Datum> & datum_vector, Blob<Dtype>* transformed_blob); + + void Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob); + + void Transform(Blob<Dtype>* input_blob, Blob<Dtype>* transformed_blob); protected: /** @@ -47,8 +56,6 @@ class DataTransformer { */ virtual int Rand(int n); - void Transform(const int batch_item_id, const Datum& datum, - const Dtype* mean, Dtype* transformed_data); // Tranformation parameters TransformationParameter param_; diff --git a/include/caffe/util/benchmark.hpp b/include/caffe/util/benchmark.hpp index f7ef8eaf3ee..6c01ac4ee18 100644 --- a/include/caffe/util/benchmark.hpp +++ b/include/caffe/util/benchmark.hpp @@ -14,6 +14,7 @@ class Timer { void Start(); void Stop(); float MilliSeconds(); + float MicroSeconds(); float Seconds(); inline bool initted() { return initted_; } @@ -33,6 +34,7 @@ class Timer { boost::posix_time::ptime start_cpu_; boost::posix_time::ptime stop_cpu_; float elapsed_milliseconds_; + float elapsed_microseconds_; }; } // namespace caffe diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 8dd338d2603..88037c86035 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -7,6 +7,7 @@ #include "google/protobuf/message.h" #include "hdf5.h" #include "hdf5_hl.h" +#include <opencv2/core/core.hpp> #include "caffe/blob.hpp" #include "caffe/proto/caffe.pb.h" @@ -102,6 +103,23 @@ inline bool ReadImageToDatum(const string& filename, const int label, return ReadImageToDatum(filename, label, 0, 0, datum); } +cv::Mat ReadImageToCVMat(const string& filename, + const int height, const int width, const bool is_color); + +inline cv::Mat ReadImageToCVMat(const string& filename, + const int height, const int width) { + return ReadImageToCVMat(filename, height, width, true); +} + +inline cv::Mat ReadImageToCVMat(const string& filename, + const bool is_color) { + return ReadImageToCVMat(filename, 0, 0, is_color); +} + +inline cv::Mat ReadImageToCVMat(const string& filename) { + return ReadImageToCVMat(filename, 0, 0, true); +} + leveldb::Options GetLevelDBOptions(); template <typename Dtype> diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 553717a50da..836bf3b05c4 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -1,9 +1,12 @@ #include <string> #include "caffe/data_transformer.hpp" +#include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" +#include <opencv2/core/core.hpp> + namespace caffe { template<typename Dtype> @@ -21,105 +24,365 @@ DataTransformer<Dtype>::DataTransformer(const TransformationParameter& param) } template<typename Dtype> -void DataTransformer<Dtype>::Transform(const int batch_item_id, - const Datum& datum, - Dtype* transformed_data) { - CHECK_GT(datum.channels(), 0); - CHECK_GE(datum.height(), param_.crop_size()); - CHECK_GE(datum.height(), param_.crop_size()); - const int size = datum.channels() * datum.height() * datum.width(); - if (data_mean_.count() < size) { - data_mean_.Reshape(1, datum.channels(), datum.height(), datum.width()); - LOG(INFO) << "Transform without mean"; - } - const Dtype* mean = data_mean_.cpu_data(); - Transform(batch_item_id, datum, mean, transformed_data); -} - -template<typename Dtype> -void DataTransformer<Dtype>::Transform(const int batch_item_id, - const Datum& datum, - const Dtype* mean, +void DataTransformer<Dtype>::Transform(const Datum& datum, Dtype* transformed_data) { const string& data = datum.data(); - const int channels = datum.channels(); - const int height = datum.height(); - const int width = datum.width(); + const int datum_channels = datum.channels(); + const int datum_height = datum.height(); + const int datum_width = datum.width(); const int size = datum.channels() * datum.height() * datum.width(); const int crop_size = param_.crop_size(); - const bool mirror = param_.mirror(); const Dtype scale = param_.scale(); + const bool do_mirror = param_.mirror() && Rand() % 2; + const bool has_mean_file = param_.has_mean_file(); + const bool has_unit8 = data.size() > 0; + + CHECK_GT(datum_channels, 0); + CHECK_GE(datum_height, crop_size); + CHECK_GE(datum_width, crop_size); - if (mirror && crop_size == 0) { - LOG(FATAL) << "Current implementation requires mirror and crop_size to be " - << "set at the same time."; + Dtype* mean = NULL; + if (has_mean_file) { + CHECK_EQ(datum_channels, data_mean_.channels()); + CHECK_EQ(datum_height, data_mean_.height()); + CHECK_EQ(datum_width, data_mean_.width()); + mean = data_mean_.mutable_cpu_data(); } + int h_off = 0; + int w_off = 0; + Dtype datum_element; if (crop_size) { - CHECK(data.size()) << "Image cropping only support uint8 data"; - int h_off, w_off; // We only do random crop when we do training. if (phase_ == Caffe::TRAIN) { h_off = Rand(height - crop_size + 1); w_off = Rand(width - crop_size + 1); } else { - h_off = (height - crop_size) / 2; - w_off = (width - crop_size) / 2; + h_off = (datum_height - crop_size) / 2; + w_off = (datum_width - crop_size) / 2; } - if (mirror && (Rand(2) == 1)) { - // Copy mirrored version - for (int c = 0; c < channels; ++c) { - for (int h = 0; h < crop_size; ++h) { - for (int w = 0; w < crop_size; ++w) { - int data_index = (c * height + h + h_off) * width + w + w_off; - int top_index = ((batch_item_id * channels + c) * crop_size + h) - * crop_size + (crop_size - 1 - w); - Dtype datum_element = - static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); + + int top_index, data_index; + for (int c = 0; c < datum_channels; ++c) { + int top_index_c = c * crop_size; + int data_index_c = c * datum_height + h_off; + for (int h = 0; h < crop_size; ++h) { + int top_index_h = (top_index_c + h) * crop_size; + int data_index_h = (data_index_c + h) * datum_width + w_off; + for (int w = 0; w < crop_size; ++w) { + data_index = data_index_h + w; + if (do_mirror) { + top_index = top_index_h + (crop_size - 1 - w); + } else { + top_index = top_index_h + w; + } + if (has_unit8) { + datum_element = + static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); + } else { + datum_element = datum.float_data(data_index); + } + if (has_mean_file) { transformed_data[top_index] = - (datum_element - mean[data_index]) * scale; + (datum_element - mean[data_index]) * scale; + } else { + transformed_data[top_index] = datum_element * scale; } } } + } + } else { + for (int j = 0; j < size; ++j) { + if (has_unit8) { + datum_element = + static_cast<Dtype>(static_cast<uint8_t>(data[j])); + } else { + datum_element = datum.float_data(j); + } + if (has_mean_file) { + transformed_data[j] = + (datum_element - mean[j]) * scale; + } else { + transformed_data[j] = datum_element * scale; + } + } + } +} + +template<typename Dtype> +void DataTransformer<Dtype>::Transform(const Datum& datum, + Blob<Dtype>* transformed_blob) { + const string& data = datum.data(); + const int datum_channels = datum.channels(); + const int datum_height = datum.height(); + const int datum_width = datum.width(); + + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + + CHECK_EQ(datum_channels, channels); + CHECK_GE(datum_height, height); + CHECK_GE(datum_width, width); + + CHECK_EQ(transformed_blob->num(), 1) << + "transformed_blob should have num() = 1"; + + const int crop_size = param_.crop_size(); + const Dtype scale = param_.scale(); + const bool do_mirror = param_.mirror() && Rand() % 2; + const bool has_mean_file = param_.has_mean_file(); + const bool has_unit8 = data.size()>0; + + int h_off = 0; + int w_off = 0; + if (crop_size) { + CHECK_EQ(crop_size, height); + CHECK_EQ(crop_size, width); + // We only do random crop when we do training. + if (phase_ == Caffe::TRAIN) { + h_off = Rand() % (datum_height - crop_size); + w_off = Rand() % (datum_width - crop_size); } else { - // Normal copy - for (int c = 0; c < channels; ++c) { - for (int h = 0; h < crop_size; ++h) { - for (int w = 0; w < crop_size; ++w) { - int top_index = ((batch_item_id * channels + c) * crop_size + h) - * crop_size + w; - int data_index = (c * height + h + h_off) * width + w + w_off; - Dtype datum_element = - static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); - transformed_data[top_index] = - (datum_element - mean[data_index]) * scale; - } + h_off = (datum_height - crop_size) / 2; + w_off = (datum_width - crop_size) / 2; + } + } else { + CHECK_EQ(datum_height, height); + CHECK_EQ(datum_width, width); + } + + Dtype* transformed_data = transformed_blob->mutable_cpu_data(); + + Dtype* mean = NULL; + if (has_mean_file) { + CHECK_EQ(datum_channels, data_mean_.channels()); + CHECK_EQ(datum_height, data_mean_.height()); + CHECK_EQ(datum_width, data_mean_.width()); + mean = data_mean_.mutable_cpu_data(); + } + + Dtype datum_element; + int top_index, data_index; + for (int c = 0; c < channels; ++c) { + int top_index_c = c * height; + int data_index_c = c * datum_height + h_off; + for (int h = 0; h < height; ++h) { + int top_index_h = (top_index_c + h) * width; + int data_index_h = (data_index_c + h) * datum_width + w_off; + for (int w = 0; w < width; ++w) { + data_index = data_index_h + w; + if (do_mirror) { + top_index = top_index_h + (width - 1 - w); + } else { + top_index = top_index_h + w; + } + if (has_unit8) { + datum_element = + static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); + } else { + datum_element = datum.float_data(data_index); + } + if (has_mean_file) { + transformed_data[top_index] = + (datum_element - mean[data_index]) * scale; + } else { + transformed_data[top_index] = datum_element * scale; } } } + } +} + +template<typename Dtype> +void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, + Blob<Dtype>* transformed_blob) { + const int datum_num = datum_vector.size(); + const int num = transformed_blob->num(); + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + + CHECK_GT(datum_num, 0) << "There is no datum to add"; + CHECK_LE(datum_num, num) << + "The size of datum_vector must be smaller than transformed_blob->num()"; + Blob<Dtype> uni_blob(1, channels, height, width); + for (int item_id = 0; item_id < datum_num; ++item_id) { + int offset = transformed_blob->offset(item_id); + uni_blob.set_cpu_data(transformed_blob->mutable_cpu_data() + offset); + Transform(datum_vector[item_id], &uni_blob); + } +} + +template<typename Dtype> +void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, + Blob<Dtype>* transformed_blob) { + + const int img_channels = cv_img.channels(); + const int img_height = cv_img.rows; + const int img_width = cv_img.cols; + + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + + CHECK_EQ(img_channels, channels); + CHECK_GE(img_height, height); + CHECK_GE(img_width, width); + + CHECK_EQ(transformed_blob->num(), 1) << + "transformed_blob should have num() = 1"; + + const int crop_size = param_.crop_size(); + const Dtype scale = param_.scale(); + const bool do_mirror = param_.mirror() && Rand() % 2; + const bool has_mean_file = param_.has_mean_file(); + + int h_off = 0; + int w_off = 0; + if (crop_size) { + CHECK_EQ(crop_size, height); + CHECK_EQ(crop_size, width); + // We only do random crop when we do training. + if (phase_ == Caffe::TRAIN) { + h_off = Rand() % (img_height - crop_size); + w_off = Rand() % (img_width - crop_size); + } else { + h_off = (img_height - crop_size) / 2; + w_off = (img_width - crop_size) / 2; + } } else { - // we will prefer to use data() first, and then try float_data() - if (data.size()) { - for (int j = 0; j < size; ++j) { - Dtype datum_element = - static_cast<Dtype>(static_cast<uint8_t>(data[j])); - transformed_data[j + batch_item_id * size] = - (datum_element - mean[j]) * scale; + CHECK_EQ(img_height, height); + CHECK_EQ(img_width, width); + } + + Dtype* mean = NULL; + if (has_mean_file) { + CHECK_EQ(img_channels, data_mean_.channels()); + CHECK_EQ(img_height, data_mean_.height()); + CHECK_EQ(img_width, data_mean_.width()); + mean = data_mean_.mutable_cpu_data(); + } + + Dtype* transformed_data = transformed_blob->mutable_cpu_data(); + Dtype pixel; + int top_index; + for (int c = 0; c < channels; ++c) { + int top_index_c = c * height; + int mean_index_c = c * img_height + h_off; + for (int h = 0; h < height; ++h) { + int top_index_h = (top_index_c + h) * width; + int mean_index_h = (mean_index_c + h) * img_width + w_off; + for (int w = 0; w < width; ++w) { + if (do_mirror) { + top_index = top_index_h + (width - 1 - w); + } else { + top_index = top_index_h + w; + } + pixel = static_cast<Dtype>( + cv_img.at<cv::Vec3b>(h + h_off, w + w_off)[c]); + if (has_mean_file) { + int mean_index = mean_index_h + w; + transformed_data[top_index] = (pixel - mean[mean_index]) * scale; + } else { + transformed_data[top_index] = pixel * scale; + } } + } + } +} + + +template<typename Dtype> +void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, + Blob<Dtype>* transformed_blob) { + + const int input_num = input_blob->num(); + const int input_channels = input_blob->channels(); + const int input_height = input_blob->height(); + const int input_width = input_blob->width(); + + const int num = transformed_blob->num(); + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + const int size = transformed_blob->count(); + + CHECK_LE(input_num, num); + CHECK_EQ(input_channels, channels); + CHECK_GE(input_height, height); + CHECK_GE(input_width, width); + + const int crop_size = param_.crop_size(); + const Dtype scale = param_.scale(); + const bool do_mirror = param_.mirror() && Rand() % 2; + const bool has_mean_file = param_.has_mean_file(); + + int h_off = 0; + int w_off = 0; + if (crop_size) { + CHECK_EQ(crop_size, height); + CHECK_EQ(crop_size, width); + // We only do random crop when we do training. + if (phase_ == Caffe::TRAIN) { + h_off = Rand() % (input_height - crop_size); + w_off = Rand() % (input_width - crop_size); } else { - for (int j = 0; j < size; ++j) { - transformed_data[j + batch_item_id * size] = - (datum.float_data(j) - mean[j]) * scale; + h_off = (input_height - crop_size) / 2; + w_off = (input_width - crop_size) / 2; + } + } else { + CHECK_EQ(input_height, height); + CHECK_EQ(input_width, width); + } + + Dtype* input_data = input_blob->mutable_cpu_data(); + if (has_mean_file) { + CHECK_EQ(input_channels, data_mean_.channels()); + CHECK_EQ(input_height, data_mean_.height()); + CHECK_EQ(input_width, data_mean_.width()); + for (int n = 0; n < input_num; ++n) { + int offset = input_blob->offset(n); + caffe_sub(data_mean_.count(), input_data + offset, + data_mean_.cpu_data(), input_data + offset); + } + } + + Dtype* transformed_data = transformed_blob->mutable_cpu_data(); + + for (int n = 0; n < input_num; ++n) { + int top_index_n = n * channels; + int data_index_n = n * channels; + for (int c = 0; c < channels; ++c) { + int top_index_c = (top_index_n + c) * height; + int data_index_c = (data_index_n + c) * input_height + h_off; + for (int h = 0; h < height; ++h) { + int top_index_h = (top_index_c + h) * width; + int data_index_h = (data_index_c + h) * input_width + w_off; + if (do_mirror) { + int top_index_w = top_index_h + width - 1; + for (int w = 0; w < width; ++w) { + transformed_data[top_index_w-w] = input_data[data_index_h + w]; + } + } else { + for (int w = 0; w < width; ++w) { + transformed_data[top_index_h + w] = input_data[data_index_h + w]; + } + } } } } + if (scale!=Dtype(1)) { + DLOG(INFO) << "Scale: " << scale; + caffe_scal(size, scale, transformed_data); + } } template <typename Dtype> void DataTransformer<Dtype>::InitRand() { - const bool needs_rand = (phase_ == Caffe::TRAIN) && - (param_.mirror() || param_.crop_size()); + const bool needs_rand = param_.mirror() || + (phase_ == Caffe::TRAIN && param_.crop_size()); if (needs_rand) { const unsigned int rng_seed = caffe_rng_rand(); rng_.reset(new Caffe::RNG(rng_seed)); diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 5038d532ee1..d7d475229a5 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -59,16 +59,23 @@ template <typename Dtype> void BasePrefetchingDataLayer<Dtype>::Forward_cpu( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // First, join the thread + if (this->timer_forward_.has_run_at_least_once()) { + DLOG(INFO) << "Proccessing: " << this->timer_forward_.MilliSeconds() << "ms."; + } JoinPrefetchThread(); + DLOG(INFO) << "Thread joined"; // Copy the data caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), top[0]->mutable_cpu_data()); + DLOG(INFO) << "Prefetch copied"; if (this->output_labels_) { caffe_copy(prefetch_label_.count(), prefetch_label_.cpu_data(), top[1]->mutable_cpu_data()); } // Start a new prefetch thread + DLOG(INFO) << "CreatePrefetchThread"; CreatePrefetchThread(); + this->timer_forward_.Start(); } #ifdef CPU_ONLY diff --git a/src/caffe/layers/base_data_layer.cu b/src/caffe/layers/base_data_layer.cu index ff1510361b6..690858f09d3 100644 --- a/src/caffe/layers/base_data_layer.cu +++ b/src/caffe/layers/base_data_layer.cu @@ -7,6 +7,7 @@ namespace caffe { template <typename Dtype> void BasePrefetchingDataLayer<Dtype>::Forward_gpu( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { + DLOG(INFO) << "Processing: " << this->timer_forward_.MilliSeconds() << "ms."; // First, join the thread JoinPrefetchThread(); // Copy the data @@ -18,6 +19,7 @@ void BasePrefetchingDataLayer<Dtype>::Forward_gpu( } // Start a new prefetch thread CreatePrefetchThread(); + this->timer_forward_.Start(); } INSTANTIATE_CLASS(BasePrefetchingDataLayer); diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 40c48735b41..b1d7ef93806 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -8,6 +8,7 @@ #include "caffe/data_layers.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/benchmark.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -118,12 +119,15 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, datum.channels(), crop_size, crop_size); this->prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), crop_size, crop_size); + this->transformed_data_.Reshape(1, datum.channels(), crop_size, crop_size); } else { top[0]->Reshape( this->layer_param_.data_param().batch_size(), datum.channels(), datum.height(), datum.width()); this->prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), datum.height(), datum.width()); + this->transformed_data_.Reshape(1, datum.channels(), + datum.height(), datum.width()); } LOG(INFO) << "output data size: " << top[0]->num() << "," << top[0]->channels() << "," << top[0]->height() << "," @@ -139,10 +143,13 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // This function is used to create a thread that prefetches the data. template <typename Dtype> void DataLayer<Dtype>::InternalThreadEntry() { - Datum datum; + Timer batch_timer; + batch_timer.Start(); CHECK(this->prefetch_data_.count()); + CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); Dtype* top_label = NULL; // suppress warnings about uninitialized variables + if (this->output_labels_) { top_label = this->prefetch_label_.mutable_cpu_data(); } @@ -150,6 +157,7 @@ void DataLayer<Dtype>::InternalThreadEntry() { for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob + Datum datum; switch (this->layer_param_.data_param().backend()) { case DataParameter_DB_LEVELDB: CHECK(iter_); @@ -165,10 +173,10 @@ void DataLayer<Dtype>::InternalThreadEntry() { default: LOG(FATAL) << "Unknown database backend"; } - // Apply data transformations (mirror, scale, crop...) - this->data_transformer_.Transform(item_id, datum, top_data); - + int offset = this->prefetch_data_.offset(item_id); + this->transformed_data_.set_cpu_data(top_data + offset); + this->data_transformer_.Transform(datum, &(this->transformed_data_)); if (this->output_labels_) { top_label[item_id] = datum.label(); } @@ -196,6 +204,7 @@ void DataLayer<Dtype>::InternalThreadEntry() { LOG(FATAL) << "Unknown database backend"; } } + DLOG(INFO) << "Prefetch: " << batch_timer.MilliSeconds() << " ms."; } INSTANTIATE_CLASS(DataLayer); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index a5d46fd0c63..e167f134f97 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -22,6 +22,8 @@ void ImageDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { const int new_height = this->layer_param_.image_data_param().new_height(); const int new_width = this->layer_param_.image_data_param().new_width(); + const bool is_color = this->layer_param_.image_data_param().is_color(); + CHECK((new_height == 0 && new_width == 0) || (new_height > 0 && new_width > 0)) << "Current implementation requires " "new_height and new_width to be set at the same time."; @@ -53,22 +55,23 @@ void ImageDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK_GT(lines_.size(), skip) << "Not enough points to skip"; lines_id_ = skip; } - // Read a data point, and use it to initialize the top blob. - Datum datum; - CHECK(ReadImageToDatum(lines_[lines_id_].first, lines_[lines_id_].second, - new_height, new_width, &datum)); + // Read an image, and use it to initialize the top blob. + cv::Mat cv_img = ReadImageToCVMat(lines_[lines_id_].first, + new_height, new_width, is_color); + const int channels = cv_img.channels(); + const int height = cv_img.rows; + const int width = cv_img.cols; // image const int crop_size = this->layer_param_.transform_param().crop_size(); const int batch_size = this->layer_param_.image_data_param().batch_size(); if (crop_size > 0) { - top[0]->Reshape(batch_size, datum.channels(), crop_size, crop_size); - this->prefetch_data_.Reshape(batch_size, datum.channels(), crop_size, - crop_size); + top[0]->Reshape(batch_size, channels, crop_size, crop_size); + this->prefetch_data_.Reshape(batch_size, channels, crop_size, crop_size); + this->transformed_data_.Reshape(1, channels, crop_size, crop_size); } else { - top[0]->Reshape(batch_size, datum.channels(), datum.height(), - datum.width()); - this->prefetch_data_.Reshape(batch_size, datum.channels(), datum.height(), - datum.width()); + top[0]->Reshape(batch_size, channels, height, width); + this->prefetch_data_.Reshape(batch_size, channels, height, width); + this->transformed_data_.Reshape(1, channels, height, width); } LOG(INFO) << "output data size: " << top[0]->num() << "," << top[0]->channels() << "," << top[0]->height() << "," @@ -88,30 +91,35 @@ void ImageDataLayer<Dtype>::ShuffleImages() { // This function is used to create a thread that prefetches the data. template <typename Dtype> void ImageDataLayer<Dtype>::InternalThreadEntry() { - Datum datum; + Timer batch_timer; + batch_timer.Start(); CHECK(this->prefetch_data_.count()); + CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); ImageDataParameter image_data_param = this->layer_param_.image_data_param(); const int batch_size = image_data_param.batch_size(); const int new_height = image_data_param.new_height(); const int new_width = image_data_param.new_width(); + const bool is_color = image_data_param.is_color(); // datum scales const int lines_size = lines_.size(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob CHECK_GT(lines_size, lines_id_); - if (!ReadImageToDatum(lines_[lines_id_].first, - lines_[lines_id_].second, - new_height, new_width, &datum)) { + cv::Mat cv_img = ReadImageToCVMat(lines_[lines_id_].first, + new_height, new_width, is_color); + if (!cv_img.data) { continue; } - - // Apply transformations (mirror, crop...) to the data - this->data_transformer_.Transform(item_id, datum, top_data); - - top_label[item_id] = datum.label(); + // Apply transformations (mirror, crop...) to the image + // this->data_transformer_.Transform(item_id, cv_img, top_data); + int offset = this->prefetch_data_.offset(item_id); + this->transformed_data_.set_cpu_data(top_data + offset); + this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); + + top_label[item_id] = lines_[lines_id_].second; // go to the next iter lines_id_++; if (lines_id_ >= lines_size) { @@ -123,6 +131,7 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { } } } + DLOG(INFO) << "Prefetch: " << batch_timer.MilliSeconds() << " ms."; } INSTANTIATE_CLASS(ImageDataLayer); diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 269a2679777..8f1c21f5424 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -37,15 +37,15 @@ void MemoryDataLayer<Dtype>::AddDatumVector(const vector<Datum>& datum_vector) { CHECK_LE(num, batch_size_) << "The number of added datum must be no greater than the batch size"; - Dtype* top_data = added_data_.mutable_cpu_data(); + // Apply data transformations (mirror, scale, crop...) + this->data_transformer_.Transform(datum_vector, &added_data_); + // Copy Labels Dtype* top_label = added_label_.mutable_cpu_data(); - for (int batch_item_id = 0; batch_item_id < num; ++batch_item_id) { - // Apply data transformations (mirror, scale, crop...) - this->data_transformer_.Transform( - batch_item_id, datum_vector[batch_item_id], top_data); - top_label[batch_item_id] = datum_vector[batch_item_id].label(); + for (int item_id = 0; item_id < num; ++item_id) { + top_label[item_id] = datum_vector[item_id].label(); } // num_images == batch_size_ + Dtype* top_data = added_data_.mutable_cpu_data(); Reset(top_data, top_label, batch_size_); has_new_data_ = true; } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 6944ae847ff..8f88177944c 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -520,6 +520,8 @@ message ImageDataParameter { // It will also resize images if new_height or new_width are not zero. optional uint32 new_height = 9 [default = 0]; optional uint32 new_width = 10 [default = 0]; + // Specify if the images are color or gray + optional bool is_color = 11 [default = true]; // DEPRECATED. See TransformationParameter. For data pre-processing, we can do // simple scaling and subtracting the data mean, if provided. Note that the // mean subtraction is always carried out before scaling. diff --git a/src/caffe/util/benchmark.cpp b/src/caffe/util/benchmark.cpp index 566d06a8f5f..76829f5b36c 100644 --- a/src/caffe/util/benchmark.cpp +++ b/src/caffe/util/benchmark.cpp @@ -55,6 +55,28 @@ void Timer::Stop() { } } + +float Timer::MicroSeconds() { + if (!has_run_at_least_once()) { + LOG(WARNING) << "Timer has never been run before reading time."; + return 0; + } + if (running()) { + Stop(); + } + if (Caffe::mode() == Caffe::GPU) { +#ifndef CPU_ONLY + CUDA_CHECK(cudaEventElapsedTime(&elapsed_microseconds_, start_gpu_, + stop_gpu_)); +#else + NO_GPU; +#endif + } else { + elapsed_microseconds_ = (stop_cpu_ - start_cpu_).total_microseconds(); + } + return elapsed_microseconds_; +} + float Timer::MilliSeconds() { if (!has_run_at_least_once()) { LOG(WARNING) << "Timer has never been run before reading time."; diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 43e5c01e36a..4c32979d82f 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -66,6 +66,23 @@ void WriteProtoToBinaryFile(const Message& proto, const char* filename) { CHECK(proto.SerializeToOstream(&output)); } +cv::Mat ReadImageToCVMat(const string& filename, + const int height, const int width, const bool is_color) { + cv::Mat cv_img; + int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : + CV_LOAD_IMAGE_GRAYSCALE); + if (height > 0 && width > 0) { + cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); + cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); + } else { + cv_img = cv::imread(filename, cv_read_flag); + } + if (!cv_img.data) { + LOG(ERROR) << "Could not open or find file " << filename; + } + return cv_img; +} + bool ReadImageToDatum(const string& filename, const int label, const int height, const int width, const bool is_color, Datum* datum) { cv::Mat cv_img; From b26e0b336c01dbccd05c0805871724d40af7ae7a Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama <sguada@gmail.com> Date: Fri, 19 Sep 2014 17:23:39 -0700 Subject: [PATCH 0868/2053] Remove Datum from WindowDataLayer Conflicts: src/caffe/layers/window_data_layer.cpp --- include/caffe/data_transformer.hpp | 5 ++++- include/caffe/util/io.hpp | 7 ++++--- src/caffe/data_transformer.cpp | 21 ++++++++++----------- src/caffe/layers/data_layer.cpp | 2 +- src/caffe/layers/image_data_layer.cpp | 4 ++-- src/caffe/layers/window_data_layer.cpp | 6 ------ 6 files changed, 21 insertions(+), 24 deletions(-) diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 23594217d91..25dee187e31 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -3,6 +3,8 @@ #include <opencv2/core/core.hpp> +#include <vector> + #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" @@ -39,7 +41,8 @@ class DataTransformer { void Transform(const Datum& datum, Blob<Dtype>* transformed_blob); - void Transform(const vector<Datum> & datum_vector, Blob<Dtype>* transformed_blob); + void Transform(const vector<Datum> & datum_vector, + Blob<Dtype>* transformed_blob); void Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob); diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 88037c86035..988305e26eb 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -1,13 +1,14 @@ #ifndef CAFFE_UTIL_IO_H_ #define CAFFE_UTIL_IO_H_ +#include <opencv2/core/core.hpp> + #include <unistd.h> #include <string> #include "google/protobuf/message.h" #include "hdf5.h" #include "hdf5_hl.h" -#include <opencv2/core/core.hpp> #include "caffe/blob.hpp" #include "caffe/proto/caffe.pb.h" @@ -103,10 +104,10 @@ inline bool ReadImageToDatum(const string& filename, const int label, return ReadImageToDatum(filename, label, 0, 0, datum); } -cv::Mat ReadImageToCVMat(const string& filename, +cv::Mat ReadImageToCVMat(const string& filename, const int height, const int width, const bool is_color); -inline cv::Mat ReadImageToCVMat(const string& filename, +inline cv::Mat ReadImageToCVMat(const string& filename, const int height, const int width) { return ReadImageToCVMat(filename, height, width, true); } diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 836bf3b05c4..af1db3413bf 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -1,12 +1,13 @@ +#include <opencv2/core/core.hpp> + #include <string> +#include <vector> #include "caffe/data_transformer.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" -#include <opencv2/core/core.hpp> - namespace caffe { template<typename Dtype> @@ -117,7 +118,7 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, const int datum_channels = datum.channels(); const int datum_height = datum.height(); const int datum_width = datum.width(); - + const int channels = transformed_blob->channels(); const int height = transformed_blob->height(); const int width = transformed_blob->width(); @@ -133,7 +134,7 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, const Dtype scale = param_.scale(); const bool do_mirror = param_.mirror() && Rand() % 2; const bool has_mean_file = param_.has_mean_file(); - const bool has_unit8 = data.size()>0; + const bool has_unit8 = data.size() > 0; int h_off = 0; int w_off = 0; @@ -154,7 +155,7 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, } Dtype* transformed_data = transformed_blob->mutable_cpu_data(); - + Dtype* mean = NULL; if (has_mean_file) { CHECK_EQ(datum_channels, data_mean_.channels()); @@ -218,7 +219,6 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, template<typename Dtype> void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob) { - const int img_channels = cv_img.channels(); const int img_height = cv_img.rows; const int img_width = cv_img.cols; @@ -238,7 +238,7 @@ void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, const Dtype scale = param_.scale(); const bool do_mirror = param_.mirror() && Rand() % 2; const bool has_mean_file = param_.has_mean_file(); - + int h_off = 0; int w_off = 0; if (crop_size) { @@ -297,12 +297,11 @@ void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, template<typename Dtype> void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, Blob<Dtype>* transformed_blob) { - const int input_num = input_blob->num(); const int input_channels = input_blob->channels(); const int input_height = input_blob->height(); const int input_width = input_blob->width(); - + const int num = transformed_blob->num(); const int channels = transformed_blob->channels(); const int height = transformed_blob->height(); @@ -346,7 +345,7 @@ void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, int offset = input_blob->offset(n); caffe_sub(data_mean_.count(), input_data + offset, data_mean_.cpu_data(), input_data + offset); - } + } } Dtype* transformed_data = transformed_blob->mutable_cpu_data(); @@ -373,7 +372,7 @@ void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, } } } - if (scale!=Dtype(1)) { + if (scale != Dtype(1)) { DLOG(INFO) << "Scale: " << scale; caffe_scal(size, scale, transformed_data); } diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index b1d7ef93806..980e4146fc9 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -176,7 +176,7 @@ void DataLayer<Dtype>::InternalThreadEntry() { // Apply data transformations (mirror, scale, crop...) int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); - this->data_transformer_.Transform(datum, &(this->transformed_data_)); + this->data_transformer_.Transform(datum, &(this->transformed_data_)); if (this->output_labels_) { top_label[item_id] = datum.label(); } diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index e167f134f97..d93d56dead0 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -117,8 +117,8 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { // this->data_transformer_.Transform(item_id, cv_img, top_data); int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); - this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); - + this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); + top_label[item_id] = lines_[lines_id_].second; // go to the next iter lines_id_++; diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 6b70aa3cf22..c01b61bec9b 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -158,12 +158,6 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, LOG(INFO) << "output data size: " << top[0]->num() << "," << top[0]->channels() << "," << top[0]->height() << "," << top[0]->width(); - // datum size - this->datum_channels_ = top[0]->channels(); - this->datum_height_ = top[0]->height(); - this->datum_width_ = top[0]->width(); - this->datum_size_ = - top[0]->channels() * top[0]->height() * top[0]->width(); // label top[1]->Reshape(batch_size, 1, 1, 1); this->prefetch_label_.Reshape(batch_size, 1, 1, 1); From 28ee58eb13d7dcb7d31fb6910c025d8132ea6716 Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama <sguada@gmail.com> Date: Fri, 19 Sep 2014 08:57:00 -0700 Subject: [PATCH 0869/2053] Update description data_transformer.hpp --- include/caffe/data_transformer.hpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 25dee187e31..f2cbbd08586 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -27,14 +27,21 @@ class DataTransformer { * @brief Applies the transformation defined in the data layer's * transform_param block to the data. * - * @param batch_item_id - * Datum position within the batch. This is used to compute the - * writing position in the top blob's data * @param datum * Datum containing the data to be transformed. + * @param datum_vector + * A vector of Datum containing the data to be transformed. + * @param cv_img + * cv::Mat containing the data to be transformed. + * @param input_blob + * A Blob containing the data to be transformed. * @param transformed_data - * This is meant to be the top blob's data. The transformed data will be - * written at the appropriate place within the blob's data. + * This should point to the right place in memory where the + * transformed data would be written. Assumes there is enough space + * @param transformed_blob + * This is destionation blob. It can be part of top blob's data. + * The transformed data will be written at the appropriate place + * within the blob's data. */ void Transform(const Datum& datum, Dtype* transformed_data); From d1ccbe325715646e21631829975412fc9b32a344 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Thu, 25 Sep 2014 19:58:52 -0700 Subject: [PATCH 0870/2053] Refactor common code Make lint happy Conflicts: src/caffe/data_transformer.cpp --- include/caffe/data_transformer.hpp | 3 +- src/caffe/data_transformer.cpp | 147 +++++++-------------------- src/caffe/layers/base_data_layer.cpp | 3 +- 3 files changed, 41 insertions(+), 112 deletions(-) diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index f2cbbd08586..4a2afdaccce 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -44,8 +44,6 @@ class DataTransformer { * within the blob's data. */ - void Transform(const Datum& datum, Dtype* transformed_data); - void Transform(const Datum& datum, Blob<Dtype>* transformed_blob); void Transform(const vector<Datum> & datum_vector, @@ -66,6 +64,7 @@ class DataTransformer { */ virtual int Rand(int n); + void Transform(const Datum& datum, Dtype* transformed_data); // Tranformation parameters TransformationParameter param_; diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index af1db3413bf..cdb6e10c8ab 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -31,7 +31,6 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, const int datum_channels = datum.channels(); const int datum_height = datum.height(); const int datum_width = datum.width(); - const int size = datum.channels() * datum.height() * datum.width(); const int crop_size = param_.crop_size(); const Dtype scale = param_.scale(); @@ -51,10 +50,14 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, mean = data_mean_.mutable_cpu_data(); } + int height = datum_height; + int width = datum_width; + int h_off = 0; int w_off = 0; - Dtype datum_element; if (crop_size) { + height = crop_size; + width = crop_size; // We only do random crop when we do training. if (phase_ == Caffe::TRAIN) { h_off = Rand(height - crop_size + 1); @@ -63,49 +66,31 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, h_off = (datum_height - crop_size) / 2; w_off = (datum_width - crop_size) / 2; } + } - int top_index, data_index; - for (int c = 0; c < datum_channels; ++c) { - int top_index_c = c * crop_size; - int data_index_c = c * datum_height + h_off; - for (int h = 0; h < crop_size; ++h) { - int top_index_h = (top_index_c + h) * crop_size; - int data_index_h = (data_index_c + h) * datum_width + w_off; - for (int w = 0; w < crop_size; ++w) { - data_index = data_index_h + w; - if (do_mirror) { - top_index = top_index_h + (crop_size - 1 - w); - } else { - top_index = top_index_h + w; - } - if (has_unit8) { - datum_element = - static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); - } else { - datum_element = datum.float_data(data_index); - } - if (has_mean_file) { - transformed_data[top_index] = - (datum_element - mean[data_index]) * scale; - } else { - transformed_data[top_index] = datum_element * scale; - } + Dtype datum_element; + int top_index, data_index; + for (int c = 0; c < datum_channels; ++c) { + for (int h = 0; h < height; ++h) { + for (int w = 0; w < width; ++w) { + data_index = (c * datum_height + h_off + h) * datum_width + w_off + w; + if (do_mirror) { + top_index = (c * height + h) * width + (width - 1 - w); + } else { + top_index = (c * height + h) * width + w; } - } - } - } else { - for (int j = 0; j < size; ++j) { - if (has_unit8) { + if (has_unit8) { datum_element = - static_cast<Dtype>(static_cast<uint8_t>(data[j])); - } else { - datum_element = datum.float_data(j); - } - if (has_mean_file) { - transformed_data[j] = - (datum_element - mean[j]) * scale; - } else { - transformed_data[j] = datum_element * scale; + static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); + } else { + datum_element = datum.float_data(data_index); + } + if (has_mean_file) { + transformed_data[top_index] = + (datum_element - mean[data_index]) * scale; + } else { + transformed_data[top_index] = datum_element * scale; + } } } } @@ -114,7 +99,6 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, template<typename Dtype> void DataTransformer<Dtype>::Transform(const Datum& datum, Blob<Dtype>* transformed_blob) { - const string& data = datum.data(); const int datum_channels = datum.channels(); const int datum_height = datum.height(); const int datum_width = datum.width(); @@ -122,78 +106,25 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, const int channels = transformed_blob->channels(); const int height = transformed_blob->height(); const int width = transformed_blob->width(); + const int num = transformed_blob->num(); - CHECK_EQ(datum_channels, channels); - CHECK_GE(datum_height, height); - CHECK_GE(datum_width, width); - - CHECK_EQ(transformed_blob->num(), 1) << - "transformed_blob should have num() = 1"; + CHECK_EQ(channels, datum_channels); + CHECK_LE(height, datum_height); + CHECK_LE(width, datum_width); + CHECK_GE(num, 1); const int crop_size = param_.crop_size(); - const Dtype scale = param_.scale(); - const bool do_mirror = param_.mirror() && Rand() % 2; - const bool has_mean_file = param_.has_mean_file(); - const bool has_unit8 = data.size() > 0; - int h_off = 0; - int w_off = 0; if (crop_size) { CHECK_EQ(crop_size, height); CHECK_EQ(crop_size, width); - // We only do random crop when we do training. - if (phase_ == Caffe::TRAIN) { - h_off = Rand() % (datum_height - crop_size); - w_off = Rand() % (datum_width - crop_size); - } else { - h_off = (datum_height - crop_size) / 2; - w_off = (datum_width - crop_size) / 2; - } } else { CHECK_EQ(datum_height, height); CHECK_EQ(datum_width, width); } Dtype* transformed_data = transformed_blob->mutable_cpu_data(); - - Dtype* mean = NULL; - if (has_mean_file) { - CHECK_EQ(datum_channels, data_mean_.channels()); - CHECK_EQ(datum_height, data_mean_.height()); - CHECK_EQ(datum_width, data_mean_.width()); - mean = data_mean_.mutable_cpu_data(); - } - - Dtype datum_element; - int top_index, data_index; - for (int c = 0; c < channels; ++c) { - int top_index_c = c * height; - int data_index_c = c * datum_height + h_off; - for (int h = 0; h < height; ++h) { - int top_index_h = (top_index_c + h) * width; - int data_index_h = (data_index_c + h) * datum_width + w_off; - for (int w = 0; w < width; ++w) { - data_index = data_index_h + w; - if (do_mirror) { - top_index = top_index_h + (width - 1 - w); - } else { - top_index = top_index_h + w; - } - if (has_unit8) { - datum_element = - static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); - } else { - datum_element = datum.float_data(data_index); - } - if (has_mean_file) { - transformed_data[top_index] = - (datum_element - mean[data_index]) * scale; - } else { - transformed_data[top_index] = datum_element * scale; - } - } - } - } + Transform(datum, transformed_data); } template<typename Dtype> @@ -226,13 +157,12 @@ void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, const int channels = transformed_blob->channels(); const int height = transformed_blob->height(); const int width = transformed_blob->width(); + const int num = transformed_blob->num(); - CHECK_EQ(img_channels, channels); - CHECK_GE(img_height, height); - CHECK_GE(img_width, width); - - CHECK_EQ(transformed_blob->num(), 1) << - "transformed_blob should have num() = 1"; + CHECK_EQ(channels, img_channels); + CHECK_LE(height, img_height); + CHECK_LE(width, img_width); + CHECK_GE(num, 1); const int crop_size = param_.crop_size(); const Dtype scale = param_.scale(); @@ -293,7 +223,6 @@ void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, } } - template<typename Dtype> void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, Blob<Dtype>* transformed_blob) { diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index d7d475229a5..5ce52f05a3c 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -60,7 +60,8 @@ void BasePrefetchingDataLayer<Dtype>::Forward_cpu( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // First, join the thread if (this->timer_forward_.has_run_at_least_once()) { - DLOG(INFO) << "Proccessing: " << this->timer_forward_.MilliSeconds() << "ms."; + DLOG(INFO) << "Proccessing: " << + this->timer_forward_.MilliSeconds() << "ms."; } JoinPrefetchThread(); DLOG(INFO) << "Thread joined"; From 497eb60b79db2922241c813945543df152145cac Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama <sguada@gmail.com> Date: Mon, 22 Sep 2014 17:07:40 -0700 Subject: [PATCH 0871/2053] Add flag check_size=false to convert_imageset --- tools/convert_imageset.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 7e1e83d9d0c..4ab93fd0a0c 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -36,6 +36,8 @@ DEFINE_bool(shuffle, false, DEFINE_string(backend, "lmdb", "The backend for storing the result"); DEFINE_int32(resize_width, 0, "Width images are resized to"); DEFINE_int32(resize_height, 0, "Height images are resized to"); +DEFINE_bool(check_size, false, + "When this option is on, check that all the datum have the same size"); int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); @@ -58,6 +60,7 @@ int main(int argc, char** argv) { } bool is_color = !FLAGS_gray; + bool check_size = FLAGS_check_size; std::ifstream infile(argv[2]); std::vector<std::pair<string, int> > lines; string filename; @@ -131,13 +134,15 @@ int main(int argc, char** argv) { lines[line_id].second, resize_height, resize_width, is_color, &datum)) { continue; } - if (!data_size_initialized) { - data_size = datum.channels() * datum.height() * datum.width(); - data_size_initialized = true; - } else { - const string& data = datum.data(); - CHECK_EQ(data.size(), data_size) << "Incorrect data field size " - << data.size(); + if (check_size) { + if (!data_size_initialized) { + data_size = datum.channels() * datum.height() * datum.width(); + data_size_initialized = true; + } else { + const string& data = datum.data(); + CHECK_EQ(data.size(), data_size) << "Incorrect data field size " + << data.size(); + } } // sequential snprintf(key_cstr, kMaxKeyLength, "%08d_%s", line_id, From 5527e8969567fa22d2cc7c9397585e93edcfa3d1 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Thu, 25 Sep 2014 19:59:37 -0700 Subject: [PATCH 0872/2053] Added test_io and faster cv::Mat processing Conflicts: src/caffe/util/io.cpp --- include/caffe/util/io.hpp | 7 +- src/caffe/test/test_io.cpp | 143 +++++++++++++++++++++++++++++++++++++ src/caffe/util/io.cpp | 48 +++++-------- 3 files changed, 166 insertions(+), 32 deletions(-) create mode 100644 src/caffe/test/test_io.cpp diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 988305e26eb..8b83534ed54 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -99,9 +99,14 @@ inline bool ReadImageToDatum(const string& filename, const int label, return ReadImageToDatum(filename, label, height, width, true, datum); } +inline bool ReadImageToDatum(const string& filename, const int label, + const bool is_color, Datum* datum) { + return ReadImageToDatum(filename, label, 0, 0, is_color, datum); +} + inline bool ReadImageToDatum(const string& filename, const int label, Datum* datum) { - return ReadImageToDatum(filename, label, 0, 0, datum); + return ReadImageToDatum(filename, label, 0, 0, true, datum); } cv::Mat ReadImageToCVMat(const string& filename, diff --git a/src/caffe/test/test_io.cpp b/src/caffe/test/test_io.cpp new file mode 100644 index 00000000000..a01b8524918 --- /dev/null +++ b/src/caffe/test/test_io.cpp @@ -0,0 +1,143 @@ +#include <string> + +#include "gtest/gtest.h" + +#include "caffe/common.hpp" +#include "caffe/util/io.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +class IOTest : public ::testing::Test {}; + +TEST_F(IOTest, TestReadImageToDatum) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + ReadImageToDatum(filename, 0, &datum); + EXPECT_EQ(datum.channels(), 3); + EXPECT_EQ(datum.height(), 360); + EXPECT_EQ(datum.width(), 480); +} + +TEST_F(IOTest, TestReadImageToDatumContent) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + ReadImageToDatum(filename, 0, &datum); + cv::Mat cv_img = ReadImageToCVMat(filename); + EXPECT_EQ(datum.channels(), cv_img.channels()); + EXPECT_EQ(datum.height(), cv_img.rows); + EXPECT_EQ(datum.width(), cv_img.cols); + + const string& data = datum.data(); + int index = 0; + for (int c = 0; c < datum.channels(); ++c) { + for (int h = 0; h < datum.height(); ++h) { + for (int w = 0; w < datum.width(); ++w) { + EXPECT_TRUE(data[index++] == static_cast<char>(cv_img.at<cv::Vec3b>(h, w)[c])); + } + } + } +} + +TEST_F(IOTest, TestReadImageToDatumContentGray) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + const bool is_color = false; + ReadImageToDatum(filename, 0, is_color, &datum); + cv::Mat cv_img = ReadImageToCVMat(filename, is_color); + EXPECT_EQ(datum.channels(), cv_img.channels()); + EXPECT_EQ(datum.height(), cv_img.rows); + EXPECT_EQ(datum.width(), cv_img.cols); + + const string& data = datum.data(); + int index = 0; + for (int h = 0; h < datum.height(); ++h) { + for (int w = 0; w < datum.width(); ++w) { + EXPECT_TRUE(data[index++] == static_cast<char>(cv_img.at<uchar>(h, w))); + } + } +} + +TEST_F(IOTest, TestReadImageToDatumResized) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + ReadImageToDatum(filename, 0, 100, 200, &datum); + EXPECT_EQ(datum.channels(), 3); + EXPECT_EQ(datum.height(), 100); + EXPECT_EQ(datum.width(), 200); +} + + +TEST_F(IOTest, TestReadImageToDatumResizedSquare) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + ReadImageToDatum(filename, 0, 256, 256, &datum); + EXPECT_EQ(datum.channels(), 3); + EXPECT_EQ(datum.height(), 256); + EXPECT_EQ(datum.width(), 256); +} + +TEST_F(IOTest, TestReadImageToDatumGray) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + const bool is_color = false; + ReadImageToDatum(filename, 0, is_color, &datum); + EXPECT_EQ(datum.channels(), 1); + EXPECT_EQ(datum.height(), 360); + EXPECT_EQ(datum.width(), 480); +} + +TEST_F(IOTest, TestReadImageToDatumResizedGray) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + const bool is_color = false; + ReadImageToDatum(filename, 0, 256, 256, is_color, &datum); + EXPECT_EQ(datum.channels(), 1); + EXPECT_EQ(datum.height(), 256); + EXPECT_EQ(datum.width(), 256); +} + +TEST_F(IOTest, TestReadImageToCVMat) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + cv::Mat cv_img = ReadImageToCVMat(filename); + EXPECT_EQ(cv_img.channels(), 3); + EXPECT_EQ(cv_img.rows, 360); + EXPECT_EQ(cv_img.cols, 480); +} + +TEST_F(IOTest, TestReadImageToCVMatResized) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + cv::Mat cv_img = ReadImageToCVMat(filename, 100, 200); + EXPECT_EQ(cv_img.channels(), 3); + EXPECT_EQ(cv_img.rows, 100); + EXPECT_EQ(cv_img.cols, 200); +} + +TEST_F(IOTest, TestReadImageToCVMatResizedSquare) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + cv::Mat cv_img = ReadImageToCVMat(filename, 256, 256); + EXPECT_EQ(cv_img.channels(), 3); + EXPECT_EQ(cv_img.rows, 256); + EXPECT_EQ(cv_img.cols, 256); +} + +TEST_F(IOTest, TestReadImageToCVMatGray) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + const bool is_color = false; + cv::Mat cv_img = ReadImageToCVMat(filename, is_color); + EXPECT_EQ(cv_img.channels(), 1); + EXPECT_EQ(cv_img.rows, 360); + EXPECT_EQ(cv_img.cols, 480); +} + +TEST_F(IOTest, TestReadImageToCVMatResizedGray) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + const bool is_color = false; + cv::Mat cv_img = ReadImageToCVMat(filename, 256, 256, is_color); + EXPECT_EQ(cv_img.channels(), 1); + EXPECT_EQ(cv_img.rows, 256); + EXPECT_EQ(cv_img.cols, 256); +} + +} // namespace caffe diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 4c32979d82f..a576a91cb4e 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -85,46 +85,32 @@ cv::Mat ReadImageToCVMat(const string& filename, bool ReadImageToDatum(const string& filename, const int label, const int height, const int width, const bool is_color, Datum* datum) { - cv::Mat cv_img; - int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : - CV_LOAD_IMAGE_GRAYSCALE); + cv::Mat cv_img = ReadImageToCVMat(filename, height, width, is_color); - cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); - if (!cv_img_origin.data) { - LOG(ERROR) << "Could not open or find file " << filename; - return false; - } - if (height > 0 && width > 0) { - cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); - } else { - cv_img = cv_img_origin; - } - - int num_channels = (is_color ? 3 : 1); - datum->set_channels(num_channels); + CHECK(cv_img.depth() == CV_8U) << + "Image data type must be unsigned byte"; + datum->set_channels(cv_img.channels()); datum->set_height(cv_img.rows); datum->set_width(cv_img.cols); datum->set_label(label); datum->clear_data(); datum->clear_float_data(); - string* datum_string = datum->mutable_data(); - if (is_color) { - for (int c = 0; c < num_channels; ++c) { - for (int h = 0; h < cv_img.rows; ++h) { - for (int w = 0; w < cv_img.cols; ++w) { - datum_string->push_back( - static_cast<char>(cv_img.at<cv::Vec3b>(h, w)[c])); - } + int datum_channels = datum->channels(); + int datum_height = datum->height(); + int datum_width = datum->width(); + int datum_size = datum_channels * datum_height * datum_width; + std::string buffer(datum_size, ' '); + for (int h = 0; h < datum_height; ++h) { + const uchar* ptr = cv_img.ptr<uchar>(h); + int img_index = 0; + for (int w = 0; w < datum_width; ++w) { + for (int c = 0; c < datum_channels; ++c) { + int datum_index = (c * datum_height + h) * datum_width + w; + buffer[datum_index] = static_cast<char>(ptr[img_index++]); } } - } else { // Faster than repeatedly testing is_color for each pixel w/i loop - for (int h = 0; h < cv_img.rows; ++h) { - for (int w = 0; w < cv_img.cols; ++w) { - datum_string->push_back( - static_cast<char>(cv_img.at<uchar>(h, w))); - } - } } + datum->set_data(buffer); return true; } From 242546fa7cfdb26805202d03129340183e7e8ddb Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Wed, 24 Sep 2014 07:36:13 -0700 Subject: [PATCH 0873/2053] Add CVMatToDatum --- include/caffe/util/io.hpp | 2 + src/caffe/data_transformer.cpp | 74 ++-------------------------------- src/caffe/util/io.cpp | 12 +++++- 3 files changed, 15 insertions(+), 73 deletions(-) diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 8b83534ed54..2032b1f3195 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -126,6 +126,8 @@ inline cv::Mat ReadImageToCVMat(const string& filename) { return ReadImageToCVMat(filename, 0, 0, true); } +void CVMatToDatum(const cv::Mat& cv_img, Datum* datum); + leveldb::Options GetLevelDBOptions(); template <typename Dtype> diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index cdb6e10c8ab..f001f1caea3 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -150,77 +150,9 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, template<typename Dtype> void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob) { - const int img_channels = cv_img.channels(); - const int img_height = cv_img.rows; - const int img_width = cv_img.cols; - - const int channels = transformed_blob->channels(); - const int height = transformed_blob->height(); - const int width = transformed_blob->width(); - const int num = transformed_blob->num(); - - CHECK_EQ(channels, img_channels); - CHECK_LE(height, img_height); - CHECK_LE(width, img_width); - CHECK_GE(num, 1); - - const int crop_size = param_.crop_size(); - const Dtype scale = param_.scale(); - const bool do_mirror = param_.mirror() && Rand() % 2; - const bool has_mean_file = param_.has_mean_file(); - - int h_off = 0; - int w_off = 0; - if (crop_size) { - CHECK_EQ(crop_size, height); - CHECK_EQ(crop_size, width); - // We only do random crop when we do training. - if (phase_ == Caffe::TRAIN) { - h_off = Rand() % (img_height - crop_size); - w_off = Rand() % (img_width - crop_size); - } else { - h_off = (img_height - crop_size) / 2; - w_off = (img_width - crop_size) / 2; - } - } else { - CHECK_EQ(img_height, height); - CHECK_EQ(img_width, width); - } - - Dtype* mean = NULL; - if (has_mean_file) { - CHECK_EQ(img_channels, data_mean_.channels()); - CHECK_EQ(img_height, data_mean_.height()); - CHECK_EQ(img_width, data_mean_.width()); - mean = data_mean_.mutable_cpu_data(); - } - - Dtype* transformed_data = transformed_blob->mutable_cpu_data(); - Dtype pixel; - int top_index; - for (int c = 0; c < channels; ++c) { - int top_index_c = c * height; - int mean_index_c = c * img_height + h_off; - for (int h = 0; h < height; ++h) { - int top_index_h = (top_index_c + h) * width; - int mean_index_h = (mean_index_c + h) * img_width + w_off; - for (int w = 0; w < width; ++w) { - if (do_mirror) { - top_index = top_index_h + (width - 1 - w); - } else { - top_index = top_index_h + w; - } - pixel = static_cast<Dtype>( - cv_img.at<cv::Vec3b>(h + h_off, w + w_off)[c]); - if (has_mean_file) { - int mean_index = mean_index_h + w; - transformed_data[top_index] = (pixel - mean[mean_index]) * scale; - } else { - transformed_data[top_index] = pixel * scale; - } - } - } - } + Datum datum; + CVMatToDatum(cv_img, &datum); + Transform(datum, transformed_blob); } template<typename Dtype> diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index a576a91cb4e..047b14014e4 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -86,13 +86,21 @@ cv::Mat ReadImageToCVMat(const string& filename, bool ReadImageToDatum(const string& filename, const int label, const int height, const int width, const bool is_color, Datum* datum) { cv::Mat cv_img = ReadImageToCVMat(filename, height, width, is_color); + if (cv_img.data) { + CVMatToDatum(cv_img, datum); + datum->set_label(label); + return true; + } else { + return false; + } +} +void CVMatToDatum(const cv::Mat& cv_img, Datum* datum) { CHECK(cv_img.depth() == CV_8U) << "Image data type must be unsigned byte"; datum->set_channels(cv_img.channels()); datum->set_height(cv_img.rows); datum->set_width(cv_img.cols); - datum->set_label(label); datum->clear_data(); datum->clear_float_data(); int datum_channels = datum->channels(); @@ -111,9 +119,9 @@ bool ReadImageToDatum(const string& filename, const int label, } } datum->set_data(buffer); - return true; } + leveldb::Options GetLevelDBOptions() { // In default, we will return the leveldb option and set the max open files // in order to avoid using up the operating system's limit. From 760ffaa51475e95c9e64ec858a7d0c94fd7937ae Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Fri, 3 Oct 2014 08:19:40 -0700 Subject: [PATCH 0874/2053] Added global_pooling to set the kernel size equal to the bottom size Added check for padding and stride with global_pooling --- include/caffe/vision_layers.hpp | 1 + src/caffe/layers/pooling_layer.cpp | 32 ++++++++++++++++++++++----- src/caffe/proto/caffe.proto | 3 +++ src/caffe/test/test_pooling_layer.cpp | 14 ++++++++++++ 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 58ac5344da4..c803cd72449 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -319,6 +319,7 @@ class PoolingLayer : public Layer<Dtype> { int channels_; int height_, width_; int pooled_height_, pooled_width_; + bool global_pooling_; Blob<Dtype> rand_idx_; Blob<int> max_idx_; }; diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 26c92c13b63..2bfbb01fcec 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -17,12 +17,18 @@ template <typename Dtype> void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { PoolingParameter pool_param = this->layer_param_.pooling_param(); - CHECK(!pool_param.has_kernel_size() != + if (pool_param.global_pooling()) { + CHECK(!(pool_param.has_kernel_size() || + pool_param.has_kernel_h() || pool_param.has_kernel_w())) + << "With Global_pooling: true Filter size cannot specified"; + } else { + CHECK(!pool_param.has_kernel_size() != !(pool_param.has_kernel_h() && pool_param.has_kernel_w())) << "Filter size is kernel_size OR kernel_h and kernel_w; not both"; - CHECK(pool_param.has_kernel_size() || + CHECK(pool_param.has_kernel_size() || (pool_param.has_kernel_h() && pool_param.has_kernel_w())) << "For non-square filters both kernel_h and kernel_w are required."; + } CHECK((!pool_param.has_pad() && pool_param.has_pad_h() && pool_param.has_pad_w()) || (!pool_param.has_pad_h() && !pool_param.has_pad_w())) @@ -31,11 +37,17 @@ void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, && pool_param.has_stride_w()) || (!pool_param.has_stride_h() && !pool_param.has_stride_w())) << "Stride is stride OR stride_h and stride_w are required."; - if (pool_param.has_kernel_size()) { - kernel_h_ = kernel_w_ = pool_param.kernel_size(); + global_pooling_ = pool_param.global_pooling(); + if (global_pooling_) { + kernel_h_ = bottom[0]->height(); + kernel_w_ = bottom[0]->width(); } else { - kernel_h_ = pool_param.kernel_h(); - kernel_w_ = pool_param.kernel_w(); + if (pool_param.has_kernel_size()) { + kernel_h_ = kernel_w_ = pool_param.kernel_size(); + } else { + kernel_h_ = pool_param.kernel_h(); + kernel_w_ = pool_param.kernel_w(); + } } CHECK_GT(kernel_h_, 0) << "Filter dimensions cannot be zero."; CHECK_GT(kernel_w_, 0) << "Filter dimensions cannot be zero."; @@ -51,6 +63,10 @@ void PoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, stride_h_ = pool_param.stride_h(); stride_w_ = pool_param.stride_w(); } + if (global_pooling_) { + CHECK(pad_h_ == 0 && pad_w_ == 0 && stride_h_ == 1 && stride_w_ == 1) + << "With Global_pooling: true; only pad = 0 and stride = 1"; + } if (pad_h_ != 0 || pad_w_ != 0) { CHECK(this->layer_param_.pooling_param().pool() == PoolingParameter_PoolMethod_AVE @@ -68,6 +84,10 @@ void PoolingLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, channels_ = bottom[0]->channels(); height_ = bottom[0]->height(); width_ = bottom[0]->width(); + if (global_pooling_) { + kernel_h_ = bottom[0]->height(); + kernel_w_ = bottom[0]->width(); + } pooled_height_ = static_cast<int>(ceil(static_cast<float>( height_ + 2 * pad_h_ - kernel_h_) / stride_h_)) + 1; pooled_width_ = static_cast<int>(ceil(static_cast<float>( diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 6944ae847ff..9374abe5b70 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -602,6 +602,9 @@ message PoolingParameter { CUDNN = 2; } optional Engine engine = 11 [default = DEFAULT]; + // If global_pooling then it will pool over the size of the bottom by doing + // kernel_h = bottom->height and kernel_w = bottom->width + optional bool global_pooling = 12 [default = false]; } // Message that stores parameters used by PowerLayer diff --git a/src/caffe/test/test_pooling_layer.cpp b/src/caffe/test/test_pooling_layer.cpp index f52073c4e6f..435caa8381e 100644 --- a/src/caffe/test/test_pooling_layer.cpp +++ b/src/caffe/test/test_pooling_layer.cpp @@ -400,6 +400,20 @@ TYPED_TEST(PoolingLayerTest, TestSetupPadded) { EXPECT_EQ(this->blob_top_->width(), 3); } +TYPED_TEST(PoolingLayerTest, TestSetupGlobalPooling) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + PoolingParameter* pooling_param = layer_param.mutable_pooling_param(); + pooling_param->set_global_pooling(true); + pooling_param->set_pool(PoolingParameter_PoolMethod_AVE); + PoolingLayer<Dtype> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + EXPECT_EQ(this->blob_top_->num(), this->blob_bottom_->num()); + EXPECT_EQ(this->blob_top_->channels(), this->blob_bottom_->channels()); + EXPECT_EQ(this->blob_top_->height(), 1); + EXPECT_EQ(this->blob_top_->width(), 1); +} + /* TYPED_TEST(PoolingLayerTest, PrintBackward) { LayerParameter layer_param; From 2fcbc9d169d80c24e7acf3eedba90a94622f00ec Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 1 Oct 2014 11:50:42 -0700 Subject: [PATCH 0875/2053] [fix] translate g++ whole archive to force load for clang++ compilation To build with the layer registry clang++ requires `-force_load` as g++ requires `--whole-archive`. --- Makefile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b0b25150eb9..aac8205ccb0 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,6 @@ endif LIB_BUILD_DIR := $(BUILD_DIR)/lib STATIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).a DYNAMIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so -STATIC_LINK_COMMAND := -Wl,--whole-archive $(STATIC_NAME) -Wl,--no-whole-archive ############################## # Get all source files @@ -228,6 +227,7 @@ else ifeq ($(UNAME), Darwin) OSX := 1 endif +# Linux ifeq ($(LINUX), 1) CXX ?= /usr/bin/g++ GCCVERSION := $(shell $(CXX) -dumpversion | cut -f1,2 -d.) @@ -259,6 +259,15 @@ ifdef CUSTOM_CXX CXX := $(CUSTOM_CXX) endif +# Static linking +ifneq (,$(findstring clang++,$(CXX))) + STATIC_LINK_COMMAND := -Wl,-force_load $(STATIC_NAME) +else ifneq (,$(findstring g++,$(CXX))) + STATIC_LINK_COMMAND := -Wl,--whole-archive $(STATIC_NAME) -Wl,--no-whole-archive +else + $(error Cannot static link with the $(CXX) compiler.) +endif + # Debugging ifeq ($(DEBUG), 1) COMMON_FLAGS += -DDEBUG -g -O0 From 1e9681f915e157b87aa1bdc0197b001078122405 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 3 Oct 2014 13:30:21 -0700 Subject: [PATCH 0876/2053] [fix] set cmake static link command for clang++ and g++ globally --- CMakeLists.txt | 9 ++++++++- python/CMakeLists.txt | 1 - src/caffe/test/CMakeLists.txt | 36 +++++++++++++++++------------------ tools/CMakeLists.txt | 3 +-- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3cb7d583504..6de6b102981 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,13 @@ set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC) # set global flags set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) # set debug flags set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) # set release flags +# Link Flags +if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") # clang++ + set(CAFFE_STATIC_LINK -Wl,-force_load $(STATIC_NAME)) +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") # g++ + set(CAFFE_STATIC_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive) +endif() + # Global Definitions if(CPU_ONLY) add_definitions(-DCPU_ONLY) @@ -77,7 +84,7 @@ endif() set(LINT_TARGET lint) set(LINT_SCRIPT ${CMAKE_SCRIPT_DIR}/lint.cmake) add_custom_target( - ${LINT_TARGET} + ${LINT_TARGET} COMMAND ${CMAKE_COMMAND} -P ${LINT_SCRIPT} ) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 5024dbfea5d..343c863adf5 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -10,7 +10,6 @@ include_directories(${Boost_INCLUDE_DIRS}) file(GLOB_RECURSE Python_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) -set(CAFFE_WHOLE_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive) add_library(pycaffe SHARED ${Python_SOURCES}) target_link_libraries(pycaffe caffe ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}) diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index 7b308bff168..ce0aa4c5148 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -32,12 +32,12 @@ set(IN_FILES # generator input files ${TEST_DATA_FILE} ) -foreach(in_file ${IN_FILES}) +foreach(in_file ${IN_FILES}) configure_file( ${in_file}${IN_EXT} ${in_file}${GEN_EXT} - ) -endforeach() + ) +endforeach() include_directories( ${Caffe_SOURCE_DIR} @@ -45,26 +45,24 @@ include_directories( ) # Remove main from test sources and prepare an Object lib with main -file(GLOB TEST_MAIN ${TEST_MAIN}) +file(GLOB TEST_MAIN ${TEST_MAIN}) list(REMOVE_ITEM TEST_CPP_SOURCES ${TEST_MAIN}) add_library(main_obj EXCLUDE_FROM_ALL OBJECT ${TEST_MAIN}) -set(CAFFE_WHOLE_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive) - # Build each test separately from *.cpp files foreach(source ${TEST_CPP_SOURCES}) test_name(TEST_NAME ${source}) - + # add_library(${TEST_NAME}.obj EXCLUDE_FROM_ALL OBJECT ${source}) set(TEST_OBJ_LIB $<TARGET_OBJECTS:${TEST_NAME}.obj>) - - add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_OBJ_LIB} $<TARGET_OBJECTS:main_obj>) - target_link_libraries(${TEST_NAME} gtest ${CAFFE_WHOLE_LINK}) - + + add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_OBJ_LIB} $<TARGET_OBJECTS:main_obj>) + target_link_libraries(${TEST_NAME} gtest ${CAFFE_STATIC_LINK}) + # output dir set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) - + # Targets and object libs set(TEST_TARGETS ${TEST_TARGETS} ${TEST_NAME}) set(TEST_OBJ_LIBS ${TEST_OBJ_LIBS} ${TEST_OBJ_LIB}) @@ -73,15 +71,15 @@ endforeach() # Build each test separately from *.cu files foreach(source ${TEST_CU_SOURCES}) test_name(TEST_NAME ${source}) - + cuda_add_library(${TEST_NAME}.lib EXCLUDE_FROM_ALL ${source}) - - add_executable(${TEST_NAME} EXCLUDE_FROM_ALL $<TARGET_OBJECTS:main_obj>) - target_link_libraries(${TEST_NAME} ${TEST_NAME}.lib gtest ${CAFFE_WHOLE_LINK}) - + + add_executable(${TEST_NAME} EXCLUDE_FROM_ALL $<TARGET_OBJECTS:main_obj>) + target_link_libraries(${TEST_NAME} ${TEST_NAME}.lib gtest ${CAFFE_STATIC_LINK}) + # output dir set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) - + # Targets and object libs set(TEST_TARGETS ${TEST_TARGETS} ${TEST_NAME}) set(TEST_CU_LIBS ${TEST_CU_LIBS} ${TEST_NAME}.lib) @@ -92,7 +90,7 @@ add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_OBJ_LIBS} $<TARGET_OBJECTS:ma if(NOT CPU_ONLY) target_link_libraries(${ALL_TEST} ${TEST_CU_LIBS}) endif() -target_link_libraries(${ALL_TEST} gtest ${CAFFE_WHOLE_LINK}) +target_link_libraries(${ALL_TEST} gtest ${CAFFE_STATIC_LINK}) add_dependencies(${ALL_TEST} ${TEST_TARGETS}) # Output directory diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 118443a86a0..110f368b2c8 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -3,14 +3,13 @@ project( Tools ) # Find all source files file(GLOB_RECURSE TOOLS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) -set (CAFFE_WHOLE_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive) # Build each source file independently foreach(source ${TOOLS_SOURCES}) get_filename_component(name ${source} NAME_WE) add_executable(${name}.bin ${source}) set_target_properties(${name}.bin PROPERTIES OUTPUT_NAME ${name}) - target_link_libraries(${name}.bin ${CAFFE_WHOLE_LINK}) + target_link_libraries(${name}.bin ${CAFFE_STATIC_LINK}) ### Install ################################################################################# From 562ecba3642116afd5cda4590b9a40bd5fb90364 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 3 Oct 2014 13:44:36 -0700 Subject: [PATCH 0877/2053] [fix] bend pycaffe to the whims of OS X header order To build pycaffe on OS X the boost headers need to be in this order. OS X is a bewildering platform. --- python/caffe/_caffe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 5a8d99d3f22..5af4c94cbaf 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -2,8 +2,8 @@ // caffe::Caffe functions so that one could easily call it from Python. // Note that for Python, we will simply use float as the data type. -#include <boost/make_shared.hpp> #include <boost/python/suite/indexing/vector_indexing_suite.hpp> +#include <boost/make_shared.hpp> // NOLINT(build/include_alpha) // these need to be included after boost on OS X #include <string> // NOLINT(build/include_order) From aee2efb0019b07cf9323a96e8f0fba469bead369 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 3 Oct 2014 13:53:52 -0700 Subject: [PATCH 0878/2053] [fix] include Python.h instead of re-ordering for pycaffe build on OS X --- python/caffe/_caffe.cpp | 4 +++- python/caffe/_caffe.hpp | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 5af4c94cbaf..133eb98b5d2 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -2,8 +2,10 @@ // caffe::Caffe functions so that one could easily call it from Python. // Note that for Python, we will simply use float as the data type. +#include <Python.h> // NOLINT(build/include_alpha) + +#include <boost/make_shared.hpp> #include <boost/python/suite/indexing/vector_indexing_suite.hpp> -#include <boost/make_shared.hpp> // NOLINT(build/include_alpha) // these need to be included after boost on OS X #include <string> // NOLINT(build/include_order) diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index fc7be49af1b..a4e0557c590 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -3,6 +3,8 @@ #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION +#include <Python.h> // NOLINT(build/include_alpha) + #include <boost/python.hpp> #include <boost/shared_ptr.hpp> #include <numpy/arrayobject.h> From 408c258ccd870c108d4a5326193c79b9e0f8c744 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Wed, 24 Sep 2014 12:39:59 -0700 Subject: [PATCH 0879/2053] Add ReadImageToDatumReference to test_io --- src/caffe/data_transformer.cpp | 79 ++++++++++++++++++++++++++++-- src/caffe/test/test_io.cpp | 87 ++++++++++++++++++++++++++++++++++ src/caffe/util/io.cpp | 11 +++-- 3 files changed, 169 insertions(+), 8 deletions(-) diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index f001f1caea3..d3be1d8c696 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -150,9 +150,82 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, template<typename Dtype> void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob) { - Datum datum; - CVMatToDatum(cv_img, &datum); - Transform(datum, transformed_blob); + // Datum datum; + // CVMatToDatum(cv_img, &datum); + // Transform(datum, transformed_blob); + + const int img_channels = cv_img.channels(); + const int img_height = cv_img.rows; + const int img_width = cv_img.cols; + + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + + CHECK_EQ(img_channels, channels); + CHECK_GE(img_height, height); + CHECK_GE(img_width, width); + + CHECK_EQ(transformed_blob->num(), 1) << + "transformed_blob should have num() = 1"; + + const int crop_size = param_.crop_size(); + const Dtype scale = param_.scale(); + const bool do_mirror = param_.mirror() && Rand() % 2; + const bool has_mean_file = param_.has_mean_file(); + + int h_off = 0; + int w_off = 0; + if (crop_size) { + CHECK_EQ(crop_size, height); + CHECK_EQ(crop_size, width); + // We only do random crop when we do training. + if (phase_ == Caffe::TRAIN) { + h_off = Rand() % (img_height - crop_size); + w_off = Rand() % (img_width - crop_size); + } else { + h_off = (img_height - crop_size) / 2; + w_off = (img_width - crop_size) / 2; + } + } else { + CHECK_EQ(img_height, height); + CHECK_EQ(img_width, width); + } + + Dtype* mean = NULL; + if (has_mean_file) { + CHECK_EQ(img_channels, data_mean_.channels()); + CHECK_EQ(img_height, data_mean_.height()); + CHECK_EQ(img_width, data_mean_.width()); + mean = data_mean_.mutable_cpu_data(); + } + + Dtype* transformed_data = transformed_blob->mutable_cpu_data(); + Dtype pixel; + int top_index; + for (int c = 0; c < channels; ++c) { + int top_index_c = c * height; + int mean_index_c = c * img_height + h_off; + for (int h = 0; h < height; ++h) { + int top_index_h = (top_index_c + h) * width; + int mean_index_h = (mean_index_c + h) * img_width + w_off; + for (int w = 0; w < width; ++w) { + if (do_mirror) { + top_index = top_index_h + (width - 1 - w); + } else { + top_index = top_index_h + w; + } + pixel = static_cast<Dtype>( + cv_img.at<cv::Vec3b>(h + h_off, w + w_off)[c]); + if (has_mean_file) { + int mean_index = mean_index_h + w; + transformed_data[top_index] = (pixel - mean[mean_index]) * scale; + } else { + transformed_data[top_index] = pixel * scale; + } + } + } + } } template<typename Dtype> diff --git a/src/caffe/test/test_io.cpp b/src/caffe/test/test_io.cpp index a01b8524918..5e85af75654 100644 --- a/src/caffe/test/test_io.cpp +++ b/src/caffe/test/test_io.cpp @@ -1,3 +1,8 @@ +#include <opencv2/core/core.hpp> +#include <opencv2/highgui/highgui.hpp> +#include <opencv2/highgui/highgui_c.h> +#include <opencv2/imgproc/imgproc.hpp> + #include <string> #include "gtest/gtest.h" @@ -11,6 +16,51 @@ namespace caffe { class IOTest : public ::testing::Test {}; +bool ReadImageToDatumReference(const string& filename, const int label, + const int height, const int width, const bool is_color, Datum* datum) { + cv::Mat cv_img; + int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : + CV_LOAD_IMAGE_GRAYSCALE); + + cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); + if (!cv_img_origin.data) { + LOG(ERROR) << "Could not open or find file " << filename; + return false; + } + if (height > 0 && width > 0) { + cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); + } else { + cv_img = cv_img_origin; + } + + int num_channels = (is_color ? 3 : 1); + datum->set_channels(num_channels); + datum->set_height(cv_img.rows); + datum->set_width(cv_img.cols); + datum->set_label(label); + datum->clear_data(); + datum->clear_float_data(); + string* datum_string = datum->mutable_data(); + if (is_color) { + for (int c = 0; c < num_channels; ++c) { + for (int h = 0; h < cv_img.rows; ++h) { + for (int w = 0; w < cv_img.cols; ++w) { + datum_string->push_back( + static_cast<char>(cv_img.at<cv::Vec3b>(h, w)[c])); + } + } + } + } else { // Faster than repeatedly testing is_color for each pixel w/i loop + for (int h = 0; h < cv_img.rows; ++h) { + for (int w = 0; w < cv_img.cols; ++w) { + datum_string->push_back( + static_cast<char>(cv_img.at<uchar>(h, w))); + } + } + } + return true; +} + TEST_F(IOTest, TestReadImageToDatum) { string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; Datum datum; @@ -20,6 +70,43 @@ TEST_F(IOTest, TestReadImageToDatum) { EXPECT_EQ(datum.width(), 480); } +TEST_F(IOTest, TestReadImageToDatumReference) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum, datum_ref; + ReadImageToDatum(filename, 0, 0, 0, true, &datum); + ReadImageToDatumReference(filename, 0, 0, 0, true, &datum_ref); + EXPECT_EQ(datum.channels(), datum_ref.channels()); + EXPECT_EQ(datum.height(), datum_ref.height()); + EXPECT_EQ(datum.width(), datum_ref.width()); + EXPECT_EQ(datum.data().size(), datum_ref.data().size()); + + const string& data = datum.data(); + const string& data_ref = datum.data(); + + for (int i = 0; i < datum.data().size(); ++i) { + EXPECT_TRUE(data[i] == data_ref[i]); + } +} + + +TEST_F(IOTest, TestReadImageToDatumReferenceResized) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum, datum_ref; + ReadImageToDatum(filename, 0, 100, 200, true, &datum); + ReadImageToDatumReference(filename, 0, 100, 200, true, &datum_ref); + EXPECT_EQ(datum.channels(), datum_ref.channels()); + EXPECT_EQ(datum.height(), datum_ref.height()); + EXPECT_EQ(datum.width(), datum_ref.width()); + EXPECT_EQ(datum.data().size(), datum_ref.data().size()); + + const string& data = datum.data(); + const string& data_ref = datum.data(); + + for (int i = 0; i < datum.data().size(); ++i) { + EXPECT_TRUE(data[i] == data_ref[i]); + } +} + TEST_F(IOTest, TestReadImageToDatumContent) { string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; Datum datum; diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 047b14014e4..36510d61d40 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -71,14 +71,15 @@ cv::Mat ReadImageToCVMat(const string& filename, cv::Mat cv_img; int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : CV_LOAD_IMAGE_GRAYSCALE); + cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); + if (!cv_img_origin.data) { + LOG(ERROR) << "Could not open or find file " << filename; + return cv_img_origin; + } if (height > 0 && width > 0) { - cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag); cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); } else { - cv_img = cv::imread(filename, cv_read_flag); - } - if (!cv_img.data) { - LOG(ERROR) << "Could not open or find file " << filename; + cv_img = cv_img_origin; } return cv_img; } From 0a96030ba66e4476cc6b153863e409200989883d Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Wed, 24 Sep 2014 13:41:11 -0700 Subject: [PATCH 0880/2053] Added more tests to test_io for CVMatToDatum --- src/caffe/data_transformer.cpp | 79 ++-------------------------------- src/caffe/test/test_io.cpp | 48 +++++++++++++++++++++ 2 files changed, 51 insertions(+), 76 deletions(-) diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index d3be1d8c696..f001f1caea3 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -150,82 +150,9 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, template<typename Dtype> void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob) { - // Datum datum; - // CVMatToDatum(cv_img, &datum); - // Transform(datum, transformed_blob); - - const int img_channels = cv_img.channels(); - const int img_height = cv_img.rows; - const int img_width = cv_img.cols; - - const int channels = transformed_blob->channels(); - const int height = transformed_blob->height(); - const int width = transformed_blob->width(); - - CHECK_EQ(img_channels, channels); - CHECK_GE(img_height, height); - CHECK_GE(img_width, width); - - CHECK_EQ(transformed_blob->num(), 1) << - "transformed_blob should have num() = 1"; - - const int crop_size = param_.crop_size(); - const Dtype scale = param_.scale(); - const bool do_mirror = param_.mirror() && Rand() % 2; - const bool has_mean_file = param_.has_mean_file(); - - int h_off = 0; - int w_off = 0; - if (crop_size) { - CHECK_EQ(crop_size, height); - CHECK_EQ(crop_size, width); - // We only do random crop when we do training. - if (phase_ == Caffe::TRAIN) { - h_off = Rand() % (img_height - crop_size); - w_off = Rand() % (img_width - crop_size); - } else { - h_off = (img_height - crop_size) / 2; - w_off = (img_width - crop_size) / 2; - } - } else { - CHECK_EQ(img_height, height); - CHECK_EQ(img_width, width); - } - - Dtype* mean = NULL; - if (has_mean_file) { - CHECK_EQ(img_channels, data_mean_.channels()); - CHECK_EQ(img_height, data_mean_.height()); - CHECK_EQ(img_width, data_mean_.width()); - mean = data_mean_.mutable_cpu_data(); - } - - Dtype* transformed_data = transformed_blob->mutable_cpu_data(); - Dtype pixel; - int top_index; - for (int c = 0; c < channels; ++c) { - int top_index_c = c * height; - int mean_index_c = c * img_height + h_off; - for (int h = 0; h < height; ++h) { - int top_index_h = (top_index_c + h) * width; - int mean_index_h = (mean_index_c + h) * img_width + w_off; - for (int w = 0; w < width; ++w) { - if (do_mirror) { - top_index = top_index_h + (width - 1 - w); - } else { - top_index = top_index_h + w; - } - pixel = static_cast<Dtype>( - cv_img.at<cv::Vec3b>(h + h_off, w + w_off)[c]); - if (has_mean_file) { - int mean_index = mean_index_h + w; - transformed_data[top_index] = (pixel - mean[mean_index]) * scale; - } else { - transformed_data[top_index] = pixel * scale; - } - } - } - } + Datum datum; + CVMatToDatum(cv_img, &datum); + Transform(datum, transformed_blob); } template<typename Dtype> diff --git a/src/caffe/test/test_io.cpp b/src/caffe/test/test_io.cpp index 5e85af75654..affbfd88f8e 100644 --- a/src/caffe/test/test_io.cpp +++ b/src/caffe/test/test_io.cpp @@ -227,4 +227,52 @@ TEST_F(IOTest, TestReadImageToCVMatResizedGray) { EXPECT_EQ(cv_img.cols, 256); } +TEST_F(IOTest, TestCVMatToDatum) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + cv::Mat cv_img = ReadImageToCVMat(filename); + Datum datum; + CVMatToDatum(cv_img, &datum); + EXPECT_EQ(datum.channels(), 3); + EXPECT_EQ(datum.height(), 360); + EXPECT_EQ(datum.width(), 480); +} + +TEST_F(IOTest, TestCVMatToDatumContent) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + cv::Mat cv_img = ReadImageToCVMat(filename); + Datum datum; + CVMatToDatum(cv_img, &datum); + Datum datum_ref; + ReadImageToDatum(filename, 0, &datum_ref); + EXPECT_EQ(datum.channels(), datum_ref.channels()); + EXPECT_EQ(datum.height(), datum_ref.height()); + EXPECT_EQ(datum.width(), datum_ref.width()); + EXPECT_EQ(datum.data().size(), datum_ref.data().size()); + + const string& data = datum.data(); + const string& data_ref = datum_ref.data(); + for (int i = 0; i < datum.data().size(); ++i) { + EXPECT_TRUE(data[i] == data_ref[i]); + } +} + +TEST_F(IOTest, TestCVMatToDatumReference) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + cv::Mat cv_img = ReadImageToCVMat(filename); + Datum datum; + CVMatToDatum(cv_img, &datum); + Datum datum_ref; + ReadImageToDatumReference(filename, 0, 0, 0, true, &datum_ref); + EXPECT_EQ(datum.channels(), datum_ref.channels()); + EXPECT_EQ(datum.height(), datum_ref.height()); + EXPECT_EQ(datum.width(), datum_ref.width()); + EXPECT_EQ(datum.data().size(), datum_ref.data().size()); + + const string& data = datum.data(); + const string& data_ref = datum_ref.data(); + for (int i = 0; i < datum.data().size(); ++i) { + EXPECT_TRUE(data[i] == data_ref[i]); + } +} + } // namespace caffe From a9572b1bbe8dca87ec3e31804fee49301e066a94 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Wed, 24 Sep 2014 14:58:11 -0700 Subject: [PATCH 0881/2053] Added mean_value to specify mean channel substraction Added example of use to models/bvlc_reference_caffenet/train_val_mean_value.prototxt --- include/caffe/data_transformer.hpp | 1 + .../train_val_mean_value.prototxt | 348 ++++++++++++++++++ src/caffe/data_transformer.cpp | 44 ++- src/caffe/proto/caffe.proto | 5 + src/caffe/test/test_io.cpp | 3 +- 5 files changed, 399 insertions(+), 2 deletions(-) create mode 100644 models/bvlc_reference_caffenet/train_val_mean_value.prototxt diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 4a2afdaccce..735f1d586c9 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -72,6 +72,7 @@ class DataTransformer { shared_ptr<Caffe::RNG> rng_; Caffe::Phase phase_; Blob<Dtype> data_mean_; + vector<Dtype> mean_values_; }; } // namespace caffe diff --git a/models/bvlc_reference_caffenet/train_val_mean_value.prototxt b/models/bvlc_reference_caffenet/train_val_mean_value.prototxt new file mode 100644 index 00000000000..c2fbb7118ca --- /dev/null +++ b/models/bvlc_reference_caffenet/train_val_mean_value.prototxt @@ -0,0 +1,348 @@ +name: "CaffeNet" +layers { + name: "data" + type: DATA + top: "data" + top: "label" + data_param { + source: "examples/imagenet/ilsvrc12_train_leveldb" + batch_size: 256 + } + transform_param { + crop_size: 227 + mean_value: 104 + mean_value: 117 + mean_value: 123 + mirror: true + } + include: { phase: TRAIN } +} +layers { + name: "data" + type: DATA + top: "data" + top: "label" + data_param { + source: "examples/imagenet/ilsvrc12_val_leveldb" + batch_size: 50 + } + transform_param { + crop_size: 227 + mean_value: 104 + mean_value: 117 + mean_value: 123 + mirror: false + } + include: { phase: TEST } +} +layers { + name: "conv1" + type: CONVOLUTION + bottom: "data" + top: "conv1" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 11 + stride: 4 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "relu1" + type: RELU + bottom: "conv1" + top: "conv1" +} +layers { + name: "pool1" + type: POOLING + bottom: "conv1" + top: "pool1" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "norm1" + type: LRN + bottom: "pool1" + top: "norm1" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + name: "conv2" + type: CONVOLUTION + bottom: "norm1" + top: "conv2" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + pad: 2 + kernel_size: 5 + group: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu2" + type: RELU + bottom: "conv2" + top: "conv2" +} +layers { + name: "pool2" + type: POOLING + bottom: "conv2" + top: "pool2" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "norm2" + type: LRN + bottom: "pool2" + top: "norm2" + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + name: "conv3" + type: CONVOLUTION + bottom: "norm2" + top: "conv3" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "relu3" + type: RELU + bottom: "conv3" + top: "conv3" +} +layers { + name: "conv4" + type: CONVOLUTION + bottom: "conv3" + top: "conv4" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + group: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu4" + type: RELU + bottom: "conv4" + top: "conv4" +} +layers { + name: "conv5" + type: CONVOLUTION + bottom: "conv4" + top: "conv5" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + group: 2 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu5" + type: RELU + bottom: "conv5" + top: "conv5" +} +layers { + name: "pool5" + type: POOLING + bottom: "conv5" + top: "pool5" + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + name: "fc6" + type: INNER_PRODUCT + bottom: "pool5" + top: "fc6" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 4096 + weight_filler { + type: "gaussian" + std: 0.005 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu6" + type: RELU + bottom: "fc6" + top: "fc6" +} +layers { + name: "drop6" + type: DROPOUT + bottom: "fc6" + top: "fc6" + dropout_param { + dropout_ratio: 0.5 + } +} +layers { + name: "fc7" + type: INNER_PRODUCT + bottom: "fc6" + top: "fc7" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 4096 + weight_filler { + type: "gaussian" + std: 0.005 + } + bias_filler { + type: "constant" + value: 1 + } + } +} +layers { + name: "relu7" + type: RELU + bottom: "fc7" + top: "fc7" +} +layers { + name: "drop7" + type: DROPOUT + bottom: "fc7" + top: "fc7" + dropout_param { + dropout_ratio: 0.5 + } +} +layers { + name: "fc8" + type: INNER_PRODUCT + bottom: "fc7" + top: "fc8" + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1000 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "accuracy" + type: ACCURACY + bottom: "fc8" + bottom: "label" + top: "accuracy" + include: { phase: TEST } +} +layers { + name: "loss" + type: SOFTMAX_LOSS + bottom: "fc8" + bottom: "label" + top: "loss" +} diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index f001f1caea3..abc6ec2b590 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -16,12 +16,21 @@ DataTransformer<Dtype>::DataTransformer(const TransformationParameter& param) phase_ = Caffe::phase(); // check if we want to have mean if (param_.has_mean_file()) { + CHECK_EQ(param_.mean_value_size(), 0) << + "Cannot specify mean_file and mean_value at the same time"; const string& mean_file = param.mean_file(); LOG(INFO) << "Loading mean file from" << mean_file; BlobProto blob_proto; ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); data_mean_.FromProto(blob_proto); } + if (param_.mean_value_size() > 0) { + CHECK(param_.has_mean_file() == false) << + "Cannot specify mean_file and mean_value at the same time"; + for (int c = 0; c < param_.mean_value_size(); ++c) { + mean_values_.push_back(param_.mean_value(c)); + } + } } template<typename Dtype> @@ -37,6 +46,7 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, const bool do_mirror = param_.mirror() && Rand() % 2; const bool has_mean_file = param_.has_mean_file(); const bool has_unit8 = data.size() > 0; + const bool has_mean_values = mean_values_.size() > 0; CHECK_GT(datum_channels, 0); CHECK_GE(datum_height, crop_size); @@ -49,6 +59,16 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, CHECK_EQ(datum_width, data_mean_.width()); mean = data_mean_.mutable_cpu_data(); } + if (has_mean_values) { + CHECK(mean_values_.size() == 1 || mean_values_.size() == datum_channels) << + "Specify either 1 mean_value or as many as channels: " << datum_channels; + if (datum_channels > 1 && mean_values_.size() == 1) { + // Replicate the mean_value for simplicity + for (int c = 1; c < datum_channels; ++c) { + mean_values_.push_back(mean_values_[0]); + } + } + } int height = datum_height; int width = datum_width; @@ -89,7 +109,12 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, transformed_data[top_index] = (datum_element - mean[data_index]) * scale; } else { - transformed_data[top_index] = datum_element * scale; + if (has_mean_values) { + transformed_data[top_index] = + (datum_element - mean_values_[c]) * scale; + } else { + transformed_data[top_index] = datum_element * scale; + } } } } @@ -178,6 +203,7 @@ void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, const Dtype scale = param_.scale(); const bool do_mirror = param_.mirror() && Rand() % 2; const bool has_mean_file = param_.has_mean_file(); + const bool has_mean_values = mean_values_.size() > 0; int h_off = 0; int w_off = 0; @@ -209,6 +235,22 @@ void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, } } + if (has_mean_values) { + CHECK(mean_values_.size() == 1 || mean_values_.size() == input_channels) << + "Specify either 1 mean_value or as many as channels: " << input_channels; + if (mean_values_.size() == 1) { + caffe_add_scalar(input_blob->count(), -(mean_values_[0]), input_data); + } else { + for (int n = 0; n < input_num; ++n) { + for (int c = 0; c < input_channels; ++c) { + int offset = input_blob->offset(n, c); + caffe_add_scalar(input_height * input_width, -(mean_values_[c]), + input_data + offset); + } + } + } + } + Dtype* transformed_data = transformed_blob->mutable_cpu_data(); for (int n = 0; n < input_num; ++n) { diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 8f88177944c..85418f0adaf 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -347,7 +347,12 @@ message TransformationParameter { optional bool mirror = 2 [default = false]; // Specify if we would like to randomly crop an image. optional uint32 crop_size = 3 [default = 0]; + // mean_file and mean_value cannot be specified at the same time optional string mean_file = 4; + // if specified can be repeated once (would substract it from all the channels) + // or can be repeated the same number of times as channels + // (would subtract them from the corresponding channel) + repeated float mean_value = 5; } // Message that stores parameters used by AccuracyLayer diff --git a/src/caffe/test/test_io.cpp b/src/caffe/test/test_io.cpp index affbfd88f8e..6994afda0e3 100644 --- a/src/caffe/test/test_io.cpp +++ b/src/caffe/test/test_io.cpp @@ -121,7 +121,8 @@ TEST_F(IOTest, TestReadImageToDatumContent) { for (int c = 0; c < datum.channels(); ++c) { for (int h = 0; h < datum.height(); ++h) { for (int w = 0; w < datum.width(); ++w) { - EXPECT_TRUE(data[index++] == static_cast<char>(cv_img.at<cv::Vec3b>(h, w)[c])); + EXPECT_TRUE(data[index++] == + static_cast<char>(cv_img.at<cv::Vec3b>(h, w)[c])); } } } From 8cd863e7cb5181cbbdfcf0dd75a78c80c56c1281 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Thu, 25 Sep 2014 19:53:33 -0700 Subject: [PATCH 0882/2053] Fix OSX compilation for nvcc with opencv --- Makefile | 1 + include/caffe/data_transformer.hpp | 4 ++++ include/caffe/util/io.hpp | 4 ++++ models/bvlc_reference_caffenet/train_val.prototxt | 13 +++++++++++-- src/caffe/data_transformer.cpp | 4 ++++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index b0b25150eb9..7dea267e4c3 100644 --- a/Makefile +++ b/Makefile @@ -252,6 +252,7 @@ ifeq ($(OSX), 1) endif # boost::thread is called boost_thread-mt to mark multithreading on OS X LIBRARIES += boost_thread-mt + NVCCFLAGS += -DOSX endif # Custom compiler diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 735f1d586c9..7e48df339e2 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -1,7 +1,9 @@ #ifndef CAFFE_DATA_TRANSFORMER_HPP #define CAFFE_DATA_TRANSFORMER_HPP +#ifndef OSX #include <opencv2/core/core.hpp> +#endif #include <vector> @@ -49,7 +51,9 @@ class DataTransformer { void Transform(const vector<Datum> & datum_vector, Blob<Dtype>* transformed_blob); +#ifndef OSX void Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob); +#endif void Transform(Blob<Dtype>* input_blob, Blob<Dtype>* transformed_blob); diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 2032b1f3195..e518979a75b 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -1,7 +1,9 @@ #ifndef CAFFE_UTIL_IO_H_ #define CAFFE_UTIL_IO_H_ +#ifndef OSX #include <opencv2/core/core.hpp> +#endif #include <unistd.h> #include <string> @@ -109,6 +111,7 @@ inline bool ReadImageToDatum(const string& filename, const int label, return ReadImageToDatum(filename, label, 0, 0, true, datum); } +#ifndef OSX cv::Mat ReadImageToCVMat(const string& filename, const int height, const int width, const bool is_color); @@ -127,6 +130,7 @@ inline cv::Mat ReadImageToCVMat(const string& filename) { } void CVMatToDatum(const cv::Mat& cv_img, Datum* datum); +#endif leveldb::Options GetLevelDBOptions(); diff --git a/models/bvlc_reference_caffenet/train_val.prototxt b/models/bvlc_reference_caffenet/train_val.prototxt index 073d8aeff4a..6cfeab10e1b 100644 --- a/models/bvlc_reference_caffenet/train_val.prototxt +++ b/models/bvlc_reference_caffenet/train_val.prototxt @@ -330,11 +330,20 @@ layers { } } layers { - name: "accuracy" + name: "top-1" type: ACCURACY bottom: "fc8" bottom: "label" - top: "accuracy" + top: "top-1" + include: { phase: TEST } +} +layers { + name: "top-5" + type: ACCURACY + bottom: "fc8" + bottom: "label" + top: "top-5" + accuracy_param: { top_k: 5 } include: { phase: TEST } } layers { diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index abc6ec2b590..a195c5d2ad6 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -1,4 +1,6 @@ +#ifndef OSX #include <opencv2/core/core.hpp> +#endif #include <string> #include <vector> @@ -172,6 +174,7 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, } } +#ifndef OSX template<typename Dtype> void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob) { @@ -179,6 +182,7 @@ void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, CVMatToDatum(cv_img, &datum); Transform(datum, transformed_blob); } +#endif template<typename Dtype> void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, From 8a6d348bed4e25161a6146c394499f0f9ba7054d Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Thu, 25 Sep 2014 20:07:01 -0700 Subject: [PATCH 0883/2053] Fix calls to Rand() and test_data_layer error Remove benchmarking code, fixed data_transformer doxygen docs --- include/caffe/data_layers.hpp | 2 - include/caffe/data_transformer.hpp | 54 ++++++++++++++++++++------- src/caffe/data_transformer.cpp | 12 +++--- src/caffe/layers/base_data_layer.cpp | 5 --- src/caffe/layers/base_data_layer.cu | 2 - src/caffe/layers/data_layer.cpp | 4 -- src/caffe/layers/image_data_layer.cpp | 3 -- 7 files changed, 46 insertions(+), 36 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index e3ba2d13ccf..1ed26c17178 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -17,7 +17,6 @@ #include "caffe/internal_thread.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" -#include "caffe/util/benchmark.hpp" namespace caffe { @@ -52,7 +51,6 @@ class BaseDataLayer : public Layer<Dtype> { DataTransformer<Dtype> data_transformer_; Caffe::Phase phase_; bool output_labels_; - Timer timer_forward_; }; template <typename Dtype> diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 7e48df339e2..db2cac5e4cf 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -23,6 +23,12 @@ class DataTransformer { explicit DataTransformer(const TransformationParameter& param); virtual ~DataTransformer() {} + /** + * @brief Initialize the Random number generations if needed by the + * transformation. Currently: + * needs_rand = param_.mirror() || + * (phase_ == Caffe::TRAIN && param_.crop_size()); + */ void InitRand(); /** @@ -31,30 +37,50 @@ class DataTransformer { * * @param datum * Datum containing the data to be transformed. - * @param datum_vector - * A vector of Datum containing the data to be transformed. - * @param cv_img - * cv::Mat containing the data to be transformed. - * @param input_blob - * A Blob containing the data to be transformed. - * @param transformed_data - * This should point to the right place in memory where the - * transformed data would be written. Assumes there is enough space * @param transformed_blob - * This is destionation blob. It can be part of top blob's data. - * The transformed data will be written at the appropriate place - * within the blob's data. + * This is destination blob. It can be part of top blob's data if + * set_cpu_data() is used See data_layer.cpp for an example. */ - void Transform(const Datum& datum, Blob<Dtype>* transformed_blob); + /** + * @brief Applies the transformation defined in the data layer's + * transform_param block to a vector of Datum. + * + * @param datum_vector + * A vector of Datum containing the data to be transformed. + * @param transformed_blob + * This is destination blob. It can be part of top blob's data if + * set_cpu_data() is used See memory_layer.cpp for an example. + */ void Transform(const vector<Datum> & datum_vector, Blob<Dtype>* transformed_blob); + /** + * @brief Applies the transformation defined in the data layer's + * transform_param block to a cv::Mat + * + * @param cv_img + * cv::Mat containing the data to be transformed. + * @param transformed_blob + * This is destination blob. It can be part of top blob's data if + * set_cpu_data() is used See image_data_layer.cpp for an example. + */ #ifndef OSX void Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob); #endif + /** + * @brief Applies the same transformation defined in the data layer's + * transform_param block to all the num images in a input_blob. + * + * @param input_blob + * A Blob containing the data to be transformed. It applies the same + * transformation to all the num images in the blob. + * @param transformed_blob + * This is destination blob, it will contain as many images as the + * input blob. It can be part of top blob's data. + */ void Transform(Blob<Dtype>* input_blob, Blob<Dtype>* transformed_blob); protected: @@ -63,7 +89,7 @@ class DataTransformer { * * @param n * The upperbound (exclusive) value of the random number. - * @return + * @return * A uniformly random integer value from ({0, 1, ..., n-1}). */ virtual int Rand(int n); diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index a195c5d2ad6..c7d1ecaf56f 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -45,7 +45,7 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, const int crop_size = param_.crop_size(); const Dtype scale = param_.scale(); - const bool do_mirror = param_.mirror() && Rand() % 2; + const bool do_mirror = param_.mirror() && Rand(2); const bool has_mean_file = param_.has_mean_file(); const bool has_unit8 = data.size() > 0; const bool has_mean_values = mean_values_.size() > 0; @@ -82,8 +82,8 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, width = crop_size; // We only do random crop when we do training. if (phase_ == Caffe::TRAIN) { - h_off = Rand(height - crop_size + 1); - w_off = Rand(width - crop_size + 1); + h_off = Rand(datum_height - crop_size + 1); + w_off = Rand(datum_width - crop_size + 1); } else { h_off = (datum_height - crop_size) / 2; w_off = (datum_width - crop_size) / 2; @@ -205,7 +205,7 @@ void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, const int crop_size = param_.crop_size(); const Dtype scale = param_.scale(); - const bool do_mirror = param_.mirror() && Rand() % 2; + const bool do_mirror = param_.mirror() && Rand(2); const bool has_mean_file = param_.has_mean_file(); const bool has_mean_values = mean_values_.size() > 0; @@ -216,8 +216,8 @@ void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, CHECK_EQ(crop_size, width); // We only do random crop when we do training. if (phase_ == Caffe::TRAIN) { - h_off = Rand() % (input_height - crop_size); - w_off = Rand() % (input_width - crop_size); + h_off = Rand(height - crop_size + 1); + w_off = Rand(width - crop_size + 1); } else { h_off = (input_height - crop_size) / 2; w_off = (input_width - crop_size) / 2; diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index 5ce52f05a3c..eb0aaf82120 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -59,10 +59,6 @@ template <typename Dtype> void BasePrefetchingDataLayer<Dtype>::Forward_cpu( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // First, join the thread - if (this->timer_forward_.has_run_at_least_once()) { - DLOG(INFO) << "Proccessing: " << - this->timer_forward_.MilliSeconds() << "ms."; - } JoinPrefetchThread(); DLOG(INFO) << "Thread joined"; // Copy the data @@ -76,7 +72,6 @@ void BasePrefetchingDataLayer<Dtype>::Forward_cpu( // Start a new prefetch thread DLOG(INFO) << "CreatePrefetchThread"; CreatePrefetchThread(); - this->timer_forward_.Start(); } #ifdef CPU_ONLY diff --git a/src/caffe/layers/base_data_layer.cu b/src/caffe/layers/base_data_layer.cu index 690858f09d3..ff1510361b6 100644 --- a/src/caffe/layers/base_data_layer.cu +++ b/src/caffe/layers/base_data_layer.cu @@ -7,7 +7,6 @@ namespace caffe { template <typename Dtype> void BasePrefetchingDataLayer<Dtype>::Forward_gpu( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { - DLOG(INFO) << "Processing: " << this->timer_forward_.MilliSeconds() << "ms."; // First, join the thread JoinPrefetchThread(); // Copy the data @@ -19,7 +18,6 @@ void BasePrefetchingDataLayer<Dtype>::Forward_gpu( } // Start a new prefetch thread CreatePrefetchThread(); - this->timer_forward_.Start(); } INSTANTIATE_CLASS(BasePrefetchingDataLayer); diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 980e4146fc9..283a3a52f59 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -8,7 +8,6 @@ #include "caffe/data_layers.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" -#include "caffe/util/benchmark.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -143,8 +142,6 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // This function is used to create a thread that prefetches the data. template <typename Dtype> void DataLayer<Dtype>::InternalThreadEntry() { - Timer batch_timer; - batch_timer.Start(); CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); @@ -204,7 +201,6 @@ void DataLayer<Dtype>::InternalThreadEntry() { LOG(FATAL) << "Unknown database backend"; } } - DLOG(INFO) << "Prefetch: " << batch_timer.MilliSeconds() << " ms."; } INSTANTIATE_CLASS(DataLayer); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index d93d56dead0..b3e5d445ed1 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -91,8 +91,6 @@ void ImageDataLayer<Dtype>::ShuffleImages() { // This function is used to create a thread that prefetches the data. template <typename Dtype> void ImageDataLayer<Dtype>::InternalThreadEntry() { - Timer batch_timer; - batch_timer.Start(); CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); @@ -131,7 +129,6 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { } } } - DLOG(INFO) << "Prefetch: " << batch_timer.MilliSeconds() << " ms."; } INSTANTIATE_CLASS(ImageDataLayer); From b07a54fc36a4751c7181ba9a8a155be77cc35596 Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama <sguada@gmail.com> Date: Fri, 26 Sep 2014 16:35:21 -0700 Subject: [PATCH 0884/2053] Fixed crop error and add test_data_transformer Make lint happy Fix Name conventions --- include/caffe/data_transformer.hpp | 4 +- .../train_val.prototxt | 13 +- src/caffe/data_transformer.cpp | 7 +- src/caffe/layers/image_data_layer.cpp | 1 - src/caffe/layers/window_data_layer.cpp | 4 +- src/caffe/test/test_data_transformer.cpp | 360 ++++++++++++++++++ src/caffe/util/benchmark.cpp | 4 +- 7 files changed, 372 insertions(+), 21 deletions(-) create mode 100644 src/caffe/test/test_data_transformer.cpp diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index db2cac5e4cf..5f08335d4a3 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -25,9 +25,7 @@ class DataTransformer { /** * @brief Initialize the Random number generations if needed by the - * transformation. Currently: - * needs_rand = param_.mirror() || - * (phase_ == Caffe::TRAIN && param_.crop_size()); + * transformation. */ void InitRand(); diff --git a/models/bvlc_reference_caffenet/train_val.prototxt b/models/bvlc_reference_caffenet/train_val.prototxt index 6cfeab10e1b..073d8aeff4a 100644 --- a/models/bvlc_reference_caffenet/train_val.prototxt +++ b/models/bvlc_reference_caffenet/train_val.prototxt @@ -330,20 +330,11 @@ layers { } } layers { - name: "top-1" + name: "accuracy" type: ACCURACY bottom: "fc8" bottom: "label" - top: "top-1" - include: { phase: TEST } -} -layers { - name: "top-5" - type: ACCURACY - bottom: "fc8" - bottom: "label" - top: "top-5" - accuracy_param: { top_k: 5 } + top: "accuracy" include: { phase: TEST } } layers { diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index c7d1ecaf56f..78112b9b8c0 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -16,7 +16,7 @@ template<typename Dtype> DataTransformer<Dtype>::DataTransformer(const TransformationParameter& param) : param_(param) { phase_ = Caffe::phase(); - // check if we want to have mean + // check if we want to use mean_file if (param_.has_mean_file()) { CHECK_EQ(param_.mean_value_size(), 0) << "Cannot specify mean_file and mean_value at the same time"; @@ -26,6 +26,7 @@ DataTransformer<Dtype>::DataTransformer(const TransformationParameter& param) ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); data_mean_.FromProto(blob_proto); } + // check if we want to use mean_value if (param_.mean_value_size() > 0) { CHECK(param_.has_mean_file() == false) << "Cannot specify mean_file and mean_value at the same time"; @@ -216,8 +217,8 @@ void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, CHECK_EQ(crop_size, width); // We only do random crop when we do training. if (phase_ == Caffe::TRAIN) { - h_off = Rand(height - crop_size + 1); - w_off = Rand(width - crop_size + 1); + h_off = Rand(input_height - crop_size + 1); + w_off = Rand(input_width - crop_size + 1); } else { h_off = (input_height - crop_size) / 2; w_off = (input_width - crop_size) / 2; diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index b3e5d445ed1..19ad2dc2126 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -112,7 +112,6 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { continue; } // Apply transformations (mirror, crop...) to the image - // this->data_transformer_.Transform(item_id, cv_img, top_data); int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index c01b61bec9b..009bf97c612 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -163,9 +163,9 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, this->prefetch_label_.Reshape(batch_size, 1, 1, 1); // data mean - if (this->layer_param_.window_data_param().has_mean_file()) { + if (this->transform_param_.has_mean_file()) { const string& mean_file = - this->layer_param_.window_data_param().mean_file(); + this->transform_param_.mean_file(); LOG(INFO) << "Loading mean file from" << mean_file; BlobProto blob_proto; ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); diff --git a/src/caffe/test/test_data_transformer.cpp b/src/caffe/test/test_data_transformer.cpp new file mode 100644 index 00000000000..28c7241050b --- /dev/null +++ b/src/caffe/test/test_data_transformer.cpp @@ -0,0 +1,360 @@ +#include <string> +#include <vector> + +#include "gtest/gtest.h" +#include "leveldb/db.h" + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/data_transformer.hpp" +#include "caffe/filler.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/io.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +void FillDatum(const int label, const int channels, const int height, + const int width, const bool unique_pixels, Datum * datum) { + datum->set_label(label); + datum->set_channels(channels); + datum->set_height(height); + datum->set_width(width); + int size = channels * height * width; + std::string* data = datum->mutable_data(); + for (int j = 0; j < size; ++j) { + int datum = unique_pixels ? j : label; + data->push_back(static_cast<uint8_t>(datum)); + } +} + +template <typename Dtype> +class DataTransformTest : public ::testing::Test { + protected: + DataTransformTest() + : seed_(1701), + num_iter_(10) {} + + int NumSequenceMatches(const TransformationParameter transform_param, + const Datum& datum) { + // Get crop sequence with Caffe seed 1701. + DataTransformer<Dtype>* transformer = + new DataTransformer<Dtype>(transform_param); + const int crop_size = transform_param.crop_size(); + Caffe::set_random_seed(seed_); + transformer->InitRand(); + Blob<Dtype>* blob = + new Blob<Dtype>(1, datum.channels(), datum.height(), datum.width()); + if (transform_param.crop_size() > 0) { + blob->Reshape(1, datum.channels(), crop_size, crop_size); + } + + vector<vector<Dtype> > crop_sequence; + for (int iter = 0; iter < this->num_iter_; ++iter) { + vector<Dtype> iter_crop_sequence; + transformer->Transform(datum, blob); + for (int j = 0; j < blob->count(); ++j) { + iter_crop_sequence.push_back(blob->cpu_data()[j]); + } + crop_sequence.push_back(iter_crop_sequence); + } + // Check if the sequence differs from the previous + int num_sequence_matches = 0; + for (int iter = 0; iter < this->num_iter_; ++iter) { + vector<Dtype> iter_crop_sequence = crop_sequence[iter]; + transformer->Transform(datum, blob); + for (int j = 0; j < blob->count(); ++j) { + num_sequence_matches += + (crop_sequence[iter][j] == blob->cpu_data()[j]); + } + } + return num_sequence_matches; + } + + virtual ~DataTransformTest() { } + + int seed_; + int num_iter_; +}; + +TYPED_TEST_CASE(DataTransformTest, TestDtypes); + +TYPED_TEST(DataTransformTest, TestEmptyTransform) { + TransformationParameter transform_param; + const bool unique_pixels = false; // all pixels the same equal to label + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + Blob<TypeParam>* blob = new Blob<TypeParam>(1, channels, height, width); + DataTransformer<TypeParam>* transformer = + new DataTransformer<TypeParam>(transform_param); + transformer->InitRand(); + transformer->Transform(datum, blob); + EXPECT_EQ(blob->num(), 1); + EXPECT_EQ(blob->channels(), datum.channels()); + EXPECT_EQ(blob->height(), datum.height()); + EXPECT_EQ(blob->width(), datum.width()); + for (int j = 0; j < blob->count(); ++j) { + EXPECT_EQ(blob->cpu_data()[j], label); + } +} + +TYPED_TEST(DataTransformTest, TestEmptyTransformUniquePixels) { + TransformationParameter transform_param; + const bool unique_pixels = true; // pixels are consecutive ints [0,size] + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + Blob<TypeParam>* blob = new Blob<TypeParam>(1, 3, 4, 5); + DataTransformer<TypeParam>* transformer = + new DataTransformer<TypeParam>(transform_param); + transformer->InitRand(); + transformer->Transform(datum, blob); + EXPECT_EQ(blob->num(), 1); + EXPECT_EQ(blob->channels(), datum.channels()); + EXPECT_EQ(blob->height(), datum.height()); + EXPECT_EQ(blob->width(), datum.width()); + for (int j = 0; j < blob->count(); ++j) { + EXPECT_EQ(blob->cpu_data()[j], j); + } +} + +TYPED_TEST(DataTransformTest, TestCropSize) { + TransformationParameter transform_param; + const bool unique_pixels = false; // all pixels the same equal to label + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + const int crop_size = 2; + + transform_param.set_crop_size(crop_size); + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + DataTransformer<TypeParam>* transformer = + new DataTransformer<TypeParam>(transform_param); + transformer->InitRand(); + Blob<TypeParam>* blob = + new Blob<TypeParam>(1, channels, crop_size, crop_size); + for (int iter = 0; iter < this->num_iter_; ++iter) { + transformer->Transform(datum, blob); + EXPECT_EQ(blob->num(), 1); + EXPECT_EQ(blob->channels(), datum.channels()); + EXPECT_EQ(blob->height(), crop_size); + EXPECT_EQ(blob->width(), crop_size); + for (int j = 0; j < blob->count(); ++j) { + EXPECT_EQ(blob->cpu_data()[j], label); + } + } +} + +TYPED_TEST(DataTransformTest, TestCropTrain) { + TransformationParameter transform_param; + const bool unique_pixels = true; // pixels are consecutive ints [0,size] + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + const int crop_size = 2; + const int size = channels * crop_size * crop_size; + + transform_param.set_crop_size(crop_size); + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + Caffe::set_phase(Caffe::TRAIN); + int num_matches = this->NumSequenceMatches(transform_param, datum); + EXPECT_LT(num_matches, size * this->num_iter_); +} + +TYPED_TEST(DataTransformTest, TestCropTest) { + TransformationParameter transform_param; + const bool unique_pixels = true; // pixels are consecutive ints [0,size] + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + const int crop_size = 2; + const int size = channels * crop_size * crop_size; + + transform_param.set_crop_size(crop_size); + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + Caffe::set_phase(Caffe::TEST); + int num_matches = this->NumSequenceMatches(transform_param, datum); + EXPECT_EQ(num_matches, size * this->num_iter_); +} + +TYPED_TEST(DataTransformTest, TestMirrorTrain) { + TransformationParameter transform_param; + const bool unique_pixels = true; // pixels are consecutive ints [0,size] + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + const int size = channels * height * width; + + transform_param.set_mirror(true); + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + Caffe::set_phase(Caffe::TRAIN); + int num_matches = this->NumSequenceMatches(transform_param, datum); + EXPECT_LT(num_matches, size * this->num_iter_); +} + +TYPED_TEST(DataTransformTest, TestMirrorTest) { + TransformationParameter transform_param; + const bool unique_pixels = true; // pixels are consecutive ints [0,size] + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + const int size = channels * height * width; + + transform_param.set_mirror(true); + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + Caffe::set_phase(Caffe::TEST); + int num_matches = this->NumSequenceMatches(transform_param, datum); + EXPECT_LT(num_matches, size * this->num_iter_); +} + +TYPED_TEST(DataTransformTest, TestCropMirrorTrain) { + TransformationParameter transform_param; + const bool unique_pixels = true; // pixels are consecutive ints [0,size] + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + const int crop_size = 2; + + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + transform_param.set_crop_size(crop_size); + Caffe::set_phase(Caffe::TRAIN); + int num_matches_crop = this->NumSequenceMatches(transform_param, datum); + + transform_param.set_mirror(true); + int num_matches_crop_mirror = + this->NumSequenceMatches(transform_param, datum); + // When doing crop and mirror we expect less num_matches than just crop + EXPECT_LE(num_matches_crop_mirror, num_matches_crop); +} + +TYPED_TEST(DataTransformTest, TestCropMirrorTest) { + TransformationParameter transform_param; + const bool unique_pixels = true; // pixels are consecutive ints [0,size] + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + const int crop_size = 2; + + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + transform_param.set_crop_size(crop_size); + Caffe::set_phase(Caffe::TEST); + int num_matches_crop = this->NumSequenceMatches(transform_param, datum); + + transform_param.set_mirror(true); + int num_matches_crop_mirror = + this->NumSequenceMatches(transform_param, datum); + // When doing crop and mirror we expect less num_matches than just crop + EXPECT_LT(num_matches_crop_mirror, num_matches_crop); +} + + +TYPED_TEST(DataTransformTest, TestMeanValue) { + TransformationParameter transform_param; + const bool unique_pixels = false; // pixels are equal to label + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + const int mean_value = 2; + + transform_param.add_mean_value(mean_value); + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + Blob<TypeParam>* blob = new Blob<TypeParam>(1, channels, height, width); + DataTransformer<TypeParam>* transformer = + new DataTransformer<TypeParam>(transform_param); + transformer->InitRand(); + transformer->Transform(datum, blob); + for (int j = 0; j < blob->count(); ++j) { + EXPECT_EQ(blob->cpu_data()[j], label - mean_value); + } +} + +TYPED_TEST(DataTransformTest, TestMeanValues) { + TransformationParameter transform_param; + const bool unique_pixels = false; // pixels are equal to label + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + + transform_param.add_mean_value(0); + transform_param.add_mean_value(1); + transform_param.add_mean_value(2); + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + Blob<TypeParam>* blob = new Blob<TypeParam>(1, channels, height, width); + DataTransformer<TypeParam>* transformer = + new DataTransformer<TypeParam>(transform_param); + transformer->InitRand(); + transformer->Transform(datum, blob); + for (int c = 0; c < channels; ++c) { + for (int j = 0; j < height * width; ++j) { + EXPECT_EQ(blob->cpu_data()[blob->offset(0, c) + j], label - c); + } + } +} + +TYPED_TEST(DataTransformTest, TestMeanFile) { + TransformationParameter transform_param; + const bool unique_pixels = true; // pixels are consecutive ints [0,size] + const int label = 0; + const int channels = 3; + const int height = 4; + const int width = 5; + const int size = channels * height * width; + + // Create a mean file + string* mean_file = new string(); + MakeTempFilename(mean_file); + BlobProto blob_mean; + blob_mean.set_num(1); + blob_mean.set_channels(channels); + blob_mean.set_height(height); + blob_mean.set_width(width); + + for (int j = 0; j < size; ++j) { + blob_mean.add_data(j); + } + + LOG(INFO) << "Using temporary mean_file " << *mean_file; + WriteProtoToBinaryFile(blob_mean, *mean_file); + + transform_param.set_mean_file(*mean_file); + Datum datum; + FillDatum(label, channels, height, width, unique_pixels, &datum); + Blob<TypeParam>* blob = new Blob<TypeParam>(1, channels, height, width); + DataTransformer<TypeParam>* transformer = + new DataTransformer<TypeParam>(transform_param); + transformer->InitRand(); + transformer->Transform(datum, blob); + for (int j = 0; j < blob->count(); ++j) { + EXPECT_EQ(blob->cpu_data()[j], 0); + } +} + +} // namespace caffe diff --git a/src/caffe/util/benchmark.cpp b/src/caffe/util/benchmark.cpp index 76829f5b36c..2edc9a53ef0 100644 --- a/src/caffe/util/benchmark.cpp +++ b/src/caffe/util/benchmark.cpp @@ -66,8 +66,10 @@ float Timer::MicroSeconds() { } if (Caffe::mode() == Caffe::GPU) { #ifndef CPU_ONLY - CUDA_CHECK(cudaEventElapsedTime(&elapsed_microseconds_, start_gpu_, + CUDA_CHECK(cudaEventElapsedTime(&elapsed_milliseconds_, start_gpu_, stop_gpu_)); + // Cuda only measure milliseconds + elapsed_microseconds_ = elapsed_milliseconds_ / 1000; #else NO_GPU; #endif From 3115b207239b53744a600debc8b4aea146d2a79b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 3 Oct 2014 18:02:32 -0700 Subject: [PATCH 0885/2053] bundle pixel mean into CaffeNet as comments --- .../train_val.prototxt | 16 + .../train_val_mean_value.prototxt | 348 ------------------ 2 files changed, 16 insertions(+), 348 deletions(-) delete mode 100644 models/bvlc_reference_caffenet/train_val_mean_value.prototxt diff --git a/models/bvlc_reference_caffenet/train_val.prototxt b/models/bvlc_reference_caffenet/train_val.prototxt index 073d8aeff4a..00fcc080261 100644 --- a/models/bvlc_reference_caffenet/train_val.prototxt +++ b/models/bvlc_reference_caffenet/train_val.prototxt @@ -14,6 +14,14 @@ layers { mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" mirror: true } +# mean pixel / channel-wise mean instead of mean image +# transform_param { +# crop_size: 227 +# mean_value: 104 +# mean_value: 117 +# mean_value: 123 +# mirror: true +# } include: { phase: TRAIN } } layers { @@ -31,6 +39,14 @@ layers { mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" mirror: false } +# mean pixel / channel-wise mean instead of mean image +# transform_param { +# crop_size: 227 +# mean_value: 104 +# mean_value: 117 +# mean_value: 123 +# mirror: true +# } include: { phase: TEST } } layers { diff --git a/models/bvlc_reference_caffenet/train_val_mean_value.prototxt b/models/bvlc_reference_caffenet/train_val_mean_value.prototxt deleted file mode 100644 index c2fbb7118ca..00000000000 --- a/models/bvlc_reference_caffenet/train_val_mean_value.prototxt +++ /dev/null @@ -1,348 +0,0 @@ -name: "CaffeNet" -layers { - name: "data" - type: DATA - top: "data" - top: "label" - data_param { - source: "examples/imagenet/ilsvrc12_train_leveldb" - batch_size: 256 - } - transform_param { - crop_size: 227 - mean_value: 104 - mean_value: 117 - mean_value: 123 - mirror: true - } - include: { phase: TRAIN } -} -layers { - name: "data" - type: DATA - top: "data" - top: "label" - data_param { - source: "examples/imagenet/ilsvrc12_val_leveldb" - batch_size: 50 - } - transform_param { - crop_size: 227 - mean_value: 104 - mean_value: 117 - mean_value: 123 - mirror: false - } - include: { phase: TEST } -} -layers { - name: "conv1" - type: CONVOLUTION - bottom: "data" - top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - convolution_param { - num_output: 96 - kernel_size: 11 - stride: 4 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 0 - } - } -} -layers { - name: "relu1" - type: RELU - bottom: "conv1" - top: "conv1" -} -layers { - name: "pool1" - type: POOLING - bottom: "conv1" - top: "pool1" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "norm1" - type: LRN - bottom: "pool1" - top: "norm1" - lrn_param { - local_size: 5 - alpha: 0.0001 - beta: 0.75 - } -} -layers { - name: "conv2" - type: CONVOLUTION - bottom: "norm1" - top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - convolution_param { - num_output: 256 - pad: 2 - kernel_size: 5 - group: 2 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 1 - } - } -} -layers { - name: "relu2" - type: RELU - bottom: "conv2" - top: "conv2" -} -layers { - name: "pool2" - type: POOLING - bottom: "conv2" - top: "pool2" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "norm2" - type: LRN - bottom: "pool2" - top: "norm2" - lrn_param { - local_size: 5 - alpha: 0.0001 - beta: 0.75 - } -} -layers { - name: "conv3" - type: CONVOLUTION - bottom: "norm2" - top: "conv3" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - convolution_param { - num_output: 384 - pad: 1 - kernel_size: 3 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 0 - } - } -} -layers { - name: "relu3" - type: RELU - bottom: "conv3" - top: "conv3" -} -layers { - name: "conv4" - type: CONVOLUTION - bottom: "conv3" - top: "conv4" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - convolution_param { - num_output: 384 - pad: 1 - kernel_size: 3 - group: 2 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 1 - } - } -} -layers { - name: "relu4" - type: RELU - bottom: "conv4" - top: "conv4" -} -layers { - name: "conv5" - type: CONVOLUTION - bottom: "conv4" - top: "conv5" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - convolution_param { - num_output: 256 - pad: 1 - kernel_size: 3 - group: 2 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 1 - } - } -} -layers { - name: "relu5" - type: RELU - bottom: "conv5" - top: "conv5" -} -layers { - name: "pool5" - type: POOLING - bottom: "conv5" - top: "pool5" - pooling_param { - pool: MAX - kernel_size: 3 - stride: 2 - } -} -layers { - name: "fc6" - type: INNER_PRODUCT - bottom: "pool5" - top: "fc6" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - inner_product_param { - num_output: 4096 - weight_filler { - type: "gaussian" - std: 0.005 - } - bias_filler { - type: "constant" - value: 1 - } - } -} -layers { - name: "relu6" - type: RELU - bottom: "fc6" - top: "fc6" -} -layers { - name: "drop6" - type: DROPOUT - bottom: "fc6" - top: "fc6" - dropout_param { - dropout_ratio: 0.5 - } -} -layers { - name: "fc7" - type: INNER_PRODUCT - bottom: "fc6" - top: "fc7" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - inner_product_param { - num_output: 4096 - weight_filler { - type: "gaussian" - std: 0.005 - } - bias_filler { - type: "constant" - value: 1 - } - } -} -layers { - name: "relu7" - type: RELU - bottom: "fc7" - top: "fc7" -} -layers { - name: "drop7" - type: DROPOUT - bottom: "fc7" - top: "fc7" - dropout_param { - dropout_ratio: 0.5 - } -} -layers { - name: "fc8" - type: INNER_PRODUCT - bottom: "fc7" - top: "fc8" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 - inner_product_param { - num_output: 1000 - weight_filler { - type: "gaussian" - std: 0.01 - } - bias_filler { - type: "constant" - value: 0 - } - } -} -layers { - name: "accuracy" - type: ACCURACY - bottom: "fc8" - bottom: "label" - top: "accuracy" - include: { phase: TEST } -} -layers { - name: "loss" - type: SOFTMAX_LOSS - bottom: "fc8" - bottom: "label" - top: "loss" -} From e8b48b41e0f6e1c38cf1bef144e6907ea30d6a7d Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 3 Oct 2014 18:03:02 -0700 Subject: [PATCH 0886/2053] uin8 spell check --- src/caffe/data_transformer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 78112b9b8c0..dffaba545b5 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -48,7 +48,7 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, const Dtype scale = param_.scale(); const bool do_mirror = param_.mirror() && Rand(2); const bool has_mean_file = param_.has_mean_file(); - const bool has_unit8 = data.size() > 0; + const bool has_uint8 = data.size() > 0; const bool has_mean_values = mean_values_.size() > 0; CHECK_GT(datum_channels, 0); @@ -102,7 +102,7 @@ void DataTransformer<Dtype>::Transform(const Datum& datum, } else { top_index = (c * height + h) * width + w; } - if (has_unit8) { + if (has_uint8) { datum_element = static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); } else { From 1d3bbe2e7bf896379aecf8faa3fcdd5cf5bad522 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Sun, 5 Oct 2014 14:34:55 -0700 Subject: [PATCH 0887/2053] Missing param.pad condition for CUDNN pooling --- src/caffe/layer_factory.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 8815ddd021d..69863543c30 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -47,7 +47,8 @@ Layer<Dtype>* GetPoolingLayer(const LayerParameter& param) { #ifdef USE_CUDNN } else if (engine == PoolingParameter_Engine_CUDNN) { PoolingParameter p_param = param.pooling_param(); - if (p_param.pad_h() || p_param.pad_w() || param.top_size() > 1) { + if (p_param.pad() || p_param.pad_h() || p_param.pad_w() || + param.top_size() > 1) { LOG(INFO) << "CUDNN does not support padding or multiple tops. " << "Using Caffe's own pooling layer."; return new PoolingLayer<Dtype>(param); From c20cf21ab430e50f0d3e8d93cd42d2e930d41dd2 Mon Sep 17 00:00:00 2001 From: Dmytro Mishkin <ducha.aiki@gmail.com> Date: Mon, 6 Oct 2014 10:32:47 +0300 Subject: [PATCH 0888/2053] change -lpthread to -pthread in linking Compilation flags is already there --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 929f8d5cea6..f49ea5649a4 100644 --- a/Makefile +++ b/Makefile @@ -169,7 +169,7 @@ LIBRARIES += glog gflags protobuf leveldb snappy \ lmdb \ boost_system \ hdf5_hl hdf5 \ - opencv_core opencv_highgui opencv_imgproc pthread + opencv_core opencv_highgui opencv_imgproc PYTHON_LIBRARIES := boost_python python2.7 WARNINGS := -Wall -Wno-sign-compare @@ -314,7 +314,7 @@ CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) # mex may invoke an older gcc that is too liberal with -Wuninitalized MATLAB_CXXFLAGS := $(CXXFLAGS) -Wno-uninitialized -LINKFLAGS += -fPIC $(COMMON_FLAGS) $(WARNINGS) +LINKFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) \ $(foreach library,$(LIBRARIES),-l$(library)) PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) From 6893ea722505c889fd40c9f692d7a87eb750c752 Mon Sep 17 00:00:00 2001 From: Martin Baeuml <baeuml@kit.edu> Date: Mon, 6 Oct 2014 13:48:29 +0200 Subject: [PATCH 0889/2053] change linking order such that pthread comes in the back This resolves an error with the static gflags library which would other wise not link properly with an undefined reference to symbol 'pthread_rwlock_wrlock@@GLIBC_2.2.5' error under Ubuntu 14.04. --- src/caffe/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index 86c7c7eb4a3..0ff0412230c 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -111,13 +111,13 @@ endif() target_link_libraries(caffe proto ${BLAS_LIBRARIES} ${Boost_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT} ${GFLAGS_LIBRARIES} ${GLOG_LIBRARIES} ${HDF5_LIBRARIES} ${LEVELDB_LIBS} ${LMDB_LIBRARIES} ${OpenCV_LIBS} + ${CMAKE_THREAD_LIBS_INIT} ) #set output directory From aaccb48bd29fef703e0260bbc47685960797d7a1 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 6 Oct 2014 12:34:18 -0700 Subject: [PATCH 0890/2053] [fix] check solver prototxt parsing --- src/caffe/solver.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 8d187ea638b..ba262920a9a 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -23,7 +23,7 @@ template <typename Dtype> Solver<Dtype>::Solver(const string& param_file) : net_() { SolverParameter param; - ReadProtoFromTextFile(param_file, ¶m); + ReadProtoFromTextFileOrDie(param_file, ¶m); Init(param); } From a1a48563d3cbb37ffa510d0ffae718183835e2dc Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 6 Oct 2014 13:27:10 -0700 Subject: [PATCH 0891/2053] use glog to provide a backtrace on crash --- src/caffe/common.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caffe/common.cpp b/src/caffe/common.cpp index 94fdf924f44..834d5694aad 100644 --- a/src/caffe/common.cpp +++ b/src/caffe/common.cpp @@ -35,6 +35,8 @@ void GlobalInit(int* pargc, char*** pargv) { ::gflags::ParseCommandLineFlags(pargc, pargv, true); // Google logging. ::google::InitGoogleLogging(*(pargv)[0]); + // Provide a backtrace on segfault. + ::google::InstallFailureSignalHandler(); } #ifdef CPU_ONLY // CPU-only Caffe. From cf270600c588c77f0c5d0242d833fe5f615a4662 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sat, 4 Oct 2014 10:00:59 -0700 Subject: [PATCH 0892/2053] SliceLayer: fix whitespace --- src/caffe/layers/slice_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp index 17144c1a280..76522c3e456 100644 --- a/src/caffe/layers/slice_layer.cpp +++ b/src/caffe/layers/slice_layer.cpp @@ -46,13 +46,13 @@ void SliceLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, slices.push_back(num_ - prev); for (int i = 0; i < top.size(); ++i) { top[i]->Reshape(slices[i], channels_, height_, width_); - count_ += top[i]->count(); + count_ += top[i]->count(); } } else { slices.push_back(channels_ - prev); for (int i = 0; i < top.size(); ++i) { top[i]->Reshape(num_, slices[i], height_, width_); - count_ += top[i]->count(); + count_ += top[i]->count(); } } } else { From 914da95ed1059c05d39d9b6fbe0f797970aaa376 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 6 Oct 2014 16:35:33 -0700 Subject: [PATCH 0893/2053] correct naming in comment and message about average_loss --- src/caffe/proto/caffe.proto | 2 +- src/caffe/solver.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 751b68232cd..f0404a09b90 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -113,7 +113,7 @@ message SolverParameter { // the number of iterations between displaying info. If display = 0, no info // will be displayed. optional int32 display = 6; - // Display the cost averaged over the last average_cost iterations + // Display the loss averaged over the last average_loss iterations optional int32 average_loss = 33 [default = 1]; optional int32 max_iter = 7; // the maximum number of iterations optional string lr_policy = 8; // The learning rate decay policy. diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 221fa07e464..995df06ddc7 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -171,7 +171,7 @@ void Solver<Dtype>::Solve(const char* resume_file) { int average_loss = this->param_.average_loss(); - CHECK_GE(average_loss, 1) << "average_cost should be non-negative."; + CHECK_GE(average_loss, 1) << "average_loss should be non-negative."; vector<Dtype> losses; Dtype smoothed_loss = 0; From 84a5b8bb9aeb2b1ed965af598c63b1d3f57c2197 Mon Sep 17 00:00:00 2001 From: Martin Baeuml <baeuml@kit.edu> Date: Tue, 7 Oct 2014 10:35:00 +0200 Subject: [PATCH 0894/2053] [cmake] move dependency finding to root CMakeLists.txt In this way, custom include directories for the dependencies are also available for tools/ and the bindings. This is necessary for example when someone is using custom built dependencies which are not installed in the system's default directories (e.g. OpenCV includes are required in tools/ through io.hpp) --- CMakeLists.txt | 84 +++++++++++++++++++++++++++++++++++++++- src/caffe/CMakeLists.txt | 80 +------------------------------------- 2 files changed, 83 insertions(+), 81 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6de6b102981..b97eb565f45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,15 +49,95 @@ include_directories(${CMAKE_SOURCE_DIR}/src) # CMake Scripts dir set(CMAKE_SCRIPT_DIR ${CMAKE_SOURCE_DIR}/CMakeScripts) -# CMake module path for custom module finding +# CMake module path for custom module finding set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SCRIPT_DIR}) -# CUDA is required globally +### Dependencies ########################################################################## + +# Boost +find_package(Boost 1.46 COMPONENTS system thread REQUIRED) +include_directories(${Boost_INCLUDE_DIR}) +link_directories(${Boost_LIBRARY_DIRS}) + +# CUDA if(NOT CPU_ONLY) find_package(CUDA 5.5 REQUIRED) include_directories(${CUDA_INCLUDE_DIRS}) + + set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} + -gencode arch=compute_20,code=sm_20 + -gencode arch=compute_20,code=sm_21 + -gencode arch=compute_30,code=sm_30 + -gencode arch=compute_35,code=sm_35 + ) + + # https://github.com/ComputationalRadiationPhysics/picongpu/blob/master/src/picongpu/CMakeLists.txt + # work-arounds + if(Boost_VERSION EQUAL 105500) + # see https://svn.boost.org/trac/boost/ticket/9392 + message(STATUS "Boost: Applying noinline work around") + # avoid warning for CMake >= 2.8.12 + set(CUDA_NVCC_FLAGS + "${CUDA_NVCC_FLAGS} \"-DBOOST_NOINLINE=__attribute__((noinline))\" ") + endif(Boost_VERSION EQUAL 105500) +endif() + +# Threads +find_package(Threads REQUIRED) + +# Google-glog +find_package(Glog REQUIRED) +include_directories(${GLOG_INCLUDE_DIRS}) + +# Google-gflags +find_package(GFlags REQUIRED) +include_directories(${GFLAGS_INCLUDE_DIRS}) + +# BLAS +if(BLAS STREQUAL "atlas") + + find_package(Atlas REQUIRED) + include_directories(${Atlas_INCLUDE_DIR}) + set(BLAS_LIBRARIES ${Atlas_LIBRARIES}) + +elseif(BLAS STREQUAL "open") + + find_package(OpenBLAS REQUIRED) + include_directories(${OpenBLAS_INCLUDE_DIR}) + set(BLAS_LIBRARIES ${OpenBLAS_LIB}) + +elseif(BLAS STREQUAL "mkl") + + find_package(MKL REQUIRED) + include_directories(${MKL_INCLUDE_DIR}) + set(BLAS_LIBRARIES ${MKL_LIBRARIES}) + endif() +# HDF5 +find_package(HDF5 COMPONENTS HL REQUIRED) +include_directories(${HDF5_INCLUDE_DIRS}) + +# LevelDB +find_package(LevelDB REQUIRED) +include_directories(${LEVELDB_INCLUDE}) +if(LEVELDB_FOUND) + find_package(Snappy REQUIRED) + include_directories(${SNAPPY_INCLUDE_DIR}) + set(LEVELDB_LIBS + ${LEVELDB_LIBS} + ${SNAPPY_LIBS} + ) +endif() + +# LMDB +find_package(LMDB REQUIRED) +include_directories(${LMDB_INCLUDE_DIR}) + +# OpenCV +find_package(OpenCV REQUIRED core highgui imgproc) +include_directories(${OpenCV_INCLUDE_DIRS}) + ### Subdirectories ########################################################################## add_subdirectory(src/gtest) diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index 0ff0412230c..dda072688f8 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -1,65 +1,5 @@ project( CaffeSrc ) -# Threads -find_package(Threads REQUIRED) - -# Google-glog -find_package(Glog REQUIRED) -include_directories(${GLOG_INCLUDE_DIRS}) - -# Google-gflags -find_package(GFlags REQUIRED) -include_directories(${GFLAGS_INCLUDE_DIRS}) - -# BLAS -if(BLAS STREQUAL "atlas") - - find_package(Atlas REQUIRED) - include_directories(${Atlas_INCLUDE_DIR}) - set(BLAS_LIBRARIES ${Atlas_LIBRARIES}) - -elseif(BLAS STREQUAL "open") - - find_package(OpenBLAS REQUIRED) - include_directories(${OpenBLAS_INCLUDE_DIR}) - set(BLAS_LIBRARIES ${OpenBLAS_LIB}) - -elseif(BLAS STREQUAL "mkl") - - find_package(MKL REQUIRED) - include_directories(${MKL_INCLUDE_DIR}) - set(BLAS_LIBRARIES ${MKL_LIBRARIES}) - -endif() - -# HDF5 -find_package(HDF5 COMPONENTS HL REQUIRED) -include_directories(${HDF5_INCLUDE_DIRS}) - -# OpenCV -find_package(OpenCV REQUIRED core highgui imgproc) -include_directories(${OpenCV_INCLUDE_DIRS}) - -# LevelDB -find_package(LevelDB REQUIRED) -include_directories(${LEVELDB_INCLUDE}) -if(LEVELDB_FOUND) - find_package(Snappy REQUIRED) - include_directories(${SNAPPY_INCLUDE_DIR}) - set(LEVELDB_LIBS - ${LEVELDB_LIBS} - ${SNAPPY_LIBS} - ) -endif() - -# LMDB -find_package(LMDB REQUIRED) -include_directories(${LMDB_INCLUDE_DIR}) - -# Boost -find_package(Boost 1.46 COMPONENTS system thread REQUIRED) -include_directories( ${Boost_INCLUDE_DIR} ) -link_directories( ${Boost_LIBRARY_DIRS} ) add_subdirectory(proto) @@ -77,26 +17,8 @@ add_library(caffe ${CPP_SOURCES}) # both depend on proto add_dependencies(caffe proto) -# CUDA +# cuda sources if(NOT CPU_ONLY) - set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} - -gencode arch=compute_20,code=sm_20 - -gencode arch=compute_20,code=sm_21 - -gencode arch=compute_30,code=sm_30 - -gencode arch=compute_35,code=sm_35 - ) - -# https://github.com/ComputationalRadiationPhysics/picongpu/blob/master/src/picongpu/CMakeLists.txt - # work-arounds -if(Boost_VERSION EQUAL 105500) - # see https://svn.boost.org/trac/boost/ticket/9392 - message(STATUS "Boost: Applying noinline work around") - # avoid warning for CMake >= 2.8.12 - set(CUDA_NVCC_FLAGS - "${CUDA_NVCC_FLAGS} \"-DBOOST_NOINLINE=__attribute__((noinline))\" ") -endif(Boost_VERSION EQUAL 105500) - - # cuda sources file(GLOB_RECURSE CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cu) file(GLOB_RECURSE TEST_CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cu) list(REMOVE_ITEM CU_SOURCES ${TEST_CU_SOURCES}) From b9c1eec5a6821e21d12fa67fca98558c2dd3c5f4 Mon Sep 17 00:00:00 2001 From: max argus <argus.max@gmail.com> Date: Sat, 4 Oct 2014 11:46:38 +0000 Subject: [PATCH 0895/2053] Fix CMake build of pycaffe - generate right shared library name - fix CMake linking with the new layer factory - find numpy Fix finding protobuf. --- CMakeScripts/FindNumPy.cmake | 103 ++++++++++++++++++++++ CMakeScripts/FindProtobuf.cmake | 152 ++++++++++++++++++++++++++++++++ python/CMakeLists.txt | 48 ++++++++-- src/caffe/proto/CMakeLists.txt | 11 ++- 4 files changed, 308 insertions(+), 6 deletions(-) create mode 100644 CMakeScripts/FindNumPy.cmake create mode 100644 CMakeScripts/FindProtobuf.cmake diff --git a/CMakeScripts/FindNumPy.cmake b/CMakeScripts/FindNumPy.cmake new file mode 100644 index 00000000000..baf21541e63 --- /dev/null +++ b/CMakeScripts/FindNumPy.cmake @@ -0,0 +1,103 @@ +# - Find the NumPy libraries +# This module finds if NumPy is installed, and sets the following variables +# indicating where it is. +# +# TODO: Update to provide the libraries and paths for linking npymath lib. +# +# NUMPY_FOUND - was NumPy found +# NUMPY_VERSION - the version of NumPy found as a string +# NUMPY_VERSION_MAJOR - the major version number of NumPy +# NUMPY_VERSION_MINOR - the minor version number of NumPy +# NUMPY_VERSION_PATCH - the patch version number of NumPy +# NUMPY_VERSION_DECIMAL - e.g. version 1.6.1 is 10601 +# NUMPY_INCLUDE_DIRS - path to the NumPy include files + +#============================================================================ +# Copyright 2012 Continuum Analytics, Inc. +# +# MIT License +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files +# (the "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to permit +# persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR +# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +#============================================================================ + +# Finding NumPy involves calling the Python interpreter +if(NumPy_FIND_REQUIRED) + find_package(PythonInterp REQUIRED) +else() + find_package(PythonInterp) +endif() + +if(NOT PYTHONINTERP_FOUND) + set(NUMPY_FOUND FALSE) + return() +endif() + +execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c" + "import numpy as n; print(n.__version__); print(n.get_include());" + RESULT_VARIABLE _NUMPY_SEARCH_SUCCESS + OUTPUT_VARIABLE _NUMPY_VALUES_OUTPUT + ERROR_VARIABLE _NUMPY_ERROR_VALUE + OUTPUT_STRIP_TRAILING_WHITESPACE) + +if(NOT _NUMPY_SEARCH_SUCCESS MATCHES 0) + if(NumPy_FIND_REQUIRED) + message(FATAL_ERROR + "NumPy import failure:\n${_NUMPY_ERROR_VALUE}") + endif() + set(NUMPY_FOUND FALSE) + return() +endif() + +# Convert the process output into a list +string(REGEX REPLACE ";" "\\\\;" _NUMPY_VALUES ${_NUMPY_VALUES_OUTPUT}) +string(REGEX REPLACE "\n" ";" _NUMPY_VALUES ${_NUMPY_VALUES}) +# Just in case there is unexpected output from the Python command. +list(GET _NUMPY_VALUES -2 NUMPY_VERSION) +list(GET _NUMPY_VALUES -1 NUMPY_INCLUDE_DIRS) + +string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" _VER_CHECK "${NUMPY_VERSION}") +if("${_VER_CHECK}" STREQUAL "") + # The output from Python was unexpected. Raise an error always + # here, because we found NumPy, but it appears to be corrupted somehow. + message(FATAL_ERROR + "Requested version and include path from NumPy, got instead:\n${_NUMPY_VALUES_OUTPUT}\n") + return() +endif() + +# Make sure all directory separators are '/' +string(REGEX REPLACE "\\\\" "/" NUMPY_INCLUDE_DIRS ${NUMPY_INCLUDE_DIRS}) + +# Get the major and minor version numbers +string(REGEX REPLACE "\\." ";" _NUMPY_VERSION_LIST ${NUMPY_VERSION}) +list(GET _NUMPY_VERSION_LIST 0 NUMPY_VERSION_MAJOR) +list(GET _NUMPY_VERSION_LIST 1 NUMPY_VERSION_MINOR) +list(GET _NUMPY_VERSION_LIST 2 NUMPY_VERSION_PATCH) +string(REGEX MATCH "[0-9]*" NUMPY_VERSION_PATCH ${NUMPY_VERSION_PATCH}) +math(EXPR NUMPY_VERSION_DECIMAL + "(${NUMPY_VERSION_MAJOR} * 10000) + (${NUMPY_VERSION_MINOR} * 100) + ${NUMPY_VERSION_PATCH}") + +find_package_message(NUMPY + "Found NumPy: version \"${NUMPY_VERSION}\" ${NUMPY_INCLUDE_DIRS}" + "${NUMPY_INCLUDE_DIRS}${NUMPY_VERSION}") + +set(NUMPY_FOUND TRUE) + + diff --git a/CMakeScripts/FindProtobuf.cmake b/CMakeScripts/FindProtobuf.cmake new file mode 100644 index 00000000000..0f94f498197 --- /dev/null +++ b/CMakeScripts/FindProtobuf.cmake @@ -0,0 +1,152 @@ +# Locate and configure the Google Protocol Buffers library. +# Defines the following variables: +# +# PROTOBUF_FOUND - Found the Google Protocol Buffers library +# PROTOBUF_INCLUDE_DIRS - Include directories for Google Protocol Buffers +# PROTOBUF_LIBRARIES - The protobuf library +# +# The following cache variables are also defined: +# PROTOBUF_LIBRARY - The protobuf library +# PROTOBUF_PROTOC_LIBRARY - The protoc library +# PROTOBUF_INCLUDE_DIR - The include directory for protocol buffers +# PROTOBUF_PROTOC_EXECUTABLE - The protoc compiler +# +# ==================================================================== +# Example: +# +# find_package(Protobuf REQUIRED) +# include_directories(${PROTOBUF_INCLUDE_DIRS}) +# +# include_directories(${CMAKE_CURRENT_BINARY_DIR}) +# PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS foo.proto) +# add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS}) +# target_link_libraries(bar ${PROTOBUF_LIBRARY}) +# +# NOTE: You may need to link against pthreads, depending +# on the platform. +# ==================================================================== +# +# PROTOBUF_GENERATE_CPP (public function) +# SRCS = Variable to define with autogenerated +# source files +# HDRS = Variable to define with autogenerated +# header files +# ARGN = proto files +# +# ==================================================================== + + +#============================================================================= +# Copyright 2009 Kitware, Inc. +# Copyright 2009 Philip Lowman <philip@yhbt.com> +# Copyright 2008 Esben Mose Hansen, Ange Optimization ApS +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) + +function(PROTOBUF_GENERATE_PYTHON SRCS) + if(NOT ARGN) + message(SEND_ERROR "Error: PROTOBUF_GENERATE_PYTHON() called without any proto files") + return() + endif(NOT ARGN) + + set(${SRCS}) + foreach(FIL ${ARGN}) + get_filename_component(ABS_FIL ${FIL} ABSOLUTE) + get_filename_component(FIL_WE ${FIL} NAME_WE) + + + list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}_pb2.py") + + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}_pb2.py" + COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} + ARGS --python_out ${CMAKE_CURRENT_BINARY_DIR} --proto_path ${CMAKE_CURRENT_SOURCE_DIR} +${ABS_FIL} + DEPENDS ${ABS_FIL} + COMMENT "Running Python protocol buffer compiler on ${FIL}" + VERBATIM ) + endforeach() + + + set_source_files_properties(${${SRCS}} PROPERTIES GENERATED TRUE) + set(${SRCS} ${${SRCS}} PARENT_SCOPE) +endfunction() + + +function(PROTOBUF_GENERATE_CPP SRCS HDRS) + if(NOT ARGN) + message(SEND_ERROR "Error: PROTOBUF_GENERATE_CPP() called without any proto files") + return() + endif(NOT ARGN) + + set(${SRCS}) + set(${HDRS}) + foreach(FIL ${ARGN}) + get_filename_component(ABS_FIL ${FIL} ABSOLUTE) + get_filename_component(FIL_WE ${FIL} NAME_WE) + + list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc") + list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h") + + add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc" + "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h" + COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} + ARGS --cpp_out ${CMAKE_CURRENT_BINARY_DIR} --proto_path ${CMAKE_CURRENT_SOURCE_DIR} +${ABS_FIL} + DEPENDS ${ABS_FIL} + COMMENT "Running C++ protocol buffer compiler on ${FIL}" + VERBATIM ) + endforeach() + + set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE) + set(${SRCS} ${${SRCS}} PARENT_SCOPE) + set(${HDRS} ${${HDRS}} PARENT_SCOPE) +endfunction() + + +find_path(PROTOBUF_INCLUDE_DIR google/protobuf/service.h) + +# Google's provided vcproj files generate libraries with a "lib" +# prefix on Windows +if(WIN32) + set(PROTOBUF_ORIG_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}") + set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "") +endif() + +find_library(PROTOBUF_LIBRARY NAMES protobuf + DOC "The Google Protocol Buffers Library" +) +find_library(PROTOBUF_PROTOC_LIBRARY NAMES protoc + DOC "The Google Protocol Buffers Compiler Library" +) +find_program(PROTOBUF_PROTOC_EXECUTABLE NAMES protoc + DOC "The Google Protocol Buffers Compiler" +) + +mark_as_advanced(PROTOBUF_INCLUDE_DIR + PROTOBUF_LIBRARY + PROTOBUF_PROTOC_LIBRARY + PROTOBUF_PROTOC_EXECUTABLE) + +# Restore original find library prefixes +if(WIN32) + set(CMAKE_FIND_LIBRARY_PREFIXES "${PROTOBUF_ORIG_FIND_LIBRARY_PREFIXES}") +endif() + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROTOBUF DEFAULT_MSG + PROTOBUF_LIBRARY PROTOBUF_INCLUDE_DIR) + +if(PROTOBUF_FOUND) + set(PROTOBUF_INCLUDE_DIRS ${PROTOBUF_INCLUDE_DIR}) + set(PROTOBUF_LIBRARIES ${PROTOBUF_LIBRARY}) +endif() diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 343c863adf5..6470517d213 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -1,20 +1,58 @@ project( Python ) # Python -find_package(PythonLibs REQUIRED) -include_directories(${PYTHON_INCLUDE_DIRS}) +find_package(PythonLibs 2.7 REQUIRED) + +# Numpy +find_package(NumPy REQUIRED) # Boost.Python find_package(Boost 1.46 COMPONENTS python REQUIRED) -include_directories(${Boost_INCLUDE_DIRS}) + + + +#In case you have both python2 and python3 installed the quickest way to +#compile pycaffe with cmake is to replace the following hardcoded paths. +#Althernativley the Find* scripts could be rewritten to support choice of +#of python version. +#if(${PYTHONLIBS_VERSION_STRING} MATCHES "^[3-9]+\\.[0-9]+(\\.[0-9]+.*)?$") +# +# set( PYTHON_INCLUDE_DIRS "/usr/include/python2.7") +# set( PYTHON_LIBRARIES "/usr/lib64/libpython2.7.so") +# set( NUMPY_INCLUDE_DIRS "/usr/lib64/python2.7/site-packages/numpy/core/include/") +# set( PYTHON_LIBRARIES "/usr/lib64/python2.7/site-packages/numpy/lib/") +# set(Boost_LIBRARIES "/usr/lib64/libboost_python-2.7-mt.so") +# +# message( "Warning: cmake found python3 by default, switching to hardcoded paths") +# +# message( "PYTHON_INCLUDE_DIRS =/usr/include/python2.7") +# message( "PYTHON_LIBRARIES =/usr/lib64/libpython2.7.so") +# message( "NUMPY_INCLUDE_DIRS =/usr/lib64/python2.7/site-packages/numpy/core/include/") +# message( "PYTHON_LIBRARIES =/usr/lib64/python2.7/site-packages/numpy/lib/") +# message( "Boost_LIBRARIES =/usr/lib64/libboost_python-2.7-mt.so") +#endif() + + +include_directories(${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIRS} + ${Boost_INCLUDE_DIRS}) file(GLOB_RECURSE Python_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) add_library(pycaffe SHARED ${Python_SOURCES}) -target_link_libraries(pycaffe caffe ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}) -### Install ################################################################################# +add_dependencies(pycaffe protoPy) + +target_link_libraries(pycaffe ${CAFFE_STATIC_LINK} ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}) + +set_target_properties(pycaffe PROPERTIES PREFIX "") +set_target_properties(pycaffe PROPERTIES OUTPUT_NAME "_caffe") + +### Install ############################################################# install(DIRECTORY caffe DESTINATION python) install(FILES requirements.txt DESTINATION python) + +#This installs a library named "libpycaffe.so" install(TARGETS pycaffe DESTINATION python/caffe) + + diff --git a/src/caffe/proto/CMakeLists.txt b/src/caffe/proto/CMakeLists.txt index 186a856509b..12e7ce0a326 100644 --- a/src/caffe/proto/CMakeLists.txt +++ b/src/caffe/proto/CMakeLists.txt @@ -14,11 +14,15 @@ endif() include_directories(${PROTOBUF_INCLUDE_DIR}) file(GLOB ProtoFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.proto") PROTOBUF_GENERATE_CPP(ProtoSources ProtoHeaders ${ProtoFiles}) +PROTOBUF_GENERATE_PYTHON(ProtoSourcesPy ${ProtoFiles}) + +add_custom_target(protoPy DEPENDS ${ProtoSourcesPy}) add_library(proto ${ProtoSources} ${ProtoHeaders} -) + ) + target_link_libraries(proto ${PROTOBUF_LIBRARIES}) @@ -35,3 +39,8 @@ foreach(header ${ProtoHeaders}) ) endforeach(header) + +file(WRITE __init__.py) +install(PROGRAMS __init__.py DESTINATION python/caffe/proto) +install(PROGRAMS ${ProtoSourcesPy} DESTINATION python/caffe/proto) + From 57d14637d6b337d4a1bb854dcb402c56a6eb44d5 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 8 Oct 2014 19:56:07 -0700 Subject: [PATCH 0896/2053] [example] fix data script paths for flickr fine-tuning --- examples/finetune_flickr_style/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/finetune_flickr_style/readme.md b/examples/finetune_flickr_style/readme.md index 4220102e7f7..e0183510bef 100644 --- a/examples/finetune_flickr_style/readme.md +++ b/examples/finetune_flickr_style/readme.md @@ -34,7 +34,7 @@ All steps are to be done from the caffe root directory. The dataset is distributed as a list of URLs with corresponding labels. Using a script, we will download a small subset of the data and split it into train and val sets. - caffe % ./models/finetune_flickr_style/assemble_data.py -h + caffe % ./examples/finetune_flickr_style/assemble_data.py -h usage: assemble_data.py [-h] [-s SEED] [-i IMAGES] [-w WORKERS] Download a subset of Flickr Style to a directory @@ -48,7 +48,7 @@ Using a script, we will download a small subset of the data and split it into tr num workers used to download images. -x uses (all - x) cores. - caffe % python models/finetune_flickr_style/assemble_data.py --workers=-1 --images=2000 --seed 831486 + caffe % python examples/finetune_flickr_style/assemble_data.py --workers=-1 --images=2000 --seed 831486 Downloading 2000 images with 7 workers... Writing train/val for 1939 successfully downloaded images. From 3ff2201f2706f8aa1522b635a2d46f4003abc032 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 9 Oct 2014 21:00:03 -0700 Subject: [PATCH 0897/2053] [example] add LeNet to MNIST title, fix paths to be from root --- examples/mnist/readme.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 44e0091f420..2b8f0d782d4 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -1,6 +1,6 @@ --- -title: MNIST Tutorial -description: Train and test "LeNet" on MNIST data. +title: LeNet MNIST Tutorial +description: Train and test "LeNet" on the MNIST handwritten digit data. category: example include_in_docs: true priority: 1 @@ -14,10 +14,9 @@ We will assume that you have Caffe successfully compiled. If not, please refer t You will first need to download and convert the data format from the MNIST website. To do this, simply run the following commands: - cd $CAFFE_ROOT/data/mnist - ./get_mnist.sh - cd $CAFFE_ROOT/examples/mnist - ./create_mnist.sh + cd $CAFFE_ROOT + ./data/mnist/get_mnist.sh + ./examples/mnist/create_mnist.sh If it complains that `wget` or `gunzip` are not installed, you need to install them respectively. After running the script there should be two datasets, `mnist_train_lmdb`, and `mnist_test_lmdb`. @@ -228,8 +227,8 @@ Check out the comments explaining each line in the prototxt `$CAFFE_ROOT/example Training the model is simple after you have written the network definition protobuf and solver protobuf files. Simply run `train_lenet.sh`, or the following command directly: - cd $CAFFE_ROOT/examples/mnist - ./train_lenet.sh + cd $CAFFE_ROOT + ./examples/mnist/train_lenet.sh `train_lenet.sh` is a simple script, but here is a quick explanation: the main tool for training is `caffe` with action `train` and the solver protobuf text file as its argument. From 5d2fb984347339c0ca2988a21215a2647bb90781 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 9 Oct 2014 21:01:41 -0700 Subject: [PATCH 0898/2053] [example] re-title LeNet / MNIST heading too --- examples/mnist/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 2b8f0d782d4..33ed371b4a1 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -6,7 +6,7 @@ include_in_docs: true priority: 1 --- -# Training MNIST with Caffe +# Training LeNet on MNIST with Caffe We will assume that you have Caffe successfully compiled. If not, please refer to the [Installation page](/installation.html). In this tutorial, we will assume that your Caffe installation is located at `CAFFE_ROOT`. From cb60a41c246c36680431ad7cf5535395d61d5cb7 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 9 Oct 2014 22:43:36 -0700 Subject: [PATCH 0899/2053] [docs] update homebrew instructions for boost and boost-python split --- docs/installation.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index dbf73d2c067..7cfa04eca1f 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -18,7 +18,7 @@ Caffe depends on several software packages. * [CUDA](https://developer.nvidia.com/cuda-zone) library version 6.5 (recommended), 6.0, 5.5, or 5.0 and the latest driver version for CUDA 6 or 319.* for CUDA 5 (and NOT 331.*) * [BLAS](http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) (provided via ATLAS, MKL, or OpenBLAS). * [OpenCV](http://opencv.org/). -* [Boost](http://www.boost.org/) (>= 1.55, although only 1.55 is tested) +* [Boost](http://www.boost.org/) (>= 1.55, although only 1.55 and 1.56 are tested) * `glog`, `gflags`, `protobuf`, `leveldb`, `snappy`, `hdf5`, `lmdb` * For the Python wrapper * `Python 2.7`, `numpy (>= 1.7)`, boost-provided `boost.python` @@ -145,7 +145,7 @@ In other `ENV` settings, things may not work as expected. Simply run the following: - brew install --build-from-source --with-python boost + brew install --build-from-source boost boost-python brew install --with-python protobuf for x in snappy leveldb gflags glog szip lmdb homebrew/science/opencv; do brew install $x; done @@ -186,16 +186,16 @@ After this, run for x in snappy leveldb gflags glog szip lmdb homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; done brew uninstall protobuf; brew install --build-from-source --with-python --fresh -vd protobuf - brew install --build-from-source --with-python --fresh -vd boost + brew install --build-from-source --fresh -vd boost boost-python **Note** that `brew install --build-from-source --fresh -vd boost` is fine if you do not need the Caffe Python wrapper. **Note** that the HDF5 dependency is provided by Anaconda Python in this case. If you're not using Anaconda, include `hdf5` in the list above. -**Note** that in order to build the caffe python wrappers you must install boost using the --with-python option: +**Note** that in order to build the Caffe Python wrappers you must install `boost` and `boost-python`: - brew install --build-from-source --with-python --fresh -vd boost + brew install --build-from-source --fresh -vd boost boost-python **Note** that Homebrew maintains itself as a separate git repository and making the above `brew edit FORMULA` changes will change files in your local copy of homebrew's master branch. By default, this will prevent you from updating Homebrew using `brew update`, as you will get an error message like the following: From e6deb5dfaccec378dd3e1481dadc69b7ddd08502 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 9 Oct 2014 23:59:10 -0700 Subject: [PATCH 0900/2053] [docs] note boost 1.56 an CUDA conflict on OS X --- docs/installation.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/installation.md b/docs/installation.md index 7cfa04eca1f..7eaf31c6d45 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -141,6 +141,8 @@ Do `brew edit opencv` and change the lines that look like the two lines below to **NOTE**: We find that everything compiles successfully if `$LD_LIBRARY_PATH` is not set at all, and `$DYLD_FALLBACK_LIBRARY_PATH` is set to to provide CUDA, Python, and other relevant libraries (e.g. `/usr/local/cuda/lib:$HOME/anaconda/lib:/usr/local/lib:/usr/lib`). In other `ENV` settings, things may not work as expected. +**NOTE**: There is currently a conflict between boost 1.56 and CUDA in some configurations. Check the [conflict description](https://github.com/BVLC/caffe/issues/1193#issuecomment-57491906) and try downgrading to 1.55. + #### 10.8-specific Instructions Simply run the following: From 44bc1552781eea958c228981a8638ddfcf80e3d9 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq@google.com> Date: Thu, 9 Oct 2014 21:41:11 -0700 Subject: [PATCH 0901/2053] fix instantiation --- include/caffe/common.hpp | 23 +++++++++++++++++++ src/caffe/layers/absval_layer.cu | 2 +- src/caffe/layers/base_data_layer.cu | 2 +- src/caffe/layers/bnll_layer.cu | 2 +- src/caffe/layers/concat_layer.cu | 2 +- src/caffe/layers/contrastive_loss_layer.cu | 2 +- src/caffe/layers/conv_layer.cu | 2 +- src/caffe/layers/cudnn_conv_layer.cu | 2 +- src/caffe/layers/cudnn_pooling_layer.cu | 2 +- src/caffe/layers/cudnn_relu_layer.cu | 2 +- src/caffe/layers/cudnn_sigmoid_layer.cu | 2 +- src/caffe/layers/cudnn_softmax_layer.cu | 2 +- src/caffe/layers/cudnn_tanh_layer.cu | 2 +- src/caffe/layers/dropout_layer.cu | 2 +- src/caffe/layers/eltwise_layer.cu | 2 +- src/caffe/layers/euclidean_loss_layer.cu | 2 +- src/caffe/layers/exp_layer.cu | 2 +- src/caffe/layers/flatten_layer.cu | 2 +- src/caffe/layers/hdf5_data_layer.cu | 2 +- src/caffe/layers/hdf5_output_layer.cu | 2 +- src/caffe/layers/im2col_layer.cu | 2 +- src/caffe/layers/inner_product_layer.cu | 2 +- src/caffe/layers/lrn_layer.cu | 13 ++++++++++- src/caffe/layers/mvn_layer.cu | 2 +- src/caffe/layers/pooling_layer.cu | 2 +- src/caffe/layers/power_layer.cu | 2 +- src/caffe/layers/relu_layer.cu | 2 +- .../sigmoid_cross_entropy_loss_layer.cu | 2 +- src/caffe/layers/sigmoid_layer.cu | 2 +- src/caffe/layers/silence_layer.cu | 2 +- src/caffe/layers/slice_layer.cu | 2 +- src/caffe/layers/softmax_layer.cu | 2 +- src/caffe/layers/softmax_loss_layer.cu | 2 +- src/caffe/layers/split_layer.cu | 2 +- src/caffe/layers/tanh_layer.cu | 2 +- src/caffe/layers/threshold_layer.cu | 2 +- 36 files changed, 69 insertions(+), 35 deletions(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 811b45e2c15..e7776ba5d7b 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -34,9 +34,32 @@ private:\ // Instantiate a class with float and double specifications. #define INSTANTIATE_CLASS(classname) \ + char gInstantiationGuard##classname; \ template class classname<float>; \ template class classname<double> +#define INSTANTIATE_LAYER_GPU_FORWARD(classname) \ + template void classname<float>::Forward_gpu( \ + const std::vector<Blob<float>*>& bottom, \ + const std::vector<Blob<float>*>& top); \ + template void classname<double>::Forward_gpu( \ + const std::vector<Blob<double>*>& bottom, \ + const std::vector<Blob<double>*>& top); + +#define INSTANTIATE_LAYER_GPU_BACKWARD(classname) \ + template void classname<float>::Backward_gpu( \ + const std::vector<Blob<float>*>& top, \ + const std::vector<bool>& propagate_down, \ + const std::vector<Blob<float>*>& bottom); \ + template void classname<double>::Backward_gpu( \ + const std::vector<Blob<double>*>& top, \ + const std::vector<bool>& propagate_down, \ + const std::vector<Blob<double>*>& bottom) + +#define INSTANTIATE_LAYER_GPU_FUNCS(classname) \ + INSTANTIATE_LAYER_GPU_FORWARD(classname); \ + INSTANTIATE_LAYER_GPU_BACKWARD(classname) + // A simple macro to mark codes that are not implemented, so that when the code // is executed we will see a fatal log. #define NOT_IMPLEMENTED LOG(FATAL) << "Not Implemented Yet" diff --git a/src/caffe/layers/absval_layer.cu b/src/caffe/layers/absval_layer.cu index 48c766465fa..732d4c6252b 100644 --- a/src/caffe/layers/absval_layer.cu +++ b/src/caffe/layers/absval_layer.cu @@ -28,7 +28,7 @@ void AbsValLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(AbsValLayer); +INSTANTIATE_LAYER_GPU_FUNCS(AbsValLayer); } // namespace caffe diff --git a/src/caffe/layers/base_data_layer.cu b/src/caffe/layers/base_data_layer.cu index ff1510361b6..204a16d260a 100644 --- a/src/caffe/layers/base_data_layer.cu +++ b/src/caffe/layers/base_data_layer.cu @@ -20,6 +20,6 @@ void BasePrefetchingDataLayer<Dtype>::Forward_gpu( CreatePrefetchThread(); } -INSTANTIATE_CLASS(BasePrefetchingDataLayer); +INSTANTIATE_LAYER_GPU_FORWARD(BasePrefetchingDataLayer); } // namespace caffe diff --git a/src/caffe/layers/bnll_layer.cu b/src/caffe/layers/bnll_layer.cu index 3993bccd9b5..d963d0687d2 100644 --- a/src/caffe/layers/bnll_layer.cu +++ b/src/caffe/layers/bnll_layer.cu @@ -54,7 +54,7 @@ void BNLLLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(BNLLLayer); +INSTANTIATE_LAYER_GPU_FUNCS(BNLLLayer); } // namespace caffe diff --git a/src/caffe/layers/concat_layer.cu b/src/caffe/layers/concat_layer.cu index 1b4e40aa415..88fc090025f 100644 --- a/src/caffe/layers/concat_layer.cu +++ b/src/caffe/layers/concat_layer.cu @@ -71,6 +71,6 @@ void ConcatLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(ConcatLayer); +INSTANTIATE_LAYER_GPU_FUNCS(ConcatLayer); } // namespace caffe diff --git a/src/caffe/layers/contrastive_loss_layer.cu b/src/caffe/layers/contrastive_loss_layer.cu index 14b55b37173..78a55995a0a 100644 --- a/src/caffe/layers/contrastive_loss_layer.cu +++ b/src/caffe/layers/contrastive_loss_layer.cu @@ -86,6 +86,6 @@ void ContrastiveLossLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(ContrastiveLossLayer); +INSTANTIATE_LAYER_GPU_FUNCS(ContrastiveLossLayer); } // namespace caffe diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index 27d6500d6ef..af14facb523 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -137,6 +137,6 @@ void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } -INSTANTIATE_CLASS(ConvolutionLayer); +INSTANTIATE_LAYER_GPU_FUNCS(ConvolutionLayer); } // namespace caffe diff --git a/src/caffe/layers/cudnn_conv_layer.cu b/src/caffe/layers/cudnn_conv_layer.cu index cf8607e1b78..071014e1b48 100644 --- a/src/caffe/layers/cudnn_conv_layer.cu +++ b/src/caffe/layers/cudnn_conv_layer.cu @@ -106,7 +106,7 @@ void CuDNNConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(CuDNNConvolutionLayer); +INSTANTIATE_LAYER_GPU_FUNCS(CuDNNConvolutionLayer); } // namespace caffe #endif diff --git a/src/caffe/layers/cudnn_pooling_layer.cu b/src/caffe/layers/cudnn_pooling_layer.cu index 8b9e7f1bf10..1c113aad75f 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cu +++ b/src/caffe/layers/cudnn_pooling_layer.cu @@ -33,7 +33,7 @@ void CuDNNPoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, bottom_desc_, bottom_data, bottom_desc_, bottom_diff)); } -INSTANTIATE_CLASS(CuDNNPoolingLayer); +INSTANTIATE_LAYER_GPU_FUNCS(CuDNNPoolingLayer); } // namespace caffe #endif diff --git a/src/caffe/layers/cudnn_relu_layer.cu b/src/caffe/layers/cudnn_relu_layer.cu index e3900f37ab9..862508707a0 100644 --- a/src/caffe/layers/cudnn_relu_layer.cu +++ b/src/caffe/layers/cudnn_relu_layer.cu @@ -45,7 +45,7 @@ void CuDNNReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff)); } -INSTANTIATE_CLASS(CuDNNReLULayer); +INSTANTIATE_LAYER_GPU_FUNCS(CuDNNReLULayer); } // namespace caffe #endif diff --git a/src/caffe/layers/cudnn_sigmoid_layer.cu b/src/caffe/layers/cudnn_sigmoid_layer.cu index 50bf5fcb9e0..31b094e25d4 100644 --- a/src/caffe/layers/cudnn_sigmoid_layer.cu +++ b/src/caffe/layers/cudnn_sigmoid_layer.cu @@ -35,7 +35,7 @@ void CuDNNSigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff)); } -INSTANTIATE_CLASS(CuDNNSigmoidLayer); +INSTANTIATE_LAYER_GPU_FUNCS(CuDNNSigmoidLayer); } // namespace caffe #endif diff --git a/src/caffe/layers/cudnn_softmax_layer.cu b/src/caffe/layers/cudnn_softmax_layer.cu index aef66730bff..f328afdd831 100644 --- a/src/caffe/layers/cudnn_softmax_layer.cu +++ b/src/caffe/layers/cudnn_softmax_layer.cu @@ -35,7 +35,7 @@ void CuDNNSoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(CuDNNSoftmaxLayer); +INSTANTIATE_LAYER_GPU_FUNCS(CuDNNSoftmaxLayer); } // namespace caffe #endif diff --git a/src/caffe/layers/cudnn_tanh_layer.cu b/src/caffe/layers/cudnn_tanh_layer.cu index 20f887de8d0..bf9ec7cfac4 100644 --- a/src/caffe/layers/cudnn_tanh_layer.cu +++ b/src/caffe/layers/cudnn_tanh_layer.cu @@ -35,7 +35,7 @@ void CuDNNTanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, this->bottom_desc_, bottom_data, this->bottom_desc_, bottom_diff)); } -INSTANTIATE_CLASS(CuDNNTanHLayer); +INSTANTIATE_LAYER_GPU_FUNCS(CuDNNTanHLayer); } // namespace caffe #endif diff --git a/src/caffe/layers/dropout_layer.cu b/src/caffe/layers/dropout_layer.cu index fa737b86a89..df13d8ecb23 100644 --- a/src/caffe/layers/dropout_layer.cu +++ b/src/caffe/layers/dropout_layer.cu @@ -71,7 +71,7 @@ void DropoutLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(DropoutLayer); +INSTANTIATE_LAYER_GPU_FUNCS(DropoutLayer); } // namespace caffe diff --git a/src/caffe/layers/eltwise_layer.cu b/src/caffe/layers/eltwise_layer.cu index 9295cc6ad11..2247870d97f 100644 --- a/src/caffe/layers/eltwise_layer.cu +++ b/src/caffe/layers/eltwise_layer.cu @@ -130,6 +130,6 @@ void EltwiseLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(EltwiseLayer); +INSTANTIATE_LAYER_GPU_FUNCS(EltwiseLayer); } // namespace caffe diff --git a/src/caffe/layers/euclidean_loss_layer.cu b/src/caffe/layers/euclidean_loss_layer.cu index 0f0c1a86f9d..5b1de3ad2d9 100644 --- a/src/caffe/layers/euclidean_loss_layer.cu +++ b/src/caffe/layers/euclidean_loss_layer.cu @@ -39,6 +39,6 @@ void EuclideanLossLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(EuclideanLossLayer); +INSTANTIATE_LAYER_GPU_FUNCS(EuclideanLossLayer); } // namespace caffe diff --git a/src/caffe/layers/exp_layer.cu b/src/caffe/layers/exp_layer.cu index a0fd672a25a..2d75d8dd6c7 100644 --- a/src/caffe/layers/exp_layer.cu +++ b/src/caffe/layers/exp_layer.cu @@ -38,7 +38,7 @@ void ExpLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(ExpLayer); +INSTANTIATE_LAYER_GPU_FUNCS(ExpLayer); } // namespace caffe diff --git a/src/caffe/layers/flatten_layer.cu b/src/caffe/layers/flatten_layer.cu index ef89bab6ff4..42abdad4499 100644 --- a/src/caffe/layers/flatten_layer.cu +++ b/src/caffe/layers/flatten_layer.cu @@ -18,6 +18,6 @@ void FlattenLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, bottom[0]->ShareDiff(*top[0]); } -INSTANTIATE_CLASS(FlattenLayer); +INSTANTIATE_LAYER_GPU_FUNCS(FlattenLayer); } // namespace caffe diff --git a/src/caffe/layers/hdf5_data_layer.cu b/src/caffe/layers/hdf5_data_layer.cu index 9f5daf230e7..02e3821d104 100644 --- a/src/caffe/layers/hdf5_data_layer.cu +++ b/src/caffe/layers/hdf5_data_layer.cu @@ -41,6 +41,6 @@ void HDF5DataLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } } -INSTANTIATE_CLASS(HDF5DataLayer); +INSTANTIATE_LAYER_GPU_FUNCS(HDF5DataLayer); } // namespace caffe diff --git a/src/caffe/layers/hdf5_output_layer.cu b/src/caffe/layers/hdf5_output_layer.cu index 929c1ad8e22..ae497c34fc2 100644 --- a/src/caffe/layers/hdf5_output_layer.cu +++ b/src/caffe/layers/hdf5_output_layer.cu @@ -38,6 +38,6 @@ void HDF5OutputLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, return; } -INSTANTIATE_CLASS(HDF5OutputLayer); +INSTANTIATE_LAYER_GPU_FUNCS(HDF5OutputLayer); } // namespace caffe diff --git a/src/caffe/layers/im2col_layer.cu b/src/caffe/layers/im2col_layer.cu index bad789c17fe..9c338b14cb7 100644 --- a/src/caffe/layers/im2col_layer.cu +++ b/src/caffe/layers/im2col_layer.cu @@ -32,6 +32,6 @@ void Im2colLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } -INSTANTIATE_CLASS(Im2colLayer); +INSTANTIATE_LAYER_GPU_FUNCS(Im2colLayer); } // namespace caffe diff --git a/src/caffe/layers/inner_product_layer.cu b/src/caffe/layers/inner_product_layer.cu index 2164b4d4f16..a9e1784a205 100644 --- a/src/caffe/layers/inner_product_layer.cu +++ b/src/caffe/layers/inner_product_layer.cu @@ -51,6 +51,6 @@ void InnerProductLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(InnerProductLayer); +INSTANTIATE_LAYER_GPU_FUNCS(InnerProductLayer); } // namespace caffe diff --git a/src/caffe/layers/lrn_layer.cu b/src/caffe/layers/lrn_layer.cu index 47b003bc4aa..58c39926c72 100644 --- a/src/caffe/layers/lrn_layer.cu +++ b/src/caffe/layers/lrn_layer.cu @@ -98,6 +98,10 @@ void LRNLayer<Dtype>::CrossChannelForward_gpu( n_threads, bottom_data, scale_data, -beta_, top_data); CUDA_POST_KERNEL_CHECK; } +template void LRNLayer<float>::CrossChannelForward_gpu( + const vector<Blob<float>*>& bottom, const vector<Blob<float>*>& top); +template void LRNLayer<double>::CrossChannelForward_gpu( + const vector<Blob<double>*>& bottom, const vector<Blob<double>*>& top); template <typename Dtype> @@ -188,8 +192,15 @@ void LRNLayer<Dtype>::CrossChannelBackward_gpu( size_, -beta_, Dtype(2. * alpha_ * beta_ / size_), bottom[0]->mutable_gpu_diff()); } +template void LRNLayer<float>::CrossChannelBackward_gpu( + const vector<Blob<float>*>& top, const vector<bool>& propagate_down, + const vector<Blob<float>*>& bottom); +template void LRNLayer<double>::CrossChannelBackward_gpu( + const vector<Blob<double>*>& top, const vector<bool>& propagate_down, + const vector<Blob<double>*>& bottom); -INSTANTIATE_CLASS(LRNLayer); + +INSTANTIATE_LAYER_GPU_FUNCS(LRNLayer); } // namespace caffe diff --git a/src/caffe/layers/mvn_layer.cu b/src/caffe/layers/mvn_layer.cu index c2a241f093f..0667f50380f 100644 --- a/src/caffe/layers/mvn_layer.cu +++ b/src/caffe/layers/mvn_layer.cu @@ -139,7 +139,7 @@ void MVNLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } -INSTANTIATE_CLASS(MVNLayer); +INSTANTIATE_LAYER_GPU_FUNCS(MVNLayer); } // namespace caffe diff --git a/src/caffe/layers/pooling_layer.cu b/src/caffe/layers/pooling_layer.cu index aec985a7864..0d3f2183e71 100644 --- a/src/caffe/layers/pooling_layer.cu +++ b/src/caffe/layers/pooling_layer.cu @@ -373,7 +373,7 @@ void PoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } -INSTANTIATE_CLASS(PoolingLayer); +INSTANTIATE_LAYER_GPU_FUNCS(PoolingLayer); } // namespace caffe diff --git a/src/caffe/layers/power_layer.cu b/src/caffe/layers/power_layer.cu index 367320a9b1f..90d944059b6 100644 --- a/src/caffe/layers/power_layer.cu +++ b/src/caffe/layers/power_layer.cu @@ -81,7 +81,7 @@ void PowerLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(PowerLayer); +INSTANTIATE_LAYER_GPU_FUNCS(PowerLayer); } // namespace caffe diff --git a/src/caffe/layers/relu_layer.cu b/src/caffe/layers/relu_layer.cu index 22d5f4b5c5e..b8924c855e5 100644 --- a/src/caffe/layers/relu_layer.cu +++ b/src/caffe/layers/relu_layer.cu @@ -59,7 +59,7 @@ void ReLULayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } -INSTANTIATE_CLASS(ReLULayer); +INSTANTIATE_LAYER_GPU_FUNCS(ReLULayer); } // namespace caffe diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu index 175f6f86574..d9db4af64e6 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu @@ -51,7 +51,7 @@ void SigmoidCrossEntropyLossLayer<Dtype>::Backward_gpu( } } -INSTANTIATE_CLASS(SigmoidCrossEntropyLossLayer); +INSTANTIATE_LAYER_GPU_FUNCS(SigmoidCrossEntropyLossLayer); } // namespace caffe diff --git a/src/caffe/layers/sigmoid_layer.cu b/src/caffe/layers/sigmoid_layer.cu index 6879ff7f570..e1af0657ec1 100644 --- a/src/caffe/layers/sigmoid_layer.cu +++ b/src/caffe/layers/sigmoid_layer.cu @@ -56,7 +56,7 @@ void SigmoidLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(SigmoidLayer); +INSTANTIATE_LAYER_GPU_FUNCS(SigmoidLayer); } // namespace caffe diff --git a/src/caffe/layers/silence_layer.cu b/src/caffe/layers/silence_layer.cu index b350b1950bd..8d044ee7307 100644 --- a/src/caffe/layers/silence_layer.cu +++ b/src/caffe/layers/silence_layer.cu @@ -23,6 +23,6 @@ void SilenceLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(SilenceLayer); +INSTANTIATE_LAYER_GPU_FUNCS(SilenceLayer); } // namespace caffe diff --git a/src/caffe/layers/slice_layer.cu b/src/caffe/layers/slice_layer.cu index 657840809f6..b5c5e61533f 100644 --- a/src/caffe/layers/slice_layer.cu +++ b/src/caffe/layers/slice_layer.cu @@ -63,6 +63,6 @@ void SliceLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } // slice_dim_ is guaranteed to be 0 or 1 by SetUp. } -INSTANTIATE_CLASS(SliceLayer); +INSTANTIATE_LAYER_GPU_FUNCS(SliceLayer); } // namespace caffe diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index 8ba31d75951..292ad2b396a 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -148,7 +148,7 @@ void SoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, caffe_gpu_mul<Dtype>(top[0]->count(), bottom_diff, top_data, bottom_diff); } -INSTANTIATE_CLASS(SoftmaxLayer); +INSTANTIATE_LAYER_GPU_FUNCS(SoftmaxLayer); } // namespace caffe diff --git a/src/caffe/layers/softmax_loss_layer.cu b/src/caffe/layers/softmax_loss_layer.cu index 060dc24d06e..4cdaf51b165 100644 --- a/src/caffe/layers/softmax_loss_layer.cu +++ b/src/caffe/layers/softmax_loss_layer.cu @@ -21,7 +21,7 @@ void SoftmaxWithLossLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, Backward_cpu(top, propagate_down, bottom); } -INSTANTIATE_CLASS(SoftmaxWithLossLayer); +INSTANTIATE_LAYER_GPU_FUNCS(SoftmaxWithLossLayer); } // namespace caffe diff --git a/src/caffe/layers/split_layer.cu b/src/caffe/layers/split_layer.cu index 0513b204d91..a4f5df26452 100644 --- a/src/caffe/layers/split_layer.cu +++ b/src/caffe/layers/split_layer.cu @@ -33,6 +33,6 @@ void SplitLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } -INSTANTIATE_CLASS(SplitLayer); +INSTANTIATE_LAYER_GPU_FUNCS(SplitLayer); } // namespace caffe diff --git a/src/caffe/layers/tanh_layer.cu b/src/caffe/layers/tanh_layer.cu index a141f8e872e..f1a0fc88bfd 100644 --- a/src/caffe/layers/tanh_layer.cu +++ b/src/caffe/layers/tanh_layer.cu @@ -54,7 +54,7 @@ void TanHLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, } } -INSTANTIATE_CLASS(TanHLayer); +INSTANTIATE_LAYER_GPU_FUNCS(TanHLayer); } // namespace caffe diff --git a/src/caffe/layers/threshold_layer.cu b/src/caffe/layers/threshold_layer.cu index 7e651290897..bfa7f159460 100644 --- a/src/caffe/layers/threshold_layer.cu +++ b/src/caffe/layers/threshold_layer.cu @@ -27,7 +27,7 @@ void ThresholdLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, } -INSTANTIATE_CLASS(ThresholdLayer); +INSTANTIATE_LAYER_GPU_FORWARD(ThresholdLayer); } // namespace caffe From b025da73e397b50e7f4136ad7546961d60ea934b Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Fri, 3 Oct 2014 17:14:20 -0700 Subject: [PATCH 0902/2053] Added Multistep, Poly and Sigmoid learning rate decay policies Conflicts: include/caffe/solver.hpp src/caffe/proto/caffe.proto src/caffe/solver.cpp --- .../lenet/lenet_multistep_solver.prototxt | 33 +++++++++++++++++ .../lenet/lenet_stepearly_solver.prototxt | 28 ++++++++++++++ include/caffe/solver.hpp | 1 + src/caffe/proto/caffe.proto | 8 +++- src/caffe/solver.cpp | 37 ++++++++++++++++--- 5 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 examples/lenet/lenet_multistep_solver.prototxt create mode 100644 examples/lenet/lenet_stepearly_solver.prototxt diff --git a/examples/lenet/lenet_multistep_solver.prototxt b/examples/lenet/lenet_multistep_solver.prototxt new file mode 100644 index 00000000000..fadd7c904d7 --- /dev/null +++ b/examples/lenet/lenet_multistep_solver.prototxt @@ -0,0 +1,33 @@ +# The training protocol buffer definition +train_net: "lenet_train.prototxt" +# The testing protocol buffer definition +test_net: "lenet_test.prototxt" +# test_iter specifies how many forward passes the test should carry out. +# In the case of MNIST, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 500 training iterations. +test_interval: 500 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.01 +momentum: 0.9 +weight_decay: 0.0005 +# The learning rate policy +lr_policy: "multistep" +gamma: 0.9 +stepvalue: 1000 +stepvalue: 2000 +stepvalue: 2500 +stepvalue: 3000 +stepvalue: 3500 +stepvalue: 4000 +# Display every 100 iterations +display: 100 +# The maximum number of iterations +max_iter: 10000 +# snapshot intermediate results +snapshot: 5000 +snapshot_prefix: "lenet" +# solver mode: 0 for CPU and 1 for GPU +solver_mode: 1 +device_id: 1 diff --git a/examples/lenet/lenet_stepearly_solver.prototxt b/examples/lenet/lenet_stepearly_solver.prototxt new file mode 100644 index 00000000000..efc6a335d8f --- /dev/null +++ b/examples/lenet/lenet_stepearly_solver.prototxt @@ -0,0 +1,28 @@ +# The training protocol buffer definition +train_net: "lenet_train.prototxt" +# The testing protocol buffer definition +test_net: "lenet_test.prototxt" +# test_iter specifies how many forward passes the test should carry out. +# In the case of MNIST, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 500 training iterations. +test_interval: 500 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.01 +momentum: 0.9 +weight_decay: 0.0005 +# The learning rate policy +lr_policy: "stepearly" +gamma: 0.9 +stepearly: 1 +# Display every 100 iterations +display: 100 +# The maximum number of iterations +max_iter: 10000 +# snapshot intermediate results +snapshot: 5000 +snapshot_prefix: "lenet" +# solver mode: 0 for CPU and 1 for GPU +solver_mode: 1 +device_id: 1 diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 2bad0e2fe1e..b20912606f8 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -57,6 +57,7 @@ class Solver { SolverParameter param_; int iter_; + int current_step_; shared_ptr<Net<Dtype> > net_; vector<shared_ptr<Net<Dtype> > > test_nets_; diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index f0404a09b90..949bafecdb2 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -63,7 +63,7 @@ message NetParameter { // NOTE // Update the next available ID when you add a new SolverParameter field. // -// SolverParameter next available ID: 34 (last added: average_loss) +// SolverParameter next available ID: 35 (last added: stepvalue) message SolverParameter { ////////////////////////////////////////////////////////////////////////////// // Specifying the train and test networks @@ -124,7 +124,10 @@ message SolverParameter { // regularization types supported: L1 and L2 // controlled by weight_decay optional string regularization_type = 29 [default = "L2"]; - optional int32 stepsize = 13; // the stepsize for learning rate policy "step" + // the stepsize for learning rate policy "step" + optional int32 stepsize = 13; + // the stepsize for learning rate policy "multistep" + repeated int32 stepvalue = 34; optional int32 snapshot = 14 [default = 0]; // The snapshot interval optional string snapshot_prefix = 15; // The prefix for the snapshot. // whether to snapshot diff in the results or not. Snapshotting diff will help @@ -166,6 +169,7 @@ message SolverState { optional int32 iter = 1; // The current iteration optional string learned_net = 2; // The file that stores the learned net. repeated BlobProto history = 3; // The history for sgd solvers + optional int32 current_step = 4 [default = 0]; // The current step for learning rate } enum Phase { diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 995df06ddc7..a13bca8b44a 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -158,6 +158,7 @@ template <typename Dtype> void Solver<Dtype>::Solve(const char* resume_file) { Caffe::set_phase(Caffe::TRAIN); LOG(INFO) << "Solving " << net_->name(); + LOG(INFO) << "Learning Rate Policy: " << param_.lr_policy(); PreSolve(); iter_ = 0; @@ -257,7 +258,6 @@ void Solver<Dtype>::TestAll() { } } - template <typename Dtype> void Solver<Dtype>::Test(const int test_net_id) { LOG(INFO) << "Iteration " << iter_ @@ -336,6 +336,7 @@ void Solver<Dtype>::Snapshot() { SnapshotSolverState(&state); state.set_iter(iter_); state.set_learned_net(model_filename); + state.set_current_step(current_step_); snapshot_filename = filename + ".solverstate"; LOG(INFO) << "Snapshotting solver state to " << snapshot_filename; WriteProtoToBinaryFile(state, snapshot_filename.c_str()); @@ -351,6 +352,7 @@ void Solver<Dtype>::Restore(const char* state_file) { net_->CopyTrainedLayersFrom(net_param); } iter_ = state.iter(); + current_step_ = state.current_step(); RestoreSolverState(state); } @@ -361,8 +363,15 @@ void Solver<Dtype>::Restore(const char* state_file) { // - step: return base_lr * gamma ^ (floor(iter / step)) // - exp: return base_lr * gamma ^ iter // - inv: return base_lr * (1 + gamma * iter) ^ (- power) -// where base_lr, gamma, step and power are defined in the solver parameter -// protocol buffer, and iter is the current iteration. +// - multistep: similar to step but it allows non uniform steps defined by +// stepvalue +// - poly: the effective learning rate follows a polynomial decay, to be +// zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power) +// - sigmoid: the effective learning rate follows a sigmod decay +// return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize)))) +// +// where base_lr, max_iter, gamma, step, stepvalue and power are defined +// in the solver parameter protocol buffer, and iter is the current iteration. template <typename Dtype> Dtype SGDSolver<Dtype>::GetLearningRate() { Dtype rate; @@ -370,22 +379,38 @@ Dtype SGDSolver<Dtype>::GetLearningRate() { if (lr_policy == "fixed") { rate = this->param_.base_lr(); } else if (lr_policy == "step") { - int current_step = this->iter_ / this->param_.stepsize(); + this->current_step_ = this->iter_ / this->param_.stepsize(); rate = this->param_.base_lr() * - pow(this->param_.gamma(), current_step); + pow(this->param_.gamma(), this->current_step_); } else if (lr_policy == "exp") { rate = this->param_.base_lr() * pow(this->param_.gamma(), this->iter_); } else if (lr_policy == "inv") { rate = this->param_.base_lr() * pow(Dtype(1) + this->param_.gamma() * this->iter_, - this->param_.power()); + } else if (lr_policy == "multistep") { + if (this->current_step_ < this->param_.stepvalue_size() && + this->iter_ >= this->param_.stepvalue(this->current_step_)) { + this->current_step_++; + LOG(INFO) << "MultiStep Status: Iteration " << + this->iter_ << ", step = " << this->current_step_; + } + rate = this->param_.base_lr() * + pow(this->param_.gamma(), this->current_step_); + } else if (lr_policy == "poly") { + rate = this->param_.base_lr() * pow(Dtype(1.) - + (Dtype(this->iter_) / Dtype(this->param_.max_iter())), + this->param_.power()); + } else if (lr_policy == "sigmoid") { + rate = this->param_.base_lr() * (Dtype(1.) / + (Dtype(1.) + exp(-this->param_.gamma() * (Dtype(this->iter_) - + Dtype(this->param_.stepsize()))))); } else { LOG(FATAL) << "Unknown learning rate policy: " << lr_policy; } return rate; } - template <typename Dtype> void SGDSolver<Dtype>::PreSolve() { // Initialize the history From 0598fe93ac7bdc3f51c413c081283fdbc918c056 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sat, 11 Oct 2014 05:01:28 +0000 Subject: [PATCH 0903/2053] adding missing libraries - lm and lstdc++ --- Makefile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 5fb597c0d60..35c37af50fb 100644 --- a/Makefile +++ b/Makefile @@ -168,9 +168,7 @@ ifneq ($(CPU_ONLY), 1) LIBRARIES := cudart cublas curand endif LIBRARIES += glog gflags protobuf leveldb snappy \ - lmdb \ - boost_system \ - hdf5_hl hdf5 \ + lmdb boost_system hdf5_hl hdf5 m \ opencv_core opencv_highgui opencv_imgproc PYTHON_LIBRARIES := boost_python python2.7 WARNINGS := -Wall -Wno-sign-compare @@ -235,7 +233,8 @@ ifeq ($(LINUX), 1) WARNINGS += -Wno-uninitialized endif # boost::thread is reasonably called boost_thread (compare OS X) - LIBRARIES += boost_thread + # We will also explicitly add stdc++ to the link target. + LIBRARIES += boost_thread stdc++ endif # OS X: From b992de2afefe2324dc9f0804b031d3dddfb24299 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sat, 11 Oct 2014 00:05:57 -0700 Subject: [PATCH 0904/2053] [docs] pip install packages in order for dependencies --- docs/installation.md | 2 +- python/requirements.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index 7eaf31c6d45..6d80aaef635 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -59,7 +59,7 @@ The main requirements are `numpy` and `boost.python` (provided by boost). `panda You can install the dependencies with - pip install -r /path/to/caffe/python/requirements.txt + cat caffe/python/requirements.txt | xargs pip install but we highly recommend first installing the [Anaconda](https://store.continuum.io/cshop/anaconda/) Python distribution, which provides most of the necessary packages, as well as the `hdf5` library dependency. diff --git a/python/requirements.txt b/python/requirements.txt index 5c076b668df..6d42c0ed3fb 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -8,6 +8,7 @@ nose>=1.3.0 numpy>=1.7.1 pandas>=0.12.0 protobuf>=2.5.0 +python-dateutil>=1.4,<2 python-gflags>=2.0 scikit-image>=0.9.3 scikit-learn>=0.14.1 From 5fb32067e059ee1a2c631b2283e17458cee64331 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sat, 11 Oct 2014 00:25:27 -0700 Subject: [PATCH 0905/2053] [docs] pip install harder --- docs/installation.md | 2 +- python/requirements.txt | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 6d80aaef635..d8fb1c019e2 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -59,7 +59,7 @@ The main requirements are `numpy` and `boost.python` (provided by boost). `panda You can install the dependencies with - cat caffe/python/requirements.txt | xargs pip install + for req in $(cat requirements.txt); do sudo pip install $req; done but we highly recommend first installing the [Anaconda](https://store.continuum.io/cshop/anaconda/) Python distribution, which provides most of the necessary packages, as well as the `hdf5` library dependency. diff --git a/python/requirements.txt b/python/requirements.txt index 6d42c0ed3fb..4c35dcb0b6f 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,15 +1,15 @@ Cython>=0.19.2 -h5py>=2.2.0 +numpy>=1.7.1 +scipy>=0.13.2 +scikit-image>=0.9.3 +scikit-learn>=0.14.1 +matplotlib>=1.3.1 ipython>=1.1.0 +h5py>=2.2.0 leveldb>=0.191 -matplotlib>=1.3.1 networkx>=1.8.1 nose>=1.3.0 -numpy>=1.7.1 pandas>=0.12.0 -protobuf>=2.5.0 python-dateutil>=1.4,<2 +protobuf>=2.5.0 python-gflags>=2.0 -scikit-image>=0.9.3 -scikit-learn>=0.14.1 -scipy>=0.13.2 From 802ee6cbd2925a6db55f9c56d939a233403bd556 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Tue, 23 Sep 2014 10:47:40 -0400 Subject: [PATCH 0906/2053] Minor fixes. (1) cudnn.hpp uses CHECK_EQ internally, so it needs to include glog at some point. Including caffe/common.hpp. (2) I often misconfigure some layer and softmax breaks when the dimensionality is too small for the input layers. Check and fail fast. (3) CV_LOAD_IMAGE_COLOR is deprecated and has been removed in OpenCV 3.0. Replaced with cv::IMREAD_COLOR. --- include/caffe/util/cudnn.hpp | 1 + src/caffe/layers/softmax_loss_layer.cpp | 4 +++- src/caffe/layers/window_data_layer.cpp | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/include/caffe/util/cudnn.hpp b/include/caffe/util/cudnn.hpp index aca5bd713fc..eaed7333df8 100644 --- a/include/caffe/util/cudnn.hpp +++ b/include/caffe/util/cudnn.hpp @@ -4,6 +4,7 @@ #include <cudnn.h> +#include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" #define CUDNN_CHECK(condition) \ diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 651320c77f8..d39429cee5d 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -43,8 +43,10 @@ void SoftmaxWithLossLayer<Dtype>::Forward_cpu( Dtype loss = 0; for (int i = 0; i < num; ++i) { for (int j = 0; j < spatial_dim; j++) { + const int label_value = static_cast<int>(label[i * spatial_dim + j]); + CHECK_GT(dim, label_value * spatial_dim); loss -= log(std::max(prob_data[i * dim + - static_cast<int>(label[i * spatial_dim + j]) * spatial_dim + j], + label_value * spatial_dim + j], Dtype(FLT_MIN))); } } diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 009bf97c612..c6d0be0f509 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -233,7 +233,7 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { pair<std::string, vector<int> > image = image_database_[window[WindowDataLayer<Dtype>::IMAGE_INDEX]]; - cv::Mat cv_img = cv::imread(image.first, CV_LOAD_IMAGE_COLOR); + cv::Mat cv_img = cv::imread(image.first, cv::IMREAD_COLOR); if (!cv_img.data) { LOG(ERROR) << "Could not open or find file " << image.first; return; From 4587b2f9043996fed36fc989c00329ec829ecae9 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Tue, 23 Sep 2014 11:29:31 -0400 Subject: [PATCH 0907/2053] OpenCV should be compiled using pkg-config options. --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 35c37af50fb..c8226cb6872 100644 --- a/Makefile +++ b/Makefile @@ -168,8 +168,7 @@ ifneq ($(CPU_ONLY), 1) LIBRARIES := cudart cublas curand endif LIBRARIES += glog gflags protobuf leveldb snappy \ - lmdb boost_system hdf5_hl hdf5 m \ - opencv_core opencv_highgui opencv_imgproc + lmdb boost_system hdf5_hl hdf5 m PYTHON_LIBRARIES := boost_python python2.7 WARNINGS := -Wall -Wno-sign-compare @@ -330,6 +329,7 @@ NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) MATLAB_CXXFLAGS := $(CXXFLAGS) -Wno-uninitialized LINKFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) \ + `pkg-config opencv --libs` \ $(foreach library,$(LIBRARIES),-l$(library)) PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) From 82b614b29ba48cc4be81aa41dd688dfba82a08e1 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Mon, 29 Sep 2014 12:45:25 -0400 Subject: [PATCH 0908/2053] Added version dependent test for IMREAD_COLOR. --- src/caffe/layers/window_data_layer.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index c6d0be0f509..62ca872a32b 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -21,6 +21,10 @@ // 'source' field specifies the window_file // 'crop_size' indicates the desired warped size +#if CV_VERSION_MAJOR == 3 +const int CV_LOAD_IMAGE_COLOR = cv::IMREAD_COLOR; +#endif + namespace caffe { template <typename Dtype> @@ -233,7 +237,7 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { pair<std::string, vector<int> > image = image_database_[window[WindowDataLayer<Dtype>::IMAGE_INDEX]]; - cv::Mat cv_img = cv::imread(image.first, cv::IMREAD_COLOR); + cv::Mat cv_img = cv::imread(image.first, CV_LOAD_IMAGE_COLOR); if (!cv_img.data) { LOG(ERROR) << "Could not open or find file " << image.first; return; From 94394a059c5b0440590f561a594b84c271bc3154 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Fri, 10 Oct 2014 18:42:27 -0400 Subject: [PATCH 0909/2053] Fixed CMakeList to work with OpenCV 3. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b97eb565f45..d6b08470a7f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -135,7 +135,7 @@ find_package(LMDB REQUIRED) include_directories(${LMDB_INCLUDE_DIR}) # OpenCV -find_package(OpenCV REQUIRED core highgui imgproc) +find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) ### Subdirectories ########################################################################## From 0160a0bc16055948e79dd214a61c33041994d163 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sat, 11 Oct 2014 19:35:06 +0000 Subject: [PATCH 0910/2053] fix flaky test EXPECT_EQ code, using EXPECT_FLOAT_NEAR per Jeff --- src/caffe/test/test_net.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 930486dd6c5..611d11bd832 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -1155,7 +1155,7 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { for (int i = 0; i < num_params; ++i) { const Dtype param_asum = caffe_cpu_asum(params2[i]->count(), params2[i]->cpu_diff()); - EXPECT_EQ(param_asum, param_asums[i]); + EXPECT_FLOAT_EQ(param_asum, param_asums[i]); } // Change a subset of the learning rates to zero; check that we see zero @@ -1172,9 +1172,9 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { const Dtype param_asum = caffe_cpu_asum(params3[i]->count(), params3[i]->cpu_diff()); if (i == 1 || i == 2) { - EXPECT_EQ(0, param_asum); + EXPECT_FLOAT_EQ(0, param_asum); } else { - EXPECT_EQ(param_asum, param_asums[i]); + EXPECT_FLOAT_EQ(param_asum, param_asums[i]); } } @@ -1191,9 +1191,9 @@ TYPED_TEST(NetTest, TestParamPropagateDown) { const Dtype param_asum = caffe_cpu_asum(params4[i]->count(), params4[i]->cpu_diff()); if (i == 0 || i == 3) { - EXPECT_EQ(0, param_asum); + EXPECT_FLOAT_EQ(0, param_asum); } else { - EXPECT_EQ(param_asum, param_asums[i]); + EXPECT_FLOAT_EQ(param_asum, param_asums[i]); } } } From fc5ba940744b7294846a63ee5f427b934af9cc6d Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Sat, 11 Oct 2014 19:35:40 +0000 Subject: [PATCH 0911/2053] fix flaky math functions, remove unnecessary instantiations. --- include/caffe/util/math_functions.hpp | 11 +++-------- src/caffe/util/math_functions.cpp | 3 --- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index a78eb5bc978..12823f8da0c 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -108,7 +108,7 @@ Dtype caffe_cpu_asum(const int n, const Dtype* x); // the branchless, type-safe version from // http://stackoverflow.com/questions/1903954/is-there-a-standard-sign-function-signum-sgn-in-c-c template<typename Dtype> -inline char caffe_sign(Dtype val) { +inline int8_t caffe_sign(Dtype val) { return (Dtype(0) < val) - (val < Dtype(0)); } @@ -127,12 +127,6 @@ inline char caffe_sign(Dtype val) { } \ } -#define INSTANTIATE_CAFFE_CPU_UNARY_FUNC(name) \ - template <> \ - void caffe_cpu_##name<float>(const int n, const float* x, float* y); \ - template <> \ - void caffe_cpu_##name<double>(const int n, const double* x, double* y) - // output is 1 for the positives, 0 for zero, and -1 for the negatives DEFINE_CAFFE_CPU_UNARY_FUNC(sign, y[i] = caffe_sign<Dtype>(x[i])); @@ -140,7 +134,8 @@ DEFINE_CAFFE_CPU_UNARY_FUNC(sign, y[i] = caffe_sign<Dtype>(x[i])); // The name sngbit is meant to avoid conflicts with std::signbit in the macro. // The extra parens are needed because CUDA < 6.5 defines signbit as a macro, // and we don't want that to expand here when CUDA headers are also included. -DEFINE_CAFFE_CPU_UNARY_FUNC(sgnbit, y[i] = (std::signbit)(x[i])); +DEFINE_CAFFE_CPU_UNARY_FUNC(sgnbit, \ + y[i] = static_cast<bool>((std::signbit)(x[i]))); DEFINE_CAFFE_CPU_UNARY_FUNC(fabs, y[i] = std::fabs(x[i])); diff --git a/src/caffe/util/math_functions.cpp b/src/caffe/util/math_functions.cpp index c3afd2ffbc5..13e17be582b 100644 --- a/src/caffe/util/math_functions.cpp +++ b/src/caffe/util/math_functions.cpp @@ -370,9 +370,6 @@ double caffe_cpu_asum<double>(const int n, const double* x) { return cblas_dasum(n, x, 1); } -INSTANTIATE_CAFFE_CPU_UNARY_FUNC(sign); -INSTANTIATE_CAFFE_CPU_UNARY_FUNC(sgnbit); - template <> void caffe_cpu_scale<float>(const int n, const float alpha, const float *x, float* y) { From 94f00c076f973627cd552b4b0fde6dd534039f3a Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq@google.com> Date: Mon, 13 Oct 2014 13:48:27 -0700 Subject: [PATCH 0912/2053] some namespace simplification --- include/caffe/common.hpp | 1 + src/caffe/layers/exp_layer.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index e7776ba5d7b..81b2e9ae101 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -74,6 +74,7 @@ using boost::shared_ptr; using std::fstream; using std::ios; using std::isnan; +using std::isinf; using std::iterator; using std::make_pair; using std::map; diff --git a/src/caffe/layers/exp_layer.cpp b/src/caffe/layers/exp_layer.cpp index 25da1201c10..2c99bfcff93 100644 --- a/src/caffe/layers/exp_layer.cpp +++ b/src/caffe/layers/exp_layer.cpp @@ -18,9 +18,9 @@ void ExpLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, // If base == -1, interpret the base as e and set log_base = 1 exactly. // Otherwise, calculate its log explicitly. const Dtype log_base = (base == Dtype(-1)) ? Dtype(1) : log(base); - CHECK(!std::isnan(log_base)) + CHECK(!isnan(log_base)) << "NaN result: log(base) = log(" << base << ") = " << log_base; - CHECK(!std::isinf(log_base)) + CHECK(!isinf(log_base)) << "Inf result: log(base) = log(" << base << ") = " << log_base; const Dtype input_scale = this->layer_param_.exp_param().scale(); const Dtype input_shift = this->layer_param_.exp_param().shift(); From 2f88daba0a1187ed2828ddc58349cd71c13f11a5 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq@google.com> Date: Mon, 13 Oct 2014 15:25:41 -0700 Subject: [PATCH 0913/2053] move registration code to corresponding cpp files. --- src/caffe/layer_factory.cpp | 93 +++++++------------ src/caffe/layers/absval_layer.cpp | 3 +- src/caffe/layers/accuracy_layer.cpp | 2 +- src/caffe/layers/argmax_layer.cpp | 1 + src/caffe/layers/bnll_layer.cpp | 3 +- src/caffe/layers/concat_layer.cpp | 2 +- src/caffe/layers/contrastive_loss_layer.cpp | 2 +- src/caffe/layers/conv_layer.cpp | 1 - src/caffe/layers/data_layer.cpp | 2 +- src/caffe/layers/dropout_layer.cpp | 3 +- src/caffe/layers/dummy_data_layer.cpp | 2 +- src/caffe/layers/eltwise_layer.cpp | 3 +- src/caffe/layers/euclidean_loss_layer.cpp | 2 +- src/caffe/layers/exp_layer.cpp | 3 +- src/caffe/layers/flatten_layer.cpp | 2 +- src/caffe/layers/hdf5_data_layer.cpp | 2 +- src/caffe/layers/hdf5_output_layer.cpp | 2 +- src/caffe/layers/hinge_loss_layer.cpp | 2 +- src/caffe/layers/im2col_layer.cpp | 2 +- src/caffe/layers/image_data_layer.cpp | 2 +- src/caffe/layers/infogain_loss_layer.cpp | 2 +- src/caffe/layers/inner_product_layer.cpp | 2 +- src/caffe/layers/lrn_layer.cpp | 3 +- src/caffe/layers/memory_data_layer.cpp | 2 +- .../multinomial_logistic_loss_layer.cpp | 2 +- src/caffe/layers/mvn_layer.cpp | 3 +- src/caffe/layers/power_layer.cpp | 3 +- .../sigmoid_cross_entropy_loss_layer.cpp | 3 +- src/caffe/layers/silence_layer.cpp | 2 +- src/caffe/layers/slice_layer.cpp | 2 +- src/caffe/layers/softmax_layer.cpp | 2 - src/caffe/layers/softmax_loss_layer.cpp | 3 +- src/caffe/layers/split_layer.cpp | 2 +- src/caffe/layers/threshold_layer.cpp | 2 +- src/caffe/layers/window_data_layer.cpp | 2 +- 35 files changed, 63 insertions(+), 106 deletions(-) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 69863543c30..5a286cd4691 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -7,9 +7,6 @@ namespace caffe { -// GetLayer() defines the overall layer factory. The Get*Layer() functions -// define factories for layers with multiple computational engines. - // Get convolution layer according to engine. template <typename Dtype> Layer<Dtype>* GetConvolutionLayer( @@ -32,6 +29,8 @@ Layer<Dtype>* GetConvolutionLayer( } } +REGISTER_LAYER_CREATOR(CONVOLUTION, GetConvolutionLayer); + // Get pooling layer according to engine. template <typename Dtype> Layer<Dtype>* GetPoolingLayer(const LayerParameter& param) { @@ -60,6 +59,8 @@ Layer<Dtype>* GetPoolingLayer(const LayerParameter& param) { } } +REGISTER_LAYER_CREATOR(POOLING, GetPoolingLayer); + // Get relu layer according to engine. template <typename Dtype> Layer<Dtype>* GetReLULayer(const LayerParameter& param) { @@ -81,6 +82,8 @@ Layer<Dtype>* GetReLULayer(const LayerParameter& param) { } } +REGISTER_LAYER_CREATOR(RELU, GetReLULayer); + // Get sigmoid layer according to engine. template <typename Dtype> Layer<Dtype>* GetSigmoidLayer(const LayerParameter& param) { @@ -102,26 +105,7 @@ Layer<Dtype>* GetSigmoidLayer(const LayerParameter& param) { } } -// Get tanh layer according to engine. -template <typename Dtype> -Layer<Dtype>* GetTanHLayer(const LayerParameter& param) { - TanHParameter_Engine engine = param.tanh_param().engine(); - if (engine == TanHParameter_Engine_DEFAULT) { - engine = TanHParameter_Engine_CAFFE; -#ifdef USE_CUDNN - engine = TanHParameter_Engine_CUDNN; -#endif - } - if (engine == TanHParameter_Engine_CAFFE) { - return new TanHLayer<Dtype>(param); -#ifdef USE_CUDNN - } else if (engine == TanHParameter_Engine_CUDNN) { - return new CuDNNTanHLayer<Dtype>(param); -#endif - } else { - LOG(FATAL) << "Layer " << param.name() << " has unknown engine."; - } -} +REGISTER_LAYER_CREATOR(SIGMOID, GetSigmoidLayer); // Get softmax layer according to engine. template <typename Dtype> @@ -144,46 +128,31 @@ Layer<Dtype>* GetSoftmaxLayer(const LayerParameter& param) { } } -// Layers that have a specific creator function. -REGISTER_LAYER_CREATOR(CONVOLUTION, GetConvolutionLayer); -REGISTER_LAYER_CREATOR(POOLING, GetPoolingLayer); -REGISTER_LAYER_CREATOR(RELU, GetReLULayer); -REGISTER_LAYER_CREATOR(SIGMOID, GetSigmoidLayer); REGISTER_LAYER_CREATOR(SOFTMAX, GetSoftmaxLayer); -REGISTER_LAYER_CREATOR(TANH, GetTanHLayer); -// Layers that use their constructor as their default creator. -REGISTER_LAYER_CLASS(ACCURACY, AccuracyLayer); -REGISTER_LAYER_CLASS(ABSVAL, AbsValLayer); -REGISTER_LAYER_CLASS(ARGMAX, ArgMaxLayer); -REGISTER_LAYER_CLASS(BNLL, BNLLLayer); -REGISTER_LAYER_CLASS(CONCAT, ConcatLayer); -REGISTER_LAYER_CLASS(CONTRASTIVE_LOSS, ContrastiveLossLayer); -REGISTER_LAYER_CLASS(DATA, DataLayer); -REGISTER_LAYER_CLASS(DROPOUT, DropoutLayer); -REGISTER_LAYER_CLASS(DUMMY_DATA, DummyDataLayer); -REGISTER_LAYER_CLASS(EUCLIDEAN_LOSS, EuclideanLossLayer); -REGISTER_LAYER_CLASS(ELTWISE, EltwiseLayer); -REGISTER_LAYER_CLASS(EXP, ExpLayer); -REGISTER_LAYER_CLASS(FLATTEN, FlattenLayer); -REGISTER_LAYER_CLASS(HDF5_DATA, HDF5DataLayer); -REGISTER_LAYER_CLASS(HDF5_OUTPUT, HDF5OutputLayer); -REGISTER_LAYER_CLASS(HINGE_LOSS, HingeLossLayer); -REGISTER_LAYER_CLASS(IMAGE_DATA, ImageDataLayer); -REGISTER_LAYER_CLASS(IM2COL, Im2colLayer); -REGISTER_LAYER_CLASS(INFOGAIN_LOSS, InfogainLossLayer); -REGISTER_LAYER_CLASS(INNER_PRODUCT, InnerProductLayer); -REGISTER_LAYER_CLASS(LRN, LRNLayer); -REGISTER_LAYER_CLASS(MEMORY_DATA, MemoryDataLayer); -REGISTER_LAYER_CLASS(MVN, MVNLayer); -REGISTER_LAYER_CLASS(MULTINOMIAL_LOGISTIC_LOSS, MultinomialLogisticLossLayer); -REGISTER_LAYER_CLASS(POWER, PowerLayer); -REGISTER_LAYER_CLASS(SILENCE, SilenceLayer); -REGISTER_LAYER_CLASS(SIGMOID_CROSS_ENTROPY_LOSS, SigmoidCrossEntropyLossLayer); -REGISTER_LAYER_CLASS(SLICE, SliceLayer); -REGISTER_LAYER_CLASS(SOFTMAX_LOSS, SoftmaxWithLossLayer); -REGISTER_LAYER_CLASS(SPLIT, SplitLayer); -REGISTER_LAYER_CLASS(THRESHOLD, ThresholdLayer); -REGISTER_LAYER_CLASS(WINDOW_DATA, WindowDataLayer); +// Get tanh layer according to engine. +template <typename Dtype> +Layer<Dtype>* GetTanHLayer(const LayerParameter& param) { + TanHParameter_Engine engine = param.tanh_param().engine(); + if (engine == TanHParameter_Engine_DEFAULT) { + engine = TanHParameter_Engine_CAFFE; +#ifdef USE_CUDNN + engine = TanHParameter_Engine_CUDNN; +#endif + } + if (engine == TanHParameter_Engine_CAFFE) { + return new TanHLayer<Dtype>(param); +#ifdef USE_CUDNN + } else if (engine == TanHParameter_Engine_CUDNN) { + return new CuDNNTanHLayer<Dtype>(param); +#endif + } else { + LOG(FATAL) << "Layer " << param.name() << " has unknown engine."; + } +} + +REGISTER_LAYER_CREATOR(TANH, GetTanHLayer); +// Layers that use their constructor as their default creator should be +// registered in their corresponding cpp files. Do not registere them here. } // namespace caffe diff --git a/src/caffe/layers/absval_layer.cpp b/src/caffe/layers/absval_layer.cpp index 54e484b115d..70e0b583e61 100644 --- a/src/caffe/layers/absval_layer.cpp +++ b/src/caffe/layers/absval_layer.cpp @@ -41,6 +41,5 @@ STUB_GPU(AbsValLayer); #endif INSTANTIATE_CLASS(AbsValLayer); - - +REGISTER_LAYER_CLASS(ABSVAL, AbsValLayer); } // namespace caffe diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 399cf2a3585..800b848f3bc 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -64,5 +64,5 @@ void AccuracyLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } INSTANTIATE_CLASS(AccuracyLayer); - +REGISTER_LAYER_CLASS(ACCURACY, AccuracyLayer); } // namespace caffe diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index dbe0a834aa5..15e199eb600 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -58,5 +58,6 @@ void ArgMaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } INSTANTIATE_CLASS(ArgMaxLayer); +REGISTER_LAYER_CLASS(ARGMAX, ArgMaxLayer); } // namespace caffe diff --git a/src/caffe/layers/bnll_layer.cpp b/src/caffe/layers/bnll_layer.cpp index bae692509e3..cb3583ae8be 100644 --- a/src/caffe/layers/bnll_layer.cpp +++ b/src/caffe/layers/bnll_layer.cpp @@ -43,6 +43,5 @@ STUB_GPU(BNLLLayer); #endif INSTANTIATE_CLASS(BNLLLayer); - - +REGISTER_LAYER_CLASS(BNLL, BNLLLayer); } // namespace caffe diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index f8f73564a6f..420821952b0 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -105,5 +105,5 @@ STUB_GPU(ConcatLayer); #endif INSTANTIATE_CLASS(ConcatLayer); - +REGISTER_LAYER_CLASS(CONCAT, ConcatLayer); } // namespace caffe diff --git a/src/caffe/layers/contrastive_loss_layer.cpp b/src/caffe/layers/contrastive_loss_layer.cpp index d716d140ea0..0d0b443b66b 100644 --- a/src/caffe/layers/contrastive_loss_layer.cpp +++ b/src/caffe/layers/contrastive_loss_layer.cpp @@ -97,5 +97,5 @@ STUB_GPU(ContrastiveLossLayer); #endif INSTANTIATE_CLASS(ContrastiveLossLayer); - +REGISTER_LAYER_CLASS(CONTRASTIVE_LOSS, ContrastiveLossLayer); } // namespace caffe diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index e6d6588096b..65ff9167128 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -267,5 +267,4 @@ STUB_GPU(ConvolutionLayer); #endif INSTANTIATE_CLASS(ConvolutionLayer); - } // namespace caffe diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 283a3a52f59..daa3289b9c2 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -204,5 +204,5 @@ void DataLayer<Dtype>::InternalThreadEntry() { } INSTANTIATE_CLASS(DataLayer); - +REGISTER_LAYER_CLASS(DATA, DataLayer); } // namespace caffe diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index f88027c7062..8c8936a711e 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -73,6 +73,5 @@ STUB_GPU(DropoutLayer); #endif INSTANTIATE_CLASS(DropoutLayer); - - +REGISTER_LAYER_CLASS(DROPOUT, DropoutLayer); } // namespace caffe diff --git a/src/caffe/layers/dummy_data_layer.cpp b/src/caffe/layers/dummy_data_layer.cpp index 6aeba5487b8..15cf5a58ac6 100644 --- a/src/caffe/layers/dummy_data_layer.cpp +++ b/src/caffe/layers/dummy_data_layer.cpp @@ -93,5 +93,5 @@ void DummyDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } INSTANTIATE_CLASS(DummyDataLayer); - +REGISTER_LAYER_CLASS(DUMMY_DATA, DummyDataLayer); } // namespace caffe diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 2830d6db195..0c239f4ac11 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -163,6 +163,5 @@ STUB_GPU(EltwiseLayer); #endif INSTANTIATE_CLASS(EltwiseLayer); - - +REGISTER_LAYER_CLASS(ELTWISE, EltwiseLayer); } // namespace caffe diff --git a/src/caffe/layers/euclidean_loss_layer.cpp b/src/caffe/layers/euclidean_loss_layer.cpp index abc8610eef6..d965027f712 100644 --- a/src/caffe/layers/euclidean_loss_layer.cpp +++ b/src/caffe/layers/euclidean_loss_layer.cpp @@ -54,5 +54,5 @@ STUB_GPU(EuclideanLossLayer); #endif INSTANTIATE_CLASS(EuclideanLossLayer); - +REGISTER_LAYER_CLASS(EUCLIDEAN_LOSS, EuclideanLossLayer); } // namespace caffe diff --git a/src/caffe/layers/exp_layer.cpp b/src/caffe/layers/exp_layer.cpp index 2c99bfcff93..92cb5deb1e6 100644 --- a/src/caffe/layers/exp_layer.cpp +++ b/src/caffe/layers/exp_layer.cpp @@ -64,6 +64,5 @@ STUB_GPU(ExpLayer); #endif INSTANTIATE_CLASS(ExpLayer); - - +REGISTER_LAYER_CLASS(EXP, ExpLayer); } // namespace caffe diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index 44df96d8436..ec43cababca 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -34,5 +34,5 @@ STUB_GPU(FlattenLayer); #endif INSTANTIATE_CLASS(FlattenLayer); - +REGISTER_LAYER_CLASS(FLATTEN, FlattenLayer); } // namespace caffe diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 61aa293d2ac..f6865efe78e 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -119,5 +119,5 @@ STUB_GPU_FORWARD(HDF5DataLayer, Forward); #endif INSTANTIATE_CLASS(HDF5DataLayer); - +REGISTER_LAYER_CLASS(HDF5_DATA, HDF5DataLayer); } // namespace caffe diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index b41d387a786..b8210e2ee2a 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -70,5 +70,5 @@ STUB_GPU(HDF5OutputLayer); #endif INSTANTIATE_CLASS(HDF5OutputLayer); - +REGISTER_LAYER_CLASS(HDF5_OUTPUT, HDF5OutputLayer); } // namespace caffe diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index f09916e2556..4dfafcc8648 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -77,5 +77,5 @@ void HingeLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } INSTANTIATE_CLASS(HingeLossLayer); - +REGISTER_LAYER_CLASS(HINGE_LOSS, HingeLossLayer); } // namespace caffe diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index 10588cebe7f..2c4bb9029e0 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -88,5 +88,5 @@ STUB_GPU(Im2colLayer); #endif INSTANTIATE_CLASS(Im2colLayer); - +REGISTER_LAYER_CLASS(IM2COL, Im2colLayer); } // namespace caffe diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 19ad2dc2126..2085df2760a 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -131,5 +131,5 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { } INSTANTIATE_CLASS(ImageDataLayer); - +REGISTER_LAYER_CLASS(IMAGE_DATA, ImageDataLayer); } // namespace caffe diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index c4dc1b4513a..8910431d42b 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -106,5 +106,5 @@ void InfogainLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } INSTANTIATE_CLASS(InfogainLossLayer); - +REGISTER_LAYER_CLASS(INFOGAIN_LOSS, InfogainLossLayer); } // namespace caffe diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index ffd872c5a70..ecb849ba4d8 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -104,5 +104,5 @@ STUB_GPU(InnerProductLayer); #endif INSTANTIATE_CLASS(InnerProductLayer); - +REGISTER_LAYER_CLASS(INNER_PRODUCT, InnerProductLayer); } // namespace caffe diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index a09a47940d2..a878cf847b3 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -252,6 +252,5 @@ STUB_GPU_BACKWARD(LRNLayer, CrossChannelBackward); #endif INSTANTIATE_CLASS(LRNLayer); - - +REGISTER_LAYER_CLASS(LRN, LRNLayer); } // namespace caffe diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 8f1c21f5424..613ca2d4c76 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -72,5 +72,5 @@ void MemoryDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } INSTANTIATE_CLASS(MemoryDataLayer); - +REGISTER_LAYER_CLASS(MEMORY_DATA, MemoryDataLayer); } // namespace caffe diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index 66f9ba813aa..78a1f60fca9 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -62,5 +62,5 @@ void MultinomialLogisticLossLayer<Dtype>::Backward_cpu( } INSTANTIATE_CLASS(MultinomialLogisticLossLayer); - +REGISTER_LAYER_CLASS(MULTINOMIAL_LOGISTIC_LOSS, MultinomialLogisticLossLayer); } // namespace caffe diff --git a/src/caffe/layers/mvn_layer.cpp b/src/caffe/layers/mvn_layer.cpp index 419f170ad7c..104ad95c7ed 100644 --- a/src/caffe/layers/mvn_layer.cpp +++ b/src/caffe/layers/mvn_layer.cpp @@ -159,6 +159,5 @@ STUB_GPU(MVNLayer); #endif INSTANTIATE_CLASS(MVNLayer); - - +REGISTER_LAYER_CLASS(MVN, MVNLayer); } // namespace caffe diff --git a/src/caffe/layers/power_layer.cpp b/src/caffe/layers/power_layer.cpp index 04c612296aa..69bd120e3dc 100644 --- a/src/caffe/layers/power_layer.cpp +++ b/src/caffe/layers/power_layer.cpp @@ -99,6 +99,5 @@ STUB_GPU(PowerLayer); #endif INSTANTIATE_CLASS(PowerLayer); - - +REGISTER_LAYER_CLASS(POWER, PowerLayer); } // namespace caffe diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index 11850ac68e3..d1e327a54c9 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -75,6 +75,5 @@ STUB_GPU(SigmoidCrossEntropyLossLayer); #endif INSTANTIATE_CLASS(SigmoidCrossEntropyLossLayer); - - +REGISTER_LAYER_CLASS(SIGMOID_CROSS_ENTROPY_LOSS, SigmoidCrossEntropyLossLayer); } // namespace caffe diff --git a/src/caffe/layers/silence_layer.cpp b/src/caffe/layers/silence_layer.cpp index 0fd88580eaf..9bd20574816 100644 --- a/src/caffe/layers/silence_layer.cpp +++ b/src/caffe/layers/silence_layer.cpp @@ -22,5 +22,5 @@ STUB_GPU(SilenceLayer); #endif INSTANTIATE_CLASS(SilenceLayer); - +REGISTER_LAYER_CLASS(SILENCE, SilenceLayer); } // namespace caffe diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp index 76522c3e456..60a5ecfa416 100644 --- a/src/caffe/layers/slice_layer.cpp +++ b/src/caffe/layers/slice_layer.cpp @@ -137,5 +137,5 @@ STUB_GPU(SliceLayer); #endif INSTANTIATE_CLASS(SliceLayer); - +REGISTER_LAYER_CLASS(SLICE, SliceLayer); } // namespace caffe diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index 04e8c4f35fc..c7b09fffd7a 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -92,6 +92,4 @@ STUB_GPU(SoftmaxLayer); #endif INSTANTIATE_CLASS(SoftmaxLayer); - - } // namespace caffe diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index d39429cee5d..35033b67c21 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -90,6 +90,5 @@ STUB_GPU(SoftmaxWithLossLayer); #endif INSTANTIATE_CLASS(SoftmaxWithLossLayer); - - +REGISTER_LAYER_CLASS(SOFTMAX_LOSS, SoftmaxWithLossLayer); } // namespace caffe diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index ee6b5a91d3c..51ac61f4cae 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -56,5 +56,5 @@ STUB_GPU(SplitLayer); #endif INSTANTIATE_CLASS(SplitLayer); - +REGISTER_LAYER_CLASS(SPLIT, SplitLayer); } // namespace caffe diff --git a/src/caffe/layers/threshold_layer.cpp b/src/caffe/layers/threshold_layer.cpp index b4b2df51bc9..9e68c32d348 100644 --- a/src/caffe/layers/threshold_layer.cpp +++ b/src/caffe/layers/threshold_layer.cpp @@ -29,5 +29,5 @@ STUB_GPU_FORWARD(ThresholdLayer, Forward); #endif INSTANTIATE_CLASS(ThresholdLayer); - +REGISTER_LAYER_CLASS(THRESHOLD, ThresholdLayer); } // namespace caffe diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 62ca872a32b..529c3b47bd9 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -402,5 +402,5 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { } INSTANTIATE_CLASS(WindowDataLayer); - +REGISTER_LAYER_CLASS(WINDOW_DATA, WindowDataLayer); } // namespace caffe From 4302304ddc678723d5ea308f637fcd4d45252c76 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Tue, 14 Oct 2014 10:18:20 -0700 Subject: [PATCH 0914/2053] [examples] fix reference model name for flickr fine-tuning --- examples/finetune_flickr_style/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/finetune_flickr_style/readme.md b/examples/finetune_flickr_style/readme.md index e0183510bef..c4aafbc66fd 100644 --- a/examples/finetune_flickr_style/readme.md +++ b/examples/finetune_flickr_style/readme.md @@ -13,14 +13,14 @@ Let's fine-tune the BVLC-distributed CaffeNet model on a different dataset, [Fli ## Explanation -The Flickr-sourced images of the Style dataset are visually very similar to the ImageNet dataset, on which the `caffe_reference_imagenet_model` was trained. +The Flickr-sourced images of the Style dataset are visually very similar to the ImageNet dataset, on which the `bvlc_reference_caffenet` was trained. Since that model works well for object category classification, we'd like to use it architecture for our style classifier. We also only have 80,000 images to train on, so we'd like to start with the parameters learned on the 1,000,000 ImageNet images, and fine-tune as needed. If we give provide the `weights` argument to the `caffe train` command, the pretrained weights will be loaded into our model, matching layers by name. Because we are predicting 20 classes instead of a 1,000, we do need to change the last layer in the model. Therefore, we change the name of the last layer from `fc8` to `fc8_flickr` in our prototxt. -Since there is no layer named that in the `caffe_reference_imagenet_model`, that layer will begin training with random weights. +Since there is no layer named that in the `bvlc_reference_caffenet`, that layer will begin training with random weights. We will also decrease the overall learning rate `base_lr` in the solver prototxt, but boost the `blobs_lr` on the newly introduced layer. The idea is to have the rest of the model change very slowly with new data, but let the new layer learn fast. From d6dbfc84db42d813747c4a4b038faa31a6b9503d Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Tue, 14 Oct 2014 11:41:40 -0700 Subject: [PATCH 0915/2053] Revert "OpenCV should be compiled using pkg-config options." -- breaks compilation on working systems This reverts commit 4587b2f9043996fed36fc989c00329ec829ecae9. --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c8226cb6872..35c37af50fb 100644 --- a/Makefile +++ b/Makefile @@ -168,7 +168,8 @@ ifneq ($(CPU_ONLY), 1) LIBRARIES := cudart cublas curand endif LIBRARIES += glog gflags protobuf leveldb snappy \ - lmdb boost_system hdf5_hl hdf5 m + lmdb boost_system hdf5_hl hdf5 m \ + opencv_core opencv_highgui opencv_imgproc PYTHON_LIBRARIES := boost_python python2.7 WARNINGS := -Wall -Wno-sign-compare @@ -329,7 +330,6 @@ NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) MATLAB_CXXFLAGS := $(CXXFLAGS) -Wno-uninitialized LINKFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) \ - `pkg-config opencv --libs` \ $(foreach library,$(LIBRARIES),-l$(library)) PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) From 370217bf7206150901133ac9399bcf3a87462d90 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq@google.com> Date: Mon, 13 Oct 2014 16:01:07 -0700 Subject: [PATCH 0916/2053] some namespace cleaning. --- src/caffe/test/test_caffe_main.cpp | 3 ++- src/caffe/test/test_dummy_data_layer.cpp | 3 --- src/caffe/test/test_hdf5_output_layer.cpp | 3 --- src/caffe/test/test_hdf5data_layer.cpp | 2 -- src/caffe/test/test_upgrade_proto.cpp | 2 -- tools/compute_image_mean.cpp | 9 +++---- tools/convert_imageset.cpp | 15 ++++++------ tools/dump_network.cpp | 15 ++++++++---- tools/extract_features.cpp | 30 +++++++++++++---------- 9 files changed, 40 insertions(+), 42 deletions(-) diff --git a/src/caffe/test/test_caffe_main.cpp b/src/caffe/test/test_caffe_main.cpp index bff0c4ed20e..c8caf5ac58e 100644 --- a/src/caffe/test/test_caffe_main.cpp +++ b/src/caffe/test/test_caffe_main.cpp @@ -1,6 +1,7 @@ // The main caffe test code. Your test cpp code should include this hpp // to allow a main function to be compiled into the binary. +#include "caffe/caffe.hpp" #include "caffe/test/test_caffe_main.hpp" namespace caffe { @@ -15,7 +16,7 @@ using caffe::CAFFE_TEST_CUDA_PROP; int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); - ::google::InitGoogleLogging(argv[0]); + caffe::GlobalInit(&argc, &argv); #ifndef CPU_ONLY // Before starting testing, let's first print out a few cuda defice info. int device; diff --git a/src/caffe/test/test_dummy_data_layer.cpp b/src/caffe/test/test_dummy_data_layer.cpp index da121fa5d99..99548352746 100644 --- a/src/caffe/test/test_dummy_data_layer.cpp +++ b/src/caffe/test/test_dummy_data_layer.cpp @@ -10,9 +10,6 @@ #include "caffe/test/test_caffe_main.hpp" -using std::string; -using std::stringstream; - namespace caffe { template <typename Dtype> diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index c8282233e5b..2e8f096980a 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -11,9 +11,6 @@ #include "caffe/test/test_caffe_main.hpp" -using std::string; -using std::vector; - namespace caffe { template<typename TypeParam> diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index ed6fed83708..41a3a83dd9f 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -13,8 +13,6 @@ #include "caffe/test/test_caffe_main.hpp" -using std::string; - namespace caffe { template <typename TypeParam> diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index f46a0e823c1..52e7f1f99f5 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -11,8 +11,6 @@ #include "caffe/test/test_caffe_main.hpp" -using std::string; - namespace caffe { class PaddingLayerUpgradeTest : public ::testing::Test { diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 20f1ff81f1c..6adde8b1d1c 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -11,7 +11,6 @@ using caffe::Datum; using caffe::BlobProto; -using std::string; using std::max; int main(int argc, char** argv) { @@ -22,9 +21,9 @@ int main(int argc, char** argv) { return 1; } - string db_backend = "lmdb"; + std::string db_backend = "lmdb"; if (argc == 4) { - db_backend = string(argv[3]); + db_backend = std::string(argv[3]); } // leveldb @@ -94,7 +93,7 @@ int main(int argc, char** argv) { for (it->SeekToFirst(); it->Valid(); it->Next()) { // just a dummy operation datum.ParseFromString(it->value().ToString()); - const string& data = datum.data(); + const std::string& data = datum.data(); size_in_datum = std::max<int>(datum.data().size(), datum.float_data_size()); CHECK_EQ(size_in_datum, data_size) << "Incorrect data field size " << @@ -120,7 +119,7 @@ int main(int argc, char** argv) { do { // just a dummy operation datum.ParseFromArray(mdb_value.mv_data, mdb_value.mv_size); - const string& data = datum.data(); + const std::string& data = datum.data(); size_in_datum = std::max<int>(datum.data().size(), datum.float_data_size()); CHECK_EQ(size_in_datum, data_size) << "Incorrect data field size " << diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 4ab93fd0a0c..7c8c1dab3fb 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -27,7 +27,6 @@ using namespace caffe; // NOLINT(build/namespaces) using std::pair; -using std::string; DEFINE_bool(gray, false, "When this option is on, treat images as grayscale ones"); @@ -62,8 +61,8 @@ int main(int argc, char** argv) { bool is_color = !FLAGS_gray; bool check_size = FLAGS_check_size; std::ifstream infile(argv[2]); - std::vector<std::pair<string, int> > lines; - string filename; + std::vector<std::pair<std::string, int> > lines; + std::string filename; int label; while (infile >> filename >> label) { lines.push_back(std::make_pair(filename, label)); @@ -75,7 +74,7 @@ int main(int argc, char** argv) { } LOG(INFO) << "A total of " << lines.size() << " images."; - const string& db_backend = FLAGS_backend; + const std::string& db_backend = FLAGS_backend; const char* db_path = argv[3]; int resize_height = std::max<int>(0, FLAGS_resize_height); @@ -121,7 +120,7 @@ int main(int argc, char** argv) { } // Storing to db - string root_folder(argv[1]); + std::string root_folder(argv[1]); Datum datum; int count = 0; const int kMaxKeyLength = 256; @@ -139,7 +138,7 @@ int main(int argc, char** argv) { data_size = datum.channels() * datum.height() * datum.width(); data_size_initialized = true; } else { - const string& data = datum.data(); + const std::string& data = datum.data(); CHECK_EQ(data.size(), data_size) << "Incorrect data field size " << data.size(); } @@ -147,9 +146,9 @@ int main(int argc, char** argv) { // sequential snprintf(key_cstr, kMaxKeyLength, "%08d_%s", line_id, lines[line_id].first.c_str()); - string value; + std::string value; datum.SerializeToString(&value); - string keystr(key_cstr); + std::string keystr(key_cstr); // Put in db if (db_backend == "leveldb") { // leveldb diff --git a/tools/dump_network.cpp b/tools/dump_network.cpp index 90895fdc969..9cb996ef612 100644 --- a/tools/dump_network.cpp +++ b/tools/dump_network.cpp @@ -22,7 +22,12 @@ #include "caffe/solver.hpp" #include "caffe/util/io.hpp" -using namespace caffe; // NOLINT(build/namespaces) +using boost::shared_ptr; +using caffe::Blob; +using caffe::BlobProto; +using caffe::Caffe; +using caffe::Net; +using caffe::NetParameter; int main(int argc, char** argv) { Caffe::set_mode(Caffe::GPU); @@ -37,7 +42,7 @@ int main(int argc, char** argv) { } caffe_net->CopyTrainedLayersFrom(argv[2]); - vector<Blob<float>* > input_vec; + std::vector<Blob<float>* > input_vec; shared_ptr<Blob<float> > input_blob(new Blob<float>()); if (strcmp(argv[3], "none") != 0) { BlobProto input_blob_proto; @@ -46,7 +51,7 @@ int main(int argc, char** argv) { input_vec.push_back(input_blob.get()); } - string output_prefix(argv[4]); + std::string output_prefix(argv[4]); // Run the network without training. LOG(ERROR) << "Performing Forward"; caffe_net->Forward(input_vec); @@ -62,8 +67,8 @@ int main(int argc, char** argv) { } // Now, let's dump all the layers - const vector<string>& blob_names = caffe_net->blob_names(); - const vector<shared_ptr<Blob<float> > >& blobs = caffe_net->blobs(); + const std::vector<std::string>& blob_names = caffe_net->blob_names(); + const std::vector<shared_ptr<Blob<float> > >& blobs = caffe_net->blobs(); for (int blobid = 0; blobid < caffe_net->blobs().size(); ++blobid) { // Serialize blob LOG(ERROR) << "Dumping " << blob_names[blobid]; diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 9b0288a4d5a..299b3118760 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -14,7 +14,11 @@ #include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" -using namespace caffe; // NOLINT(build/namespaces) +using boost::shared_ptr; +using caffe::Blob; +using caffe::Caffe; +using caffe::Datum; +using caffe::Net; template<typename Dtype> int feature_extraction_pipeline(int argc, char** argv); @@ -62,7 +66,7 @@ int feature_extraction_pipeline(int argc, char** argv) { Caffe::set_phase(Caffe::TEST); arg_pos = 0; // the name of the executable - string pretrained_binary_proto(argv[++arg_pos]); + std::string pretrained_binary_proto(argv[++arg_pos]); // Expected prototxt contains at least one data layer such as // the layer data_layer_name and one feature blob such as the @@ -91,17 +95,17 @@ int feature_extraction_pipeline(int argc, char** argv) { top: "fc7" } */ - string feature_extraction_proto(argv[++arg_pos]); + std::string feature_extraction_proto(argv[++arg_pos]); shared_ptr<Net<Dtype> > feature_extraction_net( new Net<Dtype>(feature_extraction_proto)); feature_extraction_net->CopyTrainedLayersFrom(pretrained_binary_proto); - string extract_feature_blob_names(argv[++arg_pos]); - vector<string> blob_names; + std::string extract_feature_blob_names(argv[++arg_pos]); + std::vector<std::string> blob_names; boost::split(blob_names, extract_feature_blob_names, boost::is_any_of(",")); - string save_feature_leveldb_names(argv[++arg_pos]); - vector<string> leveldb_names; + std::string save_feature_leveldb_names(argv[++arg_pos]); + std::vector<std::string> leveldb_names; boost::split(leveldb_names, save_feature_leveldb_names, boost::is_any_of(",")); CHECK_EQ(blob_names.size(), leveldb_names.size()) << @@ -118,7 +122,7 @@ int feature_extraction_pipeline(int argc, char** argv) { options.error_if_exists = true; options.create_if_missing = true; options.write_buffer_size = 268435456; - vector<shared_ptr<leveldb::DB> > feature_dbs; + std::vector<shared_ptr<leveldb::DB> > feature_dbs; for (size_t i = 0; i < num_features; ++i) { LOG(INFO)<< "Opening leveldb " << leveldb_names[i]; leveldb::DB* db; @@ -134,13 +138,13 @@ int feature_extraction_pipeline(int argc, char** argv) { LOG(ERROR)<< "Extacting Features"; Datum datum; - vector<shared_ptr<leveldb::WriteBatch> > feature_batches( + std::vector<shared_ptr<leveldb::WriteBatch> > feature_batches( num_features, shared_ptr<leveldb::WriteBatch>(new leveldb::WriteBatch())); const int kMaxKeyStrLength = 100; char key_str[kMaxKeyStrLength]; - vector<Blob<float>*> input_vec; - vector<int> image_indices(num_features, 0); + std::vector<Blob<float>*> input_vec; + std::vector<int> image_indices(num_features, 0); for (int batch_index = 0; batch_index < num_mini_batches; ++batch_index) { feature_extraction_net->Forward(input_vec); for (int i = 0; i < num_features; ++i) { @@ -160,10 +164,10 @@ int feature_extraction_pipeline(int argc, char** argv) { for (int d = 0; d < dim_features; ++d) { datum.add_float_data(feature_blob_data[d]); } - string value; + std::string value; datum.SerializeToString(&value); snprintf(key_str, kMaxKeyStrLength, "%d", image_indices[i]); - feature_batches[i]->Put(string(key_str), value); + feature_batches[i]->Put(std::string(key_str), value); ++image_indices[i]; if (image_indices[i] % 1000 == 0) { feature_dbs[i]->Write(leveldb::WriteOptions(), From 6ad4f951133535f8fd43a8b6d4ece85f33465aca Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Tue, 7 Oct 2014 15:37:35 -0400 Subject: [PATCH 0917/2053] Refactored leveldb and lmdb code. --- include/caffe/data_layers.hpp | 14 +-- include/caffe/database.hpp | 103 +++++++++++++++++ include/caffe/database_factory.hpp | 16 +++ include/caffe/leveldb_database.hpp | 52 +++++++++ include/caffe/lmdb_database.hpp | 54 +++++++++ include/caffe/util/io.hpp | 7 -- src/caffe/database_factory.cpp | 33 ++++++ src/caffe/layers/data_layer.cpp | 129 +++------------------ src/caffe/leveldb_database.cpp | 151 ++++++++++++++++++++++++ src/caffe/lmdb_database.cpp | 154 +++++++++++++++++++++++++ src/caffe/proto/caffe.proto | 6 +- src/caffe/test/test_data_layer.cpp | 93 ++++----------- src/caffe/test/test_hdf5data_layer.cpp | 2 - src/caffe/util/io.cpp | 10 -- tools/compute_image_mean.cpp | 132 +++++---------------- tools/convert_imageset.cpp | 81 ++----------- tools/extract_features.cpp | 50 ++++---- 17 files changed, 660 insertions(+), 427 deletions(-) create mode 100644 include/caffe/database.hpp create mode 100644 include/caffe/database_factory.hpp create mode 100644 include/caffe/leveldb_database.hpp create mode 100644 include/caffe/lmdb_database.hpp create mode 100644 src/caffe/database_factory.cpp create mode 100644 src/caffe/leveldb_database.cpp create mode 100644 src/caffe/lmdb_database.cpp diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 1ed26c17178..810f2bb833d 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -7,12 +7,11 @@ #include "boost/scoped_ptr.hpp" #include "hdf5.h" -#include "leveldb/db.h" -#include "lmdb.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/data_transformer.hpp" +#include "caffe/database.hpp" #include "caffe/filler.hpp" #include "caffe/internal_thread.hpp" #include "caffe/layer.hpp" @@ -101,15 +100,8 @@ class DataLayer : public BasePrefetchingDataLayer<Dtype> { protected: virtual void InternalThreadEntry(); - // LEVELDB - shared_ptr<leveldb::DB> db_; - shared_ptr<leveldb::Iterator> iter_; - // LMDB - MDB_env* mdb_env_; - MDB_dbi mdb_dbi_; - MDB_txn* mdb_txn_; - MDB_cursor* mdb_cursor_; - MDB_val mdb_key_, mdb_value_; + shared_ptr<Database> database_; + Database::const_iterator iter_; }; /** diff --git a/include/caffe/database.hpp b/include/caffe/database.hpp new file mode 100644 index 00000000000..4a1a25efd12 --- /dev/null +++ b/include/caffe/database.hpp @@ -0,0 +1,103 @@ +#ifndef CAFFE_DATABASE_H_ +#define CAFFE_DATABASE_H_ + +#include <algorithm> +#include <iterator> +#include <string> +#include <utility> + +#include "caffe/common.hpp" + +namespace caffe { + +class Database { + public: + enum Mode { + New, + ReadWrite, + ReadOnly + }; + + virtual void open(const string& filename, Mode mode) = 0; + virtual void put(const string& key, const string& value) = 0; + virtual void commit() = 0; + virtual void close() = 0; + + Database() { } + virtual ~Database() { } + + class iterator; + typedef iterator const_iterator; + + virtual const_iterator begin() const = 0; + virtual const_iterator cbegin() const = 0; + virtual const_iterator end() const = 0; + virtual const_iterator cend() const = 0; + + protected: + class DatabaseState; + + public: + class iterator : + public std::iterator<std::forward_iterator_tag, pair<string, string> > { + public: + typedef pair<string, string> T; + typedef T value_type; + typedef T& reference_type; + typedef T* pointer_type; + + iterator() + : parent_(NULL) { } + + iterator(const Database* parent, shared_ptr<DatabaseState> state) + : parent_(parent), + state_(state) { } + ~iterator() { } + + bool operator==(const iterator& other) const { + return parent_->equal(state_, other.state_); + } + + bool operator!=(const iterator& other) const { + return !(*this == other); + } + + iterator& operator++() { + parent_->increment(state_); + return *this; + } + iterator operator++(int) { + iterator copy(*this); + parent_->increment(state_); + return copy; + } + + reference_type operator*() const { + return parent_->dereference(state_); + } + + pointer_type operator->() const { + return &parent_->dereference(state_); + } + + protected: + const Database* parent_; + shared_ptr<DatabaseState> state_; + }; + + protected: + class DatabaseState { + public: + virtual ~DatabaseState() { } + }; + + virtual bool equal(shared_ptr<DatabaseState> state1, + shared_ptr<DatabaseState> state2) const = 0; + virtual void increment(shared_ptr<DatabaseState> state) const = 0; + virtual pair<string, string>& dereference( + shared_ptr<DatabaseState> state) const = 0; +}; + +} // namespace caffe + +#endif // CAFFE_DATABASE_H_ diff --git a/include/caffe/database_factory.hpp b/include/caffe/database_factory.hpp new file mode 100644 index 00000000000..a6e39e76188 --- /dev/null +++ b/include/caffe/database_factory.hpp @@ -0,0 +1,16 @@ +#ifndef CAFFE_DATABASE_FACTORY_H_ +#define CAFFE_DATABASE_FACTORY_H_ + +#include <string> + +#include "caffe/common.hpp" +#include "caffe/database.hpp" + +namespace caffe { + +shared_ptr<Database> DatabaseFactory(const DataParameter_DB& type); +shared_ptr<Database> DatabaseFactory(const string& type); + +} // namespace caffe + +#endif // CAFFE_DATABASE_FACTORY_H_ diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp new file mode 100644 index 00000000000..5daf0e51e12 --- /dev/null +++ b/include/caffe/leveldb_database.hpp @@ -0,0 +1,52 @@ +#ifndef CAFFE_LEVELDB_DATABASE_H_ +#define CAFFE_LEVELDB_DATABASE_H_ + +#include <leveldb/db.h> +#include <leveldb/write_batch.h> + +#include <string> +#include <utility> + +#include "caffe/common.hpp" +#include "caffe/database.hpp" + +namespace caffe { + +class LeveldbDatabase : public Database { + public: + void open(const string& filename, Mode mode); + void put(const string& key, const string& value); + void commit(); + void close(); + + ~LeveldbDatabase() { this->close(); } + + protected: + class LeveldbState : public Database::DatabaseState { + public: + explicit LeveldbState(shared_ptr<leveldb::Iterator> iter) + : Database::DatabaseState(), + iter_(iter) { } + + shared_ptr<leveldb::Iterator> iter_; + pair<string, string> kv_pair_; + }; + + bool equal(shared_ptr<DatabaseState> state1, + shared_ptr<DatabaseState> state2) const; + void increment(shared_ptr<DatabaseState> state) const; + pair<string, string>& dereference(shared_ptr<DatabaseState> state) const; + + const_iterator begin() const; + const_iterator cbegin() const; + const_iterator end() const; + const_iterator cend() const; + + protected: + shared_ptr<leveldb::DB> db_; + shared_ptr<leveldb::WriteBatch> batch_; +}; + +} // namespace caffe + +#endif // CAFFE_LEVELDB_DATABASE_H_ diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp new file mode 100644 index 00000000000..f275cb48f5c --- /dev/null +++ b/include/caffe/lmdb_database.hpp @@ -0,0 +1,54 @@ +#ifndef CAFFE_LMDB_DATABASE_H_ +#define CAFFE_LMDB_DATABASE_H_ + +#include <string> +#include <utility> + +#include "lmdb.h" + +#include "caffe/common.hpp" +#include "caffe/database.hpp" + +namespace caffe { + +class LmdbDatabase : public Database { + public: + LmdbDatabase() + : dbi_(0) { } + ~LmdbDatabase() { this->close(); } + + void open(const string& filename, Mode mode); + void put(const string& key, const string& value); + void commit(); + void close(); + + protected: + class LmdbState : public Database::DatabaseState { + public: + explicit LmdbState(MDB_cursor* cursor) + : Database::DatabaseState(), + cursor_(cursor) { } + + MDB_cursor* cursor_; + pair<string, string> kv_pair_; + }; + + bool equal(shared_ptr<DatabaseState> state1, + shared_ptr<DatabaseState> state2) const; + void increment(shared_ptr<DatabaseState> state) const; + pair<string, string>& dereference(shared_ptr<DatabaseState> state) const; + + protected: + const_iterator begin() const; + const_iterator cbegin() const; + const_iterator end() const; + const_iterator cend() const; + + MDB_env *env_ = NULL; + MDB_dbi dbi_; + MDB_txn *txn_ = NULL; +}; + +} // namespace caffe + +#endif // CAFFE_LMDB_DATABASE_H_ diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index e518979a75b..1124bef179a 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -17,11 +17,6 @@ #define HDF5_NUM_DIMS 4 -namespace leveldb { -// Forward declaration for leveldb::Options to be used in GetlevelDBOptions(). -struct Options; -} - namespace caffe { using ::google::protobuf::Message; @@ -132,8 +127,6 @@ inline cv::Mat ReadImageToCVMat(const string& filename) { void CVMatToDatum(const cv::Mat& cv_img, Datum* datum); #endif -leveldb::Options GetLevelDBOptions(); - template <typename Dtype> void hdf5_load_nd_dataset_helper( hid_t file_id, const char* dataset_name_, int min_dim, int max_dim, diff --git a/src/caffe/database_factory.cpp b/src/caffe/database_factory.cpp new file mode 100644 index 00000000000..393635b3208 --- /dev/null +++ b/src/caffe/database_factory.cpp @@ -0,0 +1,33 @@ +#include <string> +#include <utility> + +#include "caffe/database_factory.hpp" +#include "caffe/leveldb_database.hpp" +#include "caffe/lmdb_database.hpp" + +namespace caffe { + +shared_ptr<Database> DatabaseFactory(const DataParameter_DB& type) { + switch (type) { + case DataParameter_DB_LEVELDB: + return shared_ptr<Database>(new LeveldbDatabase()); + case DataParameter_DB_LMDB: + return shared_ptr<Database>(new LmdbDatabase()); + default: + LOG(FATAL) << "Unknown database type " << type; + } +} + +shared_ptr<Database> DatabaseFactory(const string& type) { + if ("leveldb" == type) { + return DatabaseFactory(DataParameter_DB_LEVELDB); + } else if ("lmdb" == type) { + return DatabaseFactory(DataParameter_DB_LMDB); + } else { + LOG(FATAL) << "Unknown database type " << type; + } +} + +} // namespace caffe + + diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index daa3289b9c2..b746bc8a37d 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -1,4 +1,3 @@ -#include <leveldb/db.h> #include <stdint.h> #include <string> @@ -6,6 +5,7 @@ #include "caffe/common.hpp" #include "caffe/data_layers.hpp" +#include "caffe/database_factory.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" @@ -18,60 +18,18 @@ template <typename Dtype> DataLayer<Dtype>::~DataLayer<Dtype>() { this->JoinPrefetchThread(); // clean up the database resources - switch (this->layer_param_.data_param().backend()) { - case DataParameter_DB_LEVELDB: - break; // do nothing - case DataParameter_DB_LMDB: - mdb_cursor_close(mdb_cursor_); - mdb_close(mdb_env_, mdb_dbi_); - mdb_txn_abort(mdb_txn_); - mdb_env_close(mdb_env_); - break; - default: - LOG(FATAL) << "Unknown database backend"; - } + iter_ = database_->end(); + database_->close(); } template <typename Dtype> void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // Initialize DB - switch (this->layer_param_.data_param().backend()) { - case DataParameter_DB_LEVELDB: - { - leveldb::DB* db_temp; - leveldb::Options options = GetLevelDBOptions(); - options.create_if_missing = false; - LOG(INFO) << "Opening leveldb " << this->layer_param_.data_param().source(); - leveldb::Status status = leveldb::DB::Open( - options, this->layer_param_.data_param().source(), &db_temp); - CHECK(status.ok()) << "Failed to open leveldb " - << this->layer_param_.data_param().source() << std::endl - << status.ToString(); - db_.reset(db_temp); - iter_.reset(db_->NewIterator(leveldb::ReadOptions())); - iter_->SeekToFirst(); - } - break; - case DataParameter_DB_LMDB: - CHECK_EQ(mdb_env_create(&mdb_env_), MDB_SUCCESS) << "mdb_env_create failed"; - CHECK_EQ(mdb_env_set_mapsize(mdb_env_, 1099511627776), MDB_SUCCESS); // 1TB - CHECK_EQ(mdb_env_open(mdb_env_, - this->layer_param_.data_param().source().c_str(), - MDB_RDONLY|MDB_NOTLS, 0664), MDB_SUCCESS) << "mdb_env_open failed"; - CHECK_EQ(mdb_txn_begin(mdb_env_, NULL, MDB_RDONLY, &mdb_txn_), MDB_SUCCESS) - << "mdb_txn_begin failed"; - CHECK_EQ(mdb_open(mdb_txn_, NULL, 0, &mdb_dbi_), MDB_SUCCESS) - << "mdb_open failed"; - CHECK_EQ(mdb_cursor_open(mdb_txn_, mdb_dbi_, &mdb_cursor_), MDB_SUCCESS) - << "mdb_cursor_open failed"; - LOG(INFO) << "Opening lmdb " << this->layer_param_.data_param().source(); - CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, MDB_FIRST), - MDB_SUCCESS) << "mdb_cursor_get failed"; - break; - default: - LOG(FATAL) << "Unknown database backend"; - } + database_ = DatabaseFactory(this->layer_param_.data_param().backend()); + LOG(INFO) << "Opening database " << this->layer_param_.data_param().source(); + database_->open(this->layer_param_.data_param().source(), Database::ReadOnly); + iter_ = database_->begin(); // Check if we would need to randomly skip a few data points if (this->layer_param_.data_param().rand_skip()) { @@ -79,37 +37,16 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, this->layer_param_.data_param().rand_skip(); LOG(INFO) << "Skipping first " << skip << " data points."; while (skip-- > 0) { - switch (this->layer_param_.data_param().backend()) { - case DataParameter_DB_LEVELDB: - iter_->Next(); - if (!iter_->Valid()) { - iter_->SeekToFirst(); - } - break; - case DataParameter_DB_LMDB: - if (mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, MDB_NEXT) - != MDB_SUCCESS) { - CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, - MDB_FIRST), MDB_SUCCESS); - } - break; - default: - LOG(FATAL) << "Unknown database backend"; + LOG(INFO) << iter_->first; + if (++iter_ == database_->end()) { + iter_ = database_->begin(); } } } // Read a data point, and use it to initialize the top blob. + CHECK(iter_ != database_->end()); Datum datum; - switch (this->layer_param_.data_param().backend()) { - case DataParameter_DB_LEVELDB: - datum.ParseFromString(iter_->value().ToString()); - break; - case DataParameter_DB_LMDB: - datum.ParseFromArray(mdb_value_.mv_data, mdb_value_.mv_size); - break; - default: - LOG(FATAL) << "Unknown database backend"; - } + datum.ParseFromString(iter_->second); // image int crop_size = this->layer_param_.transform_param().crop_size(); @@ -153,23 +90,10 @@ void DataLayer<Dtype>::InternalThreadEntry() { const int batch_size = this->layer_param_.data_param().batch_size(); for (int item_id = 0; item_id < batch_size; ++item_id) { - // get a blob Datum datum; - switch (this->layer_param_.data_param().backend()) { - case DataParameter_DB_LEVELDB: - CHECK(iter_); - CHECK(iter_->Valid()); - datum.ParseFromString(iter_->value().ToString()); - break; - case DataParameter_DB_LMDB: - CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, - &mdb_value_, MDB_GET_CURRENT), MDB_SUCCESS); - datum.ParseFromArray(mdb_value_.mv_data, - mdb_value_.mv_size); - break; - default: - LOG(FATAL) << "Unknown database backend"; - } + CHECK(iter_ != database_->end()); + datum.ParseFromString(iter_->second); + // Apply data transformations (mirror, scale, crop...) int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); @@ -179,26 +103,9 @@ void DataLayer<Dtype>::InternalThreadEntry() { } // go to the next iter - switch (this->layer_param_.data_param().backend()) { - case DataParameter_DB_LEVELDB: - iter_->Next(); - if (!iter_->Valid()) { - // We have reached the end. Restart from the first. - DLOG(INFO) << "Restarting data prefetching from start."; - iter_->SeekToFirst(); - } - break; - case DataParameter_DB_LMDB: - if (mdb_cursor_get(mdb_cursor_, &mdb_key_, - &mdb_value_, MDB_NEXT) != MDB_SUCCESS) { - // We have reached the end. Restart from the first. - DLOG(INFO) << "Restarting data prefetching from start."; - CHECK_EQ(mdb_cursor_get(mdb_cursor_, &mdb_key_, - &mdb_value_, MDB_FIRST), MDB_SUCCESS); - } - break; - default: - LOG(FATAL) << "Unknown database backend"; + ++iter_; + if (iter_ == database_->end()) { + iter_ = database_->begin(); } } } diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp new file mode 100644 index 00000000000..be7ac7f141c --- /dev/null +++ b/src/caffe/leveldb_database.cpp @@ -0,0 +1,151 @@ +#include <string> +#include <utility> + +#include "caffe/leveldb_database.hpp" + +namespace caffe { + +void LeveldbDatabase::open(const string& filename, Mode mode) { + LOG(INFO) << "LevelDB: Open " << filename; + + leveldb::Options options; + switch (mode) { + case New: + LOG(INFO) << " mode NEW"; + options.error_if_exists = true; + options.create_if_missing = true; + break; + case ReadWrite: + LOG(INFO) << " mode RW"; + options.error_if_exists = false; + options.create_if_missing = true; + break; + case ReadOnly: + LOG(INFO) << " mode RO"; + options.error_if_exists = false; + options.create_if_missing = false; + break; + default: + LOG(FATAL) << "unknown mode " << mode; + } + options.write_buffer_size = 268435456; + options.max_open_files = 100; + + leveldb::DB* db; + + LOG(INFO) << "Opening leveldb " << filename; + leveldb::Status status = leveldb::DB::Open( + options, filename, &db); + db_.reset(db); + CHECK(status.ok()) << "Failed to open leveldb " << filename + << ". Is it already existing?"; + batch_.reset(new leveldb::WriteBatch()); +} + +void LeveldbDatabase::put(const string& key, const string& value) { + LOG(INFO) << "LevelDB: Put " << key; + + CHECK_NOTNULL(batch_.get()); + batch_->Put(key, value); +} + +void LeveldbDatabase::commit() { + LOG(INFO) << "LevelDB: Commit"; + + CHECK_NOTNULL(db_.get()); + CHECK_NOTNULL(batch_.get()); + + db_->Write(leveldb::WriteOptions(), batch_.get()); + batch_.reset(new leveldb::WriteBatch()); +} + +void LeveldbDatabase::close() { + LOG(INFO) << "LevelDB: Close"; + + if (batch_ && db_) { + this->commit(); + } + batch_.reset(); + db_.reset(); +} + +LeveldbDatabase::const_iterator LeveldbDatabase::begin() const { + CHECK_NOTNULL(db_.get()); + shared_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); + iter->SeekToFirst(); + if (!iter->Valid()) { + iter.reset(); + } + shared_ptr<DatabaseState> state(new LeveldbState(iter)); + return const_iterator(this, state); +} + +LeveldbDatabase::const_iterator LeveldbDatabase::end() const { + shared_ptr<leveldb::Iterator> iter; + shared_ptr<DatabaseState> state(new LeveldbState(iter)); + return const_iterator(this, state); +} + +LeveldbDatabase::const_iterator LeveldbDatabase::cbegin() const { + return begin(); +} + +LeveldbDatabase::const_iterator LeveldbDatabase::cend() const { return end(); } + +bool LeveldbDatabase::equal(shared_ptr<DatabaseState> state1, + shared_ptr<DatabaseState> state2) const { + shared_ptr<LeveldbState> leveldb_state1 = + boost::dynamic_pointer_cast<LeveldbState>(state1); + + CHECK_NOTNULL(leveldb_state1.get()); + + shared_ptr<LeveldbState> leveldb_state2 = + boost::dynamic_pointer_cast<LeveldbState>(state2); + + CHECK_NOTNULL(leveldb_state2.get()); + + CHECK(!leveldb_state1->iter_ || leveldb_state1->iter_->Valid()); + CHECK(!leveldb_state2->iter_ || leveldb_state2->iter_->Valid()); + + // The KV store doesn't really have any sort of ordering, + // so while we can do a sequential scan over the collection, + // we can't really use subranges. + return !leveldb_state1->iter_ && !leveldb_state2->iter_; +} + +void LeveldbDatabase::increment(shared_ptr<DatabaseState> state) const { + shared_ptr<LeveldbState> leveldb_state = + boost::dynamic_pointer_cast<LeveldbState>(state); + + CHECK_NOTNULL(leveldb_state.get()); + + shared_ptr<leveldb::Iterator>& iter = leveldb_state->iter_; + + CHECK_NOTNULL(iter.get()); + CHECK(iter->Valid()); + + iter->Next(); + if (!iter->Valid()) { + iter.reset(); + } +} + +pair<string, string>& LeveldbDatabase::dereference( + shared_ptr<DatabaseState> state) const { + shared_ptr<LeveldbState> leveldb_state = + boost::dynamic_pointer_cast<LeveldbState>(state); + + CHECK_NOTNULL(leveldb_state.get()); + + shared_ptr<leveldb::Iterator>& iter = leveldb_state->iter_; + + CHECK_NOTNULL(iter.get()); + + CHECK(iter->Valid()); + + leveldb_state->kv_pair_ = make_pair(iter->key().ToString(), + iter->value().ToString()); + return leveldb_state->kv_pair_; +} + +} // namespace caffe diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp new file mode 100644 index 00000000000..796bbc9d4ac --- /dev/null +++ b/src/caffe/lmdb_database.cpp @@ -0,0 +1,154 @@ +#include <sys/stat.h> + +#include <string> +#include <utility> + +#include "caffe/lmdb_database.hpp" + +namespace caffe { + +void LmdbDatabase::open(const string& filename, Mode mode) { + LOG(INFO) << "LMDB: Open " << filename; + + CHECK(NULL == env_); + CHECK(NULL == txn_); + CHECK_EQ(0, dbi_); + + if (mode != ReadOnly) { + CHECK_EQ(mkdir(filename.c_str(), 0744), 0) << "mkdir " << filename + << "failed"; + } + + CHECK_EQ(mdb_env_create(&env_), MDB_SUCCESS) << "mdb_env_create failed"; + CHECK_EQ(mdb_env_set_mapsize(env_, 1099511627776), MDB_SUCCESS) // 1TB + << "mdb_env_set_mapsize failed"; + + int flag1 = 0; + int flag2 = 0; + if (mode == ReadOnly) { + flag1 = MDB_RDONLY | MDB_NOTLS; + flag2 = MDB_RDONLY; + } + + CHECK_EQ(mdb_env_open(env_, filename.c_str(), flag1, 0664), MDB_SUCCESS) + << "mdb_env_open failed"; + CHECK_EQ(mdb_txn_begin(env_, NULL, flag2, &txn_), MDB_SUCCESS) + << "mdb_txn_begin failed"; + CHECK_EQ(mdb_open(txn_, NULL, 0, &dbi_), MDB_SUCCESS) << "mdb_open failed"; +} + +void LmdbDatabase::put(const string& key, const string& value) { + LOG(INFO) << "LMDB: Put " << key; + + MDB_val mdbkey, mdbdata; + mdbdata.mv_size = value.size(); + mdbdata.mv_data = const_cast<char*>(&value[0]); + mdbkey.mv_size = key.size(); + mdbkey.mv_data = const_cast<char*>(&key[0]); + + CHECK_NOTNULL(txn_); + CHECK_NE(0, dbi_); + + CHECK_EQ(mdb_put(txn_, dbi_, &mdbkey, &mdbdata, 0), MDB_SUCCESS) + << "mdb_put failed"; +} + +void LmdbDatabase::commit() { + LOG(INFO) << "LMDB: Commit"; + + CHECK_NOTNULL(txn_); + + CHECK_EQ(mdb_txn_commit(txn_), MDB_SUCCESS) << "mdb_txn_commit failed"; +} + +void LmdbDatabase::close() { + LOG(INFO) << "LMDB: Close"; + + if (env_ && dbi_ && txn_) { + this->commit(); + } + + if (env_ && dbi_) { + mdb_close(env_, dbi_); + mdb_env_close(env_); + env_ = NULL; + dbi_ = 0; + txn_ = NULL; + } +} + +LmdbDatabase::const_iterator LmdbDatabase::begin() const { + MDB_cursor* cursor; + CHECK_EQ(mdb_cursor_open(txn_, dbi_, &cursor), MDB_SUCCESS); + MDB_val key; + MDB_val val; + CHECK_EQ(mdb_cursor_get(cursor, &key, &val, MDB_FIRST), MDB_SUCCESS); + + shared_ptr<DatabaseState> state(new LmdbState(cursor)); + return const_iterator(this, state); +} + +LmdbDatabase::const_iterator LmdbDatabase::end() const { + shared_ptr<DatabaseState> state(new LmdbState(NULL)); + return const_iterator(this, state); +} + +LmdbDatabase::const_iterator LmdbDatabase::cbegin() const { return begin(); } +LmdbDatabase::const_iterator LmdbDatabase::cend() const { return end(); } + +bool LmdbDatabase::equal(shared_ptr<DatabaseState> state1, + shared_ptr<DatabaseState> state2) const { + shared_ptr<LmdbState> lmdb_state1 = + boost::dynamic_pointer_cast<LmdbState>(state1); + + CHECK_NOTNULL(lmdb_state1.get()); + + shared_ptr<LmdbState> lmdb_state2 = + boost::dynamic_pointer_cast<LmdbState>(state2); + + CHECK_NOTNULL(lmdb_state2.get()); + + // The KV store doesn't really have any sort of ordering, + // so while we can do a sequential scan over the collection, + // we can't really use subranges. + return !lmdb_state1->cursor_ && !lmdb_state2->cursor_; +} + +void LmdbDatabase::increment(shared_ptr<DatabaseState> state) const { + shared_ptr<LmdbState> lmdb_state = + boost::dynamic_pointer_cast<LmdbState>(state); + + CHECK_NOTNULL(lmdb_state.get()); + + MDB_cursor*& cursor = lmdb_state->cursor_; + + MDB_val key; + MDB_val val; + if (MDB_SUCCESS != mdb_cursor_get(cursor, &key, &val, MDB_NEXT)) { + mdb_cursor_close(cursor); + cursor = NULL; + } +} + +pair<string, string>& LmdbDatabase::dereference( + shared_ptr<DatabaseState> state) const { + shared_ptr<LmdbState> lmdb_state = + boost::dynamic_pointer_cast<LmdbState>(state); + + CHECK_NOTNULL(lmdb_state.get()); + + MDB_cursor*& cursor = lmdb_state->cursor_; + + MDB_val mdb_key; + MDB_val mdb_val; + CHECK_EQ(mdb_cursor_get(cursor, &mdb_key, &mdb_val, MDB_GET_CURRENT), + MDB_SUCCESS); + + lmdb_state->kv_pair_ = make_pair( + string(reinterpret_cast<char*>(mdb_key.mv_data), mdb_key.mv_size), + string(reinterpret_cast<char*>(mdb_val.mv_data), mdb_val.mv_size)); + + return lmdb_state->kv_pair_; +} + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index f0404a09b90..f0dba097d05 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -423,7 +423,7 @@ message DataParameter { // The rand_skip variable is for the data layer to skip a few data points // to avoid all asynchronous sgd clients to start at the same point. The skip // point would be set as rand_skip * rand(0,1). Note that rand_skip should not - // be larger than the number of keys in the leveldb. + // be larger than the number of keys in the database. optional uint32 rand_skip = 7 [default = 0]; optional DB backend = 8 [default = LEVELDB]; // DEPRECATED. See TransformationParameter. For data pre-processing, we can do @@ -518,7 +518,7 @@ message ImageDataParameter { // The rand_skip variable is for the data layer to skip a few data points // to avoid all asynchronous sgd clients to start at the same point. The skip // point would be set as rand_skip * rand(0,1). Note that rand_skip should not - // be larger than the number of keys in the leveldb. + // be larger than the number of keys in the database. optional uint32 rand_skip = 7 [default = 0]; // Whether or not ImageLayer should shuffle the list of files at every epoch. optional bool shuffle = 8 [default = false]; @@ -767,7 +767,7 @@ message V0LayerParameter { // The rand_skip variable is for the data layer to skip a few data points // to avoid all asynchronous sgd clients to start at the same point. The skip // point would be set as rand_skip * rand(0,1). Note that rand_skip should not - // be larger than the number of keys in the leveldb. + // be larger than the number of keys in the database. optional uint32 rand_skip = 53 [default = 0]; // Fields related to detection (det_*) diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 657ffdea68c..d99b5e3a0d3 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -2,10 +2,10 @@ #include <vector> #include "gtest/gtest.h" -#include "leveldb/db.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" +#include "caffe/database_factory.hpp" #include "caffe/filler.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" @@ -36,16 +36,11 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { // Fill the LevelDB with data: if unique_pixels, each pixel is unique but // all images are the same; else each image is unique but all pixels within // an image are the same. - void FillLevelDB(const bool unique_pixels) { - backend_ = DataParameter_DB_LEVELDB; - LOG(INFO) << "Using temporary leveldb " << *filename_; - leveldb::DB* db; - leveldb::Options options; - options.error_if_exists = true; - options.create_if_missing = true; - leveldb::Status status = - leveldb::DB::Open(options, filename_->c_str(), &db); - CHECK(status.ok()); + void Fill(const bool unique_pixels, DataParameter_DB backend) { + backend_ = backend; + LOG(INFO) << "Using temporary database " << *filename_; + shared_ptr<Database> database = DatabaseFactory(backend_); + database->open(*filename_, Database::New); for (int i = 0; i < 5; ++i) { Datum datum; datum.set_label(i); @@ -59,57 +54,9 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } stringstream ss; ss << i; - db->Put(leveldb::WriteOptions(), ss.str(), datum.SerializeAsString()); + database->put(ss.str(), datum.SerializeAsString()); } - delete db; - } - - // Fill the LMDB with data: unique_pixels has same meaning as in FillLevelDB. - void FillLMDB(const bool unique_pixels) { - backend_ = DataParameter_DB_LMDB; - LOG(INFO) << "Using temporary lmdb " << *filename_; - CHECK_EQ(mkdir(filename_->c_str(), 0744), 0) << "mkdir " << filename_ - << "failed"; - MDB_env *env; - MDB_dbi dbi; - MDB_val mdbkey, mdbdata; - MDB_txn *txn; - CHECK_EQ(mdb_env_create(&env), MDB_SUCCESS) << "mdb_env_create failed"; - CHECK_EQ(mdb_env_set_mapsize(env, 1099511627776), MDB_SUCCESS) // 1TB - << "mdb_env_set_mapsize failed"; - CHECK_EQ(mdb_env_open(env, filename_->c_str(), 0, 0664), MDB_SUCCESS) - << "mdb_env_open failed"; - CHECK_EQ(mdb_txn_begin(env, NULL, 0, &txn), MDB_SUCCESS) - << "mdb_txn_begin failed"; - CHECK_EQ(mdb_open(txn, NULL, 0, &dbi), MDB_SUCCESS) << "mdb_open failed"; - - for (int i = 0; i < 5; ++i) { - Datum datum; - datum.set_label(i); - datum.set_channels(2); - datum.set_height(3); - datum.set_width(4); - std::string* data = datum.mutable_data(); - for (int j = 0; j < 24; ++j) { - int datum = unique_pixels ? j : i; - data->push_back(static_cast<uint8_t>(datum)); - } - stringstream ss; - ss << i; - - string value; - datum.SerializeToString(&value); - mdbdata.mv_size = value.size(); - mdbdata.mv_data = reinterpret_cast<void*>(&value[0]); - string keystr = ss.str(); - mdbkey.mv_size = keystr.size(); - mdbkey.mv_data = reinterpret_cast<void*>(&keystr[0]); - CHECK_EQ(mdb_put(txn, dbi, &mdbkey, &mdbdata, 0), MDB_SUCCESS) - << "mdb_put failed"; - } - CHECK_EQ(mdb_txn_commit(txn), MDB_SUCCESS) << "mdb_txn_commit failed"; - mdb_close(env, dbi); - mdb_env_close(env); + database->close(); } void TestRead() { @@ -234,7 +181,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } crop_sequence.push_back(iter_crop_sequence); } - } // destroy 1st data layer and unlock the leveldb + } // destroy 1st data layer and unlock the database // Get crop sequence after reseeding Caffe with 1701. // Check that the sequence is the same as the original. @@ -289,7 +236,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } crop_sequence.push_back(iter_crop_sequence); } - } // destroy 1st data layer and unlock the leveldb + } // destroy 1st data layer and unlock the database // Get crop sequence continuing from previous Caffe RNG state; reseed // srand with 1701. Check that the sequence differs from the original. @@ -327,14 +274,14 @@ TYPED_TEST_CASE(DataLayerTest, TestDtypesAndDevices); TYPED_TEST(DataLayerTest, TestReadLevelDB) { const bool unique_pixels = false; // all pixels the same; images different - this->FillLevelDB(unique_pixels); + this->Fill(unique_pixels, DataParameter_DB_LEVELDB); this->TestRead(); } TYPED_TEST(DataLayerTest, TestReadCropTrainLevelDB) { Caffe::set_phase(Caffe::TRAIN); const bool unique_pixels = true; // all images the same; pixels different - this->FillLevelDB(unique_pixels); + this->Fill(unique_pixels, DataParameter_DB_LEVELDB); this->TestReadCrop(); } @@ -343,7 +290,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainLevelDB) { TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLevelDB) { Caffe::set_phase(Caffe::TRAIN); const bool unique_pixels = true; // all images the same; pixels different - this->FillLevelDB(unique_pixels); + this->Fill(unique_pixels, DataParameter_DB_LEVELDB); this->TestReadCropTrainSequenceSeeded(); } @@ -352,27 +299,27 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLevelDB) { TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLevelDB) { Caffe::set_phase(Caffe::TRAIN); const bool unique_pixels = true; // all images the same; pixels different - this->FillLevelDB(unique_pixels); + this->Fill(unique_pixels, DataParameter_DB_LEVELDB); this->TestReadCropTrainSequenceUnseeded(); } TYPED_TEST(DataLayerTest, TestReadCropTestLevelDB) { Caffe::set_phase(Caffe::TEST); const bool unique_pixels = true; // all images the same; pixels different - this->FillLevelDB(unique_pixels); + this->Fill(unique_pixels, DataParameter_DB_LEVELDB); this->TestReadCrop(); } TYPED_TEST(DataLayerTest, TestReadLMDB) { const bool unique_pixels = false; // all pixels the same; images different - this->FillLMDB(unique_pixels); + this->Fill(unique_pixels, DataParameter_DB_LMDB); this->TestRead(); } TYPED_TEST(DataLayerTest, TestReadCropTrainLMDB) { Caffe::set_phase(Caffe::TRAIN); const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); + this->Fill(unique_pixels, DataParameter_DB_LMDB); this->TestReadCrop(); } @@ -381,7 +328,7 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainLMDB) { TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLMDB) { Caffe::set_phase(Caffe::TRAIN); const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); + this->Fill(unique_pixels, DataParameter_DB_LMDB); this->TestReadCropTrainSequenceSeeded(); } @@ -390,14 +337,14 @@ TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceSeededLMDB) { TYPED_TEST(DataLayerTest, TestReadCropTrainSequenceUnseededLMDB) { Caffe::set_phase(Caffe::TRAIN); const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); + this->Fill(unique_pixels, DataParameter_DB_LMDB); this->TestReadCropTrainSequenceUnseeded(); } TYPED_TEST(DataLayerTest, TestReadCropTestLMDB) { Caffe::set_phase(Caffe::TEST); const bool unique_pixels = true; // all images the same; pixels different - this->FillLMDB(unique_pixels); + this->Fill(unique_pixels, DataParameter_DB_LMDB); this->TestReadCrop(); } diff --git a/src/caffe/test/test_hdf5data_layer.cpp b/src/caffe/test/test_hdf5data_layer.cpp index 41a3a83dd9f..8d3b3d1e987 100644 --- a/src/caffe/test/test_hdf5data_layer.cpp +++ b/src/caffe/test/test_hdf5data_layer.cpp @@ -1,8 +1,6 @@ #include <string> #include <vector> -#include "leveldb/db.h" - #include "gtest/gtest.h" #include "caffe/blob.hpp" diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 36510d61d40..a4a6627b277 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -2,7 +2,6 @@ #include <google/protobuf/io/coded_stream.h> #include <google/protobuf/io/zero_copy_stream_impl.h> #include <google/protobuf/text_format.h> -#include <leveldb/db.h> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/highgui/highgui_c.h> @@ -122,15 +121,6 @@ void CVMatToDatum(const cv::Mat& cv_img, Datum* datum) { datum->set_data(buffer); } - -leveldb::Options GetLevelDBOptions() { - // In default, we will return the leveldb option and set the max open files - // in order to avoid using up the operating system's limit. - leveldb::Options options; - options.max_open_files = 100; - return options; -} - // Verifies format of data stored in HDF5 file and reshapes blob accordingly. template <typename Dtype> void hdf5_load_nd_dataset_helper( diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 6adde8b1d1c..e59bbf19f0d 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -1,14 +1,14 @@ #include <glog/logging.h> -#include <leveldb/db.h> -#include <lmdb.h> #include <stdint.h> #include <algorithm> #include <string> +#include "caffe/database_factory.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" +using caffe::Database; using caffe::Datum; using caffe::BlobProto; using std::max; @@ -26,57 +26,16 @@ int main(int argc, char** argv) { db_backend = std::string(argv[3]); } - // leveldb - leveldb::DB* db; - leveldb::Options options; - options.create_if_missing = false; - leveldb::Iterator* it = NULL; - // lmdb - MDB_env* mdb_env; - MDB_dbi mdb_dbi; - MDB_val mdb_key, mdb_value; - MDB_txn* mdb_txn; - MDB_cursor* mdb_cursor; + caffe::shared_ptr<Database> database = caffe::DatabaseFactory(db_backend); // Open db - if (db_backend == "leveldb") { // leveldb - LOG(INFO) << "Opening leveldb " << argv[1]; - leveldb::Status status = leveldb::DB::Open( - options, argv[1], &db); - CHECK(status.ok()) << "Failed to open leveldb " << argv[1]; - leveldb::ReadOptions read_options; - read_options.fill_cache = false; - it = db->NewIterator(read_options); - it->SeekToFirst(); - } else if (db_backend == "lmdb") { // lmdb - LOG(INFO) << "Opening lmdb " << argv[1]; - CHECK_EQ(mdb_env_create(&mdb_env), MDB_SUCCESS) << "mdb_env_create failed"; - CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS); // 1TB - CHECK_EQ(mdb_env_open(mdb_env, argv[1], MDB_RDONLY, 0664), - MDB_SUCCESS) << "mdb_env_open failed"; - CHECK_EQ(mdb_txn_begin(mdb_env, NULL, MDB_RDONLY, &mdb_txn), MDB_SUCCESS) - << "mdb_txn_begin failed"; - CHECK_EQ(mdb_open(mdb_txn, NULL, 0, &mdb_dbi), MDB_SUCCESS) - << "mdb_open failed"; - CHECK_EQ(mdb_cursor_open(mdb_txn, mdb_dbi, &mdb_cursor), MDB_SUCCESS) - << "mdb_cursor_open failed"; - CHECK_EQ(mdb_cursor_get(mdb_cursor, &mdb_key, &mdb_value, MDB_FIRST), - MDB_SUCCESS); - } else { - LOG(FATAL) << "Unknown db backend " << db_backend; - } + database->open(argv[1], Database::ReadOnly); Datum datum; BlobProto sum_blob; int count = 0; // load first datum - if (db_backend == "leveldb") { - datum.ParseFromString(it->value().ToString()); - } else if (db_backend == "lmdb") { - datum.ParseFromArray(mdb_value.mv_data, mdb_value.mv_size); - } else { - LOG(FATAL) << "Unknown db backend " << db_backend; - } + datum.ParseFromString(database->begin()->second); sum_blob.set_num(1); sum_blob.set_channels(datum.channels()); @@ -89,59 +48,29 @@ int main(int argc, char** argv) { sum_blob.add_data(0.); } LOG(INFO) << "Starting Iteration"; - if (db_backend == "leveldb") { // leveldb - for (it->SeekToFirst(); it->Valid(); it->Next()) { - // just a dummy operation - datum.ParseFromString(it->value().ToString()); - const std::string& data = datum.data(); - size_in_datum = std::max<int>(datum.data().size(), - datum.float_data_size()); - CHECK_EQ(size_in_datum, data_size) << "Incorrect data field size " << - size_in_datum; - if (data.size() != 0) { - for (int i = 0; i < size_in_datum; ++i) { - sum_blob.set_data(i, sum_blob.data(i) + (uint8_t)data[i]); - } - } else { - for (int i = 0; i < size_in_datum; ++i) { - sum_blob.set_data(i, sum_blob.data(i) + - static_cast<float>(datum.float_data(i))); - } + for (Database::const_iterator iter = database->begin(); + iter != database->end(); ++iter) { + // just a dummy operation + datum.ParseFromString(iter->second); + const std::string& data = datum.data(); + size_in_datum = std::max<int>(datum.data().size(), + datum.float_data_size()); + CHECK_EQ(size_in_datum, data_size) << "Incorrect data field size " << + size_in_datum; + if (data.size() != 0) { + for (int i = 0; i < size_in_datum; ++i) { + sum_blob.set_data(i, sum_blob.data(i) + (uint8_t)data[i]); } - ++count; - if (count % 10000 == 0) { - LOG(ERROR) << "Processed " << count << " files."; + } else { + for (int i = 0; i < size_in_datum; ++i) { + sum_blob.set_data(i, sum_blob.data(i) + + static_cast<float>(datum.float_data(i))); } } - } else if (db_backend == "lmdb") { // lmdb - CHECK_EQ(mdb_cursor_get(mdb_cursor, &mdb_key, &mdb_value, MDB_FIRST), - MDB_SUCCESS); - do { - // just a dummy operation - datum.ParseFromArray(mdb_value.mv_data, mdb_value.mv_size); - const std::string& data = datum.data(); - size_in_datum = std::max<int>(datum.data().size(), - datum.float_data_size()); - CHECK_EQ(size_in_datum, data_size) << "Incorrect data field size " << - size_in_datum; - if (data.size() != 0) { - for (int i = 0; i < size_in_datum; ++i) { - sum_blob.set_data(i, sum_blob.data(i) + (uint8_t)data[i]); - } - } else { - for (int i = 0; i < size_in_datum; ++i) { - sum_blob.set_data(i, sum_blob.data(i) + - static_cast<float>(datum.float_data(i))); - } - } - ++count; - if (count % 10000 == 0) { - LOG(ERROR) << "Processed " << count << " files."; - } - } while (mdb_cursor_get(mdb_cursor, &mdb_key, &mdb_value, MDB_NEXT) - == MDB_SUCCESS); - } else { - LOG(FATAL) << "Unknown db backend " << db_backend; + ++count; + if (count % 10000 == 0) { + LOG(ERROR) << "Processed " << count << " files."; + } } if (count % 10000 != 0) { @@ -155,15 +84,6 @@ int main(int argc, char** argv) { WriteProtoToBinaryFile(sum_blob, argv[2]); // Clean up - if (db_backend == "leveldb") { - delete db; - } else if (db_backend == "lmdb") { - mdb_cursor_close(mdb_cursor); - mdb_close(mdb_env, mdb_dbi); - mdb_txn_abort(mdb_txn); - mdb_env_close(mdb_env); - } else { - LOG(FATAL) << "Unknown db backend " << db_backend; - } + database->close(); return 0; } diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 7c8c1dab3fb..6f03a9d9d49 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -10,10 +10,6 @@ #include <gflags/gflags.h> #include <glog/logging.h> -#include <leveldb/db.h> -#include <leveldb/write_batch.h> -#include <lmdb.h> -#include <sys/stat.h> #include <algorithm> #include <fstream> // NOLINT(readability/streams) @@ -21,6 +17,7 @@ #include <utility> #include <vector> +#include "caffe/database_factory.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" #include "caffe/util/rng.hpp" @@ -81,43 +78,10 @@ int main(int argc, char** argv) { int resize_width = std::max<int>(0, FLAGS_resize_width); // Open new db - // lmdb - MDB_env *mdb_env; - MDB_dbi mdb_dbi; - MDB_val mdb_key, mdb_data; - MDB_txn *mdb_txn; - // leveldb - leveldb::DB* db; - leveldb::Options options; - options.error_if_exists = true; - options.create_if_missing = true; - options.write_buffer_size = 268435456; - leveldb::WriteBatch* batch = NULL; + shared_ptr<Database> database = DatabaseFactory(db_backend); // Open db - if (db_backend == "leveldb") { // leveldb - LOG(INFO) << "Opening leveldb " << db_path; - leveldb::Status status = leveldb::DB::Open( - options, db_path, &db); - CHECK(status.ok()) << "Failed to open leveldb " << db_path - << ". Is it already existing?"; - batch = new leveldb::WriteBatch(); - } else if (db_backend == "lmdb") { // lmdb - LOG(INFO) << "Opening lmdb " << db_path; - CHECK_EQ(mkdir(db_path, 0744), 0) - << "mkdir " << db_path << "failed"; - CHECK_EQ(mdb_env_create(&mdb_env), MDB_SUCCESS) << "mdb_env_create failed"; - CHECK_EQ(mdb_env_set_mapsize(mdb_env, 1099511627776), MDB_SUCCESS) // 1TB - << "mdb_env_set_mapsize failed"; - CHECK_EQ(mdb_env_open(mdb_env, db_path, 0, 0664), MDB_SUCCESS) - << "mdb_env_open failed"; - CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) - << "mdb_txn_begin failed"; - CHECK_EQ(mdb_open(mdb_txn, NULL, 0, &mdb_dbi), MDB_SUCCESS) - << "mdb_open failed. Does the lmdb already exist? "; - } else { - LOG(FATAL) << "Unknown db backend " << db_backend; - } + database->open(db_path, Database::New); // Storing to db std::string root_folder(argv[1]); @@ -151,50 +115,19 @@ int main(int argc, char** argv) { std::string keystr(key_cstr); // Put in db - if (db_backend == "leveldb") { // leveldb - batch->Put(keystr, value); - } else if (db_backend == "lmdb") { // lmdb - mdb_data.mv_size = value.size(); - mdb_data.mv_data = reinterpret_cast<void*>(&value[0]); - mdb_key.mv_size = keystr.size(); - mdb_key.mv_data = reinterpret_cast<void*>(&keystr[0]); - CHECK_EQ(mdb_put(mdb_txn, mdb_dbi, &mdb_key, &mdb_data, 0), MDB_SUCCESS) - << "mdb_put failed"; - } else { - LOG(FATAL) << "Unknown db backend " << db_backend; - } + database->put(keystr, value); if (++count % 1000 == 0) { // Commit txn - if (db_backend == "leveldb") { // leveldb - db->Write(leveldb::WriteOptions(), batch); - delete batch; - batch = new leveldb::WriteBatch(); - } else if (db_backend == "lmdb") { // lmdb - CHECK_EQ(mdb_txn_commit(mdb_txn), MDB_SUCCESS) - << "mdb_txn_commit failed"; - CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) - << "mdb_txn_begin failed"; - } else { - LOG(FATAL) << "Unknown db backend " << db_backend; - } + database->commit(); LOG(ERROR) << "Processed " << count << " files."; } } // write the last batch if (count % 1000 != 0) { - if (db_backend == "leveldb") { // leveldb - db->Write(leveldb::WriteOptions(), batch); - delete batch; - delete db; - } else if (db_backend == "lmdb") { // lmdb - CHECK_EQ(mdb_txn_commit(mdb_txn), MDB_SUCCESS) << "mdb_txn_commit failed"; - mdb_close(mdb_env, mdb_dbi); - mdb_env_close(mdb_env); - } else { - LOG(FATAL) << "Unknown db backend " << db_backend; - } + database->commit(); LOG(ERROR) << "Processed " << count << " files."; } + database->close(); return 0; } diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 299b3118760..b3ad8e60622 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -4,11 +4,10 @@ #include "boost/algorithm/string.hpp" #include "google/protobuf/text_format.h" -#include "leveldb/db.h" -#include "leveldb/write_batch.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" +#include "caffe/database_factory.hpp" #include "caffe/net.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" @@ -17,6 +16,8 @@ using boost::shared_ptr; using caffe::Blob; using caffe::Caffe; +using caffe::Database; +using caffe::DatabaseFactory; using caffe::Datum; using caffe::Net; @@ -38,12 +39,12 @@ int feature_extraction_pipeline(int argc, char** argv) { " extract features of the input data produced by the net.\n" "Usage: extract_features pretrained_net_param" " feature_extraction_proto_file extract_feature_blob_name1[,name2,...]" - " save_feature_leveldb_name1[,name2,...] num_mini_batches [CPU/GPU]" + " save_feature_database_name1[,name2,...] num_mini_batches [CPU/GPU]" " [DEVICE_ID=0]\n" "Note: you can extract multiple features in one pass by specifying" - " multiple feature blob names and leveldb names seperated by ','." + " multiple feature blob names and database names seperated by ','." " The names cannot contain white space characters and the number of blobs" - " and leveldbs must be equal."; + " and databases must be equal."; return 1; } int arg_pos = num_required_args; @@ -104,12 +105,12 @@ int feature_extraction_pipeline(int argc, char** argv) { std::vector<std::string> blob_names; boost::split(blob_names, extract_feature_blob_names, boost::is_any_of(",")); - std::string save_feature_leveldb_names(argv[++arg_pos]); - std::vector<std::string> leveldb_names; - boost::split(leveldb_names, save_feature_leveldb_names, + std::string save_feature_database_names(argv[++arg_pos]); + std::vector<std::string> database_names; + boost::split(database_names, save_feature_database_names, boost::is_any_of(",")); - CHECK_EQ(blob_names.size(), leveldb_names.size()) << - " the number of blob names and leveldb names must be equal"; + CHECK_EQ(blob_names.size(), database_names.size()) << + " the number of blob names and database names must be equal"; size_t num_features = blob_names.size(); for (size_t i = 0; i < num_features; i++) { @@ -118,19 +119,12 @@ int feature_extraction_pipeline(int argc, char** argv) { << " in the network " << feature_extraction_proto; } - leveldb::Options options; - options.error_if_exists = true; - options.create_if_missing = true; - options.write_buffer_size = 268435456; - std::vector<shared_ptr<leveldb::DB> > feature_dbs; + std::vector<shared_ptr<Database> > feature_dbs; for (size_t i = 0; i < num_features; ++i) { - LOG(INFO)<< "Opening leveldb " << leveldb_names[i]; - leveldb::DB* db; - leveldb::Status status = leveldb::DB::Open(options, - leveldb_names[i].c_str(), - &db); - CHECK(status.ok()) << "Failed to open leveldb " << leveldb_names[i]; - feature_dbs.push_back(shared_ptr<leveldb::DB>(db)); + LOG(INFO)<< "Opening database " << database_names[i]; + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(database_names.at(i), Database::New); + feature_dbs.push_back(database); } int num_mini_batches = atoi(argv[++arg_pos]); @@ -138,9 +132,6 @@ int feature_extraction_pipeline(int argc, char** argv) { LOG(ERROR)<< "Extacting Features"; Datum datum; - std::vector<shared_ptr<leveldb::WriteBatch> > feature_batches( - num_features, - shared_ptr<leveldb::WriteBatch>(new leveldb::WriteBatch())); const int kMaxKeyStrLength = 100; char key_str[kMaxKeyStrLength]; std::vector<Blob<float>*> input_vec; @@ -167,14 +158,12 @@ int feature_extraction_pipeline(int argc, char** argv) { std::string value; datum.SerializeToString(&value); snprintf(key_str, kMaxKeyStrLength, "%d", image_indices[i]); - feature_batches[i]->Put(std::string(key_str), value); + feature_dbs.at(i)->put(std::string(key_str), value); ++image_indices[i]; if (image_indices[i] % 1000 == 0) { - feature_dbs[i]->Write(leveldb::WriteOptions(), - feature_batches[i].get()); + feature_dbs.at(i)->commit(); LOG(ERROR)<< "Extracted features of " << image_indices[i] << " query images for feature blob " << blob_names[i]; - feature_batches[i].reset(new leveldb::WriteBatch()); } } // for (int n = 0; n < batch_size; ++n) } // for (int i = 0; i < num_features; ++i) @@ -182,10 +171,11 @@ int feature_extraction_pipeline(int argc, char** argv) { // write the last batch for (int i = 0; i < num_features; ++i) { if (image_indices[i] % 1000 != 0) { - feature_dbs[i]->Write(leveldb::WriteOptions(), feature_batches[i].get()); + feature_dbs.at(i)->commit(); } LOG(ERROR)<< "Extracted features of " << image_indices[i] << " query images for feature blob " << blob_names[i]; + feature_dbs.at(i)->close(); } LOG(ERROR)<< "Successfully extracted the features!"; From 329e4481263d396b22a6e8ca6b00b19d57860ab9 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Tue, 7 Oct 2014 16:14:29 -0400 Subject: [PATCH 0918/2053] Some cleanup to make travis happy. --- include/caffe/database_factory.hpp | 1 + include/caffe/leveldb_database.hpp | 11 +++++------ include/caffe/lmdb_database.hpp | 19 ++++++++++--------- src/caffe/database_factory.cpp | 2 ++ src/caffe/layers/data_layer.cpp | 3 +++ 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/include/caffe/database_factory.hpp b/include/caffe/database_factory.hpp index a6e39e76188..91185e99b89 100644 --- a/include/caffe/database_factory.hpp +++ b/include/caffe/database_factory.hpp @@ -5,6 +5,7 @@ #include "caffe/common.hpp" #include "caffe/database.hpp" +#include "caffe/proto/caffe.pb.h" namespace caffe { diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index 5daf0e51e12..ee8c5f2eed8 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -19,6 +19,11 @@ class LeveldbDatabase : public Database { void commit(); void close(); + const_iterator begin() const; + const_iterator cbegin() const; + const_iterator end() const; + const_iterator cend() const; + ~LeveldbDatabase() { this->close(); } protected: @@ -37,12 +42,6 @@ class LeveldbDatabase : public Database { void increment(shared_ptr<DatabaseState> state) const; pair<string, string>& dereference(shared_ptr<DatabaseState> state) const; - const_iterator begin() const; - const_iterator cbegin() const; - const_iterator end() const; - const_iterator cend() const; - - protected: shared_ptr<leveldb::DB> db_; shared_ptr<leveldb::WriteBatch> batch_; }; diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index f275cb48f5c..7387afd24d0 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -14,7 +14,9 @@ namespace caffe { class LmdbDatabase : public Database { public: LmdbDatabase() - : dbi_(0) { } + : env_(NULL), + dbi_(0), + txn_(NULL) { } ~LmdbDatabase() { this->close(); } void open(const string& filename, Mode mode); @@ -22,6 +24,11 @@ class LmdbDatabase : public Database { void commit(); void close(); + const_iterator begin() const; + const_iterator cbegin() const; + const_iterator end() const; + const_iterator cend() const; + protected: class LmdbState : public Database::DatabaseState { public: @@ -38,15 +45,9 @@ class LmdbDatabase : public Database { void increment(shared_ptr<DatabaseState> state) const; pair<string, string>& dereference(shared_ptr<DatabaseState> state) const; - protected: - const_iterator begin() const; - const_iterator cbegin() const; - const_iterator end() const; - const_iterator cend() const; - - MDB_env *env_ = NULL; + MDB_env *env_; MDB_dbi dbi_; - MDB_txn *txn_ = NULL; + MDB_txn *txn_; }; } // namespace caffe diff --git a/src/caffe/database_factory.cpp b/src/caffe/database_factory.cpp index 393635b3208..062de8c02e3 100644 --- a/src/caffe/database_factory.cpp +++ b/src/caffe/database_factory.cpp @@ -15,6 +15,7 @@ shared_ptr<Database> DatabaseFactory(const DataParameter_DB& type) { return shared_ptr<Database>(new LmdbDatabase()); default: LOG(FATAL) << "Unknown database type " << type; + return shared_ptr<Database>(); } } @@ -25,6 +26,7 @@ shared_ptr<Database> DatabaseFactory(const string& type) { return DatabaseFactory(DataParameter_DB_LMDB); } else { LOG(FATAL) << "Unknown database type " << type; + return shared_ptr<Database>(); } } diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index b746bc8a37d..1d37170bdde 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -18,6 +18,9 @@ template <typename Dtype> DataLayer<Dtype>::~DataLayer<Dtype>() { this->JoinPrefetchThread(); // clean up the database resources + + // Very important to invalidate iterators before closing the database. + // TODO(kmatzen): Figure out a better design to avoid this. iter_ = database_->end(); database_->close(); } From 7e504c0612b23449aa83fd7aac8d49c56b03fd62 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Tue, 7 Oct 2014 18:03:02 -0400 Subject: [PATCH 0919/2053] Updated interface to make fewer string copies. --- include/caffe/database.hpp | 13 ++++-- include/caffe/leveldb_database.hpp | 6 +-- include/caffe/lmdb_database.hpp | 6 +-- include/caffe/util/io.hpp | 8 ++-- src/caffe/layers/data_layer.cpp | 5 +- src/caffe/leveldb_database.cpp | 18 +++++--- src/caffe/lmdb_database.cpp | 73 ++++++++++++++++++++---------- src/caffe/test/test_data_layer.cpp | 7 ++- tools/compute_image_mean.cpp | 6 ++- tools/convert_imageset.cpp | 11 +++-- tools/extract_features.cpp | 11 +++-- 11 files changed, 103 insertions(+), 61 deletions(-) diff --git a/include/caffe/database.hpp b/include/caffe/database.hpp index 4a1a25efd12..23036a8e075 100644 --- a/include/caffe/database.hpp +++ b/include/caffe/database.hpp @@ -5,6 +5,7 @@ #include <iterator> #include <string> #include <utility> +#include <vector> #include "caffe/common.hpp" @@ -18,8 +19,10 @@ class Database { ReadOnly }; + typedef vector<char> buffer_t; + virtual void open(const string& filename, Mode mode) = 0; - virtual void put(const string& key, const string& value) = 0; + virtual void put(buffer_t* key, buffer_t* value) = 0; virtual void commit() = 0; virtual void close() = 0; @@ -38,10 +41,10 @@ class Database { class DatabaseState; public: - class iterator : - public std::iterator<std::forward_iterator_tag, pair<string, string> > { + class iterator : public std::iterator< + std::forward_iterator_tag, pair<buffer_t, buffer_t> > { public: - typedef pair<string, string> T; + typedef pair<buffer_t, buffer_t> T; typedef T value_type; typedef T& reference_type; typedef T* pointer_type; @@ -94,7 +97,7 @@ class Database { virtual bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const = 0; virtual void increment(shared_ptr<DatabaseState> state) const = 0; - virtual pair<string, string>& dereference( + virtual pair<buffer_t, buffer_t>& dereference( shared_ptr<DatabaseState> state) const = 0; }; diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index ee8c5f2eed8..f30273d6fe7 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -15,7 +15,7 @@ namespace caffe { class LeveldbDatabase : public Database { public: void open(const string& filename, Mode mode); - void put(const string& key, const string& value); + void put(buffer_t* key, buffer_t* value); void commit(); void close(); @@ -34,13 +34,13 @@ class LeveldbDatabase : public Database { iter_(iter) { } shared_ptr<leveldb::Iterator> iter_; - pair<string, string> kv_pair_; + pair<buffer_t, buffer_t> kv_pair_; }; bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const; void increment(shared_ptr<DatabaseState> state) const; - pair<string, string>& dereference(shared_ptr<DatabaseState> state) const; + pair<buffer_t, buffer_t>& dereference(shared_ptr<DatabaseState> state) const; shared_ptr<leveldb::DB> db_; shared_ptr<leveldb::WriteBatch> batch_; diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index 7387afd24d0..ee3806ddf36 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -20,7 +20,7 @@ class LmdbDatabase : public Database { ~LmdbDatabase() { this->close(); } void open(const string& filename, Mode mode); - void put(const string& key, const string& value); + void put(buffer_t* key, buffer_t* value); void commit(); void close(); @@ -37,13 +37,13 @@ class LmdbDatabase : public Database { cursor_(cursor) { } MDB_cursor* cursor_; - pair<string, string> kv_pair_; + pair<buffer_t, buffer_t> kv_pair_; }; bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const; void increment(shared_ptr<DatabaseState> state) const; - pair<string, string>& dereference(shared_ptr<DatabaseState> state) const; + pair<buffer_t, buffer_t>& dereference(shared_ptr<DatabaseState> state) const; MDB_env *env_; MDB_dbi dbi_; diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 1124bef179a..b64c821a86e 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -24,27 +24,27 @@ using ::google::protobuf::Message; inline void MakeTempFilename(string* temp_filename) { temp_filename->clear(); *temp_filename = "/tmp/caffe_test.XXXXXX"; - char* temp_filename_cstr = new char[temp_filename->size()]; + char* temp_filename_cstr = new char[temp_filename->size() + 1]; // NOLINT_NEXT_LINE(runtime/printf) strcpy(temp_filename_cstr, temp_filename->c_str()); int fd = mkstemp(temp_filename_cstr); CHECK_GE(fd, 0) << "Failed to open a temporary file at: " << *temp_filename; close(fd); *temp_filename = temp_filename_cstr; - delete temp_filename_cstr; + delete[] temp_filename_cstr; } inline void MakeTempDir(string* temp_dirname) { temp_dirname->clear(); *temp_dirname = "/tmp/caffe_test.XXXXXX"; - char* temp_dirname_cstr = new char[temp_dirname->size()]; + char* temp_dirname_cstr = new char[temp_dirname->size() + 1]; // NOLINT_NEXT_LINE(runtime/printf) strcpy(temp_dirname_cstr, temp_dirname->c_str()); char* mkdtemp_result = mkdtemp(temp_dirname_cstr); CHECK(mkdtemp_result != NULL) << "Failed to create a temporary directory at: " << *temp_dirname; *temp_dirname = temp_dirname_cstr; - delete temp_dirname_cstr; + delete[] temp_dirname_cstr; } bool ReadProtoFromTextFile(const char* filename, Message* proto); diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 1d37170bdde..4d36b8ede42 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -40,7 +40,6 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, this->layer_param_.data_param().rand_skip(); LOG(INFO) << "Skipping first " << skip << " data points."; while (skip-- > 0) { - LOG(INFO) << iter_->first; if (++iter_ == database_->end()) { iter_ = database_->begin(); } @@ -49,7 +48,7 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // Read a data point, and use it to initialize the top blob. CHECK(iter_ != database_->end()); Datum datum; - datum.ParseFromString(iter_->second); + datum.ParseFromArray(iter_->second.data(), iter_->second.size()); // image int crop_size = this->layer_param_.transform_param().crop_size(); @@ -95,7 +94,7 @@ void DataLayer<Dtype>::InternalThreadEntry() { for (int item_id = 0; item_id < batch_size; ++item_id) { Datum datum; CHECK(iter_ != database_->end()); - datum.ParseFromString(iter_->second); + datum.ParseFromArray(iter_->second.data(), iter_->second.size()); // Apply data transformations (mirror, scale, crop...) int offset = this->prefetch_data_.offset(item_id); diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index be7ac7f141c..a8fe02a3157 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -42,11 +42,15 @@ void LeveldbDatabase::open(const string& filename, Mode mode) { batch_.reset(new leveldb::WriteBatch()); } -void LeveldbDatabase::put(const string& key, const string& value) { - LOG(INFO) << "LevelDB: Put " << key; +void LeveldbDatabase::put(buffer_t* key, buffer_t* value) { + LOG(INFO) << "LevelDB: Put"; CHECK_NOTNULL(batch_.get()); - batch_->Put(key, value); + + leveldb::Slice key_slice(key->data(), key->size()); + leveldb::Slice value_slice(value->data(), value->size()); + + batch_->Put(key_slice, value_slice); } void LeveldbDatabase::commit() { @@ -130,7 +134,7 @@ void LeveldbDatabase::increment(shared_ptr<DatabaseState> state) const { } } -pair<string, string>& LeveldbDatabase::dereference( +pair<Database::buffer_t, Database::buffer_t>& LeveldbDatabase::dereference( shared_ptr<DatabaseState> state) const { shared_ptr<LeveldbState> leveldb_state = boost::dynamic_pointer_cast<LeveldbState>(state); @@ -143,8 +147,10 @@ pair<string, string>& LeveldbDatabase::dereference( CHECK(iter->Valid()); - leveldb_state->kv_pair_ = make_pair(iter->key().ToString(), - iter->value().ToString()); + leveldb_state->kv_pair_ = make_pair( + buffer_t(iter->key().data(), iter->key().data() + iter->key().size()), + buffer_t(iter->value().data(), + iter->value().data() + iter->value().size())); return leveldb_state->kv_pair_; } diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index 796bbc9d4ac..7197a4775dc 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -19,9 +19,13 @@ void LmdbDatabase::open(const string& filename, Mode mode) { << "failed"; } - CHECK_EQ(mdb_env_create(&env_), MDB_SUCCESS) << "mdb_env_create failed"; - CHECK_EQ(mdb_env_set_mapsize(env_, 1099511627776), MDB_SUCCESS) // 1TB - << "mdb_env_set_mapsize failed"; + int retval; + retval = mdb_env_create(&env_); + CHECK_EQ(retval, MDB_SUCCESS) << "mdb_env_create failed " + << mdb_strerror(retval); + retval = mdb_env_set_mapsize(env_, 1099511627776); + CHECK_EQ(retval, MDB_SUCCESS) // 1TB + << "mdb_env_set_mapsize failed " << mdb_strerror(retval); int flag1 = 0; int flag2 = 0; @@ -30,27 +34,31 @@ void LmdbDatabase::open(const string& filename, Mode mode) { flag2 = MDB_RDONLY; } - CHECK_EQ(mdb_env_open(env_, filename.c_str(), flag1, 0664), MDB_SUCCESS) - << "mdb_env_open failed"; - CHECK_EQ(mdb_txn_begin(env_, NULL, flag2, &txn_), MDB_SUCCESS) - << "mdb_txn_begin failed"; - CHECK_EQ(mdb_open(txn_, NULL, 0, &dbi_), MDB_SUCCESS) << "mdb_open failed"; + retval = mdb_env_open(env_, filename.c_str(), flag1, 0664); + CHECK_EQ(retval, MDB_SUCCESS) + << "mdb_env_open failed " << mdb_strerror(retval); + retval = mdb_txn_begin(env_, NULL, flag2, &txn_); + CHECK_EQ(retval, MDB_SUCCESS) + << "mdb_txn_begin failed " << mdb_strerror(retval); + retval = mdb_open(txn_, NULL, 0, &dbi_); + CHECK_EQ(retval, MDB_SUCCESS) << "mdb_open failed" << mdb_strerror(retval); } -void LmdbDatabase::put(const string& key, const string& value) { - LOG(INFO) << "LMDB: Put " << key; +void LmdbDatabase::put(buffer_t* key, buffer_t* value) { + LOG(INFO) << "LMDB: Put"; MDB_val mdbkey, mdbdata; - mdbdata.mv_size = value.size(); - mdbdata.mv_data = const_cast<char*>(&value[0]); - mdbkey.mv_size = key.size(); - mdbkey.mv_data = const_cast<char*>(&key[0]); + mdbdata.mv_size = value->size(); + mdbdata.mv_data = value->data(); + mdbkey.mv_size = key->size(); + mdbkey.mv_data = key->data(); CHECK_NOTNULL(txn_); CHECK_NE(0, dbi_); - CHECK_EQ(mdb_put(txn_, dbi_, &mdbkey, &mdbdata, 0), MDB_SUCCESS) - << "mdb_put failed"; + int retval = mdb_put(txn_, dbi_, &mdbkey, &mdbdata, 0); + CHECK_EQ(retval, MDB_SUCCESS) + << "mdb_put failed " << mdb_strerror(retval); } void LmdbDatabase::commit() { @@ -58,7 +66,9 @@ void LmdbDatabase::commit() { CHECK_NOTNULL(txn_); - CHECK_EQ(mdb_txn_commit(txn_), MDB_SUCCESS) << "mdb_txn_commit failed"; + int retval = mdb_txn_commit(txn_); + CHECK_EQ(retval, MDB_SUCCESS) << "mdb_txn_commit failed " + << mdb_strerror(retval); } void LmdbDatabase::close() { @@ -79,10 +89,13 @@ void LmdbDatabase::close() { LmdbDatabase::const_iterator LmdbDatabase::begin() const { MDB_cursor* cursor; - CHECK_EQ(mdb_cursor_open(txn_, dbi_, &cursor), MDB_SUCCESS); + int retval; + retval = mdb_cursor_open(txn_, dbi_, &cursor); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); MDB_val key; MDB_val val; - CHECK_EQ(mdb_cursor_get(cursor, &key, &val, MDB_FIRST), MDB_SUCCESS); + retval = mdb_cursor_get(cursor, &key, &val, MDB_FIRST); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); shared_ptr<DatabaseState> state(new LmdbState(cursor)); return const_iterator(this, state); @@ -122,15 +135,20 @@ void LmdbDatabase::increment(shared_ptr<DatabaseState> state) const { MDB_cursor*& cursor = lmdb_state->cursor_; + CHECK_NOTNULL(cursor); + MDB_val key; MDB_val val; - if (MDB_SUCCESS != mdb_cursor_get(cursor, &key, &val, MDB_NEXT)) { + int retval = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); + if (MDB_NOTFOUND == retval) { mdb_cursor_close(cursor); cursor = NULL; + } else { + CHECK_EQ(MDB_SUCCESS, retval) << mdb_strerror(retval); } } -pair<string, string>& LmdbDatabase::dereference( +pair<Database::buffer_t, Database::buffer_t>& LmdbDatabase::dereference( shared_ptr<DatabaseState> state) const { shared_ptr<LmdbState> lmdb_state = boost::dynamic_pointer_cast<LmdbState>(state); @@ -139,14 +157,19 @@ pair<string, string>& LmdbDatabase::dereference( MDB_cursor*& cursor = lmdb_state->cursor_; + CHECK_NOTNULL(cursor); + MDB_val mdb_key; MDB_val mdb_val; - CHECK_EQ(mdb_cursor_get(cursor, &mdb_key, &mdb_val, MDB_GET_CURRENT), - MDB_SUCCESS); + int retval = mdb_cursor_get(cursor, &mdb_key, &mdb_val, MDB_GET_CURRENT); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); + + char* key_data = reinterpret_cast<char*>(mdb_key.mv_data); + char* value_data = reinterpret_cast<char*>(mdb_val.mv_data); lmdb_state->kv_pair_ = make_pair( - string(reinterpret_cast<char*>(mdb_key.mv_data), mdb_key.mv_size), - string(reinterpret_cast<char*>(mdb_val.mv_data), mdb_val.mv_size)); + buffer_t(key_data, key_data + mdb_key.mv_size), + buffer_t(value_data, value_data + mdb_val.mv_size)); return lmdb_state->kv_pair_; } diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index d99b5e3a0d3..c17f7295c3c 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -54,7 +54,12 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } stringstream ss; ss << i; - database->put(ss.str(), datum.SerializeAsString()); + string key_str = ss.str(); + Database::buffer_t key(key_str.c_str(), key_str.c_str() + key_str.size()); + Database::buffer_t value(datum.ByteSize()); + datum.SerializeWithCachedSizesToArray( + reinterpret_cast<unsigned char*>(value.data())); + database->put(&key, &value); } database->close(); } diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index e59bbf19f0d..f981af40fdf 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -35,7 +35,8 @@ int main(int argc, char** argv) { BlobProto sum_blob; int count = 0; // load first datum - datum.ParseFromString(database->begin()->second); + const Database::buffer_t& first_blob = database->begin()->second; + datum.ParseFromArray(first_blob.data(), first_blob.size()); sum_blob.set_num(1); sum_blob.set_channels(datum.channels()); @@ -51,7 +52,8 @@ int main(int argc, char** argv) { for (Database::const_iterator iter = database->begin(); iter != database->end(); ++iter) { // just a dummy operation - datum.ParseFromString(iter->second); + const Database::buffer_t& blob = iter->second; + datum.ParseFromArray(blob.data(), blob.size()); const std::string& data = datum.data(); size_in_datum = std::max<int>(datum.data().size(), datum.float_data_size()); diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 6f03a9d9d49..19c87e53ff0 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -108,14 +108,15 @@ int main(int argc, char** argv) { } } // sequential - snprintf(key_cstr, kMaxKeyLength, "%08d_%s", line_id, + int length = snprintf(key_cstr, kMaxKeyLength, "%08d_%s", line_id, lines[line_id].first.c_str()); - std::string value; - datum.SerializeToString(&value); - std::string keystr(key_cstr); + Database::buffer_t value(datum.ByteSize()); + datum.SerializeWithCachedSizesToArray( + reinterpret_cast<unsigned char*>(value.data())); + Database::buffer_t keystr(key_cstr, key_cstr + length); // Put in db - database->put(keystr, value); + database->put(&keystr, &value); if (++count % 1000 == 0) { // Commit txn diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index b3ad8e60622..1065d449a42 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -155,10 +155,13 @@ int feature_extraction_pipeline(int argc, char** argv) { for (int d = 0; d < dim_features; ++d) { datum.add_float_data(feature_blob_data[d]); } - std::string value; - datum.SerializeToString(&value); - snprintf(key_str, kMaxKeyStrLength, "%d", image_indices[i]); - feature_dbs.at(i)->put(std::string(key_str), value); + Database::buffer_t value(datum.ByteSize()); + datum.SerializeWithCachedSizesToArray( + reinterpret_cast<unsigned char*>(value.data())); + int length = snprintf(key_str, kMaxKeyStrLength, "%d", + image_indices[i]); + Database::buffer_t key(key_str, key_str + length); + feature_dbs.at(i)->put(&key, &value); ++image_indices[i]; if (image_indices[i] % 1000 == 0) { feature_dbs.at(i)->commit(); From edff676ea8482d48f4b7bc794288696afce782ca Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Tue, 7 Oct 2014 21:46:15 -0400 Subject: [PATCH 0920/2053] Don't autocommit on close for the databases. If they were read-only, then they might fail. --- examples/cifar10/convert_cifar_data.cpp | 59 ++++++++++++++----------- include/caffe/leveldb_database.hpp | 2 - include/caffe/lmdb_database.hpp | 1 - src/caffe/leveldb_database.cpp | 3 -- src/caffe/lmdb_database.cpp | 15 ++++--- tools/compute_image_mean.cpp | 4 +- 6 files changed, 43 insertions(+), 41 deletions(-) diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index 90ecb6d9a88..c4930878405 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -11,13 +11,17 @@ #include "glog/logging.h" #include "google/protobuf/text_format.h" -#include "leveldb/db.h" #include "stdint.h" +#include "caffe/database_factory.hpp" #include "caffe/proto/caffe.pb.h" using std::string; +using caffe::Database; +using caffe::DatabaseFactory; +using caffe::shared_ptr; + const int kCIFARSize = 32; const int kCIFARImageNBytes = 3072; const int kCIFARBatchSize = 10000; @@ -31,26 +35,20 @@ void read_image(std::ifstream* file, int* label, char* buffer) { return; } -void convert_dataset(const string& input_folder, const string& output_folder) { - // Leveldb options - leveldb::Options options; - options.create_if_missing = true; - options.error_if_exists = true; +void convert_dataset(const string& input_folder, const string& output_folder, + const string& db_type) { + shared_ptr<Database> train_database = DatabaseFactory(db_type); + train_database->open(output_folder + "/cifar10_train_" + db_type, + Database::New); // Data buffer int label; char str_buffer[kCIFARImageNBytes]; - string value; caffe::Datum datum; datum.set_channels(3); datum.set_height(kCIFARSize); datum.set_width(kCIFARSize); LOG(INFO) << "Writing Training data"; - leveldb::DB* train_db; - leveldb::Status status; - status = leveldb::DB::Open(options, output_folder + "/cifar10_train_leveldb", - &train_db); - CHECK(status.ok()) << "Failed to open leveldb."; for (int fileid = 0; fileid < kCIFARTrainBatches; ++fileid) { // Open files LOG(INFO) << "Training Batch " << fileid + 1; @@ -62,17 +60,22 @@ void convert_dataset(const string& input_folder, const string& output_folder) { read_image(&data_file, &label, str_buffer); datum.set_label(label); datum.set_data(str_buffer, kCIFARImageNBytes); - datum.SerializeToString(&value); - snprintf(str_buffer, kCIFARImageNBytes, "%05d", + Database::buffer_t value(datum.ByteSize()); + datum.SerializeWithCachedSizesToArray( + reinterpret_cast<unsigned char*>(value.data())); + int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", fileid * kCIFARBatchSize + itemid); - train_db->Put(leveldb::WriteOptions(), string(str_buffer), value); + Database::buffer_t key(str_buffer, str_buffer + length); + train_database->put(&key, &value); } } + train_database->commit(); + train_database->close(); LOG(INFO) << "Writing Testing data"; - leveldb::DB* test_db; - CHECK(leveldb::DB::Open(options, output_folder + "/cifar10_test_leveldb", - &test_db).ok()) << "Failed to open leveldb."; + shared_ptr<Database> test_database = DatabaseFactory(db_type); + test_database->open(output_folder + "/cifar10_test_" + db_type, + Database::New); // Open files std::ifstream data_file((input_folder + "/test_batch.bin").c_str(), std::ios::in | std::ios::binary); @@ -81,28 +84,30 @@ void convert_dataset(const string& input_folder, const string& output_folder) { read_image(&data_file, &label, str_buffer); datum.set_label(label); datum.set_data(str_buffer, kCIFARImageNBytes); - datum.SerializeToString(&value); - snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid); - test_db->Put(leveldb::WriteOptions(), string(str_buffer), value); + Database::buffer_t value(datum.ByteSize()); + datum.SerializeWithCachedSizesToArray( + reinterpret_cast<unsigned char*>(value.data())); + int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid); + Database::buffer_t key(str_buffer, str_buffer + length); + test_database->put(&key, &value); } - - delete train_db; - delete test_db; + test_database->commit(); + test_database->close(); } int main(int argc, char** argv) { - if (argc != 3) { + if (argc != 4) { printf("This script converts the CIFAR dataset to the leveldb format used\n" "by caffe to perform classification.\n" "Usage:\n" - " convert_cifar_data input_folder output_folder\n" + " convert_cifar_data input_folder output_folder db_type\n" "Where the input folder should contain the binary batch files.\n" "The CIFAR dataset could be downloaded at\n" " http://www.cs.toronto.edu/~kriz/cifar.html\n" "You should gunzip them after downloading.\n"); } else { google::InitGoogleLogging(argv[0]); - convert_dataset(string(argv[1]), string(argv[2])); + convert_dataset(string(argv[1]), string(argv[2]), string(argv[3])); } return 0; } diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index f30273d6fe7..dda669704bd 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -24,8 +24,6 @@ class LeveldbDatabase : public Database { const_iterator end() const; const_iterator cend() const; - ~LeveldbDatabase() { this->close(); } - protected: class LeveldbState : public Database::DatabaseState { public: diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index ee3806ddf36..96542227c9a 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -17,7 +17,6 @@ class LmdbDatabase : public Database { : env_(NULL), dbi_(0), txn_(NULL) { } - ~LmdbDatabase() { this->close(); } void open(const string& filename, Mode mode); void put(buffer_t* key, buffer_t* value); diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index a8fe02a3157..a5cdaa3b7f1 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -66,9 +66,6 @@ void LeveldbDatabase::commit() { void LeveldbDatabase::close() { LOG(INFO) << "LevelDB: Close"; - if (batch_ && db_) { - this->commit(); - } batch_.reset(); db_.reset(); } diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index 7197a4775dc..08607789bb1 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -14,9 +14,9 @@ void LmdbDatabase::open(const string& filename, Mode mode) { CHECK(NULL == txn_); CHECK_EQ(0, dbi_); - if (mode != ReadOnly) { + if (mode == New) { CHECK_EQ(mkdir(filename.c_str(), 0744), 0) << "mkdir " << filename - << "failed"; + << " failed"; } int retval; @@ -66,18 +66,19 @@ void LmdbDatabase::commit() { CHECK_NOTNULL(txn_); - int retval = mdb_txn_commit(txn_); + int retval; + retval = mdb_txn_commit(txn_); CHECK_EQ(retval, MDB_SUCCESS) << "mdb_txn_commit failed " << mdb_strerror(retval); + + retval = mdb_txn_begin(env_, NULL, 0, &txn_); + CHECK_EQ(retval, MDB_SUCCESS) + << "mdb_txn_begin failed " << mdb_strerror(retval); } void LmdbDatabase::close() { LOG(INFO) << "LMDB: Close"; - if (env_ && dbi_ && txn_) { - this->commit(); - } - if (env_ && dbi_) { mdb_close(env_, dbi_); mdb_env_close(env_); diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index f981af40fdf..11f6fb820e6 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -35,8 +35,10 @@ int main(int argc, char** argv) { BlobProto sum_blob; int count = 0; // load first datum - const Database::buffer_t& first_blob = database->begin()->second; + Database::const_iterator iter = database->begin(); + const Database::buffer_t& first_blob = iter->second; datum.ParseFromArray(first_blob.data(), first_blob.size()); + iter = database->end(); sum_blob.set_num(1); sum_blob.set_channels(datum.channels()); From c7a5d8a4fbb3c6bf17130e75305fb5dabdc273f3 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Tue, 7 Oct 2014 22:10:20 -0400 Subject: [PATCH 0921/2053] data layer test was relying on the autocommit on close db behavior that was recently removed. --- src/caffe/test/test_data_layer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index c17f7295c3c..98ef1b96f24 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -61,6 +61,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { reinterpret_cast<unsigned char*>(value.data())); database->put(&key, &value); } + database->commit(); database->close(); } From b1150c9ad9c6091348618a714ad6d36b715b893f Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Wed, 8 Oct 2014 16:15:23 +0000 Subject: [PATCH 0922/2053] Updated cifar10 build script to specify db backend. --- examples/cifar10/create_cifar10.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/cifar10/create_cifar10.sh b/examples/cifar10/create_cifar10.sh index dfba7cca48a..b82fd3e3a06 100755 --- a/examples/cifar10/create_cifar10.sh +++ b/examples/cifar10/create_cifar10.sh @@ -3,16 +3,17 @@ EXAMPLE=examples/cifar10 DATA=data/cifar10 +DBTYPE=leveldb -echo "Creating leveldb..." +echo "Creating $DBTYPE..." -rm -rf $EXAMPLE/cifar10_train_leveldb $EXAMPLE/cifar10_test_leveldb +rm -rf $EXAMPLE/cifar10_train_$DBTYPE $EXAMPLE/cifar10_test_$DBTYPE -./build/examples/cifar10/convert_cifar_data.bin $DATA $EXAMPLE +./build/examples/cifar10/convert_cifar_data.bin $DATA $EXAMPLE $DBTYPE echo "Computing image mean..." -./build/tools/compute_image_mean $EXAMPLE/cifar10_train_leveldb \ - $EXAMPLE/mean.binaryproto leveldb +./build/tools/compute_image_mean $EXAMPLE/cifar10_train_$DBTYPE \ + $EXAMPLE/mean.binaryproto $DBTYPE echo "Done." From 5a559f55c38330f462c3e4258450e898deee016e Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Fri, 10 Oct 2014 19:47:50 -0400 Subject: [PATCH 0923/2053] Switched create_cifar10.sh output from leveldb to lmdb. --- examples/cifar10/create_cifar10.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cifar10/create_cifar10.sh b/examples/cifar10/create_cifar10.sh index b82fd3e3a06..ebfca46de87 100755 --- a/examples/cifar10/create_cifar10.sh +++ b/examples/cifar10/create_cifar10.sh @@ -3,7 +3,7 @@ EXAMPLE=examples/cifar10 DATA=data/cifar10 -DBTYPE=leveldb +DBTYPE=lmdb echo "Creating $DBTYPE..." From a1ea5ba4b2a6e1af9ef360aefd0c8ab777039a5b Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 14:15:17 -0400 Subject: [PATCH 0924/2053] Updated extract_features to take a leveldb/lmdb config option. --- examples/feature_extraction/readme.md | 2 +- tools/extract_features.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/feature_extraction/readme.md b/examples/feature_extraction/readme.md index c325ed482e5..6c8917e27e1 100644 --- a/examples/feature_extraction/readme.md +++ b/examples/feature_extraction/readme.md @@ -51,7 +51,7 @@ Extract Features Now everything necessary is in place. - ./build/tools/extract_features.bin models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10 + ./build/tools/extract_features.bin models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel examples/_temp/imagenet_val.prototxt fc7 examples/_temp/features 10 lmdb The name of feature blob that you extract is `fc7`, which represents the highest level feature of the reference model. We can use any other layer, as well, such as `conv5` or `pool3`. diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 1065d449a42..c4d1a39eb5b 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -32,15 +32,15 @@ int main(int argc, char** argv) { template<typename Dtype> int feature_extraction_pipeline(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); - const int num_required_args = 6; + const int num_required_args = 7; if (argc < num_required_args) { LOG(ERROR)<< "This program takes in a trained network and an input data layer, and then" " extract features of the input data produced by the net.\n" "Usage: extract_features pretrained_net_param" " feature_extraction_proto_file extract_feature_blob_name1[,name2,...]" - " save_feature_database_name1[,name2,...] num_mini_batches [CPU/GPU]" - " [DEVICE_ID=0]\n" + " save_feature_database_name1[,name2,...] num_mini_batches db_type" + " [CPU/GPU] [DEVICE_ID=0]\n" "Note: you can extract multiple features in one pass by specifying" " multiple feature blob names and database names seperated by ','." " The names cannot contain white space characters and the number of blobs" @@ -119,16 +119,16 @@ int feature_extraction_pipeline(int argc, char** argv) { << " in the network " << feature_extraction_proto; } + int num_mini_batches = atoi(argv[++arg_pos]); + std::vector<shared_ptr<Database> > feature_dbs; for (size_t i = 0; i < num_features; ++i) { LOG(INFO)<< "Opening database " << database_names[i]; - shared_ptr<Database> database = DatabaseFactory("leveldb"); + shared_ptr<Database> database = DatabaseFactory(argv[++arg_pos]); database->open(database_names.at(i), Database::New); feature_dbs.push_back(database); } - int num_mini_batches = atoi(argv[++arg_pos]); - LOG(ERROR)<< "Extacting Features"; Datum datum; From 8fef285e536a67a6b2c72b54734335aeb3069d59 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 14:39:31 -0400 Subject: [PATCH 0925/2053] Updated Database interface to use custom KV type rather than std::pair. Removed two buffer copies in dereference operation for DB iterators. --- include/caffe/database.hpp | 12 ++++++++---- include/caffe/leveldb_database.hpp | 4 ++-- include/caffe/lmdb_database.hpp | 4 ++-- src/caffe/layers/data_layer.cpp | 4 ++-- src/caffe/leveldb_database.cpp | 14 +++++++++----- src/caffe/lmdb_database.cpp | 13 ++++++++----- tools/compute_image_mean.cpp | 4 ++-- 7 files changed, 33 insertions(+), 22 deletions(-) diff --git a/include/caffe/database.hpp b/include/caffe/database.hpp index 23036a8e075..953b58cfa2e 100644 --- a/include/caffe/database.hpp +++ b/include/caffe/database.hpp @@ -21,6 +21,11 @@ class Database { typedef vector<char> buffer_t; + struct KV { + buffer_t key; + buffer_t value; + }; + virtual void open(const string& filename, Mode mode) = 0; virtual void put(buffer_t* key, buffer_t* value) = 0; virtual void commit() = 0; @@ -41,10 +46,9 @@ class Database { class DatabaseState; public: - class iterator : public std::iterator< - std::forward_iterator_tag, pair<buffer_t, buffer_t> > { + class iterator : public std::iterator<std::forward_iterator_tag, KV> { public: - typedef pair<buffer_t, buffer_t> T; + typedef KV T; typedef T value_type; typedef T& reference_type; typedef T* pointer_type; @@ -97,7 +101,7 @@ class Database { virtual bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const = 0; virtual void increment(shared_ptr<DatabaseState> state) const = 0; - virtual pair<buffer_t, buffer_t>& dereference( + virtual KV& dereference( shared_ptr<DatabaseState> state) const = 0; }; diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index dda669704bd..1c084cb070d 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -32,13 +32,13 @@ class LeveldbDatabase : public Database { iter_(iter) { } shared_ptr<leveldb::Iterator> iter_; - pair<buffer_t, buffer_t> kv_pair_; + KV kv_pair_; }; bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const; void increment(shared_ptr<DatabaseState> state) const; - pair<buffer_t, buffer_t>& dereference(shared_ptr<DatabaseState> state) const; + Database::KV& dereference(shared_ptr<DatabaseState> state) const; shared_ptr<leveldb::DB> db_; shared_ptr<leveldb::WriteBatch> batch_; diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index 96542227c9a..d72be3d4c66 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -36,13 +36,13 @@ class LmdbDatabase : public Database { cursor_(cursor) { } MDB_cursor* cursor_; - pair<buffer_t, buffer_t> kv_pair_; + KV kv_pair_; }; bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const; void increment(shared_ptr<DatabaseState> state) const; - pair<buffer_t, buffer_t>& dereference(shared_ptr<DatabaseState> state) const; + Database::KV& dereference(shared_ptr<DatabaseState> state) const; MDB_env *env_; MDB_dbi dbi_; diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 4d36b8ede42..998c00c3561 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -48,7 +48,7 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // Read a data point, and use it to initialize the top blob. CHECK(iter_ != database_->end()); Datum datum; - datum.ParseFromArray(iter_->second.data(), iter_->second.size()); + datum.ParseFromArray(iter_->value.data(), iter_->value.size()); // image int crop_size = this->layer_param_.transform_param().crop_size(); @@ -94,7 +94,7 @@ void DataLayer<Dtype>::InternalThreadEntry() { for (int item_id = 0; item_id < batch_size; ++item_id) { Datum datum; CHECK(iter_ != database_->end()); - datum.ParseFromArray(iter_->second.data(), iter_->second.size()); + datum.ParseFromArray(iter_->value.data(), iter_->value.size()); // Apply data transformations (mirror, scale, crop...) int offset = this->prefetch_data_.offset(item_id); diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index a5cdaa3b7f1..8084a6c4d8d 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -131,7 +131,7 @@ void LeveldbDatabase::increment(shared_ptr<DatabaseState> state) const { } } -pair<Database::buffer_t, Database::buffer_t>& LeveldbDatabase::dereference( +Database::KV& LeveldbDatabase::dereference( shared_ptr<DatabaseState> state) const { shared_ptr<LeveldbState> leveldb_state = boost::dynamic_pointer_cast<LeveldbState>(state); @@ -144,10 +144,14 @@ pair<Database::buffer_t, Database::buffer_t>& LeveldbDatabase::dereference( CHECK(iter->Valid()); - leveldb_state->kv_pair_ = make_pair( - buffer_t(iter->key().data(), iter->key().data() + iter->key().size()), - buffer_t(iter->value().data(), - iter->value().data() + iter->value().size())); + Database::buffer_t temp_key(buffer_t(iter->key().data(), + iter->key().data() + iter->key().size())); + + Database::buffer_t temp_value(buffer_t(iter->value().data(), + iter->value().data() + iter->value().size())); + + leveldb_state->kv_pair_.key.swap(temp_key); + leveldb_state->kv_pair_.value.swap(temp_value); return leveldb_state->kv_pair_; } diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index 08607789bb1..54d67d5442f 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -149,8 +149,7 @@ void LmdbDatabase::increment(shared_ptr<DatabaseState> state) const { } } -pair<Database::buffer_t, Database::buffer_t>& LmdbDatabase::dereference( - shared_ptr<DatabaseState> state) const { +Database::KV& LmdbDatabase::dereference(shared_ptr<DatabaseState> state) const { shared_ptr<LmdbState> lmdb_state = boost::dynamic_pointer_cast<LmdbState>(state); @@ -168,9 +167,13 @@ pair<Database::buffer_t, Database::buffer_t>& LmdbDatabase::dereference( char* key_data = reinterpret_cast<char*>(mdb_key.mv_data); char* value_data = reinterpret_cast<char*>(mdb_val.mv_data); - lmdb_state->kv_pair_ = make_pair( - buffer_t(key_data, key_data + mdb_key.mv_size), - buffer_t(value_data, value_data + mdb_val.mv_size)); + Database::buffer_t temp_key(key_data, key_data + mdb_key.mv_size); + + Database::buffer_t temp_value(value_data, + value_data + mdb_val.mv_size); + + lmdb_state->kv_pair_.key.swap(temp_key); + lmdb_state->kv_pair_.value.swap(temp_value); return lmdb_state->kv_pair_; } diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 11f6fb820e6..01e16c179b6 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -36,7 +36,7 @@ int main(int argc, char** argv) { int count = 0; // load first datum Database::const_iterator iter = database->begin(); - const Database::buffer_t& first_blob = iter->second; + const Database::buffer_t& first_blob = iter->value; datum.ParseFromArray(first_blob.data(), first_blob.size()); iter = database->end(); @@ -54,7 +54,7 @@ int main(int argc, char** argv) { for (Database::const_iterator iter = database->begin(); iter != database->end(); ++iter) { // just a dummy operation - const Database::buffer_t& blob = iter->second; + const Database::buffer_t& blob = iter->value; datum.ParseFromArray(blob.data(), blob.size()); const std::string& data = datum.data(); size_in_datum = std::max<int>(datum.data().size(), From be2df844221476a2f8ee5c1bb03258eadecac047 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 14:47:04 -0400 Subject: [PATCH 0926/2053] Added a couple of sanity checks to make sure the datum buffer sizes matched what we expected. --- tools/compute_image_mean.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 01e16c179b6..aaa324a02b3 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -62,10 +62,12 @@ int main(int argc, char** argv) { CHECK_EQ(size_in_datum, data_size) << "Incorrect data field size " << size_in_datum; if (data.size() != 0) { + CHECK_EQ(data.size(), size_in_datum); for (int i = 0; i < size_in_datum; ++i) { sum_blob.set_data(i, sum_blob.data(i) + (uint8_t)data[i]); } } else { + CHECK_EQ(datum.float_data_size(), size_in_datum); for (int i = 0; i < size_in_datum; ++i) { sum_blob.set_data(i, sum_blob.data(i) + static_cast<float>(datum.float_data(i))); From c31e4446884262ff3c68e5d2adf7afd5050771e4 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 16:31:17 -0400 Subject: [PATCH 0927/2053] Added get interface to Database. Added test cases for Database. Fixed a few bugs related to ReadOnly mode in Database in order to pass test cases. --- include/caffe/database.hpp | 1 + include/caffe/leveldb_database.hpp | 2 + include/caffe/lmdb_database.hpp | 5 +- src/caffe/leveldb_database.cpp | 22 ++ src/caffe/lmdb_database.cpp | 44 ++- src/caffe/test/test_database.cpp | 590 +++++++++++++++++++++++++++++ 6 files changed, 658 insertions(+), 6 deletions(-) create mode 100644 src/caffe/test/test_database.cpp diff --git a/include/caffe/database.hpp b/include/caffe/database.hpp index 953b58cfa2e..c61ab51f06c 100644 --- a/include/caffe/database.hpp +++ b/include/caffe/database.hpp @@ -28,6 +28,7 @@ class Database { virtual void open(const string& filename, Mode mode) = 0; virtual void put(buffer_t* key, buffer_t* value) = 0; + virtual void get(buffer_t* key, buffer_t* value) = 0; virtual void commit() = 0; virtual void close() = 0; diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index 1c084cb070d..42f73f98f2a 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -16,6 +16,7 @@ class LeveldbDatabase : public Database { public: void open(const string& filename, Mode mode); void put(buffer_t* key, buffer_t* value); + void get(buffer_t* key, buffer_t* value); void commit(); void close(); @@ -42,6 +43,7 @@ class LeveldbDatabase : public Database { shared_ptr<leveldb::DB> db_; shared_ptr<leveldb::WriteBatch> batch_; + bool read_only_; }; } // namespace caffe diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index d72be3d4c66..4796b4dc73b 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -20,6 +20,7 @@ class LmdbDatabase : public Database { void open(const string& filename, Mode mode); void put(buffer_t* key, buffer_t* value); + void get(buffer_t* key, buffer_t* value); void commit(); void close(); @@ -44,9 +45,9 @@ class LmdbDatabase : public Database { void increment(shared_ptr<DatabaseState> state) const; Database::KV& dereference(shared_ptr<DatabaseState> state) const; - MDB_env *env_; + MDB_env* env_; MDB_dbi dbi_; - MDB_txn *txn_; + MDB_txn* txn_; }; } // namespace caffe diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index 8084a6c4d8d..d2b37e6aa15 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -14,16 +14,19 @@ void LeveldbDatabase::open(const string& filename, Mode mode) { LOG(INFO) << " mode NEW"; options.error_if_exists = true; options.create_if_missing = true; + read_only_ = false; break; case ReadWrite: LOG(INFO) << " mode RW"; options.error_if_exists = false; options.create_if_missing = true; + read_only_ = false; break; case ReadOnly: LOG(INFO) << " mode RO"; options.error_if_exists = false; options.create_if_missing = false; + read_only_ = true; break; default: LOG(FATAL) << "unknown mode " << mode; @@ -45,6 +48,8 @@ void LeveldbDatabase::open(const string& filename, Mode mode) { void LeveldbDatabase::put(buffer_t* key, buffer_t* value) { LOG(INFO) << "LevelDB: Put"; + CHECK(!read_only_); + CHECK_NOTNULL(batch_.get()); leveldb::Slice key_slice(key->data(), key->size()); @@ -53,9 +58,26 @@ void LeveldbDatabase::put(buffer_t* key, buffer_t* value) { batch_->Put(key_slice, value_slice); } +void LeveldbDatabase::get(buffer_t* key, buffer_t* value) { + LOG(INFO) << "LevelDB: Get"; + + leveldb::Slice key_slice(key->data(), key->size()); + + string value_string; + leveldb::Status status = + db_->Get(leveldb::ReadOptions(), key_slice, &value_string); + CHECK(status.ok()) << "leveldb get failed"; + + Database::buffer_t temp_value(value_string.data(), + value_string.data() + value_string.size()); + value->swap(temp_value); +} + void LeveldbDatabase::commit() { LOG(INFO) << "LevelDB: Commit"; + CHECK(!read_only_); + CHECK_NOTNULL(db_.get()); CHECK_NOTNULL(batch_.get()); diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index 54d67d5442f..952e95a62d8 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -14,12 +14,24 @@ void LmdbDatabase::open(const string& filename, Mode mode) { CHECK(NULL == txn_); CHECK_EQ(0, dbi_); - if (mode == New) { - CHECK_EQ(mkdir(filename.c_str(), 0744), 0) << "mkdir " << filename - << " failed"; + int retval; + if (mode != ReadOnly) { + retval = mkdir(filename.c_str(), 0744); + switch (mode) { + case New: + CHECK_EQ(0, retval) << "mkdir " << filename << " failed"; + break; + case ReadWrite: + if (-1 == retval) { + CHECK_EQ(EEXIST, errno) << "mkdir " << filename << " failed (" + << strerror(errno) << ")"; + } + break; + default: + LOG(FATAL) << "Invalid mode " << mode; + } } - int retval; retval = mdb_env_create(&env_); CHECK_EQ(retval, MDB_SUCCESS) << "mdb_env_create failed " << mdb_strerror(retval); @@ -61,6 +73,30 @@ void LmdbDatabase::put(buffer_t* key, buffer_t* value) { << "mdb_put failed " << mdb_strerror(retval); } +void LmdbDatabase::get(buffer_t* key, buffer_t* value) { + LOG(INFO) << "LMDB: Get"; + + MDB_val mdbkey, mdbdata; + mdbkey.mv_data = key->data(); + mdbkey.mv_size = key->size(); + + int retval; + MDB_txn* get_txn; + retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &get_txn); + CHECK_EQ(MDB_SUCCESS, retval) << "mdb_txn_begin failed " + << mdb_strerror(retval); + + retval = mdb_get(get_txn, dbi_, &mdbkey, &mdbdata); + CHECK_EQ(MDB_SUCCESS, retval) << "mdb_get failed " << mdb_strerror(retval); + + mdb_txn_abort(get_txn); + + Database::buffer_t temp_value(reinterpret_cast<char*>(mdbdata.mv_data), + reinterpret_cast<char*>(mdbdata.mv_data) + mdbdata.mv_size); + + value->swap(temp_value); +} + void LmdbDatabase::commit() { LOG(INFO) << "LMDB: Commit"; diff --git a/src/caffe/test/test_database.cpp b/src/caffe/test/test_database.cpp new file mode 100644 index 00000000000..dce92d88b5d --- /dev/null +++ b/src/caffe/test/test_database.cpp @@ -0,0 +1,590 @@ +#include <string> +#include <vector> + +#include "caffe/util/io.hpp" + +#include "gtest/gtest.h" + +#include "caffe/database_factory.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +template <typename TypeParam> +class DatabaseTest : public MultiDeviceTest<TypeParam> { + typedef typename TypeParam::Dtype Dtype; + + protected: + string DBName() { + string filename; + MakeTempDir(&filename); + filename += "/db"; + return filename; + } + + Database::buffer_t TestKey() { + const char* kKey = "hello"; + Database::buffer_t key(kKey, kKey + 5); + return key; + } + + Database::buffer_t TestValue() { + const char* kValue = "world"; + Database::buffer_t value(kValue, kValue + 5); + return value; + } +}; + +TYPED_TEST_CASE(DatabaseTest, TestDtypesAndDevices); + +TYPED_TEST(DatabaseTest, TestNewDoesntExistLevelDBPasses) { + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(this->DBName(), Database::New); + database->close(); +} + +TYPED_TEST(DatabaseTest, TestNewExistsFailsLevelDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + database->close(); + + EXPECT_DEATH(database->open(name, Database::New), ""); +} + +TYPED_TEST(DatabaseTest, TestReadOnlyExistsLevelDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + database->close(); + + database->open(name, Database::ReadOnly); + database->close(); +} + +TYPED_TEST(DatabaseTest, TestReadOnlyDoesntExistFailsLevelDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + EXPECT_DEATH(database->open(name, Database::ReadOnly), ""); +} + +TYPED_TEST(DatabaseTest, TestReadWriteExistsLevelDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + database->close(); + + database->open(name, Database::ReadWrite); + database->close(); +} + +TYPED_TEST(DatabaseTest, TestReadWriteDoesntExistLevelDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::ReadWrite); + database->close(); +} + +TYPED_TEST(DatabaseTest, TestIteratorsLevelDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + const int kNumExamples = 4; + for (int i = 0; i < kNumExamples; ++i) { + stringstream ss; + ss << i; + string key = ss.str(); + ss << " here be data"; + string value = ss.str(); + Database::buffer_t key_buf(key.data(), key.data() + key.size()); + Database::buffer_t val_buf(value.data(), value.data() + value.size()); + database->put(&key_buf, &val_buf); + } + database->commit(); + + int count = 0; + for (Database::const_iterator iter = database->begin(); + iter != database->end(); ++iter) { + (void)iter; + ++count; + } + + EXPECT_EQ(kNumExamples, count); +} + +TYPED_TEST(DatabaseTest, TestNewPutLevelDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->commit(); + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestNewCommitLevelDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + database->commit(); + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestNewGetLevelDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->commit(); + + Database::buffer_t new_val; + + database->get(&key, &new_val); + + EXPECT_EQ(val.size(), new_val.size()); + for (size_t i = 0; i < val.size(); ++i) { + EXPECT_EQ(val.at(i), new_val.at(i)); + } + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestNewGetNoCommitLevelDBFails) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + Database::buffer_t new_val; + + EXPECT_DEATH(database->get(&key, &new_val), ""); +} + + +TYPED_TEST(DatabaseTest, TestReadWritePutLevelDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::ReadWrite); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->commit(); + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestReadWriteCommitLevelDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::ReadWrite); + + database->commit(); + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestReadWriteGetLevelDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->commit(); + + Database::buffer_t new_val; + + database->get(&key, &new_val); + + EXPECT_EQ(val.size(), new_val.size()); + for (size_t i = 0; i < val.size(); ++i) { + EXPECT_EQ(val.at(i), new_val.at(i)); + } + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitLevelDBFails) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + Database::buffer_t new_val; + + EXPECT_DEATH(database->get(&key, &new_val), ""); +} + +TYPED_TEST(DatabaseTest, TestReadOnlyPutLevelDBFails) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + database->close(); + + database->open(name, Database::ReadOnly); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + EXPECT_DEATH(database->put(&key, &val), ""); +} + +TYPED_TEST(DatabaseTest, TestReadOnlyCommitLevelDBFails) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + database->close(); + + database->open(name, Database::ReadOnly); + + EXPECT_DEATH(database->commit(), ""); +} + +TYPED_TEST(DatabaseTest, TestReadOnlyGetLevelDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->commit(); + + database->close(); + + database->open(name, Database::ReadOnly); + + Database::buffer_t new_val; + + database->get(&key, &new_val); + + EXPECT_EQ(val.size(), new_val.size()); + for (size_t i = 0; i < val.size(); ++i) { + EXPECT_EQ(val.at(i), new_val.at(i)); + } +} + +TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLevelDBFails) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->close(); + + database->open(name, Database::ReadOnly); + + Database::buffer_t new_val; + + EXPECT_DEATH(database->get(&key, &new_val), ""); +} + +TYPED_TEST(DatabaseTest, TestNewDoesntExistLMDBPasses) { + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(this->DBName(), Database::New); + database->close(); +} + +TYPED_TEST(DatabaseTest, TestNewExistsFailsLMDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + database->close(); + + EXPECT_DEATH(database->open(name, Database::New), ""); +} + +TYPED_TEST(DatabaseTest, TestReadOnlyExistsLMDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + database->close(); + + database->open(name, Database::ReadOnly); + database->close(); +} + +TYPED_TEST(DatabaseTest, TestReadOnlyDoesntExistFailsLMDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + EXPECT_DEATH(database->open(name, Database::ReadOnly), ""); +} + +TYPED_TEST(DatabaseTest, TestReadWriteExistsLMDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + database->close(); + + database->open(name, Database::ReadWrite); + database->close(); +} + +TYPED_TEST(DatabaseTest, TestReadWriteDoesntExistLMDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::ReadWrite); + database->close(); +} + +TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + const int kNumExamples = 4; + for (int i = 0; i < kNumExamples; ++i) { + stringstream ss; + ss << i; + string key = ss.str(); + ss << " here be data"; + string value = ss.str(); + Database::buffer_t key_buf(key.data(), key.data() + key.size()); + Database::buffer_t val_buf(value.data(), value.data() + value.size()); + database->put(&key_buf, &val_buf); + } + database->commit(); + + int count = 0; + for (Database::const_iterator iter = database->begin(); + iter != database->end(); ++iter) { + (void)iter; + ++count; + } + + EXPECT_EQ(kNumExamples, count); +} + +TYPED_TEST(DatabaseTest, TestNewPutLMDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->commit(); + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestNewCommitLMDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + database->commit(); + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestNewGetLMDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->commit(); + + Database::buffer_t new_val; + + database->get(&key, &new_val); + + EXPECT_EQ(val.size(), new_val.size()); + for (size_t i = 0; i < val.size(); ++i) { + EXPECT_EQ(val.at(i), new_val.at(i)); + } + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestNewGetNoCommitLMDBFails) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + Database::buffer_t new_val; + + EXPECT_DEATH(database->get(&key, &new_val), ""); +} + +TYPED_TEST(DatabaseTest, TestReadWritePutLMDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::ReadWrite); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->commit(); + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestReadWriteCommitLMDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::ReadWrite); + + database->commit(); + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestReadWriteGetLMDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->commit(); + + Database::buffer_t new_val; + + database->get(&key, &new_val); + + EXPECT_EQ(val.size(), new_val.size()); + for (size_t i = 0; i < val.size(); ++i) { + EXPECT_EQ(val.at(i), new_val.at(i)); + } + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitLMDBFails) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + Database::buffer_t new_val; + + EXPECT_DEATH(database->get(&key, &new_val), ""); +} + +TYPED_TEST(DatabaseTest, TestReadOnlyPutLMDBFails) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + database->close(); + + database->open(name, Database::ReadOnly); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + EXPECT_DEATH(database->put(&key, &val), ""); +} + +TYPED_TEST(DatabaseTest, TestReadOnlyCommitLMDBFails) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + database->close(); + + database->open(name, Database::ReadOnly); + + EXPECT_DEATH(database->commit(), ""); +} + +TYPED_TEST(DatabaseTest, TestReadOnlyGetLMDBPasses) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->commit(); + + database->close(); + + database->open(name, Database::ReadOnly); + + Database::buffer_t new_val; + + database->get(&key, &new_val); + + EXPECT_EQ(val.size(), new_val.size()); + for (size_t i = 0; i < val.size(); ++i) { + EXPECT_EQ(val.at(i), new_val.at(i)); + } +} + +TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLMDBFails) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + Database::buffer_t key = this->TestKey(); + Database::buffer_t val = this->TestValue(); + + database->put(&key, &val); + + database->close(); + + database->open(name, Database::ReadOnly); + + Database::buffer_t new_val; + + EXPECT_DEATH(database->get(&key, &new_val), ""); +} + +} // namespace caffe From c86ed418b9e9a89a98de9c5d339a595ac7ebc3c2 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 18:43:44 -0400 Subject: [PATCH 0928/2053] Added some tests for the Database iterator interface. Updated the post-increment operator so that it forks off a copy of the LevelDB or LMDB iterator/cursor when necessary. Neither of these APIs allow you to directly copy an iterator or cursor, so I create a new iterator and seek to the key that the previous one was currently on. This means the pre-increment operator can be much cheaper than the post-increment operator. --- include/caffe/database.hpp | 15 ++ include/caffe/leveldb_database.hpp | 18 ++- include/caffe/lmdb_database.hpp | 28 +++- src/caffe/leveldb_database.cpp | 4 +- src/caffe/lmdb_database.cpp | 4 +- src/caffe/test/test_database.cpp | 218 +++++++++++++++++++++++++---- 6 files changed, 256 insertions(+), 31 deletions(-) diff --git a/include/caffe/database.hpp b/include/caffe/database.hpp index c61ab51f06c..08baf2fea92 100644 --- a/include/caffe/database.hpp +++ b/include/caffe/database.hpp @@ -62,6 +62,20 @@ class Database { state_(state) { } ~iterator() { } + iterator(const iterator& other) + : parent_(other.parent_), + state_(other.state_->clone()) { } + + iterator& operator=(iterator copy) { + copy.swap(*this); + return *this; + } + + void swap(iterator& other) throw() { + std::swap(this->parent_, other.parent_); + std::swap(this->state_, other.state_); + } + bool operator==(const iterator& other) const { return parent_->equal(state_, other.state_); } @@ -97,6 +111,7 @@ class Database { class DatabaseState { public: virtual ~DatabaseState() { } + virtual shared_ptr<DatabaseState> clone() = 0; }; virtual bool equal(shared_ptr<DatabaseState> state1, diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index 42f73f98f2a..03bfd38a437 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -28,10 +28,26 @@ class LeveldbDatabase : public Database { protected: class LeveldbState : public Database::DatabaseState { public: - explicit LeveldbState(shared_ptr<leveldb::Iterator> iter) + explicit LeveldbState(shared_ptr<leveldb::DB> db, + shared_ptr<leveldb::Iterator> iter) : Database::DatabaseState(), + db_(db), iter_(iter) { } + shared_ptr<DatabaseState> clone() { + shared_ptr<leveldb::Iterator> new_iter; + + if (iter_.get()) { + new_iter.reset(db_->NewIterator(leveldb::ReadOptions())); + CHECK(iter_->Valid()); + new_iter->Seek(iter_->key()); + CHECK(new_iter->Valid()); + } + + return shared_ptr<DatabaseState>(new LeveldbState(db_, new_iter)); + } + + shared_ptr<leveldb::DB> db_; shared_ptr<leveldb::Iterator> iter_; KV kv_pair_; }; diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index 4796b4dc73b..7b532f8161a 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -32,11 +32,35 @@ class LmdbDatabase : public Database { protected: class LmdbState : public Database::DatabaseState { public: - explicit LmdbState(MDB_cursor* cursor) + explicit LmdbState(MDB_cursor* cursor, MDB_txn* txn, const MDB_dbi* dbi) : Database::DatabaseState(), - cursor_(cursor) { } + cursor_(cursor), + txn_(txn), + dbi_(dbi) { } + + shared_ptr<DatabaseState> clone() { + MDB_cursor* new_cursor; + + if (cursor_) { + int retval; + retval = mdb_cursor_open(txn_, *dbi_, &new_cursor); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); + MDB_val key; + MDB_val val; + retval = mdb_cursor_get(cursor_, &key, &val, MDB_GET_CURRENT); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); + retval = mdb_cursor_get(new_cursor, &key, &val, MDB_SET); + CHECK_EQ(MDB_SUCCESS, retval) << mdb_strerror(retval); + } else { + new_cursor = cursor_; + } + + return shared_ptr<DatabaseState>(new LmdbState(new_cursor, txn_, dbi_)); + } MDB_cursor* cursor_; + MDB_txn* txn_; + const MDB_dbi* dbi_; KV kv_pair_; }; diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index d2b37e6aa15..51d50cce5c0 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -99,13 +99,13 @@ LeveldbDatabase::const_iterator LeveldbDatabase::begin() const { if (!iter->Valid()) { iter.reset(); } - shared_ptr<DatabaseState> state(new LeveldbState(iter)); + shared_ptr<DatabaseState> state(new LeveldbState(db_, iter)); return const_iterator(this, state); } LeveldbDatabase::const_iterator LeveldbDatabase::end() const { shared_ptr<leveldb::Iterator> iter; - shared_ptr<DatabaseState> state(new LeveldbState(iter)); + shared_ptr<DatabaseState> state(new LeveldbState(db_, iter)); return const_iterator(this, state); } diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index 952e95a62d8..a546c8c5259 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -134,12 +134,12 @@ LmdbDatabase::const_iterator LmdbDatabase::begin() const { retval = mdb_cursor_get(cursor, &key, &val, MDB_FIRST); CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - shared_ptr<DatabaseState> state(new LmdbState(cursor)); + shared_ptr<DatabaseState> state(new LmdbState(cursor, txn_, &dbi_)); return const_iterator(this, state); } LmdbDatabase::const_iterator LmdbDatabase::end() const { - shared_ptr<DatabaseState> state(new LmdbState(NULL)); + shared_ptr<DatabaseState> state(new LmdbState(NULL, txn_, &dbi_)); return const_iterator(this, state); } diff --git a/src/caffe/test/test_database.cpp b/src/caffe/test/test_database.cpp index dce92d88b5d..5d5f4ea79c4 100644 --- a/src/caffe/test/test_database.cpp +++ b/src/caffe/test/test_database.cpp @@ -34,6 +34,32 @@ class DatabaseTest : public MultiDeviceTest<TypeParam> { Database::buffer_t value(kValue, kValue + 5); return value; } + + Database::buffer_t TestAltKey() { + const char* kKey = "foo"; + Database::buffer_t key(kKey, kKey + 3); + return key; + } + + Database::buffer_t TestAltValue() { + const char* kValue = "bar"; + Database::buffer_t value(kValue, kValue + 3); + return value; + } + + bool BufferEq(const Database::buffer_t& buf1, + const Database::buffer_t& buf2) { + if (buf1.size() != buf2.size()) { + return false; + } + for (size_t i = 0; i < buf1.size(); ++i) { + if (buf1.at(i) != buf2.at(i)) { + return false; + } + } + + return true; + } }; TYPED_TEST_CASE(DatabaseTest, TestDtypesAndDevices); @@ -114,6 +140,87 @@ TYPED_TEST(DatabaseTest, TestIteratorsLevelDB) { EXPECT_EQ(kNumExamples, count); } +TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLevelDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + Database::buffer_t key1 = this->TestAltKey(); + Database::buffer_t value1 = this->TestAltValue(); + + Database::buffer_t key2 = this->TestKey(); + Database::buffer_t value2 = this->TestValue(); + + database->put(&key1, &value1); + database->put(&key2, &value2); + database->commit(); + + Database::const_iterator iter1 = database->begin(); + + EXPECT_FALSE(database->end() == iter1); + + EXPECT_TRUE(this->BufferEq(iter1->key, key1)); + + Database::const_iterator iter2 = ++iter1; + + EXPECT_FALSE(database->end() == iter1); + EXPECT_FALSE(database->end() == iter2); + + EXPECT_TRUE(this->BufferEq(iter2->key, key2)); + + Database::const_iterator iter3 = ++iter2; + + EXPECT_TRUE(database->end() == iter3); + + iter1 = database->end(); + iter2 = database->end(); + iter3 = database->end(); + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLevelDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + database->open(name, Database::New); + + Database::buffer_t key1 = this->TestAltKey(); + Database::buffer_t value1 = this->TestAltValue(); + + Database::buffer_t key2 = this->TestKey(); + Database::buffer_t value2 = this->TestValue(); + + database->put(&key1, &value1); + database->put(&key2, &value2); + database->commit(); + + Database::const_iterator iter1 = database->begin(); + + EXPECT_FALSE(database->end() == iter1); + + EXPECT_TRUE(this->BufferEq(iter1->key, key1)); + + Database::const_iterator iter2 = iter1++; + + EXPECT_FALSE(database->end() == iter1); + EXPECT_FALSE(database->end() == iter2); + + EXPECT_TRUE(this->BufferEq(iter2->key, key1)); + EXPECT_TRUE(this->BufferEq(iter1->key, key2)); + + Database::const_iterator iter3 = iter1++; + + EXPECT_FALSE(database->end() == iter3); + EXPECT_TRUE(this->BufferEq(iter3->key, key2)); + EXPECT_TRUE(database->end() == iter1); + + iter1 = database->end(); + iter2 = database->end(); + iter3 = database->end(); + + database->close(); +} + TYPED_TEST(DatabaseTest, TestNewPutLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); @@ -155,10 +262,7 @@ TYPED_TEST(DatabaseTest, TestNewGetLevelDBPasses) { database->get(&key, &new_val); - EXPECT_EQ(val.size(), new_val.size()); - for (size_t i = 0; i < val.size(); ++i) { - EXPECT_EQ(val.at(i), new_val.at(i)); - } + EXPECT_TRUE(this->BufferEq(val, new_val)); database->close(); } @@ -220,10 +324,7 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetLevelDBPasses) { database->get(&key, &new_val); - EXPECT_EQ(val.size(), new_val.size()); - for (size_t i = 0; i < val.size(); ++i) { - EXPECT_EQ(val.at(i), new_val.at(i)); - } + EXPECT_TRUE(this->BufferEq(val, new_val)); database->close(); } @@ -288,10 +389,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLevelDBPasses) { database->get(&key, &new_val); - EXPECT_EQ(val.size(), new_val.size()); - for (size_t i = 0; i < val.size(); ++i) { - EXPECT_EQ(val.at(i), new_val.at(i)); - } + EXPECT_TRUE(this->BufferEq(val, new_val)); } TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLevelDBFails) { @@ -389,6 +487,87 @@ TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { EXPECT_EQ(kNumExamples, count); } +TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLMDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + Database::buffer_t key1 = this->TestAltKey(); + Database::buffer_t value1 = this->TestAltValue(); + + Database::buffer_t key2 = this->TestKey(); + Database::buffer_t value2 = this->TestValue(); + + database->put(&key1, &value1); + database->put(&key2, &value2); + database->commit(); + + Database::const_iterator iter1 = database->begin(); + + EXPECT_FALSE(database->end() == iter1); + + EXPECT_TRUE(this->BufferEq(iter1->key, key1)); + + Database::const_iterator iter2 = ++iter1; + + EXPECT_FALSE(database->end() == iter1); + EXPECT_FALSE(database->end() == iter2); + + EXPECT_TRUE(this->BufferEq(iter2->key, key2)); + + Database::const_iterator iter3 = ++iter2; + + EXPECT_TRUE(database->end() == iter3); + + iter1 = database->end(); + iter2 = database->end(); + iter3 = database->end(); + + database->close(); +} + +TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLMDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + database->open(name, Database::New); + + Database::buffer_t key1 = this->TestAltKey(); + Database::buffer_t value1 = this->TestAltValue(); + + Database::buffer_t key2 = this->TestKey(); + Database::buffer_t value2 = this->TestValue(); + + database->put(&key1, &value1); + database->put(&key2, &value2); + database->commit(); + + Database::const_iterator iter1 = database->begin(); + + EXPECT_FALSE(database->end() == iter1); + + EXPECT_TRUE(this->BufferEq(iter1->key, key1)); + + Database::const_iterator iter2 = iter1++; + + EXPECT_FALSE(database->end() == iter1); + EXPECT_FALSE(database->end() == iter2); + + EXPECT_TRUE(this->BufferEq(iter2->key, key1)); + EXPECT_TRUE(this->BufferEq(iter1->key, key2)); + + Database::const_iterator iter3 = iter1++; + + EXPECT_FALSE(database->end() == iter3); + EXPECT_TRUE(this->BufferEq(iter3->key, key2)); + EXPECT_TRUE(database->end() == iter1); + + iter1 = database->end(); + iter2 = database->end(); + iter3 = database->end(); + + database->close(); +} + TYPED_TEST(DatabaseTest, TestNewPutLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); @@ -430,10 +609,7 @@ TYPED_TEST(DatabaseTest, TestNewGetLMDBPasses) { database->get(&key, &new_val); - EXPECT_EQ(val.size(), new_val.size()); - for (size_t i = 0; i < val.size(); ++i) { - EXPECT_EQ(val.at(i), new_val.at(i)); - } + EXPECT_TRUE(this->BufferEq(val, new_val)); database->close(); } @@ -494,10 +670,7 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetLMDBPasses) { database->get(&key, &new_val); - EXPECT_EQ(val.size(), new_val.size()); - for (size_t i = 0; i < val.size(); ++i) { - EXPECT_EQ(val.at(i), new_val.at(i)); - } + EXPECT_TRUE(this->BufferEq(val, new_val)); database->close(); } @@ -562,10 +735,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLMDBPasses) { database->get(&key, &new_val); - EXPECT_EQ(val.size(), new_val.size()); - for (size_t i = 0; i < val.size(); ++i) { - EXPECT_EQ(val.at(i), new_val.at(i)); - } + EXPECT_TRUE(this->BufferEq(val, new_val)); } TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLMDBFails) { From 73b16e43e4376207ddc30b5772ed4a3f5dba88d9 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 20:20:31 -0400 Subject: [PATCH 0929/2053] Updated Database interface so that rather than CHECKing for certain conditions inside open, put, get, and commit, these functions return a bool indicating whether or not the operation was successful or a failure. This means the caller is now responsible for error checking. --- examples/cifar10/convert_cifar_data.cpp | 16 +- include/caffe/database.hpp | 8 +- include/caffe/leveldb_database.hpp | 8 +- include/caffe/lmdb_database.hpp | 8 +- src/caffe/layers/data_layer.cpp | 5 +- src/caffe/leveldb_database.cpp | 43 ++++- src/caffe/lmdb_database.cpp | 88 ++++++--- src/caffe/test/test_data_layer.cpp | 6 +- src/caffe/test/test_database.cpp | 236 ++++++++++++------------ tools/compute_image_mean.cpp | 2 +- tools/convert_imageset.cpp | 8 +- tools/extract_features.cpp | 8 +- 12 files changed, 249 insertions(+), 187 deletions(-) diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index c4930878405..b29e4121bf5 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -38,8 +38,8 @@ void read_image(std::ifstream* file, int* label, char* buffer) { void convert_dataset(const string& input_folder, const string& output_folder, const string& db_type) { shared_ptr<Database> train_database = DatabaseFactory(db_type); - train_database->open(output_folder + "/cifar10_train_" + db_type, - Database::New); + CHECK(train_database->open(output_folder + "/cifar10_train_" + db_type, + Database::New)); // Data buffer int label; char str_buffer[kCIFARImageNBytes]; @@ -66,16 +66,16 @@ void convert_dataset(const string& input_folder, const string& output_folder, int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", fileid * kCIFARBatchSize + itemid); Database::buffer_t key(str_buffer, str_buffer + length); - train_database->put(&key, &value); + CHECK(train_database->put(&key, &value)); } } - train_database->commit(); + CHECK(train_database->commit()); train_database->close(); LOG(INFO) << "Writing Testing data"; shared_ptr<Database> test_database = DatabaseFactory(db_type); - test_database->open(output_folder + "/cifar10_test_" + db_type, - Database::New); + CHECK(test_database->open(output_folder + "/cifar10_test_" + db_type, + Database::New)); // Open files std::ifstream data_file((input_folder + "/test_batch.bin").c_str(), std::ios::in | std::ios::binary); @@ -89,9 +89,9 @@ void convert_dataset(const string& input_folder, const string& output_folder, reinterpret_cast<unsigned char*>(value.data())); int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid); Database::buffer_t key(str_buffer, str_buffer + length); - test_database->put(&key, &value); + CHECK(test_database->put(&key, &value)); } - test_database->commit(); + CHECK(test_database->commit()); test_database->close(); } diff --git a/include/caffe/database.hpp b/include/caffe/database.hpp index 08baf2fea92..148b1ed7f38 100644 --- a/include/caffe/database.hpp +++ b/include/caffe/database.hpp @@ -26,10 +26,10 @@ class Database { buffer_t value; }; - virtual void open(const string& filename, Mode mode) = 0; - virtual void put(buffer_t* key, buffer_t* value) = 0; - virtual void get(buffer_t* key, buffer_t* value) = 0; - virtual void commit() = 0; + virtual bool open(const string& filename, Mode mode) = 0; + virtual bool put(buffer_t* key, buffer_t* value) = 0; + virtual bool get(buffer_t* key, buffer_t* value) = 0; + virtual bool commit() = 0; virtual void close() = 0; Database() { } diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index 03bfd38a437..64bfa7cebee 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -14,10 +14,10 @@ namespace caffe { class LeveldbDatabase : public Database { public: - void open(const string& filename, Mode mode); - void put(buffer_t* key, buffer_t* value); - void get(buffer_t* key, buffer_t* value); - void commit(); + bool open(const string& filename, Mode mode); + bool put(buffer_t* key, buffer_t* value); + bool get(buffer_t* key, buffer_t* value); + bool commit(); void close(); const_iterator begin() const; diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index 7b532f8161a..69e3ce0f03d 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -18,10 +18,10 @@ class LmdbDatabase : public Database { dbi_(0), txn_(NULL) { } - void open(const string& filename, Mode mode); - void put(buffer_t* key, buffer_t* value); - void get(buffer_t* key, buffer_t* value); - void commit(); + bool open(const string& filename, Mode mode); + bool put(buffer_t* key, buffer_t* value); + bool get(buffer_t* key, buffer_t* value); + bool commit(); void close(); const_iterator begin() const; diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 998c00c3561..dcba10fabec 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -30,8 +30,9 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // Initialize DB database_ = DatabaseFactory(this->layer_param_.data_param().backend()); - LOG(INFO) << "Opening database " << this->layer_param_.data_param().source(); - database_->open(this->layer_param_.data_param().source(), Database::ReadOnly); + const string& source = this->layer_param_.data_param().source(); + LOG(INFO) << "Opening database " << source; + CHECK(database_->open(source, Database::ReadOnly)); iter_ = database_->begin(); // Check if we would need to randomly skip a few data points diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index 51d50cce5c0..d7506edf74e 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -5,7 +5,7 @@ namespace caffe { -void LeveldbDatabase::open(const string& filename, Mode mode) { +bool LeveldbDatabase::open(const string& filename, Mode mode) { LOG(INFO) << "LevelDB: Open " << filename; leveldb::Options options; @@ -40,15 +40,24 @@ void LeveldbDatabase::open(const string& filename, Mode mode) { leveldb::Status status = leveldb::DB::Open( options, filename, &db); db_.reset(db); - CHECK(status.ok()) << "Failed to open leveldb " << filename - << ". Is it already existing?"; + + if (!status.ok()) { + LOG(ERROR) << "Failed to open leveldb " << filename + << ". Is it already existing?"; + return false; + } + batch_.reset(new leveldb::WriteBatch()); + return true; } -void LeveldbDatabase::put(buffer_t* key, buffer_t* value) { +bool LeveldbDatabase::put(buffer_t* key, buffer_t* value) { LOG(INFO) << "LevelDB: Put"; - CHECK(!read_only_); + if (read_only_) { + LOG(ERROR) << "put can not be used on a database in ReadOnly mode"; + return false; + } CHECK_NOTNULL(batch_.get()); @@ -56,9 +65,11 @@ void LeveldbDatabase::put(buffer_t* key, buffer_t* value) { leveldb::Slice value_slice(value->data(), value->size()); batch_->Put(key_slice, value_slice); + + return true; } -void LeveldbDatabase::get(buffer_t* key, buffer_t* value) { +bool LeveldbDatabase::get(buffer_t* key, buffer_t* value) { LOG(INFO) << "LevelDB: Get"; leveldb::Slice key_slice(key->data(), key->size()); @@ -66,23 +77,35 @@ void LeveldbDatabase::get(buffer_t* key, buffer_t* value) { string value_string; leveldb::Status status = db_->Get(leveldb::ReadOptions(), key_slice, &value_string); - CHECK(status.ok()) << "leveldb get failed"; + + if (!status.ok()) { + LOG(ERROR) << "leveldb get failed"; + return false; + } Database::buffer_t temp_value(value_string.data(), value_string.data() + value_string.size()); value->swap(temp_value); + + return true; } -void LeveldbDatabase::commit() { +bool LeveldbDatabase::commit() { LOG(INFO) << "LevelDB: Commit"; - CHECK(!read_only_); + if (read_only_) { + LOG(ERROR) << "commit can not be used on a database in ReadOnly mode"; + return false; + } CHECK_NOTNULL(db_.get()); CHECK_NOTNULL(batch_.get()); - db_->Write(leveldb::WriteOptions(), batch_.get()); + leveldb::Status status = db_->Write(leveldb::WriteOptions(), batch_.get()); + batch_.reset(new leveldb::WriteBatch()); + + return status.ok(); } void LeveldbDatabase::close() { diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index a546c8c5259..d71513a55ee 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -7,7 +7,7 @@ namespace caffe { -void LmdbDatabase::open(const string& filename, Mode mode) { +bool LmdbDatabase::open(const string& filename, Mode mode) { LOG(INFO) << "LMDB: Open " << filename; CHECK(NULL == env_); @@ -19,12 +19,16 @@ void LmdbDatabase::open(const string& filename, Mode mode) { retval = mkdir(filename.c_str(), 0744); switch (mode) { case New: - CHECK_EQ(0, retval) << "mkdir " << filename << " failed"; + if (0 != retval) { + LOG(ERROR) << "mkdir " << filename << " failed"; + return false; + } break; case ReadWrite: - if (-1 == retval) { - CHECK_EQ(EEXIST, errno) << "mkdir " << filename << " failed (" + if (-1 == retval && EEXIST != errno) { + LOG(ERROR) << "mkdir " << filename << " failed (" << strerror(errno) << ")"; + return false; } break; default: @@ -33,11 +37,17 @@ void LmdbDatabase::open(const string& filename, Mode mode) { } retval = mdb_env_create(&env_); - CHECK_EQ(retval, MDB_SUCCESS) << "mdb_env_create failed " - << mdb_strerror(retval); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_env_create failed " + << mdb_strerror(retval); + return false; + } + retval = mdb_env_set_mapsize(env_, 1099511627776); - CHECK_EQ(retval, MDB_SUCCESS) // 1TB - << "mdb_env_set_mapsize failed " << mdb_strerror(retval); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_env_set_mapsize failed " << mdb_strerror(retval); + return false; + } int flag1 = 0; int flag2 = 0; @@ -47,16 +57,27 @@ void LmdbDatabase::open(const string& filename, Mode mode) { } retval = mdb_env_open(env_, filename.c_str(), flag1, 0664); - CHECK_EQ(retval, MDB_SUCCESS) - << "mdb_env_open failed " << mdb_strerror(retval); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_env_open failed " << mdb_strerror(retval); + return false; + } + retval = mdb_txn_begin(env_, NULL, flag2, &txn_); - CHECK_EQ(retval, MDB_SUCCESS) - << "mdb_txn_begin failed " << mdb_strerror(retval); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); + return false; + } + retval = mdb_open(txn_, NULL, 0, &dbi_); - CHECK_EQ(retval, MDB_SUCCESS) << "mdb_open failed" << mdb_strerror(retval); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_open failed" << mdb_strerror(retval); + return false; + } + + return true; } -void LmdbDatabase::put(buffer_t* key, buffer_t* value) { +bool LmdbDatabase::put(buffer_t* key, buffer_t* value) { LOG(INFO) << "LMDB: Put"; MDB_val mdbkey, mdbdata; @@ -69,11 +90,15 @@ void LmdbDatabase::put(buffer_t* key, buffer_t* value) { CHECK_NE(0, dbi_); int retval = mdb_put(txn_, dbi_, &mdbkey, &mdbdata, 0); - CHECK_EQ(retval, MDB_SUCCESS) - << "mdb_put failed " << mdb_strerror(retval); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_put failed " << mdb_strerror(retval); + return false; + } + + return true; } -void LmdbDatabase::get(buffer_t* key, buffer_t* value) { +bool LmdbDatabase::get(buffer_t* key, buffer_t* value) { LOG(INFO) << "LMDB: Get"; MDB_val mdbkey, mdbdata; @@ -83,11 +108,16 @@ void LmdbDatabase::get(buffer_t* key, buffer_t* value) { int retval; MDB_txn* get_txn; retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &get_txn); - CHECK_EQ(MDB_SUCCESS, retval) << "mdb_txn_begin failed " - << mdb_strerror(retval); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); + return false; + } retval = mdb_get(get_txn, dbi_, &mdbkey, &mdbdata); - CHECK_EQ(MDB_SUCCESS, retval) << "mdb_get failed " << mdb_strerror(retval); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_get failed " << mdb_strerror(retval); + return false; + } mdb_txn_abort(get_txn); @@ -95,21 +125,29 @@ void LmdbDatabase::get(buffer_t* key, buffer_t* value) { reinterpret_cast<char*>(mdbdata.mv_data) + mdbdata.mv_size); value->swap(temp_value); + + return true; } -void LmdbDatabase::commit() { +bool LmdbDatabase::commit() { LOG(INFO) << "LMDB: Commit"; CHECK_NOTNULL(txn_); int retval; retval = mdb_txn_commit(txn_); - CHECK_EQ(retval, MDB_SUCCESS) << "mdb_txn_commit failed " - << mdb_strerror(retval); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_txn_commit failed " << mdb_strerror(retval); + return false; + } retval = mdb_txn_begin(env_, NULL, 0, &txn_); - CHECK_EQ(retval, MDB_SUCCESS) - << "mdb_txn_begin failed " << mdb_strerror(retval); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); + return false; + } + + return true; } void LmdbDatabase::close() { diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 98ef1b96f24..cc9ad20487c 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -40,7 +40,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { backend_ = backend; LOG(INFO) << "Using temporary database " << *filename_; shared_ptr<Database> database = DatabaseFactory(backend_); - database->open(*filename_, Database::New); + CHECK(database->open(*filename_, Database::New)); for (int i = 0; i < 5; ++i) { Datum datum; datum.set_label(i); @@ -59,9 +59,9 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { Database::buffer_t value(datum.ByteSize()); datum.SerializeWithCachedSizesToArray( reinterpret_cast<unsigned char*>(value.data())); - database->put(&key, &value); + CHECK(database->put(&key, &value)); } - database->commit(); + CHECK(database->commit()); database->close(); } diff --git a/src/caffe/test/test_database.cpp b/src/caffe/test/test_database.cpp index 5d5f4ea79c4..f65865014fa 100644 --- a/src/caffe/test/test_database.cpp +++ b/src/caffe/test/test_database.cpp @@ -66,56 +66,56 @@ TYPED_TEST_CASE(DatabaseTest, TestDtypesAndDevices); TYPED_TEST(DatabaseTest, TestNewDoesntExistLevelDBPasses) { shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(this->DBName(), Database::New); + EXPECT_TRUE(database->open(this->DBName(), Database::New)); database->close(); } TYPED_TEST(DatabaseTest, TestNewExistsFailsLevelDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); database->close(); - EXPECT_DEATH(database->open(name, Database::New), ""); + EXPECT_FALSE(database->open(name, Database::New)); } TYPED_TEST(DatabaseTest, TestReadOnlyExistsLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); database->close(); - database->open(name, Database::ReadOnly); + EXPECT_TRUE(database->open(name, Database::ReadOnly)); database->close(); } TYPED_TEST(DatabaseTest, TestReadOnlyDoesntExistFailsLevelDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_DEATH(database->open(name, Database::ReadOnly), ""); + EXPECT_FALSE(database->open(name, Database::ReadOnly)); } TYPED_TEST(DatabaseTest, TestReadWriteExistsLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); database->close(); - database->open(name, Database::ReadWrite); + EXPECT_TRUE(database->open(name, Database::ReadWrite)); database->close(); } TYPED_TEST(DatabaseTest, TestReadWriteDoesntExistLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::ReadWrite); + EXPECT_TRUE(database->open(name, Database::ReadWrite)); database->close(); } TYPED_TEST(DatabaseTest, TestIteratorsLevelDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); const int kNumExamples = 4; for (int i = 0; i < kNumExamples; ++i) { @@ -126,9 +126,9 @@ TYPED_TEST(DatabaseTest, TestIteratorsLevelDB) { string value = ss.str(); Database::buffer_t key_buf(key.data(), key.data() + key.size()); Database::buffer_t val_buf(value.data(), value.data() + value.size()); - database->put(&key_buf, &val_buf); + EXPECT_TRUE(database->put(&key_buf, &val_buf)); } - database->commit(); + EXPECT_TRUE(database->commit()); int count = 0; for (Database::const_iterator iter = database->begin(); @@ -143,7 +143,7 @@ TYPED_TEST(DatabaseTest, TestIteratorsLevelDB) { TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLevelDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key1 = this->TestAltKey(); Database::buffer_t value1 = this->TestAltValue(); @@ -151,9 +151,9 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLevelDB) { Database::buffer_t key2 = this->TestKey(); Database::buffer_t value2 = this->TestValue(); - database->put(&key1, &value1); - database->put(&key2, &value2); - database->commit(); + EXPECT_TRUE(database->put(&key1, &value1)); + EXPECT_TRUE(database->put(&key2, &value2)); + EXPECT_TRUE(database->commit()); Database::const_iterator iter1 = database->begin(); @@ -182,7 +182,7 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLevelDB) { TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLevelDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key1 = this->TestAltKey(); Database::buffer_t value1 = this->TestAltValue(); @@ -190,9 +190,9 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLevelDB) { Database::buffer_t key2 = this->TestKey(); Database::buffer_t value2 = this->TestValue(); - database->put(&key1, &value1); - database->put(&key2, &value2); - database->commit(); + EXPECT_TRUE(database->put(&key1, &value1)); + EXPECT_TRUE(database->put(&key2, &value2)); + EXPECT_TRUE(database->commit()); Database::const_iterator iter1 = database->begin(); @@ -224,14 +224,14 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLevelDB) { TYPED_TEST(DatabaseTest, TestNewPutLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); - database->commit(); + EXPECT_TRUE(database->commit()); database->close(); } @@ -239,9 +239,9 @@ TYPED_TEST(DatabaseTest, TestNewPutLevelDBPasses) { TYPED_TEST(DatabaseTest, TestNewCommitLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); - database->commit(); + EXPECT_TRUE(database->commit()); database->close(); } @@ -249,18 +249,18 @@ TYPED_TEST(DatabaseTest, TestNewCommitLevelDBPasses) { TYPED_TEST(DatabaseTest, TestNewGetLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); - database->commit(); + EXPECT_TRUE(database->commit()); Database::buffer_t new_val; - database->get(&key, &new_val); + EXPECT_TRUE(database->get(&key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); @@ -270,30 +270,30 @@ TYPED_TEST(DatabaseTest, TestNewGetLevelDBPasses) { TYPED_TEST(DatabaseTest, TestNewGetNoCommitLevelDBFails) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); Database::buffer_t new_val; - EXPECT_DEATH(database->get(&key, &new_val), ""); + EXPECT_FALSE(database->get(&key, &new_val)); } TYPED_TEST(DatabaseTest, TestReadWritePutLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::ReadWrite); + EXPECT_TRUE(database->open(name, Database::ReadWrite)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); - database->commit(); + EXPECT_TRUE(database->commit()); database->close(); } @@ -301,9 +301,9 @@ TYPED_TEST(DatabaseTest, TestReadWritePutLevelDBPasses) { TYPED_TEST(DatabaseTest, TestReadWriteCommitLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::ReadWrite); + EXPECT_TRUE(database->open(name, Database::ReadWrite)); - database->commit(); + EXPECT_TRUE(database->commit()); database->close(); } @@ -311,18 +311,18 @@ TYPED_TEST(DatabaseTest, TestReadWriteCommitLevelDBPasses) { TYPED_TEST(DatabaseTest, TestReadWriteGetLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); - database->commit(); + EXPECT_TRUE(database->commit()); Database::buffer_t new_val; - database->get(&key, &new_val); + EXPECT_TRUE(database->get(&key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); @@ -332,62 +332,62 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetLevelDBPasses) { TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitLevelDBFails) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); Database::buffer_t new_val; - EXPECT_DEATH(database->get(&key, &new_val), ""); + EXPECT_FALSE(database->get(&key, &new_val)); } TYPED_TEST(DatabaseTest, TestReadOnlyPutLevelDBFails) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); database->close(); - database->open(name, Database::ReadOnly); + EXPECT_TRUE(database->open(name, Database::ReadOnly)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_DEATH(database->put(&key, &val), ""); + EXPECT_FALSE(database->put(&key, &val)); } TYPED_TEST(DatabaseTest, TestReadOnlyCommitLevelDBFails) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); database->close(); - database->open(name, Database::ReadOnly); + EXPECT_TRUE(database->open(name, Database::ReadOnly)); - EXPECT_DEATH(database->commit(), ""); + EXPECT_FALSE(database->commit()); } TYPED_TEST(DatabaseTest, TestReadOnlyGetLevelDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); - database->commit(); + EXPECT_TRUE(database->commit()); database->close(); - database->open(name, Database::ReadOnly); + EXPECT_TRUE(database->open(name, Database::ReadOnly)); Database::buffer_t new_val; - database->get(&key, &new_val); + EXPECT_TRUE(database->get(&key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); } @@ -395,74 +395,74 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLevelDBPasses) { TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLevelDBFails) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); database->close(); - database->open(name, Database::ReadOnly); + EXPECT_TRUE(database->open(name, Database::ReadOnly)); Database::buffer_t new_val; - EXPECT_DEATH(database->get(&key, &new_val), ""); + EXPECT_FALSE(database->get(&key, &new_val)); } TYPED_TEST(DatabaseTest, TestNewDoesntExistLMDBPasses) { shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(this->DBName(), Database::New); + EXPECT_TRUE(database->open(this->DBName(), Database::New)); database->close(); } TYPED_TEST(DatabaseTest, TestNewExistsFailsLMDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); database->close(); - EXPECT_DEATH(database->open(name, Database::New), ""); + EXPECT_FALSE(database->open(name, Database::New)); } TYPED_TEST(DatabaseTest, TestReadOnlyExistsLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); database->close(); - database->open(name, Database::ReadOnly); + EXPECT_TRUE(database->open(name, Database::ReadOnly)); database->close(); } TYPED_TEST(DatabaseTest, TestReadOnlyDoesntExistFailsLMDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_DEATH(database->open(name, Database::ReadOnly), ""); + EXPECT_FALSE(database->open(name, Database::ReadOnly)); } TYPED_TEST(DatabaseTest, TestReadWriteExistsLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); database->close(); - database->open(name, Database::ReadWrite); + EXPECT_TRUE(database->open(name, Database::ReadWrite)); database->close(); } TYPED_TEST(DatabaseTest, TestReadWriteDoesntExistLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::ReadWrite); + EXPECT_TRUE(database->open(name, Database::ReadWrite)); database->close(); } TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); const int kNumExamples = 4; for (int i = 0; i < kNumExamples; ++i) { @@ -473,9 +473,9 @@ TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { string value = ss.str(); Database::buffer_t key_buf(key.data(), key.data() + key.size()); Database::buffer_t val_buf(value.data(), value.data() + value.size()); - database->put(&key_buf, &val_buf); + EXPECT_TRUE(database->put(&key_buf, &val_buf)); } - database->commit(); + EXPECT_TRUE(database->commit()); int count = 0; for (Database::const_iterator iter = database->begin(); @@ -490,7 +490,7 @@ TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLMDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key1 = this->TestAltKey(); Database::buffer_t value1 = this->TestAltValue(); @@ -498,9 +498,9 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLMDB) { Database::buffer_t key2 = this->TestKey(); Database::buffer_t value2 = this->TestValue(); - database->put(&key1, &value1); - database->put(&key2, &value2); - database->commit(); + EXPECT_TRUE(database->put(&key1, &value1)); + EXPECT_TRUE(database->put(&key2, &value2)); + EXPECT_TRUE(database->commit()); Database::const_iterator iter1 = database->begin(); @@ -529,7 +529,7 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLMDB) { TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLMDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key1 = this->TestAltKey(); Database::buffer_t value1 = this->TestAltValue(); @@ -537,9 +537,9 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLMDB) { Database::buffer_t key2 = this->TestKey(); Database::buffer_t value2 = this->TestValue(); - database->put(&key1, &value1); - database->put(&key2, &value2); - database->commit(); + EXPECT_TRUE(database->put(&key1, &value1)); + EXPECT_TRUE(database->put(&key2, &value2)); + EXPECT_TRUE(database->commit()); Database::const_iterator iter1 = database->begin(); @@ -571,14 +571,14 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLMDB) { TYPED_TEST(DatabaseTest, TestNewPutLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); - database->commit(); + EXPECT_TRUE(database->commit()); database->close(); } @@ -586,9 +586,9 @@ TYPED_TEST(DatabaseTest, TestNewPutLMDBPasses) { TYPED_TEST(DatabaseTest, TestNewCommitLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); - database->commit(); + EXPECT_TRUE(database->commit()); database->close(); } @@ -596,18 +596,18 @@ TYPED_TEST(DatabaseTest, TestNewCommitLMDBPasses) { TYPED_TEST(DatabaseTest, TestNewGetLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); - database->commit(); + EXPECT_TRUE(database->commit()); Database::buffer_t new_val; - database->get(&key, &new_val); + EXPECT_TRUE(database->get(&key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); @@ -617,29 +617,29 @@ TYPED_TEST(DatabaseTest, TestNewGetLMDBPasses) { TYPED_TEST(DatabaseTest, TestNewGetNoCommitLMDBFails) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); Database::buffer_t new_val; - EXPECT_DEATH(database->get(&key, &new_val), ""); + EXPECT_FALSE(database->get(&key, &new_val)); } TYPED_TEST(DatabaseTest, TestReadWritePutLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::ReadWrite); + EXPECT_TRUE(database->open(name, Database::ReadWrite)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); - database->commit(); + EXPECT_TRUE(database->commit()); database->close(); } @@ -647,9 +647,9 @@ TYPED_TEST(DatabaseTest, TestReadWritePutLMDBPasses) { TYPED_TEST(DatabaseTest, TestReadWriteCommitLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::ReadWrite); + EXPECT_TRUE(database->open(name, Database::ReadWrite)); - database->commit(); + EXPECT_TRUE(database->commit()); database->close(); } @@ -657,18 +657,18 @@ TYPED_TEST(DatabaseTest, TestReadWriteCommitLMDBPasses) { TYPED_TEST(DatabaseTest, TestReadWriteGetLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); - database->commit(); + EXPECT_TRUE(database->commit()); Database::buffer_t new_val; - database->get(&key, &new_val); + EXPECT_TRUE(database->get(&key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); @@ -678,62 +678,62 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetLMDBPasses) { TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitLMDBFails) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); Database::buffer_t new_val; - EXPECT_DEATH(database->get(&key, &new_val), ""); + EXPECT_FALSE(database->get(&key, &new_val)); } TYPED_TEST(DatabaseTest, TestReadOnlyPutLMDBFails) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); database->close(); - database->open(name, Database::ReadOnly); + EXPECT_TRUE(database->open(name, Database::ReadOnly)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_DEATH(database->put(&key, &val), ""); + EXPECT_FALSE(database->put(&key, &val)); } TYPED_TEST(DatabaseTest, TestReadOnlyCommitLMDBFails) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); database->close(); - database->open(name, Database::ReadOnly); + EXPECT_TRUE(database->open(name, Database::ReadOnly)); - EXPECT_DEATH(database->commit(), ""); + EXPECT_FALSE(database->commit()); } TYPED_TEST(DatabaseTest, TestReadOnlyGetLMDBPasses) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); - database->commit(); + EXPECT_TRUE(database->commit()); database->close(); - database->open(name, Database::ReadOnly); + EXPECT_TRUE(database->open(name, Database::ReadOnly)); Database::buffer_t new_val; - database->get(&key, &new_val); + EXPECT_TRUE(database->get(&key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); } @@ -741,20 +741,20 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLMDBPasses) { TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLMDBFails) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); - database->open(name, Database::New); + EXPECT_TRUE(database->open(name, Database::New)); Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - database->put(&key, &val); + EXPECT_TRUE(database->put(&key, &val)); database->close(); - database->open(name, Database::ReadOnly); + EXPECT_TRUE(database->open(name, Database::ReadOnly)); Database::buffer_t new_val; - EXPECT_DEATH(database->get(&key, &new_val), ""); + EXPECT_FALSE(database->get(&key, &new_val)); } } // namespace caffe diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index aaa324a02b3..b973c5277ad 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -29,7 +29,7 @@ int main(int argc, char** argv) { caffe::shared_ptr<Database> database = caffe::DatabaseFactory(db_backend); // Open db - database->open(argv[1], Database::ReadOnly); + CHECK(database->open(argv[1], Database::ReadOnly)); Datum datum; BlobProto sum_blob; diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 19c87e53ff0..3345c9c7e26 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -81,7 +81,7 @@ int main(int argc, char** argv) { shared_ptr<Database> database = DatabaseFactory(db_backend); // Open db - database->open(db_path, Database::New); + CHECK(database->open(db_path, Database::New)); // Storing to db std::string root_folder(argv[1]); @@ -116,17 +116,17 @@ int main(int argc, char** argv) { Database::buffer_t keystr(key_cstr, key_cstr + length); // Put in db - database->put(&keystr, &value); + CHECK(database->put(&keystr, &value)); if (++count % 1000 == 0) { // Commit txn - database->commit(); + CHECK(database->commit()); LOG(ERROR) << "Processed " << count << " files."; } } // write the last batch if (count % 1000 != 0) { - database->commit(); + CHECK(database->commit()); LOG(ERROR) << "Processed " << count << " files."; } database->close(); diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index c4d1a39eb5b..1560ef60a7c 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -125,7 +125,7 @@ int feature_extraction_pipeline(int argc, char** argv) { for (size_t i = 0; i < num_features; ++i) { LOG(INFO)<< "Opening database " << database_names[i]; shared_ptr<Database> database = DatabaseFactory(argv[++arg_pos]); - database->open(database_names.at(i), Database::New); + CHECK(database->open(database_names.at(i), Database::New)); feature_dbs.push_back(database); } @@ -161,10 +161,10 @@ int feature_extraction_pipeline(int argc, char** argv) { int length = snprintf(key_str, kMaxKeyStrLength, "%d", image_indices[i]); Database::buffer_t key(key_str, key_str + length); - feature_dbs.at(i)->put(&key, &value); + CHECK(feature_dbs.at(i)->put(&key, &value)); ++image_indices[i]; if (image_indices[i] % 1000 == 0) { - feature_dbs.at(i)->commit(); + CHECK(feature_dbs.at(i)->commit()); LOG(ERROR)<< "Extracted features of " << image_indices[i] << " query images for feature blob " << blob_names[i]; } @@ -174,7 +174,7 @@ int feature_extraction_pipeline(int argc, char** argv) { // write the last batch for (int i = 0; i < num_features; ++i) { if (image_indices[i] % 1000 != 0) { - feature_dbs.at(i)->commit(); + CHECK(feature_dbs.at(i)->commit()); } LOG(ERROR)<< "Extracted features of " << image_indices[i] << " query images for feature blob " << blob_names[i]; From e0b572dd1a63d5dda000ee4cc803be04e51597a1 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 20:30:29 -0400 Subject: [PATCH 0930/2053] Updated Database interface to take key and value by const reference for put and key by const reference for put. Additional copies are made for get and put in the LMDB implementation. --- examples/cifar10/convert_cifar_data.cpp | 4 +- include/caffe/database.hpp | 4 +- include/caffe/leveldb_database.hpp | 4 +- include/caffe/lmdb_database.hpp | 4 +- src/caffe/leveldb_database.cpp | 10 ++-- src/caffe/lmdb_database.cpp | 22 ++++--- src/caffe/test/test_data_layer.cpp | 2 +- src/caffe/test/test_database.cpp | 80 ++++++++++++------------- tools/convert_imageset.cpp | 2 +- tools/extract_features.cpp | 2 +- 10 files changed, 70 insertions(+), 64 deletions(-) diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index b29e4121bf5..af845eadfb6 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -66,7 +66,7 @@ void convert_dataset(const string& input_folder, const string& output_folder, int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", fileid * kCIFARBatchSize + itemid); Database::buffer_t key(str_buffer, str_buffer + length); - CHECK(train_database->put(&key, &value)); + CHECK(train_database->put(key, value)); } } CHECK(train_database->commit()); @@ -89,7 +89,7 @@ void convert_dataset(const string& input_folder, const string& output_folder, reinterpret_cast<unsigned char*>(value.data())); int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid); Database::buffer_t key(str_buffer, str_buffer + length); - CHECK(test_database->put(&key, &value)); + CHECK(test_database->put(key, value)); } CHECK(test_database->commit()); test_database->close(); diff --git a/include/caffe/database.hpp b/include/caffe/database.hpp index 148b1ed7f38..3f3970d77a7 100644 --- a/include/caffe/database.hpp +++ b/include/caffe/database.hpp @@ -27,8 +27,8 @@ class Database { }; virtual bool open(const string& filename, Mode mode) = 0; - virtual bool put(buffer_t* key, buffer_t* value) = 0; - virtual bool get(buffer_t* key, buffer_t* value) = 0; + virtual bool put(const buffer_t& key, const buffer_t& value) = 0; + virtual bool get(const buffer_t& key, buffer_t* value) = 0; virtual bool commit() = 0; virtual void close() = 0; diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index 64bfa7cebee..e2558ff477f 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -15,8 +15,8 @@ namespace caffe { class LeveldbDatabase : public Database { public: bool open(const string& filename, Mode mode); - bool put(buffer_t* key, buffer_t* value); - bool get(buffer_t* key, buffer_t* value); + bool put(const buffer_t& key, const buffer_t& value); + bool get(const buffer_t& key, buffer_t* value); bool commit(); void close(); diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index 69e3ce0f03d..4a0f3183bd5 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -19,8 +19,8 @@ class LmdbDatabase : public Database { txn_(NULL) { } bool open(const string& filename, Mode mode); - bool put(buffer_t* key, buffer_t* value); - bool get(buffer_t* key, buffer_t* value); + bool put(const buffer_t& key, const buffer_t& value); + bool get(const buffer_t& key, buffer_t* value); bool commit(); void close(); diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index d7506edf74e..c09112f668b 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -51,7 +51,7 @@ bool LeveldbDatabase::open(const string& filename, Mode mode) { return true; } -bool LeveldbDatabase::put(buffer_t* key, buffer_t* value) { +bool LeveldbDatabase::put(const buffer_t& key, const buffer_t& value) { LOG(INFO) << "LevelDB: Put"; if (read_only_) { @@ -61,18 +61,18 @@ bool LeveldbDatabase::put(buffer_t* key, buffer_t* value) { CHECK_NOTNULL(batch_.get()); - leveldb::Slice key_slice(key->data(), key->size()); - leveldb::Slice value_slice(value->data(), value->size()); + leveldb::Slice key_slice(key.data(), key.size()); + leveldb::Slice value_slice(value.data(), value.size()); batch_->Put(key_slice, value_slice); return true; } -bool LeveldbDatabase::get(buffer_t* key, buffer_t* value) { +bool LeveldbDatabase::get(const buffer_t& key, buffer_t* value) { LOG(INFO) << "LevelDB: Get"; - leveldb::Slice key_slice(key->data(), key->size()); + leveldb::Slice key_slice(key.data(), key.size()); string value_string; leveldb::Status status = diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index d71513a55ee..2cb699b4234 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -77,14 +77,18 @@ bool LmdbDatabase::open(const string& filename, Mode mode) { return true; } -bool LmdbDatabase::put(buffer_t* key, buffer_t* value) { +bool LmdbDatabase::put(const buffer_t& key, const buffer_t& value) { LOG(INFO) << "LMDB: Put"; + // MDB_val::mv_size is not const, so we need to make a local copy. + buffer_t local_key = key; + buffer_t local_value = value; + MDB_val mdbkey, mdbdata; - mdbdata.mv_size = value->size(); - mdbdata.mv_data = value->data(); - mdbkey.mv_size = key->size(); - mdbkey.mv_data = key->data(); + mdbdata.mv_size = local_value.size(); + mdbdata.mv_data = local_value.data(); + mdbkey.mv_size = local_key.size(); + mdbkey.mv_data = local_key.data(); CHECK_NOTNULL(txn_); CHECK_NE(0, dbi_); @@ -98,12 +102,14 @@ bool LmdbDatabase::put(buffer_t* key, buffer_t* value) { return true; } -bool LmdbDatabase::get(buffer_t* key, buffer_t* value) { +bool LmdbDatabase::get(const buffer_t& key, buffer_t* value) { LOG(INFO) << "LMDB: Get"; + buffer_t local_key = key; + MDB_val mdbkey, mdbdata; - mdbkey.mv_data = key->data(); - mdbkey.mv_size = key->size(); + mdbkey.mv_data = local_key.data(); + mdbkey.mv_size = local_key.size(); int retval; MDB_txn* get_txn; diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index cc9ad20487c..8ae8f2b8da8 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -59,7 +59,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { Database::buffer_t value(datum.ByteSize()); datum.SerializeWithCachedSizesToArray( reinterpret_cast<unsigned char*>(value.data())); - CHECK(database->put(&key, &value)); + CHECK(database->put(key, value)); } CHECK(database->commit()); database->close(); diff --git a/src/caffe/test/test_database.cpp b/src/caffe/test/test_database.cpp index f65865014fa..70e1d962619 100644 --- a/src/caffe/test/test_database.cpp +++ b/src/caffe/test/test_database.cpp @@ -126,7 +126,7 @@ TYPED_TEST(DatabaseTest, TestIteratorsLevelDB) { string value = ss.str(); Database::buffer_t key_buf(key.data(), key.data() + key.size()); Database::buffer_t val_buf(value.data(), value.data() + value.size()); - EXPECT_TRUE(database->put(&key_buf, &val_buf)); + EXPECT_TRUE(database->put(key_buf, val_buf)); } EXPECT_TRUE(database->commit()); @@ -151,8 +151,8 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLevelDB) { Database::buffer_t key2 = this->TestKey(); Database::buffer_t value2 = this->TestValue(); - EXPECT_TRUE(database->put(&key1, &value1)); - EXPECT_TRUE(database->put(&key2, &value2)); + EXPECT_TRUE(database->put(key1, value1)); + EXPECT_TRUE(database->put(key2, value2)); EXPECT_TRUE(database->commit()); Database::const_iterator iter1 = database->begin(); @@ -190,8 +190,8 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLevelDB) { Database::buffer_t key2 = this->TestKey(); Database::buffer_t value2 = this->TestValue(); - EXPECT_TRUE(database->put(&key1, &value1)); - EXPECT_TRUE(database->put(&key2, &value2)); + EXPECT_TRUE(database->put(key1, value1)); + EXPECT_TRUE(database->put(key2, value2)); EXPECT_TRUE(database->commit()); Database::const_iterator iter1 = database->begin(); @@ -229,7 +229,7 @@ TYPED_TEST(DatabaseTest, TestNewPutLevelDBPasses) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); @@ -254,13 +254,13 @@ TYPED_TEST(DatabaseTest, TestNewGetLevelDBPasses) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); Database::buffer_t new_val; - EXPECT_TRUE(database->get(&key, &new_val)); + EXPECT_TRUE(database->get(key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); @@ -275,11 +275,11 @@ TYPED_TEST(DatabaseTest, TestNewGetNoCommitLevelDBFails) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); Database::buffer_t new_val; - EXPECT_FALSE(database->get(&key, &new_val)); + EXPECT_FALSE(database->get(key, &new_val)); } @@ -291,7 +291,7 @@ TYPED_TEST(DatabaseTest, TestReadWritePutLevelDBPasses) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); @@ -316,13 +316,13 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetLevelDBPasses) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); Database::buffer_t new_val; - EXPECT_TRUE(database->get(&key, &new_val)); + EXPECT_TRUE(database->get(key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); @@ -337,11 +337,11 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitLevelDBFails) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); Database::buffer_t new_val; - EXPECT_FALSE(database->get(&key, &new_val)); + EXPECT_FALSE(database->get(key, &new_val)); } TYPED_TEST(DatabaseTest, TestReadOnlyPutLevelDBFails) { @@ -355,7 +355,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyPutLevelDBFails) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_FALSE(database->put(&key, &val)); + EXPECT_FALSE(database->put(key, val)); } TYPED_TEST(DatabaseTest, TestReadOnlyCommitLevelDBFails) { @@ -377,7 +377,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLevelDBPasses) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); @@ -387,7 +387,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLevelDBPasses) { Database::buffer_t new_val; - EXPECT_TRUE(database->get(&key, &new_val)); + EXPECT_TRUE(database->get(key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); } @@ -400,7 +400,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLevelDBFails) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); database->close(); @@ -408,7 +408,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLevelDBFails) { Database::buffer_t new_val; - EXPECT_FALSE(database->get(&key, &new_val)); + EXPECT_FALSE(database->get(key, &new_val)); } TYPED_TEST(DatabaseTest, TestNewDoesntExistLMDBPasses) { @@ -473,7 +473,7 @@ TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { string value = ss.str(); Database::buffer_t key_buf(key.data(), key.data() + key.size()); Database::buffer_t val_buf(value.data(), value.data() + value.size()); - EXPECT_TRUE(database->put(&key_buf, &val_buf)); + EXPECT_TRUE(database->put(key_buf, val_buf)); } EXPECT_TRUE(database->commit()); @@ -498,8 +498,8 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLMDB) { Database::buffer_t key2 = this->TestKey(); Database::buffer_t value2 = this->TestValue(); - EXPECT_TRUE(database->put(&key1, &value1)); - EXPECT_TRUE(database->put(&key2, &value2)); + EXPECT_TRUE(database->put(key1, value1)); + EXPECT_TRUE(database->put(key2, value2)); EXPECT_TRUE(database->commit()); Database::const_iterator iter1 = database->begin(); @@ -537,8 +537,8 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLMDB) { Database::buffer_t key2 = this->TestKey(); Database::buffer_t value2 = this->TestValue(); - EXPECT_TRUE(database->put(&key1, &value1)); - EXPECT_TRUE(database->put(&key2, &value2)); + EXPECT_TRUE(database->put(key1, value1)); + EXPECT_TRUE(database->put(key2, value2)); EXPECT_TRUE(database->commit()); Database::const_iterator iter1 = database->begin(); @@ -576,7 +576,7 @@ TYPED_TEST(DatabaseTest, TestNewPutLMDBPasses) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); @@ -601,13 +601,13 @@ TYPED_TEST(DatabaseTest, TestNewGetLMDBPasses) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); Database::buffer_t new_val; - EXPECT_TRUE(database->get(&key, &new_val)); + EXPECT_TRUE(database->get(key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); @@ -622,11 +622,11 @@ TYPED_TEST(DatabaseTest, TestNewGetNoCommitLMDBFails) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); Database::buffer_t new_val; - EXPECT_FALSE(database->get(&key, &new_val)); + EXPECT_FALSE(database->get(key, &new_val)); } TYPED_TEST(DatabaseTest, TestReadWritePutLMDBPasses) { @@ -637,7 +637,7 @@ TYPED_TEST(DatabaseTest, TestReadWritePutLMDBPasses) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); @@ -662,13 +662,13 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetLMDBPasses) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); Database::buffer_t new_val; - EXPECT_TRUE(database->get(&key, &new_val)); + EXPECT_TRUE(database->get(key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); @@ -683,11 +683,11 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitLMDBFails) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); Database::buffer_t new_val; - EXPECT_FALSE(database->get(&key, &new_val)); + EXPECT_FALSE(database->get(key, &new_val)); } TYPED_TEST(DatabaseTest, TestReadOnlyPutLMDBFails) { @@ -701,7 +701,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyPutLMDBFails) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_FALSE(database->put(&key, &val)); + EXPECT_FALSE(database->put(key, val)); } TYPED_TEST(DatabaseTest, TestReadOnlyCommitLMDBFails) { @@ -723,7 +723,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLMDBPasses) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); @@ -733,7 +733,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLMDBPasses) { Database::buffer_t new_val; - EXPECT_TRUE(database->get(&key, &new_val)); + EXPECT_TRUE(database->get(key, &new_val)); EXPECT_TRUE(this->BufferEq(val, new_val)); } @@ -746,7 +746,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLMDBFails) { Database::buffer_t key = this->TestKey(); Database::buffer_t val = this->TestValue(); - EXPECT_TRUE(database->put(&key, &val)); + EXPECT_TRUE(database->put(key, val)); database->close(); @@ -754,7 +754,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLMDBFails) { Database::buffer_t new_val; - EXPECT_FALSE(database->get(&key, &new_val)); + EXPECT_FALSE(database->get(key, &new_val)); } } // namespace caffe diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 3345c9c7e26..5ad2c0b4d5a 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -116,7 +116,7 @@ int main(int argc, char** argv) { Database::buffer_t keystr(key_cstr, key_cstr + length); // Put in db - CHECK(database->put(&keystr, &value)); + CHECK(database->put(keystr, value)); if (++count % 1000 == 0) { // Commit txn diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 1560ef60a7c..0c7660d5d49 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -161,7 +161,7 @@ int feature_extraction_pipeline(int argc, char** argv) { int length = snprintf(key_str, kMaxKeyStrLength, "%d", image_indices[i]); Database::buffer_t key(key_str, key_str + length); - CHECK(feature_dbs.at(i)->put(&key, &value)); + CHECK(feature_dbs.at(i)->put(key, value)); ++image_indices[i]; if (image_indices[i] % 1000 == 0) { CHECK(feature_dbs.at(i)->commit()); From 2200a7a4b1f7fa7ac5fac7a2463552e8fe0ca9c2 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 20:43:01 -0400 Subject: [PATCH 0931/2053] The LevelDB iterator/DB deallocation order bug is pretty much fixed by having each iterator hold a shared pointer to the DB. I manually specified a deconstructor for the LeveldbState to make it clear what order these two things need to be deallocated in. --- include/caffe/leveldb_database.hpp | 8 ++++++++ src/caffe/layers/data_layer.cpp | 4 ---- src/caffe/test/test_database.cpp | 16 ---------------- tools/compute_image_mean.cpp | 1 - 4 files changed, 8 insertions(+), 21 deletions(-) diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index e2558ff477f..2a610a370a4 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -34,6 +34,14 @@ class LeveldbDatabase : public Database { db_(db), iter_(iter) { } + ~LeveldbState() { + // This order is very important. + // Iterators must be destroyed before their associated DB + // is destroyed. + iter_.reset(); + db_.reset(); + } + shared_ptr<DatabaseState> clone() { shared_ptr<leveldb::Iterator> new_iter; diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index dcba10fabec..c379d78d8f3 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -18,10 +18,6 @@ template <typename Dtype> DataLayer<Dtype>::~DataLayer<Dtype>() { this->JoinPrefetchThread(); // clean up the database resources - - // Very important to invalidate iterators before closing the database. - // TODO(kmatzen): Figure out a better design to avoid this. - iter_ = database_->end(); database_->close(); } diff --git a/src/caffe/test/test_database.cpp b/src/caffe/test/test_database.cpp index 70e1d962619..3dd200673ff 100644 --- a/src/caffe/test/test_database.cpp +++ b/src/caffe/test/test_database.cpp @@ -172,10 +172,6 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLevelDB) { EXPECT_TRUE(database->end() == iter3); - iter1 = database->end(); - iter2 = database->end(); - iter3 = database->end(); - database->close(); } @@ -214,10 +210,6 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLevelDB) { EXPECT_TRUE(this->BufferEq(iter3->key, key2)); EXPECT_TRUE(database->end() == iter1); - iter1 = database->end(); - iter2 = database->end(); - iter3 = database->end(); - database->close(); } @@ -519,10 +511,6 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLMDB) { EXPECT_TRUE(database->end() == iter3); - iter1 = database->end(); - iter2 = database->end(); - iter3 = database->end(); - database->close(); } @@ -561,10 +549,6 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLMDB) { EXPECT_TRUE(this->BufferEq(iter3->key, key2)); EXPECT_TRUE(database->end() == iter1); - iter1 = database->end(); - iter2 = database->end(); - iter3 = database->end(); - database->close(); } diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index b973c5277ad..5f6ea6eecc5 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -38,7 +38,6 @@ int main(int argc, char** argv) { Database::const_iterator iter = database->begin(); const Database::buffer_t& first_blob = iter->value; datum.ParseFromArray(first_blob.data(), first_blob.size()); - iter = database->end(); sum_blob.set_num(1); sum_blob.set_channels(datum.channels()); From 80a99b939bfad88d918e82b41fd2c28c454abb50 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 20:54:39 -0400 Subject: [PATCH 0932/2053] Changed Database::buffer_t to Database::key_type and Database::value_type --- examples/cifar10/convert_cifar_data.cpp | 8 +- include/caffe/database.hpp | 11 +- include/caffe/leveldb_database.hpp | 4 +- include/caffe/lmdb_database.hpp | 4 +- src/caffe/leveldb_database.cpp | 10 +- src/caffe/lmdb_database.cpp | 16 +-- src/caffe/test/test_data_layer.cpp | 4 +- src/caffe/test/test_database.cpp | 156 ++++++++++++------------ tools/compute_image_mean.cpp | 4 +- tools/convert_imageset.cpp | 4 +- tools/extract_features.cpp | 4 +- 11 files changed, 113 insertions(+), 112 deletions(-) diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index af845eadfb6..46ab1558623 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -60,12 +60,12 @@ void convert_dataset(const string& input_folder, const string& output_folder, read_image(&data_file, &label, str_buffer); datum.set_label(label); datum.set_data(str_buffer, kCIFARImageNBytes); - Database::buffer_t value(datum.ByteSize()); + Database::value_type value(datum.ByteSize()); datum.SerializeWithCachedSizesToArray( reinterpret_cast<unsigned char*>(value.data())); int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", fileid * kCIFARBatchSize + itemid); - Database::buffer_t key(str_buffer, str_buffer + length); + Database::key_type key(str_buffer, str_buffer + length); CHECK(train_database->put(key, value)); } } @@ -84,11 +84,11 @@ void convert_dataset(const string& input_folder, const string& output_folder, read_image(&data_file, &label, str_buffer); datum.set_label(label); datum.set_data(str_buffer, kCIFARImageNBytes); - Database::buffer_t value(datum.ByteSize()); + Database::value_type value(datum.ByteSize()); datum.SerializeWithCachedSizesToArray( reinterpret_cast<unsigned char*>(value.data())); int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid); - Database::buffer_t key(str_buffer, str_buffer + length); + Database::key_type key(str_buffer, str_buffer + length); CHECK(test_database->put(key, value)); } CHECK(test_database->commit()); diff --git a/include/caffe/database.hpp b/include/caffe/database.hpp index 3f3970d77a7..2341149ce59 100644 --- a/include/caffe/database.hpp +++ b/include/caffe/database.hpp @@ -19,16 +19,17 @@ class Database { ReadOnly }; - typedef vector<char> buffer_t; + typedef vector<char> key_type; + typedef vector<char> value_type; struct KV { - buffer_t key; - buffer_t value; + key_type key; + value_type value; }; virtual bool open(const string& filename, Mode mode) = 0; - virtual bool put(const buffer_t& key, const buffer_t& value) = 0; - virtual bool get(const buffer_t& key, buffer_t* value) = 0; + virtual bool put(const key_type& key, const value_type& value) = 0; + virtual bool get(const key_type& key, value_type* value) = 0; virtual bool commit() = 0; virtual void close() = 0; diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index 2a610a370a4..9c7f70ec053 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -15,8 +15,8 @@ namespace caffe { class LeveldbDatabase : public Database { public: bool open(const string& filename, Mode mode); - bool put(const buffer_t& key, const buffer_t& value); - bool get(const buffer_t& key, buffer_t* value); + bool put(const key_type& key, const value_type& value); + bool get(const key_type& key, value_type* value); bool commit(); void close(); diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index 4a0f3183bd5..107d936da83 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -19,8 +19,8 @@ class LmdbDatabase : public Database { txn_(NULL) { } bool open(const string& filename, Mode mode); - bool put(const buffer_t& key, const buffer_t& value); - bool get(const buffer_t& key, buffer_t* value); + bool put(const key_type& key, const value_type& value); + bool get(const key_type& key, value_type* value); bool commit(); void close(); diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index c09112f668b..2061b8ea65e 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -51,7 +51,7 @@ bool LeveldbDatabase::open(const string& filename, Mode mode) { return true; } -bool LeveldbDatabase::put(const buffer_t& key, const buffer_t& value) { +bool LeveldbDatabase::put(const key_type& key, const value_type& value) { LOG(INFO) << "LevelDB: Put"; if (read_only_) { @@ -69,7 +69,7 @@ bool LeveldbDatabase::put(const buffer_t& key, const buffer_t& value) { return true; } -bool LeveldbDatabase::get(const buffer_t& key, buffer_t* value) { +bool LeveldbDatabase::get(const key_type& key, value_type* value) { LOG(INFO) << "LevelDB: Get"; leveldb::Slice key_slice(key.data(), key.size()); @@ -83,7 +83,7 @@ bool LeveldbDatabase::get(const buffer_t& key, buffer_t* value) { return false; } - Database::buffer_t temp_value(value_string.data(), + Database::value_type temp_value(value_string.data(), value_string.data() + value_string.size()); value->swap(temp_value); @@ -189,10 +189,10 @@ Database::KV& LeveldbDatabase::dereference( CHECK(iter->Valid()); - Database::buffer_t temp_key(buffer_t(iter->key().data(), + Database::key_type temp_key(key_type(iter->key().data(), iter->key().data() + iter->key().size())); - Database::buffer_t temp_value(buffer_t(iter->value().data(), + Database::value_type temp_value(value_type(iter->value().data(), iter->value().data() + iter->value().size())); leveldb_state->kv_pair_.key.swap(temp_key); diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index 2cb699b4234..eb22d15f28d 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -77,12 +77,12 @@ bool LmdbDatabase::open(const string& filename, Mode mode) { return true; } -bool LmdbDatabase::put(const buffer_t& key, const buffer_t& value) { +bool LmdbDatabase::put(const key_type& key, const value_type& value) { LOG(INFO) << "LMDB: Put"; // MDB_val::mv_size is not const, so we need to make a local copy. - buffer_t local_key = key; - buffer_t local_value = value; + key_type local_key = key; + value_type local_value = value; MDB_val mdbkey, mdbdata; mdbdata.mv_size = local_value.size(); @@ -102,10 +102,10 @@ bool LmdbDatabase::put(const buffer_t& key, const buffer_t& value) { return true; } -bool LmdbDatabase::get(const buffer_t& key, buffer_t* value) { +bool LmdbDatabase::get(const key_type& key, value_type* value) { LOG(INFO) << "LMDB: Get"; - buffer_t local_key = key; + key_type local_key = key; MDB_val mdbkey, mdbdata; mdbkey.mv_data = local_key.data(); @@ -127,7 +127,7 @@ bool LmdbDatabase::get(const buffer_t& key, buffer_t* value) { mdb_txn_abort(get_txn); - Database::buffer_t temp_value(reinterpret_cast<char*>(mdbdata.mv_data), + Database::value_type temp_value(reinterpret_cast<char*>(mdbdata.mv_data), reinterpret_cast<char*>(mdbdata.mv_data) + mdbdata.mv_size); value->swap(temp_value); @@ -247,9 +247,9 @@ Database::KV& LmdbDatabase::dereference(shared_ptr<DatabaseState> state) const { char* key_data = reinterpret_cast<char*>(mdb_key.mv_data); char* value_data = reinterpret_cast<char*>(mdb_val.mv_data); - Database::buffer_t temp_key(key_data, key_data + mdb_key.mv_size); + Database::key_type temp_key(key_data, key_data + mdb_key.mv_size); - Database::buffer_t temp_value(value_data, + Database::value_type temp_value(value_data, value_data + mdb_val.mv_size); lmdb_state->kv_pair_.key.swap(temp_key); diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 8ae8f2b8da8..5f982063cc7 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -55,8 +55,8 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { stringstream ss; ss << i; string key_str = ss.str(); - Database::buffer_t key(key_str.c_str(), key_str.c_str() + key_str.size()); - Database::buffer_t value(datum.ByteSize()); + Database::key_type key(key_str.c_str(), key_str.c_str() + key_str.size()); + Database::value_type value(datum.ByteSize()); datum.SerializeWithCachedSizesToArray( reinterpret_cast<unsigned char*>(value.data())); CHECK(database->put(key, value)); diff --git a/src/caffe/test/test_database.cpp b/src/caffe/test/test_database.cpp index 3dd200673ff..ad1c786465a 100644 --- a/src/caffe/test/test_database.cpp +++ b/src/caffe/test/test_database.cpp @@ -23,32 +23,32 @@ class DatabaseTest : public MultiDeviceTest<TypeParam> { return filename; } - Database::buffer_t TestKey() { + Database::key_type TestKey() { const char* kKey = "hello"; - Database::buffer_t key(kKey, kKey + 5); + Database::key_type key(kKey, kKey + 5); return key; } - Database::buffer_t TestValue() { + Database::value_type TestValue() { const char* kValue = "world"; - Database::buffer_t value(kValue, kValue + 5); + Database::value_type value(kValue, kValue + 5); return value; } - Database::buffer_t TestAltKey() { + Database::key_type TestAltKey() { const char* kKey = "foo"; - Database::buffer_t key(kKey, kKey + 3); + Database::key_type key(kKey, kKey + 3); return key; } - Database::buffer_t TestAltValue() { + Database::value_type TestAltValue() { const char* kValue = "bar"; - Database::buffer_t value(kValue, kValue + 3); + Database::value_type value(kValue, kValue + 3); return value; } - bool BufferEq(const Database::buffer_t& buf1, - const Database::buffer_t& buf2) { + template <typename T> + bool BufferEq(const T& buf1, const T& buf2) { if (buf1.size() != buf2.size()) { return false; } @@ -124,8 +124,8 @@ TYPED_TEST(DatabaseTest, TestIteratorsLevelDB) { string key = ss.str(); ss << " here be data"; string value = ss.str(); - Database::buffer_t key_buf(key.data(), key.data() + key.size()); - Database::buffer_t val_buf(value.data(), value.data() + value.size()); + Database::key_type key_buf(key.data(), key.data() + key.size()); + Database::value_type val_buf(value.data(), value.data() + value.size()); EXPECT_TRUE(database->put(key_buf, val_buf)); } EXPECT_TRUE(database->commit()); @@ -145,11 +145,11 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLevelDB) { shared_ptr<Database> database = DatabaseFactory("leveldb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key1 = this->TestAltKey(); - Database::buffer_t value1 = this->TestAltValue(); + Database::key_type key1 = this->TestAltKey(); + Database::value_type value1 = this->TestAltValue(); - Database::buffer_t key2 = this->TestKey(); - Database::buffer_t value2 = this->TestValue(); + Database::key_type key2 = this->TestKey(); + Database::value_type value2 = this->TestValue(); EXPECT_TRUE(database->put(key1, value1)); EXPECT_TRUE(database->put(key2, value2)); @@ -180,11 +180,11 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLevelDB) { shared_ptr<Database> database = DatabaseFactory("leveldb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key1 = this->TestAltKey(); - Database::buffer_t value1 = this->TestAltValue(); + Database::key_type key1 = this->TestAltKey(); + Database::value_type value1 = this->TestAltValue(); - Database::buffer_t key2 = this->TestKey(); - Database::buffer_t value2 = this->TestValue(); + Database::key_type key2 = this->TestKey(); + Database::value_type value2 = this->TestValue(); EXPECT_TRUE(database->put(key1, value1)); EXPECT_TRUE(database->put(key2, value2)); @@ -218,8 +218,8 @@ TYPED_TEST(DatabaseTest, TestNewPutLevelDBPasses) { shared_ptr<Database> database = DatabaseFactory("leveldb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); @@ -243,14 +243,14 @@ TYPED_TEST(DatabaseTest, TestNewGetLevelDBPasses) { shared_ptr<Database> database = DatabaseFactory("leveldb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_TRUE(database->get(key, &new_val)); @@ -264,12 +264,12 @@ TYPED_TEST(DatabaseTest, TestNewGetNoCommitLevelDBFails) { shared_ptr<Database> database = DatabaseFactory("leveldb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_FALSE(database->get(key, &new_val)); } @@ -280,8 +280,8 @@ TYPED_TEST(DatabaseTest, TestReadWritePutLevelDBPasses) { shared_ptr<Database> database = DatabaseFactory("leveldb"); EXPECT_TRUE(database->open(name, Database::ReadWrite)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); @@ -305,14 +305,14 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetLevelDBPasses) { shared_ptr<Database> database = DatabaseFactory("leveldb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_TRUE(database->get(key, &new_val)); @@ -326,12 +326,12 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitLevelDBFails) { shared_ptr<Database> database = DatabaseFactory("leveldb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_FALSE(database->get(key, &new_val)); } @@ -344,8 +344,8 @@ TYPED_TEST(DatabaseTest, TestReadOnlyPutLevelDBFails) { EXPECT_TRUE(database->open(name, Database::ReadOnly)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_FALSE(database->put(key, val)); } @@ -366,8 +366,8 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLevelDBPasses) { shared_ptr<Database> database = DatabaseFactory("leveldb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); @@ -377,7 +377,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLevelDBPasses) { EXPECT_TRUE(database->open(name, Database::ReadOnly)); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_TRUE(database->get(key, &new_val)); @@ -389,8 +389,8 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLevelDBFails) { shared_ptr<Database> database = DatabaseFactory("leveldb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); @@ -398,7 +398,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLevelDBFails) { EXPECT_TRUE(database->open(name, Database::ReadOnly)); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_FALSE(database->get(key, &new_val)); } @@ -463,8 +463,8 @@ TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { string key = ss.str(); ss << " here be data"; string value = ss.str(); - Database::buffer_t key_buf(key.data(), key.data() + key.size()); - Database::buffer_t val_buf(value.data(), value.data() + value.size()); + Database::key_type key_buf(key.data(), key.data() + key.size()); + Database::value_type val_buf(value.data(), value.data() + value.size()); EXPECT_TRUE(database->put(key_buf, val_buf)); } EXPECT_TRUE(database->commit()); @@ -484,11 +484,11 @@ TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLMDB) { shared_ptr<Database> database = DatabaseFactory("lmdb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key1 = this->TestAltKey(); - Database::buffer_t value1 = this->TestAltValue(); + Database::key_type key1 = this->TestAltKey(); + Database::value_type value1 = this->TestAltValue(); - Database::buffer_t key2 = this->TestKey(); - Database::buffer_t value2 = this->TestValue(); + Database::key_type key2 = this->TestKey(); + Database::value_type value2 = this->TestValue(); EXPECT_TRUE(database->put(key1, value1)); EXPECT_TRUE(database->put(key2, value2)); @@ -519,11 +519,11 @@ TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLMDB) { shared_ptr<Database> database = DatabaseFactory("lmdb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key1 = this->TestAltKey(); - Database::buffer_t value1 = this->TestAltValue(); + Database::key_type key1 = this->TestAltKey(); + Database::value_type value1 = this->TestAltValue(); - Database::buffer_t key2 = this->TestKey(); - Database::buffer_t value2 = this->TestValue(); + Database::key_type key2 = this->TestKey(); + Database::value_type value2 = this->TestValue(); EXPECT_TRUE(database->put(key1, value1)); EXPECT_TRUE(database->put(key2, value2)); @@ -557,8 +557,8 @@ TYPED_TEST(DatabaseTest, TestNewPutLMDBPasses) { shared_ptr<Database> database = DatabaseFactory("lmdb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); @@ -582,14 +582,14 @@ TYPED_TEST(DatabaseTest, TestNewGetLMDBPasses) { shared_ptr<Database> database = DatabaseFactory("lmdb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_TRUE(database->get(key, &new_val)); @@ -603,12 +603,12 @@ TYPED_TEST(DatabaseTest, TestNewGetNoCommitLMDBFails) { shared_ptr<Database> database = DatabaseFactory("lmdb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_FALSE(database->get(key, &new_val)); } @@ -618,8 +618,8 @@ TYPED_TEST(DatabaseTest, TestReadWritePutLMDBPasses) { shared_ptr<Database> database = DatabaseFactory("lmdb"); EXPECT_TRUE(database->open(name, Database::ReadWrite)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); @@ -643,14 +643,14 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetLMDBPasses) { shared_ptr<Database> database = DatabaseFactory("lmdb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); EXPECT_TRUE(database->commit()); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_TRUE(database->get(key, &new_val)); @@ -664,12 +664,12 @@ TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitLMDBFails) { shared_ptr<Database> database = DatabaseFactory("lmdb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_FALSE(database->get(key, &new_val)); } @@ -682,8 +682,8 @@ TYPED_TEST(DatabaseTest, TestReadOnlyPutLMDBFails) { EXPECT_TRUE(database->open(name, Database::ReadOnly)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_FALSE(database->put(key, val)); } @@ -704,8 +704,8 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLMDBPasses) { shared_ptr<Database> database = DatabaseFactory("lmdb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); @@ -715,7 +715,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetLMDBPasses) { EXPECT_TRUE(database->open(name, Database::ReadOnly)); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_TRUE(database->get(key, &new_val)); @@ -727,8 +727,8 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLMDBFails) { shared_ptr<Database> database = DatabaseFactory("lmdb"); EXPECT_TRUE(database->open(name, Database::New)); - Database::buffer_t key = this->TestKey(); - Database::buffer_t val = this->TestValue(); + Database::key_type key = this->TestKey(); + Database::value_type val = this->TestValue(); EXPECT_TRUE(database->put(key, val)); @@ -736,7 +736,7 @@ TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLMDBFails) { EXPECT_TRUE(database->open(name, Database::ReadOnly)); - Database::buffer_t new_val; + Database::value_type new_val; EXPECT_FALSE(database->get(key, &new_val)); } diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 5f6ea6eecc5..d13c4a0f833 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -36,7 +36,7 @@ int main(int argc, char** argv) { int count = 0; // load first datum Database::const_iterator iter = database->begin(); - const Database::buffer_t& first_blob = iter->value; + const Database::value_type& first_blob = iter->value; datum.ParseFromArray(first_blob.data(), first_blob.size()); sum_blob.set_num(1); @@ -53,7 +53,7 @@ int main(int argc, char** argv) { for (Database::const_iterator iter = database->begin(); iter != database->end(); ++iter) { // just a dummy operation - const Database::buffer_t& blob = iter->value; + const Database::value_type& blob = iter->value; datum.ParseFromArray(blob.data(), blob.size()); const std::string& data = datum.data(); size_in_datum = std::max<int>(datum.data().size(), diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 5ad2c0b4d5a..1cdca7e015a 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -110,10 +110,10 @@ int main(int argc, char** argv) { // sequential int length = snprintf(key_cstr, kMaxKeyLength, "%08d_%s", line_id, lines[line_id].first.c_str()); - Database::buffer_t value(datum.ByteSize()); + Database::value_type value(datum.ByteSize()); datum.SerializeWithCachedSizesToArray( reinterpret_cast<unsigned char*>(value.data())); - Database::buffer_t keystr(key_cstr, key_cstr + length); + Database::key_type keystr(key_cstr, key_cstr + length); // Put in db CHECK(database->put(keystr, value)); diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 0c7660d5d49..1340192cbe4 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -155,12 +155,12 @@ int feature_extraction_pipeline(int argc, char** argv) { for (int d = 0; d < dim_features; ++d) { datum.add_float_data(feature_blob_data[d]); } - Database::buffer_t value(datum.ByteSize()); + Database::value_type value(datum.ByteSize()); datum.SerializeWithCachedSizesToArray( reinterpret_cast<unsigned char*>(value.data())); int length = snprintf(key_str, kMaxKeyStrLength, "%d", image_indices[i]); - Database::buffer_t key(key_str, key_str + length); + Database::key_type key(key_str, key_str + length); CHECK(feature_dbs.at(i)->put(key, value)); ++image_indices[i]; if (image_indices[i] % 1000 == 0) { From 08e2cdedbbe4d7178597d6dc1479eccfcce3b0d5 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 21:36:59 -0400 Subject: [PATCH 0933/2053] Added function to Database interface to retrieve keys. Exposed a bug with LMDB iterators. Fix the bug and updated how invalid iterators are represented. --- include/caffe/database.hpp | 11 ++-- include/caffe/leveldb_database.hpp | 5 +- include/caffe/lmdb_database.hpp | 5 +- src/caffe/leveldb_database.cpp | 35 ++++++---- src/caffe/lmdb_database.cpp | 44 +++++++++---- src/caffe/test/test_database.cpp | 101 +++++++++++++++++++++++++++++ 6 files changed, 169 insertions(+), 32 deletions(-) diff --git a/include/caffe/database.hpp b/include/caffe/database.hpp index 2341149ce59..8469e84a1dd 100644 --- a/include/caffe/database.hpp +++ b/include/caffe/database.hpp @@ -33,6 +33,8 @@ class Database { virtual bool commit() = 0; virtual void close() = 0; + virtual void keys(vector<key_type>* keys) = 0; + Database() { } virtual ~Database() { } @@ -65,7 +67,8 @@ class Database { iterator(const iterator& other) : parent_(other.parent_), - state_(other.state_->clone()) { } + state_(other.state_ ? other.state_->clone() + : shared_ptr<DatabaseState>()) { } iterator& operator=(iterator copy) { copy.swap(*this); @@ -86,12 +89,12 @@ class Database { } iterator& operator++() { - parent_->increment(state_); + parent_->increment(&state_); return *this; } iterator operator++(int) { iterator copy(*this); - parent_->increment(state_); + parent_->increment(&state_); return copy; } @@ -117,7 +120,7 @@ class Database { virtual bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const = 0; - virtual void increment(shared_ptr<DatabaseState> state) const = 0; + virtual void increment(shared_ptr<DatabaseState>* state) const = 0; virtual KV& dereference( shared_ptr<DatabaseState> state) const = 0; }; diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index 9c7f70ec053..48cf11e06d4 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -6,6 +6,7 @@ #include <string> #include <utility> +#include <vector> #include "caffe/common.hpp" #include "caffe/database.hpp" @@ -20,6 +21,8 @@ class LeveldbDatabase : public Database { bool commit(); void close(); + void keys(vector<key_type>* keys); + const_iterator begin() const; const_iterator cbegin() const; const_iterator end() const; @@ -62,7 +65,7 @@ class LeveldbDatabase : public Database { bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const; - void increment(shared_ptr<DatabaseState> state) const; + void increment(shared_ptr<DatabaseState>* state) const; Database::KV& dereference(shared_ptr<DatabaseState> state) const; shared_ptr<leveldb::DB> db_; diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index 107d936da83..a8ce60dada5 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -3,6 +3,7 @@ #include <string> #include <utility> +#include <vector> #include "lmdb.h" @@ -24,6 +25,8 @@ class LmdbDatabase : public Database { bool commit(); void close(); + void keys(vector<key_type>* keys); + const_iterator begin() const; const_iterator cbegin() const; const_iterator end() const; @@ -66,7 +69,7 @@ class LmdbDatabase : public Database { bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const; - void increment(shared_ptr<DatabaseState> state) const; + void increment(shared_ptr<DatabaseState>* state) const; Database::KV& dereference(shared_ptr<DatabaseState> state) const; MDB_env* env_; diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index 2061b8ea65e..ad98f9e2d4f 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -1,5 +1,6 @@ #include <string> #include <utility> +#include <vector> #include "caffe/leveldb_database.hpp" @@ -115,6 +116,16 @@ void LeveldbDatabase::close() { db_.reset(); } +void LeveldbDatabase::keys(vector<key_type>* keys) { + LOG(INFO) << "LevelDB: Keys"; + + keys->clear(); + for (Database::const_iterator iter = begin(); iter != end(); ++iter) { + LOG(INFO) << "KEY"; + keys->push_back(iter->key); + } +} + LeveldbDatabase::const_iterator LeveldbDatabase::begin() const { CHECK_NOTNULL(db_.get()); shared_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); @@ -122,13 +133,16 @@ LeveldbDatabase::const_iterator LeveldbDatabase::begin() const { if (!iter->Valid()) { iter.reset(); } - shared_ptr<DatabaseState> state(new LeveldbState(db_, iter)); + + shared_ptr<DatabaseState> state; + if (iter) { + state.reset(new LeveldbState(db_, iter)); + } return const_iterator(this, state); } LeveldbDatabase::const_iterator LeveldbDatabase::end() const { - shared_ptr<leveldb::Iterator> iter; - shared_ptr<DatabaseState> state(new LeveldbState(db_, iter)); + shared_ptr<DatabaseState> state; return const_iterator(this, state); } @@ -143,25 +157,20 @@ bool LeveldbDatabase::equal(shared_ptr<DatabaseState> state1, shared_ptr<LeveldbState> leveldb_state1 = boost::dynamic_pointer_cast<LeveldbState>(state1); - CHECK_NOTNULL(leveldb_state1.get()); - shared_ptr<LeveldbState> leveldb_state2 = boost::dynamic_pointer_cast<LeveldbState>(state2); - CHECK_NOTNULL(leveldb_state2.get()); - - CHECK(!leveldb_state1->iter_ || leveldb_state1->iter_->Valid()); - CHECK(!leveldb_state2->iter_ || leveldb_state2->iter_->Valid()); + LOG(INFO) << leveldb_state1 << " " << leveldb_state2; // The KV store doesn't really have any sort of ordering, // so while we can do a sequential scan over the collection, // we can't really use subranges. - return !leveldb_state1->iter_ && !leveldb_state2->iter_; + return !leveldb_state1 && !leveldb_state2; } -void LeveldbDatabase::increment(shared_ptr<DatabaseState> state) const { +void LeveldbDatabase::increment(shared_ptr<DatabaseState>* state) const { shared_ptr<LeveldbState> leveldb_state = - boost::dynamic_pointer_cast<LeveldbState>(state); + boost::dynamic_pointer_cast<LeveldbState>(*state); CHECK_NOTNULL(leveldb_state.get()); @@ -172,7 +181,7 @@ void LeveldbDatabase::increment(shared_ptr<DatabaseState> state) const { iter->Next(); if (!iter->Valid()) { - iter.reset(); + state->reset(); } } diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index eb22d15f28d..aabb733b635 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -2,6 +2,7 @@ #include <string> #include <utility> +#include <vector> #include "caffe/lmdb_database.hpp" @@ -168,22 +169,43 @@ void LmdbDatabase::close() { } } +void LmdbDatabase::keys(vector<key_type>* keys) { + LOG(INFO) << "LMDB: Keys"; + + keys->clear(); + for (Database::const_iterator iter = begin(); iter != end(); ++iter) { + keys->push_back(iter->key); + } +} + LmdbDatabase::const_iterator LmdbDatabase::begin() const { - MDB_cursor* cursor; int retval; - retval = mdb_cursor_open(txn_, dbi_, &cursor); + + MDB_txn* iter_txn; + + retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &iter_txn); + CHECK_EQ(MDB_SUCCESS, retval) << "mdb_txn_begin failed " + << mdb_strerror(retval); + + MDB_cursor* cursor; + retval = mdb_cursor_open(iter_txn, dbi_, &cursor); CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); MDB_val key; MDB_val val; retval = mdb_cursor_get(cursor, &key, &val, MDB_FIRST); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - shared_ptr<DatabaseState> state(new LmdbState(cursor, txn_, &dbi_)); + CHECK(MDB_SUCCESS == retval || MDB_NOTFOUND == retval) + << mdb_strerror(retval); + + shared_ptr<DatabaseState> state; + if (MDB_SUCCESS == retval) { + state.reset(new LmdbState(cursor, iter_txn, &dbi_)); + } return const_iterator(this, state); } LmdbDatabase::const_iterator LmdbDatabase::end() const { - shared_ptr<DatabaseState> state(new LmdbState(NULL, txn_, &dbi_)); + shared_ptr<DatabaseState> state; return const_iterator(this, state); } @@ -195,22 +217,18 @@ bool LmdbDatabase::equal(shared_ptr<DatabaseState> state1, shared_ptr<LmdbState> lmdb_state1 = boost::dynamic_pointer_cast<LmdbState>(state1); - CHECK_NOTNULL(lmdb_state1.get()); - shared_ptr<LmdbState> lmdb_state2 = boost::dynamic_pointer_cast<LmdbState>(state2); - CHECK_NOTNULL(lmdb_state2.get()); - // The KV store doesn't really have any sort of ordering, // so while we can do a sequential scan over the collection, // we can't really use subranges. - return !lmdb_state1->cursor_ && !lmdb_state2->cursor_; + return !lmdb_state1 && !lmdb_state2; } -void LmdbDatabase::increment(shared_ptr<DatabaseState> state) const { +void LmdbDatabase::increment(shared_ptr<DatabaseState>* state) const { shared_ptr<LmdbState> lmdb_state = - boost::dynamic_pointer_cast<LmdbState>(state); + boost::dynamic_pointer_cast<LmdbState>(*state); CHECK_NOTNULL(lmdb_state.get()); @@ -223,7 +241,7 @@ void LmdbDatabase::increment(shared_ptr<DatabaseState> state) const { int retval = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); if (MDB_NOTFOUND == retval) { mdb_cursor_close(cursor); - cursor = NULL; + state->reset(); } else { CHECK_EQ(MDB_SUCCESS, retval) << mdb_strerror(retval); } diff --git a/src/caffe/test/test_database.cpp b/src/caffe/test/test_database.cpp index ad1c786465a..9c569106f10 100644 --- a/src/caffe/test/test_database.cpp +++ b/src/caffe/test/test_database.cpp @@ -112,6 +112,56 @@ TYPED_TEST(DatabaseTest, TestReadWriteDoesntExistLevelDBPasses) { database->close(); } +TYPED_TEST(DatabaseTest, TestKeysLevelDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + EXPECT_TRUE(database->open(name, Database::New)); + + Database::key_type key1 = this->TestKey(); + Database::value_type value1 = this->TestValue(); + + EXPECT_TRUE(database->put(key1, value1)); + + Database::key_type key2 = this->TestAltKey(); + Database::value_type value2 = this->TestAltValue(); + + EXPECT_TRUE(database->put(key2, value2)); + + EXPECT_TRUE(database->commit()); + + vector<Database::key_type> keys; + database->keys(&keys); + + EXPECT_EQ(2, keys.size()); + + EXPECT_TRUE(this->BufferEq(keys.at(0), key1) || + this->BufferEq(keys.at(0), key2)); + EXPECT_TRUE(this->BufferEq(keys.at(1), key1) || + this->BufferEq(keys.at(2), key2)); + EXPECT_FALSE(this->BufferEq(keys.at(0), keys.at(1))); +} + +TYPED_TEST(DatabaseTest, TestKeysNoCommitLevelDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("leveldb"); + EXPECT_TRUE(database->open(name, Database::New)); + + Database::key_type key1 = this->TestKey(); + Database::value_type value1 = this->TestValue(); + + EXPECT_TRUE(database->put(key1, value1)); + + Database::key_type key2 = this->TestAltKey(); + Database::value_type value2 = this->TestAltValue(); + + EXPECT_TRUE(database->put(key2, value2)); + + vector<Database::key_type> keys; + database->keys(&keys); + + EXPECT_EQ(0, keys.size()); +} + TYPED_TEST(DatabaseTest, TestIteratorsLevelDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("leveldb"); @@ -451,6 +501,57 @@ TYPED_TEST(DatabaseTest, TestReadWriteDoesntExistLMDBPasses) { database->close(); } +TYPED_TEST(DatabaseTest, TestKeysLMDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + EXPECT_TRUE(database->open(name, Database::New)); + + Database::key_type key1 = this->TestKey(); + Database::value_type value1 = this->TestValue(); + + EXPECT_TRUE(database->put(key1, value1)); + + Database::key_type key2 = this->TestAltKey(); + Database::value_type value2 = this->TestAltValue(); + + EXPECT_TRUE(database->put(key2, value2)); + + EXPECT_TRUE(database->commit()); + + vector<Database::key_type> keys; + database->keys(&keys); + + EXPECT_EQ(2, keys.size()); + + EXPECT_TRUE(this->BufferEq(keys.at(0), key1) || + this->BufferEq(keys.at(0), key2)); + EXPECT_TRUE(this->BufferEq(keys.at(1), key1) || + this->BufferEq(keys.at(2), key2)); + EXPECT_FALSE(this->BufferEq(keys.at(0), keys.at(1))); +} + +TYPED_TEST(DatabaseTest, TestKeysNoCommitLMDB) { + string name = this->DBName(); + shared_ptr<Database> database = DatabaseFactory("lmdb"); + EXPECT_TRUE(database->open(name, Database::New)); + + Database::key_type key1 = this->TestKey(); + Database::value_type value1 = this->TestValue(); + + EXPECT_TRUE(database->put(key1, value1)); + + Database::key_type key2 = this->TestAltKey(); + Database::value_type value2 = this->TestAltValue(); + + EXPECT_TRUE(database->put(key2, value2)); + + vector<Database::key_type> keys; + database->keys(&keys); + + EXPECT_EQ(0, keys.size()); +} + + TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { string name = this->DBName(); shared_ptr<Database> database = DatabaseFactory("lmdb"); From 0987c72c9d11b94524e1dc91150daf273c5b2537 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sun, 12 Oct 2014 21:39:33 -0400 Subject: [PATCH 0934/2053] Switched some Database logging statements from LOG to DLOG. --- src/caffe/leveldb_database.cpp | 23 ++++++++++------------- src/caffe/lmdb_database.cpp | 12 ++++++------ 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index ad98f9e2d4f..a163abc09af 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -7,30 +7,30 @@ namespace caffe { bool LeveldbDatabase::open(const string& filename, Mode mode) { - LOG(INFO) << "LevelDB: Open " << filename; + DLOG(INFO) << "LevelDB: Open " << filename; leveldb::Options options; switch (mode) { case New: - LOG(INFO) << " mode NEW"; + DLOG(INFO) << " mode NEW"; options.error_if_exists = true; options.create_if_missing = true; read_only_ = false; break; case ReadWrite: - LOG(INFO) << " mode RW"; + DLOG(INFO) << " mode RW"; options.error_if_exists = false; options.create_if_missing = true; read_only_ = false; break; case ReadOnly: - LOG(INFO) << " mode RO"; + DLOG(INFO) << " mode RO"; options.error_if_exists = false; options.create_if_missing = false; read_only_ = true; break; default: - LOG(FATAL) << "unknown mode " << mode; + DLOG(FATAL) << "unknown mode " << mode; } options.write_buffer_size = 268435456; options.max_open_files = 100; @@ -53,7 +53,7 @@ bool LeveldbDatabase::open(const string& filename, Mode mode) { } bool LeveldbDatabase::put(const key_type& key, const value_type& value) { - LOG(INFO) << "LevelDB: Put"; + DLOG(INFO) << "LevelDB: Put"; if (read_only_) { LOG(ERROR) << "put can not be used on a database in ReadOnly mode"; @@ -71,7 +71,7 @@ bool LeveldbDatabase::put(const key_type& key, const value_type& value) { } bool LeveldbDatabase::get(const key_type& key, value_type* value) { - LOG(INFO) << "LevelDB: Get"; + DLOG(INFO) << "LevelDB: Get"; leveldb::Slice key_slice(key.data(), key.size()); @@ -92,7 +92,7 @@ bool LeveldbDatabase::get(const key_type& key, value_type* value) { } bool LeveldbDatabase::commit() { - LOG(INFO) << "LevelDB: Commit"; + DLOG(INFO) << "LevelDB: Commit"; if (read_only_) { LOG(ERROR) << "commit can not be used on a database in ReadOnly mode"; @@ -110,18 +110,17 @@ bool LeveldbDatabase::commit() { } void LeveldbDatabase::close() { - LOG(INFO) << "LevelDB: Close"; + DLOG(INFO) << "LevelDB: Close"; batch_.reset(); db_.reset(); } void LeveldbDatabase::keys(vector<key_type>* keys) { - LOG(INFO) << "LevelDB: Keys"; + DLOG(INFO) << "LevelDB: Keys"; keys->clear(); for (Database::const_iterator iter = begin(); iter != end(); ++iter) { - LOG(INFO) << "KEY"; keys->push_back(iter->key); } } @@ -160,8 +159,6 @@ bool LeveldbDatabase::equal(shared_ptr<DatabaseState> state1, shared_ptr<LeveldbState> leveldb_state2 = boost::dynamic_pointer_cast<LeveldbState>(state2); - LOG(INFO) << leveldb_state1 << " " << leveldb_state2; - // The KV store doesn't really have any sort of ordering, // so while we can do a sequential scan over the collection, // we can't really use subranges. diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index aabb733b635..de94391ae7d 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -9,7 +9,7 @@ namespace caffe { bool LmdbDatabase::open(const string& filename, Mode mode) { - LOG(INFO) << "LMDB: Open " << filename; + DLOG(INFO) << "LMDB: Open " << filename; CHECK(NULL == env_); CHECK(NULL == txn_); @@ -79,7 +79,7 @@ bool LmdbDatabase::open(const string& filename, Mode mode) { } bool LmdbDatabase::put(const key_type& key, const value_type& value) { - LOG(INFO) << "LMDB: Put"; + DLOG(INFO) << "LMDB: Put"; // MDB_val::mv_size is not const, so we need to make a local copy. key_type local_key = key; @@ -104,7 +104,7 @@ bool LmdbDatabase::put(const key_type& key, const value_type& value) { } bool LmdbDatabase::get(const key_type& key, value_type* value) { - LOG(INFO) << "LMDB: Get"; + DLOG(INFO) << "LMDB: Get"; key_type local_key = key; @@ -137,7 +137,7 @@ bool LmdbDatabase::get(const key_type& key, value_type* value) { } bool LmdbDatabase::commit() { - LOG(INFO) << "LMDB: Commit"; + DLOG(INFO) << "LMDB: Commit"; CHECK_NOTNULL(txn_); @@ -158,7 +158,7 @@ bool LmdbDatabase::commit() { } void LmdbDatabase::close() { - LOG(INFO) << "LMDB: Close"; + DLOG(INFO) << "LMDB: Close"; if (env_ && dbi_) { mdb_close(env_, dbi_); @@ -170,7 +170,7 @@ void LmdbDatabase::close() { } void LmdbDatabase::keys(vector<key_type>* keys) { - LOG(INFO) << "LMDB: Keys"; + DLOG(INFO) << "LMDB: Keys"; keys->clear(); for (Database::const_iterator iter = begin(); iter != end(); ++iter) { From 08b971feae8551ca5c7ce31a938a1f232ee56af2 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Mon, 13 Oct 2014 13:16:04 -0400 Subject: [PATCH 0935/2053] Templated the key and value types for the Database interface. The Database is now responsible for serialization. Refactored the tests so that they reuse the same code for each value type and backend configuration. --- examples/cifar10/convert_cifar_data.cpp | 25 +- include/caffe/data_layers.hpp | 4 +- include/caffe/database.hpp | 116 ++- include/caffe/database_factory.hpp | 7 +- include/caffe/leveldb_database.hpp | 23 +- include/caffe/lmdb_database.hpp | 23 +- src/caffe/database_factory.cpp | 31 +- src/caffe/layers/data_layer.cpp | 11 +- src/caffe/leveldb_database.cpp | 95 ++- src/caffe/lmdb_database.cpp | 113 +-- src/caffe/test/test_data_layer.cpp | 12 +- src/caffe/test/test_database.cpp | 901 +++++++++--------------- tools/compute_image_mean.cpp | 16 +- tools/convert_imageset.cpp | 11 +- tools/extract_features.cpp | 14 +- 15 files changed, 689 insertions(+), 713 deletions(-) diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index 46ab1558623..f86f3936a35 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -20,6 +20,7 @@ using std::string; using caffe::Database; using caffe::DatabaseFactory; +using caffe::Datum; using caffe::shared_ptr; const int kCIFARSize = 32; @@ -37,13 +38,14 @@ void read_image(std::ifstream* file, int* label, char* buffer) { void convert_dataset(const string& input_folder, const string& output_folder, const string& db_type) { - shared_ptr<Database> train_database = DatabaseFactory(db_type); + shared_ptr<Database<string, Datum> > train_database = + DatabaseFactory<string, Datum>(db_type); CHECK(train_database->open(output_folder + "/cifar10_train_" + db_type, - Database::New)); + Database<string, Datum>::New)); // Data buffer int label; char str_buffer[kCIFARImageNBytes]; - caffe::Datum datum; + Datum datum; datum.set_channels(3); datum.set_height(kCIFARSize); datum.set_width(kCIFARSize); @@ -60,22 +62,19 @@ void convert_dataset(const string& input_folder, const string& output_folder, read_image(&data_file, &label, str_buffer); datum.set_label(label); datum.set_data(str_buffer, kCIFARImageNBytes); - Database::value_type value(datum.ByteSize()); - datum.SerializeWithCachedSizesToArray( - reinterpret_cast<unsigned char*>(value.data())); int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", fileid * kCIFARBatchSize + itemid); - Database::key_type key(str_buffer, str_buffer + length); - CHECK(train_database->put(key, value)); + CHECK(train_database->put(string(str_buffer, length), datum)); } } CHECK(train_database->commit()); train_database->close(); LOG(INFO) << "Writing Testing data"; - shared_ptr<Database> test_database = DatabaseFactory(db_type); + shared_ptr<Database<string, Datum> > test_database = + DatabaseFactory<string, Datum>(db_type); CHECK(test_database->open(output_folder + "/cifar10_test_" + db_type, - Database::New)); + Database<string, Datum>::New)); // Open files std::ifstream data_file((input_folder + "/test_batch.bin").c_str(), std::ios::in | std::ios::binary); @@ -84,12 +83,8 @@ void convert_dataset(const string& input_folder, const string& output_folder, read_image(&data_file, &label, str_buffer); datum.set_label(label); datum.set_data(str_buffer, kCIFARImageNBytes); - Database::value_type value(datum.ByteSize()); - datum.SerializeWithCachedSizesToArray( - reinterpret_cast<unsigned char*>(value.data())); int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid); - Database::key_type key(str_buffer, str_buffer + length); - CHECK(test_database->put(key, value)); + CHECK(test_database->put(string(str_buffer, length), datum)); } CHECK(test_database->commit()); test_database->close(); diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 810f2bb833d..13ba4e6f8b3 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -100,8 +100,8 @@ class DataLayer : public BasePrefetchingDataLayer<Dtype> { protected: virtual void InternalThreadEntry(); - shared_ptr<Database> database_; - Database::const_iterator iter_; + shared_ptr<Database<string, Datum> > database_; + Database<string, Datum>::const_iterator iter_; }; /** diff --git a/include/caffe/database.hpp b/include/caffe/database.hpp index 8469e84a1dd..711ebdd3fa0 100644 --- a/include/caffe/database.hpp +++ b/include/caffe/database.hpp @@ -11,6 +11,83 @@ namespace caffe { +namespace database_internal { + +template <typename T> +struct Coder { + static bool serialize(const T& obj, string* serialized) { + return obj.SerializeToString(serialized); + } + + static bool serialize(const T& obj, vector<char>* serialized) { + serialized->resize(obj.ByteSize()); + return obj.SerializeWithCachedSizesToArray( + reinterpret_cast<unsigned char*>(serialized->data())); + } + + static bool deserialize(const string& serialized, T* obj) { + return obj->ParseFromString(serialized); + } + + static bool deserialize(const char* data, size_t size, T* obj) { + return obj->ParseFromArray(data, size); + } +}; + +template <> +struct Coder<string> { + static bool serialize(string obj, string* serialized) { + *serialized = obj; + return true; + } + + static bool serialize(const string& obj, vector<char>* serialized) { + vector<char> temp(obj.data(), obj.data() + obj.size()); + serialized->swap(temp); + return true; + } + + static bool deserialize(const string& serialized, string* obj) { + *obj = serialized; + return true; + } + + static bool deserialize(const char* data, size_t size, string* obj) { + string temp_string(data, size); + obj->swap(temp_string); + return true; + } +}; + +template <> +struct Coder<vector<char> > { + static bool serialize(vector<char> obj, string* serialized) { + string tmp(obj.data(), obj.size()); + serialized->swap(tmp); + return true; + } + + static bool serialize(const vector<char>& obj, vector<char>* serialized) { + *serialized = obj; + return true; + } + + static bool deserialize(const string& serialized, vector<char>* obj) { + vector<char> tmp(serialized.data(), serialized.data() + serialized.size()); + obj->swap(tmp); + return true; + } + + static bool deserialize(const char* data, size_t size, vector<char>* obj) { + vector<char> tmp(data, data + size); + obj->swap(tmp); + return true; + } +}; + +} // namespace database_internal + +template <typename K, typename V> class Database { public: enum Mode { @@ -19,21 +96,21 @@ class Database { ReadOnly }; - typedef vector<char> key_type; - typedef vector<char> value_type; + typedef K key_type; + typedef V value_type; struct KV { - key_type key; - value_type value; + K key; + V value; }; virtual bool open(const string& filename, Mode mode) = 0; - virtual bool put(const key_type& key, const value_type& value) = 0; - virtual bool get(const key_type& key, value_type* value) = 0; + virtual bool put(const K& key, const V& value) = 0; + virtual bool get(const K& key, V* value) = 0; virtual bool commit() = 0; virtual void close() = 0; - virtual void keys(vector<key_type>* keys) = 0; + virtual void keys(vector<K>* keys) = 0; Database() { } virtual ~Database() { } @@ -123,8 +200,33 @@ class Database { virtual void increment(shared_ptr<DatabaseState>* state) const = 0; virtual KV& dereference( shared_ptr<DatabaseState> state) const = 0; + + template <typename T> + static bool serialize(const T& obj, string* serialized) { + return database_internal::Coder<T>::serialize(obj, serialized); + } + + template <typename T> + static bool serialize(const T& obj, vector<char>* serialized) { + return database_internal::Coder<T>::serialize(obj, serialized); + } + + template <typename T> + static bool deserialize(const string& serialized, T* obj) { + return database_internal::Coder<T>::deserialize(serialized, obj); + } + + template <typename T> + static bool deserialize(const char* data, size_t size, T* obj) { + return database_internal::Coder<T>::deserialize(data, size, obj); + } }; } // namespace caffe +#define INSTANTIATE_DATABASE(type) \ + template class type<string, string>; \ + template class type<string, vector<char> >; \ + template class type<string, Datum>; + #endif // CAFFE_DATABASE_H_ diff --git a/include/caffe/database_factory.hpp b/include/caffe/database_factory.hpp index 91185e99b89..30f191e76b4 100644 --- a/include/caffe/database_factory.hpp +++ b/include/caffe/database_factory.hpp @@ -9,8 +9,11 @@ namespace caffe { -shared_ptr<Database> DatabaseFactory(const DataParameter_DB& type); -shared_ptr<Database> DatabaseFactory(const string& type); +template <typename K, typename V> +shared_ptr<Database<K, V> > DatabaseFactory(const DataParameter_DB& type); + +template <typename K, typename V> +shared_ptr<Database<K, V> > DatabaseFactory(const string& type); } // namespace caffe diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_database.hpp index 48cf11e06d4..cd966c440cc 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_database.hpp @@ -13,15 +13,24 @@ namespace caffe { -class LeveldbDatabase : public Database { +template <typename K, typename V> +class LeveldbDatabase : public Database<K, V> { public: + typedef Database<K, V> Base; + typedef typename Base::key_type key_type; + typedef typename Base::value_type value_type; + typedef typename Base::DatabaseState DatabaseState; + typedef typename Base::Mode Mode; + typedef typename Base::const_iterator const_iterator; + typedef typename Base::KV KV; + bool open(const string& filename, Mode mode); - bool put(const key_type& key, const value_type& value); - bool get(const key_type& key, value_type* value); + bool put(const K& key, const V& value); + bool get(const K& key, V* value); bool commit(); void close(); - void keys(vector<key_type>* keys); + void keys(vector<K>* keys); const_iterator begin() const; const_iterator cbegin() const; @@ -29,11 +38,11 @@ class LeveldbDatabase : public Database { const_iterator cend() const; protected: - class LeveldbState : public Database::DatabaseState { + class LeveldbState : public DatabaseState { public: explicit LeveldbState(shared_ptr<leveldb::DB> db, shared_ptr<leveldb::Iterator> iter) - : Database::DatabaseState(), + : DatabaseState(), db_(db), iter_(iter) { } @@ -66,7 +75,7 @@ class LeveldbDatabase : public Database { bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const; void increment(shared_ptr<DatabaseState>* state) const; - Database::KV& dereference(shared_ptr<DatabaseState> state) const; + KV& dereference(shared_ptr<DatabaseState> state) const; shared_ptr<leveldb::DB> db_; shared_ptr<leveldb::WriteBatch> batch_; diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_database.hpp index a8ce60dada5..b5a02ca46a7 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_database.hpp @@ -12,20 +12,29 @@ namespace caffe { -class LmdbDatabase : public Database { +template <typename K, typename V> +class LmdbDatabase : public Database<K, V> { public: + typedef Database<K, V> Base; + typedef typename Base::key_type key_type; + typedef typename Base::value_type value_type; + typedef typename Base::DatabaseState DatabaseState; + typedef typename Base::Mode Mode; + typedef typename Base::const_iterator const_iterator; + typedef typename Base::KV KV; + LmdbDatabase() : env_(NULL), dbi_(0), txn_(NULL) { } bool open(const string& filename, Mode mode); - bool put(const key_type& key, const value_type& value); - bool get(const key_type& key, value_type* value); + bool put(const K& key, const V& value); + bool get(const K& key, V* value); bool commit(); void close(); - void keys(vector<key_type>* keys); + void keys(vector<K>* keys); const_iterator begin() const; const_iterator cbegin() const; @@ -33,10 +42,10 @@ class LmdbDatabase : public Database { const_iterator cend() const; protected: - class LmdbState : public Database::DatabaseState { + class LmdbState : public DatabaseState { public: explicit LmdbState(MDB_cursor* cursor, MDB_txn* txn, const MDB_dbi* dbi) - : Database::DatabaseState(), + : DatabaseState(), cursor_(cursor), txn_(txn), dbi_(dbi) { } @@ -70,7 +79,7 @@ class LmdbDatabase : public Database { bool equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const; void increment(shared_ptr<DatabaseState>* state) const; - Database::KV& dereference(shared_ptr<DatabaseState> state) const; + KV& dereference(shared_ptr<DatabaseState> state) const; MDB_env* env_; MDB_dbi dbi_; diff --git a/src/caffe/database_factory.cpp b/src/caffe/database_factory.cpp index 062de8c02e3..4ccd429ef97 100644 --- a/src/caffe/database_factory.cpp +++ b/src/caffe/database_factory.cpp @@ -1,5 +1,6 @@ #include <string> #include <utility> +#include <vector> #include "caffe/database_factory.hpp" #include "caffe/leveldb_database.hpp" @@ -7,29 +8,43 @@ namespace caffe { -shared_ptr<Database> DatabaseFactory(const DataParameter_DB& type) { +template <typename K, typename V> +shared_ptr<Database<K, V> > DatabaseFactory(const DataParameter_DB& type) { switch (type) { case DataParameter_DB_LEVELDB: - return shared_ptr<Database>(new LeveldbDatabase()); + return shared_ptr<Database<K, V> >(new LeveldbDatabase<K, V>()); case DataParameter_DB_LMDB: - return shared_ptr<Database>(new LmdbDatabase()); + return shared_ptr<Database<K, V> >(new LmdbDatabase<K, V>()); default: LOG(FATAL) << "Unknown database type " << type; - return shared_ptr<Database>(); + return shared_ptr<Database<K, V> >(); } } -shared_ptr<Database> DatabaseFactory(const string& type) { +template <typename K, typename V> +shared_ptr<Database<K, V> > DatabaseFactory(const string& type) { if ("leveldb" == type) { - return DatabaseFactory(DataParameter_DB_LEVELDB); + return DatabaseFactory<K, V>(DataParameter_DB_LEVELDB); } else if ("lmdb" == type) { - return DatabaseFactory(DataParameter_DB_LMDB); + return DatabaseFactory<K, V>(DataParameter_DB_LMDB); } else { LOG(FATAL) << "Unknown database type " << type; - return shared_ptr<Database>(); + return shared_ptr<Database<K, V> >(); } } +#define REGISTER_DATABASE(key_type, value_type) \ + template shared_ptr<Database<key_type, value_type> > \ + DatabaseFactory(const string& type); \ + template shared_ptr<Database<key_type, value_type> > \ + DatabaseFactory(const DataParameter_DB& type); \ + +REGISTER_DATABASE(string, string); +REGISTER_DATABASE(string, vector<char>); +REGISTER_DATABASE(string, Datum); + +#undef REGISTER_DATABASE + } // namespace caffe diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index c379d78d8f3..6296335276e 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -25,10 +25,11 @@ template <typename Dtype> void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // Initialize DB - database_ = DatabaseFactory(this->layer_param_.data_param().backend()); + database_ = DatabaseFactory<string, Datum>( + this->layer_param_.data_param().backend()); const string& source = this->layer_param_.data_param().source(); LOG(INFO) << "Opening database " << source; - CHECK(database_->open(source, Database::ReadOnly)); + CHECK(database_->open(source, Database<string, Datum>::ReadOnly)); iter_ = database_->begin(); // Check if we would need to randomly skip a few data points @@ -44,8 +45,7 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, } // Read a data point, and use it to initialize the top blob. CHECK(iter_ != database_->end()); - Datum datum; - datum.ParseFromArray(iter_->value.data(), iter_->value.size()); + const Datum& datum = iter_->value; // image int crop_size = this->layer_param_.transform_param().crop_size(); @@ -89,9 +89,8 @@ void DataLayer<Dtype>::InternalThreadEntry() { const int batch_size = this->layer_param_.data_param().batch_size(); for (int item_id = 0; item_id < batch_size; ++item_id) { - Datum datum; CHECK(iter_ != database_->end()); - datum.ParseFromArray(iter_->value.data(), iter_->value.size()); + const Datum& datum = iter_->value; // Apply data transformations (mirror, scale, crop...) int offset = this->prefetch_data_.offset(item_id); diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_database.cpp index a163abc09af..267ddf07330 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_database.cpp @@ -2,28 +2,30 @@ #include <utility> #include <vector> +#include "caffe/caffe.hpp" #include "caffe/leveldb_database.hpp" namespace caffe { -bool LeveldbDatabase::open(const string& filename, Mode mode) { +template <typename K, typename V> +bool LeveldbDatabase<K, V>::open(const string& filename, Mode mode) { DLOG(INFO) << "LevelDB: Open " << filename; leveldb::Options options; switch (mode) { - case New: + case Base::New: DLOG(INFO) << " mode NEW"; options.error_if_exists = true; options.create_if_missing = true; read_only_ = false; break; - case ReadWrite: + case Base::ReadWrite: DLOG(INFO) << " mode RW"; options.error_if_exists = false; options.create_if_missing = true; read_only_ = false; break; - case ReadOnly: + case Base::ReadOnly: DLOG(INFO) << " mode RO"; options.error_if_exists = false; options.create_if_missing = false; @@ -52,7 +54,8 @@ bool LeveldbDatabase::open(const string& filename, Mode mode) { return true; } -bool LeveldbDatabase::put(const key_type& key, const value_type& value) { +template <typename K, typename V> +bool LeveldbDatabase<K, V>::put(const K& key, const V& value) { DLOG(INFO) << "LevelDB: Put"; if (read_only_) { @@ -62,36 +65,48 @@ bool LeveldbDatabase::put(const key_type& key, const value_type& value) { CHECK_NOTNULL(batch_.get()); - leveldb::Slice key_slice(key.data(), key.size()); - leveldb::Slice value_slice(value.data(), value.size()); + string serialized_key; + if (!Base::serialize(key, &serialized_key)) { + return false; + } + + string serialized_value; + if (!Base::serialize(value, &serialized_value)) { + return false; + } - batch_->Put(key_slice, value_slice); + batch_->Put(serialized_key, serialized_value); return true; } -bool LeveldbDatabase::get(const key_type& key, value_type* value) { +template <typename K, typename V> +bool LeveldbDatabase<K, V>::get(const K& key, V* value) { DLOG(INFO) << "LevelDB: Get"; - leveldb::Slice key_slice(key.data(), key.size()); + string serialized_key; + if (!Base::serialize(key, &serialized_key)) { + return false; + } - string value_string; + string serialized_value; leveldb::Status status = - db_->Get(leveldb::ReadOptions(), key_slice, &value_string); + db_->Get(leveldb::ReadOptions(), serialized_key, &serialized_value); if (!status.ok()) { LOG(ERROR) << "leveldb get failed"; return false; } - Database::value_type temp_value(value_string.data(), - value_string.data() + value_string.size()); - value->swap(temp_value); + if (!Base::deserialize(serialized_value, value)) { + return false; + } return true; } -bool LeveldbDatabase::commit() { +template <typename K, typename V> +bool LeveldbDatabase<K, V>::commit() { DLOG(INFO) << "LevelDB: Commit"; if (read_only_) { @@ -109,23 +124,27 @@ bool LeveldbDatabase::commit() { return status.ok(); } -void LeveldbDatabase::close() { +template <typename K, typename V> +void LeveldbDatabase<K, V>::close() { DLOG(INFO) << "LevelDB: Close"; batch_.reset(); db_.reset(); } -void LeveldbDatabase::keys(vector<key_type>* keys) { +template <typename K, typename V> +void LeveldbDatabase<K, V>::keys(vector<K>* keys) { DLOG(INFO) << "LevelDB: Keys"; keys->clear(); - for (Database::const_iterator iter = begin(); iter != end(); ++iter) { + for (const_iterator iter = begin(); iter != end(); ++iter) { keys->push_back(iter->key); } } -LeveldbDatabase::const_iterator LeveldbDatabase::begin() const { +template <typename K, typename V> +typename LeveldbDatabase<K, V>::const_iterator + LeveldbDatabase<K, V>::begin() const { CHECK_NOTNULL(db_.get()); shared_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); iter->SeekToFirst(); @@ -140,18 +159,25 @@ LeveldbDatabase::const_iterator LeveldbDatabase::begin() const { return const_iterator(this, state); } -LeveldbDatabase::const_iterator LeveldbDatabase::end() const { +template <typename K, typename V> +typename LeveldbDatabase<K, V>::const_iterator + LeveldbDatabase<K, V>::end() const { shared_ptr<DatabaseState> state; return const_iterator(this, state); } -LeveldbDatabase::const_iterator LeveldbDatabase::cbegin() const { +template <typename K, typename V> +typename LeveldbDatabase<K, V>::const_iterator + LeveldbDatabase<K, V>::cbegin() const { return begin(); } -LeveldbDatabase::const_iterator LeveldbDatabase::cend() const { return end(); } +template <typename K, typename V> +typename LeveldbDatabase<K, V>::const_iterator + LeveldbDatabase<K, V>::cend() const { return end(); } -bool LeveldbDatabase::equal(shared_ptr<DatabaseState> state1, +template <typename K, typename V> +bool LeveldbDatabase<K, V>::equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const { shared_ptr<LeveldbState> leveldb_state1 = boost::dynamic_pointer_cast<LeveldbState>(state1); @@ -165,7 +191,8 @@ bool LeveldbDatabase::equal(shared_ptr<DatabaseState> state1, return !leveldb_state1 && !leveldb_state2; } -void LeveldbDatabase::increment(shared_ptr<DatabaseState>* state) const { +template <typename K, typename V> +void LeveldbDatabase<K, V>::increment(shared_ptr<DatabaseState>* state) const { shared_ptr<LeveldbState> leveldb_state = boost::dynamic_pointer_cast<LeveldbState>(*state); @@ -182,7 +209,8 @@ void LeveldbDatabase::increment(shared_ptr<DatabaseState>* state) const { } } -Database::KV& LeveldbDatabase::dereference( +template <typename K, typename V> +typename Database<K, V>::KV& LeveldbDatabase<K, V>::dereference( shared_ptr<DatabaseState> state) const { shared_ptr<LeveldbState> leveldb_state = boost::dynamic_pointer_cast<LeveldbState>(state); @@ -195,15 +223,16 @@ Database::KV& LeveldbDatabase::dereference( CHECK(iter->Valid()); - Database::key_type temp_key(key_type(iter->key().data(), - iter->key().data() + iter->key().size())); + const leveldb::Slice& key = iter->key(); + const leveldb::Slice& value = iter->value(); + CHECK(Base::deserialize(key.data(), key.size(), + &leveldb_state->kv_pair_.key)); + CHECK(Base::deserialize(value.data(), value.size(), + &leveldb_state->kv_pair_.value)); - Database::value_type temp_value(value_type(iter->value().data(), - iter->value().data() + iter->value().size())); - - leveldb_state->kv_pair_.key.swap(temp_key); - leveldb_state->kv_pair_.value.swap(temp_value); return leveldb_state->kv_pair_; } +INSTANTIATE_DATABASE(LeveldbDatabase); + } // namespace caffe diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_database.cpp index de94391ae7d..22a08b2a580 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_database.cpp @@ -4,11 +4,13 @@ #include <utility> #include <vector> +#include "caffe/caffe.hpp" #include "caffe/lmdb_database.hpp" namespace caffe { -bool LmdbDatabase::open(const string& filename, Mode mode) { +template <typename K, typename V> +bool LmdbDatabase<K, V>::open(const string& filename, Mode mode) { DLOG(INFO) << "LMDB: Open " << filename; CHECK(NULL == env_); @@ -16,16 +18,16 @@ bool LmdbDatabase::open(const string& filename, Mode mode) { CHECK_EQ(0, dbi_); int retval; - if (mode != ReadOnly) { + if (mode != Base::ReadOnly) { retval = mkdir(filename.c_str(), 0744); switch (mode) { - case New: + case Base::New: if (0 != retval) { LOG(ERROR) << "mkdir " << filename << " failed"; return false; } break; - case ReadWrite: + case Base::ReadWrite: if (-1 == retval && EEXIST != errno) { LOG(ERROR) << "mkdir " << filename << " failed (" << strerror(errno) << ")"; @@ -52,7 +54,7 @@ bool LmdbDatabase::open(const string& filename, Mode mode) { int flag1 = 0; int flag2 = 0; - if (mode == ReadOnly) { + if (mode == Base::ReadOnly) { flag1 = MDB_RDONLY | MDB_NOTLS; flag2 = MDB_RDONLY; } @@ -78,18 +80,27 @@ bool LmdbDatabase::open(const string& filename, Mode mode) { return true; } -bool LmdbDatabase::put(const key_type& key, const value_type& value) { +template <typename K, typename V> +bool LmdbDatabase<K, V>::put(const K& key, const V& value) { DLOG(INFO) << "LMDB: Put"; - // MDB_val::mv_size is not const, so we need to make a local copy. - key_type local_key = key; - value_type local_value = value; + vector<char> serialized_key; + if (!Base::serialize(key, &serialized_key)) { + LOG(ERROR) << "failed to serialize key"; + return false; + } + + vector<char> serialized_value; + if (!Base::serialize(value, &serialized_value)) { + LOG(ERROR) << "failed to serialized value"; + return false; + } MDB_val mdbkey, mdbdata; - mdbdata.mv_size = local_value.size(); - mdbdata.mv_data = local_value.data(); - mdbkey.mv_size = local_key.size(); - mdbkey.mv_data = local_key.data(); + mdbdata.mv_size = serialized_value.size(); + mdbdata.mv_data = serialized_value.data(); + mdbkey.mv_size = serialized_key.size(); + mdbkey.mv_data = serialized_key.data(); CHECK_NOTNULL(txn_); CHECK_NE(0, dbi_); @@ -103,14 +114,19 @@ bool LmdbDatabase::put(const key_type& key, const value_type& value) { return true; } -bool LmdbDatabase::get(const key_type& key, value_type* value) { +template <typename K, typename V> +bool LmdbDatabase<K, V>::get(const K& key, V* value) { DLOG(INFO) << "LMDB: Get"; - key_type local_key = key; + vector<char> serialized_key; + if (!Base::serialize(key, &serialized_key)) { + LOG(ERROR) << "failed to serialized key"; + return false; + } MDB_val mdbkey, mdbdata; - mdbkey.mv_data = local_key.data(); - mdbkey.mv_size = local_key.size(); + mdbkey.mv_data = serialized_key.data(); + mdbkey.mv_size = serialized_key.size(); int retval; MDB_txn* get_txn; @@ -128,15 +144,17 @@ bool LmdbDatabase::get(const key_type& key, value_type* value) { mdb_txn_abort(get_txn); - Database::value_type temp_value(reinterpret_cast<char*>(mdbdata.mv_data), - reinterpret_cast<char*>(mdbdata.mv_data) + mdbdata.mv_size); - - value->swap(temp_value); + if (!Base::deserialize(reinterpret_cast<char*>(mdbdata.mv_data), + mdbdata.mv_size, value)) { + LOG(ERROR) << "failed to deserialize value"; + return false; + } return true; } -bool LmdbDatabase::commit() { +template <typename K, typename V> +bool LmdbDatabase<K, V>::commit() { DLOG(INFO) << "LMDB: Commit"; CHECK_NOTNULL(txn_); @@ -157,7 +175,8 @@ bool LmdbDatabase::commit() { return true; } -void LmdbDatabase::close() { +template <typename K, typename V> +void LmdbDatabase<K, V>::close() { DLOG(INFO) << "LMDB: Close"; if (env_ && dbi_) { @@ -169,16 +188,19 @@ void LmdbDatabase::close() { } } -void LmdbDatabase::keys(vector<key_type>* keys) { +template <typename K, typename V> +void LmdbDatabase<K, V>::keys(vector<K>* keys) { DLOG(INFO) << "LMDB: Keys"; keys->clear(); - for (Database::const_iterator iter = begin(); iter != end(); ++iter) { + for (const_iterator iter = begin(); iter != end(); ++iter) { keys->push_back(iter->key); } } -LmdbDatabase::const_iterator LmdbDatabase::begin() const { +template <typename K, typename V> +typename LmdbDatabase<K, V>::const_iterator + LmdbDatabase<K, V>::begin() const { int retval; MDB_txn* iter_txn; @@ -204,15 +226,23 @@ LmdbDatabase::const_iterator LmdbDatabase::begin() const { return const_iterator(this, state); } -LmdbDatabase::const_iterator LmdbDatabase::end() const { +template <typename K, typename V> +typename LmdbDatabase<K, V>::const_iterator + LmdbDatabase<K, V>::end() const { shared_ptr<DatabaseState> state; return const_iterator(this, state); } -LmdbDatabase::const_iterator LmdbDatabase::cbegin() const { return begin(); } -LmdbDatabase::const_iterator LmdbDatabase::cend() const { return end(); } +template <typename K, typename V> +typename LmdbDatabase<K, V>::const_iterator + LmdbDatabase<K, V>::cbegin() const { return begin(); } -bool LmdbDatabase::equal(shared_ptr<DatabaseState> state1, +template <typename K, typename V> +typename LmdbDatabase<K, V>::const_iterator + LmdbDatabase<K, V>::cend() const { return end(); } + +template <typename K, typename V> +bool LmdbDatabase<K, V>::equal(shared_ptr<DatabaseState> state1, shared_ptr<DatabaseState> state2) const { shared_ptr<LmdbState> lmdb_state1 = boost::dynamic_pointer_cast<LmdbState>(state1); @@ -226,7 +256,8 @@ bool LmdbDatabase::equal(shared_ptr<DatabaseState> state1, return !lmdb_state1 && !lmdb_state2; } -void LmdbDatabase::increment(shared_ptr<DatabaseState>* state) const { +template <typename K, typename V> +void LmdbDatabase<K, V>::increment(shared_ptr<DatabaseState>* state) const { shared_ptr<LmdbState> lmdb_state = boost::dynamic_pointer_cast<LmdbState>(*state); @@ -247,7 +278,9 @@ void LmdbDatabase::increment(shared_ptr<DatabaseState>* state) const { } } -Database::KV& LmdbDatabase::dereference(shared_ptr<DatabaseState> state) const { +template <typename K, typename V> +typename Database<K, V>::KV& LmdbDatabase<K, V>::dereference( + shared_ptr<DatabaseState> state) const { shared_ptr<LmdbState> lmdb_state = boost::dynamic_pointer_cast<LmdbState>(state); @@ -262,18 +295,14 @@ Database::KV& LmdbDatabase::dereference(shared_ptr<DatabaseState> state) const { int retval = mdb_cursor_get(cursor, &mdb_key, &mdb_val, MDB_GET_CURRENT); CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - char* key_data = reinterpret_cast<char*>(mdb_key.mv_data); - char* value_data = reinterpret_cast<char*>(mdb_val.mv_data); - - Database::key_type temp_key(key_data, key_data + mdb_key.mv_size); - - Database::value_type temp_value(value_data, - value_data + mdb_val.mv_size); - - lmdb_state->kv_pair_.key.swap(temp_key); - lmdb_state->kv_pair_.value.swap(temp_value); + CHECK(Base::deserialize(reinterpret_cast<char*>(mdb_key.mv_data), + mdb_key.mv_size, &lmdb_state->kv_pair_.key)); + CHECK(Base::deserialize(reinterpret_cast<char*>(mdb_val.mv_data), + mdb_val.mv_size, &lmdb_state->kv_pair_.value)); return lmdb_state->kv_pair_; } +INSTANTIATE_DATABASE(LmdbDatabase); + } // namespace caffe diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 5f982063cc7..1c3ec1fc576 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -39,8 +39,9 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { void Fill(const bool unique_pixels, DataParameter_DB backend) { backend_ = backend; LOG(INFO) << "Using temporary database " << *filename_; - shared_ptr<Database> database = DatabaseFactory(backend_); - CHECK(database->open(*filename_, Database::New)); + shared_ptr<Database<string, Datum> > database = + DatabaseFactory<string, Datum>(backend_); + CHECK(database->open(*filename_, Database<string, Datum>::New)); for (int i = 0; i < 5; ++i) { Datum datum; datum.set_label(i); @@ -54,12 +55,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } stringstream ss; ss << i; - string key_str = ss.str(); - Database::key_type key(key_str.c_str(), key_str.c_str() + key_str.size()); - Database::value_type value(datum.ByteSize()); - datum.SerializeWithCachedSizesToArray( - reinterpret_cast<unsigned char*>(value.data())); - CHECK(database->put(key, value)); + CHECK(database->put(ss.str(), datum)); } CHECK(database->commit()); database->close(); diff --git a/src/caffe/test/test_database.cpp b/src/caffe/test/test_database.cpp index 9c569106f10..9a7d6dec8c7 100644 --- a/src/caffe/test/test_database.cpp +++ b/src/caffe/test/test_database.cpp @@ -11,551 +11,303 @@ namespace caffe { -template <typename TypeParam> -class DatabaseTest : public MultiDeviceTest<TypeParam> { - typedef typename TypeParam::Dtype Dtype; - - protected: - string DBName() { - string filename; - MakeTempDir(&filename); - filename += "/db"; - return filename; - } - - Database::key_type TestKey() { - const char* kKey = "hello"; - Database::key_type key(kKey, kKey + 5); - return key; - } - - Database::value_type TestValue() { - const char* kValue = "world"; - Database::value_type value(kValue, kValue + 5); - return value; - } - - Database::key_type TestAltKey() { - const char* kKey = "foo"; - Database::key_type key(kKey, kKey + 3); - return key; - } - - Database::value_type TestAltValue() { - const char* kValue = "bar"; - Database::value_type value(kValue, kValue + 3); - return value; - } - - template <typename T> - bool BufferEq(const T& buf1, const T& buf2) { - if (buf1.size() != buf2.size()) { - return false; - } - for (size_t i = 0; i < buf1.size(); ++i) { - if (buf1.at(i) != buf2.at(i)) { - return false; - } - } +namespace DatabaseTest_internal { - return true; - } +template <typename T> +struct TestData { + static T TestValue(); + static T TestAltValue(); + static bool equals(const T& a, const T& b); }; -TYPED_TEST_CASE(DatabaseTest, TestDtypesAndDevices); - -TYPED_TEST(DatabaseTest, TestNewDoesntExistLevelDBPasses) { - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(this->DBName(), Database::New)); - database->close(); +template <> +string TestData<string>::TestValue() { + return "world"; } -TYPED_TEST(DatabaseTest, TestNewExistsFailsLevelDB) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - database->close(); - - EXPECT_FALSE(database->open(name, Database::New)); +template <> +string TestData<string>::TestAltValue() { + return "bar"; } -TYPED_TEST(DatabaseTest, TestReadOnlyExistsLevelDBPasses) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - database->close(); - - EXPECT_TRUE(database->open(name, Database::ReadOnly)); - database->close(); +template <> +bool TestData<string>::equals(const string& a, const string& b) { + return a == b; } -TYPED_TEST(DatabaseTest, TestReadOnlyDoesntExistFailsLevelDB) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_FALSE(database->open(name, Database::ReadOnly)); -} - -TYPED_TEST(DatabaseTest, TestReadWriteExistsLevelDBPasses) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - database->close(); - - EXPECT_TRUE(database->open(name, Database::ReadWrite)); - database->close(); +template <> +vector<char> TestData<vector<char> >::TestValue() { + string str = "world"; + vector<char> val(str.data(), str.data() + str.size()); + return val; } -TYPED_TEST(DatabaseTest, TestReadWriteDoesntExistLevelDBPasses) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::ReadWrite)); - database->close(); +template <> +vector<char> TestData<vector<char> >::TestAltValue() { + string str = "bar"; + vector<char> val(str.data(), str.data() + str.size()); + return val; } -TYPED_TEST(DatabaseTest, TestKeysLevelDB) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - Database::key_type key1 = this->TestKey(); - Database::value_type value1 = this->TestValue(); - - EXPECT_TRUE(database->put(key1, value1)); - - Database::key_type key2 = this->TestAltKey(); - Database::value_type value2 = this->TestAltValue(); - - EXPECT_TRUE(database->put(key2, value2)); - - EXPECT_TRUE(database->commit()); - - vector<Database::key_type> keys; - database->keys(&keys); - - EXPECT_EQ(2, keys.size()); - - EXPECT_TRUE(this->BufferEq(keys.at(0), key1) || - this->BufferEq(keys.at(0), key2)); - EXPECT_TRUE(this->BufferEq(keys.at(1), key1) || - this->BufferEq(keys.at(2), key2)); - EXPECT_FALSE(this->BufferEq(keys.at(0), keys.at(1))); -} - -TYPED_TEST(DatabaseTest, TestKeysNoCommitLevelDB) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - Database::key_type key1 = this->TestKey(); - Database::value_type value1 = this->TestValue(); - - EXPECT_TRUE(database->put(key1, value1)); - - Database::key_type key2 = this->TestAltKey(); - Database::value_type value2 = this->TestAltValue(); - - EXPECT_TRUE(database->put(key2, value2)); - - vector<Database::key_type> keys; - database->keys(&keys); - - EXPECT_EQ(0, keys.size()); -} - -TYPED_TEST(DatabaseTest, TestIteratorsLevelDB) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - const int kNumExamples = 4; - for (int i = 0; i < kNumExamples; ++i) { - stringstream ss; - ss << i; - string key = ss.str(); - ss << " here be data"; - string value = ss.str(); - Database::key_type key_buf(key.data(), key.data() + key.size()); - Database::value_type val_buf(value.data(), value.data() + value.size()); - EXPECT_TRUE(database->put(key_buf, val_buf)); +template <> +bool TestData<vector<char> >::equals(const vector<char>& a, + const vector<char>& b) { + if (a.size() != b.size()) { + return false; } - EXPECT_TRUE(database->commit()); - - int count = 0; - for (Database::const_iterator iter = database->begin(); - iter != database->end(); ++iter) { - (void)iter; - ++count; + for (size_t i = 0; i < a.size(); ++i) { + if (a.at(i) != b.at(i)) { + return false; + } } - EXPECT_EQ(kNumExamples, count); + return true; } -TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLevelDB) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - Database::key_type key1 = this->TestAltKey(); - Database::value_type value1 = this->TestAltValue(); - - Database::key_type key2 = this->TestKey(); - Database::value_type value2 = this->TestValue(); - - EXPECT_TRUE(database->put(key1, value1)); - EXPECT_TRUE(database->put(key2, value2)); - EXPECT_TRUE(database->commit()); - - Database::const_iterator iter1 = database->begin(); - - EXPECT_FALSE(database->end() == iter1); - - EXPECT_TRUE(this->BufferEq(iter1->key, key1)); - - Database::const_iterator iter2 = ++iter1; - - EXPECT_FALSE(database->end() == iter1); - EXPECT_FALSE(database->end() == iter2); - - EXPECT_TRUE(this->BufferEq(iter2->key, key2)); - - Database::const_iterator iter3 = ++iter2; - - EXPECT_TRUE(database->end() == iter3); - - database->close(); +template <> +Datum TestData<Datum>::TestValue() { + Datum datum; + datum.set_channels(3); + datum.set_height(32); + datum.set_width(32); + datum.set_data(string(32 * 32 * 3 * 4, ' ')); + datum.set_label(0); + return datum; } -TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLevelDB) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - Database::key_type key1 = this->TestAltKey(); - Database::value_type value1 = this->TestAltValue(); - - Database::key_type key2 = this->TestKey(); - Database::value_type value2 = this->TestValue(); - - EXPECT_TRUE(database->put(key1, value1)); - EXPECT_TRUE(database->put(key2, value2)); - EXPECT_TRUE(database->commit()); - - Database::const_iterator iter1 = database->begin(); - - EXPECT_FALSE(database->end() == iter1); - - EXPECT_TRUE(this->BufferEq(iter1->key, key1)); - - Database::const_iterator iter2 = iter1++; - - EXPECT_FALSE(database->end() == iter1); - EXPECT_FALSE(database->end() == iter2); - - EXPECT_TRUE(this->BufferEq(iter2->key, key1)); - EXPECT_TRUE(this->BufferEq(iter1->key, key2)); - - Database::const_iterator iter3 = iter1++; - - EXPECT_FALSE(database->end() == iter3); - EXPECT_TRUE(this->BufferEq(iter3->key, key2)); - EXPECT_TRUE(database->end() == iter1); - - database->close(); -} - -TYPED_TEST(DatabaseTest, TestNewPutLevelDBPasses) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); - - EXPECT_TRUE(database->put(key, val)); - - EXPECT_TRUE(database->commit()); - - database->close(); +template <> +Datum TestData<Datum>::TestAltValue() { + Datum datum; + datum.set_channels(1); + datum.set_height(64); + datum.set_width(64); + datum.set_data(string(64 * 64 * 1 * 4, ' ')); + datum.set_label(1); + return datum; } -TYPED_TEST(DatabaseTest, TestNewCommitLevelDBPasses) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); +template <> +bool TestData<Datum>::equals(const Datum& a, const Datum& b) { + string serialized_a; + a.SerializeToString(&serialized_a); - EXPECT_TRUE(database->commit()); + string serialized_b; + b.SerializeToString(&serialized_b); - database->close(); + return serialized_a == serialized_b; } -TYPED_TEST(DatabaseTest, TestNewGetLevelDBPasses) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); - - EXPECT_TRUE(database->put(key, val)); - - EXPECT_TRUE(database->commit()); - - Database::value_type new_val; - - EXPECT_TRUE(database->get(key, &new_val)); - - EXPECT_TRUE(this->BufferEq(val, new_val)); - - database->close(); -} - -TYPED_TEST(DatabaseTest, TestNewGetNoCommitLevelDBFails) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); - - EXPECT_TRUE(database->put(key, val)); +} // namespace DatabaseTest_internal - Database::value_type new_val; - - EXPECT_FALSE(database->get(key, &new_val)); -} +#define UNPACK_TYPES \ + typedef typename TypeParam::value_type value_type; \ + const DataParameter_DB backend = TypeParam::backend; +template <typename TypeParam> +class DatabaseTest : public ::testing::Test { + protected: + typedef typename TypeParam::value_type value_type; -TYPED_TEST(DatabaseTest, TestReadWritePutLevelDBPasses) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::ReadWrite)); + string DBName() { + string filename; + MakeTempDir(&filename); + filename += "/db"; + return filename; + } - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); + string TestKey() { + return "hello"; + } - EXPECT_TRUE(database->put(key, val)); + value_type TestValue() { + return DatabaseTest_internal::TestData<value_type>::TestValue(); + } - EXPECT_TRUE(database->commit()); + string TestAltKey() { + return "foo"; + } - database->close(); -} + value_type TestAltValue() { + return DatabaseTest_internal::TestData<value_type>::TestAltValue(); + } -TYPED_TEST(DatabaseTest, TestReadWriteCommitLevelDBPasses) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::ReadWrite)); + template <typename T> + bool equals(const T& a, const T& b) { + return DatabaseTest_internal::TestData<T>::equals(a, b); + } +}; - EXPECT_TRUE(database->commit()); +struct StringLeveldb { + typedef string value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB StringLeveldb::backend = DataParameter_DB_LEVELDB; - database->close(); -} +struct StringLmdb { + typedef string value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB StringLmdb::backend = DataParameter_DB_LEVELDB; -TYPED_TEST(DatabaseTest, TestReadWriteGetLevelDBPasses) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); +struct VectorLeveldb { + typedef vector<char> value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB VectorLeveldb::backend = DataParameter_DB_LEVELDB; - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); +struct VectorLmdb { + typedef vector<char> value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB VectorLmdb::backend = DataParameter_DB_LEVELDB; - EXPECT_TRUE(database->put(key, val)); +struct DatumLeveldb { + typedef Datum value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB DatumLeveldb::backend = DataParameter_DB_LEVELDB; - EXPECT_TRUE(database->commit()); +struct DatumLmdb { + typedef Datum value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB DatumLmdb::backend = DataParameter_DB_LEVELDB; - Database::value_type new_val; +typedef ::testing::Types<StringLeveldb, StringLmdb, VectorLeveldb, VectorLmdb, + DatumLeveldb, DatumLmdb> TestTypes; - EXPECT_TRUE(database->get(key, &new_val)); +TYPED_TEST_CASE(DatabaseTest, TestTypes); - EXPECT_TRUE(this->BufferEq(val, new_val)); +TYPED_TEST(DatabaseTest, TestNewDoesntExistPasses) { + UNPACK_TYPES; + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(this->DBName(), + Database<string, value_type>::New)); database->close(); } -TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitLevelDBFails) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); - - EXPECT_TRUE(database->put(key, val)); - - Database::value_type new_val; - - EXPECT_FALSE(database->get(key, &new_val)); -} +TYPED_TEST(DatabaseTest, TestNewExistsFails) { + UNPACK_TYPES; -TYPED_TEST(DatabaseTest, TestReadOnlyPutLevelDBFails) { string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); database->close(); - EXPECT_TRUE(database->open(name, Database::ReadOnly)); - - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); - - EXPECT_FALSE(database->put(key, val)); + EXPECT_FALSE(database->open(name, Database<string, value_type>::New)); } -TYPED_TEST(DatabaseTest, TestReadOnlyCommitLevelDBFails) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - database->close(); - - EXPECT_TRUE(database->open(name, Database::ReadOnly)); - - EXPECT_FALSE(database->commit()); -} +TYPED_TEST(DatabaseTest, TestReadOnlyExistsPasses) { + UNPACK_TYPES; -TYPED_TEST(DatabaseTest, TestReadOnlyGetLevelDBPasses) { string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); - - EXPECT_TRUE(database->put(key, val)); - - EXPECT_TRUE(database->commit()); - + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); database->close(); - EXPECT_TRUE(database->open(name, Database::ReadOnly)); - - Database::value_type new_val; - - EXPECT_TRUE(database->get(key, &new_val)); - - EXPECT_TRUE(this->BufferEq(val, new_val)); -} - -TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLevelDBFails) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("leveldb"); - EXPECT_TRUE(database->open(name, Database::New)); - - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); - - EXPECT_TRUE(database->put(key, val)); - + EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadOnly)); database->close(); - - EXPECT_TRUE(database->open(name, Database::ReadOnly)); - - Database::value_type new_val; - - EXPECT_FALSE(database->get(key, &new_val)); } -TYPED_TEST(DatabaseTest, TestNewDoesntExistLMDBPasses) { - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(this->DBName(), Database::New)); - database->close(); -} +TYPED_TEST(DatabaseTest, TestReadOnlyDoesntExistFails) { + UNPACK_TYPES; -TYPED_TEST(DatabaseTest, TestNewExistsFailsLMDB) { string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); - database->close(); - - EXPECT_FALSE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_FALSE(database->open(name, Database<string, value_type>::ReadOnly)); } -TYPED_TEST(DatabaseTest, TestReadOnlyExistsLMDBPasses) { +TYPED_TEST(DatabaseTest, TestReadWriteExistsPasses) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); database->close(); - EXPECT_TRUE(database->open(name, Database::ReadOnly)); + EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadWrite)); database->close(); } -TYPED_TEST(DatabaseTest, TestReadOnlyDoesntExistFailsLMDB) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_FALSE(database->open(name, Database::ReadOnly)); -} +TYPED_TEST(DatabaseTest, TestReadWriteDoesntExistPasses) { + UNPACK_TYPES; -TYPED_TEST(DatabaseTest, TestReadWriteExistsLMDBPasses) { string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); - database->close(); - - EXPECT_TRUE(database->open(name, Database::ReadWrite)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadWrite)); database->close(); } -TYPED_TEST(DatabaseTest, TestReadWriteDoesntExistLMDBPasses) { - string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::ReadWrite)); - database->close(); -} +TYPED_TEST(DatabaseTest, TestKeys) { + UNPACK_TYPES; -TYPED_TEST(DatabaseTest, TestKeysLMDB) { string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key1 = this->TestKey(); - Database::value_type value1 = this->TestValue(); + string key1 = this->TestKey(); + value_type value1 = this->TestValue(); EXPECT_TRUE(database->put(key1, value1)); - Database::key_type key2 = this->TestAltKey(); - Database::value_type value2 = this->TestAltValue(); + string key2 = this->TestAltKey(); + value_type value2 = this->TestAltValue(); EXPECT_TRUE(database->put(key2, value2)); EXPECT_TRUE(database->commit()); - vector<Database::key_type> keys; + vector<string> keys; database->keys(&keys); EXPECT_EQ(2, keys.size()); - EXPECT_TRUE(this->BufferEq(keys.at(0), key1) || - this->BufferEq(keys.at(0), key2)); - EXPECT_TRUE(this->BufferEq(keys.at(1), key1) || - this->BufferEq(keys.at(2), key2)); - EXPECT_FALSE(this->BufferEq(keys.at(0), keys.at(1))); + EXPECT_TRUE(this->equals(keys.at(0), key1) || + this->equals(keys.at(0), key2)); + EXPECT_TRUE(this->equals(keys.at(1), key1) || + this->equals(keys.at(2), key2)); + EXPECT_FALSE(this->equals(keys.at(0), keys.at(1))); } -TYPED_TEST(DatabaseTest, TestKeysNoCommitLMDB) { +TYPED_TEST(DatabaseTest, TestKeysNoCommit) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key1 = this->TestKey(); - Database::value_type value1 = this->TestValue(); + string key1 = this->TestKey(); + value_type value1 = this->TestValue(); EXPECT_TRUE(database->put(key1, value1)); - Database::key_type key2 = this->TestAltKey(); - Database::value_type value2 = this->TestAltValue(); + string key2 = this->TestAltKey(); + value_type value2 = this->TestAltValue(); EXPECT_TRUE(database->put(key2, value2)); - vector<Database::key_type> keys; + vector<string> keys; database->keys(&keys); EXPECT_EQ(0, keys.size()); } +TYPED_TEST(DatabaseTest, TestIterators) { + UNPACK_TYPES; -TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); const int kNumExamples = 4; for (int i = 0; i < kNumExamples; ++i) { @@ -563,16 +315,14 @@ TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { ss << i; string key = ss.str(); ss << " here be data"; - string value = ss.str(); - Database::key_type key_buf(key.data(), key.data() + key.size()); - Database::value_type val_buf(value.data(), value.data() + value.size()); - EXPECT_TRUE(database->put(key_buf, val_buf)); + value_type value = this->TestValue(); + EXPECT_TRUE(database->put(key, value)); } EXPECT_TRUE(database->commit()); int count = 0; - for (Database::const_iterator iter = database->begin(); - iter != database->end(); ++iter) { + typedef typename Database<string, value_type>::const_iterator Iter; + for (Iter iter = database->begin(); iter != database->end(); ++iter) { (void)iter; ++count; } @@ -580,266 +330,313 @@ TYPED_TEST(DatabaseTest, TestIteratorsLMDB) { EXPECT_EQ(kNumExamples, count); } -TYPED_TEST(DatabaseTest, TestIteratorsPreIncrementLMDB) { +TYPED_TEST(DatabaseTest, TestIteratorsPreIncrement) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key1 = this->TestAltKey(); - Database::value_type value1 = this->TestAltValue(); + string key1 = this->TestAltKey(); + value_type value1 = this->TestAltValue(); - Database::key_type key2 = this->TestKey(); - Database::value_type value2 = this->TestValue(); + string key2 = this->TestKey(); + value_type value2 = this->TestValue(); EXPECT_TRUE(database->put(key1, value1)); EXPECT_TRUE(database->put(key2, value2)); EXPECT_TRUE(database->commit()); - Database::const_iterator iter1 = database->begin(); + typename Database<string, value_type>::const_iterator iter1 = + database->begin(); EXPECT_FALSE(database->end() == iter1); - EXPECT_TRUE(this->BufferEq(iter1->key, key1)); + EXPECT_TRUE(this->equals(iter1->key, key1)); - Database::const_iterator iter2 = ++iter1; + typename Database<string, value_type>::const_iterator iter2 = ++iter1; EXPECT_FALSE(database->end() == iter1); EXPECT_FALSE(database->end() == iter2); - EXPECT_TRUE(this->BufferEq(iter2->key, key2)); + EXPECT_TRUE(this->equals(iter2->key, key2)); - Database::const_iterator iter3 = ++iter2; + typename Database<string, value_type>::const_iterator iter3 = ++iter2; EXPECT_TRUE(database->end() == iter3); database->close(); } -TYPED_TEST(DatabaseTest, TestIteratorsPostIncrementLMDB) { +TYPED_TEST(DatabaseTest, TestIteratorsPostIncrement) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key1 = this->TestAltKey(); - Database::value_type value1 = this->TestAltValue(); + string key1 = this->TestAltKey(); + value_type value1 = this->TestAltValue(); - Database::key_type key2 = this->TestKey(); - Database::value_type value2 = this->TestValue(); + string key2 = this->TestKey(); + value_type value2 = this->TestValue(); EXPECT_TRUE(database->put(key1, value1)); EXPECT_TRUE(database->put(key2, value2)); EXPECT_TRUE(database->commit()); - Database::const_iterator iter1 = database->begin(); + typename Database<string, value_type>::const_iterator iter1 = + database->begin(); EXPECT_FALSE(database->end() == iter1); - EXPECT_TRUE(this->BufferEq(iter1->key, key1)); + EXPECT_TRUE(this->equals(iter1->key, key1)); - Database::const_iterator iter2 = iter1++; + typename Database<string, value_type>::const_iterator iter2 = iter1++; EXPECT_FALSE(database->end() == iter1); EXPECT_FALSE(database->end() == iter2); - EXPECT_TRUE(this->BufferEq(iter2->key, key1)); - EXPECT_TRUE(this->BufferEq(iter1->key, key2)); + EXPECT_TRUE(this->equals(iter2->key, key1)); + EXPECT_TRUE(this->equals(iter1->key, key2)); - Database::const_iterator iter3 = iter1++; + typename Database<string, value_type>::const_iterator iter3 = iter1++; EXPECT_FALSE(database->end() == iter3); - EXPECT_TRUE(this->BufferEq(iter3->key, key2)); + EXPECT_TRUE(this->equals(iter3->key, key2)); EXPECT_TRUE(database->end() == iter1); database->close(); } -TYPED_TEST(DatabaseTest, TestNewPutLMDBPasses) { +TYPED_TEST(DatabaseTest, TestNewPutPasses) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); + string key = this->TestKey(); + value_type value = this->TestValue(); - EXPECT_TRUE(database->put(key, val)); + EXPECT_TRUE(database->put(key, value)); EXPECT_TRUE(database->commit()); database->close(); } -TYPED_TEST(DatabaseTest, TestNewCommitLMDBPasses) { +TYPED_TEST(DatabaseTest, TestNewCommitPasses) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); EXPECT_TRUE(database->commit()); database->close(); } -TYPED_TEST(DatabaseTest, TestNewGetLMDBPasses) { +TYPED_TEST(DatabaseTest, TestNewGetPasses) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); + string key = this->TestKey(); + value_type value = this->TestValue(); - EXPECT_TRUE(database->put(key, val)); + EXPECT_TRUE(database->put(key, value)); EXPECT_TRUE(database->commit()); - Database::value_type new_val; + value_type new_value; - EXPECT_TRUE(database->get(key, &new_val)); + EXPECT_TRUE(database->get(key, &new_value)); - EXPECT_TRUE(this->BufferEq(val, new_val)); + EXPECT_TRUE(this->equals(value, new_value)); database->close(); } -TYPED_TEST(DatabaseTest, TestNewGetNoCommitLMDBFails) { +TYPED_TEST(DatabaseTest, TestNewGetNoCommitFails) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); + string key = this->TestKey(); + value_type value = this->TestValue(); - EXPECT_TRUE(database->put(key, val)); + EXPECT_TRUE(database->put(key, value)); - Database::value_type new_val; + value_type new_value; - EXPECT_FALSE(database->get(key, &new_val)); + EXPECT_FALSE(database->get(key, &new_value)); } -TYPED_TEST(DatabaseTest, TestReadWritePutLMDBPasses) { + +TYPED_TEST(DatabaseTest, TestReadWritePutPasses) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::ReadWrite)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadWrite)); - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); + string key = this->TestKey(); + value_type value = this->TestValue(); - EXPECT_TRUE(database->put(key, val)); + EXPECT_TRUE(database->put(key, value)); EXPECT_TRUE(database->commit()); database->close(); } -TYPED_TEST(DatabaseTest, TestReadWriteCommitLMDBPasses) { +TYPED_TEST(DatabaseTest, TestReadWriteCommitPasses) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::ReadWrite)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadWrite)); EXPECT_TRUE(database->commit()); database->close(); } -TYPED_TEST(DatabaseTest, TestReadWriteGetLMDBPasses) { +TYPED_TEST(DatabaseTest, TestReadWriteGetPasses) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); + string key = this->TestKey(); + value_type value = this->TestValue(); - EXPECT_TRUE(database->put(key, val)); + EXPECT_TRUE(database->put(key, value)); EXPECT_TRUE(database->commit()); - Database::value_type new_val; + value_type new_value; - EXPECT_TRUE(database->get(key, &new_val)); + EXPECT_TRUE(database->get(key, &new_value)); - EXPECT_TRUE(this->BufferEq(val, new_val)); + EXPECT_TRUE(this->equals(value, new_value)); database->close(); } -TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitLMDBFails) { +TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitFails) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); + string key = this->TestKey(); + value_type value = this->TestValue(); - EXPECT_TRUE(database->put(key, val)); + EXPECT_TRUE(database->put(key, value)); - Database::value_type new_val; + value_type new_value; - EXPECT_FALSE(database->get(key, &new_val)); + EXPECT_FALSE(database->get(key, &new_value)); } -TYPED_TEST(DatabaseTest, TestReadOnlyPutLMDBFails) { +TYPED_TEST(DatabaseTest, TestReadOnlyPutFails) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); database->close(); - EXPECT_TRUE(database->open(name, Database::ReadOnly)); + EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadOnly)); - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); + string key = this->TestKey(); + value_type value = this->TestValue(); - EXPECT_FALSE(database->put(key, val)); + EXPECT_FALSE(database->put(key, value)); } -TYPED_TEST(DatabaseTest, TestReadOnlyCommitLMDBFails) { +TYPED_TEST(DatabaseTest, TestReadOnlyCommitFails) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); database->close(); - EXPECT_TRUE(database->open(name, Database::ReadOnly)); + EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadOnly)); EXPECT_FALSE(database->commit()); } -TYPED_TEST(DatabaseTest, TestReadOnlyGetLMDBPasses) { +TYPED_TEST(DatabaseTest, TestReadOnlyGetPasses) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); + string key = this->TestKey(); + value_type value = this->TestValue(); - EXPECT_TRUE(database->put(key, val)); + EXPECT_TRUE(database->put(key, value)); EXPECT_TRUE(database->commit()); database->close(); - EXPECT_TRUE(database->open(name, Database::ReadOnly)); + EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadOnly)); - Database::value_type new_val; + value_type new_value; - EXPECT_TRUE(database->get(key, &new_val)); + EXPECT_TRUE(database->get(key, &new_value)); - EXPECT_TRUE(this->BufferEq(val, new_val)); + EXPECT_TRUE(this->equals(value, new_value)); } -TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitLMDBFails) { +TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitFails) { + UNPACK_TYPES; + string name = this->DBName(); - shared_ptr<Database> database = DatabaseFactory("lmdb"); - EXPECT_TRUE(database->open(name, Database::New)); + shared_ptr<Database<string, value_type> > database = + DatabaseFactory<string, value_type>(backend); + EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - Database::key_type key = this->TestKey(); - Database::value_type val = this->TestValue(); + string key = this->TestKey(); + value_type value = this->TestValue(); - EXPECT_TRUE(database->put(key, val)); + EXPECT_TRUE(database->put(key, value)); database->close(); - EXPECT_TRUE(database->open(name, Database::ReadOnly)); + EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadOnly)); - Database::value_type new_val; + value_type new_value; - EXPECT_FALSE(database->get(key, &new_val)); + EXPECT_FALSE(database->get(key, &new_value)); } +#undef UNPACK_TYPES + } // namespace caffe diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index d13c4a0f833..f1a79679091 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -26,18 +26,17 @@ int main(int argc, char** argv) { db_backend = std::string(argv[3]); } - caffe::shared_ptr<Database> database = caffe::DatabaseFactory(db_backend); + caffe::shared_ptr<Database<std::string, Datum> > database = + caffe::DatabaseFactory<std::string, Datum>(db_backend); // Open db - CHECK(database->open(argv[1], Database::ReadOnly)); + CHECK(database->open(argv[1], Database<std::string, Datum>::ReadOnly)); - Datum datum; BlobProto sum_blob; int count = 0; // load first datum - Database::const_iterator iter = database->begin(); - const Database::value_type& first_blob = iter->value; - datum.ParseFromArray(first_blob.data(), first_blob.size()); + Database<std::string, Datum>::const_iterator iter = database->begin(); + const Datum& datum = iter->value; sum_blob.set_num(1); sum_blob.set_channels(datum.channels()); @@ -50,11 +49,10 @@ int main(int argc, char** argv) { sum_blob.add_data(0.); } LOG(INFO) << "Starting Iteration"; - for (Database::const_iterator iter = database->begin(); + for (Database<std::string, Datum>::const_iterator iter = database->begin(); iter != database->end(); ++iter) { // just a dummy operation - const Database::value_type& blob = iter->value; - datum.ParseFromArray(blob.data(), blob.size()); + const Datum& datum = iter->value; const std::string& data = datum.data(); size_in_datum = std::max<int>(datum.data().size(), datum.float_data_size()); diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 1cdca7e015a..2ba3e3c7250 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -78,10 +78,11 @@ int main(int argc, char** argv) { int resize_width = std::max<int>(0, FLAGS_resize_width); // Open new db - shared_ptr<Database> database = DatabaseFactory(db_backend); + shared_ptr<Database<string, Datum> > database = + DatabaseFactory<string, Datum>(db_backend); // Open db - CHECK(database->open(db_path, Database::New)); + CHECK(database->open(db_path, Database<string, Datum>::New)); // Storing to db std::string root_folder(argv[1]); @@ -110,13 +111,9 @@ int main(int argc, char** argv) { // sequential int length = snprintf(key_cstr, kMaxKeyLength, "%08d_%s", line_id, lines[line_id].first.c_str()); - Database::value_type value(datum.ByteSize()); - datum.SerializeWithCachedSizesToArray( - reinterpret_cast<unsigned char*>(value.data())); - Database::key_type keystr(key_cstr, key_cstr + length); // Put in db - CHECK(database->put(keystr, value)); + CHECK(database->put(string(key_cstr, length), datum)); if (++count % 1000 == 0) { // Commit txn diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 1340192cbe4..47565a83025 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -121,11 +121,13 @@ int feature_extraction_pipeline(int argc, char** argv) { int num_mini_batches = atoi(argv[++arg_pos]); - std::vector<shared_ptr<Database> > feature_dbs; + std::vector<shared_ptr<Database<std::string, Datum> > > feature_dbs; for (size_t i = 0; i < num_features; ++i) { LOG(INFO)<< "Opening database " << database_names[i]; - shared_ptr<Database> database = DatabaseFactory(argv[++arg_pos]); - CHECK(database->open(database_names.at(i), Database::New)); + shared_ptr<Database<std::string, Datum> > database = + DatabaseFactory<std::string, Datum>(argv[++arg_pos]); + CHECK(database->open(database_names.at(i), + Database<std::string, Datum>::New)); feature_dbs.push_back(database); } @@ -155,13 +157,9 @@ int feature_extraction_pipeline(int argc, char** argv) { for (int d = 0; d < dim_features; ++d) { datum.add_float_data(feature_blob_data[d]); } - Database::value_type value(datum.ByteSize()); - datum.SerializeWithCachedSizesToArray( - reinterpret_cast<unsigned char*>(value.data())); int length = snprintf(key_str, kMaxKeyStrLength, "%d", image_indices[i]); - Database::key_type key(key_str, key_str + length); - CHECK(feature_dbs.at(i)->put(key, value)); + CHECK(feature_dbs.at(i)->put(std::string(key_str, length), datum)); ++image_indices[i]; if (image_indices[i] % 1000 == 0) { CHECK(feature_dbs.at(i)->commit()); From d275f77332e1e4a1457a520ee3deaf4d126ddfdf Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Mon, 13 Oct 2014 14:54:48 -0400 Subject: [PATCH 0936/2053] Renamed Database interface to Dataset. --- examples/cifar10/convert_cifar_data.cpp | 34 +- include/caffe/data_layers.hpp | 6 +- include/caffe/database_factory.hpp | 20 - include/caffe/{database.hpp => dataset.hpp} | 50 +- include/caffe/dataset_factory.hpp | 20 + ...veldb_database.hpp => leveldb_dataset.hpp} | 30 +- .../{lmdb_database.hpp => lmdb_dataset.hpp} | 32 +- src/caffe/database_factory.cpp | 50 -- src/caffe/dataset_factory.cpp | 50 ++ src/caffe/layers/data_layer.cpp | 26 +- ...veldb_database.cpp => leveldb_dataset.cpp} | 50 +- .../{lmdb_database.cpp => lmdb_dataset.cpp} | 46 +- src/caffe/test/test_data_layer.cpp | 20 +- src/caffe/test/test_database.cpp | 642 ------------------ src/caffe/test/test_dataset.cpp | 642 ++++++++++++++++++ tools/compute_image_mean.cpp | 18 +- tools/convert_imageset.cpp | 16 +- tools/extract_features.cpp | 35 +- 18 files changed, 893 insertions(+), 894 deletions(-) delete mode 100644 include/caffe/database_factory.hpp rename include/caffe/{database.hpp => dataset.hpp} (81%) create mode 100644 include/caffe/dataset_factory.hpp rename include/caffe/{leveldb_database.hpp => leveldb_dataset.hpp} (70%) rename include/caffe/{lmdb_database.hpp => lmdb_dataset.hpp} (71%) delete mode 100644 src/caffe/database_factory.cpp create mode 100644 src/caffe/dataset_factory.cpp rename src/caffe/{leveldb_database.cpp => leveldb_dataset.cpp} (78%) rename src/caffe/{lmdb_database.cpp => lmdb_dataset.cpp} (85%) delete mode 100644 src/caffe/test/test_database.cpp create mode 100644 src/caffe/test/test_dataset.cpp diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index f86f3936a35..9eecc74c989 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -13,13 +13,13 @@ #include "google/protobuf/text_format.h" #include "stdint.h" -#include "caffe/database_factory.hpp" +#include "caffe/dataset_factory.hpp" #include "caffe/proto/caffe.pb.h" using std::string; -using caffe::Database; -using caffe::DatabaseFactory; +using caffe::Dataset; +using caffe::DatasetFactory; using caffe::Datum; using caffe::shared_ptr; @@ -38,10 +38,10 @@ void read_image(std::ifstream* file, int* label, char* buffer) { void convert_dataset(const string& input_folder, const string& output_folder, const string& db_type) { - shared_ptr<Database<string, Datum> > train_database = - DatabaseFactory<string, Datum>(db_type); - CHECK(train_database->open(output_folder + "/cifar10_train_" + db_type, - Database<string, Datum>::New)); + shared_ptr<Dataset<string, Datum> > train_dataset = + DatasetFactory<string, Datum>(db_type); + CHECK(train_dataset->open(output_folder + "/cifar10_train_" + db_type, + Dataset<string, Datum>::New)); // Data buffer int label; char str_buffer[kCIFARImageNBytes]; @@ -64,17 +64,17 @@ void convert_dataset(const string& input_folder, const string& output_folder, datum.set_data(str_buffer, kCIFARImageNBytes); int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", fileid * kCIFARBatchSize + itemid); - CHECK(train_database->put(string(str_buffer, length), datum)); + CHECK(train_dataset->put(string(str_buffer, length), datum)); } } - CHECK(train_database->commit()); - train_database->close(); + CHECK(train_dataset->commit()); + train_dataset->close(); LOG(INFO) << "Writing Testing data"; - shared_ptr<Database<string, Datum> > test_database = - DatabaseFactory<string, Datum>(db_type); - CHECK(test_database->open(output_folder + "/cifar10_test_" + db_type, - Database<string, Datum>::New)); + shared_ptr<Dataset<string, Datum> > test_dataset = + DatasetFactory<string, Datum>(db_type); + CHECK(test_dataset->open(output_folder + "/cifar10_test_" + db_type, + Dataset<string, Datum>::New)); // Open files std::ifstream data_file((input_folder + "/test_batch.bin").c_str(), std::ios::in | std::ios::binary); @@ -84,10 +84,10 @@ void convert_dataset(const string& input_folder, const string& output_folder, datum.set_label(label); datum.set_data(str_buffer, kCIFARImageNBytes); int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid); - CHECK(test_database->put(string(str_buffer, length), datum)); + CHECK(test_dataset->put(string(str_buffer, length), datum)); } - CHECK(test_database->commit()); - test_database->close(); + CHECK(test_dataset->commit()); + test_dataset->close(); } int main(int argc, char** argv) { diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 13ba4e6f8b3..a2ea854e5ff 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -11,7 +11,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/data_transformer.hpp" -#include "caffe/database.hpp" +#include "caffe/dataset.hpp" #include "caffe/filler.hpp" #include "caffe/internal_thread.hpp" #include "caffe/layer.hpp" @@ -100,8 +100,8 @@ class DataLayer : public BasePrefetchingDataLayer<Dtype> { protected: virtual void InternalThreadEntry(); - shared_ptr<Database<string, Datum> > database_; - Database<string, Datum>::const_iterator iter_; + shared_ptr<Dataset<string, Datum> > dataset_; + Dataset<string, Datum>::const_iterator iter_; }; /** diff --git a/include/caffe/database_factory.hpp b/include/caffe/database_factory.hpp deleted file mode 100644 index 30f191e76b4..00000000000 --- a/include/caffe/database_factory.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef CAFFE_DATABASE_FACTORY_H_ -#define CAFFE_DATABASE_FACTORY_H_ - -#include <string> - -#include "caffe/common.hpp" -#include "caffe/database.hpp" -#include "caffe/proto/caffe.pb.h" - -namespace caffe { - -template <typename K, typename V> -shared_ptr<Database<K, V> > DatabaseFactory(const DataParameter_DB& type); - -template <typename K, typename V> -shared_ptr<Database<K, V> > DatabaseFactory(const string& type); - -} // namespace caffe - -#endif // CAFFE_DATABASE_FACTORY_H_ diff --git a/include/caffe/database.hpp b/include/caffe/dataset.hpp similarity index 81% rename from include/caffe/database.hpp rename to include/caffe/dataset.hpp index 711ebdd3fa0..1f07aa9d18d 100644 --- a/include/caffe/database.hpp +++ b/include/caffe/dataset.hpp @@ -1,5 +1,5 @@ -#ifndef CAFFE_DATABASE_H_ -#define CAFFE_DATABASE_H_ +#ifndef CAFFE_DATASET_H_ +#define CAFFE_DATASET_H_ #include <algorithm> #include <iterator> @@ -11,7 +11,7 @@ namespace caffe { -namespace database_internal { +namespace dataset_internal { template <typename T> struct Coder { @@ -85,10 +85,10 @@ struct Coder<vector<char> > { } }; -} // namespace database_internal +} // namespace dataset_internal template <typename K, typename V> -class Database { +class Dataset { public: enum Mode { New, @@ -112,8 +112,8 @@ class Database { virtual void keys(vector<K>* keys) = 0; - Database() { } - virtual ~Database() { } + Dataset() { } + virtual ~Dataset() { } class iterator; typedef iterator const_iterator; @@ -124,7 +124,7 @@ class Database { virtual const_iterator cend() const = 0; protected: - class DatabaseState; + class DatasetState; public: class iterator : public std::iterator<std::forward_iterator_tag, KV> { @@ -137,7 +137,7 @@ class Database { iterator() : parent_(NULL) { } - iterator(const Database* parent, shared_ptr<DatabaseState> state) + iterator(const Dataset* parent, shared_ptr<DatasetState> state) : parent_(parent), state_(state) { } ~iterator() { } @@ -145,7 +145,7 @@ class Database { iterator(const iterator& other) : parent_(other.parent_), state_(other.state_ ? other.state_->clone() - : shared_ptr<DatabaseState>()) { } + : shared_ptr<DatasetState>()) { } iterator& operator=(iterator copy) { copy.swap(*this); @@ -184,49 +184,49 @@ class Database { } protected: - const Database* parent_; - shared_ptr<DatabaseState> state_; + const Dataset* parent_; + shared_ptr<DatasetState> state_; }; protected: - class DatabaseState { + class DatasetState { public: - virtual ~DatabaseState() { } - virtual shared_ptr<DatabaseState> clone() = 0; + virtual ~DatasetState() { } + virtual shared_ptr<DatasetState> clone() = 0; }; - virtual bool equal(shared_ptr<DatabaseState> state1, - shared_ptr<DatabaseState> state2) const = 0; - virtual void increment(shared_ptr<DatabaseState>* state) const = 0; + virtual bool equal(shared_ptr<DatasetState> state1, + shared_ptr<DatasetState> state2) const = 0; + virtual void increment(shared_ptr<DatasetState>* state) const = 0; virtual KV& dereference( - shared_ptr<DatabaseState> state) const = 0; + shared_ptr<DatasetState> state) const = 0; template <typename T> static bool serialize(const T& obj, string* serialized) { - return database_internal::Coder<T>::serialize(obj, serialized); + return dataset_internal::Coder<T>::serialize(obj, serialized); } template <typename T> static bool serialize(const T& obj, vector<char>* serialized) { - return database_internal::Coder<T>::serialize(obj, serialized); + return dataset_internal::Coder<T>::serialize(obj, serialized); } template <typename T> static bool deserialize(const string& serialized, T* obj) { - return database_internal::Coder<T>::deserialize(serialized, obj); + return dataset_internal::Coder<T>::deserialize(serialized, obj); } template <typename T> static bool deserialize(const char* data, size_t size, T* obj) { - return database_internal::Coder<T>::deserialize(data, size, obj); + return dataset_internal::Coder<T>::deserialize(data, size, obj); } }; } // namespace caffe -#define INSTANTIATE_DATABASE(type) \ +#define INSTANTIATE_DATASET(type) \ template class type<string, string>; \ template class type<string, vector<char> >; \ template class type<string, Datum>; -#endif // CAFFE_DATABASE_H_ +#endif // CAFFE_DATASET_H_ diff --git a/include/caffe/dataset_factory.hpp b/include/caffe/dataset_factory.hpp new file mode 100644 index 00000000000..57db49bf524 --- /dev/null +++ b/include/caffe/dataset_factory.hpp @@ -0,0 +1,20 @@ +#ifndef CAFFE_DATASET_FACTORY_H_ +#define CAFFE_DATASET_FACTORY_H_ + +#include <string> + +#include "caffe/common.hpp" +#include "caffe/dataset.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { + +template <typename K, typename V> +shared_ptr<Dataset<K, V> > DatasetFactory(const DataParameter_DB& type); + +template <typename K, typename V> +shared_ptr<Dataset<K, V> > DatasetFactory(const string& type); + +} // namespace caffe + +#endif // CAFFE_DATASET_FACTORY_H_ diff --git a/include/caffe/leveldb_database.hpp b/include/caffe/leveldb_dataset.hpp similarity index 70% rename from include/caffe/leveldb_database.hpp rename to include/caffe/leveldb_dataset.hpp index cd966c440cc..eb354d95db3 100644 --- a/include/caffe/leveldb_database.hpp +++ b/include/caffe/leveldb_dataset.hpp @@ -1,5 +1,5 @@ -#ifndef CAFFE_LEVELDB_DATABASE_H_ -#define CAFFE_LEVELDB_DATABASE_H_ +#ifndef CAFFE_LEVELDB_DATASET_H_ +#define CAFFE_LEVELDB_DATASET_H_ #include <leveldb/db.h> #include <leveldb/write_batch.h> @@ -9,17 +9,17 @@ #include <vector> #include "caffe/common.hpp" -#include "caffe/database.hpp" +#include "caffe/dataset.hpp" namespace caffe { template <typename K, typename V> -class LeveldbDatabase : public Database<K, V> { +class LeveldbDataset : public Dataset<K, V> { public: - typedef Database<K, V> Base; + typedef Dataset<K, V> Base; typedef typename Base::key_type key_type; typedef typename Base::value_type value_type; - typedef typename Base::DatabaseState DatabaseState; + typedef typename Base::DatasetState DatasetState; typedef typename Base::Mode Mode; typedef typename Base::const_iterator const_iterator; typedef typename Base::KV KV; @@ -38,11 +38,11 @@ class LeveldbDatabase : public Database<K, V> { const_iterator cend() const; protected: - class LeveldbState : public DatabaseState { + class LeveldbState : public DatasetState { public: explicit LeveldbState(shared_ptr<leveldb::DB> db, shared_ptr<leveldb::Iterator> iter) - : DatabaseState(), + : DatasetState(), db_(db), iter_(iter) { } @@ -54,7 +54,7 @@ class LeveldbDatabase : public Database<K, V> { db_.reset(); } - shared_ptr<DatabaseState> clone() { + shared_ptr<DatasetState> clone() { shared_ptr<leveldb::Iterator> new_iter; if (iter_.get()) { @@ -64,7 +64,7 @@ class LeveldbDatabase : public Database<K, V> { CHECK(new_iter->Valid()); } - return shared_ptr<DatabaseState>(new LeveldbState(db_, new_iter)); + return shared_ptr<DatasetState>(new LeveldbState(db_, new_iter)); } shared_ptr<leveldb::DB> db_; @@ -72,10 +72,10 @@ class LeveldbDatabase : public Database<K, V> { KV kv_pair_; }; - bool equal(shared_ptr<DatabaseState> state1, - shared_ptr<DatabaseState> state2) const; - void increment(shared_ptr<DatabaseState>* state) const; - KV& dereference(shared_ptr<DatabaseState> state) const; + bool equal(shared_ptr<DatasetState> state1, + shared_ptr<DatasetState> state2) const; + void increment(shared_ptr<DatasetState>* state) const; + KV& dereference(shared_ptr<DatasetState> state) const; shared_ptr<leveldb::DB> db_; shared_ptr<leveldb::WriteBatch> batch_; @@ -84,4 +84,4 @@ class LeveldbDatabase : public Database<K, V> { } // namespace caffe -#endif // CAFFE_LEVELDB_DATABASE_H_ +#endif // CAFFE_LEVELDB_DATASET_H_ diff --git a/include/caffe/lmdb_database.hpp b/include/caffe/lmdb_dataset.hpp similarity index 71% rename from include/caffe/lmdb_database.hpp rename to include/caffe/lmdb_dataset.hpp index b5a02ca46a7..57da5dea829 100644 --- a/include/caffe/lmdb_database.hpp +++ b/include/caffe/lmdb_dataset.hpp @@ -1,5 +1,5 @@ -#ifndef CAFFE_LMDB_DATABASE_H_ -#define CAFFE_LMDB_DATABASE_H_ +#ifndef CAFFE_LMDB_DATASET_H_ +#define CAFFE_LMDB_DATASET_H_ #include <string> #include <utility> @@ -8,22 +8,22 @@ #include "lmdb.h" #include "caffe/common.hpp" -#include "caffe/database.hpp" +#include "caffe/dataset.hpp" namespace caffe { template <typename K, typename V> -class LmdbDatabase : public Database<K, V> { +class LmdbDataset : public Dataset<K, V> { public: - typedef Database<K, V> Base; + typedef Dataset<K, V> Base; typedef typename Base::key_type key_type; typedef typename Base::value_type value_type; - typedef typename Base::DatabaseState DatabaseState; + typedef typename Base::DatasetState DatasetState; typedef typename Base::Mode Mode; typedef typename Base::const_iterator const_iterator; typedef typename Base::KV KV; - LmdbDatabase() + LmdbDataset() : env_(NULL), dbi_(0), txn_(NULL) { } @@ -42,15 +42,15 @@ class LmdbDatabase : public Database<K, V> { const_iterator cend() const; protected: - class LmdbState : public DatabaseState { + class LmdbState : public DatasetState { public: explicit LmdbState(MDB_cursor* cursor, MDB_txn* txn, const MDB_dbi* dbi) - : DatabaseState(), + : DatasetState(), cursor_(cursor), txn_(txn), dbi_(dbi) { } - shared_ptr<DatabaseState> clone() { + shared_ptr<DatasetState> clone() { MDB_cursor* new_cursor; if (cursor_) { @@ -67,7 +67,7 @@ class LmdbDatabase : public Database<K, V> { new_cursor = cursor_; } - return shared_ptr<DatabaseState>(new LmdbState(new_cursor, txn_, dbi_)); + return shared_ptr<DatasetState>(new LmdbState(new_cursor, txn_, dbi_)); } MDB_cursor* cursor_; @@ -76,10 +76,10 @@ class LmdbDatabase : public Database<K, V> { KV kv_pair_; }; - bool equal(shared_ptr<DatabaseState> state1, - shared_ptr<DatabaseState> state2) const; - void increment(shared_ptr<DatabaseState>* state) const; - KV& dereference(shared_ptr<DatabaseState> state) const; + bool equal(shared_ptr<DatasetState> state1, + shared_ptr<DatasetState> state2) const; + void increment(shared_ptr<DatasetState>* state) const; + KV& dereference(shared_ptr<DatasetState> state) const; MDB_env* env_; MDB_dbi dbi_; @@ -88,4 +88,4 @@ class LmdbDatabase : public Database<K, V> { } // namespace caffe -#endif // CAFFE_LMDB_DATABASE_H_ +#endif // CAFFE_LMDB_DATASET_H_ diff --git a/src/caffe/database_factory.cpp b/src/caffe/database_factory.cpp deleted file mode 100644 index 4ccd429ef97..00000000000 --- a/src/caffe/database_factory.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include <string> -#include <utility> -#include <vector> - -#include "caffe/database_factory.hpp" -#include "caffe/leveldb_database.hpp" -#include "caffe/lmdb_database.hpp" - -namespace caffe { - -template <typename K, typename V> -shared_ptr<Database<K, V> > DatabaseFactory(const DataParameter_DB& type) { - switch (type) { - case DataParameter_DB_LEVELDB: - return shared_ptr<Database<K, V> >(new LeveldbDatabase<K, V>()); - case DataParameter_DB_LMDB: - return shared_ptr<Database<K, V> >(new LmdbDatabase<K, V>()); - default: - LOG(FATAL) << "Unknown database type " << type; - return shared_ptr<Database<K, V> >(); - } -} - -template <typename K, typename V> -shared_ptr<Database<K, V> > DatabaseFactory(const string& type) { - if ("leveldb" == type) { - return DatabaseFactory<K, V>(DataParameter_DB_LEVELDB); - } else if ("lmdb" == type) { - return DatabaseFactory<K, V>(DataParameter_DB_LMDB); - } else { - LOG(FATAL) << "Unknown database type " << type; - return shared_ptr<Database<K, V> >(); - } -} - -#define REGISTER_DATABASE(key_type, value_type) \ - template shared_ptr<Database<key_type, value_type> > \ - DatabaseFactory(const string& type); \ - template shared_ptr<Database<key_type, value_type> > \ - DatabaseFactory(const DataParameter_DB& type); \ - -REGISTER_DATABASE(string, string); -REGISTER_DATABASE(string, vector<char>); -REGISTER_DATABASE(string, Datum); - -#undef REGISTER_DATABASE - -} // namespace caffe - - diff --git a/src/caffe/dataset_factory.cpp b/src/caffe/dataset_factory.cpp new file mode 100644 index 00000000000..3313de3c408 --- /dev/null +++ b/src/caffe/dataset_factory.cpp @@ -0,0 +1,50 @@ +#include <string> +#include <utility> +#include <vector> + +#include "caffe/dataset_factory.hpp" +#include "caffe/leveldb_dataset.hpp" +#include "caffe/lmdb_dataset.hpp" + +namespace caffe { + +template <typename K, typename V> +shared_ptr<Dataset<K, V> > DatasetFactory(const DataParameter_DB& type) { + switch (type) { + case DataParameter_DB_LEVELDB: + return shared_ptr<Dataset<K, V> >(new LeveldbDataset<K, V>()); + case DataParameter_DB_LMDB: + return shared_ptr<Dataset<K, V> >(new LmdbDataset<K, V>()); + default: + LOG(FATAL) << "Unknown dataset type " << type; + return shared_ptr<Dataset<K, V> >(); + } +} + +template <typename K, typename V> +shared_ptr<Dataset<K, V> > DatasetFactory(const string& type) { + if ("leveldb" == type) { + return DatasetFactory<K, V>(DataParameter_DB_LEVELDB); + } else if ("lmdb" == type) { + return DatasetFactory<K, V>(DataParameter_DB_LMDB); + } else { + LOG(FATAL) << "Unknown dataset type " << type; + return shared_ptr<Dataset<K, V> >(); + } +} + +#define REGISTER_DATASET(key_type, value_type) \ + template shared_ptr<Dataset<key_type, value_type> > \ + DatasetFactory(const string& type); \ + template shared_ptr<Dataset<key_type, value_type> > \ + DatasetFactory(const DataParameter_DB& type); \ + +REGISTER_DATASET(string, string); +REGISTER_DATASET(string, vector<char>); +REGISTER_DATASET(string, Datum); + +#undef REGISTER_DATASET + +} // namespace caffe + + diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 6296335276e..fcf9bb20a57 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -5,7 +5,7 @@ #include "caffe/common.hpp" #include "caffe/data_layers.hpp" -#include "caffe/database_factory.hpp" +#include "caffe/dataset_factory.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" @@ -17,20 +17,20 @@ namespace caffe { template <typename Dtype> DataLayer<Dtype>::~DataLayer<Dtype>() { this->JoinPrefetchThread(); - // clean up the database resources - database_->close(); + // clean up the dataset resources + dataset_->close(); } template <typename Dtype> void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // Initialize DB - database_ = DatabaseFactory<string, Datum>( + dataset_ = DatasetFactory<string, Datum>( this->layer_param_.data_param().backend()); const string& source = this->layer_param_.data_param().source(); - LOG(INFO) << "Opening database " << source; - CHECK(database_->open(source, Database<string, Datum>::ReadOnly)); - iter_ = database_->begin(); + LOG(INFO) << "Opening dataset " << source; + CHECK(dataset_->open(source, Dataset<string, Datum>::ReadOnly)); + iter_ = dataset_->begin(); // Check if we would need to randomly skip a few data points if (this->layer_param_.data_param().rand_skip()) { @@ -38,13 +38,13 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, this->layer_param_.data_param().rand_skip(); LOG(INFO) << "Skipping first " << skip << " data points."; while (skip-- > 0) { - if (++iter_ == database_->end()) { - iter_ = database_->begin(); + if (++iter_ == dataset_->end()) { + iter_ = dataset_->begin(); } } } // Read a data point, and use it to initialize the top blob. - CHECK(iter_ != database_->end()); + CHECK(iter_ != dataset_->end()); const Datum& datum = iter_->value; // image @@ -89,7 +89,7 @@ void DataLayer<Dtype>::InternalThreadEntry() { const int batch_size = this->layer_param_.data_param().batch_size(); for (int item_id = 0; item_id < batch_size; ++item_id) { - CHECK(iter_ != database_->end()); + CHECK(iter_ != dataset_->end()); const Datum& datum = iter_->value; // Apply data transformations (mirror, scale, crop...) @@ -102,8 +102,8 @@ void DataLayer<Dtype>::InternalThreadEntry() { // go to the next iter ++iter_; - if (iter_ == database_->end()) { - iter_ = database_->begin(); + if (iter_ == dataset_->end()) { + iter_ = dataset_->begin(); } } } diff --git a/src/caffe/leveldb_database.cpp b/src/caffe/leveldb_dataset.cpp similarity index 78% rename from src/caffe/leveldb_database.cpp rename to src/caffe/leveldb_dataset.cpp index 267ddf07330..41c71e44557 100644 --- a/src/caffe/leveldb_database.cpp +++ b/src/caffe/leveldb_dataset.cpp @@ -3,12 +3,12 @@ #include <vector> #include "caffe/caffe.hpp" -#include "caffe/leveldb_database.hpp" +#include "caffe/leveldb_dataset.hpp" namespace caffe { template <typename K, typename V> -bool LeveldbDatabase<K, V>::open(const string& filename, Mode mode) { +bool LeveldbDataset<K, V>::open(const string& filename, Mode mode) { DLOG(INFO) << "LevelDB: Open " << filename; leveldb::Options options; @@ -55,11 +55,11 @@ bool LeveldbDatabase<K, V>::open(const string& filename, Mode mode) { } template <typename K, typename V> -bool LeveldbDatabase<K, V>::put(const K& key, const V& value) { +bool LeveldbDataset<K, V>::put(const K& key, const V& value) { DLOG(INFO) << "LevelDB: Put"; if (read_only_) { - LOG(ERROR) << "put can not be used on a database in ReadOnly mode"; + LOG(ERROR) << "put can not be used on a dataset in ReadOnly mode"; return false; } @@ -81,7 +81,7 @@ bool LeveldbDatabase<K, V>::put(const K& key, const V& value) { } template <typename K, typename V> -bool LeveldbDatabase<K, V>::get(const K& key, V* value) { +bool LeveldbDataset<K, V>::get(const K& key, V* value) { DLOG(INFO) << "LevelDB: Get"; string serialized_key; @@ -106,11 +106,11 @@ bool LeveldbDatabase<K, V>::get(const K& key, V* value) { } template <typename K, typename V> -bool LeveldbDatabase<K, V>::commit() { +bool LeveldbDataset<K, V>::commit() { DLOG(INFO) << "LevelDB: Commit"; if (read_only_) { - LOG(ERROR) << "commit can not be used on a database in ReadOnly mode"; + LOG(ERROR) << "commit can not be used on a dataset in ReadOnly mode"; return false; } @@ -125,7 +125,7 @@ bool LeveldbDatabase<K, V>::commit() { } template <typename K, typename V> -void LeveldbDatabase<K, V>::close() { +void LeveldbDataset<K, V>::close() { DLOG(INFO) << "LevelDB: Close"; batch_.reset(); @@ -133,7 +133,7 @@ void LeveldbDatabase<K, V>::close() { } template <typename K, typename V> -void LeveldbDatabase<K, V>::keys(vector<K>* keys) { +void LeveldbDataset<K, V>::keys(vector<K>* keys) { DLOG(INFO) << "LevelDB: Keys"; keys->clear(); @@ -143,8 +143,8 @@ void LeveldbDatabase<K, V>::keys(vector<K>* keys) { } template <typename K, typename V> -typename LeveldbDatabase<K, V>::const_iterator - LeveldbDatabase<K, V>::begin() const { +typename LeveldbDataset<K, V>::const_iterator + LeveldbDataset<K, V>::begin() const { CHECK_NOTNULL(db_.get()); shared_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); iter->SeekToFirst(); @@ -152,7 +152,7 @@ typename LeveldbDatabase<K, V>::const_iterator iter.reset(); } - shared_ptr<DatabaseState> state; + shared_ptr<DatasetState> state; if (iter) { state.reset(new LeveldbState(db_, iter)); } @@ -160,25 +160,25 @@ typename LeveldbDatabase<K, V>::const_iterator } template <typename K, typename V> -typename LeveldbDatabase<K, V>::const_iterator - LeveldbDatabase<K, V>::end() const { - shared_ptr<DatabaseState> state; +typename LeveldbDataset<K, V>::const_iterator + LeveldbDataset<K, V>::end() const { + shared_ptr<DatasetState> state; return const_iterator(this, state); } template <typename K, typename V> -typename LeveldbDatabase<K, V>::const_iterator - LeveldbDatabase<K, V>::cbegin() const { +typename LeveldbDataset<K, V>::const_iterator + LeveldbDataset<K, V>::cbegin() const { return begin(); } template <typename K, typename V> -typename LeveldbDatabase<K, V>::const_iterator - LeveldbDatabase<K, V>::cend() const { return end(); } +typename LeveldbDataset<K, V>::const_iterator + LeveldbDataset<K, V>::cend() const { return end(); } template <typename K, typename V> -bool LeveldbDatabase<K, V>::equal(shared_ptr<DatabaseState> state1, - shared_ptr<DatabaseState> state2) const { +bool LeveldbDataset<K, V>::equal(shared_ptr<DatasetState> state1, + shared_ptr<DatasetState> state2) const { shared_ptr<LeveldbState> leveldb_state1 = boost::dynamic_pointer_cast<LeveldbState>(state1); @@ -192,7 +192,7 @@ bool LeveldbDatabase<K, V>::equal(shared_ptr<DatabaseState> state1, } template <typename K, typename V> -void LeveldbDatabase<K, V>::increment(shared_ptr<DatabaseState>* state) const { +void LeveldbDataset<K, V>::increment(shared_ptr<DatasetState>* state) const { shared_ptr<LeveldbState> leveldb_state = boost::dynamic_pointer_cast<LeveldbState>(*state); @@ -210,8 +210,8 @@ void LeveldbDatabase<K, V>::increment(shared_ptr<DatabaseState>* state) const { } template <typename K, typename V> -typename Database<K, V>::KV& LeveldbDatabase<K, V>::dereference( - shared_ptr<DatabaseState> state) const { +typename Dataset<K, V>::KV& LeveldbDataset<K, V>::dereference( + shared_ptr<DatasetState> state) const { shared_ptr<LeveldbState> leveldb_state = boost::dynamic_pointer_cast<LeveldbState>(state); @@ -233,6 +233,6 @@ typename Database<K, V>::KV& LeveldbDatabase<K, V>::dereference( return leveldb_state->kv_pair_; } -INSTANTIATE_DATABASE(LeveldbDatabase); +INSTANTIATE_DATASET(LeveldbDataset); } // namespace caffe diff --git a/src/caffe/lmdb_database.cpp b/src/caffe/lmdb_dataset.cpp similarity index 85% rename from src/caffe/lmdb_database.cpp rename to src/caffe/lmdb_dataset.cpp index 22a08b2a580..d2b6fcd1c85 100644 --- a/src/caffe/lmdb_database.cpp +++ b/src/caffe/lmdb_dataset.cpp @@ -5,12 +5,12 @@ #include <vector> #include "caffe/caffe.hpp" -#include "caffe/lmdb_database.hpp" +#include "caffe/lmdb_dataset.hpp" namespace caffe { template <typename K, typename V> -bool LmdbDatabase<K, V>::open(const string& filename, Mode mode) { +bool LmdbDataset<K, V>::open(const string& filename, Mode mode) { DLOG(INFO) << "LMDB: Open " << filename; CHECK(NULL == env_); @@ -81,7 +81,7 @@ bool LmdbDatabase<K, V>::open(const string& filename, Mode mode) { } template <typename K, typename V> -bool LmdbDatabase<K, V>::put(const K& key, const V& value) { +bool LmdbDataset<K, V>::put(const K& key, const V& value) { DLOG(INFO) << "LMDB: Put"; vector<char> serialized_key; @@ -115,7 +115,7 @@ bool LmdbDatabase<K, V>::put(const K& key, const V& value) { } template <typename K, typename V> -bool LmdbDatabase<K, V>::get(const K& key, V* value) { +bool LmdbDataset<K, V>::get(const K& key, V* value) { DLOG(INFO) << "LMDB: Get"; vector<char> serialized_key; @@ -154,7 +154,7 @@ bool LmdbDatabase<K, V>::get(const K& key, V* value) { } template <typename K, typename V> -bool LmdbDatabase<K, V>::commit() { +bool LmdbDataset<K, V>::commit() { DLOG(INFO) << "LMDB: Commit"; CHECK_NOTNULL(txn_); @@ -176,7 +176,7 @@ bool LmdbDatabase<K, V>::commit() { } template <typename K, typename V> -void LmdbDatabase<K, V>::close() { +void LmdbDataset<K, V>::close() { DLOG(INFO) << "LMDB: Close"; if (env_ && dbi_) { @@ -189,7 +189,7 @@ void LmdbDatabase<K, V>::close() { } template <typename K, typename V> -void LmdbDatabase<K, V>::keys(vector<K>* keys) { +void LmdbDataset<K, V>::keys(vector<K>* keys) { DLOG(INFO) << "LMDB: Keys"; keys->clear(); @@ -199,8 +199,8 @@ void LmdbDatabase<K, V>::keys(vector<K>* keys) { } template <typename K, typename V> -typename LmdbDatabase<K, V>::const_iterator - LmdbDatabase<K, V>::begin() const { +typename LmdbDataset<K, V>::const_iterator + LmdbDataset<K, V>::begin() const { int retval; MDB_txn* iter_txn; @@ -219,7 +219,7 @@ typename LmdbDatabase<K, V>::const_iterator CHECK(MDB_SUCCESS == retval || MDB_NOTFOUND == retval) << mdb_strerror(retval); - shared_ptr<DatabaseState> state; + shared_ptr<DatasetState> state; if (MDB_SUCCESS == retval) { state.reset(new LmdbState(cursor, iter_txn, &dbi_)); } @@ -227,23 +227,23 @@ typename LmdbDatabase<K, V>::const_iterator } template <typename K, typename V> -typename LmdbDatabase<K, V>::const_iterator - LmdbDatabase<K, V>::end() const { - shared_ptr<DatabaseState> state; +typename LmdbDataset<K, V>::const_iterator + LmdbDataset<K, V>::end() const { + shared_ptr<DatasetState> state; return const_iterator(this, state); } template <typename K, typename V> -typename LmdbDatabase<K, V>::const_iterator - LmdbDatabase<K, V>::cbegin() const { return begin(); } +typename LmdbDataset<K, V>::const_iterator + LmdbDataset<K, V>::cbegin() const { return begin(); } template <typename K, typename V> -typename LmdbDatabase<K, V>::const_iterator - LmdbDatabase<K, V>::cend() const { return end(); } +typename LmdbDataset<K, V>::const_iterator + LmdbDataset<K, V>::cend() const { return end(); } template <typename K, typename V> -bool LmdbDatabase<K, V>::equal(shared_ptr<DatabaseState> state1, - shared_ptr<DatabaseState> state2) const { +bool LmdbDataset<K, V>::equal(shared_ptr<DatasetState> state1, + shared_ptr<DatasetState> state2) const { shared_ptr<LmdbState> lmdb_state1 = boost::dynamic_pointer_cast<LmdbState>(state1); @@ -257,7 +257,7 @@ bool LmdbDatabase<K, V>::equal(shared_ptr<DatabaseState> state1, } template <typename K, typename V> -void LmdbDatabase<K, V>::increment(shared_ptr<DatabaseState>* state) const { +void LmdbDataset<K, V>::increment(shared_ptr<DatasetState>* state) const { shared_ptr<LmdbState> lmdb_state = boost::dynamic_pointer_cast<LmdbState>(*state); @@ -279,8 +279,8 @@ void LmdbDatabase<K, V>::increment(shared_ptr<DatabaseState>* state) const { } template <typename K, typename V> -typename Database<K, V>::KV& LmdbDatabase<K, V>::dereference( - shared_ptr<DatabaseState> state) const { +typename Dataset<K, V>::KV& LmdbDataset<K, V>::dereference( + shared_ptr<DatasetState> state) const { shared_ptr<LmdbState> lmdb_state = boost::dynamic_pointer_cast<LmdbState>(state); @@ -303,6 +303,6 @@ typename Database<K, V>::KV& LmdbDatabase<K, V>::dereference( return lmdb_state->kv_pair_; } -INSTANTIATE_DATABASE(LmdbDatabase); +INSTANTIATE_DATASET(LmdbDataset); } // namespace caffe diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 1c3ec1fc576..32f5d41e2f2 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -5,7 +5,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" -#include "caffe/database_factory.hpp" +#include "caffe/dataset_factory.hpp" #include "caffe/filler.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" @@ -38,10 +38,10 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { // an image are the same. void Fill(const bool unique_pixels, DataParameter_DB backend) { backend_ = backend; - LOG(INFO) << "Using temporary database " << *filename_; - shared_ptr<Database<string, Datum> > database = - DatabaseFactory<string, Datum>(backend_); - CHECK(database->open(*filename_, Database<string, Datum>::New)); + LOG(INFO) << "Using temporary dataset " << *filename_; + shared_ptr<Dataset<string, Datum> > dataset = + DatasetFactory<string, Datum>(backend_); + CHECK(dataset->open(*filename_, Dataset<string, Datum>::New)); for (int i = 0; i < 5; ++i) { Datum datum; datum.set_label(i); @@ -55,10 +55,10 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } stringstream ss; ss << i; - CHECK(database->put(ss.str(), datum)); + CHECK(dataset->put(ss.str(), datum)); } - CHECK(database->commit()); - database->close(); + CHECK(dataset->commit()); + dataset->close(); } void TestRead() { @@ -183,7 +183,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } crop_sequence.push_back(iter_crop_sequence); } - } // destroy 1st data layer and unlock the database + } // destroy 1st data layer and unlock the dataset // Get crop sequence after reseeding Caffe with 1701. // Check that the sequence is the same as the original. @@ -238,7 +238,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } crop_sequence.push_back(iter_crop_sequence); } - } // destroy 1st data layer and unlock the database + } // destroy 1st data layer and unlock the dataset // Get crop sequence continuing from previous Caffe RNG state; reseed // srand with 1701. Check that the sequence differs from the original. diff --git a/src/caffe/test/test_database.cpp b/src/caffe/test/test_database.cpp deleted file mode 100644 index 9a7d6dec8c7..00000000000 --- a/src/caffe/test/test_database.cpp +++ /dev/null @@ -1,642 +0,0 @@ -#include <string> -#include <vector> - -#include "caffe/util/io.hpp" - -#include "gtest/gtest.h" - -#include "caffe/database_factory.hpp" - -#include "caffe/test/test_caffe_main.hpp" - -namespace caffe { - -namespace DatabaseTest_internal { - -template <typename T> -struct TestData { - static T TestValue(); - static T TestAltValue(); - static bool equals(const T& a, const T& b); -}; - -template <> -string TestData<string>::TestValue() { - return "world"; -} - -template <> -string TestData<string>::TestAltValue() { - return "bar"; -} - -template <> -bool TestData<string>::equals(const string& a, const string& b) { - return a == b; -} - -template <> -vector<char> TestData<vector<char> >::TestValue() { - string str = "world"; - vector<char> val(str.data(), str.data() + str.size()); - return val; -} - -template <> -vector<char> TestData<vector<char> >::TestAltValue() { - string str = "bar"; - vector<char> val(str.data(), str.data() + str.size()); - return val; -} - -template <> -bool TestData<vector<char> >::equals(const vector<char>& a, - const vector<char>& b) { - if (a.size() != b.size()) { - return false; - } - for (size_t i = 0; i < a.size(); ++i) { - if (a.at(i) != b.at(i)) { - return false; - } - } - - return true; -} - -template <> -Datum TestData<Datum>::TestValue() { - Datum datum; - datum.set_channels(3); - datum.set_height(32); - datum.set_width(32); - datum.set_data(string(32 * 32 * 3 * 4, ' ')); - datum.set_label(0); - return datum; -} - -template <> -Datum TestData<Datum>::TestAltValue() { - Datum datum; - datum.set_channels(1); - datum.set_height(64); - datum.set_width(64); - datum.set_data(string(64 * 64 * 1 * 4, ' ')); - datum.set_label(1); - return datum; -} - -template <> -bool TestData<Datum>::equals(const Datum& a, const Datum& b) { - string serialized_a; - a.SerializeToString(&serialized_a); - - string serialized_b; - b.SerializeToString(&serialized_b); - - return serialized_a == serialized_b; -} - -} // namespace DatabaseTest_internal - -#define UNPACK_TYPES \ - typedef typename TypeParam::value_type value_type; \ - const DataParameter_DB backend = TypeParam::backend; - -template <typename TypeParam> -class DatabaseTest : public ::testing::Test { - protected: - typedef typename TypeParam::value_type value_type; - - string DBName() { - string filename; - MakeTempDir(&filename); - filename += "/db"; - return filename; - } - - string TestKey() { - return "hello"; - } - - value_type TestValue() { - return DatabaseTest_internal::TestData<value_type>::TestValue(); - } - - string TestAltKey() { - return "foo"; - } - - value_type TestAltValue() { - return DatabaseTest_internal::TestData<value_type>::TestAltValue(); - } - - template <typename T> - bool equals(const T& a, const T& b) { - return DatabaseTest_internal::TestData<T>::equals(a, b); - } -}; - -struct StringLeveldb { - typedef string value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB StringLeveldb::backend = DataParameter_DB_LEVELDB; - -struct StringLmdb { - typedef string value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB StringLmdb::backend = DataParameter_DB_LEVELDB; - -struct VectorLeveldb { - typedef vector<char> value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB VectorLeveldb::backend = DataParameter_DB_LEVELDB; - -struct VectorLmdb { - typedef vector<char> value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB VectorLmdb::backend = DataParameter_DB_LEVELDB; - -struct DatumLeveldb { - typedef Datum value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB DatumLeveldb::backend = DataParameter_DB_LEVELDB; - -struct DatumLmdb { - typedef Datum value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB DatumLmdb::backend = DataParameter_DB_LEVELDB; - -typedef ::testing::Types<StringLeveldb, StringLmdb, VectorLeveldb, VectorLmdb, - DatumLeveldb, DatumLmdb> TestTypes; - -TYPED_TEST_CASE(DatabaseTest, TestTypes); - -TYPED_TEST(DatabaseTest, TestNewDoesntExistPasses) { - UNPACK_TYPES; - - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(this->DBName(), - Database<string, value_type>::New)); - database->close(); -} - -TYPED_TEST(DatabaseTest, TestNewExistsFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - database->close(); - - EXPECT_FALSE(database->open(name, Database<string, value_type>::New)); -} - -TYPED_TEST(DatabaseTest, TestReadOnlyExistsPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - database->close(); - - EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadOnly)); - database->close(); -} - -TYPED_TEST(DatabaseTest, TestReadOnlyDoesntExistFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_FALSE(database->open(name, Database<string, value_type>::ReadOnly)); -} - -TYPED_TEST(DatabaseTest, TestReadWriteExistsPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - database->close(); - - EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadWrite)); - database->close(); -} - -TYPED_TEST(DatabaseTest, TestReadWriteDoesntExistPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadWrite)); - database->close(); -} - -TYPED_TEST(DatabaseTest, TestKeys) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key1 = this->TestKey(); - value_type value1 = this->TestValue(); - - EXPECT_TRUE(database->put(key1, value1)); - - string key2 = this->TestAltKey(); - value_type value2 = this->TestAltValue(); - - EXPECT_TRUE(database->put(key2, value2)); - - EXPECT_TRUE(database->commit()); - - vector<string> keys; - database->keys(&keys); - - EXPECT_EQ(2, keys.size()); - - EXPECT_TRUE(this->equals(keys.at(0), key1) || - this->equals(keys.at(0), key2)); - EXPECT_TRUE(this->equals(keys.at(1), key1) || - this->equals(keys.at(2), key2)); - EXPECT_FALSE(this->equals(keys.at(0), keys.at(1))); -} - -TYPED_TEST(DatabaseTest, TestKeysNoCommit) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key1 = this->TestKey(); - value_type value1 = this->TestValue(); - - EXPECT_TRUE(database->put(key1, value1)); - - string key2 = this->TestAltKey(); - value_type value2 = this->TestAltValue(); - - EXPECT_TRUE(database->put(key2, value2)); - - vector<string> keys; - database->keys(&keys); - - EXPECT_EQ(0, keys.size()); -} - -TYPED_TEST(DatabaseTest, TestIterators) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - const int kNumExamples = 4; - for (int i = 0; i < kNumExamples; ++i) { - stringstream ss; - ss << i; - string key = ss.str(); - ss << " here be data"; - value_type value = this->TestValue(); - EXPECT_TRUE(database->put(key, value)); - } - EXPECT_TRUE(database->commit()); - - int count = 0; - typedef typename Database<string, value_type>::const_iterator Iter; - for (Iter iter = database->begin(); iter != database->end(); ++iter) { - (void)iter; - ++count; - } - - EXPECT_EQ(kNumExamples, count); -} - -TYPED_TEST(DatabaseTest, TestIteratorsPreIncrement) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key1 = this->TestAltKey(); - value_type value1 = this->TestAltValue(); - - string key2 = this->TestKey(); - value_type value2 = this->TestValue(); - - EXPECT_TRUE(database->put(key1, value1)); - EXPECT_TRUE(database->put(key2, value2)); - EXPECT_TRUE(database->commit()); - - typename Database<string, value_type>::const_iterator iter1 = - database->begin(); - - EXPECT_FALSE(database->end() == iter1); - - EXPECT_TRUE(this->equals(iter1->key, key1)); - - typename Database<string, value_type>::const_iterator iter2 = ++iter1; - - EXPECT_FALSE(database->end() == iter1); - EXPECT_FALSE(database->end() == iter2); - - EXPECT_TRUE(this->equals(iter2->key, key2)); - - typename Database<string, value_type>::const_iterator iter3 = ++iter2; - - EXPECT_TRUE(database->end() == iter3); - - database->close(); -} - -TYPED_TEST(DatabaseTest, TestIteratorsPostIncrement) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key1 = this->TestAltKey(); - value_type value1 = this->TestAltValue(); - - string key2 = this->TestKey(); - value_type value2 = this->TestValue(); - - EXPECT_TRUE(database->put(key1, value1)); - EXPECT_TRUE(database->put(key2, value2)); - EXPECT_TRUE(database->commit()); - - typename Database<string, value_type>::const_iterator iter1 = - database->begin(); - - EXPECT_FALSE(database->end() == iter1); - - EXPECT_TRUE(this->equals(iter1->key, key1)); - - typename Database<string, value_type>::const_iterator iter2 = iter1++; - - EXPECT_FALSE(database->end() == iter1); - EXPECT_FALSE(database->end() == iter2); - - EXPECT_TRUE(this->equals(iter2->key, key1)); - EXPECT_TRUE(this->equals(iter1->key, key2)); - - typename Database<string, value_type>::const_iterator iter3 = iter1++; - - EXPECT_FALSE(database->end() == iter3); - EXPECT_TRUE(this->equals(iter3->key, key2)); - EXPECT_TRUE(database->end() == iter1); - - database->close(); -} - -TYPED_TEST(DatabaseTest, TestNewPutPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(database->put(key, value)); - - EXPECT_TRUE(database->commit()); - - database->close(); -} - -TYPED_TEST(DatabaseTest, TestNewCommitPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - EXPECT_TRUE(database->commit()); - - database->close(); -} - -TYPED_TEST(DatabaseTest, TestNewGetPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(database->put(key, value)); - - EXPECT_TRUE(database->commit()); - - value_type new_value; - - EXPECT_TRUE(database->get(key, &new_value)); - - EXPECT_TRUE(this->equals(value, new_value)); - - database->close(); -} - -TYPED_TEST(DatabaseTest, TestNewGetNoCommitFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(database->put(key, value)); - - value_type new_value; - - EXPECT_FALSE(database->get(key, &new_value)); -} - - -TYPED_TEST(DatabaseTest, TestReadWritePutPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadWrite)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(database->put(key, value)); - - EXPECT_TRUE(database->commit()); - - database->close(); -} - -TYPED_TEST(DatabaseTest, TestReadWriteCommitPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadWrite)); - - EXPECT_TRUE(database->commit()); - - database->close(); -} - -TYPED_TEST(DatabaseTest, TestReadWriteGetPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(database->put(key, value)); - - EXPECT_TRUE(database->commit()); - - value_type new_value; - - EXPECT_TRUE(database->get(key, &new_value)); - - EXPECT_TRUE(this->equals(value, new_value)); - - database->close(); -} - -TYPED_TEST(DatabaseTest, TestReadWriteGetNoCommitFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(database->put(key, value)); - - value_type new_value; - - EXPECT_FALSE(database->get(key, &new_value)); -} - -TYPED_TEST(DatabaseTest, TestReadOnlyPutFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - database->close(); - - EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadOnly)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_FALSE(database->put(key, value)); -} - -TYPED_TEST(DatabaseTest, TestReadOnlyCommitFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - database->close(); - - EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadOnly)); - - EXPECT_FALSE(database->commit()); -} - -TYPED_TEST(DatabaseTest, TestReadOnlyGetPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(database->put(key, value)); - - EXPECT_TRUE(database->commit()); - - database->close(); - - EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadOnly)); - - value_type new_value; - - EXPECT_TRUE(database->get(key, &new_value)); - - EXPECT_TRUE(this->equals(value, new_value)); -} - -TYPED_TEST(DatabaseTest, TestReadOnlyGetNoCommitFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Database<string, value_type> > database = - DatabaseFactory<string, value_type>(backend); - EXPECT_TRUE(database->open(name, Database<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(database->put(key, value)); - - database->close(); - - EXPECT_TRUE(database->open(name, Database<string, value_type>::ReadOnly)); - - value_type new_value; - - EXPECT_FALSE(database->get(key, &new_value)); -} - -#undef UNPACK_TYPES - -} // namespace caffe diff --git a/src/caffe/test/test_dataset.cpp b/src/caffe/test/test_dataset.cpp new file mode 100644 index 00000000000..bb6cf4ce616 --- /dev/null +++ b/src/caffe/test/test_dataset.cpp @@ -0,0 +1,642 @@ +#include <string> +#include <vector> + +#include "caffe/util/io.hpp" + +#include "gtest/gtest.h" + +#include "caffe/dataset_factory.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +namespace DatasetTest_internal { + +template <typename T> +struct TestData { + static T TestValue(); + static T TestAltValue(); + static bool equals(const T& a, const T& b); +}; + +template <> +string TestData<string>::TestValue() { + return "world"; +} + +template <> +string TestData<string>::TestAltValue() { + return "bar"; +} + +template <> +bool TestData<string>::equals(const string& a, const string& b) { + return a == b; +} + +template <> +vector<char> TestData<vector<char> >::TestValue() { + string str = "world"; + vector<char> val(str.data(), str.data() + str.size()); + return val; +} + +template <> +vector<char> TestData<vector<char> >::TestAltValue() { + string str = "bar"; + vector<char> val(str.data(), str.data() + str.size()); + return val; +} + +template <> +bool TestData<vector<char> >::equals(const vector<char>& a, + const vector<char>& b) { + if (a.size() != b.size()) { + return false; + } + for (size_t i = 0; i < a.size(); ++i) { + if (a.at(i) != b.at(i)) { + return false; + } + } + + return true; +} + +template <> +Datum TestData<Datum>::TestValue() { + Datum datum; + datum.set_channels(3); + datum.set_height(32); + datum.set_width(32); + datum.set_data(string(32 * 32 * 3 * 4, ' ')); + datum.set_label(0); + return datum; +} + +template <> +Datum TestData<Datum>::TestAltValue() { + Datum datum; + datum.set_channels(1); + datum.set_height(64); + datum.set_width(64); + datum.set_data(string(64 * 64 * 1 * 4, ' ')); + datum.set_label(1); + return datum; +} + +template <> +bool TestData<Datum>::equals(const Datum& a, const Datum& b) { + string serialized_a; + a.SerializeToString(&serialized_a); + + string serialized_b; + b.SerializeToString(&serialized_b); + + return serialized_a == serialized_b; +} + +} // namespace DatasetTest_internal + +#define UNPACK_TYPES \ + typedef typename TypeParam::value_type value_type; \ + const DataParameter_DB backend = TypeParam::backend; + +template <typename TypeParam> +class DatasetTest : public ::testing::Test { + protected: + typedef typename TypeParam::value_type value_type; + + string DBName() { + string filename; + MakeTempDir(&filename); + filename += "/db"; + return filename; + } + + string TestKey() { + return "hello"; + } + + value_type TestValue() { + return DatasetTest_internal::TestData<value_type>::TestValue(); + } + + string TestAltKey() { + return "foo"; + } + + value_type TestAltValue() { + return DatasetTest_internal::TestData<value_type>::TestAltValue(); + } + + template <typename T> + bool equals(const T& a, const T& b) { + return DatasetTest_internal::TestData<T>::equals(a, b); + } +}; + +struct StringLeveldb { + typedef string value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB StringLeveldb::backend = DataParameter_DB_LEVELDB; + +struct StringLmdb { + typedef string value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB StringLmdb::backend = DataParameter_DB_LEVELDB; + +struct VectorLeveldb { + typedef vector<char> value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB VectorLeveldb::backend = DataParameter_DB_LEVELDB; + +struct VectorLmdb { + typedef vector<char> value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB VectorLmdb::backend = DataParameter_DB_LEVELDB; + +struct DatumLeveldb { + typedef Datum value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB DatumLeveldb::backend = DataParameter_DB_LEVELDB; + +struct DatumLmdb { + typedef Datum value_type; + static const DataParameter_DB backend; +}; +const DataParameter_DB DatumLmdb::backend = DataParameter_DB_LEVELDB; + +typedef ::testing::Types<StringLeveldb, StringLmdb, VectorLeveldb, VectorLmdb, + DatumLeveldb, DatumLmdb> TestTypes; + +TYPED_TEST_CASE(DatasetTest, TestTypes); + +TYPED_TEST(DatasetTest, TestNewDoesntExistPasses) { + UNPACK_TYPES; + + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(this->DBName(), + Dataset<string, value_type>::New)); + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestNewExistsFails) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + dataset->close(); + + EXPECT_FALSE(dataset->open(name, Dataset<string, value_type>::New)); +} + +TYPED_TEST(DatasetTest, TestReadOnlyExistsPasses) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + dataset->close(); + + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestReadOnlyDoesntExistFails) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_FALSE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); +} + +TYPED_TEST(DatasetTest, TestReadWriteExistsPasses) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + dataset->close(); + + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadWrite)); + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestReadWriteDoesntExistPasses) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadWrite)); + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestKeys) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key1 = this->TestKey(); + value_type value1 = this->TestValue(); + + EXPECT_TRUE(dataset->put(key1, value1)); + + string key2 = this->TestAltKey(); + value_type value2 = this->TestAltValue(); + + EXPECT_TRUE(dataset->put(key2, value2)); + + EXPECT_TRUE(dataset->commit()); + + vector<string> keys; + dataset->keys(&keys); + + EXPECT_EQ(2, keys.size()); + + EXPECT_TRUE(this->equals(keys.at(0), key1) || + this->equals(keys.at(0), key2)); + EXPECT_TRUE(this->equals(keys.at(1), key1) || + this->equals(keys.at(2), key2)); + EXPECT_FALSE(this->equals(keys.at(0), keys.at(1))); +} + +TYPED_TEST(DatasetTest, TestKeysNoCommit) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key1 = this->TestKey(); + value_type value1 = this->TestValue(); + + EXPECT_TRUE(dataset->put(key1, value1)); + + string key2 = this->TestAltKey(); + value_type value2 = this->TestAltValue(); + + EXPECT_TRUE(dataset->put(key2, value2)); + + vector<string> keys; + dataset->keys(&keys); + + EXPECT_EQ(0, keys.size()); +} + +TYPED_TEST(DatasetTest, TestIterators) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + const int kNumExamples = 4; + for (int i = 0; i < kNumExamples; ++i) { + stringstream ss; + ss << i; + string key = ss.str(); + ss << " here be data"; + value_type value = this->TestValue(); + EXPECT_TRUE(dataset->put(key, value)); + } + EXPECT_TRUE(dataset->commit()); + + int count = 0; + typedef typename Dataset<string, value_type>::const_iterator Iter; + for (Iter iter = dataset->begin(); iter != dataset->end(); ++iter) { + (void)iter; + ++count; + } + + EXPECT_EQ(kNumExamples, count); +} + +TYPED_TEST(DatasetTest, TestIteratorsPreIncrement) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key1 = this->TestAltKey(); + value_type value1 = this->TestAltValue(); + + string key2 = this->TestKey(); + value_type value2 = this->TestValue(); + + EXPECT_TRUE(dataset->put(key1, value1)); + EXPECT_TRUE(dataset->put(key2, value2)); + EXPECT_TRUE(dataset->commit()); + + typename Dataset<string, value_type>::const_iterator iter1 = + dataset->begin(); + + EXPECT_FALSE(dataset->end() == iter1); + + EXPECT_TRUE(this->equals(iter1->key, key1)); + + typename Dataset<string, value_type>::const_iterator iter2 = ++iter1; + + EXPECT_FALSE(dataset->end() == iter1); + EXPECT_FALSE(dataset->end() == iter2); + + EXPECT_TRUE(this->equals(iter2->key, key2)); + + typename Dataset<string, value_type>::const_iterator iter3 = ++iter2; + + EXPECT_TRUE(dataset->end() == iter3); + + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestIteratorsPostIncrement) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key1 = this->TestAltKey(); + value_type value1 = this->TestAltValue(); + + string key2 = this->TestKey(); + value_type value2 = this->TestValue(); + + EXPECT_TRUE(dataset->put(key1, value1)); + EXPECT_TRUE(dataset->put(key2, value2)); + EXPECT_TRUE(dataset->commit()); + + typename Dataset<string, value_type>::const_iterator iter1 = + dataset->begin(); + + EXPECT_FALSE(dataset->end() == iter1); + + EXPECT_TRUE(this->equals(iter1->key, key1)); + + typename Dataset<string, value_type>::const_iterator iter2 = iter1++; + + EXPECT_FALSE(dataset->end() == iter1); + EXPECT_FALSE(dataset->end() == iter2); + + EXPECT_TRUE(this->equals(iter2->key, key1)); + EXPECT_TRUE(this->equals(iter1->key, key2)); + + typename Dataset<string, value_type>::const_iterator iter3 = iter1++; + + EXPECT_FALSE(dataset->end() == iter3); + EXPECT_TRUE(this->equals(iter3->key, key2)); + EXPECT_TRUE(dataset->end() == iter1); + + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestNewPutPasses) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + + EXPECT_TRUE(dataset->put(key, value)); + + EXPECT_TRUE(dataset->commit()); + + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestNewCommitPasses) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + EXPECT_TRUE(dataset->commit()); + + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestNewGetPasses) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + + EXPECT_TRUE(dataset->put(key, value)); + + EXPECT_TRUE(dataset->commit()); + + value_type new_value; + + EXPECT_TRUE(dataset->get(key, &new_value)); + + EXPECT_TRUE(this->equals(value, new_value)); + + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestNewGetNoCommitFails) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + + EXPECT_TRUE(dataset->put(key, value)); + + value_type new_value; + + EXPECT_FALSE(dataset->get(key, &new_value)); +} + + +TYPED_TEST(DatasetTest, TestReadWritePutPasses) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadWrite)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + + EXPECT_TRUE(dataset->put(key, value)); + + EXPECT_TRUE(dataset->commit()); + + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestReadWriteCommitPasses) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadWrite)); + + EXPECT_TRUE(dataset->commit()); + + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestReadWriteGetPasses) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + + EXPECT_TRUE(dataset->put(key, value)); + + EXPECT_TRUE(dataset->commit()); + + value_type new_value; + + EXPECT_TRUE(dataset->get(key, &new_value)); + + EXPECT_TRUE(this->equals(value, new_value)); + + dataset->close(); +} + +TYPED_TEST(DatasetTest, TestReadWriteGetNoCommitFails) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + + EXPECT_TRUE(dataset->put(key, value)); + + value_type new_value; + + EXPECT_FALSE(dataset->get(key, &new_value)); +} + +TYPED_TEST(DatasetTest, TestReadOnlyPutFails) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + dataset->close(); + + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + + EXPECT_FALSE(dataset->put(key, value)); +} + +TYPED_TEST(DatasetTest, TestReadOnlyCommitFails) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + dataset->close(); + + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); + + EXPECT_FALSE(dataset->commit()); +} + +TYPED_TEST(DatasetTest, TestReadOnlyGetPasses) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + + EXPECT_TRUE(dataset->put(key, value)); + + EXPECT_TRUE(dataset->commit()); + + dataset->close(); + + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); + + value_type new_value; + + EXPECT_TRUE(dataset->get(key, &new_value)); + + EXPECT_TRUE(this->equals(value, new_value)); +} + +TYPED_TEST(DatasetTest, TestReadOnlyGetNoCommitFails) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + + EXPECT_TRUE(dataset->put(key, value)); + + dataset->close(); + + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); + + value_type new_value; + + EXPECT_FALSE(dataset->get(key, &new_value)); +} + +#undef UNPACK_TYPES + +} // namespace caffe diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index f1a79679091..a720f162aa2 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -4,11 +4,11 @@ #include <algorithm> #include <string> -#include "caffe/database_factory.hpp" +#include "caffe/dataset_factory.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" -using caffe::Database; +using caffe::Dataset; using caffe::Datum; using caffe::BlobProto; using std::max; @@ -26,16 +26,16 @@ int main(int argc, char** argv) { db_backend = std::string(argv[3]); } - caffe::shared_ptr<Database<std::string, Datum> > database = - caffe::DatabaseFactory<std::string, Datum>(db_backend); + caffe::shared_ptr<Dataset<std::string, Datum> > dataset = + caffe::DatasetFactory<std::string, Datum>(db_backend); // Open db - CHECK(database->open(argv[1], Database<std::string, Datum>::ReadOnly)); + CHECK(dataset->open(argv[1], Dataset<std::string, Datum>::ReadOnly)); BlobProto sum_blob; int count = 0; // load first datum - Database<std::string, Datum>::const_iterator iter = database->begin(); + Dataset<std::string, Datum>::const_iterator iter = dataset->begin(); const Datum& datum = iter->value; sum_blob.set_num(1); @@ -49,8 +49,8 @@ int main(int argc, char** argv) { sum_blob.add_data(0.); } LOG(INFO) << "Starting Iteration"; - for (Database<std::string, Datum>::const_iterator iter = database->begin(); - iter != database->end(); ++iter) { + for (Dataset<std::string, Datum>::const_iterator iter = dataset->begin(); + iter != dataset->end(); ++iter) { // just a dummy operation const Datum& datum = iter->value; const std::string& data = datum.data(); @@ -87,6 +87,6 @@ int main(int argc, char** argv) { WriteProtoToBinaryFile(sum_blob, argv[2]); // Clean up - database->close(); + dataset->close(); return 0; } diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 2ba3e3c7250..37efa5c13f7 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -17,7 +17,7 @@ #include <utility> #include <vector> -#include "caffe/database_factory.hpp" +#include "caffe/dataset_factory.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" #include "caffe/util/rng.hpp" @@ -78,11 +78,11 @@ int main(int argc, char** argv) { int resize_width = std::max<int>(0, FLAGS_resize_width); // Open new db - shared_ptr<Database<string, Datum> > database = - DatabaseFactory<string, Datum>(db_backend); + shared_ptr<Dataset<string, Datum> > dataset = + DatasetFactory<string, Datum>(db_backend); // Open db - CHECK(database->open(db_path, Database<string, Datum>::New)); + CHECK(dataset->open(db_path, Dataset<string, Datum>::New)); // Storing to db std::string root_folder(argv[1]); @@ -113,19 +113,19 @@ int main(int argc, char** argv) { lines[line_id].first.c_str()); // Put in db - CHECK(database->put(string(key_cstr, length), datum)); + CHECK(dataset->put(string(key_cstr, length), datum)); if (++count % 1000 == 0) { // Commit txn - CHECK(database->commit()); + CHECK(dataset->commit()); LOG(ERROR) << "Processed " << count << " files."; } } // write the last batch if (count % 1000 != 0) { - CHECK(database->commit()); + CHECK(dataset->commit()); LOG(ERROR) << "Processed " << count << " files."; } - database->close(); + dataset->close(); return 0; } diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 47565a83025..ddbce1075ed 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -7,7 +7,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" -#include "caffe/database_factory.hpp" +#include "caffe/dataset_factory.hpp" #include "caffe/net.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" @@ -16,8 +16,8 @@ using boost::shared_ptr; using caffe::Blob; using caffe::Caffe; -using caffe::Database; -using caffe::DatabaseFactory; +using caffe::Dataset; +using caffe::DatasetFactory; using caffe::Datum; using caffe::Net; @@ -39,12 +39,12 @@ int feature_extraction_pipeline(int argc, char** argv) { " extract features of the input data produced by the net.\n" "Usage: extract_features pretrained_net_param" " feature_extraction_proto_file extract_feature_blob_name1[,name2,...]" - " save_feature_database_name1[,name2,...] num_mini_batches db_type" + " save_feature_dataset_name1[,name2,...] num_mini_batches db_type" " [CPU/GPU] [DEVICE_ID=0]\n" "Note: you can extract multiple features in one pass by specifying" - " multiple feature blob names and database names seperated by ','." + " multiple feature blob names and dataset names seperated by ','." " The names cannot contain white space characters and the number of blobs" - " and databases must be equal."; + " and datasets must be equal."; return 1; } int arg_pos = num_required_args; @@ -105,12 +105,12 @@ int feature_extraction_pipeline(int argc, char** argv) { std::vector<std::string> blob_names; boost::split(blob_names, extract_feature_blob_names, boost::is_any_of(",")); - std::string save_feature_database_names(argv[++arg_pos]); - std::vector<std::string> database_names; - boost::split(database_names, save_feature_database_names, + std::string save_feature_dataset_names(argv[++arg_pos]); + std::vector<std::string> dataset_names; + boost::split(dataset_names, save_feature_dataset_names, boost::is_any_of(",")); - CHECK_EQ(blob_names.size(), database_names.size()) << - " the number of blob names and database names must be equal"; + CHECK_EQ(blob_names.size(), dataset_names.size()) << + " the number of blob names and dataset names must be equal"; size_t num_features = blob_names.size(); for (size_t i = 0; i < num_features; i++) { @@ -121,14 +121,13 @@ int feature_extraction_pipeline(int argc, char** argv) { int num_mini_batches = atoi(argv[++arg_pos]); - std::vector<shared_ptr<Database<std::string, Datum> > > feature_dbs; + std::vector<shared_ptr<Dataset<std::string, Datum> > > feature_dbs; for (size_t i = 0; i < num_features; ++i) { - LOG(INFO)<< "Opening database " << database_names[i]; - shared_ptr<Database<std::string, Datum> > database = - DatabaseFactory<std::string, Datum>(argv[++arg_pos]); - CHECK(database->open(database_names.at(i), - Database<std::string, Datum>::New)); - feature_dbs.push_back(database); + LOG(INFO)<< "Opening dataset " << dataset_names[i]; + shared_ptr<Dataset<std::string, Datum> > dataset = + DatasetFactory<std::string, Datum>(argv[++arg_pos]); + CHECK(dataset->open(dataset_names.at(i), Dataset<std::string, Datum>::New)); + feature_dbs.push_back(dataset); } LOG(ERROR)<< "Extacting Features"; From 6fd72e106526e6cbdf8a8b867576816f87700681 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Tue, 14 Oct 2014 12:44:00 -0400 Subject: [PATCH 0937/2053] Had forgotten to set some of the Dataset test cases to LMDB backend. --- src/caffe/test/test_dataset.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/caffe/test/test_dataset.cpp b/src/caffe/test/test_dataset.cpp index bb6cf4ce616..7d0f6b3d9bb 100644 --- a/src/caffe/test/test_dataset.cpp +++ b/src/caffe/test/test_dataset.cpp @@ -147,7 +147,7 @@ struct StringLmdb { typedef string value_type; static const DataParameter_DB backend; }; -const DataParameter_DB StringLmdb::backend = DataParameter_DB_LEVELDB; +const DataParameter_DB StringLmdb::backend = DataParameter_DB_LMDB; struct VectorLeveldb { typedef vector<char> value_type; @@ -159,7 +159,7 @@ struct VectorLmdb { typedef vector<char> value_type; static const DataParameter_DB backend; }; -const DataParameter_DB VectorLmdb::backend = DataParameter_DB_LEVELDB; +const DataParameter_DB VectorLmdb::backend = DataParameter_DB_LMDB; struct DatumLeveldb { typedef Datum value_type; @@ -171,7 +171,7 @@ struct DatumLmdb { typedef Datum value_type; static const DataParameter_DB backend; }; -const DataParameter_DB DatumLmdb::backend = DataParameter_DB_LEVELDB; +const DataParameter_DB DatumLmdb::backend = DataParameter_DB_LMDB; typedef ::testing::Types<StringLeveldb, StringLmdb, VectorLeveldb, VectorLmdb, DatumLeveldb, DatumLmdb> TestTypes; From ef518dc6e02b6d837a3281cf353a52a333a5a669 Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Tue, 14 Oct 2014 14:00:29 -0400 Subject: [PATCH 0938/2053] Reworked the Coder interface such that a Dataset now has both user-definable KCoder and VCoder which default to a set of DefaultCoder's based on types K and V. Reworked the DefaultCoder's such that if none are available, a static assertion fails with a relevant message. --- include/caffe/dataset.hpp | 66 ++++++++++++++------------ include/caffe/leveldb_dataset.hpp | 8 ++-- include/caffe/lmdb_dataset.hpp | 8 ++-- src/caffe/leveldb_dataset.cpp | 77 ++++++++++++++++--------------- src/caffe/lmdb_dataset.cpp | 75 +++++++++++++++--------------- 5 files changed, 126 insertions(+), 108 deletions(-) diff --git a/include/caffe/dataset.hpp b/include/caffe/dataset.hpp index 1f07aa9d18d..efe3ffde582 100644 --- a/include/caffe/dataset.hpp +++ b/include/caffe/dataset.hpp @@ -1,6 +1,8 @@ #ifndef CAFFE_DATASET_H_ #define CAFFE_DATASET_H_ +#include <google/protobuf/message.h> + #include <algorithm> #include <iterator> #include <string> @@ -8,34 +10,58 @@ #include <vector> #include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" namespace caffe { namespace dataset_internal { +using google::protobuf::Message; + +template<bool condition> +struct static_assertion {}; +template<> +struct static_assertion<true> { + enum { + DEFAULT_CODER_NOT_AVAILABLE + }; +}; + template <typename T> -struct Coder { - static bool serialize(const T& obj, string* serialized) { +struct DefaultCoder { + using static_assertion<sizeof(T) == 0>::DEFAULT_CODER_NOT_AVAILABLE; + static bool serialize(const T& obj, string* serialized); + static bool serialize(const T& obj, vector<char>* serialized); + static bool deserialize(const string& serialized, T* obj); + static bool deserialize(const char* data, size_t size, T* obj); +}; + +template <> +struct DefaultCoder<Message> { + static bool serialize(const Message& obj, string* serialized) { return obj.SerializeToString(serialized); } - static bool serialize(const T& obj, vector<char>* serialized) { + static bool serialize(const Message& obj, vector<char>* serialized) { serialized->resize(obj.ByteSize()); return obj.SerializeWithCachedSizesToArray( reinterpret_cast<unsigned char*>(serialized->data())); } - static bool deserialize(const string& serialized, T* obj) { + static bool deserialize(const string& serialized, Message* obj) { return obj->ParseFromString(serialized); } - static bool deserialize(const char* data, size_t size, T* obj) { + static bool deserialize(const char* data, size_t size, Message* obj) { return obj->ParseFromArray(data, size); } }; template <> -struct Coder<string> { +struct DefaultCoder<caffe::Datum> : public DefaultCoder<Message> { }; + +template <> +struct DefaultCoder<string> { static bool serialize(string obj, string* serialized) { *serialized = obj; return true; @@ -60,7 +86,7 @@ struct Coder<string> { }; template <> -struct Coder<vector<char> > { +struct DefaultCoder<vector<char> > { static bool serialize(vector<char> obj, string* serialized) { string tmp(obj.data(), obj.size()); serialized->swap(tmp); @@ -87,7 +113,9 @@ struct Coder<vector<char> > { } // namespace dataset_internal -template <typename K, typename V> +template <typename K, typename V, + typename KCoder = dataset_internal::DefaultCoder<K>, + typename VCoder = dataset_internal::DefaultCoder<V> > class Dataset { public: enum Mode { @@ -200,26 +228,6 @@ class Dataset { virtual void increment(shared_ptr<DatasetState>* state) const = 0; virtual KV& dereference( shared_ptr<DatasetState> state) const = 0; - - template <typename T> - static bool serialize(const T& obj, string* serialized) { - return dataset_internal::Coder<T>::serialize(obj, serialized); - } - - template <typename T> - static bool serialize(const T& obj, vector<char>* serialized) { - return dataset_internal::Coder<T>::serialize(obj, serialized); - } - - template <typename T> - static bool deserialize(const string& serialized, T* obj) { - return dataset_internal::Coder<T>::deserialize(serialized, obj); - } - - template <typename T> - static bool deserialize(const char* data, size_t size, T* obj) { - return dataset_internal::Coder<T>::deserialize(data, size, obj); - } }; } // namespace caffe @@ -227,6 +235,6 @@ class Dataset { #define INSTANTIATE_DATASET(type) \ template class type<string, string>; \ template class type<string, vector<char> >; \ - template class type<string, Datum>; + template class type<string, caffe::Datum>; #endif // CAFFE_DATASET_H_ diff --git a/include/caffe/leveldb_dataset.hpp b/include/caffe/leveldb_dataset.hpp index eb354d95db3..90f92d9336a 100644 --- a/include/caffe/leveldb_dataset.hpp +++ b/include/caffe/leveldb_dataset.hpp @@ -13,10 +13,12 @@ namespace caffe { -template <typename K, typename V> -class LeveldbDataset : public Dataset<K, V> { +template <typename K, typename V, + typename KCoder = dataset_internal::DefaultCoder<K>, + typename VCoder = dataset_internal::DefaultCoder<V> > +class LeveldbDataset : public Dataset<K, V, KCoder, VCoder> { public: - typedef Dataset<K, V> Base; + typedef Dataset<K, V, KCoder, VCoder> Base; typedef typename Base::key_type key_type; typedef typename Base::value_type value_type; typedef typename Base::DatasetState DatasetState; diff --git a/include/caffe/lmdb_dataset.hpp b/include/caffe/lmdb_dataset.hpp index 57da5dea829..8817df7cade 100644 --- a/include/caffe/lmdb_dataset.hpp +++ b/include/caffe/lmdb_dataset.hpp @@ -12,10 +12,12 @@ namespace caffe { -template <typename K, typename V> -class LmdbDataset : public Dataset<K, V> { +template <typename K, typename V, + typename KCoder = dataset_internal::DefaultCoder<K>, + typename VCoder = dataset_internal::DefaultCoder<V> > +class LmdbDataset : public Dataset<K, V, KCoder, VCoder> { public: - typedef Dataset<K, V> Base; + typedef Dataset<K, V, KCoder, VCoder> Base; typedef typename Base::key_type key_type; typedef typename Base::value_type value_type; typedef typename Base::DatasetState DatasetState; diff --git a/src/caffe/leveldb_dataset.cpp b/src/caffe/leveldb_dataset.cpp index 41c71e44557..af9560456d8 100644 --- a/src/caffe/leveldb_dataset.cpp +++ b/src/caffe/leveldb_dataset.cpp @@ -7,8 +7,9 @@ namespace caffe { -template <typename K, typename V> -bool LeveldbDataset<K, V>::open(const string& filename, Mode mode) { +template <typename K, typename V, typename KCoder, typename VCoder> +bool LeveldbDataset<K, V, KCoder, VCoder>::open(const string& filename, + Mode mode) { DLOG(INFO) << "LevelDB: Open " << filename; leveldb::Options options; @@ -54,8 +55,8 @@ bool LeveldbDataset<K, V>::open(const string& filename, Mode mode) { return true; } -template <typename K, typename V> -bool LeveldbDataset<K, V>::put(const K& key, const V& value) { +template <typename K, typename V, typename KCoder, typename VCoder> +bool LeveldbDataset<K, V, KCoder, VCoder>::put(const K& key, const V& value) { DLOG(INFO) << "LevelDB: Put"; if (read_only_) { @@ -66,12 +67,12 @@ bool LeveldbDataset<K, V>::put(const K& key, const V& value) { CHECK_NOTNULL(batch_.get()); string serialized_key; - if (!Base::serialize(key, &serialized_key)) { + if (!KCoder::serialize(key, &serialized_key)) { return false; } string serialized_value; - if (!Base::serialize(value, &serialized_value)) { + if (!VCoder::serialize(value, &serialized_value)) { return false; } @@ -80,12 +81,12 @@ bool LeveldbDataset<K, V>::put(const K& key, const V& value) { return true; } -template <typename K, typename V> -bool LeveldbDataset<K, V>::get(const K& key, V* value) { +template <typename K, typename V, typename KCoder, typename VCoder> +bool LeveldbDataset<K, V, KCoder, VCoder>::get(const K& key, V* value) { DLOG(INFO) << "LevelDB: Get"; string serialized_key; - if (!Base::serialize(key, &serialized_key)) { + if (!KCoder::serialize(key, &serialized_key)) { return false; } @@ -98,15 +99,15 @@ bool LeveldbDataset<K, V>::get(const K& key, V* value) { return false; } - if (!Base::deserialize(serialized_value, value)) { + if (!VCoder::deserialize(serialized_value, value)) { return false; } return true; } -template <typename K, typename V> -bool LeveldbDataset<K, V>::commit() { +template <typename K, typename V, typename KCoder, typename VCoder> +bool LeveldbDataset<K, V, KCoder, VCoder>::commit() { DLOG(INFO) << "LevelDB: Commit"; if (read_only_) { @@ -124,16 +125,16 @@ bool LeveldbDataset<K, V>::commit() { return status.ok(); } -template <typename K, typename V> -void LeveldbDataset<K, V>::close() { +template <typename K, typename V, typename KCoder, typename VCoder> +void LeveldbDataset<K, V, KCoder, VCoder>::close() { DLOG(INFO) << "LevelDB: Close"; batch_.reset(); db_.reset(); } -template <typename K, typename V> -void LeveldbDataset<K, V>::keys(vector<K>* keys) { +template <typename K, typename V, typename KCoder, typename VCoder> +void LeveldbDataset<K, V, KCoder, VCoder>::keys(vector<K>* keys) { DLOG(INFO) << "LevelDB: Keys"; keys->clear(); @@ -142,9 +143,9 @@ void LeveldbDataset<K, V>::keys(vector<K>* keys) { } } -template <typename K, typename V> -typename LeveldbDataset<K, V>::const_iterator - LeveldbDataset<K, V>::begin() const { +template <typename K, typename V, typename KCoder, typename VCoder> +typename LeveldbDataset<K, V, KCoder, VCoder>::const_iterator + LeveldbDataset<K, V, KCoder, VCoder>::begin() const { CHECK_NOTNULL(db_.get()); shared_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); iter->SeekToFirst(); @@ -159,26 +160,26 @@ typename LeveldbDataset<K, V>::const_iterator return const_iterator(this, state); } -template <typename K, typename V> -typename LeveldbDataset<K, V>::const_iterator - LeveldbDataset<K, V>::end() const { +template <typename K, typename V, typename KCoder, typename VCoder> +typename LeveldbDataset<K, V, KCoder, VCoder>::const_iterator + LeveldbDataset<K, V, KCoder, VCoder>::end() const { shared_ptr<DatasetState> state; return const_iterator(this, state); } -template <typename K, typename V> -typename LeveldbDataset<K, V>::const_iterator - LeveldbDataset<K, V>::cbegin() const { +template <typename K, typename V, typename KCoder, typename VCoder> +typename LeveldbDataset<K, V, KCoder, VCoder>::const_iterator + LeveldbDataset<K, V, KCoder, VCoder>::cbegin() const { return begin(); } -template <typename K, typename V> -typename LeveldbDataset<K, V>::const_iterator - LeveldbDataset<K, V>::cend() const { return end(); } +template <typename K, typename V, typename KCoder, typename VCoder> +typename LeveldbDataset<K, V, KCoder, VCoder>::const_iterator + LeveldbDataset<K, V, KCoder, VCoder>::cend() const { return end(); } -template <typename K, typename V> -bool LeveldbDataset<K, V>::equal(shared_ptr<DatasetState> state1, - shared_ptr<DatasetState> state2) const { +template <typename K, typename V, typename KCoder, typename VCoder> +bool LeveldbDataset<K, V, KCoder, VCoder>::equal( + shared_ptr<DatasetState> state1, shared_ptr<DatasetState> state2) const { shared_ptr<LeveldbState> leveldb_state1 = boost::dynamic_pointer_cast<LeveldbState>(state1); @@ -191,8 +192,9 @@ bool LeveldbDataset<K, V>::equal(shared_ptr<DatasetState> state1, return !leveldb_state1 && !leveldb_state2; } -template <typename K, typename V> -void LeveldbDataset<K, V>::increment(shared_ptr<DatasetState>* state) const { +template <typename K, typename V, typename KCoder, typename VCoder> +void LeveldbDataset<K, V, KCoder, VCoder>::increment( + shared_ptr<DatasetState>* state) const { shared_ptr<LeveldbState> leveldb_state = boost::dynamic_pointer_cast<LeveldbState>(*state); @@ -209,8 +211,9 @@ void LeveldbDataset<K, V>::increment(shared_ptr<DatasetState>* state) const { } } -template <typename K, typename V> -typename Dataset<K, V>::KV& LeveldbDataset<K, V>::dereference( +template <typename K, typename V, typename KCoder, typename VCoder> +typename Dataset<K, V, KCoder, VCoder>::KV& + LeveldbDataset<K, V, KCoder, VCoder>::dereference( shared_ptr<DatasetState> state) const { shared_ptr<LeveldbState> leveldb_state = boost::dynamic_pointer_cast<LeveldbState>(state); @@ -225,9 +228,9 @@ typename Dataset<K, V>::KV& LeveldbDataset<K, V>::dereference( const leveldb::Slice& key = iter->key(); const leveldb::Slice& value = iter->value(); - CHECK(Base::deserialize(key.data(), key.size(), + CHECK(KCoder::deserialize(key.data(), key.size(), &leveldb_state->kv_pair_.key)); - CHECK(Base::deserialize(value.data(), value.size(), + CHECK(VCoder::deserialize(value.data(), value.size(), &leveldb_state->kv_pair_.value)); return leveldb_state->kv_pair_; diff --git a/src/caffe/lmdb_dataset.cpp b/src/caffe/lmdb_dataset.cpp index d2b6fcd1c85..ca968432bc0 100644 --- a/src/caffe/lmdb_dataset.cpp +++ b/src/caffe/lmdb_dataset.cpp @@ -9,8 +9,9 @@ namespace caffe { -template <typename K, typename V> -bool LmdbDataset<K, V>::open(const string& filename, Mode mode) { +template <typename K, typename V, typename KCoder, typename VCoder> +bool LmdbDataset<K, V, KCoder, VCoder>::open(const string& filename, + Mode mode) { DLOG(INFO) << "LMDB: Open " << filename; CHECK(NULL == env_); @@ -80,18 +81,18 @@ bool LmdbDataset<K, V>::open(const string& filename, Mode mode) { return true; } -template <typename K, typename V> -bool LmdbDataset<K, V>::put(const K& key, const V& value) { +template <typename K, typename V, typename KCoder, typename VCoder> +bool LmdbDataset<K, V, KCoder, VCoder>::put(const K& key, const V& value) { DLOG(INFO) << "LMDB: Put"; vector<char> serialized_key; - if (!Base::serialize(key, &serialized_key)) { + if (!KCoder::serialize(key, &serialized_key)) { LOG(ERROR) << "failed to serialize key"; return false; } vector<char> serialized_value; - if (!Base::serialize(value, &serialized_value)) { + if (!VCoder::serialize(value, &serialized_value)) { LOG(ERROR) << "failed to serialized value"; return false; } @@ -114,12 +115,12 @@ bool LmdbDataset<K, V>::put(const K& key, const V& value) { return true; } -template <typename K, typename V> -bool LmdbDataset<K, V>::get(const K& key, V* value) { +template <typename K, typename V, typename KCoder, typename VCoder> +bool LmdbDataset<K, V, KCoder, VCoder>::get(const K& key, V* value) { DLOG(INFO) << "LMDB: Get"; vector<char> serialized_key; - if (!Base::serialize(key, &serialized_key)) { + if (!KCoder::serialize(key, &serialized_key)) { LOG(ERROR) << "failed to serialized key"; return false; } @@ -144,7 +145,7 @@ bool LmdbDataset<K, V>::get(const K& key, V* value) { mdb_txn_abort(get_txn); - if (!Base::deserialize(reinterpret_cast<char*>(mdbdata.mv_data), + if (!VCoder::deserialize(reinterpret_cast<char*>(mdbdata.mv_data), mdbdata.mv_size, value)) { LOG(ERROR) << "failed to deserialize value"; return false; @@ -153,8 +154,8 @@ bool LmdbDataset<K, V>::get(const K& key, V* value) { return true; } -template <typename K, typename V> -bool LmdbDataset<K, V>::commit() { +template <typename K, typename V, typename KCoder, typename VCoder> +bool LmdbDataset<K, V, KCoder, VCoder>::commit() { DLOG(INFO) << "LMDB: Commit"; CHECK_NOTNULL(txn_); @@ -175,8 +176,8 @@ bool LmdbDataset<K, V>::commit() { return true; } -template <typename K, typename V> -void LmdbDataset<K, V>::close() { +template <typename K, typename V, typename KCoder, typename VCoder> +void LmdbDataset<K, V, KCoder, VCoder>::close() { DLOG(INFO) << "LMDB: Close"; if (env_ && dbi_) { @@ -188,8 +189,8 @@ void LmdbDataset<K, V>::close() { } } -template <typename K, typename V> -void LmdbDataset<K, V>::keys(vector<K>* keys) { +template <typename K, typename V, typename KCoder, typename VCoder> +void LmdbDataset<K, V, KCoder, VCoder>::keys(vector<K>* keys) { DLOG(INFO) << "LMDB: Keys"; keys->clear(); @@ -198,9 +199,9 @@ void LmdbDataset<K, V>::keys(vector<K>* keys) { } } -template <typename K, typename V> -typename LmdbDataset<K, V>::const_iterator - LmdbDataset<K, V>::begin() const { +template <typename K, typename V, typename KCoder, typename VCoder> +typename LmdbDataset<K, V, KCoder, VCoder>::const_iterator + LmdbDataset<K, V, KCoder, VCoder>::begin() const { int retval; MDB_txn* iter_txn; @@ -226,23 +227,23 @@ typename LmdbDataset<K, V>::const_iterator return const_iterator(this, state); } -template <typename K, typename V> -typename LmdbDataset<K, V>::const_iterator - LmdbDataset<K, V>::end() const { +template <typename K, typename V, typename KCoder, typename VCoder> +typename LmdbDataset<K, V, KCoder, VCoder>::const_iterator + LmdbDataset<K, V, KCoder, VCoder>::end() const { shared_ptr<DatasetState> state; return const_iterator(this, state); } -template <typename K, typename V> -typename LmdbDataset<K, V>::const_iterator - LmdbDataset<K, V>::cbegin() const { return begin(); } +template <typename K, typename V, typename KCoder, typename VCoder> +typename LmdbDataset<K, V, KCoder, VCoder>::const_iterator + LmdbDataset<K, V, KCoder, VCoder>::cbegin() const { return begin(); } -template <typename K, typename V> -typename LmdbDataset<K, V>::const_iterator - LmdbDataset<K, V>::cend() const { return end(); } +template <typename K, typename V, typename KCoder, typename VCoder> +typename LmdbDataset<K, V, KCoder, VCoder>::const_iterator + LmdbDataset<K, V, KCoder, VCoder>::cend() const { return end(); } -template <typename K, typename V> -bool LmdbDataset<K, V>::equal(shared_ptr<DatasetState> state1, +template <typename K, typename V, typename KCoder, typename VCoder> +bool LmdbDataset<K, V, KCoder, VCoder>::equal(shared_ptr<DatasetState> state1, shared_ptr<DatasetState> state2) const { shared_ptr<LmdbState> lmdb_state1 = boost::dynamic_pointer_cast<LmdbState>(state1); @@ -256,8 +257,9 @@ bool LmdbDataset<K, V>::equal(shared_ptr<DatasetState> state1, return !lmdb_state1 && !lmdb_state2; } -template <typename K, typename V> -void LmdbDataset<K, V>::increment(shared_ptr<DatasetState>* state) const { +template <typename K, typename V, typename KCoder, typename VCoder> +void LmdbDataset<K, V, KCoder, VCoder>::increment( + shared_ptr<DatasetState>* state) const { shared_ptr<LmdbState> lmdb_state = boost::dynamic_pointer_cast<LmdbState>(*state); @@ -278,8 +280,9 @@ void LmdbDataset<K, V>::increment(shared_ptr<DatasetState>* state) const { } } -template <typename K, typename V> -typename Dataset<K, V>::KV& LmdbDataset<K, V>::dereference( +template <typename K, typename V, typename KCoder, typename VCoder> +typename Dataset<K, V, KCoder, VCoder>::KV& + LmdbDataset<K, V, KCoder, VCoder>::dereference( shared_ptr<DatasetState> state) const { shared_ptr<LmdbState> lmdb_state = boost::dynamic_pointer_cast<LmdbState>(state); @@ -295,9 +298,9 @@ typename Dataset<K, V>::KV& LmdbDataset<K, V>::dereference( int retval = mdb_cursor_get(cursor, &mdb_key, &mdb_val, MDB_GET_CURRENT); CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - CHECK(Base::deserialize(reinterpret_cast<char*>(mdb_key.mv_data), + CHECK(KCoder::deserialize(reinterpret_cast<char*>(mdb_key.mv_data), mdb_key.mv_size, &lmdb_state->kv_pair_.key)); - CHECK(Base::deserialize(reinterpret_cast<char*>(mdb_val.mv_data), + CHECK(VCoder::deserialize(reinterpret_cast<char*>(mdb_val.mv_data), mdb_val.mv_size, &lmdb_state->kv_pair_.value)); return lmdb_state->kv_pair_; From 8944b7addcff7be6947c255db7ee85881d1b586d Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Tue, 14 Oct 2014 21:03:03 -0700 Subject: [PATCH 0939/2053] Reintroduce pkg-config with optional Makefile.config flag. --- Makefile | 9 ++++++++- Makefile.config.example | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 35c37af50fb..26d5964cacc 100644 --- a/Makefile +++ b/Makefile @@ -329,7 +329,14 @@ NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) # mex may invoke an older gcc that is too liberal with -Wuninitalized MATLAB_CXXFLAGS := $(CXXFLAGS) -Wno-uninitialized LINKFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) -LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) \ + +USE_PKG_CONFIG ?= 0 +ifeq ($(USE_PKG_CONFIG), 1) + PKG_CONFIG := $(shell pkg-config opencv --libs) +else + PKG_CONFIG := +endif +LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) $(PKG_CONFIG) \ $(foreach library,$(LIBRARIES),-l$(library)) PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) diff --git a/Makefile.config.example b/Makefile.config.example index 5cb0b243aca..b6d95e31df8 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -60,6 +60,10 @@ PYTHON_LIB := /usr/lib INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib +# Uncomment to use `pkg-config` to specify OpenCV library paths. +# (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.) +# USE_PKG_CONFIG := 1 + BUILD_DIR := build DISTRIBUTE_DIR := distribute From 5c4125da3ece192eeabd46dbb9e289071a7637b1 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Tue, 14 Oct 2014 23:48:38 -0700 Subject: [PATCH 0940/2053] [docs] proofreading suggested by @cNikolaou --- docs/tutorial/net_layer_blob.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorial/net_layer_blob.md b/docs/tutorial/net_layer_blob.md index b500aaa64d5..1f0966f88a4 100644 --- a/docs/tutorial/net_layer_blob.md +++ b/docs/tutorial/net_layer_blob.md @@ -26,7 +26,7 @@ Note that although we have designed blobs with its dimensions corresponding to i Caffe operations are general with respect to the channel dimension / K. Grayscale and hyperspectral imagery are fine. Caffe can likewise model and process arbitrary vectors in blobs with singleton. That is, the shape of blob holding 1000 vectors of 16 feature dimensions is 1000 x 16 x 1 x 1. -Parameter blob dimensions vary according to the type and configuration of the layer. For a convolution layer with 96 filters of 11 x 11 spatial dimension and 3 inputs the blob is 96 x 3 x 11 x 11. For an inner product / fully-connected layer with 1000 output channels and 1024 input channels the parameter blob is 1 x 1 x 1000 x 4096. +Parameter blob dimensions vary according to the type and configuration of the layer. For a convolution layer with 96 filters of 11 x 11 spatial dimension and 3 inputs the blob is 96 x 3 x 11 x 11. For an inner product / fully-connected layer with 1000 output channels and 1024 input channels the parameter blob is 1 x 1 x 1000 x 1024. For custom data it may be necessary to hack your own input preparation tool or data layer. However once your data is in your job is done. The modularity of layers accomplishes the rest of the work for you. @@ -85,7 +85,7 @@ Developing custom layers requires minimal effort by the compositionality of the The net jointly defines a function and its gradient by composition and auto-differentiation. The composition of every layer's output computes the function to do a given task, and the composition of every layer's backward computes the gradient from the loss to learn the task. Caffe models are end-to-end machine learning engines. -The net is a set of layers connected in a computation graph -- a DAG / directed acyclic graph to be exact. Caffe does all the bookkeeping for any DAG of layers to ensure correctness of the forward and backward passes. A typical net begins with a data layer that loads from disk and ends with a loss layer that computes the objective for a task such as classification or reconstruction. +The net is a set of layers connected in a computation graph -- a directed acyclic graph (DAG) to be exact. Caffe does all the bookkeeping for any DAG of layers to ensure correctness of the forward and backward passes. A typical net begins with a data layer that loads from disk and ends with a loss layer that computes the objective for a task such as classification or reconstruction. The net is defined as a set of layers and their connections in a plaintext modeling language. A simple logistic regression classifier From 23af87fc49d7ffaa70584458cacb1528a5fb1f77 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Wed, 15 Oct 2014 09:45:09 -0700 Subject: [PATCH 0941/2053] Added first_key and last_key to dataset --- include/caffe/dataset.hpp | 2 + include/caffe/leveldb_dataset.hpp | 2 + include/caffe/lmdb_dataset.hpp | 2 + src/caffe/leveldb_dataset.cpp | 24 +++++++ src/caffe/lmdb_dataset.cpp | 64 +++++++++++++++++ src/caffe/test/test_dataset.cpp | 114 ++++++++++++++++++++++++++++++ 6 files changed, 208 insertions(+) diff --git a/include/caffe/dataset.hpp b/include/caffe/dataset.hpp index efe3ffde582..90deb3160fa 100644 --- a/include/caffe/dataset.hpp +++ b/include/caffe/dataset.hpp @@ -135,6 +135,8 @@ class Dataset { virtual bool open(const string& filename, Mode mode) = 0; virtual bool put(const K& key, const V& value) = 0; virtual bool get(const K& key, V* value) = 0; + virtual bool first_key(K* key) = 0; + virtual bool last_key(K* key) = 0; virtual bool commit() = 0; virtual void close() = 0; diff --git a/include/caffe/leveldb_dataset.hpp b/include/caffe/leveldb_dataset.hpp index 90f92d9336a..f6c57fe65af 100644 --- a/include/caffe/leveldb_dataset.hpp +++ b/include/caffe/leveldb_dataset.hpp @@ -29,6 +29,8 @@ class LeveldbDataset : public Dataset<K, V, KCoder, VCoder> { bool open(const string& filename, Mode mode); bool put(const K& key, const V& value); bool get(const K& key, V* value); + bool first_key(K* key); + bool last_key(K* key); bool commit(); void close(); diff --git a/include/caffe/lmdb_dataset.hpp b/include/caffe/lmdb_dataset.hpp index 8817df7cade..71b322490c0 100644 --- a/include/caffe/lmdb_dataset.hpp +++ b/include/caffe/lmdb_dataset.hpp @@ -33,6 +33,8 @@ class LmdbDataset : public Dataset<K, V, KCoder, VCoder> { bool open(const string& filename, Mode mode); bool put(const K& key, const V& value); bool get(const K& key, V* value); + bool first_key(K* key); + bool last_key(K* key); bool commit(); void close(); diff --git a/src/caffe/leveldb_dataset.cpp b/src/caffe/leveldb_dataset.cpp index af9560456d8..53df985721c 100644 --- a/src/caffe/leveldb_dataset.cpp +++ b/src/caffe/leveldb_dataset.cpp @@ -106,6 +106,30 @@ bool LeveldbDataset<K, V, KCoder, VCoder>::get(const K& key, V* value) { return true; } +template <typename K, typename V, typename KCoder, typename VCoder> +bool LeveldbDataset<K, V, KCoder, VCoder>::first_key(K* key) { + DLOG(INFO) << "LevelDB: First key"; + + CHECK_NOTNULL(db_.get()); + shared_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); + iter->SeekToFirst(); + CHECK(iter->Valid()); + const leveldb::Slice& key_slice = iter->key(); + return KCoder::deserialize(key_slice.data(), key_slice.size(), key); +} + +template <typename K, typename V, typename KCoder, typename VCoder> +bool LeveldbDataset<K, V, KCoder, VCoder>::last_key(K* key) { + DLOG(INFO) << "LevelDB: Last key"; + + CHECK_NOTNULL(db_.get()); + shared_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); + iter->SeekToLast(); + CHECK(iter->Valid()); + const leveldb::Slice& key_slice = iter->key(); + return KCoder::deserialize(key_slice.data(), key_slice.size(), key); +} + template <typename K, typename V, typename KCoder, typename VCoder> bool LeveldbDataset<K, V, KCoder, VCoder>::commit() { DLOG(INFO) << "LevelDB: Commit"; diff --git a/src/caffe/lmdb_dataset.cpp b/src/caffe/lmdb_dataset.cpp index ca968432bc0..23852f0cd81 100644 --- a/src/caffe/lmdb_dataset.cpp +++ b/src/caffe/lmdb_dataset.cpp @@ -154,6 +154,70 @@ bool LmdbDataset<K, V, KCoder, VCoder>::get(const K& key, V* value) { return true; } +template <typename K, typename V, typename KCoder, typename VCoder> +bool LmdbDataset<K, V, KCoder, VCoder>::first_key(K* key) { + DLOG(INFO) << "LMDB: First key"; + + int retval; + + MDB_txn* iter_txn; + + retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &iter_txn); + CHECK_EQ(MDB_SUCCESS, retval) << "mdb_txn_begin failed " + << mdb_strerror(retval); + + MDB_cursor* cursor; + retval = mdb_cursor_open(iter_txn, dbi_, &cursor); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); + MDB_val mdbkey; + MDB_val mdbval; + retval = mdb_cursor_get(cursor, &mdbkey, &mdbval, MDB_FIRST); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); + + mdb_cursor_close(cursor); + mdb_txn_abort(iter_txn); + + if (!KCoder::deserialize(reinterpret_cast<char*>(mdbkey.mv_data), + mdbkey.mv_size, key)) { + LOG(ERROR) << "failed to deserialize key"; + return false; + } + + return true; +} + +template <typename K, typename V, typename KCoder, typename VCoder> +bool LmdbDataset<K, V, KCoder, VCoder>::last_key(K* key) { + DLOG(INFO) << "LMDB: Last key"; + + int retval; + + MDB_txn* iter_txn; + + retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &iter_txn); + CHECK_EQ(MDB_SUCCESS, retval) << "mdb_txn_begin failed " + << mdb_strerror(retval); + + MDB_cursor* cursor; + retval = mdb_cursor_open(iter_txn, dbi_, &cursor); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); + MDB_val mdbkey; + MDB_val mdbval; + retval = mdb_cursor_get(cursor, &mdbkey, &mdbval, MDB_LAST); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); + + mdb_cursor_close(cursor); + mdb_txn_abort(iter_txn); + + if (!KCoder::deserialize(reinterpret_cast<char*>(mdbkey.mv_data), + mdbkey.mv_size, key)) { + LOG(ERROR) << "failed to deserialize key"; + return false; + } + + return true; +} + template <typename K, typename V, typename KCoder, typename VCoder> bool LmdbDataset<K, V, KCoder, VCoder>::commit() { DLOG(INFO) << "LMDB: Commit"; diff --git a/src/caffe/test/test_dataset.cpp b/src/caffe/test/test_dataset.cpp index 7d0f6b3d9bb..e5bd1d2c40e 100644 --- a/src/caffe/test/test_dataset.cpp +++ b/src/caffe/test/test_dataset.cpp @@ -277,6 +277,120 @@ TYPED_TEST(DatasetTest, TestKeys) { EXPECT_FALSE(this->equals(keys.at(0), keys.at(1))); } +TYPED_TEST(DatasetTest, TestFirstKey) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + value_type value = this->TestValue(); + + string key1 = "01"; + EXPECT_TRUE(dataset->put(key1, value)); + + string key2 = "02"; + EXPECT_TRUE(dataset->put(key2, value)); + + string key3 = "03"; + EXPECT_TRUE(dataset->put(key3, value)); + + EXPECT_TRUE(dataset->commit()); + + string first_key; + dataset->first_key(&first_key); + + EXPECT_TRUE(this->equals(first_key, key1)); +} + +TYPED_TEST(DatasetTest, TestLastKey) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + value_type value = this->TestValue(); + + string key1 = "01"; + EXPECT_TRUE(dataset->put(key1, value)); + + string key2 = "02"; + EXPECT_TRUE(dataset->put(key2, value)); + + string key3 = "03"; + EXPECT_TRUE(dataset->put(key3, value)); + + EXPECT_TRUE(dataset->commit()); + + string last_key; + dataset->last_key(&last_key); + + EXPECT_TRUE(this->equals(last_key, key3)); +} + +TYPED_TEST(DatasetTest, TestFirstLastKeys) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + value_type value = this->TestValue(); + + string key1 = "01"; + EXPECT_TRUE(dataset->put(key1, value)); + + string key2 = "02"; + EXPECT_TRUE(dataset->put(key2, value)); + + string key3 = "03"; + EXPECT_TRUE(dataset->put(key3, value)); + + EXPECT_TRUE(dataset->commit()); + + string first_key; + dataset->first_key(&first_key); + string last_key; + dataset->last_key(&last_key); + + EXPECT_TRUE(this->equals(first_key, key1)); + EXPECT_TRUE(this->equals(last_key, key3)); +} + +TYPED_TEST(DatasetTest, TestFirstLastKeysUnOrdered) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + value_type value = this->TestValue(); + + string key3 = "03"; + EXPECT_TRUE(dataset->put(key3, value)); + + string key1 = "01"; + EXPECT_TRUE(dataset->put(key1, value)); + + string key2 = "02"; + EXPECT_TRUE(dataset->put(key2, value)); + + EXPECT_TRUE(dataset->commit()); + + string first_key; + dataset->first_key(&first_key); + string last_key; + dataset->last_key(&last_key); + + EXPECT_TRUE(this->equals(first_key, key1)); + EXPECT_TRUE(this->equals(last_key, key3)); +} + TYPED_TEST(DatasetTest, TestKeysNoCommit) { UNPACK_TYPES; From ae88994128858ffc66095c2d927a825ed04f5ed3 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Mon, 6 Oct 2014 18:05:11 -0700 Subject: [PATCH 0942/2053] Added encoded option and check_size to convert_imageset Conflicts: tools/convert_imageset.cpp --- tools/convert_imageset.cpp | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 37efa5c13f7..c554ed389ab 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -34,6 +34,8 @@ DEFINE_int32(resize_width, 0, "Width images are resized to"); DEFINE_int32(resize_height, 0, "Height images are resized to"); DEFINE_bool(check_size, false, "When this option is on, check that all the datum have the same size"); +DEFINE_bool(encoded, false, + "When this option is on, the encoded image will be save in datum"); int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); @@ -55,8 +57,10 @@ int main(int argc, char** argv) { return 1; } - bool is_color = !FLAGS_gray; - bool check_size = FLAGS_check_size; + const bool is_color = !FLAGS_gray; + const bool check_size = FLAGS_check_size; + const bool encoded = FLAGS_encoded; + std::ifstream infile(argv[2]); std::vector<std::pair<std::string, int> > lines; std::string filename; @@ -74,6 +78,12 @@ int main(int argc, char** argv) { const std::string& db_backend = FLAGS_backend; const char* db_path = argv[3]; + if (encoded) { + CHECK_EQ(FLAGS_resize_height, 0) << "With encoded don't resize images"; + CHECK_EQ(FLAGS_resize_width, 0) << "With encoded don't resize images"; + CHECK(!check_size) << "With encoded cannot check_size"; + } + int resize_height = std::max<int>(0, FLAGS_resize_height); int resize_width = std::max<int>(0, FLAGS_resize_width); @@ -94,10 +104,15 @@ int main(int argc, char** argv) { bool data_size_initialized = false; for (int line_id = 0; line_id < lines.size(); ++line_id) { - if (!ReadImageToDatum(root_folder + lines[line_id].first, - lines[line_id].second, resize_height, resize_width, is_color, &datum)) { - continue; + bool status; + if (encoded) { + status = ReadFileToDatum(root_folder + lines[line_id].first, + lines[line_id].second, &datum); + } else { + status = ReadImageToDatum(root_folder + lines[line_id].first, + lines[line_id].second, resize_height, resize_width, is_color, &datum); } + if (status == false) continue; if (check_size) { if (!data_size_initialized) { data_size = datum.channels() * datum.height() * datum.width(); From 9fc7f36e0445883249f6ef07d460d3806d4c9ab3 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Mon, 6 Oct 2014 18:25:28 -0700 Subject: [PATCH 0943/2053] Added encoded datum to io --- include/caffe/util/io.hpp | 38 +++++++++++++++++++++++ src/caffe/proto/caffe.proto | 2 ++ src/caffe/util/io.cpp | 61 +++++++++++++++++++++++++++++++++++-- 3 files changed, 98 insertions(+), 3 deletions(-) diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index b64c821a86e..63afe6298ff 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -88,6 +88,12 @@ inline void WriteProtoToBinaryFile( WriteProtoToBinaryFile(proto, filename.c_str()); } +bool ReadFileToDatum(const string& filename, const int label, Datum* datum); + +inline bool ReadFileToDatum(const string& filename, Datum* datum) { + return ReadFileToDatum(filename, -1, datum); +} + bool ReadImageToDatum(const string& filename, const int label, const int height, const int width, const bool is_color, Datum* datum); @@ -106,6 +112,21 @@ inline bool ReadImageToDatum(const string& filename, const int label, return ReadImageToDatum(filename, label, 0, 0, true, datum); } +bool DecodeDatum(const int height, const int width, const bool is_color, + Datum& datum); + +inline bool DecodeDatum(const int height, const int width, Datum& datum) { + return DecodeDatum(height, width, true, datum); +} + +inline bool DecodeDatum(const bool is_color, Datum& datum) { + return DecodeDatum(0, 0, is_color, datum); +} + +inline bool DecodeDatum(Datum& datum) { + return DecodeDatum(0, 0, true, datum); +} + #ifndef OSX cv::Mat ReadImageToCVMat(const string& filename, const int height, const int width, const bool is_color); @@ -124,6 +145,23 @@ inline cv::Mat ReadImageToCVMat(const string& filename) { return ReadImageToCVMat(filename, 0, 0, true); } +cv::Mat DecodeDatumToCVMat(const Datum& datum, + const int height, const int width, const bool is_color); + +inline cv::Mat DecodeDatumToCVMat(const Datum& datum, + const int height, const int width) { + return DecodeDatumToCVMat(datum, height, width, true); +} + +inline cv::Mat DecodeDatumToCVMat(const Datum& datum, + const bool is_color) { + return DecodeDatumToCVMat(datum, 0, 0, is_color); +} + +inline cv::Mat DecodeDatumToCVMat(const Datum& datum) { + return DecodeDatumToCVMat(datum, 0, 0, true); +} + void CVMatToDatum(const cv::Mat& cv_img, Datum* datum); #endif diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index f0dba097d05..53db6f76945 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -26,6 +26,8 @@ message Datum { optional int32 label = 5; // Optionally, the datum could also hold float data. repeated float float_data = 6; + // If true data contains an encoded image that need to be decoded + optional bool encoded = 7 [default = false]; } message FillerParameter { diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index a4a6627b277..6aa410a0feb 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -95,21 +95,76 @@ bool ReadImageToDatum(const string& filename, const int label, } } +bool ReadFileToDatum(const string& filename, const int label, + Datum* datum) { + std::streampos size; + + fstream file(filename.c_str(), ios::in|ios::binary|ios::ate); + if (file.is_open()) { + size = file.tellg(); + std::string buffer(size, ' '); + file.seekg(0, ios::beg); + file.read(&buffer[0], size); + file.close(); + datum->set_data(buffer); + datum->set_label(label); + datum->set_encoded(true); + return true; + } else { + return false; + } +} + +cv::Mat DecodeDatumToCVMat(const Datum& datum, + const int height, const int width, const bool is_color) { + cv::Mat cv_img; + CHECK(datum.encoded()) << "Datum not encoded"; + int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : + CV_LOAD_IMAGE_GRAYSCALE); + const string& data = datum.data(); + std::vector<char> vec_data(data.c_str(), data.c_str() + data.size()); + if (height > 0 && width > 0) { + cv::Mat cv_img_origin = cv::imdecode(cv::Mat(vec_data), cv_read_flag); + cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); + } else { + cv_img = cv::imdecode(vec_data, cv_read_flag); + } + if (!cv_img.data) { + LOG(ERROR) << "Could not decode datum "; + } + return cv_img; +} + +// If Datum is encoded will decoded using DecodeDatumToCVMat and CVMatToDatum +// if height and width are set it will resize it +// If Datum is not encoded will do nothing +bool DecodeDatum(const int height, const int width, const bool is_color, + Datum& datum) { + if (datum.encoded()) { + cv::Mat cv_img = DecodeDatumToCVMat(datum, height, width, is_color); + CVMatToDatum(cv_img, &datum); + return true; + } else { + return false; + } +} + void CVMatToDatum(const cv::Mat& cv_img, Datum* datum) { - CHECK(cv_img.depth() == CV_8U) << - "Image data type must be unsigned byte"; + CHECK(cv_img.depth() == CV_8U || cv_img.depth() == CV_8S) << + "Image data type must be unsigned or signed byte"; datum->set_channels(cv_img.channels()); datum->set_height(cv_img.rows); datum->set_width(cv_img.cols); datum->clear_data(); datum->clear_float_data(); + datum->set_encoded(false); int datum_channels = datum->channels(); int datum_height = datum->height(); int datum_width = datum->width(); int datum_size = datum_channels * datum_height * datum_width; std::string buffer(datum_size, ' '); for (int h = 0; h < datum_height; ++h) { - const uchar* ptr = cv_img.ptr<uchar>(h); + const char* ptr = cv_img.ptr<char>(h); int img_index = 0; for (int w = 0; w < datum_width; ++w) { for (int c = 0; c < datum_channels; ++c) { From 1d586ff245447062cbd1c60603c485f99024753c Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Mon, 6 Oct 2014 23:27:40 -0700 Subject: [PATCH 0944/2053] Added test for encoded Datum to test_io.cpp --- include/caffe/util/io.hpp | 8 ++-- src/caffe/test/test_io.cpp | 80 ++++++++++++++++++++++++++++++++++++++ src/caffe/util/io.cpp | 8 ++-- 3 files changed, 88 insertions(+), 8 deletions(-) diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 63afe6298ff..64df0155780 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -113,17 +113,17 @@ inline bool ReadImageToDatum(const string& filename, const int label, } bool DecodeDatum(const int height, const int width, const bool is_color, - Datum& datum); + Datum* datum); -inline bool DecodeDatum(const int height, const int width, Datum& datum) { +inline bool DecodeDatum(const int height, const int width, Datum* datum) { return DecodeDatum(height, width, true, datum); } -inline bool DecodeDatum(const bool is_color, Datum& datum) { +inline bool DecodeDatum(const bool is_color, Datum* datum) { return DecodeDatum(0, 0, is_color, datum); } -inline bool DecodeDatum(Datum& datum) { +inline bool DecodeDatum(Datum* datum) { return DecodeDatum(0, 0, true, datum); } diff --git a/src/caffe/test/test_io.cpp b/src/caffe/test/test_io.cpp index 6994afda0e3..4d941fa8683 100644 --- a/src/caffe/test/test_io.cpp +++ b/src/caffe/test/test_io.cpp @@ -276,4 +276,84 @@ TEST_F(IOTest, TestCVMatToDatumReference) { } } +TEST_F(IOTest, TestReadFileToDatum) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + EXPECT_TRUE(ReadFileToDatum(filename, &datum)); + EXPECT_TRUE(datum.encoded()); + EXPECT_EQ(datum.label(), -1); + EXPECT_EQ(datum.data().size(), 140391); +} + +TEST_F(IOTest, TestDecodeDatum) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + EXPECT_TRUE(ReadFileToDatum(filename, &datum)); + EXPECT_TRUE(DecodeDatum(&datum)); + EXPECT_FALSE(DecodeDatum(&datum)); + Datum datum_ref; + ReadImageToDatumReference(filename, 0, 0, 0, true, &datum_ref); + EXPECT_EQ(datum.channels(), datum_ref.channels()); + EXPECT_EQ(datum.height(), datum_ref.height()); + EXPECT_EQ(datum.width(), datum_ref.width()); + EXPECT_EQ(datum.data().size(), datum_ref.data().size()); + + const string& data = datum.data(); + const string& data_ref = datum_ref.data(); + for (int i = 0; i < datum.data().size(); ++i) { + EXPECT_TRUE(data[i] == data_ref[i]); + } +} + +TEST_F(IOTest, TestDecodeDatumToCVMat) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + EXPECT_TRUE(ReadFileToDatum(filename, &datum)); + cv::Mat cv_img = DecodeDatumToCVMat(datum); + EXPECT_EQ(cv_img.channels(), 3); + EXPECT_EQ(cv_img.rows, 360); + EXPECT_EQ(cv_img.cols, 480); +} + +TEST_F(IOTest, TestDecodeDatumToCVMatResized) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + EXPECT_TRUE(ReadFileToDatum(filename, &datum)); + cv::Mat cv_img = DecodeDatumToCVMat(datum, 100, 200); + EXPECT_EQ(cv_img.channels(), 3); + EXPECT_EQ(cv_img.rows, 100); + EXPECT_EQ(cv_img.cols, 200); +} + +TEST_F(IOTest, TestDecodeDatumToCVMatResizedGray) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + EXPECT_TRUE(ReadFileToDatum(filename, &datum)); + const bool is_color = false; + cv::Mat cv_img = DecodeDatumToCVMat(datum, 200, 100, is_color); + EXPECT_EQ(cv_img.channels(), 1); + EXPECT_EQ(cv_img.rows, 200); + EXPECT_EQ(cv_img.cols, 100); +} + +TEST_F(IOTest, TestDecodeDatumToCVMatContent) { + string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; + Datum datum; + EXPECT_TRUE(ReadFileToDatum(filename, &datum)); + cv::Mat cv_img = DecodeDatumToCVMat(datum); + cv::Mat cv_img_ref = ReadImageToCVMat(filename); + EXPECT_EQ(cv_img_ref.channels(), cv_img.channels()); + EXPECT_EQ(cv_img_ref.rows, cv_img.rows); + EXPECT_EQ(cv_img_ref.cols, cv_img.cols); + + for (int c = 0; c < datum.channels(); ++c) { + for (int h = 0; h < datum.height(); ++h) { + for (int w = 0; w < datum.width(); ++w) { + EXPECT_TRUE(cv_img.at<cv::Vec3b>(h, w)[c]== + cv_img_ref.at<cv::Vec3b>(h, w)[c]); + } + } + } +} + } // namespace caffe diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 6aa410a0feb..06b9deb078a 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -139,10 +139,10 @@ cv::Mat DecodeDatumToCVMat(const Datum& datum, // if height and width are set it will resize it // If Datum is not encoded will do nothing bool DecodeDatum(const int height, const int width, const bool is_color, - Datum& datum) { - if (datum.encoded()) { - cv::Mat cv_img = DecodeDatumToCVMat(datum, height, width, is_color); - CVMatToDatum(cv_img, &datum); + Datum* datum) { + if (datum->encoded()) { + cv::Mat cv_img = DecodeDatumToCVMat((*datum), height, width, is_color); + CVMatToDatum(cv_img, datum); return true; } else { return false; From 917e90a2e1be366fdc478a321accd96b79cb55f5 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Wed, 15 Oct 2014 15:35:01 -0700 Subject: [PATCH 0945/2053] Added timers for benchmarking --- src/caffe/layers/data_layer.cpp | 22 +++++++++++++++++++--- src/caffe/layers/image_data_layer.cpp | 13 +++++++++++++ src/caffe/layers/window_data_layer.cpp | 20 ++++++++++++++------ src/caffe/net.cpp | 7 +++++++ 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index fcf9bb20a57..330381d2771 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -8,6 +8,7 @@ #include "caffe/dataset_factory.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/benchmark.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -47,6 +48,9 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK(iter_ != dataset_->end()); const Datum& datum = iter_->value; + if (DecodeDatum(datum)) { + LOG(INFO) << "Decoding Datum"; + } // image int crop_size = this->layer_param_.transform_param().crop_size(); if (crop_size > 0) { @@ -78,6 +82,8 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // This function is used to create a thread that prefetches the data. template <typename Dtype> void DataLayer<Dtype>::InternalThreadEntry() { + Timer batch_timer; + batch_timer.Start(); CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); @@ -87,25 +93,35 @@ void DataLayer<Dtype>::InternalThreadEntry() { top_label = this->prefetch_label_.mutable_cpu_data(); } const int batch_size = this->layer_param_.data_param().batch_size(); - + float read_time = 0; + float trans_time = 0; + Timer timer; for (int item_id = 0; item_id < batch_size; ++item_id) { + timer.Start(); + // get a blob CHECK(iter_ != dataset_->end()); const Datum& datum = iter_->value; + cv::Mat cv_img = DecodeDatumToCVMat(datum); + read_time += timer.MilliSeconds(); + timer.Start(); // Apply data transformations (mirror, scale, crop...) int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); - this->data_transformer_.Transform(datum, &(this->transformed_data_)); + this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); if (this->output_labels_) { top_label[item_id] = datum.label(); } - + trans_time += timer.MilliSeconds(); // go to the next iter ++iter_; if (iter_ == dataset_->end()) { iter_ = dataset_->begin(); } } + DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; + DLOG(INFO) << "Read time: " << read_time << "ms."; + DLOG(INFO) << "Transform time: " << trans_time << "ms."; } INSTANTIATE_CLASS(DataLayer); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 2085df2760a..67493117b88 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -6,6 +6,7 @@ #include "caffe/data_layers.hpp" #include "caffe/layer.hpp" +#include "caffe/util/benchmark.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -91,6 +92,8 @@ void ImageDataLayer<Dtype>::ShuffleImages() { // This function is used to create a thread that prefetches the data. template <typename Dtype> void ImageDataLayer<Dtype>::InternalThreadEntry() { + Timer batch_timer; + batch_timer.Start(); CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); @@ -103,18 +106,25 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { // datum scales const int lines_size = lines_.size(); + float read_time = 0; + float trans_time = 0; + Timer timer; for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob + timer.Start(); CHECK_GT(lines_size, lines_id_); cv::Mat cv_img = ReadImageToCVMat(lines_[lines_id_].first, new_height, new_width, is_color); if (!cv_img.data) { continue; } + read_time += timer.MilliSeconds(); + timer.Start(); // Apply transformations (mirror, crop...) to the image int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); + trans_time += timer.MilliSeconds(); top_label[item_id] = lines_[lines_id_].second; // go to the next iter @@ -128,6 +138,9 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { } } } + DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; + DLOG(INFO) << "Read time: " << read_time << "ms."; + DLOG(INFO) << "Transform time: " << trans_time << "ms."; } INSTANTIATE_CLASS(ImageDataLayer); diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 529c3b47bd9..47e0fb2a123 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -13,6 +13,7 @@ #include "caffe/common.hpp" #include "caffe/data_layers.hpp" #include "caffe/layer.hpp" +#include "caffe/util/benchmark.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -192,7 +193,8 @@ template <typename Dtype> void WindowDataLayer<Dtype>::InternalThreadEntry() { // At each iteration, sample N windows where N*p are foreground (object) // windows and N*(1-p) are background (non-object) windows - + Timer batch_timer; + batch_timer.Start(); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); const Dtype scale = this->layer_param_.window_data_param().scale(); @@ -219,19 +221,20 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { const int num_samples[2] = { batch_size - num_fg, num_fg }; int item_id = 0; + float read_time = 0; + float trans_time = 0; + Timer timer; // sample from bg set then fg set for (int is_fg = 0; is_fg < 2; ++is_fg) { for (int dummy = 0; dummy < num_samples[is_fg]; ++dummy) { // sample a window + timer.Start(); const unsigned int rand_index = PrefetchRand(); vector<float> window = (is_fg) ? fg_windows_[rand_index % fg_windows_.size()] : bg_windows_[rand_index % bg_windows_.size()]; - bool do_mirror = false; - if (mirror && PrefetchRand() % 2) { - do_mirror = true; - } + bool do_mirror = mirror && PrefetchRand() % 2; // load the image containing the window pair<std::string, vector<int> > image = @@ -242,6 +245,8 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { LOG(ERROR) << "Could not open or find file " << image.first; return; } + read_time += timer.MilliSeconds(); + timer.Start(); const int channels = cv_img.channels(); // crop window out of image and warp it @@ -359,7 +364,7 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { } } } - + trans_time += timer.MilliSeconds(); // get window label top_label[item_id] = window[WindowDataLayer<Dtype>::LABEL]; @@ -399,6 +404,9 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { item_id++; } } + DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; + DLOG(INFO) << "Read time: " << read_time << "ms."; + DLOG(INFO) << "Transform time: " << trans_time << "ms."; } INSTANTIATE_CLASS(WindowDataLayer); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 21ab15fd31b..5b7152e6993 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -9,6 +9,7 @@ #include "caffe/layer.hpp" #include "caffe/net.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/benchmark.hpp" #include "caffe/util/insert_splits.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" @@ -499,6 +500,8 @@ void Net<Dtype>::GetLearningRateAndWeightDecay() { template <typename Dtype> Dtype Net<Dtype>::ForwardFromTo(int start, int end) { + Timer timer; + timer.Start(); CHECK_GE(start, 0); CHECK_LT(end, layers_.size()); Dtype loss = 0; @@ -509,6 +512,7 @@ Dtype Net<Dtype>::ForwardFromTo(int start, int end) { loss += layer_loss; if (debug_info_) { ForwardDebugInfo(i); } } + LOG(INFO) << "Forward time: " << timer.MilliSeconds() << "ms."; return loss; } @@ -565,6 +569,8 @@ string Net<Dtype>::Forward(const string& input_blob_protos, Dtype* loss) { template <typename Dtype> void Net<Dtype>::BackwardFromTo(int start, int end) { + Timer timer; + timer.Start(); CHECK_GE(end, 0); CHECK_LT(start, layers_.size()); for (int i = start; i >= end; --i) { @@ -574,6 +580,7 @@ void Net<Dtype>::BackwardFromTo(int start, int end) { if (debug_info_) { BackwardDebugInfo(i); } } } + LOG(INFO) << "Backward time: " << timer.MilliSeconds() << "ms."; } template <typename Dtype> From d337b044c25abf30f94dd9fb7d25aca940eda7c0 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Wed, 15 Oct 2014 15:35:26 -0700 Subject: [PATCH 0946/2053] Add fast code for transform(cv::Mat,Blob) --- src/caffe/data_transformer.cpp | 103 +++++++++++++++++++++++++++++++- src/caffe/layers/data_layer.cpp | 12 +++- 2 files changed, 110 insertions(+), 5 deletions(-) diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index dffaba545b5..8f145994562 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -179,9 +179,106 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, template<typename Dtype> void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob) { - Datum datum; - CVMatToDatum(cv_img, &datum); - Transform(datum, transformed_blob); + const int img_channels = cv_img.channels(); + const int img_height = cv_img.rows; + const int img_width = cv_img.cols; + + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + const int num = transformed_blob->num(); + + CHECK_EQ(channels, img_channels); + CHECK_LE(height, img_height); + CHECK_LE(width, img_width); + CHECK_GE(num, 1); + + CHECK(cv_img.depth() == CV_8U || cv_img.depth() == CV_8S) << + "Image data type must be unsigned or signed byte"; + + const int crop_size = param_.crop_size(); + const Dtype scale = param_.scale(); + const bool do_mirror = param_.mirror() && Rand(2); + const bool has_mean_file = param_.has_mean_file(); + const bool has_mean_values = mean_values_.size() > 0; + + CHECK_GT(img_channels, 0); + CHECK_GE(img_height, crop_size); + CHECK_GE(img_width, crop_size); + + Dtype* mean = NULL; + if (has_mean_file) { + CHECK_EQ(img_channels, data_mean_.channels()); + CHECK_EQ(img_height, data_mean_.height()); + CHECK_EQ(img_width, data_mean_.width()); + mean = data_mean_.mutable_cpu_data(); + } + if (has_mean_values) { + CHECK(mean_values_.size() == 1 || mean_values_.size() == img_channels) << + "Specify either 1 mean_value or as many as channels: " << img_channels; + if (img_channels > 1 && mean_values_.size() == 1) { + // Replicate the mean_value for simplicity + for (int c = 1; c < img_channels; ++c) { + mean_values_.push_back(mean_values_[0]); + } + } + } + + int h_off = 0; + int w_off = 0; + cv::Mat cv_cropped_img = cv_img; + if (crop_size) { + CHECK_EQ(crop_size, height); + CHECK_EQ(crop_size, width); + // We only do random crop when we do training. + if (phase_ == Caffe::TRAIN) { + h_off = Rand(img_height - crop_size + 1); + w_off = Rand(img_width - crop_size + 1); + } else { + h_off = (img_height - crop_size) / 2; + w_off = (img_width - crop_size) / 2; + } + cv::Rect roi(h_off, w_off, crop_size, crop_size); + cv_cropped_img = cv_img(roi); + } else { + CHECK_EQ(img_height, height); + CHECK_EQ(img_width, width); + } + + // if (do_mirror) { + // cv::flip(cv_cropped_img, cv_cropped_img, 1); + // } + CHECK(cv_cropped_img.data); + + Dtype* transformed_data = transformed_blob->mutable_cpu_data(); + int top_index; + for (int h = 0; h < height; ++h) { + const char* ptr = cv_cropped_img.ptr<char>(h); + int img_index = 0; + for (int w = 0; w < width; ++w) { + for (int c = 0; c < img_channels; ++c) { + if (do_mirror) { + top_index = (c * height + h) * width + (width - 1 - w); + } else { + top_index = (c * height + h) * width + w; + } + // int top_index = (c * height + h) * width + w; + Dtype pixel = static_cast<Dtype>(ptr[img_index++]); + if (has_mean_file) { + int mean_index = (c * img_height + h_off + h) * img_width + w_off + w; + transformed_data[top_index] = + (pixel - mean[mean_index]) * scale; + } else { + if (has_mean_values) { + transformed_data[top_index] = + (pixel - mean_values_[c]) * scale; + } else { + transformed_data[top_index] = pixel * scale; + } + } + } + } + } } #endif diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 330381d2771..95c54279661 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -101,14 +101,22 @@ void DataLayer<Dtype>::InternalThreadEntry() { // get a blob CHECK(iter_ != dataset_->end()); const Datum& datum = iter_->value; - cv::Mat cv_img = DecodeDatumToCVMat(datum); + cv::Mat cv_img; + if (datum.encoded()) { + cv_img = DecodeDatumToCVMat(datum); + } read_time += timer.MilliSeconds(); timer.Start(); // Apply data transformations (mirror, scale, crop...) int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); - this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); + if (datum.encoded()) { + this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); + } else { + this->data_transformer_.Transform(datum, &(this->transformed_data_)); + } + if (this->output_labels_) { top_label[item_id] = datum.label(); } From e9d6e5a0b22a9f4768b8c04c9031ee8adb822ece Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Tue, 7 Oct 2014 11:19:16 -0700 Subject: [PATCH 0947/2053] Add root_folder to ImageDataLayer --- Makefile | 6 ++++++ include/caffe/net.hpp | 10 +++++++++ src/caffe/data_transformer.cpp | 12 ++++------- src/caffe/layers/data_layer.cpp | 25 ++++++++++++++------- src/caffe/layers/image_data_layer.cpp | 30 +++++++++++++++++++------- src/caffe/layers/window_data_layer.cpp | 24 +++++++++++++++------ src/caffe/net.cpp | 10 +++++++++ src/caffe/proto/caffe.proto | 1 + src/caffe/util/io.cpp | 5 ++--- 9 files changed, 90 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index 26d5964cacc..393fe18a70d 100644 --- a/Makefile +++ b/Makefile @@ -281,6 +281,12 @@ ifeq ($(USE_CUDNN), 1) COMMON_FLAGS += -DUSE_CUDNN endif +TIMING ?= 0 +# Timing Flag +ifneq ($(TIMING), 0) + COMMON_FLAGS += -DTIMING +endif + # CPU-only configuration ifeq ($(CPU_ONLY), 1) OBJS := $(PROTO_OBJS) $(CXX_OBJS) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 1d06dc45533..879f474674d 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -11,6 +11,9 @@ #include "caffe/common.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" +#ifdef TIMING +#include "caffe/util/benchmark.hpp" +#endif namespace caffe { @@ -76,9 +79,16 @@ class Net { void Reshape(); Dtype ForwardBackward(const vector<Blob<Dtype>* > & bottom) { + #ifdef TIMING + Timer timer; + timer.Start(); + #endif Dtype loss; Forward(bottom, &loss); Backward(); + #ifdef TIMING + LOG(INFO) << "ForwardBackward Time: " << timer.MilliSeconds() << "ms."; + #endif return loss; } diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 8f145994562..023396ce5e6 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -193,8 +193,7 @@ void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, CHECK_LE(width, img_width); CHECK_GE(num, 1); - CHECK(cv_img.depth() == CV_8U || cv_img.depth() == CV_8S) << - "Image data type must be unsigned or signed byte"; + CHECK(cv_img.depth() == CV_8U) << "Image data type must be unsigned byte"; const int crop_size = param_.crop_size(); const Dtype scale = param_.scale(); @@ -238,22 +237,19 @@ void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, h_off = (img_height - crop_size) / 2; w_off = (img_width - crop_size) / 2; } - cv::Rect roi(h_off, w_off, crop_size, crop_size); + cv::Rect roi(w_off, h_off, crop_size, crop_size); cv_cropped_img = cv_img(roi); } else { CHECK_EQ(img_height, height); CHECK_EQ(img_width, width); } - - // if (do_mirror) { - // cv::flip(cv_cropped_img, cv_cropped_img, 1); - // } + CHECK(cv_cropped_img.data); Dtype* transformed_data = transformed_blob->mutable_cpu_data(); int top_index; for (int h = 0; h < height; ++h) { - const char* ptr = cv_cropped_img.ptr<char>(h); + const uchar* ptr = cv_cropped_img.ptr<uchar>(h); int img_index = 0; for (int w = 0; w < width; ++w) { for (int c = 0; c < img_channels; ++c) { diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 95c54279661..95604e5a1ac 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -8,7 +8,9 @@ #include "caffe/dataset_factory.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" +#ifdef TIMING #include "caffe/util/benchmark.hpp" +#endif #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -82,8 +84,13 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // This function is used to create a thread that prefetches the data. template <typename Dtype> void DataLayer<Dtype>::InternalThreadEntry() { + #ifdef TIMING Timer batch_timer; batch_timer.Start(); + float read_time = 0; + float trans_time = 0; + Timer timer; + #endif CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); @@ -93,9 +100,6 @@ void DataLayer<Dtype>::InternalThreadEntry() { top_label = this->prefetch_label_.mutable_cpu_data(); } const int batch_size = this->layer_param_.data_param().batch_size(); - float read_time = 0; - float trans_time = 0; - Timer timer; for (int item_id = 0; item_id < batch_size; ++item_id) { timer.Start(); // get a blob @@ -105,31 +109,36 @@ void DataLayer<Dtype>::InternalThreadEntry() { if (datum.encoded()) { cv_img = DecodeDatumToCVMat(datum); } + #ifdef TIMING read_time += timer.MilliSeconds(); timer.Start(); + #endif // Apply data transformations (mirror, scale, crop...) int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); if (datum.encoded()) { - this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); + this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); } else { this->data_transformer_.Transform(datum, &(this->transformed_data_)); } - if (this->output_labels_) { top_label[item_id] = datum.label(); } + #ifdef TIMING trans_time += timer.MilliSeconds(); + #endif // go to the next iter ++iter_; if (iter_ == dataset_->end()) { iter_ = dataset_->begin(); } } - DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; - DLOG(INFO) << "Read time: " << read_time << "ms."; - DLOG(INFO) << "Transform time: " << trans_time << "ms."; + #ifdef TIMING + LOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; + LOG(INFO) << "Read time: " << read_time << "ms."; + LOG(INFO) << "Transform time: " << trans_time << "ms."; + #endif } INSTANTIATE_CLASS(DataLayer); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 67493117b88..0abcd888b67 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -6,7 +6,9 @@ #include "caffe/data_layers.hpp" #include "caffe/layer.hpp" +#ifdef TIMING #include "caffe/util/benchmark.hpp" +#endif #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -24,6 +26,7 @@ void ImageDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const int new_height = this->layer_param_.image_data_param().new_height(); const int new_width = this->layer_param_.image_data_param().new_width(); const bool is_color = this->layer_param_.image_data_param().is_color(); + string root_folder = this->layer_param_.image_data_param().root_folder(); CHECK((new_height == 0 && new_width == 0) || (new_height > 0 && new_width > 0)) << "Current implementation requires " @@ -57,7 +60,7 @@ void ImageDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, lines_id_ = skip; } // Read an image, and use it to initialize the top blob. - cv::Mat cv_img = ReadImageToCVMat(lines_[lines_id_].first, + cv::Mat cv_img = ReadImageToCVMat(root_folder + lines_[lines_id_].first, new_height, new_width, is_color); const int channels = cv_img.channels(); const int height = cv_img.rows; @@ -92,8 +95,13 @@ void ImageDataLayer<Dtype>::ShuffleImages() { // This function is used to create a thread that prefetches the data. template <typename Dtype> void ImageDataLayer<Dtype>::InternalThreadEntry() { + #ifdef TIMING Timer batch_timer; batch_timer.Start(); + float read_time = 0; + float trans_time = 0; + Timer timer; + #endif CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); @@ -103,28 +111,32 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { const int new_height = image_data_param.new_height(); const int new_width = image_data_param.new_width(); const bool is_color = image_data_param.is_color(); + string root_folder = image_data_param.root_folder(); // datum scales const int lines_size = lines_.size(); - float read_time = 0; - float trans_time = 0; - Timer timer; for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob + #ifdef TIMING timer.Start(); + #endif CHECK_GT(lines_size, lines_id_); - cv::Mat cv_img = ReadImageToCVMat(lines_[lines_id_].first, + cv::Mat cv_img = ReadImageToCVMat(root_folder + lines_[lines_id_].first, new_height, new_width, is_color); if (!cv_img.data) { continue; } + #ifdef TIMING read_time += timer.MilliSeconds(); timer.Start(); + #endif // Apply transformations (mirror, crop...) to the image int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); + #ifdef TIMING trans_time += timer.MilliSeconds(); + #endif top_label[item_id] = lines_[lines_id_].second; // go to the next iter @@ -138,9 +150,11 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { } } } - DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; - DLOG(INFO) << "Read time: " << read_time << "ms."; - DLOG(INFO) << "Transform time: " << trans_time << "ms."; + #ifdef TIMING + LOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; + LOG(INFO) << "Read time: " << read_time << "ms."; + LOG(INFO) << "Transform time: " << trans_time << "ms."; + #endif } INSTANTIATE_CLASS(ImageDataLayer); diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 47e0fb2a123..8e65615507b 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -13,7 +13,9 @@ #include "caffe/common.hpp" #include "caffe/data_layers.hpp" #include "caffe/layer.hpp" +#ifdef TIMING #include "caffe/util/benchmark.hpp" +#endif #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -193,8 +195,13 @@ template <typename Dtype> void WindowDataLayer<Dtype>::InternalThreadEntry() { // At each iteration, sample N windows where N*p are foreground (object) // windows and N*(1-p) are background (non-object) windows + #ifdef TIMING Timer batch_timer; batch_timer.Start(); + float read_time = 0; + float trans_time = 0; + Timer timer; + #endif Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); const Dtype scale = this->layer_param_.window_data_param().scale(); @@ -221,14 +228,13 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { const int num_samples[2] = { batch_size - num_fg, num_fg }; int item_id = 0; - float read_time = 0; - float trans_time = 0; - Timer timer; // sample from bg set then fg set for (int is_fg = 0; is_fg < 2; ++is_fg) { for (int dummy = 0; dummy < num_samples[is_fg]; ++dummy) { // sample a window + #ifdef TIMING timer.Start(); + #endif const unsigned int rand_index = PrefetchRand(); vector<float> window = (is_fg) ? fg_windows_[rand_index % fg_windows_.size()] : @@ -245,8 +251,10 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { LOG(ERROR) << "Could not open or find file " << image.first; return; } + #ifdef TIMING read_time += timer.MilliSeconds(); timer.Start(); + #endif const int channels = cv_img.channels(); // crop window out of image and warp it @@ -364,7 +372,9 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { } } } + #ifdef TIMING trans_time += timer.MilliSeconds(); + #endif // get window label top_label[item_id] = window[WindowDataLayer<Dtype>::LABEL]; @@ -404,9 +414,11 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { item_id++; } } - DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; - DLOG(INFO) << "Read time: " << read_time << "ms."; - DLOG(INFO) << "Transform time: " << trans_time << "ms."; + #ifdef TIMING + LOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; + LOG(INFO) << "Read time: " << read_time << "ms."; + LOG(INFO) << "Transform time: " << trans_time << "ms."; + #endif } INSTANTIATE_CLASS(WindowDataLayer); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 5b7152e6993..c0e56920c83 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -9,7 +9,9 @@ #include "caffe/layer.hpp" #include "caffe/net.hpp" #include "caffe/proto/caffe.pb.h" +#ifdef TIMING #include "caffe/util/benchmark.hpp" +#endif #include "caffe/util/insert_splits.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" @@ -500,8 +502,10 @@ void Net<Dtype>::GetLearningRateAndWeightDecay() { template <typename Dtype> Dtype Net<Dtype>::ForwardFromTo(int start, int end) { + #ifdef TIMING Timer timer; timer.Start(); + #endif CHECK_GE(start, 0); CHECK_LT(end, layers_.size()); Dtype loss = 0; @@ -512,7 +516,9 @@ Dtype Net<Dtype>::ForwardFromTo(int start, int end) { loss += layer_loss; if (debug_info_) { ForwardDebugInfo(i); } } + #ifdef TIMING LOG(INFO) << "Forward time: " << timer.MilliSeconds() << "ms."; + #endif return loss; } @@ -569,8 +575,10 @@ string Net<Dtype>::Forward(const string& input_blob_protos, Dtype* loss) { template <typename Dtype> void Net<Dtype>::BackwardFromTo(int start, int end) { + #ifdef TIMING Timer timer; timer.Start(); + #endif CHECK_GE(end, 0); CHECK_LT(start, layers_.size()); for (int i = start; i >= end; --i) { @@ -580,7 +588,9 @@ void Net<Dtype>::BackwardFromTo(int start, int end) { if (debug_info_) { BackwardDebugInfo(i); } } } + #ifdef TIMING LOG(INFO) << "Backward time: " << timer.MilliSeconds() << "ms."; + #endif } template <typename Dtype> diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 53db6f76945..b602d0e4c7b 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -540,6 +540,7 @@ message ImageDataParameter { // DEPRECATED. See TransformationParameter. Specify if we want to randomly mirror // data. optional bool mirror = 6 [default = false]; + optional string root_folder = 12 [default = ""]; } // Message that stores parameters InfogainLossLayer diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 06b9deb078a..b136bc8a120 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -150,8 +150,7 @@ bool DecodeDatum(const int height, const int width, const bool is_color, } void CVMatToDatum(const cv::Mat& cv_img, Datum* datum) { - CHECK(cv_img.depth() == CV_8U || cv_img.depth() == CV_8S) << - "Image data type must be unsigned or signed byte"; + CHECK(cv_img.depth() == CV_8U) << "Image data type must be unsigned byte"; datum->set_channels(cv_img.channels()); datum->set_height(cv_img.rows); datum->set_width(cv_img.cols); @@ -164,7 +163,7 @@ void CVMatToDatum(const cv::Mat& cv_img, Datum* datum) { int datum_size = datum_channels * datum_height * datum_width; std::string buffer(datum_size, ' '); for (int h = 0; h < datum_height; ++h) { - const char* ptr = cv_img.ptr<char>(h); + const uchar* ptr = cv_img.ptr<uchar>(h); int img_index = 0; for (int w = 0; w < datum_width; ++w) { for (int c = 0; c < datum_channels; ++c) { From 3744598ed39d26d6219cd0369dd6923e2c747c99 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Tue, 7 Oct 2014 14:14:50 -0700 Subject: [PATCH 0948/2053] Speed up WindowDataLayer and add mean_values --- include/caffe/data_layers.hpp | 3 ++ src/caffe/layers/window_data_layer.cpp | 65 ++++++++++++++++++-------- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index a2ea854e5ff..c4903ce0891 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -325,6 +325,9 @@ class WindowDataLayer : public BasePrefetchingDataLayer<Dtype> { vector<vector<float> > fg_windows_; vector<vector<float> > bg_windows_; Blob<Dtype> data_mean_; + vector<Dtype> mean_values_; + bool has_mean_file_; + bool has_mean_values_; }; } // namespace caffe diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 8e65615507b..fc0ffc886bb 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -170,15 +170,30 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, this->prefetch_label_.Reshape(batch_size, 1, 1, 1); // data mean - if (this->transform_param_.has_mean_file()) { + has_mean_file_ = this->transform_param_.has_mean_file(); + has_mean_values_ = this->transform_param_.mean_value_size() > 0; + if (has_mean_file_) { const string& mean_file = this->transform_param_.mean_file(); LOG(INFO) << "Loading mean file from" << mean_file; BlobProto blob_proto; ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); data_mean_.FromProto(blob_proto); - } else { - data_mean_.Reshape(1, channels, crop_size, crop_size); + } + if (has_mean_values_) { + CHECK(has_mean_file_ == false) << + "Cannot specify mean_file and mean_value at the same time"; + for (int c = 0; c < this->transform_param_.mean_value_size(); ++c) { + mean_values_.push_back(this->transform_param_.mean_value(c)); + } + CHECK(mean_values_.size() == 1 || mean_values_.size() == channels) << + "Specify either 1 mean_value or as many as channels: " << channels; + if (channels > 1 && mean_values_.size() == 1) { + // Replicate the mean_value for simplicity + for (int c = 1; c < channels; ++c) { + mean_values_.push_back(mean_values_[0]); + } + } } } @@ -211,10 +226,14 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { const bool mirror = this->transform_param_.mirror(); const float fg_fraction = this->layer_param_.window_data_param().fg_fraction(); - const Dtype* mean = this->data_mean_.cpu_data(); - const int mean_off = (this->data_mean_.width() - crop_size) / 2; - const int mean_width = this->data_mean_.width(); - const int mean_height = this->data_mean_.height(); + Dtype* mean = NULL; + int mean_off, mean_width, mean_height; + if (this->has_mean_file_) { + mean = this->data_mean_.mutable_cpu_data(); + mean_off = (this->data_mean_.width() - crop_size) / 2; + mean_width = this->data_mean_.width(); + mean_height = this->data_mean_.height(); + } cv::Size cv_crop_size(crop_size, crop_size); const string& crop_mode = this->layer_param_.window_data_param().crop_mode(); @@ -357,18 +376,26 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { } // copy the warped window into top_data - for (int c = 0; c < channels; ++c) { - for (int h = 0; h < cv_cropped_img.rows; ++h) { - for (int w = 0; w < cv_cropped_img.cols; ++w) { - Dtype pixel = - static_cast<Dtype>(cv_cropped_img.at<cv::Vec3b>(h, w)[c]); - - top_data[((item_id * channels + c) * crop_size + h + pad_h) - * crop_size + w + pad_w] - = (pixel - - mean[(c * mean_height + h + mean_off + pad_h) - * mean_width + w + mean_off + pad_w]) - * scale; + for (int h = 0; h < cv_cropped_img.rows; ++h) { + const uchar* ptr = cv_cropped_img.ptr<uchar>(h); + int img_index = 0; + for (int w = 0; w < cv_cropped_img.cols; ++w) { + for (int c = 0; c < channels; ++c) { + int top_index = ((item_id * channels + c) * crop_size + h + pad_h) + * crop_size + w + pad_w; + // int top_index = (c * height + h) * width + w; + Dtype pixel = static_cast<Dtype>(ptr[img_index++]); + if (this->has_mean_file_) { + int mean_index = (c * mean_height + h + mean_off + pad_h) + * mean_width + w + mean_off + pad_w; + top_data[top_index] = (pixel - mean[mean_index]) * scale; + } else { + if (this->has_mean_values_) { + top_data[top_index] = (pixel - this->mean_values_[c]) * scale; + } else { + top_data[top_index] = pixel * scale; + } + } } } } From 14f548d8e45573044ba20cdf52eeaccef2217ff5 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Tue, 7 Oct 2014 17:19:15 -0700 Subject: [PATCH 0949/2053] Added cache_images to WindowDataLayer Added root_folder to WindowDataLayer to locate images --- include/caffe/data_layers.hpp | 2 ++ src/caffe/layers/window_data_layer.cpp | 38 ++++++++++++++++++++++---- src/caffe/proto/caffe.proto | 4 +++ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index c4903ce0891..34b9b30aa3e 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -328,6 +328,8 @@ class WindowDataLayer : public BasePrefetchingDataLayer<Dtype> { vector<Dtype> mean_values_; bool has_mean_file_; bool has_mean_values_; + bool cache_images_; + vector<std::pair<std::string, Datum > > image_database_cache_; }; } // namespace caffe diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index fc0ffc886bb..8f75557d694 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -59,7 +59,14 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, << " background (non-object) overlap threshold: " << this->layer_param_.window_data_param().bg_threshold() << std::endl << " foreground sampling fraction: " - << this->layer_param_.window_data_param().fg_fraction(); + << this->layer_param_.window_data_param().fg_fraction() << std::endl + << " cache_images: " + << this->layer_param_.window_data_param().cache_images() << std::endl + << " root_folder: " + << this->layer_param_.window_data_param().root_folder(); + + cache_images_ = this->layer_param_.window_data_param().cache_images(); + string root_folder = this->layer_param_.window_data_param().root_folder(); const bool prefetch_needs_rand = this->transform_param_.mirror() || @@ -88,12 +95,21 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // read image path string image_path; infile >> image_path; + image_path = root_folder + image_path; // read image dimensions vector<int> image_size(3); infile >> image_size[0] >> image_size[1] >> image_size[2]; channels = image_size[0]; image_database_.push_back(std::make_pair(image_path, image_size)); + if (cache_images_) { + Datum datum; + if (!ReadFileToDatum(image_path, &datum)) { + LOG(ERROR) << "Could not open or find file " << image_path; + return; + } + image_database_cache_.push_back(std::make_pair(image_path, datum)); + } // read each box int num_windows; infile >> num_windows; @@ -227,7 +243,9 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { const float fg_fraction = this->layer_param_.window_data_param().fg_fraction(); Dtype* mean = NULL; - int mean_off, mean_width, mean_height; + int mean_off = 0; + int mean_width = 0; + int mean_height = 0; if (this->has_mean_file_) { mean = this->data_mean_.mutable_cpu_data(); mean_off = (this->data_mean_.width() - crop_size) / 2; @@ -265,10 +283,17 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { pair<std::string, vector<int> > image = image_database_[window[WindowDataLayer<Dtype>::IMAGE_INDEX]]; - cv::Mat cv_img = cv::imread(image.first, CV_LOAD_IMAGE_COLOR); - if (!cv_img.data) { - LOG(ERROR) << "Could not open or find file " << image.first; - return; + cv::Mat cv_img; + if (this->cache_images_) { + pair<std::string, Datum> image_cached = + image_database_cache_[window[WindowDataLayer<Dtype>::IMAGE_INDEX]]; + cv_img = DecodeDatumToCVMat(image_cached.second); + } else { + cv_img = cv::imread(image.first, CV_LOAD_IMAGE_COLOR); + if (!cv_img.data) { + LOG(ERROR) << "Could not open or find file " << image.first; + return; + } } #ifdef TIMING read_time += timer.MilliSeconds(); @@ -442,6 +467,7 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { } } #ifdef TIMING + batch_timer.Stop(); LOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; LOG(INFO) << "Read time: " << read_time << "ms."; LOG(INFO) << "Transform time: " << trans_time << "ms."; diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index b602d0e4c7b..03d955fa7ac 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -714,6 +714,10 @@ message WindowDataParameter { // warp: cropped window is warped to a fixed size and aspect ratio // square: the tightest square around the window is cropped optional string crop_mode = 11 [default = "warp"]; + // cache_images: will load all images in memory for faster access + optional bool cache_images = 12 [default = false]; + // append root_folder to locate images + optional string root_folder = 13 [default = ""]; } // DEPRECATED: V0LayerParameter is the old way of specifying layer parameters From d6b71e58237968679cea44418b869721a5ea9654 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Wed, 15 Oct 2014 15:36:16 -0700 Subject: [PATCH 0950/2053] Change caffe time to do forward/backward and accumulate time per layer --- Makefile | 6 ---- src/caffe/layers/data_layer.cpp | 18 +++------- src/caffe/layers/image_data_layer.cpp | 19 +++------- src/caffe/layers/window_data_layer.cpp | 18 ++-------- src/caffe/net.cpp | 17 --------- tools/caffe.cpp | 49 ++++++++++++++++---------- 6 files changed, 42 insertions(+), 85 deletions(-) diff --git a/Makefile b/Makefile index 393fe18a70d..26d5964cacc 100644 --- a/Makefile +++ b/Makefile @@ -281,12 +281,6 @@ ifeq ($(USE_CUDNN), 1) COMMON_FLAGS += -DUSE_CUDNN endif -TIMING ?= 0 -# Timing Flag -ifneq ($(TIMING), 0) - COMMON_FLAGS += -DTIMING -endif - # CPU-only configuration ifeq ($(CPU_ONLY), 1) OBJS := $(PROTO_OBJS) $(CXX_OBJS) diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 95604e5a1ac..7ddd4662e73 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -8,9 +8,7 @@ #include "caffe/dataset_factory.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" -#ifdef TIMING #include "caffe/util/benchmark.hpp" -#endif #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -84,13 +82,11 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // This function is used to create a thread that prefetches the data. template <typename Dtype> void DataLayer<Dtype>::InternalThreadEntry() { - #ifdef TIMING Timer batch_timer; batch_timer.Start(); float read_time = 0; float trans_time = 0; Timer timer; - #endif CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); @@ -105,14 +101,13 @@ void DataLayer<Dtype>::InternalThreadEntry() { // get a blob CHECK(iter_ != dataset_->end()); const Datum& datum = iter_->value; + cv::Mat cv_img; if (datum.encoded()) { cv_img = DecodeDatumToCVMat(datum); } - #ifdef TIMING read_time += timer.MilliSeconds(); timer.Start(); - #endif // Apply data transformations (mirror, scale, crop...) int offset = this->prefetch_data_.offset(item_id); @@ -125,20 +120,17 @@ void DataLayer<Dtype>::InternalThreadEntry() { if (this->output_labels_) { top_label[item_id] = datum.label(); } - #ifdef TIMING trans_time += timer.MilliSeconds(); - #endif // go to the next iter ++iter_; if (iter_ == dataset_->end()) { iter_ = dataset_->begin(); } } - #ifdef TIMING - LOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; - LOG(INFO) << "Read time: " << read_time << "ms."; - LOG(INFO) << "Transform time: " << trans_time << "ms."; - #endif + batch_timer.Stop(); + DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; + DLOG(INFO) << "Read time: " << read_time << "ms."; + DLOG(INFO) << "Transform time: " << trans_time << "ms."; } INSTANTIATE_CLASS(DataLayer); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 0abcd888b67..e0778e5989f 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -6,9 +6,7 @@ #include "caffe/data_layers.hpp" #include "caffe/layer.hpp" -#ifdef TIMING #include "caffe/util/benchmark.hpp" -#endif #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -95,13 +93,11 @@ void ImageDataLayer<Dtype>::ShuffleImages() { // This function is used to create a thread that prefetches the data. template <typename Dtype> void ImageDataLayer<Dtype>::InternalThreadEntry() { - #ifdef TIMING Timer batch_timer; batch_timer.Start(); float read_time = 0; float trans_time = 0; Timer timer; - #endif CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); @@ -117,26 +113,20 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { const int lines_size = lines_.size(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob - #ifdef TIMING timer.Start(); - #endif CHECK_GT(lines_size, lines_id_); cv::Mat cv_img = ReadImageToCVMat(root_folder + lines_[lines_id_].first, new_height, new_width, is_color); if (!cv_img.data) { continue; } - #ifdef TIMING read_time += timer.MilliSeconds(); timer.Start(); - #endif // Apply transformations (mirror, crop...) to the image int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); - #ifdef TIMING trans_time += timer.MilliSeconds(); - #endif top_label[item_id] = lines_[lines_id_].second; // go to the next iter @@ -150,11 +140,10 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { } } } - #ifdef TIMING - LOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; - LOG(INFO) << "Read time: " << read_time << "ms."; - LOG(INFO) << "Transform time: " << trans_time << "ms."; - #endif + batch_timer.Stop(); + DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; + DLOG(INFO) << "Read time: " << read_time << "ms."; + DLOG(INFO) << "Transform time: " << trans_time << "ms."; } INSTANTIATE_CLASS(ImageDataLayer); diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 8f75557d694..14e8caad6c9 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -13,9 +13,7 @@ #include "caffe/common.hpp" #include "caffe/data_layers.hpp" #include "caffe/layer.hpp" -#ifdef TIMING #include "caffe/util/benchmark.hpp" -#endif #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/util/rng.hpp" @@ -226,13 +224,11 @@ template <typename Dtype> void WindowDataLayer<Dtype>::InternalThreadEntry() { // At each iteration, sample N windows where N*p are foreground (object) // windows and N*(1-p) are background (non-object) windows - #ifdef TIMING Timer batch_timer; batch_timer.Start(); float read_time = 0; float trans_time = 0; Timer timer; - #endif Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); const Dtype scale = this->layer_param_.window_data_param().scale(); @@ -269,9 +265,7 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { for (int is_fg = 0; is_fg < 2; ++is_fg) { for (int dummy = 0; dummy < num_samples[is_fg]; ++dummy) { // sample a window - #ifdef TIMING timer.Start(); - #endif const unsigned int rand_index = PrefetchRand(); vector<float> window = (is_fg) ? fg_windows_[rand_index % fg_windows_.size()] : @@ -295,10 +289,8 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { return; } } - #ifdef TIMING read_time += timer.MilliSeconds(); timer.Start(); - #endif const int channels = cv_img.channels(); // crop window out of image and warp it @@ -424,9 +416,7 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { } } } - #ifdef TIMING trans_time += timer.MilliSeconds(); - #endif // get window label top_label[item_id] = window[WindowDataLayer<Dtype>::LABEL]; @@ -466,12 +456,10 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { item_id++; } } - #ifdef TIMING batch_timer.Stop(); - LOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; - LOG(INFO) << "Read time: " << read_time << "ms."; - LOG(INFO) << "Transform time: " << trans_time << "ms."; - #endif + DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; + DLOG(INFO) << "Read time: " << read_time << "ms."; + DLOG(INFO) << "Transform time: " << trans_time << "ms."; } INSTANTIATE_CLASS(WindowDataLayer); diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index c0e56920c83..21ab15fd31b 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -9,9 +9,6 @@ #include "caffe/layer.hpp" #include "caffe/net.hpp" #include "caffe/proto/caffe.pb.h" -#ifdef TIMING -#include "caffe/util/benchmark.hpp" -#endif #include "caffe/util/insert_splits.hpp" #include "caffe/util/io.hpp" #include "caffe/util/math_functions.hpp" @@ -502,10 +499,6 @@ void Net<Dtype>::GetLearningRateAndWeightDecay() { template <typename Dtype> Dtype Net<Dtype>::ForwardFromTo(int start, int end) { - #ifdef TIMING - Timer timer; - timer.Start(); - #endif CHECK_GE(start, 0); CHECK_LT(end, layers_.size()); Dtype loss = 0; @@ -516,9 +509,6 @@ Dtype Net<Dtype>::ForwardFromTo(int start, int end) { loss += layer_loss; if (debug_info_) { ForwardDebugInfo(i); } } - #ifdef TIMING - LOG(INFO) << "Forward time: " << timer.MilliSeconds() << "ms."; - #endif return loss; } @@ -575,10 +565,6 @@ string Net<Dtype>::Forward(const string& input_blob_protos, Dtype* loss) { template <typename Dtype> void Net<Dtype>::BackwardFromTo(int start, int end) { - #ifdef TIMING - Timer timer; - timer.Start(); - #endif CHECK_GE(end, 0); CHECK_LT(start, layers_.size()); for (int i = start; i >= end; --i) { @@ -588,9 +574,6 @@ void Net<Dtype>::BackwardFromTo(int start, int end) { if (debug_info_) { BackwardDebugInfo(i); } } } - #ifdef TIMING - LOG(INFO) << "Backward time: " << timer.MilliSeconds() << "ms."; - #endif } template <typename Dtype> diff --git a/tools/caffe.cpp b/tools/caffe.cpp index bfcd9f19cec..1c842a078c2 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -229,35 +229,46 @@ int time() { Timer total_timer; total_timer.Start(); Timer forward_timer; - forward_timer.Start(); + Timer backward_timer; Timer timer; - for (int i = 0; i < layers.size(); ++i) { - const caffe::string& layername = layers[i]->layer_param().name(); - timer.Start(); - for (int j = 0; j < FLAGS_iterations; ++j) { + std::vector<float> forward_time_per_layer(layers.size(), 0.0); + std::vector<float> backward_time_per_layer(layers.size(), 0.0); + float forward_time = 0.0; + float backward_time = 0.0; + for (int j = 0; j < FLAGS_iterations; ++j) { + Timer iter_timer; + iter_timer.Start(); + forward_timer.Start(); + for (int i = 0; i < layers.size(); ++i) { + timer.Start(); // Although Reshape should be essentially free, we include it here // so that we will notice Reshape performance bugs. layers[i]->Reshape(bottom_vecs[i], top_vecs[i]); layers[i]->Forward(bottom_vecs[i], top_vecs[i]); + forward_time_per_layer[i] += timer.MilliSeconds(); } - LOG(INFO) << layername << "\tforward: " << timer.MilliSeconds() << - " milliseconds."; - } - LOG(INFO) << "Forward pass: " << forward_timer.MilliSeconds() << - " milliseconds."; - Timer backward_timer; - backward_timer.Start(); - for (int i = layers.size() - 1; i >= 0; --i) { - const caffe::string& layername = layers[i]->layer_param().name(); - timer.Start(); - for (int j = 0; j < FLAGS_iterations; ++j) { + forward_time += forward_timer.MilliSeconds(); + backward_timer.Start(); + for (int i = layers.size() - 1; i >= 0; --i) { + timer.Start(); layers[i]->Backward(top_vecs[i], bottom_need_backward[i], bottom_vecs[i]); + backward_time_per_layer[i] += timer.MilliSeconds(); } - LOG(INFO) << layername << "\tbackward: " - << timer.MilliSeconds() << " milliseconds."; + backward_time += backward_timer.MilliSeconds(); + LOG(INFO) << "Iteration: " << j + 1 << " forward-backward time: " + << iter_timer.MilliSeconds() << " milliseconds."; } - LOG(INFO) << "Backward pass: " << backward_timer.MilliSeconds() << + for (int i = 0; i < layers.size(); ++i) { + const caffe::string& layername = layers[i]->layer_param().name(); + LOG(INFO) << std::setfill(' ') << std::setw(10) << layername << + "\tforward: " << forward_time_per_layer[i] << " milliseconds."; + LOG(INFO) << std::setfill(' ') << std::setw(10) << layername << + "\tbackward: " << backward_time_per_layer[i] << " milliseconds."; + } + LOG(INFO) << "Forward pass: " << forward_time << + " milliseconds."; + LOG(INFO) << "Backward pass: " << backward_time << " milliseconds."; LOG(INFO) << "Total Time: " << total_timer.MilliSeconds() << " milliseconds."; From 65688bed17b3bc162fd5a0db9c97de11c9131258 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Wed, 15 Oct 2014 15:36:42 -0700 Subject: [PATCH 0951/2053] Upgrade compute_image_mean to use gflags, accept list_of_images, and print mean_values --- examples/cifar10/create_cifar10.sh | 4 +- src/caffe/layers/data_layer.cpp | 4 +- tools/compute_image_mean.cpp | 59 ++++++++++++++++++++++-------- 3 files changed, 48 insertions(+), 19 deletions(-) diff --git a/examples/cifar10/create_cifar10.sh b/examples/cifar10/create_cifar10.sh index ebfca46de87..a42725cb610 100755 --- a/examples/cifar10/create_cifar10.sh +++ b/examples/cifar10/create_cifar10.sh @@ -13,7 +13,7 @@ rm -rf $EXAMPLE/cifar10_train_$DBTYPE $EXAMPLE/cifar10_test_$DBTYPE echo "Computing image mean..." -./build/tools/compute_image_mean $EXAMPLE/cifar10_train_$DBTYPE \ - $EXAMPLE/mean.binaryproto $DBTYPE +./build/tools/compute_image_mean -backend=$DBTYPE \ + $EXAMPLE/cifar10_train_$DBTYPE $EXAMPLE/mean.binaryproto echo "Done." diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 7ddd4662e73..05f2e298ee7 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -46,9 +46,9 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, } // Read a data point, and use it to initialize the top blob. CHECK(iter_ != dataset_->end()); - const Datum& datum = iter_->value; + Datum datum = iter_->value; - if (DecodeDatum(datum)) { + if (DecodeDatum(&datum)) { LOG(INFO) << "Decoding Datum"; } // image diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index a720f162aa2..4c2c658bbb0 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -1,3 +1,4 @@ +#include <gflags/gflags.h> #include <glog/logging.h> #include <stdint.h> @@ -12,19 +13,31 @@ using caffe::Dataset; using caffe::Datum; using caffe::BlobProto; using std::max; +using std::pair; + + +DEFINE_string(backend, "lmdb", "The backend for containing the images"); int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); - if (argc < 3 || argc > 4) { - LOG(ERROR) << "Usage: compute_image_mean input_db output_file" - << " db_backend[leveldb or lmdb]"; + +#ifndef GFLAGS_GFLAGS_H_ + namespace gflags = google; +#endif + + gflags::SetUsageMessage("Compute the mean_image of a set of images given by" + " a leveldb/lmdb or a list of images\n" + "Usage:\n" + " compute_image_mean [FLAGS] INPUT_DB [OUTPUT_FILE]\n"); + + gflags::ParseCommandLineFlags(&argc, &argv, true); + + if (argc < 2 || argc > 3) { + gflags::ShowUsageWithFlagsRestrict(argv[0], "tools/compute_image_mean"); return 1; } - std::string db_backend = "lmdb"; - if (argc == 4) { - db_backend = std::string(argv[3]); - } + std::string db_backend = FLAGS_backend; caffe::shared_ptr<Dataset<std::string, Datum> > dataset = caffe::DatasetFactory<std::string, Datum>(db_backend); @@ -36,7 +49,11 @@ int main(int argc, char** argv) { int count = 0; // load first datum Dataset<std::string, Datum>::const_iterator iter = dataset->begin(); - const Datum& datum = iter->value; + Datum datum = iter->value; + + if (DecodeDatum(&datum)) { + LOG(INFO) << "Decoding Datum"; + } sum_blob.set_num(1); sum_blob.set_channels(datum.channels()); @@ -51,8 +68,9 @@ int main(int argc, char** argv) { LOG(INFO) << "Starting Iteration"; for (Dataset<std::string, Datum>::const_iterator iter = dataset->begin(); iter != dataset->end(); ++iter) { - // just a dummy operation - const Datum& datum = iter->value; + Datum datum = iter->value; + DecodeDatum(&datum); + const std::string& data = datum.data(); size_in_datum = std::max<int>(datum.data().size(), datum.float_data_size()); @@ -72,20 +90,31 @@ int main(int argc, char** argv) { } ++count; if (count % 10000 == 0) { - LOG(ERROR) << "Processed " << count << " files."; + LOG(INFO) << "Processed " << count << " files."; } } if (count % 10000 != 0) { - LOG(ERROR) << "Processed " << count << " files."; + LOG(INFO) << "Processed " << count << " files."; } for (int i = 0; i < sum_blob.data_size(); ++i) { sum_blob.set_data(i, sum_blob.data(i) / count); } // Write to disk - LOG(INFO) << "Write to " << argv[2]; - WriteProtoToBinaryFile(sum_blob, argv[2]); - + if (argc == 3) { + LOG(INFO) << "Write to " << argv[2]; + WriteProtoToBinaryFile(sum_blob, argv[2]); + } + const int channels = sum_blob.channels(); + const int dim = sum_blob.height() * sum_blob.width(); + std::vector<float> mean_values(channels, 0.0); + LOG(INFO) << "Number of channels: " << channels; + for (int c = 0; c < channels; ++c) { + for (int i = 0; i < dim; ++i) { + mean_values[c] += sum_blob.data(dim * c + i); + } + LOG(INFO) << "mean_value channel [" << c << "]:" << mean_values[c] / dim; + } // Clean up dataset->close(); return 0; From 8867a54599f1d35b36bb29ee6fea94d6f635d675 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Sun, 12 Oct 2014 23:16:59 -0700 Subject: [PATCH 0952/2053] Added CPUTimer Make timing more precise using double and microseconds --- include/caffe/util/benchmark.hpp | 20 ++++++++--- src/caffe/layers/data_layer.cpp | 18 +++++----- src/caffe/layers/image_data_layer.cpp | 18 +++++----- src/caffe/layers/window_data_layer.cpp | 18 +++++----- src/caffe/util/benchmark.cpp | 49 +++++++++++++++++++++++++- tools/caffe.cpp | 39 +++++++++++--------- tools/compute_image_mean.cpp | 2 ++ 7 files changed, 114 insertions(+), 50 deletions(-) diff --git a/include/caffe/util/benchmark.hpp b/include/caffe/util/benchmark.hpp index 6c01ac4ee18..d63582776ee 100644 --- a/include/caffe/util/benchmark.hpp +++ b/include/caffe/util/benchmark.hpp @@ -11,11 +11,11 @@ class Timer { public: Timer(); virtual ~Timer(); - void Start(); - void Stop(); - float MilliSeconds(); - float MicroSeconds(); - float Seconds(); + virtual void Start(); + virtual void Stop(); + virtual float MilliSeconds(); + virtual float MicroSeconds(); + virtual float Seconds(); inline bool initted() { return initted_; } inline bool running() { return running_; } @@ -37,6 +37,16 @@ class Timer { float elapsed_microseconds_; }; +class CPUTimer : public Timer { + public: + explicit CPUTimer(); + virtual ~CPUTimer() {} + virtual void Start(); + virtual void Stop(); + virtual float MilliSeconds(); + virtual float MicroSeconds(); +}; + } // namespace caffe #endif // CAFFE_UTIL_BENCHMARK_H_ diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 05f2e298ee7..5d6f05802ce 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -82,11 +82,11 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, // This function is used to create a thread that prefetches the data. template <typename Dtype> void DataLayer<Dtype>::InternalThreadEntry() { - Timer batch_timer; + CPUTimer batch_timer; batch_timer.Start(); - float read_time = 0; - float trans_time = 0; - Timer timer; + double read_time = 0; + double trans_time = 0; + CPUTimer timer; CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); @@ -106,7 +106,7 @@ void DataLayer<Dtype>::InternalThreadEntry() { if (datum.encoded()) { cv_img = DecodeDatumToCVMat(datum); } - read_time += timer.MilliSeconds(); + read_time += timer.MicroSeconds(); timer.Start(); // Apply data transformations (mirror, scale, crop...) @@ -120,7 +120,7 @@ void DataLayer<Dtype>::InternalThreadEntry() { if (this->output_labels_) { top_label[item_id] = datum.label(); } - trans_time += timer.MilliSeconds(); + trans_time += timer.MicroSeconds(); // go to the next iter ++iter_; if (iter_ == dataset_->end()) { @@ -128,9 +128,9 @@ void DataLayer<Dtype>::InternalThreadEntry() { } } batch_timer.Stop(); - DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; - DLOG(INFO) << "Read time: " << read_time << "ms."; - DLOG(INFO) << "Transform time: " << trans_time << "ms."; + DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << " ms."; + DLOG(INFO) << " Read time: " << read_time / 1000 << " ms."; + DLOG(INFO) << "Transform time: " << trans_time / 1000 << " ms."; } INSTANTIATE_CLASS(DataLayer); diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index e0778e5989f..50997a23bf9 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -93,11 +93,11 @@ void ImageDataLayer<Dtype>::ShuffleImages() { // This function is used to create a thread that prefetches the data. template <typename Dtype> void ImageDataLayer<Dtype>::InternalThreadEntry() { - Timer batch_timer; + CPUTimer batch_timer; batch_timer.Start(); - float read_time = 0; - float trans_time = 0; - Timer timer; + double read_time = 0; + double trans_time = 0; + CPUTimer timer; CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); @@ -120,13 +120,13 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { if (!cv_img.data) { continue; } - read_time += timer.MilliSeconds(); + read_time += timer.MicroSeconds(); timer.Start(); // Apply transformations (mirror, crop...) to the image int offset = this->prefetch_data_.offset(item_id); this->transformed_data_.set_cpu_data(top_data + offset); this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); - trans_time += timer.MilliSeconds(); + trans_time += timer.MicroSeconds(); top_label[item_id] = lines_[lines_id_].second; // go to the next iter @@ -141,9 +141,9 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { } } batch_timer.Stop(); - DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; - DLOG(INFO) << "Read time: " << read_time << "ms."; - DLOG(INFO) << "Transform time: " << trans_time << "ms."; + DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << " ms."; + DLOG(INFO) << " Read time: " << read_time / 1000 << " ms."; + DLOG(INFO) << "Transform time: " << trans_time / 1000 << " ms."; } INSTANTIATE_CLASS(ImageDataLayer); diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 14e8caad6c9..6287b385dc5 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -224,11 +224,11 @@ template <typename Dtype> void WindowDataLayer<Dtype>::InternalThreadEntry() { // At each iteration, sample N windows where N*p are foreground (object) // windows and N*(1-p) are background (non-object) windows - Timer batch_timer; + CPUTimer batch_timer; batch_timer.Start(); - float read_time = 0; - float trans_time = 0; - Timer timer; + double read_time = 0; + double trans_time = 0; + CPUTimer timer; Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); const Dtype scale = this->layer_param_.window_data_param().scale(); @@ -289,7 +289,7 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { return; } } - read_time += timer.MilliSeconds(); + read_time += timer.MicroSeconds(); timer.Start(); const int channels = cv_img.channels(); @@ -416,7 +416,7 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { } } } - trans_time += timer.MilliSeconds(); + trans_time += timer.MicroSeconds(); // get window label top_label[item_id] = window[WindowDataLayer<Dtype>::LABEL]; @@ -457,9 +457,9 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { } } batch_timer.Stop(); - DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << "ms."; - DLOG(INFO) << "Read time: " << read_time << "ms."; - DLOG(INFO) << "Transform time: " << trans_time << "ms."; + DLOG(INFO) << "Prefetch batch: " << batch_timer.MilliSeconds() << " ms."; + DLOG(INFO) << " Read time: " << read_time / 1000 << " ms."; + DLOG(INFO) << "Transform time: " << trans_time / 1000 << " ms."; } INSTANTIATE_CLASS(WindowDataLayer); diff --git a/src/caffe/util/benchmark.cpp b/src/caffe/util/benchmark.cpp index 2edc9a53ef0..1d269c351c1 100644 --- a/src/caffe/util/benchmark.cpp +++ b/src/caffe/util/benchmark.cpp @@ -69,7 +69,7 @@ float Timer::MicroSeconds() { CUDA_CHECK(cudaEventElapsedTime(&elapsed_milliseconds_, start_gpu_, stop_gpu_)); // Cuda only measure milliseconds - elapsed_microseconds_ = elapsed_milliseconds_ / 1000; + elapsed_microseconds_ = elapsed_milliseconds_ * 1000; #else NO_GPU; #endif @@ -118,4 +118,51 @@ void Timer::Init() { } } +CPUTimer::CPUTimer() { + this->initted_ = true; + this->running_ = false; + this->has_run_at_least_once_ = false; +} + +void CPUTimer::Start() { + if (!running()) { + this->start_cpu_ = boost::posix_time::microsec_clock::local_time(); + this->running_ = true; + this->has_run_at_least_once_ = true; + } +} + +void CPUTimer::Stop() { + if (running()) { + this->stop_cpu_ = boost::posix_time::microsec_clock::local_time(); + this->running_ = false; + } +} + +float CPUTimer::MilliSeconds() { + if (!has_run_at_least_once()) { + LOG(WARNING) << "Timer has never been run before reading time."; + return 0; + } + if (running()) { + Stop(); + } + this->elapsed_milliseconds_ = (this->stop_cpu_ - + this->start_cpu_).total_milliseconds(); + return this->elapsed_milliseconds_; +} + +float CPUTimer::MicroSeconds() { + if (!has_run_at_least_once()) { + LOG(WARNING) << "Timer has never been run before reading time."; + return 0; + } + if (running()) { + Stop(); + } + this->elapsed_microseconds_ = (this->stop_cpu_ - + this->start_cpu_).total_microseconds(); + return this->elapsed_microseconds_; +} + } // namespace caffe diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 1c842a078c2..9f9d975dfba 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -231,10 +231,10 @@ int time() { Timer forward_timer; Timer backward_timer; Timer timer; - std::vector<float> forward_time_per_layer(layers.size(), 0.0); - std::vector<float> backward_time_per_layer(layers.size(), 0.0); - float forward_time = 0.0; - float backward_time = 0.0; + std::vector<double> forward_time_per_layer(layers.size(), 0.0); + std::vector<double> backward_time_per_layer(layers.size(), 0.0); + double forward_time = 0.0; + double backward_time = 0.0; for (int j = 0; j < FLAGS_iterations; ++j) { Timer iter_timer; iter_timer.Start(); @@ -245,33 +245,38 @@ int time() { // so that we will notice Reshape performance bugs. layers[i]->Reshape(bottom_vecs[i], top_vecs[i]); layers[i]->Forward(bottom_vecs[i], top_vecs[i]); - forward_time_per_layer[i] += timer.MilliSeconds(); + forward_time_per_layer[i] += timer.MicroSeconds(); } - forward_time += forward_timer.MilliSeconds(); + forward_time += forward_timer.MicroSeconds(); backward_timer.Start(); for (int i = layers.size() - 1; i >= 0; --i) { timer.Start(); layers[i]->Backward(top_vecs[i], bottom_need_backward[i], bottom_vecs[i]); - backward_time_per_layer[i] += timer.MilliSeconds(); + backward_time_per_layer[i] += timer.MicroSeconds(); } - backward_time += backward_timer.MilliSeconds(); + backward_time += backward_timer.MicroSeconds(); LOG(INFO) << "Iteration: " << j + 1 << " forward-backward time: " - << iter_timer.MilliSeconds() << " milliseconds."; + << iter_timer.MilliSeconds() << " ms."; } + LOG(INFO) << "Average time per layer: "; for (int i = 0; i < layers.size(); ++i) { const caffe::string& layername = layers[i]->layer_param().name(); LOG(INFO) << std::setfill(' ') << std::setw(10) << layername << - "\tforward: " << forward_time_per_layer[i] << " milliseconds."; + "\tforward: " << forward_time_per_layer[i] / 1000 / + FLAGS_iterations << " ms."; LOG(INFO) << std::setfill(' ') << std::setw(10) << layername << - "\tbackward: " << backward_time_per_layer[i] << " milliseconds."; + "\tbackward: " << backward_time_per_layer[i] / 1000 / + FLAGS_iterations << " ms."; } - LOG(INFO) << "Forward pass: " << forward_time << - " milliseconds."; - LOG(INFO) << "Backward pass: " << backward_time << - " milliseconds."; - LOG(INFO) << "Total Time: " << total_timer.MilliSeconds() << - " milliseconds."; + total_timer.Stop(); + LOG(INFO) << "Average Forward pass: " << forward_time / 1000 / + FLAGS_iterations << " ms."; + LOG(INFO) << "Average Backward pass: " << backward_time / 1000 / + FLAGS_iterations << " ms."; + LOG(INFO) << "Average Forward-Backward: " << total_timer.MilliSeconds() / + FLAGS_iterations << " ms."; + LOG(INFO) << "Total Time: " << total_timer.MilliSeconds() << " ms."; LOG(INFO) << "*** Benchmark ends ***"; return 0; } diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 4c2c658bbb0..358f57e38d6 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -4,6 +4,8 @@ #include <algorithm> #include <string> +#include <utility> +#include <vector> #include "caffe/dataset_factory.hpp" #include "caffe/proto/caffe.pb.h" From a1f83100858121fd094df625ed40af8c5afb42e5 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Fri, 3 Oct 2014 17:14:20 -0700 Subject: [PATCH 0953/2053] Adapt lenet_multistep_solver.prototxt to current solvers --- .../lenet_multistep_solver.prototxt | 13 +++++-------- examples/mnist/readme.md | 3 +++ 2 files changed, 8 insertions(+), 8 deletions(-) rename examples/{lenet => mnist}/lenet_multistep_solver.prototxt (74%) diff --git a/examples/lenet/lenet_multistep_solver.prototxt b/examples/mnist/lenet_multistep_solver.prototxt similarity index 74% rename from examples/lenet/lenet_multistep_solver.prototxt rename to examples/mnist/lenet_multistep_solver.prototxt index fadd7c904d7..7ee9fb60e67 100644 --- a/examples/lenet/lenet_multistep_solver.prototxt +++ b/examples/mnist/lenet_multistep_solver.prototxt @@ -1,7 +1,5 @@ -# The training protocol buffer definition -train_net: "lenet_train.prototxt" -# The testing protocol buffer definition -test_net: "lenet_test.prototxt" +# The train/test net protocol buffer definition +net: "examples/mnist/lenet_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. @@ -27,7 +25,6 @@ display: 100 max_iter: 10000 # snapshot intermediate results snapshot: 5000 -snapshot_prefix: "lenet" -# solver mode: 0 for CPU and 1 for GPU -solver_mode: 1 -device_id: 1 +snapshot_prefix: "examples/mnist/lenet_multistep" +# solver mode: CPU or GPU +solver_mode: GPU diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 44e0091f420..1f8a869630d 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -283,3 +283,6 @@ You just did! All the training was carried out on the GPU. In fact, if you would and you will be using CPU for training. Isn't that easy? MNIST is a small dataset, so training with GPU does not really introduce too much benefit due to communication overheads. On larger datasets with more complex models, such as ImageNet, the computation speed difference will be more significant. + +### How to reduce the learning rate a fixed steps? +Look at lenet_multistep_solver.prototxt From d7da420b4ce2b07dad7fca42535a576cff43ce96 Mon Sep 17 00:00:00 2001 From: Craig Quiter <cquiter@gmail.com> Date: Wed, 15 Oct 2014 21:26:01 -0700 Subject: [PATCH 0954/2053] Sometimes anaconda is installed in root. Helps fix #489. --- Makefile.config.example | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Makefile.config.example b/Makefile.config.example index b6d95e31df8..e11db51395d 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -48,13 +48,15 @@ BLAS := atlas PYTHON_INCLUDE := /usr/include/python2.7 \ /usr/lib/python2.7/dist-packages/numpy/core/include # Anaconda Python distribution is quite popular. Include path: -# PYTHON_INCLUDE := $(HOME)/anaconda/include \ - # $(HOME)/anaconda/include/python2.7 \ - # $(HOME)/anaconda/lib/python2.7/site-packages/numpy/core/include +# Verify anaconda location, sometimes it's in root. +# ANACONDA_HOME := $(HOME)/anaconda +# PYTHON_INCLUDE := $(ANACONDA_HOME)/include \ + # $(ANACONDA_HOME)/include/python2.7 \ + # $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \ # We need to be able to find libpythonX.X.so or .dylib. PYTHON_LIB := /usr/lib -# PYTHON_LIB := $(HOME)/anaconda/lib +# PYTHON_LIB := $(ANACONDA_HOME)/lib # Whatever else you find you need goes here. INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include From 3d95ed3ae19f6cadcd3400c75970fdbeb10ad4c5 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Thu, 16 Oct 2014 11:17:24 -0700 Subject: [PATCH 0955/2053] Fix init current_step --- examples/mnist/lenet_multistep_solver.prototxt | 11 +++++------ src/caffe/solver.cpp | 1 + 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/mnist/lenet_multistep_solver.prototxt b/examples/mnist/lenet_multistep_solver.prototxt index 7ee9fb60e67..9b22b45ba6b 100644 --- a/examples/mnist/lenet_multistep_solver.prototxt +++ b/examples/mnist/lenet_multistep_solver.prototxt @@ -13,12 +13,11 @@ weight_decay: 0.0005 # The learning rate policy lr_policy: "multistep" gamma: 0.9 -stepvalue: 1000 -stepvalue: 2000 -stepvalue: 2500 -stepvalue: 3000 -stepvalue: 3500 -stepvalue: 4000 +stepvalue: 5000 +stepvalue: 7000 +stepvalue: 8000 +stepvalue: 9000 +stepvalue: 9500 # Display every 100 iterations display: 100 # The maximum number of iterations diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index a13bca8b44a..5b8f0795306 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -162,6 +162,7 @@ void Solver<Dtype>::Solve(const char* resume_file) { PreSolve(); iter_ = 0; + current_step_ = 0; if (resume_file) { LOG(INFO) << "Restoring previous solver status from " << resume_file; Restore(resume_file); From 33a1752a4ea8b67804fd5ffccf2ef66737e7b44d Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Thu, 16 Oct 2014 12:55:53 -0700 Subject: [PATCH 0956/2053] Edit boost-python formula --- docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index d8fb1c019e2..207e17d1539 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -182,7 +182,7 @@ For each of these formulas, `brew edit FORMULA`, and add the ENV definitions as To edit the formulae in turn, run - for x in snappy leveldb protobuf gflags glog szip boost lmdb homebrew/science/opencv; do brew edit $x; done + for x in snappy leveldb protobuf gflags glog szip boost boost-python lmdb homebrew/science/opencv; do brew edit $x; done After this, run From f2f0a7a73d25cbbd010b1405dc0bfd922d869a9d Mon Sep 17 00:00:00 2001 From: Sergey Karayev <sergeykarayev@gmail.com> Date: Fri, 17 Oct 2014 11:34:25 -0700 Subject: [PATCH 0957/2053] Fixing finetune_flickr_style model reported accuracy. --- examples/finetune_flickr_style/readme.md | 6 +++--- models/finetune_flickr_style/readme.md | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/examples/finetune_flickr_style/readme.md b/examples/finetune_flickr_style/readme.md index c4aafbc66fd..ecb9d3d2e6d 100644 --- a/examples/finetune_flickr_style/readme.md +++ b/examples/finetune_flickr_style/readme.md @@ -53,7 +53,6 @@ Using a script, we will download a small subset of the data and split it into tr Writing train/val for 1939 successfully downloaded images. This script downloads images and writes train/val file lists into `data/flickr_style`. -With this random seed there are 1,557 train images and 382 test images. The prototxts in this example assume this, and also assume the presence of the ImageNet mean file (run `get_ilsvrc_aux.sh` from `data/ilsvrc12` to obtain this if you haven't yet). We'll also need the ImageNet-trained model, which you can obtain by running `./scripts/download_model_binary.py models/bvlc_reference_caffenet`. @@ -106,7 +105,8 @@ Now we can train! (You can fine-tune in CPU mode by leaving out the `-gpu` flag. I0828 22:23:17.438894 11510 solver.cpp:302] Test net output #0: accuracy = 0.2356 Note how rapidly the loss went down. Although the 23.5% accuracy is only modest, it was achieved in only 1000, and evidence that the model is starting to learn quickly and well. -Once the model is fully fine-tuned on the whole training set over 100,000 iterations the final validation accuracy is 91.64%. This takes ~7 hours in Caffe on a K40 GPU. +Once the model is fully fine-tuned on the whole training set over 100,000 iterations the final validation accuracy is 39.16%. +This takes ~7 hours in Caffe on a K40 GPU. For comparison, here is how the loss goes down when we do not start with a pre-trained model: @@ -155,7 +155,7 @@ Now try fine-tuning to your own tasks and data! ## Trained model -We provide a model trained on all 80K images, with final accuracy of 98%. +We provide a model trained on all 80K images, with final accuracy of 39%. Simply do `./scripts/download_model_binary.py models/finetune_flickr_style` to obtain it. ## License diff --git a/models/finetune_flickr_style/readme.md b/models/finetune_flickr_style/readme.md index c08485f7fd3..d2a8a95f669 100644 --- a/models/finetune_flickr_style/readme.md +++ b/models/finetune_flickr_style/readme.md @@ -3,16 +3,17 @@ name: Finetuning CaffeNet on Flickr Style caffemodel: finetune_flickr_style.caffemodel caffemodel_url: http://dl.caffe.berkeleyvision.org/finetune_flickr_style.caffemodel license: non-commercial -sha1: 443ad95a61fb0b5cd3cee55951bcc1f299186b5e -caffe_commit: 41751046f18499b84dbaf529f64c0e664e2a09fe +sha1: b61b5cef7d771b53b0c488e78d35ccadc073e9cf +caffe_commit: 737ea5e936821b5c69f9c3952d72693ae5843370 gist_id: 034c6ac3865563b69e60 --- This model is trained exactly as described in `docs/finetune_flickr_style/readme.md`, using all 80000 images. -The final performance on the test set: +The final performance: - I0903 18:40:59.211707 11585 caffe.cpp:167] Loss: 0.407405 - I0903 18:40:59.211717 11585 caffe.cpp:179] accuracy = 0.9164 + I1017 07:36:17.370688 31333 solver.cpp:228] Iteration 100000, loss = 0.757952 + I1017 07:36:17.370730 31333 solver.cpp:247] Iteration 100000, Testing net (#0) + I1017 07:36:34.248730 31333 solver.cpp:298] Test net output #0: accuracy = 0.3916 ## License From e41ddbd3d70eff49a7bab430bb085d3b89647b4d Mon Sep 17 00:00:00 2001 From: Kevin James Matzen <kmatzen@cs.cornell.edu> Date: Sat, 18 Oct 2014 02:51:29 -0400 Subject: [PATCH 0958/2053] LMDB doesn't support many concurrent read-only transactions, so this preallocates one read-only transaction and reuses it. It's very important that iterations are considered invalid after a commit has been performed. --- include/caffe/dataset.hpp | 1 - include/caffe/leveldb_dataset.hpp | 11 ++--- include/caffe/lmdb_dataset.hpp | 30 ++++++------ src/caffe/lmdb_dataset.cpp | 77 ++++++++++++++----------------- src/caffe/test/test_dataset.cpp | 38 +++++++++++++++ 5 files changed, 92 insertions(+), 65 deletions(-) diff --git a/include/caffe/dataset.hpp b/include/caffe/dataset.hpp index 90deb3160fa..1dd8458cd74 100644 --- a/include/caffe/dataset.hpp +++ b/include/caffe/dataset.hpp @@ -170,7 +170,6 @@ class Dataset { iterator(const Dataset* parent, shared_ptr<DatasetState> state) : parent_(parent), state_(state) { } - ~iterator() { } iterator(const iterator& other) : parent_(other.parent_), diff --git a/include/caffe/leveldb_dataset.hpp b/include/caffe/leveldb_dataset.hpp index f6c57fe65af..d58c181bb2b 100644 --- a/include/caffe/leveldb_dataset.hpp +++ b/include/caffe/leveldb_dataset.hpp @@ -61,12 +61,11 @@ class LeveldbDataset : public Dataset<K, V, KCoder, VCoder> { shared_ptr<DatasetState> clone() { shared_ptr<leveldb::Iterator> new_iter; - if (iter_.get()) { - new_iter.reset(db_->NewIterator(leveldb::ReadOptions())); - CHECK(iter_->Valid()); - new_iter->Seek(iter_->key()); - CHECK(new_iter->Valid()); - } + CHECK(iter_.get()); + new_iter.reset(db_->NewIterator(leveldb::ReadOptions())); + CHECK(iter_->Valid()); + new_iter->Seek(iter_->key()); + CHECK(new_iter->Valid()); return shared_ptr<DatasetState>(new LeveldbState(db_, new_iter)); } diff --git a/include/caffe/lmdb_dataset.hpp b/include/caffe/lmdb_dataset.hpp index 71b322490c0..ac1e5ee25dd 100644 --- a/include/caffe/lmdb_dataset.hpp +++ b/include/caffe/lmdb_dataset.hpp @@ -28,7 +28,8 @@ class LmdbDataset : public Dataset<K, V, KCoder, VCoder> { LmdbDataset() : env_(NULL), dbi_(0), - txn_(NULL) { } + write_txn_(NULL), + read_txn_(NULL) { } bool open(const string& filename, Mode mode); bool put(const K& key, const V& value); @@ -55,21 +56,19 @@ class LmdbDataset : public Dataset<K, V, KCoder, VCoder> { dbi_(dbi) { } shared_ptr<DatasetState> clone() { + CHECK(cursor_); + MDB_cursor* new_cursor; + int retval; - if (cursor_) { - int retval; - retval = mdb_cursor_open(txn_, *dbi_, &new_cursor); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - MDB_val key; - MDB_val val; - retval = mdb_cursor_get(cursor_, &key, &val, MDB_GET_CURRENT); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - retval = mdb_cursor_get(new_cursor, &key, &val, MDB_SET); - CHECK_EQ(MDB_SUCCESS, retval) << mdb_strerror(retval); - } else { - new_cursor = cursor_; - } + retval = mdb_cursor_open(txn_, *dbi_, &new_cursor); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); + MDB_val key; + MDB_val val; + retval = mdb_cursor_get(cursor_, &key, &val, MDB_GET_CURRENT); + CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); + retval = mdb_cursor_get(new_cursor, &key, &val, MDB_SET); + CHECK_EQ(MDB_SUCCESS, retval) << mdb_strerror(retval); return shared_ptr<DatasetState>(new LmdbState(new_cursor, txn_, dbi_)); } @@ -87,7 +86,8 @@ class LmdbDataset : public Dataset<K, V, KCoder, VCoder> { MDB_env* env_; MDB_dbi dbi_; - MDB_txn* txn_; + MDB_txn* write_txn_; + MDB_txn* read_txn_; }; } // namespace caffe diff --git a/src/caffe/lmdb_dataset.cpp b/src/caffe/lmdb_dataset.cpp index 23852f0cd81..8f8e68e901e 100644 --- a/src/caffe/lmdb_dataset.cpp +++ b/src/caffe/lmdb_dataset.cpp @@ -15,7 +15,8 @@ bool LmdbDataset<K, V, KCoder, VCoder>::open(const string& filename, DLOG(INFO) << "LMDB: Open " << filename; CHECK(NULL == env_); - CHECK(NULL == txn_); + CHECK(NULL == write_txn_); + CHECK(NULL == read_txn_); CHECK_EQ(0, dbi_); int retval; @@ -66,13 +67,19 @@ bool LmdbDataset<K, V, KCoder, VCoder>::open(const string& filename, return false; } - retval = mdb_txn_begin(env_, NULL, flag2, &txn_); + retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &read_txn_); if (MDB_SUCCESS != retval) { LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); return false; } - retval = mdb_open(txn_, NULL, 0, &dbi_); + retval = mdb_txn_begin(env_, NULL, flag2, &write_txn_); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); + return false; + } + + retval = mdb_open(write_txn_, NULL, 0, &dbi_); if (MDB_SUCCESS != retval) { LOG(ERROR) << "mdb_open failed" << mdb_strerror(retval); return false; @@ -103,10 +110,10 @@ bool LmdbDataset<K, V, KCoder, VCoder>::put(const K& key, const V& value) { mdbkey.mv_size = serialized_key.size(); mdbkey.mv_data = serialized_key.data(); - CHECK_NOTNULL(txn_); + CHECK_NOTNULL(write_txn_); CHECK_NE(0, dbi_); - int retval = mdb_put(txn_, dbi_, &mdbkey, &mdbdata, 0); + int retval = mdb_put(write_txn_, dbi_, &mdbkey, &mdbdata, 0); if (MDB_SUCCESS != retval) { LOG(ERROR) << "mdb_put failed " << mdb_strerror(retval); return false; @@ -130,21 +137,12 @@ bool LmdbDataset<K, V, KCoder, VCoder>::get(const K& key, V* value) { mdbkey.mv_size = serialized_key.size(); int retval; - MDB_txn* get_txn; - retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &get_txn); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); - return false; - } - - retval = mdb_get(get_txn, dbi_, &mdbkey, &mdbdata); + retval = mdb_get(read_txn_, dbi_, &mdbkey, &mdbdata); if (MDB_SUCCESS != retval) { LOG(ERROR) << "mdb_get failed " << mdb_strerror(retval); return false; } - mdb_txn_abort(get_txn); - if (!VCoder::deserialize(reinterpret_cast<char*>(mdbdata.mv_data), mdbdata.mv_size, value)) { LOG(ERROR) << "failed to deserialize value"; @@ -160,14 +158,8 @@ bool LmdbDataset<K, V, KCoder, VCoder>::first_key(K* key) { int retval; - MDB_txn* iter_txn; - - retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &iter_txn); - CHECK_EQ(MDB_SUCCESS, retval) << "mdb_txn_begin failed " - << mdb_strerror(retval); - MDB_cursor* cursor; - retval = mdb_cursor_open(iter_txn, dbi_, &cursor); + retval = mdb_cursor_open(read_txn_, dbi_, &cursor); CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); MDB_val mdbkey; MDB_val mdbval; @@ -175,7 +167,6 @@ bool LmdbDataset<K, V, KCoder, VCoder>::first_key(K* key) { CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); mdb_cursor_close(cursor); - mdb_txn_abort(iter_txn); if (!KCoder::deserialize(reinterpret_cast<char*>(mdbkey.mv_data), mdbkey.mv_size, key)) { @@ -192,14 +183,8 @@ bool LmdbDataset<K, V, KCoder, VCoder>::last_key(K* key) { int retval; - MDB_txn* iter_txn; - - retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &iter_txn); - CHECK_EQ(MDB_SUCCESS, retval) << "mdb_txn_begin failed " - << mdb_strerror(retval); - MDB_cursor* cursor; - retval = mdb_cursor_open(iter_txn, dbi_, &cursor); + retval = mdb_cursor_open(read_txn_, dbi_, &cursor); CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); MDB_val mdbkey; MDB_val mdbval; @@ -207,7 +192,6 @@ bool LmdbDataset<K, V, KCoder, VCoder>::last_key(K* key) { CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); mdb_cursor_close(cursor); - mdb_txn_abort(iter_txn); if (!KCoder::deserialize(reinterpret_cast<char*>(mdbkey.mv_data), mdbkey.mv_size, key)) { @@ -222,16 +206,24 @@ template <typename K, typename V, typename KCoder, typename VCoder> bool LmdbDataset<K, V, KCoder, VCoder>::commit() { DLOG(INFO) << "LMDB: Commit"; - CHECK_NOTNULL(txn_); + CHECK_NOTNULL(write_txn_); int retval; - retval = mdb_txn_commit(txn_); + retval = mdb_txn_commit(write_txn_); if (MDB_SUCCESS != retval) { LOG(ERROR) << "mdb_txn_commit failed " << mdb_strerror(retval); return false; } - retval = mdb_txn_begin(env_, NULL, 0, &txn_); + mdb_txn_abort(read_txn_); + + retval = mdb_txn_begin(env_, NULL, 0, &write_txn_); + if (MDB_SUCCESS != retval) { + LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); + return false; + } + + retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &read_txn_); if (MDB_SUCCESS != retval) { LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); return false; @@ -245,11 +237,14 @@ void LmdbDataset<K, V, KCoder, VCoder>::close() { DLOG(INFO) << "LMDB: Close"; if (env_ && dbi_) { + mdb_txn_abort(write_txn_); + mdb_txn_abort(read_txn_); mdb_close(env_, dbi_); mdb_env_close(env_); env_ = NULL; dbi_ = 0; - txn_ = NULL; + write_txn_ = NULL; + read_txn_ = NULL; } } @@ -268,14 +263,8 @@ typename LmdbDataset<K, V, KCoder, VCoder>::const_iterator LmdbDataset<K, V, KCoder, VCoder>::begin() const { int retval; - MDB_txn* iter_txn; - - retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &iter_txn); - CHECK_EQ(MDB_SUCCESS, retval) << "mdb_txn_begin failed " - << mdb_strerror(retval); - MDB_cursor* cursor; - retval = mdb_cursor_open(iter_txn, dbi_, &cursor); + retval = mdb_cursor_open(read_txn_, dbi_, &cursor); CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); MDB_val key; MDB_val val; @@ -286,7 +275,9 @@ typename LmdbDataset<K, V, KCoder, VCoder>::const_iterator shared_ptr<DatasetState> state; if (MDB_SUCCESS == retval) { - state.reset(new LmdbState(cursor, iter_txn, &dbi_)); + state.reset(new LmdbState(cursor, read_txn_, &dbi_)); + } else { + mdb_cursor_close(cursor); } return const_iterator(this, state); } diff --git a/src/caffe/test/test_dataset.cpp b/src/caffe/test/test_dataset.cpp index e5bd1d2c40e..6645ca228d2 100644 --- a/src/caffe/test/test_dataset.cpp +++ b/src/caffe/test/test_dataset.cpp @@ -751,6 +751,44 @@ TYPED_TEST(DatasetTest, TestReadOnlyGetNoCommitFails) { EXPECT_FALSE(dataset->get(key, &new_value)); } +TYPED_TEST(DatasetTest, TestCreateManyItersShortScope) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + EXPECT_TRUE(dataset->put(key, value)); + EXPECT_TRUE(dataset->commit()); + + for (int i = 0; i < 1000; ++i) { + typename Dataset<string, value_type>::const_iterator iter = + dataset->begin(); + } +} + +TYPED_TEST(DatasetTest, TestCreateManyItersLongScope) { + UNPACK_TYPES; + + string name = this->DBName(); + shared_ptr<Dataset<string, value_type> > dataset = + DatasetFactory<string, value_type>(backend); + EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); + + string key = this->TestKey(); + value_type value = this->TestValue(); + EXPECT_TRUE(dataset->put(key, value)); + EXPECT_TRUE(dataset->commit()); + + vector<typename Dataset<string, value_type>::const_iterator> iters; + for (int i = 0; i < 1000; ++i) { + iters.push_back(dataset->begin()); + } +} + #undef UNPACK_TYPES } // namespace caffe From a723be04acf250a08b5a6f0fbb7e3fde7de429be Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Sat, 18 Oct 2014 07:59:53 -0700 Subject: [PATCH 0959/2053] Remove TIMING from ForwardBackward --- include/caffe/net.hpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 879f474674d..1d06dc45533 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -11,9 +11,6 @@ #include "caffe/common.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" -#ifdef TIMING -#include "caffe/util/benchmark.hpp" -#endif namespace caffe { @@ -79,16 +76,9 @@ class Net { void Reshape(); Dtype ForwardBackward(const vector<Blob<Dtype>* > & bottom) { - #ifdef TIMING - Timer timer; - timer.Start(); - #endif Dtype loss; Forward(bottom, &loss); Backward(); - #ifdef TIMING - LOG(INFO) << "ForwardBackward Time: " << timer.MilliSeconds() << "ms."; - #endif return loss; } From 60554bc4d238f224ba7b4745715a9ae323cf3c4b Mon Sep 17 00:00:00 2001 From: Jack Culpepper <jackculpepper@gmail.com> Date: Sun, 19 Oct 2014 08:31:29 -0700 Subject: [PATCH 0960/2053] define gradient at zero to be zero --- src/caffe/layers/absval_layer.cpp | 3 +-- src/caffe/layers/absval_layer.cu | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/caffe/layers/absval_layer.cpp b/src/caffe/layers/absval_layer.cpp index 54e484b115d..c347d460c0c 100644 --- a/src/caffe/layers/absval_layer.cpp +++ b/src/caffe/layers/absval_layer.cpp @@ -26,12 +26,11 @@ template <typename Dtype> void AbsValLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { const int count = top[0]->count(); - const Dtype* top_data = top[0]->cpu_data(); const Dtype* top_diff = top[0]->cpu_diff(); if (propagate_down[0]) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* bottom_diff = bottom[0]->mutable_cpu_diff(); - caffe_div(count, top_data, bottom_data, bottom_diff); + caffe_cpu_sign(count, bottom_data, bottom_diff); caffe_mul(count, bottom_diff, top_diff, bottom_diff); } } diff --git a/src/caffe/layers/absval_layer.cu b/src/caffe/layers/absval_layer.cu index 732d4c6252b..91f3c77fe9a 100644 --- a/src/caffe/layers/absval_layer.cu +++ b/src/caffe/layers/absval_layer.cu @@ -23,7 +23,7 @@ void AbsValLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, if (propagate_down[0]) { const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); - caffe_gpu_div(count, top_data, bottom_data, bottom_diff); + caffe_gpu_sign(count, bottom_data, bottom_diff); caffe_gpu_mul(count, bottom_diff, top_diff, bottom_diff); } } From c211fd01ed62c8279ffc810e4f4d1ab2f0b93366 Mon Sep 17 00:00:00 2001 From: Maksim Lapin <mlapin@mpi-inf.mpg.de> Date: Tue, 7 Oct 2014 21:48:26 +0200 Subject: [PATCH 0961/2053] include opencv only in .cpp --- Makefile | 1 - include/caffe/common.hpp | 3 +++ include/caffe/data_transformer.hpp | 6 ----- include/caffe/util/io.hpp | 39 ++++++++------------------- src/caffe/data_transformer.cpp | 4 --- src/caffe/layers/data_layer.cpp | 2 ++ src/caffe/layers/image_data_layer.cpp | 2 ++ src/caffe/util/io.cpp | 28 +++++++++++++++++++ 8 files changed, 46 insertions(+), 39 deletions(-) diff --git a/Makefile b/Makefile index 26d5964cacc..dcd7b2457b7 100644 --- a/Makefile +++ b/Makefile @@ -250,7 +250,6 @@ ifeq ($(OSX), 1) endif # boost::thread is called boost_thread-mt to mark multithreading on OS X LIBRARIES += boost_thread-mt - NVCCFLAGS += -DOSX endif # Custom compiler diff --git a/include/caffe/common.hpp b/include/caffe/common.hpp index 81b2e9ae101..5fc4ed3a3e1 100644 --- a/include/caffe/common.hpp +++ b/include/caffe/common.hpp @@ -64,6 +64,9 @@ private:\ // is executed we will see a fatal log. #define NOT_IMPLEMENTED LOG(FATAL) << "Not Implemented Yet" +// See PR #1236 +namespace cv {class Mat;} + namespace caffe { // We will use the boost shared_ptr instead of the new C++11 one mainly diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 5f08335d4a3..70e74368ca7 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -1,10 +1,6 @@ #ifndef CAFFE_DATA_TRANSFORMER_HPP #define CAFFE_DATA_TRANSFORMER_HPP -#ifndef OSX -#include <opencv2/core/core.hpp> -#endif - #include <vector> #include "caffe/blob.hpp" @@ -64,9 +60,7 @@ class DataTransformer { * This is destination blob. It can be part of top blob's data if * set_cpu_data() is used See image_data_layer.cpp for an example. */ -#ifndef OSX void Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob); -#endif /** * @brief Applies the same transformation defined in the data layer's diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 64df0155780..9c0b4872af6 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -1,10 +1,6 @@ #ifndef CAFFE_UTIL_IO_H_ #define CAFFE_UTIL_IO_H_ -#ifndef OSX -#include <opencv2/core/core.hpp> -#endif - #include <unistd.h> #include <string> @@ -13,6 +9,7 @@ #include "hdf5_hl.h" #include "caffe/blob.hpp" +#include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" #define HDF5_NUM_DIMS 4 @@ -127,43 +124,29 @@ inline bool DecodeDatum(Datum* datum) { return DecodeDatum(0, 0, true, datum); } -#ifndef OSX cv::Mat ReadImageToCVMat(const string& filename, const int height, const int width, const bool is_color); -inline cv::Mat ReadImageToCVMat(const string& filename, - const int height, const int width) { - return ReadImageToCVMat(filename, height, width, true); -} +cv::Mat ReadImageToCVMat(const string& filename, + const int height, const int width); -inline cv::Mat ReadImageToCVMat(const string& filename, - const bool is_color) { - return ReadImageToCVMat(filename, 0, 0, is_color); -} +cv::Mat ReadImageToCVMat(const string& filename, + const bool is_color); -inline cv::Mat ReadImageToCVMat(const string& filename) { - return ReadImageToCVMat(filename, 0, 0, true); -} +cv::Mat ReadImageToCVMat(const string& filename); cv::Mat DecodeDatumToCVMat(const Datum& datum, const int height, const int width, const bool is_color); -inline cv::Mat DecodeDatumToCVMat(const Datum& datum, - const int height, const int width) { - return DecodeDatumToCVMat(datum, height, width, true); -} +cv::Mat DecodeDatumToCVMat(const Datum& datum, + const int height, const int width); -inline cv::Mat DecodeDatumToCVMat(const Datum& datum, - const bool is_color) { - return DecodeDatumToCVMat(datum, 0, 0, is_color); -} +cv::Mat DecodeDatumToCVMat(const Datum& datum, + const bool is_color); -inline cv::Mat DecodeDatumToCVMat(const Datum& datum) { - return DecodeDatumToCVMat(datum, 0, 0, true); -} +cv::Mat DecodeDatumToCVMat(const Datum& datum); void CVMatToDatum(const cv::Mat& cv_img, Datum* datum); -#endif template <typename Dtype> void hdf5_load_nd_dataset_helper( diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 023396ce5e6..209dc0349ad 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -1,6 +1,4 @@ -#ifndef OSX #include <opencv2/core/core.hpp> -#endif #include <string> #include <vector> @@ -175,7 +173,6 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, } } -#ifndef OSX template<typename Dtype> void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob) { @@ -276,7 +273,6 @@ void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, } } } -#endif template<typename Dtype> void DataTransformer<Dtype>::Transform(Blob<Dtype>* input_blob, diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 5d6f05802ce..a5030899cee 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -1,3 +1,5 @@ +#include <opencv2/core/core.hpp> + #include <stdint.h> #include <string> diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index 50997a23bf9..ef6a342c30a 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -1,3 +1,5 @@ +#include <opencv2/core/core.hpp> + #include <fstream> // NOLINT(readability/streams) #include <iostream> // NOLINT(readability/streams) #include <string> diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index b136bc8a120..ffdaeb12c4a 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -83,6 +83,20 @@ cv::Mat ReadImageToCVMat(const string& filename, return cv_img; } +cv::Mat ReadImageToCVMat(const string& filename, + const int height, const int width) { + return ReadImageToCVMat(filename, height, width, true); +} + +cv::Mat ReadImageToCVMat(const string& filename, + const bool is_color) { + return ReadImageToCVMat(filename, 0, 0, is_color); +} + +cv::Mat ReadImageToCVMat(const string& filename) { + return ReadImageToCVMat(filename, 0, 0, true); +} + bool ReadImageToDatum(const string& filename, const int label, const int height, const int width, const bool is_color, Datum* datum) { cv::Mat cv_img = ReadImageToCVMat(filename, height, width, is_color); @@ -135,6 +149,20 @@ cv::Mat DecodeDatumToCVMat(const Datum& datum, return cv_img; } +cv::Mat DecodeDatumToCVMat(const Datum& datum, + const int height, const int width) { + return DecodeDatumToCVMat(datum, height, width, true); +} + +cv::Mat DecodeDatumToCVMat(const Datum& datum, + const bool is_color) { + return DecodeDatumToCVMat(datum, 0, 0, is_color); +} + +cv::Mat DecodeDatumToCVMat(const Datum& datum) { + return DecodeDatumToCVMat(datum, 0, 0, true); +} + // If Datum is encoded will decoded using DecodeDatumToCVMat and CVMatToDatum // if height and width are set it will resize it // If Datum is not encoded will do nothing From 293347196a81f68046b30984448cc4883d6c5aa5 Mon Sep 17 00:00:00 2001 From: Ryota Tomioka <tomioka@ttic.edu> Date: Mon, 20 Oct 2014 09:35:20 -0500 Subject: [PATCH 0962/2053] Fixed a memory leak issue in InternalThread (and removed caffe::Thread calss). --- include/caffe/internal_thread.hpp | 19 +++---------------- include/caffe/util/thread.hpp | 25 ------------------------- src/caffe/internal_thread.cpp | 8 +------- 3 files changed, 4 insertions(+), 48 deletions(-) delete mode 100644 include/caffe/util/thread.hpp diff --git a/include/caffe/internal_thread.hpp b/include/caffe/internal_thread.hpp index 6a106e6eefa..9c24585b2cd 100644 --- a/include/caffe/internal_thread.hpp +++ b/include/caffe/internal_thread.hpp @@ -1,24 +1,11 @@ #ifndef CAFFE_INTERNAL_THREAD_HPP_ #define CAFFE_INTERNAL_THREAD_HPP_ +#include <boost/thread.hpp> #include "caffe/common.hpp" namespace caffe { -/** - * A minimal wrapper for boost::thread to force host compilation for boost - * Defined in caffe/util/thread.hpp - */ -class Thread { - public: - template<typename Callable, class A1> - Thread(Callable func, A1 a1); - void join(); - bool joinable(); - private: - void* thread_; -}; - /** * Virtual class encapsulate boost::thread for use in base class * The child class will acquire the ability to run a single thread, @@ -26,7 +13,7 @@ class Thread { */ class InternalThread { public: - InternalThread() : thread_(NULL) {} + InternalThread() : thread_() {} virtual ~InternalThread(); /** Returns true if the thread was successfully started. **/ @@ -42,7 +29,7 @@ class InternalThread { with the code you want your thread to run. */ virtual void InternalThreadEntry() {} - caffe::Thread* thread_; + shared_ptr<boost::thread> thread_; }; } // namespace caffe diff --git a/include/caffe/util/thread.hpp b/include/caffe/util/thread.hpp deleted file mode 100644 index 7251402cf1a..00000000000 --- a/include/caffe/util/thread.hpp +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef CAFFE_THREAD_CPP_HPP_ -#define CAFFE_THREAD_CPP_HPP_ - -#include <boost/thread.hpp> -#include "caffe/common.hpp" -#include "caffe/internal_thread.hpp" - -namespace caffe { - -template<typename Callable, class A1> -Thread::Thread(Callable func, A1 a1) { - this->thread_ = new boost::thread(func, a1); -} - -void Thread::join() { - static_cast<boost::thread*>(this->thread_)->join(); -} - -bool Thread::joinable() { - return static_cast<boost::thread*>(this->thread_)->joinable(); -} - -} // namespace caffe - -#endif diff --git a/src/caffe/internal_thread.cpp b/src/caffe/internal_thread.cpp index d7b6ae206cf..62a4c1faee2 100644 --- a/src/caffe/internal_thread.cpp +++ b/src/caffe/internal_thread.cpp @@ -1,14 +1,9 @@ #include "caffe/internal_thread.hpp" -#include "caffe/util/thread.hpp" - namespace caffe { InternalThread::~InternalThread() { WaitForInternalThreadToExit(); - if (thread_ != NULL) { - delete thread_; - } } bool InternalThread::StartInternalThread() { @@ -16,8 +11,7 @@ bool InternalThread::StartInternalThread() { return false; } try { - thread_ = new caffe::Thread - (&InternalThread::InternalThreadEntry, this); + thread_.reset(new boost::thread(&InternalThread::InternalThreadEntry, this)); } catch (...) { return false; } From 686793e178b4282fbd3769c940e7188d1279bbc3 Mon Sep 17 00:00:00 2001 From: Traun Leyden <tleyden@couchbase.com> Date: Mon, 20 Oct 2014 15:15:03 +0000 Subject: [PATCH 0963/2053] Fix build error caused by pthread lib order https://github.com/BVLC/caffe/issues/1327 --- Makefile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index e85f338ed23..6a660f5e0f2 100644 --- a/Makefile +++ b/Makefile @@ -165,12 +165,11 @@ ifneq ($(CPU_ONLY), 1) LIBRARY_DIRS += $(CUDA_LIB_DIR) LIBRARIES := cudart cublas curand endif -LIBRARIES += pthread \ - glog gflags protobuf leveldb snappy \ +LIBRARIES += glog gflags protobuf leveldb snappy \ lmdb \ boost_system \ hdf5_hl hdf5 \ - opencv_core opencv_highgui opencv_imgproc + opencv_core opencv_highgui opencv_imgproc pthread PYTHON_LIBRARIES := boost_python python2.7 WARNINGS := -Wall -Wno-sign-compare From f517cdc8dd4b78ba627308cceced9cb36de1fb81 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 20 Oct 2014 12:55:49 -0700 Subject: [PATCH 0964/2053] [docs] cite the arXiv paper --- docs/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/index.md b/docs/index.md index e90b06b4d22..cb187433e27 100644 --- a/docs/index.md +++ b/docs/index.md @@ -67,11 +67,11 @@ Developer documentation automagically generated from code comments. Please cite Caffe in your publications if it helps your research: - @misc{Jia13caffe, - Author = {Yangqing Jia}, - Title = { {Caffe}: An Open Source Convolutional Architecture for Fast Feature Embedding}, - Year = {2013}, - Howpublished = {\url{http://caffe.berkeleyvision.org/}} + @article{jia2014caffe, + Author = {Jia, Yangqing and Shelhamer, Evan and Donahue, Jeff and Karayev, Sergey and Long, Jonathan and Girshick, Ross and Guadarrama, Sergio and Darrell, Trevor}, + Journal = {arXiv preprint arXiv:1408.5093}, + Title = {Caffe: Convolutional Architecture for Fast Feature Embedding}, + Year = {2014} } If you do publish a paper where Caffe helped your research, we encourage you to update the [publications wiki](https://github.com/BVLC/caffe/wiki/Publications). From 6811463e898341a1fa5b819e8f7cf00f682dca9a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 20 Oct 2014 12:56:12 -0700 Subject: [PATCH 0965/2053] [docs] BVLC Caffe acknowledgements --- docs/index.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/index.md b/docs/index.md index cb187433e27..2ca487a591a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -79,17 +79,19 @@ Citations are also tracked automatically by [Google Scholar](http://scholar.goog ## Acknowledgements -Yangqing would like to thank the NVIDIA Academic program for providing GPUs, [Oriol Vinyals](http://www1.icsi.berkeley.edu/~vinyals/) for discussions along the journey, and BVLC PI [Trevor Darrell](http://www.eecs.berkeley.edu/~trevor/) for guidance. +The BVLC Caffe developers would like to thank NVIDIA for GPU donation, A9 and Amazon Web Services for a research grant in support of Caffe development and reproducible research in deep learning, and BVLC PI [Trevor Darrell](http://www.eecs.berkeley.edu/~trevor/) for guidance. -A core set of BVLC members have contributed much new functionality and many fixes since the original release (alphabetical by first name): -[Eric Tzeng](https://github.com/erictzeng), [Evan Shelhamer](http://imaginarynumber.net/), [Jeff Donahue](http://jeffdonahue.com/), [Jon Long](https://github.com/longjon), [Ross Girshick](http://www.cs.berkeley.edu/~rbg/), [Sergey Karayev](http://sergeykarayev.com/), [Sergio Guadarrama](http://www.eecs.berkeley.edu/~sguada/). +The BVLC members who have contributed to Caffe are (alphabetical by first name): +[Eric Tzeng](https://github.com/erictzeng), [Evan Shelhamer](http://imaginarynumber.net/), [Jeff Donahue](http://jeffdonahue.com/), [Jon Long](https://github.com/longjon), [Ross Girshick](http://www.cs.berkeley.edu/~rbg/), [Sergey Karayev](http://sergeykarayev.com/), [Sergio Guadarrama](http://www.eecs.berkeley.edu/~sguada/), and [Yangqing Jia](http://daggerfs.com/). -Additionally, the open-source community plays a large and growing role in Caffe's development. +The open-source community plays an important and growing role in Caffe's development. Check out the Github [project pulse](https://github.com/BVLC/caffe/pulse) for recent activity, and the [contributors](https://github.com/BVLC/caffe/graphs/contributors) for a sorted list. We sincerely appreciate your interest and contributions! If you'd like to contribute, please read the [developing & contributing](development.html) guide. +Yangqing would like to give a personal thanks to the NVIDIA Academic program for providing GPUs, [Oriol Vinyals](http://www1.icsi.berkeley.edu/~vinyals/) for discussions along the journey, and BVLC PI [Trevor Darrell](http://www.eecs.berkeley.edu/~trevor/) for advice. + ## Contacting us All questions about usage, installation, code, and applications should be searched for and asked on the [caffe-users mailing list](https://groups.google.com/forum/#!forum/caffe-users). From c18d22eb92488f02c0256a3fe4ac20a8ad827596 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 20 Oct 2014 12:57:18 -0700 Subject: [PATCH 0966/2053] [docs] re-title docs, count forks --- docs/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/index.md b/docs/index.md index 2ca487a591a..ccc8f750eef 100644 --- a/docs/index.md +++ b/docs/index.md @@ -17,7 +17,7 @@ Networks are specified in simple config files, with no hard-coded parameters in Switching between CPU and GPU is as simple as setting a flag -- so models can be trained on a GPU machine, and then used on commodity clusters. **Readable & modifiable implementation** fosters active development. -In Caffe's first six months, it has been forked by over 300 developers on Github, and many have pushed significant changes. +In Caffe's first year, it has been forked by over 600 developers on Github, and many have pushed significant changes. **Speed** makes Caffe perfect for industry use. Caffe can process over **40M images per day** with a single NVIDIA K40 or Titan GPU\*. @@ -35,11 +35,11 @@ Consult performance [details](/performance_hardware.html). ## Documentation - [DIY Deep Learning for Vision with Caffe](https://docs.google.com/presentation/d/1UeKXVgRvvxg9OUdh_UiC5G71UMscNPlvArsWER41PsU/edit#slide=id.p)<br> -Caffe tutorial slides. -- [ACM MM paper](http://ucb-icsi-vision-group.github.io/caffe-paper/caffe.pdf)<br> -A 4-page report for the ACM Multimedia Open Source competition. -- [Caffe Tutorial](/tutorial)<br> -DIY deep learning with this hands-on tutorial to Caffe. +Tutorial presentation. +- [Tutorial Documentation](/tutorial)<br> +Practical guide and framework reference. +- [arXiv / ACM MM '14 paper](http://arxiv.org/abs/1408.5093)<br> +A 4-page report for the ACM Multimedia Open Source competition (arXiv:1408.5093v1). - [Installation instructions](/installation.html)<br> Tested on Ubuntu, Red Hat, OS X. * [Model Zoo](/model_zoo.html)<br> From ab94bea9ab54c1fea8c6d45d260c5973a388d745 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Mon, 20 Oct 2014 15:16:55 -0700 Subject: [PATCH 0967/2053] Update data_transformer.hpp Minor grammar fix in comments. --- include/caffe/data_transformer.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 5f08335d4a3..84ebba28125 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -37,7 +37,7 @@ class DataTransformer { * Datum containing the data to be transformed. * @param transformed_blob * This is destination blob. It can be part of top blob's data if - * set_cpu_data() is used See data_layer.cpp for an example. + * set_cpu_data() is used. See data_layer.cpp for an example. */ void Transform(const Datum& datum, Blob<Dtype>* transformed_blob); @@ -49,7 +49,7 @@ class DataTransformer { * A vector of Datum containing the data to be transformed. * @param transformed_blob * This is destination blob. It can be part of top blob's data if - * set_cpu_data() is used See memory_layer.cpp for an example. + * set_cpu_data() is used. See memory_layer.cpp for an example. */ void Transform(const vector<Datum> & datum_vector, Blob<Dtype>* transformed_blob); @@ -62,7 +62,7 @@ class DataTransformer { * cv::Mat containing the data to be transformed. * @param transformed_blob * This is destination blob. It can be part of top blob's data if - * set_cpu_data() is used See image_data_layer.cpp for an example. + * set_cpu_data() is used. See image_data_layer.cpp for an example. */ #ifndef OSX void Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob); From 85477b75f7411efa3bf97c2c2cfec403205b7ce6 Mon Sep 17 00:00:00 2001 From: Ryota Tomioka <tomioka@ttic.edu> Date: Tue, 21 Oct 2014 10:52:38 -0500 Subject: [PATCH 0968/2053] Forward declare boost::thread instead of including boost/thread.hpp in internal_thread.hpp. --- include/caffe/internal_thread.hpp | 11 ++++++++--- src/caffe/internal_thread.cpp | 6 ++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/include/caffe/internal_thread.hpp b/include/caffe/internal_thread.hpp index 9c24585b2cd..fec22a47c86 100644 --- a/include/caffe/internal_thread.hpp +++ b/include/caffe/internal_thread.hpp @@ -1,9 +1,14 @@ #ifndef CAFFE_INTERNAL_THREAD_HPP_ #define CAFFE_INTERNAL_THREAD_HPP_ -#include <boost/thread.hpp> #include "caffe/common.hpp" +/** + Forward declare boost::thread instead of including boost/thread.hpp + to avoid a boost/NVCC issues (#1009, #1010) on OSX. + */ +namespace boost { class thread; } + namespace caffe { /** @@ -22,7 +27,7 @@ class InternalThread { /** Will not return until the internal thread has exited. */ bool WaitForInternalThreadToExit(); - bool is_started() const { return thread_ != NULL && thread_->joinable(); } + bool is_started() const; protected: /* Implement this method in your subclass @@ -34,4 +39,4 @@ class InternalThread { } // namespace caffe -#endif +#endif // CAFFE_INTERNAL_THREAD_HPP_ diff --git a/src/caffe/internal_thread.cpp b/src/caffe/internal_thread.cpp index 62a4c1faee2..58772e36c23 100644 --- a/src/caffe/internal_thread.cpp +++ b/src/caffe/internal_thread.cpp @@ -1,3 +1,4 @@ +#include <boost/thread.hpp> #include "caffe/internal_thread.hpp" namespace caffe { @@ -6,6 +7,11 @@ InternalThread::~InternalThread() { WaitForInternalThreadToExit(); } +bool InternalThread::is_started() const { + return thread_.get() != NULL && thread_->joinable(); +} + + bool InternalThread::StartInternalThread() { if (!WaitForInternalThreadToExit()) { return false; From ce980cea21096f9961f2021b2992f2a46e93e552 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Tue, 21 Oct 2014 10:17:11 -0700 Subject: [PATCH 0969/2053] groom ignore - re-group general and Caffe ignores - ignore OS X files and Eclipse .settings as suggested by @cypof --- .gitignore | 56 +++++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index fa279f9071b..c27c7a6a5f6 100644 --- a/.gitignore +++ b/.gitignore @@ -26,21 +26,26 @@ # Compiled MATLAB *.mex* -# build, distribute, and bins -build -.build_debug/* -.build_release/* -distribute/* -*.testbin -*.bin -python/caffe/proto/ +# IPython notebook checkpoints +.ipynb_checkpoints + +# CMake generated files +*.gen.cmake # Editor temporaries *.swp *~ -# IPython notebook checkpoints -.ipynb_checkpoints +# Sublime Text settings +*.sublime-workspace +*.sublime-project + +# Eclipse Project settings +*.*project +.settings + +# OSX dir files +.DS_Store ## Caffe @@ -58,13 +63,14 @@ models/* *leveldb *lmdb -# LevelDB files -*.sst -*.ldb -LOCK -LOG* -CURRENT -MANIFEST-* +# build, distribute, and bins (+ python proto bindings) +build +.build_debug/* +.build_release/* +distribute/* +*.testbin +*.bin +python/caffe/proto/ # Generated documentation docs/_site @@ -73,12 +79,10 @@ _site doxygen docs/dev -# Sublime Text settings -*.sublime-workspace -*.sublime-project - -# Eclipse Project settings -*.*project - -# CMake generated files -*.gen.cmake +# LevelDB files +*.sst +*.ldb +LOCK +LOG* +CURRENT +MANIFEST-* From 6d183710c2fbeb7b227cb0444d318f476cd18fd3 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Tue, 21 Oct 2014 10:19:56 -0700 Subject: [PATCH 0970/2053] make release, debug build dirs configurable in Makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 26d5964cacc..1e70c2d5c6e 100644 --- a/Makefile +++ b/Makefile @@ -4,8 +4,8 @@ CONFIG_FILE := Makefile.config include $(CONFIG_FILE) BUILD_DIR_LINK := $(BUILD_DIR) -RELEASE_BUILD_DIR := .$(BUILD_DIR)_release -DEBUG_BUILD_DIR := .$(BUILD_DIR)_debug +RELEASE_BUILD_DIR ?= .$(BUILD_DIR)_release +DEBUG_BUILD_DIR ?= .$(BUILD_DIR)_debug DEBUG ?= 0 ifeq ($(DEBUG), 1) From 1ca3b01610d8431497671fbb5ab98a83777f909d Mon Sep 17 00:00:00 2001 From: Martin Baeuml <baeuml@kit.edu> Date: Wed, 22 Oct 2014 10:19:44 +0200 Subject: [PATCH 0971/2053] Minor whitespace fix in logging message in HDF5 output layer --- src/caffe/layers/hdf5_output_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index b8210e2ee2a..4a72a18aa12 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -30,7 +30,7 @@ HDF5OutputLayer<Dtype>::~HDF5OutputLayer<Dtype>() { template <typename Dtype> void HDF5OutputLayer<Dtype>::SaveBlobs() { // TODO: no limit on the number of blobs - LOG(INFO) << "Saving HDF5 file" << file_name_; + LOG(INFO) << "Saving HDF5 file " << file_name_; CHECK_EQ(data_blob_.num(), label_blob_.num()) << "data blob and label blob must have the same batch size"; hdf5_save_nd_dataset(file_id_, HDF5_DATA_DATASET_NAME, data_blob_); From 0b6c663d9bcc7a77a4f63e7a5bb98ec18e18041f Mon Sep 17 00:00:00 2001 From: Rohit <rgirdhar@andrew.cmu.edu> Date: Fri, 31 Oct 2014 21:43:44 -0400 Subject: [PATCH 0972/2053] documentation bug --- examples/cifar10/readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/cifar10/readme.md b/examples/cifar10/readme.md index a329b49c5ea..4a95cee9e8f 100644 --- a/examples/cifar10/readme.md +++ b/examples/cifar10/readme.md @@ -24,8 +24,8 @@ You will first need to download and convert the data format from the [CIFAR-10 w cd $CAFFE_ROOT/data/cifar10 ./get_cifar10.sh - cd $CAFFE_ROOT/examples/cifar10 - ./create_cifar10.sh + cd $CAFFE_ROOT + ./examples/cifar10/create_cifar10.sh If it complains that `wget` or `gunzip` are not installed, you need to install them respectively. After running the script there should be the dataset, `./cifar10-leveldb`, and the data set image mean `./mean.binaryproto`. @@ -39,8 +39,8 @@ Training and Testing the "Quick" Model Training the model is simple after you have written the network definition protobuf and solver protobuf files (refer to [MNIST Tutorial](../examples/mnist.html)). Simply run `train_quick.sh`, or the following command directly: - cd $CAFFE_ROOT/examples/cifar10 - ./train_quick.sh + cd $CAFFE_ROOT + ./examples/cifar10/train_quick.sh `train_quick.sh` is a simple script, so have a look inside. The main tool for training is `caffe` with the `train` action, and the solver protobuf text file as its argument. From f7625e3632fd18ef0ebeafbe9c807990582618dc Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Wed, 5 Nov 2014 13:36:00 -0800 Subject: [PATCH 0973/2053] Prevent Matlab on OS X from crashing on error Replace CHECK() and LOG(FATAL) with LOG(ERROR) and mexErrMsgTxt A failed CHECK() or LOG(FATAL) causes Matlab to crash on OS X 10.9 with Matlab 2014a. --- matlab/caffe/matcaffe.cpp | 71 +++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index fc047585cfe..3de0f02e1eb 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -3,6 +3,7 @@ // caffe::Caffe functions so that one could easily call it from matlab. // Note that for matlab, we will simply use float as the data type. +#include <sstream> #include <string> #include <vector> @@ -12,6 +13,12 @@ #define MEX_ARGS int nlhs, mxArray **plhs, int nrhs, const mxArray **prhs +// Log and throw a Mex error +inline void mex_error(const std::string &msg) { + LOG(ERROR) << msg; + mexErrMsgTxt(msg.c_str()); +} + using namespace caffe; // NOLINT(build/namespaces) // The pointer to the internal caffe::Net instance @@ -46,14 +53,22 @@ static int init_key = -2; static mxArray* do_forward(const mxArray* const bottom) { vector<Blob<float>*>& input_blobs = net_->input_blobs(); - CHECK_EQ(static_cast<unsigned int>(mxGetDimensions(bottom)[0]), - input_blobs.size()); + if (static_cast<unsigned int>(mxGetDimensions(bottom)[0]) != + input_blobs.size()) { + mex_error("Invalid input size"); + } for (unsigned int i = 0; i < input_blobs.size(); ++i) { const mxArray* const elem = mxGetCell(bottom, i); - CHECK(mxIsSingle(elem)) - << "MatCaffe require single-precision float point data"; - CHECK_EQ(mxGetNumberOfElements(elem), input_blobs[i]->count()) - << "MatCaffe input size does not match the input size of the network"; + if (!mxIsSingle(elem)) { + mex_error("MatCaffe require single-precision float point data"); + } + if (mxGetNumberOfElements(elem) != input_blobs[i]->count()) { + std::string error_msg; + error_msg += "MatCaffe input size does not match the input size "; + error_msg += "of the network"; + mex_error(error_msg); + } + const float* const data_ptr = reinterpret_cast<const float* const>(mxGetPr(elem)); switch (Caffe::mode()) { @@ -66,7 +81,7 @@ static mxArray* do_forward(const mxArray* const bottom) { input_blobs[i]->mutable_gpu_data()); break; default: - LOG(FATAL) << "Unknown Caffe mode."; + mex_error("Unknown Caffe mode"); } // switch (Caffe::mode()) } const vector<Blob<float>*>& output_blobs = net_->ForwardPrefilled(); @@ -89,7 +104,7 @@ static mxArray* do_forward(const mxArray* const bottom) { data_ptr); break; default: - LOG(FATAL) << "Unknown Caffe mode."; + mex_error("Unknown Caffe mode"); } // switch (Caffe::mode()) } @@ -99,8 +114,10 @@ static mxArray* do_forward(const mxArray* const bottom) { static mxArray* do_backward(const mxArray* const top_diff) { vector<Blob<float>*>& output_blobs = net_->output_blobs(); vector<Blob<float>*>& input_blobs = net_->input_blobs(); - CHECK_EQ(static_cast<unsigned int>(mxGetDimensions(top_diff)[0]), - output_blobs.size()); + if (static_cast<unsigned int>(mxGetDimensions(top_diff)[0]) != + output_blobs.size()) { + mex_error("Invalid input size"); + } // First, copy the output diff for (unsigned int i = 0; i < output_blobs.size(); ++i) { const mxArray* const elem = mxGetCell(top_diff, i); @@ -116,7 +133,7 @@ static mxArray* do_backward(const mxArray* const top_diff) { output_blobs[i]->mutable_gpu_diff()); break; default: - LOG(FATAL) << "Unknown Caffe mode."; + mex_error("Unknown Caffe mode"); } // switch (Caffe::mode()) } // LOG(INFO) << "Start"; @@ -139,7 +156,7 @@ static mxArray* do_backward(const mxArray* const top_diff) { caffe_copy(input_blobs[i]->count(), input_blobs[i]->gpu_diff(), data_ptr); break; default: - LOG(FATAL) << "Unknown Caffe mode."; + mex_error("Unknown Caffe mode"); } // switch (Caffe::mode()) } @@ -216,7 +233,7 @@ static mxArray* do_get_weights() { weights_ptr); break; default: - LOG(FATAL) << "Unknown caffe mode: " << Caffe::mode(); + mex_error("Unknown Caffe mode"); } } } @@ -247,8 +264,9 @@ static void set_phase_test(MEX_ARGS) { static void set_device(MEX_ARGS) { if (nrhs != 1) { - LOG(ERROR) << "Only given " << nrhs << " arguments"; - mexErrMsgTxt("Wrong number of arguments"); + ostringstream error_msg; + error_msg << "Expected 1 argument, got " << nrhs; + mex_error(error_msg.str()); } int device_id = static_cast<int>(mxGetScalar(prhs[0])); @@ -261,8 +279,9 @@ static void get_init_key(MEX_ARGS) { static void init(MEX_ARGS) { if (nrhs != 2) { - LOG(ERROR) << "Only given " << nrhs << " arguments"; - mexErrMsgTxt("Wrong number of arguments"); + ostringstream error_msg; + error_msg << "Expected 2 arguments, got " << nrhs; + mex_error(error_msg.str()); } char* param_file = mxArrayToString(prhs[0]); @@ -291,8 +310,9 @@ static void reset(MEX_ARGS) { static void forward(MEX_ARGS) { if (nrhs != 1) { - LOG(ERROR) << "Only given " << nrhs << " arguments"; - mexErrMsgTxt("Wrong number of arguments"); + ostringstream error_msg; + error_msg << "Expected 1 argument, got " << nrhs; + mex_error(error_msg.str()); } plhs[0] = do_forward(prhs[0]); @@ -300,8 +320,9 @@ static void forward(MEX_ARGS) { static void backward(MEX_ARGS) { if (nrhs != 1) { - LOG(ERROR) << "Only given " << nrhs << " arguments"; - mexErrMsgTxt("Wrong number of arguments"); + ostringstream error_msg; + error_msg << "Expected 1 argument, got " << nrhs; + mex_error(error_msg.str()); } plhs[0] = do_backward(prhs[0]); @@ -374,8 +395,7 @@ static handler_registry handlers[] = { void mexFunction(MEX_ARGS) { mexLock(); // Avoid clearing the mex file. if (nrhs == 0) { - LOG(ERROR) << "No API command given"; - mexErrMsgTxt("An API command is requires"); + mex_error("No API command given"); return; } @@ -391,8 +411,9 @@ void mexFunction(MEX_ARGS) { } } if (!dispatched) { - LOG(ERROR) << "Unknown command `" << cmd << "'"; - mexErrMsgTxt("API command not recognized"); + ostringstream error_msg; + error_msg << "Unknown command '" << cmd << "'"; + mex_error(error_msg.str()); } mxFree(cmd); } From f29d4bd75423e4d9c91d7a26e092ab687ab87e97 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq@google.com> Date: Fri, 7 Nov 2014 17:17:49 -0800 Subject: [PATCH 0974/2053] clean incorrect relu test code --- src/caffe/test/test_neuron_layer.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 34955c3af63..89db53a6979 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -1,6 +1,7 @@ #include <cstring> #include <vector> +#include "google/protobuf/text_format.h" #include "gtest/gtest.h" #include "caffe/blob.hpp" @@ -152,7 +153,8 @@ TYPED_TEST(NeuronLayerTest, TestReLUGradient) { TYPED_TEST(NeuronLayerTest, TestReLUWithNegativeSlope) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - layer_param.ParseFromString("relu_param{negative_slope:0.01}"); + CHECK(google::protobuf::TextFormat::ParseFromString( + "relu_param { negative_slope: 0.01 }", &layer_param)); ReLULayer<Dtype> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); @@ -160,15 +162,19 @@ TYPED_TEST(NeuronLayerTest, TestReLUWithNegativeSlope) { const Dtype* bottom_data = this->blob_bottom_->cpu_data(); const Dtype* top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_GE(top_data[i], 0.); - EXPECT_TRUE(top_data[i] == 0 || top_data[i] == bottom_data[i]); + if (top_data[i] >= 0) { + EXPECT_FLOAT_EQ(top_data[i], bottom_data[i]); + } else { + EXPECT_FLOAT_EQ(top_data[i], bottom_data[i] * 0.01); + } } } TYPED_TEST(NeuronLayerTest, TestReLUGradientWithNegativeSlope) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; - layer_param.ParseFromString("relu_param{negative_slope:0.01}"); + CHECK(google::protobuf::TextFormat::ParseFromString( + "relu_param { negative_slope: 0.01 }", &layer_param)); ReLULayer<Dtype> layer(layer_param); GradientChecker<Dtype> checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, @@ -437,7 +443,8 @@ TYPED_TEST(CuDNNNeuronLayerTest, TestReLUGradientCuDNN) { TYPED_TEST(CuDNNNeuronLayerTest, TestReLUWithNegativeSlopeCuDNN) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; - layer_param.ParseFromString("relu_param{negative_slope:0.01}"); + CHECK(google::protobuf::TextFormat::ParseFromString( + "relu_param { negative_slope: 0.01 }", &layer_param)); CuDNNReLULayer<TypeParam> layer(layer_param); layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); @@ -453,7 +460,8 @@ TYPED_TEST(CuDNNNeuronLayerTest, TestReLUWithNegativeSlopeCuDNN) { TYPED_TEST(CuDNNNeuronLayerTest, TestReLUGradientWithNegativeSlopeCuDNN) { Caffe::set_mode(Caffe::GPU); LayerParameter layer_param; - layer_param.ParseFromString("relu_param{negative_slope:0.01}"); + CHECK(google::protobuf::TextFormat::ParseFromString( + "relu_param { negative_slope: 0.01 }", &layer_param)); CuDNNReLULayer<TypeParam> layer(layer_param); GradientChecker<TypeParam> checker(1e-2, 1e-3, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, From 9ff22ec5283182198c2db6a4c1b5a5a9dceb1ead Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq@google.com> Date: Fri, 7 Nov 2014 17:42:43 -0800 Subject: [PATCH 0975/2053] relax benchmark milliseconds threshold --- src/caffe/test/test_benchmark.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/caffe/test/test_benchmark.cpp b/src/caffe/test/test_benchmark.cpp index dbbee08d667..43aaa639b3c 100644 --- a/src/caffe/test/test_benchmark.cpp +++ b/src/caffe/test/test_benchmark.cpp @@ -9,6 +9,8 @@ namespace caffe { +const float kMillisecondsThreshold = 30; + template <typename TypeParam> class BenchmarkTest : public MultiDeviceTest<TypeParam> {}; @@ -63,8 +65,8 @@ TYPED_TEST(BenchmarkTest, TestTimerMilliSeconds) { EXPECT_FALSE(timer.has_run_at_least_once()); timer.Start(); usleep(300 * 1000); - EXPECT_GE(timer.MilliSeconds(), 290); - EXPECT_LE(timer.MilliSeconds(), 310); + EXPECT_GE(timer.MilliSeconds(), 300 - kMillisecondsThreshold); + EXPECT_LE(timer.MilliSeconds(), 300 + kMillisecondsThreshold); EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_TRUE(timer.has_run_at_least_once()); @@ -78,8 +80,8 @@ TYPED_TEST(BenchmarkTest, TestTimerSeconds) { EXPECT_FALSE(timer.has_run_at_least_once()); timer.Start(); usleep(300 * 1000); - EXPECT_GE(timer.Seconds(), 0.290); - EXPECT_LE(timer.Seconds(), 0.310); + EXPECT_GE(timer.Seconds(), 0.3 - kMillisecondsThreshold / 1000.); + EXPECT_LE(timer.Seconds(), 0.3 + kMillisecondsThreshold / 1000.); EXPECT_TRUE(timer.initted()); EXPECT_FALSE(timer.running()); EXPECT_TRUE(timer.has_run_at_least_once()); From 1fe4b81a4147d42b4a7042bb82b06f7b41fd2d99 Mon Sep 17 00:00:00 2001 From: Yangqing Jia <jiayq84@gmail.com> Date: Thu, 13 Nov 2014 22:05:42 -0800 Subject: [PATCH 0976/2053] fix relu cudnn test bug --- src/caffe/test/test_neuron_layer.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_neuron_layer.cpp b/src/caffe/test/test_neuron_layer.cpp index 89db53a6979..b19a5abdcdf 100644 --- a/src/caffe/test/test_neuron_layer.cpp +++ b/src/caffe/test/test_neuron_layer.cpp @@ -452,8 +452,11 @@ TYPED_TEST(CuDNNNeuronLayerTest, TestReLUWithNegativeSlopeCuDNN) { const TypeParam* bottom_data = this->blob_bottom_->cpu_data(); const TypeParam* top_data = this->blob_top_->cpu_data(); for (int i = 0; i < this->blob_bottom_->count(); ++i) { - EXPECT_GE(top_data[i], 0.); - EXPECT_TRUE(top_data[i] == 0 || top_data[i] == bottom_data[i]); + if (top_data[i] >= 0) { + EXPECT_FLOAT_EQ(top_data[i], bottom_data[i]); + } else { + EXPECT_FLOAT_EQ(top_data[i], bottom_data[i] * 0.01); + } } } From 51a09de81d10714d0d1a03e4eab028e994cb82e1 Mon Sep 17 00:00:00 2001 From: Pavel Campr <pavel@campr.cz> Date: Fri, 14 Nov 2014 08:31:34 +0100 Subject: [PATCH 0977/2053] fixed filename in build_docs.sh --- scripts/build_docs.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build_docs.sh b/scripts/build_docs.sh index f8ace0ead43..0e28bd71631 100755 --- a/scripts/build_docs.sh +++ b/scripts/build_docs.sh @@ -3,7 +3,7 @@ PORT=${1:-4000} -echo "usage: build.sh [port]" +echo "usage: build_docs.sh [port]" # Find the docs dir, no matter where the script is called ROOT_DIR="$( cd "$(dirname "$0")"/.. ; pwd -P )" From 8271e6bd0cccd8aa8b878c1b9cafdd965a09ec9b Mon Sep 17 00:00:00 2001 From: Michele Pratusevich <michele.pratusevich@gmail.com> Date: Tue, 18 Nov 2014 17:47:13 -0500 Subject: [PATCH 0978/2053] Update python requirements.txt You need pyyaml to run the download scripts for getting the BVLC model references. --- python/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/python/requirements.txt b/python/requirements.txt index 4c35dcb0b6f..908373bf452 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -13,3 +13,4 @@ pandas>=0.12.0 python-dateutil>=1.4,<2 protobuf>=2.5.0 python-gflags>=2.0 +pyyaml>=3.10 From dbb6a2054651cbd0a5058d45a27575b9de41b5a5 Mon Sep 17 00:00:00 2001 From: Sean Bell <sbell@cs.cornell.edu> Date: Wed, 19 Nov 2014 17:25:08 -0500 Subject: [PATCH 0979/2053] fixed tanh to not return NaN for input values outside the range [-40, 40] --- src/caffe/layers/tanh_layer.cpp | 4 +- src/caffe/layers/tanh_layer.cu | 3 +- src/caffe/test/test_tanh_layer.cpp | 102 +++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 src/caffe/test/test_tanh_layer.cpp diff --git a/src/caffe/layers/tanh_layer.cpp b/src/caffe/layers/tanh_layer.cpp index 18413d9b181..ee5ed773c74 100644 --- a/src/caffe/layers/tanh_layer.cpp +++ b/src/caffe/layers/tanh_layer.cpp @@ -14,11 +14,9 @@ void TanHLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { const Dtype* bottom_data = bottom[0]->cpu_data(); Dtype* top_data = top[0]->mutable_cpu_data(); - Dtype exp2x; const int count = bottom[0]->count(); for (int i = 0; i < count; ++i) { - exp2x = exp(2 * bottom_data[i]); - top_data[i] = (exp2x - Dtype(1)) / (exp2x + Dtype(1)); + top_data[i] = tanh(bottom_data[i]); } } diff --git a/src/caffe/layers/tanh_layer.cu b/src/caffe/layers/tanh_layer.cu index f1a0fc88bfd..ccd6e63ee7c 100644 --- a/src/caffe/layers/tanh_layer.cu +++ b/src/caffe/layers/tanh_layer.cu @@ -12,8 +12,7 @@ namespace caffe { template <typename Dtype> __global__ void TanHForward(const int n, const Dtype* in, Dtype* out) { CUDA_KERNEL_LOOP(index, n) { - Dtype exp2x = exp(2 * in[index]); - out[index] = (exp2x - Dtype(1)) / (exp2x + Dtype(1)); + out[index] = tanh(in[index]); } } diff --git a/src/caffe/test/test_tanh_layer.cpp b/src/caffe/test/test_tanh_layer.cpp new file mode 100644 index 00000000000..9a93e08e805 --- /dev/null +++ b/src/caffe/test/test_tanh_layer.cpp @@ -0,0 +1,102 @@ +#include <algorithm> +#include <vector> + +#include "gtest/gtest.h" + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" +#include "caffe/common_layers.hpp" + +#include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +namespace caffe { + +double tanh_naive(double x) { + if (x < -40) { + // avoid negative overflow + return -1; + } else if (x > 40) { + // avoid positive overflow + return 1; + } else { + // exact expression for tanh, which is unstable for large x + double exp2x = exp(2 * x); + return (exp2x - 1.0) / (exp2x + 1.0); + } +} + +template <typename TypeParam> +class TanHLayerTest : public MultiDeviceTest<TypeParam> { + typedef typename TypeParam::Dtype Dtype; + + protected: + TanHLayerTest() + : blob_bottom_(new Blob<Dtype>(2, 3, 4, 5)), + blob_top_(new Blob<Dtype>()) { + Caffe::set_random_seed(1701); + FillerParameter filler_param; + blob_bottom_vec_.push_back(blob_bottom_); + blob_top_vec_.push_back(blob_top_); + } + virtual ~TanHLayerTest() { delete blob_bottom_; delete blob_top_; } + + void TestForward(Dtype filler_std) { + FillerParameter filler_param; + filler_param.set_std(filler_std); + GaussianFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_bottom_); + + LayerParameter layer_param; + TanHLayer<Dtype> layer(layer_param); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); + // Now, check values + const Dtype* bottom_data = this->blob_bottom_->cpu_data(); + const Dtype* top_data = this->blob_top_->cpu_data(); + const Dtype min_precision = 1e-5; + for (int i = 0; i < this->blob_bottom_->count(); ++i) { + Dtype expected_value = tanh_naive(bottom_data[i]); + Dtype precision = std::max( + Dtype(std::abs(expected_value * Dtype(1e-4))), min_precision); + EXPECT_NEAR(expected_value, top_data[i], precision); + } + } + + void TestBackward(Dtype filler_std) { + FillerParameter filler_param; + filler_param.set_std(filler_std); + GaussianFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_bottom_); + + LayerParameter layer_param; + TanHLayer<Dtype> layer(layer_param); + GradientChecker<Dtype> checker(1e-2, 1e-2, 1701); + checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); + } + + Blob<Dtype>* const blob_bottom_; + Blob<Dtype>* const blob_top_; + vector<Blob<Dtype>*> blob_bottom_vec_; + vector<Blob<Dtype>*> blob_top_vec_; +}; + +TYPED_TEST_CASE(TanHLayerTest, TestDtypesAndDevices); + +TYPED_TEST(TanHLayerTest, TestTanH) { + this->TestForward(1.0); +} + +TYPED_TEST(TanHLayerTest, TestTanHOverflow) { + // this will fail if tanh overflow is not properly handled + this->TestForward(10000.0); +} + +TYPED_TEST(TanHLayerTest, TestTanHGradient) { + this->TestBackward(1.0); +} + +} // namespace caffe From cb3eb31753cdd9ee2f9aa0f71c53bf2000ea5cfd Mon Sep 17 00:00:00 2001 From: Sean Bell <sbell@cs.cornell.edu> Date: Wed, 19 Nov 2014 23:21:53 -0500 Subject: [PATCH 0980/2053] Fixed header order to satisfy linter --- src/caffe/test/test_tanh_layer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/caffe/test/test_tanh_layer.cpp b/src/caffe/test/test_tanh_layer.cpp index 9a93e08e805..5dc92832fc8 100644 --- a/src/caffe/test/test_tanh_layer.cpp +++ b/src/caffe/test/test_tanh_layer.cpp @@ -5,9 +5,8 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" -#include "caffe/filler.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/common_layers.hpp" +#include "caffe/filler.hpp" #include "caffe/test/test_caffe_main.hpp" #include "caffe/test/test_gradient_check_util.hpp" From 9443c4417527d8a07f60410a52dc87d75f7304f5 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 22 Nov 2014 11:59:07 -0800 Subject: [PATCH 0981/2053] in SoftmaxLossLayer, check label >= 0 in addition to upper bound --- src/caffe/layers/softmax_loss_layer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 35033b67c21..c4358731753 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -44,6 +44,7 @@ void SoftmaxWithLossLayer<Dtype>::Forward_cpu( for (int i = 0; i < num; ++i) { for (int j = 0; j < spatial_dim; j++) { const int label_value = static_cast<int>(label[i * spatial_dim + j]); + CHECK_GE(label_value, 0); CHECK_GT(dim, label_value * spatial_dim); loss -= log(std::max(prob_data[i * dim + label_value * spatial_dim + j], From 33eb36e4034a0db92af8b08dc0a9217d46ba531b Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sun, 23 Nov 2014 17:58:24 -0800 Subject: [PATCH 0982/2053] use DCHECK in SoftmaxLossLayer so that bounds checking has no perf penalty without DEBUG --- src/caffe/layers/softmax_loss_layer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index c4358731753..82c62f6a1bd 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -44,8 +44,8 @@ void SoftmaxWithLossLayer<Dtype>::Forward_cpu( for (int i = 0; i < num; ++i) { for (int j = 0; j < spatial_dim; j++) { const int label_value = static_cast<int>(label[i * spatial_dim + j]); - CHECK_GE(label_value, 0); - CHECK_GT(dim, label_value * spatial_dim); + DCHECK_GE(label_value, 0); + DCHECK_GT(dim, label_value * spatial_dim); loss -= log(std::max(prob_data[i * dim + label_value * spatial_dim + j], Dtype(FLT_MIN))); From 8009436671ec01823fe465283b111141ef28e8f4 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sun, 30 Nov 2014 21:34:29 -0800 Subject: [PATCH 0983/2053] remove redundant code in ConvolutionLayer::Reshape --- src/caffe/layers/conv_layer.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 65ff9167128..0a032025bfb 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -126,9 +126,6 @@ void ConvolutionLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, // it goes lazily unused to save memory. col_buffer_.Reshape( 1, channels_ * kernel_h_ * kernel_w_, height_out_, width_out_); - for (int top_id = 0; top_id < top.size(); ++top_id) { - top[top_id]->Reshape(num_, num_output_, height_out_, width_out_); - } // Set up the all ones "bias multiplier" for adding biases by BLAS if (bias_term_) { bias_multiplier_.Reshape(1, 1, 1, N_); From 873a860ade3a4124bb5a9b34becf0858197a11f8 Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Tue, 2 Dec 2014 11:20:58 -0800 Subject: [PATCH 0984/2053] Better instructions for updating Homebrew after modifying formulae Previous instructions glossed over how to deal with OpenCV-related update problems --- docs/installation.md | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 207e17d1539..c667cd8ce01 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -208,28 +208,39 @@ If you're not using Anaconda, include `hdf5` in the list above. Aborting Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master -One solution is to commit your changes to a separate Homebrew branch, run `brew update`, and rebase your changes onto the updated master, as follows: +One solution is to commit your changes to a separate Homebrew branch, run `brew update`, and rebase your changes onto the updated master. You'll have to do this both for the main Homebrew repository in `/usr/local/` and the Homebrew science repository that contains OpenCV in `/usr/local/Library/Taps/homebrew/homebrew-science`, as follows: cd /usr/local git checkout -b caffe git add . git commit -m "Update Caffe dependencies to use libstdc++" + cd /usr/local/Library/Taps/homebrew/homebrew-science + git checkout -b caffe + git add . + git commit -m "Update Caffe dependencies" + +Then, whenever you want to update homebrew, switch back to the master branches, do the update, rebase the caffe branches onto master and fix any conflicts: + + # Switch batch to homebrew master branches + cd /usr/local + git checkout master + cd /usr/local/Library/Taps/homebrew/homebrew-science git checkout master + + # Update homebrew; hopefully this works without errors! brew update + + # Switch back to the caffe branches with the forumlae that you modified earlier + cd /usr/local git rebase master caffe - # Resolve any merge conflicts here - git checkout caffe - -At this point, you should be running the latest Homebrew packages and your Caffe-related modifications will remain in place. You may still get the following error: - - $ brew update - error: Your local changes to the following files would be overwritten by merge: - opencv.rb - Please, commit your changes or stash them before you can merge. - Aborting - Error: Failed to update tap: homebrew/science + # Fix any merge conflicts and commit to caffe branch + cd /usr/local/Library/Taps/homebrew/homebrew-science + git rebase master caffe + # Fix any merge conflicts and commit to caffe branch + + # Done! -but non-OpenCV packages will still update as expected. +At this point, you should be running the latest Homebrew packages and your Caffe-related modifications will remain in place. #### Windows From a5b7b2d7ede8dd37f4e6bdcf87ca3e71f78633e0 Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Wed, 3 Dec 2014 14:30:14 -0800 Subject: [PATCH 0985/2053] Update mean file help Numpy array dimensions should be [Channels x Height x Width], NOT [Height x Width x Channels] If an image mean file is supplied with channels as the last dimension, classify.py throws errors like: ValueError: operands could not be broadcast together with shapes (3,227,227) (256,0,225) (3,227,227) --- python/classify.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/classify.py b/python/classify.py index 873b5e38f19..d435a572266 100755 --- a/python/classify.py +++ b/python/classify.py @@ -60,8 +60,8 @@ def main(argv): "--mean_file", default=os.path.join(pycaffe_dir, 'caffe/imagenet/ilsvrc_2012_mean.npy'), - help="Data set image mean of H x W x K dimensions (numpy array). " + - "Set to '' for no mean subtraction." + help="Data set image mean of [Channels x Height x Width] dimensions " + + "(numpy array). Set to '' for no mean subtraction." ) parser.add_argument( "--input_scale", From e8dee350ade66a712144aebc8b5f4a8c989d43c0 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 5 Dec 2014 08:06:40 -0800 Subject: [PATCH 0986/2053] compile for compute capability 5.0 --- Makefile.config.example | 9 ++++----- src/caffe/CMakeLists.txt | 4 +++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Makefile.config.example b/Makefile.config.example index 5cb0b243aca..18798ed2d06 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -17,15 +17,14 @@ CUDA_DIR := /usr/local/cuda # "sudo apt-get install nvidia-cuda-toolkit" then use this instead: # CUDA_DIR := /usr -# CUDA architecture setting: going with all of them (up to CUDA 5.5 compatible). -# For the latest architecture, you need to install CUDA >= 6.0 and uncomment -# the *_50 lines below. +# CUDA architecture setting: going with all of them. +# For CUDA < 6.0, comment the *_50 lines for compatibility. CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \ -gencode arch=compute_20,code=sm_21 \ -gencode arch=compute_30,code=sm_30 \ -gencode arch=compute_35,code=sm_35 \ - #-gencode arch=compute_50,code=sm_50 \ - #-gencode arch=compute_50,code=compute_50 + -gencode arch=compute_50,code=sm_50 \ + -gencode arch=compute_50,code=compute_50 # BLAS choice: # atlas for ATLAS (default) diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index 86c7c7eb4a3..dc6b5a2baac 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -84,8 +84,10 @@ if(NOT CPU_ONLY) -gencode arch=compute_20,code=sm_21 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_35,code=sm_35 + -gencode arch=compute_50,code=sm_50 + -gencode arch=compute_50,code=compute_50 ) - + # https://github.com/ComputationalRadiationPhysics/picongpu/blob/master/src/picongpu/CMakeLists.txt # work-arounds if(Boost_VERSION EQUAL 105500) From fb298ddd4ef13375c953a201422293f33da44300 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sun, 7 Dec 2014 03:06:35 -0800 Subject: [PATCH 0987/2053] clarify #endif comment --- include/caffe/util/math_functions.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/util/math_functions.hpp b/include/caffe/util/math_functions.hpp index 12823f8da0c..d3ecf5875fa 100644 --- a/include/caffe/util/math_functions.hpp +++ b/include/caffe/util/math_functions.hpp @@ -267,7 +267,7 @@ void caffe_gpu_##name<double>(const int n, const double* x, double* y) { \ n, x, y); \ } -#endif // CPU_ONLY +#endif // !CPU_ONLY } // namespace caffe From 9b78bcffbb515b39228f2d483dbfd596410d5f59 Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Thu, 30 Oct 2014 15:51:14 -0700 Subject: [PATCH 0988/2053] Created parse_log.py, competitor to parse_log.sh --- tools/extra/extract_seconds.py | 33 ++++++-- tools/extra/parse_log.py | 140 +++++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+), 6 deletions(-) create mode 100755 tools/extra/parse_log.py diff --git a/tools/extra/extract_seconds.py b/tools/extra/extract_seconds.py index f791afa32a2..591a51f96bd 100755 --- a/tools/extra/extract_seconds.py +++ b/tools/extra/extract_seconds.py @@ -18,18 +18,39 @@ def extract_datetime_from_line(line, year): dt = datetime.datetime(year, month, day, hour, minute, second, microsecond) return dt + +def get_log_created_year(input_file): + """Get year from log file system timestamp + """ + + log_created_time = os.path.getctime(input_file) + log_created_year = datetime.datetime.fromtimestamp(log_created_time).year + return log_created_year + + +def get_start_time(line_iterable, year): + """Find start time from group of lines + """ + + start_datetime = None + for line in line_iterable: + line = line.strip() + if line.find('Solving') != -1: + start_datetime = extract_datetime_from_line(line, year) + break + return start_datetime + + def extract_seconds(input_file, output_file): with open(input_file, 'r') as f: lines = f.readlines() - log_created_time = os.path.getctime(input_file) - log_created_year = datetime.datetime.fromtimestamp(log_created_time).year - start_time_found = False + log_created_year = get_log_created_year(input_file) + start_datetime = get_start_time(lines, log_created_year) + assert start_datetime, 'Start time not found' + out = open(output_file, 'w') for line in lines: line = line.strip() - if not start_time_found and line.find('Solving') != -1: - start_time_found = True - start_datetime = extract_datetime_from_line(line, log_created_year) if line.find('Iteration') != -1: dt = extract_datetime_from_line(line, log_created_year) elapsed_seconds = (dt - start_datetime).total_seconds() diff --git a/tools/extra/parse_log.py b/tools/extra/parse_log.py new file mode 100755 index 00000000000..dca7999f1bc --- /dev/null +++ b/tools/extra/parse_log.py @@ -0,0 +1,140 @@ +#!/usr/bin/env python + +""" +Parse training log + +Competitor to parse_log.sh +""" + +import os +import re +import extract_seconds +import argparse + + +def get_line_type(line): + """Return either 'test' or 'train depending on line type + """ + + line_type = None + if line.find('Train') != -1: + line_type = 'train' + elif line.find('Test') != -1: + line_type = 'test' + return line_type + + +def parse_log(path_to_log): + """Parse log file + """ + + re_iteration = re.compile('Iteration (\d+)') + re_accuracy = re.compile('output #\d+: accuracy = ([\.\d]+)') + re_loss = re.compile('output #\d+: loss = ([\.\d]+)') + re_lr = re.compile('lr = ([\.\d]+)') + + # Pick out lines of interest + iteration = -1 + test_accuracy = -1 + learning_rate = float('NaN') + train_list = [] + test_list = [] + + logfile_year = extract_seconds.get_log_created_year(path_to_log) + with open(path_to_log) as f: + start_time = extract_seconds.get_start_time(f, logfile_year) + + for line in f: + iteration_match = re_iteration.search(line) + if iteration_match: + iteration = float(iteration_match.group(1)) + if iteration == -1: + # Only look for other stuff if we've found the first iteration + continue + + time = extract_seconds.extract_datetime_from_line(line, + logfile_year) + seconds = (time - start_time).total_seconds() + + lr_match = re_lr.search(line) + if lr_match: + learning_rate = float(lr_match.group(1)) + + accuracy_match = re_accuracy.search(line) + if accuracy_match: + test_accuracy = float(accuracy_match.group(1)) + + loss_match = re_loss.search(line) + if loss_match: + loss = float(loss_match.group(1)) + line_type = get_line_type(line) + assert line_type, ('Failed to determine line type for line: ' + + line) + if line_type == 'test': + # NOTE: we assume that accuracy always comes right before + # loss for test data + test_list.append((iteration, seconds, test_accuracy, loss)) + elif line_type == 'train': + train_list.append((iteration, seconds, loss, learning_rate)) + + return train_list, test_list + + +def save_csv_files(logfile_path, output_dir, train_list, test_list, + verbose=False): + """Save CSV files to output_dir + + If the input log file is, e.g., caffe.INFO, the names will be + caffe.INFO.train and caffe.INFO.test + """ + + log_basename = os.path.basename(logfile_path) + train_filename = os.path.join(output_dir, log_basename + '.train') + write_csv(train_filename, train_list, '%d,%f,%f,%f', + 'NumIters,Seconds,TrainingLoss,LearningRate', verbose) + + test_filename = os.path.join(output_dir, log_basename + '.test') + write_csv(test_filename, test_list, '%d,%f,%f,%f', + 'NumIters,Seconds,TestAccuracy,TestLoss', verbose) + + +def write_csv(output_filename, list_of_tuples, format_string, header, + verbose=False): + """Write a CSV file + """ + with open(output_filename, 'w') as f: + f.write(header + '\n') + for row in list_of_tuples: + line = format_string % row + f.write(line + '\n') + if verbose: + print 'Wrote %s' % output_filename + + +def parse_args(): + description = ('Parse a Caffe training log into two CSV files ' + 'representing training and testing information') + parser = argparse.ArgumentParser(description=description) + + parser.add_argument('logfile_path', + help='Path to log file') + + parser.add_argument('output_dir', + help='Directory in which to place output CSV files') + + parser.add_argument('--verbose', + action='store_true', + help='Print some extra info (e.g., output filenames)') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + train_list, test_list = parse_log(args.logfile_path) + save_csv_files(args.logfile_path, args.output_dir, train_list, test_list) + + +if __name__ == '__main__': + main() From f954c6bea18e7c69520ee4c962b9b263c18a9769 Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Fri, 31 Oct 2014 10:24:07 -0700 Subject: [PATCH 0989/2053] Take train loss from `Iteration N, loss = X` lines Was previously using `Train net output #M: loss = X` lines, but there may not be exactly one of those (e.g., for GoogLeNet, which has multiple loss layers); I believe that `Iteration N, loss = X` is the aggregated loss. If there's only one loss layer, these two values will be equal and it won't matter. Otherwise, we presumably want to report the aggregated loss. --- tools/extra/parse_log.py | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/tools/extra/parse_log.py b/tools/extra/parse_log.py index dca7999f1bc..41fe54dc8a0 100755 --- a/tools/extra/parse_log.py +++ b/tools/extra/parse_log.py @@ -13,7 +13,7 @@ def get_line_type(line): - """Return either 'test' or 'train depending on line type + """Return either 'test' or 'train' depending on line type """ line_type = None @@ -30,7 +30,8 @@ def parse_log(path_to_log): re_iteration = re.compile('Iteration (\d+)') re_accuracy = re.compile('output #\d+: accuracy = ([\.\d]+)') - re_loss = re.compile('output #\d+: loss = ([\.\d]+)') + re_train_loss = re.compile('Iteration \d+, loss = ([\.\d]+)') + re_output_loss = re.compile('output #\d+: loss = ([\.\d]+)') re_lr = re.compile('lr = ([\.\d]+)') # Pick out lines of interest @@ -61,21 +62,23 @@ def parse_log(path_to_log): learning_rate = float(lr_match.group(1)) accuracy_match = re_accuracy.search(line) - if accuracy_match: + if accuracy_match and get_line_type(line) == 'test': test_accuracy = float(accuracy_match.group(1)) - loss_match = re_loss.search(line) - if loss_match: - loss = float(loss_match.group(1)) - line_type = get_line_type(line) - assert line_type, ('Failed to determine line type for line: ' + - line) - if line_type == 'test': - # NOTE: we assume that accuracy always comes right before - # loss for test data - test_list.append((iteration, seconds, test_accuracy, loss)) - elif line_type == 'train': - train_list.append((iteration, seconds, loss, learning_rate)) + train_loss_match = re_train_loss.search(line) + if train_loss_match: + train_loss = float(train_loss_match.group(1)) + train_list.append((iteration, seconds, train_loss, + learning_rate)) + + output_loss_match = re_output_loss.search(line) + if output_loss_match and get_line_type(line) == 'test': + test_loss = float(output_loss_match.group(1)) + # NOTE: we assume that (1) accuracy always comes right before + # loss for test data so the test_accuracy variable is already + # correctly populated and (2) there's one and only one output + # named "accuracy" for the test net + test_list.append((iteration, seconds, test_accuracy, test_loss)) return train_list, test_list @@ -113,7 +116,7 @@ def write_csv(output_filename, list_of_tuples, format_string, header, def parse_args(): description = ('Parse a Caffe training log into two CSV files ' - 'representing training and testing information') + 'containing training and testing information') parser = argparse.ArgumentParser(description=description) parser.add_argument('logfile_path', From bae916f74b03793c323edd679eaa0e665da0ec0b Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Sun, 2 Nov 2014 21:02:07 -0800 Subject: [PATCH 0990/2053] Store data in lists of dicts and use csv package Output format is unchanged (except that csv.DictWriter insists on writing ints as 0.0 instead of 0) --- tools/extra/parse_log.py | 54 +++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/tools/extra/parse_log.py b/tools/extra/parse_log.py index 41fe54dc8a0..16ba077aee6 100755 --- a/tools/extra/parse_log.py +++ b/tools/extra/parse_log.py @@ -10,6 +10,7 @@ import re import extract_seconds import argparse +import csv def get_line_type(line): @@ -26,6 +27,13 @@ def get_line_type(line): def parse_log(path_to_log): """Parse log file + Returns (train_dict_list, train_dict_names, test_dict_list, test_dict_names) + + train_dict_list and test_dict_list are lists of dicts that define the table + rows + + train_dict_names and test_dict_names are ordered tuples of the column names + for the two dict_lists """ re_iteration = re.compile('Iteration (\d+)') @@ -38,8 +46,10 @@ def parse_log(path_to_log): iteration = -1 test_accuracy = -1 learning_rate = float('NaN') - train_list = [] - test_list = [] + train_dict_list = [] + test_dict_list = [] + train_dict_names = ('NumIters', 'Seconds', 'TrainingLoss', 'LearningRate') + test_dict_names = ('NumIters', 'Seconds', 'TestAccuracy', 'TestLoss') logfile_year = extract_seconds.get_log_created_year(path_to_log) with open(path_to_log) as f: @@ -68,8 +78,10 @@ def parse_log(path_to_log): train_loss_match = re_train_loss.search(line) if train_loss_match: train_loss = float(train_loss_match.group(1)) - train_list.append((iteration, seconds, train_loss, - learning_rate)) + train_dict_list.append({'NumIters': iteration, + 'Seconds': seconds, + 'TrainingLoss': train_loss, + 'LearningRate': learning_rate}) output_loss_match = re_output_loss.search(line) if output_loss_match and get_line_type(line) == 'test': @@ -78,13 +90,16 @@ def parse_log(path_to_log): # loss for test data so the test_accuracy variable is already # correctly populated and (2) there's one and only one output # named "accuracy" for the test net - test_list.append((iteration, seconds, test_accuracy, test_loss)) + test_dict_list.append({'NumIters': iteration, + 'Seconds': seconds, + 'TestAccuracy': test_accuracy, + 'TestLoss': test_loss}) - return train_list, test_list + return train_dict_list, train_dict_names, test_dict_list, test_dict_names -def save_csv_files(logfile_path, output_dir, train_list, test_list, - verbose=False): +def save_csv_files(logfile_path, output_dir, train_dict_list, train_dict_names, + test_dict_list, test_dict_names, verbose=False): """Save CSV files to output_dir If the input log file is, e.g., caffe.INFO, the names will be @@ -93,23 +108,20 @@ def save_csv_files(logfile_path, output_dir, train_list, test_list, log_basename = os.path.basename(logfile_path) train_filename = os.path.join(output_dir, log_basename + '.train') - write_csv(train_filename, train_list, '%d,%f,%f,%f', - 'NumIters,Seconds,TrainingLoss,LearningRate', verbose) + write_csv(train_filename, train_dict_list, train_dict_names, verbose) test_filename = os.path.join(output_dir, log_basename + '.test') - write_csv(test_filename, test_list, '%d,%f,%f,%f', - 'NumIters,Seconds,TestAccuracy,TestLoss', verbose) + write_csv(test_filename, test_dict_list, test_dict_names, verbose) -def write_csv(output_filename, list_of_tuples, format_string, header, - verbose=False): +def write_csv(output_filename, dict_list, header_names, verbose=False): """Write a CSV file """ + with open(output_filename, 'w') as f: - f.write(header + '\n') - for row in list_of_tuples: - line = format_string % row - f.write(line + '\n') + dict_writer = csv.DictWriter(f, header_names) + dict_writer.writeheader() + dict_writer.writerows(dict_list) if verbose: print 'Wrote %s' % output_filename @@ -135,8 +147,10 @@ def parse_args(): def main(): args = parse_args() - train_list, test_list = parse_log(args.logfile_path) - save_csv_files(args.logfile_path, args.output_dir, train_list, test_list) + train_dict_list, train_dict_names, test_dict_list, test_dict_names = \ + parse_log(args.logfile_path) + save_csv_files(args.logfile_path, args.output_dir, train_dict_list, + train_dict_names, test_dict_list, test_dict_names) if __name__ == '__main__': From 646a204c7d925d8c385b095d8a7a86563f54b706 Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Wed, 10 Dec 2014 10:39:17 -0800 Subject: [PATCH 0991/2053] Improvements to network drawing * Use ArgumentParser in draw_net.py to parse input arguments * Plot network horizontally (left-right) by default; yes, this confuses the names "top" and "bottom", but since everyone's monitor is wider than it is tall, you'll be able to see over 50% more of the network on your screen at once. The top-bottom functionality is available via the "--rankdir BT" command line argument to draw_net.py * Display number of outputs on edge for data, convolution and inner product layers * In node names, add newline between layer name and layer type, to save horizontal space (only if graph rank direction is left-right or right-left) * Include convolution and pooling parameters within node names * Distinct colors for convolution, pooling and inner product nodes --- python/caffe/draw.py | 123 ++++++++++++++++++++++++++++++++++++++----- python/draw_net.py | 45 +++++++++++----- 2 files changed, 142 insertions(+), 26 deletions(-) diff --git a/python/caffe/draw.py b/python/caffe/draw.py index f8631cfa09e..d95c193cc93 100644 --- a/python/caffe/draw.py +++ b/python/caffe/draw.py @@ -11,11 +11,11 @@ import pydot # Internal layer and blob styles. -LAYER_STYLE = {'shape': 'record', 'fillcolor': '#6495ED', +LAYER_STYLE_DEFAULT = {'shape': 'record', 'fillcolor': '#6495ED', 'style': 'filled'} NEURON_LAYER_STYLE = {'shape': 'record', 'fillcolor': '#90EE90', 'style': 'filled'} -BLOB_STYLE = {'shape': 'octagon', 'fillcolor': '#F0E68C', +BLOB_STYLE = {'shape': 'octagon', 'fillcolor': '#E0E0E0', 'style': 'filled'} def get_enum_name_by_value(): desc = caffe_pb2.LayerParameter.LayerType.DESCRIPTOR @@ -24,39 +24,136 @@ def get_enum_name_by_value(): d[v.number] = k return d -def get_pydot_graph(caffe_net): - pydot_graph = pydot.Dot(caffe_net.name, graph_type='digraph', rankdir="BT") + +def get_pooling_types_dict(): + """Get dictionary mapping pooling type number to type name + """ + desc = caffe_pb2.PoolingParameter.PoolMethod.DESCRIPTOR + d = {} + for k,v in desc.values_by_name.items(): + d[v.number] = k + return d + + +def determine_edge_label_by_layertype(layer, layertype): + """Define edge label based on layer type + """ + + if layertype == 'DATA': + edge_label = 'Batch ' + str(layer.data_param.batch_size) + elif layertype == 'CONVOLUTION': + edge_label = str(layer.convolution_param.num_output) + elif layertype == 'INNER_PRODUCT': + edge_label = str(layer.inner_product_param.num_output) + else: + edge_label = '""' + + return edge_label + + +def determine_node_label_by_layertype(layer, layertype, rankdir): + """Define node label based on layer type + """ + + if rankdir in ('TB', 'BT'): + # If graph orientation is vertical, horizontal space is free and + # vertical space is not; separate words with spaces + separator = ' ' + else: + # If graph orientation is horizontal, vertical space is free and + # horizontal space is not; separate words with newlines + separator = '\n' + + if layertype == 'CONVOLUTION': + # Outer double quotes needed or else colon characters don't parse + # properly + node_label = '"%s%s(%s)%skernel size: %d%sstride: %d%spad: %d"' %\ + (layer.name, + separator, + layertype, + separator, + layer.convolution_param.kernel_size, + separator, + layer.convolution_param.stride, + separator, + layer.convolution_param.pad) + elif layertype == 'POOLING': + pooling_types_dict = get_pooling_types_dict() + node_label = '"%s%s(%s %s)%skernel size: %d%sstride: %d%spad: %d"' %\ + (layer.name, + separator, + pooling_types_dict[layer.pooling_param.pool], + layertype, + separator, + layer.pooling_param.kernel_size, + separator, + layer.pooling_param.stride, + separator, + layer.pooling_param.pad) + else: + node_label = '"%s%s(%s)"' % (layer.name, separator, layertype) + return node_label + + +def choose_color_by_layertype(layertype): + """Define colors for nodes based on the layer type + """ + color = '#6495ED' # Default + if layertype == 'CONVOLUTION': + color = '#FF5050' + elif layertype == 'POOLING': + color = '#FF9900' + elif layertype == 'INNER_PRODUCT': + color = '#CC33FF' + return color + + +def get_pydot_graph(caffe_net, rankdir, label_edges=True): + pydot_graph = pydot.Dot(caffe_net.name, graph_type='digraph', rankdir=rankdir) pydot_nodes = {} pydot_edges = [] d = get_enum_name_by_value() for layer in caffe_net.layers: name = layer.name layertype = d[layer.type] + node_label = determine_node_label_by_layertype(layer, layertype, rankdir) if (len(layer.bottom) == 1 and len(layer.top) == 1 and layer.bottom[0] == layer.top[0]): # We have an in-place neuron layer. pydot_nodes[name + '_' + layertype] = pydot.Node( - '%s (%s)' % (name, layertype), **NEURON_LAYER_STYLE) + node_label, **NEURON_LAYER_STYLE) else: + layer_style = LAYER_STYLE_DEFAULT + layer_style['fillcolor'] = choose_color_by_layertype(layertype) pydot_nodes[name + '_' + layertype] = pydot.Node( - '%s (%s)' % (name, layertype), **LAYER_STYLE) + node_label, **layer_style) for bottom_blob in layer.bottom: pydot_nodes[bottom_blob + '_blob'] = pydot.Node( '%s' % (bottom_blob), **BLOB_STYLE) - pydot_edges.append((bottom_blob + '_blob', name + '_' + layertype)) + edge_label = '""' + pydot_edges.append({'src': bottom_blob + '_blob', + 'dst': name + '_' + layertype, + 'label': edge_label}) for top_blob in layer.top: pydot_nodes[top_blob + '_blob'] = pydot.Node( '%s' % (top_blob)) - pydot_edges.append((name + '_' + layertype, top_blob + '_blob')) + if label_edges: + edge_label = determine_edge_label_by_layertype(layer, layertype) + else: + edge_label = '""' + pydot_edges.append({'src': name + '_' + layertype, + 'dst': top_blob + '_blob', + 'label': edge_label}) # Now, add the nodes and edges to the graph. for node in pydot_nodes.values(): pydot_graph.add_node(node) for edge in pydot_edges: pydot_graph.add_edge( - pydot.Edge(pydot_nodes[edge[0]], pydot_nodes[edge[1]])) + pydot.Edge(pydot_nodes[edge['src']], pydot_nodes[edge['dst']], + label=edge['label'])) return pydot_graph -def draw_net(caffe_net, ext='png'): +def draw_net(caffe_net, rankdir, ext='png'): """Draws a caffe net and returns the image string encoded using the given extension. @@ -64,13 +161,13 @@ def draw_net(caffe_net, ext='png'): caffe_net: a caffe.proto.caffe_pb2.NetParameter protocol buffer. ext: the image extension. Default 'png'. """ - return get_pydot_graph(caffe_net).create(format=ext) + return get_pydot_graph(caffe_net, rankdir).create(format=ext) -def draw_net_to_file(caffe_net, filename): +def draw_net_to_file(caffe_net, filename, rankdir='LR'): """Draws a caffe net, and saves it to file using the format given as the file extension. Use '.raw' to output raw text that you can manually feed to graphviz to draw graphs. """ ext = filename[filename.rfind('.')+1:] with open(filename, 'wb') as fid: - fid.write(draw_net(caffe_net, ext)) + fid.write(draw_net(caffe_net, rankdir, ext)) diff --git a/python/draw_net.py b/python/draw_net.py index ba488294275..4457b793e86 100755 --- a/python/draw_net.py +++ b/python/draw_net.py @@ -2,24 +2,43 @@ """ Draw a graph of the net architecture. """ -import os +import argparse from google.protobuf import text_format -import caffe, caffe.draw +import caffe +import caffe.draw from caffe.proto import caffe_pb2 -def main(argv): - if len(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] - caffe.draw.draw_net_to_file(net, sys.argv[2]) +def parse_args(): + """Parse input arguments + """ + + parser = argparse.ArgumentParser(description='Draw a network graph') + + parser.add_argument('input_net_proto_file', + help='Input network prototxt file') + parser.add_argument('output_image_file', + help='Output image file') + parser.add_argument('--rankdir', + help=('One of TB (top-bottom, i.e., vertical), ' + 'RL (right-left, i.e., horizontal), or another' + 'valid dot option; see' + 'http://www.graphviz.org/doc/info/attrs.html#k:rankdir' + '(default: LR)'), + default='LR') + + args = parser.parse_args() + return args + + +def main(): + args = parse_args() + net = caffe_pb2.NetParameter() + text_format.Merge(open(args.input_net_proto_file).read(), net) + print 'Drawing net to %s' % args.output_image_file + caffe.draw.draw_net_to_file(net, args.output_image_file, args.rankdir) if __name__ == '__main__': - import sys - main(sys.argv) + main() From 957318783d1aa3396a1b70755aac6de3639e6ab3 Mon Sep 17 00:00:00 2001 From: Jonathan Ho <hoj@cs.stanford.edu> Date: Wed, 10 Dec 2014 18:27:56 -0800 Subject: [PATCH 0992/2053] Check input line count in HDF5 data layer --- src/caffe/layers/hdf5_data_layer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index f6865efe78e..706c4a18319 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -75,6 +75,8 @@ void HDF5DataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, num_files_ = hdf_filenames_.size(); current_file_ = 0; LOG(INFO) << "Number of HDF5 files: " << num_files_; + CHECK_GE(num_files_, 1) << "Must have at least 1 HDF5 filename listed in " + << source; // Load the first HDF5 file and initialize the line counter. LoadHDF5FileData(hdf_filenames_[current_file_].c_str()); From 0a56995d3df9b442d457f2187d842e3b8d5c2a45 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 16 Dec 2014 01:52:43 -0800 Subject: [PATCH 0993/2053] remove extra blank line --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 1e70c2d5c6e..b19555fe962 100644 --- a/Makefile +++ b/Makefile @@ -498,7 +498,6 @@ $(TEST_ALL_DYNLINK_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(DYNAMIC_NA -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(PROJECT) -Wl,-rpath,$(LIB_BUILD_DIR) @ echo - $(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.cuo $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ From f519338c5e38f29bb8f02d59b945cc3af73d828b Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sun, 23 Nov 2014 22:35:46 -0800 Subject: [PATCH 0994/2053] consolidate build rules for object files --- Makefile | 77 ++++++++------------------------------------------------ 1 file changed, 10 insertions(+), 67 deletions(-) diff --git a/Makefile b/Makefile index b19555fe962..da8a4d81921 100644 --- a/Makefile +++ b/Makefile @@ -472,15 +472,20 @@ $(STATIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) ar rcs $@ $(OBJS) @ echo -$(TEST_BUILD_DIR)/%.o: src/$(PROJECT)/test/%.cpp $(HXX_SRCS) $(TEST_HXX_SRCS) \ - | $(TEST_BUILD_DIR) +$(BUILD_DIR)/%.o: %.cpp $(HXX_SRCS) | $(ALL_BUILD_DIRS) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @ echo -$(TEST_BUILD_DIR)/%.cuo: src/$(PROJECT)/test/%.cu $(HXX_SRCS) $(TEST_HXX_SRCS) \ - | $(TEST_BUILD_DIR) +$(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \ + | $(PROTO_BUILD_DIR) + $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + || (cat $@.$(WARNS_EXT); exit 1) + @ cat $@.$(WARNS_EXT) + @ echo + +$(BUILD_DIR)/%.cuo: %.cu $(HXX_SRCS) | $(ALL_BUILD_DIRS) $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @@ -515,72 +520,10 @@ $(TOOL_BUILD_DIR)/%: $(TOOL_BUILD_DIR)/%.bin | $(TOOL_BUILD_DIR) @ $(RM) $@ @ ln -s $(abspath $<) $@ -$(TOOL_BINS): %.bin : %.o $(STATIC_NAME) +$(TOOL_BINS) $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) $(CXX) $< $(STATIC_LINK_COMMAND) -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo -$(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) - $(CXX) $< $(STATIC_LINK_COMMAND) -o $@ $(LINKFLAGS) $(LDFLAGS) - @ echo - -$(LAYER_BUILD_DIR)/%.o: src/$(PROJECT)/layers/%.cpp $(HXX_SRCS) \ - | $(LAYER_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || (cat $@.$(WARNS_EXT); exit 1) - @ cat $@.$(WARNS_EXT) - @ echo - -$(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \ - | $(PROTO_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || (cat $@.$(WARNS_EXT); exit 1) - @ cat $@.$(WARNS_EXT) - @ echo - -$(UTIL_BUILD_DIR)/%.o: src/$(PROJECT)/util/%.cpp $(HXX_SRCS) | $(UTIL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || (cat $@.$(WARNS_EXT); exit 1) - @ cat $@.$(WARNS_EXT) - @ echo - -$(GTEST_OBJ): $(GTEST_SRC) | $(GTEST_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || (cat $@.$(WARNS_EXT); exit 1) - @ cat $@.$(WARNS_EXT) - @ echo - -$(LAYER_BUILD_DIR)/%.cuo: src/$(PROJECT)/layers/%.cu $(HXX_SRCS) \ - | $(LAYER_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ - || (cat $@.$(WARNS_EXT); exit 1) - @ cat $@.$(WARNS_EXT) - @ echo - -$(UTIL_BUILD_DIR)/%.cuo: src/$(PROJECT)/util/%.cu | $(UTIL_BUILD_DIR) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ - || (cat $@.$(WARNS_EXT); exit 1) - @ cat $@.$(WARNS_EXT) - @ echo - -$(TOOL_BUILD_DIR)/%.o: tools/%.cpp $(PROTO_GEN_HEADER) | $(TOOL_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || (cat $@.$(WARNS_EXT); exit 1) - @ cat $@.$(WARNS_EXT) - @ echo - -$(EXAMPLE_BUILD_DIR)/%.o: examples/%.cpp $(PROTO_GEN_HEADER) \ - | $(EXAMPLE_BUILD_DIRS) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || (cat $@.$(WARNS_EXT); exit 1) - @ cat $@.$(WARNS_EXT) - @ echo - -$(BUILD_DIR)/src/$(PROJECT)/%.o: src/$(PROJECT)/%.cpp $(HXX_SRCS) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ - || (cat $@.$(WARNS_EXT); exit 1) - @ cat $@.$(WARNS_EXT) - @ echo - proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER) $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_BUILD_DIR)/%.pb.h : \ From 89f7019acef532064f0897ceb45d2ed37a6bd608 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 24 Nov 2014 00:10:35 -0800 Subject: [PATCH 0995/2053] automatic discovery of source directories --- Makefile | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index da8a4d81921..e5a4b5ee40c 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,10 @@ else OTHER_BUILD_DIR := $(DEBUG_BUILD_DIR) endif +# All of the directories containing code. +SRC_DIRS := $(shell find * -type d -exec bash -c "find {} -maxdepth 1 \ + \( -name '*.cpp' -o -name '*.proto' \) | grep -q ." \; -print) + # The target shared library name LIB_BUILD_DIR := $(BUILD_DIR)/lib STATIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).a @@ -98,9 +102,6 @@ PROTO_GEN_PY := $(foreach file,${PROTO_SRCS:.proto=_pb2.py}, \ CXX_OBJS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o}) CU_OBJS := $(addprefix $(BUILD_DIR)/, ${CU_SRCS:.cu=.cuo}) PROTO_OBJS := ${PROTO_GEN_CC:.cc=.o} -OBJ_BUILD_DIR := $(BUILD_DIR)/src/$(PROJECT) -LAYER_BUILD_DIR := $(OBJ_BUILD_DIR)/layers -UTIL_BUILD_DIR := $(OBJ_BUILD_DIR)/util OBJS := $(PROTO_OBJS) $(CXX_OBJS) $(CU_OBJS) # tool, example, and test objects TOOL_OBJS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o}) @@ -110,11 +111,7 @@ TEST_CXX_OBJS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o}) TEST_CU_OBJS := $(addprefix $(BUILD_DIR)/, ${TEST_CU_SRCS:.cu=.cuo}) TEST_OBJS := $(TEST_CXX_OBJS) $(TEST_CU_OBJS) GTEST_OBJ := $(addprefix $(BUILD_DIR)/, ${GTEST_SRC:.cpp=.o}) -GTEST_BUILD_DIR := $(dir $(GTEST_OBJ)) EXAMPLE_OBJS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o}) -EXAMPLE_BUILD_DIR := $(BUILD_DIR)/examples -EXAMPLE_BUILD_DIRS := $(EXAMPLE_BUILD_DIR) -EXAMPLE_BUILD_DIRS += $(foreach obj,$(EXAMPLE_OBJS),$(dir $(obj))) # tool, example, and test bins TOOL_BINS := ${TOOL_OBJS:.o=.bin} EXAMPLE_BINS := ${EXAMPLE_OBJS:.o=.bin} @@ -183,14 +180,9 @@ ifneq ($(strip $(DISTRIBUTE_DIR)),distribute) DIST_ALIASES += distribute endif -ALL_BUILD_DIRS := $(sort \ - $(BUILD_DIR) $(LIB_BUILD_DIR) $(OBJ_BUILD_DIR) \ - $(LAYER_BUILD_DIR) $(UTIL_BUILD_DIR) $(TOOL_BUILD_DIR) \ - $(TEST_BUILD_DIR) $(TEST_BIN_DIR) $(GTEST_BUILD_DIR) \ - $(EXAMPLE_BUILD_DIRS) \ - $(LINT_OUTPUT_DIR) \ - $(PROTO_BUILD_DIR) $(PROTO_BUILD_INCLUDE_DIR) $(PY_PROTO_BUILD_DIR) \ - $(DISTRIBUTE_SUBDIRS)) +ALL_BUILD_DIRS := $(sort $(BUILD_DIR) $(addprefix $(BUILD_DIR)/, $(SRC_DIRS)) \ + $(LIB_BUILD_DIR) $(TEST_BIN_DIR) $(PY_PROTO_BUILD_DIR) $(LINT_OUTPUT_DIR) \ + $(DISTRIBUTE_SUBDIRS) $(PROTO_BUILD_INCLUDE_DIR)) ############################## # Set directory for Doxygen-generated documentation From 492f67c4084fd173f6592b69903491f7e47edbfb Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Wed, 10 Dec 2014 23:37:42 -0800 Subject: [PATCH 0996/2053] move cuda output from build/.../.cuo -> build/cuda/.../.o This will allow nvcc's -M dependency generation option to work harmoniously, since it assumes that output will have a .o extension. --- Makefile | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index e5a4b5ee40c..54d5636135d 100644 --- a/Makefile +++ b/Makefile @@ -100,15 +100,16 @@ PROTO_GEN_PY := $(foreach file,${PROTO_SRCS:.proto=_pb2.py}, \ # These objects will be linked into the final shared library, so we # exclude the tool, example, and test objects. CXX_OBJS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o}) -CU_OBJS := $(addprefix $(BUILD_DIR)/, ${CU_SRCS:.cu=.cuo}) +CU_OBJS := $(addprefix $(BUILD_DIR)/cuda/, ${CU_SRCS:.cu=.o}) PROTO_OBJS := ${PROTO_GEN_CC:.cc=.o} OBJS := $(PROTO_OBJS) $(CXX_OBJS) $(CU_OBJS) # tool, example, and test objects TOOL_OBJS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o}) TOOL_BUILD_DIR := $(BUILD_DIR)/tools -TEST_BUILD_DIR := $(BUILD_DIR)/src/$(PROJECT)/test +TEST_CXX_BUILD_DIR := $(BUILD_DIR)/src/$(PROJECT)/test +TEST_CU_BUILD_DIR := $(BUILD_DIR)/cuda/src/$(PROJECT)/test TEST_CXX_OBJS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o}) -TEST_CU_OBJS := $(addprefix $(BUILD_DIR)/, ${TEST_CU_SRCS:.cu=.cuo}) +TEST_CU_OBJS := $(addprefix $(BUILD_DIR)/cuda/, ${TEST_CU_SRCS:.cu=.o}) TEST_OBJS := $(TEST_CXX_OBJS) $(TEST_CU_OBJS) GTEST_OBJ := $(addprefix $(BUILD_DIR)/, ${GTEST_SRC:.cpp=.o}) EXAMPLE_OBJS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o}) @@ -134,11 +135,11 @@ TEST_ALL_DYNLINK_BIN := $(TEST_BIN_DIR)/test_all_dynamic_link.testbin ############################## WARNS_EXT := warnings.txt CXX_WARNS := $(addprefix $(BUILD_DIR)/, ${CXX_SRCS:.cpp=.o.$(WARNS_EXT)}) -CU_WARNS := $(addprefix $(BUILD_DIR)/, ${CU_SRCS:.cu=.cuo.$(WARNS_EXT)}) +CU_WARNS := $(addprefix $(BUILD_DIR)/cuda/, ${CU_SRCS:.cu=.o.$(WARNS_EXT)}) TOOL_WARNS := $(addprefix $(BUILD_DIR)/, ${TOOL_SRCS:.cpp=.o.$(WARNS_EXT)}) EXAMPLE_WARNS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o.$(WARNS_EXT)}) TEST_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_SRCS:.cpp=.o.$(WARNS_EXT)}) -TEST_CU_WARNS := $(addprefix $(BUILD_DIR)/, ${TEST_CU_SRCS:.cu=.cuo.$(WARNS_EXT)}) +TEST_CU_WARNS := $(addprefix $(BUILD_DIR)/cuda/, ${TEST_CU_SRCS:.cu=.o.$(WARNS_EXT)}) ALL_CXX_WARNS := $(CXX_WARNS) $(TOOL_WARNS) $(EXAMPLE_WARNS) $(TEST_WARNS) ALL_CU_WARNS := $(CU_WARNS) $(TEST_CU_WARNS) ALL_WARNS := $(ALL_CXX_WARNS) $(ALL_CU_WARNS) @@ -181,6 +182,7 @@ ifneq ($(strip $(DISTRIBUTE_DIR)),distribute) endif ALL_BUILD_DIRS := $(sort $(BUILD_DIR) $(addprefix $(BUILD_DIR)/, $(SRC_DIRS)) \ + $(addprefix $(BUILD_DIR)/cuda/, $(SRC_DIRS)) \ $(LIB_BUILD_DIR) $(TEST_BIN_DIR) $(PY_PROTO_BUILD_DIR) $(LINT_OUTPUT_DIR) \ $(DISTRIBUTE_SUBDIRS) $(PROTO_BUILD_INCLUDE_DIR)) @@ -437,9 +439,7 @@ $(EMPTY_WARN_REPORT): $(ALL_WARNS) | $(BUILD_DIR) $(RM) $(NONEMPTY_WARN_REPORT); \ echo "No compiler warnings!"; -$(ALL_CXX_WARNS): %.o.$(WARNS_EXT) : %.o - -$(ALL_CU_WARNS): %.cuo.$(WARNS_EXT) : %.cuo +$(ALL_WARNS): %.o.$(WARNS_EXT) : %.o $(BUILD_DIR_LINK): $(BUILD_DIR)/.linked @@ -495,14 +495,14 @@ $(TEST_ALL_DYNLINK_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(DYNAMIC_NA -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(PROJECT) -Wl,-rpath,$(LIB_BUILD_DIR) @ echo -$(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.cuo $(GTEST_OBJ) $(STATIC_NAME) \ - | $(TEST_BIN_DIR) +$(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_CU_BUILD_DIR)/%.o \ + $(GTEST_OBJ) $(STATIC_NAME) | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo -$(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_BUILD_DIR)/%.o $(GTEST_OBJ) $(STATIC_NAME) \ - | $(TEST_BIN_DIR) +$(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_CXX_BUILD_DIR)/%.o \ + $(GTEST_OBJ) $(STATIC_NAME) | $(TEST_BIN_DIR) $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ -o $@ $(LINKFLAGS) $(LDFLAGS) @ echo From da18d318f4d99036a61fa6c3d843eb43827268b8 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 16 Dec 2014 20:18:53 -0800 Subject: [PATCH 0997/2053] check host malloc result --- include/caffe/syncedmem.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/caffe/syncedmem.hpp b/include/caffe/syncedmem.hpp index db8d0e80e12..2564e0716ef 100644 --- a/include/caffe/syncedmem.hpp +++ b/include/caffe/syncedmem.hpp @@ -24,6 +24,7 @@ namespace caffe { inline void CaffeMallocHost(void** ptr, size_t size) { *ptr = malloc(size); + CHECK(*ptr) << "host allocation of size " << size << " failed"; } inline void CaffeFreeHost(void* ptr) { From 8d3e46dda3783ba451942bf9708a6c1ef52ce9ff Mon Sep 17 00:00:00 2001 From: Thomas Schenker <mail.thomas.schenker@googlemail.com> Date: Wed, 10 Dec 2014 16:16:34 +0100 Subject: [PATCH 0998/2053] Add CHECKs to prevent segfault for incorrect IMAGE_DATA layers. Incomplete IMAGE_DATA layers cause a segmentation fault, e.g.: layers { name: "mnist" type: IMAGE_DATA top: "data" top: "label" image_data_param { batch_size: 100 } include: { phase: TRAIN } } or layers { name: "mnist" type: IMAGE_DATA top: "data" top: "label" data_param { source: "./data/train.txt" batch_size: 100 } include: { phase: TRAIN } } Also empty image list files cause a segfault. This is fixed by adding 3 CHECK instructions. --- src/caffe/layers/image_data_layer.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index e4a575bec93..b5a34ff81aa 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -27,8 +27,11 @@ void ImageDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, "new_height and new_width to be set at the same time."; // Read the file with filenames and labels const string& source = this->layer_param_.image_data_param().source(); + CHECK_GT(source.size(), 0); LOG(INFO) << "Opening file " << source; std::ifstream infile(source.c_str()); + CHECK(infile.good()) + << "Could not open image list (filename: \""+ source + "\")"; string filename; int label; while (infile >> filename >> label) { @@ -53,6 +56,8 @@ void ImageDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, CHECK_GT(lines_.size(), skip) << "Not enough points to skip"; lines_id_ = skip; } + CHECK(!lines_.empty()) + << "Image list is empty (filename: \"" + source + "\")"; // Read a data point, and use it to initialize the top blob. Datum datum; CHECK(ReadImageToDatum(lines_[lines_id_].first, lines_[lines_id_].second, From 555f4d3b7cf9d5db73b983c3757474deced0abfa Mon Sep 17 00:00:00 2001 From: Kyle Krafka <kyle.krafka@gmail.com> Date: Sat, 20 Dec 2014 23:02:19 -0500 Subject: [PATCH 0999/2053] Use valid MathJax delimiters. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MathJax does not support $ as a delimiter by default, so math was not displayed properly on the “Forward and Backward” page. --- docs/tutorial/forward_backward.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorial/forward_backward.md b/docs/tutorial/forward_backward.md index f58b9cac19e..a645f002f61 100644 --- a/docs/tutorial/forward_backward.md +++ b/docs/tutorial/forward_backward.md @@ -15,7 +15,7 @@ This pass goes from bottom to top. <img src="fig/forward.jpg" alt="Forward pass" width="320"> -The data $x$ is passed through an inner product layer for $g(x)$ then through a softmax for $h(g(x))$ and softmax loss to give $f_W(x)$. +The data $$x$$ is passed through an inner product layer for $$g(x)$$ then through a softmax for $$h(g(x))$$ and softmax loss to give $$f_W(x)$$. The **backward** pass computes the gradient given the loss for learning. In backward Caffe reverse-composes the gradient of each layer to compute the gradient of the whole model by automatic differentiation. @@ -24,7 +24,7 @@ This pass goes from top to bottom. <img src="fig/backward.jpg" alt="Backward pass" width="320"> -The backward pass begins with the loss and computes the gradient with respect to the output $\frac{\partial f_W}{\partial h}$. The gradient with respect to the rest of the model is computed layer-by-layer through the chain rule. Layers with parameters, like the `INNER_PRODUCT` layer, compute the gradient with respect to their parameters $\frac{\partial f_W}{\partial W_{\text{ip}}}$ during the backward step. +The backward pass begins with the loss and computes the gradient with respect to the output $$\frac{\partial f_W}{\partial h}$$. The gradient with respect to the rest of the model is computed layer-by-layer through the chain rule. Layers with parameters, like the `INNER_PRODUCT` layer, compute the gradient with respect to their parameters $$\frac{\partial f_W}{\partial W_{\text{ip}}}$$ during the backward step. These computations follow immediately from defining the model: Caffe plans and carries out the forward and backward passes for you. From 3855ad574c89847552705cd1ceb70dd5e8687c4d Mon Sep 17 00:00:00 2001 From: Kyle Krafka <kyle.krafka@gmail.com> Date: Sat, 20 Dec 2014 23:34:51 -0500 Subject: [PATCH 1000/2053] Fix minor typos in strings. --- tools/caffe.cpp | 2 +- tools/convert_imageset.cpp | 2 +- tools/extract_features.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/caffe.cpp b/tools/caffe.cpp index c8c8c1a6b4c..046b38938e4 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -21,7 +21,7 @@ DEFINE_int32(gpu, -1, DEFINE_string(solver, "", "The solver definition protocol buffer text file."); DEFINE_string(model, "", - "The model definition protocol buffer text file.."); + "The model definition protocol buffer text file."); DEFINE_string(snapshot, "", "Optional; the snapshot solver state to resume training."); DEFINE_string(weights, "", diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 7e1e83d9d0c..09e84d6b3ef 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -112,7 +112,7 @@ int main(int argc, char** argv) { CHECK_EQ(mdb_txn_begin(mdb_env, NULL, 0, &mdb_txn), MDB_SUCCESS) << "mdb_txn_begin failed"; CHECK_EQ(mdb_open(mdb_txn, NULL, 0, &mdb_dbi), MDB_SUCCESS) - << "mdb_open failed. Does the lmdb already exist? "; + << "mdb_open failed. Does the lmdb already exist?"; } else { LOG(FATAL) << "Unknown db backend " << db_backend; } diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index 49e8f98971c..cb48c4796b9 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -131,7 +131,7 @@ int feature_extraction_pipeline(int argc, char** argv) { int num_mini_batches = atoi(argv[++arg_pos]); - LOG(ERROR)<< "Extacting Features"; + LOG(ERROR)<< "Extracting Features"; Datum datum; vector<shared_ptr<leveldb::WriteBatch> > feature_batches( From f15210cdc8f0e9b2e5866972ab81149ac68e96c6 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Tue, 2 Dec 2014 13:10:57 -0800 Subject: [PATCH 1001/2053] Added bvlc_googlenet prototxt and weights --- models/bvlc_googlenet/deploy.prototxt | 1924 ++++++++++++++++ models/bvlc_googlenet/quick_solver.prototxt | 15 + models/bvlc_googlenet/readme.md | 33 + models/bvlc_googlenet/solver.prototxt | 16 + models/bvlc_googlenet/train_val.prototxt | 2240 +++++++++++++++++++ 5 files changed, 4228 insertions(+) create mode 100644 models/bvlc_googlenet/deploy.prototxt create mode 100644 models/bvlc_googlenet/quick_solver.prototxt create mode 100644 models/bvlc_googlenet/readme.md create mode 100644 models/bvlc_googlenet/solver.prototxt create mode 100644 models/bvlc_googlenet/train_val.prototxt diff --git a/models/bvlc_googlenet/deploy.prototxt b/models/bvlc_googlenet/deploy.prototxt new file mode 100644 index 00000000000..e31a4c9cd00 --- /dev/null +++ b/models/bvlc_googlenet/deploy.prototxt @@ -0,0 +1,1924 @@ +name: "GoogleNet" +input: "data" +input_dim: 10 +input_dim: 3 +input_dim: 224 +input_dim: 224 +layers { + bottom: "data" + top: "conv1/7x7_s2" + name: "conv1/7x7_s2" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 3 + kernel_size: 7 + stride: 2 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv1/7x7_s2" + top: "conv1/7x7_s2" + name: "conv1/relu_7x7" + type: RELU +} +layers { + bottom: "conv1/7x7_s2" + top: "pool1/3x3_s2" + name: "pool1/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool1/3x3_s2" + top: "pool1/norm1" + name: "pool1/norm1" + type: LRN + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + bottom: "pool1/norm1" + top: "conv2/3x3_reduce" + name: "conv2/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv2/3x3_reduce" + top: "conv2/3x3_reduce" + name: "conv2/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "conv2/3x3_reduce" + top: "conv2/3x3" + name: "conv2/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv2/3x3" + top: "conv2/3x3" + name: "conv2/relu_3x3" + type: RELU +} +layers { + bottom: "conv2/3x3" + top: "conv2/norm2" + name: "conv2/norm2" + type: LRN + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + bottom: "conv2/norm2" + top: "pool2/3x3_s2" + name: "pool2/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/1x1" + name: "inception_3a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/1x1" + top: "inception_3a/1x1" + name: "inception_3a/relu_1x1" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/3x3_reduce" + name: "inception_3a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3_reduce" + name: "inception_3a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3" + name: "inception_3a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/3x3" + top: "inception_3a/3x3" + name: "inception_3a/relu_3x3" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/5x5_reduce" + name: "inception_3a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5_reduce" + name: "inception_3a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5" + name: "inception_3a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/5x5" + top: "inception_3a/5x5" + name: "inception_3a/relu_5x5" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/pool" + name: "inception_3a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_3a/pool" + top: "inception_3a/pool_proj" + name: "inception_3a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/pool_proj" + top: "inception_3a/pool_proj" + name: "inception_3a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_3a/1x1" + bottom: "inception_3a/3x3" + bottom: "inception_3a/5x5" + bottom: "inception_3a/pool_proj" + top: "inception_3a/output" + name: "inception_3a/output" + type: CONCAT +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/1x1" + name: "inception_3b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/1x1" + top: "inception_3b/1x1" + name: "inception_3b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/3x3_reduce" + name: "inception_3b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3_reduce" + name: "inception_3b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3" + name: "inception_3b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/3x3" + top: "inception_3b/3x3" + name: "inception_3b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/5x5_reduce" + name: "inception_3b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5_reduce" + name: "inception_3b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5" + name: "inception_3b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/5x5" + top: "inception_3b/5x5" + name: "inception_3b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/pool" + name: "inception_3b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_3b/pool" + top: "inception_3b/pool_proj" + name: "inception_3b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/pool_proj" + top: "inception_3b/pool_proj" + name: "inception_3b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_3b/1x1" + bottom: "inception_3b/3x3" + bottom: "inception_3b/5x5" + bottom: "inception_3b/pool_proj" + top: "inception_3b/output" + name: "inception_3b/output" + type: CONCAT +} +layers { + bottom: "inception_3b/output" + top: "pool3/3x3_s2" + name: "pool3/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/1x1" + name: "inception_4a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/1x1" + top: "inception_4a/1x1" + name: "inception_4a/relu_1x1" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/3x3_reduce" + name: "inception_4a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3_reduce" + name: "inception_4a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3" + name: "inception_4a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 208 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/3x3" + top: "inception_4a/3x3" + name: "inception_4a/relu_3x3" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/5x5_reduce" + name: "inception_4a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5_reduce" + name: "inception_4a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5" + name: "inception_4a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 48 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/5x5" + top: "inception_4a/5x5" + name: "inception_4a/relu_5x5" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/pool" + name: "inception_4a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4a/pool" + top: "inception_4a/pool_proj" + name: "inception_4a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/pool_proj" + top: "inception_4a/pool_proj" + name: "inception_4a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4a/1x1" + bottom: "inception_4a/3x3" + bottom: "inception_4a/5x5" + bottom: "inception_4a/pool_proj" + top: "inception_4a/output" + name: "inception_4a/output" + type: CONCAT +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/1x1" + name: "inception_4b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/1x1" + top: "inception_4b/1x1" + name: "inception_4b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/3x3_reduce" + name: "inception_4b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3_reduce" + name: "inception_4b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3" + name: "inception_4b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 224 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/3x3" + top: "inception_4b/3x3" + name: "inception_4b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/5x5_reduce" + name: "inception_4b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5_reduce" + name: "inception_4b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5" + name: "inception_4b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/5x5" + top: "inception_4b/5x5" + name: "inception_4b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/pool" + name: "inception_4b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4b/pool" + top: "inception_4b/pool_proj" + name: "inception_4b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/pool_proj" + top: "inception_4b/pool_proj" + name: "inception_4b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4b/1x1" + bottom: "inception_4b/3x3" + bottom: "inception_4b/5x5" + bottom: "inception_4b/pool_proj" + top: "inception_4b/output" + name: "inception_4b/output" + type: CONCAT +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/1x1" + name: "inception_4c/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/1x1" + top: "inception_4c/1x1" + name: "inception_4c/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/3x3_reduce" + name: "inception_4c/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3_reduce" + name: "inception_4c/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3" + name: "inception_4c/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/3x3" + top: "inception_4c/3x3" + name: "inception_4c/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/5x5_reduce" + name: "inception_4c/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5_reduce" + name: "inception_4c/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5" + name: "inception_4c/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/5x5" + top: "inception_4c/5x5" + name: "inception_4c/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/pool" + name: "inception_4c/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4c/pool" + top: "inception_4c/pool_proj" + name: "inception_4c/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/pool_proj" + top: "inception_4c/pool_proj" + name: "inception_4c/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4c/1x1" + bottom: "inception_4c/3x3" + bottom: "inception_4c/5x5" + bottom: "inception_4c/pool_proj" + top: "inception_4c/output" + name: "inception_4c/output" + type: CONCAT +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/1x1" + name: "inception_4d/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/1x1" + top: "inception_4d/1x1" + name: "inception_4d/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/3x3_reduce" + name: "inception_4d/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 144 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3_reduce" + name: "inception_4d/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3" + name: "inception_4d/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 288 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/3x3" + top: "inception_4d/3x3" + name: "inception_4d/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/5x5_reduce" + name: "inception_4d/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5_reduce" + name: "inception_4d/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5" + name: "inception_4d/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/5x5" + top: "inception_4d/5x5" + name: "inception_4d/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/pool" + name: "inception_4d/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4d/pool" + top: "inception_4d/pool_proj" + name: "inception_4d/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/pool_proj" + top: "inception_4d/pool_proj" + name: "inception_4d/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4d/1x1" + bottom: "inception_4d/3x3" + bottom: "inception_4d/5x5" + bottom: "inception_4d/pool_proj" + top: "inception_4d/output" + name: "inception_4d/output" + type: CONCAT +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/1x1" + name: "inception_4e/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/1x1" + top: "inception_4e/1x1" + name: "inception_4e/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/3x3_reduce" + name: "inception_4e/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3_reduce" + name: "inception_4e/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3" + name: "inception_4e/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/3x3" + top: "inception_4e/3x3" + name: "inception_4e/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/5x5_reduce" + name: "inception_4e/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5_reduce" + name: "inception_4e/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5" + name: "inception_4e/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/5x5" + top: "inception_4e/5x5" + name: "inception_4e/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/pool" + name: "inception_4e/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4e/pool" + top: "inception_4e/pool_proj" + name: "inception_4e/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/pool_proj" + top: "inception_4e/pool_proj" + name: "inception_4e/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4e/1x1" + bottom: "inception_4e/3x3" + bottom: "inception_4e/5x5" + bottom: "inception_4e/pool_proj" + top: "inception_4e/output" + name: "inception_4e/output" + type: CONCAT +} +layers { + bottom: "inception_4e/output" + top: "pool4/3x3_s2" + name: "pool4/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/1x1" + name: "inception_5a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/1x1" + top: "inception_5a/1x1" + name: "inception_5a/relu_1x1" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/3x3_reduce" + name: "inception_5a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3_reduce" + name: "inception_5a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3" + name: "inception_5a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/3x3" + top: "inception_5a/3x3" + name: "inception_5a/relu_3x3" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/5x5_reduce" + name: "inception_5a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5_reduce" + name: "inception_5a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5" + name: "inception_5a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/5x5" + top: "inception_5a/5x5" + name: "inception_5a/relu_5x5" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/pool" + name: "inception_5a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_5a/pool" + top: "inception_5a/pool_proj" + name: "inception_5a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/pool_proj" + top: "inception_5a/pool_proj" + name: "inception_5a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_5a/1x1" + bottom: "inception_5a/3x3" + bottom: "inception_5a/5x5" + bottom: "inception_5a/pool_proj" + top: "inception_5a/output" + name: "inception_5a/output" + type: CONCAT +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/1x1" + name: "inception_5b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/1x1" + top: "inception_5b/1x1" + name: "inception_5b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/3x3_reduce" + name: "inception_5b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3_reduce" + name: "inception_5b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3" + name: "inception_5b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/3x3" + top: "inception_5b/3x3" + name: "inception_5b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/5x5_reduce" + name: "inception_5b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 48 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5_reduce" + name: "inception_5b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5" + name: "inception_5b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/5x5" + top: "inception_5b/5x5" + name: "inception_5b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/pool" + name: "inception_5b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_5b/pool" + top: "inception_5b/pool_proj" + name: "inception_5b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/pool_proj" + top: "inception_5b/pool_proj" + name: "inception_5b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_5b/1x1" + bottom: "inception_5b/3x3" + bottom: "inception_5b/5x5" + bottom: "inception_5b/pool_proj" + top: "inception_5b/output" + name: "inception_5b/output" + type: CONCAT +} +layers { + bottom: "inception_5b/output" + top: "pool5/7x7_s1" + name: "pool5/7x7_s1" + type: POOLING + pooling_param { + pool: AVE + kernel_size: 7 + stride: 1 + } +} +layers { + bottom: "pool5/7x7_s1" + top: "pool5/7x7_s1" + name: "pool5/drop_7x7_s1" + type: DROPOUT + dropout_param { + dropout_ratio: 0.4 + } +} +layers { + bottom: "pool5/7x7_s1" + top: "loss3/classifier" + name: "loss3/classifier" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "prob" + type: SOFTMAX + bottom: "loss3/classifier" + top: "prob" +} \ No newline at end of file diff --git a/models/bvlc_googlenet/quick_solver.prototxt b/models/bvlc_googlenet/quick_solver.prototxt new file mode 100644 index 00000000000..5d2f7ee70b9 --- /dev/null +++ b/models/bvlc_googlenet/quick_solver.prototxt @@ -0,0 +1,15 @@ +net: "models/bvlc_googlenet/train_val.prototxt" +test_iter: 1000 +test_interval: 4000 +test_initialization: false +display: 40 +average_loss: 40 +base_lr: 0.01 +lr_policy: "poly" +power: 0.5 +max_iter: 2400000 +momentum: 0.9 +weight_decay: 0.0002 +snapshot: 40000 +snapshot_prefix: "models/bvlc_googlenet/bvlc_googlenet_quick" +solver_mode: GPU diff --git a/models/bvlc_googlenet/readme.md b/models/bvlc_googlenet/readme.md new file mode 100644 index 00000000000..27022d3384a --- /dev/null +++ b/models/bvlc_googlenet/readme.md @@ -0,0 +1,33 @@ +--- +name: BVLC GoogleNet Model +caffemodel: bvlc_googlenet.caffemodel +caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel +license: non-commercial +sha1: 405fc5acd08a3bb12de8ee5e23a96bec22f08204 +caffe_commit: bc614d1bd91896e3faceaf40b23b72dab47d44f5 +--- + +This model is a replication of the model described in the [GoogleNet](http://arxiv.org/abs/1409.4842) publication. We would like to thank Christian Szegedy for all his help in the replication of GoogleNet model. + +Differences: +- not training with the relighting data-augmentation; +- not training with the scale or aspect-ratio data-augmentation; +- uses "xavier" to initialize the weights instead of "gaussian"; +- quick_solver.prototxt uses a different learning rate decay policy than the original solver.prototxt, that allows a much faster training (60 epochs vs 250 epochs); + +The bundled model is the iteration 2,400,000 snapshot (60 epochs) using quick_solver.prototxt + +This bundled model obtains a top-1 accuracy 68.7% (31.3% error) and a top-5 accuracy 88.9% (11.1% error) on the validation set, using just the center crop. +(Using the average of 10 crops, (4 + 1 center) * 2 mirror, should obtain a bit higher accuracy.) + +Timings for bvlc_googlenet with cuDNN using batch_size:128 on a K40c: + - Average Forward pass: 562.841 ms. + - Average Backward pass: 1123.84 ms. + - Average Forward-Backward: 1688.8 ms. + + +## License + +The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: +"Researcher shall use the Database only for non-commercial research and educational purposes." +Accordingly, this model is distributed under a non-commercial license. diff --git a/models/bvlc_googlenet/solver.prototxt b/models/bvlc_googlenet/solver.prototxt new file mode 100644 index 00000000000..d7d1788173c --- /dev/null +++ b/models/bvlc_googlenet/solver.prototxt @@ -0,0 +1,16 @@ +net: "models/bvlc_googlenet/train_val.prototxt" +test_iter: 1000 +test_interval: 4000 +test_initialization: false +display: 40 +average_loss: 40 +base_lr: 0.01 +lr_policy: "step" +stepsize: 320000 +gamma: 0.96 +max_iter: 10000000 +momentum: 0.9 +weight_decay: 0.0002 +snapshot: 40000 +snapshot_prefix: "models/bvlc_googlenet/bvlc_googlenet" +solver_mode: GPU diff --git a/models/bvlc_googlenet/train_val.prototxt b/models/bvlc_googlenet/train_val.prototxt new file mode 100644 index 00000000000..cd8f38abdc8 --- /dev/null +++ b/models/bvlc_googlenet/train_val.prototxt @@ -0,0 +1,2240 @@ +name: "GoogleNet" +layers { + top: "data" + top: "label" + name: "data" + type: DATA + data_param { + source: "examples/imagenet/ilsvrc12_train_lmdb" + batch_size: 32 + backend: LMDB + } + include { + phase: TRAIN + } + transform_param { + mirror: true + crop_size: 224 + mean_value: 104 + mean_value: 117 + mean_value: 123 + } +} +layers { + top: "data" + top: "label" + name: "data" + type: DATA + data_param { + source: "examples/imagenet/ilsvrc12_val_lmdb" + batch_size: 50 + backend: LMDB + } + include { + phase: TEST + } + transform_param { + mirror: false + crop_size: 224 + mean_value: 104 + mean_value: 117 + mean_value: 123 + } +} +layers { + bottom: "data" + top: "conv1/7x7_s2" + name: "conv1/7x7_s2" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 3 + kernel_size: 7 + stride: 2 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv1/7x7_s2" + top: "conv1/7x7_s2" + name: "conv1/relu_7x7" + type: RELU +} +layers { + bottom: "conv1/7x7_s2" + top: "pool1/3x3_s2" + name: "pool1/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool1/3x3_s2" + top: "pool1/norm1" + name: "pool1/norm1" + type: LRN + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + bottom: "pool1/norm1" + top: "conv2/3x3_reduce" + name: "conv2/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv2/3x3_reduce" + top: "conv2/3x3_reduce" + name: "conv2/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "conv2/3x3_reduce" + top: "conv2/3x3" + name: "conv2/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv2/3x3" + top: "conv2/3x3" + name: "conv2/relu_3x3" + type: RELU +} +layers { + bottom: "conv2/3x3" + top: "conv2/norm2" + name: "conv2/norm2" + type: LRN + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + bottom: "conv2/norm2" + top: "pool2/3x3_s2" + name: "pool2/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/1x1" + name: "inception_3a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/1x1" + top: "inception_3a/1x1" + name: "inception_3a/relu_1x1" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/3x3_reduce" + name: "inception_3a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3_reduce" + name: "inception_3a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3" + name: "inception_3a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/3x3" + top: "inception_3a/3x3" + name: "inception_3a/relu_3x3" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/5x5_reduce" + name: "inception_3a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5_reduce" + name: "inception_3a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5" + name: "inception_3a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/5x5" + top: "inception_3a/5x5" + name: "inception_3a/relu_5x5" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/pool" + name: "inception_3a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_3a/pool" + top: "inception_3a/pool_proj" + name: "inception_3a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/pool_proj" + top: "inception_3a/pool_proj" + name: "inception_3a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_3a/1x1" + bottom: "inception_3a/3x3" + bottom: "inception_3a/5x5" + bottom: "inception_3a/pool_proj" + top: "inception_3a/output" + name: "inception_3a/output" + type: CONCAT +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/1x1" + name: "inception_3b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/1x1" + top: "inception_3b/1x1" + name: "inception_3b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/3x3_reduce" + name: "inception_3b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3_reduce" + name: "inception_3b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3" + name: "inception_3b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/3x3" + top: "inception_3b/3x3" + name: "inception_3b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/5x5_reduce" + name: "inception_3b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5_reduce" + name: "inception_3b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5" + name: "inception_3b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/5x5" + top: "inception_3b/5x5" + name: "inception_3b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/pool" + name: "inception_3b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_3b/pool" + top: "inception_3b/pool_proj" + name: "inception_3b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/pool_proj" + top: "inception_3b/pool_proj" + name: "inception_3b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_3b/1x1" + bottom: "inception_3b/3x3" + bottom: "inception_3b/5x5" + bottom: "inception_3b/pool_proj" + top: "inception_3b/output" + name: "inception_3b/output" + type: CONCAT +} +layers { + bottom: "inception_3b/output" + top: "pool3/3x3_s2" + name: "pool3/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/1x1" + name: "inception_4a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/1x1" + top: "inception_4a/1x1" + name: "inception_4a/relu_1x1" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/3x3_reduce" + name: "inception_4a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3_reduce" + name: "inception_4a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3" + name: "inception_4a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 208 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/3x3" + top: "inception_4a/3x3" + name: "inception_4a/relu_3x3" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/5x5_reduce" + name: "inception_4a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5_reduce" + name: "inception_4a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5" + name: "inception_4a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 48 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/5x5" + top: "inception_4a/5x5" + name: "inception_4a/relu_5x5" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/pool" + name: "inception_4a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4a/pool" + top: "inception_4a/pool_proj" + name: "inception_4a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/pool_proj" + top: "inception_4a/pool_proj" + name: "inception_4a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4a/1x1" + bottom: "inception_4a/3x3" + bottom: "inception_4a/5x5" + bottom: "inception_4a/pool_proj" + top: "inception_4a/output" + name: "inception_4a/output" + type: CONCAT +} +layers { + bottom: "inception_4a/output" + top: "loss1/ave_pool" + name: "loss1/ave_pool" + type: POOLING + pooling_param { + pool: AVE + kernel_size: 5 + stride: 3 + } +} +layers { + bottom: "loss1/ave_pool" + top: "loss1/conv" + name: "loss1/conv" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.08 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "loss1/conv" + top: "loss1/conv" + name: "loss1/relu_conv" + type: RELU +} +layers { + bottom: "loss1/conv" + top: "loss1/fc" + name: "loss1/fc" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1024 + weight_filler { + type: "xavier" + std: 0.02 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "loss1/fc" + top: "loss1/fc" + name: "loss1/relu_fc" + type: RELU +} +layers { + bottom: "loss1/fc" + top: "loss1/fc" + name: "loss1/drop_fc" + type: DROPOUT + dropout_param { + dropout_ratio: 0.7 + } +} +layers { + bottom: "loss1/fc" + top: "loss1/classifier" + name: "loss1/classifier" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + std: 0.0009765625 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + bottom: "loss1/classifier" + bottom: "label" + top: "loss1/loss1" + name: "loss1/loss" + type: SOFTMAX_LOSS + loss_weight: 0.3 +} +layers { + bottom: "loss1/classifier" + bottom: "label" + top: "loss1/top-1" + name: "loss1/top-1" + type: ACCURACY + include { + phase: TEST + } +} +layers { + bottom: "loss1/classifier" + bottom: "label" + top: "loss1/top-5" + name: "loss1/top-5" + type: ACCURACY + accuracy_param { + top_k: 5 + } + include { + phase: TEST + } +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/1x1" + name: "inception_4b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/1x1" + top: "inception_4b/1x1" + name: "inception_4b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/3x3_reduce" + name: "inception_4b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3_reduce" + name: "inception_4b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3" + name: "inception_4b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 224 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/3x3" + top: "inception_4b/3x3" + name: "inception_4b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/5x5_reduce" + name: "inception_4b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5_reduce" + name: "inception_4b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5" + name: "inception_4b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/5x5" + top: "inception_4b/5x5" + name: "inception_4b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/pool" + name: "inception_4b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4b/pool" + top: "inception_4b/pool_proj" + name: "inception_4b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/pool_proj" + top: "inception_4b/pool_proj" + name: "inception_4b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4b/1x1" + bottom: "inception_4b/3x3" + bottom: "inception_4b/5x5" + bottom: "inception_4b/pool_proj" + top: "inception_4b/output" + name: "inception_4b/output" + type: CONCAT +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/1x1" + name: "inception_4c/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/1x1" + top: "inception_4c/1x1" + name: "inception_4c/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/3x3_reduce" + name: "inception_4c/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3_reduce" + name: "inception_4c/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3" + name: "inception_4c/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/3x3" + top: "inception_4c/3x3" + name: "inception_4c/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/5x5_reduce" + name: "inception_4c/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5_reduce" + name: "inception_4c/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5" + name: "inception_4c/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/5x5" + top: "inception_4c/5x5" + name: "inception_4c/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/pool" + name: "inception_4c/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4c/pool" + top: "inception_4c/pool_proj" + name: "inception_4c/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/pool_proj" + top: "inception_4c/pool_proj" + name: "inception_4c/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4c/1x1" + bottom: "inception_4c/3x3" + bottom: "inception_4c/5x5" + bottom: "inception_4c/pool_proj" + top: "inception_4c/output" + name: "inception_4c/output" + type: CONCAT +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/1x1" + name: "inception_4d/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/1x1" + top: "inception_4d/1x1" + name: "inception_4d/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/3x3_reduce" + name: "inception_4d/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 144 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3_reduce" + name: "inception_4d/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3" + name: "inception_4d/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 288 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/3x3" + top: "inception_4d/3x3" + name: "inception_4d/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/5x5_reduce" + name: "inception_4d/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5_reduce" + name: "inception_4d/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5" + name: "inception_4d/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/5x5" + top: "inception_4d/5x5" + name: "inception_4d/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/pool" + name: "inception_4d/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4d/pool" + top: "inception_4d/pool_proj" + name: "inception_4d/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/pool_proj" + top: "inception_4d/pool_proj" + name: "inception_4d/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4d/1x1" + bottom: "inception_4d/3x3" + bottom: "inception_4d/5x5" + bottom: "inception_4d/pool_proj" + top: "inception_4d/output" + name: "inception_4d/output" + type: CONCAT +} +layers { + bottom: "inception_4d/output" + top: "loss2/ave_pool" + name: "loss2/ave_pool" + type: POOLING + pooling_param { + pool: AVE + kernel_size: 5 + stride: 3 + } +} +layers { + bottom: "loss2/ave_pool" + top: "loss2/conv" + name: "loss2/conv" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.08 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "loss2/conv" + top: "loss2/conv" + name: "loss2/relu_conv" + type: RELU +} +layers { + bottom: "loss2/conv" + top: "loss2/fc" + name: "loss2/fc" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1024 + weight_filler { + type: "xavier" + std: 0.02 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "loss2/fc" + top: "loss2/fc" + name: "loss2/relu_fc" + type: RELU +} +layers { + bottom: "loss2/fc" + top: "loss2/fc" + name: "loss2/drop_fc" + type: DROPOUT + dropout_param { + dropout_ratio: 0.7 + } +} +layers { + bottom: "loss2/fc" + top: "loss2/classifier" + name: "loss2/classifier" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + std: 0.0009765625 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + bottom: "loss2/classifier" + bottom: "label" + top: "loss2/loss1" + name: "loss2/loss" + type: SOFTMAX_LOSS + loss_weight: 0.3 +} +layers { + bottom: "loss2/classifier" + bottom: "label" + top: "loss2/top-1" + name: "loss2/top-1" + type: ACCURACY + include { + phase: TEST + } +} +layers { + bottom: "loss2/classifier" + bottom: "label" + top: "loss2/top-5" + name: "loss2/top-5" + type: ACCURACY + accuracy_param { + top_k: 5 + } + include { + phase: TEST + } +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/1x1" + name: "inception_4e/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/1x1" + top: "inception_4e/1x1" + name: "inception_4e/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/3x3_reduce" + name: "inception_4e/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3_reduce" + name: "inception_4e/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3" + name: "inception_4e/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/3x3" + top: "inception_4e/3x3" + name: "inception_4e/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/5x5_reduce" + name: "inception_4e/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5_reduce" + name: "inception_4e/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5" + name: "inception_4e/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/5x5" + top: "inception_4e/5x5" + name: "inception_4e/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/pool" + name: "inception_4e/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4e/pool" + top: "inception_4e/pool_proj" + name: "inception_4e/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/pool_proj" + top: "inception_4e/pool_proj" + name: "inception_4e/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4e/1x1" + bottom: "inception_4e/3x3" + bottom: "inception_4e/5x5" + bottom: "inception_4e/pool_proj" + top: "inception_4e/output" + name: "inception_4e/output" + type: CONCAT +} +layers { + bottom: "inception_4e/output" + top: "pool4/3x3_s2" + name: "pool4/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/1x1" + name: "inception_5a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/1x1" + top: "inception_5a/1x1" + name: "inception_5a/relu_1x1" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/3x3_reduce" + name: "inception_5a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3_reduce" + name: "inception_5a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3" + name: "inception_5a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/3x3" + top: "inception_5a/3x3" + name: "inception_5a/relu_3x3" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/5x5_reduce" + name: "inception_5a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5_reduce" + name: "inception_5a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5" + name: "inception_5a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/5x5" + top: "inception_5a/5x5" + name: "inception_5a/relu_5x5" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/pool" + name: "inception_5a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_5a/pool" + top: "inception_5a/pool_proj" + name: "inception_5a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/pool_proj" + top: "inception_5a/pool_proj" + name: "inception_5a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_5a/1x1" + bottom: "inception_5a/3x3" + bottom: "inception_5a/5x5" + bottom: "inception_5a/pool_proj" + top: "inception_5a/output" + name: "inception_5a/output" + type: CONCAT +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/1x1" + name: "inception_5b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/1x1" + top: "inception_5b/1x1" + name: "inception_5b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/3x3_reduce" + name: "inception_5b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3_reduce" + name: "inception_5b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3" + name: "inception_5b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/3x3" + top: "inception_5b/3x3" + name: "inception_5b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/5x5_reduce" + name: "inception_5b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 48 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5_reduce" + name: "inception_5b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5" + name: "inception_5b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/5x5" + top: "inception_5b/5x5" + name: "inception_5b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/pool" + name: "inception_5b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_5b/pool" + top: "inception_5b/pool_proj" + name: "inception_5b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/pool_proj" + top: "inception_5b/pool_proj" + name: "inception_5b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_5b/1x1" + bottom: "inception_5b/3x3" + bottom: "inception_5b/5x5" + bottom: "inception_5b/pool_proj" + top: "inception_5b/output" + name: "inception_5b/output" + type: CONCAT +} +layers { + bottom: "inception_5b/output" + top: "pool5/7x7_s1" + name: "pool5/7x7_s1" + type: POOLING + pooling_param { + pool: AVE + kernel_size: 7 + stride: 1 + } +} +layers { + bottom: "pool5/7x7_s1" + top: "pool5/7x7_s1" + name: "pool5/drop_7x7_s1" + type: DROPOUT + dropout_param { + dropout_ratio: 0.4 + } +} +layers { + bottom: "pool5/7x7_s1" + top: "loss3/classifier" + name: "loss3/classifier" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + bottom: "loss3/classifier" + bottom: "label" + top: "loss3/loss3" + name: "loss3/loss3" + type: SOFTMAX_LOSS + loss_weight: 1 +} +layers { + bottom: "loss3/classifier" + bottom: "label" + top: "loss3/top-1" + name: "loss3/top-1" + type: ACCURACY + include { + phase: TEST + } +} +layers { + bottom: "loss3/classifier" + bottom: "label" + top: "loss3/top-5" + name: "loss3/top-5" + type: ACCURACY + accuracy_param { + top_k: 5 + } + include { + phase: TEST + } +} From f347355207601a602cc1081ea10f969f995138e9 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Sat, 20 Dec 2014 23:24:32 -0800 Subject: [PATCH 1002/2053] Added credits for training bvlc models --- models/bvlc_alexnet/readme.md | 2 ++ models/bvlc_googlenet/readme.md | 2 ++ models/bvlc_reference_caffenet/readme.md | 2 ++ models/bvlc_reference_rcnn_ilsvrc13/readme.md | 2 ++ models/finetune_flickr_style/readme.md | 2 ++ 5 files changed, 10 insertions(+) diff --git a/models/bvlc_alexnet/readme.md b/models/bvlc_alexnet/readme.md index 20c393ff26b..c25fd4f8018 100644 --- a/models/bvlc_alexnet/readme.md +++ b/models/bvlc_alexnet/readme.md @@ -18,6 +18,8 @@ The best validation performance during training was iteration 358,000 with valid This model obtains a top-1 accuracy 57.1% and a top-5 accuracy 80.2% on the validation set, using just the center crop. (Using the average of 10 crops, (4 + 1 center) * 2 mirror, should obtain a bit higher accuracy.) +This model was trained by Evan Shelhamer @shelhamer + ## License The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: diff --git a/models/bvlc_googlenet/readme.md b/models/bvlc_googlenet/readme.md index 27022d3384a..8a3bbec4f8b 100644 --- a/models/bvlc_googlenet/readme.md +++ b/models/bvlc_googlenet/readme.md @@ -5,6 +5,7 @@ caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel license: non-commercial sha1: 405fc5acd08a3bb12de8ee5e23a96bec22f08204 caffe_commit: bc614d1bd91896e3faceaf40b23b72dab47d44f5 +gist_id: 866e2aa1fd707b89b913 --- This model is a replication of the model described in the [GoogleNet](http://arxiv.org/abs/1409.4842) publication. We would like to thank Christian Szegedy for all his help in the replication of GoogleNet model. @@ -25,6 +26,7 @@ Timings for bvlc_googlenet with cuDNN using batch_size:128 on a K40c: - Average Backward pass: 1123.84 ms. - Average Forward-Backward: 1688.8 ms. +This model was trained by Sergio Guadarrama @sguada ## License diff --git a/models/bvlc_reference_caffenet/readme.md b/models/bvlc_reference_caffenet/readme.md index d1c6269ae73..b867e7386a3 100644 --- a/models/bvlc_reference_caffenet/readme.md +++ b/models/bvlc_reference_caffenet/readme.md @@ -18,6 +18,8 @@ The best validation performance during training was iteration 313,000 with valid This model obtains a top-1 accuracy 57.4% and a top-5 accuracy 80.4% on the validation set, using just the center crop. (Using the average of 10 crops, (4 + 1 center) * 2 mirror, should obtain a bit higher accuracy still.) +This model was trained by Jeff Donahue @jeffdonahue + ## License The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: diff --git a/models/bvlc_reference_rcnn_ilsvrc13/readme.md b/models/bvlc_reference_rcnn_ilsvrc13/readme.md index fb8f26d15df..5d4bc5afe32 100644 --- a/models/bvlc_reference_rcnn_ilsvrc13/readme.md +++ b/models/bvlc_reference_rcnn_ilsvrc13/readme.md @@ -13,6 +13,8 @@ Try the [detection example](http://nbviewer.ipython.org/github/BVLC/caffe/blob/m *N.B. For research purposes, make use of the official R-CNN package and not this example.* +This model was trained by Ross Girshick @rbgirshick + ## License The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: diff --git a/models/finetune_flickr_style/readme.md b/models/finetune_flickr_style/readme.md index d2a8a95f669..aac7f7c96e8 100644 --- a/models/finetune_flickr_style/readme.md +++ b/models/finetune_flickr_style/readme.md @@ -15,6 +15,8 @@ The final performance: I1017 07:36:17.370730 31333 solver.cpp:247] Iteration 100000, Testing net (#0) I1017 07:36:34.248730 31333 solver.cpp:298] Test net output #0: accuracy = 0.3916 +This model was trained by Sergey Karayev @sergeyk + ## License The Flickr Style dataset contains only URLs to images. From 396a7bd06838118b26fac7510b1cf28fbec1cd1e Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Sat, 20 Dec 2014 23:28:19 -0800 Subject: [PATCH 1003/2053] Added credits and bvlc_googlenet to model_zoo.md --- docs/model_zoo.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/model_zoo.md b/docs/model_zoo.md index 330850cbbd6..358bbb7fc91 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -15,9 +15,10 @@ To lower the friction of sharing these models, we introduce the model zoo framew First of all, we provide some trained models out of the box. Each one of these can be downloaded by running `scripts/download_model_binary.py <dirname>` where `<dirname>` is specified below: -- **BVLC Reference CaffeNet** in `models/bvlc_reference_caffenet`: AlexNet trained on ILSVRC 2012, with a minor variation from the version as described in the NIPS 2012 paper. -- **BVLC AlexNet** in `models/bvlc_alexnet`: AlexNet trained on ILSVRC 2012, almost exactly as described in NIPS 2012. -- **BVLC Reference R-CNN ILSVRC-2013** in `models/bvlc_reference_rcnn_ilsvrc13`: pure Caffe implementation of [R-CNN](https://github.com/rbgirshick/rcnn). +- **BVLC Reference CaffeNet** in `models/bvlc_reference_caffenet`: AlexNet trained on ILSVRC 2012, with a minor variation from the version as described in the NIPS 2012 paper. (Trained by Jeff Donahue @jeffdonahue) +- **BVLC AlexNet** in `models/bvlc_alexnet`: AlexNet trained on ILSVRC 2012, almost exactly as described in NIPS 2012. (Trained by Evan Shelhamer @shelhamer) +- **BVLC Reference R-CNN ILSVRC-2013** in `models/bvlc_reference_rcnn_ilsvrc13`: pure Caffe implementation of [R-CNN](https://github.com/rbgirshick/rcnn). (Trained by Ross Girshick @rbgirshick) +- **BVLC GoogleNet** in `models/bvlc_googlenet`: GoogleNet trained on ILSVRC 2012, almost exactly as described in [GoogleNet](http://arxiv.org/abs/1409.4842). (Trained by Sergio Guadarrama @sguada) User-provided models are posted to a public-editable [wiki page](https://github.com/BVLC/caffe/wiki/Model-Zoo). From 9e756bfd10bf6f3196905b8e721d9fb5abde2ad2 Mon Sep 17 00:00:00 2001 From: qipeng <pengrobertqi@163.com> Date: Tue, 16 Sep 2014 19:59:53 -0700 Subject: [PATCH 1004/2053] Display averaged loss over the last several iterations --- src/caffe/proto/caffe.proto | 4 +++- src/caffe/solver.cpp | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 9395c38f3e9..a789aeefa25 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -63,7 +63,7 @@ message NetParameter { // NOTE // Update the next available ID when you add a new SolverParameter field. // -// SolverParameter next available ID: 33 (last added: test_initialization) +// SolverParameter next available ID: 34 (last added: average_loss) message SolverParameter { ////////////////////////////////////////////////////////////////////////////// // Specifying the train and test networks @@ -113,6 +113,8 @@ message SolverParameter { // the number of iterations between displaying info. If display = 0, no info // will be displayed. optional int32 display = 6; + // Display the cost averaged over the last average_cost iterations + optional int32 average_loss = 33 [default = 1]; optional int32 max_iter = 7; // the maximum number of iterations optional string lr_policy = 8; // The learning rate decay policy. optional float gamma = 9; // The parameter to compute the learning rate. diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index ba262920a9a..5c34e487cb6 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -169,6 +169,13 @@ void Solver<Dtype>::Solve(const char* resume_file) { // resume_file above. const int start_iter = iter_; + int average_loss = this->param_.average_loss(); + + CHECK_GE(average_loss, 1) << "average_cost should be non-negative."; + + vector<Dtype> losses; + Dtype smoothed_loss = 0; + // For a network that is trained by the solver, no bottom or top vecs // should be given, and we will just provide dummy vecs. vector<Blob<Dtype>*> bottom_vec; @@ -187,8 +194,17 @@ void Solver<Dtype>::Solve(const char* resume_file) { const bool display = param_.display() && iter_ % param_.display() == 0; net_->set_debug_info(display && param_.debug_info()); Dtype loss = net_->ForwardBackward(bottom_vec); + if (losses.size() < average_loss) { + losses.push_back(loss); + int size = losses.size(); + smoothed_loss = (smoothed_loss * (size - 1) + loss) / size; + } else { + int idx = (iter_ - start_iter) % average_loss; + smoothed_loss += (loss - losses[idx]) / average_loss; + losses[idx] = loss; + } if (display) { - LOG(INFO) << "Iteration " << iter_ << ", loss = " << loss; + LOG(INFO) << "Iteration " << iter_ << ", loss = " << smoothed_loss; const vector<Blob<Dtype>*>& result = net_->output_blobs(); int score_index = 0; for (int j = 0; j < result.size(); ++j) { From 18749f8982e11eca91e1d97bc4317c6d64f9dca7 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Fri, 3 Oct 2014 17:14:20 -0700 Subject: [PATCH 1005/2053] Added Multistep, Poly and Sigmoid learning rate decay policies Conflicts: include/caffe/solver.hpp src/caffe/proto/caffe.proto src/caffe/solver.cpp --- .../lenet/lenet_multistep_solver.prototxt | 33 +++++++++++++++++ .../lenet/lenet_stepearly_solver.prototxt | 28 ++++++++++++++ include/caffe/solver.hpp | 1 + src/caffe/proto/caffe.proto | 8 +++- src/caffe/solver.cpp | 37 ++++++++++++++++--- 5 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 examples/lenet/lenet_multistep_solver.prototxt create mode 100644 examples/lenet/lenet_stepearly_solver.prototxt diff --git a/examples/lenet/lenet_multistep_solver.prototxt b/examples/lenet/lenet_multistep_solver.prototxt new file mode 100644 index 00000000000..fadd7c904d7 --- /dev/null +++ b/examples/lenet/lenet_multistep_solver.prototxt @@ -0,0 +1,33 @@ +# The training protocol buffer definition +train_net: "lenet_train.prototxt" +# The testing protocol buffer definition +test_net: "lenet_test.prototxt" +# test_iter specifies how many forward passes the test should carry out. +# In the case of MNIST, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 500 training iterations. +test_interval: 500 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.01 +momentum: 0.9 +weight_decay: 0.0005 +# The learning rate policy +lr_policy: "multistep" +gamma: 0.9 +stepvalue: 1000 +stepvalue: 2000 +stepvalue: 2500 +stepvalue: 3000 +stepvalue: 3500 +stepvalue: 4000 +# Display every 100 iterations +display: 100 +# The maximum number of iterations +max_iter: 10000 +# snapshot intermediate results +snapshot: 5000 +snapshot_prefix: "lenet" +# solver mode: 0 for CPU and 1 for GPU +solver_mode: 1 +device_id: 1 diff --git a/examples/lenet/lenet_stepearly_solver.prototxt b/examples/lenet/lenet_stepearly_solver.prototxt new file mode 100644 index 00000000000..efc6a335d8f --- /dev/null +++ b/examples/lenet/lenet_stepearly_solver.prototxt @@ -0,0 +1,28 @@ +# The training protocol buffer definition +train_net: "lenet_train.prototxt" +# The testing protocol buffer definition +test_net: "lenet_test.prototxt" +# test_iter specifies how many forward passes the test should carry out. +# In the case of MNIST, we have test batch size 100 and 100 test iterations, +# covering the full 10,000 testing images. +test_iter: 100 +# Carry out testing every 500 training iterations. +test_interval: 500 +# The base learning rate, momentum and the weight decay of the network. +base_lr: 0.01 +momentum: 0.9 +weight_decay: 0.0005 +# The learning rate policy +lr_policy: "stepearly" +gamma: 0.9 +stepearly: 1 +# Display every 100 iterations +display: 100 +# The maximum number of iterations +max_iter: 10000 +# snapshot intermediate results +snapshot: 5000 +snapshot_prefix: "lenet" +# solver mode: 0 for CPU and 1 for GPU +solver_mode: 1 +device_id: 1 diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index 6fd159d0b98..51aebb323c5 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -56,6 +56,7 @@ class Solver { SolverParameter param_; int iter_; + int current_step_; shared_ptr<Net<Dtype> > net_; vector<shared_ptr<Net<Dtype> > > test_nets_; diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index a789aeefa25..88f670fd497 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -63,7 +63,7 @@ message NetParameter { // NOTE // Update the next available ID when you add a new SolverParameter field. // -// SolverParameter next available ID: 34 (last added: average_loss) +// SolverParameter next available ID: 35 (last added: stepvalue) message SolverParameter { ////////////////////////////////////////////////////////////////////////////// // Specifying the train and test networks @@ -124,7 +124,10 @@ message SolverParameter { // regularization types supported: L1 and L2 // controlled by weight_decay optional string regularization_type = 29 [default = "L2"]; - optional int32 stepsize = 13; // the stepsize for learning rate policy "step" + // the stepsize for learning rate policy "step" + optional int32 stepsize = 13; + // the stepsize for learning rate policy "multistep" + repeated int32 stepvalue = 34; optional int32 snapshot = 14 [default = 0]; // The snapshot interval optional string snapshot_prefix = 15; // The prefix for the snapshot. // whether to snapshot diff in the results or not. Snapshotting diff will help @@ -166,6 +169,7 @@ message SolverState { optional int32 iter = 1; // The current iteration optional string learned_net = 2; // The file that stores the learned net. repeated BlobProto history = 3; // The history for sgd solvers + optional int32 current_step = 4 [default = 0]; // The current step for learning rate } enum Phase { diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 5c34e487cb6..886c3cc6edc 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -158,6 +158,7 @@ template <typename Dtype> void Solver<Dtype>::Solve(const char* resume_file) { Caffe::set_phase(Caffe::TRAIN); LOG(INFO) << "Solving " << net_->name(); + LOG(INFO) << "Learning Rate Policy: " << param_.lr_policy(); PreSolve(); iter_ = 0; @@ -257,7 +258,6 @@ void Solver<Dtype>::TestAll() { } } - template <typename Dtype> void Solver<Dtype>::Test(const int test_net_id) { LOG(INFO) << "Iteration " << iter_ @@ -336,6 +336,7 @@ void Solver<Dtype>::Snapshot() { SnapshotSolverState(&state); state.set_iter(iter_); state.set_learned_net(model_filename); + state.set_current_step(current_step_); snapshot_filename = filename + ".solverstate"; LOG(INFO) << "Snapshotting solver state to " << snapshot_filename; WriteProtoToBinaryFile(state, snapshot_filename.c_str()); @@ -351,6 +352,7 @@ void Solver<Dtype>::Restore(const char* state_file) { net_->CopyTrainedLayersFrom(net_param); } iter_ = state.iter(); + current_step_ = state.current_step(); RestoreSolverState(state); } @@ -361,8 +363,15 @@ void Solver<Dtype>::Restore(const char* state_file) { // - step: return base_lr * gamma ^ (floor(iter / step)) // - exp: return base_lr * gamma ^ iter // - inv: return base_lr * (1 + gamma * iter) ^ (- power) -// where base_lr, gamma, step and power are defined in the solver parameter -// protocol buffer, and iter is the current iteration. +// - multistep: similar to step but it allows non uniform steps defined by +// stepvalue +// - poly: the effective learning rate follows a polynomial decay, to be +// zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power) +// - sigmoid: the effective learning rate follows a sigmod decay +// return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize)))) +// +// where base_lr, max_iter, gamma, step, stepvalue and power are defined +// in the solver parameter protocol buffer, and iter is the current iteration. template <typename Dtype> Dtype SGDSolver<Dtype>::GetLearningRate() { Dtype rate; @@ -370,22 +379,38 @@ Dtype SGDSolver<Dtype>::GetLearningRate() { if (lr_policy == "fixed") { rate = this->param_.base_lr(); } else if (lr_policy == "step") { - int current_step = this->iter_ / this->param_.stepsize(); + this->current_step_ = this->iter_ / this->param_.stepsize(); rate = this->param_.base_lr() * - pow(this->param_.gamma(), current_step); + pow(this->param_.gamma(), this->current_step_); } else if (lr_policy == "exp") { rate = this->param_.base_lr() * pow(this->param_.gamma(), this->iter_); } else if (lr_policy == "inv") { rate = this->param_.base_lr() * pow(Dtype(1) + this->param_.gamma() * this->iter_, - this->param_.power()); + } else if (lr_policy == "multistep") { + if (this->current_step_ < this->param_.stepvalue_size() && + this->iter_ >= this->param_.stepvalue(this->current_step_)) { + this->current_step_++; + LOG(INFO) << "MultiStep Status: Iteration " << + this->iter_ << ", step = " << this->current_step_; + } + rate = this->param_.base_lr() * + pow(this->param_.gamma(), this->current_step_); + } else if (lr_policy == "poly") { + rate = this->param_.base_lr() * pow(Dtype(1.) - + (Dtype(this->iter_) / Dtype(this->param_.max_iter())), + this->param_.power()); + } else if (lr_policy == "sigmoid") { + rate = this->param_.base_lr() * (Dtype(1.) / + (Dtype(1.) + exp(-this->param_.gamma() * (Dtype(this->iter_) - + Dtype(this->param_.stepsize()))))); } else { LOG(FATAL) << "Unknown learning rate policy: " << lr_policy; } return rate; } - template <typename Dtype> void SGDSolver<Dtype>::PreSolve() { // Initialize the history From 899dfde6f545faa73c0ffe5732ae641b10dfbc09 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Fri, 3 Oct 2014 17:14:20 -0700 Subject: [PATCH 1006/2053] Adapt lenet_multistep_solver.prototxt to current solvers --- .../lenet_multistep_solver.prototxt | 13 +++++-------- examples/mnist/readme.md | 3 +++ 2 files changed, 8 insertions(+), 8 deletions(-) rename examples/{lenet => mnist}/lenet_multistep_solver.prototxt (74%) diff --git a/examples/lenet/lenet_multistep_solver.prototxt b/examples/mnist/lenet_multistep_solver.prototxt similarity index 74% rename from examples/lenet/lenet_multistep_solver.prototxt rename to examples/mnist/lenet_multistep_solver.prototxt index fadd7c904d7..7ee9fb60e67 100644 --- a/examples/lenet/lenet_multistep_solver.prototxt +++ b/examples/mnist/lenet_multistep_solver.prototxt @@ -1,7 +1,5 @@ -# The training protocol buffer definition -train_net: "lenet_train.prototxt" -# The testing protocol buffer definition -test_net: "lenet_test.prototxt" +# The train/test net protocol buffer definition +net: "examples/mnist/lenet_train_test.prototxt" # test_iter specifies how many forward passes the test should carry out. # In the case of MNIST, we have test batch size 100 and 100 test iterations, # covering the full 10,000 testing images. @@ -27,7 +25,6 @@ display: 100 max_iter: 10000 # snapshot intermediate results snapshot: 5000 -snapshot_prefix: "lenet" -# solver mode: 0 for CPU and 1 for GPU -solver_mode: 1 -device_id: 1 +snapshot_prefix: "examples/mnist/lenet_multistep" +# solver mode: CPU or GPU +solver_mode: GPU diff --git a/examples/mnist/readme.md b/examples/mnist/readme.md index 33ed371b4a1..ef7f5da67d5 100644 --- a/examples/mnist/readme.md +++ b/examples/mnist/readme.md @@ -282,3 +282,6 @@ You just did! All the training was carried out on the GPU. In fact, if you would and you will be using CPU for training. Isn't that easy? MNIST is a small dataset, so training with GPU does not really introduce too much benefit due to communication overheads. On larger datasets with more complex models, such as ImageNet, the computation speed difference will be more significant. + +### How to reduce the learning rate a fixed steps? +Look at lenet_multistep_solver.prototxt From cb3dbee20a46e822c2e4306b03f4b127c1db1f5c Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Thu, 16 Oct 2014 11:17:24 -0700 Subject: [PATCH 1007/2053] Fix init current_step --- examples/mnist/lenet_multistep_solver.prototxt | 11 +++++------ src/caffe/solver.cpp | 1 + 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/mnist/lenet_multistep_solver.prototxt b/examples/mnist/lenet_multistep_solver.prototxt index 7ee9fb60e67..9b22b45ba6b 100644 --- a/examples/mnist/lenet_multistep_solver.prototxt +++ b/examples/mnist/lenet_multistep_solver.prototxt @@ -13,12 +13,11 @@ weight_decay: 0.0005 # The learning rate policy lr_policy: "multistep" gamma: 0.9 -stepvalue: 1000 -stepvalue: 2000 -stepvalue: 2500 -stepvalue: 3000 -stepvalue: 3500 -stepvalue: 4000 +stepvalue: 5000 +stepvalue: 7000 +stepvalue: 8000 +stepvalue: 9000 +stepvalue: 9500 # Display every 100 iterations display: 100 # The maximum number of iterations diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 886c3cc6edc..0fd8d0f89dc 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -162,6 +162,7 @@ void Solver<Dtype>::Solve(const char* resume_file) { PreSolve(); iter_ = 0; + current_step_ = 0; if (resume_file) { LOG(INFO) << "Restoring previous solver status from " << resume_file; Restore(resume_file); From 4ba6efc7ac939be59e5ff121c0289885a9a4263d Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Tue, 2 Dec 2014 13:10:57 -0800 Subject: [PATCH 1008/2053] Added bvlc_googlenet prototxt and weights --- models/bvlc_googlenet/deploy.prototxt | 1924 ++++++++++++++++ models/bvlc_googlenet/quick_solver.prototxt | 15 + models/bvlc_googlenet/readme.md | 33 + models/bvlc_googlenet/solver.prototxt | 16 + models/bvlc_googlenet/train_val.prototxt | 2242 +++++++++++++++++++ 5 files changed, 4230 insertions(+) create mode 100644 models/bvlc_googlenet/deploy.prototxt create mode 100644 models/bvlc_googlenet/quick_solver.prototxt create mode 100644 models/bvlc_googlenet/readme.md create mode 100644 models/bvlc_googlenet/solver.prototxt create mode 100644 models/bvlc_googlenet/train_val.prototxt diff --git a/models/bvlc_googlenet/deploy.prototxt b/models/bvlc_googlenet/deploy.prototxt new file mode 100644 index 00000000000..e31a4c9cd00 --- /dev/null +++ b/models/bvlc_googlenet/deploy.prototxt @@ -0,0 +1,1924 @@ +name: "GoogleNet" +input: "data" +input_dim: 10 +input_dim: 3 +input_dim: 224 +input_dim: 224 +layers { + bottom: "data" + top: "conv1/7x7_s2" + name: "conv1/7x7_s2" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 3 + kernel_size: 7 + stride: 2 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv1/7x7_s2" + top: "conv1/7x7_s2" + name: "conv1/relu_7x7" + type: RELU +} +layers { + bottom: "conv1/7x7_s2" + top: "pool1/3x3_s2" + name: "pool1/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool1/3x3_s2" + top: "pool1/norm1" + name: "pool1/norm1" + type: LRN + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + bottom: "pool1/norm1" + top: "conv2/3x3_reduce" + name: "conv2/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv2/3x3_reduce" + top: "conv2/3x3_reduce" + name: "conv2/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "conv2/3x3_reduce" + top: "conv2/3x3" + name: "conv2/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv2/3x3" + top: "conv2/3x3" + name: "conv2/relu_3x3" + type: RELU +} +layers { + bottom: "conv2/3x3" + top: "conv2/norm2" + name: "conv2/norm2" + type: LRN + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + bottom: "conv2/norm2" + top: "pool2/3x3_s2" + name: "pool2/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/1x1" + name: "inception_3a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/1x1" + top: "inception_3a/1x1" + name: "inception_3a/relu_1x1" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/3x3_reduce" + name: "inception_3a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3_reduce" + name: "inception_3a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3" + name: "inception_3a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/3x3" + top: "inception_3a/3x3" + name: "inception_3a/relu_3x3" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/5x5_reduce" + name: "inception_3a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5_reduce" + name: "inception_3a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5" + name: "inception_3a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/5x5" + top: "inception_3a/5x5" + name: "inception_3a/relu_5x5" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/pool" + name: "inception_3a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_3a/pool" + top: "inception_3a/pool_proj" + name: "inception_3a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/pool_proj" + top: "inception_3a/pool_proj" + name: "inception_3a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_3a/1x1" + bottom: "inception_3a/3x3" + bottom: "inception_3a/5x5" + bottom: "inception_3a/pool_proj" + top: "inception_3a/output" + name: "inception_3a/output" + type: CONCAT +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/1x1" + name: "inception_3b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/1x1" + top: "inception_3b/1x1" + name: "inception_3b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/3x3_reduce" + name: "inception_3b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3_reduce" + name: "inception_3b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3" + name: "inception_3b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/3x3" + top: "inception_3b/3x3" + name: "inception_3b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/5x5_reduce" + name: "inception_3b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5_reduce" + name: "inception_3b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5" + name: "inception_3b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/5x5" + top: "inception_3b/5x5" + name: "inception_3b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/pool" + name: "inception_3b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_3b/pool" + top: "inception_3b/pool_proj" + name: "inception_3b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/pool_proj" + top: "inception_3b/pool_proj" + name: "inception_3b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_3b/1x1" + bottom: "inception_3b/3x3" + bottom: "inception_3b/5x5" + bottom: "inception_3b/pool_proj" + top: "inception_3b/output" + name: "inception_3b/output" + type: CONCAT +} +layers { + bottom: "inception_3b/output" + top: "pool3/3x3_s2" + name: "pool3/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/1x1" + name: "inception_4a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/1x1" + top: "inception_4a/1x1" + name: "inception_4a/relu_1x1" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/3x3_reduce" + name: "inception_4a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3_reduce" + name: "inception_4a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3" + name: "inception_4a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 208 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/3x3" + top: "inception_4a/3x3" + name: "inception_4a/relu_3x3" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/5x5_reduce" + name: "inception_4a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5_reduce" + name: "inception_4a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5" + name: "inception_4a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 48 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/5x5" + top: "inception_4a/5x5" + name: "inception_4a/relu_5x5" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/pool" + name: "inception_4a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4a/pool" + top: "inception_4a/pool_proj" + name: "inception_4a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/pool_proj" + top: "inception_4a/pool_proj" + name: "inception_4a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4a/1x1" + bottom: "inception_4a/3x3" + bottom: "inception_4a/5x5" + bottom: "inception_4a/pool_proj" + top: "inception_4a/output" + name: "inception_4a/output" + type: CONCAT +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/1x1" + name: "inception_4b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/1x1" + top: "inception_4b/1x1" + name: "inception_4b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/3x3_reduce" + name: "inception_4b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3_reduce" + name: "inception_4b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3" + name: "inception_4b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 224 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/3x3" + top: "inception_4b/3x3" + name: "inception_4b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/5x5_reduce" + name: "inception_4b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5_reduce" + name: "inception_4b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5" + name: "inception_4b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/5x5" + top: "inception_4b/5x5" + name: "inception_4b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/pool" + name: "inception_4b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4b/pool" + top: "inception_4b/pool_proj" + name: "inception_4b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/pool_proj" + top: "inception_4b/pool_proj" + name: "inception_4b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4b/1x1" + bottom: "inception_4b/3x3" + bottom: "inception_4b/5x5" + bottom: "inception_4b/pool_proj" + top: "inception_4b/output" + name: "inception_4b/output" + type: CONCAT +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/1x1" + name: "inception_4c/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/1x1" + top: "inception_4c/1x1" + name: "inception_4c/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/3x3_reduce" + name: "inception_4c/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3_reduce" + name: "inception_4c/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3" + name: "inception_4c/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/3x3" + top: "inception_4c/3x3" + name: "inception_4c/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/5x5_reduce" + name: "inception_4c/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5_reduce" + name: "inception_4c/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5" + name: "inception_4c/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/5x5" + top: "inception_4c/5x5" + name: "inception_4c/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/pool" + name: "inception_4c/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4c/pool" + top: "inception_4c/pool_proj" + name: "inception_4c/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/pool_proj" + top: "inception_4c/pool_proj" + name: "inception_4c/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4c/1x1" + bottom: "inception_4c/3x3" + bottom: "inception_4c/5x5" + bottom: "inception_4c/pool_proj" + top: "inception_4c/output" + name: "inception_4c/output" + type: CONCAT +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/1x1" + name: "inception_4d/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/1x1" + top: "inception_4d/1x1" + name: "inception_4d/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/3x3_reduce" + name: "inception_4d/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 144 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3_reduce" + name: "inception_4d/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3" + name: "inception_4d/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 288 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/3x3" + top: "inception_4d/3x3" + name: "inception_4d/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/5x5_reduce" + name: "inception_4d/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5_reduce" + name: "inception_4d/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5" + name: "inception_4d/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/5x5" + top: "inception_4d/5x5" + name: "inception_4d/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/pool" + name: "inception_4d/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4d/pool" + top: "inception_4d/pool_proj" + name: "inception_4d/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/pool_proj" + top: "inception_4d/pool_proj" + name: "inception_4d/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4d/1x1" + bottom: "inception_4d/3x3" + bottom: "inception_4d/5x5" + bottom: "inception_4d/pool_proj" + top: "inception_4d/output" + name: "inception_4d/output" + type: CONCAT +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/1x1" + name: "inception_4e/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/1x1" + top: "inception_4e/1x1" + name: "inception_4e/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/3x3_reduce" + name: "inception_4e/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3_reduce" + name: "inception_4e/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3" + name: "inception_4e/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/3x3" + top: "inception_4e/3x3" + name: "inception_4e/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/5x5_reduce" + name: "inception_4e/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5_reduce" + name: "inception_4e/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5" + name: "inception_4e/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/5x5" + top: "inception_4e/5x5" + name: "inception_4e/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/pool" + name: "inception_4e/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4e/pool" + top: "inception_4e/pool_proj" + name: "inception_4e/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/pool_proj" + top: "inception_4e/pool_proj" + name: "inception_4e/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4e/1x1" + bottom: "inception_4e/3x3" + bottom: "inception_4e/5x5" + bottom: "inception_4e/pool_proj" + top: "inception_4e/output" + name: "inception_4e/output" + type: CONCAT +} +layers { + bottom: "inception_4e/output" + top: "pool4/3x3_s2" + name: "pool4/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/1x1" + name: "inception_5a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/1x1" + top: "inception_5a/1x1" + name: "inception_5a/relu_1x1" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/3x3_reduce" + name: "inception_5a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3_reduce" + name: "inception_5a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3" + name: "inception_5a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/3x3" + top: "inception_5a/3x3" + name: "inception_5a/relu_3x3" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/5x5_reduce" + name: "inception_5a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5_reduce" + name: "inception_5a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5" + name: "inception_5a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/5x5" + top: "inception_5a/5x5" + name: "inception_5a/relu_5x5" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/pool" + name: "inception_5a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_5a/pool" + top: "inception_5a/pool_proj" + name: "inception_5a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/pool_proj" + top: "inception_5a/pool_proj" + name: "inception_5a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_5a/1x1" + bottom: "inception_5a/3x3" + bottom: "inception_5a/5x5" + bottom: "inception_5a/pool_proj" + top: "inception_5a/output" + name: "inception_5a/output" + type: CONCAT +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/1x1" + name: "inception_5b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/1x1" + top: "inception_5b/1x1" + name: "inception_5b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/3x3_reduce" + name: "inception_5b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3_reduce" + name: "inception_5b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3" + name: "inception_5b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/3x3" + top: "inception_5b/3x3" + name: "inception_5b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/5x5_reduce" + name: "inception_5b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 48 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5_reduce" + name: "inception_5b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5" + name: "inception_5b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/5x5" + top: "inception_5b/5x5" + name: "inception_5b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/pool" + name: "inception_5b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_5b/pool" + top: "inception_5b/pool_proj" + name: "inception_5b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/pool_proj" + top: "inception_5b/pool_proj" + name: "inception_5b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_5b/1x1" + bottom: "inception_5b/3x3" + bottom: "inception_5b/5x5" + bottom: "inception_5b/pool_proj" + top: "inception_5b/output" + name: "inception_5b/output" + type: CONCAT +} +layers { + bottom: "inception_5b/output" + top: "pool5/7x7_s1" + name: "pool5/7x7_s1" + type: POOLING + pooling_param { + pool: AVE + kernel_size: 7 + stride: 1 + } +} +layers { + bottom: "pool5/7x7_s1" + top: "pool5/7x7_s1" + name: "pool5/drop_7x7_s1" + type: DROPOUT + dropout_param { + dropout_ratio: 0.4 + } +} +layers { + bottom: "pool5/7x7_s1" + top: "loss3/classifier" + name: "loss3/classifier" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + name: "prob" + type: SOFTMAX + bottom: "loss3/classifier" + top: "prob" +} \ No newline at end of file diff --git a/models/bvlc_googlenet/quick_solver.prototxt b/models/bvlc_googlenet/quick_solver.prototxt new file mode 100644 index 00000000000..5d2f7ee70b9 --- /dev/null +++ b/models/bvlc_googlenet/quick_solver.prototxt @@ -0,0 +1,15 @@ +net: "models/bvlc_googlenet/train_val.prototxt" +test_iter: 1000 +test_interval: 4000 +test_initialization: false +display: 40 +average_loss: 40 +base_lr: 0.01 +lr_policy: "poly" +power: 0.5 +max_iter: 2400000 +momentum: 0.9 +weight_decay: 0.0002 +snapshot: 40000 +snapshot_prefix: "models/bvlc_googlenet/bvlc_googlenet_quick" +solver_mode: GPU diff --git a/models/bvlc_googlenet/readme.md b/models/bvlc_googlenet/readme.md new file mode 100644 index 00000000000..27022d3384a --- /dev/null +++ b/models/bvlc_googlenet/readme.md @@ -0,0 +1,33 @@ +--- +name: BVLC GoogleNet Model +caffemodel: bvlc_googlenet.caffemodel +caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel +license: non-commercial +sha1: 405fc5acd08a3bb12de8ee5e23a96bec22f08204 +caffe_commit: bc614d1bd91896e3faceaf40b23b72dab47d44f5 +--- + +This model is a replication of the model described in the [GoogleNet](http://arxiv.org/abs/1409.4842) publication. We would like to thank Christian Szegedy for all his help in the replication of GoogleNet model. + +Differences: +- not training with the relighting data-augmentation; +- not training with the scale or aspect-ratio data-augmentation; +- uses "xavier" to initialize the weights instead of "gaussian"; +- quick_solver.prototxt uses a different learning rate decay policy than the original solver.prototxt, that allows a much faster training (60 epochs vs 250 epochs); + +The bundled model is the iteration 2,400,000 snapshot (60 epochs) using quick_solver.prototxt + +This bundled model obtains a top-1 accuracy 68.7% (31.3% error) and a top-5 accuracy 88.9% (11.1% error) on the validation set, using just the center crop. +(Using the average of 10 crops, (4 + 1 center) * 2 mirror, should obtain a bit higher accuracy.) + +Timings for bvlc_googlenet with cuDNN using batch_size:128 on a K40c: + - Average Forward pass: 562.841 ms. + - Average Backward pass: 1123.84 ms. + - Average Forward-Backward: 1688.8 ms. + + +## License + +The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: +"Researcher shall use the Database only for non-commercial research and educational purposes." +Accordingly, this model is distributed under a non-commercial license. diff --git a/models/bvlc_googlenet/solver.prototxt b/models/bvlc_googlenet/solver.prototxt new file mode 100644 index 00000000000..d7d1788173c --- /dev/null +++ b/models/bvlc_googlenet/solver.prototxt @@ -0,0 +1,16 @@ +net: "models/bvlc_googlenet/train_val.prototxt" +test_iter: 1000 +test_interval: 4000 +test_initialization: false +display: 40 +average_loss: 40 +base_lr: 0.01 +lr_policy: "step" +stepsize: 320000 +gamma: 0.96 +max_iter: 10000000 +momentum: 0.9 +weight_decay: 0.0002 +snapshot: 40000 +snapshot_prefix: "models/bvlc_googlenet/bvlc_googlenet" +solver_mode: GPU diff --git a/models/bvlc_googlenet/train_val.prototxt b/models/bvlc_googlenet/train_val.prototxt new file mode 100644 index 00000000000..156d05fd254 --- /dev/null +++ b/models/bvlc_googlenet/train_val.prototxt @@ -0,0 +1,2242 @@ +name: "GoogleNet" +layers { + top: "data" + top: "label" + name: "data" + type: DATA + data_param { + source: "examples/imagenet/ilsvrc12_train_lmdb" + batch_size: 32 + backend: LMDB + } + include { + phase: TRAIN + } + transform_param { + mirror: true + crop_size: 224 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + # mean_value: 104 + # mean_value: 117 + # mean_value: 123 + } +} +layers { + top: "data" + top: "label" + name: "data" + type: DATA + data_param { + source: "examples/imagenet/ilsvrc12_val_lmdb" + batch_size: 50 + backend: LMDB + } + include { + phase: TEST + } + transform_param { + mirror: false + crop_size: 224 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + # mean_value: 104 + # mean_value: 117 + # mean_value: 123 + } +} +layers { + bottom: "data" + top: "conv1/7x7_s2" + name: "conv1/7x7_s2" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 3 + kernel_size: 7 + stride: 2 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv1/7x7_s2" + top: "conv1/7x7_s2" + name: "conv1/relu_7x7" + type: RELU +} +layers { + bottom: "conv1/7x7_s2" + top: "pool1/3x3_s2" + name: "pool1/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool1/3x3_s2" + top: "pool1/norm1" + name: "pool1/norm1" + type: LRN + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + bottom: "pool1/norm1" + top: "conv2/3x3_reduce" + name: "conv2/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv2/3x3_reduce" + top: "conv2/3x3_reduce" + name: "conv2/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "conv2/3x3_reduce" + top: "conv2/3x3" + name: "conv2/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "conv2/3x3" + top: "conv2/3x3" + name: "conv2/relu_3x3" + type: RELU +} +layers { + bottom: "conv2/3x3" + top: "conv2/norm2" + name: "conv2/norm2" + type: LRN + lrn_param { + local_size: 5 + alpha: 0.0001 + beta: 0.75 + } +} +layers { + bottom: "conv2/norm2" + top: "pool2/3x3_s2" + name: "pool2/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/1x1" + name: "inception_3a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/1x1" + top: "inception_3a/1x1" + name: "inception_3a/relu_1x1" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/3x3_reduce" + name: "inception_3a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3_reduce" + name: "inception_3a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_3a/3x3_reduce" + top: "inception_3a/3x3" + name: "inception_3a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/3x3" + top: "inception_3a/3x3" + name: "inception_3a/relu_3x3" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/5x5_reduce" + name: "inception_3a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5_reduce" + name: "inception_3a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_3a/5x5_reduce" + top: "inception_3a/5x5" + name: "inception_3a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/5x5" + top: "inception_3a/5x5" + name: "inception_3a/relu_5x5" + type: RELU +} +layers { + bottom: "pool2/3x3_s2" + top: "inception_3a/pool" + name: "inception_3a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_3a/pool" + top: "inception_3a/pool_proj" + name: "inception_3a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3a/pool_proj" + top: "inception_3a/pool_proj" + name: "inception_3a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_3a/1x1" + bottom: "inception_3a/3x3" + bottom: "inception_3a/5x5" + bottom: "inception_3a/pool_proj" + top: "inception_3a/output" + name: "inception_3a/output" + type: CONCAT +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/1x1" + name: "inception_3b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/1x1" + top: "inception_3b/1x1" + name: "inception_3b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/3x3_reduce" + name: "inception_3b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3_reduce" + name: "inception_3b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_3b/3x3_reduce" + top: "inception_3b/3x3" + name: "inception_3b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/3x3" + top: "inception_3b/3x3" + name: "inception_3b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/5x5_reduce" + name: "inception_3b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5_reduce" + name: "inception_3b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_3b/5x5_reduce" + top: "inception_3b/5x5" + name: "inception_3b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/5x5" + top: "inception_3b/5x5" + name: "inception_3b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_3a/output" + top: "inception_3b/pool" + name: "inception_3b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_3b/pool" + top: "inception_3b/pool_proj" + name: "inception_3b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_3b/pool_proj" + top: "inception_3b/pool_proj" + name: "inception_3b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_3b/1x1" + bottom: "inception_3b/3x3" + bottom: "inception_3b/5x5" + bottom: "inception_3b/pool_proj" + top: "inception_3b/output" + name: "inception_3b/output" + type: CONCAT +} +layers { + bottom: "inception_3b/output" + top: "pool3/3x3_s2" + name: "pool3/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/1x1" + name: "inception_4a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/1x1" + top: "inception_4a/1x1" + name: "inception_4a/relu_1x1" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/3x3_reduce" + name: "inception_4a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 96 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3_reduce" + name: "inception_4a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4a/3x3_reduce" + top: "inception_4a/3x3" + name: "inception_4a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 208 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/3x3" + top: "inception_4a/3x3" + name: "inception_4a/relu_3x3" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/5x5_reduce" + name: "inception_4a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 16 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5_reduce" + name: "inception_4a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4a/5x5_reduce" + top: "inception_4a/5x5" + name: "inception_4a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 48 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/5x5" + top: "inception_4a/5x5" + name: "inception_4a/relu_5x5" + type: RELU +} +layers { + bottom: "pool3/3x3_s2" + top: "inception_4a/pool" + name: "inception_4a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4a/pool" + top: "inception_4a/pool_proj" + name: "inception_4a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4a/pool_proj" + top: "inception_4a/pool_proj" + name: "inception_4a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4a/1x1" + bottom: "inception_4a/3x3" + bottom: "inception_4a/5x5" + bottom: "inception_4a/pool_proj" + top: "inception_4a/output" + name: "inception_4a/output" + type: CONCAT +} +layers { + bottom: "inception_4a/output" + top: "loss1/ave_pool" + name: "loss1/ave_pool" + type: POOLING + pooling_param { + pool: AVE + kernel_size: 5 + stride: 3 + } +} +layers { + bottom: "loss1/ave_pool" + top: "loss1/conv" + name: "loss1/conv" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.08 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "loss1/conv" + top: "loss1/conv" + name: "loss1/relu_conv" + type: RELU +} +layers { + bottom: "loss1/conv" + top: "loss1/fc" + name: "loss1/fc" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1024 + weight_filler { + type: "xavier" + std: 0.02 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "loss1/fc" + top: "loss1/fc" + name: "loss1/relu_fc" + type: RELU +} +layers { + bottom: "loss1/fc" + top: "loss1/fc" + name: "loss1/drop_fc" + type: DROPOUT + dropout_param { + dropout_ratio: 0.7 + } +} +layers { + bottom: "loss1/fc" + top: "loss1/classifier" + name: "loss1/classifier" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + std: 0.0009765625 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + bottom: "loss1/classifier" + bottom: "label" + top: "loss1/loss1" + name: "loss1/loss" + type: SOFTMAX_LOSS + loss_weight: 0.3 +} +layers { + bottom: "loss1/classifier" + bottom: "label" + top: "loss1/top-1" + name: "loss1/top-1" + type: ACCURACY + include { + phase: TEST + } +} +layers { + bottom: "loss1/classifier" + bottom: "label" + top: "loss1/top-5" + name: "loss1/top-5" + type: ACCURACY + accuracy_param { + top_k: 5 + } + include { + phase: TEST + } +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/1x1" + name: "inception_4b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/1x1" + top: "inception_4b/1x1" + name: "inception_4b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/3x3_reduce" + name: "inception_4b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3_reduce" + name: "inception_4b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4b/3x3_reduce" + top: "inception_4b/3x3" + name: "inception_4b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 224 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/3x3" + top: "inception_4b/3x3" + name: "inception_4b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/5x5_reduce" + name: "inception_4b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5_reduce" + name: "inception_4b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4b/5x5_reduce" + top: "inception_4b/5x5" + name: "inception_4b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/5x5" + top: "inception_4b/5x5" + name: "inception_4b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4a/output" + top: "inception_4b/pool" + name: "inception_4b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4b/pool" + top: "inception_4b/pool_proj" + name: "inception_4b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4b/pool_proj" + top: "inception_4b/pool_proj" + name: "inception_4b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4b/1x1" + bottom: "inception_4b/3x3" + bottom: "inception_4b/5x5" + bottom: "inception_4b/pool_proj" + top: "inception_4b/output" + name: "inception_4b/output" + type: CONCAT +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/1x1" + name: "inception_4c/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/1x1" + top: "inception_4c/1x1" + name: "inception_4c/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/3x3_reduce" + name: "inception_4c/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3_reduce" + name: "inception_4c/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4c/3x3_reduce" + top: "inception_4c/3x3" + name: "inception_4c/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/3x3" + top: "inception_4c/3x3" + name: "inception_4c/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/5x5_reduce" + name: "inception_4c/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 24 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5_reduce" + name: "inception_4c/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4c/5x5_reduce" + top: "inception_4c/5x5" + name: "inception_4c/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/5x5" + top: "inception_4c/5x5" + name: "inception_4c/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4b/output" + top: "inception_4c/pool" + name: "inception_4c/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4c/pool" + top: "inception_4c/pool_proj" + name: "inception_4c/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4c/pool_proj" + top: "inception_4c/pool_proj" + name: "inception_4c/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4c/1x1" + bottom: "inception_4c/3x3" + bottom: "inception_4c/5x5" + bottom: "inception_4c/pool_proj" + top: "inception_4c/output" + name: "inception_4c/output" + type: CONCAT +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/1x1" + name: "inception_4d/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 112 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/1x1" + top: "inception_4d/1x1" + name: "inception_4d/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/3x3_reduce" + name: "inception_4d/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 144 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3_reduce" + name: "inception_4d/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4d/3x3_reduce" + top: "inception_4d/3x3" + name: "inception_4d/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 288 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/3x3" + top: "inception_4d/3x3" + name: "inception_4d/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/5x5_reduce" + name: "inception_4d/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5_reduce" + name: "inception_4d/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4d/5x5_reduce" + top: "inception_4d/5x5" + name: "inception_4d/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/5x5" + top: "inception_4d/5x5" + name: "inception_4d/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4c/output" + top: "inception_4d/pool" + name: "inception_4d/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4d/pool" + top: "inception_4d/pool_proj" + name: "inception_4d/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 64 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4d/pool_proj" + top: "inception_4d/pool_proj" + name: "inception_4d/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4d/1x1" + bottom: "inception_4d/3x3" + bottom: "inception_4d/5x5" + bottom: "inception_4d/pool_proj" + top: "inception_4d/output" + name: "inception_4d/output" + type: CONCAT +} +layers { + bottom: "inception_4d/output" + top: "loss2/ave_pool" + name: "loss2/ave_pool" + type: POOLING + pooling_param { + pool: AVE + kernel_size: 5 + stride: 3 + } +} +layers { + bottom: "loss2/ave_pool" + top: "loss2/conv" + name: "loss2/conv" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.08 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "loss2/conv" + top: "loss2/conv" + name: "loss2/relu_conv" + type: RELU +} +layers { + bottom: "loss2/conv" + top: "loss2/fc" + name: "loss2/fc" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1024 + weight_filler { + type: "xavier" + std: 0.02 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "loss2/fc" + top: "loss2/fc" + name: "loss2/relu_fc" + type: RELU +} +layers { + bottom: "loss2/fc" + top: "loss2/fc" + name: "loss2/drop_fc" + type: DROPOUT + dropout_param { + dropout_ratio: 0.7 + } +} +layers { + bottom: "loss2/fc" + top: "loss2/classifier" + name: "loss2/classifier" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + std: 0.0009765625 + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + bottom: "loss2/classifier" + bottom: "label" + top: "loss2/loss1" + name: "loss2/loss" + type: SOFTMAX_LOSS + loss_weight: 0.3 +} +layers { + bottom: "loss2/classifier" + bottom: "label" + top: "loss2/top-1" + name: "loss2/top-1" + type: ACCURACY + include { + phase: TEST + } +} +layers { + bottom: "loss2/classifier" + bottom: "label" + top: "loss2/top-5" + name: "loss2/top-5" + type: ACCURACY + accuracy_param { + top_k: 5 + } + include { + phase: TEST + } +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/1x1" + name: "inception_4e/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/1x1" + top: "inception_4e/1x1" + name: "inception_4e/relu_1x1" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/3x3_reduce" + name: "inception_4e/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3_reduce" + name: "inception_4e/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_4e/3x3_reduce" + top: "inception_4e/3x3" + name: "inception_4e/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/3x3" + top: "inception_4e/3x3" + name: "inception_4e/relu_3x3" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/5x5_reduce" + name: "inception_4e/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5_reduce" + name: "inception_4e/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_4e/5x5_reduce" + top: "inception_4e/5x5" + name: "inception_4e/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/5x5" + top: "inception_4e/5x5" + name: "inception_4e/relu_5x5" + type: RELU +} +layers { + bottom: "inception_4d/output" + top: "inception_4e/pool" + name: "inception_4e/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_4e/pool" + top: "inception_4e/pool_proj" + name: "inception_4e/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_4e/pool_proj" + top: "inception_4e/pool_proj" + name: "inception_4e/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_4e/1x1" + bottom: "inception_4e/3x3" + bottom: "inception_4e/5x5" + bottom: "inception_4e/pool_proj" + top: "inception_4e/output" + name: "inception_4e/output" + type: CONCAT +} +layers { + bottom: "inception_4e/output" + top: "pool4/3x3_s2" + name: "pool4/3x3_s2" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 2 + } +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/1x1" + name: "inception_5a/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 256 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/1x1" + top: "inception_5a/1x1" + name: "inception_5a/relu_1x1" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/3x3_reduce" + name: "inception_5a/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 160 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3_reduce" + name: "inception_5a/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_5a/3x3_reduce" + top: "inception_5a/3x3" + name: "inception_5a/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 320 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/3x3" + top: "inception_5a/3x3" + name: "inception_5a/relu_3x3" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/5x5_reduce" + name: "inception_5a/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 32 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5_reduce" + name: "inception_5a/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_5a/5x5_reduce" + top: "inception_5a/5x5" + name: "inception_5a/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/5x5" + top: "inception_5a/5x5" + name: "inception_5a/relu_5x5" + type: RELU +} +layers { + bottom: "pool4/3x3_s2" + top: "inception_5a/pool" + name: "inception_5a/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_5a/pool" + top: "inception_5a/pool_proj" + name: "inception_5a/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5a/pool_proj" + top: "inception_5a/pool_proj" + name: "inception_5a/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_5a/1x1" + bottom: "inception_5a/3x3" + bottom: "inception_5a/5x5" + bottom: "inception_5a/pool_proj" + top: "inception_5a/output" + name: "inception_5a/output" + type: CONCAT +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/1x1" + name: "inception_5b/1x1" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/1x1" + top: "inception_5b/1x1" + name: "inception_5b/relu_1x1" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/3x3_reduce" + name: "inception_5b/3x3_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 192 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.09 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3_reduce" + name: "inception_5b/relu_3x3_reduce" + type: RELU +} +layers { + bottom: "inception_5b/3x3_reduce" + top: "inception_5b/3x3" + name: "inception_5b/3x3" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 384 + pad: 1 + kernel_size: 3 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/3x3" + top: "inception_5b/3x3" + name: "inception_5b/relu_3x3" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/5x5_reduce" + name: "inception_5b/5x5_reduce" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 48 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.2 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5_reduce" + name: "inception_5b/relu_5x5_reduce" + type: RELU +} +layers { + bottom: "inception_5b/5x5_reduce" + top: "inception_5b/5x5" + name: "inception_5b/5x5" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + pad: 2 + kernel_size: 5 + weight_filler { + type: "xavier" + std: 0.03 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/5x5" + top: "inception_5b/5x5" + name: "inception_5b/relu_5x5" + type: RELU +} +layers { + bottom: "inception_5a/output" + top: "inception_5b/pool" + name: "inception_5b/pool" + type: POOLING + pooling_param { + pool: MAX + kernel_size: 3 + stride: 1 + pad: 1 + } +} +layers { + bottom: "inception_5b/pool" + top: "inception_5b/pool_proj" + name: "inception_5b/pool_proj" + type: CONVOLUTION + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + convolution_param { + num_output: 128 + kernel_size: 1 + weight_filler { + type: "xavier" + std: 0.1 + } + bias_filler { + type: "constant" + value: 0.2 + } + } +} +layers { + bottom: "inception_5b/pool_proj" + top: "inception_5b/pool_proj" + name: "inception_5b/relu_pool_proj" + type: RELU +} +layers { + bottom: "inception_5b/1x1" + bottom: "inception_5b/3x3" + bottom: "inception_5b/5x5" + bottom: "inception_5b/pool_proj" + top: "inception_5b/output" + name: "inception_5b/output" + type: CONCAT +} +layers { + bottom: "inception_5b/output" + top: "pool5/7x7_s1" + name: "pool5/7x7_s1" + type: POOLING + pooling_param { + pool: AVE + kernel_size: 7 + stride: 1 + } +} +layers { + bottom: "pool5/7x7_s1" + top: "pool5/7x7_s1" + name: "pool5/drop_7x7_s1" + type: DROPOUT + dropout_param { + dropout_ratio: 0.4 + } +} +layers { + bottom: "pool5/7x7_s1" + top: "loss3/classifier" + name: "loss3/classifier" + type: INNER_PRODUCT + blobs_lr: 1 + blobs_lr: 2 + weight_decay: 1 + weight_decay: 0 + inner_product_param { + num_output: 1000 + weight_filler { + type: "xavier" + } + bias_filler { + type: "constant" + value: 0 + } + } +} +layers { + bottom: "loss3/classifier" + bottom: "label" + top: "loss3/loss3" + name: "loss3/loss3" + type: SOFTMAX_LOSS + loss_weight: 1 +} +layers { + bottom: "loss3/classifier" + bottom: "label" + top: "loss3/top-1" + name: "loss3/top-1" + type: ACCURACY + include { + phase: TEST + } +} +layers { + bottom: "loss3/classifier" + bottom: "label" + top: "loss3/top-5" + name: "loss3/top-5" + type: ACCURACY + accuracy_param { + top_k: 5 + } + include { + phase: TEST + } +} From b99e6cdcaf10196b901cfa870d9ca5f7d9d886bf Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Sat, 20 Dec 2014 23:24:32 -0800 Subject: [PATCH 1009/2053] Added credits for training bvlc models --- models/bvlc_alexnet/readme.md | 2 ++ models/bvlc_googlenet/readme.md | 2 ++ models/bvlc_reference_caffenet/readme.md | 2 ++ models/bvlc_reference_rcnn_ilsvrc13/readme.md | 2 ++ models/finetune_flickr_style/readme.md | 2 ++ 5 files changed, 10 insertions(+) diff --git a/models/bvlc_alexnet/readme.md b/models/bvlc_alexnet/readme.md index 20c393ff26b..c25fd4f8018 100644 --- a/models/bvlc_alexnet/readme.md +++ b/models/bvlc_alexnet/readme.md @@ -18,6 +18,8 @@ The best validation performance during training was iteration 358,000 with valid This model obtains a top-1 accuracy 57.1% and a top-5 accuracy 80.2% on the validation set, using just the center crop. (Using the average of 10 crops, (4 + 1 center) * 2 mirror, should obtain a bit higher accuracy.) +This model was trained by Evan Shelhamer @shelhamer + ## License The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: diff --git a/models/bvlc_googlenet/readme.md b/models/bvlc_googlenet/readme.md index 27022d3384a..8a3bbec4f8b 100644 --- a/models/bvlc_googlenet/readme.md +++ b/models/bvlc_googlenet/readme.md @@ -5,6 +5,7 @@ caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel license: non-commercial sha1: 405fc5acd08a3bb12de8ee5e23a96bec22f08204 caffe_commit: bc614d1bd91896e3faceaf40b23b72dab47d44f5 +gist_id: 866e2aa1fd707b89b913 --- This model is a replication of the model described in the [GoogleNet](http://arxiv.org/abs/1409.4842) publication. We would like to thank Christian Szegedy for all his help in the replication of GoogleNet model. @@ -25,6 +26,7 @@ Timings for bvlc_googlenet with cuDNN using batch_size:128 on a K40c: - Average Backward pass: 1123.84 ms. - Average Forward-Backward: 1688.8 ms. +This model was trained by Sergio Guadarrama @sguada ## License diff --git a/models/bvlc_reference_caffenet/readme.md b/models/bvlc_reference_caffenet/readme.md index d1c6269ae73..b867e7386a3 100644 --- a/models/bvlc_reference_caffenet/readme.md +++ b/models/bvlc_reference_caffenet/readme.md @@ -18,6 +18,8 @@ The best validation performance during training was iteration 313,000 with valid This model obtains a top-1 accuracy 57.4% and a top-5 accuracy 80.4% on the validation set, using just the center crop. (Using the average of 10 crops, (4 + 1 center) * 2 mirror, should obtain a bit higher accuracy still.) +This model was trained by Jeff Donahue @jeffdonahue + ## License The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: diff --git a/models/bvlc_reference_rcnn_ilsvrc13/readme.md b/models/bvlc_reference_rcnn_ilsvrc13/readme.md index fb8f26d15df..5d4bc5afe32 100644 --- a/models/bvlc_reference_rcnn_ilsvrc13/readme.md +++ b/models/bvlc_reference_rcnn_ilsvrc13/readme.md @@ -13,6 +13,8 @@ Try the [detection example](http://nbviewer.ipython.org/github/BVLC/caffe/blob/m *N.B. For research purposes, make use of the official R-CNN package and not this example.* +This model was trained by Ross Girshick @rbgirshick + ## License The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: diff --git a/models/finetune_flickr_style/readme.md b/models/finetune_flickr_style/readme.md index d2a8a95f669..aac7f7c96e8 100644 --- a/models/finetune_flickr_style/readme.md +++ b/models/finetune_flickr_style/readme.md @@ -15,6 +15,8 @@ The final performance: I1017 07:36:17.370730 31333 solver.cpp:247] Iteration 100000, Testing net (#0) I1017 07:36:34.248730 31333 solver.cpp:298] Test net output #0: accuracy = 0.3916 +This model was trained by Sergey Karayev @sergeyk + ## License The Flickr Style dataset contains only URLs to images. From 43357d089484efdad843f79b4efcd83c7b74ed6e Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Sat, 20 Dec 2014 23:28:19 -0800 Subject: [PATCH 1010/2053] Added credits and bvlc_googlenet to model_zoo.md --- docs/model_zoo.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/model_zoo.md b/docs/model_zoo.md index 330850cbbd6..358bbb7fc91 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -15,9 +15,10 @@ To lower the friction of sharing these models, we introduce the model zoo framew First of all, we provide some trained models out of the box. Each one of these can be downloaded by running `scripts/download_model_binary.py <dirname>` where `<dirname>` is specified below: -- **BVLC Reference CaffeNet** in `models/bvlc_reference_caffenet`: AlexNet trained on ILSVRC 2012, with a minor variation from the version as described in the NIPS 2012 paper. -- **BVLC AlexNet** in `models/bvlc_alexnet`: AlexNet trained on ILSVRC 2012, almost exactly as described in NIPS 2012. -- **BVLC Reference R-CNN ILSVRC-2013** in `models/bvlc_reference_rcnn_ilsvrc13`: pure Caffe implementation of [R-CNN](https://github.com/rbgirshick/rcnn). +- **BVLC Reference CaffeNet** in `models/bvlc_reference_caffenet`: AlexNet trained on ILSVRC 2012, with a minor variation from the version as described in the NIPS 2012 paper. (Trained by Jeff Donahue @jeffdonahue) +- **BVLC AlexNet** in `models/bvlc_alexnet`: AlexNet trained on ILSVRC 2012, almost exactly as described in NIPS 2012. (Trained by Evan Shelhamer @shelhamer) +- **BVLC Reference R-CNN ILSVRC-2013** in `models/bvlc_reference_rcnn_ilsvrc13`: pure Caffe implementation of [R-CNN](https://github.com/rbgirshick/rcnn). (Trained by Ross Girshick @rbgirshick) +- **BVLC GoogleNet** in `models/bvlc_googlenet`: GoogleNet trained on ILSVRC 2012, almost exactly as described in [GoogleNet](http://arxiv.org/abs/1409.4842). (Trained by Sergio Guadarrama @sguada) User-provided models are posted to a public-editable [wiki page](https://github.com/BVLC/caffe/wiki/Model-Zoo). From d00c465a69541a1b82d6171d44f266b419c62b43 Mon Sep 17 00:00:00 2001 From: Sergio <sguada@gmail.com> Date: Sun, 21 Dec 2014 14:03:49 -0800 Subject: [PATCH 1011/2053] Warning of fallback only the first time for cudnn_pooling_layer --- src/caffe/layers/cudnn_pooling_layer.cu | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/caffe/layers/cudnn_pooling_layer.cu b/src/caffe/layers/cudnn_pooling_layer.cu index 99c409dcc96..7cdc0afadcb 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cu +++ b/src/caffe/layers/cudnn_pooling_layer.cu @@ -14,7 +14,8 @@ void CuDNNPoolingLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, vector<Blob<Dtype>*>* top) { // Fallback to Caffe for padded pooling, max top mask. if ((this->pad_h_ > 0 || this->pad_w_ > 0) || (*top).size() > 1) { - LOG(WARNING) << "Falling back to standard Caffe for padded pooling."; + LOG_FIRST_N(WARNING, 1) + << "Falling back to standard Caffe for padded pooling."; return PoolingLayer<Dtype>::Forward_gpu(bottom, top); } @@ -33,7 +34,8 @@ void CuDNNPoolingLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, // Fallback to Caffe for padded pooling, max top mask. if ((this->pad_h_ > 0 || this->pad_w_ > 0) || top.size() > 1) { - LOG(WARNING) << "Falling back to standard Caffe for padded pooling."; + LOG_FIRST_N(WARNING, 1) + << "Falling back to standard Caffe for padded pooling."; return PoolingLayer<Dtype>::Backward_gpu(top, propagate_down, bottom); } From b00445630bef5db71dc4e9346b8da62cb4c2e2b5 Mon Sep 17 00:00:00 2001 From: "Peihao.Huang" <hao.1120@163.com> Date: Tue, 23 Dec 2014 11:18:51 +0800 Subject: [PATCH 1012/2053] switch cifar10 example to lmdb --- examples/cifar10/cifar10_full_train_test.prototxt | 6 ++++-- examples/cifar10/cifar10_quick_train_test.prototxt | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/examples/cifar10/cifar10_full_train_test.prototxt b/examples/cifar10/cifar10_full_train_test.prototxt index 8fde19f046e..38cc04f4a68 100644 --- a/examples/cifar10/cifar10_full_train_test.prototxt +++ b/examples/cifar10/cifar10_full_train_test.prototxt @@ -5,8 +5,9 @@ layers { top: "data" top: "label" data_param { - source: "examples/cifar10/cifar10_train_leveldb" + source: "examples/cifar10/cifar10_train_lmdb" batch_size: 100 + backend: LMDB } transform_param { mean_file: "examples/cifar10/mean.binaryproto" @@ -19,8 +20,9 @@ layers { top: "data" top: "label" data_param { - source: "examples/cifar10/cifar10_test_leveldb" + source: "examples/cifar10/cifar10_test_lmdb" batch_size: 100 + backend: LMDB } transform_param { mean_file: "examples/cifar10/mean.binaryproto" diff --git a/examples/cifar10/cifar10_quick_train_test.prototxt b/examples/cifar10/cifar10_quick_train_test.prototxt index 409cfe809f4..074bb0011e3 100644 --- a/examples/cifar10/cifar10_quick_train_test.prototxt +++ b/examples/cifar10/cifar10_quick_train_test.prototxt @@ -5,8 +5,9 @@ layers { top: "data" top: "label" data_param { - source: "examples/cifar10/cifar10_train_leveldb" + source: "examples/cifar10/cifar10_train_lmdb" batch_size: 100 + backend: LMDB } transform_param { mean_file: "examples/cifar10/mean.binaryproto" @@ -19,8 +20,9 @@ layers { top: "data" top: "label" data_param { - source: "examples/cifar10/cifar10_test_leveldb" + source: "examples/cifar10/cifar10_test_lmdb" batch_size: 100 + backend: LMDB } transform_param { mean_file: "examples/cifar10/mean.binaryproto" From 0d21a1f8826a04c18058449c0bd1a3c64b939c44 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 27 Dec 2014 01:47:59 -0800 Subject: [PATCH 1013/2053] update use of GetLayer -> LayerRegistry::CreateLayer --- src/caffe/net.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 21ab15fd31b..e4492cfd6e3 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -62,7 +62,8 @@ void Net<Dtype>::Init(const NetParameter& in_param) { bottom_need_backward_.resize(param.layers_size()); for (int layer_id = 0; layer_id < param.layers_size(); ++layer_id) { const LayerParameter& layer_param = param.layers(layer_id); - layers_.push_back(shared_ptr<Layer<Dtype> >(GetLayer<Dtype>(layer_param))); + layers_.push_back(shared_ptr<Layer<Dtype> >( + LayerRegistry<Dtype>::CreateLayer(layer_param))); layer_names_.push_back(layer_param.name()); LOG(INFO) << "Creating Layer " << layer_param.name(); bool need_backward = false; From fba2471ab7e94fc6c6ae5984d58f643716dcec91 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 24 Nov 2014 13:37:06 -0800 Subject: [PATCH 1014/2053] automatic dependency generation --- Makefile | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 54d5636135d..75619c01da0 100644 --- a/Makefile +++ b/Makefile @@ -30,8 +30,6 @@ DYNAMIC_NAME := $(LIB_BUILD_DIR)/lib$(PROJECT).so ############################## # CXX_SRCS are the source files excluding the test ones. CXX_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cpp" -name "*.cpp") -# HXX_SRCS are the header files -HXX_SRCS := $(shell find include/$(PROJECT) ! -name "test_*.hpp" -name "*.hpp") # CU_SRCS are the cuda source files CU_SRCS := $(shell find src/$(PROJECT) ! -name "test_*.cu" -name "*.cu") # TEST_SRCS are the test source files @@ -40,8 +38,6 @@ TEST_SRCS := $(shell find src/$(PROJECT) -name "test_*.cpp") TEST_SRCS := $(filter-out $(TEST_MAIN_SRC), $(TEST_SRCS)) TEST_CU_SRCS := $(shell find src/$(PROJECT) -name "test_*.cu") GTEST_SRC := src/gtest/gtest-all.cpp -# TEST_HXX_SRCS are the test header files -TEST_HXX_SRCS := $(shell find include/$(PROJECT) -name "test_*.hpp") # TOOL_SRCS are the source files for the tool binaries TOOL_SRCS := $(shell find tools -name "*.cpp") # EXAMPLE_SRCS are the source files for the example binaries @@ -90,7 +86,6 @@ PROTO_GEN_HEADER_SRCS := $(addprefix $(PROTO_BUILD_DIR)/, \ $(notdir ${PROTO_SRCS:.proto=.pb.h})) PROTO_GEN_HEADER := $(addprefix $(PROTO_BUILD_INCLUDE_DIR)/, \ $(notdir ${PROTO_SRCS:.proto=.pb.h})) -HXX_SRCS += $(PROTO_GEN_HEADER) PROTO_GEN_CC := $(addprefix $(BUILD_DIR)/, ${PROTO_SRCS:.proto=.pb.cc}) PY_PROTO_BUILD_DIR := python/$(PROJECT)/proto PY_PROTO_INIT := python/$(PROJECT)/proto/__init__.py @@ -113,6 +108,9 @@ TEST_CU_OBJS := $(addprefix $(BUILD_DIR)/cuda/, ${TEST_CU_SRCS:.cu=.o}) TEST_OBJS := $(TEST_CXX_OBJS) $(TEST_CU_OBJS) GTEST_OBJ := $(addprefix $(BUILD_DIR)/, ${GTEST_SRC:.cpp=.o}) EXAMPLE_OBJS := $(addprefix $(BUILD_DIR)/, ${EXAMPLE_SRCS:.cpp=.o}) +# Output files for automatic dependency generation +DEPS := ${CXX_OBJS:.o=.d} ${CU_OBJS:.o=.d} ${TEST_CXX_OBJS:.o=.d} \ + ${TEST_CU_OBJS:.o=.d} # tool, example, and test bins TOOL_BINS := ${TOOL_OBJS:.o=.bin} EXAMPLE_BINS := ${EXAMPLE_OBJS:.o=.bin} @@ -316,6 +314,9 @@ LIBRARY_DIRS += $(BLAS_LIB) LIBRARY_DIRS += $(LIB_BUILD_DIR) +# Automatic dependency generation (nvcc is handled separately) +CXXFLAGS += -MMD -MP + # Complete build flags. COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir)) CXXFLAGS += -pthread -fPIC $(COMMON_FLAGS) $(WARNINGS) @@ -464,7 +465,7 @@ $(STATIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) ar rcs $@ $(OBJS) @ echo -$(BUILD_DIR)/%.o: %.cpp $(HXX_SRCS) | $(ALL_BUILD_DIRS) +$(BUILD_DIR)/%.o: %.cpp | $(ALL_BUILD_DIRS) $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @@ -477,7 +478,9 @@ $(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \ @ cat $@.$(WARNS_EXT) @ echo -$(BUILD_DIR)/%.cuo: %.cu $(HXX_SRCS) | $(ALL_BUILD_DIRS) +$(BUILD_DIR)/cuda/%.o: %.cu | $(ALL_BUILD_DIRS) + $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -M $< -o ${@:.o=.d} \ + -odir $(@D) $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) @@ -564,7 +567,7 @@ superclean: clean supercleanfiles $(DIST_ALIASES): $(DISTRIBUTE_DIR) -$(DISTRIBUTE_DIR): all py $(HXX_SRCS) | $(DISTRIBUTE_SUBDIRS) +$(DISTRIBUTE_DIR): all py | $(DISTRIBUTE_SUBDIRS) # add include cp -r include $(DISTRIBUTE_DIR)/ mkdir -p $(DISTRIBUTE_DIR)/include/caffe/proto @@ -577,3 +580,5 @@ $(DISTRIBUTE_DIR): all py $(HXX_SRCS) | $(DISTRIBUTE_SUBDIRS) cp $(DYNAMIC_NAME) $(DISTRIBUTE_DIR)/lib # add python - it's not the standard way, indeed... cp -r python $(DISTRIBUTE_DIR)/python + +-include $(DEPS) From b0f45a90029797d13e31e024605a1baa478bc7bd Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Thu, 11 Dec 2014 14:45:38 -0800 Subject: [PATCH 1015/2053] pretty the build with the Q variable Unset Q (in the environment) to see full commands, or edit in Makefile.config. --- Makefile | 60 ++++++++++++++++++++--------------------- Makefile.config.example | 3 +++ 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index 75619c01da0..ea97392d8ef 100644 --- a/Makefile +++ b/Makefile @@ -402,10 +402,10 @@ py$(PROJECT): py py: $(PY$(PROJECT)_SO) $(PROTO_GEN_PY) -$(PY$(PROJECT)_SO): $(STATIC_NAME) $(PY$(PROJECT)_SRC) $(PY$(PROJECT)_HXX_SRC) - $(CXX) -shared -o $@ $(PY$(PROJECT)_SRC) \ +$(PY$(PROJECT)_SO): $(PY$(PROJECT)_SRC) $(STATIC_NAME) $(PY$(PROJECT)_HXX_SRC) + @ echo CXX $< + $(Q)$(CXX) -shared -o $@ $(PY$(PROJECT)_SRC) \ $(STATIC_LINK_COMMAND) $(LINKFLAGS) $(PYTHON_LDFLAGS) - @ echo mat$(PROJECT): mat @@ -417,11 +417,11 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) "to build mat$(PROJECT)."; \ exit 1; \ fi - $(MATLAB_DIR)/bin/mex $(MAT$(PROJECT)_SRC) \ + @ echo MEX $< + $(Q)$(MATLAB_DIR)/bin/mex $(MAT$(PROJECT)_SRC) \ CXX="$(CXX)" \ CXXFLAGS="\$$CXXFLAGS $(MATLAB_CXXFLAGS)" \ CXXLIBS="\$$CXXLIBS $(STATIC_LINK_COMMAND) $(LDFLAGS)" -output $@ - @ echo runtest: $(TEST_ALL_BIN) $(TEST_ALL_DYNLINK_BIN) $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) && \ @@ -458,57 +458,57 @@ $(ALL_BUILD_DIRS): | $(BUILD_DIR_LINK) @ mkdir -p $@ $(DYNAMIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) - $(CXX) -shared -o $@ $(OBJS) $(LINKFLAGS) $(LDFLAGS) - @ echo + @ echo LD $< + $(Q)$(CXX) -shared -o $@ $(OBJS) $(LINKFLAGS) $(LDFLAGS) $(STATIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) - ar rcs $@ $(OBJS) - @ echo + @ echo AR $< + $(Q)ar rcs $@ $(OBJS) $(BUILD_DIR)/%.o: %.cpp | $(ALL_BUILD_DIRS) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + @ echo CXX $< + $(Q)$(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) - @ echo $(PROTO_BUILD_DIR)/%.pb.o: $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_GEN_HEADER) \ | $(PROTO_BUILD_DIR) - $(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ + @ echo CXX $< + $(Q)$(CXX) $< $(CXXFLAGS) -c -o $@ 2> $@.$(WARNS_EXT) \ || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) - @ echo $(BUILD_DIR)/cuda/%.o: %.cu | $(ALL_BUILD_DIRS) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -M $< -o ${@:.o=.d} \ + @ echo NVCC $< + $(Q)$(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -M $< -o ${@:.o=.d} \ -odir $(@D) - $(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ + $(Q)$(CUDA_DIR)/bin/nvcc $(NVCCFLAGS) $(CUDA_ARCH) -c $< -o $@ 2> $@.$(WARNS_EXT) \ || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) - @ echo $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ | $(TEST_BIN_DIR) - $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ + @ echo CXX/LD -o $@ $< + $(Q)$(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ -o $@ $(LINKFLAGS) $(LDFLAGS) - @ echo $(TEST_ALL_DYNLINK_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(DYNAMIC_NAME) \ | $(TEST_BIN_DIR) - $(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) \ + @ echo CXX/LD -o $@ $< + $(Q)$(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) \ -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(PROJECT) -Wl,-rpath,$(LIB_BUILD_DIR) - @ echo $(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_CU_BUILD_DIR)/%.o \ $(GTEST_OBJ) $(STATIC_NAME) | $(TEST_BIN_DIR) - $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ + @ echo LD $< + $(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ -o $@ $(LINKFLAGS) $(LDFLAGS) - @ echo $(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_CXX_BUILD_DIR)/%.o \ $(GTEST_OBJ) $(STATIC_NAME) | $(TEST_BIN_DIR) - $(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ + @ echo LD $< + $(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ -o $@ $(LINKFLAGS) $(LDFLAGS) - @ echo # Target for extension-less symlinks to tool binaries with extension '*.bin'. $(TOOL_BUILD_DIR)/%: $(TOOL_BUILD_DIR)/%.bin | $(TOOL_BUILD_DIR) @@ -516,20 +516,20 @@ $(TOOL_BUILD_DIR)/%: $(TOOL_BUILD_DIR)/%.bin | $(TOOL_BUILD_DIR) @ ln -s $(abspath $<) $@ $(TOOL_BINS) $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) - $(CXX) $< $(STATIC_LINK_COMMAND) -o $@ $(LINKFLAGS) $(LDFLAGS) - @ echo + @ echo LD $< + $(Q)$(CXX) $< $(STATIC_LINK_COMMAND) -o $@ $(LINKFLAGS) $(LDFLAGS) proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER) $(PROTO_BUILD_DIR)/%.pb.cc $(PROTO_BUILD_DIR)/%.pb.h : \ $(PROTO_SRC_DIR)/%.proto | $(PROTO_BUILD_DIR) - protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $< - @ echo + @ echo PROTOC $< + $(Q)protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $< $(PY_PROTO_BUILD_DIR)/%_pb2.py : $(PROTO_SRC_DIR)/%.proto \ $(PY_PROTO_INIT) | $(PY_PROTO_BUILD_DIR) - protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $< - @ echo + @ echo PROTOC \(python\) $< + $(Q)protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $< $(PY_PROTO_INIT): | $(PY_PROTO_BUILD_DIR) touch $(PY_PROTO_INIT) diff --git a/Makefile.config.example b/Makefile.config.example index e11db51395d..0c996038a7c 100644 --- a/Makefile.config.example +++ b/Makefile.config.example @@ -74,3 +74,6 @@ DISTRIBUTE_DIR := distribute # The ID of the GPU that 'make runtest' will use to run unit tests. TEST_GPUID := 0 + +# enable pretty build (comment to see full commands) +Q ?= @ From b91d0ab112720b3354314b58914d7c1054695251 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sun, 28 Dec 2014 18:03:45 -0800 Subject: [PATCH 1016/2053] remove unused GetLayer function (replaced by LayerRegistry::CreateLayer) --- include/caffe/layer_factory.hpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/include/caffe/layer_factory.hpp b/include/caffe/layer_factory.hpp index b86d53346d9..c1fd6aa0d43 100644 --- a/include/caffe/layer_factory.hpp +++ b/include/caffe/layer_factory.hpp @@ -113,17 +113,6 @@ class LayerRegisterer { } \ REGISTER_LAYER_CREATOR(type, Creator_##clsname) -// A function to get a specific layer from the specification given in -// LayerParameter. Ideally this would be replaced by a factory pattern, -// but we will leave it this way for now. -// Yangqing's note: With LayerRegistry, we no longer need this thin wrapper any -// more. It is provided here for backward compatibility and should be removed in -// the future. -template <typename Dtype> -Layer<Dtype>* GetLayer(const LayerParameter& param) { - return LayerRegistry<Dtype>::CreateLayer(param); -} - } // namespace caffe #endif // CAFFE_LAYER_FACTORY_H_ From ace55bbe1b9b97004d53ff29ea172c3df1142f25 Mon Sep 17 00:00:00 2001 From: Daniel Golden <dgolden1@gmail.com> Date: Tue, 2 Dec 2014 11:20:58 -0800 Subject: [PATCH 1017/2053] Better instructions for updating Homebrew after modifying formulae Previous instructions glossed over how to deal with OpenCV-related update problems --- docs/installation.md | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index 207e17d1539..c667cd8ce01 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -208,28 +208,39 @@ If you're not using Anaconda, include `hdf5` in the list above. Aborting Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master -One solution is to commit your changes to a separate Homebrew branch, run `brew update`, and rebase your changes onto the updated master, as follows: +One solution is to commit your changes to a separate Homebrew branch, run `brew update`, and rebase your changes onto the updated master. You'll have to do this both for the main Homebrew repository in `/usr/local/` and the Homebrew science repository that contains OpenCV in `/usr/local/Library/Taps/homebrew/homebrew-science`, as follows: cd /usr/local git checkout -b caffe git add . git commit -m "Update Caffe dependencies to use libstdc++" + cd /usr/local/Library/Taps/homebrew/homebrew-science + git checkout -b caffe + git add . + git commit -m "Update Caffe dependencies" + +Then, whenever you want to update homebrew, switch back to the master branches, do the update, rebase the caffe branches onto master and fix any conflicts: + + # Switch batch to homebrew master branches + cd /usr/local + git checkout master + cd /usr/local/Library/Taps/homebrew/homebrew-science git checkout master + + # Update homebrew; hopefully this works without errors! brew update + + # Switch back to the caffe branches with the forumlae that you modified earlier + cd /usr/local git rebase master caffe - # Resolve any merge conflicts here - git checkout caffe - -At this point, you should be running the latest Homebrew packages and your Caffe-related modifications will remain in place. You may still get the following error: - - $ brew update - error: Your local changes to the following files would be overwritten by merge: - opencv.rb - Please, commit your changes or stash them before you can merge. - Aborting - Error: Failed to update tap: homebrew/science + # Fix any merge conflicts and commit to caffe branch + cd /usr/local/Library/Taps/homebrew/homebrew-science + git rebase master caffe + # Fix any merge conflicts and commit to caffe branch + + # Done! -but non-OpenCV packages will still update as expected. +At this point, you should be running the latest Homebrew packages and your Caffe-related modifications will remain in place. #### Windows From 150da0ebcfe96b236d68b5938d510dd18647bb26 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sun, 28 Dec 2014 20:57:37 -0800 Subject: [PATCH 1018/2053] [scripts] fix find warnings in upload_model_to_gist.sh --- scripts/upload_model_to_gist.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/upload_model_to_gist.sh b/scripts/upload_model_to_gist.sh index 2dfbabd72a3..3c4fd64e3fc 100755 --- a/scripts/upload_model_to_gist.sh +++ b/scripts/upload_model_to_gist.sh @@ -7,7 +7,7 @@ if [ ! -f $DIRNAME/readme.md ]; then echo " <dirname>/readme.md must exist" fi cd $DIRNAME -FILES=`find . -type f -maxdepth 1 ! -name "*.caffemodel*" | xargs echo` +FILES=`find . -maxdepth 1 -type f ! -name "*.caffemodel*" | xargs echo` # Check for gist tool. gist -v >/dev/null 2>&1 || { echo >&2 "I require 'gist' but it's not installed. Do 'gem install gist'."; exit 1; } From e348fdd73d67ff4615cb860886e9af21ed9d3d18 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 29 Dec 2014 15:13:59 -0500 Subject: [PATCH 1019/2053] [docs] groom model zoo intro + list --- docs/model_zoo.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/docs/model_zoo.md b/docs/model_zoo.md index 358bbb7fc91..97025483c58 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -3,8 +3,10 @@ title: Model Zoo --- # Caffe Model Zoo -Lots of people have used Caffe to train models of different architectures and applied to different problems, ranging from simple regression to AlexNet-alikes to Siamese networks for image similarity to speech applications. -To lower the friction of sharing these models, we introduce the model zoo framework: +Lots of researchers and engineers have made Caffe models for different tasks with all kinds of architectures and data. +These models are learned and applied for problems ranging from simple regression, to large-scale visual classification, to Siamese networks for image similarity, to speech and robotics applications. + +To help share these models, we introduce the model zoo framework: - A standard format for packaging Caffe model info. - Tools to upload/download model info to/from Github Gists, and to download trained `.caffemodel` binaries. @@ -15,10 +17,10 @@ To lower the friction of sharing these models, we introduce the model zoo framew First of all, we provide some trained models out of the box. Each one of these can be downloaded by running `scripts/download_model_binary.py <dirname>` where `<dirname>` is specified below: -- **BVLC Reference CaffeNet** in `models/bvlc_reference_caffenet`: AlexNet trained on ILSVRC 2012, with a minor variation from the version as described in the NIPS 2012 paper. (Trained by Jeff Donahue @jeffdonahue) -- **BVLC AlexNet** in `models/bvlc_alexnet`: AlexNet trained on ILSVRC 2012, almost exactly as described in NIPS 2012. (Trained by Evan Shelhamer @shelhamer) -- **BVLC Reference R-CNN ILSVRC-2013** in `models/bvlc_reference_rcnn_ilsvrc13`: pure Caffe implementation of [R-CNN](https://github.com/rbgirshick/rcnn). (Trained by Ross Girshick @rbgirshick) -- **BVLC GoogleNet** in `models/bvlc_googlenet`: GoogleNet trained on ILSVRC 2012, almost exactly as described in [GoogleNet](http://arxiv.org/abs/1409.4842). (Trained by Sergio Guadarrama @sguada) +- **BVLC Reference CaffeNet** in `models/bvlc_reference_caffenet`: AlexNet trained on ILSVRC 2012, with a minor variation from the version as described in [ImageNet classification with deep convolutional neural networks](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks) by Krizhevsky et al. in NIPS 2012. (Trained by Jeff Donahue @jeffdonahue) +- **BVLC AlexNet** in `models/bvlc_alexnet`: AlexNet trained on ILSVRC 2012, almost exactly as described in [ImageNet classification with deep convolutional neural networks](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks) by Krizhevsky et al. in NIPS 2012. (Trained by Evan Shelhamer @shelhamer) +- **BVLC Reference R-CNN ILSVRC-2013** in `models/bvlc_reference_rcnn_ilsvrc13`: pure Caffe implementation of [R-CNN](https://github.com/rbgirshick/rcnn) as described by Girshick et al. in CVPR 2014. (Trained by Ross Girshick @rbgirshick) +- **BVLC GoogLeNet** in `models/bvlc_googlenet`: GoogLeNet trained on ILSVRC 2012, almost exactly as described in [Going Deeper with Convolutions](http://arxiv.org/abs/1409.4842) by Szegedy et al. in ILSVRC 2014. (Trained by Sergio Guadarrama @sguada) User-provided models are posted to a public-editable [wiki page](https://github.com/BVLC/caffe/wiki/Model-Zoo). @@ -36,11 +38,11 @@ A caffe model is distributed as a directory containing: - License information. - [optional] Other helpful scripts. -## Hosting model info +### Hosting model info Github Gist is a good format for model info distribution because it can contain multiple files, is versionable, and has in-browser syntax highlighting and markdown rendering. -- `scripts/upload_model_to_gist.sh <dirname>`: uploads non-binary files in the model directory as a Github Gist and prints the Gist ID. If `gist_id` is already part of the `<dirname>/readme.md` frontmatter, then updates existing Gist. +`scripts/upload_model_to_gist.sh <dirname>` uploads non-binary files in the model directory as a Github Gist and prints the Gist ID. If `gist_id` is already part of the `<dirname>/readme.md` frontmatter, then updates existing Gist. Try doing `scripts/upload_model_to_gist.sh models/bvlc_alexnet` to test the uploading (don't forget to delete the uploaded gist afterward). @@ -52,4 +54,4 @@ It is up to the user where to host the `.caffemodel` file. We host our BVLC-provided models on our own server. Dropbox also works fine (tip: make sure that `?dl=1` is appended to the end of the URL). -- `scripts/download_model_binary.py <dirname>`: downloads the `.caffemodel` from the URL specified in the `<dirname>/readme.md` frontmatter and confirms SHA1. +`scripts/download_model_binary.py <dirname>` downloads the `.caffemodel` from the URL specified in the `<dirname>/readme.md` frontmatter and confirms SHA1. From 6b842060a46fae212abd1b6b783730a2fc709c7f Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 29 Dec 2014 16:23:18 -0500 Subject: [PATCH 1020/2053] [docs] open release of BVLC models for unrestricted use See BVLC model license details on the model zoo page. --- docs/model_zoo.md | 17 +++++++++++++++-- examples/classification.ipynb | 2 +- models/bvlc_alexnet/readme.md | 4 +--- models/bvlc_googlenet/readme.md | 4 +--- models/bvlc_reference_caffenet/readme.md | 4 +--- models/bvlc_reference_rcnn_ilsvrc13/readme.md | 4 +--- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/docs/model_zoo.md b/docs/model_zoo.md index 97025483c58..06dc0a49ec7 100644 --- a/docs/model_zoo.md +++ b/docs/model_zoo.md @@ -14,7 +14,9 @@ To help share these models, we introduce the model zoo framework: ## Where to get trained models -First of all, we provide some trained models out of the box. +First of all, we bundle BVLC-trained models for unrestricted, out of the box use. +<br> +See the [BVLC model license](#bvlc-model-license) for details. Each one of these can be downloaded by running `scripts/download_model_binary.py <dirname>` where `<dirname>` is specified below: - **BVLC Reference CaffeNet** in `models/bvlc_reference_caffenet`: AlexNet trained on ILSVRC 2012, with a minor variation from the version as described in [ImageNet classification with deep convolutional neural networks](http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks) by Krizhevsky et al. in NIPS 2012. (Trained by Jeff Donahue @jeffdonahue) @@ -22,7 +24,9 @@ Each one of these can be downloaded by running `scripts/download_model_binary.py - **BVLC Reference R-CNN ILSVRC-2013** in `models/bvlc_reference_rcnn_ilsvrc13`: pure Caffe implementation of [R-CNN](https://github.com/rbgirshick/rcnn) as described by Girshick et al. in CVPR 2014. (Trained by Ross Girshick @rbgirshick) - **BVLC GoogLeNet** in `models/bvlc_googlenet`: GoogLeNet trained on ILSVRC 2012, almost exactly as described in [Going Deeper with Convolutions](http://arxiv.org/abs/1409.4842) by Szegedy et al. in ILSVRC 2014. (Trained by Sergio Guadarrama @sguada) -User-provided models are posted to a public-editable [wiki page](https://github.com/BVLC/caffe/wiki/Model-Zoo). +**Community models** made by Caffe users are posted to a publicly editable [wiki page](https://github.com/BVLC/caffe/wiki/Model-Zoo). +These models are subject to conditions of their respective authors such as citation and license. +Thank you for sharing your models! ## Model info format @@ -55,3 +59,12 @@ We host our BVLC-provided models on our own server. Dropbox also works fine (tip: make sure that `?dl=1` is appended to the end of the URL). `scripts/download_model_binary.py <dirname>` downloads the `.caffemodel` from the URL specified in the `<dirname>/readme.md` frontmatter and confirms SHA1. + +## BVLC model license + +The Caffe models bundled by the BVLC are released for unrestricted use. + +These models are trained on data from the [ImageNet project](http://www.image-net.org/) and training data includes internet photos that may be subject to copyright. + +Our present understanding as researchers is that there is no restriction placed on the open release of these learned model weights, since none of the original images are distributed in whole or in part. +To the extent that the interpretation arises that weights are derivative works of the original copyright holder and they assert such a copyright, UC Berkeley makes no representations as to what use is allowed other than to consider our present release in the spirit of fair use in the academic mission of the university to disseminate knowledge and tools as broadly as possible without restriction. diff --git a/examples/classification.ipynb b/examples/classification.ipynb index fb44da8958f..1e2126fe652 100644 --- a/examples/classification.ipynb +++ b/examples/classification.ipynb @@ -19,7 +19,7 @@ "\n", "Caffe provides a general Python interface for models with `caffe.Net` in `python/caffe/pycaffe.py`, but to make off-the-shelf classification easy we provide a `caffe.Classifier` class and `classify.py` script. Both Python and MATLAB wrappers are provided. However, the Python wrapper has more features so we will describe it here. For MATLAB, refer to `matlab/caffe/matcaffe_demo.m`.\n", "\n", - "Before we begin, you must compile Caffe and install the python wrapper by setting your `PYTHONPATH`. If you haven't yet done so, please refer to the [installation instructions](installation.html). This example uses our pre-trained CaffeNet model, an ILSVRC12 image classifier. You can download it by running `./scripts/download_model_binary.py models/bvlc_reference_caffenet`. Note that this pre-trained model is licensed for academic research / non-commercial use only.\n", + "Before we begin, you must compile Caffe and install the python wrapper by setting your `PYTHONPATH`. If you haven't yet done so, please refer to the [installation instructions](installation.html). This example uses our pre-trained CaffeNet model, an ILSVRC12 image classifier. You can download it by running `./scripts/download_model_binary.py models/bvlc_reference_caffenet`.\n", "\n", "Ready? Let's start." ] diff --git a/models/bvlc_alexnet/readme.md b/models/bvlc_alexnet/readme.md index c25fd4f8018..97b66bec8c2 100644 --- a/models/bvlc_alexnet/readme.md +++ b/models/bvlc_alexnet/readme.md @@ -22,6 +22,4 @@ This model was trained by Evan Shelhamer @shelhamer ## License -The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: -"Researcher shall use the Database only for non-commercial research and educational purposes." -Accordingly, this model is distributed under a non-commercial license. +This model is released for unrestricted use. diff --git a/models/bvlc_googlenet/readme.md b/models/bvlc_googlenet/readme.md index 8a3bbec4f8b..19f6b881f5c 100644 --- a/models/bvlc_googlenet/readme.md +++ b/models/bvlc_googlenet/readme.md @@ -30,6 +30,4 @@ This model was trained by Sergio Guadarrama @sguada ## License -The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: -"Researcher shall use the Database only for non-commercial research and educational purposes." -Accordingly, this model is distributed under a non-commercial license. +This model is released for unrestricted use. diff --git a/models/bvlc_reference_caffenet/readme.md b/models/bvlc_reference_caffenet/readme.md index b867e7386a3..b6b6103429a 100644 --- a/models/bvlc_reference_caffenet/readme.md +++ b/models/bvlc_reference_caffenet/readme.md @@ -22,6 +22,4 @@ This model was trained by Jeff Donahue @jeffdonahue ## License -The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: -"Researcher shall use the Database only for non-commercial research and educational purposes." -Accordingly, this model is distributed under a non-commercial license. +This model is released for unrestricted use. diff --git a/models/bvlc_reference_rcnn_ilsvrc13/readme.md b/models/bvlc_reference_rcnn_ilsvrc13/readme.md index 5d4bc5afe32..01996ee4d4a 100644 --- a/models/bvlc_reference_rcnn_ilsvrc13/readme.md +++ b/models/bvlc_reference_rcnn_ilsvrc13/readme.md @@ -17,6 +17,4 @@ This model was trained by Ross Girshick @rbgirshick ## License -The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: -"Researcher shall use the Database only for non-commercial research and educational purposes." -Accordingly, this model is distributed under a non-commercial license. +This model is released for unrestricted use. From d8a415efd099980dc0d86f1739c5b0298a46a14e Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 29 Dec 2014 17:36:08 -0800 Subject: [PATCH 1021/2053] move softmax loss GPU todo comment to header file There's no need to have GPU stubs just for a comment, and the absence of a GPU-specific implementation is made more obvious by the nonexistence of the .cu file. --- include/caffe/loss_layers.hpp | 5 +---- src/caffe/layers/softmax_loss_layer.cu | 27 -------------------------- 2 files changed, 1 insertion(+), 31 deletions(-) delete mode 100644 src/caffe/layers/softmax_loss_layer.cu diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 9fe58cd97bc..13b108afd2d 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -718,8 +718,7 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { /// @copydoc SoftmaxWithLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, - const vector<Blob<Dtype>*>& top); + // TODO(Yangqing): implement the GPU version of softmax. /** * @brief Computes the softmax loss error gradient w.r.t. the predictions. @@ -750,8 +749,6 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); - virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); /// The internal SoftmaxLayer used to map predictions to a distribution. shared_ptr<SoftmaxLayer<Dtype> > softmax_layer_; diff --git a/src/caffe/layers/softmax_loss_layer.cu b/src/caffe/layers/softmax_loss_layer.cu deleted file mode 100644 index 4cdaf51b165..00000000000 --- a/src/caffe/layers/softmax_loss_layer.cu +++ /dev/null @@ -1,27 +0,0 @@ -#include <algorithm> -#include <cfloat> -#include <vector> - -#include "caffe/layer.hpp" -#include "caffe/util/math_functions.hpp" -#include "caffe/vision_layers.hpp" - -namespace caffe { - -template <typename Dtype> -void SoftmaxWithLossLayer<Dtype>::Forward_gpu( - const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { - Forward_cpu(bottom, top); -} - -template <typename Dtype> -void SoftmaxWithLossLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { - // TODO(Yangqing): implement the GPU version of softmax. - Backward_cpu(top, propagate_down, bottom); -} - -INSTANTIATE_LAYER_GPU_FUNCS(SoftmaxWithLossLayer); - - -} // namespace caffe From 11add5bca9f31dc08329aa220d8674b7832c513d Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 29 Dec 2014 17:59:07 -0800 Subject: [PATCH 1022/2053] remove SoftmaxLossLayer CPU_ONLY stubs, since there is no GPU version --- src/caffe/layers/softmax_loss_layer.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 82c62f6a1bd..db8dd8bb626 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -85,11 +85,7 @@ void SoftmaxWithLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } } - -#ifdef CPU_ONLY -STUB_GPU(SoftmaxWithLossLayer); -#endif - INSTANTIATE_CLASS(SoftmaxWithLossLayer); REGISTER_LAYER_CLASS(SOFTMAX_LOSS, SoftmaxWithLossLayer); + } // namespace caffe From 03f87a90a3ebb66a9a2e80e3864b004aa1da87d8 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Tue, 30 Dec 2014 01:31:46 -0800 Subject: [PATCH 1023/2053] only build matcaffe as part of 'make everything' if MATLAB_DIR is set --- Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index ea97392d8ef..6361305a991 100644 --- a/Makefile +++ b/Makefile @@ -346,6 +346,13 @@ PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) # default behavior of 'find'. SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo +# Set the sub-targets of the 'everything' target. +EVERYTHING_TARGETS := all py$(PROJECT) test warn lint runtest +# Only build matcaffe as part of "everything" if MATLAB_DIR is specified. +ifneq ($(MATLAB_DIR),) + EVERYTHING_TARGETS += mat$(PROJECT) +endif + ############################## # Define build targets ############################## @@ -355,7 +362,7 @@ SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo all: $(STATIC_NAME) $(DYNAMIC_NAME) tools examples -everything: all py$(PROJECT) mat$(PROJECT) test warn lint runtest +everything: $(EVERYTHING_TARGETS) linecount: cloc --read-lang-def=$(PROJECT).cloc \ From dc1557d01c0bd43f6bc3f2d567343165c97f52e5 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Tue, 30 Dec 2014 01:33:05 -0800 Subject: [PATCH 1024/2053] don't do runtest as part of 'make everything' --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6361305a991..46bf7280919 100644 --- a/Makefile +++ b/Makefile @@ -347,7 +347,7 @@ PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) SUPERCLEAN_EXTS := .so .a .o .bin .testbin .pb.cc .pb.h _pb2.py .cuo # Set the sub-targets of the 'everything' target. -EVERYTHING_TARGETS := all py$(PROJECT) test warn lint runtest +EVERYTHING_TARGETS := all py$(PROJECT) test warn lint # Only build matcaffe as part of "everything" if MATLAB_DIR is specified. ifneq ($(MATLAB_DIR),) EVERYTHING_TARGETS += mat$(PROJECT) From 2237540de0b0ba4ec7e457cd8efe05320ace48fe Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 30 Dec 2014 12:52:53 -0800 Subject: [PATCH 1025/2053] [tests] don't use Gaussian labels in NetTest's TinyNet Previously, labels were being nonsensically filled with a zero-mean Gaussian. Now they are just set to constant zero. Note that this is not necessary for TrickyNet, neither forward nor backward are ever called. --- src/caffe/test/test_net.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 611d11bd832..319958fee49 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -75,6 +75,10 @@ class NetTest : public MultiDeviceTest<TypeParam> { " type: 'gaussian' " " std: 0.01 " " } " + " data_filler { " + " type: 'constant' " + " value: 0 " + " } " " } " " top: 'data' " " top: 'label' " From 2326bed7a63ed08b8bc240a55d34e58e8794565e Mon Sep 17 00:00:00 2001 From: Sean Bell <sbell@cs.cornell.edu> Date: Tue, 30 Dec 2014 20:06:31 -0500 Subject: [PATCH 1026/2053] fixed resize_image for the case of constant images --- python/caffe/io.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/python/caffe/io.py b/python/caffe/io.py index aabcfddbbeb..a8354021b05 100644 --- a/python/caffe/io.py +++ b/python/caffe/io.py @@ -43,11 +43,17 @@ def resize_image(im, new_dims, interp_order=1): im: resized ndarray with shape (new_dims[0], new_dims[1], K) """ if im.shape[-1] == 1 or im.shape[-1] == 3: - # skimage is fast but only understands {1,3} channel images in [0, 1]. im_min, im_max = im.min(), im.max() - im_std = (im - im_min) / (im_max - im_min) - resized_std = resize(im_std, new_dims, order=interp_order) - resized_im = resized_std * (im_max - im_min) + im_min + if im_max > im_min: + # skimage is fast but only understands {1,3} channel images in [0, 1]. + im_std = (im - im_min) / (im_max - im_min) + resized_std = resize(im_std, new_dims, order=interp_order) + resized_im = resized_std * (im_max - im_min) + im_min + else: + # the image is a constant -- avoid divide by 0 + ret = np.empty((new_dims[0], new_dims[1], im.shape[-1]), dtype=np.float32) + ret.fill(im_min) + return ret else: # ndimage interpolates anything but more slowly. scale = tuple(np.array(new_dims) / np.array(im.shape[:2])) From 5843b52558491b636bebcc5cf4ba706b074a717b Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 29 Dec 2014 17:05:47 -0800 Subject: [PATCH 1027/2053] add missing value support to SoftmaxLossLayer --- include/caffe/loss_layers.hpp | 4 ++++ src/caffe/layers/softmax_loss_layer.cpp | 28 ++++++++++++++++++++----- src/caffe/proto/caffe.proto | 11 +++++++++- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 13b108afd2d..3e4414ae6c1 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -758,6 +758,10 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { vector<Blob<Dtype>*> softmax_bottom_vec_; /// top vector holder used in call to the underlying SoftmaxLayer::Forward vector<Blob<Dtype>*> softmax_top_vec_; + /// Whether to ignore instances with a certain label. + bool has_ignore_label_; + /// The label indicating that an instance should be ignored. + int ignore_label_; }; } // namespace caffe diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index db8dd8bb626..bc511cf603b 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -17,6 +17,12 @@ void SoftmaxWithLossLayer<Dtype>::LayerSetUp( softmax_top_vec_.clear(); softmax_top_vec_.push_back(&prob_); softmax_layer_->SetUp(softmax_bottom_vec_, softmax_top_vec_); + + has_ignore_label_ = + this->layer_param_.loss_param().has_ignore_label(); + if (has_ignore_label_) { + ignore_label_ = this->layer_param_.loss_param().ignore_label(); + } } template <typename Dtype> @@ -40,15 +46,19 @@ void SoftmaxWithLossLayer<Dtype>::Forward_cpu( int num = prob_.num(); int dim = prob_.count() / num; int spatial_dim = prob_.height() * prob_.width(); + int count = 0; Dtype loss = 0; for (int i = 0; i < num; ++i) { for (int j = 0; j < spatial_dim; j++) { const int label_value = static_cast<int>(label[i * spatial_dim + j]); + if (has_ignore_label_ && label_value == ignore_label_) { + continue; + } DCHECK_GE(label_value, 0); - DCHECK_GT(dim, label_value * spatial_dim); - loss -= log(std::max(prob_data[i * dim + - label_value * spatial_dim + j], + DCHECK_LT(label_value, prob_.channels()); + loss -= log(std::max(prob_data[i * dim + label_value * spatial_dim + j], Dtype(FLT_MIN))); + ++count; } } top[0]->mutable_cpu_data()[0] = loss / num / spatial_dim; @@ -73,10 +83,18 @@ void SoftmaxWithLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, int num = prob_.num(); int dim = prob_.count() / num; int spatial_dim = prob_.height() * prob_.width(); + int count = 0; for (int i = 0; i < num; ++i) { for (int j = 0; j < spatial_dim; ++j) { - bottom_diff[i * dim + static_cast<int>(label[i * spatial_dim + j]) - * spatial_dim + j] -= 1; + const int label_value = static_cast<int>(label[i * spatial_dim + j]); + if (has_ignore_label_ && label_value == ignore_label_) { + for (int c = 0; c < bottom[0]->channels(); ++c) { + bottom_diff[i * dim + c * spatial_dim + j] = 0; + } + } else { + bottom_diff[i * dim + label_value * spatial_dim + j] -= 1; + ++count; + } } } // Scale gradient diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 8086ad66579..cfd5cca2518 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -206,7 +206,7 @@ message NetStateRule { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 42 (last added: exp_param) +// LayerParameter next available ID: 43 (last added: loss_param) message LayerParameter { repeated string bottom = 2; // the name of the bottom blobs repeated string top = 3; // the name of the top blobs @@ -331,6 +331,9 @@ message LayerParameter { // Parameters for data pre-processing. optional TransformationParameter transform_param = 36; + // Parameters shared by loss layers. + optional LossParameter loss_param = 42; + // Note: certain layers may have more than one computational engine // for their implementation. These layers include an Engine type and // engine parameter for selecting the implementation. @@ -361,6 +364,12 @@ message TransformationParameter { repeated float mean_value = 5; } +// Message that stores parameters shared by loss layers +message LossParameter { + // If specified, ignore instances with the given label. + optional int32 ignore_label = 1; +} + // Message that stores parameters used by AccuracyLayer message AccuracyParameter { // When computing accuracy, count as correct by comparing the true label to From 34321e4ecf26494ded5a05221010ccc9ea99c144 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 29 Dec 2014 17:08:21 -0800 Subject: [PATCH 1028/2053] add spatial normalization option to SoftmaxLossLayer With missing values (and batches of varying spatial dimension), normalizing each batch across instances can inappropriately give different instances different weights, so we give the option of simply normalizing by the batch size instead. --- include/caffe/loss_layers.hpp | 3 +++ src/caffe/layers/softmax_loss_layer.cpp | 13 +++++++++++-- src/caffe/proto/caffe.proto | 3 +++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 3e4414ae6c1..321f7068273 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -762,6 +762,9 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { bool has_ignore_label_; /// The label indicating that an instance should be ignored. int ignore_label_; + /// Whether to normalize the loss by the total number of values present + /// (otherwise just by the batch size). + bool normalize_; }; } // namespace caffe diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index bc511cf603b..74893af7820 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -23,6 +23,7 @@ void SoftmaxWithLossLayer<Dtype>::LayerSetUp( if (has_ignore_label_) { ignore_label_ = this->layer_param_.loss_param().ignore_label(); } + normalize_ = this->layer_param_.loss_param().normalize(); } template <typename Dtype> @@ -61,7 +62,11 @@ void SoftmaxWithLossLayer<Dtype>::Forward_cpu( ++count; } } - top[0]->mutable_cpu_data()[0] = loss / num / spatial_dim; + if (normalize_) { + top[0]->mutable_cpu_data()[0] = loss / count; + } else { + top[0]->mutable_cpu_data()[0] = loss / num; + } if (top.size() == 2) { top[1]->ShareData(prob_); } @@ -99,7 +104,11 @@ void SoftmaxWithLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } // Scale gradient const Dtype loss_weight = top[0]->cpu_diff()[0]; - caffe_scal(prob_.count(), loss_weight / num / spatial_dim, bottom_diff); + if (normalize_) { + caffe_scal(prob_.count(), loss_weight / count, bottom_diff); + } else { + caffe_scal(prob_.count(), loss_weight / num, bottom_diff); + } } } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index cfd5cca2518..2bfd7b36fa3 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -368,6 +368,9 @@ message TransformationParameter { message LossParameter { // If specified, ignore instances with the given label. optional int32 ignore_label = 1; + // If true, normalize each batch across all instances (including spatial + // dimesions, but not ignored instances); else, divide by batch size only. + optional bool normalize = 2 [default = true]; } // Message that stores parameters used by AccuracyLayer From c7f63da671d7dc6345d645b89d3641bcd8b7cc27 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 30 Dec 2014 12:31:53 -0800 Subject: [PATCH 1029/2053] clean up formatting in SoftmaxLossLayer --- src/caffe/layers/softmax_loss_layer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 74893af7820..55eb0918ad2 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -74,8 +74,7 @@ void SoftmaxWithLossLayer<Dtype>::Forward_cpu( template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, - const vector<bool>& propagate_down, - const vector<Blob<Dtype>*>& bottom) { + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { LOG(FATAL) << this->type_name() << " Layer cannot backpropagate to label inputs."; From 55d7ffde2907459f021dc72f56c36a61235e187a Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 29 Sep 2014 16:47:06 -0700 Subject: [PATCH 1030/2053] break out Step from Solver --- include/caffe/solver.hpp | 10 +++--- src/caffe/solver.cpp | 73 +++++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 41 deletions(-) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index b20912606f8..fde66208207 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -26,6 +26,7 @@ class Solver { // in a non-zero iter number to resume training for a pre-trained net. virtual void Solve(const char* resume_file = NULL); inline void Solve(const string resume_file) { Solve(resume_file.c_str()); } + void Step(int iters); virtual ~Solver() {} inline shared_ptr<Net<Dtype> > net() { return net_; } inline const vector<shared_ptr<Net<Dtype> > >& test_nets() { @@ -34,9 +35,6 @@ class Solver { int iter() { return iter_; } protected: - // PreSolve is run before any solving iteration starts, allowing one to - // put up some scaffold. - virtual void PreSolve() {} // Get the update value for the current iteration. virtual void ComputeUpdateValue() = 0; // The Solver::Snapshot function implements the basic snapshotting utility @@ -73,14 +71,14 @@ template <typename Dtype> class SGDSolver : public Solver<Dtype> { public: explicit SGDSolver(const SolverParameter& param) - : Solver<Dtype>(param) {} + : Solver<Dtype>(param) { PreSolve(); } explicit SGDSolver(const string& param_file) - : Solver<Dtype>(param_file) {} + : Solver<Dtype>(param_file) { PreSolve(); } const vector<shared_ptr<Blob<Dtype> > >& history() { return history_; } protected: - virtual void PreSolve(); + void PreSolve(); Dtype GetLearningRate(); virtual void ComputeUpdateValue(); virtual void SnapshotSolverState(SolverState * state); diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 7f5d3d20f35..ab9c00eed8f 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -32,6 +32,7 @@ void Solver<Dtype>::Init(const SolverParameter& param) { LOG(INFO) << "Initializing solver from parameters: " << std::endl << param.DebugString(); param_ = param; + CHECK_GE(param_.average_loss(), 1) << "average_loss should be non-negative."; if (param_.random_seed() >= 0) { Caffe::set_random_seed(param_.random_seed()); } @@ -39,6 +40,8 @@ void Solver<Dtype>::Init(const SolverParameter& param) { InitTrainNet(); InitTestNets(); LOG(INFO) << "Solver scaffolding done."; + iter_ = 0; + current_step_ = 0; } template <typename Dtype> @@ -155,39 +158,15 @@ void Solver<Dtype>::InitTestNets() { } template <typename Dtype> -void Solver<Dtype>::Solve(const char* resume_file) { - Caffe::set_phase(Caffe::TRAIN); - LOG(INFO) << "Solving " << net_->name(); - LOG(INFO) << "Learning Rate Policy: " << param_.lr_policy(); - PreSolve(); - - iter_ = 0; - current_step_ = 0; - if (resume_file) { - LOG(INFO) << "Restoring previous solver status from " << resume_file; - Restore(resume_file); - } - // Remember the initial iter_ value; will be non-zero if we loaded from a - // resume_file above. +void Solver<Dtype>::Step(int iters) { + vector<Blob<Dtype>*> bottom_vec; const int start_iter = iter_; - + const int stop_iter = iter_ + iters; int average_loss = this->param_.average_loss(); - - CHECK_GE(average_loss, 1) << "average_loss should be non-negative."; - vector<Dtype> losses; Dtype smoothed_loss = 0; - // For a network that is trained by the solver, no bottom or top vecs - // should be given, and we will just provide dummy vecs. - vector<Blob<Dtype>*> bottom_vec; - for (; iter_ < param_.max_iter(); ++iter_) { - // Save a snapshot if needed. - if (param_.snapshot() && iter_ > start_iter && - iter_ % param_.snapshot() == 0) { - Snapshot(); - } - + for (; iter_ < stop_iter; ++iter_) { if (param_.test_interval() && iter_ % param_.test_interval() == 0 && (iter_ > 0 || param_.test_initialization())) { TestAll(); @@ -227,13 +206,36 @@ void Solver<Dtype>::Solve(const char* resume_file) { } } } - ComputeUpdateValue(); net_->Update(); + + // Save a snapshot if needed. + if (param_.snapshot() && (iter_ + 1) % param_.snapshot() == 0) { + Snapshot(); + } + } +} + +template <typename Dtype> +void Solver<Dtype>::Solve(const char* resume_file) { + Caffe::set_phase(Caffe::TRAIN); + LOG(INFO) << "Solving " << net_->name(); + LOG(INFO) << "Learning Rate Policy: " << param_.lr_policy(); + + if (resume_file) { + LOG(INFO) << "Restoring previous solver status from " << resume_file; + Restore(resume_file); + } + + // For a network that is trained by the solver, no bottom or top vecs + // should be given, and we will just provide dummy vecs. + Step(param_.max_iter() - iter_); + // If we haven't already, save a snapshot after optimization, unless + // overridden by setting snapshot_after_train := false + if (param_.snapshot_after_train() + && (!param_.snapshot() || iter_ % param_.snapshot() != 0)) { + Snapshot(); } - // Always save a snapshot after optimization, unless overridden by setting - // snapshot_after_train := false. - if (param_.snapshot_after_train()) { Snapshot(); } // After the optimization is done, run an additional train and test pass to // display the train and test loss/outputs if appropriate (based on the // display and test_interval settings, respectively). Unlike in the rest of @@ -242,7 +244,7 @@ void Solver<Dtype>::Solve(const char* resume_file) { // display the loss, which is computed in the forward pass. if (param_.display() && iter_ % param_.display() == 0) { Dtype loss; - net_->Forward(bottom_vec, &loss); + net_->ForwardPrefilled(&loss); LOG(INFO) << "Iteration " << iter_ << ", loss = " << loss; } if (param_.test_interval() && iter_ % param_.test_interval() == 0) { @@ -328,14 +330,15 @@ void Solver<Dtype>::Snapshot() { string model_filename, snapshot_filename; const int kBufferSize = 20; char iter_str_buffer[kBufferSize]; - snprintf(iter_str_buffer, kBufferSize, "_iter_%d", iter_); + // Add one to iter_ to get the number of iterations that have completed. + snprintf(iter_str_buffer, kBufferSize, "_iter_%d", iter_ + 1); filename += iter_str_buffer; model_filename = filename + ".caffemodel"; LOG(INFO) << "Snapshotting to " << model_filename; WriteProtoToBinaryFile(net_param, model_filename.c_str()); SolverState state; SnapshotSolverState(&state); - state.set_iter(iter_); + state.set_iter(iter_ + 1); state.set_learned_net(model_filename); state.set_current_step(current_step_); snapshot_filename = filename + ".solverstate"; From 10c23643bbf71628faad26c5ffbdc249b2c3fe37 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 29 Sep 2014 16:49:49 -0700 Subject: [PATCH 1031/2053] [pycaffe] expose SGDSolver.step --- python/caffe/_caffe.cpp | 3 ++- python/caffe/_caffe.hpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index f03dae3dce6..156b5187d58 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -197,7 +197,8 @@ BOOST_PYTHON_MODULE(_caffe) { .add_property("test_nets", &PySGDSolver::test_nets) .add_property("iter", &PySGDSolver::iter) .def("solve", &PySGDSolver::Solve) - .def("solve", &PySGDSolver::SolveResume); + .def("solve", &PySGDSolver::SolveResume) + .def("step", &PySGDSolver::Step); bp::class_<vector<shared_ptr<PyNet> > >("NetVec") .def(bp::vector_indexing_suite<vector<shared_ptr<PyNet> >, true>()); diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index bf1b7d168f8..a5cef74ad66 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -181,6 +181,7 @@ class PySGDSolver { vector<shared_ptr<PyNet> > test_nets() { return test_nets_; } int iter() { return solver_->iter(); } void Solve() { return solver_->Solve(); } + void Step(int iters) { solver_->Step(iters); } void SolveResume(const string& resume_file); protected: From 9e9c21082d0ee038d1c789148521997bfd7b72fa Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Thu, 20 Nov 2014 20:36:56 -0800 Subject: [PATCH 1032/2053] add "make pytest" for running Python tests --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index 46bf7280919..d3bddea7bea 100644 --- a/Makefile +++ b/Makefile @@ -434,6 +434,9 @@ runtest: $(TEST_ALL_BIN) $(TEST_ALL_DYNLINK_BIN) $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) && \ $(TEST_ALL_DYNLINK_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) +pytest: py + cd python; python -m unittest discover -s caffe/test + warn: $(EMPTY_WARN_REPORT) $(EMPTY_WARN_REPORT): $(ALL_WARNS) | $(BUILD_DIR) From b26eaf78097d07575a4de7e89b2f91811ad587f2 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 25 Nov 2014 11:07:52 -0800 Subject: [PATCH 1033/2053] [travis] remove unneeded Makefile.config sed hacking Make allows variable redefinition, so sed brittleness can be avoided. --- scripts/travis/travis_setup_makefile_config.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/travis/travis_setup_makefile_config.sh b/scripts/travis/travis_setup_makefile_config.sh index a309bb3d6fe..5e4cd3ad7d5 100755 --- a/scripts/travis/travis_setup_makefile_config.sh +++ b/scripts/travis/travis_setup_makefile_config.sh @@ -5,9 +5,7 @@ set -e mv Makefile.config.example Makefile.config if $WITH_CUDA; then - # Remove default gencode set; only generate compute_50. - sed -i 's/-gencode arch=.*\\//' Makefile.config - sed -i 's/CUDA_ARCH :=//' Makefile.config + # Only generate compute_50. GENCODE="-gencode arch=compute_50,code=sm_50" GENCODE="$GENCODE -gencode arch=compute_50,code=compute_50" echo "CUDA_ARCH := $GENCODE" >> Makefile.config From 0c2a1bcf4feb84de91c7d56f231f100cf8ad0b4f Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Thu, 20 Nov 2014 20:40:56 -0800 Subject: [PATCH 1034/2053] [travis] run pytest --- .travis.yml | 3 ++- scripts/travis/travis_build_and_test.sh | 1 + scripts/travis/travis_install.sh | 11 +++++++++++ scripts/travis/travis_setup_makefile_config.sh | 10 ++++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3deb45a2f0c..955aa8c3ba2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,8 @@ install: - sudo -E $SCRIPTS/travis_install.sh before_script: - - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib + - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/cuda/lib64 + - export PATH=/home/travis/miniconda/bin:$PATH - if ! $WITH_CMAKE; then $SCRIPTS/travis_setup_makefile_config.sh; fi script: $SCRIPTS/travis_build_and_test.sh diff --git a/scripts/travis/travis_build_and_test.sh b/scripts/travis/travis_build_and_test.sh index dec4d097c17..53c6c341101 100755 --- a/scripts/travis/travis_build_and_test.sh +++ b/scripts/travis/travis_build_and_test.sh @@ -26,6 +26,7 @@ else $MAKE all $MAKE test $MAKE pycaffe + $MAKE pytest $MAKE warn if ! $WITH_CUDA; then $MAKE lint diff --git a/scripts/travis/travis_install.sh b/scripts/travis/travis_install.sh index e17f253ecdc..82f386cf029 100755 --- a/scripts/travis/travis_install.sh +++ b/scripts/travis/travis_install.sh @@ -57,3 +57,14 @@ $MAKE $MAKE install popd rm -f $LMDB_FILE + +# Install the Python runtime dependencies via miniconda (this is much faster +# than using pip for everything). +wget http://repo.continuum.io/miniconda/Miniconda-latest-Linux-x86_64.sh -O miniconda.sh +chmod +x miniconda.sh +./miniconda.sh -b +export PATH=/home/travis/miniconda/bin:$PATH +conda update --yes conda +conda install --yes numpy scipy matplotlib scikit-image pip +pip install protobuf +rm /home/travis/miniconda/lib/libm.* diff --git a/scripts/travis/travis_setup_makefile_config.sh b/scripts/travis/travis_setup_makefile_config.sh index 5e4cd3ad7d5..e8d85f9be78 100755 --- a/scripts/travis/travis_setup_makefile_config.sh +++ b/scripts/travis/travis_setup_makefile_config.sh @@ -10,3 +10,13 @@ if $WITH_CUDA; then GENCODE="$GENCODE -gencode arch=compute_50,code=compute_50" echo "CUDA_ARCH := $GENCODE" >> Makefile.config fi + +cat << 'EOF' >> Makefile.config +ANACONDA_HOME := $(HOME)/miniconda +PYTHON_INCLUDE := $(ANACONDA_HOME)/include \ + $(ANACONDA_HOME)/include/python2.7 \ + $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include +PYTHON_LIB := $(ANACONDA_HOME)/lib +INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include +LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib +EOF From 3f6a85c23c8c3a016f6360baf9614b6720e5c1f4 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Mon, 24 Nov 2014 18:53:14 -0800 Subject: [PATCH 1035/2053] [pycaffe] basic, partial testing of Net and SGDSolver --- python/caffe/test/test_net.py | 77 ++++++++++++++++++++++++++++++++ python/caffe/test/test_solver.py | 49 ++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 python/caffe/test/test_net.py create mode 100644 python/caffe/test/test_solver.py diff --git a/python/caffe/test/test_net.py b/python/caffe/test/test_net.py new file mode 100644 index 00000000000..f0e9deef19c --- /dev/null +++ b/python/caffe/test/test_net.py @@ -0,0 +1,77 @@ +import unittest +import tempfile +import os +import numpy as np + +import caffe + +def simple_net_file(num_output): + """Make a simple net prototxt, based on test_net.cpp, returning the name + of the (temporary) file.""" + + f = tempfile.NamedTemporaryFile(delete=False) + f.write("""name: 'testnet' force_backward: true + layers { type: DUMMY_DATA name: 'data' top: 'data' top: 'label' + dummy_data_param { num: 5 channels: 2 height: 3 width: 4 + num: 5 channels: 1 height: 1 width: 1 + data_filler { type: 'gaussian' std: 1 } + data_filler { type: 'constant' } } } + layers { type: CONVOLUTION name: 'conv' bottom: 'data' top: 'conv' + convolution_param { num_output: 11 kernel_size: 2 pad: 3 + weight_filler { type: 'gaussian' std: 1 } + bias_filler { type: 'constant' value: 2 } } + weight_decay: 1 weight_decay: 0 } + layers { type: INNER_PRODUCT name: 'ip' bottom: 'conv' top: 'ip' + inner_product_param { num_output: """ + str(num_output) + """ + weight_filler { type: 'gaussian' std: 2.5 } + bias_filler { type: 'constant' value: -3 } } } + layers { type: SOFTMAX_LOSS name: 'loss' bottom: 'ip' bottom: 'label' + top: 'loss' }""") + f.close() + return f.name + +class TestNet(unittest.TestCase): + def setUp(self): + self.num_output = 13 + net_file = simple_net_file(self.num_output) + self.net = caffe.Net(net_file) + # fill in valid labels + self.net.blobs['label'].data[...] = \ + np.random.randint(self.num_output, + size=self.net.blobs['label'].data.shape) + os.remove(net_file) + + def test_memory(self): + """Check that holding onto blob data beyond the life of a Net is OK""" + + params = sum(map(list, self.net.params.itervalues()), []) + blobs = self.net.blobs.values() + del self.net + + # now sum everything (forcing all memory to be read) + total = 0 + for p in params: + total += p.data.sum() + p.diff.sum() + for bl in blobs: + total += bl.data.sum() + bl.diff.sum() + + def test_forward_backward(self): + self.net.forward() + self.net.backward() + + def test_inputs_outputs(self): + self.assertEqual(self.net.inputs, []) + self.assertEqual(self.net.outputs, ['loss']) + + def test_save_and_read(self): + f = tempfile.NamedTemporaryFile(delete=False) + f.close() + self.net.save(f.name) + net_file = simple_net_file(self.num_output) + net2 = caffe.Net(net_file, f.name) + os.remove(net_file) + os.remove(f.name) + for name in self.net.params: + for i in range(len(self.net.params[name])): + self.assertEqual(abs(self.net.params[name][i].data + - net2.params[name][i].data).sum(), 0) diff --git a/python/caffe/test/test_solver.py b/python/caffe/test/test_solver.py new file mode 100644 index 00000000000..b78c91f9978 --- /dev/null +++ b/python/caffe/test/test_solver.py @@ -0,0 +1,49 @@ +import unittest +import tempfile +import os +import numpy as np + +import caffe +from test_net import simple_net_file + +class TestSolver(unittest.TestCase): + def setUp(self): + self.num_output = 13 + net_f = simple_net_file(self.num_output) + f = tempfile.NamedTemporaryFile(delete=False) + f.write("""net: '""" + net_f + """' + test_iter: 10 test_interval: 10 base_lr: 0.01 momentum: 0.9 + weight_decay: 0.0005 lr_policy: 'inv' gamma: 0.0001 power: 0.75 + display: 100 max_iter: 100 snapshot_after_train: false""") + f.close() + self.solver = caffe.SGDSolver(f.name) + self.solver.net.set_mode_cpu() + # fill in valid labels + self.solver.net.blobs['label'].data[...] = \ + np.random.randint(self.num_output, + size=self.solver.net.blobs['label'].data.shape) + self.solver.test_nets[0].blobs['label'].data[...] = \ + np.random.randint(self.num_output, + size=self.solver.test_nets[0].blobs['label'].data.shape) + os.remove(f.name) + os.remove(net_f) + + def test_solve(self): + self.assertEqual(self.solver.iter, 0) + self.solver.solve() + self.assertEqual(self.solver.iter, 100) + + def test_net_memory(self): + """Check that nets survive after the solver is destroyed.""" + + nets = [self.solver.net] + list(self.solver.test_nets) + self.assertEqual(len(nets), 2) + del self.solver + + total = 0 + for net in nets: + for ps in net.params.itervalues(): + for p in ps: + total += p.data.sum() + p.diff.sum() + for bl in net.blobs.itervalues(): + total += bl.data.sum() + bl.diff.sum() From 7e465f288a4a7fc2d74b2a0a145f98a03891dcb8 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 7 Jan 2015 23:00:27 -0500 Subject: [PATCH 1036/2053] BVLC models are for unrestricted use (follow-up to #1650) --- models/bvlc_alexnet/readme.md | 2 +- models/bvlc_googlenet/readme.md | 2 +- models/bvlc_reference_caffenet/readme.md | 2 +- models/bvlc_reference_rcnn_ilsvrc13/readme.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/models/bvlc_alexnet/readme.md b/models/bvlc_alexnet/readme.md index 97b66bec8c2..008d690f7f4 100644 --- a/models/bvlc_alexnet/readme.md +++ b/models/bvlc_alexnet/readme.md @@ -2,7 +2,7 @@ name: BVLC AlexNet Model caffemodel: bvlc_alexnet.caffemodel caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel -license: non-commercial +license: unrestricted sha1: 9116a64c0fbe4459d18f4bb6b56d647b63920377 caffe_commit: 709dc15af4a06bebda027c1eb2b3f3e3375d5077 --- diff --git a/models/bvlc_googlenet/readme.md b/models/bvlc_googlenet/readme.md index 19f6b881f5c..2e22dfcf59a 100644 --- a/models/bvlc_googlenet/readme.md +++ b/models/bvlc_googlenet/readme.md @@ -2,7 +2,7 @@ name: BVLC GoogleNet Model caffemodel: bvlc_googlenet.caffemodel caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel -license: non-commercial +license: unrestricted sha1: 405fc5acd08a3bb12de8ee5e23a96bec22f08204 caffe_commit: bc614d1bd91896e3faceaf40b23b72dab47d44f5 gist_id: 866e2aa1fd707b89b913 diff --git a/models/bvlc_reference_caffenet/readme.md b/models/bvlc_reference_caffenet/readme.md index b6b6103429a..671e47a5056 100644 --- a/models/bvlc_reference_caffenet/readme.md +++ b/models/bvlc_reference_caffenet/readme.md @@ -2,7 +2,7 @@ name: BVLC CaffeNet Model caffemodel: bvlc_reference_caffenet.caffemodel caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel -license: non-commercial +license: unrestricted sha1: 4c8d77deb20ea792f84eb5e6d0a11ca0a8660a46 caffe_commit: 709dc15af4a06bebda027c1eb2b3f3e3375d5077 --- diff --git a/models/bvlc_reference_rcnn_ilsvrc13/readme.md b/models/bvlc_reference_rcnn_ilsvrc13/readme.md index 01996ee4d4a..9a11a24d8f8 100644 --- a/models/bvlc_reference_rcnn_ilsvrc13/readme.md +++ b/models/bvlc_reference_rcnn_ilsvrc13/readme.md @@ -2,7 +2,7 @@ name: BVLC Reference RCNN ILSVRC13 Model caffemodel: bvlc_reference_rcnn_ilsvrc13.caffemodel caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_reference_rcnn_ilsvrc13.caffemodel -license: non-commercial +license: unrestricted sha1: bdd8abb885819cba5e2fe1eb36235f2319477e64 caffe_commit: a7e397abbda52c0b90323c23ab95bdeabee90a98 --- From 2377b68dcc3c20685ec388097dbe9e9c6b3b0e92 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 6 Jan 2015 20:25:53 -0800 Subject: [PATCH 1037/2053] improve const-ness of Net --- include/caffe/net.hpp | 72 ++++++++++++++++++++++++++++--------------- src/caffe/net.cpp | 16 +++++----- src/caffe/solver.cpp | 23 ++++++++------ tools/caffe.cpp | 4 +-- 4 files changed, 70 insertions(+), 45 deletions(-) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 1d06dc45533..bbb220eb00d 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -89,7 +89,7 @@ class Net { * @brief For an already initialized net, implicitly copies (i.e., using no * additional memory) the pre-trained layers from another Net. */ - void ShareTrainedLayersWith(Net* other); + void ShareTrainedLayersWith(const Net* other); // For an already initialized net, CopyTrainedLayersFrom() copies the already // trained layers from another net parameter instance. /** @@ -99,51 +99,73 @@ class Net { void CopyTrainedLayersFrom(const NetParameter& param); void CopyTrainedLayersFrom(const string trained_filename); /// @brief Writes the net to a proto. - void ToProto(NetParameter* param, bool write_diff = false); + void ToProto(NetParameter* param, bool write_diff = false) const; /// @brief returns the network name. - inline const string& name() { return name_; } + inline const string& name() const { return name_; } /// @brief returns the layer names - inline const vector<string>& layer_names() { return layer_names_; } + inline const vector<string>& layer_names() const { return layer_names_; } /// @brief returns the blob names - inline const vector<string>& blob_names() { return blob_names_; } + inline const vector<string>& blob_names() const { return blob_names_; } /// @brief returns the blobs - inline const vector<shared_ptr<Blob<Dtype> > >& blobs() { return blobs_; } + inline const vector<shared_ptr<Blob<Dtype> > >& blobs() const { + return blobs_; + } /// @brief returns the layers - inline const vector<shared_ptr<Layer<Dtype> > >& layers() { return layers_; } + inline const vector<shared_ptr<Layer<Dtype> > >& layers() const { + return layers_; + } /** * @brief returns the bottom vecs for each layer -- usually you won't * need this unless you do per-layer checks such as gradients. */ - inline vector<vector<Blob<Dtype>*> >& bottom_vecs() { return bottom_vecs_; } + inline const vector<vector<Blob<Dtype>*> >& bottom_vecs() const { + return bottom_vecs_; + } /** * @brief returns the top vecs for each layer -- usually you won't * need this unless you do per-layer checks such as gradients. */ - inline vector<vector<Blob<Dtype>*> >& top_vecs() { return top_vecs_; } - inline vector<vector<bool> >& bottom_need_backward() { + inline const vector<vector<Blob<Dtype>*> >& top_vecs() const { + return top_vecs_; + } + inline const vector<vector<bool> >& bottom_need_backward() const { return bottom_need_backward_; } - inline vector<Dtype>& blob_loss_weights() { + inline const vector<Dtype>& blob_loss_weights() const { return blob_loss_weights_; } /// @brief returns the parameters - inline vector<shared_ptr<Blob<Dtype> > >& params() { return params_; } + inline const vector<shared_ptr<Blob<Dtype> > >& params() const { + return params_; + } /// @brief returns the parameter learning rate multipliers - inline vector<float>& params_lr() { return params_lr_; } - inline vector<float>& params_weight_decay() { return params_weight_decay_; } - const map<string, int>& param_names_index() { return param_names_index_; } + inline const vector<float>& params_lr() const { return params_lr_; } + inline const vector<float>& params_weight_decay() const { + return params_weight_decay_; + } + const map<string, int>& param_names_index() const { + return param_names_index_; + } /// @brief Input and output blob numbers - inline int num_inputs() { return net_input_blobs_.size(); } - inline int num_outputs() { return net_output_blobs_.size(); } - inline vector<Blob<Dtype>*>& input_blobs() { return net_input_blobs_; } - inline vector<Blob<Dtype>*>& output_blobs() { return net_output_blobs_; } - inline vector<int>& input_blob_indices() { return net_input_blob_indices_; } - inline vector<int>& output_blob_indices() { return net_output_blob_indices_; } - bool has_blob(const string& blob_name); - const shared_ptr<Blob<Dtype> > blob_by_name(const string& blob_name); - bool has_layer(const string& layer_name); - const shared_ptr<Layer<Dtype> > layer_by_name(const string& layer_name); + inline int num_inputs() const { return net_input_blobs_.size(); } + inline int num_outputs() const { return net_output_blobs_.size(); } + inline const vector<Blob<Dtype>*>& input_blobs() const { + return net_input_blobs_; + } + inline const vector<Blob<Dtype>*>& output_blobs() const { + return net_output_blobs_; + } + inline const vector<int>& input_blob_indices() const { + return net_input_blob_indices_; + } + inline const vector<int>& output_blob_indices() const { + return net_output_blob_indices_; + } + bool has_blob(const string& blob_name) const; + const shared_ptr<Blob<Dtype> > blob_by_name(const string& blob_name) const; + bool has_layer(const string& layer_name) const; + const shared_ptr<Layer<Dtype> > layer_by_name(const string& layer_name) const; void set_debug_info(const bool value) { debug_info_ = value; } diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index e4492cfd6e3..47fc8446064 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -636,7 +636,7 @@ void Net<Dtype>::UpdateDebugInfo(const int param_id) { } template <typename Dtype> -void Net<Dtype>::ShareTrainedLayersWith(Net* other) { +void Net<Dtype>::ShareTrainedLayersWith(const Net* other) { int num_source_layers = other->layers().size(); for (int i = 0; i < num_source_layers; ++i) { Layer<Dtype>* source_layer = other->layers()[i].get(); @@ -726,7 +726,7 @@ void Net<Dtype>::CopyTrainedLayersFrom(const string trained_filename) { } template <typename Dtype> -void Net<Dtype>::ToProto(NetParameter* param, bool write_diff) { +void Net<Dtype>::ToProto(NetParameter* param, bool write_diff) const { param->Clear(); param->set_name(name_); // Add bottom and top @@ -785,16 +785,16 @@ void Net<Dtype>::Update() { } template <typename Dtype> -bool Net<Dtype>::has_blob(const string& blob_name) { +bool Net<Dtype>::has_blob(const string& blob_name) const { return blob_names_index_.find(blob_name) != blob_names_index_.end(); } template <typename Dtype> const shared_ptr<Blob<Dtype> > Net<Dtype>::blob_by_name( - const string& blob_name) { + const string& blob_name) const { shared_ptr<Blob<Dtype> > blob_ptr; if (has_blob(blob_name)) { - blob_ptr = blobs_[blob_names_index_[blob_name]]; + blob_ptr = blobs_[blob_names_index_.find(blob_name)->second]; } else { blob_ptr.reset((Blob<Dtype>*)(NULL)); LOG(WARNING) << "Unknown blob name " << blob_name; @@ -803,16 +803,16 @@ const shared_ptr<Blob<Dtype> > Net<Dtype>::blob_by_name( } template <typename Dtype> -bool Net<Dtype>::has_layer(const string& layer_name) { +bool Net<Dtype>::has_layer(const string& layer_name) const { return layer_names_index_.find(layer_name) != layer_names_index_.end(); } template <typename Dtype> const shared_ptr<Layer<Dtype> > Net<Dtype>::layer_by_name( - const string& layer_name) { + const string& layer_name) const { shared_ptr<Layer<Dtype> > layer_ptr; if (has_layer(layer_name)) { - layer_ptr = layers_[layer_names_index_[layer_name]]; + layer_ptr = layers_[layer_names_index_.find(layer_name)->second]; } else { layer_ptr.reset((Layer<Dtype>*)(NULL)); LOG(WARNING) << "Unknown layer name " << layer_name; diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index ab9c00eed8f..3fa0e2d14b7 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -418,7 +418,7 @@ Dtype SGDSolver<Dtype>::GetLearningRate() { template <typename Dtype> void SGDSolver<Dtype>::PreSolve() { // Initialize the history - vector<shared_ptr<Blob<Dtype> > >& net_params = this->net_->params(); + const vector<shared_ptr<Blob<Dtype> > >& net_params = this->net_->params(); history_.clear(); update_.clear(); temp_.clear(); @@ -439,9 +439,10 @@ void SGDSolver<Dtype>::PreSolve() { template <typename Dtype> void SGDSolver<Dtype>::ComputeUpdateValue() { - vector<shared_ptr<Blob<Dtype> > >& net_params = this->net_->params(); - vector<float>& net_params_lr = this->net_->params_lr(); - vector<float>& net_params_weight_decay = this->net_->params_weight_decay(); + const vector<shared_ptr<Blob<Dtype> > >& net_params = this->net_->params(); + const vector<float>& net_params_lr = this->net_->params_lr(); + const vector<float>& net_params_weight_decay = + this->net_->params_weight_decay(); // get the learning rate Dtype rate = GetLearningRate(); if (this->param_.display() && this->iter_ % this->param_.display() == 0) { @@ -552,9 +553,10 @@ void SGDSolver<Dtype>::RestoreSolverState(const SolverState& state) { template <typename Dtype> void NesterovSolver<Dtype>::ComputeUpdateValue() { - vector<shared_ptr<Blob<Dtype> > >& net_params = this->net_->params(); - vector<float>& net_params_lr = this->net_->params_lr(); - vector<float>& net_params_weight_decay = this->net_->params_weight_decay(); + const vector<shared_ptr<Blob<Dtype> > >& net_params = this->net_->params(); + const vector<float>& net_params_lr = this->net_->params_lr(); + const vector<float>& net_params_weight_decay = + this->net_->params_weight_decay(); // get the learning rate Dtype rate = this->GetLearningRate(); if (this->param_.display() && this->iter_ % this->param_.display() == 0) { @@ -667,9 +669,10 @@ void NesterovSolver<Dtype>::ComputeUpdateValue() { template <typename Dtype> void AdaGradSolver<Dtype>::ComputeUpdateValue() { - vector<shared_ptr<Blob<Dtype> > >& net_params = this->net_->params(); - vector<float>& net_params_lr = this->net_->params_lr(); - vector<float>& net_params_weight_decay = this->net_->params_weight_decay(); + const vector<shared_ptr<Blob<Dtype> > >& net_params = this->net_->params(); + const vector<float>& net_params_lr = this->net_->params_lr(); + const vector<float>& net_params_weight_decay = + this->net_->params_weight_decay(); // get the learning rate Dtype rate = this->GetLearningRate(); Dtype delta = this->param_.delta(); diff --git a/tools/caffe.cpp b/tools/caffe.cpp index 9f9d975dfba..ad54bc3b9eb 100644 --- a/tools/caffe.cpp +++ b/tools/caffe.cpp @@ -220,8 +220,8 @@ int time() { caffe_net.Backward(); const vector<shared_ptr<Layer<float> > >& layers = caffe_net.layers(); - vector<vector<Blob<float>*> >& bottom_vecs = caffe_net.bottom_vecs(); - vector<vector<Blob<float>*> >& top_vecs = caffe_net.top_vecs(); + const vector<vector<Blob<float>*> >& bottom_vecs = caffe_net.bottom_vecs(); + const vector<vector<Blob<float>*> >& top_vecs = caffe_net.top_vecs(); const vector<vector<bool> >& bottom_need_backward = caffe_net.bottom_need_backward(); LOG(INFO) << "*** Benchmark begins ***"; From 25e37489294cabcc023b3583ad72d8753317e069 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 10 Jan 2015 01:16:12 -0800 Subject: [PATCH 1038/2053] fix typo in layer_factory.cpp --- src/caffe/layer_factory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 5a286cd4691..80694834a33 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -154,5 +154,5 @@ Layer<Dtype>* GetTanHLayer(const LayerParameter& param) { REGISTER_LAYER_CREATOR(TANH, GetTanHLayer); // Layers that use their constructor as their default creator should be -// registered in their corresponding cpp files. Do not registere them here. +// registered in their corresponding cpp files. Do not register them here. } // namespace caffe From 9cdf40df6d0214bd50c21eee362f2c3e13df8dc7 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 10 Jan 2015 01:18:39 -0800 Subject: [PATCH 1039/2053] [build] more meaningful messages for link commands --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 46bf7280919..f6178162f34 100644 --- a/Makefile +++ b/Makefile @@ -465,11 +465,11 @@ $(ALL_BUILD_DIRS): | $(BUILD_DIR_LINK) @ mkdir -p $@ $(DYNAMIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) - @ echo LD $< + @ echo LD -o $@ $(Q)$(CXX) -shared -o $@ $(OBJS) $(LINKFLAGS) $(LDFLAGS) $(STATIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) - @ echo AR $< + @ echo AR -o $@ $(Q)ar rcs $@ $(OBJS) $(BUILD_DIR)/%.o: %.cpp | $(ALL_BUILD_DIRS) From 3c5048c27e0579ca43e10186a0102b908b591a69 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sat, 10 Jan 2015 01:42:23 -0800 Subject: [PATCH 1040/2053] [build] specify RPATH using $ORIGIN Currently, when dynamically linking against libcaffe (right now, only done for tests), RPATH is specified relative to the caffe source root. This commit fixes RPATH using the special $ORIGIN variable to be relative to the executable itself, so that there is no dependence on the working directory. --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 46bf7280919..c5f6addbfa0 100644 --- a/Makefile +++ b/Makefile @@ -334,6 +334,7 @@ endif LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) $(PKG_CONFIG) \ $(foreach library,$(LIBRARIES),-l$(library)) PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) +DYNAMIC_LDFLAGS := -l$(PROJECT) -Wl,-rpath,\$$ORIGIN/../lib # 'superclean' target recursively* deletes all files ending with an extension # in $(SUPERCLEAN_EXTS) below. This may be useful if you've built older @@ -503,7 +504,7 @@ $(TEST_ALL_DYNLINK_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(DYNAMIC_NA | $(TEST_BIN_DIR) @ echo CXX/LD -o $@ $< $(Q)$(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) \ - -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(PROJECT) -Wl,-rpath,$(LIB_BUILD_DIR) + -o $@ $(LINKFLAGS) $(LDFLAGS) $(DYNAMIC_LDFLAGS) $(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_CU_BUILD_DIR)/%.o \ $(GTEST_OBJ) $(STATIC_NAME) | $(TEST_BIN_DIR) From 8d2aebc2f4440e7d83b3031398d97230426e4196 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sun, 21 Dec 2014 19:20:36 -0800 Subject: [PATCH 1041/2053] add BaseConvolutionLayer This provides a common place for code used by ConvolutionLayer and DeconvolutionLayer, simplifying the implementations of both. --- include/caffe/vision_layers.hpp | 87 ++++++++ src/caffe/layers/base_conv_layer.cpp | 289 +++++++++++++++++++++++++++ 2 files changed, 376 insertions(+) create mode 100644 src/caffe/layers/base_conv_layer.cpp diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index c803cd72449..e1bb7abf07c 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -16,6 +16,93 @@ namespace caffe { +template <typename Dtype> +class BaseConvolutionLayer : public Layer<Dtype> { + public: + explicit BaseConvolutionLayer(const LayerParameter& param) + : Layer<Dtype>(param) {} + virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top); + virtual void Reshape(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top); + + virtual inline int MinBottomBlobs() const { return 1; } + virtual inline int MinTopBlobs() const { return 1; } + virtual inline bool EqualNumBottomTopBlobs() const { return true; } + + protected: + // Helper functions that abstract away the column buffer and gemm arguments. + // The last argument in forward_cpu_gemm is so that we can skip the im2col if + // we just called weight_cpu_gemm with the same input. + void forward_cpu_gemm(const Dtype* input, const Dtype* weights, + Dtype* output, bool skip_im2col = false); + void forward_cpu_bias(Dtype* output, const Dtype* bias); + void backward_cpu_gemm(const Dtype* input, const Dtype* weights, + Dtype* output); + void weight_cpu_gemm(const Dtype* input, const Dtype* output, Dtype* + weights); + void backward_cpu_bias(Dtype* bias, const Dtype* input); + + void forward_gpu_gemm(const Dtype* col_input, const Dtype* weights, + Dtype* output, bool skip_im2col = false); + void forward_gpu_bias(Dtype* output, const Dtype* bias); + void backward_gpu_gemm(const Dtype* input, const Dtype* weights, + Dtype* col_output); + void weight_gpu_gemm(const Dtype* col_input, const Dtype* output, Dtype* + weights); + void backward_gpu_bias(Dtype* bias, const Dtype* input); + + // reverse_dimensions should return true iff we are implementing deconv, so + // that conv helpers know which dimensions are which. + virtual bool reverse_dimensions() = 0; + // Compute height_out_ and width_out_ from other parameters. + virtual void compute_output_shape() = 0; + + int kernel_h_, kernel_w_; + int stride_h_, stride_w_; + int num_; + int channels_; + int pad_h_, pad_w_; + int height_, width_; + int group_; + int num_output_; + int height_out_, width_out_; + bool bias_term_; + bool is_1x1_; + + private: + // wrap im2col/col2im so we don't have to remember the (long) argument lists + inline void conv_im2col_cpu(const Dtype* data, Dtype* col_buff) { + im2col_cpu(data, conv_in_channels_, conv_in_height_, conv_in_width_, + kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_buff); + } + inline void conv_col2im_cpu(const Dtype* col_buff, Dtype* data) { + col2im_cpu(col_buff, conv_in_channels_, conv_in_height_, conv_in_width_, + kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, data); + } + inline void conv_im2col_gpu(const Dtype* data, Dtype* col_buff) { + im2col_gpu(data, conv_in_channels_, conv_in_height_, conv_in_width_, + kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_buff); + } + inline void conv_col2im_gpu(const Dtype* col_buff, Dtype* data) { + col2im_gpu(col_buff, conv_in_channels_, conv_in_height_, conv_in_width_, + kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, data); + } + + int conv_out_channels_; + int conv_in_channels_; + int conv_out_spatial_dim_; + int conv_in_height_; + int conv_in_width_; + int kernel_dim_; + int weight_offset_; + int col_offset_; + int output_offset_; + + Blob<Dtype> col_buffer_; + Blob<Dtype> bias_multiplier_; +}; + /** * @brief Convolves the input image with a bank of learned filters, * and (optionally) adds biases. diff --git a/src/caffe/layers/base_conv_layer.cpp b/src/caffe/layers/base_conv_layer.cpp new file mode 100644 index 00000000000..a44867a0cf3 --- /dev/null +++ b/src/caffe/layers/base_conv_layer.cpp @@ -0,0 +1,289 @@ +#include <vector> + +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top) { + // Configure the kernel size, padding, stride, and inputs. + ConvolutionParameter conv_param = this->layer_param_.convolution_param(); + CHECK(!conv_param.has_kernel_size() != + !(conv_param.has_kernel_h() && conv_param.has_kernel_w())) + << "Filter size is kernel_size OR kernel_h and kernel_w; not both"; + CHECK(conv_param.has_kernel_size() || + (conv_param.has_kernel_h() && conv_param.has_kernel_w())) + << "For non-square filters both kernel_h and kernel_w are required."; + CHECK((!conv_param.has_pad() && conv_param.has_pad_h() + && conv_param.has_pad_w()) + || (!conv_param.has_pad_h() && !conv_param.has_pad_w())) + << "pad is pad OR pad_h and pad_w are required."; + CHECK((!conv_param.has_stride() && conv_param.has_stride_h() + && conv_param.has_stride_w()) + || (!conv_param.has_stride_h() && !conv_param.has_stride_w())) + << "Stride is stride OR stride_h and stride_w are required."; + if (conv_param.has_kernel_size()) { + kernel_h_ = kernel_w_ = conv_param.kernel_size(); + } else { + kernel_h_ = conv_param.kernel_h(); + kernel_w_ = conv_param.kernel_w(); + } + CHECK_GT(kernel_h_, 0) << "Filter dimensions cannot be zero."; + CHECK_GT(kernel_w_, 0) << "Filter dimensions cannot be zero."; + if (!conv_param.has_pad_h()) { + pad_h_ = pad_w_ = conv_param.pad(); + } else { + pad_h_ = conv_param.pad_h(); + pad_w_ = conv_param.pad_w(); + } + if (!conv_param.has_stride_h()) { + stride_h_ = stride_w_ = conv_param.stride(); + } else { + stride_h_ = conv_param.stride_h(); + stride_w_ = conv_param.stride_w(); + } + // Special case: im2col is the identity for 1x1 convolution with stride 1 + // and no padding, so flag for skipping the buffer and transformation. + is_1x1_ = kernel_w_ == 1 && kernel_h_ == 1 + && stride_h_ == 1 && stride_w_ == 1 && pad_h_ == 0 && pad_w_ == 0; + // Configure output channels and groups. + channels_ = bottom[0]->channels(); + num_output_ = this->layer_param_.convolution_param().num_output(); + CHECK_GT(num_output_, 0); + group_ = this->layer_param_.convolution_param().group(); + CHECK_EQ(channels_ % group_, 0); + CHECK_EQ(num_output_ % group_, 0) + << "Number of output should be multiples of group."; + if (reverse_dimensions()) { + conv_out_channels_ = channels_; + conv_in_channels_ = num_output_; + } else { + conv_out_channels_ = num_output_; + conv_in_channels_ = channels_; + } + // Handle the parameters: weights and biases. + // - blobs_[0] holds the filter weights + // - blobs_[1] holds the biases (optional) + bias_term_ = this->layer_param_.convolution_param().bias_term(); + if (this->blobs_.size() > 0) { + LOG(INFO) << "Skipping parameter initialization"; + } else { + if (bias_term_) { + this->blobs_.resize(2); + } else { + this->blobs_.resize(1); + } + // Initialize and fill the weights: + // output channels x input channels per-group x kernel height x kernel width + this->blobs_[0].reset(new Blob<Dtype>( + conv_out_channels_, conv_in_channels_ / group_, kernel_h_, kernel_w_)); + shared_ptr<Filler<Dtype> > weight_filler(GetFiller<Dtype>( + this->layer_param_.convolution_param().weight_filler())); + weight_filler->Fill(this->blobs_[0].get()); + // If necessary, initialize and fill the biases: + // 1 x 1 x 1 x output channels + if (bias_term_) { + this->blobs_[1].reset(new Blob<Dtype>(1, 1, 1, num_output_)); + shared_ptr<Filler<Dtype> > bias_filler(GetFiller<Dtype>( + this->layer_param_.convolution_param().bias_filler())); + bias_filler->Fill(this->blobs_[1].get()); + } + } + // Propagate gradients to the parameters (as directed by backward pass). + this->param_propagate_down_.resize(this->blobs_.size(), true); +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top) { + num_ = bottom[0]->num(); + height_ = bottom[0]->height(); + width_ = bottom[0]->width(); + CHECK_EQ(bottom[0]->channels(), channels_) << "Input size incompatible with" + " convolution kernel."; + // TODO: generalize to handle inputs of different shapes. + for (int bottom_id = 1; bottom_id < bottom.size(); ++bottom_id) { + CHECK_EQ(num_, bottom[bottom_id]->num()) << "Inputs must have same num."; + CHECK_EQ(channels_, bottom[bottom_id]->channels()) + << "Inputs must have same channels."; + CHECK_EQ(height_, bottom[bottom_id]->height()) + << "Inputs must have same height."; + CHECK_EQ(width_, bottom[bottom_id]->width()) + << "Inputs must have same width."; + } + // Shape the tops. + compute_output_shape(); + for (int top_id = 0; top_id < top.size(); ++top_id) { + top[top_id]->Reshape(num_, num_output_, height_out_, width_out_); + } + if (reverse_dimensions()) { + conv_in_height_ = height_out_; + conv_in_width_ = width_out_; + conv_out_spatial_dim_ = height_ * width_; + } else { + conv_in_height_ = height_; + conv_in_width_ = width_; + conv_out_spatial_dim_ = height_out_ * width_out_; + } + kernel_dim_ = conv_in_channels_ * kernel_h_ * kernel_w_; + weight_offset_ = conv_out_channels_ * kernel_dim_ / group_ / group_; + col_offset_ = kernel_dim_ * conv_out_spatial_dim_ / group_; + output_offset_ = conv_out_channels_ * conv_out_spatial_dim_ / group_; + // The im2col result buffer will only hold one image at a time to avoid + // overly large memory usage. In the special case of 1x1 convolution + // it goes lazily unused to save memory. + if (reverse_dimensions()) { + col_buffer_.Reshape(1, kernel_dim_, height_, width_); + } else { + col_buffer_.Reshape(1, kernel_dim_, height_out_, width_out_); + } + // Set up the all ones "bias multiplier" for adding biases by BLAS + if (bias_term_) { + bias_multiplier_.Reshape(1, 1, 1, height_out_ * width_out_); + caffe_set(bias_multiplier_.count(), Dtype(1), + bias_multiplier_.mutable_cpu_data()); + } +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::forward_cpu_gemm(const Dtype* input, + const Dtype* weights, Dtype* output, bool skip_im2col) { + const Dtype* col_buff = input; + if (!is_1x1_) { + if (!skip_im2col) { + conv_im2col_cpu(input, col_buffer_.mutable_cpu_data()); + } + col_buff = col_buffer_.cpu_data(); + } + for (int g = 0; g < group_; ++g) { + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, conv_out_channels_ / + group_, conv_out_spatial_dim_, kernel_dim_ / group_, + (Dtype)1., weights + weight_offset_ * g, col_buff + col_offset_ * g, + (Dtype)0., output + output_offset_ * g); + } +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::forward_cpu_bias(Dtype* output, + const Dtype* bias) { + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, + height_out_ * width_out_, 1, (Dtype)1., bias, bias_multiplier_.cpu_data(), + (Dtype)1., output); +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::backward_cpu_gemm(const Dtype* output, + const Dtype* weights, Dtype* input) { + Dtype* col_buff = col_buffer_.mutable_cpu_data(); + if (is_1x1_) { + col_buff = input; + } + for (int g = 0; g < group_; ++g) { + caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, kernel_dim_ / group_, + conv_out_spatial_dim_, conv_out_channels_ / group_, + (Dtype)1., weights + weight_offset_ * g, output + output_offset_ * g, + (Dtype)0., col_buff + col_offset_ * g); + } + if (!is_1x1_) { + conv_col2im_cpu(col_buff, input); + } +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::weight_cpu_gemm(const Dtype* input, + const Dtype* output, Dtype* weights) { + const Dtype* col_buff = input; + if (!is_1x1_) { + conv_im2col_cpu(input, col_buffer_.mutable_cpu_data()); + col_buff = col_buffer_.cpu_data(); + } + for (int g = 0; g < group_; ++g) { + caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasTrans, conv_out_channels_ / group_, + kernel_dim_ / group_, conv_out_spatial_dim_, + (Dtype)1., output + output_offset_ * g, col_buff + col_offset_ * g, + (Dtype)1., weights + weight_offset_ * g); + } +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::backward_cpu_bias(Dtype* bias, + const Dtype* input) { + caffe_cpu_gemv<Dtype>(CblasNoTrans, num_output_, height_out_ * width_out_, 1., + input, bias_multiplier_.cpu_data(), 1., bias); +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::forward_gpu_gemm(const Dtype* input, + const Dtype* weights, Dtype* output, bool skip_im2col) { + const Dtype* col_buff = input; + if (!is_1x1_) { + if (!skip_im2col) { + conv_im2col_gpu(input, col_buffer_.mutable_gpu_data()); + } + col_buff = col_buffer_.gpu_data(); + } + for (int g = 0; g < group_; ++g) { + caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, conv_out_channels_ / + group_, conv_out_spatial_dim_, kernel_dim_ / group_, + (Dtype)1., weights + weight_offset_ * g, col_buff + col_offset_ * g, + (Dtype)0., output + output_offset_ * g); + } +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::forward_gpu_bias(Dtype* output, + const Dtype* bias) { + caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, + height_out_ * width_out_, 1, (Dtype)1., bias, bias_multiplier_.gpu_data(), + (Dtype)1., output); +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::backward_gpu_gemm(const Dtype* output, + const Dtype* weights, Dtype* input) { + Dtype* col_buff = col_buffer_.mutable_gpu_data(); + if (is_1x1_) { + col_buff = input; + } + for (int g = 0; g < group_; ++g) { + caffe_gpu_gemm<Dtype>(CblasTrans, CblasNoTrans, kernel_dim_ / group_, + conv_out_spatial_dim_, conv_out_channels_ / group_, + (Dtype)1., weights + weight_offset_ * g, output + output_offset_ * g, + (Dtype)0., col_buff + col_offset_ * g); + } + if (!is_1x1_) { + conv_col2im_gpu(col_buff, input); + } +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::weight_gpu_gemm(const Dtype* input, + const Dtype* output, Dtype* weights) { + const Dtype* col_buff = input; + if (!is_1x1_) { + conv_im2col_gpu(input, col_buffer_.mutable_gpu_data()); + col_buff = col_buffer_.gpu_data(); + } + for (int g = 0; g < group_; ++g) { + caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasTrans, conv_out_channels_ / group_, + kernel_dim_ / group_, conv_out_spatial_dim_, + (Dtype)1., output + output_offset_ * g, col_buff + col_offset_ * g, + (Dtype)1., weights + weight_offset_ * g); + } +} + +template <typename Dtype> +void BaseConvolutionLayer<Dtype>::backward_gpu_bias(Dtype* bias, + const Dtype* input) { + caffe_gpu_gemv<Dtype>(CblasNoTrans, num_output_, height_out_ * width_out_, 1., + input, bias_multiplier_.gpu_data(), 1., bias); +} + +INSTANTIATE_CLASS(BaseConvolutionLayer); + +} // namespace caffe From a0e9db1347c325ff007166e79d1ca693e2e5de18 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sun, 21 Dec 2014 23:33:35 -0800 Subject: [PATCH 1042/2053] add CPU_ONLY ifdef guards to BaseConvolutionLayer --- include/caffe/vision_layers.hpp | 4 ++++ src/caffe/layers/base_conv_layer.cpp | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index e1bb7abf07c..4cf7e8b0428 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -43,6 +43,7 @@ class BaseConvolutionLayer : public Layer<Dtype> { weights); void backward_cpu_bias(Dtype* bias, const Dtype* input); +#ifndef CPU_ONLY void forward_gpu_gemm(const Dtype* col_input, const Dtype* weights, Dtype* output, bool skip_im2col = false); void forward_gpu_bias(Dtype* output, const Dtype* bias); @@ -51,6 +52,7 @@ class BaseConvolutionLayer : public Layer<Dtype> { void weight_gpu_gemm(const Dtype* col_input, const Dtype* output, Dtype* weights); void backward_gpu_bias(Dtype* bias, const Dtype* input); +#endif // reverse_dimensions should return true iff we are implementing deconv, so // that conv helpers know which dimensions are which. @@ -80,6 +82,7 @@ class BaseConvolutionLayer : public Layer<Dtype> { col2im_cpu(col_buff, conv_in_channels_, conv_in_height_, conv_in_width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, data); } +#ifndef CPU_ONLY inline void conv_im2col_gpu(const Dtype* data, Dtype* col_buff) { im2col_gpu(data, conv_in_channels_, conv_in_height_, conv_in_width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, col_buff); @@ -88,6 +91,7 @@ class BaseConvolutionLayer : public Layer<Dtype> { col2im_gpu(col_buff, conv_in_channels_, conv_in_height_, conv_in_width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, data); } +#endif int conv_out_channels_; int conv_in_channels_; diff --git a/src/caffe/layers/base_conv_layer.cpp b/src/caffe/layers/base_conv_layer.cpp index a44867a0cf3..dccd5170c11 100644 --- a/src/caffe/layers/base_conv_layer.cpp +++ b/src/caffe/layers/base_conv_layer.cpp @@ -217,6 +217,8 @@ void BaseConvolutionLayer<Dtype>::backward_cpu_bias(Dtype* bias, input, bias_multiplier_.cpu_data(), 1., bias); } +#ifndef CPU_ONLY + template <typename Dtype> void BaseConvolutionLayer<Dtype>::forward_gpu_gemm(const Dtype* input, const Dtype* weights, Dtype* output, bool skip_im2col) { @@ -284,6 +286,8 @@ void BaseConvolutionLayer<Dtype>::backward_gpu_bias(Dtype* bias, input, bias_multiplier_.gpu_data(), 1., bias); } +#endif // !CPU_ONLY + INSTANTIATE_CLASS(BaseConvolutionLayer); } // namespace caffe From e3e2f2d3139880f77355e6837e72ad6c2848b448 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sun, 21 Dec 2014 19:42:29 -0800 Subject: [PATCH 1043/2053] rewrite ConvolutionLayer to use BaseConvolutionLayer helpers --- include/caffe/vision_layers.hpp | 36 +---- src/caffe/layers/conv_layer.cpp | 243 ++++---------------------------- src/caffe/layers/conv_layer.cu | 117 +++------------ 3 files changed, 56 insertions(+), 340 deletions(-) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 4cf7e8b0428..4d93e6c10fc 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -124,7 +124,7 @@ class BaseConvolutionLayer : public Layer<Dtype> { * the output channel N' columns of the output matrix. */ template <typename Dtype> -class ConvolutionLayer : public Layer<Dtype> { +class ConvolutionLayer : public BaseConvolutionLayer<Dtype> { public: /** * @param param provides ConvolutionParameter convolution_param, @@ -155,18 +155,10 @@ class ConvolutionLayer : public Layer<Dtype> { * kernels + stream parallelism) engines. */ explicit ConvolutionLayer(const LayerParameter& param) - : Layer<Dtype>(param) {} - virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - const vector<Blob<Dtype>*>& top); - virtual void Reshape(const vector<Blob<Dtype>*>& bottom, - const vector<Blob<Dtype>*>& top); - + : BaseConvolutionLayer<Dtype>(param) {} virtual inline LayerParameter_LayerType type() const { return LayerParameter_LayerType_CONVOLUTION; } - virtual inline int MinBottomBlobs() const { return 1; } - virtual inline int MinTopBlobs() const { return 1; } - virtual inline bool EqualNumBottomTopBlobs() const { return true; } protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, @@ -177,30 +169,10 @@ class ConvolutionLayer : public Layer<Dtype> { const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + virtual inline bool reverse_dimensions() { return false; } + virtual void compute_output_shape(); - int kernel_h_, kernel_w_; - int stride_h_, stride_w_; - int num_; - int channels_; - int pad_h_, pad_w_; - int height_, width_; - int group_; - int num_output_; - int height_out_, width_out_; - bool bias_term_; - bool is_1x1_; - /// M_ is the channel dimension of the output for a single group, which is the - /// leading dimension of the filter matrix. - int M_; - /// K_ is the dimension of an unrolled input for a single group, which is the - /// leading dimension of the data matrix. - int K_; - /// N_ is the spatial dimension of the output, the H x W, which are the last - /// dimensions of the data and filter matrices. - int N_; - Blob<Dtype> col_buffer_; - Blob<Dtype> bias_multiplier_; }; #ifdef USE_CUDNN diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 0a032025bfb..9fd2fc6a15f 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -9,166 +9,26 @@ namespace caffe { template <typename Dtype> -void ConvolutionLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, - const vector<Blob<Dtype>*>& top) { - // Configure the kernel size, padding, stride, and inputs. - ConvolutionParameter conv_param = this->layer_param_.convolution_param(); - CHECK(!conv_param.has_kernel_size() != - !(conv_param.has_kernel_h() && conv_param.has_kernel_w())) - << "Filter size is kernel_size OR kernel_h and kernel_w; not both"; - CHECK(conv_param.has_kernel_size() || - (conv_param.has_kernel_h() && conv_param.has_kernel_w())) - << "For non-square filters both kernel_h and kernel_w are required."; - CHECK((!conv_param.has_pad() && conv_param.has_pad_h() - && conv_param.has_pad_w()) - || (!conv_param.has_pad_h() && !conv_param.has_pad_w())) - << "pad is pad OR pad_h and pad_w are required."; - CHECK((!conv_param.has_stride() && conv_param.has_stride_h() - && conv_param.has_stride_w()) - || (!conv_param.has_stride_h() && !conv_param.has_stride_w())) - << "Stride is stride OR stride_h and stride_w are required."; - if (conv_param.has_kernel_size()) { - kernel_h_ = kernel_w_ = conv_param.kernel_size(); - } else { - kernel_h_ = conv_param.kernel_h(); - kernel_w_ = conv_param.kernel_w(); - } - CHECK_GT(kernel_h_, 0) << "Filter dimensions cannot be zero."; - CHECK_GT(kernel_w_, 0) << "Filter dimensions cannot be zero."; - if (!conv_param.has_pad_h()) { - pad_h_ = pad_w_ = conv_param.pad(); - } else { - pad_h_ = conv_param.pad_h(); - pad_w_ = conv_param.pad_w(); - } - if (!conv_param.has_stride_h()) { - stride_h_ = stride_w_ = conv_param.stride(); - } else { - stride_h_ = conv_param.stride_h(); - stride_w_ = conv_param.stride_w(); - } - // Special case: im2col is the identity for 1x1 convolution with stride 1 - // and no padding, so flag for skipping the buffer and transformation. - is_1x1_ = kernel_w_ == 1 && kernel_h_ == 1 - && stride_h_ == 1 && stride_w_ == 1 && pad_h_ == 0 && pad_w_ == 0; - // Configure output channels and groups. - channels_ = bottom[0]->channels(); - num_output_ = this->layer_param_.convolution_param().num_output(); - CHECK_GT(num_output_, 0); - group_ = this->layer_param_.convolution_param().group(); - CHECK_EQ(channels_ % group_, 0); - CHECK_EQ(num_output_ % group_, 0) - << "Number of output should be multiples of group."; - // Handle the parameters: weights and biases. - // - blobs_[0] holds the filter weights - // - blobs_[1] holds the biases (optional) - bias_term_ = this->layer_param_.convolution_param().bias_term(); - if (this->blobs_.size() > 0) { - LOG(INFO) << "Skipping parameter initialization"; - } else { - if (bias_term_) { - this->blobs_.resize(2); - } else { - this->blobs_.resize(1); - } - // Initialize and fill the weights: - // output channels x input channels per-group x kernel height x kernel width - this->blobs_[0].reset(new Blob<Dtype>( - num_output_, channels_ / group_, kernel_h_, kernel_w_)); - shared_ptr<Filler<Dtype> > weight_filler(GetFiller<Dtype>( - this->layer_param_.convolution_param().weight_filler())); - weight_filler->Fill(this->blobs_[0].get()); - // If necessary, initialize and fill the biases: - // 1 x 1 x 1 x output channels - if (bias_term_) { - this->blobs_[1].reset(new Blob<Dtype>(1, 1, 1, num_output_)); - shared_ptr<Filler<Dtype> > bias_filler(GetFiller<Dtype>( - this->layer_param_.convolution_param().bias_filler())); - bias_filler->Fill(this->blobs_[1].get()); - } - } - // Propagate gradients to the parameters (as directed by backward pass). - this->param_propagate_down_.resize(this->blobs_.size(), true); -} - -template <typename Dtype> -void ConvolutionLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, - const vector<Blob<Dtype>*>& top) { - num_ = bottom[0]->num(); - height_ = bottom[0]->height(); - width_ = bottom[0]->width(); - CHECK_EQ(bottom[0]->channels(), channels_) << "Input size incompatible with" - " convolution kernel."; - // TODO: generalize to handle inputs of different shapes. - for (int bottom_id = 1; bottom_id < bottom.size(); ++bottom_id) { - CHECK_EQ(num_, bottom[bottom_id]->num()) << "Inputs must have same num."; - CHECK_EQ(channels_, bottom[bottom_id]->channels()) - << "Inputs must have same channels."; - CHECK_EQ(height_, bottom[bottom_id]->height()) - << "Inputs must have same height."; - CHECK_EQ(width_, bottom[bottom_id]->width()) - << "Inputs must have same width."; - } - // Shape the tops. - height_out_ = - (height_ + 2 * pad_h_ - kernel_h_) / stride_h_ + 1; - width_out_ = (width_ + 2 * pad_w_ - kernel_w_) / stride_w_ + 1; - for (int top_id = 0; top_id < top.size(); ++top_id) { - top[top_id]->Reshape(num_, num_output_, height_out_, width_out_); - } - // Prepare the matrix multiplication computation. - // Each input will be convolved as a single GEMM. - M_ = num_output_ / group_; - K_ = channels_ * kernel_h_ * kernel_w_ / group_; - N_ = height_out_ * width_out_; - // The im2col result buffer will only hold one image at a time to avoid - // overly large memory usage. In the special case of 1x1 convolution - // it goes lazily unused to save memory. - col_buffer_.Reshape( - 1, channels_ * kernel_h_ * kernel_w_, height_out_, width_out_); - // Set up the all ones "bias multiplier" for adding biases by BLAS - if (bias_term_) { - bias_multiplier_.Reshape(1, 1, 1, N_); - caffe_set(N_, Dtype(1), bias_multiplier_.mutable_cpu_data()); - } +void ConvolutionLayer<Dtype>::compute_output_shape() { + this->height_out_ = (this->height_ + 2 * this->pad_h_ - this->kernel_h_) + / this->stride_h_ + 1; + this->width_out_ = (this->width_ + 2 * this->pad_w_ - this->kernel_w_) + / this->stride_w_ + 1; } template <typename Dtype> void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { + const Dtype* weight = this->blobs_[0]->cpu_data(); for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->cpu_data(); Dtype* top_data = top[i]->mutable_cpu_data(); - Dtype* col_buff = NULL; - if (!is_1x1_) { - col_buff = col_buffer_.mutable_cpu_data(); - } - const Dtype* weight = this->blobs_[0]->cpu_data(); - int weight_offset = M_ * K_; // number of filter parameters in a group - int col_offset = K_ * N_; // number of values in an input region / column - int top_offset = M_ * N_; // number of values in an output region / column - for (int n = 0; n < num_; ++n) { - // im2col transformation: unroll input regions for filtering - // into column matrix for multplication. - if (!is_1x1_) { - im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - col_buff); - } else { // special case for 1x1 convolution - col_buff = bottom[i]->mutable_cpu_data() + bottom[i]->offset(n); - } - // Take inner products for groups. - for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, - (Dtype)1., weight + weight_offset * g, col_buff + col_offset * g, - (Dtype)0., top_data + top[i]->offset(n) + top_offset * g); - } - // Add bias. - if (bias_term_) { - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, - N_, 1, (Dtype)1., this->blobs_[1]->cpu_data(), - bias_multiplier_.cpu_data(), - (Dtype)1., top_data + top[i]->offset(n)); + for (int n = 0; n < this->num_; ++n) { + this->forward_cpu_gemm(bottom_data + bottom[i]->offset(n), weight, + top_data + top[i]->offset(n)); + if (this->bias_term_) { + const Dtype* bias = this->blobs_[1]->cpu_data(); + this->forward_cpu_bias(top_data + top[i]->offset(n), bias); } } } @@ -177,82 +37,37 @@ void ConvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void ConvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { - const Dtype* weight = NULL; - Dtype* weight_diff = NULL; + const Dtype* weight = this->blobs_[0]->cpu_data(); + Dtype* weight_diff = this->blobs_[0]->mutable_cpu_diff(); if (this->param_propagate_down_[0]) { - weight = this->blobs_[0]->cpu_data(); - weight_diff = this->blobs_[0]->mutable_cpu_diff(); caffe_set(this->blobs_[0]->count(), Dtype(0), weight_diff); } - Dtype* bias_diff = NULL; - if (bias_term_ && this->param_propagate_down_[1]) { - bias_diff = this->blobs_[1]->mutable_cpu_diff(); - caffe_set(this->blobs_[1]->count(), Dtype(0), bias_diff); + if (this->bias_term_ && this->param_propagate_down_[1]) { + caffe_set(this->blobs_[1]->count(), Dtype(0), + this->blobs_[1]->mutable_cpu_diff()); } - const int weight_offset = M_ * K_; - const int col_offset = K_ * N_; - const int top_offset = M_ * N_; for (int i = 0; i < top.size(); ++i) { - const Dtype* top_diff = NULL; + const Dtype* top_diff = top[i]->cpu_diff(); + const Dtype* bottom_data = bottom[i]->cpu_data(); + Dtype* bottom_diff = bottom[i]->mutable_cpu_diff(); // Bias gradient, if necessary. - if (bias_term_ && this->param_propagate_down_[1]) { - top_diff = top[i]->cpu_diff(); - for (int n = 0; n < num_; ++n) { - caffe_cpu_gemv<Dtype>(CblasNoTrans, num_output_, N_, - 1., top_diff + top[0]->offset(n), - bias_multiplier_.cpu_data(), 1., - bias_diff); + if (this->bias_term_ && this->param_propagate_down_[1]) { + Dtype* bias_diff = this->blobs_[1]->mutable_cpu_diff(); + for (int n = 0; n < this->num_; ++n) { + this->backward_cpu_bias(bias_diff, top_diff + top[i]->offset(n)); } } if (this->param_propagate_down_[0] || propagate_down[i]) { - if (!top_diff) { - top_diff = top[i]->cpu_diff(); - } - Dtype* col_buff = NULL; - if (!is_1x1_) { - col_buff = col_buffer_.mutable_cpu_data(); - } - const Dtype* bottom_data = bottom[i]->cpu_data(); - Dtype* bottom_diff = bottom[i]->mutable_cpu_diff(); - for (int n = 0; n < num_; ++n) { - // Since we saved memory in the forward pass by not storing all col - // data, we will need to recompute them. - if (!is_1x1_) { - im2col_cpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, col_buff); - } else { - col_buff = bottom[i]->mutable_cpu_data() + bottom[i]->offset(n); - } + for (int n = 0; n < this->num_; ++n) { // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { - for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, K_, N_, - (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, - col_buff + col_offset * g, (Dtype)1., - weight_diff + weight_offset * g); - } + this->weight_cpu_gemm(bottom_data + bottom[i]->offset(n), + top_diff + top[i]->offset(n), weight_diff); } // gradient w.r.t. bottom data, if necessary. if (propagate_down[i]) { - if (weight == NULL) { - weight = this->blobs_[0]->cpu_data(); - } - if (is_1x1_) { - col_buff = bottom[i]->mutable_cpu_diff() + bottom[i]->offset(n); - } - for (int g = 0; g < group_; ++g) { - caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, - (Dtype)1., weight + weight_offset * g, - top_diff + top[i]->offset(n) + top_offset * g, - (Dtype)0., col_buff + col_offset * g); - } - // col2im back to the data - if (!is_1x1_) { - col2im_cpu(col_buff, channels_, height_, width_, - kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, bottom_diff + bottom[i]->offset(n)); - } + this->backward_cpu_gemm(top_diff + top[i]->offset(n), weight, + bottom_diff + bottom[i]->offset(n)); } } } diff --git a/src/caffe/layers/conv_layer.cu b/src/caffe/layers/conv_layer.cu index af14facb523..3902fdf3930 100644 --- a/src/caffe/layers/conv_layer.cu +++ b/src/caffe/layers/conv_layer.cu @@ -8,135 +8,64 @@ namespace caffe { -/// @brief refer to CPU forward -- the BLAS implementation is the same. template <typename Dtype> void ConvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { + const Dtype* weight = this->blobs_[0]->gpu_data(); for (int i = 0; i < bottom.size(); ++i) { const Dtype* bottom_data = bottom[i]->gpu_data(); Dtype* top_data = top[i]->mutable_gpu_data(); - Dtype* col_buff = NULL; - if (!is_1x1_) { - col_buff = col_buffer_.mutable_gpu_data(); - } - const Dtype* weight = this->blobs_[0]->gpu_data(); - int weight_offset = M_ * K_; - int col_offset = K_ * N_; - int top_offset = M_ * N_; - for (int n = 0; n < num_; ++n) { - // im2col transformation: unroll input regions for filtering - // into column matrix for multplication. - if (!is_1x1_) { - im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - col_buff); - } else { - col_buff = bottom[i]->mutable_gpu_data() + bottom[i]->offset(n); - } - // Take inner products for groups. - for (int g = 0; g < group_; ++g) { - caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, M_, N_, K_, - (Dtype)1., weight + weight_offset * g, col_buff + col_offset * g, - (Dtype)0., top_data + top[i]->offset(n) + top_offset * g); - } - // Add bias. - if (bias_term_) { - caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, num_output_, - N_, 1, (Dtype)1., this->blobs_[1]->gpu_data(), - bias_multiplier_.gpu_data(), - (Dtype)1., top_data + top[i]->offset(n)); + for (int n = 0; n < this->num_; ++n) { + this->forward_gpu_gemm(bottom_data + bottom[i]->offset(n), weight, + top_data + top[i]->offset(n)); + if (this->bias_term_) { + const Dtype* bias = this->blobs_[1]->gpu_data(); + this->forward_gpu_bias(top_data + top[i]->offset(n), bias); } } } } -/// @brief refer to CPU backward -- the BLAS implementation is the same. template <typename Dtype> void ConvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { - const Dtype* weight = NULL; - Dtype* weight_diff = NULL; + const Dtype* weight = this->blobs_[0]->gpu_data(); + Dtype* weight_diff = this->blobs_[0]->mutable_gpu_diff(); if (this->param_propagate_down_[0]) { - weight = this->blobs_[0]->gpu_data(); - weight_diff = this->blobs_[0]->mutable_gpu_diff(); caffe_gpu_set(this->blobs_[0]->count(), Dtype(0), weight_diff); } - Dtype* bias_diff = NULL; - if (bias_term_ && this->param_propagate_down_[1]) { - bias_diff = this->blobs_[1]->mutable_gpu_diff(); - caffe_gpu_set(this->blobs_[1]->count(), Dtype(0), bias_diff); + if (this->bias_term_ && this->param_propagate_down_[1]) { + caffe_gpu_set(this->blobs_[1]->count(), Dtype(0), + this->blobs_[1]->mutable_gpu_diff()); } - const int weight_offset = M_ * K_; - const int col_offset = K_ * N_; - const int top_offset = M_ * N_; for (int i = 0; i < top.size(); ++i) { - const Dtype* top_diff = NULL; + const Dtype* top_diff = top[i]->gpu_diff(); // Bias gradient, if necessary. - if (bias_term_ && this->param_propagate_down_[1]) { - top_diff = top[i]->gpu_diff(); - for (int n = 0; n < num_; ++n) { - caffe_gpu_gemv<Dtype>(CblasNoTrans, num_output_, N_, - 1., top_diff + top[0]->offset(n), - bias_multiplier_.gpu_data(), 1., - bias_diff); + if (this->bias_term_ && this->param_propagate_down_[1]) { + Dtype* bias_diff = this->blobs_[1]->mutable_gpu_diff(); + for (int n = 0; n < this->num_; ++n) { + this->backward_gpu_bias(bias_diff, top_diff + top[i]->offset(n)); } } if (this->param_propagate_down_[0] || propagate_down[i]) { - if (!top_diff) { - top_diff = top[i]->gpu_diff(); - } - Dtype* col_buff = NULL; - if (!is_1x1_) { - col_buff = col_buffer_.mutable_gpu_data(); - } const Dtype* bottom_data = bottom[i]->gpu_data(); Dtype* bottom_diff = bottom[i]->mutable_gpu_diff(); - for (int n = 0; n < num_; ++n) { - // Since we saved memory in the forward pass by not storing all col - // data, we will need to recompute them. - if (!is_1x1_) { - im2col_gpu(bottom_data + bottom[i]->offset(n), channels_, height_, - width_, kernel_h_, kernel_w_, pad_h_, pad_w_, - stride_h_, stride_w_, col_buff); - } else { - col_buff = bottom[i]->mutable_gpu_data() + bottom[i]->offset(n); - } + for (int n = 0; n < this->num_; ++n) { // gradient w.r.t. weight. Note that we will accumulate diffs. if (this->param_propagate_down_[0]) { - for (int g = 0; g < group_; ++g) { - caffe_gpu_gemm<Dtype>(CblasNoTrans, CblasTrans, M_, K_, N_, - (Dtype)1., top_diff + top[i]->offset(n) + top_offset * g, - col_buff + col_offset * g, (Dtype)1., - weight_diff + weight_offset * g); - } + this->weight_gpu_gemm(bottom_data + bottom[i]->offset(n), + top_diff + top[i]->offset(n), weight_diff); } - // gradient w.r.t. bottom data, if necessary + // gradient w.r.t. bottom data, if necessary. if (propagate_down[i]) { - if (weight == NULL) { - weight = this->blobs_[0]->gpu_data(); - } - if (is_1x1_) { - col_buff = bottom[i]->mutable_gpu_diff() + bottom[i]->offset(n); - } - for (int g = 0; g < group_; ++g) { - caffe_gpu_gemm<Dtype>(CblasTrans, CblasNoTrans, K_, N_, M_, - (Dtype)1., weight + weight_offset * g, - top_diff + top[i]->offset(n) + top_offset * g, - (Dtype)0., col_buff + col_offset * g); - } - // col2im back to the data - if (!is_1x1_) { - col2im_gpu(col_buff, channels_, height_, width_, - kernel_h_, kernel_w_, pad_h_, pad_w_, stride_h_, stride_w_, - bottom_diff + bottom[i]->offset(n)); - } + this->backward_gpu_gemm(top_diff + top[i]->offset(n), weight, + bottom_diff + bottom[i]->offset(n)); } } } } } - INSTANTIATE_LAYER_GPU_FUNCS(ConvolutionLayer); } // namespace caffe From 3617352124ab97154d37534e4ba30d7a2b9b6d2f Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Sun, 21 Dec 2014 19:43:36 -0800 Subject: [PATCH 1044/2053] add DeconvolutionLayer, using BaseConvolutionLayer --- include/caffe/vision_layers.hpp | 20 ++++++++ src/caffe/layers/deconv_layer.cpp | 85 +++++++++++++++++++++++++++++++ src/caffe/layers/deconv_layer.cu | 71 ++++++++++++++++++++++++++ src/caffe/proto/caffe.proto | 3 +- 4 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 src/caffe/layers/deconv_layer.cpp create mode 100644 src/caffe/layers/deconv_layer.cu diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 4d93e6c10fc..646378dea9f 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -171,8 +171,28 @@ class ConvolutionLayer : public BaseConvolutionLayer<Dtype> { const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual inline bool reverse_dimensions() { return false; } virtual void compute_output_shape(); +}; +template <typename Dtype> +class DeconvolutionLayer : public BaseConvolutionLayer<Dtype> { + public: + explicit DeconvolutionLayer(const LayerParameter& param) + : BaseConvolutionLayer<Dtype>(param) {} + virtual inline LayerParameter_LayerType type() const { + return LayerParameter_LayerType_DECONVOLUTION; + } + protected: + virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top); + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top); + virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + virtual inline bool reverse_dimensions() { return true; } + virtual void compute_output_shape(); }; #ifdef USE_CUDNN diff --git a/src/caffe/layers/deconv_layer.cpp b/src/caffe/layers/deconv_layer.cpp new file mode 100644 index 00000000000..59114f017bf --- /dev/null +++ b/src/caffe/layers/deconv_layer.cpp @@ -0,0 +1,85 @@ +#include <vector> + +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void DeconvolutionLayer<Dtype>::compute_output_shape() { + this->height_out_ = this->stride_h_ * (this->height_ - 1) + this->kernel_h_ + - 2 * this->pad_h_; + this->width_out_ = this->stride_w_ * (this->width_ - 1) + this->kernel_w_ + - 2 * this->pad_w_; +} + +template <typename Dtype> +void DeconvolutionLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top) { + const Dtype* weight = this->blobs_[0]->cpu_data(); + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->cpu_data(); + Dtype* top_data = top[i]->mutable_cpu_data(); + for (int n = 0; n < this->num_; ++n) { + this->backward_cpu_gemm(bottom_data + bottom[i]->offset(n), weight, + top_data + top[i]->offset(n)); + if (this->bias_term_) { + const Dtype* bias = this->blobs_[1]->cpu_data(); + this->forward_cpu_bias(top_data + top[i]->offset(n), bias); + } + } + } +} + +template <typename Dtype> +void DeconvolutionLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { + const Dtype* weight = this->blobs_[0]->cpu_data(); + Dtype* weight_diff = this->blobs_[0]->mutable_cpu_diff(); + if (this->param_propagate_down_[0]) { + caffe_set(this->blobs_[0]->count(), Dtype(0), weight_diff); + } + if (this->bias_term_ && this->param_propagate_down_[1]) { + caffe_set(this->blobs_[1]->count(), Dtype(0), + this->blobs_[1]->mutable_cpu_diff()); + } + for (int i = 0; i < top.size(); ++i) { + const Dtype* top_diff = top[i]->cpu_diff(); + const Dtype* bottom_data = bottom[i]->cpu_data(); + Dtype* bottom_diff = bottom[i]->mutable_cpu_diff(); + // Bias gradient, if necessary. + if (this->bias_term_ && this->param_propagate_down_[1]) { + Dtype* bias_diff = this->blobs_[1]->mutable_cpu_diff(); + for (int n = 0; n < this->num_; ++n) { + this->backward_cpu_bias(bias_diff, top_diff + top[i]->offset(n)); + } + } + if (this->param_propagate_down_[0] || propagate_down[i]) { + for (int n = 0; n < this->num_; ++n) { + // Gradient w.r.t. weight. Note that we will accumulate diffs. + if (this->param_propagate_down_[0]) { + this->weight_cpu_gemm(top_diff + top[i]->offset(n), + bottom_data + bottom[i]->offset(n), weight_diff); + } + // Gradient w.r.t. bottom data, if necessary, reusing the column buffer + // we might have just computed above. + if (propagate_down[i]) { + this->forward_cpu_gemm(top_diff + top[i]->offset(n), weight, + bottom_diff + bottom[i]->offset(n), + this->param_propagate_down_[0]); + } + } + } + } +} + +#ifdef CPU_ONLY +STUB_GPU(DeconvolutionLayer); +#endif + +INSTANTIATE_CLASS(DeconvolutionLayer); +REGISTER_LAYER_CLASS(DECONVOLUTION, DeconvolutionLayer); +} // namespace caffe diff --git a/src/caffe/layers/deconv_layer.cu b/src/caffe/layers/deconv_layer.cu new file mode 100644 index 00000000000..9198dd64c72 --- /dev/null +++ b/src/caffe/layers/deconv_layer.cu @@ -0,0 +1,71 @@ +#include <vector> + +#include "caffe/filler.hpp" +#include "caffe/layer.hpp" +#include "caffe/util/im2col.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +void DeconvolutionLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top) { + const Dtype* weight = this->blobs_[0]->gpu_data(); + for (int i = 0; i < bottom.size(); ++i) { + const Dtype* bottom_data = bottom[i]->gpu_data(); + Dtype* top_data = top[i]->mutable_gpu_data(); + for (int n = 0; n < this->num_; ++n) { + this->backward_gpu_gemm(bottom_data + bottom[i]->offset(n), weight, + top_data + top[i]->offset(n)); + if (this->bias_term_) { + const Dtype* bias = this->blobs_[1]->gpu_data(); + this->forward_gpu_bias(top_data + top[i]->offset(n), bias); + } + } + } +} + +template <typename Dtype> +void DeconvolutionLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { + const Dtype* weight = this->blobs_[0]->gpu_data(); + Dtype* weight_diff = this->blobs_[0]->mutable_gpu_diff(); + if (this->param_propagate_down_[0]) { + caffe_gpu_set(this->blobs_[0]->count(), Dtype(0), weight_diff); + } + if (this->bias_term_ && this->param_propagate_down_[1]) { + caffe_gpu_set(this->blobs_[1]->count(), Dtype(0), + this->blobs_[1]->mutable_gpu_diff()); + } + for (int i = 0; i < top.size(); ++i) { + const Dtype* top_diff = top[i]->gpu_diff(); + const Dtype* bottom_data = bottom[i]->gpu_data(); + Dtype* bottom_diff = bottom[i]->mutable_gpu_diff(); + // Bias gradient, if necessary. + if (this->bias_term_ && this->param_propagate_down_[1]) { + Dtype* bias_diff = this->blobs_[1]->mutable_gpu_diff(); + for (int n = 0; n < this->num_; ++n) { + this->backward_gpu_bias(bias_diff, top_diff + top[i]->offset(n)); + } + } + if (this->param_propagate_down_[0] || propagate_down[i]) { + for (int n = 0; n < this->num_; ++n) { + // gradient w.r.t. weight. Note that we will accumulate diffs. + if (this->param_propagate_down_[0]) { + this->weight_gpu_gemm(top_diff + top[i]->offset(n), + bottom_data + bottom[i]->offset(n), weight_diff); + } + // gradient w.r.t. bottom data, if necessary. + if (propagate_down[i]) { + this->forward_gpu_gemm(top_diff + top[i]->offset(n), weight, + bottom_diff + bottom[i]->offset(n)); + } + } + } + } +} + +INSTANTIATE_LAYER_GPU_FUNCS(DeconvolutionLayer); + +} // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 8086ad66579..e83eefa1622 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -227,7 +227,7 @@ message LayerParameter { // line above the enum. Update the next available ID when you add a new // LayerType. // - // LayerType next available ID: 39 (last added: EXP) + // LayerType next available ID: 40 (last added: DECONVOLUTION) enum LayerType { // "NONE" layer type is 0th enum element so that we don't cause confusion // by defaulting to an existent LayerType (instead, should usually error if @@ -241,6 +241,7 @@ message LayerParameter { CONTRASTIVE_LOSS = 37; CONVOLUTION = 4; DATA = 5; + DECONVOLUTION = 39; DROPOUT = 6; DUMMY_DATA = 32; EUCLIDEAN_LOSS = 7; From f2057680c7f633ec0d9d63d865d09fe1b958ebee Mon Sep 17 00:00:00 2001 From: Pannous <info@pannous.com> Date: Wed, 14 Jan 2015 18:43:49 +0100 Subject: [PATCH 1045/2053] Message: Please ask usage questions and how to model different tasks on the caffe-users mailing list --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 0e3c833e8fb..9a9b3ee36eb 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,7 @@ Caffe is a deep learning framework developed with cleanliness, readability, and speed in mind.<br /> Consult the [project website](http://caffe.berkeleyvision.org) for all documentation. + + +Please ask usage questions and how to model different tasks on the [caffe-users mailing list](https://groups.google.com/forum/#!forum/caffe-users). + From 4041e4d0117e46bb213a6017e9e34806a8ccb286 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 14 Jan 2015 17:56:23 -0800 Subject: [PATCH 1046/2053] set mode, phase, device in pycaffe; fix #1700 Attach mode, phase, and device setters to caffe module itself so that these can be set before making nets. This is needed to properly initialize layers with the right device and phase configuration. Update examples to new usage. --- examples/classification.ipynb | 54 +++++++++++------------------ examples/filter_visualization.ipynb | 9 ++--- examples/net_surgery.ipynb | 7 ++-- python/caffe/__init__.py | 2 ++ python/caffe/_caffe.cpp | 12 ++++--- python/caffe/_caffe.hpp | 13 ++++--- python/caffe/classifier.py | 6 ++-- python/caffe/detector.py | 6 ++-- python/caffe/pycaffe.py | 2 ++ 9 files changed, 52 insertions(+), 59 deletions(-) diff --git a/examples/classification.ipynb b/examples/classification.ipynb index 1e2126fe652..6b6c5488d36 100644 --- a/examples/classification.ipynb +++ b/examples/classification.ipynb @@ -3,7 +3,8 @@ "description": "Use the pre-trained ImageNet model to classify images with the Python interface.", "example_name": "ImageNet classification", "include_in_docs": true, - "priority": 1 + "priority": 1, + "signature": "sha256:2caae2c1fe3e282b8f836d380a45622351c91db18a1591e4f2fa67faba9ab72c" }, "nbformat": 3, "nbformat_minor": 0, @@ -54,13 +55,17 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Loading a network is easy. `caffe.Classifier` takes care of everything. Note the arguments for configuring input preprocessing: mean subtraction switched on by giving a mean array, input channel swapping takes care of mapping RGB into the reference ImageNet model's BGR order, and raw scaling multiplies the feature scale from the input [0,1] to the ImageNet model's [0,255]." + "Loading a network is easy. `caffe.Classifier` takes care of everything. Note the arguments for configuring input preprocessing: mean subtraction switched on by giving a mean array, input channel swapping takes care of mapping RGB into the reference ImageNet model's BGR order, and raw scaling multiplies the feature scale from the input [0,1] to the ImageNet model's [0,255].\n", + "\n", + "We will set the phase to test since we are doing testing, and will first use CPU for the computation." ] }, { "cell_type": "code", "collapsed": false, "input": [ + "caffe.set_phase_test()\n", + "caffe.set_mode_cpu()\n", "net = caffe.Classifier(MODEL_FILE, PRETRAINED,\n", " mean=np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy'),\n", " channel_swap=(2,1,0),\n", @@ -72,25 +77,6 @@ "outputs": [], "prompt_number": 2 }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We will set the phase to test since we are doing testing, and will first use CPU for the computation." - ] - }, - { - "cell_type": "code", - "collapsed": false, - "input": [ - "net.set_phase_test()\n", - "net.set_mode_cpu()" - ], - "language": "python", - "metadata": {}, - "outputs": [], - "prompt_number": 3 - }, { "cell_type": "markdown", "metadata": {}, @@ -111,7 +97,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 4, + "prompt_number": 3, "text": [ "<matplotlib.image.AxesImage at 0x7fda204c0e10>" ] @@ -125,7 +111,7 @@ ] } ], - "prompt_number": 4 + "prompt_number": 3 }, { "cell_type": "markdown", @@ -163,7 +149,7 @@ ] } ], - "prompt_number": 5 + "prompt_number": 4 }, { "cell_type": "markdown", @@ -205,7 +191,7 @@ ] } ], - "prompt_number": 6 + "prompt_number": 5 }, { "cell_type": "markdown", @@ -233,7 +219,7 @@ ] } ], - "prompt_number": 7 + "prompt_number": 6 }, { "cell_type": "markdown", @@ -266,7 +252,7 @@ ] } ], - "prompt_number": 8 + "prompt_number": 7 }, { "cell_type": "markdown", @@ -279,12 +265,12 @@ "cell_type": "code", "collapsed": false, "input": [ - "net.set_mode_gpu()" + "caffe.set_mode_gpu()" ], "language": "python", "metadata": {}, "outputs": [], - "prompt_number": 9 + "prompt_number": 8 }, { "cell_type": "markdown", @@ -314,7 +300,7 @@ { "metadata": {}, "output_type": "pyout", - "prompt_number": 10, + "prompt_number": 9, "text": [ "[<matplotlib.lines.Line2D at 0x7fda1ac309d0>]" ] @@ -328,7 +314,7 @@ ] } ], - "prompt_number": 10 + "prompt_number": 9 }, { "cell_type": "markdown", @@ -355,7 +341,7 @@ ] } ], - "prompt_number": 11 + "prompt_number": 10 }, { "cell_type": "code", @@ -375,7 +361,7 @@ ] } ], - "prompt_number": 12 + "prompt_number": 11 }, { "cell_type": "markdown", @@ -404,4 +390,4 @@ "metadata": {} } ] -} +} \ No newline at end of file diff --git a/examples/filter_visualization.ipynb b/examples/filter_visualization.ipynb index 09b416fb4ca..8e068805d62 100644 --- a/examples/filter_visualization.ipynb +++ b/examples/filter_visualization.ipynb @@ -3,7 +3,8 @@ "description": "Extracting features and visualizing trained filters with an example image, viewed layer-by-layer.", "example_name": "Filter visualization", "include_in_docs": true, - "priority": 2 + "priority": 2, + "signature": "sha256:526501b358e0f60c489eaf5799e8603a75019cc65401533baa307b5603fdefa1" }, "nbformat": 3, "nbformat_minor": 0, @@ -61,10 +62,10 @@ "cell_type": "code", "collapsed": false, "input": [ + "caffe.set_phase_test()\n", + "caffe.set_mode_cpu()\n", "net = caffe.Classifier(caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt',\n", " caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel')\n", - "net.set_phase_test()\n", - "net.set_mode_cpu()\n", "# input preprocessing: 'data' is the name of the input blob == net.inputs[0]\n", "net.set_mean('data', np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy')) # ImageNet mean\n", "net.set_raw_scale('data', 255) # the reference model operates on images in [0,255] range instead of [0,1]\n", @@ -598,4 +599,4 @@ "metadata": {} } ] -} +} \ No newline at end of file diff --git a/examples/net_surgery.ipynb b/examples/net_surgery.ipynb index 64310016101..a4fb4a66065 100644 --- a/examples/net_surgery.ipynb +++ b/examples/net_surgery.ipynb @@ -4,7 +4,7 @@ "example_name": "Editing model parameters", "include_in_docs": true, "priority": 5, - "signature": "sha256:179fb20339497f5e64f6fbeb57987f27a962b7ae6d940c8fede2631aba9bffaf" + "signature": "sha256:bf84bcbd78fe007310f86d71c5969ba4205b6e06f408029860eec94821844bee" }, "nbformat": 3, "nbformat_minor": 0, @@ -279,9 +279,10 @@ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", + "caffe.set_phase_test()\n", + "\n", "# load input and configure preprocessing\n", "im = caffe.io.load_image('images/cat.jpg')\n", - "net_full_conv.set_phase_test()\n", "net_full_conv.set_mean('data', np.load('../python/caffe/imagenet/ilsvrc_2012_mean.npy'))\n", "net_full_conv.set_channel_swap('data', (2,1,0))\n", "net_full_conv.set_raw_scale('data', 255.0)\n", @@ -352,4 +353,4 @@ "metadata": {} } ] -} +} \ No newline at end of file diff --git a/python/caffe/__init__.py b/python/caffe/__init__.py index 430bfce2ba5..8dd2464d1c4 100644 --- a/python/caffe/__init__.py +++ b/python/caffe/__init__.py @@ -1,4 +1,6 @@ from .pycaffe import Net, SGDSolver +from .pycaffe import set_mode_cpu, set_mode_gpu, set_phase_train, set_phase_test +from .pycaffe import set_device from .classifier import Classifier from .detector import Detector import io diff --git a/python/caffe/_caffe.cpp b/python/caffe/_caffe.cpp index 5a81a42329b..2b279e8a6ce 100644 --- a/python/caffe/_caffe.cpp +++ b/python/caffe/_caffe.cpp @@ -142,6 +142,13 @@ void PySGDSolver::SolveResume(const string& resume_file) { } BOOST_PYTHON_MODULE(_caffe) { + // Caffe utility methods + bp::def("set_mode_cpu", &set_mode_cpu); + bp::def("set_mode_gpu", &set_mode_gpu); + bp::def("set_phase_train", &set_phase_train); + bp::def("set_phase_test", &set_phase_test); + bp::def("set_device", &Caffe::SetDevice); + // below, we prepend an underscore to methods that will be replaced // in Python bp::class_<PyNet, shared_ptr<PyNet> >( @@ -150,11 +157,6 @@ BOOST_PYTHON_MODULE(_caffe) { .def("_forward", &PyNet::Forward) .def("_backward", &PyNet::Backward) .def("reshape", &PyNet::Reshape) - .def("set_mode_cpu", &PyNet::set_mode_cpu) - .def("set_mode_gpu", &PyNet::set_mode_gpu) - .def("set_phase_train", &PyNet::set_phase_train) - .def("set_phase_test", &PyNet::set_phase_test) - .def("set_device", &PyNet::set_device) .add_property("_blobs", &PyNet::blobs) .add_property("layers", &PyNet::layers) .add_property("_blob_names", &PyNet::blob_names) diff --git a/python/caffe/_caffe.hpp b/python/caffe/_caffe.hpp index ba04d276351..e2e1ca348ab 100644 --- a/python/caffe/_caffe.hpp +++ b/python/caffe/_caffe.hpp @@ -18,6 +18,12 @@ using boost::shared_ptr; namespace caffe { +// Selecting mode and phase. +void set_mode_cpu() { Caffe::set_mode(Caffe::CPU); } +void set_mode_gpu() { Caffe::set_mode(Caffe::GPU); } +void set_phase_train() { Caffe::set_phase(Caffe::TRAIN); } +void set_phase_test() { Caffe::set_phase(Caffe::TEST); } + // wrap shared_ptr<Blob> in a class that we construct in C++ and pass // to Python template <typename Dtype> @@ -109,13 +115,6 @@ class PyNet { WriteProtoToBinaryFile(net_param, filename.c_str()); } - // The caffe::Caffe utility functions. - void set_mode_cpu() { Caffe::set_mode(Caffe::CPU); } - void set_mode_gpu() { Caffe::set_mode(Caffe::GPU); } - void set_phase_train() { Caffe::set_phase(Caffe::TRAIN); } - void set_phase_test() { Caffe::set_phase(Caffe::TEST); } - void set_device(int device_id) { Caffe::SetDevice(device_id); } - vector<PyBlob<float> > blobs() { return vector<PyBlob<float> >(net_->blobs().begin(), net_->blobs().end()); } diff --git a/python/caffe/classifier.py b/python/caffe/classifier.py index fe471ca13b1..f9a13a39865 100644 --- a/python/caffe/classifier.py +++ b/python/caffe/classifier.py @@ -24,12 +24,12 @@ def __init__(self, model_file, pretrained_file, image_dims=None, preprocessing options. """ caffe.Net.__init__(self, model_file, pretrained_file) - self.set_phase_test() + caffe.set_phase_test() if gpu: - self.set_mode_gpu() + caffe.set_mode_gpu() else: - self.set_mode_cpu() + caffe.set_mode_cpu() if mean is not None: self.set_mean(self.inputs[0], mean) diff --git a/python/caffe/detector.py b/python/caffe/detector.py index f219b6105e1..b78abd12a89 100644 --- a/python/caffe/detector.py +++ b/python/caffe/detector.py @@ -36,12 +36,12 @@ def __init__(self, model_file, pretrained_file, gpu=False, mean=None, R-CNN feature extraction. """ caffe.Net.__init__(self, model_file, pretrained_file) - self.set_phase_test() + caffe.set_phase_test() if gpu: - self.set_mode_gpu() + caffe.set_mode_gpu() else: - self.set_mode_cpu() + caffe.set_mode_cpu() if mean is not None: self.set_mean(self.inputs[0], mean) diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 31dc1f9b001..8899309ddfd 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -8,6 +8,8 @@ import numpy as np from ._caffe import Net, SGDSolver +from ._caffe import set_mode_cpu, set_mode_gpu, set_phase_train, set_phase_test +from ._caffe import set_device import caffe.io # We directly update methods from Net here (rather than using composition or From ab839f5b2f5c93da34c2ab797ab2a64b62645976 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 15 Jan 2015 16:28:09 -0800 Subject: [PATCH 1047/2053] support OS X Yosemite / 10.10 - pick libstdc++ for OS X (regardless of version) - make gtest rely on its own tuple to not conflict with clang (thanks @pluskid!) - 10.10 has Accelerate while 10.9 has vecLib for BLAS (thanks @leonardt and @drdan14) --- Makefile | 21 ++++++++++++++------- docs/installation.md | 14 +++++++------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 46bf7280919..2d82e058085 100644 --- a/Makefile +++ b/Makefile @@ -234,15 +234,15 @@ endif # libstdc++ instead of libc++ for CUDA compatibility on 10.9 ifeq ($(OSX), 1) CXX := /usr/bin/clang++ + CXXFLAGS += -stdlib=libstdc++ + LINKFLAGS += -stdlib=libstdc++ # clang throws this warning for cuda headers WARNINGS += -Wno-unneeded-internal-declaration - ifneq ($(findstring 10.9, $(shell sw_vers -productVersion)),) - CXXFLAGS += -stdlib=libstdc++ - LINKFLAGS += -stdlib=libstdc++ - endif + # gtest needs to use its own tuple to not conflict with clang + CXXFLAGS += -DGTEST_USE_OWN_TR1_TUPLE=1 # boost::thread is called boost_thread-mt to mark multithreading on OS X LIBRARIES += boost_thread-mt - NVCCFLAGS += -DOSX + NVCCFLAGS += -DOSX endif # Custom compiler @@ -304,9 +304,16 @@ else endif else ifeq ($(OSX), 1) # OS X packages atlas as the vecLib framework - BLAS_INCLUDE ?= /System/Library/Frameworks/vecLib.framework/Versions/Current/Headers/ LIBRARIES += cblas - LDFLAGS += -framework vecLib + # 10.10 has accelerate while 10.9 has veclib + XCODE_CLT_VER := $(shell pkgutil --pkg-info=com.apple.pkg.CLTools_Executables | grep -o 'version: 6') + ifneq (,$(findstring version: 6,$(XCODE_CLT_VER))) + BLAS_INCLUDE ?= /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/ + LDFLAGS += -framework Accelerate + else + BLAS_INCLUDE ?= /System/Library/Frameworks/vecLib.framework/Versions/Current/Headers/ + LDFLAGS += -framework vecLib + endif endif endif INCLUDE_DIRS += $(BLAS_INCLUDE) diff --git a/docs/installation.md b/docs/installation.md index c667cd8ce01..94068e503dc 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -5,7 +5,7 @@ title: Installation # Installation Prior to installing, it is best to read through this guide and take note of the details for your platform. -We have installed Caffe on Ubuntu 14.04, Ubuntu 12.04, OS X 10.9, and OS X 10.8. +We have installed Caffe on Ubuntu 14.04, Ubuntu 12.04, OS X 10.10, 10.9, and 10.8. - [Prerequisites](#prerequisites) - [Compilation](#compilation) @@ -156,9 +156,9 @@ Building boost from source is needed to link against your local Python (exceptio **Note** that the HDF5 dependency is provided by Anaconda Python in this case. If you're not using Anaconda, include `hdf5` in the list above. -#### 10.9-specific Instructions +#### 10.10- and 10.9-specific Instructions -In OS X 10.9, clang++ is the default C++ compiler and uses `libc++` as the standard library. +In OS X 10.9+, clang++ is the default C++ compiler and uses `libc++` as the standard library. However, NVIDIA CUDA (even version 6.0) currently links only with `libstdc++`. This makes it necessary to change the compilation settings for each of the dependencies. @@ -226,10 +226,10 @@ Then, whenever you want to update homebrew, switch back to the master branches, git checkout master cd /usr/local/Library/Taps/homebrew/homebrew-science git checkout master - + # Update homebrew; hopefully this works without errors! brew update - + # Switch back to the caffe branches with the forumlae that you modified earlier cd /usr/local git rebase master caffe @@ -237,8 +237,8 @@ Then, whenever you want to update homebrew, switch back to the master branches, cd /usr/local/Library/Taps/homebrew/homebrew-science git rebase master caffe # Fix any merge conflicts and commit to caffe branch - - # Done! + + # Done! At this point, you should be running the latest Homebrew packages and your Caffe-related modifications will remain in place. From c16493cfb2cdf57f9ee5f511826ea110686929cf Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 15 Jan 2015 20:43:24 -0800 Subject: [PATCH 1048/2053] lint internal thread --- include/caffe/internal_thread.hpp | 2 +- src/caffe/internal_thread.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/include/caffe/internal_thread.hpp b/include/caffe/internal_thread.hpp index fec22a47c86..815ca54605e 100644 --- a/include/caffe/internal_thread.hpp +++ b/include/caffe/internal_thread.hpp @@ -39,4 +39,4 @@ class InternalThread { } // namespace caffe -#endif // CAFFE_INTERNAL_THREAD_HPP_ +#endif // CAFFE_INTERNAL_THREAD_HPP_ diff --git a/src/caffe/internal_thread.cpp b/src/caffe/internal_thread.cpp index 58772e36c23..c2d19d433b4 100644 --- a/src/caffe/internal_thread.cpp +++ b/src/caffe/internal_thread.cpp @@ -17,7 +17,8 @@ bool InternalThread::StartInternalThread() { return false; } try { - thread_.reset(new boost::thread(&InternalThread::InternalThreadEntry, this)); + thread_.reset( + new boost::thread(&InternalThread::InternalThreadEntry, this)); } catch (...) { return false; } From d612f4a35cf84d9d025757b3d1cd65b96e2e5850 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 15 Jan 2015 21:47:50 -0800 Subject: [PATCH 1049/2053] check for enough args to convert_imageset (this might better be handled by making all args flags...) --- tools/convert_imageset.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index c554ed389ab..5d42e69c1ed 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -52,7 +52,7 @@ int main(int argc, char** argv) { " http://www.image-net.org/download-images\n"); gflags::ParseCommandLineFlags(&argc, &argv, true); - if (argc != 4) { + if (argc < 4) { gflags::ShowUsageWithFlagsRestrict(argv[0], "tools/convert_imageset"); return 1; } From 6af39c503677fad31c8c3c7ba784080090a01399 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 16 Jan 2015 13:41:34 -0800 Subject: [PATCH 1050/2053] [docs] OpenCV version >= 2.4 --- docs/installation.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index c667cd8ce01..a42ef5b309c 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -17,7 +17,7 @@ Caffe depends on several software packages. * [CUDA](https://developer.nvidia.com/cuda-zone) library version 6.5 (recommended), 6.0, 5.5, or 5.0 and the latest driver version for CUDA 6 or 319.* for CUDA 5 (and NOT 331.*) * [BLAS](http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) (provided via ATLAS, MKL, or OpenBLAS). -* [OpenCV](http://opencv.org/). +* [OpenCV](http://opencv.org/) (>= 2.4) * [Boost](http://www.boost.org/) (>= 1.55, although only 1.55 and 1.56 are tested) * `glog`, `gflags`, `protobuf`, `leveldb`, `snappy`, `hdf5`, `lmdb` * For the Python wrapper @@ -226,10 +226,10 @@ Then, whenever you want to update homebrew, switch back to the master branches, git checkout master cd /usr/local/Library/Taps/homebrew/homebrew-science git checkout master - + # Update homebrew; hopefully this works without errors! brew update - + # Switch back to the caffe branches with the forumlae that you modified earlier cd /usr/local git rebase master caffe @@ -237,8 +237,8 @@ Then, whenever you want to update homebrew, switch back to the master branches, cd /usr/local/Library/Taps/homebrew/homebrew-science git rebase master caffe # Fix any merge conflicts and commit to caffe branch - - # Done! + + # Done! At this point, you should be running the latest Homebrew packages and your Caffe-related modifications will remain in place. From f476e9014830a502b0b01e18b3936021f7b2fb33 Mon Sep 17 00:00:00 2001 From: Christos Nikolaou <christnn@auth.gr> Date: Thu, 30 Oct 2014 01:05:12 +0200 Subject: [PATCH 1051/2053] Update interfaces.md file Proofread and update the /docs/tutorial/interfaces.md file. --- docs/tutorial/interfaces.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/docs/tutorial/interfaces.md b/docs/tutorial/interfaces.md index 6b0ec347dfe..17430b35c57 100644 --- a/docs/tutorial/interfaces.md +++ b/docs/tutorial/interfaces.md @@ -9,7 +9,13 @@ Caffe has command line, Python, and MATLAB interfaces for day-to-day usage, inte The command line interface -- cmdcaffe -- is the `caffe` tool for model training, scoring, and diagnostics. Run `caffe` without any arguments for help. This tool and others are found in caffe/build/tools. (The following example calls require completing the LeNet / MNIST example first.) -**Training**: `caffe train` learns models from scratch, resumes learning from saved snapshots, and fine-tunes models to new data and tasks. All training requires a solver configuration through the `-solver solver.prototxt` argument. Resuming requires the `-snapshot model_iter_1000.solverstate` argument to load the solver snapshot. Fine-tuning requires the `-weights model.caffemodel` argument for the model initialization. +**Training**: `caffe train` learns models from scratch, resumes learning from saved snapshots, and fine-tunes models to new data and tasks: + +* All training requires a solver configuration through the `-solver solver.prototxt` argument. +* Resuming requires the `-snapshot model_iter_1000.solverstate` argument to load the solver snapshot. +* Fine-tuning requires the `-weights model.caffemodel` argument for the model initialization. + +For example, you can run: # train LeNet caffe train -solver examples/mnist/lenet_solver.prototxt @@ -26,17 +32,19 @@ For a full example of fine-tuning, see examples/finetuning_on_flickr_style, but **Testing**: `caffe test` scores models by running them in the test phase and reports the net output as its score. The net architecture must be properly defined to output an accuracy measure or loss as its output. The per-batch score is reported and then the grand average is reported last. # - # score the learned LeNet model on the validation set as defined in the model architeture lenet_train_test.prototxt - caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000 -gpu 0 -iterations 100 + # score the learned LeNet model on the validation set as defined in the + # model architeture lenet_train_test.prototxt + caffe test -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 100 **Benchmarking**: `caffe time` benchmarks model execution layer-by-layer through timing and synchronization. This is useful to check system performance and measure relative execution times for models. # (These example calls require you complete the LeNet / MNIST example first.) # time LeNet training on CPU for 10 iterations caffe time -model examples/mnist/lenet_train_test.prototxt -iterations 10 - # time a model architecture with the given weights on the first GPU for 10 iterations # time LeNet training on GPU for the default 50 iterations caffe time -model examples/mnist/lenet_train_test.prototxt -gpu 0 + # time a model architecture with the given weights on the first GPU for 10 iterations + caffe time -model examples/mnist/lenet_train_test.prototxt -weights examples/mnist/lenet_iter_10000.caffemodel -gpu 0 -iterations 10 **Diagnostics**: `caffe device_query` reports GPU details for reference and checking device ordinals for running on a given device in multi-GPU machines. From 1304173d85d3d382d3ae2b2aa4f6c04b2c8c75ca Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sat, 17 Jan 2015 15:41:44 -0800 Subject: [PATCH 1052/2053] Make comments for sparse GaussianFiller match actual behavior (Fixes #1497 reported by @denizyuret) --- include/caffe/filler.hpp | 6 +++--- src/caffe/proto/caffe.proto | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/caffe/filler.hpp b/include/caffe/filler.hpp index 136ce958aed..eebf565b1d5 100644 --- a/include/caffe/filler.hpp +++ b/include/caffe/filler.hpp @@ -76,13 +76,13 @@ class GaussianFiller : public Filler<Dtype> { CHECK_GE(sparse, -1); if (sparse >= 0) { // Sparse initialization is implemented for "weight" blobs; i.e. matrices. - // These have num == channels == 1; height is number of inputs; width is + // These have num == channels == 1; width is number of inputs; height is // number of outputs. The 'sparse' variable specifies the mean number // of non-zero input weights for a given output. CHECK_EQ(blob->num(), 1); CHECK_EQ(blob->channels(), 1); - int num_inputs = blob->height(); - Dtype non_zero_probability = Dtype(sparse) / Dtype(num_inputs); + int num_outputs = blob->height(); + Dtype non_zero_probability = Dtype(sparse) / Dtype(num_outputs); rand_vec_.reset(new SyncedMemory(blob->count() * sizeof(int))); int* mask = reinterpret_cast<int*>(rand_vec_->mutable_cpu_data()); caffe_rng_bernoulli(blob->count(), non_zero_probability, mask); diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 8086ad66579..d6eec02087b 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -38,7 +38,7 @@ message FillerParameter { optional float max = 4 [default = 1]; // the max value in uniform filler optional float mean = 5 [default = 0]; // the mean value in Gaussian filler optional float std = 6 [default = 1]; // the std value in Gaussian filler - // The expected number of non-zero input weights for a given output in + // The expected number of non-zero output weights for a given input in // Gaussian filler -- the default -1 means don't perform sparsification. optional int32 sparse = 7 [default = -1]; } From c795095fd26767152e3ee6a3183cda5edd75c39b Mon Sep 17 00:00:00 2001 From: Dinesh Jayaraman <dineshj@cs.utexas.edu> Date: Sat, 17 Jan 2015 18:23:48 -0600 Subject: [PATCH 1053/2053] Matlab demo for Caffe-compatible HDF5 read/write --- matlab/caffe/hdf5creation/.gitignore | 2 + matlab/caffe/hdf5creation/demo.m | 64 ++++++++++++++++++++++++++ matlab/caffe/hdf5creation/store2hdf5.m | 59 ++++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 matlab/caffe/hdf5creation/.gitignore create mode 100644 matlab/caffe/hdf5creation/demo.m create mode 100644 matlab/caffe/hdf5creation/store2hdf5.m diff --git a/matlab/caffe/hdf5creation/.gitignore b/matlab/caffe/hdf5creation/.gitignore new file mode 100644 index 00000000000..e2333dd1776 --- /dev/null +++ b/matlab/caffe/hdf5creation/.gitignore @@ -0,0 +1,2 @@ +*.h5 +list.txt diff --git a/matlab/caffe/hdf5creation/demo.m b/matlab/caffe/hdf5creation/demo.m new file mode 100644 index 00000000000..f554b87e5f6 --- /dev/null +++ b/matlab/caffe/hdf5creation/demo.m @@ -0,0 +1,64 @@ +%% WRITING TO HDF5 +filename='trial.h5'; + +num_total_samples=10000; +% to simulate data being read from disk / generated etc. +data_disk=rand(5,5,1,num_total_samples); +label_disk=rand(10,num_total_samples); + +chunksz=100; +created_flag=false; +totalct=0; +for batchno=1:num_total_samples/chunksz + fprintf('batch no. %d\n', batchno); + last_read=(batchno-1)*chunksz; + + % to simulate maximum data to be held in memory before dumping to hdf5 file + batchdata=data_disk(:,:,1,last_read+1:last_read+chunksz); + batchlabs=label_disk(:,last_read+1:last_read+chunksz); + + % store to hdf5 + startloc=struct('dat',[1,1,1,totalct+1], 'lab', [1,totalct+1]); + curr_dat_sz=store2hdf5(filename, batchdata, batchlabs, ~created_flag, startloc, chunksz); + created_flag=true;% flag set so that file is created only once + totalct=curr_dat_sz(end);% updated dataset size (#samples) +end + +% display structure of the stored HDF5 file +h5disp(filename); + +%% READING FROM HDF5 + +% Read data and labels for samples #1000 to 1999 +data_rd=h5read(filename, '/data', [1 1 1 1000], [5, 5, 1, 1000]); +label_rd=h5read(filename, '/label', [1 1000], [10, 1000]); +fprintf('Testing ...\n'); +try + assert(isequal(data_rd, single(data_disk(:,:,:,1000:1999))), 'Data do not match'); + assert(isequal(label_rd, single(label_disk(:,1000:1999))), 'Labels do not match'); + + fprintf('Success!\n'); +catch err + fprintf('Test failed ...\n'); + getReport(err) +end + +%delete(filename); + +% CREATE list.txt containing filename, to be used as source for HDF5_DATA_LAYER +FILE=fopen('list.txt', 'w'); +fprintf(FILE, '%s', filename); +fclose(FILE); +fprintf('HDF5 filename listed in %s \n', 'list.txt'); + +% NOTE: In net definition prototxt, use list.txt as input to HDF5_DATA as: +% layers { +% name: "data" +% type: HDF5_DATA +% top: "data" +% top: "labelvec" +% hdf5_data_param { +% source: "/path/to/list.txt" +% batch_size: 64 +% } +% } diff --git a/matlab/caffe/hdf5creation/store2hdf5.m b/matlab/caffe/hdf5creation/store2hdf5.m new file mode 100644 index 00000000000..0a0016dca40 --- /dev/null +++ b/matlab/caffe/hdf5creation/store2hdf5.m @@ -0,0 +1,59 @@ +function [curr_dat_sz, curr_lab_sz] = store2hdf5(filename, data, labels, create, startloc, chunksz) + % *data* is W*H*C*N matrix of images should be normalized (e.g. to lie between 0 and 1) beforehand + % *label* is D*N matrix of labels (D labels per sample) + % *create* [0/1] specifies whether to create file newly or to append to previously created file, useful to store information in batches when a dataset is too big to be held in memory (default: 1) + % *startloc* (point at which to start writing data). By default, + % if create=1 (create mode), startloc.data=[1 1 1 1], and startloc.lab=[1 1]; + % if create=0 (append mode), startloc.data=[1 1 1 K+1], and startloc.lab = [1 K+1]; where K is the current number of samples stored in the HDF + % chunksz (used only in create mode), specifies number of samples to be stored per chunk (see HDF5 documentation on chunking) for creating HDF5 files with unbounded maximum size - TLDR; higher chunk sizes allow faster read-write operations + + % verify that format is right + dat_dims=size(data); + lab_dims=size(labels); + num_samples=dat_dims(end); + + assert(lab_dims(end)==num_samples, 'Number of samples should be matched between data and labels'); + + if ~exist('create','var') + create=true; + end + + + if create + %fprintf('Creating dataset with %d samples\n', num_samples); + if ~exist('chunksz', 'var') + chunksz=1000; + end + if exist(filename, 'file') + fprintf('Warning: replacing existing file %s \n', filename); + delete(filename); + end + h5create(filename, '/data', [dat_dims(1:end-1) Inf], 'Datatype', 'single', 'ChunkSize', [dat_dims(1:end-1) chunksz]); % width, height, channels, number + h5create(filename, '/label', [lab_dims(1:end-1) Inf], 'Datatype', 'single', 'ChunkSize', [lab_dims(1:end-1) chunksz]); % width, height, channels, number + if ~exist('startloc','var') + startloc.dat=[ones(1,length(dat_dims)-1), 1]; + startloc.lab=[ones(1,length(lab_dims)-1), 1]; + end + else % append mode + if ~exist('startloc','var') + info=h5info(filename); + prev_dat_sz=info.Datasets(1).Dataspace.Size; + prev_lab_sz=info.Datasets(2).Dataspace.Size; + assert(prev_dat_sz(1:end-1)==dat_dims(1:end-1), 'Data dimensions must match existing dimensions in dataset'); + assert(prev_lab_sz(1:end-1)==lab_dims(1:end-1), 'Label dimensions must match existing dimensions in dataset'); + startloc.dat=[ones(1,length(dat_dims)-1), prev_dat_sz(end)+1]; + startloc.lab=[ones(1,length(lab_dims)-1), prev_lab_sz(end)+1]; + end + end + + if ~isempty(data) + h5write(filename, '/data', single(data), startloc.dat, size(data)); + h5write(filename, '/label', single(labels), startloc.lab, size(labels)); + end + + if nargout + info=h5info(filename); + curr_dat_sz=info.Datasets(1).Dataspace.Size; + curr_lab_sz=info.Datasets(2).Dataspace.Size; + end +end From 21f1b5941df6faeed8bfc1d68f6b42559e2eb417 Mon Sep 17 00:00:00 2001 From: Jason Yosinski <jason@yosinski.com> Date: Sat, 17 Jan 2015 23:07:36 -0500 Subject: [PATCH 1054/2053] Updated doc to suggest boost 1.57 --- docs/installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index 94068e503dc..66f080eb781 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -141,7 +141,7 @@ Do `brew edit opencv` and change the lines that look like the two lines below to **NOTE**: We find that everything compiles successfully if `$LD_LIBRARY_PATH` is not set at all, and `$DYLD_FALLBACK_LIBRARY_PATH` is set to to provide CUDA, Python, and other relevant libraries (e.g. `/usr/local/cuda/lib:$HOME/anaconda/lib:/usr/local/lib:/usr/lib`). In other `ENV` settings, things may not work as expected. -**NOTE**: There is currently a conflict between boost 1.56 and CUDA in some configurations. Check the [conflict description](https://github.com/BVLC/caffe/issues/1193#issuecomment-57491906) and try downgrading to 1.55. +**NOTE**: There is currently a conflict between boost 1.56 and CUDA in some configurations. Check the [conflict description](https://github.com/BVLC/caffe/issues/1193#issuecomment-57491906) and try downgrading to 1.55 or upgrading to 1.57. #### 10.8-specific Instructions From 1856bb2d89ecbabe84cbf0a647de7a2ab6c29207 Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama <sguada@gmail.com> Date: Fri, 16 Jan 2015 13:18:50 -0800 Subject: [PATCH 1055/2053] add db wrappers --- include/caffe/util/db.hpp | 190 ++++++++++++++++++++++++++++++++++++++ src/caffe/util/db.cpp | 84 +++++++++++++++++ 2 files changed, 274 insertions(+) create mode 100644 include/caffe/util/db.hpp create mode 100644 src/caffe/util/db.cpp diff --git a/include/caffe/util/db.hpp b/include/caffe/util/db.hpp new file mode 100644 index 00000000000..afdb8d2c4f8 --- /dev/null +++ b/include/caffe/util/db.hpp @@ -0,0 +1,190 @@ +#ifndef CAFFE_UTIL_DB_HPP +#define CAFFE_UTIL_DB_HPP + +#include <string> + +#include "leveldb/db.h" +#include "leveldb/write_batch.h" +#include "lmdb.h" + +#include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" + +namespace caffe { namespace db { + +enum Mode { READ, WRITE, NEW }; + +class Cursor { + public: + Cursor() { } + virtual ~Cursor() { } + virtual void SeekToFirst() = 0; + virtual void Next() = 0; + virtual string key() = 0; + virtual string value() = 0; + virtual bool valid() = 0; + + DISABLE_COPY_AND_ASSIGN(Cursor); +}; + +class Transaction { + public: + Transaction() { } + virtual ~Transaction() { } + virtual void Put(const string& key, const string& value) = 0; + virtual void Commit() = 0; + + DISABLE_COPY_AND_ASSIGN(Transaction); +}; + +class DB { + public: + DB() { } + virtual ~DB() { } + virtual void Open(const string& source, Mode mode) = 0; + virtual void Close() = 0; + virtual Cursor* NewCursor() = 0; + virtual Transaction* NewTransaction() = 0; + + DISABLE_COPY_AND_ASSIGN(DB); +}; + +class LevelDBCursor : public Cursor { + public: + explicit LevelDBCursor(leveldb::Iterator* iter) + : iter_(iter) { SeekToFirst(); } + ~LevelDBCursor() { delete iter_; } + virtual void SeekToFirst() { iter_->SeekToFirst(); } + virtual void Next() { iter_->Next(); } + virtual string key() { return iter_->key().ToString(); } + virtual string value() { return iter_->value().ToString(); } + virtual bool valid() { return iter_->Valid(); } + + private: + leveldb::Iterator* iter_; +}; + +class LevelDBTransaction : public Transaction { + public: + explicit LevelDBTransaction(leveldb::DB* db) : db_(db) { CHECK_NOTNULL(db_); } + virtual void Put(const string& key, const string& value) { + batch_.Put(key, value); + } + virtual void Commit() { + leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch_); + CHECK(status.ok()) << "Failed to write batch to leveldb " + << std::endl << status.ToString(); + } + + private: + leveldb::DB* db_; + leveldb::WriteBatch batch_; + + DISABLE_COPY_AND_ASSIGN(LevelDBTransaction); +}; + +class LevelDB : public DB { + public: + LevelDB() : db_(NULL) { } + virtual ~LevelDB() { Close(); } + virtual void Open(const string& source, Mode mode); + virtual void Close() { + if (db_ != NULL) { + delete db_; + db_ = NULL; + } + } + virtual LevelDBCursor* NewCursor() { + return new LevelDBCursor(db_->NewIterator(leveldb::ReadOptions())); + } + virtual LevelDBTransaction* NewTransaction() { + return new LevelDBTransaction(db_); + } + + private: + leveldb::DB* db_; +}; + +inline void MDB_CHECK(int mdb_status) { + CHECK_EQ(mdb_status, MDB_SUCCESS) << mdb_strerror(mdb_status); +} + +class LMDBCursor : public Cursor { + public: + explicit LMDBCursor(MDB_txn* mdb_txn, MDB_cursor* mdb_cursor) + : mdb_txn_(mdb_txn), mdb_cursor_(mdb_cursor), valid_(false) { + SeekToFirst(); + } + virtual ~LMDBCursor() { + mdb_cursor_close(mdb_cursor_); + mdb_txn_abort(mdb_txn_); + } + virtual void SeekToFirst() { Seek(MDB_FIRST); } + virtual void Next() { Seek(MDB_NEXT); } + virtual string key() { + return string(static_cast<const char*>(mdb_key_.mv_data), mdb_key_.mv_size); + } + virtual string value() { + return string(static_cast<const char*>(mdb_value_.mv_data), + mdb_value_.mv_size); + } + virtual bool valid() { return valid_; } + + private: + void Seek(MDB_cursor_op op) { + int mdb_status = mdb_cursor_get(mdb_cursor_, &mdb_key_, &mdb_value_, op); + if (mdb_status == MDB_NOTFOUND) { + valid_ = false; + } else { + MDB_CHECK(mdb_status); + valid_ = true; + } + } + + MDB_txn* mdb_txn_; + MDB_cursor* mdb_cursor_; + MDB_val mdb_key_, mdb_value_; + bool valid_; +}; + +class LMDBTransaction : public Transaction { + public: + explicit LMDBTransaction(MDB_dbi* mdb_dbi, MDB_txn* mdb_txn) + : mdb_dbi_(mdb_dbi), mdb_txn_(mdb_txn) { } + virtual void Put(const string& key, const string& value); + virtual void Commit() { MDB_CHECK(mdb_txn_commit(mdb_txn_)); } + + private: + MDB_dbi* mdb_dbi_; + MDB_txn* mdb_txn_; + + DISABLE_COPY_AND_ASSIGN(LMDBTransaction); +}; + +class LMDB : public DB { + public: + LMDB() : mdb_env_(NULL) { } + virtual ~LMDB() { Close(); } + virtual void Open(const string& source, Mode mode); + virtual void Close() { + if (mdb_env_ != NULL) { + mdb_dbi_close(mdb_env_, mdb_dbi_); + mdb_env_close(mdb_env_); + mdb_env_ = NULL; + } + } + virtual LMDBCursor* NewCursor(); + virtual LMDBTransaction* NewTransaction(); + + private: + MDB_env* mdb_env_; + MDB_dbi mdb_dbi_; +}; + +DB* GetDB(DataParameter::DB backend); +DB* GetDB(const string& backend); + +} // namespace db +} // namespace caffe + +#endif // CAFFE_UTIL_DB_HPP diff --git a/src/caffe/util/db.cpp b/src/caffe/util/db.cpp new file mode 100644 index 00000000000..7f7018107ec --- /dev/null +++ b/src/caffe/util/db.cpp @@ -0,0 +1,84 @@ +#include "caffe/util/db.hpp" + +#include <sys/stat.h> +#include <string> + +namespace caffe { namespace db { + +const size_t LMDB_MAP_SIZE = 1099511627776; // 1 TB + +void LevelDB::Open(const string& source, Mode mode) { + leveldb::Options options; + options.block_size = 65536; + options.write_buffer_size = 268435456; + options.max_open_files = 100; + options.error_if_exists = mode == NEW; + options.create_if_missing = mode != READ; + leveldb::Status status = leveldb::DB::Open(options, source, &db_); + CHECK(status.ok()) << "Failed to open leveldb " << source + << std::endl << status.ToString(); + LOG(INFO) << "Opened leveldb " << source; +} + +void LMDB::Open(const string& source, Mode mode) { + MDB_CHECK(mdb_env_create(&mdb_env_)); + MDB_CHECK(mdb_env_set_mapsize(mdb_env_, LMDB_MAP_SIZE)); + if (mode == NEW) { + CHECK_EQ(mkdir(source.c_str(), 0744), 0) << "mkdir " << source << "failed"; + } + int flags = 0; + if (mode == READ) { + flags = MDB_RDONLY | MDB_NOTLS; + } + MDB_CHECK(mdb_env_open(mdb_env_, source.c_str(), flags, 0664)); + LOG(INFO) << "Opened lmdb " << source; +} + +LMDBCursor* LMDB::NewCursor() { + MDB_txn* mdb_txn; + MDB_cursor* mdb_cursor; + MDB_CHECK(mdb_txn_begin(mdb_env_, NULL, MDB_RDONLY, &mdb_txn)); + MDB_CHECK(mdb_dbi_open(mdb_txn, NULL, 0, &mdb_dbi_)); + MDB_CHECK(mdb_cursor_open(mdb_txn, mdb_dbi_, &mdb_cursor)); + return new LMDBCursor(mdb_txn, mdb_cursor); +} + +LMDBTransaction* LMDB::NewTransaction() { + MDB_txn* mdb_txn; + MDB_CHECK(mdb_txn_begin(mdb_env_, NULL, 0, &mdb_txn)); + MDB_CHECK(mdb_dbi_open(mdb_txn, NULL, 0, &mdb_dbi_)); + return new LMDBTransaction(&mdb_dbi_, mdb_txn); +} + +void LMDBTransaction::Put(const string& key, const string& value) { + MDB_val mdb_key, mdb_value; + mdb_key.mv_data = const_cast<char*>(key.data()); + mdb_key.mv_size = key.size(); + mdb_value.mv_data = const_cast<char*>(value.data()); + mdb_value.mv_size = value.size(); + MDB_CHECK(mdb_put(mdb_txn_, *mdb_dbi_, &mdb_key, &mdb_value, 0)); +} + +DB* GetDB(DataParameter::DB backend) { + switch (backend) { + case DataParameter_DB_LEVELDB: + return new LevelDB(); + case DataParameter_DB_LMDB: + return new LMDB(); + default: + LOG(FATAL) << "Unknown database backend"; + } +} + +DB* GetDB(const string& backend) { + if (backend == "leveldb") { + return new LevelDB(); + } else if (backend == "lmdb") { + return new LMDB(); + } else { + LOG(FATAL) << "Unknown database backend"; + } +} + +} // namespace db +} // namespace caffe From 7dfe23963c69759c3bdca1f0ee8ff9866c0fb5c2 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Fri, 16 Jan 2015 13:20:15 -0800 Subject: [PATCH 1056/2053] use db wrappers --- examples/cifar10/convert_cifar_data.cpp | 41 ++++++++++++----------- include/caffe/data_layers.hpp | 6 ++-- src/caffe/layers/data_layer.cpp | 34 ++++++++----------- src/caffe/test/test_data_layer.cpp | 27 ++++++++------- tools/compute_image_mean.cpp | 44 +++++++++++-------------- tools/convert_imageset.cpp | 38 ++++++++++----------- tools/extract_features.cpp | 31 +++++++++-------- 7 files changed, 111 insertions(+), 110 deletions(-) diff --git a/examples/cifar10/convert_cifar_data.cpp b/examples/cifar10/convert_cifar_data.cpp index 9eecc74c989..f4c42e4d2e7 100644 --- a/examples/cifar10/convert_cifar_data.cpp +++ b/examples/cifar10/convert_cifar_data.cpp @@ -9,19 +9,18 @@ #include <fstream> // NOLINT(readability/streams) #include <string> +#include "boost/scoped_ptr.hpp" #include "glog/logging.h" #include "google/protobuf/text_format.h" #include "stdint.h" -#include "caffe/dataset_factory.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/db.hpp" -using std::string; - -using caffe::Dataset; -using caffe::DatasetFactory; using caffe::Datum; -using caffe::shared_ptr; +using boost::scoped_ptr; +using std::string; +namespace db = caffe::db; const int kCIFARSize = 32; const int kCIFARImageNBytes = 3072; @@ -38,10 +37,9 @@ void read_image(std::ifstream* file, int* label, char* buffer) { void convert_dataset(const string& input_folder, const string& output_folder, const string& db_type) { - shared_ptr<Dataset<string, Datum> > train_dataset = - DatasetFactory<string, Datum>(db_type); - CHECK(train_dataset->open(output_folder + "/cifar10_train_" + db_type, - Dataset<string, Datum>::New)); + scoped_ptr<db::DB> train_db(db::GetDB(db_type)); + train_db->Open(output_folder + "/cifar10_train_" + db_type, db::NEW); + scoped_ptr<db::Transaction> txn(train_db->NewTransaction()); // Data buffer int label; char str_buffer[kCIFARImageNBytes]; @@ -64,17 +62,18 @@ void convert_dataset(const string& input_folder, const string& output_folder, datum.set_data(str_buffer, kCIFARImageNBytes); int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", fileid * kCIFARBatchSize + itemid); - CHECK(train_dataset->put(string(str_buffer, length), datum)); + string out; + CHECK(datum.SerializeToString(&out)); + txn->Put(string(str_buffer, length), out); } } - CHECK(train_dataset->commit()); - train_dataset->close(); + txn->Commit(); + train_db->Close(); LOG(INFO) << "Writing Testing data"; - shared_ptr<Dataset<string, Datum> > test_dataset = - DatasetFactory<string, Datum>(db_type); - CHECK(test_dataset->open(output_folder + "/cifar10_test_" + db_type, - Dataset<string, Datum>::New)); + scoped_ptr<db::DB> test_db(db::GetDB(db_type)); + test_db->Open(output_folder + "/cifar10_test_" + db_type, db::NEW); + txn.reset(test_db->NewTransaction()); // Open files std::ifstream data_file((input_folder + "/test_batch.bin").c_str(), std::ios::in | std::ios::binary); @@ -84,10 +83,12 @@ void convert_dataset(const string& input_folder, const string& output_folder, datum.set_label(label); datum.set_data(str_buffer, kCIFARImageNBytes); int length = snprintf(str_buffer, kCIFARImageNBytes, "%05d", itemid); - CHECK(test_dataset->put(string(str_buffer, length), datum)); + string out; + CHECK(datum.SerializeToString(&out)); + txn->Put(string(str_buffer, length), out); } - CHECK(test_dataset->commit()); - test_dataset->close(); + txn->Commit(); + test_db->Close(); } int main(int argc, char** argv) { diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 34b9b30aa3e..e9c83856a99 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -11,11 +11,11 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" #include "caffe/data_transformer.hpp" -#include "caffe/dataset.hpp" #include "caffe/filler.hpp" #include "caffe/internal_thread.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/db.hpp" namespace caffe { @@ -100,8 +100,8 @@ class DataLayer : public BasePrefetchingDataLayer<Dtype> { protected: virtual void InternalThreadEntry(); - shared_ptr<Dataset<string, Datum> > dataset_; - Dataset<string, Datum>::const_iterator iter_; + shared_ptr<db::DB> db_; + shared_ptr<db::Cursor> cursor_; }; /** diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index a5030899cee..96964566630 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -7,7 +7,6 @@ #include "caffe/common.hpp" #include "caffe/data_layers.hpp" -#include "caffe/dataset_factory.hpp" #include "caffe/layer.hpp" #include "caffe/proto/caffe.pb.h" #include "caffe/util/benchmark.hpp" @@ -20,35 +19,28 @@ namespace caffe { template <typename Dtype> DataLayer<Dtype>::~DataLayer<Dtype>() { this->JoinPrefetchThread(); - // clean up the dataset resources - dataset_->close(); } template <typename Dtype> void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // Initialize DB - dataset_ = DatasetFactory<string, Datum>( - this->layer_param_.data_param().backend()); - const string& source = this->layer_param_.data_param().source(); - LOG(INFO) << "Opening dataset " << source; - CHECK(dataset_->open(source, Dataset<string, Datum>::ReadOnly)); - iter_ = dataset_->begin(); + db_.reset(db::GetDB(this->layer_param_.data_param().backend())); + db_->Open(this->layer_param_.data_param().source(), db::READ); + cursor_.reset(db_->NewCursor()); - // Check if we would need to randomly skip a few data points + // Check if we should randomly skip a few data points if (this->layer_param_.data_param().rand_skip()) { unsigned int skip = caffe_rng_rand() % this->layer_param_.data_param().rand_skip(); LOG(INFO) << "Skipping first " << skip << " data points."; while (skip-- > 0) { - if (++iter_ == dataset_->end()) { - iter_ = dataset_->begin(); - } + cursor_->Next(); } } // Read a data point, and use it to initialize the top blob. - CHECK(iter_ != dataset_->end()); - Datum datum = iter_->value; + Datum datum; + datum.ParseFromString(cursor_->value()); if (DecodeDatum(&datum)) { LOG(INFO) << "Decoding Datum"; @@ -101,8 +93,8 @@ void DataLayer<Dtype>::InternalThreadEntry() { for (int item_id = 0; item_id < batch_size; ++item_id) { timer.Start(); // get a blob - CHECK(iter_ != dataset_->end()); - const Datum& datum = iter_->value; + Datum datum; + datum.ParseFromString(cursor_->value()); cv::Mat cv_img; if (datum.encoded()) { @@ -124,9 +116,10 @@ void DataLayer<Dtype>::InternalThreadEntry() { } trans_time += timer.MicroSeconds(); // go to the next iter - ++iter_; - if (iter_ == dataset_->end()) { - iter_ = dataset_->begin(); + cursor_->Next(); + if (!cursor_->valid()) { + DLOG(INFO) << "Restarting data prefetching from start."; + cursor_->SeekToFirst(); } } batch_timer.Stop(); @@ -137,4 +130,5 @@ void DataLayer<Dtype>::InternalThreadEntry() { INSTANTIATE_CLASS(DataLayer); REGISTER_LAYER_CLASS(DATA, DataLayer); + } // namespace caffe diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 32f5d41e2f2..8cc31b24167 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -1,20 +1,23 @@ #include <string> #include <vector> +#include "boost/scoped_ptr.hpp" #include "gtest/gtest.h" #include "caffe/blob.hpp" #include "caffe/common.hpp" -#include "caffe/dataset_factory.hpp" +#include "caffe/data_layers.hpp" #include "caffe/filler.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/db.hpp" #include "caffe/util/io.hpp" -#include "caffe/vision_layers.hpp" #include "caffe/test/test_caffe_main.hpp" namespace caffe { +using boost::scoped_ptr; + template <typename TypeParam> class DataLayerTest : public MultiDeviceTest<TypeParam> { typedef typename TypeParam::Dtype Dtype; @@ -33,15 +36,15 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { blob_top_vec_.push_back(blob_top_label_); } - // Fill the LevelDB with data: if unique_pixels, each pixel is unique but + // Fill the DB with data: if unique_pixels, each pixel is unique but // all images are the same; else each image is unique but all pixels within // an image are the same. void Fill(const bool unique_pixels, DataParameter_DB backend) { backend_ = backend; LOG(INFO) << "Using temporary dataset " << *filename_; - shared_ptr<Dataset<string, Datum> > dataset = - DatasetFactory<string, Datum>(backend_); - CHECK(dataset->open(*filename_, Dataset<string, Datum>::New)); + scoped_ptr<db::DB> db(db::GetDB(backend)); + db->Open(*filename_, db::NEW); + scoped_ptr<db::Transaction> txn(db->NewTransaction()); for (int i = 0; i < 5; ++i) { Datum datum; datum.set_label(i); @@ -55,10 +58,12 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } stringstream ss; ss << i; - CHECK(dataset->put(ss.str(), datum)); + string out; + CHECK(datum.SerializeToString(&out)); + txn->Put(ss.str(), out); } - CHECK(dataset->commit()); - dataset->close(); + txn->Commit(); + db->Close(); } void TestRead() { @@ -183,7 +188,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } crop_sequence.push_back(iter_crop_sequence); } - } // destroy 1st data layer and unlock the dataset + } // destroy 1st data layer and unlock the db // Get crop sequence after reseeding Caffe with 1701. // Check that the sequence is the same as the original. @@ -238,7 +243,7 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } crop_sequence.push_back(iter_crop_sequence); } - } // destroy 1st data layer and unlock the dataset + } // destroy 1st data layer and unlock the db // Get crop sequence continuing from previous Caffe RNG state; reseed // srand with 1701. Check that the sequence differs from the original. diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index 358f57e38d6..dff63a09dca 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -1,24 +1,25 @@ -#include <gflags/gflags.h> -#include <glog/logging.h> #include <stdint.h> - #include <algorithm> #include <string> #include <utility> #include <vector> -#include "caffe/dataset_factory.hpp" +#include "boost/scoped_ptr.hpp" +#include "gflags/gflags.h" +#include "glog/logging.h" + #include "caffe/proto/caffe.pb.h" +#include "caffe/util/db.hpp" #include "caffe/util/io.hpp" -using caffe::Dataset; -using caffe::Datum; -using caffe::BlobProto; +using namespace caffe; // NOLINT(build/namespaces) + using std::max; using std::pair; +using boost::scoped_ptr; - -DEFINE_string(backend, "lmdb", "The backend for containing the images"); +DEFINE_string(backend, "lmdb", + "The backend {leveldb, lmdb} containing the images"); int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); @@ -28,7 +29,7 @@ int main(int argc, char** argv) { #endif gflags::SetUsageMessage("Compute the mean_image of a set of images given by" - " a leveldb/lmdb or a list of images\n" + " a leveldb/lmdb\n" "Usage:\n" " compute_image_mean [FLAGS] INPUT_DB [OUTPUT_FILE]\n"); @@ -39,19 +40,15 @@ int main(int argc, char** argv) { return 1; } - std::string db_backend = FLAGS_backend; - - caffe::shared_ptr<Dataset<std::string, Datum> > dataset = - caffe::DatasetFactory<std::string, Datum>(db_backend); - - // Open db - CHECK(dataset->open(argv[1], Dataset<std::string, Datum>::ReadOnly)); + scoped_ptr<db::DB> db(db::GetDB(FLAGS_backend)); + db->Open(argv[1], db::READ); + scoped_ptr<db::Cursor> cursor(db->NewCursor()); BlobProto sum_blob; int count = 0; // load first datum - Dataset<std::string, Datum>::const_iterator iter = dataset->begin(); - Datum datum = iter->value; + Datum datum; + datum.ParseFromString(cursor->value()); if (DecodeDatum(&datum)) { LOG(INFO) << "Decoding Datum"; @@ -68,9 +65,9 @@ int main(int argc, char** argv) { sum_blob.add_data(0.); } LOG(INFO) << "Starting Iteration"; - for (Dataset<std::string, Datum>::const_iterator iter = dataset->begin(); - iter != dataset->end(); ++iter) { - Datum datum = iter->value; + while (cursor->valid()) { + Datum datum; + datum.ParseFromString(cursor->value()); DecodeDatum(&datum); const std::string& data = datum.data(); @@ -94,6 +91,7 @@ int main(int argc, char** argv) { if (count % 10000 == 0) { LOG(INFO) << "Processed " << count << " files."; } + cursor->Next(); } if (count % 10000 != 0) { @@ -117,7 +115,5 @@ int main(int argc, char** argv) { } LOG(INFO) << "mean_value channel [" << c << "]:" << mean_values[c] / dim; } - // Clean up - dataset->close(); return 0; } diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 5d42e69c1ed..7fbf5b0514c 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -8,28 +8,31 @@ // subfolder1/file1.JPEG 7 // .... -#include <gflags/gflags.h> -#include <glog/logging.h> - #include <algorithm> #include <fstream> // NOLINT(readability/streams) #include <string> #include <utility> #include <vector> -#include "caffe/dataset_factory.hpp" +#include "boost/scoped_ptr.hpp" +#include "gflags/gflags.h" +#include "glog/logging.h" + #include "caffe/proto/caffe.pb.h" +#include "caffe/util/db.hpp" #include "caffe/util/io.hpp" #include "caffe/util/rng.hpp" using namespace caffe; // NOLINT(build/namespaces) using std::pair; +using boost::scoped_ptr; DEFINE_bool(gray, false, "When this option is on, treat images as grayscale ones"); DEFINE_bool(shuffle, false, "Randomly shuffle the order of images and their labels"); -DEFINE_string(backend, "lmdb", "The backend for storing the result"); +DEFINE_string(backend, "lmdb", + "The backend {lmdb, leveldb} for storing the result"); DEFINE_int32(resize_width, 0, "Width images are resized to"); DEFINE_int32(resize_height, 0, "Height images are resized to"); DEFINE_bool(check_size, false, @@ -75,9 +78,6 @@ int main(int argc, char** argv) { } LOG(INFO) << "A total of " << lines.size() << " images."; - const std::string& db_backend = FLAGS_backend; - const char* db_path = argv[3]; - if (encoded) { CHECK_EQ(FLAGS_resize_height, 0) << "With encoded don't resize images"; CHECK_EQ(FLAGS_resize_width, 0) << "With encoded don't resize images"; @@ -87,12 +87,10 @@ int main(int argc, char** argv) { int resize_height = std::max<int>(0, FLAGS_resize_height); int resize_width = std::max<int>(0, FLAGS_resize_width); - // Open new db - shared_ptr<Dataset<string, Datum> > dataset = - DatasetFactory<string, Datum>(db_backend); - - // Open db - CHECK(dataset->open(db_path, Dataset<string, Datum>::New)); + // Create new DB + scoped_ptr<db::DB> db(db::GetDB(FLAGS_backend)); + db->Open(argv[3], db::NEW); + scoped_ptr<db::Transaction> txn(db->NewTransaction()); // Storing to db std::string root_folder(argv[1]); @@ -128,19 +126,21 @@ int main(int argc, char** argv) { lines[line_id].first.c_str()); // Put in db - CHECK(dataset->put(string(key_cstr, length), datum)); + string out; + CHECK(datum.SerializeToString(&out)); + txn->Put(string(key_cstr, length), out); if (++count % 1000 == 0) { - // Commit txn - CHECK(dataset->commit()); + // Commit db + txn->Commit(); + txn.reset(db->NewTransaction()); LOG(ERROR) << "Processed " << count << " files."; } } // write the last batch if (count % 1000 != 0) { - CHECK(dataset->commit()); + txn->Commit(); LOG(ERROR) << "Processed " << count << " files."; } - dataset->close(); return 0; } diff --git a/tools/extract_features.cpp b/tools/extract_features.cpp index ddbce1075ed..c17b88dd048 100644 --- a/tools/extract_features.cpp +++ b/tools/extract_features.cpp @@ -7,19 +7,19 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" -#include "caffe/dataset_factory.hpp" #include "caffe/net.hpp" #include "caffe/proto/caffe.pb.h" +#include "caffe/util/db.hpp" #include "caffe/util/io.hpp" #include "caffe/vision_layers.hpp" -using boost::shared_ptr; using caffe::Blob; using caffe::Caffe; -using caffe::Dataset; -using caffe::DatasetFactory; using caffe::Datum; using caffe::Net; +using boost::shared_ptr; +using std::string; +namespace db = caffe::db; template<typename Dtype> int feature_extraction_pipeline(int argc, char** argv); @@ -121,13 +121,15 @@ int feature_extraction_pipeline(int argc, char** argv) { int num_mini_batches = atoi(argv[++arg_pos]); - std::vector<shared_ptr<Dataset<std::string, Datum> > > feature_dbs; + std::vector<shared_ptr<db::DB> > feature_dbs; + std::vector<shared_ptr<db::Transaction> > txns; for (size_t i = 0; i < num_features; ++i) { LOG(INFO)<< "Opening dataset " << dataset_names[i]; - shared_ptr<Dataset<std::string, Datum> > dataset = - DatasetFactory<std::string, Datum>(argv[++arg_pos]); - CHECK(dataset->open(dataset_names.at(i), Dataset<std::string, Datum>::New)); - feature_dbs.push_back(dataset); + shared_ptr<db::DB> db(db::GetDB(argv[++arg_pos])); + db->Open(dataset_names.at(i), db::NEW); + feature_dbs.push_back(db); + shared_ptr<db::Transaction> txn(db->NewTransaction()); + txns.push_back(txn); } LOG(ERROR)<< "Extacting Features"; @@ -158,10 +160,13 @@ int feature_extraction_pipeline(int argc, char** argv) { } int length = snprintf(key_str, kMaxKeyStrLength, "%d", image_indices[i]); - CHECK(feature_dbs.at(i)->put(std::string(key_str, length), datum)); + string out; + CHECK(datum.SerializeToString(&out)); + txns.at(i)->Put(std::string(key_str, length), out); ++image_indices[i]; if (image_indices[i] % 1000 == 0) { - CHECK(feature_dbs.at(i)->commit()); + txns.at(i)->Commit(); + txns.at(i).reset(feature_dbs.at(i)->NewTransaction()); LOG(ERROR)<< "Extracted features of " << image_indices[i] << " query images for feature blob " << blob_names[i]; } @@ -171,11 +176,11 @@ int feature_extraction_pipeline(int argc, char** argv) { // write the last batch for (int i = 0; i < num_features; ++i) { if (image_indices[i] % 1000 != 0) { - CHECK(feature_dbs.at(i)->commit()); + txns.at(i)->Commit(); } LOG(ERROR)<< "Extracted features of " << image_indices[i] << " query images for feature blob " << blob_names[i]; - feature_dbs.at(i)->close(); + feature_dbs.at(i)->Close(); } LOG(ERROR)<< "Successfully extracted the features!"; From 88e3bc88b4ca09d51dd551b62e64e3c149cd4e0c Mon Sep 17 00:00:00 2001 From: Sergio Guadarrama <sguada@gmail.com> Date: Fri, 16 Jan 2015 13:20:26 -0800 Subject: [PATCH 1057/2053] test db wrappers --- src/caffe/test/test_db.cpp | 134 +++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 src/caffe/test/test_db.cpp diff --git a/src/caffe/test/test_db.cpp b/src/caffe/test/test_db.cpp new file mode 100644 index 00000000000..5b2ac230a0b --- /dev/null +++ b/src/caffe/test/test_db.cpp @@ -0,0 +1,134 @@ +#include <string> + +#include "boost/scoped_ptr.hpp" +#include "gtest/gtest.h" + +#include "caffe/common.hpp" +#include "caffe/proto/caffe.pb.h" +#include "caffe/util/db.hpp" +#include "caffe/util/io.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +using boost::scoped_ptr; + +template <typename TypeParam> +class DBTest : public ::testing::Test { + protected: + DBTest() + : backend_(TypeParam::backend), + root_images_(string(EXAMPLES_SOURCE_DIR) + string("images/")) {} + + virtual void SetUp() { + MakeTempDir(&source_); + source_ += "/db"; + string keys[] = {"cat.jpg", "fish-bike.jpg"}; + LOG(INFO) << "Using temporary db " << source_; + scoped_ptr<db::DB> db(db::GetDB(TypeParam::backend)); + db->Open(this->source_, db::NEW); + scoped_ptr<db::Transaction> txn(db->NewTransaction()); + for (int i = 0; i < 2; ++i) { + Datum datum; + ReadImageToDatum(root_images_ + keys[i], i, &datum); + string out; + CHECK(datum.SerializeToString(&out)); + txn->Put(keys[i], out); + } + txn->Commit(); + } + + virtual ~DBTest() { } + + DataParameter_DB backend_; + string source_; + string root_images_; +}; + +struct TypeLevelDB { + static DataParameter_DB backend; +}; +DataParameter_DB TypeLevelDB::backend = DataParameter_DB_LEVELDB; + +struct TypeLMDB { + static DataParameter_DB backend; +}; +DataParameter_DB TypeLMDB::backend = DataParameter_DB_LMDB; + +// typedef ::testing::Types<TypeLmdb> TestTypes; +typedef ::testing::Types<TypeLevelDB, TypeLMDB> TestTypes; + +TYPED_TEST_CASE(DBTest, TestTypes); + +TYPED_TEST(DBTest, TestGetDB) { + scoped_ptr<db::DB> db(db::GetDB(TypeParam::backend)); +} + +TYPED_TEST(DBTest, TestNext) { + scoped_ptr<db::DB> db(db::GetDB(TypeParam::backend)); + db->Open(this->source_, db::READ); + scoped_ptr<db::Cursor> cursor(db->NewCursor()); + EXPECT_TRUE(cursor->valid()); + cursor->Next(); + EXPECT_TRUE(cursor->valid()); + cursor->Next(); + EXPECT_FALSE(cursor->valid()); +} + +TYPED_TEST(DBTest, TestSeekToFirst) { + scoped_ptr<db::DB> db(db::GetDB(TypeParam::backend)); + db->Open(this->source_, db::READ); + scoped_ptr<db::Cursor> cursor(db->NewCursor()); + cursor->Next(); + cursor->SeekToFirst(); + EXPECT_TRUE(cursor->valid()); + string key = cursor->key(); + Datum datum; + datum.ParseFromString(cursor->value()); + EXPECT_EQ(key, "cat.jpg"); + EXPECT_EQ(datum.channels(), 3); + EXPECT_EQ(datum.height(), 360); + EXPECT_EQ(datum.width(), 480); +} + +TYPED_TEST(DBTest, TestKeyValue) { + scoped_ptr<db::DB> db(db::GetDB(TypeParam::backend)); + db->Open(this->source_, db::READ); + scoped_ptr<db::Cursor> cursor(db->NewCursor()); + EXPECT_TRUE(cursor->valid()); + string key = cursor->key(); + Datum datum; + datum.ParseFromString(cursor->value()); + EXPECT_EQ(key, "cat.jpg"); + EXPECT_EQ(datum.channels(), 3); + EXPECT_EQ(datum.height(), 360); + EXPECT_EQ(datum.width(), 480); + cursor->Next(); + EXPECT_TRUE(cursor->valid()); + key = cursor->key(); + datum.ParseFromString(cursor->value()); + EXPECT_EQ(key, "fish-bike.jpg"); + EXPECT_EQ(datum.channels(), 3); + EXPECT_EQ(datum.height(), 323); + EXPECT_EQ(datum.width(), 481); + cursor->Next(); + EXPECT_FALSE(cursor->valid()); +} + +TYPED_TEST(DBTest, TestWrite) { + scoped_ptr<db::DB> db(db::GetDB(TypeParam::backend)); + db->Open(this->source_, db::WRITE); + scoped_ptr<db::Transaction> txn(db->NewTransaction()); + Datum datum; + ReadFileToDatum(this->root_images_ + "cat.jpg", 0, &datum); + string out; + CHECK(datum.SerializeToString(&out)); + txn->Put("cat.jpg", out); + ReadFileToDatum(this->root_images_ + "fish-bike.jpg", 1, &datum); + CHECK(datum.SerializeToString(&out)); + txn->Put("fish-bike.jpg", out); + txn->Commit(); +} + +} // namespace caffe From 3b88e359f7f57a62608d42e2e6786a25eab4ecbb Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Fri, 16 Jan 2015 13:25:00 -0800 Subject: [PATCH 1058/2053] gut dataset wrappers --- include/caffe/dataset.hpp | 241 --------- include/caffe/dataset_factory.hpp | 20 - include/caffe/leveldb_dataset.hpp | 90 ---- include/caffe/lmdb_dataset.hpp | 95 ---- src/caffe/dataset_factory.cpp | 50 -- src/caffe/leveldb_dataset.cpp | 265 ---------- src/caffe/lmdb_dataset.cpp | 366 -------------- src/caffe/test/test_dataset.cpp | 794 ------------------------------ 8 files changed, 1921 deletions(-) delete mode 100644 include/caffe/dataset.hpp delete mode 100644 include/caffe/dataset_factory.hpp delete mode 100644 include/caffe/leveldb_dataset.hpp delete mode 100644 include/caffe/lmdb_dataset.hpp delete mode 100644 src/caffe/dataset_factory.cpp delete mode 100644 src/caffe/leveldb_dataset.cpp delete mode 100644 src/caffe/lmdb_dataset.cpp delete mode 100644 src/caffe/test/test_dataset.cpp diff --git a/include/caffe/dataset.hpp b/include/caffe/dataset.hpp deleted file mode 100644 index 1dd8458cd74..00000000000 --- a/include/caffe/dataset.hpp +++ /dev/null @@ -1,241 +0,0 @@ -#ifndef CAFFE_DATASET_H_ -#define CAFFE_DATASET_H_ - -#include <google/protobuf/message.h> - -#include <algorithm> -#include <iterator> -#include <string> -#include <utility> -#include <vector> - -#include "caffe/common.hpp" -#include "caffe/proto/caffe.pb.h" - -namespace caffe { - -namespace dataset_internal { - -using google::protobuf::Message; - -template<bool condition> -struct static_assertion {}; -template<> -struct static_assertion<true> { - enum { - DEFAULT_CODER_NOT_AVAILABLE - }; -}; - -template <typename T> -struct DefaultCoder { - using static_assertion<sizeof(T) == 0>::DEFAULT_CODER_NOT_AVAILABLE; - static bool serialize(const T& obj, string* serialized); - static bool serialize(const T& obj, vector<char>* serialized); - static bool deserialize(const string& serialized, T* obj); - static bool deserialize(const char* data, size_t size, T* obj); -}; - -template <> -struct DefaultCoder<Message> { - static bool serialize(const Message& obj, string* serialized) { - return obj.SerializeToString(serialized); - } - - static bool serialize(const Message& obj, vector<char>* serialized) { - serialized->resize(obj.ByteSize()); - return obj.SerializeWithCachedSizesToArray( - reinterpret_cast<unsigned char*>(serialized->data())); - } - - static bool deserialize(const string& serialized, Message* obj) { - return obj->ParseFromString(serialized); - } - - static bool deserialize(const char* data, size_t size, Message* obj) { - return obj->ParseFromArray(data, size); - } -}; - -template <> -struct DefaultCoder<caffe::Datum> : public DefaultCoder<Message> { }; - -template <> -struct DefaultCoder<string> { - static bool serialize(string obj, string* serialized) { - *serialized = obj; - return true; - } - - static bool serialize(const string& obj, vector<char>* serialized) { - vector<char> temp(obj.data(), obj.data() + obj.size()); - serialized->swap(temp); - return true; - } - - static bool deserialize(const string& serialized, string* obj) { - *obj = serialized; - return true; - } - - static bool deserialize(const char* data, size_t size, string* obj) { - string temp_string(data, size); - obj->swap(temp_string); - return true; - } -}; - -template <> -struct DefaultCoder<vector<char> > { - static bool serialize(vector<char> obj, string* serialized) { - string tmp(obj.data(), obj.size()); - serialized->swap(tmp); - return true; - } - - static bool serialize(const vector<char>& obj, vector<char>* serialized) { - *serialized = obj; - return true; - } - - static bool deserialize(const string& serialized, vector<char>* obj) { - vector<char> tmp(serialized.data(), serialized.data() + serialized.size()); - obj->swap(tmp); - return true; - } - - static bool deserialize(const char* data, size_t size, vector<char>* obj) { - vector<char> tmp(data, data + size); - obj->swap(tmp); - return true; - } -}; - -} // namespace dataset_internal - -template <typename K, typename V, - typename KCoder = dataset_internal::DefaultCoder<K>, - typename VCoder = dataset_internal::DefaultCoder<V> > -class Dataset { - public: - enum Mode { - New, - ReadWrite, - ReadOnly - }; - - typedef K key_type; - typedef V value_type; - - struct KV { - K key; - V value; - }; - - virtual bool open(const string& filename, Mode mode) = 0; - virtual bool put(const K& key, const V& value) = 0; - virtual bool get(const K& key, V* value) = 0; - virtual bool first_key(K* key) = 0; - virtual bool last_key(K* key) = 0; - virtual bool commit() = 0; - virtual void close() = 0; - - virtual void keys(vector<K>* keys) = 0; - - Dataset() { } - virtual ~Dataset() { } - - class iterator; - typedef iterator const_iterator; - - virtual const_iterator begin() const = 0; - virtual const_iterator cbegin() const = 0; - virtual const_iterator end() const = 0; - virtual const_iterator cend() const = 0; - - protected: - class DatasetState; - - public: - class iterator : public std::iterator<std::forward_iterator_tag, KV> { - public: - typedef KV T; - typedef T value_type; - typedef T& reference_type; - typedef T* pointer_type; - - iterator() - : parent_(NULL) { } - - iterator(const Dataset* parent, shared_ptr<DatasetState> state) - : parent_(parent), - state_(state) { } - - iterator(const iterator& other) - : parent_(other.parent_), - state_(other.state_ ? other.state_->clone() - : shared_ptr<DatasetState>()) { } - - iterator& operator=(iterator copy) { - copy.swap(*this); - return *this; - } - - void swap(iterator& other) throw() { - std::swap(this->parent_, other.parent_); - std::swap(this->state_, other.state_); - } - - bool operator==(const iterator& other) const { - return parent_->equal(state_, other.state_); - } - - bool operator!=(const iterator& other) const { - return !(*this == other); - } - - iterator& operator++() { - parent_->increment(&state_); - return *this; - } - iterator operator++(int) { - iterator copy(*this); - parent_->increment(&state_); - return copy; - } - - reference_type operator*() const { - return parent_->dereference(state_); - } - - pointer_type operator->() const { - return &parent_->dereference(state_); - } - - protected: - const Dataset* parent_; - shared_ptr<DatasetState> state_; - }; - - protected: - class DatasetState { - public: - virtual ~DatasetState() { } - virtual shared_ptr<DatasetState> clone() = 0; - }; - - virtual bool equal(shared_ptr<DatasetState> state1, - shared_ptr<DatasetState> state2) const = 0; - virtual void increment(shared_ptr<DatasetState>* state) const = 0; - virtual KV& dereference( - shared_ptr<DatasetState> state) const = 0; -}; - -} // namespace caffe - -#define INSTANTIATE_DATASET(type) \ - template class type<string, string>; \ - template class type<string, vector<char> >; \ - template class type<string, caffe::Datum>; - -#endif // CAFFE_DATASET_H_ diff --git a/include/caffe/dataset_factory.hpp b/include/caffe/dataset_factory.hpp deleted file mode 100644 index 57db49bf524..00000000000 --- a/include/caffe/dataset_factory.hpp +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef CAFFE_DATASET_FACTORY_H_ -#define CAFFE_DATASET_FACTORY_H_ - -#include <string> - -#include "caffe/common.hpp" -#include "caffe/dataset.hpp" -#include "caffe/proto/caffe.pb.h" - -namespace caffe { - -template <typename K, typename V> -shared_ptr<Dataset<K, V> > DatasetFactory(const DataParameter_DB& type); - -template <typename K, typename V> -shared_ptr<Dataset<K, V> > DatasetFactory(const string& type); - -} // namespace caffe - -#endif // CAFFE_DATASET_FACTORY_H_ diff --git a/include/caffe/leveldb_dataset.hpp b/include/caffe/leveldb_dataset.hpp deleted file mode 100644 index d58c181bb2b..00000000000 --- a/include/caffe/leveldb_dataset.hpp +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef CAFFE_LEVELDB_DATASET_H_ -#define CAFFE_LEVELDB_DATASET_H_ - -#include <leveldb/db.h> -#include <leveldb/write_batch.h> - -#include <string> -#include <utility> -#include <vector> - -#include "caffe/common.hpp" -#include "caffe/dataset.hpp" - -namespace caffe { - -template <typename K, typename V, - typename KCoder = dataset_internal::DefaultCoder<K>, - typename VCoder = dataset_internal::DefaultCoder<V> > -class LeveldbDataset : public Dataset<K, V, KCoder, VCoder> { - public: - typedef Dataset<K, V, KCoder, VCoder> Base; - typedef typename Base::key_type key_type; - typedef typename Base::value_type value_type; - typedef typename Base::DatasetState DatasetState; - typedef typename Base::Mode Mode; - typedef typename Base::const_iterator const_iterator; - typedef typename Base::KV KV; - - bool open(const string& filename, Mode mode); - bool put(const K& key, const V& value); - bool get(const K& key, V* value); - bool first_key(K* key); - bool last_key(K* key); - bool commit(); - void close(); - - void keys(vector<K>* keys); - - const_iterator begin() const; - const_iterator cbegin() const; - const_iterator end() const; - const_iterator cend() const; - - protected: - class LeveldbState : public DatasetState { - public: - explicit LeveldbState(shared_ptr<leveldb::DB> db, - shared_ptr<leveldb::Iterator> iter) - : DatasetState(), - db_(db), - iter_(iter) { } - - ~LeveldbState() { - // This order is very important. - // Iterators must be destroyed before their associated DB - // is destroyed. - iter_.reset(); - db_.reset(); - } - - shared_ptr<DatasetState> clone() { - shared_ptr<leveldb::Iterator> new_iter; - - CHECK(iter_.get()); - new_iter.reset(db_->NewIterator(leveldb::ReadOptions())); - CHECK(iter_->Valid()); - new_iter->Seek(iter_->key()); - CHECK(new_iter->Valid()); - - return shared_ptr<DatasetState>(new LeveldbState(db_, new_iter)); - } - - shared_ptr<leveldb::DB> db_; - shared_ptr<leveldb::Iterator> iter_; - KV kv_pair_; - }; - - bool equal(shared_ptr<DatasetState> state1, - shared_ptr<DatasetState> state2) const; - void increment(shared_ptr<DatasetState>* state) const; - KV& dereference(shared_ptr<DatasetState> state) const; - - shared_ptr<leveldb::DB> db_; - shared_ptr<leveldb::WriteBatch> batch_; - bool read_only_; -}; - -} // namespace caffe - -#endif // CAFFE_LEVELDB_DATASET_H_ diff --git a/include/caffe/lmdb_dataset.hpp b/include/caffe/lmdb_dataset.hpp deleted file mode 100644 index ac1e5ee25dd..00000000000 --- a/include/caffe/lmdb_dataset.hpp +++ /dev/null @@ -1,95 +0,0 @@ -#ifndef CAFFE_LMDB_DATASET_H_ -#define CAFFE_LMDB_DATASET_H_ - -#include <string> -#include <utility> -#include <vector> - -#include "lmdb.h" - -#include "caffe/common.hpp" -#include "caffe/dataset.hpp" - -namespace caffe { - -template <typename K, typename V, - typename KCoder = dataset_internal::DefaultCoder<K>, - typename VCoder = dataset_internal::DefaultCoder<V> > -class LmdbDataset : public Dataset<K, V, KCoder, VCoder> { - public: - typedef Dataset<K, V, KCoder, VCoder> Base; - typedef typename Base::key_type key_type; - typedef typename Base::value_type value_type; - typedef typename Base::DatasetState DatasetState; - typedef typename Base::Mode Mode; - typedef typename Base::const_iterator const_iterator; - typedef typename Base::KV KV; - - LmdbDataset() - : env_(NULL), - dbi_(0), - write_txn_(NULL), - read_txn_(NULL) { } - - bool open(const string& filename, Mode mode); - bool put(const K& key, const V& value); - bool get(const K& key, V* value); - bool first_key(K* key); - bool last_key(K* key); - bool commit(); - void close(); - - void keys(vector<K>* keys); - - const_iterator begin() const; - const_iterator cbegin() const; - const_iterator end() const; - const_iterator cend() const; - - protected: - class LmdbState : public DatasetState { - public: - explicit LmdbState(MDB_cursor* cursor, MDB_txn* txn, const MDB_dbi* dbi) - : DatasetState(), - cursor_(cursor), - txn_(txn), - dbi_(dbi) { } - - shared_ptr<DatasetState> clone() { - CHECK(cursor_); - - MDB_cursor* new_cursor; - int retval; - - retval = mdb_cursor_open(txn_, *dbi_, &new_cursor); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - MDB_val key; - MDB_val val; - retval = mdb_cursor_get(cursor_, &key, &val, MDB_GET_CURRENT); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - retval = mdb_cursor_get(new_cursor, &key, &val, MDB_SET); - CHECK_EQ(MDB_SUCCESS, retval) << mdb_strerror(retval); - - return shared_ptr<DatasetState>(new LmdbState(new_cursor, txn_, dbi_)); - } - - MDB_cursor* cursor_; - MDB_txn* txn_; - const MDB_dbi* dbi_; - KV kv_pair_; - }; - - bool equal(shared_ptr<DatasetState> state1, - shared_ptr<DatasetState> state2) const; - void increment(shared_ptr<DatasetState>* state) const; - KV& dereference(shared_ptr<DatasetState> state) const; - - MDB_env* env_; - MDB_dbi dbi_; - MDB_txn* write_txn_; - MDB_txn* read_txn_; -}; - -} // namespace caffe - -#endif // CAFFE_LMDB_DATASET_H_ diff --git a/src/caffe/dataset_factory.cpp b/src/caffe/dataset_factory.cpp deleted file mode 100644 index 3313de3c408..00000000000 --- a/src/caffe/dataset_factory.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include <string> -#include <utility> -#include <vector> - -#include "caffe/dataset_factory.hpp" -#include "caffe/leveldb_dataset.hpp" -#include "caffe/lmdb_dataset.hpp" - -namespace caffe { - -template <typename K, typename V> -shared_ptr<Dataset<K, V> > DatasetFactory(const DataParameter_DB& type) { - switch (type) { - case DataParameter_DB_LEVELDB: - return shared_ptr<Dataset<K, V> >(new LeveldbDataset<K, V>()); - case DataParameter_DB_LMDB: - return shared_ptr<Dataset<K, V> >(new LmdbDataset<K, V>()); - default: - LOG(FATAL) << "Unknown dataset type " << type; - return shared_ptr<Dataset<K, V> >(); - } -} - -template <typename K, typename V> -shared_ptr<Dataset<K, V> > DatasetFactory(const string& type) { - if ("leveldb" == type) { - return DatasetFactory<K, V>(DataParameter_DB_LEVELDB); - } else if ("lmdb" == type) { - return DatasetFactory<K, V>(DataParameter_DB_LMDB); - } else { - LOG(FATAL) << "Unknown dataset type " << type; - return shared_ptr<Dataset<K, V> >(); - } -} - -#define REGISTER_DATASET(key_type, value_type) \ - template shared_ptr<Dataset<key_type, value_type> > \ - DatasetFactory(const string& type); \ - template shared_ptr<Dataset<key_type, value_type> > \ - DatasetFactory(const DataParameter_DB& type); \ - -REGISTER_DATASET(string, string); -REGISTER_DATASET(string, vector<char>); -REGISTER_DATASET(string, Datum); - -#undef REGISTER_DATASET - -} // namespace caffe - - diff --git a/src/caffe/leveldb_dataset.cpp b/src/caffe/leveldb_dataset.cpp deleted file mode 100644 index 53df985721c..00000000000 --- a/src/caffe/leveldb_dataset.cpp +++ /dev/null @@ -1,265 +0,0 @@ -#include <string> -#include <utility> -#include <vector> - -#include "caffe/caffe.hpp" -#include "caffe/leveldb_dataset.hpp" - -namespace caffe { - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LeveldbDataset<K, V, KCoder, VCoder>::open(const string& filename, - Mode mode) { - DLOG(INFO) << "LevelDB: Open " << filename; - - leveldb::Options options; - switch (mode) { - case Base::New: - DLOG(INFO) << " mode NEW"; - options.error_if_exists = true; - options.create_if_missing = true; - read_only_ = false; - break; - case Base::ReadWrite: - DLOG(INFO) << " mode RW"; - options.error_if_exists = false; - options.create_if_missing = true; - read_only_ = false; - break; - case Base::ReadOnly: - DLOG(INFO) << " mode RO"; - options.error_if_exists = false; - options.create_if_missing = false; - read_only_ = true; - break; - default: - DLOG(FATAL) << "unknown mode " << mode; - } - options.write_buffer_size = 268435456; - options.max_open_files = 100; - - leveldb::DB* db; - - LOG(INFO) << "Opening leveldb " << filename; - leveldb::Status status = leveldb::DB::Open( - options, filename, &db); - db_.reset(db); - - if (!status.ok()) { - LOG(ERROR) << "Failed to open leveldb " << filename - << ". Is it already existing?"; - return false; - } - - batch_.reset(new leveldb::WriteBatch()); - return true; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LeveldbDataset<K, V, KCoder, VCoder>::put(const K& key, const V& value) { - DLOG(INFO) << "LevelDB: Put"; - - if (read_only_) { - LOG(ERROR) << "put can not be used on a dataset in ReadOnly mode"; - return false; - } - - CHECK_NOTNULL(batch_.get()); - - string serialized_key; - if (!KCoder::serialize(key, &serialized_key)) { - return false; - } - - string serialized_value; - if (!VCoder::serialize(value, &serialized_value)) { - return false; - } - - batch_->Put(serialized_key, serialized_value); - - return true; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LeveldbDataset<K, V, KCoder, VCoder>::get(const K& key, V* value) { - DLOG(INFO) << "LevelDB: Get"; - - string serialized_key; - if (!KCoder::serialize(key, &serialized_key)) { - return false; - } - - string serialized_value; - leveldb::Status status = - db_->Get(leveldb::ReadOptions(), serialized_key, &serialized_value); - - if (!status.ok()) { - LOG(ERROR) << "leveldb get failed"; - return false; - } - - if (!VCoder::deserialize(serialized_value, value)) { - return false; - } - - return true; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LeveldbDataset<K, V, KCoder, VCoder>::first_key(K* key) { - DLOG(INFO) << "LevelDB: First key"; - - CHECK_NOTNULL(db_.get()); - shared_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); - iter->SeekToFirst(); - CHECK(iter->Valid()); - const leveldb::Slice& key_slice = iter->key(); - return KCoder::deserialize(key_slice.data(), key_slice.size(), key); -} - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LeveldbDataset<K, V, KCoder, VCoder>::last_key(K* key) { - DLOG(INFO) << "LevelDB: Last key"; - - CHECK_NOTNULL(db_.get()); - shared_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); - iter->SeekToLast(); - CHECK(iter->Valid()); - const leveldb::Slice& key_slice = iter->key(); - return KCoder::deserialize(key_slice.data(), key_slice.size(), key); -} - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LeveldbDataset<K, V, KCoder, VCoder>::commit() { - DLOG(INFO) << "LevelDB: Commit"; - - if (read_only_) { - LOG(ERROR) << "commit can not be used on a dataset in ReadOnly mode"; - return false; - } - - CHECK_NOTNULL(db_.get()); - CHECK_NOTNULL(batch_.get()); - - leveldb::Status status = db_->Write(leveldb::WriteOptions(), batch_.get()); - - batch_.reset(new leveldb::WriteBatch()); - - return status.ok(); -} - -template <typename K, typename V, typename KCoder, typename VCoder> -void LeveldbDataset<K, V, KCoder, VCoder>::close() { - DLOG(INFO) << "LevelDB: Close"; - - batch_.reset(); - db_.reset(); -} - -template <typename K, typename V, typename KCoder, typename VCoder> -void LeveldbDataset<K, V, KCoder, VCoder>::keys(vector<K>* keys) { - DLOG(INFO) << "LevelDB: Keys"; - - keys->clear(); - for (const_iterator iter = begin(); iter != end(); ++iter) { - keys->push_back(iter->key); - } -} - -template <typename K, typename V, typename KCoder, typename VCoder> -typename LeveldbDataset<K, V, KCoder, VCoder>::const_iterator - LeveldbDataset<K, V, KCoder, VCoder>::begin() const { - CHECK_NOTNULL(db_.get()); - shared_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); - iter->SeekToFirst(); - if (!iter->Valid()) { - iter.reset(); - } - - shared_ptr<DatasetState> state; - if (iter) { - state.reset(new LeveldbState(db_, iter)); - } - return const_iterator(this, state); -} - -template <typename K, typename V, typename KCoder, typename VCoder> -typename LeveldbDataset<K, V, KCoder, VCoder>::const_iterator - LeveldbDataset<K, V, KCoder, VCoder>::end() const { - shared_ptr<DatasetState> state; - return const_iterator(this, state); -} - -template <typename K, typename V, typename KCoder, typename VCoder> -typename LeveldbDataset<K, V, KCoder, VCoder>::const_iterator - LeveldbDataset<K, V, KCoder, VCoder>::cbegin() const { - return begin(); -} - -template <typename K, typename V, typename KCoder, typename VCoder> -typename LeveldbDataset<K, V, KCoder, VCoder>::const_iterator - LeveldbDataset<K, V, KCoder, VCoder>::cend() const { return end(); } - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LeveldbDataset<K, V, KCoder, VCoder>::equal( - shared_ptr<DatasetState> state1, shared_ptr<DatasetState> state2) const { - shared_ptr<LeveldbState> leveldb_state1 = - boost::dynamic_pointer_cast<LeveldbState>(state1); - - shared_ptr<LeveldbState> leveldb_state2 = - boost::dynamic_pointer_cast<LeveldbState>(state2); - - // The KV store doesn't really have any sort of ordering, - // so while we can do a sequential scan over the collection, - // we can't really use subranges. - return !leveldb_state1 && !leveldb_state2; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -void LeveldbDataset<K, V, KCoder, VCoder>::increment( - shared_ptr<DatasetState>* state) const { - shared_ptr<LeveldbState> leveldb_state = - boost::dynamic_pointer_cast<LeveldbState>(*state); - - CHECK_NOTNULL(leveldb_state.get()); - - shared_ptr<leveldb::Iterator>& iter = leveldb_state->iter_; - - CHECK_NOTNULL(iter.get()); - CHECK(iter->Valid()); - - iter->Next(); - if (!iter->Valid()) { - state->reset(); - } -} - -template <typename K, typename V, typename KCoder, typename VCoder> -typename Dataset<K, V, KCoder, VCoder>::KV& - LeveldbDataset<K, V, KCoder, VCoder>::dereference( - shared_ptr<DatasetState> state) const { - shared_ptr<LeveldbState> leveldb_state = - boost::dynamic_pointer_cast<LeveldbState>(state); - - CHECK_NOTNULL(leveldb_state.get()); - - shared_ptr<leveldb::Iterator>& iter = leveldb_state->iter_; - - CHECK_NOTNULL(iter.get()); - - CHECK(iter->Valid()); - - const leveldb::Slice& key = iter->key(); - const leveldb::Slice& value = iter->value(); - CHECK(KCoder::deserialize(key.data(), key.size(), - &leveldb_state->kv_pair_.key)); - CHECK(VCoder::deserialize(value.data(), value.size(), - &leveldb_state->kv_pair_.value)); - - return leveldb_state->kv_pair_; -} - -INSTANTIATE_DATASET(LeveldbDataset); - -} // namespace caffe diff --git a/src/caffe/lmdb_dataset.cpp b/src/caffe/lmdb_dataset.cpp deleted file mode 100644 index 8f8e68e901e..00000000000 --- a/src/caffe/lmdb_dataset.cpp +++ /dev/null @@ -1,366 +0,0 @@ -#include <sys/stat.h> - -#include <string> -#include <utility> -#include <vector> - -#include "caffe/caffe.hpp" -#include "caffe/lmdb_dataset.hpp" - -namespace caffe { - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LmdbDataset<K, V, KCoder, VCoder>::open(const string& filename, - Mode mode) { - DLOG(INFO) << "LMDB: Open " << filename; - - CHECK(NULL == env_); - CHECK(NULL == write_txn_); - CHECK(NULL == read_txn_); - CHECK_EQ(0, dbi_); - - int retval; - if (mode != Base::ReadOnly) { - retval = mkdir(filename.c_str(), 0744); - switch (mode) { - case Base::New: - if (0 != retval) { - LOG(ERROR) << "mkdir " << filename << " failed"; - return false; - } - break; - case Base::ReadWrite: - if (-1 == retval && EEXIST != errno) { - LOG(ERROR) << "mkdir " << filename << " failed (" - << strerror(errno) << ")"; - return false; - } - break; - default: - LOG(FATAL) << "Invalid mode " << mode; - } - } - - retval = mdb_env_create(&env_); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_env_create failed " - << mdb_strerror(retval); - return false; - } - - retval = mdb_env_set_mapsize(env_, 1099511627776); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_env_set_mapsize failed " << mdb_strerror(retval); - return false; - } - - int flag1 = 0; - int flag2 = 0; - if (mode == Base::ReadOnly) { - flag1 = MDB_RDONLY | MDB_NOTLS; - flag2 = MDB_RDONLY; - } - - retval = mdb_env_open(env_, filename.c_str(), flag1, 0664); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_env_open failed " << mdb_strerror(retval); - return false; - } - - retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &read_txn_); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); - return false; - } - - retval = mdb_txn_begin(env_, NULL, flag2, &write_txn_); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); - return false; - } - - retval = mdb_open(write_txn_, NULL, 0, &dbi_); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_open failed" << mdb_strerror(retval); - return false; - } - - return true; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LmdbDataset<K, V, KCoder, VCoder>::put(const K& key, const V& value) { - DLOG(INFO) << "LMDB: Put"; - - vector<char> serialized_key; - if (!KCoder::serialize(key, &serialized_key)) { - LOG(ERROR) << "failed to serialize key"; - return false; - } - - vector<char> serialized_value; - if (!VCoder::serialize(value, &serialized_value)) { - LOG(ERROR) << "failed to serialized value"; - return false; - } - - MDB_val mdbkey, mdbdata; - mdbdata.mv_size = serialized_value.size(); - mdbdata.mv_data = serialized_value.data(); - mdbkey.mv_size = serialized_key.size(); - mdbkey.mv_data = serialized_key.data(); - - CHECK_NOTNULL(write_txn_); - CHECK_NE(0, dbi_); - - int retval = mdb_put(write_txn_, dbi_, &mdbkey, &mdbdata, 0); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_put failed " << mdb_strerror(retval); - return false; - } - - return true; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LmdbDataset<K, V, KCoder, VCoder>::get(const K& key, V* value) { - DLOG(INFO) << "LMDB: Get"; - - vector<char> serialized_key; - if (!KCoder::serialize(key, &serialized_key)) { - LOG(ERROR) << "failed to serialized key"; - return false; - } - - MDB_val mdbkey, mdbdata; - mdbkey.mv_data = serialized_key.data(); - mdbkey.mv_size = serialized_key.size(); - - int retval; - retval = mdb_get(read_txn_, dbi_, &mdbkey, &mdbdata); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_get failed " << mdb_strerror(retval); - return false; - } - - if (!VCoder::deserialize(reinterpret_cast<char*>(mdbdata.mv_data), - mdbdata.mv_size, value)) { - LOG(ERROR) << "failed to deserialize value"; - return false; - } - - return true; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LmdbDataset<K, V, KCoder, VCoder>::first_key(K* key) { - DLOG(INFO) << "LMDB: First key"; - - int retval; - - MDB_cursor* cursor; - retval = mdb_cursor_open(read_txn_, dbi_, &cursor); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - MDB_val mdbkey; - MDB_val mdbval; - retval = mdb_cursor_get(cursor, &mdbkey, &mdbval, MDB_FIRST); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - - mdb_cursor_close(cursor); - - if (!KCoder::deserialize(reinterpret_cast<char*>(mdbkey.mv_data), - mdbkey.mv_size, key)) { - LOG(ERROR) << "failed to deserialize key"; - return false; - } - - return true; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LmdbDataset<K, V, KCoder, VCoder>::last_key(K* key) { - DLOG(INFO) << "LMDB: Last key"; - - int retval; - - MDB_cursor* cursor; - retval = mdb_cursor_open(read_txn_, dbi_, &cursor); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - MDB_val mdbkey; - MDB_val mdbval; - retval = mdb_cursor_get(cursor, &mdbkey, &mdbval, MDB_LAST); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - - mdb_cursor_close(cursor); - - if (!KCoder::deserialize(reinterpret_cast<char*>(mdbkey.mv_data), - mdbkey.mv_size, key)) { - LOG(ERROR) << "failed to deserialize key"; - return false; - } - - return true; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LmdbDataset<K, V, KCoder, VCoder>::commit() { - DLOG(INFO) << "LMDB: Commit"; - - CHECK_NOTNULL(write_txn_); - - int retval; - retval = mdb_txn_commit(write_txn_); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_txn_commit failed " << mdb_strerror(retval); - return false; - } - - mdb_txn_abort(read_txn_); - - retval = mdb_txn_begin(env_, NULL, 0, &write_txn_); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); - return false; - } - - retval = mdb_txn_begin(env_, NULL, MDB_RDONLY, &read_txn_); - if (MDB_SUCCESS != retval) { - LOG(ERROR) << "mdb_txn_begin failed " << mdb_strerror(retval); - return false; - } - - return true; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -void LmdbDataset<K, V, KCoder, VCoder>::close() { - DLOG(INFO) << "LMDB: Close"; - - if (env_ && dbi_) { - mdb_txn_abort(write_txn_); - mdb_txn_abort(read_txn_); - mdb_close(env_, dbi_); - mdb_env_close(env_); - env_ = NULL; - dbi_ = 0; - write_txn_ = NULL; - read_txn_ = NULL; - } -} - -template <typename K, typename V, typename KCoder, typename VCoder> -void LmdbDataset<K, V, KCoder, VCoder>::keys(vector<K>* keys) { - DLOG(INFO) << "LMDB: Keys"; - - keys->clear(); - for (const_iterator iter = begin(); iter != end(); ++iter) { - keys->push_back(iter->key); - } -} - -template <typename K, typename V, typename KCoder, typename VCoder> -typename LmdbDataset<K, V, KCoder, VCoder>::const_iterator - LmdbDataset<K, V, KCoder, VCoder>::begin() const { - int retval; - - MDB_cursor* cursor; - retval = mdb_cursor_open(read_txn_, dbi_, &cursor); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - MDB_val key; - MDB_val val; - retval = mdb_cursor_get(cursor, &key, &val, MDB_FIRST); - - CHECK(MDB_SUCCESS == retval || MDB_NOTFOUND == retval) - << mdb_strerror(retval); - - shared_ptr<DatasetState> state; - if (MDB_SUCCESS == retval) { - state.reset(new LmdbState(cursor, read_txn_, &dbi_)); - } else { - mdb_cursor_close(cursor); - } - return const_iterator(this, state); -} - -template <typename K, typename V, typename KCoder, typename VCoder> -typename LmdbDataset<K, V, KCoder, VCoder>::const_iterator - LmdbDataset<K, V, KCoder, VCoder>::end() const { - shared_ptr<DatasetState> state; - return const_iterator(this, state); -} - -template <typename K, typename V, typename KCoder, typename VCoder> -typename LmdbDataset<K, V, KCoder, VCoder>::const_iterator - LmdbDataset<K, V, KCoder, VCoder>::cbegin() const { return begin(); } - -template <typename K, typename V, typename KCoder, typename VCoder> -typename LmdbDataset<K, V, KCoder, VCoder>::const_iterator - LmdbDataset<K, V, KCoder, VCoder>::cend() const { return end(); } - -template <typename K, typename V, typename KCoder, typename VCoder> -bool LmdbDataset<K, V, KCoder, VCoder>::equal(shared_ptr<DatasetState> state1, - shared_ptr<DatasetState> state2) const { - shared_ptr<LmdbState> lmdb_state1 = - boost::dynamic_pointer_cast<LmdbState>(state1); - - shared_ptr<LmdbState> lmdb_state2 = - boost::dynamic_pointer_cast<LmdbState>(state2); - - // The KV store doesn't really have any sort of ordering, - // so while we can do a sequential scan over the collection, - // we can't really use subranges. - return !lmdb_state1 && !lmdb_state2; -} - -template <typename K, typename V, typename KCoder, typename VCoder> -void LmdbDataset<K, V, KCoder, VCoder>::increment( - shared_ptr<DatasetState>* state) const { - shared_ptr<LmdbState> lmdb_state = - boost::dynamic_pointer_cast<LmdbState>(*state); - - CHECK_NOTNULL(lmdb_state.get()); - - MDB_cursor*& cursor = lmdb_state->cursor_; - - CHECK_NOTNULL(cursor); - - MDB_val key; - MDB_val val; - int retval = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (MDB_NOTFOUND == retval) { - mdb_cursor_close(cursor); - state->reset(); - } else { - CHECK_EQ(MDB_SUCCESS, retval) << mdb_strerror(retval); - } -} - -template <typename K, typename V, typename KCoder, typename VCoder> -typename Dataset<K, V, KCoder, VCoder>::KV& - LmdbDataset<K, V, KCoder, VCoder>::dereference( - shared_ptr<DatasetState> state) const { - shared_ptr<LmdbState> lmdb_state = - boost::dynamic_pointer_cast<LmdbState>(state); - - CHECK_NOTNULL(lmdb_state.get()); - - MDB_cursor*& cursor = lmdb_state->cursor_; - - CHECK_NOTNULL(cursor); - - MDB_val mdb_key; - MDB_val mdb_val; - int retval = mdb_cursor_get(cursor, &mdb_key, &mdb_val, MDB_GET_CURRENT); - CHECK_EQ(retval, MDB_SUCCESS) << mdb_strerror(retval); - - CHECK(KCoder::deserialize(reinterpret_cast<char*>(mdb_key.mv_data), - mdb_key.mv_size, &lmdb_state->kv_pair_.key)); - CHECK(VCoder::deserialize(reinterpret_cast<char*>(mdb_val.mv_data), - mdb_val.mv_size, &lmdb_state->kv_pair_.value)); - - return lmdb_state->kv_pair_; -} - -INSTANTIATE_DATASET(LmdbDataset); - -} // namespace caffe diff --git a/src/caffe/test/test_dataset.cpp b/src/caffe/test/test_dataset.cpp deleted file mode 100644 index 6645ca228d2..00000000000 --- a/src/caffe/test/test_dataset.cpp +++ /dev/null @@ -1,794 +0,0 @@ -#include <string> -#include <vector> - -#include "caffe/util/io.hpp" - -#include "gtest/gtest.h" - -#include "caffe/dataset_factory.hpp" - -#include "caffe/test/test_caffe_main.hpp" - -namespace caffe { - -namespace DatasetTest_internal { - -template <typename T> -struct TestData { - static T TestValue(); - static T TestAltValue(); - static bool equals(const T& a, const T& b); -}; - -template <> -string TestData<string>::TestValue() { - return "world"; -} - -template <> -string TestData<string>::TestAltValue() { - return "bar"; -} - -template <> -bool TestData<string>::equals(const string& a, const string& b) { - return a == b; -} - -template <> -vector<char> TestData<vector<char> >::TestValue() { - string str = "world"; - vector<char> val(str.data(), str.data() + str.size()); - return val; -} - -template <> -vector<char> TestData<vector<char> >::TestAltValue() { - string str = "bar"; - vector<char> val(str.data(), str.data() + str.size()); - return val; -} - -template <> -bool TestData<vector<char> >::equals(const vector<char>& a, - const vector<char>& b) { - if (a.size() != b.size()) { - return false; - } - for (size_t i = 0; i < a.size(); ++i) { - if (a.at(i) != b.at(i)) { - return false; - } - } - - return true; -} - -template <> -Datum TestData<Datum>::TestValue() { - Datum datum; - datum.set_channels(3); - datum.set_height(32); - datum.set_width(32); - datum.set_data(string(32 * 32 * 3 * 4, ' ')); - datum.set_label(0); - return datum; -} - -template <> -Datum TestData<Datum>::TestAltValue() { - Datum datum; - datum.set_channels(1); - datum.set_height(64); - datum.set_width(64); - datum.set_data(string(64 * 64 * 1 * 4, ' ')); - datum.set_label(1); - return datum; -} - -template <> -bool TestData<Datum>::equals(const Datum& a, const Datum& b) { - string serialized_a; - a.SerializeToString(&serialized_a); - - string serialized_b; - b.SerializeToString(&serialized_b); - - return serialized_a == serialized_b; -} - -} // namespace DatasetTest_internal - -#define UNPACK_TYPES \ - typedef typename TypeParam::value_type value_type; \ - const DataParameter_DB backend = TypeParam::backend; - -template <typename TypeParam> -class DatasetTest : public ::testing::Test { - protected: - typedef typename TypeParam::value_type value_type; - - string DBName() { - string filename; - MakeTempDir(&filename); - filename += "/db"; - return filename; - } - - string TestKey() { - return "hello"; - } - - value_type TestValue() { - return DatasetTest_internal::TestData<value_type>::TestValue(); - } - - string TestAltKey() { - return "foo"; - } - - value_type TestAltValue() { - return DatasetTest_internal::TestData<value_type>::TestAltValue(); - } - - template <typename T> - bool equals(const T& a, const T& b) { - return DatasetTest_internal::TestData<T>::equals(a, b); - } -}; - -struct StringLeveldb { - typedef string value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB StringLeveldb::backend = DataParameter_DB_LEVELDB; - -struct StringLmdb { - typedef string value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB StringLmdb::backend = DataParameter_DB_LMDB; - -struct VectorLeveldb { - typedef vector<char> value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB VectorLeveldb::backend = DataParameter_DB_LEVELDB; - -struct VectorLmdb { - typedef vector<char> value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB VectorLmdb::backend = DataParameter_DB_LMDB; - -struct DatumLeveldb { - typedef Datum value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB DatumLeveldb::backend = DataParameter_DB_LEVELDB; - -struct DatumLmdb { - typedef Datum value_type; - static const DataParameter_DB backend; -}; -const DataParameter_DB DatumLmdb::backend = DataParameter_DB_LMDB; - -typedef ::testing::Types<StringLeveldb, StringLmdb, VectorLeveldb, VectorLmdb, - DatumLeveldb, DatumLmdb> TestTypes; - -TYPED_TEST_CASE(DatasetTest, TestTypes); - -TYPED_TEST(DatasetTest, TestNewDoesntExistPasses) { - UNPACK_TYPES; - - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(this->DBName(), - Dataset<string, value_type>::New)); - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestNewExistsFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - dataset->close(); - - EXPECT_FALSE(dataset->open(name, Dataset<string, value_type>::New)); -} - -TYPED_TEST(DatasetTest, TestReadOnlyExistsPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - dataset->close(); - - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestReadOnlyDoesntExistFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_FALSE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); -} - -TYPED_TEST(DatasetTest, TestReadWriteExistsPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - dataset->close(); - - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadWrite)); - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestReadWriteDoesntExistPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadWrite)); - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestKeys) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key1 = this->TestKey(); - value_type value1 = this->TestValue(); - - EXPECT_TRUE(dataset->put(key1, value1)); - - string key2 = this->TestAltKey(); - value_type value2 = this->TestAltValue(); - - EXPECT_TRUE(dataset->put(key2, value2)); - - EXPECT_TRUE(dataset->commit()); - - vector<string> keys; - dataset->keys(&keys); - - EXPECT_EQ(2, keys.size()); - - EXPECT_TRUE(this->equals(keys.at(0), key1) || - this->equals(keys.at(0), key2)); - EXPECT_TRUE(this->equals(keys.at(1), key1) || - this->equals(keys.at(2), key2)); - EXPECT_FALSE(this->equals(keys.at(0), keys.at(1))); -} - -TYPED_TEST(DatasetTest, TestFirstKey) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - value_type value = this->TestValue(); - - string key1 = "01"; - EXPECT_TRUE(dataset->put(key1, value)); - - string key2 = "02"; - EXPECT_TRUE(dataset->put(key2, value)); - - string key3 = "03"; - EXPECT_TRUE(dataset->put(key3, value)); - - EXPECT_TRUE(dataset->commit()); - - string first_key; - dataset->first_key(&first_key); - - EXPECT_TRUE(this->equals(first_key, key1)); -} - -TYPED_TEST(DatasetTest, TestLastKey) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - value_type value = this->TestValue(); - - string key1 = "01"; - EXPECT_TRUE(dataset->put(key1, value)); - - string key2 = "02"; - EXPECT_TRUE(dataset->put(key2, value)); - - string key3 = "03"; - EXPECT_TRUE(dataset->put(key3, value)); - - EXPECT_TRUE(dataset->commit()); - - string last_key; - dataset->last_key(&last_key); - - EXPECT_TRUE(this->equals(last_key, key3)); -} - -TYPED_TEST(DatasetTest, TestFirstLastKeys) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - value_type value = this->TestValue(); - - string key1 = "01"; - EXPECT_TRUE(dataset->put(key1, value)); - - string key2 = "02"; - EXPECT_TRUE(dataset->put(key2, value)); - - string key3 = "03"; - EXPECT_TRUE(dataset->put(key3, value)); - - EXPECT_TRUE(dataset->commit()); - - string first_key; - dataset->first_key(&first_key); - string last_key; - dataset->last_key(&last_key); - - EXPECT_TRUE(this->equals(first_key, key1)); - EXPECT_TRUE(this->equals(last_key, key3)); -} - -TYPED_TEST(DatasetTest, TestFirstLastKeysUnOrdered) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - value_type value = this->TestValue(); - - string key3 = "03"; - EXPECT_TRUE(dataset->put(key3, value)); - - string key1 = "01"; - EXPECT_TRUE(dataset->put(key1, value)); - - string key2 = "02"; - EXPECT_TRUE(dataset->put(key2, value)); - - EXPECT_TRUE(dataset->commit()); - - string first_key; - dataset->first_key(&first_key); - string last_key; - dataset->last_key(&last_key); - - EXPECT_TRUE(this->equals(first_key, key1)); - EXPECT_TRUE(this->equals(last_key, key3)); -} - -TYPED_TEST(DatasetTest, TestKeysNoCommit) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key1 = this->TestKey(); - value_type value1 = this->TestValue(); - - EXPECT_TRUE(dataset->put(key1, value1)); - - string key2 = this->TestAltKey(); - value_type value2 = this->TestAltValue(); - - EXPECT_TRUE(dataset->put(key2, value2)); - - vector<string> keys; - dataset->keys(&keys); - - EXPECT_EQ(0, keys.size()); -} - -TYPED_TEST(DatasetTest, TestIterators) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - const int kNumExamples = 4; - for (int i = 0; i < kNumExamples; ++i) { - stringstream ss; - ss << i; - string key = ss.str(); - ss << " here be data"; - value_type value = this->TestValue(); - EXPECT_TRUE(dataset->put(key, value)); - } - EXPECT_TRUE(dataset->commit()); - - int count = 0; - typedef typename Dataset<string, value_type>::const_iterator Iter; - for (Iter iter = dataset->begin(); iter != dataset->end(); ++iter) { - (void)iter; - ++count; - } - - EXPECT_EQ(kNumExamples, count); -} - -TYPED_TEST(DatasetTest, TestIteratorsPreIncrement) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key1 = this->TestAltKey(); - value_type value1 = this->TestAltValue(); - - string key2 = this->TestKey(); - value_type value2 = this->TestValue(); - - EXPECT_TRUE(dataset->put(key1, value1)); - EXPECT_TRUE(dataset->put(key2, value2)); - EXPECT_TRUE(dataset->commit()); - - typename Dataset<string, value_type>::const_iterator iter1 = - dataset->begin(); - - EXPECT_FALSE(dataset->end() == iter1); - - EXPECT_TRUE(this->equals(iter1->key, key1)); - - typename Dataset<string, value_type>::const_iterator iter2 = ++iter1; - - EXPECT_FALSE(dataset->end() == iter1); - EXPECT_FALSE(dataset->end() == iter2); - - EXPECT_TRUE(this->equals(iter2->key, key2)); - - typename Dataset<string, value_type>::const_iterator iter3 = ++iter2; - - EXPECT_TRUE(dataset->end() == iter3); - - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestIteratorsPostIncrement) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key1 = this->TestAltKey(); - value_type value1 = this->TestAltValue(); - - string key2 = this->TestKey(); - value_type value2 = this->TestValue(); - - EXPECT_TRUE(dataset->put(key1, value1)); - EXPECT_TRUE(dataset->put(key2, value2)); - EXPECT_TRUE(dataset->commit()); - - typename Dataset<string, value_type>::const_iterator iter1 = - dataset->begin(); - - EXPECT_FALSE(dataset->end() == iter1); - - EXPECT_TRUE(this->equals(iter1->key, key1)); - - typename Dataset<string, value_type>::const_iterator iter2 = iter1++; - - EXPECT_FALSE(dataset->end() == iter1); - EXPECT_FALSE(dataset->end() == iter2); - - EXPECT_TRUE(this->equals(iter2->key, key1)); - EXPECT_TRUE(this->equals(iter1->key, key2)); - - typename Dataset<string, value_type>::const_iterator iter3 = iter1++; - - EXPECT_FALSE(dataset->end() == iter3); - EXPECT_TRUE(this->equals(iter3->key, key2)); - EXPECT_TRUE(dataset->end() == iter1); - - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestNewPutPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(dataset->put(key, value)); - - EXPECT_TRUE(dataset->commit()); - - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestNewCommitPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - EXPECT_TRUE(dataset->commit()); - - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestNewGetPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(dataset->put(key, value)); - - EXPECT_TRUE(dataset->commit()); - - value_type new_value; - - EXPECT_TRUE(dataset->get(key, &new_value)); - - EXPECT_TRUE(this->equals(value, new_value)); - - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestNewGetNoCommitFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(dataset->put(key, value)); - - value_type new_value; - - EXPECT_FALSE(dataset->get(key, &new_value)); -} - - -TYPED_TEST(DatasetTest, TestReadWritePutPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadWrite)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(dataset->put(key, value)); - - EXPECT_TRUE(dataset->commit()); - - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestReadWriteCommitPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadWrite)); - - EXPECT_TRUE(dataset->commit()); - - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestReadWriteGetPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(dataset->put(key, value)); - - EXPECT_TRUE(dataset->commit()); - - value_type new_value; - - EXPECT_TRUE(dataset->get(key, &new_value)); - - EXPECT_TRUE(this->equals(value, new_value)); - - dataset->close(); -} - -TYPED_TEST(DatasetTest, TestReadWriteGetNoCommitFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(dataset->put(key, value)); - - value_type new_value; - - EXPECT_FALSE(dataset->get(key, &new_value)); -} - -TYPED_TEST(DatasetTest, TestReadOnlyPutFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - dataset->close(); - - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_FALSE(dataset->put(key, value)); -} - -TYPED_TEST(DatasetTest, TestReadOnlyCommitFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - dataset->close(); - - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); - - EXPECT_FALSE(dataset->commit()); -} - -TYPED_TEST(DatasetTest, TestReadOnlyGetPasses) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(dataset->put(key, value)); - - EXPECT_TRUE(dataset->commit()); - - dataset->close(); - - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); - - value_type new_value; - - EXPECT_TRUE(dataset->get(key, &new_value)); - - EXPECT_TRUE(this->equals(value, new_value)); -} - -TYPED_TEST(DatasetTest, TestReadOnlyGetNoCommitFails) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - - EXPECT_TRUE(dataset->put(key, value)); - - dataset->close(); - - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::ReadOnly)); - - value_type new_value; - - EXPECT_FALSE(dataset->get(key, &new_value)); -} - -TYPED_TEST(DatasetTest, TestCreateManyItersShortScope) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - EXPECT_TRUE(dataset->put(key, value)); - EXPECT_TRUE(dataset->commit()); - - for (int i = 0; i < 1000; ++i) { - typename Dataset<string, value_type>::const_iterator iter = - dataset->begin(); - } -} - -TYPED_TEST(DatasetTest, TestCreateManyItersLongScope) { - UNPACK_TYPES; - - string name = this->DBName(); - shared_ptr<Dataset<string, value_type> > dataset = - DatasetFactory<string, value_type>(backend); - EXPECT_TRUE(dataset->open(name, Dataset<string, value_type>::New)); - - string key = this->TestKey(); - value_type value = this->TestValue(); - EXPECT_TRUE(dataset->put(key, value)); - EXPECT_TRUE(dataset->commit()); - - vector<typename Dataset<string, value_type>::const_iterator> iters; - for (int i = 0; i < 1000; ++i) { - iters.push_back(dataset->begin()); - } -} - -#undef UNPACK_TYPES - -} // namespace caffe From 60f26d647ceccea5d0ab0bf85b35b492886bf451 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 16 Oct 2014 13:24:39 -0700 Subject: [PATCH 1059/2053] SetTotalBytesLimit to the max (2 GB minus 1 byte) --- src/caffe/util/io.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index ffdaeb12c4a..6fa6e68010e 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -17,6 +17,8 @@ #include "caffe/proto/caffe.pb.h" #include "caffe/util/io.hpp" +const int kProtoReadBytesLimit = INT_MAX; // Max size of 2 GB minus 1 byte. + namespace caffe { using google::protobuf::io::FileInputStream; @@ -50,7 +52,7 @@ bool ReadProtoFromBinaryFile(const char* filename, Message* proto) { CHECK_NE(fd, -1) << "File not found: " << filename; ZeroCopyInputStream* raw_input = new FileInputStream(fd); CodedInputStream* coded_input = new CodedInputStream(raw_input); - coded_input->SetTotalBytesLimit(1073741824, 536870912); + coded_input->SetTotalBytesLimit(kProtoReadBytesLimit, 536870912); bool success = proto->ParseFromCodedStream(coded_input); From a0ada4fc9e0075d8ba57f128a111fd5e214266c8 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sat, 1 Nov 2014 21:22:11 -0700 Subject: [PATCH 1060/2053] Unroll kernels in SoftmaxLayer...from terrible performance to mediocre performance. --- src/caffe/layers/softmax_layer.cu | 48 +++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/caffe/layers/softmax_layer.cu b/src/caffe/layers/softmax_layer.cu index 292ad2b396a..6b8871a0b20 100644 --- a/src/caffe/layers/softmax_layer.cu +++ b/src/caffe/layers/softmax_layer.cu @@ -25,14 +25,13 @@ __global__ void kernel_channel_max(const int num, const int channels, } template <typename Dtype> -__global__ void kernel_channel_subtract(const int num, const int channels, - const int spatial_dim, Dtype* data, const Dtype* channel_max) { - CUDA_KERNEL_LOOP(index, num * spatial_dim) { - int n = index / spatial_dim; +__global__ void kernel_channel_subtract(const int count, + const int num, const int channels, + const int spatial_dim, const Dtype* channel_max, Dtype* data) { + CUDA_KERNEL_LOOP(index, count) { + int n = index / channels / spatial_dim; int s = index % spatial_dim; - for (int c = 0; c < channels; ++c) { - data[(n * channels + c) * spatial_dim + s] -= channel_max[index]; - } + data[index] -= channel_max[n * spatial_dim + s]; } } @@ -58,14 +57,13 @@ __global__ void kernel_channel_sum(const int num, const int channels, } template <typename Dtype> -__global__ void kernel_channel_div(const int num, const int channels, - const int spatial_dim, Dtype* data, const Dtype* channel_sum) { - CUDA_KERNEL_LOOP(index, num * spatial_dim) { - int n = index / spatial_dim; +__global__ void kernel_channel_div(const int count, + const int num, const int channels, + const int spatial_dim, const Dtype* channel_sum, Dtype* data) { + CUDA_KERNEL_LOOP(index, count) { + int n = index / channels / spatial_dim; int s = index % spatial_dim; - for (int c = 0; c < channels; ++c) { - data[(n * channels + c) * spatial_dim + s] /= channel_sum[index]; - } + data[index] /= channel_sum[n * spatial_dim + s]; } } @@ -91,10 +89,11 @@ void SoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, const Dtype* bottom_data = bottom[0]->gpu_data(); Dtype* top_data = top[0]->mutable_gpu_data(); Dtype* scale_data = scale_.mutable_gpu_data(); + int count = bottom[0]->count(); int num = bottom[0]->num(); int channels = bottom[0]->channels(); int spatial_dim = bottom[0]->height() * bottom[0]->width(); - caffe_copy(bottom[0]->count(), bottom_data, top_data); + caffe_copy(count, bottom_data, top_data); // We need to subtract the max to avoid numerical issues, compute the exp, // and then normalize. // compute max @@ -104,9 +103,9 @@ void SoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, scale_data); // subtract // NOLINT_NEXT_LINE(whitespace/operators) - kernel_channel_subtract<Dtype><<<CAFFE_GET_BLOCKS(num * spatial_dim), - CAFFE_CUDA_NUM_THREADS>>>(num, channels, spatial_dim, top_data, - scale_data); + kernel_channel_subtract<Dtype><<<CAFFE_GET_BLOCKS(count), + CAFFE_CUDA_NUM_THREADS>>>(count, num, channels, spatial_dim, + scale_data, top_data); // exponentiate // NOLINT_NEXT_LINE(whitespace/operators) kernel_exp<Dtype><<<CAFFE_GET_BLOCKS(num * channels * spatial_dim), @@ -119,9 +118,9 @@ void SoftmaxLayer<Dtype>::Forward_gpu(const vector<Blob<Dtype>*>& bottom, scale_data); // divide // NOLINT_NEXT_LINE(whitespace/operators) - kernel_channel_div<Dtype><<<CAFFE_GET_BLOCKS(num * spatial_dim), - CAFFE_CUDA_NUM_THREADS>>>(num, channels, spatial_dim, top_data, - scale_data); + kernel_channel_div<Dtype><<<CAFFE_GET_BLOCKS(count), + CAFFE_CUDA_NUM_THREADS>>>(count, num, channels, spatial_dim, + scale_data, top_data); } template <typename Dtype> @@ -131,6 +130,7 @@ void SoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, const Dtype* top_data = top[0]->gpu_data(); Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); Dtype* scale_data = scale_.mutable_gpu_data(); + int count = top[0]->count(); int num = top[0]->num(); int channels = top[0]->channels(); int spatial_dim = top[0]->height() * top[0]->width(); @@ -141,9 +141,9 @@ void SoftmaxLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, CAFFE_CUDA_NUM_THREADS>>>(num, channels, spatial_dim, top_diff, top_data, scale_data); // NOLINT_NEXT_LINE(whitespace/operators) - kernel_channel_subtract<Dtype><<<CAFFE_GET_BLOCKS(num * spatial_dim), - CAFFE_CUDA_NUM_THREADS>>>(num, channels, spatial_dim, bottom_diff, - scale_data); + kernel_channel_subtract<Dtype><<<CAFFE_GET_BLOCKS(count), + CAFFE_CUDA_NUM_THREADS>>>(count, num, channels, spatial_dim, + scale_data, bottom_diff); // elementwise multiplication caffe_gpu_mul<Dtype>(top[0]->count(), bottom_diff, top_data, bottom_diff); } From 89a92b9d7a4b1ecdef69fe5e52f73b362f0ce913 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sat, 1 Nov 2014 21:37:05 -0700 Subject: [PATCH 1061/2053] SoftmaxWithLossLayer: use CreateLayer so that a CuDNNSoftmaxLayer is created if available --- include/caffe/loss_layers.hpp | 5 ++--- src/caffe/layers/softmax_loss_layer.cpp | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 13b108afd2d..435013646a9 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -697,8 +697,7 @@ template <typename Dtype> class SoftmaxWithLossLayer : public LossLayer<Dtype> { public: explicit SoftmaxWithLossLayer(const LayerParameter& param) - : LossLayer<Dtype>(param), - softmax_layer_(new SoftmaxLayer<Dtype>(param)) {} + : LossLayer<Dtype>(param) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, @@ -751,7 +750,7 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); /// The internal SoftmaxLayer used to map predictions to a distribution. - shared_ptr<SoftmaxLayer<Dtype> > softmax_layer_; + shared_ptr<Layer<Dtype> > softmax_layer_; /// prob stores the output probability predictions from the SoftmaxLayer. Blob<Dtype> prob_; /// bottom vector holder used in call to the underlying SoftmaxLayer::Forward diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index db8dd8bb626..dfc41d2da15 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -3,6 +3,7 @@ #include <vector> #include "caffe/layer.hpp" +#include "caffe/layer_factory.hpp" #include "caffe/util/math_functions.hpp" #include "caffe/vision_layers.hpp" @@ -12,6 +13,9 @@ template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::LayerSetUp( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::LayerSetUp(bottom, top); + LayerParameter softmax_param(this->layer_param_); + softmax_param.set_type(LayerParameter_LayerType_SOFTMAX); + softmax_layer_.reset(LayerRegistry<Dtype>::CreateLayer(softmax_param)); softmax_bottom_vec_.clear(); softmax_bottom_vec_.push_back(bottom[0]); softmax_top_vec_.clear(); From daa4c5bd7bf02c21e82b1522ca44b2b6049010b5 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sun, 2 Nov 2014 01:56:19 -0800 Subject: [PATCH 1062/2053] hdf5_save_nd_dataset takes a const string& (instead of const string) --- include/caffe/util/io.hpp | 10 +++++----- src/caffe/util/io.cpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index 9c0b4872af6..a01f917abf5 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -150,17 +150,17 @@ void CVMatToDatum(const cv::Mat& cv_img, Datum* datum); template <typename Dtype> void hdf5_load_nd_dataset_helper( - hid_t file_id, const char* dataset_name_, int min_dim, int max_dim, - Blob<Dtype>* blob); + hid_t file_id, const char* dataset_name_, int min_dim, int max_dim, + Blob<Dtype>* blob); template <typename Dtype> void hdf5_load_nd_dataset( - hid_t file_id, const char* dataset_name_, int min_dim, int max_dim, - Blob<Dtype>* blob); + hid_t file_id, const char* dataset_name_, int min_dim, int max_dim, + Blob<Dtype>* blob); template <typename Dtype> void hdf5_save_nd_dataset( - const hid_t file_id, const string dataset_name, const Blob<Dtype>& blob); + const hid_t file_id, const string& dataset_name, const Blob<Dtype>& blob); } // namespace caffe diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index 6fa6e68010e..f738e053e86 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -256,7 +256,7 @@ void hdf5_load_nd_dataset<double>(hid_t file_id, const char* dataset_name_, template <> void hdf5_save_nd_dataset<float>( - const hid_t file_id, const string dataset_name, const Blob<float>& blob) { + const hid_t file_id, const string& dataset_name, const Blob<float>& blob) { hsize_t dims[HDF5_NUM_DIMS]; dims[0] = blob.num(); dims[1] = blob.channels(); @@ -269,7 +269,7 @@ void hdf5_save_nd_dataset<float>( template <> void hdf5_save_nd_dataset<double>( - const hid_t file_id, const string dataset_name, const Blob<double>& blob) { + const hid_t file_id, const string& dataset_name, const Blob<double>& blob) { hsize_t dims[HDF5_NUM_DIMS]; dims[0] = blob.num(); dims[1] = blob.channels(); From f4b386537e21ffa6fe128fd8ffd465b5eddc6dee Mon Sep 17 00:00:00 2001 From: Xianjie Chen <xianjiec@gmail.com> Date: Thu, 22 Jan 2015 19:27:24 -0800 Subject: [PATCH 1063/2053] fix bugs by adding const --- matlab/caffe/matcaffe.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index 3de0f02e1eb..0ab0b00eb23 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -52,7 +52,7 @@ static int init_key = -2; // input and outputs a cell array. static mxArray* do_forward(const mxArray* const bottom) { - vector<Blob<float>*>& input_blobs = net_->input_blobs(); + const vector<Blob<float>*>& input_blobs = net_->input_blobs(); if (static_cast<unsigned int>(mxGetDimensions(bottom)[0]) != input_blobs.size()) { mex_error("Invalid input size"); @@ -112,8 +112,8 @@ static mxArray* do_forward(const mxArray* const bottom) { } static mxArray* do_backward(const mxArray* const top_diff) { - vector<Blob<float>*>& output_blobs = net_->output_blobs(); - vector<Blob<float>*>& input_blobs = net_->input_blobs(); + const vector<Blob<float>*>& output_blobs = net_->output_blobs(); + const vector<Blob<float>*>& input_blobs = net_->input_blobs(); if (static_cast<unsigned int>(mxGetDimensions(top_diff)[0]) != output_blobs.size()) { mex_error("Invalid input size"); From c44bfb38fb207ff7d5814356c199651b2c18ab88 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 22 Jan 2015 19:54:57 -0800 Subject: [PATCH 1064/2053] [fix] align pytest for solver with #1728 --- python/caffe/test/test_solver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/caffe/test/test_solver.py b/python/caffe/test/test_solver.py index b78c91f9978..832b75c3219 100644 --- a/python/caffe/test/test_solver.py +++ b/python/caffe/test/test_solver.py @@ -17,7 +17,7 @@ def setUp(self): display: 100 max_iter: 100 snapshot_after_train: false""") f.close() self.solver = caffe.SGDSolver(f.name) - self.solver.net.set_mode_cpu() + caffe.set_mode_cpu() # fill in valid labels self.solver.net.blobs['label'].data[...] = \ np.random.randint(self.num_output, From 47d7cb7b20a7fc4563423ae669c5237e20670206 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 23 Jan 2015 22:46:53 -0800 Subject: [PATCH 1065/2053] drop dump_network tool Nets are better serialized as a single binaryproto or saved however desired through the Python and MATLAB interfaces. --- tools/dump_network.cpp | 82 ------------------------------------------ 1 file changed, 82 deletions(-) delete mode 100644 tools/dump_network.cpp diff --git a/tools/dump_network.cpp b/tools/dump_network.cpp deleted file mode 100644 index 9cb996ef612..00000000000 --- a/tools/dump_network.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// This program takes in a trained network and an input blob, and then dumps -// all the intermediate blobs produced by the net to individual binary -// files stored in protobuffer binary formats. -// Usage: -// dump_network input_net_param trained_net_param -// input_blob output_prefix 0/1 -// if input_net_param is 'none', we will directly load the network from -// trained_net_param. If the last argv is 1, we will do a forward-backward pass -// before dumping everyting, and also dump the who network. - -#include <string> -#include <vector> - -#include "fcntl.h" -#include "google/protobuf/text_format.h" - -#include "caffe/blob.hpp" -#include "caffe/common.hpp" -#include "caffe/filler.hpp" -#include "caffe/net.hpp" -#include "caffe/proto/caffe.pb.h" -#include "caffe/solver.hpp" -#include "caffe/util/io.hpp" - -using boost::shared_ptr; -using caffe::Blob; -using caffe::BlobProto; -using caffe::Caffe; -using caffe::Net; -using caffe::NetParameter; - -int main(int argc, char** argv) { - Caffe::set_mode(Caffe::GPU); - Caffe::set_phase(Caffe::TEST); - - shared_ptr<Net<float> > caffe_net; - if (strcmp(argv[1], "none") == 0) { - // We directly load the net param from trained file - caffe_net.reset(new Net<float>(argv[2])); - } else { - caffe_net.reset(new Net<float>(argv[1])); - } - caffe_net->CopyTrainedLayersFrom(argv[2]); - - std::vector<Blob<float>* > input_vec; - shared_ptr<Blob<float> > input_blob(new Blob<float>()); - if (strcmp(argv[3], "none") != 0) { - BlobProto input_blob_proto; - ReadProtoFromBinaryFile(argv[3], &input_blob_proto); - input_blob->FromProto(input_blob_proto); - input_vec.push_back(input_blob.get()); - } - - std::string output_prefix(argv[4]); - // Run the network without training. - LOG(ERROR) << "Performing Forward"; - caffe_net->Forward(input_vec); - if (argc > 5 && strcmp(argv[5], "1") == 0) { - LOG(ERROR) << "Performing Backward"; - Caffe::set_phase(Caffe::TRAIN); - caffe_net->Backward(); - // Dump the network - NetParameter output_net_param; - caffe_net->ToProto(&output_net_param, true); - WriteProtoToBinaryFile(output_net_param, - output_prefix + output_net_param.name()); - } - // Now, let's dump all the layers - - const std::vector<std::string>& blob_names = caffe_net->blob_names(); - const std::vector<shared_ptr<Blob<float> > >& blobs = caffe_net->blobs(); - for (int blobid = 0; blobid < caffe_net->blobs().size(); ++blobid) { - // Serialize blob - LOG(ERROR) << "Dumping " << blob_names[blobid]; - BlobProto output_blob_proto; - blobs[blobid]->ToProto(&output_blob_proto); - WriteProtoToBinaryFile(output_blob_proto, - output_prefix + blob_names[blobid]); - } - - return 0; -} From 2f869e7426e47d5123ee399704ff386bfdee8387 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sat, 24 Jan 2015 18:27:15 -0800 Subject: [PATCH 1066/2053] clarify draw_net.py usage: net prototxt, not caffemodel --- python/draw_net.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/draw_net.py b/python/draw_net.py index ba488294275..abf701572a2 100755 --- a/python/draw_net.py +++ b/python/draw_net.py @@ -11,7 +11,7 @@ def main(argv): if len(argv) != 3: - print 'Usage: %s input_net_proto_file output_image_file' % \ + print 'Usage: %s input_net_prototxt output_image_file' % \ os.path.basename(sys.argv[0]) else: net = caffe_pb2.NetParameter() From 61c63f6d1ed4cd6a3c4b4d9229497fc89c5ef662 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sat, 24 Jan 2015 18:28:46 -0800 Subject: [PATCH 1067/2053] [docs] ask install + hardware questions on caffe-users --- docs/installation.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/installation.md b/docs/installation.md index a42ef5b309c..16e319b4392 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -11,6 +11,8 @@ We have installed Caffe on Ubuntu 14.04, Ubuntu 12.04, OS X 10.9, and OS X 10.8. - [Compilation](#compilation) - [Hardware questions](#hardware_questions) +Ask installation questions on the [caffe-users](https://groups.google.com/forum/#!forum/caffe-users) mailing list. + ## Prerequisites Caffe depends on several software packages. @@ -299,4 +301,4 @@ As a workaround, if you are using Ubuntu 12.04 you can try the following steps t Once installed, check your times against our [reference performance numbers](performance_hardware.html) to make sure everything is configured properly. -Refer to the project's issue tracker for [hardware/compatibility](https://github.com/BVLC/caffe/issues?labels=hardware%2Fcompatibility&page=1&state=open). +Ask hardware questions on the [caffe-users](https://groups.google.com/forum/#!forum/caffe-users) mailing list. From d33fffbd229ad29e06fa294356c4526ea2e82987 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sun, 25 Jan 2015 16:04:51 -0800 Subject: [PATCH 1068/2053] [example] lenet early stopping -> mnist examples --- examples/{lenet => mnist}/lenet_stepearly_solver.prototxt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/{lenet => mnist}/lenet_stepearly_solver.prototxt (100%) diff --git a/examples/lenet/lenet_stepearly_solver.prototxt b/examples/mnist/lenet_stepearly_solver.prototxt similarity index 100% rename from examples/lenet/lenet_stepearly_solver.prototxt rename to examples/mnist/lenet_stepearly_solver.prototxt From 47e8831ac09c82fb210e8d032a2f770499619540 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sun, 25 Jan 2015 20:37:52 -0800 Subject: [PATCH 1069/2053] [pycaffe] de-dupe imports --- python/caffe/__init__.py | 4 ++-- python/caffe/pycaffe.py | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/python/caffe/__init__.py b/python/caffe/__init__.py index 8dd2464d1c4..acdfc071032 100644 --- a/python/caffe/__init__.py +++ b/python/caffe/__init__.py @@ -1,6 +1,6 @@ from .pycaffe import Net, SGDSolver -from .pycaffe import set_mode_cpu, set_mode_gpu, set_phase_train, set_phase_test -from .pycaffe import set_device +from ._caffe import set_mode_cpu, set_mode_gpu, set_device, \ + set_phase_train, set_phase_test from .classifier import Classifier from .detector import Detector import io diff --git a/python/caffe/pycaffe.py b/python/caffe/pycaffe.py index 8899309ddfd..31dc1f9b001 100644 --- a/python/caffe/pycaffe.py +++ b/python/caffe/pycaffe.py @@ -8,8 +8,6 @@ import numpy as np from ._caffe import Net, SGDSolver -from ._caffe import set_mode_cpu, set_mode_gpu, set_phase_train, set_phase_test -from ._caffe import set_device import caffe.io # We directly update methods from Net here (rather than using composition or From 408133ce4139a95960577e8d36daa16e9dd9e03a Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 27 Jan 2015 10:45:41 -0800 Subject: [PATCH 1070/2053] document DeconvolutionLayer --- include/caffe/vision_layers.hpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 646378dea9f..fc178e4c904 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -16,6 +16,10 @@ namespace caffe { +/** + * @brief Abstract base class that factors out the BLAS code common to + * ConvolutionLayer and DeconvolutionLayer. + */ template <typename Dtype> class BaseConvolutionLayer : public Layer<Dtype> { public: @@ -173,6 +177,20 @@ class ConvolutionLayer : public BaseConvolutionLayer<Dtype> { virtual void compute_output_shape(); }; +/** + * @brief Convolve the input with a bank of learned filters, and (optionally) + * add biases, treating filters and convolution parameters in the + * opposite sense as ConvolutionLayer. + * + * ConvolutionLayer computes each output value by dotting an input window with + * a filter; DeconvolutionLayer multiplies each input value by a filter + * elementwise, and sums over the resulting output windows. In other words, + * DeconvolutionLayer is ConvolutionLayer with the forward and backward passes + * reversed. DeconvolutionLayer reuses ConvolutionParameter for its + * parameters, but they take the opposite sense as in ConvolutionLayer (so + * padding is removed from the output rather than added to the input, and + * stride results in upsampling rather than downsampling). + */ template <typename Dtype> class DeconvolutionLayer : public BaseConvolutionLayer<Dtype> { public: From 25c2e3fdc7a27ec00893bd0335ac42e53ff2c7aa Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 27 Jan 2015 12:24:39 -0800 Subject: [PATCH 1071/2053] [test] simple test for DeconvolutionLayer --- src/caffe/test/test_deconvolution_layer.cpp | 158 ++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 src/caffe/test/test_deconvolution_layer.cpp diff --git a/src/caffe/test/test_deconvolution_layer.cpp b/src/caffe/test/test_deconvolution_layer.cpp new file mode 100644 index 00000000000..fc63d5efbe3 --- /dev/null +++ b/src/caffe/test/test_deconvolution_layer.cpp @@ -0,0 +1,158 @@ +#include <cstring> +#include <vector> + +#include "gtest/gtest.h" + +#include "caffe/blob.hpp" +#include "caffe/common.hpp" +#include "caffe/filler.hpp" +#include "caffe/vision_layers.hpp" + +#include "caffe/test/test_caffe_main.hpp" +#include "caffe/test/test_gradient_check_util.hpp" + +namespace caffe { + +// Since ConvolutionLayerTest checks the shared conv/deconv code in detail, +// we'll just do a simple forward test and a gradient check. +template <typename TypeParam> +class DeconvolutionLayerTest : public MultiDeviceTest<TypeParam> { + typedef typename TypeParam::Dtype Dtype; + + protected: + DeconvolutionLayerTest() + : blob_bottom_(new Blob<Dtype>(2, 3, 6, 4)), + blob_bottom_2_(new Blob<Dtype>(2, 3, 6, 4)), + blob_top_(new Blob<Dtype>()), + blob_top_2_(new Blob<Dtype>()) {} + virtual void SetUp() { + // fill the values + FillerParameter filler_param; + filler_param.set_value(1.); + GaussianFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_bottom_); + filler.Fill(this->blob_bottom_2_); + blob_bottom_vec_.push_back(blob_bottom_); + blob_top_vec_.push_back(blob_top_); + } + + virtual ~DeconvolutionLayerTest() { + delete blob_bottom_; + delete blob_bottom_2_; + delete blob_top_; + delete blob_top_2_; + } + + Blob<Dtype>* const blob_bottom_; + Blob<Dtype>* const blob_bottom_2_; + Blob<Dtype>* const blob_top_; + Blob<Dtype>* const blob_top_2_; + vector<Blob<Dtype>*> blob_bottom_vec_; + vector<Blob<Dtype>*> blob_top_vec_; +}; + +TYPED_TEST_CASE(DeconvolutionLayerTest, TestDtypesAndDevices); + +TYPED_TEST(DeconvolutionLayerTest, TestSetup) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_size(3); + convolution_param->set_stride(2); + convolution_param->set_num_output(4); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); + shared_ptr<Layer<Dtype> > layer( + new DeconvolutionLayer<Dtype>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + EXPECT_EQ(this->blob_top_->num(), 2); + EXPECT_EQ(this->blob_top_->channels(), 4); + EXPECT_EQ(this->blob_top_->height(), 13); + EXPECT_EQ(this->blob_top_->width(), 9); + EXPECT_EQ(this->blob_top_2_->num(), 2); + EXPECT_EQ(this->blob_top_2_->channels(), 4); + EXPECT_EQ(this->blob_top_2_->height(), 13); + EXPECT_EQ(this->blob_top_2_->width(), 9); + // setting group should not change the shape + convolution_param->set_num_output(3); + convolution_param->set_group(3); + layer.reset(new DeconvolutionLayer<Dtype>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + EXPECT_EQ(this->blob_top_->num(), 2); + EXPECT_EQ(this->blob_top_->channels(), 3); + EXPECT_EQ(this->blob_top_->height(), 13); + EXPECT_EQ(this->blob_top_->width(), 9); + EXPECT_EQ(this->blob_top_2_->num(), 2); + EXPECT_EQ(this->blob_top_2_->channels(), 3); + EXPECT_EQ(this->blob_top_2_->height(), 13); + EXPECT_EQ(this->blob_top_2_->width(), 9); +} + +TYPED_TEST(DeconvolutionLayerTest, TestSimpleDeconvolution) { + typedef typename TypeParam::Dtype Dtype; + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + convolution_param->set_kernel_size(3); + convolution_param->set_stride(2); + convolution_param->set_num_output(4); + convolution_param->mutable_weight_filler()->set_type("constant"); + convolution_param->mutable_weight_filler()->set_value(1); + convolution_param->mutable_bias_filler()->set_type("constant"); + convolution_param->mutable_bias_filler()->set_value(0.1); + shared_ptr<Layer<Dtype> > layer( + new DeconvolutionLayer<Dtype>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + // constant-fill the bottom blobs + FillerParameter filler_param; + filler_param.set_value(1.); + ConstantFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_bottom_); + filler.Fill(this->blob_bottom_2_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); + // simply check that accumulation works with overlapping filters + const Dtype* top_data = this->blob_top_->cpu_data(); + for (int n = 0; n < this->blob_top_->num(); ++n) { + for (int c = 0; c < this->blob_top_->channels(); ++c) { + for (int h = 0; h < this->blob_top_->height(); ++h) { + for (int w = 0; w < this->blob_top_->width(); ++w) { + Dtype expected = 3.1; + bool h_overlap = h % 2 == 0 && h > 0 + && h < this->blob_top_->height() - 1; + bool w_overlap = w % 2 == 0 && w > 0 + && w < this->blob_top_->width() - 1; + if (h_overlap && w_overlap) { + expected += 9; + } else if (h_overlap || w_overlap) { + expected += 3; + } + EXPECT_NEAR(top_data[this->blob_top_->offset(n, c, h, w)], + expected, 1e-4); + } + } + } + } +} + +TYPED_TEST(DeconvolutionLayerTest, TestGradient) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + ConvolutionParameter* convolution_param = + layer_param.mutable_convolution_param(); + this->blob_bottom_vec_.push_back(this->blob_bottom_2_); + this->blob_top_vec_.push_back(this->blob_top_2_); + convolution_param->set_kernel_size(2); + convolution_param->set_stride(1); + convolution_param->set_num_output(1); + convolution_param->mutable_weight_filler()->set_type("gaussian"); + convolution_param->mutable_bias_filler()->set_type("gaussian"); + DeconvolutionLayer<Dtype> layer(layer_param); + GradientChecker<Dtype> checker(1e-2, 1e-3); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_); +} + +} // namespace caffe From 41b754c4e2154f40952d123599f9fa04eda0c3e3 Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 27 Jan 2015 13:09:32 -0800 Subject: [PATCH 1072/2053] document the loss_param options to SoftmaxWithLossLayer --- include/caffe/loss_layers.hpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 321f7068273..ca91579d51c 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -696,6 +696,14 @@ template <typename Dtype> class SoftmaxLayer; template <typename Dtype> class SoftmaxWithLossLayer : public LossLayer<Dtype> { public: + /** + * @param param provides LossParameter loss_param, with options: + * - ignore_label (optional) + * Specify a label value that should be ignored when computing the loss. + * - normalize (optional, default true) + * If true, the loss is normalized by the number of (nonignored) labels + * present; otherwise the loss is simply summed over spatial locations. + */ explicit SoftmaxWithLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param), softmax_layer_(new SoftmaxLayer<Dtype>(param)) {} From f1eada76b40729d379669480b6db60eb7e01f6ce Mon Sep 17 00:00:00 2001 From: Jonathan L Long <jonlong@cs.berkeley.edu> Date: Tue, 27 Jan 2015 13:27:48 -0800 Subject: [PATCH 1073/2053] [test] gradient checks for softmax ignore_label and normalize: false --- .../test/test_softmax_with_loss_layer.cpp | 48 ++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/caffe/test/test_softmax_with_loss_layer.cpp b/src/caffe/test/test_softmax_with_loss_layer.cpp index badda3b5503..1498d5c5ce1 100644 --- a/src/caffe/test/test_softmax_with_loss_layer.cpp +++ b/src/caffe/test/test_softmax_with_loss_layer.cpp @@ -3,6 +3,7 @@ #include <cstring> #include <vector> +#include "boost/scoped_ptr.hpp" #include "gtest/gtest.h" #include "caffe/blob.hpp" @@ -13,6 +14,8 @@ #include "caffe/test/test_caffe_main.hpp" #include "caffe/test/test_gradient_check_util.hpp" +using boost::scoped_ptr; + namespace caffe { template <typename TypeParam> @@ -50,7 +53,6 @@ class SoftmaxWithLossLayerTest : public MultiDeviceTest<TypeParam> { TYPED_TEST_CASE(SoftmaxWithLossLayerTest, TestDtypesAndDevices); - TYPED_TEST(SoftmaxWithLossLayerTest, TestGradient) { typedef typename TypeParam::Dtype Dtype; LayerParameter layer_param; @@ -61,4 +63,48 @@ TYPED_TEST(SoftmaxWithLossLayerTest, TestGradient) { this->blob_top_vec_, 0); } +TYPED_TEST(SoftmaxWithLossLayerTest, TestForwardIgnoreLabel) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.mutable_loss_param()->set_normalize(false); + // First, compute the loss with all labels + scoped_ptr<SoftmaxWithLossLayer<Dtype> > layer( + new SoftmaxWithLossLayer<Dtype>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); + Dtype full_loss = this->blob_top_loss_->cpu_data()[0]; + // Now, accumulate the loss, ignoring each label in {0, ..., 4} in turn. + Dtype accum_loss = 0; + for (int label = 0; label < 5; ++label) { + layer_param.mutable_loss_param()->set_ignore_label(label); + layer.reset(new SoftmaxWithLossLayer<Dtype>(layer_param)); + layer->SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + layer->Forward(this->blob_bottom_vec_, this->blob_top_vec_); + accum_loss += this->blob_top_loss_->cpu_data()[0]; + } + // Check that each label was included all but once. + EXPECT_NEAR(4 * full_loss, accum_loss, 1e-4); +} + +TYPED_TEST(SoftmaxWithLossLayerTest, TestGradientIgnoreLabel) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + // labels are in {0, ..., 4}, so we'll ignore about a fifth of them + layer_param.mutable_loss_param()->set_ignore_label(0); + SoftmaxWithLossLayer<Dtype> layer(layer_param); + GradientChecker<Dtype> checker(1e-2, 1e-2, 1701); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); +} + +TYPED_TEST(SoftmaxWithLossLayerTest, TestGradientUnnormalized) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter layer_param; + layer_param.mutable_loss_param()->set_normalize(false); + SoftmaxWithLossLayer<Dtype> layer(layer_param); + GradientChecker<Dtype> checker(1e-2, 1e-2, 1701); + checker.CheckGradientExhaustive(&layer, this->blob_bottom_vec_, + this->blob_top_vec_, 0); +} + } // namespace caffe From 4cc8195d82f13391545b90c9c61baaca39b6df84 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 29 Jan 2015 09:26:12 -0800 Subject: [PATCH 1074/2053] [docs] send API link to class list --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index ccc8f750eef..bf1d9c3c78b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -46,7 +46,7 @@ Tested on Ubuntu, Red Hat, OS X. BVLC suggests a standard distribution format for Caffe models, and provides trained models. * [Developing & Contributing](/development.html)<br> Guidelines for development and contributing to Caffe. -* [API Documentation](/doxygen/)<br> +* [API Documentation](/doxygen/annotated.html)<br> Developer documentation automagically generated from code comments. ### Examples From 1f7c3dea034ef19acd1addf5aa8f4c2b94bc358c Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 29 Jan 2015 10:53:44 -0800 Subject: [PATCH 1075/2053] [docs] add check mode hint to CPU-only mode error --- include/caffe/util/device_alternate.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index 3df28a49ac3..1a33b947991 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -7,7 +7,7 @@ // Stub out GPU calls as unavailable. -#define NO_GPU LOG(FATAL) << "CPU-only Mode: cannot make GPU call." +#define NO_GPU LOG(FATAL) << "Cannot make GPU call in CPU-only mode: check mode setting." #define STUB_GPU(classname) \ template <typename Dtype> \ From 2a43133ce73678d633d68be4907a26a044e84176 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 24 Sep 2014 15:52:14 -0700 Subject: [PATCH 1076/2053] Enhancements for debug_info to display more information. Now displays for: -net inputs -test nets -params in ForwardDebugInfo --- include/caffe/net.hpp | 3 +++ src/caffe/net.cpp | 26 ++++++++++++++++++++++++++ src/caffe/solver.cpp | 1 + 3 files changed, 30 insertions(+) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index bbb220eb00d..2709d87ec4e 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -194,6 +194,8 @@ class Net { void AppendParam(const NetParameter& param, const int layer_id, const int param_id); + /// @brief Helper for displaying debug info in Forward about input Blobs. + void InputDebugInfo(const int layer_id); /// @brief Helper for displaying debug info in Forward. void ForwardDebugInfo(const int layer_id); /// @brief Helper for displaying debug info in Backward. @@ -226,6 +228,7 @@ class Net { /// Vector of weight in the loss (or objective) function of each net blob, /// indexed by blob_id. vector<Dtype> blob_loss_weights_; + vector<vector<int> > param_id_vecs_; vector<int> param_owners_; vector<string> param_display_names_; vector<pair<int, int> > param_layer_indices_; diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 47fc8446064..692351fb7d2 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -58,6 +58,7 @@ void Net<Dtype>::Init(const NetParameter& in_param) { bottom_vecs_.resize(param.layers_size()); top_vecs_.resize(param.layers_size()); bottom_id_vecs_.resize(param.layers_size()); + param_id_vecs_.resize(param.layers_size()); top_id_vecs_.resize(param.layers_size()); bottom_need_backward_.resize(param.layers_size()); for (int layer_id = 0; layer_id < param.layers_size(); ++layer_id) { @@ -416,6 +417,7 @@ void Net<Dtype>::AppendParam(const NetParameter& param, const int layer_id, } const int net_param_id = params_.size(); params_.push_back(layers_[layer_id]->blobs()[param_id]); + param_id_vecs_[layer_id].push_back(net_param_id); param_layer_indices_.push_back(make_pair(layer_id, param_id)); if (!param_size || !param_name.size() || (param_name.size() && param_names_index_.find(param_name) == param_names_index_.end())) { @@ -503,6 +505,11 @@ Dtype Net<Dtype>::ForwardFromTo(int start, int end) { CHECK_GE(start, 0); CHECK_LT(end, layers_.size()); Dtype loss = 0; + if (debug_info_) { + for (int i = 0; i < net_input_blobs_.size(); ++i) { + InputDebugInfo(i); + } + } for (int i = start; i <= end; ++i) { // LOG(ERROR) << "Forwarding " << layer_names_[i]; layers_[i]->Reshape(bottom_vecs_[i], top_vecs_[i]); @@ -577,6 +584,15 @@ void Net<Dtype>::BackwardFromTo(int start, int end) { } } +template <typename Dtype> +void Net<Dtype>::InputDebugInfo(const int input_id) { + const Blob<Dtype>& blob = *net_input_blobs_[input_id]; + const string& blob_name = blob_names_[net_input_blob_indices_[input_id]]; + const Dtype data_abs_val_mean = blob.asum_data() / blob.count(); + LOG(INFO) << " [Forward] " + << "Input " << blob_name << " data: " << data_abs_val_mean; +} + template <typename Dtype> void Net<Dtype>::ForwardDebugInfo(const int layer_id) { for (int top_id = 0; top_id < top_vecs_[layer_id].size(); ++top_id) { @@ -587,6 +603,16 @@ void Net<Dtype>::ForwardDebugInfo(const int layer_id) { << "Layer " << layer_names_[layer_id] << ", top blob " << blob_name << " data: " << data_abs_val_mean; } + for (int param_id = 0; param_id < layers_[layer_id]->blobs().size(); + ++param_id) { + const Blob<Dtype>& blob = *layers_[layer_id]->blobs()[param_id]; + const int net_param_id = param_id_vecs_[layer_id][param_id]; + const string& blob_name = param_display_names_[net_param_id]; + const Dtype data_abs_val_mean = blob.asum_data() / blob.count(); + LOG(INFO) << " [Forward] " + << "Layer " << layer_names_[layer_id] << ", param blob " << blob_name + << " data: " << data_abs_val_mean; + } } template <typename Dtype> diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 3fa0e2d14b7..100cb357749 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -154,6 +154,7 @@ void Solver<Dtype>::InitTestNets() { LOG(INFO) << "Creating test net (#" << i << ") specified by " << sources[i]; test_nets_[i].reset(new Net<Dtype>(net_params[i])); + test_nets_[i]->set_debug_info(param_.debug_info()); } } From cfaadf61a5f082ee396354b51aa7fd8dda745750 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 6 Oct 2014 23:08:38 -0700 Subject: [PATCH 1077/2053] Blob: add sumsq_{data,diff} methods --- include/caffe/blob.hpp | 4 +++ src/caffe/blob.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index ef10aea53f0..d425e3857e3 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -106,6 +106,10 @@ class Blob { Dtype asum_data() const; /// @brief Compute the sum of absolute values (L1 norm) of the diff. Dtype asum_diff() const; + /// @brief Compute the sum of squares (L2 norm squared) of the data. + Dtype sumsq_data() const; + /// @brief Compute the sum of squares (L2 norm squared) of the diff. + Dtype sumsq_diff() const; /** * @brief Set the data_ shared_ptr to point to the SyncedMemory holding the diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index cfffc379eb1..3b72ce0c8d0 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -205,6 +205,80 @@ Dtype Blob<Dtype>::asum_diff() const { return 0; } +template <> unsigned int Blob<unsigned int>::sumsq_data() const { + NOT_IMPLEMENTED; + return 0; +} + +template <> int Blob<int>::sumsq_data() const { + NOT_IMPLEMENTED; + return 0; +} + +template <typename Dtype> +Dtype Blob<Dtype>::sumsq_data() const { + Dtype sumsq; + const Dtype* data; + if (!data_) { return 0; } + switch (data_->head()) { + case SyncedMemory::HEAD_AT_CPU: + data = cpu_data(); + sumsq = caffe_cpu_dot(count_, data, data); + break; + case SyncedMemory::HEAD_AT_GPU: + case SyncedMemory::SYNCED: +#ifndef CPU_ONLY + data = gpu_data(); + caffe_gpu_dot(count_, data, data, &sumsq); +#else + NO_GPU; +#endif + break; + case SyncedMemory::UNINITIALIZED: + return 0; + default: + LOG(FATAL) << "Unknown SyncedMemory head state: " << data_->head(); + } + return sumsq; +} + +template <> unsigned int Blob<unsigned int>::sumsq_diff() const { + NOT_IMPLEMENTED; + return 0; +} + +template <> int Blob<int>::sumsq_diff() const { + NOT_IMPLEMENTED; + return 0; +} + +template <typename Dtype> +Dtype Blob<Dtype>::sumsq_diff() const { + Dtype sumsq; + const Dtype* diff; + if (!diff_) { return 0; } + switch (diff_->head()) { + case SyncedMemory::HEAD_AT_CPU: + diff = cpu_diff(); + sumsq = caffe_cpu_dot(count_, diff, diff); + break; + case SyncedMemory::HEAD_AT_GPU: + case SyncedMemory::SYNCED: +#ifndef CPU_ONLY + diff = gpu_diff(); + caffe_gpu_dot(count_, diff, diff, &sumsq); + break; +#else + NO_GPU; +#endif + case SyncedMemory::UNINITIALIZED: + return 0; + default: + LOG(FATAL) << "Unknown SyncedMemory head state: " << data_->head(); + } + return sumsq; +} + template <typename Dtype> void Blob<Dtype>::CopyFrom(const Blob& source, bool copy_diff, bool reshape) { if (num_ != source.num() || channels_ != source.channels() || From 705abfa69f242c4345372e06e3686c3887890dd3 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 29 Jan 2015 19:07:12 -0800 Subject: [PATCH 1078/2053] Add BlobMathTest with unit tests for sumsq and asum --- src/caffe/test/test_blob.cpp | 113 +++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/src/caffe/test/test_blob.cpp b/src/caffe/test/test_blob.cpp index adf7a4d38e9..c619ad19f11 100644 --- a/src/caffe/test/test_blob.cpp +++ b/src/caffe/test/test_blob.cpp @@ -54,4 +54,117 @@ TYPED_TEST(BlobSimpleTest, TestReshape) { EXPECT_EQ(this->blob_->count(), 120); } +template <typename TypeParam> +class BlobMathTest : public MultiDeviceTest<TypeParam> { + typedef typename TypeParam::Dtype Dtype; + protected: + BlobMathTest() + : blob_(new Blob<Dtype>(2, 3, 4, 5)) {} + virtual ~BlobMathTest() { delete blob_; } + Blob<Dtype>* const blob_; +}; + +TYPED_TEST_CASE(BlobMathTest, TestDtypesAndDevices); + +TYPED_TEST(BlobMathTest, TestSumOfSquares) { + typedef typename TypeParam::Dtype Dtype; + + // Uninitialized Blob should have sum of squares == 0. + EXPECT_EQ(0, this->blob_->sumsq_data()); + EXPECT_EQ(0, this->blob_->sumsq_diff()); + FillerParameter filler_param; + filler_param.set_min(-3); + filler_param.set_max(3); + UniformFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_); + Dtype expected_sumsq = 0; + const Dtype* data = this->blob_->cpu_data(); + for (int i = 0; i < this->blob_->count(); ++i) { + expected_sumsq += data[i] * data[i]; + } + // Do a mutable access on the current device, + // so that the sumsq computation is done on that device. + // (Otherwise, this would only check the CPU sumsq implementation.) + switch (TypeParam::device) { + case Caffe::CPU: + this->blob_->mutable_cpu_data(); + break; + case Caffe::GPU: + this->blob_->mutable_gpu_data(); + break; + default: + LOG(FATAL) << "Unknown device: " << TypeParam::device; + } + EXPECT_FLOAT_EQ(expected_sumsq, this->blob_->sumsq_data()); + EXPECT_EQ(0, this->blob_->sumsq_diff()); + + // Check sumsq_diff too. + const Dtype kDiffScaleFactor = 7; + caffe_cpu_scale(this->blob_->count(), kDiffScaleFactor, data, + this->blob_->mutable_cpu_diff()); + switch (TypeParam::device) { + case Caffe::CPU: + this->blob_->mutable_cpu_diff(); + break; + case Caffe::GPU: + this->blob_->mutable_gpu_diff(); + break; + default: + LOG(FATAL) << "Unknown device: " << TypeParam::device; + } + EXPECT_FLOAT_EQ(expected_sumsq, this->blob_->sumsq_data()); + EXPECT_FLOAT_EQ(expected_sumsq * kDiffScaleFactor * kDiffScaleFactor, + this->blob_->sumsq_diff()); +} + +TYPED_TEST(BlobMathTest, TestAsum) { + typedef typename TypeParam::Dtype Dtype; + + // Uninitialized Blob should have sum of squares == 0. + EXPECT_EQ(0, this->blob_->asum_data()); + EXPECT_EQ(0, this->blob_->asum_diff()); + FillerParameter filler_param; + filler_param.set_min(-3); + filler_param.set_max(3); + UniformFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_); + Dtype expected_asum = 0; + const Dtype* data = this->blob_->cpu_data(); + for (int i = 0; i < this->blob_->count(); ++i) { + expected_asum += std::fabs(data[i]); + } + // Do a mutable access on the current device, + // so that the asum computation is done on that device. + // (Otherwise, this would only check the CPU asum implementation.) + switch (TypeParam::device) { + case Caffe::CPU: + this->blob_->mutable_cpu_data(); + break; + case Caffe::GPU: + this->blob_->mutable_gpu_data(); + break; + default: + LOG(FATAL) << "Unknown device: " << TypeParam::device; + } + EXPECT_FLOAT_EQ(expected_asum, this->blob_->asum_data()); + EXPECT_EQ(0, this->blob_->asum_diff()); + + // Check asum_diff too. + const Dtype kDiffScaleFactor = 7; + caffe_cpu_scale(this->blob_->count(), kDiffScaleFactor, data, + this->blob_->mutable_cpu_diff()); + switch (TypeParam::device) { + case Caffe::CPU: + this->blob_->mutable_cpu_diff(); + break; + case Caffe::GPU: + this->blob_->mutable_gpu_diff(); + break; + default: + LOG(FATAL) << "Unknown device: " << TypeParam::device; + } + EXPECT_FLOAT_EQ(expected_asum, this->blob_->asum_data()); + EXPECT_FLOAT_EQ(expected_asum * kDiffScaleFactor, this->blob_->asum_diff()); +} + } // namespace caffe From 91ce7c0603fad74a391eab1e7a7cc3cfedda909c Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 6 Oct 2014 23:46:05 -0700 Subject: [PATCH 1079/2053] debug_info: print param (and gradient) stats for whole Net after Backward --- src/caffe/net.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 692351fb7d2..e827a067ea1 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -705,6 +705,21 @@ void Net<Dtype>::BackwardTo(int end) { template <typename Dtype> void Net<Dtype>::Backward() { BackwardFromTo(layers_.size() - 1, 0); + if (debug_info_) { + Dtype asum_data = 0, asum_diff = 0, sumsq_data = 0, sumsq_diff = 0; + for (int i = 0; i < params_.size(); ++i) { + if (param_owners_[i] >= 0) { continue; } + asum_data += params_[i]->asum_data(); + asum_diff += params_[i]->asum_diff(); + sumsq_data += params_[i]->sumsq_data(); + sumsq_diff += params_[i]->sumsq_diff(); + } + const Dtype l2norm_data = std::sqrt(sumsq_data); + const Dtype l2norm_diff = std::sqrt(sumsq_diff); + LOG(ERROR) << " [Backward] All net params (data, diff): " + << "L1 norm = (" << asum_data << ", " << asum_diff << "); " + << "L2 norm = (" << l2norm_data << ", " << l2norm_diff << ")"; + } } template <typename Dtype> From 3519d05283424730f300742d52f617c190313824 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 19 Jan 2015 11:52:04 -0800 Subject: [PATCH 1080/2053] debug_info in NetParameter so it can be enabled outside training --- src/caffe/net.cpp | 3 +-- src/caffe/proto/caffe.proto | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index e827a067ea1..4350e056085 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -218,10 +218,9 @@ void Net<Dtype>::Init(const NetParameter& in_param) { layer_names_index_[layer_names_[layer_id]] = layer_id; } GetLearningRateAndWeightDecay(); + debug_info_ = param.debug_info(); LOG(INFO) << "Network initialization done."; LOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); - // Don't display debug info by default. - debug_info_ = false; } template <typename Dtype> diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index d6eec02087b..d65ef787a4c 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -60,6 +60,10 @@ message NetParameter { // Some layers may be included/excluded depending on this state and the states // specified in the layers' include and exclude fields. optional NetState state = 6; + + // Print debugging information about results while running Net::Forward, + // Net::Backward, and Net::Update. + optional bool debug_info = 7 [default = false]; } // NOTE From 8b9647223346a2528804cb5bc8943f2065846d7d Mon Sep 17 00:00:00 2001 From: Andre Ambrosio Boechat <boechat107@gmail.com> Date: Fri, 30 Jan 2015 13:57:31 -0200 Subject: [PATCH 1081/2053] Brief explanation of SLICE layer's attributes * A sample code was added. * `slice_dim` and `slice_point` attributes were explained. --- docs/tutorial/layers.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/tutorial/layers.md b/docs/tutorial/layers.md index 5f8f519cdc4..34bb48050e8 100644 --- a/docs/tutorial/layers.md +++ b/docs/tutorial/layers.md @@ -451,6 +451,26 @@ The `CONCAT` layer is a utility layer that concatenates its multiple input blobs The `SLICE` layer is a utility layer that slices an input layer to multiple output layers along a given dimension (currently num or channel only) with given slice indices. +* Sample + + layers { + name: "slicer_label" + type: SLICE + bottom: "label" + ## Example of label with a shape N x 3 x 1 x 1 + top: "label1" + top: "label2" + top: "label3" + slice_param { + slice_dim: 1 + slice_point: 1 + slice_point: 2 + } + } + +`slice_dim` indicates the target dimension and can assume only two values: 0 for num or 1 for channel; `slice_point` indicates indexes in the selected dimension (the number of indexes must be equal to the number of top blobs minus one). + + #### Elementwise Operations `ELTWISE` From 75d0e16be912a8dd23eddd8756ee0d278c66d6ab Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 30 Jan 2015 11:25:31 -0800 Subject: [PATCH 1082/2053] lint 1f7c3de --- include/caffe/util/device_alternate.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/util/device_alternate.hpp b/include/caffe/util/device_alternate.hpp index 1a33b947991..4d731e26199 100644 --- a/include/caffe/util/device_alternate.hpp +++ b/include/caffe/util/device_alternate.hpp @@ -7,7 +7,7 @@ // Stub out GPU calls as unavailable. -#define NO_GPU LOG(FATAL) << "Cannot make GPU call in CPU-only mode: check mode setting." +#define NO_GPU LOG(FATAL) << "Cannot use GPU in CPU-only Caffe: check mode." #define STUB_GPU(classname) \ template <typename Dtype> \ From 33348217a7546ad63a6549f3469b2c49e09f4d31 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 2 Feb 2015 09:45:51 -0800 Subject: [PATCH 1083/2053] fix GoogLeNet license overwritten by back-merge (see #1650) --- models/bvlc_googlenet/readme.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/models/bvlc_googlenet/readme.md b/models/bvlc_googlenet/readme.md index 8a3bbec4f8b..2e22dfcf59a 100644 --- a/models/bvlc_googlenet/readme.md +++ b/models/bvlc_googlenet/readme.md @@ -2,7 +2,7 @@ name: BVLC GoogleNet Model caffemodel: bvlc_googlenet.caffemodel caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel -license: non-commercial +license: unrestricted sha1: 405fc5acd08a3bb12de8ee5e23a96bec22f08204 caffe_commit: bc614d1bd91896e3faceaf40b23b72dab47d44f5 gist_id: 866e2aa1fd707b89b913 @@ -30,6 +30,4 @@ This model was trained by Sergio Guadarrama @sguada ## License -The data used to train this model comes from the ImageNet project, which distributes its database to researchers who agree to a following term of access: -"Researcher shall use the Database only for non-commercial research and educational purposes." -Accordingly, this model is distributed under a non-commercial license. +This model is released for unrestricted use. From 53924a76b66faad2831205c3694e640eccb15fb5 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 2 Feb 2015 12:38:43 -0800 Subject: [PATCH 1084/2053] add space after "Loading mean file from" --- matlab/caffe/matcaffe.cpp | 2 +- src/caffe/data_transformer.cpp | 2 +- src/caffe/layers/window_data_layer.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/matlab/caffe/matcaffe.cpp b/matlab/caffe/matcaffe.cpp index 0ab0b00eb23..fd8397e7ff2 100644 --- a/matlab/caffe/matcaffe.cpp +++ b/matlab/caffe/matcaffe.cpp @@ -343,7 +343,7 @@ static void read_mean(MEX_ARGS) { } const string& mean_file = mxArrayToString(prhs[0]); Blob<float> data_mean; - LOG(INFO) << "Loading mean file from" << mean_file; + LOG(INFO) << "Loading mean file from: " << mean_file; BlobProto blob_proto; bool result = ReadProtoFromBinaryFile(mean_file.c_str(), &blob_proto); if (!result) { diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 209dc0349ad..3d2c78f8ec2 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -19,7 +19,7 @@ DataTransformer<Dtype>::DataTransformer(const TransformationParameter& param) CHECK_EQ(param_.mean_value_size(), 0) << "Cannot specify mean_file and mean_value at the same time"; const string& mean_file = param.mean_file(); - LOG(INFO) << "Loading mean file from" << mean_file; + LOG(INFO) << "Loading mean file from: " << mean_file; BlobProto blob_proto; ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); data_mean_.FromProto(blob_proto); diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 6287b385dc5..83372e074f5 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -189,7 +189,7 @@ void WindowDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, if (has_mean_file_) { const string& mean_file = this->transform_param_.mean_file(); - LOG(INFO) << "Loading mean file from" << mean_file; + LOG(INFO) << "Loading mean file from: " << mean_file; BlobProto blob_proto; ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto); data_mean_.FromProto(blob_proto); From b6f9dc8f864ebb9cd63398da4de83493e81b5b54 Mon Sep 17 00:00:00 2001 From: Pannous <info@pannous.com> Date: Fri, 30 Jan 2015 13:38:48 +0100 Subject: [PATCH 1085/2053] fixed small bug: output label_file -> label_filename --- examples/siamese/convert_mnist_siamese_data.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/siamese/convert_mnist_siamese_data.cpp b/examples/siamese/convert_mnist_siamese_data.cpp index 400d15a2705..71c56a0ae61 100644 --- a/examples/siamese/convert_mnist_siamese_data.cpp +++ b/examples/siamese/convert_mnist_siamese_data.cpp @@ -36,7 +36,7 @@ void convert_dataset(const char* image_filename, const char* label_filename, std::ifstream image_file(image_filename, std::ios::in | std::ios::binary); std::ifstream label_file(label_filename, std::ios::in | std::ios::binary); CHECK(image_file) << "Unable to open file " << image_filename; - CHECK(label_file) << "Unable to open file " << label_file; + CHECK(label_file) << "Unable to open file " << label_filename; // Read the magic and the meta data uint32_t magic; uint32_t num_items; From 648aed72acf1c506009ddb33d8cace40b75e176e Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Wed, 4 Feb 2015 10:15:21 -0800 Subject: [PATCH 1086/2053] fix Nesterov typo found by @bamos --- docs/tutorial/solver.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorial/solver.md b/docs/tutorial/solver.md index 8884ea0e1e8..17f793ef778 100644 --- a/docs/tutorial/solver.md +++ b/docs/tutorial/solver.md @@ -6,7 +6,7 @@ title: Solver / Model Optimization The solver orchestrates model optimization by coordinating the network's forward inference and backward gradients to form parameter updates that attempt to improve the loss. The responsibilities of learning are divided between the Solver for overseeing the optimization and generating parameter updates and the Net for yielding loss and gradients. -The Caffe solvers are Stochastic Gradient Descent (SGD), Adaptive Gradient (ADAGRAD), and Nesterov's Accelerated Gradient (NAG). +The Caffe solvers are Stochastic Gradient Descent (SGD), Adaptive Gradient (ADAGRAD), and Nesterov's Accelerated Gradient (NESTEROV). The solver @@ -126,7 +126,7 @@ Note that in practice, for weights $$ W \in \mathcal{R}^d $$, AdaGrad implementa ### NAG -**Nesterov's accelerated gradient** (`solver_type: NAG`) was proposed by Nesterov [1] as an "optimal" method of convex optimization, achieving a convergence rate of $$ \mathcal{O}(1/t^2) $$ rather than the $$ \mathcal{O}(1/t) $$. +**Nesterov's accelerated gradient** (`solver_type: NESTEROV`) was proposed by Nesterov [1] as an "optimal" method of convex optimization, achieving a convergence rate of $$ \mathcal{O}(1/t^2) $$ rather than the $$ \mathcal{O}(1/t) $$. Though the required assumptions to achieve the $$ \mathcal{O}(1/t^2) $$ convergence typically will not hold for deep networks trained with Caffe (e.g., due to non-smoothness and non-convexity), in practice NAG can be a very effective method for optimizing certain types of deep learning architectures, as demonstrated for deep MNIST autoencoders by Sutskever et al. [2]. The weight update formulas look very similar to the SGD updates given above: From 3b13846486875be2911716bcd1947dca71a97817 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 7 Jan 2015 20:41:09 -0800 Subject: [PATCH 1087/2053] Layer type is a string --- include/caffe/common_layers.hpp | 40 +-- include/caffe/data_layers.hpp | 28 +- include/caffe/layer.hpp | 27 +- include/caffe/layer_factory.hpp | 52 ++-- include/caffe/loss_layers.hpp | 34 +-- include/caffe/neuron_layers.hpp | 39 +-- include/caffe/util/upgrade_proto.hpp | 2 +- include/caffe/vision_layers.hpp | 22 +- src/caffe/layer_factory.cpp | 12 +- src/caffe/layers/absval_layer.cpp | 5 +- src/caffe/layers/accuracy_layer.cpp | 3 +- src/caffe/layers/argmax_layer.cpp | 2 +- src/caffe/layers/bnll_layer.cpp | 3 +- src/caffe/layers/concat_layer.cpp | 3 +- src/caffe/layers/contrastive_loss_layer.cpp | 3 +- src/caffe/layers/conv_layer.cpp | 1 + src/caffe/layers/data_layer.cpp | 2 +- src/caffe/layers/deconv_layer.cpp | 3 +- src/caffe/layers/dropout_layer.cpp | 3 +- src/caffe/layers/dummy_data_layer.cpp | 3 +- src/caffe/layers/eltwise_layer.cpp | 3 +- src/caffe/layers/euclidean_loss_layer.cpp | 3 +- src/caffe/layers/exp_layer.cpp | 3 +- src/caffe/layers/flatten_layer.cpp | 3 +- src/caffe/layers/hdf5_data_layer.cpp | 3 +- src/caffe/layers/hdf5_output_layer.cpp | 3 +- src/caffe/layers/hinge_loss_layer.cpp | 5 +- src/caffe/layers/im2col_layer.cpp | 3 +- src/caffe/layers/image_data_layer.cpp | 3 +- src/caffe/layers/infogain_loss_layer.cpp | 6 +- src/caffe/layers/inner_product_layer.cpp | 3 +- src/caffe/layers/lrn_layer.cpp | 3 +- src/caffe/layers/memory_data_layer.cpp | 3 +- .../multinomial_logistic_loss_layer.cpp | 5 +- src/caffe/layers/mvn_layer.cpp | 3 +- src/caffe/layers/pooling_layer.cpp | 1 - src/caffe/layers/power_layer.cpp | 3 +- src/caffe/layers/relu_layer.cpp | 1 - .../sigmoid_cross_entropy_loss_layer.cpp | 5 +- .../sigmoid_cross_entropy_loss_layer.cu | 2 +- src/caffe/layers/silence_layer.cpp | 3 +- src/caffe/layers/slice_layer.cpp | 3 +- src/caffe/layers/softmax_layer.cpp | 1 + src/caffe/layers/softmax_loss_layer.cpp | 6 +- src/caffe/layers/split_layer.cpp | 5 +- src/caffe/layers/threshold_layer.cpp | 3 +- src/caffe/layers/window_data_layer.cpp | 3 +- src/caffe/proto/caffe.proto | 54 +--- src/caffe/test/test_gradient_based_solver.cpp | 6 +- src/caffe/test/test_net.cpp | 258 +++++++++--------- src/caffe/test/test_protobuf.cpp | 2 +- src/caffe/test/test_solver.cpp | 8 +- src/caffe/test/test_split_layer.cpp | 194 ++++++------- src/caffe/test/test_upgrade_proto.cpp | 106 +++---- src/caffe/util/insert_splits.cpp | 2 +- src/caffe/util/upgrade_proto.cpp | 74 ++--- 56 files changed, 487 insertions(+), 592 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 9718b825b14..3a5ccd2180e 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -43,9 +43,7 @@ class ArgMaxLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_ARGMAX; - } + virtual inline const char* type() const { return "ArgMax"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -86,9 +84,7 @@ class ConcatLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_CONCAT; - } + virtual inline const char* type() const { return "Concat"; } virtual inline int MinBottomBlobs() const { return 2; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -166,9 +162,7 @@ class EltwiseLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_ELTWISE; - } + virtual inline const char* type() const { return "Eltwise"; } virtual inline int MinBottomBlobs() const { return 2; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -207,9 +201,7 @@ class FlattenLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_FLATTEN; - } + virtual inline const char* type() const { return "Flatten"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -260,9 +252,7 @@ class InnerProductLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_INNER_PRODUCT; - } + virtual inline const char* type() const { return "InnerProduct"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -296,9 +286,7 @@ class MVNLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_MVN; - } + virtual inline const char* type() const { return "MVN"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -330,9 +318,7 @@ class SilenceLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SILENCE; - } + virtual inline const char* type() const { return "Silence"; } virtual inline int MinBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 0; } @@ -362,9 +348,7 @@ class SoftmaxLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SOFTMAX; - } + virtual inline const char* type() const { return "Softmax"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -426,9 +410,7 @@ class SplitLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SPLIT; - } + virtual inline const char* type() const { return "Split"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int MinTopBlobs() const { return 1; } @@ -461,9 +443,7 @@ class SliceLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SLICE; - } + virtual inline const char* type() const { return "Slice"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int MinTopBlobs() const { return 2; } diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index e9c83856a99..e55a0bbbd7b 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -90,9 +90,7 @@ class DataLayer : public BasePrefetchingDataLayer<Dtype> { virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_DATA; - } + virtual inline const char* type() const { return "Data"; } virtual inline int ExactNumBottomBlobs() const { return 0; } virtual inline int MinTopBlobs() const { return 1; } virtual inline int MaxTopBlobs() const { return 2; } @@ -120,9 +118,7 @@ class DummyDataLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_DUMMY_DATA; - } + virtual inline const char* type() const { return "DummyData"; } virtual inline int ExactNumBottomBlobs() const { return 0; } virtual inline int MinTopBlobs() const { return 1; } @@ -155,9 +151,7 @@ class HDF5DataLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_HDF5_DATA; - } + virtual inline const char* type() const { return "HDF5Data"; } virtual inline int ExactNumBottomBlobs() const { return 0; } virtual inline int MinTopBlobs() const { return 1; } @@ -195,9 +189,7 @@ class HDF5OutputLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_HDF5_OUTPUT; - } + virtual inline const char* type() const { return "HDF5Output"; } // TODO: no limit on the number of blobs virtual inline int ExactNumBottomBlobs() const { return 2; } virtual inline int ExactNumTopBlobs() const { return 0; } @@ -235,9 +227,7 @@ class ImageDataLayer : public BasePrefetchingDataLayer<Dtype> { virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_IMAGE_DATA; - } + virtual inline const char* type() const { return "ImageData"; } virtual inline int ExactNumBottomBlobs() const { return 0; } virtual inline int ExactNumTopBlobs() const { return 2; } @@ -263,9 +253,7 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_MEMORY_DATA; - } + virtual inline const char* type() const { return "MemoryData"; } virtual inline int ExactNumBottomBlobs() const { return 0; } virtual inline int ExactNumTopBlobs() const { return 2; } @@ -309,9 +297,7 @@ class WindowDataLayer : public BasePrefetchingDataLayer<Dtype> { virtual void DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_WINDOW_DATA; - } + virtual inline const char* type() const { return "WindowData"; } virtual inline int ExactNumBottomBlobs() const { return 0; } virtual inline int ExactNumTopBlobs() const { return 2; } diff --git a/include/caffe/layer.hpp b/include/caffe/layer.hpp index 8a8330bca57..c6461c19964 100644 --- a/include/caffe/layer.hpp +++ b/include/caffe/layer.hpp @@ -179,18 +179,9 @@ class Layer { } /** - * @brief Returns the layer type as an enum value. + * @brief Returns the layer type. */ - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_NONE; - } - - /** - * @brief Returns the layer type name. - */ - virtual inline const string& type_name() const { - return LayerParameter_LayerType_Name(type()); - } + virtual inline const char* type() const { return ""; } /** * @brief Returns the exact number of bottom blobs required by the layer, @@ -347,37 +338,37 @@ class Layer { const vector<Blob<Dtype>*>& top) { if (ExactNumBottomBlobs() >= 0) { CHECK_EQ(ExactNumBottomBlobs(), bottom.size()) - << type_name() << " Layer takes " << ExactNumBottomBlobs() + << type() << " Layer takes " << ExactNumBottomBlobs() << " bottom blob(s) as input."; } if (MinBottomBlobs() >= 0) { CHECK_LE(MinBottomBlobs(), bottom.size()) - << type_name() << " Layer takes at least " << MinBottomBlobs() + << type() << " Layer takes at least " << MinBottomBlobs() << " bottom blob(s) as input."; } if (MaxBottomBlobs() >= 0) { CHECK_GE(MaxBottomBlobs(), bottom.size()) - << type_name() << " Layer takes at most " << MaxBottomBlobs() + << type() << " Layer takes at most " << MaxBottomBlobs() << " bottom blob(s) as input."; } if (ExactNumTopBlobs() >= 0) { CHECK_EQ(ExactNumTopBlobs(), top.size()) - << type_name() << " Layer produces " << ExactNumTopBlobs() + << type() << " Layer produces " << ExactNumTopBlobs() << " top blob(s) as output."; } if (MinTopBlobs() >= 0) { CHECK_LE(MinTopBlobs(), top.size()) - << type_name() << " Layer produces at least " << MinTopBlobs() + << type() << " Layer produces at least " << MinTopBlobs() << " top blob(s) as output."; } if (MaxTopBlobs() >= 0) { CHECK_GE(MaxTopBlobs(), top.size()) - << type_name() << " Layer produces at most " << MaxTopBlobs() + << type() << " Layer produces at most " << MaxTopBlobs() << " top blob(s) as output."; } if (EqualNumBottomTopBlobs()) { CHECK_EQ(bottom.size(), top.size()) - << type_name() << " Layer produces one top blob as output for each " + << type() << " Layer produces one top blob as output for each " << "bottom blob input."; } } diff --git a/include/caffe/layer_factory.hpp b/include/caffe/layer_factory.hpp index c1fd6aa0d43..ede5d1fae3f 100644 --- a/include/caffe/layer_factory.hpp +++ b/include/caffe/layer_factory.hpp @@ -12,17 +12,13 @@ * // your implementations * }; * - * and its type is defined in the protobuffer as - * - * enum LayerType { - * // other definitions - * AWESOME = 46, - * } + * and its type is its C++ class name, but without the "Layer" at the end + * ("MyAwesomeLayer" -> "MyAwesome"). * * If the layer is going to be created simply by its constructor, in your c++ * file, add the following line: * - * REGISTER_LAYER_CLASS(AWESOME, MyAwesomeLayer); + * REGISTER_LAYER_CLASS(MyAwesome); * * Or, if the layer is going to be created by another creator function, in the * format of: @@ -35,7 +31,7 @@ * (for example, when your layer has multiple backends, see GetConvolutionLayer * for a use case), then you can register the creator function instead, like * - * REGISTER_LAYER_CREATOR(AWESOME, GetMyAwesomeLayer) + * REGISTER_LAYER_CREATOR(MyAwesome, GetMyAwesomeLayer) * * Note that each layer type should only be registered once. */ @@ -44,6 +40,7 @@ #define CAFFE_LAYER_FACTORY_H_ #include <map> +#include <string> #include "caffe/common.hpp" #include "caffe/proto/caffe.pb.h" @@ -57,7 +54,7 @@ template <typename Dtype> class LayerRegistry { public: typedef Layer<Dtype>* (*Creator)(const LayerParameter&); - typedef std::map<LayerParameter_LayerType, Creator> CreatorRegistry; + typedef std::map<string, Creator> CreatorRegistry; static CreatorRegistry& Registry() { static CreatorRegistry* g_registry_ = new CreatorRegistry(); @@ -65,8 +62,7 @@ class LayerRegistry { } // Adds a creator. - static void AddCreator(const LayerParameter_LayerType& type, - Creator creator) { + static void AddCreator(const string& type, Creator creator) { CreatorRegistry& registry = Registry(); CHECK_EQ(registry.count(type), 0) << "Layer type " << type << " already registered."; @@ -76,9 +72,10 @@ class LayerRegistry { // Get a layer using a LayerParameter. static Layer<Dtype>* CreateLayer(const LayerParameter& param) { LOG(INFO) << "Creating layer " << param.name(); - const LayerParameter_LayerType& type = param.type(); + const string& type = param.type(); CreatorRegistry& registry = Registry(); - CHECK_EQ(registry.count(type), 1); + CHECK_EQ(registry.count(type), 1) << "Unknown layer type: " << type + << " (known types: " << LayerTypeList() << ")"; return registry[type](param); } @@ -86,13 +83,26 @@ class LayerRegistry { // Layer registry should never be instantiated - everything is done with its // static variables. LayerRegistry() {} + + static string LayerTypeList() { + CreatorRegistry& registry = Registry(); + string layer_types; + for (typename CreatorRegistry::iterator iter = registry.begin(); + iter != registry.end(); ++iter) { + if (iter != registry.begin()) { + layer_types += ", "; + } + layer_types += iter->first; + } + return layer_types; + } }; template <typename Dtype> class LayerRegisterer { public: - LayerRegisterer(const LayerParameter_LayerType& type, + LayerRegisterer(const string& type, Layer<Dtype>* (*creator)(const LayerParameter&)) { // LOG(INFO) << "Registering layer type: " << type; LayerRegistry<Dtype>::AddCreator(type, creator); @@ -101,17 +111,15 @@ class LayerRegisterer { #define REGISTER_LAYER_CREATOR(type, creator) \ - static LayerRegisterer<float> g_creator_f_##type( \ - LayerParameter_LayerType_##type, creator<float>); \ - static LayerRegisterer<double> g_creator_d_##type( \ - LayerParameter_LayerType_##type, creator<double>) + static LayerRegisterer<float> g_creator_f_##type(#type, creator<float>); \ + static LayerRegisterer<double> g_creator_d_##type(#type, creator<double>) \ -#define REGISTER_LAYER_CLASS(type, clsname) \ +#define REGISTER_LAYER_CLASS(type) \ template <typename Dtype> \ - Layer<Dtype>* Creator_##clsname(const LayerParameter& param) { \ - return new clsname<Dtype>(param); \ + Layer<Dtype>* Creator_##type##Layer(const LayerParameter& param) { \ + return new type##Layer<Dtype>(param); \ } \ - REGISTER_LAYER_CREATOR(type, Creator_##clsname) + REGISTER_LAYER_CREATOR(type, Creator_##type##Layer) } // namespace caffe diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 600a13b8867..f14b9716a4a 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -37,10 +37,7 @@ class AccuracyLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_ACCURACY; - } - + virtual inline const char* type() const { return "Accuracy"; } virtual inline int ExactNumBottomBlobs() const { return 2; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -154,9 +151,7 @@ class ContrastiveLossLayer : public LossLayer<Dtype> { const vector<Blob<Dtype>*>& top); virtual inline int ExactNumBottomBlobs() const { return 3; } - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_CONTRASTIVE_LOSS; - } + virtual inline const char* type() const { return "ContrastiveLoss"; } /** * Unlike most loss layers, in the ContrastiveLossLayer we can backpropagate * to the first two inputs. @@ -242,10 +237,7 @@ class EuclideanLossLayer : public LossLayer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_EUCLIDEAN_LOSS; - } - + virtual inline const char* type() const { return "EuclideanLoss"; } /** * Unlike most loss layers, in the EuclideanLossLayer we can backpropagate * to both inputs -- override to return true and always allow force_backward. @@ -351,9 +343,7 @@ class HingeLossLayer : public LossLayer<Dtype> { explicit HingeLossLayer(const LayerParameter& param) : LossLayer<Dtype>(param) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_HINGE_LOSS; - } + virtual inline const char* type() const { return "HingeLoss"; } protected: /// @copydoc HingeLossLayer @@ -440,9 +430,7 @@ class InfogainLossLayer : public LossLayer<Dtype> { virtual inline int MinBottomBlobs() const { return 2; } virtual inline int MaxBottomBlobs() const { return 3; } - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_INFOGAIN_LOSS; - } + virtual inline const char* type() const { return "InfogainLoss"; } protected: /// @copydoc InfogainLossLayer @@ -524,9 +512,7 @@ class MultinomialLogisticLossLayer : public LossLayer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS; - } + virtual inline const char* type() const { return "MultinomialLogisticLoss"; } protected: /// @copydoc MultinomialLogisticLossLayer @@ -606,9 +592,7 @@ class SigmoidCrossEntropyLossLayer : public LossLayer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS; - } + virtual inline const char* type() const { return "SigmoidCrossEntropyLoss"; } protected: /// @copydoc SigmoidCrossEntropyLossLayer @@ -711,9 +695,7 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SOFTMAX_LOSS; - } + virtual inline const char* type() const { return "SoftmaxWithLoss"; } virtual inline int ExactNumBottomBlobs() const { return -1; } virtual inline int MinBottomBlobs() const { return 2; } virtual inline int MaxBottomBlobs() const { return 3; } diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index 5daeeefe7ae..b65d98435bc 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -29,9 +29,6 @@ class NeuronLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_NONE; - } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } }; @@ -54,9 +51,7 @@ class AbsValLayer : public NeuronLayer<Dtype> { virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_ABSVAL; - } + virtual inline const char* type() const { return "AbsVal"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -113,9 +108,7 @@ class BNLLLayer : public NeuronLayer<Dtype> { explicit BNLLLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_BNLL; - } + virtual inline const char* type() const { return "BNLL"; } protected: /// @copydoc BNLLLayer @@ -173,9 +166,7 @@ class DropoutLayer : public NeuronLayer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_DROPOUT; - } + virtual inline const char* type() const { return "Dropout"; } protected: /** @@ -233,9 +224,7 @@ class ExpLayer : public NeuronLayer<Dtype> { virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_EXP; - } + virtual inline const char* type() const { return "Exp"; } protected: /** @@ -298,9 +287,7 @@ class PowerLayer : public NeuronLayer<Dtype> { virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_POWER; - } + virtual inline const char* type() const { return "Power"; } protected: /** @@ -369,9 +356,7 @@ class ReLULayer : public NeuronLayer<Dtype> { explicit ReLULayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_RELU; - } + virtual inline const char* type() const { return "ReLU"; } protected: /** @@ -465,9 +450,7 @@ class SigmoidLayer : public NeuronLayer<Dtype> { explicit SigmoidLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_SIGMOID; - } + virtual inline const char* type() const { return "Sigmoid"; } protected: /** @@ -549,9 +532,7 @@ class TanHLayer : public NeuronLayer<Dtype> { explicit TanHLayer(const LayerParameter& param) : NeuronLayer<Dtype>(param) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_TANH; - } + virtual inline const char* type() const { return "TanH"; } protected: /** @@ -639,9 +620,7 @@ class ThresholdLayer : public NeuronLayer<Dtype> { virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_THRESHOLD; - } + virtual inline const char* type() const { return "Threshold"; } protected: /** diff --git a/include/caffe/util/upgrade_proto.hpp b/include/caffe/util/upgrade_proto.hpp index 45483685133..0627afe694c 100644 --- a/include/caffe/util/upgrade_proto.hpp +++ b/include/caffe/util/upgrade_proto.hpp @@ -27,7 +27,7 @@ void UpgradeV0PaddingLayers(const NetParameter& param, bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, LayerParameter* layer_param); -LayerParameter_LayerType UpgradeV0LayerType(const string& type); +const char* UpgradeV0LayerType(const string& type); // Return true iff any layer contains deprecated data transformation parameters. bool NetNeedsDataUpgrade(const NetParameter& net_param); diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index fc178e4c904..38e369c4092 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -160,9 +160,8 @@ class ConvolutionLayer : public BaseConvolutionLayer<Dtype> { */ explicit ConvolutionLayer(const LayerParameter& param) : BaseConvolutionLayer<Dtype>(param) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_CONVOLUTION; - } + + virtual inline const char* type() const { return "Convolution"; } protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, @@ -196,9 +195,8 @@ class DeconvolutionLayer : public BaseConvolutionLayer<Dtype> { public: explicit DeconvolutionLayer(const LayerParameter& param) : BaseConvolutionLayer<Dtype>(param) {} - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_DECONVOLUTION; - } + + virtual inline const char* type() const { return "Deconvolution"; } protected: virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, @@ -272,9 +270,7 @@ class Im2colLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_IM2COL; - } + virtual inline const char* type() const { return "Im2col"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -314,9 +310,7 @@ class LRNLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_LRN; - } + virtual inline const char* type() const { return "LRN"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int ExactNumTopBlobs() const { return 1; } @@ -392,9 +386,7 @@ class PoolingLayer : public Layer<Dtype> { virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - virtual inline LayerParameter_LayerType type() const { - return LayerParameter_LayerType_POOLING; - } + virtual inline const char* type() const { return "Pooling"; } virtual inline int ExactNumBottomBlobs() const { return 1; } virtual inline int MinTopBlobs() const { return 1; } // MAX POOL layers can output an extra top blob for the mask; diff --git a/src/caffe/layer_factory.cpp b/src/caffe/layer_factory.cpp index 80694834a33..c3fd1f30ff2 100644 --- a/src/caffe/layer_factory.cpp +++ b/src/caffe/layer_factory.cpp @@ -29,7 +29,7 @@ Layer<Dtype>* GetConvolutionLayer( } } -REGISTER_LAYER_CREATOR(CONVOLUTION, GetConvolutionLayer); +REGISTER_LAYER_CREATOR(Convolution, GetConvolutionLayer); // Get pooling layer according to engine. template <typename Dtype> @@ -59,7 +59,7 @@ Layer<Dtype>* GetPoolingLayer(const LayerParameter& param) { } } -REGISTER_LAYER_CREATOR(POOLING, GetPoolingLayer); +REGISTER_LAYER_CREATOR(Pooling, GetPoolingLayer); // Get relu layer according to engine. template <typename Dtype> @@ -82,7 +82,7 @@ Layer<Dtype>* GetReLULayer(const LayerParameter& param) { } } -REGISTER_LAYER_CREATOR(RELU, GetReLULayer); +REGISTER_LAYER_CREATOR(ReLU, GetReLULayer); // Get sigmoid layer according to engine. template <typename Dtype> @@ -105,7 +105,7 @@ Layer<Dtype>* GetSigmoidLayer(const LayerParameter& param) { } } -REGISTER_LAYER_CREATOR(SIGMOID, GetSigmoidLayer); +REGISTER_LAYER_CREATOR(Sigmoid, GetSigmoidLayer); // Get softmax layer according to engine. template <typename Dtype> @@ -128,7 +128,7 @@ Layer<Dtype>* GetSoftmaxLayer(const LayerParameter& param) { } } -REGISTER_LAYER_CREATOR(SOFTMAX, GetSoftmaxLayer); +REGISTER_LAYER_CREATOR(Softmax, GetSoftmaxLayer); // Get tanh layer according to engine. template <typename Dtype> @@ -151,7 +151,7 @@ Layer<Dtype>* GetTanHLayer(const LayerParameter& param) { } } -REGISTER_LAYER_CREATOR(TANH, GetTanHLayer); +REGISTER_LAYER_CREATOR(TanH, GetTanHLayer); // Layers that use their constructor as their default creator should be // registered in their corresponding cpp files. Do not register them here. diff --git a/src/caffe/layers/absval_layer.cpp b/src/caffe/layers/absval_layer.cpp index 0d054ee5665..5ce28c9e2b4 100644 --- a/src/caffe/layers/absval_layer.cpp +++ b/src/caffe/layers/absval_layer.cpp @@ -10,7 +10,7 @@ template <typename Dtype> void AbsValLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { NeuronLayer<Dtype>::LayerSetUp(bottom, top); - CHECK_NE(top[0], bottom[0]) << this->type_name() << " Layer does not " + CHECK_NE(top[0], bottom[0]) << this->type() << " Layer does not " "allow in-place computation."; } @@ -40,5 +40,6 @@ STUB_GPU(AbsValLayer); #endif INSTANTIATE_CLASS(AbsValLayer); -REGISTER_LAYER_CLASS(ABSVAL, AbsValLayer); +REGISTER_LAYER_CLASS(AbsVal); + } // namespace caffe diff --git a/src/caffe/layers/accuracy_layer.cpp b/src/caffe/layers/accuracy_layer.cpp index 800b848f3bc..3e8df34c0d6 100644 --- a/src/caffe/layers/accuracy_layer.cpp +++ b/src/caffe/layers/accuracy_layer.cpp @@ -64,5 +64,6 @@ void AccuracyLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } INSTANTIATE_CLASS(AccuracyLayer); -REGISTER_LAYER_CLASS(ACCURACY, AccuracyLayer); +REGISTER_LAYER_CLASS(Accuracy); + } // namespace caffe diff --git a/src/caffe/layers/argmax_layer.cpp b/src/caffe/layers/argmax_layer.cpp index 15e199eb600..c4040cdcaaa 100644 --- a/src/caffe/layers/argmax_layer.cpp +++ b/src/caffe/layers/argmax_layer.cpp @@ -58,6 +58,6 @@ void ArgMaxLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } INSTANTIATE_CLASS(ArgMaxLayer); -REGISTER_LAYER_CLASS(ARGMAX, ArgMaxLayer); +REGISTER_LAYER_CLASS(ArgMax); } // namespace caffe diff --git a/src/caffe/layers/bnll_layer.cpp b/src/caffe/layers/bnll_layer.cpp index cb3583ae8be..9ba0ea9a715 100644 --- a/src/caffe/layers/bnll_layer.cpp +++ b/src/caffe/layers/bnll_layer.cpp @@ -43,5 +43,6 @@ STUB_GPU(BNLLLayer); #endif INSTANTIATE_CLASS(BNLLLayer); -REGISTER_LAYER_CLASS(BNLL, BNLLLayer); +REGISTER_LAYER_CLASS(BNLL); + } // namespace caffe diff --git a/src/caffe/layers/concat_layer.cpp b/src/caffe/layers/concat_layer.cpp index 420821952b0..fc88433c42b 100644 --- a/src/caffe/layers/concat_layer.cpp +++ b/src/caffe/layers/concat_layer.cpp @@ -105,5 +105,6 @@ STUB_GPU(ConcatLayer); #endif INSTANTIATE_CLASS(ConcatLayer); -REGISTER_LAYER_CLASS(CONCAT, ConcatLayer); +REGISTER_LAYER_CLASS(Concat); + } // namespace caffe diff --git a/src/caffe/layers/contrastive_loss_layer.cpp b/src/caffe/layers/contrastive_loss_layer.cpp index 0d0b443b66b..0692c11c257 100644 --- a/src/caffe/layers/contrastive_loss_layer.cpp +++ b/src/caffe/layers/contrastive_loss_layer.cpp @@ -97,5 +97,6 @@ STUB_GPU(ContrastiveLossLayer); #endif INSTANTIATE_CLASS(ContrastiveLossLayer); -REGISTER_LAYER_CLASS(CONTRASTIVE_LOSS, ContrastiveLossLayer); +REGISTER_LAYER_CLASS(ContrastiveLoss); + } // namespace caffe diff --git a/src/caffe/layers/conv_layer.cpp b/src/caffe/layers/conv_layer.cpp index 9fd2fc6a15f..c0c9f6f3371 100644 --- a/src/caffe/layers/conv_layer.cpp +++ b/src/caffe/layers/conv_layer.cpp @@ -79,4 +79,5 @@ STUB_GPU(ConvolutionLayer); #endif INSTANTIATE_CLASS(ConvolutionLayer); + } // namespace caffe diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 96964566630..227db201759 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -129,6 +129,6 @@ void DataLayer<Dtype>::InternalThreadEntry() { } INSTANTIATE_CLASS(DataLayer); -REGISTER_LAYER_CLASS(DATA, DataLayer); +REGISTER_LAYER_CLASS(Data); } // namespace caffe diff --git a/src/caffe/layers/deconv_layer.cpp b/src/caffe/layers/deconv_layer.cpp index 59114f017bf..e6d65ab526b 100644 --- a/src/caffe/layers/deconv_layer.cpp +++ b/src/caffe/layers/deconv_layer.cpp @@ -81,5 +81,6 @@ STUB_GPU(DeconvolutionLayer); #endif INSTANTIATE_CLASS(DeconvolutionLayer); -REGISTER_LAYER_CLASS(DECONVOLUTION, DeconvolutionLayer); +REGISTER_LAYER_CLASS(Deconvolution); + } // namespace caffe diff --git a/src/caffe/layers/dropout_layer.cpp b/src/caffe/layers/dropout_layer.cpp index 8c8936a711e..5f81cc1c692 100644 --- a/src/caffe/layers/dropout_layer.cpp +++ b/src/caffe/layers/dropout_layer.cpp @@ -73,5 +73,6 @@ STUB_GPU(DropoutLayer); #endif INSTANTIATE_CLASS(DropoutLayer); -REGISTER_LAYER_CLASS(DROPOUT, DropoutLayer); +REGISTER_LAYER_CLASS(Dropout); + } // namespace caffe diff --git a/src/caffe/layers/dummy_data_layer.cpp b/src/caffe/layers/dummy_data_layer.cpp index 15cf5a58ac6..d254eb1f961 100644 --- a/src/caffe/layers/dummy_data_layer.cpp +++ b/src/caffe/layers/dummy_data_layer.cpp @@ -93,5 +93,6 @@ void DummyDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } INSTANTIATE_CLASS(DummyDataLayer); -REGISTER_LAYER_CLASS(DUMMY_DATA, DummyDataLayer); +REGISTER_LAYER_CLASS(DummyData); + } // namespace caffe diff --git a/src/caffe/layers/eltwise_layer.cpp b/src/caffe/layers/eltwise_layer.cpp index 0c239f4ac11..bbc34449588 100644 --- a/src/caffe/layers/eltwise_layer.cpp +++ b/src/caffe/layers/eltwise_layer.cpp @@ -163,5 +163,6 @@ STUB_GPU(EltwiseLayer); #endif INSTANTIATE_CLASS(EltwiseLayer); -REGISTER_LAYER_CLASS(ELTWISE, EltwiseLayer); +REGISTER_LAYER_CLASS(Eltwise); + } // namespace caffe diff --git a/src/caffe/layers/euclidean_loss_layer.cpp b/src/caffe/layers/euclidean_loss_layer.cpp index d965027f712..b539d3487f5 100644 --- a/src/caffe/layers/euclidean_loss_layer.cpp +++ b/src/caffe/layers/euclidean_loss_layer.cpp @@ -54,5 +54,6 @@ STUB_GPU(EuclideanLossLayer); #endif INSTANTIATE_CLASS(EuclideanLossLayer); -REGISTER_LAYER_CLASS(EUCLIDEAN_LOSS, EuclideanLossLayer); +REGISTER_LAYER_CLASS(EuclideanLoss); + } // namespace caffe diff --git a/src/caffe/layers/exp_layer.cpp b/src/caffe/layers/exp_layer.cpp index 92cb5deb1e6..c7e7c60cfad 100644 --- a/src/caffe/layers/exp_layer.cpp +++ b/src/caffe/layers/exp_layer.cpp @@ -64,5 +64,6 @@ STUB_GPU(ExpLayer); #endif INSTANTIATE_CLASS(ExpLayer); -REGISTER_LAYER_CLASS(EXP, ExpLayer); +REGISTER_LAYER_CLASS(Exp); + } // namespace caffe diff --git a/src/caffe/layers/flatten_layer.cpp b/src/caffe/layers/flatten_layer.cpp index ec43cababca..eb7b42bc10b 100644 --- a/src/caffe/layers/flatten_layer.cpp +++ b/src/caffe/layers/flatten_layer.cpp @@ -34,5 +34,6 @@ STUB_GPU(FlattenLayer); #endif INSTANTIATE_CLASS(FlattenLayer); -REGISTER_LAYER_CLASS(FLATTEN, FlattenLayer); +REGISTER_LAYER_CLASS(Flatten); + } // namespace caffe diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 706c4a18319..77555211082 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -121,5 +121,6 @@ STUB_GPU_FORWARD(HDF5DataLayer, Forward); #endif INSTANTIATE_CLASS(HDF5DataLayer); -REGISTER_LAYER_CLASS(HDF5_DATA, HDF5DataLayer); +REGISTER_LAYER_CLASS(HDF5Data); + } // namespace caffe diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index 4a72a18aa12..d2fdeffc53f 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -70,5 +70,6 @@ STUB_GPU(HDF5OutputLayer); #endif INSTANTIATE_CLASS(HDF5OutputLayer); -REGISTER_LAYER_CLASS(HDF5_OUTPUT, HDF5OutputLayer); +REGISTER_LAYER_CLASS(HDF5Output); + } // namespace caffe diff --git a/src/caffe/layers/hinge_loss_layer.cpp b/src/caffe/layers/hinge_loss_layer.cpp index 4dfafcc8648..a2fb2a18309 100644 --- a/src/caffe/layers/hinge_loss_layer.cpp +++ b/src/caffe/layers/hinge_loss_layer.cpp @@ -47,7 +47,7 @@ template <typename Dtype> void HingeLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { - LOG(FATAL) << this->type_name() + LOG(FATAL) << this->type() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { @@ -77,5 +77,6 @@ void HingeLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } INSTANTIATE_CLASS(HingeLossLayer); -REGISTER_LAYER_CLASS(HINGE_LOSS, HingeLossLayer); +REGISTER_LAYER_CLASS(HingeLoss); + } // namespace caffe diff --git a/src/caffe/layers/im2col_layer.cpp b/src/caffe/layers/im2col_layer.cpp index 2c4bb9029e0..112226116c8 100644 --- a/src/caffe/layers/im2col_layer.cpp +++ b/src/caffe/layers/im2col_layer.cpp @@ -88,5 +88,6 @@ STUB_GPU(Im2colLayer); #endif INSTANTIATE_CLASS(Im2colLayer); -REGISTER_LAYER_CLASS(IM2COL, Im2colLayer); +REGISTER_LAYER_CLASS(Im2col); + } // namespace caffe diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index ef6a342c30a..b96be6ad72d 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -149,5 +149,6 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { } INSTANTIATE_CLASS(ImageDataLayer); -REGISTER_LAYER_CLASS(IMAGE_DATA, ImageDataLayer); +REGISTER_LAYER_CLASS(ImageData); + } // namespace caffe diff --git a/src/caffe/layers/infogain_loss_layer.cpp b/src/caffe/layers/infogain_loss_layer.cpp index 8910431d42b..a1e0b40de0e 100644 --- a/src/caffe/layers/infogain_loss_layer.cpp +++ b/src/caffe/layers/infogain_loss_layer.cpp @@ -75,11 +75,11 @@ void InfogainLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { - LOG(FATAL) << this->type_name() + LOG(FATAL) << this->type() << " Layer cannot backpropagate to label inputs."; } if (propagate_down.size() > 2 && propagate_down[2]) { - LOG(FATAL) << this->type_name() + LOG(FATAL) << this->type() << " Layer cannot backpropagate to infogain inputs."; } if (propagate_down[0]) { @@ -106,5 +106,5 @@ void InfogainLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } INSTANTIATE_CLASS(InfogainLossLayer); -REGISTER_LAYER_CLASS(INFOGAIN_LOSS, InfogainLossLayer); +REGISTER_LAYER_CLASS(InfogainLoss); } // namespace caffe diff --git a/src/caffe/layers/inner_product_layer.cpp b/src/caffe/layers/inner_product_layer.cpp index ecb849ba4d8..b1ec6cb25c0 100644 --- a/src/caffe/layers/inner_product_layer.cpp +++ b/src/caffe/layers/inner_product_layer.cpp @@ -104,5 +104,6 @@ STUB_GPU(InnerProductLayer); #endif INSTANTIATE_CLASS(InnerProductLayer); -REGISTER_LAYER_CLASS(INNER_PRODUCT, InnerProductLayer); +REGISTER_LAYER_CLASS(InnerProduct); + } // namespace caffe diff --git a/src/caffe/layers/lrn_layer.cpp b/src/caffe/layers/lrn_layer.cpp index a878cf847b3..5e3e7c429ef 100644 --- a/src/caffe/layers/lrn_layer.cpp +++ b/src/caffe/layers/lrn_layer.cpp @@ -252,5 +252,6 @@ STUB_GPU_BACKWARD(LRNLayer, CrossChannelBackward); #endif INSTANTIATE_CLASS(LRNLayer); -REGISTER_LAYER_CLASS(LRN, LRNLayer); +REGISTER_LAYER_CLASS(LRN); + } // namespace caffe diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 613ca2d4c76..3272b66ac55 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -72,5 +72,6 @@ void MemoryDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, } INSTANTIATE_CLASS(MemoryDataLayer); -REGISTER_LAYER_CLASS(MEMORY_DATA, MemoryDataLayer); +REGISTER_LAYER_CLASS(MemoryData); + } // namespace caffe diff --git a/src/caffe/layers/multinomial_logistic_loss_layer.cpp b/src/caffe/layers/multinomial_logistic_loss_layer.cpp index 78a1f60fca9..4267a594a0f 100644 --- a/src/caffe/layers/multinomial_logistic_loss_layer.cpp +++ b/src/caffe/layers/multinomial_logistic_loss_layer.cpp @@ -41,7 +41,7 @@ void MultinomialLogisticLossLayer<Dtype>::Backward_cpu( const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { - LOG(FATAL) << this->type_name() + LOG(FATAL) << this->type() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { @@ -62,5 +62,6 @@ void MultinomialLogisticLossLayer<Dtype>::Backward_cpu( } INSTANTIATE_CLASS(MultinomialLogisticLossLayer); -REGISTER_LAYER_CLASS(MULTINOMIAL_LOGISTIC_LOSS, MultinomialLogisticLossLayer); +REGISTER_LAYER_CLASS(MultinomialLogisticLoss); + } // namespace caffe diff --git a/src/caffe/layers/mvn_layer.cpp b/src/caffe/layers/mvn_layer.cpp index 104ad95c7ed..b74d7b4f300 100644 --- a/src/caffe/layers/mvn_layer.cpp +++ b/src/caffe/layers/mvn_layer.cpp @@ -159,5 +159,6 @@ STUB_GPU(MVNLayer); #endif INSTANTIATE_CLASS(MVNLayer); -REGISTER_LAYER_CLASS(MVN, MVNLayer); +REGISTER_LAYER_CLASS(MVN); + } // namespace caffe diff --git a/src/caffe/layers/pooling_layer.cpp b/src/caffe/layers/pooling_layer.cpp index 2bfbb01fcec..6f4c69c861e 100644 --- a/src/caffe/layers/pooling_layer.cpp +++ b/src/caffe/layers/pooling_layer.cpp @@ -314,5 +314,4 @@ STUB_GPU(PoolingLayer); INSTANTIATE_CLASS(PoolingLayer); - } // namespace caffe diff --git a/src/caffe/layers/power_layer.cpp b/src/caffe/layers/power_layer.cpp index 69bd120e3dc..4fe34c49f32 100644 --- a/src/caffe/layers/power_layer.cpp +++ b/src/caffe/layers/power_layer.cpp @@ -99,5 +99,6 @@ STUB_GPU(PowerLayer); #endif INSTANTIATE_CLASS(PowerLayer); -REGISTER_LAYER_CLASS(POWER, PowerLayer); +REGISTER_LAYER_CLASS(Power); + } // namespace caffe diff --git a/src/caffe/layers/relu_layer.cpp b/src/caffe/layers/relu_layer.cpp index 7d5e6034589..cc00319a578 100644 --- a/src/caffe/layers/relu_layer.cpp +++ b/src/caffe/layers/relu_layer.cpp @@ -43,5 +43,4 @@ STUB_GPU(ReLULayer); INSTANTIATE_CLASS(ReLULayer); - } // namespace caffe diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp index d1e327a54c9..077d949981c 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cpp @@ -53,7 +53,7 @@ void SigmoidCrossEntropyLossLayer<Dtype>::Backward_cpu( const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { - LOG(FATAL) << this->type_name() + LOG(FATAL) << this->type() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { @@ -75,5 +75,6 @@ STUB_GPU(SigmoidCrossEntropyLossLayer); #endif INSTANTIATE_CLASS(SigmoidCrossEntropyLossLayer); -REGISTER_LAYER_CLASS(SIGMOID_CROSS_ENTROPY_LOSS, SigmoidCrossEntropyLossLayer); +REGISTER_LAYER_CLASS(SigmoidCrossEntropyLoss); + } // namespace caffe diff --git a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu index d9db4af64e6..08f7f492297 100644 --- a/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu +++ b/src/caffe/layers/sigmoid_cross_entropy_loss_layer.cu @@ -33,7 +33,7 @@ void SigmoidCrossEntropyLossLayer<Dtype>::Backward_gpu( const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { - LOG(FATAL) << this->type_name() + LOG(FATAL) << this->type() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { diff --git a/src/caffe/layers/silence_layer.cpp b/src/caffe/layers/silence_layer.cpp index 9bd20574816..4abf9eff4a2 100644 --- a/src/caffe/layers/silence_layer.cpp +++ b/src/caffe/layers/silence_layer.cpp @@ -22,5 +22,6 @@ STUB_GPU(SilenceLayer); #endif INSTANTIATE_CLASS(SilenceLayer); -REGISTER_LAYER_CLASS(SILENCE, SilenceLayer); +REGISTER_LAYER_CLASS(Silence); + } // namespace caffe diff --git a/src/caffe/layers/slice_layer.cpp b/src/caffe/layers/slice_layer.cpp index 60a5ecfa416..46c3acd6513 100644 --- a/src/caffe/layers/slice_layer.cpp +++ b/src/caffe/layers/slice_layer.cpp @@ -137,5 +137,6 @@ STUB_GPU(SliceLayer); #endif INSTANTIATE_CLASS(SliceLayer); -REGISTER_LAYER_CLASS(SLICE, SliceLayer); +REGISTER_LAYER_CLASS(Slice); + } // namespace caffe diff --git a/src/caffe/layers/softmax_layer.cpp b/src/caffe/layers/softmax_layer.cpp index c7b09fffd7a..25142fdec53 100644 --- a/src/caffe/layers/softmax_layer.cpp +++ b/src/caffe/layers/softmax_layer.cpp @@ -92,4 +92,5 @@ STUB_GPU(SoftmaxLayer); #endif INSTANTIATE_CLASS(SoftmaxLayer); + } // namespace caffe diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index 14bd383718c..bf20b6056e4 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -14,7 +14,7 @@ void SoftmaxWithLossLayer<Dtype>::LayerSetUp( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { LossLayer<Dtype>::LayerSetUp(bottom, top); LayerParameter softmax_param(this->layer_param_); - softmax_param.set_type(LayerParameter_LayerType_SOFTMAX); + softmax_param.set_type("Softmax"); softmax_layer_.reset(LayerRegistry<Dtype>::CreateLayer(softmax_param)); softmax_bottom_vec_.clear(); softmax_bottom_vec_.push_back(bottom[0]); @@ -80,7 +80,7 @@ template <typename Dtype> void SoftmaxWithLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { if (propagate_down[1]) { - LOG(FATAL) << this->type_name() + LOG(FATAL) << this->type() << " Layer cannot backpropagate to label inputs."; } if (propagate_down[0]) { @@ -116,6 +116,6 @@ void SoftmaxWithLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } INSTANTIATE_CLASS(SoftmaxWithLossLayer); -REGISTER_LAYER_CLASS(SOFTMAX_LOSS, SoftmaxWithLossLayer); +REGISTER_LAYER_CLASS(SoftmaxWithLoss); } // namespace caffe diff --git a/src/caffe/layers/split_layer.cpp b/src/caffe/layers/split_layer.cpp index 51ac61f4cae..d6929b99683 100644 --- a/src/caffe/layers/split_layer.cpp +++ b/src/caffe/layers/split_layer.cpp @@ -16,7 +16,7 @@ void SplitLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, // the backward pass. (Technically, it should be possible to share the diff // blob of the first split output with the input, but this seems to cause // some strange effects in practice...) - CHECK_NE(top[i], bottom[0]) << this->type_name() << " Layer does not " + CHECK_NE(top[i], bottom[0]) << this->type() << " Layer does not " "allow in-place computation."; top[i]->Reshape(bottom[0]->num(), bottom[0]->channels(), bottom[0]->height(), bottom[0]->width()); @@ -56,5 +56,6 @@ STUB_GPU(SplitLayer); #endif INSTANTIATE_CLASS(SplitLayer); -REGISTER_LAYER_CLASS(SPLIT, SplitLayer); +REGISTER_LAYER_CLASS(Split); + } // namespace caffe diff --git a/src/caffe/layers/threshold_layer.cpp b/src/caffe/layers/threshold_layer.cpp index 9e68c32d348..2365e7b9c72 100644 --- a/src/caffe/layers/threshold_layer.cpp +++ b/src/caffe/layers/threshold_layer.cpp @@ -29,5 +29,6 @@ STUB_GPU_FORWARD(ThresholdLayer, Forward); #endif INSTANTIATE_CLASS(ThresholdLayer); -REGISTER_LAYER_CLASS(THRESHOLD, ThresholdLayer); +REGISTER_LAYER_CLASS(Threshold); + } // namespace caffe diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 83372e074f5..23ec83d166b 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -463,5 +463,6 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { } INSTANTIATE_CLASS(WindowDataLayer); -REGISTER_LAYER_CLASS(WINDOW_DATA, WindowDataLayer); +REGISTER_LAYER_CLASS(WindowData); + } // namespace caffe diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index dd2c1471c29..1fea3445415 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -225,59 +225,7 @@ message LayerParameter { repeated NetStateRule include = 32; repeated NetStateRule exclude = 33; - // NOTE - // Add new LayerTypes to the enum below in lexicographical order (other than - // starting with NONE), starting with the next available ID in the comment - // line above the enum. Update the next available ID when you add a new - // LayerType. - // - // LayerType next available ID: 40 (last added: DECONVOLUTION) - enum LayerType { - // "NONE" layer type is 0th enum element so that we don't cause confusion - // by defaulting to an existent LayerType (instead, should usually error if - // the type is unspecified). - NONE = 0; - ABSVAL = 35; - ACCURACY = 1; - ARGMAX = 30; - BNLL = 2; - CONCAT = 3; - CONTRASTIVE_LOSS = 37; - CONVOLUTION = 4; - DATA = 5; - DECONVOLUTION = 39; - DROPOUT = 6; - DUMMY_DATA = 32; - EUCLIDEAN_LOSS = 7; - ELTWISE = 25; - EXP = 38; - FLATTEN = 8; - HDF5_DATA = 9; - HDF5_OUTPUT = 10; - HINGE_LOSS = 28; - IM2COL = 11; - IMAGE_DATA = 12; - INFOGAIN_LOSS = 13; - INNER_PRODUCT = 14; - LRN = 15; - MEMORY_DATA = 29; - MULTINOMIAL_LOGISTIC_LOSS = 16; - MVN = 34; - POOLING = 17; - POWER = 26; - RELU = 18; - SIGMOID = 19; - SIGMOID_CROSS_ENTROPY_LOSS = 27; - SILENCE = 36; - SOFTMAX = 20; - SOFTMAX_LOSS = 21; - SPLIT = 22; - SLICE = 33; - TANH = 23; - WINDOW_DATA = 24; - THRESHOLD = 31; - } - optional LayerType type = 5; // the layer type from the enum above + optional string type = 5; // the layer type from the enum above // The blobs containing the numeric parameters of the layer repeated BlobProto blobs = 6; diff --git a/src/caffe/test/test_gradient_based_solver.cpp b/src/caffe/test/test_gradient_based_solver.cpp index 65de52aae4a..1d8192aebbc 100644 --- a/src/caffe/test/test_gradient_based_solver.cpp +++ b/src/caffe/test/test_gradient_based_solver.cpp @@ -66,7 +66,7 @@ class GradientBasedSolverTest : public MultiDeviceTest<TypeParam> { " name: 'TestNetwork' " " layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: " << num_ << " " " channels: " << channels_ << " " @@ -85,7 +85,7 @@ class GradientBasedSolverTest : public MultiDeviceTest<TypeParam> { " } " " layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 1 " " weight_filler { " @@ -102,7 +102,7 @@ class GradientBasedSolverTest : public MultiDeviceTest<TypeParam> { " } " " layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod' " " bottom: 'targets' " " } " diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index 319958fee49..a4e14f914c5 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -61,7 +61,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "name: 'TinyTestNetwork' " "layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: 5 " " channels: 2 " @@ -85,7 +85,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 1000 " " weight_filler { " @@ -106,7 +106,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerproduct' " " bottom: 'label' " " top: 'top_loss' " @@ -115,7 +115,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { proto += "layers: { " " name: 'loss' " - " type: ACCURACY " + " type: 'Accuracy' " " bottom: 'innerproduct' " " bottom: 'label' " " top: 'accuracy' " @@ -132,7 +132,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "name: 'TinyTestEuclidLossNetwork' " "layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: 5 " " channels: 2 " @@ -152,7 +152,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 1 " " weight_filler { " @@ -173,7 +173,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerproduct' " " bottom: 'label' " "} "; @@ -192,7 +192,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "name: 'TrickyTestNetwork' " "layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: 5 " " channels: 2 " @@ -212,7 +212,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 1000 " " weight_filler { " @@ -233,7 +233,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 1 " " weight_filler { " @@ -254,7 +254,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + + " type: 'SoftmaxWithLoss' " + loss_weight_stream.str() + " bottom: 'transformed_data' " " bottom: 'transformed_label' " @@ -262,8 +262,8 @@ class NetTest : public MultiDeviceTest<TypeParam> { InitNetFromProtoString(proto); } - // loss_weight is the loss weight for the EUCLIDEAN_LOSS layer output. - // midnet_loss_weight is the loss weight for the first INNER_PRODUCT layer + // loss_weight is the loss weight for the 'EuclideanLoss' layer output. + // midnet_loss_weight is the loss weight for the first 'InnerProduct' layer // output. Should both default to 0.0 if unspecified (i.e., if NULL is // passed to this function). virtual void InitUnsharedWeightsNet(const Dtype* loss_weight = NULL, @@ -279,7 +279,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { proto << "layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: 5 " " channels: 2 " @@ -294,7 +294,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: " << bias_term << @@ -322,7 +322,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: " << bias_term << @@ -346,7 +346,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS "; + " type: 'EuclideanLoss' "; if (loss_weight) { proto << " loss_weight: " << *loss_weight << " "; } @@ -362,7 +362,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "name: 'SharedWeightsNetwork' " "layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: 5 " " channels: 2 " @@ -377,7 +377,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: false " @@ -392,7 +392,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: false " @@ -407,7 +407,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerproduct1' " " bottom: 'innerproduct2' " "} "; @@ -419,7 +419,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "name: 'DiffDataUnsharedWeightsNetwork' " "layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: 10 " " channels: 10 " @@ -439,7 +439,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: false " @@ -454,7 +454,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: false " @@ -469,7 +469,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'data2' " " bottom: 'innerproduct2' " "} "; @@ -481,7 +481,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "name: 'DiffDataSharedWeightsNetwork' " "layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: 10 " " channels: 10 " @@ -501,7 +501,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: false " @@ -516,7 +516,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'innerproduct2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: false " @@ -531,7 +531,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'data2' " " bottom: 'innerproduct2' " "} "; @@ -548,7 +548,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "input_dim: 100 " "layers: { " " name: 'conv1' " - " type: CONVOLUTION " + " type: 'Convolution' " " bottom: 'data' " " top: 'conv1' " " convolution_param { " @@ -567,13 +567,13 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'relu1' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv1' " " top: 'conv1' " "} " "layers: { " " name: 'pool1' " - " type: POOLING " + " type: 'Pooling' " " bottom: 'conv1' " " top: 'pool1' " " pooling_param { " @@ -584,7 +584,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'norm1' " - " type: LRN " + " type: 'LRN' " " bottom: 'pool1' " " top: 'norm1' " " lrn_param { " @@ -593,7 +593,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} " "layers: { " " name: 'softmax' " - " type: SOFTMAX " + " type: 'Softmax' " " bottom: 'norm1' " " top: 'softmax' " "} "; @@ -702,7 +702,7 @@ TYPED_TEST(NetTest, TestBottomNeedBackwardTricky) { TYPED_TEST(NetTest, TestLossWeight) { typedef typename TypeParam::Dtype Dtype; // First, compute the loss and gradients with no loss_weight specified. - // In this case, the loss weight for the EUCLIDEAN_LOSS layer should default + // In this case, the loss weight for the 'EuclideanLoss' layer should default // to 1. vector<Blob<Dtype>*> bottom; Caffe::set_random_seed(this->seed_); @@ -796,8 +796,8 @@ TYPED_TEST(NetTest, TestComboLossWeight) { const bool kForceBackward = true; const Dtype kErrorMargin = 1e-4; - // Get the loss and gradients with EUCLIDEAN_LOSS weight 1, - // INNER_PRODUCT weight 1. + // Get the loss and gradients with 'EuclideanLoss' weight 1, + // 'InnerProduct' weight 1. loss_weight = 1; midnet_loss_weight = 1; Caffe::set_random_seed(this->seed_); @@ -925,7 +925,7 @@ TYPED_TEST(NetTest, TestBackwardWithAccuracyLayer) { this->InitTinyNet(kForceBackward, kAccuracyLayer); EXPECT_TRUE(this->net_->has_blob("accuracy")); vector<Blob<Dtype>*> bottom; - // Test that we can do Backward even though we have an ACCURACY layer. + // Test that we can do Backward even though we have an 'Accuracy' layer. this->net_->ForwardBackward(bottom); } @@ -1263,19 +1263,19 @@ TEST_F(FilterNetTest, TestNoFilter) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1287,7 +1287,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "name: 'LeNet' " "layers { " " name: 'mnist' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " " data_param { " @@ -1301,7 +1301,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'mnist' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " " data_param { " @@ -1315,7 +1315,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'conv1' " - " type: CONVOLUTION " + " type: 'Convolution' " " bottom: 'data' " " top: 'conv1' " " blobs_lr: 1 " @@ -1334,7 +1334,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'ip1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'conv1' " " top: 'ip1' " " blobs_lr: 1 " @@ -1351,7 +1351,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'accuracy' " - " type: ACCURACY " + " type: 'Accuracy' " " bottom: 'ip1' " " bottom: 'label' " " top: 'accuracy' " @@ -1359,7 +1359,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'ip2' " " bottom: 'label' " " top: 'loss' " @@ -1370,7 +1370,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "name: 'LeNet' " "layers { " " name: 'mnist' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " " data_param { " @@ -1384,7 +1384,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'conv1' " - " type: CONVOLUTION " + " type: 'Convolution' " " bottom: 'data' " " top: 'conv1' " " blobs_lr: 1 " @@ -1403,7 +1403,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'ip1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'conv1' " " top: 'ip1' " " blobs_lr: 1 " @@ -1420,7 +1420,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'ip2' " " bottom: 'label' " " top: 'loss' " @@ -1429,7 +1429,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "name: 'LeNet' " "layers { " " name: 'mnist' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " " data_param { " @@ -1443,7 +1443,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'conv1' " - " type: CONVOLUTION " + " type: 'Convolution' " " bottom: 'data' " " top: 'conv1' " " blobs_lr: 1 " @@ -1462,7 +1462,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'ip1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'conv1' " " top: 'ip1' " " blobs_lr: 1 " @@ -1479,7 +1479,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'accuracy' " - " type: ACCURACY " + " type: 'Accuracy' " " bottom: 'ip1' " " bottom: 'label' " " top: 'accuracy' " @@ -1487,7 +1487,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} " "layers { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'ip2' " " bottom: 'label' " " top: 'loss' " @@ -1519,20 +1519,20 @@ TEST_F(FilterNetTest, TestFilterOutByStage) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " " include: { stage: 'mystage' } " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1540,13 +1540,13 @@ TEST_F(FilterNetTest, TestFilterOutByStage) { "name: 'TestNetwork' " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1558,20 +1558,20 @@ TEST_F(FilterNetTest, TestFilterOutByStage2) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { stage: 'mystage' } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1579,13 +1579,13 @@ TEST_F(FilterNetTest, TestFilterOutByStage2) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1598,20 +1598,20 @@ TEST_F(FilterNetTest, TestFilterInByStage) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { stage: 'mystage' } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1623,20 +1623,20 @@ TEST_F(FilterNetTest, TestFilterInByStage2) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " exclude: { stage: 'mystage' } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1649,20 +1649,20 @@ TEST_F(FilterNetTest, TestFilterOutByMultipleStage) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { stage: 'mystage' stage: 'myotherstage' } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " include: { stage: 'mystage' } " @@ -1672,13 +1672,13 @@ TEST_F(FilterNetTest, TestFilterOutByMultipleStage) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " include: { stage: 'mystage' } " @@ -1692,13 +1692,13 @@ TEST_F(FilterNetTest, TestFilterInByMultipleStage) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { stage: 'myotherstage' } " @@ -1706,7 +1706,7 @@ TEST_F(FilterNetTest, TestFilterInByMultipleStage) { "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " include: { stage: 'mystage' } " @@ -1720,20 +1720,20 @@ TEST_F(FilterNetTest, TestFilterInByMultipleStage2) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { stage: 'mystage' stage: 'myotherstage' } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " include: { stage: 'mystage' } " @@ -1747,20 +1747,20 @@ TEST_F(FilterNetTest, TestFilterInByNotStage) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { not_stage: 'myotherstage' } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " include: { not_stage: 'myotherstage' } " @@ -1774,20 +1774,20 @@ TEST_F(FilterNetTest, TestFilterOutByNotStage) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { not_stage: 'mystage' } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " include: { not_stage: 'mystage' } " @@ -1797,7 +1797,7 @@ TEST_F(FilterNetTest, TestFilterOutByNotStage) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} "; @@ -1809,20 +1809,20 @@ TEST_F(FilterNetTest, TestFilterOutByMinLevel) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { min_level: 3 } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1830,13 +1830,13 @@ TEST_F(FilterNetTest, TestFilterOutByMinLevel) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1848,20 +1848,20 @@ TEST_F(FilterNetTest, TestFilterOutByMaxLevel) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { max_level: -3 } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1869,13 +1869,13 @@ TEST_F(FilterNetTest, TestFilterOutByMaxLevel) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1887,20 +1887,20 @@ TEST_F(FilterNetTest, TestFilterInByMinLevel) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { min_level: 0 } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1913,20 +1913,20 @@ TEST_F(FilterNetTest, TestFilterInByMinLevel2) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { min_level: 3 } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1938,20 +1938,20 @@ TEST_F(FilterNetTest, TestFilterInByMaxLevel) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { max_level: 0 } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1964,20 +1964,20 @@ TEST_F(FilterNetTest, TestFilterInByMaxLevel2) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { max_level: -3 } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -1989,20 +1989,20 @@ TEST_F(FilterNetTest, TestFilterInOutByIncludeMultiRule) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { min_level: 2 phase: TRAIN } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " include: { min_level: 2 phase: TEST } " @@ -2016,13 +2016,13 @@ TEST_F(FilterNetTest, TestFilterInOutByIncludeMultiRule) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { min_level: 2 phase: TRAIN } " @@ -2032,13 +2032,13 @@ TEST_F(FilterNetTest, TestFilterInOutByIncludeMultiRule) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " include: { min_level: 2 phase: TEST } " @@ -2052,13 +2052,13 @@ TEST_F(FilterNetTest, TestFilterInByIncludeMultiRule) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { min_level: 2 phase: TRAIN } " @@ -2066,7 +2066,7 @@ TEST_F(FilterNetTest, TestFilterInByIncludeMultiRule) { "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " include: { min_level: 2 phase: TEST } " @@ -2085,20 +2085,20 @@ TEST_F(FilterNetTest, TestFilterInOutByExcludeMultiRule) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " exclude: { min_level: 2 phase: TRAIN } " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " exclude: { min_level: 2 phase: TEST } " @@ -2112,13 +2112,13 @@ TEST_F(FilterNetTest, TestFilterInOutByExcludeMultiRule) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " exclude: { min_level: 2 phase: TEST } " @@ -2128,13 +2128,13 @@ TEST_F(FilterNetTest, TestFilterInOutByExcludeMultiRule) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " exclude: { min_level: 2 phase: TRAIN } " diff --git a/src/caffe/test/test_protobuf.cpp b/src/caffe/test/test_protobuf.cpp index 0c502d6dd36..01de461afdf 100644 --- a/src/caffe/test/test_protobuf.cpp +++ b/src/caffe/test/test_protobuf.cpp @@ -16,7 +16,7 @@ class ProtoTest : public ::testing::Test {}; TEST_F(ProtoTest, TestSerialization) { LayerParameter param; param.set_name("test"); - param.set_type(LayerParameter_LayerType_NONE); + param.set_type("Test"); std::cout << "Printing in binary format." << std::endl; std::cout << param.SerializeAsString() << std::endl; std::cout << "Printing in text format." << std::endl; diff --git a/src/caffe/test/test_solver.cpp b/src/caffe/test/test_solver.cpp index a7dbf77fd95..d3f646c5bb6 100644 --- a/src/caffe/test/test_solver.cpp +++ b/src/caffe/test/test_solver.cpp @@ -53,7 +53,7 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { " name: 'TestNetwork' " " layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: 5 " " channels: 3 " @@ -69,7 +69,7 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { " } " " layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " } " @@ -78,7 +78,7 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { " } " " layers: { " " name: 'accuracy' " - " type: ACCURACY " + " type: 'Accuracy' " " bottom: 'innerprod' " " bottom: 'label' " " top: 'accuracy' " @@ -86,7 +86,7 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { " } " " layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " " include: { phase: TRAIN } " diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index 38e762195a2..584d0a4ab9c 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -116,19 +116,19 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertion1) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -140,32 +140,32 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertion2) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'data_split' " - " type: SPLIT " + " type: 'Split' " " bottom: 'data' " " top: 'data_split_0' " " top: 'data_split_1' " "} " "layers: { " " name: 'innerprod1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data_split_0' " " top: 'innerprod1' " "} " "layers: { " " name: 'innerprod2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data_split_1' " " top: 'innerprod2' " "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod2' " "} "; @@ -177,7 +177,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "name: 'CaffeNet' " "layers { " " name: 'data' " - " type: DATA " + " type: 'Data' " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " @@ -192,7 +192,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'conv1' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 96 " " kernel_size: 11 " @@ -215,13 +215,13 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'relu1' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv1' " " top: 'conv1' " "} " "layers { " " name: 'pool1' " - " type: POOLING " + " type: 'Pooling' " " pooling_param { " " pool: MAX " " kernel_size: 3 " @@ -232,7 +232,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'norm1' " - " type: LRN " + " type: 'LRN' " " lrn_param { " " local_size: 5 " " alpha: 0.0001 " @@ -243,7 +243,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'conv2' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 256 " " group: 2 " @@ -267,13 +267,13 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'relu2' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv2' " " top: 'conv2' " "} " "layers { " " name: 'pool2' " - " type: POOLING " + " type: 'Pooling' " " pooling_param { " " pool: MAX " " kernel_size: 3 " @@ -284,7 +284,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'norm2' " - " type: LRN " + " type: 'LRN' " " lrn_param { " " local_size: 5 " " alpha: 0.0001 " @@ -295,7 +295,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'conv3' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 384 " " kernel_size: 3 " @@ -318,13 +318,13 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'relu3' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv3' " " top: 'conv3' " "} " "layers { " " name: 'conv4' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 384 " " group: 2 " @@ -348,13 +348,13 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'relu4' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv4' " " top: 'conv4' " "} " "layers { " " name: 'conv5' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 256 " " group: 2 " @@ -378,13 +378,13 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'relu5' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv5' " " top: 'conv5' " "} " "layers { " " name: 'pool5' " - " type: POOLING " + " type: 'Pooling' " " pooling_param { " " kernel_size: 3 " " pool: MAX " @@ -395,7 +395,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'fc6' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 4096 " " weight_filler { " @@ -416,13 +416,13 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'relu6' " - " type: RELU " + " type: 'ReLU' " " bottom: 'fc6' " " top: 'fc6' " "} " "layers { " " name: 'drop6' " - " type: DROPOUT " + " type: 'Dropout' " " dropout_param { " " dropout_ratio: 0.5 " " } " @@ -431,7 +431,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'fc7' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 4096 " " weight_filler { " @@ -452,13 +452,13 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'relu7' " - " type: RELU " + " type: 'ReLU' " " bottom: 'fc7' " " top: 'fc7' " "} " "layers { " " name: 'drop7' " - " type: DROPOUT " + " type: 'Dropout' " " dropout_param { " " dropout_ratio: 0.5 " " } " @@ -467,7 +467,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'fc8' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 1000 " " weight_filler { " @@ -488,7 +488,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { "} " "layers { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'fc8' " " bottom: 'label' " "} "; @@ -500,25 +500,25 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionWithInPlace) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " "} " "layers: { " " name: 'relu' " - " type: RELU " + " type: 'ReLU' " " bottom: 'innerprod' " " top: 'innerprod' " "} " "layers: { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " " bottom: 'label' " "} "; @@ -531,7 +531,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { "force_backward: true " "layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: 5 " " channels: 2 " @@ -546,7 +546,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { "} " "layers: { " " name: 'innerproduct1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: false " @@ -562,7 +562,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { "} " "layers: { " " name: 'innerproduct2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: false " @@ -577,7 +577,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerproduct1' " " bottom: 'innerproduct2' " "} "; @@ -586,7 +586,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { "force_backward: true " "layers: { " " name: 'data' " - " type: DUMMY_DATA " + " type: 'DummyData' " " dummy_data_param { " " num: 5 " " channels: 2 " @@ -601,14 +601,14 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { "} " "layers: { " " name: 'data_data_0_split' " - " type: SPLIT " + " type: 'Split' " " bottom: 'data' " " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " "} " "layers: { " " name: 'innerproduct1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: false " @@ -623,7 +623,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { "} " "layers: { " " name: 'innerproduct1_innerproduct1_0_split' " - " type: SPLIT " + " type: 'Split' " " bottom: 'innerproduct1' " " top: 'innerproduct1_innerproduct1_0_split_0' " " top: 'innerproduct1_innerproduct1_0_split_1' " @@ -632,7 +632,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { "} " "layers: { " " name: 'innerproduct2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: false " @@ -647,7 +647,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerproduct1_innerproduct1_0_split_1' " " bottom: 'innerproduct2' " "} "; @@ -659,37 +659,37 @@ TEST_F(SplitLayerInsertionTest, TestInsertion) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod1' " "} " "layers: { " " name: 'innerprod2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod2' " "} " "layers: { " " name: 'innerprod3' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod3' " "} " "layers: { " " name: 'loss1' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod2' " "} " "layers: { " " name: 'loss2' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod2' " " bottom: 'innerprod3' " "} "; @@ -697,13 +697,13 @@ TEST_F(SplitLayerInsertionTest, TestInsertion) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'data_data_0_split' " - " type: SPLIT " + " type: 'Split' " " bottom: 'data' " " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " @@ -711,38 +711,38 @@ TEST_F(SplitLayerInsertionTest, TestInsertion) { "} " "layers: { " " name: 'innerprod1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data_data_0_split_0' " " top: 'innerprod1' " "} " "layers: { " " name: 'innerprod2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data_data_0_split_1' " " top: 'innerprod2' " "} " "layers: { " " name: 'innerprod2_innerprod2_0_split' " - " type: SPLIT " + " type: 'Split' " " bottom: 'innerprod2' " " top: 'innerprod2_innerprod2_0_split_0' " " top: 'innerprod2_innerprod2_0_split_1' " "} " "layers: { " " name: 'innerprod3' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data_data_0_split_2' " " top: 'innerprod3' " "} " "layers: { " " name: 'loss1' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod2_innerprod2_0_split_0' " "} " "layers: { " " name: 'loss2' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod2_innerprod2_0_split_1' " " bottom: 'innerprod3' " "} "; @@ -754,43 +754,43 @@ TEST_F(SplitLayerInsertionTest, TestInsertionTwoTop) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod1' " "} " "layers: { " " name: 'innerprod2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'label' " " top: 'innerprod2' " "} " "layers: { " " name: 'innerprod3' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod3' " "} " "layers: { " " name: 'innerprod4' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'label' " " top: 'innerprod4' " "} " "layers: { " " name: 'loss1' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod3' " "} " "layers: { " " name: 'loss2' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod2' " " bottom: 'innerprod4' " "} "; @@ -798,57 +798,57 @@ TEST_F(SplitLayerInsertionTest, TestInsertionTwoTop) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'data_data_0_split' " - " type: SPLIT " + " type: 'Split' " " bottom: 'data' " " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " "} " "layers: { " " name: 'label_data_1_split' " - " type: SPLIT " + " type: 'Split' " " bottom: 'label' " " top: 'label_data_1_split_0' " " top: 'label_data_1_split_1' " "} " "layers: { " " name: 'innerprod1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data_data_0_split_0' " " top: 'innerprod1' " "} " "layers: { " " name: 'innerprod2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'label_data_1_split_0' " " top: 'innerprod2' " "} " "layers: { " " name: 'innerprod3' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data_data_0_split_1' " " top: 'innerprod3' " "} " "layers: { " " name: 'innerprod4' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'label_data_1_split_1' " " top: 'innerprod4' " "} " "layers: { " " name: 'loss1' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod3' " "} " "layers: { " " name: 'loss2' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod2' " " bottom: 'innerprod4' " "} "; @@ -865,19 +865,19 @@ TEST_F(SplitLayerInsertionTest, TestInputInsertion) { "input_dim: 227 " "layers: { " " name: 'innerprod1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod1' " "} " "layers: { " " name: 'innerprod2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod2' " "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod2' " "} "; @@ -890,26 +890,26 @@ TEST_F(SplitLayerInsertionTest, TestInputInsertion) { "input_dim: 227 " "layers: { " " name: 'data_input_0_split' " - " type: SPLIT " + " type: 'Split' " " bottom: 'data' " " top: 'data_input_0_split_0' " " top: 'data_input_0_split_1' " "} " "layers: { " " name: 'innerprod1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data_input_0_split_0' " " top: 'innerprod1' " "} " "layers: { " " name: 'innerprod2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data_input_0_split_1' " " top: 'innerprod2' " "} " "layers: { " " name: 'loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod2' " "} "; @@ -921,37 +921,37 @@ TEST_F(SplitLayerInsertionTest, TestWithInPlace) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'innerprod1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod1' " "} " "layers: { " " name: 'relu1' " - " type: RELU " + " type: 'ReLU' " " bottom: 'innerprod1' " " top: 'innerprod1' " "} " "layers: { " " name: 'innerprod2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'innerprod1' " " top: 'innerprod2' " "} " "layers: { " " name: 'loss1' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'label' " "} " "layers: { " " name: 'loss2' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod2' " " bottom: 'data' " "} "; @@ -959,51 +959,51 @@ TEST_F(SplitLayerInsertionTest, TestWithInPlace) { "name: 'TestNetwork' " "layers: { " " name: 'data' " - " type: DATA " + " type: 'Data' " " top: 'data' " " top: 'label' " "} " "layers: { " " name: 'data_data_0_split' " - " type: SPLIT " + " type: 'Split' " " bottom: 'data' " " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " "} " "layers: { " " name: 'innerprod1' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'data_data_0_split_0' " " top: 'innerprod1' " "} " "layers: { " " name: 'relu1' " - " type: RELU " + " type: 'ReLU' " " bottom: 'innerprod1' " " top: 'innerprod1' " "} " "layers: { " " name: 'innerprod1_relu1_0_split' " - " type: SPLIT " + " type: 'Split' " " bottom: 'innerprod1' " " top: 'innerprod1_relu1_0_split_0' " " top: 'innerprod1_relu1_0_split_1' " "} " "layers: { " " name: 'innerprod2' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " bottom: 'innerprod1_relu1_0_split_0' " " top: 'innerprod2' " "} " "layers: { " " name: 'loss1' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod1_relu1_0_split_1' " " bottom: 'label' " "} " "layers: { " " name: 'loss2' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " " bottom: 'innerprod2' " " bottom: 'data_data_0_split_1' " "} "; diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index 52e7f1f99f5..e520b85f291 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -1184,7 +1184,7 @@ TEST_F(V0UpgradeTest, TestSimple) { "name: 'CaffeNet' " "layers { " " name: 'data' " - " type: DATA " + " type: 'Data' " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " @@ -1199,7 +1199,7 @@ TEST_F(V0UpgradeTest, TestSimple) { "} " "layers { " " name: 'conv1' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 96 " " kernel_size: 11 " @@ -1223,7 +1223,7 @@ TEST_F(V0UpgradeTest, TestSimple) { "} " "layers { " " name: 'fc8' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 1000 " " weight_filler { " @@ -1244,7 +1244,7 @@ TEST_F(V0UpgradeTest, TestSimple) { "} " "layers { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'fc8' " " bottom: 'label' " "} "; @@ -1520,7 +1520,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "input_dim: 32 " "layers { " " name: 'data' " - " type: DATA " + " type: 'Data' " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " @@ -1537,7 +1537,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'images' " - " type: IMAGE_DATA " + " type: 'ImageData' " " image_data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-images' " " batch_size: 256 " @@ -1557,7 +1557,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'window_data' " - " type: WINDOW_DATA " + " type: 'WindowData' " " window_data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " @@ -1577,7 +1577,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'hdf5data' " - " type: HDF5_DATA " + " type: 'HDF5Data' " " hdf5_data_param { " " source: '/my/hdf5/data' " " batch_size: 256 " @@ -1586,7 +1586,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'conv1' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 96 " " bias_term: false " @@ -1611,7 +1611,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'pool1ave' " - " type: POOLING " + " type: 'Pooling' " " pooling_param { " " pool: AVE " " kernel_size: 3 " @@ -1622,7 +1622,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'pool1stoch' " - " type: POOLING " + " type: 'Pooling' " " pooling_param { " " pool: STOCHASTIC " " kernel_size: 4 " @@ -1633,7 +1633,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'concat' " - " type: CONCAT " + " type: 'Concat' " " concat_param { " " concat_dim: 2 " " } " @@ -1643,7 +1643,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'norm1' " - " type: LRN " + " type: 'LRN' " " lrn_param { " " local_size: 5 " " alpha: 0.0001 " @@ -1654,7 +1654,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'fc6' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 4096 " " bias_term: false " @@ -1676,13 +1676,13 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'relu6' " - " type: RELU " + " type: 'ReLU' " " bottom: 'fc6' " " top: 'fc6' " "} " "layers { " " name: 'drop6' " - " type: DROPOUT " + " type: 'Dropout' " " dropout_param { " " dropout_ratio: 0.2 " " } " @@ -1691,7 +1691,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'loss' " - " type: INFOGAIN_LOSS " + " type: 'InfogainLoss' " " infogain_loss_param { " " source: '/my/infogain/matrix' " " } " @@ -1700,54 +1700,54 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'accuracy' " - " type: ACCURACY " + " type: 'Accuracy' " "} " "layers { " " name: 'bnll' " - " type: BNLL " + " type: 'BNLL' " "} " "layers { " " name: 'euclidean_loss' " - " type: EUCLIDEAN_LOSS " + " type: 'EuclideanLoss' " "} " "layers { " " name: 'flatten' " - " type: FLATTEN " + " type: 'Flatten' " "} " "layers { " " name: 'hdf5_output' " - " type: HDF5_OUTPUT " + " type: 'HDF5Output' " " hdf5_output_param { " " file_name: '/my/hdf5/output/file' " " } " "} " "layers { " " name: 'im2col' " - " type: IM2COL " + " type: 'Im2Col' " "} " "layers { " " name: 'images' " - " type: IMAGE_DATA " + " type: 'ImageData' " "} " "layers { " " name: 'multinomial_logistic_loss' " - " type: MULTINOMIAL_LOGISTIC_LOSS " + " type: 'MultinomialLogisticLoss' " "} " "layers { " " name: 'sigmoid' " - " type: SIGMOID " + " type: 'Sigmoid' " "} " "layers { " " name: 'softmax' " - " type: SOFTMAX " + " type: 'Softmax' " "} " "layers { " " name: 'split' " - " type: SPLIT " + " type: 'Split' " "} " "layers { " " name: 'tanh' " - " type: TANH " + " type: 'TanH' " "} "; this->RunV0UpgradeTest(input_proto, expected_output_proto); } @@ -2122,7 +2122,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "name: 'CaffeNet' " "layers { " " name: 'data' " - " type: DATA " + " type: 'Data' " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " @@ -2137,7 +2137,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'conv1' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 96 " " kernel_size: 11 " @@ -2160,13 +2160,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu1' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv1' " " top: 'conv1' " "} " "layers { " " name: 'pool1' " - " type: POOLING " + " type: 'Pooling' " " pooling_param { " " pool: MAX " " kernel_size: 3 " @@ -2177,7 +2177,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'norm1' " - " type: LRN " + " type: 'LRN' " " lrn_param { " " local_size: 5 " " alpha: 0.0001 " @@ -2188,7 +2188,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'conv2' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 256 " " group: 2 " @@ -2212,13 +2212,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu2' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv2' " " top: 'conv2' " "} " "layers { " " name: 'pool2' " - " type: POOLING " + " type: 'Pooling' " " pooling_param { " " pool: MAX " " kernel_size: 3 " @@ -2229,7 +2229,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'norm2' " - " type: LRN " + " type: 'LRN' " " lrn_param { " " local_size: 5 " " alpha: 0.0001 " @@ -2240,7 +2240,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'conv3' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 384 " " kernel_size: 3 " @@ -2263,13 +2263,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu3' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv3' " " top: 'conv3' " "} " "layers { " " name: 'conv4' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 384 " " group: 2 " @@ -2293,13 +2293,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu4' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv4' " " top: 'conv4' " "} " "layers { " " name: 'conv5' " - " type: CONVOLUTION " + " type: 'Convolution' " " convolution_param { " " num_output: 256 " " group: 2 " @@ -2323,13 +2323,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu5' " - " type: RELU " + " type: 'ReLU' " " bottom: 'conv5' " " top: 'conv5' " "} " "layers { " " name: 'pool5' " - " type: POOLING " + " type: 'Pooling' " " pooling_param { " " kernel_size: 3 " " pool: MAX " @@ -2340,7 +2340,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'fc6' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 4096 " " weight_filler { " @@ -2361,13 +2361,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu6' " - " type: RELU " + " type: 'ReLU' " " bottom: 'fc6' " " top: 'fc6' " "} " "layers { " " name: 'drop6' " - " type: DROPOUT " + " type: 'Dropout' " " dropout_param { " " dropout_ratio: 0.5 " " } " @@ -2376,7 +2376,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'fc7' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 4096 " " weight_filler { " @@ -2397,13 +2397,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu7' " - " type: RELU " + " type: 'ReLU' " " bottom: 'fc7' " " top: 'fc7' " "} " "layers { " " name: 'drop7' " - " type: DROPOUT " + " type: 'Dropout' " " dropout_param { " " dropout_ratio: 0.5 " " } " @@ -2412,7 +2412,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'fc8' " - " type: INNER_PRODUCT " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 1000 " " weight_filler { " @@ -2433,7 +2433,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'loss' " - " type: SOFTMAX_LOSS " + " type: 'SoftmaxWithLoss' " " bottom: 'fc8' " " bottom: 'label' " "} "; diff --git a/src/caffe/util/insert_splits.cpp b/src/caffe/util/insert_splits.cpp index f20efdae8c6..8a0ad53ed2b 100644 --- a/src/caffe/util/insert_splits.cpp +++ b/src/caffe/util/insert_splits.cpp @@ -111,7 +111,7 @@ void ConfigureSplitLayer(const string& layer_name, const string& blob_name, split_layer_param->Clear(); split_layer_param->add_bottom(blob_name); split_layer_param->set_name(SplitLayerName(layer_name, blob_name, blob_idx)); - split_layer_param->set_type(LayerParameter_LayerType_SPLIT); + split_layer_param->set_type("Split"); for (int k = 0; k < split_count; ++k) { split_layer_param->add_top( SplitBlobName(layer_name, blob_name, blob_idx, k)); diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index cbd6003c948..31e7d4db298 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -459,78 +459,78 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, return is_fully_compatible; } -LayerParameter_LayerType UpgradeV0LayerType(const string& type) { +const char* UpgradeV0LayerType(const string& type) { if (type == "accuracy") { - return LayerParameter_LayerType_ACCURACY; + return "Accuracy"; } else if (type == "bnll") { - return LayerParameter_LayerType_BNLL; + return "BNLL"; } else if (type == "concat") { - return LayerParameter_LayerType_CONCAT; + return "Concat"; } else if (type == "conv") { - return LayerParameter_LayerType_CONVOLUTION; + return "Convolution"; } else if (type == "data") { - return LayerParameter_LayerType_DATA; + return "Data"; } else if (type == "dropout") { - return LayerParameter_LayerType_DROPOUT; + return "Dropout"; } else if (type == "euclidean_loss") { - return LayerParameter_LayerType_EUCLIDEAN_LOSS; + return "EuclideanLoss"; } else if (type == "flatten") { - return LayerParameter_LayerType_FLATTEN; + return "Flatten"; } else if (type == "hdf5_data") { - return LayerParameter_LayerType_HDF5_DATA; + return "HDF5Data"; } else if (type == "hdf5_output") { - return LayerParameter_LayerType_HDF5_OUTPUT; + return "HDF5Output"; } else if (type == "im2col") { - return LayerParameter_LayerType_IM2COL; + return "Im2Col"; } else if (type == "images") { - return LayerParameter_LayerType_IMAGE_DATA; + return "ImageData"; } else if (type == "infogain_loss") { - return LayerParameter_LayerType_INFOGAIN_LOSS; + return "InfogainLoss"; } else if (type == "innerproduct") { - return LayerParameter_LayerType_INNER_PRODUCT; + return "InnerProduct"; } else if (type == "lrn") { - return LayerParameter_LayerType_LRN; + return "LRN"; } else if (type == "multinomial_logistic_loss") { - return LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS; + return "MultinomialLogisticLoss"; } else if (type == "pool") { - return LayerParameter_LayerType_POOLING; + return "Pooling"; } else if (type == "relu") { - return LayerParameter_LayerType_RELU; + return "ReLU"; } else if (type == "sigmoid") { - return LayerParameter_LayerType_SIGMOID; + return "Sigmoid"; } else if (type == "softmax") { - return LayerParameter_LayerType_SOFTMAX; + return "Softmax"; } else if (type == "softmax_loss") { - return LayerParameter_LayerType_SOFTMAX_LOSS; + return "SoftmaxWithLoss"; } else if (type == "split") { - return LayerParameter_LayerType_SPLIT; + return "Split"; } else if (type == "tanh") { - return LayerParameter_LayerType_TANH; + return "TanH"; } else if (type == "window_data") { - return LayerParameter_LayerType_WINDOW_DATA; + return "WindowData"; } else { - LOG(FATAL) << "Unknown layer name: " << type; - return LayerParameter_LayerType_NONE; + LOG(FATAL) << "Unknown layer type: " << type; + return ""; } } bool NetNeedsDataUpgrade(const NetParameter& net_param) { for (int i = 0; i < net_param.layers_size(); ++i) { - if (net_param.layers(i).type() == LayerParameter_LayerType_DATA) { + if (net_param.layers(i).type() == "Data") { DataParameter layer_param = net_param.layers(i).data_param(); if (layer_param.has_scale()) { return true; } if (layer_param.has_mean_file()) { return true; } if (layer_param.has_crop_size()) { return true; } if (layer_param.has_mirror()) { return true; } } - if (net_param.layers(i).type() == LayerParameter_LayerType_IMAGE_DATA) { + if (net_param.layers(i).type() == "ImageData") { ImageDataParameter layer_param = net_param.layers(i).image_data_param(); if (layer_param.has_scale()) { return true; } if (layer_param.has_mean_file()) { return true; } if (layer_param.has_crop_size()) { return true; } if (layer_param.has_mirror()) { return true; } } - if (net_param.layers(i).type() == LayerParameter_LayerType_WINDOW_DATA) { + if (net_param.layers(i).type() == "WindowData") { WindowDataParameter layer_param = net_param.layers(i).window_data_param(); if (layer_param.has_scale()) { return true; } if (layer_param.has_mean_file()) { return true; } @@ -541,11 +541,11 @@ bool NetNeedsDataUpgrade(const NetParameter& net_param) { return false; } -#define CONVERT_LAYER_TRANSFORM_PARAM(TYPE, Name, param_name) \ +#define CONVERT_LAYER_TRANSFORM_PARAM(TYPE_NAME, PARAM_NAME) \ do { \ - if (net_param->layers(i).type() == LayerParameter_LayerType_##TYPE) { \ - Name##Parameter* layer_param = \ - net_param->mutable_layers(i)->mutable_##param_name##_param(); \ + if (net_param->layers(i).type() == #TYPE_NAME) { \ + TYPE_NAME##Parameter* layer_param = \ + net_param->mutable_layers(i)->mutable_##PARAM_NAME##_param(); \ TransformationParameter* transform_param = \ net_param->mutable_layers(i)->mutable_transform_param(); \ if (layer_param->has_scale()) { \ @@ -569,9 +569,9 @@ bool NetNeedsDataUpgrade(const NetParameter& net_param) { void UpgradeNetDataTransformation(NetParameter* net_param) { for (int i = 0; i < net_param->layers_size(); ++i) { - CONVERT_LAYER_TRANSFORM_PARAM(DATA, Data, data); - CONVERT_LAYER_TRANSFORM_PARAM(IMAGE_DATA, ImageData, image_data); - CONVERT_LAYER_TRANSFORM_PARAM(WINDOW_DATA, WindowData, window_data); + CONVERT_LAYER_TRANSFORM_PARAM(Data, data); + CONVERT_LAYER_TRANSFORM_PARAM(ImageData, image_data); + CONVERT_LAYER_TRANSFORM_PARAM(WindowData, window_data); } } From 794cd7fbca367c27ab4303c2f6e05683eed3c117 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 12 Jan 2015 14:27:06 -0800 Subject: [PATCH 1088/2053] DataLayer and HDF5OutputLayer can be constructed and destroyed without errors --- include/caffe/data_layers.hpp | 6 ++++-- src/caffe/layers/hdf5_output_layer.cpp | 14 ++++++++------ src/caffe/test/test_hdf5_output_layer.cpp | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index e55a0bbbd7b..cdf2d18bb60 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -181,10 +181,11 @@ class HDF5DataLayer : public Layer<Dtype> { template <typename Dtype> class HDF5OutputLayer : public Layer<Dtype> { public: - explicit HDF5OutputLayer(const LayerParameter& param); + explicit HDF5OutputLayer(const LayerParameter& param) + : Layer<Dtype>(param), file_opened_(false) {} virtual ~HDF5OutputLayer(); virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, - const vector<Blob<Dtype>*>& top) {} + const vector<Blob<Dtype>*>& top); // Data layers have no bottoms, so reshaping is trivial. virtual void Reshape(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) {} @@ -207,6 +208,7 @@ class HDF5OutputLayer : public Layer<Dtype> { const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); virtual void SaveBlobs(); + bool file_opened_; std::string file_name_; hid_t file_id_; Blob<Dtype> data_blob_; diff --git a/src/caffe/layers/hdf5_output_layer.cpp b/src/caffe/layers/hdf5_output_layer.cpp index d2fdeffc53f..f63375c3dc6 100644 --- a/src/caffe/layers/hdf5_output_layer.cpp +++ b/src/caffe/layers/hdf5_output_layer.cpp @@ -12,19 +12,21 @@ namespace caffe { template <typename Dtype> -HDF5OutputLayer<Dtype>::HDF5OutputLayer(const LayerParameter& param) - : Layer<Dtype>(param), - file_name_(param.hdf5_output_param().file_name()) { - /* create a HDF5 file */ +void HDF5OutputLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top) { + file_name_ = this->layer_param_.hdf5_output_param().file_name(); file_id_ = H5Fcreate(file_name_.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK_GE(file_id_, 0) << "Failed to open HDF5 file" << file_name_; + file_opened_ = true; } template <typename Dtype> HDF5OutputLayer<Dtype>::~HDF5OutputLayer<Dtype>() { - herr_t status = H5Fclose(file_id_); - CHECK_GE(status, 0) << "Failed to close HDF5 file " << file_name_; + if (file_opened_) { + herr_t status = H5Fclose(file_id_); + CHECK_GE(status, 0) << "Failed to close HDF5 file " << file_name_; + } } template <typename Dtype> diff --git a/src/caffe/test/test_hdf5_output_layer.cpp b/src/caffe/test/test_hdf5_output_layer.cpp index 2e8f096980a..a23034f284a 100644 --- a/src/caffe/test/test_hdf5_output_layer.cpp +++ b/src/caffe/test/test_hdf5_output_layer.cpp @@ -92,8 +92,8 @@ TYPED_TEST(HDF5OutputLayerTest, TestForward) { // the output hdf5 file is closed. { HDF5OutputLayer<Dtype> layer(param); - EXPECT_EQ(layer.file_name(), this->output_file_name_); layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + EXPECT_EQ(layer.file_name(), this->output_file_name_); layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); } file_id = H5Fopen(this->output_file_name_.c_str(), H5F_ACC_RDONLY, From c7b04c697bf923d13d139a8b162c5dd7d888396c Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 12 Jan 2015 13:42:51 -0800 Subject: [PATCH 1089/2053] Add unit test for LayerRegistry::CreateLayer --- src/caffe/test/test_layer_factory.cpp | 33 +++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/caffe/test/test_layer_factory.cpp diff --git a/src/caffe/test/test_layer_factory.cpp b/src/caffe/test/test_layer_factory.cpp new file mode 100644 index 00000000000..3ad635a792a --- /dev/null +++ b/src/caffe/test/test_layer_factory.cpp @@ -0,0 +1,33 @@ +#include <map> +#include <string> + +#include "gtest/gtest.h" + +#include "caffe/common.hpp" +#include "caffe/layer.hpp" +#include "caffe/layer_factory.hpp" + +#include "caffe/test/test_caffe_main.hpp" + +namespace caffe { + +template <typename TypeParam> +class LayerFactoryTest : public MultiDeviceTest<TypeParam> {}; + +TYPED_TEST_CASE(LayerFactoryTest, TestDtypesAndDevices); + +TYPED_TEST(LayerFactoryTest, TestCreateLayer) { + typedef typename TypeParam::Dtype Dtype; + typename LayerRegistry<Dtype>::CreatorRegistry& registry = + LayerRegistry<Dtype>::Registry(); + shared_ptr<Layer<Dtype> > layer; + LayerParameter layer_param; + for (typename LayerRegistry<Dtype>::CreatorRegistry::iterator iter = + registry.begin(); iter != registry.end(); ++iter) { + layer_param.set_type(iter->first); + layer.reset(LayerRegistry<Dtype>::CreateLayer(layer_param)); + EXPECT_EQ(iter->first, layer->type()); + } +} + +} // namespace caffe From af37eac80f01694a4845607bfcede595f50f893f Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 12 Jan 2015 17:02:15 -0800 Subject: [PATCH 1090/2053] 'layers' -> 'layer' --- src/caffe/net.cpp | 34 ++++++++-------- src/caffe/proto/caffe.proto | 8 +++- src/caffe/proto/caffe_pretty_print.proto | 2 +- src/caffe/util/insert_splits.cpp | 20 ++++----- src/caffe/util/upgrade_proto.cpp | 52 ++++++++++++------------ 5 files changed, 61 insertions(+), 55 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 4350e056085..db9ac7ddbb3 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -55,14 +55,14 @@ void Net<Dtype>::Init(const NetParameter& in_param) { } DLOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); // For each layer, set up their input and output - bottom_vecs_.resize(param.layers_size()); - top_vecs_.resize(param.layers_size()); - bottom_id_vecs_.resize(param.layers_size()); - param_id_vecs_.resize(param.layers_size()); - top_id_vecs_.resize(param.layers_size()); - bottom_need_backward_.resize(param.layers_size()); - for (int layer_id = 0; layer_id < param.layers_size(); ++layer_id) { - const LayerParameter& layer_param = param.layers(layer_id); + bottom_vecs_.resize(param.layer_size()); + top_vecs_.resize(param.layer_size()); + bottom_id_vecs_.resize(param.layer_size()); + param_id_vecs_.resize(param.layer_size()); + top_id_vecs_.resize(param.layer_size()); + bottom_need_backward_.resize(param.layer_size()); + for (int layer_id = 0; layer_id < param.layer_size(); ++layer_id) { + const LayerParameter& layer_param = param.layer(layer_id); layers_.push_back(shared_ptr<Layer<Dtype> >( LayerRegistry<Dtype>::CreateLayer(layer_param))); layer_names_.push_back(layer_param.name()); @@ -242,9 +242,9 @@ void Net<Dtype>::FilterNet(const NetParameter& param, } } param_filtered->CopyFrom(param); - param_filtered->clear_layers(); - for (int i = 0; i < param.layers_size(); ++i) { - const LayerParameter& layer_param = param.layers(i); + param_filtered->clear_layer(); + for (int i = 0; i < param.layer_size(); ++i) { + const LayerParameter& layer_param = param.layer(i); const string& layer_name = layer_param.name(); CHECK(layer_param.include_size() == 0 || layer_param.exclude_size() == 0) << "Specify either include rules or exclude rules; not both."; @@ -262,7 +262,7 @@ void Net<Dtype>::FilterNet(const NetParameter& param, } } if (layer_included) { - param_filtered->add_layers()->CopyFrom(layer_param); + param_filtered->add_layer()->CopyFrom(layer_param); } } } @@ -335,7 +335,7 @@ void Net<Dtype>::AppendTop(const NetParameter& param, const int layer_id, const int top_id, set<string>* available_blobs, map<string, int>* blob_name_to_idx) { shared_ptr<LayerParameter> layer_param((layer_id >= 0) ? - (new LayerParameter(param.layers(layer_id))) : NULL); + (new LayerParameter(param.layer(layer_id))) : NULL); const string& blob_name = layer_param ? (layer_param->top_size() > top_id ? layer_param->top(top_id) : "(automatic)") : param.input(top_id); @@ -385,7 +385,7 @@ template <typename Dtype> int Net<Dtype>::AppendBottom(const NetParameter& param, const int layer_id, const int bottom_id, set<string>* available_blobs, map<string, int>* blob_name_to_idx) { - const LayerParameter& layer_param = param.layers(layer_id); + const LayerParameter& layer_param = param.layer(layer_id); const string& blob_name = layer_param.bottom(bottom_id); if (available_blobs->find(blob_name) == available_blobs->end()) { LOG(FATAL) << "Unknown blob input " << blob_name @@ -730,9 +730,9 @@ void Net<Dtype>::Reshape() { template <typename Dtype> void Net<Dtype>::CopyTrainedLayersFrom(const NetParameter& param) { - int num_source_layers = param.layers_size(); + int num_source_layers = param.layer_size(); for (int i = 0; i < num_source_layers; ++i) { - const LayerParameter& source_layer = param.layers(i); + const LayerParameter& source_layer = param.layer(i); const string& source_layer_name = source_layer.name(); int target_layer_id = 0; while (target_layer_id != layer_names_.size() && @@ -775,7 +775,7 @@ void Net<Dtype>::ToProto(NetParameter* param, bool write_diff) const { } DLOG(INFO) << "Serializing " << layers_.size() << " layers"; for (int i = 0; i < layers_.size(); ++i) { - LayerParameter* layer_param = param->add_layers(); + LayerParameter* layer_param = param->add_layer(); for (int j = 0; j < bottom_id_vecs_[i].size(); ++j) { layer_param->add_bottom(blob_names_[bottom_id_vecs_[i][j]]); } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 1fea3445415..c62e7271c0f 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -45,7 +45,6 @@ message FillerParameter { message NetParameter { optional string name = 1; // consider giving the network a name - repeated LayerParameter layers = 2; // a bunch of layers. // The input blobs to the network. repeated string input = 3; // The dim of the input blobs. For each input blob there should be four @@ -64,6 +63,13 @@ message NetParameter { // Print debugging information about results while running Net::Forward, // Net::Backward, and Net::Update. optional bool debug_info = 7 [default = false]; + + // The layers that make up the net. Each of their configurations, including + // connectivity and behavior, is specified as a LayerParameter. + repeated LayerParameter layer = 100; // ID 100 so layers are printed last. + + // DEPRECATED: use 'layer' instead. + // repeated LayerParameter layers = 2; // a bunch of layers. } // NOTE diff --git a/src/caffe/proto/caffe_pretty_print.proto b/src/caffe/proto/caffe_pretty_print.proto index 6f0a5f6b8df..056541f75f1 100644 --- a/src/caffe/proto/caffe_pretty_print.proto +++ b/src/caffe/proto/caffe_pretty_print.proto @@ -14,5 +14,5 @@ message NetParameterPrettyPrint { optional bool force_backward = 2 [default = false]; repeated string input = 3; repeated int32 input_dim = 4; - repeated LayerParameter layers = 5; + repeated LayerParameter layer = 5; } diff --git a/src/caffe/util/insert_splits.cpp b/src/caffe/util/insert_splits.cpp index 8a0ad53ed2b..416f80ab3c2 100644 --- a/src/caffe/util/insert_splits.cpp +++ b/src/caffe/util/insert_splits.cpp @@ -12,7 +12,7 @@ namespace caffe { void InsertSplits(const NetParameter& param, NetParameter* param_split) { // Initialize by copying from the input NetParameter. param_split->CopyFrom(param); - param_split->clear_layers(); + param_split->clear_layer(); map<string, pair<int, int> > blob_name_to_last_top_idx; map<pair<int, int>, pair<int, int> > bottom_idx_to_source_top_idx; map<pair<int, int>, int> top_idx_to_bottom_count; @@ -25,8 +25,8 @@ void InsertSplits(const NetParameter& param, NetParameter* param_split) { const string& blob_name = param.input(i); blob_name_to_last_top_idx[blob_name] = make_pair(-1, i); } - for (int i = 0; i < param.layers_size(); ++i) { - const LayerParameter& layer_param = param.layers(i); + for (int i = 0; i < param.layer_size(); ++i) { + const LayerParameter& layer_param = param.layer(i); layer_idx_to_layer_name[i] = layer_param.name(); for (int j = 0; j < layer_param.bottom_size(); ++j) { const string& blob_name = layer_param.bottom(j); @@ -56,22 +56,22 @@ void InsertSplits(const NetParameter& param, NetParameter* param_split) { } } } - // Create split layer for any input blobs used by other layers as bottom + // Create split layer for any input blobs used by other layer as bottom // blobs more than once. for (int i = 0; i < param.input_size(); ++i) { const int split_count = top_idx_to_bottom_count[make_pair(-1, i)]; if (split_count > 1) { const string& layer_name = layer_idx_to_layer_name[-1]; const string& blob_name = param.input(i); - LayerParameter* split_layer_param = param_split->add_layers(); + LayerParameter* split_layer_param = param_split->add_layer(); const float kZeroLossWeight = 0; ConfigureSplitLayer(layer_name, blob_name, i, split_count, kZeroLossWeight, split_layer_param); } } - for (int i = 0; i < param.layers_size(); ++i) { - LayerParameter* layer_param = param_split->add_layers(); - layer_param->CopyFrom(param.layers(i)); + for (int i = 0; i < param.layer_size(); ++i) { + LayerParameter* layer_param = param_split->add_layer(); + layer_param->CopyFrom(param.layer(i)); // Replace any shared bottom blobs with split layer outputs. for (int j = 0; j < layer_param->bottom_size(); ++j) { const pair<int, int>& top_idx = @@ -84,7 +84,7 @@ void InsertSplits(const NetParameter& param, NetParameter* param_split) { blob_name, top_idx.second, top_idx_to_bottom_split_idx[top_idx]++)); } } - // Create split layer for any top blobs used by other layers as bottom + // Create split layer for any top blobs used by other layer as bottom // blobs more than once. for (int j = 0; j < layer_param->top_size(); ++j) { const pair<int, int>& top_idx = make_pair(i, j); @@ -92,7 +92,7 @@ void InsertSplits(const NetParameter& param, NetParameter* param_split) { if (split_count > 1) { const string& layer_name = layer_idx_to_layer_name[i]; const string& blob_name = layer_param->top(j); - LayerParameter* split_layer_param = param_split->add_layers(); + LayerParameter* split_layer_param = param_split->add_layer(); const float loss_weight = top_idx_to_loss_weight[top_idx]; ConfigureSplitLayer(layer_name, blob_name, j, split_count, loss_weight, split_layer_param); diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index 31e7d4db298..352d08e90e3 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -13,8 +13,8 @@ namespace caffe { bool NetNeedsUpgrade(const NetParameter& net_param) { - for (int i = 0; i < net_param.layers_size(); ++i) { - if (net_param.layers(i).has_layer()) { + for (int i = 0; i < net_param.layer_size(); ++i) { + if (net_param.layer(i).has_layer()) { return true; } } @@ -32,9 +32,9 @@ bool UpgradeV0Net(const NetParameter& v0_net_param_padding_layers, if (v0_net_param.has_name()) { net_param->set_name(v0_net_param.name()); } - for (int i = 0; i < v0_net_param.layers_size(); ++i) { - is_fully_compatible &= UpgradeLayerParameter(v0_net_param.layers(i), - net_param->add_layers()); + for (int i = 0; i < v0_net_param.layer_size(); ++i) { + is_fully_compatible &= UpgradeLayerParameter(v0_net_param.layer(i), + net_param->add_layer()); } for (int i = 0; i < v0_net_param.input_size(); ++i) { net_param->add_input(v0_net_param.input(i)); @@ -53,19 +53,19 @@ void UpgradeV0PaddingLayers(const NetParameter& param, // Copy everything other than the layers from the original param. param_upgraded_pad->Clear(); param_upgraded_pad->CopyFrom(param); - param_upgraded_pad->clear_layers(); + param_upgraded_pad->clear_layer(); // Figure out which layer each bottom blob comes from. map<string, int> blob_name_to_last_top_idx; for (int i = 0; i < param.input_size(); ++i) { const string& blob_name = param.input(i); blob_name_to_last_top_idx[blob_name] = -1; } - for (int i = 0; i < param.layers_size(); ++i) { - const LayerParameter& layer_connection = param.layers(i); + for (int i = 0; i < param.layer_size(); ++i) { + const LayerParameter& layer_connection = param.layer(i); const V0LayerParameter& layer_param = layer_connection.layer(); // Add the layer to the new net, unless it's a padding layer. if (layer_param.type() != "padding") { - param_upgraded_pad->add_layers()->CopyFrom(layer_connection); + param_upgraded_pad->add_layer()->CopyFrom(layer_connection); } for (int j = 0; j < layer_connection.bottom_size(); ++j) { const string& blob_name = layer_connection.bottom(j); @@ -77,7 +77,7 @@ void UpgradeV0PaddingLayers(const NetParameter& param, if (top_idx == -1) { continue; } - LayerParameter source_layer = param.layers(top_idx); + LayerParameter source_layer = param.layer(top_idx); if (source_layer.layer().type() == "padding") { // This layer has a padding layer as input -- check that it is a conv // layer or a pooling layer and takes only one input. Also check that @@ -93,10 +93,10 @@ void UpgradeV0PaddingLayers(const NetParameter& param, << "Padding Layer takes a single blob as input."; CHECK_EQ(source_layer.top_size(), 1) << "Padding Layer produces a single blob as output."; - int layer_index = param_upgraded_pad->layers_size() - 1; - param_upgraded_pad->mutable_layers(layer_index)->mutable_layer() + int layer_index = param_upgraded_pad->layer_size() - 1; + param_upgraded_pad->mutable_layer(layer_index)->mutable_layer() ->set_pad(source_layer.layer().pad()); - param_upgraded_pad->mutable_layers(layer_index) + param_upgraded_pad->mutable_layer(layer_index) ->set_bottom(j, source_layer.bottom(0)); } } @@ -515,23 +515,23 @@ const char* UpgradeV0LayerType(const string& type) { } bool NetNeedsDataUpgrade(const NetParameter& net_param) { - for (int i = 0; i < net_param.layers_size(); ++i) { - if (net_param.layers(i).type() == "Data") { - DataParameter layer_param = net_param.layers(i).data_param(); + for (int i = 0; i < net_param.layer_size(); ++i) { + if (net_param.layer(i).type() == "Data") { + DataParameter layer_param = net_param.layer(i).data_param(); if (layer_param.has_scale()) { return true; } if (layer_param.has_mean_file()) { return true; } if (layer_param.has_crop_size()) { return true; } if (layer_param.has_mirror()) { return true; } } - if (net_param.layers(i).type() == "ImageData") { - ImageDataParameter layer_param = net_param.layers(i).image_data_param(); + if (net_param.layer(i).type() == "ImageData") { + ImageDataParameter layer_param = net_param.layer(i).image_data_param(); if (layer_param.has_scale()) { return true; } if (layer_param.has_mean_file()) { return true; } if (layer_param.has_crop_size()) { return true; } if (layer_param.has_mirror()) { return true; } } - if (net_param.layers(i).type() == "WindowData") { - WindowDataParameter layer_param = net_param.layers(i).window_data_param(); + if (net_param.layer(i).type() == "WindowData") { + WindowDataParameter layer_param = net_param.layer(i).window_data_param(); if (layer_param.has_scale()) { return true; } if (layer_param.has_mean_file()) { return true; } if (layer_param.has_crop_size()) { return true; } @@ -543,11 +543,11 @@ bool NetNeedsDataUpgrade(const NetParameter& net_param) { #define CONVERT_LAYER_TRANSFORM_PARAM(TYPE_NAME, PARAM_NAME) \ do { \ - if (net_param->layers(i).type() == #TYPE_NAME) { \ + if (net_param->layer(i).type() == #TYPE_NAME) { \ TYPE_NAME##Parameter* layer_param = \ - net_param->mutable_layers(i)->mutable_##PARAM_NAME##_param(); \ + net_param->mutable_layer(i)->mutable_##PARAM_NAME##_param(); \ TransformationParameter* transform_param = \ - net_param->mutable_layers(i)->mutable_transform_param(); \ + net_param->mutable_layer(i)->mutable_transform_param(); \ if (layer_param->has_scale()) { \ transform_param->set_scale(layer_param->scale()); \ layer_param->clear_scale(); \ @@ -568,7 +568,7 @@ bool NetNeedsDataUpgrade(const NetParameter& net_param) { } while (0) void UpgradeNetDataTransformation(NetParameter* net_param) { - for (int i = 0; i < net_param->layers_size(); ++i) { + for (int i = 0; i < net_param->layer_size(); ++i) { CONVERT_LAYER_TRANSFORM_PARAM(Data, data); CONVERT_LAYER_TRANSFORM_PARAM(ImageData, image_data); CONVERT_LAYER_TRANSFORM_PARAM(WindowData, window_data); @@ -590,8 +590,8 @@ void NetParameterToPrettyPrint(const NetParameter& param, for (int i = 0; i < param.input_dim_size(); ++i) { pretty_param->add_input_dim(param.input_dim(i)); } - for (int i = 0; i < param.layers_size(); ++i) { - pretty_param->add_layers()->CopyFrom(param.layers(i)); + for (int i = 0; i < param.layer_size(); ++i) { + pretty_param->add_layer()->CopyFrom(param.layer(i)); } } From bb5ba1b7e025d4bb2a0fc3caedbe17e288b266c4 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 14 Jan 2015 15:07:20 -0800 Subject: [PATCH 1091/2053] restore upgrade_proto --- include/caffe/util/upgrade_proto.hpp | 6 +- src/caffe/proto/caffe.proto | 98 ++++++++++++++++++++-- src/caffe/util/upgrade_proto.cpp | 118 +++++++++++++-------------- 3 files changed, 154 insertions(+), 68 deletions(-) diff --git a/include/caffe/util/upgrade_proto.hpp b/include/caffe/util/upgrade_proto.hpp index 0627afe694c..e89756ed055 100644 --- a/include/caffe/util/upgrade_proto.hpp +++ b/include/caffe/util/upgrade_proto.hpp @@ -24,10 +24,10 @@ void UpgradeV0PaddingLayers(const NetParameter& param, NetParameter* param_upgraded_pad); // Upgrade a single V0LayerConnection to the new LayerParameter format. -bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, - LayerParameter* layer_param); +bool UpgradeLayerParameter(const V1LayerParameter& v0_layer_connection, + V1LayerParameter* layer_param); -const char* UpgradeV0LayerType(const string& type); +V1LayerParameter_LayerType UpgradeV0LayerType(const string& type); // Return true iff any layer contains deprecated data transformation parameters. bool NetNeedsDataUpgrade(const NetParameter& net_param); diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index c62e7271c0f..d81acf309f4 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -69,7 +69,7 @@ message NetParameter { repeated LayerParameter layer = 100; // ID 100 so layers are printed last. // DEPRECATED: use 'layer' instead. - // repeated LayerParameter layers = 2; // a bunch of layers. + repeated V1LayerParameter layers = 2; } // NOTE @@ -297,11 +297,6 @@ message LayerParameter { // for their implementation. These layers include an Engine type and // engine parameter for selecting the implementation. // The default for the engine is set by the ENGINE switch at compile-time. - - // DEPRECATED: The layer parameters specified as a V0LayerParameter. - // This should never be used by any code except to upgrade to the new - // LayerParameter specification. - optional V0LayerParameter layer = 1; } // Message that stores parameters used to apply transformation @@ -695,6 +690,97 @@ message WindowDataParameter { optional string root_folder = 13 [default = ""]; } +// DEPRECATED: use LayerParameter. +message V1LayerParameter { + repeated string bottom = 2; + repeated string top = 3; + optional string name = 4; + repeated NetStateRule include = 32; + repeated NetStateRule exclude = 33; + enum LayerType { + NONE = 0; + ABSVAL = 35; + ACCURACY = 1; + ARGMAX = 30; + BNLL = 2; + CONCAT = 3; + CONTRASTIVE_LOSS = 37; + CONVOLUTION = 4; + DATA = 5; + DROPOUT = 6; + DUMMY_DATA = 32; + EUCLIDEAN_LOSS = 7; + ELTWISE = 25; + EXP = 38; + FLATTEN = 8; + HDF5_DATA = 9; + HDF5_OUTPUT = 10; + HINGE_LOSS = 28; + IM2COL = 11; + IMAGE_DATA = 12; + INFOGAIN_LOSS = 13; + INNER_PRODUCT = 14; + LRN = 15; + MEMORY_DATA = 29; + MULTINOMIAL_LOGISTIC_LOSS = 16; + MVN = 34; + POOLING = 17; + POWER = 26; + RELU = 18; + SIGMOID = 19; + SIGMOID_CROSS_ENTROPY_LOSS = 27; + SILENCE = 36; + SOFTMAX = 20; + SOFTMAX_LOSS = 21; + SPLIT = 22; + SLICE = 33; + TANH = 23; + WINDOW_DATA = 24; + THRESHOLD = 31; + } + optional LayerType type = 5; + repeated BlobProto blobs = 6; + repeated string param = 1001; + repeated DimCheckMode blob_share_mode = 1002; + enum DimCheckMode { + STRICT = 0; + PERMISSIVE = 1; + } + repeated float blobs_lr = 7; + repeated float weight_decay = 8; + repeated float loss_weight = 35; + optional AccuracyParameter accuracy_param = 27; + optional ArgMaxParameter argmax_param = 23; + optional ConcatParameter concat_param = 9; + optional ContrastiveLossParameter contrastive_loss_param = 40; + optional ConvolutionParameter convolution_param = 10; + optional DataParameter data_param = 11; + optional DropoutParameter dropout_param = 12; + optional DummyDataParameter dummy_data_param = 26; + optional EltwiseParameter eltwise_param = 24; + optional ExpParameter exp_param = 41; + optional HDF5DataParameter hdf5_data_param = 13; + optional HDF5OutputParameter hdf5_output_param = 14; + optional HingeLossParameter hinge_loss_param = 29; + optional ImageDataParameter image_data_param = 15; + optional InfogainLossParameter infogain_loss_param = 16; + optional InnerProductParameter inner_product_param = 17; + optional LRNParameter lrn_param = 18; + optional MemoryDataParameter memory_data_param = 22; + optional MVNParameter mvn_param = 34; + optional PoolingParameter pooling_param = 19; + optional PowerParameter power_param = 21; + optional ReLUParameter relu_param = 30; + optional SigmoidParameter sigmoid_param = 38; + optional SoftmaxParameter softmax_param = 39; + optional SliceParameter slice_param = 31; + optional TanHParameter tanh_param = 37; + optional ThresholdParameter threshold_param = 25; + optional WindowDataParameter window_data_param = 20; + optional TransformationParameter transform_param = 36; + optional V0LayerParameter layer = 1; +} + // DEPRECATED: V0LayerParameter is the old way of specifying layer parameters // in Caffe. We keep this message type around for legacy support. message V0LayerParameter { diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index 352d08e90e3..16583b0f0ca 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -13,8 +13,8 @@ namespace caffe { bool NetNeedsUpgrade(const NetParameter& net_param) { - for (int i = 0; i < net_param.layer_size(); ++i) { - if (net_param.layer(i).has_layer()) { + for (int i = 0; i < net_param.layers_size(); ++i) { + if (net_param.layers(i).has_layer()) { return true; } } @@ -32,9 +32,9 @@ bool UpgradeV0Net(const NetParameter& v0_net_param_padding_layers, if (v0_net_param.has_name()) { net_param->set_name(v0_net_param.name()); } - for (int i = 0; i < v0_net_param.layer_size(); ++i) { - is_fully_compatible &= UpgradeLayerParameter(v0_net_param.layer(i), - net_param->add_layer()); + for (int i = 0; i < v0_net_param.layers_size(); ++i) { + is_fully_compatible &= UpgradeLayerParameter(v0_net_param.layers(i), + net_param->add_layers()); } for (int i = 0; i < v0_net_param.input_size(); ++i) { net_param->add_input(v0_net_param.input(i)); @@ -53,19 +53,19 @@ void UpgradeV0PaddingLayers(const NetParameter& param, // Copy everything other than the layers from the original param. param_upgraded_pad->Clear(); param_upgraded_pad->CopyFrom(param); - param_upgraded_pad->clear_layer(); + param_upgraded_pad->clear_layers(); // Figure out which layer each bottom blob comes from. map<string, int> blob_name_to_last_top_idx; for (int i = 0; i < param.input_size(); ++i) { const string& blob_name = param.input(i); blob_name_to_last_top_idx[blob_name] = -1; } - for (int i = 0; i < param.layer_size(); ++i) { - const LayerParameter& layer_connection = param.layer(i); + for (int i = 0; i < param.layers_size(); ++i) { + const V1LayerParameter& layer_connection = param.layers(i); const V0LayerParameter& layer_param = layer_connection.layer(); // Add the layer to the new net, unless it's a padding layer. if (layer_param.type() != "padding") { - param_upgraded_pad->add_layer()->CopyFrom(layer_connection); + param_upgraded_pad->add_layers()->CopyFrom(layer_connection); } for (int j = 0; j < layer_connection.bottom_size(); ++j) { const string& blob_name = layer_connection.bottom(j); @@ -77,7 +77,7 @@ void UpgradeV0PaddingLayers(const NetParameter& param, if (top_idx == -1) { continue; } - LayerParameter source_layer = param.layer(top_idx); + const V1LayerParameter& source_layer = param.layers(top_idx); if (source_layer.layer().type() == "padding") { // This layer has a padding layer as input -- check that it is a conv // layer or a pooling layer and takes only one input. Also check that @@ -93,10 +93,10 @@ void UpgradeV0PaddingLayers(const NetParameter& param, << "Padding Layer takes a single blob as input."; CHECK_EQ(source_layer.top_size(), 1) << "Padding Layer produces a single blob as output."; - int layer_index = param_upgraded_pad->layer_size() - 1; - param_upgraded_pad->mutable_layer(layer_index)->mutable_layer() + int layer_index = param_upgraded_pad->layers_size() - 1; + param_upgraded_pad->mutable_layers(layer_index)->mutable_layer() ->set_pad(source_layer.layer().pad()); - param_upgraded_pad->mutable_layer(layer_index) + param_upgraded_pad->mutable_layers(layer_index) ->set_bottom(j, source_layer.bottom(0)); } } @@ -107,8 +107,8 @@ void UpgradeV0PaddingLayers(const NetParameter& param, } } -bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, - LayerParameter* layer_param) { +bool UpgradeLayerParameter(const V1LayerParameter& v0_layer_connection, + V1LayerParameter* layer_param) { bool is_fully_compatible = true; layer_param->Clear(); for (int i = 0; i < v0_layer_connection.bottom_size(); ++i) { @@ -459,79 +459,79 @@ bool UpgradeLayerParameter(const LayerParameter& v0_layer_connection, return is_fully_compatible; } -const char* UpgradeV0LayerType(const string& type) { +V1LayerParameter_LayerType UpgradeV0LayerType(const string& type) { if (type == "accuracy") { - return "Accuracy"; + return V1LayerParameter_LayerType_ACCURACY; } else if (type == "bnll") { - return "BNLL"; + return V1LayerParameter_LayerType_BNLL; } else if (type == "concat") { - return "Concat"; + return V1LayerParameter_LayerType_CONCAT; } else if (type == "conv") { - return "Convolution"; + return V1LayerParameter_LayerType_CONVOLUTION; } else if (type == "data") { - return "Data"; + return V1LayerParameter_LayerType_DATA; } else if (type == "dropout") { - return "Dropout"; + return V1LayerParameter_LayerType_DROPOUT; } else if (type == "euclidean_loss") { - return "EuclideanLoss"; + return V1LayerParameter_LayerType_EUCLIDEAN_LOSS; } else if (type == "flatten") { - return "Flatten"; + return V1LayerParameter_LayerType_FLATTEN; } else if (type == "hdf5_data") { - return "HDF5Data"; + return V1LayerParameter_LayerType_HDF5_DATA; } else if (type == "hdf5_output") { - return "HDF5Output"; + return V1LayerParameter_LayerType_HDF5_OUTPUT; } else if (type == "im2col") { - return "Im2Col"; + return V1LayerParameter_LayerType_IM2COL; } else if (type == "images") { - return "ImageData"; + return V1LayerParameter_LayerType_IMAGE_DATA; } else if (type == "infogain_loss") { - return "InfogainLoss"; + return V1LayerParameter_LayerType_INFOGAIN_LOSS; } else if (type == "innerproduct") { - return "InnerProduct"; + return V1LayerParameter_LayerType_INNER_PRODUCT; } else if (type == "lrn") { - return "LRN"; + return V1LayerParameter_LayerType_LRN; } else if (type == "multinomial_logistic_loss") { - return "MultinomialLogisticLoss"; + return V1LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS; } else if (type == "pool") { - return "Pooling"; + return V1LayerParameter_LayerType_POOLING; } else if (type == "relu") { - return "ReLU"; + return V1LayerParameter_LayerType_RELU; } else if (type == "sigmoid") { - return "Sigmoid"; + return V1LayerParameter_LayerType_SIGMOID; } else if (type == "softmax") { - return "Softmax"; + return V1LayerParameter_LayerType_SOFTMAX; } else if (type == "softmax_loss") { - return "SoftmaxWithLoss"; + return V1LayerParameter_LayerType_SOFTMAX_LOSS; } else if (type == "split") { - return "Split"; + return V1LayerParameter_LayerType_SPLIT; } else if (type == "tanh") { - return "TanH"; + return V1LayerParameter_LayerType_TANH; } else if (type == "window_data") { - return "WindowData"; + return V1LayerParameter_LayerType_WINDOW_DATA; } else { - LOG(FATAL) << "Unknown layer type: " << type; - return ""; + LOG(FATAL) << "Unknown layer name: " << type; + return V1LayerParameter_LayerType_NONE; } } bool NetNeedsDataUpgrade(const NetParameter& net_param) { - for (int i = 0; i < net_param.layer_size(); ++i) { - if (net_param.layer(i).type() == "Data") { - DataParameter layer_param = net_param.layer(i).data_param(); + for (int i = 0; i < net_param.layers_size(); ++i) { + if (net_param.layers(i).type() == V1LayerParameter_LayerType_DATA) { + DataParameter layer_param = net_param.layers(i).data_param(); if (layer_param.has_scale()) { return true; } if (layer_param.has_mean_file()) { return true; } if (layer_param.has_crop_size()) { return true; } if (layer_param.has_mirror()) { return true; } } - if (net_param.layer(i).type() == "ImageData") { - ImageDataParameter layer_param = net_param.layer(i).image_data_param(); + if (net_param.layers(i).type() == V1LayerParameter_LayerType_IMAGE_DATA) { + ImageDataParameter layer_param = net_param.layers(i).image_data_param(); if (layer_param.has_scale()) { return true; } if (layer_param.has_mean_file()) { return true; } if (layer_param.has_crop_size()) { return true; } if (layer_param.has_mirror()) { return true; } } - if (net_param.layer(i).type() == "WindowData") { - WindowDataParameter layer_param = net_param.layer(i).window_data_param(); + if (net_param.layers(i).type() == V1LayerParameter_LayerType_WINDOW_DATA) { + WindowDataParameter layer_param = net_param.layers(i).window_data_param(); if (layer_param.has_scale()) { return true; } if (layer_param.has_mean_file()) { return true; } if (layer_param.has_crop_size()) { return true; } @@ -541,13 +541,13 @@ bool NetNeedsDataUpgrade(const NetParameter& net_param) { return false; } -#define CONVERT_LAYER_TRANSFORM_PARAM(TYPE_NAME, PARAM_NAME) \ +#define CONVERT_LAYER_TRANSFORM_PARAM(TYPE, Name, param_name) \ do { \ - if (net_param->layer(i).type() == #TYPE_NAME) { \ - TYPE_NAME##Parameter* layer_param = \ - net_param->mutable_layer(i)->mutable_##PARAM_NAME##_param(); \ + if (net_param->layers(i).type() == V1LayerParameter_LayerType_##TYPE) { \ + Name##Parameter* layer_param = \ + net_param->mutable_layers(i)->mutable_##param_name##_param(); \ TransformationParameter* transform_param = \ - net_param->mutable_layer(i)->mutable_transform_param(); \ + net_param->mutable_layers(i)->mutable_transform_param(); \ if (layer_param->has_scale()) { \ transform_param->set_scale(layer_param->scale()); \ layer_param->clear_scale(); \ @@ -568,10 +568,10 @@ bool NetNeedsDataUpgrade(const NetParameter& net_param) { } while (0) void UpgradeNetDataTransformation(NetParameter* net_param) { - for (int i = 0; i < net_param->layer_size(); ++i) { - CONVERT_LAYER_TRANSFORM_PARAM(Data, data); - CONVERT_LAYER_TRANSFORM_PARAM(ImageData, image_data); - CONVERT_LAYER_TRANSFORM_PARAM(WindowData, window_data); + for (int i = 0; i < net_param->layers_size(); ++i) { + CONVERT_LAYER_TRANSFORM_PARAM(DATA, Data, data); + CONVERT_LAYER_TRANSFORM_PARAM(IMAGE_DATA, ImageData, image_data); + CONVERT_LAYER_TRANSFORM_PARAM(WINDOW_DATA, WindowData, window_data); } } @@ -590,7 +590,7 @@ void NetParameterToPrettyPrint(const NetParameter& param, for (int i = 0; i < param.input_dim_size(); ++i) { pretty_param->add_input_dim(param.input_dim(i)); } - for (int i = 0; i < param.layer_size(); ++i) { + for (int i = 0; i < param.layers_size(); ++i) { pretty_param->add_layer()->CopyFrom(param.layer(i)); } } From 2e6a82c8445e588dbc72dabe7126830682a3c3e3 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 14 Jan 2015 16:55:14 -0800 Subject: [PATCH 1092/2053] automagic upgrade for v1->v2 --- include/caffe/util/upgrade_proto.hpp | 25 ++- src/caffe/net.cpp | 13 +- src/caffe/proto/caffe.proto | 105 ++++----- src/caffe/util/upgrade_proto.cpp | 317 ++++++++++++++++++++++++++- tools/upgrade_net_proto_binary.cpp | 13 +- tools/upgrade_net_proto_text.cpp | 15 +- 6 files changed, 410 insertions(+), 78 deletions(-) diff --git a/include/caffe/util/upgrade_proto.hpp b/include/caffe/util/upgrade_proto.hpp index e89756ed055..0df3a8987f9 100644 --- a/include/caffe/util/upgrade_proto.hpp +++ b/include/caffe/util/upgrade_proto.hpp @@ -8,9 +8,12 @@ namespace caffe { +// Return true iff the net is not the current version. +bool NetNeedsUpgrade(const NetParameter& net_param); + // Return true iff any layer contains parameters specified using // deprecated V0LayerParameter. -bool NetNeedsUpgrade(const NetParameter& net_param); +bool NetNeedsV0ToV1Upgrade(const NetParameter& net_param); // Perform all necessary transformations to upgrade a V0NetParameter into a // NetParameter (including upgrading padding layers and LayerParameters). @@ -23,9 +26,9 @@ bool UpgradeV0Net(const NetParameter& v0_net_param, NetParameter* net_param); void UpgradeV0PaddingLayers(const NetParameter& param, NetParameter* param_upgraded_pad); -// Upgrade a single V0LayerConnection to the new LayerParameter format. -bool UpgradeLayerParameter(const V1LayerParameter& v0_layer_connection, - V1LayerParameter* layer_param); +// Upgrade a single V0LayerConnection to the V1LayerParameter format. +bool UpgradeV0LayerParameter(const V1LayerParameter& v0_layer_connection, + V1LayerParameter* layer_param); V1LayerParameter_LayerType UpgradeV0LayerType(const string& type); @@ -36,13 +39,25 @@ bool NetNeedsDataUpgrade(const NetParameter& net_param); // into a TransformationParameter. void UpgradeNetDataTransformation(NetParameter* net_param); +// Return true iff the Net contains any layers specified as V1LayerParameters. +bool NetNeedsV1ToV2Upgrade(const NetParameter& net_param); + +// Perform all necessary transformations to upgrade a NetParameter with +// deprecated V1LayerParameters. +bool UpgradeV1Net(const NetParameter& v1_net_param, NetParameter* net_param); + +bool UpgradeV1LayerParameter(const V1LayerParameter& v1_layer_param, + LayerParameter* layer_param); + +const char* UpgradeV1LayerType(const V1LayerParameter_LayerType type); + // Convert a NetParameter to NetParameterPrettyPrint used for dumping to // proto text files. void NetParameterToPrettyPrint(const NetParameter& param, NetParameterPrettyPrint* pretty_param); // Check for deprecations and upgrade the NetParameter as needed. -void UpgradeNetAsNeeded(NetParameter* param); +bool UpgradeNetAsNeeded(const string& param_file, NetParameter* param); // Read parameters from a file into a NetParameter proto message. void ReadNetParamsFromTextFileOrDie(const string& param_file, diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index db9ac7ddbb3..4461fa88e75 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -138,9 +138,10 @@ void Net<Dtype>::Init(const NetParameter& in_param) { CHECK(param_size == num_param_blobs || param_size == 0) << "Incorrect param size: should be either 0 or the same as " "the number of the layer's parameter blobs: " << num_param_blobs; - const int blob_share_mode_size = layer_param.blob_share_mode_size(); - CHECK(blob_share_mode_size == num_param_blobs || blob_share_mode_size == 0) - << "Incorrect blob_share_mode size: should be either 0 or the same as " + const int param_share_mode_size = layer_param.param_share_mode_size(); + CHECK(param_share_mode_size == num_param_blobs || + param_share_mode_size == 0) + << "Incorrect param_share_mode size: should be either 0 or the same as " "the number of the layer's parameter blobs: " << num_param_blobs; for (int param_id = 0; param_id < num_param_blobs; ++param_id) { AppendParam(param, layer_id, param_id); @@ -441,9 +442,9 @@ void Net<Dtype>::AppendParam(const NetParameter& param, const int layer_id, Blob<Dtype>* this_blob = layers_[layer_id]->blobs()[param_id].get(); Blob<Dtype>* owner_blob = layers_[owner_layer_id]->blobs()[owner_param_id].get(); - const int blob_share_mode_size = layer_param.blob_share_mode_size(); - if (blob_share_mode_size > param_id && - (layer_param.blob_share_mode(param_id) == + const int param_share_mode_size = layer_param.param_share_mode_size(); + if (param_share_mode_size > param_id && + (layer_param.param_share_mode(param_id) == LayerParameter_DimCheckMode_PERMISSIVE)) { // Permissive dimension checking -- only check counts are the same. CHECK_EQ(this_blob->count(), owner_blob->count()) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index d81acf309f4..1178efe53a8 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -218,77 +218,80 @@ message NetStateRule { // // LayerParameter next available ID: 43 (last added: loss_param) message LayerParameter { - repeated string bottom = 2; // the name of the bottom blobs - repeated string top = 3; // the name of the top blobs - optional string name = 4; // the layer name - - // Rules controlling whether and when a layer is included in the network, - // based on the current NetState. You may specify a non-zero number of rules - // to include OR exclude, but not both. If no include or exclude rules are - // specified, the layer is always included. If the current NetState meets - // ANY (i.e., one or more) of the specified rules, the layer is - // included/excluded. - repeated NetStateRule include = 32; - repeated NetStateRule exclude = 33; + optional string name = 1; // the layer name + optional string type = 2; // the layer type + repeated string bottom = 3; // the name of each bottom blob + repeated string top = 4; // the name of each top blob - optional string type = 5; // the layer type from the enum above + // The amount of weight to assign each top blob in the objective. + // Each layer assigns a default value, usually of either 0 or 1, + // to each top blob. + repeated float loss_weight = 5; // The blobs containing the numeric parameters of the layer repeated BlobProto blobs = 6; + // The names of the parameter blobs -- useful for sharing parameters among // layers (but never required). - repeated string param = 1001; + repeated string param = 7; + // Whether to require shared weights to have the same shape, or just the same // count -- defaults to STRICT if unspecified. - repeated DimCheckMode blob_share_mode = 1002; + repeated DimCheckMode param_share_mode = 8; enum DimCheckMode { // STRICT (default) requires that num, channels, height, width each match. STRICT = 0; // PERMISSIVE requires only the count (num*channels*height*width) to match. PERMISSIVE = 1; } + // The ratio that is multiplied on the global learning rate. If you want to // set the learning ratio for one blob, you need to set it for all blobs. - repeated float blobs_lr = 7; - // The weight decay that is multiplied on the global weight decay. - repeated float weight_decay = 8; + repeated float blobs_lr = 9; - // The amount of weight to assign each top blob in the objective. - // Each layer assigns a default value, usually of either 0 or 1, - // to each top blob. - repeated float loss_weight = 35; + // The weight decay that is multiplied on the global weight decay. + repeated float weight_decay = 10; - optional AccuracyParameter accuracy_param = 27; - optional ArgMaxParameter argmax_param = 23; - optional ConcatParameter concat_param = 9; - optional ContrastiveLossParameter contrastive_loss_param = 40; - optional ConvolutionParameter convolution_param = 10; - optional DataParameter data_param = 11; - optional DropoutParameter dropout_param = 12; - optional DummyDataParameter dummy_data_param = 26; - optional EltwiseParameter eltwise_param = 24; - optional ExpParameter exp_param = 41; - optional HDF5DataParameter hdf5_data_param = 13; - optional HDF5OutputParameter hdf5_output_param = 14; - optional HingeLossParameter hinge_loss_param = 29; - optional ImageDataParameter image_data_param = 15; - optional InfogainLossParameter infogain_loss_param = 16; - optional InnerProductParameter inner_product_param = 17; - optional LRNParameter lrn_param = 18; - optional MemoryDataParameter memory_data_param = 22; - optional MVNParameter mvn_param = 34; - optional PoolingParameter pooling_param = 19; - optional PowerParameter power_param = 21; - optional ReLUParameter relu_param = 30; - optional SigmoidParameter sigmoid_param = 38; - optional SoftmaxParameter softmax_param = 39; - optional SliceParameter slice_param = 31; - optional TanHParameter tanh_param = 37; - optional ThresholdParameter threshold_param = 25; - optional WindowDataParameter window_data_param = 20; + // Rules controlling whether and when a layer is included in the network, + // based on the current NetState. You may specify a non-zero number of rules + // to include OR exclude, but not both. If no include or exclude rules are + // specified, the layer is always included. If the current NetState meets + // ANY (i.e., one or more) of the specified rules, the layer is + // included/excluded. + repeated NetStateRule include = 11; + repeated NetStateRule exclude = 12; // Parameters for data pre-processing. - optional TransformationParameter transform_param = 36; + optional TransformationParameter transform_param = 13; + + optional AccuracyParameter accuracy_param = 14; + optional ArgMaxParameter argmax_param = 15; + optional ConcatParameter concat_param = 16; + optional ContrastiveLossParameter contrastive_loss_param = 17; + optional ConvolutionParameter convolution_param = 18; + optional DataParameter data_param = 19; + optional DropoutParameter dropout_param = 20; + optional DummyDataParameter dummy_data_param = 21; + optional EltwiseParameter eltwise_param = 22; + optional ExpParameter exp_param = 23; + optional HDF5DataParameter hdf5_data_param = 24; + optional HDF5OutputParameter hdf5_output_param = 25; + optional HingeLossParameter hinge_loss_param = 26; + optional ImageDataParameter image_data_param = 27; + optional InfogainLossParameter infogain_loss_param = 28; + optional InnerProductParameter inner_product_param = 29; + optional LRNParameter lrn_param = 30; + optional MemoryDataParameter memory_data_param = 31; + optional MVNParameter mvn_param = 32; + optional PoolingParameter pooling_param = 33; + optional PowerParameter power_param = 34; + optional ReLUParameter relu_param = 35; + optional SigmoidParameter sigmoid_param = 36; + optional SoftmaxParameter softmax_param = 37; + optional SliceParameter slice_param = 38; + optional TanHParameter tanh_param = 39; + optional ThresholdParameter threshold_param = 40; + optional WindowDataParameter window_data_param = 41; // Parameters shared by loss layers. optional LossParameter loss_param = 42; diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index 16583b0f0ca..575d7a73fee 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -13,6 +13,10 @@ namespace caffe { bool NetNeedsUpgrade(const NetParameter& net_param) { + return NetNeedsV0ToV1Upgrade(net_param) || NetNeedsV1ToV2Upgrade(net_param); +} + +bool NetNeedsV0ToV1Upgrade(const NetParameter& net_param) { for (int i = 0; i < net_param.layers_size(); ++i) { if (net_param.layers(i).has_layer()) { return true; @@ -21,6 +25,10 @@ bool NetNeedsUpgrade(const NetParameter& net_param) { return false; } +bool NetNeedsV1ToV2Upgrade(const NetParameter& net_param) { + return net_param.layers_size() > 0; +} + bool UpgradeV0Net(const NetParameter& v0_net_param_padding_layers, NetParameter* net_param) { // First upgrade padding layers to padded conv layers. @@ -33,8 +41,8 @@ bool UpgradeV0Net(const NetParameter& v0_net_param_padding_layers, net_param->set_name(v0_net_param.name()); } for (int i = 0; i < v0_net_param.layers_size(); ++i) { - is_fully_compatible &= UpgradeLayerParameter(v0_net_param.layers(i), - net_param->add_layers()); + is_fully_compatible &= UpgradeV0LayerParameter(v0_net_param.layers(i), + net_param->add_layers()); } for (int i = 0; i < v0_net_param.input_size(); ++i) { net_param->add_input(v0_net_param.input(i)); @@ -107,8 +115,8 @@ void UpgradeV0PaddingLayers(const NetParameter& param, } } -bool UpgradeLayerParameter(const V1LayerParameter& v0_layer_connection, - V1LayerParameter* layer_param) { +bool UpgradeV0LayerParameter(const V1LayerParameter& v0_layer_connection, + V1LayerParameter* layer_param) { bool is_fully_compatible = true; layer_param->Clear(); for (int i = 0; i < v0_layer_connection.bottom_size(); ++i) { @@ -590,19 +598,21 @@ void NetParameterToPrettyPrint(const NetParameter& param, for (int i = 0; i < param.input_dim_size(); ++i) { pretty_param->add_input_dim(param.input_dim(i)); } - for (int i = 0; i < param.layers_size(); ++i) { + for (int i = 0; i < param.layer_size(); ++i) { pretty_param->add_layer()->CopyFrom(param.layer(i)); } } -void UpgradeNetAsNeeded(const string& param_file, NetParameter* param) { - if (NetNeedsUpgrade(*param)) { +bool UpgradeNetAsNeeded(const string& param_file, NetParameter* param) { + bool success = true; + if (NetNeedsV0ToV1Upgrade(*param)) { // NetParameter was specified using the old style (V0LayerParameter); try to // upgrade it. LOG(ERROR) << "Attempting to upgrade input file specified using deprecated " << "V0LayerParameter: " << param_file; NetParameter original_param(*param); if (!UpgradeV0Net(original_param, param)) { + success = false; LOG(ERROR) << "Warning: had one or more problems upgrading " << "V0NetParameter to NetParameter (see above); continuing anyway."; } else { @@ -624,6 +634,299 @@ void UpgradeNetAsNeeded(const string& param_file, NetParameter* param) { LOG(ERROR) << "Note that future Caffe releases will only support " << "transform_param messages for transformation fields."; } + if (NetNeedsV1ToV2Upgrade(*param)) { + LOG(ERROR) << "Attempting to upgrade input file specified using deprecated " + << "V1LayerParameter: " << param_file; + NetParameter original_param(*param); + if (!UpgradeV1Net(original_param, param)) { + success = false; + LOG(ERROR) << "Warning: had one or more problems upgrading " + << "V1LayerParameter (see above); continuing anyway."; + } else { + LOG(INFO) << "Successfully upgraded file specified using deprecated " + << "V1LayerParameter"; + } + } + return success; +} + +bool UpgradeV1Net(const NetParameter& v1_net_param, NetParameter* net_param) { + bool is_fully_compatible = true; + if (v1_net_param.layer_size() > 0) { + LOG(ERROR) << "Input NetParameter to be upgraded already specifies 'layer' " + << "fields; these will be ignored for the upgrade."; + is_fully_compatible = false; + } + net_param->CopyFrom(v1_net_param); + net_param->clear_layers(); + for (int i = 0; i < v1_net_param.layers_size(); ++i) { + if (!UpgradeV1LayerParameter(v1_net_param.layers(i), + net_param->add_layer())) { + LOG(ERROR) << "Upgrade of input layer " << i << " failed."; + is_fully_compatible = false; + } + } + return is_fully_compatible; +} + +bool UpgradeV1LayerParameter(const V1LayerParameter& v1_layer_param, + LayerParameter* layer_param) { + layer_param->Clear(); + bool is_fully_compatible = true; + for (int i = 0; i < v1_layer_param.bottom_size(); ++i) { + layer_param->add_bottom(v1_layer_param.bottom(i)); + } + for (int i = 0; i < v1_layer_param.top_size(); ++i) { + layer_param->add_top(v1_layer_param.top(i)); + } + if (v1_layer_param.has_name()) { + layer_param->set_name(v1_layer_param.name()); + } + for (int i = 0; i < v1_layer_param.include_size(); ++i) { + layer_param->add_include()->CopyFrom(v1_layer_param.include(i)); + } + for (int i = 0; i < v1_layer_param.exclude_size(); ++i) { + layer_param->add_exclude()->CopyFrom(v1_layer_param.exclude(i)); + } + if (v1_layer_param.has_type()) { + layer_param->set_type(UpgradeV1LayerType(v1_layer_param.type())); + } + for (int i = 0; i < v1_layer_param.blobs_size(); ++i) { + layer_param->add_blobs()->CopyFrom(v1_layer_param.blobs(i)); + } + for (int i = 0; i < v1_layer_param.param_size(); ++i) { + layer_param->add_param(v1_layer_param.param(i)); + } + for (int i = 0; i < v1_layer_param.blob_share_mode_size(); ++i) { + switch (v1_layer_param.blob_share_mode(i)) { + case V1LayerParameter_DimCheckMode_STRICT: + layer_param->add_param_share_mode(LayerParameter_DimCheckMode_STRICT); + break; + case V1LayerParameter_DimCheckMode_PERMISSIVE: + layer_param->add_param_share_mode(LayerParameter_DimCheckMode_PERMISSIVE); + break; + default: + LOG(FATAL) << "Unknown blob_share_mode: " + << v1_layer_param.blob_share_mode(i); + break; + } + } + for (int i = 0; i < v1_layer_param.blobs_lr_size(); ++i) { + layer_param->add_blobs_lr(v1_layer_param.blobs_lr(i)); + } + for (int i = 0; i < v1_layer_param.weight_decay_size(); ++i) { + layer_param->add_weight_decay(v1_layer_param.weight_decay(i)); + } + for (int i = 0; i < v1_layer_param.loss_weight_size(); ++i) { + layer_param->add_loss_weight(v1_layer_param.loss_weight(i)); + } + if (v1_layer_param.has_accuracy_param()) { + layer_param->mutable_accuracy_param()->CopyFrom( + v1_layer_param.accuracy_param()); + } + if (v1_layer_param.has_argmax_param()) { + layer_param->mutable_argmax_param()->CopyFrom( + v1_layer_param.argmax_param()); + } + if (v1_layer_param.has_concat_param()) { + layer_param->mutable_concat_param()->CopyFrom( + v1_layer_param.concat_param()); + } + if (v1_layer_param.has_contrastive_loss_param()) { + layer_param->mutable_contrastive_loss_param()->CopyFrom( + v1_layer_param.contrastive_loss_param()); + } + if (v1_layer_param.has_convolution_param()) { + layer_param->mutable_convolution_param()->CopyFrom( + v1_layer_param.convolution_param()); + } + if (v1_layer_param.has_data_param()) { + layer_param->mutable_data_param()->CopyFrom( + v1_layer_param.data_param()); + } + if (v1_layer_param.has_dropout_param()) { + layer_param->mutable_dropout_param()->CopyFrom( + v1_layer_param.dropout_param()); + } + if (v1_layer_param.has_dummy_data_param()) { + layer_param->mutable_dummy_data_param()->CopyFrom( + v1_layer_param.dummy_data_param()); + } + if (v1_layer_param.has_eltwise_param()) { + layer_param->mutable_eltwise_param()->CopyFrom( + v1_layer_param.eltwise_param()); + } + if (v1_layer_param.has_exp_param()) { + layer_param->mutable_exp_param()->CopyFrom( + v1_layer_param.exp_param()); + } + if (v1_layer_param.has_hdf5_data_param()) { + layer_param->mutable_hdf5_data_param()->CopyFrom( + v1_layer_param.hdf5_data_param()); + } + if (v1_layer_param.has_hdf5_output_param()) { + layer_param->mutable_hdf5_output_param()->CopyFrom( + v1_layer_param.hdf5_output_param()); + } + if (v1_layer_param.has_hinge_loss_param()) { + layer_param->mutable_hinge_loss_param()->CopyFrom( + v1_layer_param.hinge_loss_param()); + } + if (v1_layer_param.has_image_data_param()) { + layer_param->mutable_image_data_param()->CopyFrom( + v1_layer_param.image_data_param()); + } + if (v1_layer_param.has_infogain_loss_param()) { + layer_param->mutable_infogain_loss_param()->CopyFrom( + v1_layer_param.infogain_loss_param()); + } + if (v1_layer_param.has_inner_product_param()) { + layer_param->mutable_inner_product_param()->CopyFrom( + v1_layer_param.inner_product_param()); + } + if (v1_layer_param.has_lrn_param()) { + layer_param->mutable_lrn_param()->CopyFrom( + v1_layer_param.lrn_param()); + } + if (v1_layer_param.has_memory_data_param()) { + layer_param->mutable_memory_data_param()->CopyFrom( + v1_layer_param.memory_data_param()); + } + if (v1_layer_param.has_mvn_param()) { + layer_param->mutable_mvn_param()->CopyFrom( + v1_layer_param.mvn_param()); + } + if (v1_layer_param.has_pooling_param()) { + layer_param->mutable_pooling_param()->CopyFrom( + v1_layer_param.pooling_param()); + } + if (v1_layer_param.has_power_param()) { + layer_param->mutable_power_param()->CopyFrom( + v1_layer_param.power_param()); + } + if (v1_layer_param.has_relu_param()) { + layer_param->mutable_relu_param()->CopyFrom( + v1_layer_param.relu_param()); + } + if (v1_layer_param.has_sigmoid_param()) { + layer_param->mutable_sigmoid_param()->CopyFrom( + v1_layer_param.sigmoid_param()); + } + if (v1_layer_param.has_softmax_param()) { + layer_param->mutable_softmax_param()->CopyFrom( + v1_layer_param.softmax_param()); + } + if (v1_layer_param.has_slice_param()) { + layer_param->mutable_slice_param()->CopyFrom( + v1_layer_param.slice_param()); + } + if (v1_layer_param.has_tanh_param()) { + layer_param->mutable_tanh_param()->CopyFrom( + v1_layer_param.tanh_param()); + } + if (v1_layer_param.has_threshold_param()) { + layer_param->mutable_threshold_param()->CopyFrom( + v1_layer_param.threshold_param()); + } + if (v1_layer_param.has_window_data_param()) { + layer_param->mutable_window_data_param()->CopyFrom( + v1_layer_param.window_data_param()); + } + if (v1_layer_param.has_transform_param()) { + layer_param->mutable_transform_param()->CopyFrom( + v1_layer_param.transform_param()); + } + if (v1_layer_param.has_layer()) { + LOG(ERROR) << "Input NetParameter has V0 layer -- ignoring."; + is_fully_compatible = false; + } + return is_fully_compatible; +} + +const char* UpgradeV1LayerType(const V1LayerParameter_LayerType type) { + switch (type) { + case V1LayerParameter_LayerType_NONE: + return ""; + case V1LayerParameter_LayerType_ABSVAL: + return "AbsVal"; + case V1LayerParameter_LayerType_ACCURACY: + return "Accuracy"; + case V1LayerParameter_LayerType_ARGMAX: + return "ArgMax"; + case V1LayerParameter_LayerType_BNLL: + return "BNLL"; + case V1LayerParameter_LayerType_CONCAT: + return "Concat"; + case V1LayerParameter_LayerType_CONTRASTIVE_LOSS: + return "ContrastiveLoss"; + case V1LayerParameter_LayerType_CONVOLUTION: + return "Convolution"; + case V1LayerParameter_LayerType_DATA: + return "Data"; + case V1LayerParameter_LayerType_DROPOUT: + return "Dropout"; + case V1LayerParameter_LayerType_DUMMY_DATA: + return "DummyData"; + case V1LayerParameter_LayerType_EUCLIDEAN_LOSS: + return "EuclideanLoss"; + case V1LayerParameter_LayerType_ELTWISE: + return "Eltwise"; + case V1LayerParameter_LayerType_EXP: + return "Exp"; + case V1LayerParameter_LayerType_FLATTEN: + return "Flatten"; + case V1LayerParameter_LayerType_HDF5_DATA: + return "HDF5Data"; + case V1LayerParameter_LayerType_HDF5_OUTPUT: + return "HDF5Output"; + case V1LayerParameter_LayerType_HINGE_LOSS: + return "HingeLoss"; + case V1LayerParameter_LayerType_IM2COL: + return "Im2col"; + case V1LayerParameter_LayerType_IMAGE_DATA: + return "ImageData"; + case V1LayerParameter_LayerType_INFOGAIN_LOSS: + return "InfogainLoss"; + case V1LayerParameter_LayerType_INNER_PRODUCT: + return "InnerProduct"; + case V1LayerParameter_LayerType_LRN: + return "LRN"; + case V1LayerParameter_LayerType_MEMORY_DATA: + return "MemoryData"; + case V1LayerParameter_LayerType_MULTINOMIAL_LOGISTIC_LOSS: + return "MultinomialLogisticLoss"; + case V1LayerParameter_LayerType_MVN: + return "MVN"; + case V1LayerParameter_LayerType_POOLING: + return "Pooling"; + case V1LayerParameter_LayerType_POWER: + return "Power"; + case V1LayerParameter_LayerType_RELU: + return "ReLU"; + case V1LayerParameter_LayerType_SIGMOID: + return "Sigmoid"; + case V1LayerParameter_LayerType_SIGMOID_CROSS_ENTROPY_LOSS: + return "SigmoidCrossEntropyLoss"; + case V1LayerParameter_LayerType_SILENCE: + return "Silence"; + case V1LayerParameter_LayerType_SOFTMAX: + return "Softmax"; + case V1LayerParameter_LayerType_SOFTMAX_LOSS: + return "SoftmaxWithLoss"; + case V1LayerParameter_LayerType_SPLIT: + return "Split"; + case V1LayerParameter_LayerType_SLICE: + return "Slice"; + case V1LayerParameter_LayerType_TANH: + return "TanH"; + case V1LayerParameter_LayerType_WINDOW_DATA: + return "WindowData"; + case V1LayerParameter_LayerType_THRESHOLD: + return "Threshold"; + default: + LOG(FATAL) << "Unknown V1LayerParameter layer type: " << type; + return ""; + } } void ReadNetParamsFromTextFileOrDie(const string& param_file, diff --git a/tools/upgrade_net_proto_binary.cpp b/tools/upgrade_net_proto_binary.cpp index d7a62e32441..8a0dd7af743 100644 --- a/tools/upgrade_net_proto_binary.cpp +++ b/tools/upgrade_net_proto_binary.cpp @@ -5,6 +5,7 @@ #include <cstring> #include <fstream> // NOLINT(readability/streams) #include <iostream> // NOLINT(readability/streams) +#include <string> #include "caffe/caffe.hpp" #include "caffe/util/io.hpp" @@ -23,16 +24,20 @@ int main(int argc, char** argv) { } NetParameter net_param; - if (!ReadProtoFromBinaryFile(argv[1], &net_param)) { + string input_filename(argv[1]); + if (!ReadProtoFromBinaryFile(input_filename, &net_param)) { LOG(ERROR) << "Failed to parse input binary file as NetParameter: " - << argv[1]; + << input_filename; return 2; } bool need_upgrade = NetNeedsUpgrade(net_param); bool success = true; if (need_upgrade) { - NetParameter v0_net_param(net_param); - success = UpgradeV0Net(v0_net_param, &net_param); + success = UpgradeNetAsNeeded(input_filename, &net_param); + if (!success) { + LOG(ERROR) << "Encountered error(s) while upgrading prototxt; " + << "see details above."; + } } else { LOG(ERROR) << "File already in V1 proto format: " << argv[1]; } diff --git a/tools/upgrade_net_proto_text.cpp b/tools/upgrade_net_proto_text.cpp index 2f290fc5e14..0fe420a6d36 100644 --- a/tools/upgrade_net_proto_text.cpp +++ b/tools/upgrade_net_proto_text.cpp @@ -5,6 +5,7 @@ #include <cstring> #include <fstream> // NOLINT(readability/streams) #include <iostream> // NOLINT(readability/streams) +#include <string> #include "caffe/caffe.hpp" #include "caffe/util/io.hpp" @@ -23,19 +24,23 @@ int main(int argc, char** argv) { } NetParameter net_param; - if (!ReadProtoFromTextFile(argv[1], &net_param)) { + string input_filename(argv[1]); + if (!ReadProtoFromTextFile(input_filename, &net_param)) { LOG(ERROR) << "Failed to parse input text file as NetParameter: " - << argv[1]; + << input_filename; return 2; } bool need_upgrade = NetNeedsUpgrade(net_param); bool need_data_upgrade = NetNeedsDataUpgrade(net_param); bool success = true; if (need_upgrade) { - NetParameter v0_net_param(net_param); - success = UpgradeV0Net(v0_net_param, &net_param); + success = UpgradeNetAsNeeded(input_filename, &net_param); + if (!success) { + LOG(ERROR) << "Encountered error(s) while upgrading prototxt; " + << "see details above."; + } } else { - LOG(ERROR) << "File already in V1 proto format: " << argv[1]; + LOG(ERROR) << "File already in latest proto format: " << input_filename; } if (need_data_upgrade) { From cb08ffd9a3506e1c058ba5959ce05021b5f72338 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 14 Jan 2015 18:31:23 -0800 Subject: [PATCH 1093/2053] restore test_upgrade_proto to dev version --- src/caffe/test/test_upgrade_proto.cpp | 106 +++++++++++++------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index e520b85f291..52e7f1f99f5 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -1184,7 +1184,7 @@ TEST_F(V0UpgradeTest, TestSimple) { "name: 'CaffeNet' " "layers { " " name: 'data' " - " type: 'Data' " + " type: DATA " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " @@ -1199,7 +1199,7 @@ TEST_F(V0UpgradeTest, TestSimple) { "} " "layers { " " name: 'conv1' " - " type: 'Convolution' " + " type: CONVOLUTION " " convolution_param { " " num_output: 96 " " kernel_size: 11 " @@ -1223,7 +1223,7 @@ TEST_F(V0UpgradeTest, TestSimple) { "} " "layers { " " name: 'fc8' " - " type: 'InnerProduct' " + " type: INNER_PRODUCT " " inner_product_param { " " num_output: 1000 " " weight_filler { " @@ -1244,7 +1244,7 @@ TEST_F(V0UpgradeTest, TestSimple) { "} " "layers { " " name: 'loss' " - " type: 'SoftmaxWithLoss' " + " type: SOFTMAX_LOSS " " bottom: 'fc8' " " bottom: 'label' " "} "; @@ -1520,7 +1520,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "input_dim: 32 " "layers { " " name: 'data' " - " type: 'Data' " + " type: DATA " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " @@ -1537,7 +1537,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'images' " - " type: 'ImageData' " + " type: IMAGE_DATA " " image_data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-images' " " batch_size: 256 " @@ -1557,7 +1557,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'window_data' " - " type: 'WindowData' " + " type: WINDOW_DATA " " window_data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " @@ -1577,7 +1577,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'hdf5data' " - " type: 'HDF5Data' " + " type: HDF5_DATA " " hdf5_data_param { " " source: '/my/hdf5/data' " " batch_size: 256 " @@ -1586,7 +1586,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'conv1' " - " type: 'Convolution' " + " type: CONVOLUTION " " convolution_param { " " num_output: 96 " " bias_term: false " @@ -1611,7 +1611,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'pool1ave' " - " type: 'Pooling' " + " type: POOLING " " pooling_param { " " pool: AVE " " kernel_size: 3 " @@ -1622,7 +1622,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'pool1stoch' " - " type: 'Pooling' " + " type: POOLING " " pooling_param { " " pool: STOCHASTIC " " kernel_size: 4 " @@ -1633,7 +1633,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'concat' " - " type: 'Concat' " + " type: CONCAT " " concat_param { " " concat_dim: 2 " " } " @@ -1643,7 +1643,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'norm1' " - " type: 'LRN' " + " type: LRN " " lrn_param { " " local_size: 5 " " alpha: 0.0001 " @@ -1654,7 +1654,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'fc6' " - " type: 'InnerProduct' " + " type: INNER_PRODUCT " " inner_product_param { " " num_output: 4096 " " bias_term: false " @@ -1676,13 +1676,13 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'relu6' " - " type: 'ReLU' " + " type: RELU " " bottom: 'fc6' " " top: 'fc6' " "} " "layers { " " name: 'drop6' " - " type: 'Dropout' " + " type: DROPOUT " " dropout_param { " " dropout_ratio: 0.2 " " } " @@ -1691,7 +1691,7 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'loss' " - " type: 'InfogainLoss' " + " type: INFOGAIN_LOSS " " infogain_loss_param { " " source: '/my/infogain/matrix' " " } " @@ -1700,54 +1700,54 @@ TEST_F(V0UpgradeTest, TestAllParams) { "} " "layers { " " name: 'accuracy' " - " type: 'Accuracy' " + " type: ACCURACY " "} " "layers { " " name: 'bnll' " - " type: 'BNLL' " + " type: BNLL " "} " "layers { " " name: 'euclidean_loss' " - " type: 'EuclideanLoss' " + " type: EUCLIDEAN_LOSS " "} " "layers { " " name: 'flatten' " - " type: 'Flatten' " + " type: FLATTEN " "} " "layers { " " name: 'hdf5_output' " - " type: 'HDF5Output' " + " type: HDF5_OUTPUT " " hdf5_output_param { " " file_name: '/my/hdf5/output/file' " " } " "} " "layers { " " name: 'im2col' " - " type: 'Im2Col' " + " type: IM2COL " "} " "layers { " " name: 'images' " - " type: 'ImageData' " + " type: IMAGE_DATA " "} " "layers { " " name: 'multinomial_logistic_loss' " - " type: 'MultinomialLogisticLoss' " + " type: MULTINOMIAL_LOGISTIC_LOSS " "} " "layers { " " name: 'sigmoid' " - " type: 'Sigmoid' " + " type: SIGMOID " "} " "layers { " " name: 'softmax' " - " type: 'Softmax' " + " type: SOFTMAX " "} " "layers { " " name: 'split' " - " type: 'Split' " + " type: SPLIT " "} " "layers { " " name: 'tanh' " - " type: 'TanH' " + " type: TANH " "} "; this->RunV0UpgradeTest(input_proto, expected_output_proto); } @@ -2122,7 +2122,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "name: 'CaffeNet' " "layers { " " name: 'data' " - " type: 'Data' " + " type: DATA " " data_param { " " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " " batch_size: 256 " @@ -2137,7 +2137,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'conv1' " - " type: 'Convolution' " + " type: CONVOLUTION " " convolution_param { " " num_output: 96 " " kernel_size: 11 " @@ -2160,13 +2160,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu1' " - " type: 'ReLU' " + " type: RELU " " bottom: 'conv1' " " top: 'conv1' " "} " "layers { " " name: 'pool1' " - " type: 'Pooling' " + " type: POOLING " " pooling_param { " " pool: MAX " " kernel_size: 3 " @@ -2177,7 +2177,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'norm1' " - " type: 'LRN' " + " type: LRN " " lrn_param { " " local_size: 5 " " alpha: 0.0001 " @@ -2188,7 +2188,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'conv2' " - " type: 'Convolution' " + " type: CONVOLUTION " " convolution_param { " " num_output: 256 " " group: 2 " @@ -2212,13 +2212,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu2' " - " type: 'ReLU' " + " type: RELU " " bottom: 'conv2' " " top: 'conv2' " "} " "layers { " " name: 'pool2' " - " type: 'Pooling' " + " type: POOLING " " pooling_param { " " pool: MAX " " kernel_size: 3 " @@ -2229,7 +2229,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'norm2' " - " type: 'LRN' " + " type: LRN " " lrn_param { " " local_size: 5 " " alpha: 0.0001 " @@ -2240,7 +2240,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'conv3' " - " type: 'Convolution' " + " type: CONVOLUTION " " convolution_param { " " num_output: 384 " " kernel_size: 3 " @@ -2263,13 +2263,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu3' " - " type: 'ReLU' " + " type: RELU " " bottom: 'conv3' " " top: 'conv3' " "} " "layers { " " name: 'conv4' " - " type: 'Convolution' " + " type: CONVOLUTION " " convolution_param { " " num_output: 384 " " group: 2 " @@ -2293,13 +2293,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu4' " - " type: 'ReLU' " + " type: RELU " " bottom: 'conv4' " " top: 'conv4' " "} " "layers { " " name: 'conv5' " - " type: 'Convolution' " + " type: CONVOLUTION " " convolution_param { " " num_output: 256 " " group: 2 " @@ -2323,13 +2323,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu5' " - " type: 'ReLU' " + " type: RELU " " bottom: 'conv5' " " top: 'conv5' " "} " "layers { " " name: 'pool5' " - " type: 'Pooling' " + " type: POOLING " " pooling_param { " " kernel_size: 3 " " pool: MAX " @@ -2340,7 +2340,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'fc6' " - " type: 'InnerProduct' " + " type: INNER_PRODUCT " " inner_product_param { " " num_output: 4096 " " weight_filler { " @@ -2361,13 +2361,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu6' " - " type: 'ReLU' " + " type: RELU " " bottom: 'fc6' " " top: 'fc6' " "} " "layers { " " name: 'drop6' " - " type: 'Dropout' " + " type: DROPOUT " " dropout_param { " " dropout_ratio: 0.5 " " } " @@ -2376,7 +2376,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'fc7' " - " type: 'InnerProduct' " + " type: INNER_PRODUCT " " inner_product_param { " " num_output: 4096 " " weight_filler { " @@ -2397,13 +2397,13 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'relu7' " - " type: 'ReLU' " + " type: RELU " " bottom: 'fc7' " " top: 'fc7' " "} " "layers { " " name: 'drop7' " - " type: 'Dropout' " + " type: DROPOUT " " dropout_param { " " dropout_ratio: 0.5 " " } " @@ -2412,7 +2412,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'fc8' " - " type: 'InnerProduct' " + " type: INNER_PRODUCT " " inner_product_param { " " num_output: 1000 " " weight_filler { " @@ -2433,7 +2433,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { "} " "layers { " " name: 'loss' " - " type: 'SoftmaxWithLoss' " + " type: SOFTMAX_LOSS " " bottom: 'fc8' " " bottom: 'label' " "} "; From 522d4644a2f54ce9bbc691e94d6ff93ab73d4868 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 14 Jan 2015 18:46:21 -0800 Subject: [PATCH 1094/2053] add v1 to v2 upgrade tests --- src/caffe/test/test_upgrade_proto.cpp | 432 +++++++++++++++++++++++++- 1 file changed, 420 insertions(+), 12 deletions(-) diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index 52e7f1f99f5..3a135a67174 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -1083,7 +1083,7 @@ TEST_F(PaddingLayerUpgradeTest, TestImageNet) { this->RunPaddingUpgradeTest(input_proto, expected_output_proto); } -class V0UpgradeTest : public ::testing::Test { +class NetUpgradeTest : public ::testing::Test { protected: void RunV0UpgradeTest( const string& input_param_string, const string& output_param_string) { @@ -1101,10 +1101,27 @@ class V0UpgradeTest : public ::testing::Test { EXPECT_EQ(expected_output_param.DebugString(), actual_output_param.DebugString()); } + + void RunV1UpgradeTest( + const string& input_param_string, const string& output_param_string) { + // Test that UpgradeV0Net called on the NetParameter proto specified by + // input_param_string results in the NetParameter proto specified by + // output_param_string. + NetParameter input_param; + CHECK(google::protobuf::TextFormat::ParseFromString( + input_param_string, &input_param)); + NetParameter expected_output_param; + CHECK(google::protobuf::TextFormat::ParseFromString( + output_param_string, &expected_output_param)); + NetParameter actual_output_param; + UpgradeV1Net(input_param, &actual_output_param); + EXPECT_EQ(expected_output_param.DebugString(), + actual_output_param.DebugString()); + } }; -TEST_F(V0UpgradeTest, TestSimple) { - const string& input_proto = +TEST_F(NetUpgradeTest, TestSimple) { + const string& v0_proto = "name: 'CaffeNet' " "layers { " " layer { " @@ -1180,7 +1197,7 @@ TEST_F(V0UpgradeTest, TestSimple) { " bottom: 'fc8' " " bottom: 'label' " "} "; - const string& expected_output_proto = + const string& expected_v1_proto = "name: 'CaffeNet' " "layers { " " name: 'data' " @@ -1248,11 +1265,81 @@ TEST_F(V0UpgradeTest, TestSimple) { " bottom: 'fc8' " " bottom: 'label' " "} "; - this->RunV0UpgradeTest(input_proto, expected_output_proto); + this->RunV0UpgradeTest(v0_proto, expected_v1_proto); + + const string& expected_v2_proto = + "name: 'CaffeNet' " + "layer { " + " name: 'data' " + " type: 'Data' " + " data_param { " + " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " + " batch_size: 256 " + " } " + " transform_param { " + " crop_size: 227 " + " mirror: true " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " + " } " + " top: 'data' " + " top: 'label' " + "} " + "layer { " + " name: 'conv1' " + " type: 'Convolution' " + " convolution_param { " + " num_output: 96 " + " kernel_size: 11 " + " stride: 4 " + " pad: 2 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 0. " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'data' " + " top: 'conv1' " + "} " + "layer { " + " name: 'fc8' " + " type: 'InnerProduct' " + " inner_product_param { " + " num_output: 1000 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 0 " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'conv1' " + " top: 'fc8' " + "} " + "layer { " + " name: 'loss' " + " type: 'SoftmaxWithLoss' " + " bottom: 'fc8' " + " bottom: 'label' " + "} "; + this->RunV1UpgradeTest(expected_v1_proto, expected_v2_proto); } // Test any layer or parameter upgrades not covered by other tests. -TEST_F(V0UpgradeTest, TestAllParams) { +TEST_F(NetUpgradeTest, TestAllParams) { const string& input_proto = "name: 'CaffeNet' " "input: 'input_data' " @@ -1752,8 +1839,8 @@ TEST_F(V0UpgradeTest, TestAllParams) { this->RunV0UpgradeTest(input_proto, expected_output_proto); } -TEST_F(V0UpgradeTest, TestImageNet) { - const string& input_proto = +TEST_F(NetUpgradeTest, TestImageNet) { + const string& v0_proto = "name: 'CaffeNet' " "layers { " " layer { " @@ -2118,7 +2205,7 @@ TEST_F(V0UpgradeTest, TestImageNet) { " bottom: 'fc8' " " bottom: 'label' " "} "; - const string& expected_output_proto = + const string& expected_v1_proto = "name: 'CaffeNet' " "layers { " " name: 'data' " @@ -2437,7 +2524,328 @@ TEST_F(V0UpgradeTest, TestImageNet) { " bottom: 'fc8' " " bottom: 'label' " "} "; - this->RunV0UpgradeTest(input_proto, expected_output_proto); -} + this->RunV0UpgradeTest(v0_proto, expected_v1_proto); + + const string& expected_v2_proto = + "name: 'CaffeNet' " + "layer { " + " name: 'data' " + " type: 'Data' " + " data_param { " + " source: '/home/jiayq/Data/ILSVRC12/train-leveldb' " + " batch_size: 256 " + " } " + " transform_param { " + " crop_size: 227 " + " mirror: true " + " mean_file: '/home/jiayq/Data/ILSVRC12/image_mean.binaryproto' " + " } " + " top: 'data' " + " top: 'label' " + "} " + "layer { " + " name: 'conv1' " + " type: 'Convolution' " + " convolution_param { " + " num_output: 96 " + " kernel_size: 11 " + " stride: 4 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 0. " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'data' " + " top: 'conv1' " + "} " + "layer { " + " name: 'relu1' " + " type: 'ReLU' " + " bottom: 'conv1' " + " top: 'conv1' " + "} " + "layer { " + " name: 'pool1' " + " type: 'Pooling' " + " pooling_param { " + " pool: MAX " + " kernel_size: 3 " + " stride: 2 " + " } " + " bottom: 'conv1' " + " top: 'pool1' " + "} " + "layer { " + " name: 'norm1' " + " type: 'LRN' " + " lrn_param { " + " local_size: 5 " + " alpha: 0.0001 " + " beta: 0.75 " + " } " + " bottom: 'pool1' " + " top: 'norm1' " + "} " + "layer { " + " name: 'conv2' " + " type: 'Convolution' " + " convolution_param { " + " num_output: 256 " + " group: 2 " + " kernel_size: 5 " + " pad: 2 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 1. " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'norm1' " + " top: 'conv2' " + "} " + "layer { " + " name: 'relu2' " + " type: 'ReLU' " + " bottom: 'conv2' " + " top: 'conv2' " + "} " + "layer { " + " name: 'pool2' " + " type: 'Pooling' " + " pooling_param { " + " pool: MAX " + " kernel_size: 3 " + " stride: 2 " + " } " + " bottom: 'conv2' " + " top: 'pool2' " + "} " + "layer { " + " name: 'norm2' " + " type: 'LRN' " + " lrn_param { " + " local_size: 5 " + " alpha: 0.0001 " + " beta: 0.75 " + " } " + " bottom: 'pool2' " + " top: 'norm2' " + "} " + "layer { " + " name: 'conv3' " + " type: 'Convolution' " + " convolution_param { " + " num_output: 384 " + " kernel_size: 3 " + " pad: 1 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 0. " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'norm2' " + " top: 'conv3' " + "} " + "layer { " + " name: 'relu3' " + " type: 'ReLU' " + " bottom: 'conv3' " + " top: 'conv3' " + "} " + "layer { " + " name: 'conv4' " + " type: 'Convolution' " + " convolution_param { " + " num_output: 384 " + " group: 2 " + " kernel_size: 3 " + " pad: 1 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 1. " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'conv3' " + " top: 'conv4' " + "} " + "layer { " + " name: 'relu4' " + " type: 'ReLU' " + " bottom: 'conv4' " + " top: 'conv4' " + "} " + "layer { " + " name: 'conv5' " + " type: 'Convolution' " + " convolution_param { " + " num_output: 256 " + " group: 2 " + " kernel_size: 3 " + " pad: 1 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 1. " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'conv4' " + " top: 'conv5' " + "} " + "layer { " + " name: 'relu5' " + " type: 'ReLU' " + " bottom: 'conv5' " + " top: 'conv5' " + "} " + "layer { " + " name: 'pool5' " + " type: 'Pooling' " + " pooling_param { " + " kernel_size: 3 " + " pool: MAX " + " stride: 2 " + " } " + " bottom: 'conv5' " + " top: 'pool5' " + "} " + "layer { " + " name: 'fc6' " + " type: 'InnerProduct' " + " inner_product_param { " + " num_output: 4096 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.005 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 1. " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'pool5' " + " top: 'fc6' " + "} " + "layer { " + " name: 'relu6' " + " type: 'ReLU' " + " bottom: 'fc6' " + " top: 'fc6' " + "} " + "layer { " + " name: 'drop6' " + " type: 'Dropout' " + " dropout_param { " + " dropout_ratio: 0.5 " + " } " + " bottom: 'fc6' " + " top: 'fc6' " + "} " + "layer { " + " name: 'fc7' " + " type: 'InnerProduct' " + " inner_product_param { " + " num_output: 4096 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.005 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 1. " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'fc6' " + " top: 'fc7' " + "} " + "layer { " + " name: 'relu7' " + " type: 'ReLU' " + " bottom: 'fc7' " + " top: 'fc7' " + "} " + "layer { " + " name: 'drop7' " + " type: 'Dropout' " + " dropout_param { " + " dropout_ratio: 0.5 " + " } " + " bottom: 'fc7' " + " top: 'fc7' " + "} " + "layer { " + " name: 'fc8' " + " type: 'InnerProduct' " + " inner_product_param { " + " num_output: 1000 " + " weight_filler { " + " type: 'gaussian' " + " std: 0.01 " + " } " + " bias_filler { " + " type: 'constant' " + " value: 0 " + " } " + " } " + " blobs_lr: 1. " + " blobs_lr: 2. " + " weight_decay: 1. " + " weight_decay: 0. " + " bottom: 'fc7' " + " top: 'fc8' " + "} " + "layer { " + " name: 'loss' " + " type: 'SoftmaxWithLoss' " + " bottom: 'fc8' " + " bottom: 'label' " + "} "; + this->RunV1UpgradeTest(expected_v1_proto, expected_v2_proto); +} // NOLINT(readability/fn_size) -} // namespace caffe +} // NOLINT(readability/fn_size) // namespace caffe From e64bf225b492d61f357cc52a7269ba5e7db0f00b Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 14 Jan 2015 19:00:58 -0800 Subject: [PATCH 1095/2053] add test that all V1 layer type enum values upgrade to valid V2 string types --- src/caffe/test/test_upgrade_proto.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index 3a135a67174..8cff961f9e8 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -7,6 +7,7 @@ #include "caffe/blob.hpp" #include "caffe/common.hpp" +#include "caffe/layer.hpp" #include "caffe/util/upgrade_proto.hpp" #include "caffe/test/test_caffe_main.hpp" @@ -2848,4 +2849,21 @@ TEST_F(NetUpgradeTest, TestImageNet) { this->RunV1UpgradeTest(expected_v1_proto, expected_v2_proto); } // NOLINT(readability/fn_size) +TEST_F(NetUpgradeTest, TestUpgradeV1LayerType) { + LayerParameter layer_param; + shared_ptr<Layer<float> > layer; + for (int i = 0; i < V1LayerParameter_LayerType_LayerType_ARRAYSIZE; ++i) { + ASSERT_TRUE(V1LayerParameter_LayerType_IsValid(i)); + V1LayerParameter_LayerType v1_type = V1LayerParameter_LayerType(i); + string v2_layer_type(UpgradeV1LayerType(v1_type)); + if (v2_layer_type == "") { + EXPECT_EQ(V1LayerParameter_LayerType_NONE, v1_type); + continue; // Empty string isn't actually a valid layer type. + } + layer_param.set_type(v2_layer_type); + layer.reset(LayerRegistry<float>::CreateLayer(layer_param)); + EXPECT_EQ(v2_layer_type, layer->type()); + } +} + } // NOLINT(readability/fn_size) // namespace caffe From 78b02e5fd3a43912556796bf29f118e0dea7b45e Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Wed, 14 Jan 2015 20:17:26 -0800 Subject: [PATCH 1096/2053] add message ParamSpec to replace param name, blobs_lr, weight_decay, ... --- src/caffe/net.cpp | 82 ++-- src/caffe/proto/caffe.proto | 52 ++- src/caffe/test/test_gradient_based_solver.cpp | 6 +- src/caffe/test/test_net.cpp | 380 ++++++++++-------- src/caffe/test/test_solver.cpp | 8 +- src/caffe/test/test_split_layer.cpp | 298 ++++++++------ src/caffe/test/test_upgrade_proto.cpp | 120 ++++-- src/caffe/util/upgrade_proto.cpp | 18 +- 8 files changed, 526 insertions(+), 438 deletions(-) diff --git a/src/caffe/net.cpp b/src/caffe/net.cpp index 4461fa88e75..b3e11943c1b 100644 --- a/src/caffe/net.cpp +++ b/src/caffe/net.cpp @@ -113,36 +113,19 @@ void Net<Dtype>::Init(const NetParameter& in_param) { memory_used_ += top_vecs_[layer_id][top_id]->count(); } DLOG(INFO) << "Memory required for data: " << memory_used_ * sizeof(Dtype); - const int blobs_lr_size = layer_param.blobs_lr_size(); + const int param_size = layer_param.param_size(); const int num_param_blobs = layers_[layer_id]->blobs().size(); - CHECK(blobs_lr_size == num_param_blobs || blobs_lr_size == 0) - << "Incorrect blobs lr size: should be either 0 " - << "or the same as the number of the layer's parameter blobs."; - if (blobs_lr_size) { - // Check if this layer needs backward operation itself - for (int param_id = 0; param_id < blobs_lr_size; ++param_id) { - const bool param_need_backward = layer_param.blobs_lr(param_id) > 0; - need_backward |= param_need_backward; - layers_[layer_id]->set_param_propagate_down(param_id, - param_need_backward); - } - } else if (layers_[layer_id]->blobs().size()) { - // catch: if a layer param does not specify blobs_lr, we should assume the - // learning rate to be 1. Thus we will need to perform backward. - need_backward = true; - for (int param_id = 0; param_id < blobs_lr_size; ++param_id) { - layers_[layer_id]->set_param_propagate_down(param_id, true); - } + CHECK_LE(param_size, num_param_blobs) + << "Too many params specified for layer " << layer_param.name(); + ParamSpec default_param_spec; + for (int param_id = 0; param_id < num_param_blobs; ++param_id) { + const ParamSpec* param_spec = (param_id < param_size) ? + &layer_param.param(param_id) : &default_param_spec; + const bool param_need_backward = param_spec->lr_mult() > 0; + need_backward |= param_need_backward; + layers_[layer_id]->set_param_propagate_down(param_id, + param_need_backward); } - const int param_size = layer_param.param_size(); - CHECK(param_size == num_param_blobs || param_size == 0) - << "Incorrect param size: should be either 0 or the same as " - "the number of the layer's parameter blobs: " << num_param_blobs; - const int param_share_mode_size = layer_param.param_share_mode_size(); - CHECK(param_share_mode_size == num_param_blobs || - param_share_mode_size == 0) - << "Incorrect param_share_mode size: should be either 0 or the same as " - "the number of the layer's parameter blobs: " << num_param_blobs; for (int param_id = 0; param_id < num_param_blobs; ++param_id) { AppendParam(param, layer_id, param_id); } @@ -407,7 +390,8 @@ void Net<Dtype>::AppendParam(const NetParameter& param, const int layer_id, const int param_id) { const LayerParameter& layer_param = layers_[layer_id]->layer_param(); const int param_size = layer_param.param_size(); - string param_name = param_size ? layer_param.param(param_id) : ""; + string param_name = + (param_size > param_id) ? layer_param.param(param_id).name() : ""; if (param_name.size()) { param_display_names_.push_back(param_name); } else { @@ -442,10 +426,9 @@ void Net<Dtype>::AppendParam(const NetParameter& param, const int layer_id, Blob<Dtype>* this_blob = layers_[layer_id]->blobs()[param_id].get(); Blob<Dtype>* owner_blob = layers_[owner_layer_id]->blobs()[owner_param_id].get(); - const int param_share_mode_size = layer_param.param_share_mode_size(); - if (param_share_mode_size > param_id && - (layer_param.param_share_mode(param_id) == - LayerParameter_DimCheckMode_PERMISSIVE)) { + const int param_size = layer_param.param_size(); + if (param_size > param_id && (layer_param.param(param_id).share_mode() == + ParamSpec_DimCheckMode_PERMISSIVE)) { // Permissive dimension checking -- only check counts are the same. CHECK_EQ(this_blob->count(), owner_blob->count()) << "Shared parameter blobs must have the same count."; @@ -468,34 +451,15 @@ void Net<Dtype>::AppendParam(const NetParameter& param, const int layer_id, template <typename Dtype> void Net<Dtype>::GetLearningRateAndWeightDecay() { LOG(INFO) << "Collecting Learning Rate and Weight Decay."; + ParamSpec default_param_spec; for (int i = 0; i < layers_.size(); ++i) { vector<shared_ptr<Blob<Dtype> > >& layer_blobs = layers_[i]->blobs(); - // push the learning rate mutlipliers - if (layers_[i]->layer_param().blobs_lr_size()) { - CHECK_EQ(layers_[i]->layer_param().blobs_lr_size(), layer_blobs.size()); - for (int j = 0; j < layer_blobs.size(); ++j) { - float local_lr = layers_[i]->layer_param().blobs_lr(j); - CHECK_GE(local_lr, 0.); - params_lr_.push_back(local_lr); - } - } else { - for (int j = 0; j < layer_blobs.size(); ++j) { - params_lr_.push_back(1.); - } - } - // push the weight decay multipliers - if (layers_[i]->layer_param().weight_decay_size()) { - CHECK_EQ(layers_[i]->layer_param().weight_decay_size(), - layer_blobs.size()); - for (int j = 0; j < layer_blobs.size(); ++j) { - float local_decay = layers_[i]->layer_param().weight_decay(j); - CHECK_GE(local_decay, 0.); - params_weight_decay_.push_back(local_decay); - } - } else { - for (int j = 0; j < layer_blobs.size(); ++j) { - params_weight_decay_.push_back(1.); - } + for (int j = 0; j < layer_blobs.size(); ++j) { + const ParamSpec* param_spec = + (layers_[i]->layer_param().param_size() > j) ? + &layers_[i]->layer_param().param(j) : &default_param_spec; + params_lr_.push_back(param_spec->lr_mult()); + params_weight_decay_.push_back(param_spec->decay_mult()); } } } diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 1178efe53a8..453bf7ff285 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -213,6 +213,31 @@ message NetStateRule { repeated string not_stage = 5; } +// Specifies training parameters (multipliers on global learning constants, +// and the name and other settings used for weight sharing). +message ParamSpec { + // The names of the parameter blobs -- useful for sharing parameters among + // layers, but never required otherwise. To share a parameter between two + // layers, give it a (non-empty) name. + optional string name = 1; + + // Whether to require shared weights to have the same shape, or just the same + // count -- defaults to STRICT if unspecified. + optional DimCheckMode share_mode = 2; + enum DimCheckMode { + // STRICT (default) requires that num, channels, height, width each match. + STRICT = 0; + // PERMISSIVE requires only the count (num*channels*height*width) to match. + PERMISSIVE = 1; + } + + // The multiplier on the global learning rate for this parameter. + optional float lr_mult = 3 [default = 1.0]; + + // The multiplier on the global weight decay for this parameter. + optional float decay_mult = 4 [default = 1.0]; +} + // NOTE // Update the next available ID when you add a new LayerParameter field. // @@ -228,29 +253,12 @@ message LayerParameter { // to each top blob. repeated float loss_weight = 5; - // The blobs containing the numeric parameters of the layer - repeated BlobProto blobs = 6; + // Specifies training parameters (multipliers on global learning constants, + // and the name and other settings used for weight sharing). + repeated ParamSpec param = 6; - // The names of the parameter blobs -- useful for sharing parameters among - // layers (but never required). - repeated string param = 7; - - // Whether to require shared weights to have the same shape, or just the same - // count -- defaults to STRICT if unspecified. - repeated DimCheckMode param_share_mode = 8; - enum DimCheckMode { - // STRICT (default) requires that num, channels, height, width each match. - STRICT = 0; - // PERMISSIVE requires only the count (num*channels*height*width) to match. - PERMISSIVE = 1; - } - - // The ratio that is multiplied on the global learning rate. If you want to - // set the learning ratio for one blob, you need to set it for all blobs. - repeated float blobs_lr = 9; - - // The weight decay that is multiplied on the global weight decay. - repeated float weight_decay = 10; + // The blobs containing the numeric parameters of the layer. + repeated BlobProto blobs = 7; // Rules controlling whether and when a layer is included in the network, // based on the current NetState. You may specify a non-zero number of rules diff --git a/src/caffe/test/test_gradient_based_solver.cpp b/src/caffe/test/test_gradient_based_solver.cpp index 1d8192aebbc..eb2569c04f2 100644 --- a/src/caffe/test/test_gradient_based_solver.cpp +++ b/src/caffe/test/test_gradient_based_solver.cpp @@ -64,7 +64,7 @@ class GradientBasedSolverTest : public MultiDeviceTest<TypeParam> { "lr_policy: 'fixed' " "net_param { " " name: 'TestNetwork' " - " layers: { " + " layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -83,7 +83,7 @@ class GradientBasedSolverTest : public MultiDeviceTest<TypeParam> { " top: 'data' " " top: 'targets' " " } " - " layers: { " + " layer { " " name: 'innerprod' " " type: 'InnerProduct' " " inner_product_param { " @@ -100,7 +100,7 @@ class GradientBasedSolverTest : public MultiDeviceTest<TypeParam> { " bottom: 'data' " " top: 'innerprod' " " } " - " layers: { " + " layer { " " name: 'loss' " " type: 'EuclideanLoss' " " bottom: 'innerprod' " diff --git a/src/caffe/test/test_net.cpp b/src/caffe/test/test_net.cpp index a4e14f914c5..bc0dae331b3 100644 --- a/src/caffe/test/test_net.cpp +++ b/src/caffe/test/test_net.cpp @@ -59,7 +59,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { const bool accuracy_layer = false) { string proto = "name: 'TinyTestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -83,7 +83,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerproduct' " " type: 'InnerProduct' " " inner_product_param { " @@ -97,14 +97,18 @@ class NetTest : public MultiDeviceTest<TypeParam> { " value: 0 " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'data' " " top: 'innerproduct' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerproduct' " @@ -113,7 +117,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "} "; if (accuracy_layer) { proto += - "layers: { " + "layer { " " name: 'loss' " " type: 'Accuracy' " " bottom: 'innerproduct' " @@ -130,7 +134,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { virtual void InitTinyNetEuclidean(const bool force_backward = false) { string proto = "name: 'TinyTestEuclidLossNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -150,7 +154,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerproduct' " " type: 'InnerProduct' " " inner_product_param { " @@ -164,14 +168,18 @@ class NetTest : public MultiDeviceTest<TypeParam> { " value: 0 " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'data' " " top: 'innerproduct' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'EuclideanLoss' " " bottom: 'innerproduct' " @@ -190,7 +198,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { } const string& proto = "name: 'TrickyTestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -210,7 +218,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerproduct' " " type: 'InnerProduct' " " inner_product_param { " @@ -224,14 +232,18 @@ class NetTest : public MultiDeviceTest<TypeParam> { " value: 0 " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'data' " " top: 'transformed_data' " "} " - "layers: { " + "layer { " " name: 'innerproduct' " " type: 'InnerProduct' " " inner_product_param { " @@ -245,14 +257,18 @@ class NetTest : public MultiDeviceTest<TypeParam> { " value: 0 " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'label' " " top: 'transformed_label' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " + loss_weight_stream.str() + @@ -277,7 +293,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { proto << "force_backward: true "; } proto << - "layers: { " + "layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -292,9 +308,9 @@ class NetTest : public MultiDeviceTest<TypeParam> { " } " " top: 'data' " "} " - "layers: { " + "layer { " " name: 'innerproduct1' " - " type: 'InnerProduct' " + " type: 'InnerProduct' " " inner_product_param { " " num_output: 10 " " bias_term: " << bias_term << @@ -303,14 +319,12 @@ class NetTest : public MultiDeviceTest<TypeParam> { " std: 10 " " } " " } " - " param: 'unsharedweights1' "; + " param { " + " name: 'unsharedweights1' " + " lr_mult: " << blobs_lr_w1 << + " } "; if (bias_term) { - proto << " param: '' "; - } - proto << - " blobs_lr: " << blobs_lr_w1; - if (bias_term) { - proto << " blobs_lr: " << blobs_lr_b1; + proto << " param { lr_mult: " << blobs_lr_b1 << " } "; } proto << " bottom: 'data' " @@ -320,7 +334,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { } proto << "} " - "layers: { " + "layer { " " name: 'innerproduct2' " " type: 'InnerProduct' " " inner_product_param { " @@ -331,20 +345,18 @@ class NetTest : public MultiDeviceTest<TypeParam> { " std: 10 " " } " " } " - " param: 'unsharedweights2' "; + " param { " + " name: 'unsharedweights2' " + " lr_mult: " << blobs_lr_w2 << + " } "; if (bias_term) { - proto << " param: '' "; + proto << " param { lr_mult: " << blobs_lr_b2 << " } "; } proto << " bottom: 'data' " - " blobs_lr: " << blobs_lr_w2; - if (bias_term) { - proto << " blobs_lr: " << blobs_lr_b2; - } - proto << " top: 'innerproduct2' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'EuclideanLoss' "; if (loss_weight) { @@ -360,7 +372,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { virtual void InitSharedWeightsNet() { const string& proto = "name: 'SharedWeightsNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -375,7 +387,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { " } " " top: 'data' " "} " - "layers: { " + "layer { " " name: 'innerproduct1' " " type: 'InnerProduct' " " inner_product_param { " @@ -386,11 +398,11 @@ class NetTest : public MultiDeviceTest<TypeParam> { " std: 10 " " } " " } " - " param: 'sharedweights' " + " param { name: 'sharedweights' } " " bottom: 'data' " " top: 'innerproduct1' " "} " - "layers: { " + "layer { " " name: 'innerproduct2' " " type: 'InnerProduct' " " inner_product_param { " @@ -401,11 +413,11 @@ class NetTest : public MultiDeviceTest<TypeParam> { " std: 10 " " } " " } " - " param: 'sharedweights' " + " param { name: 'sharedweights' } " " bottom: 'data' " " top: 'innerproduct2' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'EuclideanLoss' " " bottom: 'innerproduct1' " @@ -417,7 +429,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { virtual void InitDiffDataUnsharedWeightsNet() { const string& proto = "name: 'DiffDataUnsharedWeightsNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -437,7 +449,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { " top: 'data1' " " top: 'data2' " "} " - "layers: { " + "layer { " " name: 'innerproduct1' " " type: 'InnerProduct' " " inner_product_param { " @@ -448,11 +460,11 @@ class NetTest : public MultiDeviceTest<TypeParam> { " value: 0.5 " " } " " } " - " param: 'unsharedweights1' " + " param { name: 'unsharedweights1' } " " bottom: 'data1' " " top: 'innerproduct1' " "} " - "layers: { " + "layer { " " name: 'innerproduct2' " " type: 'InnerProduct' " " inner_product_param { " @@ -463,11 +475,11 @@ class NetTest : public MultiDeviceTest<TypeParam> { " value: 0.5 " " } " " } " - " param: 'unsharedweights2' " + " param { name: 'unsharedweights2' } " " bottom: 'innerproduct1' " " top: 'innerproduct2' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'EuclideanLoss' " " bottom: 'data2' " @@ -479,7 +491,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { virtual void InitDiffDataSharedWeightsNet() { const string& proto = "name: 'DiffDataSharedWeightsNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -499,7 +511,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { " top: 'data1' " " top: 'data2' " "} " - "layers: { " + "layer { " " name: 'innerproduct1' " " type: 'InnerProduct' " " inner_product_param { " @@ -510,11 +522,11 @@ class NetTest : public MultiDeviceTest<TypeParam> { " value: 0.5 " " } " " } " - " param: 'sharedweights' " + " param { name: 'sharedweights' } " " bottom: 'data1' " " top: 'innerproduct1' " "} " - "layers: { " + "layer { " " name: 'innerproduct2' " " type: 'InnerProduct' " " inner_product_param { " @@ -525,11 +537,11 @@ class NetTest : public MultiDeviceTest<TypeParam> { " value: 0.5 " " } " " } " - " param: 'sharedweights' " + " param { name: 'sharedweights' } " " bottom: 'innerproduct1' " " top: 'innerproduct2' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'EuclideanLoss' " " bottom: 'data2' " @@ -546,7 +558,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { "input_dim: 3 " "input_dim: 100 " "input_dim: 100 " - "layers: { " + "layer { " " name: 'conv1' " " type: 'Convolution' " " bottom: 'data' " @@ -565,13 +577,13 @@ class NetTest : public MultiDeviceTest<TypeParam> { " } " " } " "} " - "layers: { " + "layer { " " name: 'relu1' " " type: 'ReLU' " " bottom: 'conv1' " " top: 'conv1' " "} " - "layers: { " + "layer { " " name: 'pool1' " " type: 'Pooling' " " bottom: 'conv1' " @@ -582,7 +594,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { " stride: 2 " " } " "} " - "layers: { " + "layer { " " name: 'norm1' " " type: 'LRN' " " bottom: 'pool1' " @@ -591,7 +603,7 @@ class NetTest : public MultiDeviceTest<TypeParam> { " local_size: 3 " " } " "} " - "layers: { " + "layer { " " name: 'softmax' " " type: 'Softmax' " " bottom: 'norm1' " @@ -1261,19 +1273,19 @@ class FilterNetTest : public ::testing::Test { TEST_F(FilterNetTest, TestNoFilter) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1285,7 +1297,7 @@ TEST_F(FilterNetTest, TestNoFilter) { TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { const string& input_proto = "name: 'LeNet' " - "layers { " + "layer { " " name: 'mnist' " " type: 'Data' " " top: 'data' " @@ -1299,7 +1311,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " } " " include: { phase: TRAIN } " "} " - "layers { " + "layer { " " name: 'mnist' " " type: 'Data' " " top: 'data' " @@ -1313,13 +1325,17 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " } " " include: { phase: TEST } " "} " - "layers { " + "layer { " " name: 'conv1' " " type: 'Convolution' " " bottom: 'data' " " top: 'conv1' " - " blobs_lr: 1 " - " blobs_lr: 2 " + " param { " + " lr_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " } " " convolution_param { " " num_output: 20 " " kernel_size: 5 " @@ -1332,13 +1348,17 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " } " " } " "} " - "layers { " + "layer { " " name: 'ip1' " " type: 'InnerProduct' " " bottom: 'conv1' " " top: 'ip1' " - " blobs_lr: 1 " - " blobs_lr: 2 " + " param { " + " lr_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " } " " inner_product_param { " " num_output: 10 " " weight_filler { " @@ -1349,7 +1369,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " } " " } " "} " - "layers { " + "layer { " " name: 'accuracy' " " type: 'Accuracy' " " bottom: 'ip1' " @@ -1357,7 +1377,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'accuracy' " " include: { phase: TEST } " "} " - "layers { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'ip2' " @@ -1368,7 +1388,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { const string input_proto_test = "state: { phase: TEST } " + input_proto; const string output_proto_train = "name: 'LeNet' " - "layers { " + "layer { " " name: 'mnist' " " type: 'Data' " " top: 'data' " @@ -1382,13 +1402,17 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " } " " include: { phase: TRAIN } " "} " - "layers { " + "layer { " " name: 'conv1' " " type: 'Convolution' " " bottom: 'data' " " top: 'conv1' " - " blobs_lr: 1 " - " blobs_lr: 2 " + " param { " + " lr_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " } " " convolution_param { " " num_output: 20 " " kernel_size: 5 " @@ -1401,13 +1425,17 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " } " " } " "} " - "layers { " + "layer { " " name: 'ip1' " " type: 'InnerProduct' " " bottom: 'conv1' " " top: 'ip1' " - " blobs_lr: 1 " - " blobs_lr: 2 " + " param { " + " lr_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " } " " inner_product_param { " " num_output: 10 " " weight_filler { " @@ -1418,7 +1446,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " } " " } " "} " - "layers { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'ip2' " @@ -1427,7 +1455,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { "} "; const string& output_proto_test = "name: 'LeNet' " - "layers { " + "layer { " " name: 'mnist' " " type: 'Data' " " top: 'data' " @@ -1441,13 +1469,17 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " } " " include: { phase: TEST } " "} " - "layers { " + "layer { " " name: 'conv1' " " type: 'Convolution' " " bottom: 'data' " " top: 'conv1' " - " blobs_lr: 1 " - " blobs_lr: 2 " + " param { " + " lr_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " } " " convolution_param { " " num_output: 20 " " kernel_size: 5 " @@ -1460,13 +1492,17 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " } " " } " "} " - "layers { " + "layer { " " name: 'ip1' " " type: 'InnerProduct' " " bottom: 'conv1' " " top: 'ip1' " - " blobs_lr: 1 " - " blobs_lr: 2 " + " param { " + " lr_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " } " " inner_product_param { " " num_output: 10 " " weight_filler { " @@ -1477,7 +1513,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " } " " } " "} " - "layers { " + "layer { " " name: 'accuracy' " " type: 'Accuracy' " " bottom: 'ip1' " @@ -1485,7 +1521,7 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { " top: 'accuracy' " " include: { phase: TEST } " "} " - "layers { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'ip2' " @@ -1517,20 +1553,20 @@ TEST_F(FilterNetTest, TestFilterLeNetTrainTest) { TEST_F(FilterNetTest, TestFilterOutByStage) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " " include: { stage: 'mystage' } " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1538,13 +1574,13 @@ TEST_F(FilterNetTest, TestFilterOutByStage) { "} "; const string& output_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1556,20 +1592,20 @@ TEST_F(FilterNetTest, TestFilterOutByStage) { TEST_F(FilterNetTest, TestFilterOutByStage2) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { stage: 'mystage' } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1577,13 +1613,13 @@ TEST_F(FilterNetTest, TestFilterOutByStage2) { "} "; const string& output_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1596,20 +1632,20 @@ TEST_F(FilterNetTest, TestFilterInByStage) { const string& input_proto = "state: { stage: 'mystage' } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { stage: 'mystage' } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1621,20 +1657,20 @@ TEST_F(FilterNetTest, TestFilterInByStage) { TEST_F(FilterNetTest, TestFilterInByStage2) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " exclude: { stage: 'mystage' } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1647,20 +1683,20 @@ TEST_F(FilterNetTest, TestFilterOutByMultipleStage) { const string& input_proto = "state: { stage: 'mystage' } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { stage: 'mystage' stage: 'myotherstage' } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1670,13 +1706,13 @@ TEST_F(FilterNetTest, TestFilterOutByMultipleStage) { const string& output_proto = "state: { stage: 'mystage' } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1690,13 +1726,13 @@ TEST_F(FilterNetTest, TestFilterInByMultipleStage) { const string& input_proto = "state: { stage: 'mystage' } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " @@ -1704,7 +1740,7 @@ TEST_F(FilterNetTest, TestFilterInByMultipleStage) { " include: { stage: 'myotherstage' } " " include: { stage: 'mystage' } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1718,20 +1754,20 @@ TEST_F(FilterNetTest, TestFilterInByMultipleStage2) { const string& input_proto = "state: { stage: 'mystage' stage: 'myotherstage' } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { stage: 'mystage' stage: 'myotherstage' } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1745,20 +1781,20 @@ TEST_F(FilterNetTest, TestFilterInByNotStage) { const string& input_proto = "state: { stage: 'mystage' } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { not_stage: 'myotherstage' } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1772,20 +1808,20 @@ TEST_F(FilterNetTest, TestFilterOutByNotStage) { const string& input_proto = "state: { stage: 'mystage' } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { not_stage: 'mystage' } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1795,7 +1831,7 @@ TEST_F(FilterNetTest, TestFilterOutByNotStage) { const string& output_proto = "state: { stage: 'mystage' } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " @@ -1807,20 +1843,20 @@ TEST_F(FilterNetTest, TestFilterOutByNotStage) { TEST_F(FilterNetTest, TestFilterOutByMinLevel) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { min_level: 3 } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1828,13 +1864,13 @@ TEST_F(FilterNetTest, TestFilterOutByMinLevel) { "} "; const string& output_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1846,20 +1882,20 @@ TEST_F(FilterNetTest, TestFilterOutByMinLevel) { TEST_F(FilterNetTest, TestFilterOutByMaxLevel) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { max_level: -3 } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1867,13 +1903,13 @@ TEST_F(FilterNetTest, TestFilterOutByMaxLevel) { "} "; const string& output_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1885,20 +1921,20 @@ TEST_F(FilterNetTest, TestFilterOutByMaxLevel) { TEST_F(FilterNetTest, TestFilterInByMinLevel) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { min_level: 0 } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1911,20 +1947,20 @@ TEST_F(FilterNetTest, TestFilterInByMinLevel2) { const string& input_proto = "state: { level: 7 } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { min_level: 3 } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1936,20 +1972,20 @@ TEST_F(FilterNetTest, TestFilterInByMinLevel2) { TEST_F(FilterNetTest, TestFilterInByMaxLevel) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { max_level: 0 } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1962,20 +1998,20 @@ TEST_F(FilterNetTest, TestFilterInByMaxLevel2) { const string& input_proto = "state: { level: -7 } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { max_level: -3 } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -1987,20 +2023,20 @@ TEST_F(FilterNetTest, TestFilterInByMaxLevel2) { TEST_F(FilterNetTest, TestFilterInOutByIncludeMultiRule) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " include: { min_level: 2 phase: TRAIN } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -2014,13 +2050,13 @@ TEST_F(FilterNetTest, TestFilterInOutByIncludeMultiRule) { const string& output_proto_train = "state: { level: 4 phase: TRAIN } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " @@ -2030,13 +2066,13 @@ TEST_F(FilterNetTest, TestFilterInOutByIncludeMultiRule) { const string& output_proto_test = "state: { level: 4 phase: TEST } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -2050,13 +2086,13 @@ TEST_F(FilterNetTest, TestFilterInOutByIncludeMultiRule) { TEST_F(FilterNetTest, TestFilterInByIncludeMultiRule) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " @@ -2064,7 +2100,7 @@ TEST_F(FilterNetTest, TestFilterInByIncludeMultiRule) { " include: { min_level: 2 phase: TRAIN } " " include: { phase: TEST } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -2083,20 +2119,20 @@ TEST_F(FilterNetTest, TestFilterInByIncludeMultiRule) { TEST_F(FilterNetTest, TestFilterInOutByExcludeMultiRule) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " " exclude: { min_level: 2 phase: TRAIN } " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -2110,13 +2146,13 @@ TEST_F(FilterNetTest, TestFilterInOutByExcludeMultiRule) { const string& output_proto_train = "state: { level: 4 phase: TRAIN } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -2126,13 +2162,13 @@ TEST_F(FilterNetTest, TestFilterInOutByExcludeMultiRule) { const string& output_proto_test = "state: { level: 4 phase: TEST } " "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " diff --git a/src/caffe/test/test_solver.cpp b/src/caffe/test/test_solver.cpp index d3f646c5bb6..1c2c9bbb740 100644 --- a/src/caffe/test/test_solver.cpp +++ b/src/caffe/test/test_solver.cpp @@ -51,7 +51,7 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { "test_state: {}" "net_param { " " name: 'TestNetwork' " - " layers: { " + " layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -67,7 +67,7 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { " top: 'data' " " top: 'label' " " } " - " layers: { " + " layer { " " name: 'innerprod' " " type: 'InnerProduct' " " inner_product_param { " @@ -76,7 +76,7 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { " bottom: 'data' " " top: 'innerprod' " " } " - " layers: { " + " layer { " " name: 'accuracy' " " type: 'Accuracy' " " bottom: 'innerprod' " @@ -84,7 +84,7 @@ TYPED_TEST(SolverTest, TestInitTrainTestNets) { " top: 'accuracy' " " exclude: { phase: TRAIN } " " } " - " layers: { " + " layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " diff --git a/src/caffe/test/test_split_layer.cpp b/src/caffe/test/test_split_layer.cpp index 584d0a4ab9c..be5204bfc3e 100644 --- a/src/caffe/test/test_split_layer.cpp +++ b/src/caffe/test/test_split_layer.cpp @@ -114,19 +114,19 @@ class SplitLayerInsertionTest : public ::testing::Test { TEST_F(SplitLayerInsertionTest, TestNoInsertion1) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -138,32 +138,32 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertion1) { TEST_F(SplitLayerInsertionTest, TestNoInsertion2) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'data_split' " " type: 'Split' " " bottom: 'data' " " top: 'data_split_0' " " top: 'data_split_1' " "} " - "layers: { " + "layer { " " name: 'innerprod1' " " type: 'InnerProduct' " " bottom: 'data_split_0' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'innerprod2' " " type: 'InnerProduct' " " bottom: 'data_split_1' " " top: 'innerprod2' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'EuclideanLoss' " " bottom: 'innerprod1' " @@ -175,7 +175,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertion2) { TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { const string& input_proto = "name: 'CaffeNet' " - "layers { " + "layer { " " name: 'data' " " type: 'Data' " " data_param { " @@ -190,7 +190,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " top: 'data' " " top: 'label' " "} " - "layers { " + "layer { " " name: 'conv1' " " type: 'Convolution' " " convolution_param { " @@ -206,20 +206,24 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " value: 0. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'data' " " top: 'conv1' " "} " - "layers { " + "layer { " " name: 'relu1' " " type: 'ReLU' " " bottom: 'conv1' " " top: 'conv1' " "} " - "layers { " + "layer { " " name: 'pool1' " " type: 'Pooling' " " pooling_param { " @@ -230,7 +234,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " bottom: 'conv1' " " top: 'pool1' " "} " - "layers { " + "layer { " " name: 'norm1' " " type: 'LRN' " " lrn_param { " @@ -241,7 +245,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " bottom: 'pool1' " " top: 'norm1' " "} " - "layers { " + "layer { " " name: 'conv2' " " type: 'Convolution' " " convolution_param { " @@ -258,20 +262,24 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " value: 1. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'norm1' " " top: 'conv2' " "} " - "layers { " + "layer { " " name: 'relu2' " " type: 'ReLU' " " bottom: 'conv2' " " top: 'conv2' " "} " - "layers { " + "layer { " " name: 'pool2' " " type: 'Pooling' " " pooling_param { " @@ -282,7 +290,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " bottom: 'conv2' " " top: 'pool2' " "} " - "layers { " + "layer { " " name: 'norm2' " " type: 'LRN' " " lrn_param { " @@ -293,7 +301,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " bottom: 'pool2' " " top: 'norm2' " "} " - "layers { " + "layer { " " name: 'conv3' " " type: 'Convolution' " " convolution_param { " @@ -309,20 +317,24 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " value: 0. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'norm2' " " top: 'conv3' " "} " - "layers { " + "layer { " " name: 'relu3' " " type: 'ReLU' " " bottom: 'conv3' " " top: 'conv3' " "} " - "layers { " + "layer { " " name: 'conv4' " " type: 'Convolution' " " convolution_param { " @@ -339,20 +351,24 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " value: 1. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'conv3' " " top: 'conv4' " "} " - "layers { " + "layer { " " name: 'relu4' " " type: 'ReLU' " " bottom: 'conv4' " " top: 'conv4' " "} " - "layers { " + "layer { " " name: 'conv5' " " type: 'Convolution' " " convolution_param { " @@ -369,20 +385,24 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " value: 1. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'conv4' " " top: 'conv5' " "} " - "layers { " + "layer { " " name: 'relu5' " " type: 'ReLU' " " bottom: 'conv5' " " top: 'conv5' " "} " - "layers { " + "layer { " " name: 'pool5' " " type: 'Pooling' " " pooling_param { " @@ -393,7 +413,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " bottom: 'conv5' " " top: 'pool5' " "} " - "layers { " + "layer { " " name: 'fc6' " " type: 'InnerProduct' " " inner_product_param { " @@ -407,20 +427,24 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " value: 1. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'pool5' " " top: 'fc6' " "} " - "layers { " + "layer { " " name: 'relu6' " " type: 'ReLU' " " bottom: 'fc6' " " top: 'fc6' " "} " - "layers { " + "layer { " " name: 'drop6' " " type: 'Dropout' " " dropout_param { " @@ -429,7 +453,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " bottom: 'fc6' " " top: 'fc6' " "} " - "layers { " + "layer { " " name: 'fc7' " " type: 'InnerProduct' " " inner_product_param { " @@ -443,20 +467,24 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " value: 1. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'fc6' " " top: 'fc7' " "} " - "layers { " + "layer { " " name: 'relu7' " " type: 'ReLU' " " bottom: 'fc7' " " top: 'fc7' " "} " - "layers { " + "layer { " " name: 'drop7' " " type: 'Dropout' " " dropout_param { " @@ -465,7 +493,7 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " bottom: 'fc7' " " top: 'fc7' " "} " - "layers { " + "layer { " " name: 'fc8' " " type: 'InnerProduct' " " inner_product_param { " @@ -479,14 +507,18 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { " value: 0 " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'fc7' " " top: 'fc8' " "} " - "layers { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'fc8' " @@ -498,25 +530,25 @@ TEST_F(SplitLayerInsertionTest, TestNoInsertionImageNet) { TEST_F(SplitLayerInsertionTest, TestNoInsertionWithInPlace) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod' " "} " - "layers: { " + "layer { " " name: 'relu' " " type: 'ReLU' " " bottom: 'innerprod' " " top: 'innerprod' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'SoftmaxWithLoss' " " bottom: 'innerprod' " @@ -529,7 +561,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { const string& input_proto = "name: 'UnsharedWeightsNetwork' " "force_backward: true " - "layers: { " + "layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -544,7 +576,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { " } " " top: 'data' " "} " - "layers: { " + "layer { " " name: 'innerproduct1' " " type: 'InnerProduct' " " inner_product_param { " @@ -555,12 +587,12 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { " std: 10 " " } " " } " - " param: 'unsharedweights1' " + " param { name: 'unsharedweights1' } " " bottom: 'data' " " top: 'innerproduct1' " " loss_weight: 2.5 " "} " - "layers: { " + "layer { " " name: 'innerproduct2' " " type: 'InnerProduct' " " inner_product_param { " @@ -571,11 +603,11 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { " std: 10 " " } " " } " - " param: 'unsharedweights2' " + " param { name: 'unsharedweights2' } " " bottom: 'data' " " top: 'innerproduct2' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'EuclideanLoss' " " bottom: 'innerproduct1' " @@ -584,7 +616,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { const string& expected_output_proto = "name: 'UnsharedWeightsNetwork' " "force_backward: true " - "layers: { " + "layer { " " name: 'data' " " type: 'DummyData' " " dummy_data_param { " @@ -599,14 +631,14 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { " } " " top: 'data' " "} " - "layers: { " + "layer { " " name: 'data_data_0_split' " " type: 'Split' " " bottom: 'data' " " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " "} " - "layers: { " + "layer { " " name: 'innerproduct1' " " type: 'InnerProduct' " " inner_product_param { " @@ -617,11 +649,11 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { " std: 10 " " } " " } " - " param: 'unsharedweights1' " + " param { name: 'unsharedweights1' } " " bottom: 'data_data_0_split_0' " " top: 'innerproduct1' " "} " - "layers: { " + "layer { " " name: 'innerproduct1_innerproduct1_0_split' " " type: 'Split' " " bottom: 'innerproduct1' " @@ -630,7 +662,7 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { " loss_weight: 2.5 " " loss_weight: 0 " "} " - "layers: { " + "layer { " " name: 'innerproduct2' " " type: 'InnerProduct' " " inner_product_param { " @@ -641,11 +673,11 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { " std: 10 " " } " " } " - " param: 'unsharedweights2' " + " param { name: 'unsharedweights2' } " " bottom: 'data_data_0_split_1' " " top: 'innerproduct2' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'EuclideanLoss' " " bottom: 'innerproduct1_innerproduct1_0_split_1' " @@ -657,37 +689,37 @@ TEST_F(SplitLayerInsertionTest, TestLossInsertion) { TEST_F(SplitLayerInsertionTest, TestInsertion) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod1' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'innerprod2' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod2' " "} " - "layers: { " + "layer { " " name: 'innerprod3' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod3' " "} " - "layers: { " + "layer { " " name: 'loss1' " " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod2' " "} " - "layers: { " + "layer { " " name: 'loss2' " " type: 'EuclideanLoss' " " bottom: 'innerprod2' " @@ -695,13 +727,13 @@ TEST_F(SplitLayerInsertionTest, TestInsertion) { "} "; const string& expected_output_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'data_data_0_split' " " type: 'Split' " " bottom: 'data' " @@ -709,38 +741,38 @@ TEST_F(SplitLayerInsertionTest, TestInsertion) { " top: 'data_data_0_split_1' " " top: 'data_data_0_split_2' " "} " - "layers: { " + "layer { " " name: 'innerprod1' " " type: 'InnerProduct' " " bottom: 'data_data_0_split_0' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'innerprod2' " " type: 'InnerProduct' " " bottom: 'data_data_0_split_1' " " top: 'innerprod2' " "} " - "layers: { " + "layer { " " name: 'innerprod2_innerprod2_0_split' " " type: 'Split' " " bottom: 'innerprod2' " " top: 'innerprod2_innerprod2_0_split_0' " " top: 'innerprod2_innerprod2_0_split_1' " "} " - "layers: { " + "layer { " " name: 'innerprod3' " " type: 'InnerProduct' " " bottom: 'data_data_0_split_2' " " top: 'innerprod3' " "} " - "layers: { " + "layer { " " name: 'loss1' " " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod2_innerprod2_0_split_0' " "} " - "layers: { " + "layer { " " name: 'loss2' " " type: 'EuclideanLoss' " " bottom: 'innerprod2_innerprod2_0_split_1' " @@ -752,43 +784,43 @@ TEST_F(SplitLayerInsertionTest, TestInsertion) { TEST_F(SplitLayerInsertionTest, TestInsertionTwoTop) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod1' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'innerprod2' " " type: 'InnerProduct' " " bottom: 'label' " " top: 'innerprod2' " "} " - "layers: { " + "layer { " " name: 'innerprod3' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod3' " "} " - "layers: { " + "layer { " " name: 'innerprod4' " " type: 'InnerProduct' " " bottom: 'label' " " top: 'innerprod4' " "} " - "layers: { " + "layer { " " name: 'loss1' " " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod3' " "} " - "layers: { " + "layer { " " name: 'loss2' " " type: 'EuclideanLoss' " " bottom: 'innerprod2' " @@ -796,57 +828,57 @@ TEST_F(SplitLayerInsertionTest, TestInsertionTwoTop) { "} "; const string& expected_output_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'data_data_0_split' " " type: 'Split' " " bottom: 'data' " " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " "} " - "layers: { " + "layer { " " name: 'label_data_1_split' " " type: 'Split' " " bottom: 'label' " " top: 'label_data_1_split_0' " " top: 'label_data_1_split_1' " "} " - "layers: { " + "layer { " " name: 'innerprod1' " " type: 'InnerProduct' " " bottom: 'data_data_0_split_0' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'innerprod2' " " type: 'InnerProduct' " " bottom: 'label_data_1_split_0' " " top: 'innerprod2' " "} " - "layers: { " + "layer { " " name: 'innerprod3' " " type: 'InnerProduct' " " bottom: 'data_data_0_split_1' " " top: 'innerprod3' " "} " - "layers: { " + "layer { " " name: 'innerprod4' " " type: 'InnerProduct' " " bottom: 'label_data_1_split_1' " " top: 'innerprod4' " "} " - "layers: { " + "layer { " " name: 'loss1' " " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'innerprod3' " "} " - "layers: { " + "layer { " " name: 'loss2' " " type: 'EuclideanLoss' " " bottom: 'innerprod2' " @@ -863,19 +895,19 @@ TEST_F(SplitLayerInsertionTest, TestInputInsertion) { "input_dim: 3 " "input_dim: 227 " "input_dim: 227 " - "layers: { " + "layer { " " name: 'innerprod1' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'innerprod2' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod2' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'EuclideanLoss' " " bottom: 'innerprod1' " @@ -888,26 +920,26 @@ TEST_F(SplitLayerInsertionTest, TestInputInsertion) { "input_dim: 3 " "input_dim: 227 " "input_dim: 227 " - "layers: { " + "layer { " " name: 'data_input_0_split' " " type: 'Split' " " bottom: 'data' " " top: 'data_input_0_split_0' " " top: 'data_input_0_split_1' " "} " - "layers: { " + "layer { " " name: 'innerprod1' " " type: 'InnerProduct' " " bottom: 'data_input_0_split_0' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'innerprod2' " " type: 'InnerProduct' " " bottom: 'data_input_0_split_1' " " top: 'innerprod2' " "} " - "layers: { " + "layer { " " name: 'loss' " " type: 'EuclideanLoss' " " bottom: 'innerprod1' " @@ -919,37 +951,37 @@ TEST_F(SplitLayerInsertionTest, TestInputInsertion) { TEST_F(SplitLayerInsertionTest, TestWithInPlace) { const string& input_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'innerprod1' " " type: 'InnerProduct' " " bottom: 'data' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'relu1' " " type: 'ReLU' " " bottom: 'innerprod1' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'innerprod2' " " type: 'InnerProduct' " " bottom: 'innerprod1' " " top: 'innerprod2' " "} " - "layers: { " + "layer { " " name: 'loss1' " " type: 'EuclideanLoss' " " bottom: 'innerprod1' " " bottom: 'label' " "} " - "layers: { " + "layer { " " name: 'loss2' " " type: 'EuclideanLoss' " " bottom: 'innerprod2' " @@ -957,51 +989,51 @@ TEST_F(SplitLayerInsertionTest, TestWithInPlace) { "} "; const string& expected_output_proto = "name: 'TestNetwork' " - "layers: { " + "layer { " " name: 'data' " " type: 'Data' " " top: 'data' " " top: 'label' " "} " - "layers: { " + "layer { " " name: 'data_data_0_split' " " type: 'Split' " " bottom: 'data' " " top: 'data_data_0_split_0' " " top: 'data_data_0_split_1' " "} " - "layers: { " + "layer { " " name: 'innerprod1' " " type: 'InnerProduct' " " bottom: 'data_data_0_split_0' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'relu1' " " type: 'ReLU' " " bottom: 'innerprod1' " " top: 'innerprod1' " "} " - "layers: { " + "layer { " " name: 'innerprod1_relu1_0_split' " " type: 'Split' " " bottom: 'innerprod1' " " top: 'innerprod1_relu1_0_split_0' " " top: 'innerprod1_relu1_0_split_1' " "} " - "layers: { " + "layer { " " name: 'innerprod2' " " type: 'InnerProduct' " " bottom: 'innerprod1_relu1_0_split_0' " " top: 'innerprod2' " "} " - "layers: { " + "layer { " " name: 'loss1' " " type: 'EuclideanLoss' " " bottom: 'innerprod1_relu1_0_split_1' " " bottom: 'label' " "} " - "layers: { " + "layer { " " name: 'loss2' " " type: 'EuclideanLoss' " " bottom: 'innerprod2' " diff --git a/src/caffe/test/test_upgrade_proto.cpp b/src/caffe/test/test_upgrade_proto.cpp index 8cff961f9e8..7094055d4c8 100644 --- a/src/caffe/test/test_upgrade_proto.cpp +++ b/src/caffe/test/test_upgrade_proto.cpp @@ -1302,10 +1302,14 @@ TEST_F(NetUpgradeTest, TestSimple) { " value: 0. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'data' " " top: 'conv1' " "} " @@ -1323,10 +1327,14 @@ TEST_F(NetUpgradeTest, TestSimple) { " value: 0 " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'conv1' " " top: 'fc8' " "} " @@ -2560,10 +2568,14 @@ TEST_F(NetUpgradeTest, TestImageNet) { " value: 0. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'data' " " top: 'conv1' " "} " @@ -2612,10 +2624,14 @@ TEST_F(NetUpgradeTest, TestImageNet) { " value: 1. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'norm1' " " top: 'conv2' " "} " @@ -2663,10 +2679,14 @@ TEST_F(NetUpgradeTest, TestImageNet) { " value: 0. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'norm2' " " top: 'conv3' " "} " @@ -2693,10 +2713,14 @@ TEST_F(NetUpgradeTest, TestImageNet) { " value: 1. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'conv3' " " top: 'conv4' " "} " @@ -2723,10 +2747,14 @@ TEST_F(NetUpgradeTest, TestImageNet) { " value: 1. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'conv4' " " top: 'conv5' " "} " @@ -2761,10 +2789,14 @@ TEST_F(NetUpgradeTest, TestImageNet) { " value: 1. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'pool5' " " top: 'fc6' " "} " @@ -2797,10 +2829,14 @@ TEST_F(NetUpgradeTest, TestImageNet) { " value: 1. " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'fc6' " " top: 'fc7' " "} " @@ -2833,10 +2869,14 @@ TEST_F(NetUpgradeTest, TestImageNet) { " value: 0 " " } " " } " - " blobs_lr: 1. " - " blobs_lr: 2. " - " weight_decay: 1. " - " weight_decay: 0. " + " param { " + " lr_mult: 1 " + " decay_mult: 1 " + " } " + " param { " + " lr_mult: 2 " + " decay_mult: 0 " + " } " " bottom: 'fc7' " " top: 'fc8' " "} " diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index 575d7a73fee..6b401b537e0 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -659,6 +659,7 @@ bool UpgradeV1Net(const NetParameter& v1_net_param, NetParameter* net_param) { } net_param->CopyFrom(v1_net_param); net_param->clear_layers(); + net_param->clear_layer(); for (int i = 0; i < v1_net_param.layers_size(); ++i) { if (!UpgradeV1LayerParameter(v1_net_param.layers(i), net_param->add_layer())) { @@ -695,27 +696,34 @@ bool UpgradeV1LayerParameter(const V1LayerParameter& v1_layer_param, layer_param->add_blobs()->CopyFrom(v1_layer_param.blobs(i)); } for (int i = 0; i < v1_layer_param.param_size(); ++i) { - layer_param->add_param(v1_layer_param.param(i)); + while (layer_param->param_size() <= i) { layer_param->add_param(); } + layer_param->mutable_param(i)->set_name(v1_layer_param.param(i)); } + ParamSpec_DimCheckMode mode; for (int i = 0; i < v1_layer_param.blob_share_mode_size(); ++i) { + while (layer_param->param_size() <= i) { layer_param->add_param(); } switch (v1_layer_param.blob_share_mode(i)) { case V1LayerParameter_DimCheckMode_STRICT: - layer_param->add_param_share_mode(LayerParameter_DimCheckMode_STRICT); + mode = ParamSpec_DimCheckMode_STRICT; break; case V1LayerParameter_DimCheckMode_PERMISSIVE: - layer_param->add_param_share_mode(LayerParameter_DimCheckMode_PERMISSIVE); + mode = ParamSpec_DimCheckMode_PERMISSIVE; break; default: LOG(FATAL) << "Unknown blob_share_mode: " << v1_layer_param.blob_share_mode(i); break; } + layer_param->mutable_param(i)->set_share_mode(mode); } for (int i = 0; i < v1_layer_param.blobs_lr_size(); ++i) { - layer_param->add_blobs_lr(v1_layer_param.blobs_lr(i)); + while (layer_param->param_size() <= i) { layer_param->add_param(); } + layer_param->mutable_param(i)->set_lr_mult(v1_layer_param.blobs_lr(i)); } for (int i = 0; i < v1_layer_param.weight_decay_size(); ++i) { - layer_param->add_weight_decay(v1_layer_param.weight_decay(i)); + while (layer_param->param_size() <= i) { layer_param->add_param(); } + layer_param->mutable_param(i)->set_decay_mult( + v1_layer_param.weight_decay(i)); } for (int i = 0; i < v1_layer_param.loss_weight_size(); ++i) { layer_param->add_loss_weight(v1_layer_param.loss_weight(i)); From 62d1d3add909c86bf26e85203faa1ed64c88c597 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 15 Jan 2015 00:13:23 -0800 Subject: [PATCH 1097/2053] get rid of NetParameterPrettyPrint as layer is now after inputs (whoohoo) --- include/caffe/util/upgrade_proto.hpp | 6 ------ src/caffe/proto/caffe_pretty_print.proto | 18 ------------------ src/caffe/util/upgrade_proto.cpp | 20 -------------------- tools/upgrade_net_proto_text.cpp | 7 +------ 4 files changed, 1 insertion(+), 50 deletions(-) delete mode 100644 src/caffe/proto/caffe_pretty_print.proto diff --git a/include/caffe/util/upgrade_proto.hpp b/include/caffe/util/upgrade_proto.hpp index 0df3a8987f9..c1f21a0d4d8 100644 --- a/include/caffe/util/upgrade_proto.hpp +++ b/include/caffe/util/upgrade_proto.hpp @@ -4,7 +4,6 @@ #include <string> #include "caffe/proto/caffe.pb.h" -#include "caffe/proto/caffe_pretty_print.pb.h" namespace caffe { @@ -51,11 +50,6 @@ bool UpgradeV1LayerParameter(const V1LayerParameter& v1_layer_param, const char* UpgradeV1LayerType(const V1LayerParameter_LayerType type); -// Convert a NetParameter to NetParameterPrettyPrint used for dumping to -// proto text files. -void NetParameterToPrettyPrint(const NetParameter& param, - NetParameterPrettyPrint* pretty_param); - // Check for deprecations and upgrade the NetParameter as needed. bool UpgradeNetAsNeeded(const string& param_file, NetParameter* param); diff --git a/src/caffe/proto/caffe_pretty_print.proto b/src/caffe/proto/caffe_pretty_print.proto deleted file mode 100644 index 056541f75f1..00000000000 --- a/src/caffe/proto/caffe_pretty_print.proto +++ /dev/null @@ -1,18 +0,0 @@ -syntax = "proto2"; - -package caffe; - -import "caffe.proto"; - -// A near-duplicate of NetParameter with fields re-numbered to beautify -// automatic prototext dumps. The main practical purpose is to print inputs -// before layers, because having inputs at the end looks weird. -// NetParameterPrettyPrint should never be used in code except for conversion -// FROM NetParameter and subsequent dumping to proto text file. -message NetParameterPrettyPrint { - optional string name = 1; - optional bool force_backward = 2 [default = false]; - repeated string input = 3; - repeated int32 input_dim = 4; - repeated LayerParameter layer = 5; -} diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index 6b401b537e0..258d7d3ee7d 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -583,26 +583,6 @@ void UpgradeNetDataTransformation(NetParameter* net_param) { } } -void NetParameterToPrettyPrint(const NetParameter& param, - NetParameterPrettyPrint* pretty_param) { - pretty_param->Clear(); - if (param.has_name()) { - pretty_param->set_name(param.name()); - } - if (param.has_force_backward()) { - pretty_param->set_force_backward(param.force_backward()); - } - for (int i = 0; i < param.input_size(); ++i) { - pretty_param->add_input(param.input(i)); - } - for (int i = 0; i < param.input_dim_size(); ++i) { - pretty_param->add_input_dim(param.input_dim(i)); - } - for (int i = 0; i < param.layer_size(); ++i) { - pretty_param->add_layer()->CopyFrom(param.layer(i)); - } -} - bool UpgradeNetAsNeeded(const string& param_file, NetParameter* param) { bool success = true; if (NetNeedsV0ToV1Upgrade(*param)) { diff --git a/tools/upgrade_net_proto_text.cpp b/tools/upgrade_net_proto_text.cpp index 0fe420a6d36..9200431bc27 100644 --- a/tools/upgrade_net_proto_text.cpp +++ b/tools/upgrade_net_proto_text.cpp @@ -47,13 +47,8 @@ int main(int argc, char** argv) { UpgradeNetDataTransformation(&net_param); } - // Convert to a NetParameterPrettyPrint to print fields in desired - // order. - NetParameterPrettyPrint net_param_pretty; - NetParameterToPrettyPrint(net_param, &net_param_pretty); - // Save new format prototxt. - WriteProtoToTextFile(net_param_pretty, argv[2]); + WriteProtoToTextFile(net_param, argv[2]); LOG(ERROR) << "Wrote upgraded NetParameter text proto to " << argv[2]; return !success; From 11a4c1655842a625a8fbb93f8c8ccd3629321a3f Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 15 Jan 2015 01:43:23 -0800 Subject: [PATCH 1098/2053] start layer parameter field IDs at 100 (always want them printed at the end, and want to allow more fields to be added in the future, so reserve fields 10-99 for that purpose) --- src/caffe/proto/caffe.proto | 69 +++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 453bf7ff285..81fd2517dbf 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -241,7 +241,7 @@ message ParamSpec { // NOTE // Update the next available ID when you add a new LayerParameter field. // -// LayerParameter next available ID: 43 (last added: loss_param) +// LayerParameter next available layer-specific ID: 129 (last added: window_data_param) message LayerParameter { optional string name = 1; // the layer name optional string type = 2; // the layer type @@ -266,48 +266,49 @@ message LayerParameter { // specified, the layer is always included. If the current NetState meets // ANY (i.e., one or more) of the specified rules, the layer is // included/excluded. - repeated NetStateRule include = 11; - repeated NetStateRule exclude = 12; + repeated NetStateRule include = 8; + repeated NetStateRule exclude = 9; // Parameters for data pre-processing. - optional TransformationParameter transform_param = 13; - - optional AccuracyParameter accuracy_param = 14; - optional ArgMaxParameter argmax_param = 15; - optional ConcatParameter concat_param = 16; - optional ContrastiveLossParameter contrastive_loss_param = 17; - optional ConvolutionParameter convolution_param = 18; - optional DataParameter data_param = 19; - optional DropoutParameter dropout_param = 20; - optional DummyDataParameter dummy_data_param = 21; - optional EltwiseParameter eltwise_param = 22; - optional ExpParameter exp_param = 23; - optional HDF5DataParameter hdf5_data_param = 24; - optional HDF5OutputParameter hdf5_output_param = 25; - optional HingeLossParameter hinge_loss_param = 26; - optional ImageDataParameter image_data_param = 27; - optional InfogainLossParameter infogain_loss_param = 28; - optional InnerProductParameter inner_product_param = 29; - optional LRNParameter lrn_param = 30; - optional MemoryDataParameter memory_data_param = 31; - optional MVNParameter mvn_param = 32; - optional PoolingParameter pooling_param = 33; - optional PowerParameter power_param = 34; - optional ReLUParameter relu_param = 35; - optional SigmoidParameter sigmoid_param = 36; - optional SoftmaxParameter softmax_param = 37; - optional SliceParameter slice_param = 38; - optional TanHParameter tanh_param = 39; - optional ThresholdParameter threshold_param = 40; - optional WindowDataParameter window_data_param = 41; + optional TransformationParameter transform_param = 100; // Parameters shared by loss layers. - optional LossParameter loss_param = 42; + optional LossParameter loss_param = 101; + // Layer type-specific parameters. + // // Note: certain layers may have more than one computational engine // for their implementation. These layers include an Engine type and // engine parameter for selecting the implementation. // The default for the engine is set by the ENGINE switch at compile-time. + optional AccuracyParameter accuracy_param = 102; + optional ArgMaxParameter argmax_param = 103; + optional ConcatParameter concat_param = 104; + optional ContrastiveLossParameter contrastive_loss_param = 105; + optional ConvolutionParameter convolution_param = 106; + optional DataParameter data_param = 107; + optional DropoutParameter dropout_param = 108; + optional DummyDataParameter dummy_data_param = 109; + optional EltwiseParameter eltwise_param = 110; + optional ExpParameter exp_param = 111; + optional HDF5DataParameter hdf5_data_param = 112; + optional HDF5OutputParameter hdf5_output_param = 113; + optional HingeLossParameter hinge_loss_param = 114; + optional ImageDataParameter image_data_param = 115; + optional InfogainLossParameter infogain_loss_param = 116; + optional InnerProductParameter inner_product_param = 117; + optional LRNParameter lrn_param = 118; + optional MemoryDataParameter memory_data_param = 119; + optional MVNParameter mvn_param = 120; + optional PoolingParameter pooling_param = 121; + optional PowerParameter power_param = 122; + optional ReLUParameter relu_param = 123; + optional SigmoidParameter sigmoid_param = 124; + optional SoftmaxParameter softmax_param = 125; + optional SliceParameter slice_param = 126; + optional TanHParameter tanh_param = 127; + optional ThresholdParameter threshold_param = 128; + optional WindowDataParameter window_data_param = 129; } // Message that stores parameters used to apply transformation From e6c80dac40d4bb13390b56bc18294e6e91b00436 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 5 Feb 2015 15:17:24 -0800 Subject: [PATCH 1099/2053] Upgrade existing nets using upgrade_net_proto_text tool Restore comments afterwards --- examples/cifar10/cifar10_full.prototxt | 84 +- .../cifar10/cifar10_full_train_test.prototxt | 120 +- examples/cifar10/cifar10_quick.prototxt | 88 +- .../cifar10/cifar10_quick_train_test.prototxt | 124 +- .../feature_extraction/imagenet_val.prototxt | 114 +- .../pascal_finetune_trainval_test.prototxt | 230 ++- .../hdf5_classification/train_val.prototxt | 44 +- .../hdf5_classification/train_val2.prototxt | 64 +- .../imagenet/bvlc_caffenet_full_conv.prototxt | 92 +- examples/mnist/lenet.prototxt | 64 +- examples/mnist/lenet_train_test.prototxt | 105 +- examples/mnist/mnist_autoencoder.prototxt | 260 +-- examples/siamese/mnist_siamese.prototxt | 74 +- .../siamese/mnist_siamese_train_test.prototxt | 260 ++- models/bvlc_alexnet/deploy.prototxt | 248 ++- models/bvlc_alexnet/train_val.prototxt | 232 ++- models/bvlc_googlenet/deploy.prototxt | 1548 ++++++++------ models/bvlc_googlenet/train_val.prototxt | 1802 ++++++++++------- .../bvlc_reference_caffenet/deploy.prototxt | 92 +- .../train_val.prototxt | 232 ++- .../deploy.prototxt | 88 +- models/finetune_flickr_style/deploy.prototxt | 192 +- .../finetune_flickr_style/train_val.prototxt | 236 ++- 23 files changed, 3661 insertions(+), 2732 deletions(-) diff --git a/examples/cifar10/cifar10_full.prototxt b/examples/cifar10/cifar10_full.prototxt index 8bbd30004fd..c16f7dca49f 100644 --- a/examples/cifar10/cifar10_full.prototxt +++ b/examples/cifar10/cifar10_full.prototxt @@ -6,13 +6,17 @@ input_dim: 1 input_dim: 3 input_dim: 32 input_dim: 32 -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 32 pad: 2 @@ -20,9 +24,9 @@ layers { stride: 1 } } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -31,31 +35,35 @@ layers { stride: 2 } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "pool1" top: "pool1" } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "pool1" top: "norm1" lrn_param { - norm_region: WITHIN_CHANNEL local_size: 3 alpha: 5e-05 beta: 0.75 + norm_region: WITHIN_CHANNEL } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "norm1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 32 pad: 2 @@ -63,15 +71,15 @@ layers { stride: 1 } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -80,21 +88,21 @@ layers { stride: 2 } } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "pool2" top: "norm2" lrn_param { - norm_region: WITHIN_CHANNEL local_size: 3 alpha: 5e-05 beta: 0.75 + norm_region: WITHIN_CHANNEL } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "norm2" top: "conv3" convolution_param { @@ -104,15 +112,15 @@ layers { stride: 1 } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "pool3" - type: POOLING + type: "Pooling" bottom: "conv3" top: "pool3" pooling_param { @@ -121,22 +129,26 @@ layers { stride: 2 } } -layers { +layer { name: "ip1" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool3" top: "ip1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 250 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 250 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 10 } } -layers { +layer { name: "prob" - type: SOFTMAX + type: "Softmax" bottom: "ip1" top: "prob" } diff --git a/examples/cifar10/cifar10_full_train_test.prototxt b/examples/cifar10/cifar10_full_train_test.prototxt index 38cc04f4a68..d45fc61e120 100644 --- a/examples/cifar10/cifar10_full_train_test.prototxt +++ b/examples/cifar10/cifar10_full_train_test.prototxt @@ -1,41 +1,49 @@ name: "CIFAR10_full" -layers { +layer { name: "cifar" - type: DATA + type: "Data" top: "data" top: "label" + include { + phase: TRAIN + } + transform_param { + mean_file: "examples/cifar10/mean.binaryproto" + } data_param { source: "examples/cifar10/cifar10_train_lmdb" batch_size: 100 backend: LMDB } - transform_param { - mean_file: "examples/cifar10/mean.binaryproto" - } - include: { phase: TRAIN } } -layers { +layer { name: "cifar" - type: DATA + type: "Data" top: "data" top: "label" + include { + phase: TEST + } + transform_param { + mean_file: "examples/cifar10/mean.binaryproto" + } data_param { source: "examples/cifar10/cifar10_test_lmdb" batch_size: 100 backend: LMDB } - transform_param { - mean_file: "examples/cifar10/mean.binaryproto" - } - include: { phase: TEST } } -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 32 pad: 2 @@ -50,9 +58,9 @@ layers { } } } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -61,31 +69,35 @@ layers { stride: 2 } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "pool1" top: "pool1" } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "pool1" top: "norm1" lrn_param { - norm_region: WITHIN_CHANNEL local_size: 3 alpha: 5e-05 beta: 0.75 + norm_region: WITHIN_CHANNEL } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "norm1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 32 pad: 2 @@ -100,15 +112,15 @@ layers { } } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -117,21 +129,21 @@ layers { stride: 2 } } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "pool2" top: "norm2" lrn_param { - norm_region: WITHIN_CHANNEL local_size: 3 alpha: 5e-05 beta: 0.75 + norm_region: WITHIN_CHANNEL } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "norm2" top: "conv3" convolution_param { @@ -148,15 +160,15 @@ layers { } } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "pool3" - type: POOLING + type: "Pooling" bottom: "conv3" top: "pool3" pooling_param { @@ -165,15 +177,19 @@ layers { stride: 2 } } -layers { +layer { name: "ip1" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool3" top: "ip1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 250 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 250 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 10 weight_filler { @@ -185,17 +201,19 @@ layers { } } } -layers { +layer { name: "accuracy" - type: ACCURACY + type: "Accuracy" bottom: "ip1" bottom: "label" top: "accuracy" - include: { phase: TEST } + include { + phase: TEST + } } -layers { +layer { name: "loss" - type: SOFTMAX_LOSS + type: "SoftmaxWithLoss" bottom: "ip1" bottom: "label" top: "loss" diff --git a/examples/cifar10/cifar10_quick.prototxt b/examples/cifar10/cifar10_quick.prototxt index 505158f7a34..1ad190e185f 100644 --- a/examples/cifar10/cifar10_quick.prototxt +++ b/examples/cifar10/cifar10_quick.prototxt @@ -4,13 +4,17 @@ input_dim: 1 input_dim: 3 input_dim: 32 input_dim: 32 -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 32 pad: 2 @@ -18,9 +22,9 @@ layers { stride: 1 } } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -29,19 +33,23 @@ layers { stride: 2 } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "pool1" top: "pool1" } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "pool1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 32 pad: 2 @@ -49,15 +57,15 @@ layers { stride: 1 } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -66,13 +74,17 @@ layers { stride: 2 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "pool2" top: "conv3" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 64 pad: 2 @@ -80,15 +92,15 @@ layers { stride: 1 } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "pool3" - type: POOLING + type: "Pooling" bottom: "conv3" top: "pool3" pooling_param { @@ -97,31 +109,39 @@ layers { stride: 2 } } -layers { +layer { name: "ip1" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool3" top: "ip1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 64 } } -layers { +layer { name: "ip2" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "ip1" top: "ip2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 10 } } -layers { +layer { name: "prob" - type: SOFTMAX + type: "Softmax" bottom: "ip2" top: "prob" } diff --git a/examples/cifar10/cifar10_quick_train_test.prototxt b/examples/cifar10/cifar10_quick_train_test.prototxt index 074bb0011e3..2317739353e 100644 --- a/examples/cifar10/cifar10_quick_train_test.prototxt +++ b/examples/cifar10/cifar10_quick_train_test.prototxt @@ -1,41 +1,49 @@ name: "CIFAR10_quick" -layers { +layer { name: "cifar" - type: DATA + type: "Data" top: "data" top: "label" + include { + phase: TRAIN + } + transform_param { + mean_file: "examples/cifar10/mean.binaryproto" + } data_param { source: "examples/cifar10/cifar10_train_lmdb" batch_size: 100 backend: LMDB } - transform_param { - mean_file: "examples/cifar10/mean.binaryproto" - } - include: { phase: TRAIN } } -layers { +layer { name: "cifar" - type: DATA + type: "Data" top: "data" top: "label" + include { + phase: TEST + } + transform_param { + mean_file: "examples/cifar10/mean.binaryproto" + } data_param { source: "examples/cifar10/cifar10_test_lmdb" batch_size: 100 backend: LMDB } - transform_param { - mean_file: "examples/cifar10/mean.binaryproto" - } - include: { phase: TEST } } -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 32 pad: 2 @@ -50,9 +58,9 @@ layers { } } } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -61,19 +69,23 @@ layers { stride: 2 } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "pool1" top: "pool1" } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "pool1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 32 pad: 2 @@ -88,15 +100,15 @@ layers { } } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -105,13 +117,17 @@ layers { stride: 2 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "pool2" top: "conv3" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 64 pad: 2 @@ -126,15 +142,15 @@ layers { } } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "pool3" - type: POOLING + type: "Pooling" bottom: "conv3" top: "pool3" pooling_param { @@ -143,13 +159,17 @@ layers { stride: 2 } } -layers { +layer { name: "ip1" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool3" top: "ip1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 64 weight_filler { @@ -161,13 +181,17 @@ layers { } } } -layers { +layer { name: "ip2" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "ip1" top: "ip2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 10 weight_filler { @@ -179,17 +203,19 @@ layers { } } } -layers { +layer { name: "accuracy" - type: ACCURACY + type: "Accuracy" bottom: "ip2" bottom: "label" top: "accuracy" - include: { phase: TEST } + include { + phase: TEST + } } -layers { +layer { name: "loss" - type: SOFTMAX_LOSS + type: "SoftmaxWithLoss" bottom: "ip2" bottom: "label" top: "loss" diff --git a/examples/feature_extraction/imagenet_val.prototxt b/examples/feature_extraction/imagenet_val.prototxt index 83fe8c1a08d..b0a1cefa00e 100644 --- a/examples/feature_extraction/imagenet_val.prototxt +++ b/examples/feature_extraction/imagenet_val.prototxt @@ -1,24 +1,24 @@ name: "CaffeNet" -layers { +layer { name: "data" - type: IMAGE_DATA + type: "ImageData" top: "data" top: "label" + transform_param { + mirror: false + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + } image_data_param { source: "examples/_temp/file_list.txt" batch_size: 50 new_height: 256 new_width: 256 } - transform_param { - crop_size: 227 - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: false - } } -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" convolution_param { @@ -27,15 +27,15 @@ layers { stride: 4 } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "conv1" top: "conv1" } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -44,9 +44,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "pool1" top: "norm1" lrn_param { @@ -55,9 +55,9 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "norm1" top: "conv2" convolution_param { @@ -67,15 +67,15 @@ layers { group: 2 } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -84,9 +84,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "pool2" top: "norm2" lrn_param { @@ -95,9 +95,9 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "norm2" top: "conv3" convolution_param { @@ -106,15 +106,15 @@ layers { kernel_size: 3 } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "conv4" - type: CONVOLUTION + type: "Convolution" bottom: "conv3" top: "conv4" convolution_param { @@ -124,15 +124,15 @@ layers { group: 2 } } -layers { +layer { name: "relu4" - type: RELU + type: "ReLU" bottom: "conv4" top: "conv4" } -layers { +layer { name: "conv5" - type: CONVOLUTION + type: "Convolution" bottom: "conv4" top: "conv5" convolution_param { @@ -142,15 +142,15 @@ layers { group: 2 } } -layers { +layer { name: "relu5" - type: RELU + type: "ReLU" bottom: "conv5" top: "conv5" } -layers { +layer { name: "pool5" - type: POOLING + type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { @@ -159,79 +159,79 @@ layers { stride: 2 } } -layers { +layer { name: "fc6" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool5" top: "fc6" inner_product_param { num_output: 4096 } } -layers { +layer { name: "relu6" - type: RELU + type: "ReLU" bottom: "fc6" top: "fc6" } -layers { +layer { name: "drop6" - type: DROPOUT + type: "Dropout" bottom: "fc6" top: "fc6" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc7" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc6" top: "fc7" inner_product_param { num_output: 4096 } } -layers { +layer { name: "relu7" - type: RELU + type: "ReLU" bottom: "fc7" top: "fc7" } -layers { +layer { name: "drop7" - type: DROPOUT + type: "Dropout" bottom: "fc7" top: "fc7" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc8" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc7" top: "fc8" inner_product_param { num_output: 1000 } } -layers { +layer { name: "prob" - type: SOFTMAX + type: "Softmax" bottom: "fc8" top: "prob" } -layers { +layer { name: "accuracy" - type: ACCURACY + type: "Accuracy" bottom: "prob" bottom: "label" top: "accuracy" } -layers { +layer { name: "loss" - type: SOFTMAX_LOSS + type: "SoftmaxWithLoss" bottom: "fc8" bottom: "label" top: "loss" diff --git a/examples/finetune_pascal_detection/pascal_finetune_trainval_test.prototxt b/examples/finetune_pascal_detection/pascal_finetune_trainval_test.prototxt index 5cd605bbf11..9dd2120acad 100644 --- a/examples/finetune_pascal_detection/pascal_finetune_trainval_test.prototxt +++ b/examples/finetune_pascal_detection/pascal_finetune_trainval_test.prototxt @@ -1,9 +1,17 @@ name: "CaffeNet" -layers { +layer { name: "data" - type: WINDOW_DATA + type: "WindowData" top: "data" top: "label" + include { + phase: TRAIN + } + transform_param { + mirror: true + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + } window_data_param { source: "examples/finetune_pascal_detection/window_file_2007_trainval.txt" batch_size: 128 @@ -13,18 +21,20 @@ layers { context_pad: 16 crop_mode: "warp" } +} +layer { + name: "data" + type: "WindowData" + top: "data" + top: "label" + include { + phase: TEST + } transform_param { mirror: true crop_size: 227 mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" } - include: { phase: TRAIN } -} -layers { - name: "data" - type: WINDOW_DATA - top: "data" - top: "label" window_data_param { source: "examples/finetune_pascal_detection/window_file_2007_test.txt" batch_size: 128 @@ -34,22 +44,20 @@ layers { context_pad: 16 crop_mode: "warp" } - transform_param { - mirror: true - crop_size: 227 - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - } - include: { phase: TEST } } -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 kernel_size: 11 @@ -64,15 +72,15 @@ layers { } } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "conv1" top: "conv1" } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -81,9 +89,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "pool1" top: "norm1" lrn_param { @@ -92,15 +100,19 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "norm1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 2 @@ -116,15 +128,15 @@ layers { } } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -133,9 +145,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "pool2" top: "norm2" lrn_param { @@ -144,15 +156,19 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "norm2" top: "conv3" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -167,21 +183,25 @@ layers { } } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "conv4" - type: CONVOLUTION + type: "Convolution" bottom: "conv3" top: "conv4" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -197,21 +217,25 @@ layers { } } } -layers { +layer { name: "relu4" - type: RELU + type: "ReLU" bottom: "conv4" top: "conv4" } -layers { +layer { name: "conv5" - type: CONVOLUTION + type: "Convolution" bottom: "conv4" top: "conv5" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 1 @@ -227,15 +251,15 @@ layers { } } } -layers { +layer { name: "relu5" - type: RELU + type: "ReLU" bottom: "conv5" top: "conv5" } -layers { +layer { name: "pool5" - type: POOLING + type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { @@ -244,15 +268,19 @@ layers { stride: 2 } } -layers { +layer { name: "fc6" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool5" top: "fc6" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 weight_filler { @@ -265,30 +293,34 @@ layers { } } } -layers { +layer { name: "relu6" - type: RELU + type: "ReLU" bottom: "fc6" top: "fc6" } -layers { +layer { name: "drop6" - type: DROPOUT + type: "Dropout" bottom: "fc6" top: "fc6" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc7" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc6" top: "fc7" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 weight_filler { @@ -301,30 +333,34 @@ layers { } } } -layers { +layer { name: "relu7" - type: RELU + type: "ReLU" bottom: "fc7" top: "fc7" } -layers { +layer { name: "drop7" - type: DROPOUT + type: "Dropout" bottom: "fc7" top: "fc7" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc8_pascal" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc7" top: "fc8_pascal" - blobs_lr: 10 - blobs_lr: 20 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 10 + decay_mult: 1 + } + param { + lr_mult: 20 + decay_mult: 0 + } inner_product_param { num_output: 21 weight_filler { @@ -337,17 +373,19 @@ layers { } } } -layers { +layer { name: "loss" - type: SOFTMAX_LOSS + type: "SoftmaxWithLoss" bottom: "fc8_pascal" bottom: "label" } -layers { +layer { name: "accuracy" - type: ACCURACY + type: "Accuracy" bottom: "fc8_pascal" bottom: "label" top: "accuracy" - include { phase: TEST } + include { + phase: TEST + } } diff --git a/examples/hdf5_classification/train_val.prototxt b/examples/hdf5_classification/train_val.prototxt index b55b6644b17..b9ccc1a93ec 100644 --- a/examples/hdf5_classification/train_val.prototxt +++ b/examples/hdf5_classification/train_val.prototxt @@ -1,35 +1,43 @@ name: "LogisticRegressionNet" -layers { +layer { name: "data" - type: HDF5_DATA + type: "HDF5Data" top: "data" top: "label" + include { + phase: TRAIN + } hdf5_data_param { source: "examples/hdf5_classification/data/train.txt" batch_size: 10 } - include: { phase: TRAIN } } -layers { +layer { name: "data" - type: HDF5_DATA + type: "HDF5Data" top: "data" top: "label" + include { + phase: TEST + } hdf5_data_param { source: "examples/hdf5_classification/data/test.txt" batch_size: 10 } - include: { phase: TEST } } -layers { +layer { name: "fc1" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "data" top: "fc1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 2 weight_filler { @@ -42,18 +50,20 @@ layers { } } } -layers { +layer { name: "loss" - type: SOFTMAX_LOSS + type: "SoftmaxWithLoss" bottom: "fc1" bottom: "label" top: "loss" } -layers { +layer { name: "accuracy" - type: ACCURACY + type: "Accuracy" bottom: "fc1" bottom: "label" top: "accuracy" - include: { phase: TEST } + include { + phase: TEST + } } diff --git a/examples/hdf5_classification/train_val2.prototxt b/examples/hdf5_classification/train_val2.prototxt index b6a75650ad3..f9ef731fff9 100644 --- a/examples/hdf5_classification/train_val2.prototxt +++ b/examples/hdf5_classification/train_val2.prototxt @@ -1,35 +1,43 @@ name: "LogisticRegressionNet" -layers { +layer { name: "data" - type: HDF5_DATA + type: "HDF5Data" top: "data" top: "label" + include { + phase: TRAIN + } hdf5_data_param { source: "examples/hdf5_classification/data/train.txt" batch_size: 10 } - include: { phase: TRAIN } } -layers { +layer { name: "data" - type: HDF5_DATA + type: "HDF5Data" top: "data" top: "label" + include { + phase: TEST + } hdf5_data_param { source: "examples/hdf5_classification/data/test.txt" batch_size: 10 } - include: { phase: TEST } } -layers { +layer { name: "fc1" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "data" top: "fc1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 40 weight_filler { @@ -42,21 +50,25 @@ layers { } } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "fc1" top: "fc1" } -layers { +layer { name: "fc2" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc1" top: "fc2" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 2 weight_filler { @@ -69,18 +81,20 @@ layers { } } } -layers { +layer { name: "loss" - type: SOFTMAX_LOSS + type: "SoftmaxWithLoss" bottom: "fc2" bottom: "label" top: "loss" } -layers { +layer { name: "accuracy" - type: ACCURACY + type: "Accuracy" bottom: "fc2" bottom: "label" top: "accuracy" - include: { phase: TEST } + include { + phase: TEST + } } diff --git a/examples/imagenet/bvlc_caffenet_full_conv.prototxt b/examples/imagenet/bvlc_caffenet_full_conv.prototxt index 395b0f0162f..7b22bfa1404 100644 --- a/examples/imagenet/bvlc_caffenet_full_conv.prototxt +++ b/examples/imagenet/bvlc_caffenet_full_conv.prototxt @@ -5,9 +5,9 @@ input_dim: 1 input_dim: 3 input_dim: 451 input_dim: 451 -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" convolution_param { @@ -16,15 +16,15 @@ layers { stride: 4 } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "conv1" top: "conv1" } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -33,9 +33,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "pool1" top: "norm1" lrn_param { @@ -44,9 +44,9 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "norm1" top: "conv2" convolution_param { @@ -56,15 +56,15 @@ layers { group: 2 } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -73,9 +73,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "pool2" top: "norm2" lrn_param { @@ -84,9 +84,9 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "norm2" top: "conv3" convolution_param { @@ -95,15 +95,15 @@ layers { kernel_size: 3 } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "conv4" - type: CONVOLUTION + type: "Convolution" bottom: "conv3" top: "conv4" convolution_param { @@ -113,15 +113,15 @@ layers { group: 2 } } -layers { +layer { name: "relu4" - type: RELU + type: "ReLU" bottom: "conv4" top: "conv4" } -layers { +layer { name: "conv5" - type: CONVOLUTION + type: "Convolution" bottom: "conv4" top: "conv5" convolution_param { @@ -131,15 +131,15 @@ layers { group: 2 } } -layers { +layer { name: "relu5" - type: RELU + type: "ReLU" bottom: "conv5" top: "conv5" } -layers { +layer { name: "pool5" - type: POOLING + type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { @@ -148,9 +148,9 @@ layers { stride: 2 } } -layers { +layer { name: "fc6-conv" - type: CONVOLUTION + type: "Convolution" bottom: "pool5" top: "fc6-conv" convolution_param { @@ -158,24 +158,24 @@ layers { kernel_size: 6 } } -layers { +layer { name: "relu6" - type: RELU + type: "ReLU" bottom: "fc6-conv" top: "fc6-conv" } -layers { +layer { name: "drop6" - type: DROPOUT + type: "Dropout" bottom: "fc6-conv" top: "fc6-conv" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc7-conv" - type: CONVOLUTION + type: "Convolution" bottom: "fc6-conv" top: "fc7-conv" convolution_param { @@ -183,24 +183,24 @@ layers { kernel_size: 1 } } -layers { +layer { name: "relu7" - type: RELU + type: "ReLU" bottom: "fc7-conv" top: "fc7-conv" } -layers { +layer { name: "drop7" - type: DROPOUT + type: "Dropout" bottom: "fc7-conv" top: "fc7-conv" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc8-conv" - type: CONVOLUTION + type: "Convolution" bottom: "fc7-conv" top: "fc8-conv" convolution_param { @@ -208,9 +208,9 @@ layers { kernel_size: 1 } } -layers { +layer { name: "prob" - type: SOFTMAX + type: "Softmax" bottom: "fc8-conv" top: "prob" } diff --git a/examples/mnist/lenet.prototxt b/examples/mnist/lenet.prototxt index 491fad1b1c0..cb42610fe1e 100644 --- a/examples/mnist/lenet.prototxt +++ b/examples/mnist/lenet.prototxt @@ -4,13 +4,17 @@ input_dim: 64 input_dim: 1 input_dim: 28 input_dim: 28 -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 20 kernel_size: 5 @@ -23,9 +27,9 @@ layers { } } } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -34,13 +38,17 @@ layers { stride: 2 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "pool1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 50 kernel_size: 5 @@ -53,9 +61,9 @@ layers { } } } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -64,13 +72,17 @@ layers { stride: 2 } } -layers { +layer { name: "ip1" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool2" top: "ip1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 500 weight_filler { @@ -81,19 +93,23 @@ layers { } } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "ip1" top: "ip1" } -layers { +layer { name: "ip2" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "ip1" top: "ip2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 10 weight_filler { @@ -104,9 +120,9 @@ layers { } } } -layers { +layer { name: "prob" - type: SOFTMAX + type: "Softmax" bottom: "ip2" top: "prob" } diff --git a/examples/mnist/lenet_train_test.prototxt b/examples/mnist/lenet_train_test.prototxt index 2bd960b56aa..b18fc26cfd8 100644 --- a/examples/mnist/lenet_train_test.prototxt +++ b/examples/mnist/lenet_train_test.prototxt @@ -1,42 +1,49 @@ name: "LeNet" -layers { +layer { name: "mnist" - type: DATA + type: "Data" top: "data" top: "label" - data_param { - source: "examples/mnist/mnist_train_lmdb" - backend: LMDB - batch_size: 64 + include { + phase: TRAIN } transform_param { scale: 0.00390625 } - include: { phase: TRAIN } + data_param { + source: "examples/mnist/mnist_train_lmdb" + batch_size: 64 + backend: LMDB + } } -layers { +layer { name: "mnist" - type: DATA + type: "Data" top: "data" top: "label" - data_param { - source: "examples/mnist/mnist_test_lmdb" - backend: LMDB - batch_size: 100 + include { + phase: TEST } transform_param { scale: 0.00390625 } - include: { phase: TEST } + data_param { + source: "examples/mnist/mnist_test_lmdb" + batch_size: 100 + backend: LMDB + } } - -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 20 kernel_size: 5 @@ -49,9 +56,9 @@ layers { } } } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -60,13 +67,17 @@ layers { stride: 2 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "pool1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 50 kernel_size: 5 @@ -79,9 +90,9 @@ layers { } } } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -90,13 +101,17 @@ layers { stride: 2 } } -layers { +layer { name: "ip1" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool2" top: "ip1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 500 weight_filler { @@ -107,19 +122,23 @@ layers { } } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "ip1" top: "ip1" } -layers { +layer { name: "ip2" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "ip1" top: "ip2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 10 weight_filler { @@ -130,17 +149,19 @@ layers { } } } -layers { +layer { name: "accuracy" - type: ACCURACY + type: "Accuracy" bottom: "ip2" bottom: "label" top: "accuracy" - include: { phase: TEST } + include { + phase: TEST + } } -layers { +layer { name: "loss" - type: SOFTMAX_LOSS + type: "SoftmaxWithLoss" bottom: "ip2" bottom: "label" top: "loss" diff --git a/examples/mnist/mnist_autoencoder.prototxt b/examples/mnist/mnist_autoencoder.prototxt index 0b33781a16f..563c7c91e52 100644 --- a/examples/mnist/mnist_autoencoder.prototxt +++ b/examples/mnist/mnist_autoencoder.prototxt @@ -1,67 +1,73 @@ name: "MNISTAutoencoder" -layers { - top: "data" +layer { name: "data" - type: DATA - data_param { - source: "examples/mnist/mnist_train_lmdb" - backend: LMDB - batch_size: 100 + type: "Data" + top: "data" + include { + phase: TRAIN } transform_param { scale: 0.0039215684 } - include: { phase: TRAIN } -} -layers { - top: "data" - name: "data" - type: DATA data_param { source: "examples/mnist/mnist_train_lmdb" - backend: LMDB batch_size: 100 + backend: LMDB + } +} +layer { + name: "data" + type: "Data" + top: "data" + include { + phase: TEST + stage: "test-on-train" } transform_param { scale: 0.0039215684 } - include: { - phase: TEST - stage: 'test-on-train' + data_param { + source: "examples/mnist/mnist_train_lmdb" + batch_size: 100 + backend: LMDB } } -layers { - top: "data" +layer { name: "data" - type: DATA - data_param { - source: "examples/mnist/mnist_test_lmdb" - backend: LMDB - batch_size: 100 + type: "Data" + top: "data" + include { + phase: TEST + stage: "test-on-test" } transform_param { scale: 0.0039215684 } - include: { - phase: TEST - stage: 'test-on-test' + data_param { + source: "examples/mnist/mnist_test_lmdb" + batch_size: 100 + backend: LMDB } } -layers { +layer { + name: "flatdata" + type: "Flatten" bottom: "data" top: "flatdata" - name: "flatdata" - type: FLATTEN } -layers { +layer { + name: "encode1" + type: "InnerProduct" bottom: "data" top: "encode1" - name: "encode1" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 1 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 1 + decay_mult: 0 + } inner_product_param { num_output: 1000 weight_filler { @@ -75,21 +81,25 @@ layers { } } } -layers { +layer { + name: "encode1neuron" + type: "Sigmoid" bottom: "encode1" top: "encode1neuron" - name: "encode1neuron" - type: SIGMOID } -layers { +layer { + name: "encode2" + type: "InnerProduct" bottom: "encode1neuron" top: "encode2" - name: "encode2" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 1 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 1 + decay_mult: 0 + } inner_product_param { num_output: 500 weight_filler { @@ -103,21 +113,25 @@ layers { } } } -layers { +layer { + name: "encode2neuron" + type: "Sigmoid" bottom: "encode2" top: "encode2neuron" - name: "encode2neuron" - type: SIGMOID } -layers { +layer { + name: "encode3" + type: "InnerProduct" bottom: "encode2neuron" top: "encode3" - name: "encode3" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 1 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 1 + decay_mult: 0 + } inner_product_param { num_output: 250 weight_filler { @@ -131,21 +145,25 @@ layers { } } } -layers { +layer { + name: "encode3neuron" + type: "Sigmoid" bottom: "encode3" top: "encode3neuron" - name: "encode3neuron" - type: SIGMOID } -layers { +layer { + name: "encode4" + type: "InnerProduct" bottom: "encode3neuron" top: "encode4" - name: "encode4" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 1 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 1 + decay_mult: 0 + } inner_product_param { num_output: 30 weight_filler { @@ -159,15 +177,19 @@ layers { } } } -layers { +layer { + name: "decode4" + type: "InnerProduct" bottom: "encode4" top: "decode4" - name: "decode4" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 1 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 1 + decay_mult: 0 + } inner_product_param { num_output: 250 weight_filler { @@ -181,21 +203,25 @@ layers { } } } -layers { +layer { + name: "decode4neuron" + type: "Sigmoid" bottom: "decode4" top: "decode4neuron" - name: "decode4neuron" - type: SIGMOID } -layers { +layer { + name: "decode3" + type: "InnerProduct" bottom: "decode4neuron" top: "decode3" - name: "decode3" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 1 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 1 + decay_mult: 0 + } inner_product_param { num_output: 500 weight_filler { @@ -209,21 +235,25 @@ layers { } } } -layers { +layer { + name: "decode3neuron" + type: "Sigmoid" bottom: "decode3" top: "decode3neuron" - name: "decode3neuron" - type: SIGMOID } -layers { +layer { + name: "decode2" + type: "InnerProduct" bottom: "decode3neuron" top: "decode2" - name: "decode2" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 1 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 1 + decay_mult: 0 + } inner_product_param { num_output: 1000 weight_filler { @@ -237,21 +267,25 @@ layers { } } } -layers { +layer { + name: "decode2neuron" + type: "Sigmoid" bottom: "decode2" top: "decode2neuron" - name: "decode2neuron" - type: SIGMOID } -layers { +layer { + name: "decode1" + type: "InnerProduct" bottom: "decode2neuron" top: "decode1" - name: "decode1" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 1 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 1 + decay_mult: 0 + } inner_product_param { num_output: 784 weight_filler { @@ -265,25 +299,25 @@ layers { } } } -layers { +layer { + name: "loss" + type: "SigmoidCrossEntropyLoss" bottom: "decode1" bottom: "flatdata" top: "cross_entropy_loss" - name: "loss" - type: SIGMOID_CROSS_ENTROPY_LOSS loss_weight: 1 } -layers { +layer { + name: "decode1neuron" + type: "Sigmoid" bottom: "decode1" top: "decode1neuron" - name: "decode1neuron" - type: SIGMOID } -layers { +layer { + name: "loss" + type: "EuclideanLoss" bottom: "decode1neuron" bottom: "flatdata" top: "l2_error" - name: "loss" - type: EUCLIDEAN_LOSS loss_weight: 0 } diff --git a/examples/siamese/mnist_siamese.prototxt b/examples/siamese/mnist_siamese.prototxt index 8dd42e9c1b5..0e903f85909 100644 --- a/examples/siamese/mnist_siamese.prototxt +++ b/examples/siamese/mnist_siamese.prototxt @@ -4,23 +4,26 @@ input_dim: 10000 input_dim: 1 input_dim: 28 input_dim: 28 - -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 20 kernel_size: 5 stride: 1 } } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -29,22 +32,26 @@ layers { stride: 2 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "pool1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } convolution_param { num_output: 50 kernel_size: 5 stride: 1 } } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -53,42 +60,53 @@ layers { stride: 2 } } -layers { +layer { name: "ip1" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool2" top: "ip1" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 500 } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "ip1" top: "ip1" } -layers { +layer { name: "ip2" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "ip1" top: "ip2" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 10 } } - -layers { +layer { name: "feat" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "ip2" top: "feat" - blobs_lr: 1 - blobs_lr: 2 + param { + lr_mult: 1 + } + param { + lr_mult: 2 + } inner_product_param { num_output: 2 } diff --git a/examples/siamese/mnist_siamese_train_test.prototxt b/examples/siamese/mnist_siamese_train_test.prototxt index 92361c31dc7..8ff864f556f 100644 --- a/examples/siamese/mnist_siamese_train_test.prototxt +++ b/examples/siamese/mnist_siamese_train_test.prototxt @@ -1,50 +1,60 @@ name: "mnist_siamese_train_test" -layers { +layer { name: "pair_data" - type: DATA + type: "Data" top: "pair_data" top: "sim" + include { + phase: TRAIN + } + transform_param { + scale: 0.00390625 + } data_param { source: "examples/siamese/mnist_siamese_train_leveldb" - scale: 0.00390625 batch_size: 64 } - include: { phase: TRAIN } } -layers { +layer { name: "pair_data" - type: DATA + type: "Data" top: "pair_data" top: "sim" + include { + phase: TEST + } + transform_param { + scale: 0.00390625 + } data_param { source: "examples/siamese/mnist_siamese_test_leveldb" - scale: 0.00390625 batch_size: 100 } - include: { phase: TEST } } -layers { - name: "slice_pair" - type: SLICE - bottom: "pair_data" - top: "data" - top: "data_p" - slice_param { - slice_dim: 1 - slice_point: 1 - } +layer { + name: "slice_pair" + type: "Slice" + bottom: "pair_data" + top: "data" + top: "data_p" + slice_param { + slice_dim: 1 + slice_point: 1 + } } - - - - -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 + param { + name: "conv1_w" + lr_mult: 1 + } + param { + name: "conv1_b" + lr_mult: 2 + } convolution_param { num_output: 20 kernel_size: 5 @@ -56,12 +66,10 @@ layers { type: "constant" } } - param: "conv1_w" - param: "conv1_b" } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -70,13 +78,19 @@ layers { stride: 2 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "pool1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 + param { + name: "conv2_w" + lr_mult: 1 + } + param { + name: "conv2_b" + lr_mult: 2 + } convolution_param { num_output: 50 kernel_size: 5 @@ -88,12 +102,10 @@ layers { type: "constant" } } - param: "conv2_w" - param: "conv2_b" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -102,13 +114,19 @@ layers { stride: 2 } } -layers { +layer { name: "ip1" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool2" top: "ip1" - blobs_lr: 1 - blobs_lr: 2 + param { + name: "ip1_w" + lr_mult: 1 + } + param { + name: "ip1_b" + lr_mult: 2 + } inner_product_param { num_output: 500 weight_filler { @@ -118,22 +136,26 @@ layers { type: "constant" } } - param: "ip1_w" - param: "ip1_b" } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "ip1" top: "ip1" } -layers { +layer { name: "ip2" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "ip1" top: "ip2" - blobs_lr: 1 - blobs_lr: 2 + param { + name: "ip2_w" + lr_mult: 1 + } + param { + name: "ip2_b" + lr_mult: 2 + } inner_product_param { num_output: 10 weight_filler { @@ -143,17 +165,20 @@ layers { type: "constant" } } - param: "ip2_w" - param: "ip2_b" } - -layers { +layer { name: "feat" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "ip2" top: "feat" - blobs_lr: 1 - blobs_lr: 2 + param { + name: "feat_w" + lr_mult: 1 + } + param { + name: "feat_b" + lr_mult: 2 + } inner_product_param { num_output: 2 weight_filler { @@ -163,19 +188,20 @@ layers { type: "constant" } } - param: "feat_w" - param: "feat_b" } - - - -layers { +layer { name: "conv1_p" - type: CONVOLUTION + type: "Convolution" bottom: "data_p" top: "conv1_p" - blobs_lr: 1 - blobs_lr: 2 + param { + name: "conv1_w" + lr_mult: 1 + } + param { + name: "conv1_b" + lr_mult: 2 + } convolution_param { num_output: 20 kernel_size: 5 @@ -187,12 +213,10 @@ layers { type: "constant" } } - param: "conv1_w" - param: "conv1_b" } -layers { +layer { name: "pool1_p" - type: POOLING + type: "Pooling" bottom: "conv1_p" top: "pool1_p" pooling_param { @@ -201,13 +225,19 @@ layers { stride: 2 } } -layers { +layer { name: "conv2_p" - type: CONVOLUTION + type: "Convolution" bottom: "pool1_p" top: "conv2_p" - blobs_lr: 1 - blobs_lr: 2 + param { + name: "conv2_w" + lr_mult: 1 + } + param { + name: "conv2_b" + lr_mult: 2 + } convolution_param { num_output: 50 kernel_size: 5 @@ -219,12 +249,10 @@ layers { type: "constant" } } - param: "conv2_w" - param: "conv2_b" } -layers { +layer { name: "pool2_p" - type: POOLING + type: "Pooling" bottom: "conv2_p" top: "pool2_p" pooling_param { @@ -233,13 +261,19 @@ layers { stride: 2 } } -layers { +layer { name: "ip1_p" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool2_p" top: "ip1_p" - blobs_lr: 1 - blobs_lr: 2 + param { + name: "ip1_w" + lr_mult: 1 + } + param { + name: "ip1_b" + lr_mult: 2 + } inner_product_param { num_output: 500 weight_filler { @@ -249,22 +283,26 @@ layers { type: "constant" } } - param: "ip1_w" - param: "ip1_b" } -layers { +layer { name: "relu1_p" - type: RELU + type: "ReLU" bottom: "ip1_p" top: "ip1_p" } -layers { +layer { name: "ip2_p" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "ip1_p" top: "ip2_p" - blobs_lr: 1 - blobs_lr: 2 + param { + name: "ip2_w" + lr_mult: 1 + } + param { + name: "ip2_b" + lr_mult: 2 + } inner_product_param { num_output: 10 weight_filler { @@ -274,17 +312,20 @@ layers { type: "constant" } } - param: "ip2_w" - param: "ip2_b" } - -layers { +layer { name: "feat_p" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "ip2_p" top: "feat_p" - blobs_lr: 1 - blobs_lr: 2 + param { + name: "feat_w" + lr_mult: 1 + } + param { + name: "feat_b" + lr_mult: 2 + } inner_product_param { num_output: 2 weight_filler { @@ -294,20 +335,15 @@ layers { type: "constant" } } - param: "feat_w" - param: "feat_b" } - - - -layers { - name: "loss" - type: CONTRASTIVE_LOSS - contrastive_loss_param { - margin: 1.0 - } - bottom: "feat" - bottom: "feat_p" - bottom: "sim" - top: "loss" +layer { + name: "loss" + type: "ContrastiveLoss" + bottom: "feat" + bottom: "feat_p" + bottom: "sim" + top: "loss" + contrastive_loss_param { + margin: 1 + } } diff --git a/models/bvlc_alexnet/deploy.prototxt b/models/bvlc_alexnet/deploy.prototxt index d010753f3fc..ced055b85d0 100644 --- a/models/bvlc_alexnet/deploy.prototxt +++ b/models/bvlc_alexnet/deploy.prototxt @@ -4,241 +4,273 @@ input_dim: 10 input_dim: 3 input_dim: 227 input_dim: 227 -layers { +layer { name: "conv1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + type: "Convolution" + bottom: "data" + top: "conv1" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 kernel_size: 11 stride: 4 } - bottom: "data" - top: "conv1" } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "conv1" top: "conv1" } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" + bottom: "conv1" + top: "norm1" lrn_param { local_size: 5 alpha: 0.0001 beta: 0.75 } - bottom: "conv1" - top: "norm1" } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" + bottom: "norm1" + top: "pool1" pooling_param { pool: MAX kernel_size: 3 stride: 2 } - bottom: "norm1" - top: "pool1" } -layers { +layer { name: "conv2" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + type: "Convolution" + bottom: "pool1" + top: "conv2" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 2 kernel_size: 5 group: 2 } - bottom: "pool1" - top: "conv2" } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" + bottom: "conv2" + top: "norm2" lrn_param { local_size: 5 alpha: 0.0001 beta: 0.75 } - bottom: "conv2" - top: "norm2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" + bottom: "norm2" + top: "pool2" pooling_param { pool: MAX kernel_size: 3 stride: 2 } - bottom: "norm2" - top: "pool2" } -layers { +layer { name: "conv3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + type: "Convolution" + bottom: "pool2" + top: "conv3" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 kernel_size: 3 } - bottom: "pool2" - top: "conv3" } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "conv4" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + type: "Convolution" + bottom: "conv3" + top: "conv4" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 kernel_size: 3 group: 2 } - bottom: "conv3" - top: "conv4" } -layers { +layer { name: "relu4" - type: RELU + type: "ReLU" bottom: "conv4" top: "conv4" } -layers { +layer { name: "conv5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + type: "Convolution" + bottom: "conv4" + top: "conv5" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 1 kernel_size: 3 group: 2 } - bottom: "conv4" - top: "conv5" } -layers { +layer { name: "relu5" - type: RELU + type: "ReLU" bottom: "conv5" top: "conv5" } -layers { +layer { name: "pool5" - type: POOLING + type: "Pooling" + bottom: "conv5" + top: "pool5" pooling_param { pool: MAX kernel_size: 3 stride: 2 } - bottom: "conv5" - top: "pool5" } -layers { +layer { name: "fc6" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + type: "InnerProduct" + bottom: "pool5" + top: "fc6" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 } - bottom: "pool5" - top: "fc6" } -layers { +layer { name: "relu6" - type: RELU + type: "ReLU" bottom: "fc6" top: "fc6" } -layers { +layer { name: "drop6" - type: DROPOUT + type: "Dropout" + bottom: "fc6" + top: "fc6" dropout_param { dropout_ratio: 0.5 } - bottom: "fc6" - top: "fc6" } -layers { +layer { name: "fc7" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + type: "InnerProduct" + bottom: "fc6" + top: "fc7" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 } - bottom: "fc6" - top: "fc7" } -layers { +layer { name: "relu7" - type: RELU + type: "ReLU" bottom: "fc7" top: "fc7" } -layers { +layer { name: "drop7" - type: DROPOUT + type: "Dropout" + bottom: "fc7" + top: "fc7" dropout_param { dropout_ratio: 0.5 } - bottom: "fc7" - top: "fc7" } -layers { +layer { name: "fc8" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + type: "InnerProduct" + bottom: "fc7" + top: "fc8" + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 1000 } - bottom: "fc7" - top: "fc8" } -layers { +layer { name: "prob" - type: SOFTMAX + type: "Softmax" bottom: "fc8" top: "prob" } diff --git a/models/bvlc_alexnet/train_val.prototxt b/models/bvlc_alexnet/train_val.prototxt index 717b6fa447c..588b4ea7cb5 100644 --- a/models/bvlc_alexnet/train_val.prototxt +++ b/models/bvlc_alexnet/train_val.prototxt @@ -1,47 +1,55 @@ name: "AlexNet" -layers { +layer { name: "data" - type: DATA + type: "Data" top: "data" top: "label" - data_param { - source: "examples/imagenet/ilsvrc12_train_lmdb" - backend: LMDB - batch_size: 256 + include { + phase: TRAIN } transform_param { + mirror: true crop_size: 227 mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: true } - include: { phase: TRAIN } + data_param { + source: "examples/imagenet/ilsvrc12_train_lmdb" + batch_size: 256 + backend: LMDB + } } -layers { +layer { name: "data" - type: DATA + type: "Data" top: "data" top: "label" - data_param { - source: "examples/imagenet/ilsvrc12_val_lmdb" - backend: LMDB - batch_size: 50 + include { + phase: TEST } transform_param { + mirror: false crop_size: 227 mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: false } - include: { phase: TEST } + data_param { + source: "examples/imagenet/ilsvrc12_val_lmdb" + batch_size: 50 + backend: LMDB + } } -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 kernel_size: 11 @@ -56,15 +64,15 @@ layers { } } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "conv1" top: "conv1" } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "conv1" top: "norm1" lrn_param { @@ -73,9 +81,9 @@ layers { beta: 0.75 } } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "norm1" top: "pool1" pooling_param { @@ -84,15 +92,19 @@ layers { stride: 2 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "pool1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 2 @@ -108,15 +120,15 @@ layers { } } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "conv2" top: "norm2" lrn_param { @@ -125,9 +137,9 @@ layers { beta: 0.75 } } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "norm2" top: "pool2" pooling_param { @@ -136,15 +148,19 @@ layers { stride: 2 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "pool2" top: "conv3" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -159,21 +175,25 @@ layers { } } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "conv4" - type: CONVOLUTION + type: "Convolution" bottom: "conv3" top: "conv4" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -189,21 +209,25 @@ layers { } } } -layers { +layer { name: "relu4" - type: RELU + type: "ReLU" bottom: "conv4" top: "conv4" } -layers { +layer { name: "conv5" - type: CONVOLUTION + type: "Convolution" bottom: "conv4" top: "conv5" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 1 @@ -219,15 +243,15 @@ layers { } } } -layers { +layer { name: "relu5" - type: RELU + type: "ReLU" bottom: "conv5" top: "conv5" } -layers { +layer { name: "pool5" - type: POOLING + type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { @@ -236,15 +260,19 @@ layers { stride: 2 } } -layers { +layer { name: "fc6" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool5" top: "fc6" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 weight_filler { @@ -257,30 +285,34 @@ layers { } } } -layers { +layer { name: "relu6" - type: RELU + type: "ReLU" bottom: "fc6" top: "fc6" } -layers { +layer { name: "drop6" - type: DROPOUT + type: "Dropout" bottom: "fc6" top: "fc6" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc7" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc6" top: "fc7" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 weight_filler { @@ -293,30 +325,34 @@ layers { } } } -layers { +layer { name: "relu7" - type: RELU + type: "ReLU" bottom: "fc7" top: "fc7" } -layers { +layer { name: "drop7" - type: DROPOUT + type: "Dropout" bottom: "fc7" top: "fc7" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc8" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc7" top: "fc8" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 1000 weight_filler { @@ -329,17 +365,19 @@ layers { } } } -layers { +layer { name: "accuracy" - type: ACCURACY + type: "Accuracy" bottom: "fc8" bottom: "label" top: "accuracy" - include: { phase: TEST } + include { + phase: TEST + } } -layers { +layer { name: "loss" - type: SOFTMAX_LOSS + type: "SoftmaxWithLoss" bottom: "fc8" bottom: "label" top: "loss" diff --git a/models/bvlc_googlenet/deploy.prototxt b/models/bvlc_googlenet/deploy.prototxt index e31a4c9cd00..4648bf26efc 100644 --- a/models/bvlc_googlenet/deploy.prototxt +++ b/models/bvlc_googlenet/deploy.prototxt @@ -4,15 +4,19 @@ input_dim: 10 input_dim: 3 input_dim: 224 input_dim: 224 -layers { +layer { + name: "conv1/7x7_s2" + type: "Convolution" bottom: "data" top: "conv1/7x7_s2" - name: "conv1/7x7_s2" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 pad: 3 @@ -28,43 +32,47 @@ layers { } } } -layers { +layer { + name: "conv1/relu_7x7" + type: "ReLU" bottom: "conv1/7x7_s2" top: "conv1/7x7_s2" - name: "conv1/relu_7x7" - type: RELU } -layers { +layer { + name: "pool1/3x3_s2" + type: "Pooling" bottom: "conv1/7x7_s2" top: "pool1/3x3_s2" - name: "pool1/3x3_s2" - type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } -layers { +layer { + name: "pool1/norm1" + type: "LRN" bottom: "pool1/3x3_s2" top: "pool1/norm1" - name: "pool1/norm1" - type: LRN lrn_param { local_size: 5 alpha: 0.0001 beta: 0.75 } } -layers { +layer { + name: "conv2/3x3_reduce" + type: "Convolution" bottom: "pool1/norm1" top: "conv2/3x3_reduce" - name: "conv2/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -78,21 +86,25 @@ layers { } } } -layers { +layer { + name: "conv2/relu_3x3_reduce" + type: "ReLU" bottom: "conv2/3x3_reduce" top: "conv2/3x3_reduce" - name: "conv2/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "conv2/3x3" + type: "Convolution" bottom: "conv2/3x3_reduce" top: "conv2/3x3" - name: "conv2/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 192 pad: 1 @@ -107,43 +119,47 @@ layers { } } } -layers { +layer { + name: "conv2/relu_3x3" + type: "ReLU" bottom: "conv2/3x3" top: "conv2/3x3" - name: "conv2/relu_3x3" - type: RELU } -layers { +layer { + name: "conv2/norm2" + type: "LRN" bottom: "conv2/3x3" top: "conv2/norm2" - name: "conv2/norm2" - type: LRN lrn_param { local_size: 5 alpha: 0.0001 beta: 0.75 } } -layers { +layer { + name: "pool2/3x3_s2" + type: "Pooling" bottom: "conv2/norm2" top: "pool2/3x3_s2" - name: "pool2/3x3_s2" - type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } -layers { +layer { + name: "inception_3a/1x1" + type: "Convolution" bottom: "pool2/3x3_s2" top: "inception_3a/1x1" - name: "inception_3a/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -157,21 +173,25 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_1x1" + type: "ReLU" bottom: "inception_3a/1x1" top: "inception_3a/1x1" - name: "inception_3a/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_3a/3x3_reduce" + type: "Convolution" bottom: "pool2/3x3_s2" top: "inception_3a/3x3_reduce" - name: "inception_3a/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 kernel_size: 1 @@ -185,21 +205,25 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_3x3_reduce" + type: "ReLU" bottom: "inception_3a/3x3_reduce" top: "inception_3a/3x3_reduce" - name: "inception_3a/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_3a/3x3" + type: "Convolution" bottom: "inception_3a/3x3_reduce" top: "inception_3a/3x3" - name: "inception_3a/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 pad: 1 @@ -214,21 +238,25 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_3x3" + type: "ReLU" bottom: "inception_3a/3x3" top: "inception_3a/3x3" - name: "inception_3a/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_3a/5x5_reduce" + type: "Convolution" bottom: "pool2/3x3_s2" top: "inception_3a/5x5_reduce" - name: "inception_3a/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 16 kernel_size: 1 @@ -242,21 +270,25 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_5x5_reduce" + type: "ReLU" bottom: "inception_3a/5x5_reduce" top: "inception_3a/5x5_reduce" - name: "inception_3a/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_3a/5x5" + type: "Convolution" bottom: "inception_3a/5x5_reduce" top: "inception_3a/5x5" - name: "inception_3a/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 pad: 2 @@ -271,17 +303,17 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_5x5" + type: "ReLU" bottom: "inception_3a/5x5" top: "inception_3a/5x5" - name: "inception_3a/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_3a/pool" + type: "Pooling" bottom: "pool2/3x3_s2" top: "inception_3a/pool" - name: "inception_3a/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -289,15 +321,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_3a/pool_proj" + type: "Convolution" bottom: "inception_3a/pool" top: "inception_3a/pool_proj" - name: "inception_3a/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 kernel_size: 1 @@ -311,30 +347,34 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_pool_proj" + type: "ReLU" bottom: "inception_3a/pool_proj" top: "inception_3a/pool_proj" - name: "inception_3a/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_3a/output" + type: "Concat" bottom: "inception_3a/1x1" bottom: "inception_3a/3x3" bottom: "inception_3a/5x5" bottom: "inception_3a/pool_proj" top: "inception_3a/output" - name: "inception_3a/output" - type: CONCAT } -layers { +layer { + name: "inception_3b/1x1" + type: "Convolution" bottom: "inception_3a/output" top: "inception_3b/1x1" - name: "inception_3b/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -348,21 +388,25 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_1x1" + type: "ReLU" bottom: "inception_3b/1x1" top: "inception_3b/1x1" - name: "inception_3b/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_3b/3x3_reduce" + type: "Convolution" bottom: "inception_3a/output" top: "inception_3b/3x3_reduce" - name: "inception_3b/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -376,21 +420,25 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_3x3_reduce" + type: "ReLU" bottom: "inception_3b/3x3_reduce" top: "inception_3b/3x3_reduce" - name: "inception_3b/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_3b/3x3" + type: "Convolution" bottom: "inception_3b/3x3_reduce" top: "inception_3b/3x3" - name: "inception_3b/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 192 pad: 1 @@ -405,21 +453,25 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_3x3" + type: "ReLU" bottom: "inception_3b/3x3" top: "inception_3b/3x3" - name: "inception_3b/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_3b/5x5_reduce" + type: "Convolution" bottom: "inception_3a/output" top: "inception_3b/5x5_reduce" - name: "inception_3b/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 kernel_size: 1 @@ -433,21 +485,25 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_5x5_reduce" + type: "ReLU" bottom: "inception_3b/5x5_reduce" top: "inception_3b/5x5_reduce" - name: "inception_3b/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_3b/5x5" + type: "Convolution" bottom: "inception_3b/5x5_reduce" top: "inception_3b/5x5" - name: "inception_3b/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 pad: 2 @@ -462,17 +518,17 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_5x5" + type: "ReLU" bottom: "inception_3b/5x5" top: "inception_3b/5x5" - name: "inception_3b/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_3b/pool" + type: "Pooling" bottom: "inception_3a/output" top: "inception_3b/pool" - name: "inception_3b/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -480,15 +536,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_3b/pool_proj" + type: "Convolution" bottom: "inception_3b/pool" top: "inception_3b/pool_proj" - name: "inception_3b/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -502,41 +562,45 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_pool_proj" + type: "ReLU" bottom: "inception_3b/pool_proj" top: "inception_3b/pool_proj" - name: "inception_3b/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_3b/output" + type: "Concat" bottom: "inception_3b/1x1" bottom: "inception_3b/3x3" bottom: "inception_3b/5x5" bottom: "inception_3b/pool_proj" top: "inception_3b/output" - name: "inception_3b/output" - type: CONCAT } -layers { +layer { + name: "pool3/3x3_s2" + type: "Pooling" bottom: "inception_3b/output" top: "pool3/3x3_s2" - name: "pool3/3x3_s2" - type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } -layers { +layer { + name: "inception_4a/1x1" + type: "Convolution" bottom: "pool3/3x3_s2" top: "inception_4a/1x1" - name: "inception_4a/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 192 kernel_size: 1 @@ -550,21 +614,25 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_1x1" + type: "ReLU" bottom: "inception_4a/1x1" top: "inception_4a/1x1" - name: "inception_4a/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_4a/3x3_reduce" + type: "Convolution" bottom: "pool3/3x3_s2" top: "inception_4a/3x3_reduce" - name: "inception_4a/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 kernel_size: 1 @@ -578,21 +646,25 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_3x3_reduce" + type: "ReLU" bottom: "inception_4a/3x3_reduce" top: "inception_4a/3x3_reduce" - name: "inception_4a/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_4a/3x3" + type: "Convolution" bottom: "inception_4a/3x3_reduce" top: "inception_4a/3x3" - name: "inception_4a/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 208 pad: 1 @@ -607,21 +679,25 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_3x3" + type: "ReLU" bottom: "inception_4a/3x3" top: "inception_4a/3x3" - name: "inception_4a/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_4a/5x5_reduce" + type: "Convolution" bottom: "pool3/3x3_s2" top: "inception_4a/5x5_reduce" - name: "inception_4a/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 16 kernel_size: 1 @@ -635,21 +711,25 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_5x5_reduce" + type: "ReLU" bottom: "inception_4a/5x5_reduce" top: "inception_4a/5x5_reduce" - name: "inception_4a/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_4a/5x5" + type: "Convolution" bottom: "inception_4a/5x5_reduce" top: "inception_4a/5x5" - name: "inception_4a/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 48 pad: 2 @@ -664,17 +744,17 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_5x5" + type: "ReLU" bottom: "inception_4a/5x5" top: "inception_4a/5x5" - name: "inception_4a/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_4a/pool" + type: "Pooling" bottom: "pool3/3x3_s2" top: "inception_4a/pool" - name: "inception_4a/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -682,15 +762,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_4a/pool_proj" + type: "Convolution" bottom: "inception_4a/pool" top: "inception_4a/pool_proj" - name: "inception_4a/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -704,30 +788,34 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_pool_proj" + type: "ReLU" bottom: "inception_4a/pool_proj" top: "inception_4a/pool_proj" - name: "inception_4a/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_4a/output" + type: "Concat" bottom: "inception_4a/1x1" bottom: "inception_4a/3x3" bottom: "inception_4a/5x5" bottom: "inception_4a/pool_proj" top: "inception_4a/output" - name: "inception_4a/output" - type: CONCAT } -layers { +layer { + name: "inception_4b/1x1" + type: "Convolution" bottom: "inception_4a/output" top: "inception_4b/1x1" - name: "inception_4b/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 160 kernel_size: 1 @@ -741,21 +829,25 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_1x1" + type: "ReLU" bottom: "inception_4b/1x1" top: "inception_4b/1x1" - name: "inception_4b/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_4b/3x3_reduce" + type: "Convolution" bottom: "inception_4a/output" top: "inception_4b/3x3_reduce" - name: "inception_4b/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 112 kernel_size: 1 @@ -769,21 +861,25 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_3x3_reduce" + type: "ReLU" bottom: "inception_4b/3x3_reduce" top: "inception_4b/3x3_reduce" - name: "inception_4b/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_4b/3x3" + type: "Convolution" bottom: "inception_4b/3x3_reduce" top: "inception_4b/3x3" - name: "inception_4b/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 224 pad: 1 @@ -798,21 +894,25 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_3x3" + type: "ReLU" bottom: "inception_4b/3x3" top: "inception_4b/3x3" - name: "inception_4b/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_4b/5x5_reduce" + type: "Convolution" bottom: "inception_4a/output" top: "inception_4b/5x5_reduce" - name: "inception_4b/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 24 kernel_size: 1 @@ -826,21 +926,25 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_5x5_reduce" + type: "ReLU" bottom: "inception_4b/5x5_reduce" top: "inception_4b/5x5_reduce" - name: "inception_4b/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_4b/5x5" + type: "Convolution" bottom: "inception_4b/5x5_reduce" top: "inception_4b/5x5" - name: "inception_4b/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 pad: 2 @@ -855,17 +959,17 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_5x5" + type: "ReLU" bottom: "inception_4b/5x5" top: "inception_4b/5x5" - name: "inception_4b/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_4b/pool" + type: "Pooling" bottom: "inception_4a/output" top: "inception_4b/pool" - name: "inception_4b/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -873,15 +977,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_4b/pool_proj" + type: "Convolution" bottom: "inception_4b/pool" top: "inception_4b/pool_proj" - name: "inception_4b/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -895,30 +1003,34 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_pool_proj" + type: "ReLU" bottom: "inception_4b/pool_proj" top: "inception_4b/pool_proj" - name: "inception_4b/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_4b/output" + type: "Concat" bottom: "inception_4b/1x1" bottom: "inception_4b/3x3" bottom: "inception_4b/5x5" bottom: "inception_4b/pool_proj" top: "inception_4b/output" - name: "inception_4b/output" - type: CONCAT } -layers { +layer { + name: "inception_4c/1x1" + type: "Convolution" bottom: "inception_4b/output" top: "inception_4c/1x1" - name: "inception_4c/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -932,21 +1044,25 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_1x1" + type: "ReLU" bottom: "inception_4c/1x1" top: "inception_4c/1x1" - name: "inception_4c/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_4c/3x3_reduce" + type: "Convolution" bottom: "inception_4b/output" top: "inception_4c/3x3_reduce" - name: "inception_4c/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -960,21 +1076,25 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_3x3_reduce" + type: "ReLU" bottom: "inception_4c/3x3_reduce" top: "inception_4c/3x3_reduce" - name: "inception_4c/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_4c/3x3" + type: "Convolution" bottom: "inception_4c/3x3_reduce" top: "inception_4c/3x3" - name: "inception_4c/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 1 @@ -989,21 +1109,25 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_3x3" + type: "ReLU" bottom: "inception_4c/3x3" top: "inception_4c/3x3" - name: "inception_4c/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_4c/5x5_reduce" + type: "Convolution" bottom: "inception_4b/output" top: "inception_4c/5x5_reduce" - name: "inception_4c/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 24 kernel_size: 1 @@ -1017,21 +1141,25 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_5x5_reduce" + type: "ReLU" bottom: "inception_4c/5x5_reduce" top: "inception_4c/5x5_reduce" - name: "inception_4c/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_4c/5x5" + type: "Convolution" bottom: "inception_4c/5x5_reduce" top: "inception_4c/5x5" - name: "inception_4c/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 pad: 2 @@ -1046,17 +1174,17 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_5x5" + type: "ReLU" bottom: "inception_4c/5x5" top: "inception_4c/5x5" - name: "inception_4c/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_4c/pool" + type: "Pooling" bottom: "inception_4b/output" top: "inception_4c/pool" - name: "inception_4c/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -1064,15 +1192,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_4c/pool_proj" + type: "Convolution" bottom: "inception_4c/pool" top: "inception_4c/pool_proj" - name: "inception_4c/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -1086,30 +1218,34 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_pool_proj" + type: "ReLU" bottom: "inception_4c/pool_proj" top: "inception_4c/pool_proj" - name: "inception_4c/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_4c/output" + type: "Concat" bottom: "inception_4c/1x1" bottom: "inception_4c/3x3" bottom: "inception_4c/5x5" bottom: "inception_4c/pool_proj" top: "inception_4c/output" - name: "inception_4c/output" - type: CONCAT } -layers { +layer { + name: "inception_4d/1x1" + type: "Convolution" bottom: "inception_4c/output" top: "inception_4d/1x1" - name: "inception_4d/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 112 kernel_size: 1 @@ -1123,21 +1259,25 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_1x1" + type: "ReLU" bottom: "inception_4d/1x1" top: "inception_4d/1x1" - name: "inception_4d/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_4d/3x3_reduce" + type: "Convolution" bottom: "inception_4c/output" top: "inception_4d/3x3_reduce" - name: "inception_4d/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 144 kernel_size: 1 @@ -1151,21 +1291,25 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_3x3_reduce" + type: "ReLU" bottom: "inception_4d/3x3_reduce" top: "inception_4d/3x3_reduce" - name: "inception_4d/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_4d/3x3" + type: "Convolution" bottom: "inception_4d/3x3_reduce" top: "inception_4d/3x3" - name: "inception_4d/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 288 pad: 1 @@ -1180,21 +1324,25 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_3x3" + type: "ReLU" bottom: "inception_4d/3x3" top: "inception_4d/3x3" - name: "inception_4d/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_4d/5x5_reduce" + type: "Convolution" bottom: "inception_4c/output" top: "inception_4d/5x5_reduce" - name: "inception_4d/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 kernel_size: 1 @@ -1208,21 +1356,25 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_5x5_reduce" + type: "ReLU" bottom: "inception_4d/5x5_reduce" top: "inception_4d/5x5_reduce" - name: "inception_4d/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_4d/5x5" + type: "Convolution" bottom: "inception_4d/5x5_reduce" top: "inception_4d/5x5" - name: "inception_4d/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 pad: 2 @@ -1237,17 +1389,17 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_5x5" + type: "ReLU" bottom: "inception_4d/5x5" top: "inception_4d/5x5" - name: "inception_4d/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_4d/pool" + type: "Pooling" bottom: "inception_4c/output" top: "inception_4d/pool" - name: "inception_4d/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -1255,15 +1407,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_4d/pool_proj" + type: "Convolution" bottom: "inception_4d/pool" top: "inception_4d/pool_proj" - name: "inception_4d/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -1277,30 +1433,34 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_pool_proj" + type: "ReLU" bottom: "inception_4d/pool_proj" top: "inception_4d/pool_proj" - name: "inception_4d/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_4d/output" + type: "Concat" bottom: "inception_4d/1x1" bottom: "inception_4d/3x3" bottom: "inception_4d/5x5" bottom: "inception_4d/pool_proj" top: "inception_4d/output" - name: "inception_4d/output" - type: CONCAT } -layers { +layer { + name: "inception_4e/1x1" + type: "Convolution" bottom: "inception_4d/output" top: "inception_4e/1x1" - name: "inception_4e/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 kernel_size: 1 @@ -1314,21 +1474,25 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_1x1" + type: "ReLU" bottom: "inception_4e/1x1" top: "inception_4e/1x1" - name: "inception_4e/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_4e/3x3_reduce" + type: "Convolution" bottom: "inception_4d/output" top: "inception_4e/3x3_reduce" - name: "inception_4e/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 160 kernel_size: 1 @@ -1342,21 +1506,25 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_3x3_reduce" + type: "ReLU" bottom: "inception_4e/3x3_reduce" top: "inception_4e/3x3_reduce" - name: "inception_4e/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_4e/3x3" + type: "Convolution" bottom: "inception_4e/3x3_reduce" top: "inception_4e/3x3" - name: "inception_4e/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 320 pad: 1 @@ -1371,21 +1539,25 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_3x3" + type: "ReLU" bottom: "inception_4e/3x3" top: "inception_4e/3x3" - name: "inception_4e/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_4e/5x5_reduce" + type: "Convolution" bottom: "inception_4d/output" top: "inception_4e/5x5_reduce" - name: "inception_4e/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 kernel_size: 1 @@ -1399,21 +1571,25 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_5x5_reduce" + type: "ReLU" bottom: "inception_4e/5x5_reduce" top: "inception_4e/5x5_reduce" - name: "inception_4e/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_4e/5x5" + type: "Convolution" bottom: "inception_4e/5x5_reduce" top: "inception_4e/5x5" - name: "inception_4e/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 pad: 2 @@ -1428,17 +1604,17 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_5x5" + type: "ReLU" bottom: "inception_4e/5x5" top: "inception_4e/5x5" - name: "inception_4e/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_4e/pool" + type: "Pooling" bottom: "inception_4d/output" top: "inception_4e/pool" - name: "inception_4e/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -1446,15 +1622,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_4e/pool_proj" + type: "Convolution" bottom: "inception_4e/pool" top: "inception_4e/pool_proj" - name: "inception_4e/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -1468,41 +1648,45 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_pool_proj" + type: "ReLU" bottom: "inception_4e/pool_proj" top: "inception_4e/pool_proj" - name: "inception_4e/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_4e/output" + type: "Concat" bottom: "inception_4e/1x1" bottom: "inception_4e/3x3" bottom: "inception_4e/5x5" bottom: "inception_4e/pool_proj" top: "inception_4e/output" - name: "inception_4e/output" - type: CONCAT } -layers { +layer { + name: "pool4/3x3_s2" + type: "Pooling" bottom: "inception_4e/output" top: "pool4/3x3_s2" - name: "pool4/3x3_s2" - type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } -layers { +layer { + name: "inception_5a/1x1" + type: "Convolution" bottom: "pool4/3x3_s2" top: "inception_5a/1x1" - name: "inception_5a/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 kernel_size: 1 @@ -1516,21 +1700,25 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_1x1" + type: "ReLU" bottom: "inception_5a/1x1" top: "inception_5a/1x1" - name: "inception_5a/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_5a/3x3_reduce" + type: "Convolution" bottom: "pool4/3x3_s2" top: "inception_5a/3x3_reduce" - name: "inception_5a/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 160 kernel_size: 1 @@ -1544,21 +1732,25 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_3x3_reduce" + type: "ReLU" bottom: "inception_5a/3x3_reduce" top: "inception_5a/3x3_reduce" - name: "inception_5a/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_5a/3x3" + type: "Convolution" bottom: "inception_5a/3x3_reduce" top: "inception_5a/3x3" - name: "inception_5a/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 320 pad: 1 @@ -1573,21 +1765,25 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_3x3" + type: "ReLU" bottom: "inception_5a/3x3" top: "inception_5a/3x3" - name: "inception_5a/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_5a/5x5_reduce" + type: "Convolution" bottom: "pool4/3x3_s2" top: "inception_5a/5x5_reduce" - name: "inception_5a/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 kernel_size: 1 @@ -1601,21 +1797,25 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_5x5_reduce" + type: "ReLU" bottom: "inception_5a/5x5_reduce" top: "inception_5a/5x5_reduce" - name: "inception_5a/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_5a/5x5" + type: "Convolution" bottom: "inception_5a/5x5_reduce" top: "inception_5a/5x5" - name: "inception_5a/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 pad: 2 @@ -1630,17 +1830,17 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_5x5" + type: "ReLU" bottom: "inception_5a/5x5" top: "inception_5a/5x5" - name: "inception_5a/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_5a/pool" + type: "Pooling" bottom: "pool4/3x3_s2" top: "inception_5a/pool" - name: "inception_5a/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -1648,15 +1848,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_5a/pool_proj" + type: "Convolution" bottom: "inception_5a/pool" top: "inception_5a/pool_proj" - name: "inception_5a/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -1670,30 +1874,34 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_pool_proj" + type: "ReLU" bottom: "inception_5a/pool_proj" top: "inception_5a/pool_proj" - name: "inception_5a/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_5a/output" + type: "Concat" bottom: "inception_5a/1x1" bottom: "inception_5a/3x3" bottom: "inception_5a/5x5" bottom: "inception_5a/pool_proj" top: "inception_5a/output" - name: "inception_5a/output" - type: CONCAT } -layers { +layer { + name: "inception_5b/1x1" + type: "Convolution" bottom: "inception_5a/output" top: "inception_5b/1x1" - name: "inception_5b/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 kernel_size: 1 @@ -1707,21 +1915,25 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_1x1" + type: "ReLU" bottom: "inception_5b/1x1" top: "inception_5b/1x1" - name: "inception_5b/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_5b/3x3_reduce" + type: "Convolution" bottom: "inception_5a/output" top: "inception_5b/3x3_reduce" - name: "inception_5b/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 192 kernel_size: 1 @@ -1735,21 +1947,25 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_3x3_reduce" + type: "ReLU" bottom: "inception_5b/3x3_reduce" top: "inception_5b/3x3_reduce" - name: "inception_5b/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_5b/3x3" + type: "Convolution" bottom: "inception_5b/3x3_reduce" top: "inception_5b/3x3" - name: "inception_5b/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -1764,21 +1980,25 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_3x3" + type: "ReLU" bottom: "inception_5b/3x3" top: "inception_5b/3x3" - name: "inception_5b/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_5b/5x5_reduce" + type: "Convolution" bottom: "inception_5a/output" top: "inception_5b/5x5_reduce" - name: "inception_5b/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 48 kernel_size: 1 @@ -1792,21 +2012,25 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_5x5_reduce" + type: "ReLU" bottom: "inception_5b/5x5_reduce" top: "inception_5b/5x5_reduce" - name: "inception_5b/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_5b/5x5" + type: "Convolution" bottom: "inception_5b/5x5_reduce" top: "inception_5b/5x5" - name: "inception_5b/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 pad: 2 @@ -1821,17 +2045,17 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_5x5" + type: "ReLU" bottom: "inception_5b/5x5" top: "inception_5b/5x5" - name: "inception_5b/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_5b/pool" + type: "Pooling" bottom: "inception_5a/output" top: "inception_5b/pool" - name: "inception_5b/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -1839,15 +2063,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_5b/pool_proj" + type: "Convolution" bottom: "inception_5b/pool" top: "inception_5b/pool_proj" - name: "inception_5b/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -1861,50 +2089,54 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_pool_proj" + type: "ReLU" bottom: "inception_5b/pool_proj" top: "inception_5b/pool_proj" - name: "inception_5b/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_5b/output" + type: "Concat" bottom: "inception_5b/1x1" bottom: "inception_5b/3x3" bottom: "inception_5b/5x5" bottom: "inception_5b/pool_proj" top: "inception_5b/output" - name: "inception_5b/output" - type: CONCAT } -layers { +layer { + name: "pool5/7x7_s1" + type: "Pooling" bottom: "inception_5b/output" top: "pool5/7x7_s1" - name: "pool5/7x7_s1" - type: POOLING pooling_param { pool: AVE kernel_size: 7 stride: 1 } } -layers { +layer { + name: "pool5/drop_7x7_s1" + type: "Dropout" bottom: "pool5/7x7_s1" top: "pool5/7x7_s1" - name: "pool5/drop_7x7_s1" - type: DROPOUT dropout_param { dropout_ratio: 0.4 } } -layers { +layer { + name: "loss3/classifier" + type: "InnerProduct" bottom: "pool5/7x7_s1" top: "loss3/classifier" - name: "loss3/classifier" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 1000 weight_filler { @@ -1916,9 +2148,9 @@ layers { } } } -layers { +layer { name: "prob" - type: SOFTMAX + type: "Softmax" bottom: "loss3/classifier" top: "prob" -} \ No newline at end of file +} diff --git a/models/bvlc_googlenet/train_val.prototxt b/models/bvlc_googlenet/train_val.prototxt index cd8f38abdc8..79ede2b9d9c 100644 --- a/models/bvlc_googlenet/train_val.prototxt +++ b/models/bvlc_googlenet/train_val.prototxt @@ -1,14 +1,9 @@ name: "GoogleNet" -layers { +layer { + name: "data" + type: "Data" top: "data" top: "label" - name: "data" - type: DATA - data_param { - source: "examples/imagenet/ilsvrc12_train_lmdb" - batch_size: 32 - backend: LMDB - } include { phase: TRAIN } @@ -19,17 +14,17 @@ layers { mean_value: 117 mean_value: 123 } -} -layers { - top: "data" - top: "label" - name: "data" - type: DATA data_param { - source: "examples/imagenet/ilsvrc12_val_lmdb" - batch_size: 50 + source: "examples/imagenet/ilsvrc12_train_lmdb" + batch_size: 32 backend: LMDB } +} +layer { + name: "data" + type: "Data" + top: "data" + top: "label" include { phase: TEST } @@ -40,16 +35,25 @@ layers { mean_value: 117 mean_value: 123 } + data_param { + source: "examples/imagenet/ilsvrc12_val_lmdb" + batch_size: 50 + backend: LMDB + } } -layers { +layer { + name: "conv1/7x7_s2" + type: "Convolution" bottom: "data" top: "conv1/7x7_s2" - name: "conv1/7x7_s2" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 pad: 3 @@ -65,43 +69,47 @@ layers { } } } -layers { +layer { + name: "conv1/relu_7x7" + type: "ReLU" bottom: "conv1/7x7_s2" top: "conv1/7x7_s2" - name: "conv1/relu_7x7" - type: RELU } -layers { +layer { + name: "pool1/3x3_s2" + type: "Pooling" bottom: "conv1/7x7_s2" top: "pool1/3x3_s2" - name: "pool1/3x3_s2" - type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } -layers { +layer { + name: "pool1/norm1" + type: "LRN" bottom: "pool1/3x3_s2" top: "pool1/norm1" - name: "pool1/norm1" - type: LRN lrn_param { local_size: 5 alpha: 0.0001 beta: 0.75 } } -layers { +layer { + name: "conv2/3x3_reduce" + type: "Convolution" bottom: "pool1/norm1" top: "conv2/3x3_reduce" - name: "conv2/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -115,21 +123,25 @@ layers { } } } -layers { +layer { + name: "conv2/relu_3x3_reduce" + type: "ReLU" bottom: "conv2/3x3_reduce" top: "conv2/3x3_reduce" - name: "conv2/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "conv2/3x3" + type: "Convolution" bottom: "conv2/3x3_reduce" top: "conv2/3x3" - name: "conv2/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 192 pad: 1 @@ -144,43 +156,47 @@ layers { } } } -layers { +layer { + name: "conv2/relu_3x3" + type: "ReLU" bottom: "conv2/3x3" top: "conv2/3x3" - name: "conv2/relu_3x3" - type: RELU } -layers { +layer { + name: "conv2/norm2" + type: "LRN" bottom: "conv2/3x3" top: "conv2/norm2" - name: "conv2/norm2" - type: LRN lrn_param { local_size: 5 alpha: 0.0001 beta: 0.75 } } -layers { +layer { + name: "pool2/3x3_s2" + type: "Pooling" bottom: "conv2/norm2" top: "pool2/3x3_s2" - name: "pool2/3x3_s2" - type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } -layers { +layer { + name: "inception_3a/1x1" + type: "Convolution" bottom: "pool2/3x3_s2" top: "inception_3a/1x1" - name: "inception_3a/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -194,21 +210,25 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_1x1" + type: "ReLU" bottom: "inception_3a/1x1" top: "inception_3a/1x1" - name: "inception_3a/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_3a/3x3_reduce" + type: "Convolution" bottom: "pool2/3x3_s2" top: "inception_3a/3x3_reduce" - name: "inception_3a/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 kernel_size: 1 @@ -222,21 +242,25 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_3x3_reduce" + type: "ReLU" bottom: "inception_3a/3x3_reduce" top: "inception_3a/3x3_reduce" - name: "inception_3a/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_3a/3x3" + type: "Convolution" bottom: "inception_3a/3x3_reduce" top: "inception_3a/3x3" - name: "inception_3a/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 pad: 1 @@ -251,21 +275,25 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_3x3" + type: "ReLU" bottom: "inception_3a/3x3" top: "inception_3a/3x3" - name: "inception_3a/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_3a/5x5_reduce" + type: "Convolution" bottom: "pool2/3x3_s2" top: "inception_3a/5x5_reduce" - name: "inception_3a/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 16 kernel_size: 1 @@ -279,21 +307,25 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_5x5_reduce" + type: "ReLU" bottom: "inception_3a/5x5_reduce" top: "inception_3a/5x5_reduce" - name: "inception_3a/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_3a/5x5" + type: "Convolution" bottom: "inception_3a/5x5_reduce" top: "inception_3a/5x5" - name: "inception_3a/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 pad: 2 @@ -308,17 +340,17 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_5x5" + type: "ReLU" bottom: "inception_3a/5x5" top: "inception_3a/5x5" - name: "inception_3a/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_3a/pool" + type: "Pooling" bottom: "pool2/3x3_s2" top: "inception_3a/pool" - name: "inception_3a/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -326,15 +358,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_3a/pool_proj" + type: "Convolution" bottom: "inception_3a/pool" top: "inception_3a/pool_proj" - name: "inception_3a/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 kernel_size: 1 @@ -348,30 +384,34 @@ layers { } } } -layers { +layer { + name: "inception_3a/relu_pool_proj" + type: "ReLU" bottom: "inception_3a/pool_proj" top: "inception_3a/pool_proj" - name: "inception_3a/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_3a/output" + type: "Concat" bottom: "inception_3a/1x1" bottom: "inception_3a/3x3" bottom: "inception_3a/5x5" bottom: "inception_3a/pool_proj" top: "inception_3a/output" - name: "inception_3a/output" - type: CONCAT } -layers { +layer { + name: "inception_3b/1x1" + type: "Convolution" bottom: "inception_3a/output" top: "inception_3b/1x1" - name: "inception_3b/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -385,21 +425,25 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_1x1" + type: "ReLU" bottom: "inception_3b/1x1" top: "inception_3b/1x1" - name: "inception_3b/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_3b/3x3_reduce" + type: "Convolution" bottom: "inception_3a/output" top: "inception_3b/3x3_reduce" - name: "inception_3b/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -413,21 +457,25 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_3x3_reduce" + type: "ReLU" bottom: "inception_3b/3x3_reduce" top: "inception_3b/3x3_reduce" - name: "inception_3b/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_3b/3x3" + type: "Convolution" bottom: "inception_3b/3x3_reduce" top: "inception_3b/3x3" - name: "inception_3b/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 192 pad: 1 @@ -442,21 +490,25 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_3x3" + type: "ReLU" bottom: "inception_3b/3x3" top: "inception_3b/3x3" - name: "inception_3b/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_3b/5x5_reduce" + type: "Convolution" bottom: "inception_3a/output" top: "inception_3b/5x5_reduce" - name: "inception_3b/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 kernel_size: 1 @@ -470,21 +522,25 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_5x5_reduce" + type: "ReLU" bottom: "inception_3b/5x5_reduce" top: "inception_3b/5x5_reduce" - name: "inception_3b/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_3b/5x5" + type: "Convolution" bottom: "inception_3b/5x5_reduce" top: "inception_3b/5x5" - name: "inception_3b/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 pad: 2 @@ -499,17 +555,17 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_5x5" + type: "ReLU" bottom: "inception_3b/5x5" top: "inception_3b/5x5" - name: "inception_3b/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_3b/pool" + type: "Pooling" bottom: "inception_3a/output" top: "inception_3b/pool" - name: "inception_3b/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -517,15 +573,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_3b/pool_proj" + type: "Convolution" bottom: "inception_3b/pool" top: "inception_3b/pool_proj" - name: "inception_3b/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -539,41 +599,45 @@ layers { } } } -layers { +layer { + name: "inception_3b/relu_pool_proj" + type: "ReLU" bottom: "inception_3b/pool_proj" top: "inception_3b/pool_proj" - name: "inception_3b/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_3b/output" + type: "Concat" bottom: "inception_3b/1x1" bottom: "inception_3b/3x3" bottom: "inception_3b/5x5" bottom: "inception_3b/pool_proj" top: "inception_3b/output" - name: "inception_3b/output" - type: CONCAT } -layers { +layer { + name: "pool3/3x3_s2" + type: "Pooling" bottom: "inception_3b/output" top: "pool3/3x3_s2" - name: "pool3/3x3_s2" - type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } -layers { +layer { + name: "inception_4a/1x1" + type: "Convolution" bottom: "pool3/3x3_s2" top: "inception_4a/1x1" - name: "inception_4a/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 192 kernel_size: 1 @@ -587,21 +651,25 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_1x1" + type: "ReLU" bottom: "inception_4a/1x1" top: "inception_4a/1x1" - name: "inception_4a/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_4a/3x3_reduce" + type: "Convolution" bottom: "pool3/3x3_s2" top: "inception_4a/3x3_reduce" - name: "inception_4a/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 kernel_size: 1 @@ -615,21 +683,25 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_3x3_reduce" + type: "ReLU" bottom: "inception_4a/3x3_reduce" top: "inception_4a/3x3_reduce" - name: "inception_4a/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_4a/3x3" + type: "Convolution" bottom: "inception_4a/3x3_reduce" top: "inception_4a/3x3" - name: "inception_4a/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 208 pad: 1 @@ -644,21 +716,25 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_3x3" + type: "ReLU" bottom: "inception_4a/3x3" top: "inception_4a/3x3" - name: "inception_4a/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_4a/5x5_reduce" + type: "Convolution" bottom: "pool3/3x3_s2" top: "inception_4a/5x5_reduce" - name: "inception_4a/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 16 kernel_size: 1 @@ -672,21 +748,25 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_5x5_reduce" + type: "ReLU" bottom: "inception_4a/5x5_reduce" top: "inception_4a/5x5_reduce" - name: "inception_4a/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_4a/5x5" + type: "Convolution" bottom: "inception_4a/5x5_reduce" top: "inception_4a/5x5" - name: "inception_4a/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 48 pad: 2 @@ -701,17 +781,17 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_5x5" + type: "ReLU" bottom: "inception_4a/5x5" top: "inception_4a/5x5" - name: "inception_4a/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_4a/pool" + type: "Pooling" bottom: "pool3/3x3_s2" top: "inception_4a/pool" - name: "inception_4a/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -719,15 +799,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_4a/pool_proj" + type: "Convolution" bottom: "inception_4a/pool" top: "inception_4a/pool_proj" - name: "inception_4a/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -741,41 +825,45 @@ layers { } } } -layers { +layer { + name: "inception_4a/relu_pool_proj" + type: "ReLU" bottom: "inception_4a/pool_proj" top: "inception_4a/pool_proj" - name: "inception_4a/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_4a/output" + type: "Concat" bottom: "inception_4a/1x1" bottom: "inception_4a/3x3" bottom: "inception_4a/5x5" bottom: "inception_4a/pool_proj" top: "inception_4a/output" - name: "inception_4a/output" - type: CONCAT } -layers { +layer { + name: "loss1/ave_pool" + type: "Pooling" bottom: "inception_4a/output" top: "loss1/ave_pool" - name: "loss1/ave_pool" - type: POOLING pooling_param { pool: AVE kernel_size: 5 stride: 3 } } -layers { +layer { + name: "loss1/conv" + type: "Convolution" bottom: "loss1/ave_pool" top: "loss1/conv" - name: "loss1/conv" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -789,21 +877,25 @@ layers { } } } -layers { +layer { + name: "loss1/relu_conv" + type: "ReLU" bottom: "loss1/conv" top: "loss1/conv" - name: "loss1/relu_conv" - type: RELU } -layers { +layer { + name: "loss1/fc" + type: "InnerProduct" bottom: "loss1/conv" top: "loss1/fc" - name: "loss1/fc" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 1024 weight_filler { @@ -816,30 +908,34 @@ layers { } } } -layers { +layer { + name: "loss1/relu_fc" + type: "ReLU" bottom: "loss1/fc" top: "loss1/fc" - name: "loss1/relu_fc" - type: RELU } -layers { +layer { + name: "loss1/drop_fc" + type: "Dropout" bottom: "loss1/fc" top: "loss1/fc" - name: "loss1/drop_fc" - type: DROPOUT dropout_param { dropout_ratio: 0.7 } } -layers { +layer { + name: "loss1/classifier" + type: "InnerProduct" bottom: "loss1/fc" top: "loss1/classifier" - name: "loss1/classifier" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 1000 weight_filler { @@ -852,46 +948,50 @@ layers { } } } -layers { +layer { + name: "loss1/loss" + type: "SoftmaxWithLoss" bottom: "loss1/classifier" bottom: "label" top: "loss1/loss1" - name: "loss1/loss" - type: SOFTMAX_LOSS loss_weight: 0.3 } -layers { +layer { + name: "loss1/top-1" + type: "Accuracy" bottom: "loss1/classifier" bottom: "label" top: "loss1/top-1" - name: "loss1/top-1" - type: ACCURACY include { phase: TEST } } -layers { +layer { + name: "loss1/top-5" + type: "Accuracy" bottom: "loss1/classifier" bottom: "label" top: "loss1/top-5" - name: "loss1/top-5" - type: ACCURACY - accuracy_param { - top_k: 5 - } include { phase: TEST } + accuracy_param { + top_k: 5 + } } -layers { +layer { + name: "inception_4b/1x1" + type: "Convolution" bottom: "inception_4a/output" top: "inception_4b/1x1" - name: "inception_4b/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 160 kernel_size: 1 @@ -905,21 +1005,25 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_1x1" + type: "ReLU" bottom: "inception_4b/1x1" top: "inception_4b/1x1" - name: "inception_4b/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_4b/3x3_reduce" + type: "Convolution" bottom: "inception_4a/output" top: "inception_4b/3x3_reduce" - name: "inception_4b/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 112 kernel_size: 1 @@ -933,21 +1037,25 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_3x3_reduce" + type: "ReLU" bottom: "inception_4b/3x3_reduce" top: "inception_4b/3x3_reduce" - name: "inception_4b/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_4b/3x3" + type: "Convolution" bottom: "inception_4b/3x3_reduce" top: "inception_4b/3x3" - name: "inception_4b/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 224 pad: 1 @@ -962,21 +1070,25 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_3x3" + type: "ReLU" bottom: "inception_4b/3x3" top: "inception_4b/3x3" - name: "inception_4b/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_4b/5x5_reduce" + type: "Convolution" bottom: "inception_4a/output" top: "inception_4b/5x5_reduce" - name: "inception_4b/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 24 kernel_size: 1 @@ -990,21 +1102,25 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_5x5_reduce" + type: "ReLU" bottom: "inception_4b/5x5_reduce" top: "inception_4b/5x5_reduce" - name: "inception_4b/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_4b/5x5" + type: "Convolution" bottom: "inception_4b/5x5_reduce" top: "inception_4b/5x5" - name: "inception_4b/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 pad: 2 @@ -1019,17 +1135,17 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_5x5" + type: "ReLU" bottom: "inception_4b/5x5" top: "inception_4b/5x5" - name: "inception_4b/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_4b/pool" + type: "Pooling" bottom: "inception_4a/output" top: "inception_4b/pool" - name: "inception_4b/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -1037,15 +1153,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_4b/pool_proj" + type: "Convolution" bottom: "inception_4b/pool" top: "inception_4b/pool_proj" - name: "inception_4b/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -1059,30 +1179,34 @@ layers { } } } -layers { +layer { + name: "inception_4b/relu_pool_proj" + type: "ReLU" bottom: "inception_4b/pool_proj" top: "inception_4b/pool_proj" - name: "inception_4b/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_4b/output" + type: "Concat" bottom: "inception_4b/1x1" bottom: "inception_4b/3x3" bottom: "inception_4b/5x5" bottom: "inception_4b/pool_proj" top: "inception_4b/output" - name: "inception_4b/output" - type: CONCAT } -layers { +layer { + name: "inception_4c/1x1" + type: "Convolution" bottom: "inception_4b/output" top: "inception_4c/1x1" - name: "inception_4c/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -1096,21 +1220,25 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_1x1" + type: "ReLU" bottom: "inception_4c/1x1" top: "inception_4c/1x1" - name: "inception_4c/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_4c/3x3_reduce" + type: "Convolution" bottom: "inception_4b/output" top: "inception_4c/3x3_reduce" - name: "inception_4c/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -1124,21 +1252,25 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_3x3_reduce" + type: "ReLU" bottom: "inception_4c/3x3_reduce" top: "inception_4c/3x3_reduce" - name: "inception_4c/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_4c/3x3" + type: "Convolution" bottom: "inception_4c/3x3_reduce" top: "inception_4c/3x3" - name: "inception_4c/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 1 @@ -1153,21 +1285,25 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_3x3" + type: "ReLU" bottom: "inception_4c/3x3" top: "inception_4c/3x3" - name: "inception_4c/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_4c/5x5_reduce" + type: "Convolution" bottom: "inception_4b/output" top: "inception_4c/5x5_reduce" - name: "inception_4c/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 24 kernel_size: 1 @@ -1181,21 +1317,25 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_5x5_reduce" + type: "ReLU" bottom: "inception_4c/5x5_reduce" top: "inception_4c/5x5_reduce" - name: "inception_4c/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_4c/5x5" + type: "Convolution" bottom: "inception_4c/5x5_reduce" top: "inception_4c/5x5" - name: "inception_4c/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 pad: 2 @@ -1210,17 +1350,17 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_5x5" + type: "ReLU" bottom: "inception_4c/5x5" top: "inception_4c/5x5" - name: "inception_4c/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_4c/pool" + type: "Pooling" bottom: "inception_4b/output" top: "inception_4c/pool" - name: "inception_4c/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -1228,15 +1368,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_4c/pool_proj" + type: "Convolution" bottom: "inception_4c/pool" top: "inception_4c/pool_proj" - name: "inception_4c/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -1250,30 +1394,34 @@ layers { } } } -layers { +layer { + name: "inception_4c/relu_pool_proj" + type: "ReLU" bottom: "inception_4c/pool_proj" top: "inception_4c/pool_proj" - name: "inception_4c/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_4c/output" + type: "Concat" bottom: "inception_4c/1x1" bottom: "inception_4c/3x3" bottom: "inception_4c/5x5" bottom: "inception_4c/pool_proj" top: "inception_4c/output" - name: "inception_4c/output" - type: CONCAT } -layers { +layer { + name: "inception_4d/1x1" + type: "Convolution" bottom: "inception_4c/output" top: "inception_4d/1x1" - name: "inception_4d/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 112 kernel_size: 1 @@ -1287,21 +1435,25 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_1x1" + type: "ReLU" bottom: "inception_4d/1x1" top: "inception_4d/1x1" - name: "inception_4d/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_4d/3x3_reduce" + type: "Convolution" bottom: "inception_4c/output" top: "inception_4d/3x3_reduce" - name: "inception_4d/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 144 kernel_size: 1 @@ -1315,21 +1467,25 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_3x3_reduce" + type: "ReLU" bottom: "inception_4d/3x3_reduce" top: "inception_4d/3x3_reduce" - name: "inception_4d/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_4d/3x3" + type: "Convolution" bottom: "inception_4d/3x3_reduce" top: "inception_4d/3x3" - name: "inception_4d/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 288 pad: 1 @@ -1344,21 +1500,25 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_3x3" + type: "ReLU" bottom: "inception_4d/3x3" top: "inception_4d/3x3" - name: "inception_4d/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_4d/5x5_reduce" + type: "Convolution" bottom: "inception_4c/output" top: "inception_4d/5x5_reduce" - name: "inception_4d/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 kernel_size: 1 @@ -1372,21 +1532,25 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_5x5_reduce" + type: "ReLU" bottom: "inception_4d/5x5_reduce" top: "inception_4d/5x5_reduce" - name: "inception_4d/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_4d/5x5" + type: "Convolution" bottom: "inception_4d/5x5_reduce" top: "inception_4d/5x5" - name: "inception_4d/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 pad: 2 @@ -1401,17 +1565,17 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_5x5" + type: "ReLU" bottom: "inception_4d/5x5" top: "inception_4d/5x5" - name: "inception_4d/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_4d/pool" + type: "Pooling" bottom: "inception_4c/output" top: "inception_4d/pool" - name: "inception_4d/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -1419,15 +1583,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_4d/pool_proj" + type: "Convolution" bottom: "inception_4d/pool" top: "inception_4d/pool_proj" - name: "inception_4d/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 64 kernel_size: 1 @@ -1441,41 +1609,45 @@ layers { } } } -layers { +layer { + name: "inception_4d/relu_pool_proj" + type: "ReLU" bottom: "inception_4d/pool_proj" top: "inception_4d/pool_proj" - name: "inception_4d/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_4d/output" + type: "Concat" bottom: "inception_4d/1x1" bottom: "inception_4d/3x3" bottom: "inception_4d/5x5" bottom: "inception_4d/pool_proj" top: "inception_4d/output" - name: "inception_4d/output" - type: CONCAT } -layers { +layer { + name: "loss2/ave_pool" + type: "Pooling" bottom: "inception_4d/output" top: "loss2/ave_pool" - name: "loss2/ave_pool" - type: POOLING pooling_param { pool: AVE kernel_size: 5 stride: 3 } } -layers { +layer { + name: "loss2/conv" + type: "Convolution" bottom: "loss2/ave_pool" top: "loss2/conv" - name: "loss2/conv" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -1489,21 +1661,25 @@ layers { } } } -layers { +layer { + name: "loss2/relu_conv" + type: "ReLU" bottom: "loss2/conv" top: "loss2/conv" - name: "loss2/relu_conv" - type: RELU } -layers { +layer { + name: "loss2/fc" + type: "InnerProduct" bottom: "loss2/conv" top: "loss2/fc" - name: "loss2/fc" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 1024 weight_filler { @@ -1516,30 +1692,34 @@ layers { } } } -layers { +layer { + name: "loss2/relu_fc" + type: "ReLU" bottom: "loss2/fc" top: "loss2/fc" - name: "loss2/relu_fc" - type: RELU } -layers { +layer { + name: "loss2/drop_fc" + type: "Dropout" bottom: "loss2/fc" top: "loss2/fc" - name: "loss2/drop_fc" - type: DROPOUT dropout_param { dropout_ratio: 0.7 } } -layers { +layer { + name: "loss2/classifier" + type: "InnerProduct" bottom: "loss2/fc" top: "loss2/classifier" - name: "loss2/classifier" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 1000 weight_filler { @@ -1552,46 +1732,50 @@ layers { } } } -layers { +layer { + name: "loss2/loss" + type: "SoftmaxWithLoss" bottom: "loss2/classifier" bottom: "label" top: "loss2/loss1" - name: "loss2/loss" - type: SOFTMAX_LOSS loss_weight: 0.3 } -layers { +layer { + name: "loss2/top-1" + type: "Accuracy" bottom: "loss2/classifier" bottom: "label" top: "loss2/top-1" - name: "loss2/top-1" - type: ACCURACY include { phase: TEST } } -layers { +layer { + name: "loss2/top-5" + type: "Accuracy" bottom: "loss2/classifier" bottom: "label" top: "loss2/top-5" - name: "loss2/top-5" - type: ACCURACY - accuracy_param { - top_k: 5 - } include { phase: TEST } + accuracy_param { + top_k: 5 + } } -layers { +layer { + name: "inception_4e/1x1" + type: "Convolution" bottom: "inception_4d/output" top: "inception_4e/1x1" - name: "inception_4e/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 kernel_size: 1 @@ -1605,21 +1789,25 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_1x1" + type: "ReLU" bottom: "inception_4e/1x1" top: "inception_4e/1x1" - name: "inception_4e/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_4e/3x3_reduce" + type: "Convolution" bottom: "inception_4d/output" top: "inception_4e/3x3_reduce" - name: "inception_4e/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 160 kernel_size: 1 @@ -1633,21 +1821,25 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_3x3_reduce" + type: "ReLU" bottom: "inception_4e/3x3_reduce" top: "inception_4e/3x3_reduce" - name: "inception_4e/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_4e/3x3" + type: "Convolution" bottom: "inception_4e/3x3_reduce" top: "inception_4e/3x3" - name: "inception_4e/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 320 pad: 1 @@ -1662,21 +1854,25 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_3x3" + type: "ReLU" bottom: "inception_4e/3x3" top: "inception_4e/3x3" - name: "inception_4e/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_4e/5x5_reduce" + type: "Convolution" bottom: "inception_4d/output" top: "inception_4e/5x5_reduce" - name: "inception_4e/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 kernel_size: 1 @@ -1690,21 +1886,25 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_5x5_reduce" + type: "ReLU" bottom: "inception_4e/5x5_reduce" top: "inception_4e/5x5_reduce" - name: "inception_4e/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_4e/5x5" + type: "Convolution" bottom: "inception_4e/5x5_reduce" top: "inception_4e/5x5" - name: "inception_4e/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 pad: 2 @@ -1719,17 +1919,17 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_5x5" + type: "ReLU" bottom: "inception_4e/5x5" top: "inception_4e/5x5" - name: "inception_4e/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_4e/pool" + type: "Pooling" bottom: "inception_4d/output" top: "inception_4e/pool" - name: "inception_4e/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -1737,15 +1937,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_4e/pool_proj" + type: "Convolution" bottom: "inception_4e/pool" top: "inception_4e/pool_proj" - name: "inception_4e/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -1759,41 +1963,45 @@ layers { } } } -layers { +layer { + name: "inception_4e/relu_pool_proj" + type: "ReLU" bottom: "inception_4e/pool_proj" top: "inception_4e/pool_proj" - name: "inception_4e/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_4e/output" + type: "Concat" bottom: "inception_4e/1x1" bottom: "inception_4e/3x3" bottom: "inception_4e/5x5" bottom: "inception_4e/pool_proj" top: "inception_4e/output" - name: "inception_4e/output" - type: CONCAT } -layers { +layer { + name: "pool4/3x3_s2" + type: "Pooling" bottom: "inception_4e/output" top: "pool4/3x3_s2" - name: "pool4/3x3_s2" - type: POOLING pooling_param { pool: MAX kernel_size: 3 stride: 2 } } -layers { +layer { + name: "inception_5a/1x1" + type: "Convolution" bottom: "pool4/3x3_s2" top: "inception_5a/1x1" - name: "inception_5a/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 kernel_size: 1 @@ -1807,21 +2015,25 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_1x1" + type: "ReLU" bottom: "inception_5a/1x1" top: "inception_5a/1x1" - name: "inception_5a/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_5a/3x3_reduce" + type: "Convolution" bottom: "pool4/3x3_s2" top: "inception_5a/3x3_reduce" - name: "inception_5a/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 160 kernel_size: 1 @@ -1835,21 +2047,25 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_3x3_reduce" + type: "ReLU" bottom: "inception_5a/3x3_reduce" top: "inception_5a/3x3_reduce" - name: "inception_5a/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_5a/3x3" + type: "Convolution" bottom: "inception_5a/3x3_reduce" top: "inception_5a/3x3" - name: "inception_5a/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 320 pad: 1 @@ -1864,21 +2080,25 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_3x3" + type: "ReLU" bottom: "inception_5a/3x3" top: "inception_5a/3x3" - name: "inception_5a/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_5a/5x5_reduce" + type: "Convolution" bottom: "pool4/3x3_s2" top: "inception_5a/5x5_reduce" - name: "inception_5a/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 32 kernel_size: 1 @@ -1892,21 +2112,25 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_5x5_reduce" + type: "ReLU" bottom: "inception_5a/5x5_reduce" top: "inception_5a/5x5_reduce" - name: "inception_5a/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_5a/5x5" + type: "Convolution" bottom: "inception_5a/5x5_reduce" top: "inception_5a/5x5" - name: "inception_5a/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 pad: 2 @@ -1921,17 +2145,17 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_5x5" + type: "ReLU" bottom: "inception_5a/5x5" top: "inception_5a/5x5" - name: "inception_5a/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_5a/pool" + type: "Pooling" bottom: "pool4/3x3_s2" top: "inception_5a/pool" - name: "inception_5a/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -1939,15 +2163,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_5a/pool_proj" + type: "Convolution" bottom: "inception_5a/pool" top: "inception_5a/pool_proj" - name: "inception_5a/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -1961,30 +2189,34 @@ layers { } } } -layers { +layer { + name: "inception_5a/relu_pool_proj" + type: "ReLU" bottom: "inception_5a/pool_proj" top: "inception_5a/pool_proj" - name: "inception_5a/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_5a/output" + type: "Concat" bottom: "inception_5a/1x1" bottom: "inception_5a/3x3" bottom: "inception_5a/5x5" bottom: "inception_5a/pool_proj" top: "inception_5a/output" - name: "inception_5a/output" - type: CONCAT } -layers { +layer { + name: "inception_5b/1x1" + type: "Convolution" bottom: "inception_5a/output" top: "inception_5b/1x1" - name: "inception_5b/1x1" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 kernel_size: 1 @@ -1998,21 +2230,25 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_1x1" + type: "ReLU" bottom: "inception_5b/1x1" top: "inception_5b/1x1" - name: "inception_5b/relu_1x1" - type: RELU } -layers { +layer { + name: "inception_5b/3x3_reduce" + type: "Convolution" bottom: "inception_5a/output" top: "inception_5b/3x3_reduce" - name: "inception_5b/3x3_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 192 kernel_size: 1 @@ -2026,21 +2262,25 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_3x3_reduce" + type: "ReLU" bottom: "inception_5b/3x3_reduce" top: "inception_5b/3x3_reduce" - name: "inception_5b/relu_3x3_reduce" - type: RELU } -layers { +layer { + name: "inception_5b/3x3" + type: "Convolution" bottom: "inception_5b/3x3_reduce" top: "inception_5b/3x3" - name: "inception_5b/3x3" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -2055,21 +2295,25 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_3x3" + type: "ReLU" bottom: "inception_5b/3x3" top: "inception_5b/3x3" - name: "inception_5b/relu_3x3" - type: RELU } -layers { +layer { + name: "inception_5b/5x5_reduce" + type: "Convolution" bottom: "inception_5a/output" top: "inception_5b/5x5_reduce" - name: "inception_5b/5x5_reduce" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 48 kernel_size: 1 @@ -2083,21 +2327,25 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_5x5_reduce" + type: "ReLU" bottom: "inception_5b/5x5_reduce" top: "inception_5b/5x5_reduce" - name: "inception_5b/relu_5x5_reduce" - type: RELU } -layers { +layer { + name: "inception_5b/5x5" + type: "Convolution" bottom: "inception_5b/5x5_reduce" top: "inception_5b/5x5" - name: "inception_5b/5x5" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 pad: 2 @@ -2112,17 +2360,17 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_5x5" + type: "ReLU" bottom: "inception_5b/5x5" top: "inception_5b/5x5" - name: "inception_5b/relu_5x5" - type: RELU } -layers { +layer { + name: "inception_5b/pool" + type: "Pooling" bottom: "inception_5a/output" top: "inception_5b/pool" - name: "inception_5b/pool" - type: POOLING pooling_param { pool: MAX kernel_size: 3 @@ -2130,15 +2378,19 @@ layers { pad: 1 } } -layers { +layer { + name: "inception_5b/pool_proj" + type: "Convolution" bottom: "inception_5b/pool" top: "inception_5b/pool_proj" - name: "inception_5b/pool_proj" - type: CONVOLUTION - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 128 kernel_size: 1 @@ -2152,50 +2404,54 @@ layers { } } } -layers { +layer { + name: "inception_5b/relu_pool_proj" + type: "ReLU" bottom: "inception_5b/pool_proj" top: "inception_5b/pool_proj" - name: "inception_5b/relu_pool_proj" - type: RELU } -layers { +layer { + name: "inception_5b/output" + type: "Concat" bottom: "inception_5b/1x1" bottom: "inception_5b/3x3" bottom: "inception_5b/5x5" bottom: "inception_5b/pool_proj" top: "inception_5b/output" - name: "inception_5b/output" - type: CONCAT } -layers { +layer { + name: "pool5/7x7_s1" + type: "Pooling" bottom: "inception_5b/output" top: "pool5/7x7_s1" - name: "pool5/7x7_s1" - type: POOLING pooling_param { pool: AVE kernel_size: 7 stride: 1 } } -layers { +layer { + name: "pool5/drop_7x7_s1" + type: "Dropout" bottom: "pool5/7x7_s1" top: "pool5/7x7_s1" - name: "pool5/drop_7x7_s1" - type: DROPOUT dropout_param { dropout_ratio: 0.4 } } -layers { +layer { + name: "loss3/classifier" + type: "InnerProduct" bottom: "pool5/7x7_s1" top: "loss3/classifier" - name: "loss3/classifier" - type: INNER_PRODUCT - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 1000 weight_filler { @@ -2207,34 +2463,34 @@ layers { } } } -layers { +layer { + name: "loss3/loss3" + type: "SoftmaxWithLoss" bottom: "loss3/classifier" bottom: "label" top: "loss3/loss3" - name: "loss3/loss3" - type: SOFTMAX_LOSS loss_weight: 1 } -layers { +layer { + name: "loss3/top-1" + type: "Accuracy" bottom: "loss3/classifier" bottom: "label" top: "loss3/top-1" - name: "loss3/top-1" - type: ACCURACY include { phase: TEST } } -layers { +layer { + name: "loss3/top-5" + type: "Accuracy" bottom: "loss3/classifier" bottom: "label" top: "loss3/top-5" - name: "loss3/top-5" - type: ACCURACY - accuracy_param { - top_k: 5 - } include { phase: TEST } + accuracy_param { + top_k: 5 + } } diff --git a/models/bvlc_reference_caffenet/deploy.prototxt b/models/bvlc_reference_caffenet/deploy.prototxt index 4e494f420b5..29ccf1469f7 100644 --- a/models/bvlc_reference_caffenet/deploy.prototxt +++ b/models/bvlc_reference_caffenet/deploy.prototxt @@ -4,9 +4,9 @@ input_dim: 10 input_dim: 3 input_dim: 227 input_dim: 227 -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" convolution_param { @@ -15,15 +15,15 @@ layers { stride: 4 } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "conv1" top: "conv1" } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -32,9 +32,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "pool1" top: "norm1" lrn_param { @@ -43,9 +43,9 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "norm1" top: "conv2" convolution_param { @@ -55,15 +55,15 @@ layers { group: 2 } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -72,9 +72,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "pool2" top: "norm2" lrn_param { @@ -83,9 +83,9 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "norm2" top: "conv3" convolution_param { @@ -94,15 +94,15 @@ layers { kernel_size: 3 } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "conv4" - type: CONVOLUTION + type: "Convolution" bottom: "conv3" top: "conv4" convolution_param { @@ -112,15 +112,15 @@ layers { group: 2 } } -layers { +layer { name: "relu4" - type: RELU + type: "ReLU" bottom: "conv4" top: "conv4" } -layers { +layer { name: "conv5" - type: CONVOLUTION + type: "Convolution" bottom: "conv4" top: "conv5" convolution_param { @@ -130,15 +130,15 @@ layers { group: 2 } } -layers { +layer { name: "relu5" - type: RELU + type: "ReLU" bottom: "conv5" top: "conv5" } -layers { +layer { name: "pool5" - type: POOLING + type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { @@ -147,66 +147,66 @@ layers { stride: 2 } } -layers { +layer { name: "fc6" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool5" top: "fc6" inner_product_param { num_output: 4096 } } -layers { +layer { name: "relu6" - type: RELU + type: "ReLU" bottom: "fc6" top: "fc6" } -layers { +layer { name: "drop6" - type: DROPOUT + type: "Dropout" bottom: "fc6" top: "fc6" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc7" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc6" top: "fc7" inner_product_param { num_output: 4096 } } -layers { +layer { name: "relu7" - type: RELU + type: "ReLU" bottom: "fc7" top: "fc7" } -layers { +layer { name: "drop7" - type: DROPOUT + type: "Dropout" bottom: "fc7" top: "fc7" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc8" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc7" top: "fc8" inner_product_param { num_output: 1000 } } -layers { +layer { name: "prob" - type: SOFTMAX + type: "Softmax" bottom: "fc8" top: "prob" } diff --git a/models/bvlc_reference_caffenet/train_val.prototxt b/models/bvlc_reference_caffenet/train_val.prototxt index 00fcc080261..c79472e09ab 100644 --- a/models/bvlc_reference_caffenet/train_val.prototxt +++ b/models/bvlc_reference_caffenet/train_val.prototxt @@ -1,18 +1,16 @@ name: "CaffeNet" -layers { +layer { name: "data" - type: DATA + type: "Data" top: "data" top: "label" - data_param { - source: "examples/imagenet/ilsvrc12_train_lmdb" - backend: LMDB - batch_size: 256 + include { + phase: TRAIN } transform_param { + mirror: true crop_size: 227 mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: true } # mean pixel / channel-wise mean instead of mean image # transform_param { @@ -22,22 +20,24 @@ layers { # mean_value: 123 # mirror: true # } - include: { phase: TRAIN } + data_param { + source: "examples/imagenet/ilsvrc12_train_lmdb" + batch_size: 256 + backend: LMDB + } } -layers { +layer { name: "data" - type: DATA + type: "Data" top: "data" top: "label" - data_param { - source: "examples/imagenet/ilsvrc12_val_lmdb" - backend: LMDB - batch_size: 50 + include { + phase: TEST } transform_param { + mirror: false crop_size: 227 mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: false } # mean pixel / channel-wise mean instead of mean image # transform_param { @@ -47,17 +47,25 @@ layers { # mean_value: 123 # mirror: true # } - include: { phase: TEST } + data_param { + source: "examples/imagenet/ilsvrc12_val_lmdb" + batch_size: 50 + backend: LMDB + } } -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 kernel_size: 11 @@ -72,15 +80,15 @@ layers { } } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "conv1" top: "conv1" } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -89,9 +97,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "pool1" top: "norm1" lrn_param { @@ -100,15 +108,19 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "norm1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 2 @@ -124,15 +136,15 @@ layers { } } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -141,9 +153,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "pool2" top: "norm2" lrn_param { @@ -152,15 +164,19 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "norm2" top: "conv3" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -175,21 +191,25 @@ layers { } } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "conv4" - type: CONVOLUTION + type: "Convolution" bottom: "conv3" top: "conv4" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -205,21 +225,25 @@ layers { } } } -layers { +layer { name: "relu4" - type: RELU + type: "ReLU" bottom: "conv4" top: "conv4" } -layers { +layer { name: "conv5" - type: CONVOLUTION + type: "Convolution" bottom: "conv4" top: "conv5" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 1 @@ -235,15 +259,15 @@ layers { } } } -layers { +layer { name: "relu5" - type: RELU + type: "ReLU" bottom: "conv5" top: "conv5" } -layers { +layer { name: "pool5" - type: POOLING + type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { @@ -252,15 +276,19 @@ layers { stride: 2 } } -layers { +layer { name: "fc6" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool5" top: "fc6" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 weight_filler { @@ -273,30 +301,34 @@ layers { } } } -layers { +layer { name: "relu6" - type: RELU + type: "ReLU" bottom: "fc6" top: "fc6" } -layers { +layer { name: "drop6" - type: DROPOUT + type: "Dropout" bottom: "fc6" top: "fc6" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc7" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc6" top: "fc7" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 weight_filler { @@ -309,30 +341,34 @@ layers { } } } -layers { +layer { name: "relu7" - type: RELU + type: "ReLU" bottom: "fc7" top: "fc7" } -layers { +layer { name: "drop7" - type: DROPOUT + type: "Dropout" bottom: "fc7" top: "fc7" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc8" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc7" top: "fc8" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 1000 weight_filler { @@ -345,17 +381,19 @@ layers { } } } -layers { +layer { name: "accuracy" - type: ACCURACY + type: "Accuracy" bottom: "fc8" bottom: "label" top: "accuracy" - include: { phase: TEST } + include { + phase: TEST + } } -layers { +layer { name: "loss" - type: SOFTMAX_LOSS + type: "SoftmaxWithLoss" bottom: "fc8" bottom: "label" top: "loss" diff --git a/models/bvlc_reference_rcnn_ilsvrc13/deploy.prototxt b/models/bvlc_reference_rcnn_ilsvrc13/deploy.prototxt index ef75a0a5e95..ea9cf98a926 100644 --- a/models/bvlc_reference_rcnn_ilsvrc13/deploy.prototxt +++ b/models/bvlc_reference_rcnn_ilsvrc13/deploy.prototxt @@ -4,9 +4,9 @@ input_dim: 10 input_dim: 3 input_dim: 227 input_dim: 227 -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" convolution_param { @@ -15,15 +15,15 @@ layers { stride: 4 } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "conv1" top: "conv1" } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -32,9 +32,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "pool1" top: "norm1" lrn_param { @@ -43,9 +43,9 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "norm1" top: "conv2" convolution_param { @@ -55,15 +55,15 @@ layers { group: 2 } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -72,9 +72,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "pool2" top: "norm2" lrn_param { @@ -83,9 +83,9 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "norm2" top: "conv3" convolution_param { @@ -94,15 +94,15 @@ layers { kernel_size: 3 } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "conv4" - type: CONVOLUTION + type: "Convolution" bottom: "conv3" top: "conv4" convolution_param { @@ -112,15 +112,15 @@ layers { group: 2 } } -layers { +layer { name: "relu4" - type: RELU + type: "ReLU" bottom: "conv4" top: "conv4" } -layers { +layer { name: "conv5" - type: CONVOLUTION + type: "Convolution" bottom: "conv4" top: "conv5" convolution_param { @@ -130,15 +130,15 @@ layers { group: 2 } } -layers { +layer { name: "relu5" - type: RELU + type: "ReLU" bottom: "conv5" top: "conv5" } -layers { +layer { name: "pool5" - type: POOLING + type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { @@ -147,48 +147,48 @@ layers { stride: 2 } } -layers { +layer { name: "fc6" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool5" top: "fc6" inner_product_param { num_output: 4096 } } -layers { +layer { name: "relu6" - type: RELU + type: "ReLU" bottom: "fc6" top: "fc6" } -layers { +layer { name: "drop6" - type: DROPOUT + type: "Dropout" bottom: "fc6" top: "fc6" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc7" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc6" top: "fc7" inner_product_param { num_output: 4096 } } -layers { +layer { name: "relu7" - type: RELU + type: "ReLU" bottom: "fc7" top: "fc7" } -layers { +layer { name: "drop7" - type: DROPOUT + type: "Dropout" bottom: "fc7" top: "fc7" dropout_param { @@ -196,9 +196,9 @@ layers { } } # R-CNN classification layer made from R-CNN ILSVRC13 SVMs. -layers { +layer { name: "fc-rcnn" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc7" top: "fc-rcnn" inner_product_param { diff --git a/models/finetune_flickr_style/deploy.prototxt b/models/finetune_flickr_style/deploy.prototxt index aa2ad961874..4a924f74927 100644 --- a/models/finetune_flickr_style/deploy.prototxt +++ b/models/finetune_flickr_style/deploy.prototxt @@ -4,15 +4,19 @@ input_dim: 10 input_dim: 3 input_dim: 227 input_dim: 227 -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 kernel_size: 11 @@ -27,15 +31,15 @@ layers { } } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "conv1" top: "conv1" } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -44,9 +48,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "pool1" top: "norm1" lrn_param { @@ -55,15 +59,19 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "norm1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 2 @@ -79,15 +87,15 @@ layers { } } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -96,9 +104,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "pool2" top: "norm2" lrn_param { @@ -107,15 +115,19 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "norm2" top: "conv3" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -130,21 +142,25 @@ layers { } } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "conv4" - type: CONVOLUTION + type: "Convolution" bottom: "conv3" top: "conv4" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -160,21 +176,25 @@ layers { } } } -layers { +layer { name: "relu4" - type: RELU + type: "ReLU" bottom: "conv4" top: "conv4" } -layers { +layer { name: "conv5" - type: CONVOLUTION + type: "Convolution" bottom: "conv4" top: "conv5" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 1 @@ -190,15 +210,15 @@ layers { } } } -layers { +layer { name: "relu5" - type: RELU + type: "ReLU" bottom: "conv5" top: "conv5" } -layers { +layer { name: "pool5" - type: POOLING + type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { @@ -207,15 +227,19 @@ layers { stride: 2 } } -layers { +layer { name: "fc6" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool5" top: "fc6" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 weight_filler { @@ -228,31 +252,35 @@ layers { } } } -layers { +layer { name: "relu6" - type: RELU + type: "ReLU" bottom: "fc6" top: "fc6" } -layers { +layer { name: "drop6" - type: DROPOUT + type: "Dropout" bottom: "fc6" top: "fc6" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc7" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc6" top: "fc7" - # Note that blobs_lr can be set to 0 to disable any fine-tuning of this, and any other, layer - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + # Note that lr_mult can be set to 0 to disable any fine-tuning of this, and any other, layer + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 weight_filler { @@ -265,31 +293,35 @@ layers { } } } -layers { +layer { name: "relu7" - type: RELU + type: "ReLU" bottom: "fc7" top: "fc7" } -layers { +layer { name: "drop7" - type: DROPOUT + type: "Dropout" bottom: "fc7" top: "fc7" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc8_flickr" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc7" top: "fc8_flickr" - # blobs_lr is set to higher than for other layers, because this layer is starting from random while the others are already trained - blobs_lr: 10 - blobs_lr: 20 - weight_decay: 1 - weight_decay: 0 + # lr_mult is set to higher than for other layers, because this layer is starting from random while the others are already trained + param { + lr_mult: 10 + decay_mult: 1 + } + param { + lr_mult: 20 + decay_mult: 0 + } inner_product_param { num_output: 20 weight_filler { @@ -302,9 +334,9 @@ layers { } } } -layers { +layer { name: "prob" - type: SOFTMAX + type: "Softmax" bottom: "fc8_flickr" top: "prob" } diff --git a/models/finetune_flickr_style/train_val.prototxt b/models/finetune_flickr_style/train_val.prototxt index 7155c492360..aa9c73e17ce 100644 --- a/models/finetune_flickr_style/train_val.prototxt +++ b/models/finetune_flickr_style/train_val.prototxt @@ -1,49 +1,57 @@ name: "FlickrStyleCaffeNet" -layers { +layer { name: "data" - type: IMAGE_DATA + type: "ImageData" top: "data" top: "label" + include { + phase: TRAIN + } + transform_param { + mirror: true + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + } image_data_param { source: "data/flickr_style/train.txt" batch_size: 50 new_height: 256 new_width: 256 } - transform_param { - crop_size: 227 - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: true - } - include: { phase: TRAIN } } -layers { +layer { name: "data" - type: IMAGE_DATA + type: "ImageData" top: "data" top: "label" + include { + phase: TEST + } + transform_param { + mirror: false + crop_size: 227 + mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" + } image_data_param { source: "data/flickr_style/test.txt" batch_size: 50 new_height: 256 new_width: 256 } - transform_param { - crop_size: 227 - mean_file: "data/ilsvrc12/imagenet_mean.binaryproto" - mirror: false - } - include: { phase: TEST } } -layers { +layer { name: "conv1" - type: CONVOLUTION + type: "Convolution" bottom: "data" top: "conv1" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 96 kernel_size: 11 @@ -58,15 +66,15 @@ layers { } } } -layers { +layer { name: "relu1" - type: RELU + type: "ReLU" bottom: "conv1" top: "conv1" } -layers { +layer { name: "pool1" - type: POOLING + type: "Pooling" bottom: "conv1" top: "pool1" pooling_param { @@ -75,9 +83,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm1" - type: LRN + type: "LRN" bottom: "pool1" top: "norm1" lrn_param { @@ -86,15 +94,19 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv2" - type: CONVOLUTION + type: "Convolution" bottom: "norm1" top: "conv2" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 2 @@ -110,15 +122,15 @@ layers { } } } -layers { +layer { name: "relu2" - type: RELU + type: "ReLU" bottom: "conv2" top: "conv2" } -layers { +layer { name: "pool2" - type: POOLING + type: "Pooling" bottom: "conv2" top: "pool2" pooling_param { @@ -127,9 +139,9 @@ layers { stride: 2 } } -layers { +layer { name: "norm2" - type: LRN + type: "LRN" bottom: "pool2" top: "norm2" lrn_param { @@ -138,15 +150,19 @@ layers { beta: 0.75 } } -layers { +layer { name: "conv3" - type: CONVOLUTION + type: "Convolution" bottom: "norm2" top: "conv3" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -161,21 +177,25 @@ layers { } } } -layers { +layer { name: "relu3" - type: RELU + type: "ReLU" bottom: "conv3" top: "conv3" } -layers { +layer { name: "conv4" - type: CONVOLUTION + type: "Convolution" bottom: "conv3" top: "conv4" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 384 pad: 1 @@ -191,21 +211,25 @@ layers { } } } -layers { +layer { name: "relu4" - type: RELU + type: "ReLU" bottom: "conv4" top: "conv4" } -layers { +layer { name: "conv5" - type: CONVOLUTION + type: "Convolution" bottom: "conv4" top: "conv5" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } convolution_param { num_output: 256 pad: 1 @@ -221,15 +245,15 @@ layers { } } } -layers { +layer { name: "relu5" - type: RELU + type: "ReLU" bottom: "conv5" top: "conv5" } -layers { +layer { name: "pool5" - type: POOLING + type: "Pooling" bottom: "conv5" top: "pool5" pooling_param { @@ -238,15 +262,19 @@ layers { stride: 2 } } -layers { +layer { name: "fc6" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "pool5" top: "fc6" - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 weight_filler { @@ -259,31 +287,35 @@ layers { } } } -layers { +layer { name: "relu6" - type: RELU + type: "ReLU" bottom: "fc6" top: "fc6" } -layers { +layer { name: "drop6" - type: DROPOUT + type: "Dropout" bottom: "fc6" top: "fc6" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc7" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc6" top: "fc7" - # Note that blobs_lr can be set to 0 to disable any fine-tuning of this, and any other, layer - blobs_lr: 1 - blobs_lr: 2 - weight_decay: 1 - weight_decay: 0 + # Note that lr_mult can be set to 0 to disable any fine-tuning of this, and any other, layer + param { + lr_mult: 1 + decay_mult: 1 + } + param { + lr_mult: 2 + decay_mult: 0 + } inner_product_param { num_output: 4096 weight_filler { @@ -296,31 +328,35 @@ layers { } } } -layers { +layer { name: "relu7" - type: RELU + type: "ReLU" bottom: "fc7" top: "fc7" } -layers { +layer { name: "drop7" - type: DROPOUT + type: "Dropout" bottom: "fc7" top: "fc7" dropout_param { dropout_ratio: 0.5 } } -layers { +layer { name: "fc8_flickr" - type: INNER_PRODUCT + type: "InnerProduct" bottom: "fc7" top: "fc8_flickr" - # blobs_lr is set to higher than for other layers, because this layer is starting from random while the others are already trained - blobs_lr: 10 - blobs_lr: 20 - weight_decay: 1 - weight_decay: 0 + # lr_mult is set to higher than for other layers, because this layer is starting from random while the others are already trained + param { + lr_mult: 10 + decay_mult: 1 + } + param { + lr_mult: 20 + decay_mult: 0 + } inner_product_param { num_output: 20 weight_filler { @@ -333,17 +369,19 @@ layers { } } } -layers { +layer { name: "loss" - type: SOFTMAX_LOSS + type: "SoftmaxWithLoss" bottom: "fc8_flickr" bottom: "label" } -layers { +layer { name: "accuracy" - type: ACCURACY + type: "Accuracy" bottom: "fc8_flickr" bottom: "label" top: "accuracy" - include: { phase: TEST } + include { + phase: TEST + } } From e80b60fc1e64de7aacd717f70446afdd34ba6845 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 5 Feb 2015 16:41:46 -0800 Subject: [PATCH 1100/2053] die on inputs to IMAGE_DATA that fail to load It's better to know than march silently on. --- src/caffe/layers/image_data_layer.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index ef6a342c30a..136694886d0 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -118,10 +118,8 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { timer.Start(); CHECK_GT(lines_size, lines_id_); cv::Mat cv_img = ReadImageToCVMat(root_folder + lines_[lines_id_].first, - new_height, new_width, is_color); - if (!cv_img.data) { - continue; - } + new_height, new_width, is_color); + CHECK(cv_img.data) << "Could not load " << lines_[lines_id_].first; read_time += timer.MicroSeconds(); timer.Start(); // Apply transformations (mirror, crop...) to the image From 6a226970c1b2b365a165e5a8bf9aea7606815414 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 5 Feb 2015 19:28:42 -0800 Subject: [PATCH 1101/2053] fix for layer-type-str: loss_param and DECONVOLUTION type should have been included in V1LayerParameter, get upgraded --- src/caffe/proto/caffe.proto | 2 ++ src/caffe/util/upgrade_proto.cpp | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index 81fd2517dbf..c2a39a5cadf 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -719,6 +719,7 @@ message V1LayerParameter { CONTRASTIVE_LOSS = 37; CONVOLUTION = 4; DATA = 5; + DECONVOLUTION = 39; DROPOUT = 6; DUMMY_DATA = 32; EUCLIDEAN_LOSS = 7; @@ -790,6 +791,7 @@ message V1LayerParameter { optional ThresholdParameter threshold_param = 25; optional WindowDataParameter window_data_param = 20; optional TransformationParameter transform_param = 36; + optional LossParameter loss_param = 42; optional V0LayerParameter layer = 1; } diff --git a/src/caffe/util/upgrade_proto.cpp b/src/caffe/util/upgrade_proto.cpp index 258d7d3ee7d..38a06026adf 100644 --- a/src/caffe/util/upgrade_proto.cpp +++ b/src/caffe/util/upgrade_proto.cpp @@ -824,6 +824,10 @@ bool UpgradeV1LayerParameter(const V1LayerParameter& v1_layer_param, layer_param->mutable_transform_param()->CopyFrom( v1_layer_param.transform_param()); } + if (v1_layer_param.has_loss_param()) { + layer_param->mutable_loss_param()->CopyFrom( + v1_layer_param.loss_param()); + } if (v1_layer_param.has_layer()) { LOG(ERROR) << "Input NetParameter has V0 layer -- ignoring."; is_fully_compatible = false; @@ -849,6 +853,8 @@ const char* UpgradeV1LayerType(const V1LayerParameter_LayerType type) { return "ContrastiveLoss"; case V1LayerParameter_LayerType_CONVOLUTION: return "Convolution"; + case V1LayerParameter_LayerType_DECONVOLUTION: + return "Deconvolution"; case V1LayerParameter_LayerType_DATA: return "Data"; case V1LayerParameter_LayerType_DROPOUT: From 33a56e08d9a2714c2492bb7999a350636ed142be Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 6 Feb 2015 00:51:25 -0800 Subject: [PATCH 1102/2053] build with libc++ on Yosmite with CUDA 7 --- Makefile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 53c16ea4a72..81c67efeaf4 100644 --- a/Makefile +++ b/Makefile @@ -231,15 +231,18 @@ endif # OS X: # clang++ instead of g++ -# libstdc++ instead of libc++ for CUDA compatibility on 10.9 +# libstdc++ for NVCC compatibility on OS X >= 10.9 with CUDA < 7.0 ifeq ($(OSX), 1) CXX := /usr/bin/clang++ - CXXFLAGS += -stdlib=libstdc++ - LINKFLAGS += -stdlib=libstdc++ + CUDA_VERSION := $(shell $(CUDA_DIR)/bin/nvcc -V | grep -o 'release \d' | grep -o '\d') + ifeq ($(shell echo $(CUDA_VERSION) \< 7.0 | bc), 1) + CXXFLAGS += -stdlib=libstdc++ + LINKFLAGS += -stdlib=libstdc++ + endif # clang throws this warning for cuda headers WARNINGS += -Wno-unneeded-internal-declaration # gtest needs to use its own tuple to not conflict with clang - CXXFLAGS += -DGTEST_USE_OWN_TR1_TUPLE=1 + COMMON_FLAGS += -DGTEST_USE_OWN_TR1_TUPLE=1 # boost::thread is called boost_thread-mt to mark multithreading on OS X LIBRARIES += boost_thread-mt endif From 8ec095a6af69097330306eba2dcbed96c3e4b738 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 6 Feb 2015 01:37:02 -0800 Subject: [PATCH 1103/2053] reduce step size in PowerLayer gradient checks: fix #1252 The gradient checker fails on certain elements of the PowerLayer checks, but only 1-3 sometimes fail out of the 120 elements tested. This is not due to any numerical issue in the PowerLayer, but the distribution of the random inputs for the checks. boost 1.56 switched the normal distribution RNG engine from Box-Muller to Ziggurat. --- src/caffe/test/test_power_layer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/caffe/test/test_power_layer.cpp b/src/caffe/test/test_power_layer.cpp index 0d52fa1c8e2..76c9e857f36 100644 --- a/src/caffe/test/test_power_layer.cpp +++ b/src/caffe/test/test_power_layer.cpp @@ -74,7 +74,7 @@ class PowerLayerTest : public MultiDeviceTest<TypeParam> { } } } - GradientChecker<Dtype> checker(1e-2, 1e-2, 1701, 0., 0.01); + GradientChecker<Dtype> checker(1e-3, 1e-2, 1701, 0., 0.01); checker.CheckGradientEltwise(&layer, this->blob_bottom_vec_, this->blob_top_vec_); } From 4c894d0b2d37c4f5e6a82a797dc8446fb1a9fc62 Mon Sep 17 00:00:00 2001 From: Sagan Bolliger <sagan@cs.toronto.edu> Date: Fri, 6 Feb 2015 12:54:32 -0800 Subject: [PATCH 1104/2053] Added GPU implementation of SoftmaxWithLossLayer. --- include/caffe/loss_layers.hpp | 7 +- src/caffe/layers/softmax_loss_layer.cpp | 4 + src/caffe/layers/softmax_loss_layer.cu | 129 ++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 src/caffe/layers/softmax_loss_layer.cu diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index f14b9716a4a..09a5c24dde5 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -707,8 +707,8 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { /// @copydoc SoftmaxWithLossLayer virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); - // TODO(Yangqing): implement the GPU version of softmax. - + virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom, + const vector<Blob<Dtype>*>& top); /** * @brief Computes the softmax loss error gradient w.r.t. the predictions. * @@ -738,6 +738,9 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { */ virtual void Backward_cpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + /// The internal SoftmaxLayer used to map predictions to a distribution. shared_ptr<Layer<Dtype> > softmax_layer_; diff --git a/src/caffe/layers/softmax_loss_layer.cpp b/src/caffe/layers/softmax_loss_layer.cpp index bf20b6056e4..8f6a4ef7959 100644 --- a/src/caffe/layers/softmax_loss_layer.cpp +++ b/src/caffe/layers/softmax_loss_layer.cpp @@ -115,6 +115,10 @@ void SoftmaxWithLossLayer<Dtype>::Backward_cpu(const vector<Blob<Dtype>*>& top, } } +#ifdef CPU_ONLY +STUB_GPU(SoftmaxWithLossLayer); +#endif + INSTANTIATE_CLASS(SoftmaxWithLossLayer); REGISTER_LAYER_CLASS(SoftmaxWithLoss); diff --git a/src/caffe/layers/softmax_loss_layer.cu b/src/caffe/layers/softmax_loss_layer.cu new file mode 100644 index 00000000000..215d589ffee --- /dev/null +++ b/src/caffe/layers/softmax_loss_layer.cu @@ -0,0 +1,129 @@ +#include <algorithm> +#include <cfloat> +#include <vector> + +#include "caffe/layer.hpp" +#include "caffe/util/math_functions.hpp" +#include "caffe/vision_layers.hpp" + +namespace caffe { + +template <typename Dtype> +__global__ void SoftmaxLossForwardGPU(const int nthreads, + const Dtype* prob_data, const Dtype* label, Dtype* loss, + const int num, const int dim, const int spatial_dim, + const bool has_ignore_label_, const int ignore_label_, + Dtype* counts) { + CUDA_KERNEL_LOOP(index, nthreads) { + const int n = index / spatial_dim; + const int s = index % spatial_dim; + const int label_value = static_cast<int>(label[n * spatial_dim + s]); + if (has_ignore_label_ && label_value == ignore_label_) { + loss[index] = 0; + counts[index] = 0; + } else { + loss[index] = -log(max(prob_data[n * dim + label_value * spatial_dim + s], + Dtype(FLT_MIN))); + counts[index] = 1; + } + } +} + +template <typename Dtype> +void SoftmaxWithLossLayer<Dtype>::Forward_gpu( + const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { + softmax_layer_->Forward(softmax_bottom_vec_, softmax_top_vec_); + const Dtype* prob_data = prob_.gpu_data(); + const Dtype* label = bottom[1]->gpu_data(); + const int num = prob_.num(); + const int dim = prob_.count() / num; + const int spatial_dim = prob_.height() * prob_.width(); + const int nthreads = num * spatial_dim; + // Since this memory is not used for anything until it is overwritten + // on the backward pass, we use it here to avoid having to allocate new GPU + // memory to accumulate intermediate results in the kernel. + Dtype* loss_data = bottom[0]->mutable_gpu_diff(); + // Similarly, this memory is never used elsewhere, and thus we can use it + // to avoid having to allocate additional GPU memory. + Dtype* counts = prob_.mutable_gpu_diff(); + // NOLINT_NEXT_LINE(whitespace/operators) + SoftmaxLossForwardGPU<Dtype><<<CAFFE_GET_BLOCKS(nthreads), + CAFFE_CUDA_NUM_THREADS>>>(nthreads, prob_data, label, loss_data, + num, dim, spatial_dim, has_ignore_label_, ignore_label_, counts); + Dtype loss; + caffe_gpu_asum(nthreads, loss_data, &loss); + if (normalize_) { + Dtype count; + caffe_gpu_asum(nthreads, counts, &count); + loss /= count; + } else { + loss /= num; + } + top[0]->mutable_cpu_data()[0] = loss; + if (top.size() == 2) { + top[1]->ShareData(prob_); + } +} + +template <typename Dtype> +__global__ void SoftmaxLossBackwardGPU(const int nthreads, const Dtype* top, + const Dtype* label, Dtype* bottom_diff, const int num, const int dim, + const int spatial_dim, const bool has_ignore_label_, + const int ignore_label_, Dtype* counts) { + const int channels = dim / spatial_dim; + + CUDA_KERNEL_LOOP(index, nthreads) { + const int n = index / spatial_dim; + const int s = index % spatial_dim; + const int label_value = static_cast<int>(label[n * spatial_dim + s]); + + if (has_ignore_label_ && label_value == ignore_label_) { + for (int c = 0; c < channels; ++c) { + bottom_diff[n * dim + c * spatial_dim + s] = 0; + } + counts[index] = 0; + } else { + bottom_diff[n * dim + label_value * spatial_dim + s] -= 1; + counts[index] = 1; + } + } +} + +template <typename Dtype> +void SoftmaxWithLossLayer<Dtype>::Backward_gpu(const vector<Blob<Dtype>*>& top, + const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom) { + if (propagate_down[1]) { + LOG(FATAL) << this->type() + << " Layer cannot backpropagate to label inputs."; + } + if (propagate_down[0]) { + Dtype* bottom_diff = bottom[0]->mutable_gpu_diff(); + const Dtype* prob_data = prob_.gpu_data(); + const Dtype* top_data = top[0]->gpu_data(); + caffe_gpu_memcpy(prob_.count() * sizeof(Dtype), prob_data, bottom_diff); + const Dtype* label = bottom[1]->gpu_data(); + const int num = prob_.num(); + const int dim = prob_.count() / num; + const int spatial_dim = prob_.height() * prob_.width(); + const int nthreads = num * spatial_dim; + // Since this memory is never used for anything else, + // we use to to avoid allocating new GPU memory. + Dtype* counts = prob_.mutable_gpu_diff(); + // NOLINT_NEXT_LINE(whitespace/operators) + SoftmaxLossBackwardGPU<Dtype><<<CAFFE_GET_BLOCKS(nthreads), + CAFFE_CUDA_NUM_THREADS>>>(nthreads, top_data, label, bottom_diff, + num, dim, spatial_dim, has_ignore_label_, ignore_label_, counts); + const Dtype loss_weight = top[0]->cpu_diff()[0]; + if (normalize_) { + Dtype count; + caffe_gpu_asum(nthreads, counts, &count); + caffe_gpu_scal(prob_.count(), loss_weight / count, bottom_diff); + } else { + caffe_gpu_scal(prob_.count(), loss_weight / num, bottom_diff); + } + } +} + +INSTANTIATE_LAYER_GPU_FUNCS(SoftmaxWithLossLayer); + +} // namespace caffe From 67c727a70f1a17c0de80cf1b08ba434499583ac3 Mon Sep 17 00:00:00 2001 From: manuele <manuele.tamburrano@gmail.com> Date: Fri, 7 Nov 2014 20:01:33 +0100 Subject: [PATCH 1105/2053] Added opencv vector<Mat> to memory data layer with tests --- include/caffe/data_layers.hpp | 2 ++ include/caffe/data_transformer.hpp | 13 +++++++ src/caffe/data_transformer.cpp | 20 +++++++++++ src/caffe/layers/memory_data_layer.cpp | 24 +++++++++++++ src/caffe/test/test_memory_data_layer.cpp | 43 ++++++++++++++++++++++- 5 files changed, 101 insertions(+), 1 deletion(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index cdf2d18bb60..b5449b33034 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -260,6 +260,8 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { virtual inline int ExactNumTopBlobs() const { return 2; } virtual void AddDatumVector(const vector<Datum>& datum_vector); + virtual void AddMatVector(const vector<cv::Mat>& mat_vector, + const vector<int>& labels); // Reset should accept const pointers, but can't, because the memory // will be given to Blob, which is mutable diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 0cfb5dcc7a3..c5d7a229fd4 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -50,6 +50,19 @@ class DataTransformer { void Transform(const vector<Datum> & datum_vector, Blob<Dtype>* transformed_blob); + /** + * @brief Applies the transformation defined in the data layer's + * transform_param block to a vector of Mat. + * + * @param mat_vector + * A vector of Mat containing the data to be transformed. + * @param transformed_blob + * This is destination blob. It can be part of top blob's data if + * set_cpu_data() is used. See memory_layer.cpp for an example. + */ + void Transform(const vector<cv::Mat> & mat_vector, + Blob<Dtype>* transformed_blob); + /** * @brief Applies the transformation defined in the data layer's * transform_param block to a cv::Mat diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 3d2c78f8ec2..3b4fd120bff 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -173,6 +173,26 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, } } +template<typename Dtype> +void DataTransformer<Dtype>::Transform(const vector<cv::Mat> & mat_vector, + Blob<Dtype>* transformed_blob) { + const int mat_num = mat_vector.size(); + const int num = transformed_blob->num(); + const int channels = transformed_blob->channels(); + const int height = transformed_blob->height(); + const int width = transformed_blob->width(); + + CHECK_GT(mat_num, 0) << "There is no MAT to add"; + CHECK_LE(mat_num, num) << + "The size of mat_vector must be smaller than transformed_blob->num()"; + Blob<Dtype> uni_blob(1, channels, height, width); + for (int item_id = 0; item_id < mat_num; ++item_id) { + int offset = transformed_blob->offset(item_id); + uni_blob.set_cpu_data(transformed_blob->mutable_cpu_data() + offset); + Transform(mat_vector[item_id], &uni_blob); + } +} + template<typename Dtype> void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, Blob<Dtype>* transformed_blob) { diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 3272b66ac55..67990f3cb93 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -50,6 +50,30 @@ void MemoryDataLayer<Dtype>::AddDatumVector(const vector<Datum>& datum_vector) { has_new_data_ = true; } +template <typename Dtype> +void MemoryDataLayer<Dtype>::AddMatVector(const vector<cv::Mat>& mat_vector, + const vector<int>& labels) { + CHECK(!has_new_data_) << + "Can't add Mat when earlier ones haven't been consumed" + << " by the upper layers"; + size_t num = mat_vector.size(); + CHECK_GT(num, 0) << "There is no mat to add"; + CHECK_LE(num, batch_size_) << + "The number of added mat must be no greater than the batch size"; + + // Apply data transformations (mirror, scale, crop...) + this->data_transformer_.Transform(mat_vector, &added_data_); + // Copy Labels + Dtype* top_label = added_label_.mutable_cpu_data(); + for (int item_id = 0; item_id < num; ++item_id) { + top_label[item_id] = labels[item_id]; + } + // num_images == batch_size_ + Dtype* top_data = added_data_.mutable_cpu_data(); + Reset(top_data, top_label, batch_size_); + has_new_data_ = true; +} + template <typename Dtype> void MemoryDataLayer<Dtype>::Reset(Dtype* data, Dtype* labels, int n) { CHECK(data); diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index 497ab0d15e7..72b2759f2c2 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -127,7 +127,6 @@ TYPED_TEST(MemoryDataLayerTest, AddDatumVectorDefaultTransform) { const size_t count = this->channels_ * this->height_ * this->width_; size_t pixel_index = 0; for (int i = 0; i < this->batch_size_; ++i) { - LOG(ERROR) << "i " << i; datum_vector[i].set_channels(this->channels_); datum_vector[i].set_height(this->height_); datum_vector[i].set_width(this->width_); @@ -164,4 +163,46 @@ TYPED_TEST(MemoryDataLayerTest, AddDatumVectorDefaultTransform) { } } +TYPED_TEST(MemoryDataLayerTest, AddMatVectorDefaultTransform) { + typedef typename TypeParam::Dtype Dtype; + + LayerParameter param; + MemoryDataParameter* memory_data_param = param.mutable_memory_data_param(); + memory_data_param->set_batch_size(this->batch_size_); + memory_data_param->set_channels(this->channels_); + memory_data_param->set_height(this->height_); + memory_data_param->set_width(this->width_); + MemoryDataLayer<Dtype> layer(param); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + vector<cv::Mat> mat_vector(this->batch_size_); + vector<int> label_vector(this->batch_size_); + for (int i = 0; i < this->batch_size_; ++i) { + mat_vector[i] = cv::Mat(this->height_, this->width_, CV_8UC4); + label_vector[i] = i; + cv::randu(mat_vector[i], cv::Scalar::all(0), cv::Scalar::all(255)); + } + layer.AddMatVector(mat_vector, label_vector); + int data_index; + const size_t count = this->channels_ * this->height_ * this->width_; + for (int iter = 0; iter < 5; ++iter) { + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); + const Dtype* data = this->data_blob_->cpu_data(); + for (int i = 0; i < this->batch_size_; ++i) { + EXPECT_EQ(i, this->label_blob_->cpu_data()[i]); + for (int h = 0; h < this->height_; ++h) { + const unsigned char* ptr_mat = mat_vector[i].ptr<uchar>(h); + int index = 0; + for (int w = 0; w < this->width_; ++w) { + for (int c = 0; c < this->channels_; ++c) { + data_index = (i*count) + (c * this->height_ + h) * this->width_ + w; + Dtype pixel = static_cast<Dtype>(ptr_mat[index++]); + EXPECT_EQ(static_cast<int>(pixel), + data[data_index]); + } + } + } + } + } +} + } // namespace caffe From cedefd77625db978623fcf00ecc32d899eed954b Mon Sep 17 00:00:00 2001 From: manuele <manuele.tamburrano@gmail.com> Date: Mon, 10 Nov 2014 19:24:02 +0100 Subject: [PATCH 1106/2053] MemoryDataLayer now accepts dynamic batch_size --- include/caffe/data_layers.hpp | 1 + src/caffe/layers/memory_data_layer.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index b5449b33034..117b1b5bb9a 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -284,6 +284,7 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { Blob<Dtype> added_data_; Blob<Dtype> added_label_; bool has_new_data_; + bool needs_reshape_; }; /** diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 67990f3cb93..f36eb6f85ed 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -32,7 +32,15 @@ void MemoryDataLayer<Dtype>::AddDatumVector(const vector<Datum>& datum_vector) { CHECK(!has_new_data_) << "Can't add Datum when earlier ones haven't been consumed" << " by the upper layers"; + size_t num = datum_vector.size(); + if (batch_size_ != num) { + needs_reshape_ = true; + batch_size_ = num; + added_data_.Reshape(batch_size_, channels_, height_, width_); + added_label_.Reshape(batch_size_, 1, 1, 1); + } + CHECK_GT(num, 0) << "There is no datum to add"; CHECK_LE(num, batch_size_) << "The number of added datum must be no greater than the batch size"; @@ -53,10 +61,22 @@ void MemoryDataLayer<Dtype>::AddDatumVector(const vector<Datum>& datum_vector) { template <typename Dtype> void MemoryDataLayer<Dtype>::AddMatVector(const vector<cv::Mat>& mat_vector, const vector<int>& labels) { + CHECK(!has_new_data_) << "Can't add Mat when earlier ones haven't been consumed" << " by the upper layers"; + + CHECK_EQ(mat_vector.size(), labels.size()) << + "vector of labels and vector of mats need to be of the same size"; + size_t num = mat_vector.size(); + if (batch_size_ != num) { + needs_reshape_ = true; + batch_size_ = num; + added_data_.Reshape(batch_size_, channels_, height_, width_); + added_label_.Reshape(batch_size_, 1, 1, 1); + } + CHECK_GT(num, 0) << "There is no mat to add"; CHECK_LE(num, batch_size_) << "The number of added mat must be no greater than the batch size"; @@ -89,10 +109,15 @@ template <typename Dtype> void MemoryDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { CHECK(data_) << "MemoryDataLayer needs to be initalized by calling Reset"; + if (needs_reshape_) { + top[0]->Reshape(batch_size_, channels_, height_, width_); + top[1]->Reshape(batch_size_, 1, 1, 1); + } top[0]->set_cpu_data(data_ + pos_ * size_); top[1]->set_cpu_data(labels_ + pos_); pos_ = (pos_ + batch_size_) % n_; has_new_data_ = false; + needs_reshape_ = false; } INSTANTIATE_CLASS(MemoryDataLayer); From eb4ca169b53e53b1b288920b2bae9db0c59b4ec2 Mon Sep 17 00:00:00 2001 From: manuele <manuele.tamburrano@gmail.com> Date: Tue, 9 Dec 2014 15:12:28 +0100 Subject: [PATCH 1107/2053] MemoryDataLayer now correctly consumes batch_size elements --- include/caffe/data_layers.hpp | 1 + include/caffe/data_transformer.hpp | 3 +- src/caffe/data_transformer.cpp | 10 +- src/caffe/layers/memory_data_layer.cpp | 61 ++++++------ src/caffe/test/test_memory_data_layer.cpp | 114 +++++++++++++++++++--- 5 files changed, 140 insertions(+), 49 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 117b1b5bb9a..e8c6eecf0ed 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -266,6 +266,7 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { // Reset should accept const pointers, but can't, because the memory // will be given to Blob, which is mutable void Reset(Dtype* data, Dtype* label, int n); + void ChangeBatchSize(int new_size); int batch_size() { return batch_size_; } int channels() { return channels_; } diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index c5d7a229fd4..95062d4529d 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -60,9 +60,10 @@ class DataTransformer { * This is destination blob. It can be part of top blob's data if * set_cpu_data() is used. See memory_layer.cpp for an example. */ +#ifndef OSX void Transform(const vector<cv::Mat> & mat_vector, Blob<Dtype>* transformed_blob); - +#endif /** * @brief Applies the transformation defined in the data layer's * transform_param block to a cv::Mat diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 3b4fd120bff..3e11085e928 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -163,8 +163,8 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, const int width = transformed_blob->width(); CHECK_GT(datum_num, 0) << "There is no datum to add"; - CHECK_LE(datum_num, num) << - "The size of datum_vector must be smaller than transformed_blob->num()"; + CHECK_EQ(datum_num, num) << + "The size of datum_vector must be equals to transformed_blob->num()"; Blob<Dtype> uni_blob(1, channels, height, width); for (int item_id = 0; item_id < datum_num; ++item_id) { int offset = transformed_blob->offset(item_id); @@ -173,6 +173,7 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, } } +#ifndef OSX template<typename Dtype> void DataTransformer<Dtype>::Transform(const vector<cv::Mat> & mat_vector, Blob<Dtype>* transformed_blob) { @@ -183,8 +184,8 @@ void DataTransformer<Dtype>::Transform(const vector<cv::Mat> & mat_vector, const int width = transformed_blob->width(); CHECK_GT(mat_num, 0) << "There is no MAT to add"; - CHECK_LE(mat_num, num) << - "The size of mat_vector must be smaller than transformed_blob->num()"; + CHECK_EQ(mat_num, num) << + "The size of mat_vector must be equals to transformed_blob->num()"; Blob<Dtype> uni_blob(1, channels, height, width); for (int item_id = 0; item_id < mat_num; ++item_id) { int offset = transformed_blob->offset(item_id); @@ -192,6 +193,7 @@ void DataTransformer<Dtype>::Transform(const vector<cv::Mat> & mat_vector, Transform(mat_vector[item_id], &uni_blob); } } +#endif template<typename Dtype> void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index f36eb6f85ed..214f9d865bc 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -23,6 +23,7 @@ void MemoryDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, added_label_.Reshape(batch_size_, 1, 1, 1); data_ = NULL; labels_ = NULL; + needs_reshape_ = false; added_data_.cpu_data(); added_label_.cpu_data(); } @@ -32,19 +33,14 @@ void MemoryDataLayer<Dtype>::AddDatumVector(const vector<Datum>& datum_vector) { CHECK(!has_new_data_) << "Can't add Datum when earlier ones haven't been consumed" << " by the upper layers"; - size_t num = datum_vector.size(); - if (batch_size_ != num) { - needs_reshape_ = true; - batch_size_ = num; - added_data_.Reshape(batch_size_, channels_, height_, width_); - added_label_.Reshape(batch_size_, 1, 1, 1); - } - CHECK_GT(num, 0) << "There is no datum to add"; - CHECK_LE(num, batch_size_) << - "The number of added datum must be no greater than the batch size"; - + CHECK_LE(num % batch_size_, 0) << + "The number of added datum must be multiple of the batch size"; + if (num > batch_size_) { + added_data_.Reshape(num, channels_, height_, width_); + added_label_.Reshape(num, 1, 1, 1); + } // Apply data transformations (mirror, scale, crop...) this->data_transformer_.Transform(datum_vector, &added_data_); // Copy Labels @@ -54,33 +50,24 @@ void MemoryDataLayer<Dtype>::AddDatumVector(const vector<Datum>& datum_vector) { } // num_images == batch_size_ Dtype* top_data = added_data_.mutable_cpu_data(); - Reset(top_data, top_label, batch_size_); + Reset(top_data, top_label, num); has_new_data_ = true; } template <typename Dtype> void MemoryDataLayer<Dtype>::AddMatVector(const vector<cv::Mat>& mat_vector, const vector<int>& labels) { - + size_t num = mat_vector.size(); CHECK(!has_new_data_) << "Can't add Mat when earlier ones haven't been consumed" << " by the upper layers"; - - CHECK_EQ(mat_vector.size(), labels.size()) << - "vector of labels and vector of mats need to be of the same size"; - - size_t num = mat_vector.size(); - if (batch_size_ != num) { - needs_reshape_ = true; - batch_size_ = num; - added_data_.Reshape(batch_size_, channels_, height_, width_); - added_label_.Reshape(batch_size_, 1, 1, 1); - } - + CHECK_LE(num % batch_size_, 0) << + "The number of added datum must be multiple of the batch size"; CHECK_GT(num, 0) << "There is no mat to add"; - CHECK_LE(num, batch_size_) << - "The number of added mat must be no greater than the batch size"; - + if (num > batch_size_) { + added_data_.Reshape(num, channels_, height_, width_); + added_label_.Reshape(num, 1, 1, 1); + } // Apply data transformations (mirror, scale, crop...) this->data_transformer_.Transform(mat_vector, &added_data_); // Copy Labels @@ -90,7 +77,7 @@ void MemoryDataLayer<Dtype>::AddMatVector(const vector<cv::Mat>& mat_vector, } // num_images == batch_size_ Dtype* top_data = added_data_.mutable_cpu_data(); - Reset(top_data, top_label, batch_size_); + Reset(top_data, top_label, num); has_new_data_ = true; } @@ -105,6 +92,17 @@ void MemoryDataLayer<Dtype>::Reset(Dtype* data, Dtype* labels, int n) { pos_ = 0; } +template <typename Dtype> +void MemoryDataLayer<Dtype>::ChangeBatchSize(int new_size) { + CHECK(!has_new_data_) << + "Can't change batch_size before all data haven't been consumed" + << " by the upper layers"; + batch_size_ = new_size; + added_data_.Reshape(batch_size_, channels_, height_, width_); + added_label_.Reshape(batch_size_, 1, 1, 1); + needs_reshape_ = true; +} + template <typename Dtype> void MemoryDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { @@ -112,12 +110,13 @@ void MemoryDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, if (needs_reshape_) { top[0]->Reshape(batch_size_, channels_, height_, width_); top[1]->Reshape(batch_size_, 1, 1, 1); + needs_reshape_ = false; } top[0]->set_cpu_data(data_ + pos_ * size_); top[1]->set_cpu_data(labels_ + pos_); pos_ = (pos_ + batch_size_) % n_; - has_new_data_ = false; - needs_reshape_ = false; + if (pos_ == 0) + has_new_data_ = false; } INSTANTIATE_CLASS(MemoryDataLayer); diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index 72b2759f2c2..bc6c9b43eda 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -122,11 +122,13 @@ TYPED_TEST(MemoryDataLayerTest, AddDatumVectorDefaultTransform) { memory_data_param->set_width(this->width_); MemoryDataLayer<Dtype> layer(param); layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); - - vector<Datum> datum_vector(this->batch_size_); + // We add batch_size*num_iter items, then for each iteration + // we forward batch_size elements + int num_iter = 5; + vector<Datum> datum_vector(this->batch_size_ * num_iter); const size_t count = this->channels_ * this->height_ * this->width_; size_t pixel_index = 0; - for (int i = 0; i < this->batch_size_; ++i) { + for (int i = 0; i < this->batch_size_ * num_iter; ++i) { datum_vector[i].set_channels(this->channels_); datum_vector[i].set_height(this->height_); datum_vector[i].set_width(this->width_); @@ -137,18 +139,18 @@ TYPED_TEST(MemoryDataLayerTest, AddDatumVectorDefaultTransform) { } datum_vector[i].set_data(&(pixels[0]), count); } - layer.AddDatumVector(datum_vector); int data_index; // Go through the data 5 times - for (int iter = 0; iter < 5; ++iter) { + for (int iter = 0; iter < num_iter; ++iter) { + int offset = this->batch_size_ * iter; layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* data = this->data_blob_->cpu_data(); size_t index = 0; for (int i = 0; i < this->batch_size_; ++i) { - const string& data_string = datum_vector[i].data(); - EXPECT_EQ(i, this->label_blob_->cpu_data()[i]); + const string& data_string = datum_vector[offset + i].data(); + EXPECT_EQ(offset + i, this->label_blob_->cpu_data()[i]); for (int c = 0; c < this->channels_; ++c) { for (int h = 0; h < this->height_; ++h) { for (int w = 0; w < this->width_; ++w) { @@ -165,7 +167,52 @@ TYPED_TEST(MemoryDataLayerTest, AddDatumVectorDefaultTransform) { TYPED_TEST(MemoryDataLayerTest, AddMatVectorDefaultTransform) { typedef typename TypeParam::Dtype Dtype; + LayerParameter param; + MemoryDataParameter* memory_data_param = param.mutable_memory_data_param(); + memory_data_param->set_batch_size(this->batch_size_); + memory_data_param->set_channels(this->channels_); + memory_data_param->set_height(this->height_); + memory_data_param->set_width(this->width_); + MemoryDataLayer<Dtype> layer(param); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + // We add batch_size*num_iter items, then for each iteration + // we forward batch_size elements + int num_iter = 5; + vector<cv::Mat> mat_vector(this->batch_size_ * num_iter); + vector<int> label_vector(this->batch_size_ * num_iter); + for (int i = 0; i < this->batch_size_*num_iter; ++i) { + mat_vector[i] = cv::Mat(this->height_, this->width_, CV_8UC4); + label_vector[i] = i; + cv::randu(mat_vector[i], cv::Scalar::all(0), cv::Scalar::all(255)); + } + layer.AddMatVector(mat_vector, label_vector); + int data_index; + const size_t count = this->channels_ * this->height_ * this->width_; + for (int iter = 0; iter < num_iter; ++iter) { + int offset = this->batch_size_ * iter; + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); + const Dtype* data = this->data_blob_->cpu_data(); + for (int i = 0; i < this->batch_size_; ++i) { + EXPECT_EQ(offset + i, this->label_blob_->cpu_data()[i]); + for (int h = 0; h < this->height_; ++h) { + const unsigned char* ptr_mat = mat_vector[offset + i].ptr<uchar>(h); + int index = 0; + for (int w = 0; w < this->width_; ++w) { + for (int c = 0; c < this->channels_; ++c) { + data_index = (i*count) + (c * this->height_ + h) * this->width_ + w; + Dtype pixel = static_cast<Dtype>(ptr_mat[index++]); + EXPECT_EQ(static_cast<int>(pixel), + data[data_index]); + } + } + } + } + } +} + +TYPED_TEST(MemoryDataLayerTest, TestChangeBatchSize) { + typedef typename TypeParam::Dtype Dtype; LayerParameter param; MemoryDataParameter* memory_data_param = param.mutable_memory_data_param(); memory_data_param->set_batch_size(this->batch_size_); @@ -174,23 +221,64 @@ TYPED_TEST(MemoryDataLayerTest, AddMatVectorDefaultTransform) { memory_data_param->set_width(this->width_); MemoryDataLayer<Dtype> layer(param); layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); - vector<cv::Mat> mat_vector(this->batch_size_); - vector<int> label_vector(this->batch_size_); - for (int i = 0; i < this->batch_size_; ++i) { + // first add data as usual + int num_iter = 5; + vector<cv::Mat> mat_vector(this->batch_size_ * num_iter); + vector<int> label_vector(this->batch_size_ * num_iter); + for (int i = 0; i < this->batch_size_*num_iter; ++i) { mat_vector[i] = cv::Mat(this->height_, this->width_, CV_8UC4); label_vector[i] = i; cv::randu(mat_vector[i], cv::Scalar::all(0), cv::Scalar::all(255)); } layer.AddMatVector(mat_vector, label_vector); + // then consume the data int data_index; const size_t count = this->channels_ * this->height_ * this->width_; - for (int iter = 0; iter < 5; ++iter) { + for (int iter = 0; iter < num_iter; ++iter) { + int offset = this->batch_size_ * iter; layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); const Dtype* data = this->data_blob_->cpu_data(); for (int i = 0; i < this->batch_size_; ++i) { - EXPECT_EQ(i, this->label_blob_->cpu_data()[i]); + EXPECT_EQ(offset + i, this->label_blob_->cpu_data()[i]); + for (int h = 0; h < this->height_; ++h) { + const unsigned char* ptr_mat = mat_vector[offset + i].ptr<uchar>(h); + int index = 0; + for (int w = 0; w < this->width_; ++w) { + for (int c = 0; c < this->channels_; ++c) { + data_index = (i*count) + (c * this->height_ + h) * this->width_ + w; + Dtype pixel = static_cast<Dtype>(ptr_mat[index++]); + EXPECT_EQ(static_cast<int>(pixel), + data[data_index]); + } + } + } + } + } + // and then add new data with different batch_size + int new_batch_size = 16; + layer.ChangeBatchSize(new_batch_size); + mat_vector.clear(); + mat_vector.resize(new_batch_size * num_iter); + label_vector.clear(); + label_vector.resize(new_batch_size * num_iter); + for (int i = 0; i < new_batch_size*num_iter; ++i) { + mat_vector[i] = cv::Mat(this->height_, this->width_, CV_8UC4); + label_vector[i] = i; + cv::randu(mat_vector[i], cv::Scalar::all(0), cv::Scalar::all(255)); + } + layer.AddMatVector(mat_vector, label_vector); + + // finally consume new data and check if everything is fine + for (int iter = 0; iter < num_iter; ++iter) { + int offset = new_batch_size * iter; + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); + EXPECT_EQ(new_batch_size, this->blob_top_vec_[0]->num()); + EXPECT_EQ(new_batch_size, this->blob_top_vec_[1]->num()); + const Dtype* data = this->data_blob_->cpu_data(); + for (int i = 0; i < new_batch_size; ++i) { + EXPECT_EQ(offset + i, this->label_blob_->cpu_data()[i]); for (int h = 0; h < this->height_; ++h) { - const unsigned char* ptr_mat = mat_vector[i].ptr<uchar>(h); + const unsigned char* ptr_mat = mat_vector[offset + i].ptr<uchar>(h); int index = 0; for (int w = 0; w < this->width_; ++w) { for (int c = 0; c < this->channels_; ++c) { From 4901f830c3b90f77f9bd699930f2b9830cbc3b11 Mon Sep 17 00:00:00 2001 From: manuele <manuele.tamburrano@gmail.com> Date: Thu, 8 Jan 2015 19:26:20 +0100 Subject: [PATCH 1108/2053] small fixes --- src/caffe/layers/memory_data_layer.cpp | 16 ++++++---------- src/caffe/test/test_memory_data_layer.cpp | 6 ++---- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 214f9d865bc..73b9f49115a 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -35,12 +35,10 @@ void MemoryDataLayer<Dtype>::AddDatumVector(const vector<Datum>& datum_vector) { << " by the upper layers"; size_t num = datum_vector.size(); CHECK_GT(num, 0) << "There is no datum to add"; - CHECK_LE(num % batch_size_, 0) << + CHECK_EQ(num % batch_size_, 0) << "The number of added datum must be multiple of the batch size"; - if (num > batch_size_) { - added_data_.Reshape(num, channels_, height_, width_); - added_label_.Reshape(num, 1, 1, 1); - } + added_data_.Reshape(num, channels_, height_, width_); + added_label_.Reshape(num, 1, 1, 1); // Apply data transformations (mirror, scale, crop...) this->data_transformer_.Transform(datum_vector, &added_data_); // Copy Labels @@ -61,13 +59,11 @@ void MemoryDataLayer<Dtype>::AddMatVector(const vector<cv::Mat>& mat_vector, CHECK(!has_new_data_) << "Can't add Mat when earlier ones haven't been consumed" << " by the upper layers"; - CHECK_LE(num % batch_size_, 0) << + CHECK_EQ(num % batch_size_, 0) << "The number of added datum must be multiple of the batch size"; CHECK_GT(num, 0) << "There is no mat to add"; - if (num > batch_size_) { - added_data_.Reshape(num, channels_, height_, width_); - added_label_.Reshape(num, 1, 1, 1); - } + added_data_.Reshape(num, channels_, height_, width_); + added_label_.Reshape(num, 1, 1, 1); // Apply data transformations (mirror, scale, crop...) this->data_transformer_.Transform(mat_vector, &added_data_); // Copy Labels diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index bc6c9b43eda..d4d57102516 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -247,8 +247,7 @@ TYPED_TEST(MemoryDataLayerTest, TestChangeBatchSize) { for (int c = 0; c < this->channels_; ++c) { data_index = (i*count) + (c * this->height_ + h) * this->width_ + w; Dtype pixel = static_cast<Dtype>(ptr_mat[index++]); - EXPECT_EQ(static_cast<int>(pixel), - data[data_index]); + EXPECT_EQ(static_cast<int>(pixel), data[data_index]); } } } @@ -284,8 +283,7 @@ TYPED_TEST(MemoryDataLayerTest, TestChangeBatchSize) { for (int c = 0; c < this->channels_; ++c) { data_index = (i*count) + (c * this->height_ + h) * this->width_ + w; Dtype pixel = static_cast<Dtype>(ptr_mat[index++]); - EXPECT_EQ(static_cast<int>(pixel), - data[data_index]); + EXPECT_EQ(static_cast<int>(pixel), data[data_index]); } } } From abe0fa2602ca1c185eff0580f4f317d970421631 Mon Sep 17 00:00:00 2001 From: manuele <manuele.tamburrano@gmail.com> Date: Mon, 12 Jan 2015 12:22:49 +0100 Subject: [PATCH 1109/2053] removed needs_reshape_ and ChangeBatchSize is now set_batch_size --- include/caffe/data_layers.hpp | 3 +-- src/caffe/layers/memory_data_layer.cpp | 11 +++-------- src/caffe/test/test_memory_data_layer.cpp | 4 ++-- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index e8c6eecf0ed..1542af7c327 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -266,7 +266,7 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { // Reset should accept const pointers, but can't, because the memory // will be given to Blob, which is mutable void Reset(Dtype* data, Dtype* label, int n); - void ChangeBatchSize(int new_size); + void set_batch_size(int new_size); int batch_size() { return batch_size_; } int channels() { return channels_; } @@ -285,7 +285,6 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { Blob<Dtype> added_data_; Blob<Dtype> added_label_; bool has_new_data_; - bool needs_reshape_; }; /** diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 73b9f49115a..1669db393e0 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -23,7 +23,6 @@ void MemoryDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, added_label_.Reshape(batch_size_, 1, 1, 1); data_ = NULL; labels_ = NULL; - needs_reshape_ = false; added_data_.cpu_data(); added_label_.cpu_data(); } @@ -89,25 +88,21 @@ void MemoryDataLayer<Dtype>::Reset(Dtype* data, Dtype* labels, int n) { } template <typename Dtype> -void MemoryDataLayer<Dtype>::ChangeBatchSize(int new_size) { +void MemoryDataLayer<Dtype>::set_batch_size(int new_size) { CHECK(!has_new_data_) << "Can't change batch_size before all data haven't been consumed" << " by the upper layers"; batch_size_ = new_size; added_data_.Reshape(batch_size_, channels_, height_, width_); added_label_.Reshape(batch_size_, 1, 1, 1); - needs_reshape_ = true; } template <typename Dtype> void MemoryDataLayer<Dtype>::Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { CHECK(data_) << "MemoryDataLayer needs to be initalized by calling Reset"; - if (needs_reshape_) { - top[0]->Reshape(batch_size_, channels_, height_, width_); - top[1]->Reshape(batch_size_, 1, 1, 1); - needs_reshape_ = false; - } + top[0]->Reshape(batch_size_, channels_, height_, width_); + top[1]->Reshape(batch_size_, 1, 1, 1); top[0]->set_cpu_data(data_ + pos_ * size_); top[1]->set_cpu_data(labels_ + pos_); pos_ = (pos_ + batch_size_) % n_; diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index d4d57102516..6a7bf045d23 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -211,7 +211,7 @@ TYPED_TEST(MemoryDataLayerTest, AddMatVectorDefaultTransform) { } } -TYPED_TEST(MemoryDataLayerTest, TestChangeBatchSize) { +TYPED_TEST(MemoryDataLayerTest, TestSetBatchSize) { typedef typename TypeParam::Dtype Dtype; LayerParameter param; MemoryDataParameter* memory_data_param = param.mutable_memory_data_param(); @@ -255,7 +255,7 @@ TYPED_TEST(MemoryDataLayerTest, TestChangeBatchSize) { } // and then add new data with different batch_size int new_batch_size = 16; - layer.ChangeBatchSize(new_batch_size); + layer.set_batch_size(new_batch_size); mat_vector.clear(); mat_vector.resize(new_batch_size * num_iter); label_vector.clear(); From a2fbea3c5ae1b2e9f1fec77c8450c10c33d5b29b Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 6 Feb 2015 21:37:54 -0800 Subject: [PATCH 1110/2053] groom #1416 - keep current `DataTransformer` check so that datums can be transformed into a blob incrementally - standardize check messages - include opencv where needed, drop unneeded OS X guards TODO these tests need to be de-duped --- include/caffe/data_transformer.hpp | 4 +--- src/caffe/data_transformer.cpp | 6 ++---- src/caffe/layers/memory_data_layer.cpp | 19 +++++++++---------- src/caffe/test/test_memory_data_layer.cpp | 2 ++ 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/include/caffe/data_transformer.hpp b/include/caffe/data_transformer.hpp index 95062d4529d..60696c96dcc 100644 --- a/include/caffe/data_transformer.hpp +++ b/include/caffe/data_transformer.hpp @@ -60,10 +60,8 @@ class DataTransformer { * This is destination blob. It can be part of top blob's data if * set_cpu_data() is used. See memory_layer.cpp for an example. */ -#ifndef OSX void Transform(const vector<cv::Mat> & mat_vector, Blob<Dtype>* transformed_blob); -#endif /** * @brief Applies the transformation defined in the data layer's * transform_param block to a cv::Mat @@ -92,7 +90,7 @@ class DataTransformer { protected: /** * @brief Generates a random integer from Uniform({0, 1, ..., n-1}). - * + * * @param n * The upperbound (exclusive) value of the random number. * @return diff --git a/src/caffe/data_transformer.cpp b/src/caffe/data_transformer.cpp index 3e11085e928..c0ad72ee67d 100644 --- a/src/caffe/data_transformer.cpp +++ b/src/caffe/data_transformer.cpp @@ -163,8 +163,8 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, const int width = transformed_blob->width(); CHECK_GT(datum_num, 0) << "There is no datum to add"; - CHECK_EQ(datum_num, num) << - "The size of datum_vector must be equals to transformed_blob->num()"; + CHECK_LE(datum_num, num) << + "The size of datum_vector must be no greater than transformed_blob->num()"; Blob<Dtype> uni_blob(1, channels, height, width); for (int item_id = 0; item_id < datum_num; ++item_id) { int offset = transformed_blob->offset(item_id); @@ -173,7 +173,6 @@ void DataTransformer<Dtype>::Transform(const vector<Datum> & datum_vector, } } -#ifndef OSX template<typename Dtype> void DataTransformer<Dtype>::Transform(const vector<cv::Mat> & mat_vector, Blob<Dtype>* transformed_blob) { @@ -193,7 +192,6 @@ void DataTransformer<Dtype>::Transform(const vector<cv::Mat> & mat_vector, Transform(mat_vector[item_id], &uni_blob); } } -#endif template<typename Dtype> void DataTransformer<Dtype>::Transform(const cv::Mat& cv_img, diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 1669db393e0..7cb5eafab02 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -1,3 +1,5 @@ +#include <opencv2/core/core.hpp> + #include <vector> #include "caffe/data_layers.hpp" @@ -30,12 +32,11 @@ void MemoryDataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> void MemoryDataLayer<Dtype>::AddDatumVector(const vector<Datum>& datum_vector) { CHECK(!has_new_data_) << - "Can't add Datum when earlier ones haven't been consumed" - << " by the upper layers"; + "Can't add data until current data has been consumed."; size_t num = datum_vector.size(); - CHECK_GT(num, 0) << "There is no datum to add"; + CHECK_GT(num, 0) << "There is no datum to add."; CHECK_EQ(num % batch_size_, 0) << - "The number of added datum must be multiple of the batch size"; + "The added data must be a multiple of the batch size."; added_data_.Reshape(num, channels_, height_, width_); added_label_.Reshape(num, 1, 1, 1); // Apply data transformations (mirror, scale, crop...) @@ -56,11 +57,10 @@ void MemoryDataLayer<Dtype>::AddMatVector(const vector<cv::Mat>& mat_vector, const vector<int>& labels) { size_t num = mat_vector.size(); CHECK(!has_new_data_) << - "Can't add Mat when earlier ones haven't been consumed" - << " by the upper layers"; - CHECK_EQ(num % batch_size_, 0) << - "The number of added datum must be multiple of the batch size"; + "Can't add mat until current data has been consumed."; CHECK_GT(num, 0) << "There is no mat to add"; + CHECK_EQ(num % batch_size_, 0) << + "The added data must be a multiple of the batch size."; added_data_.Reshape(num, channels_, height_, width_); added_label_.Reshape(num, 1, 1, 1); // Apply data transformations (mirror, scale, crop...) @@ -90,8 +90,7 @@ void MemoryDataLayer<Dtype>::Reset(Dtype* data, Dtype* labels, int n) { template <typename Dtype> void MemoryDataLayer<Dtype>::set_batch_size(int new_size) { CHECK(!has_new_data_) << - "Can't change batch_size before all data haven't been consumed" - << " by the upper layers"; + "Can't change batch_size until current data has been consumed."; batch_size_ = new_size; added_data_.Reshape(batch_size_, channels_, height_, width_); added_label_.Reshape(batch_size_, 1, 1, 1); diff --git a/src/caffe/test/test_memory_data_layer.cpp b/src/caffe/test/test_memory_data_layer.cpp index 6a7bf045d23..a79033f59f1 100644 --- a/src/caffe/test/test_memory_data_layer.cpp +++ b/src/caffe/test/test_memory_data_layer.cpp @@ -1,3 +1,5 @@ +#include <opencv2/core/core.hpp> + #include <string> #include <vector> From d12101edb4dcd2cdb38a2b7f7dbc011ff8887d02 Mon Sep 17 00:00:00 2001 From: Dmitry Ulyanov <dmitry.ulyanov.msu@gmail.com> Date: Fri, 6 Feb 2015 10:56:47 +0300 Subject: [PATCH 1111/2053] Allow using arrays with n_ * size_ > 2^31 uint64_t size_t --- include/caffe/data_layers.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/caffe/data_layers.hpp b/include/caffe/data_layers.hpp index 1542af7c327..e0d5a8aca46 100644 --- a/include/caffe/data_layers.hpp +++ b/include/caffe/data_layers.hpp @@ -281,7 +281,7 @@ class MemoryDataLayer : public BaseDataLayer<Dtype> { Dtype* data_; Dtype* labels_; int n_; - int pos_; + size_t pos_; Blob<Dtype> added_data_; Blob<Dtype> added_label_; bool has_new_data_; From 56846e6dc2336c3856c98447dd89c20fc66d7faa Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Fri, 6 Feb 2015 23:12:33 -0800 Subject: [PATCH 1112/2053] HDF5_DATA + MEMORY_DATA refuse loudly to transform These layers are meant for generic inputs so they do not do transformations. As `transform_param` was pulled out of data layers' proto definitions for reuse, these layers silently ignored transformation parameters until now instead of signalling their refusal. --- src/caffe/layers/hdf5_data_layer.cpp | 3 +++ src/caffe/layers/memory_data_layer.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/caffe/layers/hdf5_data_layer.cpp b/src/caffe/layers/hdf5_data_layer.cpp index 77555211082..3d856ec3001 100644 --- a/src/caffe/layers/hdf5_data_layer.cpp +++ b/src/caffe/layers/hdf5_data_layer.cpp @@ -58,6 +58,9 @@ void HDF5DataLayer<Dtype>::LoadHDF5FileData(const char* filename) { template <typename Dtype> void HDF5DataLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { + // Refuse transformation parameters since HDF5 is totally generic. + CHECK(!this->layer_param_.has_transform_param()) << + this->type() << " does not transform data."; // Read the source to parse the filenames. const string& source = this->layer_param_.hdf5_data_param().source(); LOG(INFO) << "Loading list of HDF5 filenames from: " << source; diff --git a/src/caffe/layers/memory_data_layer.cpp b/src/caffe/layers/memory_data_layer.cpp index 7cb5eafab02..6f584de32d0 100644 --- a/src/caffe/layers/memory_data_layer.cpp +++ b/src/caffe/layers/memory_data_layer.cpp @@ -81,6 +81,9 @@ void MemoryDataLayer<Dtype>::Reset(Dtype* data, Dtype* labels, int n) { CHECK(data); CHECK(labels); CHECK_EQ(n % batch_size_, 0) << "n must be a multiple of batch size"; + // Refuse transformation parameters since a memory array is totally generic. + CHECK(!this->layer_param_.has_transform_param()) << + this->type() << " does not transform data."; data_ = data; labels_ = labels; n_ = n; From 8821c28aa9af399454584e90c9addce75e38b6d2 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 9 Feb 2015 18:08:50 -0800 Subject: [PATCH 1113/2053] Fixes for CuDNN layers: only destroy handles if setup --- include/caffe/common_layers.hpp | 3 ++- include/caffe/neuron_layers.hpp | 9 ++++++--- include/caffe/vision_layers.hpp | 6 ++++-- src/caffe/layers/cudnn_conv_layer.cpp | 5 +++++ src/caffe/layers/cudnn_pooling_layer.cpp | 4 ++++ src/caffe/layers/cudnn_relu_layer.cpp | 4 ++++ src/caffe/layers/cudnn_sigmoid_layer.cpp | 4 ++++ src/caffe/layers/cudnn_softmax_layer.cpp | 4 ++++ src/caffe/layers/cudnn_tanh_layer.cpp | 4 ++++ 9 files changed, 37 insertions(+), 6 deletions(-) diff --git a/include/caffe/common_layers.hpp b/include/caffe/common_layers.hpp index 3a5ccd2180e..c67822c3738 100644 --- a/include/caffe/common_layers.hpp +++ b/include/caffe/common_layers.hpp @@ -377,7 +377,7 @@ template <typename Dtype> class CuDNNSoftmaxLayer : public SoftmaxLayer<Dtype> { public: explicit CuDNNSoftmaxLayer(const LayerParameter& param) - : SoftmaxLayer<Dtype>(param) {} + : SoftmaxLayer<Dtype>(param), handles_setup_(false) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, @@ -390,6 +390,7 @@ class CuDNNSoftmaxLayer : public SoftmaxLayer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + bool handles_setup_; cudnnHandle_t handle_; cudnnTensor4dDescriptor_t bottom_desc_; cudnnTensor4dDescriptor_t top_desc_; diff --git a/include/caffe/neuron_layers.hpp b/include/caffe/neuron_layers.hpp index b65d98435bc..46c84171b9c 100644 --- a/include/caffe/neuron_layers.hpp +++ b/include/caffe/neuron_layers.hpp @@ -417,7 +417,7 @@ template <typename Dtype> class CuDNNReLULayer : public ReLULayer<Dtype> { public: explicit CuDNNReLULayer(const LayerParameter& param) - : ReLULayer<Dtype>(param) {} + : ReLULayer<Dtype>(param), handles_setup_(false) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, @@ -430,6 +430,7 @@ class CuDNNReLULayer : public ReLULayer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + bool handles_setup_; cudnnHandle_t handle_; cudnnTensor4dDescriptor_t bottom_desc_; cudnnTensor4dDescriptor_t top_desc_; @@ -499,7 +500,7 @@ template <typename Dtype> class CuDNNSigmoidLayer : public SigmoidLayer<Dtype> { public: explicit CuDNNSigmoidLayer(const LayerParameter& param) - : SigmoidLayer<Dtype>(param) {} + : SigmoidLayer<Dtype>(param), handles_setup_(false) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, @@ -512,6 +513,7 @@ class CuDNNSigmoidLayer : public SigmoidLayer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + bool handles_setup_; cudnnHandle_t handle_; cudnnTensor4dDescriptor_t bottom_desc_; cudnnTensor4dDescriptor_t top_desc_; @@ -583,7 +585,7 @@ template <typename Dtype> class CuDNNTanHLayer : public TanHLayer<Dtype> { public: explicit CuDNNTanHLayer(const LayerParameter& param) - : TanHLayer<Dtype>(param) {} + : TanHLayer<Dtype>(param), handles_setup_(false) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, @@ -596,6 +598,7 @@ class CuDNNTanHLayer : public TanHLayer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + bool handles_setup_; cudnnHandle_t handle_; cudnnTensor4dDescriptor_t bottom_desc_; cudnnTensor4dDescriptor_t top_desc_; diff --git a/include/caffe/vision_layers.hpp b/include/caffe/vision_layers.hpp index 38e369c4092..6cb507a5780 100644 --- a/include/caffe/vision_layers.hpp +++ b/include/caffe/vision_layers.hpp @@ -230,7 +230,7 @@ template <typename Dtype> class CuDNNConvolutionLayer : public ConvolutionLayer<Dtype> { public: explicit CuDNNConvolutionLayer(const LayerParameter& param) - : ConvolutionLayer<Dtype>(param) {} + : ConvolutionLayer<Dtype>(param), handles_setup_(false) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, @@ -243,6 +243,7 @@ class CuDNNConvolutionLayer : public ConvolutionLayer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + bool handles_setup_; cudnnHandle_t* handle_; cudaStream_t* stream_; vector<cudnnTensor4dDescriptor_t> bottom_descs_, top_descs_; @@ -426,7 +427,7 @@ template <typename Dtype> class CuDNNPoolingLayer : public PoolingLayer<Dtype> { public: explicit CuDNNPoolingLayer(const LayerParameter& param) - : PoolingLayer<Dtype>(param) {} + : PoolingLayer<Dtype>(param), handles_setup_(false) {} virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top); virtual void Reshape(const vector<Blob<Dtype>*>& bottom, @@ -442,6 +443,7 @@ class CuDNNPoolingLayer : public PoolingLayer<Dtype> { virtual void Backward_gpu(const vector<Blob<Dtype>*>& top, const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom); + bool handles_setup_; cudnnHandle_t handle_; cudnnTensor4dDescriptor_t bottom_desc_, top_desc_; cudnnPoolingDescriptor_t pooling_desc_; diff --git a/src/caffe/layers/cudnn_conv_layer.cpp b/src/caffe/layers/cudnn_conv_layer.cpp index f74a3dbb02f..4a69ca20d0a 100644 --- a/src/caffe/layers/cudnn_conv_layer.cpp +++ b/src/caffe/layers/cudnn_conv_layer.cpp @@ -58,6 +58,8 @@ void CuDNNConvolutionLayer<Dtype>::LayerSetUp( if (this->bias_term_) { cudnn::createTensor4dDesc<Dtype>(&bias_desc_); } + + handles_setup_ = true; } template <typename Dtype> @@ -98,6 +100,9 @@ void CuDNNConvolutionLayer<Dtype>::Reshape( template <typename Dtype> CuDNNConvolutionLayer<Dtype>::~CuDNNConvolutionLayer() { + // Check that handles have been setup before destroying. + if (!handles_setup_) { return; } + for (int i = 0; i < bottom_descs_.size(); i++) { cudnnDestroyTensor4dDescriptor(bottom_descs_[i]); cudnnDestroyTensor4dDescriptor(top_descs_[i]); diff --git a/src/caffe/layers/cudnn_pooling_layer.cpp b/src/caffe/layers/cudnn_pooling_layer.cpp index fc0222ac0e3..dd90195637b 100644 --- a/src/caffe/layers/cudnn_pooling_layer.cpp +++ b/src/caffe/layers/cudnn_pooling_layer.cpp @@ -22,6 +22,7 @@ void CuDNNPoolingLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, cudnn::createPoolingDesc<Dtype>(&pooling_desc_, this->layer_param_.pooling_param().pool(), &mode_, this->kernel_h_, this->kernel_w_, this->stride_h_, this->stride_w_); + handles_setup_ = true; } template <typename Dtype> @@ -36,6 +37,9 @@ void CuDNNPoolingLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> CuDNNPoolingLayer<Dtype>::~CuDNNPoolingLayer() { + // Check that handles have been setup before destroying. + if (!handles_setup_) { return; } + cudnnDestroyTensor4dDescriptor(bottom_desc_); cudnnDestroyTensor4dDescriptor(top_desc_); cudnnDestroyPoolingDescriptor(pooling_desc_); diff --git a/src/caffe/layers/cudnn_relu_layer.cpp b/src/caffe/layers/cudnn_relu_layer.cpp index 20f486f6bcf..0b8a6bc3248 100644 --- a/src/caffe/layers/cudnn_relu_layer.cpp +++ b/src/caffe/layers/cudnn_relu_layer.cpp @@ -15,6 +15,7 @@ void CuDNNReLULayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CUDNN_CHECK(cudnnCreate(&handle_)); cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); cudnn::createTensor4dDesc<Dtype>(&top_desc_); + handles_setup_ = true; } template <typename Dtype> @@ -31,6 +32,9 @@ void CuDNNReLULayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> CuDNNReLULayer<Dtype>::~CuDNNReLULayer() { + // Check that handles have been setup before destroying. + if (!handles_setup_) { return; } + cudnnDestroyTensor4dDescriptor(this->bottom_desc_); cudnnDestroyTensor4dDescriptor(this->top_desc_); cudnnDestroy(this->handle_); diff --git a/src/caffe/layers/cudnn_sigmoid_layer.cpp b/src/caffe/layers/cudnn_sigmoid_layer.cpp index a94c0040a28..67bd9c373b0 100644 --- a/src/caffe/layers/cudnn_sigmoid_layer.cpp +++ b/src/caffe/layers/cudnn_sigmoid_layer.cpp @@ -15,6 +15,7 @@ void CuDNNSigmoidLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CUDNN_CHECK(cudnnCreate(&handle_)); cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); cudnn::createTensor4dDesc<Dtype>(&top_desc_); + handles_setup_ = true; } template <typename Dtype> @@ -31,6 +32,9 @@ void CuDNNSigmoidLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> CuDNNSigmoidLayer<Dtype>::~CuDNNSigmoidLayer() { + // Check that handles have been setup before destroying. + if (!handles_setup_) { return; } + cudnnDestroyTensor4dDescriptor(this->bottom_desc_); cudnnDestroyTensor4dDescriptor(this->top_desc_); cudnnDestroy(this->handle_); diff --git a/src/caffe/layers/cudnn_softmax_layer.cpp b/src/caffe/layers/cudnn_softmax_layer.cpp index 1a0f406bf38..83a5b69a626 100644 --- a/src/caffe/layers/cudnn_softmax_layer.cpp +++ b/src/caffe/layers/cudnn_softmax_layer.cpp @@ -19,6 +19,7 @@ void CuDNNSoftmaxLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CUDNN_CHECK(cudnnCreate(&handle_)); cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); cudnn::createTensor4dDesc<Dtype>(&top_desc_); + handles_setup_ = true; } template <typename Dtype> @@ -35,6 +36,9 @@ void CuDNNSoftmaxLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> CuDNNSoftmaxLayer<Dtype>::~CuDNNSoftmaxLayer() { + // Check that handles have been setup before destroying. + if (!handles_setup_) { return; } + cudnnDestroyTensor4dDescriptor(bottom_desc_); cudnnDestroyTensor4dDescriptor(top_desc_); cudnnDestroy(handle_); diff --git a/src/caffe/layers/cudnn_tanh_layer.cpp b/src/caffe/layers/cudnn_tanh_layer.cpp index 39a3e14b3c8..b1d2b86384e 100644 --- a/src/caffe/layers/cudnn_tanh_layer.cpp +++ b/src/caffe/layers/cudnn_tanh_layer.cpp @@ -15,6 +15,7 @@ void CuDNNTanHLayer<Dtype>::LayerSetUp(const vector<Blob<Dtype>*>& bottom, CUDNN_CHECK(cudnnCreate(&handle_)); cudnn::createTensor4dDesc<Dtype>(&bottom_desc_); cudnn::createTensor4dDesc<Dtype>(&top_desc_); + handles_setup_ = true; } template <typename Dtype> @@ -31,6 +32,9 @@ void CuDNNTanHLayer<Dtype>::Reshape(const vector<Blob<Dtype>*>& bottom, template <typename Dtype> CuDNNTanHLayer<Dtype>::~CuDNNTanHLayer() { + // Check that handles have been setup before destroying. + if (!handles_setup_) { return; } + cudnnDestroyTensor4dDescriptor(this->bottom_desc_); cudnnDestroyTensor4dDescriptor(this->top_desc_); cudnnDestroy(this->handle_); From 852a3c5355ba5cb7f48781f72f0e4baabf0afbea Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Thu, 5 Feb 2015 14:04:35 -0800 Subject: [PATCH 1114/2053] SoftmaxWithLossLayer fix: takes exactly 2 bottom blobs (inherited from LossLayer) --- include/caffe/loss_layers.hpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/include/caffe/loss_layers.hpp b/include/caffe/loss_layers.hpp index 09a5c24dde5..ea52f56e0f3 100644 --- a/include/caffe/loss_layers.hpp +++ b/include/caffe/loss_layers.hpp @@ -696,9 +696,6 @@ class SoftmaxWithLossLayer : public LossLayer<Dtype> { const vector<Blob<Dtype>*>& top); virtual inline const char* type() const { return "SoftmaxWithLoss"; } - virtual inline int ExactNumBottomBlobs() const { return -1; } - virtual inline int MinBottomBlobs() const { return 2; } - virtual inline int MaxBottomBlobs() const { return 3; } virtual inline int ExactNumTopBlobs() const { return -1; } virtual inline int MinTopBlobs() const { return 1; } virtual inline int MaxTopBlobs() const { return 2; } From c15d1846969ab8338561489194d787676733caa7 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 6 Oct 2014 23:45:43 -0700 Subject: [PATCH 1115/2053] Blob: add scale_{data,diff} methods and tests --- include/caffe/blob.hpp | 5 +++ src/caffe/blob.cpp | 66 ++++++++++++++++++++++++++++++++++++ src/caffe/test/test_blob.cpp | 60 +++++++++++++++++++++++++++++++- 3 files changed, 130 insertions(+), 1 deletion(-) diff --git a/include/caffe/blob.hpp b/include/caffe/blob.hpp index d425e3857e3..42e4420408c 100644 --- a/include/caffe/blob.hpp +++ b/include/caffe/blob.hpp @@ -111,6 +111,11 @@ class Blob { /// @brief Compute the sum of squares (L2 norm squared) of the diff. Dtype sumsq_diff() const; + /// @brief Scale the blob data by a constant factor. + void scale_data(Dtype scale_factor); + /// @brief Scale the blob diff by a constant factor. + void scale_diff(Dtype scale_factor); + /** * @brief Set the data_ shared_ptr to point to the SyncedMemory holding the * data_ of Blob other -- useful in Layer&s which simply perform a copy diff --git a/src/caffe/blob.cpp b/src/caffe/blob.cpp index 3b72ce0c8d0..fbc1361a19d 100644 --- a/src/caffe/blob.cpp +++ b/src/caffe/blob.cpp @@ -279,6 +279,72 @@ Dtype Blob<Dtype>::sumsq_diff() const { return sumsq; } +template <> void Blob<unsigned int>::scale_data(unsigned int scale_factor) { + NOT_IMPLEMENTED; +} + +template <> void Blob<int>::scale_data(int scale_factor) { + NOT_IMPLEMENTED; +} + +template <typename Dtype> +void Blob<Dtype>::scale_data(Dtype scale_factor) { + Dtype* data; + if (!data_) { return; } + switch (data_->head()) { + case SyncedMemory::HEAD_AT_CPU: + data = mutable_cpu_data(); + caffe_scal(count_, scale_factor, data); + return; + case SyncedMemory::HEAD_AT_GPU: + case SyncedMemory::SYNCED: +#ifndef CPU_ONLY + data = mutable_gpu_data(); + caffe_gpu_scal(count_, scale_factor, data); + return; +#else + NO_GPU; +#endif + case SyncedMemory::UNINITIALIZED: + return; + default: + LOG(FATAL) << "Unknown SyncedMemory head state: " << data_->head(); + } +} + +template <> void Blob<unsigned int>::scale_diff(unsigned int scale_factor) { + NOT_IMPLEMENTED; +} + +template <> void Blob<int>::scale_diff(int scale_factor) { + NOT_IMPLEMENTED; +} + +template <typename Dtype> +void Blob<Dtype>::scale_diff(Dtype scale_factor) { + Dtype* diff; + if (!diff_) { return; } + switch (diff_->head()) { + case SyncedMemory::HEAD_AT_CPU: + diff = mutable_cpu_diff(); + caffe_scal(count_, scale_factor, diff); + return; + case SyncedMemory::HEAD_AT_GPU: + case SyncedMemory::SYNCED: +#ifndef CPU_ONLY + diff = mutable_gpu_diff(); + caffe_gpu_scal(count_, scale_factor, diff); + return; +#else + NO_GPU; +#endif + case SyncedMemory::UNINITIALIZED: + return; + default: + LOG(FATAL) << "Unknown SyncedMemory head state: " << diff_->head(); + } +} + template <typename Dtype> void Blob<Dtype>::CopyFrom(const Blob& source, bool copy_diff, bool reshape) { if (num_ != source.num() || channels_ != source.channels() || diff --git a/src/caffe/test/test_blob.cpp b/src/caffe/test/test_blob.cpp index c619ad19f11..84d84e8f444 100644 --- a/src/caffe/test/test_blob.cpp +++ b/src/caffe/test/test_blob.cpp @@ -120,7 +120,7 @@ TYPED_TEST(BlobMathTest, TestSumOfSquares) { TYPED_TEST(BlobMathTest, TestAsum) { typedef typename TypeParam::Dtype Dtype; - // Uninitialized Blob should have sum of squares == 0. + // Uninitialized Blob should have asum == 0. EXPECT_EQ(0, this->blob_->asum_data()); EXPECT_EQ(0, this->blob_->asum_diff()); FillerParameter filler_param; @@ -167,4 +167,62 @@ TYPED_TEST(BlobMathTest, TestAsum) { EXPECT_FLOAT_EQ(expected_asum * kDiffScaleFactor, this->blob_->asum_diff()); } +TYPED_TEST(BlobMathTest, TestScaleData) { + typedef typename TypeParam::Dtype Dtype; + + EXPECT_EQ(0, this->blob_->asum_data()); + EXPECT_EQ(0, this->blob_->asum_diff()); + FillerParameter filler_param; + filler_param.set_min(-3); + filler_param.set_max(3); + UniformFiller<Dtype> filler(filler_param); + filler.Fill(this->blob_); + const Dtype asum_before_scale = this->blob_->asum_data(); + // Do a mutable access on the current device, + // so that the asum computation is done on that device. + // (Otherwise, this would only check the CPU asum implementation.) + switch (TypeParam::device) { + case Caffe::CPU: + this->blob_->mutable_cpu_data(); + break; + case Caffe::GPU: + this->blob_->mutable_gpu_data(); + break; + default: + LOG(FATAL) << "Unknown device: " << TypeParam::device; + } + const Dtype kDataScaleFactor = 3; + this->blob_->scale_data(kDataScaleFactor); + EXPECT_FLOAT_EQ(asum_before_scale * kDataScaleFactor, + this->blob_->asum_data()); + EXPECT_EQ(0, this->blob_->asum_diff()); + + // Check scale_diff too. + const Dtype kDataToDiffScaleFactor = 7; + const Dtype* data = this->blob_->cpu_data(); + caffe_cpu_scale(this->blob_->count(), kDataToDiffScaleFactor, data, + this->blob_->mutable_cpu_diff()); + EXPECT_FLOAT_EQ(asum_before_scale * kDataScaleFactor, + this->blob_->asum_data()); + const Dtype diff_asum_before_scale = this->blob_->asum_diff(); + EXPECT_FLOAT_EQ(asum_before_scale * kDataScaleFactor * kDataToDiffScaleFactor, + diff_asum_before_scale); + switch (TypeParam::device) { + case Caffe::CPU: + this->blob_->mutable_cpu_diff(); + break; + case Caffe::GPU: + this->blob_->mutable_gpu_diff(); + break; + default: + LOG(FATAL) << "Unknown device: " << TypeParam::device; + } + const Dtype kDiffScaleFactor = 3; + this->blob_->scale_diff(kDiffScaleFactor); + EXPECT_FLOAT_EQ(asum_before_scale * kDataScaleFactor, + this->blob_->asum_data()); + EXPECT_FLOAT_EQ(diff_asum_before_scale * kDiffScaleFactor, + this->blob_->asum_diff()); +} + } // namespace caffe From e2358512dd36548c0080b0f381477418134b480f Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 19 Jan 2015 14:49:39 -0800 Subject: [PATCH 1116/2053] add Net::param_owners accessor for param sharing info --- include/caffe/net.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/include/caffe/net.hpp b/include/caffe/net.hpp index 2709d87ec4e..23da5dbbf2d 100644 --- a/include/caffe/net.hpp +++ b/include/caffe/net.hpp @@ -147,6 +147,7 @@ class Net { const map<string, int>& param_names_index() const { return param_names_index_; } + inline const vector<int>& param_owners() const { return param_owners_; } /// @brief Input and output blob numbers inline int num_inputs() const { return net_input_blobs_.size(); } inline int num_outputs() const { return net_output_blobs_.size(); } From f38ddef614b386ec9074e5e9b64e96704cb3124f Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Mon, 6 Oct 2014 23:46:48 -0700 Subject: [PATCH 1117/2053] Add gradient clipping -- limit L2 norm of parameter gradients --- include/caffe/solver.hpp | 1 + src/caffe/proto/caffe.proto | 7 ++++++- src/caffe/solver.cpp | 27 +++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/include/caffe/solver.hpp b/include/caffe/solver.hpp index fde66208207..2510de748de 100644 --- a/include/caffe/solver.hpp +++ b/include/caffe/solver.hpp @@ -81,6 +81,7 @@ class SGDSolver : public Solver<Dtype> { void PreSolve(); Dtype GetLearningRate(); virtual void ComputeUpdateValue(); + virtual void ClipGradients(); virtual void SnapshotSolverState(SolverState * state); virtual void RestoreSolverState(const SolverState& state); // history maintains the historical momentum data. diff --git a/src/caffe/proto/caffe.proto b/src/caffe/proto/caffe.proto index c2a39a5cadf..8d937420eba 100644 --- a/src/caffe/proto/caffe.proto +++ b/src/caffe/proto/caffe.proto @@ -75,7 +75,7 @@ message NetParameter { // NOTE // Update the next available ID when you add a new SolverParameter field. // -// SolverParameter next available ID: 35 (last added: stepvalue) +// SolverParameter next available ID: 36 (last added: clip_gradients) message SolverParameter { ////////////////////////////////////////////////////////////////////////////// // Specifying the train and test networks @@ -140,6 +140,11 @@ message SolverParameter { optional int32 stepsize = 13; // the stepsize for learning rate policy "multistep" repeated int32 stepvalue = 34; + + // Set clip_gradients to >= 0 to clip parameter gradients to that L2 norm, + // whenever their actual L2 norm is larger. + optional float clip_gradients = 35 [default = -1]; + optional int32 snapshot = 14 [default = 0]; // The snapshot interval optional string snapshot_prefix = 15; // The prefix for the snapshot. // whether to snapshot diff in the results or not. Snapshotting diff will help diff --git a/src/caffe/solver.cpp b/src/caffe/solver.cpp index 100cb357749..9866d7cbc56 100644 --- a/src/caffe/solver.cpp +++ b/src/caffe/solver.cpp @@ -437,6 +437,30 @@ void SGDSolver<Dtype>::PreSolve() { } } +template <typename Dtype> +void SGDSolver<Dtype>::ClipGradients() { + const Dtype clip_gradients = this->param_.clip_gradients(); + if (clip_gradients < 0) { return; } + const vector<shared_ptr<Blob<Dtype> > >& net_params = this->net_->params(); + Dtype sumsq_diff = 0; + for (int i = 0; i < net_params.size(); ++i) { + if (this->net_->param_owners()[i] < 0) { + sumsq_diff += net_params[i]->sumsq_diff(); + } + } + const Dtype l2norm_diff = std::sqrt(sumsq_diff); + if (l2norm_diff > clip_gradients) { + Dtype scale_factor = clip_gradients / l2norm_diff; + LOG(INFO) << "Gradient clipping: scaling down gradients (L2 norm " + << l2norm_diff << " > " << clip_gradients << ") " + << "by scale factor " << scale_factor; + for (int i = 0; i < net_params.size(); ++i) { + if (this->net_->param_owners()[i] < 0) { + net_params[i]->scale_diff(scale_factor); + } + } + } +} template <typename Dtype> void SGDSolver<Dtype>::ComputeUpdateValue() { @@ -449,6 +473,7 @@ void SGDSolver<Dtype>::ComputeUpdateValue() { if (this->param_.display() && this->iter_ % this->param_.display() == 0) { LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate; } + ClipGradients(); Dtype momentum = this->param_.momentum(); Dtype weight_decay = this->param_.weight_decay(); string regularization_type = this->param_.regularization_type(); @@ -563,6 +588,7 @@ void NesterovSolver<Dtype>::ComputeUpdateValue() { if (this->param_.display() && this->iter_ % this->param_.display() == 0) { LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate; } + SGDSolver<Dtype>::ClipGradients(); Dtype momentum = this->param_.momentum(); Dtype weight_decay = this->param_.weight_decay(); string regularization_type = this->param_.regularization_type(); @@ -680,6 +706,7 @@ void AdaGradSolver<Dtype>::ComputeUpdateValue() { if (this->param_.display() && this->iter_ % this->param_.display() == 0) { LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate; } + SGDSolver<Dtype>::ClipGradients(); Dtype weight_decay = this->param_.weight_decay(); string regularization_type = this->param_.regularization_type(); switch (Caffe::mode()) { From 6a309c17fc386192df4780d85c92e3b36c2ce948 Mon Sep 17 00:00:00 2001 From: Jeff Donahue <jeff.donahue@gmail.com> Date: Sun, 15 Feb 2015 17:05:10 -0800 Subject: [PATCH 1118/2053] BlobMathTest: fixes for numerical precision issues --- src/caffe/test/test_blob.cpp | 53 +++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/src/caffe/test/test_blob.cpp b/src/caffe/test/test_blob.cpp index 84d84e8f444..e0678061173 100644 --- a/src/caffe/test/test_blob.cpp +++ b/src/caffe/test/test_blob.cpp @@ -59,9 +59,12 @@ class BlobMathTest : public MultiDeviceTest<TypeParam> { typedef typename TypeParam::Dtype Dtype; protected: BlobMathTest() - : blob_(new Blob<Dtype>(2, 3, 4, 5)) {} + : blob_(new Blob<Dtype>(2, 3, 4, 5)), + epsilon_(1e-6) {} + virtual ~BlobMathTest() { delete blob_; } Blob<Dtype>* const blob_; + Dtype epsilon_; }; TYPED_TEST_CASE(BlobMathTest, TestDtypesAndDevices); @@ -95,7 +98,8 @@ TYPED_TEST(BlobMathTest, TestSumOfSquares) { default: LOG(FATAL) << "Unknown device: " << TypeParam::device; } - EXPECT_FLOAT_EQ(expected_sumsq, this->blob_->sumsq_data()); + EXPECT_NEAR(expected_sumsq, this->blob_->sumsq_data(), + this->epsilon_ * expected_sumsq); EXPECT_EQ(0, this->blob_->sumsq_diff()); // Check sumsq_diff too. @@ -112,9 +116,12 @@ TYPED_TEST(BlobMathTest, TestSumOfSquares) { default: LOG(FATAL) << "Unknown device: " << TypeParam::device; } - EXPECT_FLOAT_EQ(expected_sumsq, this->blob_->sumsq_data()); - EXPECT_FLOAT_EQ(expected_sumsq * kDiffScaleFactor * kDiffScaleFactor, - this->blob_->sumsq_diff()); + EXPECT_NEAR(expected_sumsq, this->blob_->sumsq_data(), + this->epsilon_ * expected_sumsq); + const Dtype expected_sumsq_diff = + expected_sumsq * kDiffScaleFactor * kDiffScaleFactor; + EXPECT_NEAR(expected_sumsq_diff, this->blob_->sumsq_diff(), + this->epsilon_ * expected_sumsq_diff); } TYPED_TEST(BlobMathTest, TestAsum) { @@ -146,7 +153,8 @@ TYPED_TEST(BlobMathTest, TestAsum) { default: LOG(FATAL) << "Unknown device: " << TypeParam::device; } - EXPECT_FLOAT_EQ(expected_asum, this->blob_->asum_data()); + EXPECT_NEAR(expected_asum, this->blob_->asum_data(), + this->epsilon_ * expected_asum); EXPECT_EQ(0, this->blob_->asum_diff()); // Check asum_diff too. @@ -163,8 +171,11 @@ TYPED_TEST(BlobMathTest, TestAsum) { default: LOG(FATAL) << "Unknown device: " << TypeParam::device; } - EXPECT_FLOAT_EQ(expected_asum, this->blob_->asum_data()); - EXPECT_FLOAT_EQ(expected_asum * kDiffScaleFactor, this->blob_->asum_diff()); + EXPECT_NEAR(expected_asum, this->blob_->asum_data(), + this->epsilon_ * expected_asum); + const Dtype expected_diff_asum = expected_asum * kDiffScaleFactor; + EXPECT_NEAR(expected_diff_asum, this->blob_->asum_diff(), + this->epsilon_ * expected_diff_asum); } TYPED_TEST(BlobMathTest, TestScaleData) { @@ -193,8 +204,8 @@ TYPED_TEST(BlobMathTest, TestScaleData) { } const Dtype kDataScaleFactor = 3; this->blob_->scale_data(kDataScaleFactor); - EXPECT_FLOAT_EQ(asum_before_scale * kDataScaleFactor, - this->blob_->asum_data()); + EXPECT_NEAR(asum_before_scale * kDataScaleFactor, this->blob_->asum_data(), + this->epsilon_ * asum_before_scale * kDataScaleFactor); EXPECT_EQ(0, this->blob_->asum_diff()); // Check scale_diff too. @@ -202,11 +213,13 @@ TYPED_TEST(BlobMathTest, TestScaleData) { const Dtype* data = this->blob_->cpu_data(); caffe_cpu_scale(this->blob_->count(), kDataToDiffScaleFactor, data, this->blob_->mutable_cpu_diff()); - EXPECT_FLOAT_EQ(asum_before_scale * kDataScaleFactor, - this->blob_->asum_data()); - const Dtype diff_asum_before_scale = this->blob_->asum_diff(); - EXPECT_FLOAT_EQ(asum_before_scale * kDataScaleFactor * kDataToDiffScaleFactor, - diff_asum_before_scale); + const Dtype expected_asum_before_scale = asum_before_scale * kDataScaleFactor; + EXPECT_NEAR(expected_asum_before_scale, this->blob_->asum_data(), + this->epsilon_ * expected_asum_before_scale); + const Dtype expected_diff_asum_before_scale = + asum_before_scale * kDataScaleFactor * kDataToDiffScaleFactor; + EXPECT_NEAR(expected_diff_asum_before_scale, this->blob_->asum_diff(), + this->epsilon_ * expected_diff_asum_before_scale); switch (TypeParam::device) { case Caffe::CPU: this->blob_->mutable_cpu_diff(); @@ -219,10 +232,12 @@ TYPED_TEST(BlobMathTest, TestScaleData) { } const Dtype kDiffScaleFactor = 3; this->blob_->scale_diff(kDiffScaleFactor); - EXPECT_FLOAT_EQ(asum_before_scale * kDataScaleFactor, - this->blob_->asum_data()); - EXPECT_FLOAT_EQ(diff_asum_before_scale * kDiffScaleFactor, - this->blob_->asum_diff()); + EXPECT_NEAR(asum_before_scale * kDataScaleFactor, this->blob_->asum_data(), + this->epsilon_ * asum_before_scale * kDataScaleFactor); + const Dtype expected_diff_asum = + expected_diff_asum_before_scale * kDiffScaleFactor; + EXPECT_NEAR(expected_diff_asum, this->blob_->asum_diff(), + this->epsilon_ * expected_diff_asum); } } // namespace caffe From 1344d1bc51f781b593a52fa71ecd59a23dc031fe Mon Sep 17 00:00:00 2001 From: James Steven Supancic III <arrummzen@gmail.com> Date: Thu, 12 Feb 2015 13:57:25 -0800 Subject: [PATCH 1119/2053] Fix Draw Net Problem #1709 Introduced by Layer type is a string #1694 --- python/caffe/draw.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/python/caffe/draw.py b/python/caffe/draw.py index d95c193cc93..1871e7a08d7 100644 --- a/python/caffe/draw.py +++ b/python/caffe/draw.py @@ -17,13 +17,6 @@ 'style': 'filled'} BLOB_STYLE = {'shape': 'octagon', 'fillcolor': '#E0E0E0', 'style': 'filled'} -def get_enum_name_by_value(): - desc = caffe_pb2.LayerParameter.LayerType.DESCRIPTOR - d = {} - for k,v in desc.values_by_name.items(): - d[v.number] = k - return d - def get_pooling_types_dict(): """Get dictionary mapping pooling type number to type name @@ -112,10 +105,9 @@ def get_pydot_graph(caffe_net, rankdir, label_edges=True): pydot_graph = pydot.Dot(caffe_net.name, graph_type='digraph', rankdir=rankdir) pydot_nodes = {} pydot_edges = [] - d = get_enum_name_by_value() - for layer in caffe_net.layers: + for layer in caffe_net.layer: name = layer.name - layertype = d[layer.type] + layertype = layer.type node_label = determine_node_label_by_layertype(layer, layertype, rankdir) if (len(layer.bottom) == 1 and len(layer.top) == 1 and layer.bottom[0] == layer.top[0]): From 1e0d49a39d1e38c8de2a4c24ab0bff3a71da21ff Mon Sep 17 00:00:00 2001 From: Brandon Amos <bdamos@vt.edu> Date: Mon, 16 Feb 2015 15:09:24 -0500 Subject: [PATCH 1120/2053] Correct 'epochs' to 'iterations' See https://github.com/BVLC/caffe/blob/master/models/bvlc_reference_caffenet/solver.prototxt --- examples/imagenet/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/imagenet/readme.md b/examples/imagenet/readme.md index 41384f9475b..c2dd62ec963 100644 --- a/examples/imagenet/readme.md +++ b/examples/imagenet/readme.md @@ -67,7 +67,7 @@ We will also lay out a protocol buffer for running the solver. Let's make a few * We will run in batches of 256, and run a total of 450,000 iterations (about 90 epochs). * For every 1,000 iterations, we test the learned net on the validation data. * We set the initial learning rate to 0.01, and decrease it every 100,000 iterations (about 20 epochs). -* Information will be displayed every 20 epochs. +* Information will be displayed every 20 iterations. * The network will be trained with momentum 0.9 and a weight decay of 0.0005. * For every 10,000 iterations, we will take a snapshot of the current status. From 02c99fb9c7386242a9480378195539232ad7f18f Mon Sep 17 00:00:00 2001 From: Takuya Narihira <dvbscb@gmail.com> Date: Mon, 16 Feb 2015 16:06:03 -0800 Subject: [PATCH 1121/2053] Fix `draw` to support new protobuf format --- python/caffe/draw.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/caffe/draw.py b/python/caffe/draw.py index 1871e7a08d7..6a4dbd47351 100644 --- a/python/caffe/draw.py +++ b/python/caffe/draw.py @@ -32,11 +32,11 @@ def determine_edge_label_by_layertype(layer, layertype): """Define edge label based on layer type """ - if layertype == 'DATA': + if layertype == 'Data': edge_label = 'Batch ' + str(layer.data_param.batch_size) - elif layertype == 'CONVOLUTION': + elif layertype == 'Convolution': edge_label = str(layer.convolution_param.num_output) - elif layertype == 'INNER_PRODUCT': + elif layertype == 'InnerProduct': edge_label = str(layer.inner_product_param.num_output) else: edge_label = '""' @@ -57,7 +57,7 @@ def determine_node_label_by_layertype(layer, layertype, rankdir): # horizontal space is not; separate words with newlines separator = '\n' - if layertype == 'CONVOLUTION': + if layertype == 'Convolution': # Outer double quotes needed or else colon characters don't parse # properly node_label = '"%s%s(%s)%skernel size: %d%sstride: %d%spad: %d"' %\ @@ -70,7 +70,7 @@ def determine_node_label_by_layertype(layer, layertype, rankdir): layer.convolution_param.stride, separator, layer.convolution_param.pad) - elif layertype == 'POOLING': + elif layertype == 'Pooling': pooling_types_dict = get_pooling_types_dict() node_label = '"%s%s(%s %s)%skernel size: %d%sstride: %d%spad: %d"' %\ (layer.name, @@ -92,11 +92,11 @@ def choose_color_by_layertype(layertype): """Define colors for nodes based on the layer type """ color = '#6495ED' # Default - if layertype == 'CONVOLUTION': + if layertype == 'Convolution': color = '#FF5050' - elif layertype == 'POOLING': + elif layertype == 'Pooling': color = '#FF9900' - elif layertype == 'INNER_PRODUCT': + elif layertype == 'InnerProduct': color = '#CC33FF' return color From 82551adbf8c77a06fa7e8b2508e1fb24ff1b5b31 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 16 Oct 2014 22:52:30 -0700 Subject: [PATCH 1122/2053] reshape DATA + IMAGE_DATA for inputs of varying dimension To feed inputs of varying dimension, the `DATA` and `IMAGE_DATA` layer reshapes its prefetch and top blobs when the batch size is 1. The `BasePrefetchingDataLayer` always reshapes on forward. --- src/caffe/layers/base_data_layer.cpp | 3 +++ src/caffe/layers/base_data_layer.cu | 3 +++ src/caffe/layers/data_layer.cpp | 16 ++++++++++++++-- src/caffe/layers/image_data_layer.cpp | 20 ++++++++++++++++---- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/caffe/layers/base_data_layer.cpp b/src/caffe/layers/base_data_layer.cpp index eb0aaf82120..c3b9bc421ba 100644 --- a/src/caffe/layers/base_data_layer.cpp +++ b/src/caffe/layers/base_data_layer.cpp @@ -61,6 +61,9 @@ void BasePrefetchingDataLayer<Dtype>::Forward_cpu( // First, join the thread JoinPrefetchThread(); DLOG(INFO) << "Thread joined"; + // Reshape to loaded data. + top[0]->Reshape(this->prefetch_data_.num(), this->prefetch_data_.channels(), + this->prefetch_data_.height(), this->prefetch_data_.width()); // Copy the data caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), top[0]->mutable_cpu_data()); diff --git a/src/caffe/layers/base_data_layer.cu b/src/caffe/layers/base_data_layer.cu index 204a16d260a..775f6c47f7e 100644 --- a/src/caffe/layers/base_data_layer.cu +++ b/src/caffe/layers/base_data_layer.cu @@ -9,6 +9,9 @@ void BasePrefetchingDataLayer<Dtype>::Forward_gpu( const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) { // First, join the thread JoinPrefetchThread(); + // Reshape to loaded data. + top[0]->Reshape(this->prefetch_data_.num(), this->prefetch_data_.channels(), + this->prefetch_data_.height(), this->prefetch_data_.width()); // Copy the data caffe_copy(prefetch_data_.count(), prefetch_data_.cpu_data(), top[0]->mutable_gpu_data()); diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 227db201759..98ce26e9f0a 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -49,7 +49,7 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, int crop_size = this->layer_param_.transform_param().crop_size(); if (crop_size > 0) { top[0]->Reshape(this->layer_param_.data_param().batch_size(), - datum.channels(), crop_size, crop_size); + datum.channels(), crop_size, crop_size); this->prefetch_data_.Reshape(this->layer_param_.data_param().batch_size(), datum.channels(), crop_size, crop_size); this->transformed_data_.Reshape(1, datum.channels(), crop_size, crop_size); @@ -83,13 +83,25 @@ void DataLayer<Dtype>::InternalThreadEntry() { CPUTimer timer; CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); + + // Reshape on single input batches for inputs of varying dimension. + const int batch_size = this->layer_param_.data_param().batch_size(); + const int crop_size = this->layer_param_.transform_param().crop_size(); + if (batch_size == 1 && crop_size == 0) { + Datum datum; + datum.ParseFromString(cursor_->value()); + this->prefetch_data_.Reshape(1, datum.channels(), + datum.height(), datum.width()); + this->transformed_data_.Reshape(1, datum.channels(), + datum.height(), datum.width()); + } + Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); Dtype* top_label = NULL; // suppress warnings about uninitialized variables if (this->output_labels_) { top_label = this->prefetch_label_.mutable_cpu_data(); } - const int batch_size = this->layer_param_.data_param().batch_size(); for (int item_id = 0; item_id < batch_size; ++item_id) { timer.Start(); // get a blob diff --git a/src/caffe/layers/image_data_layer.cpp b/src/caffe/layers/image_data_layer.cpp index bd4b8a033c2..e98ff85a0ea 100644 --- a/src/caffe/layers/image_data_layer.cpp +++ b/src/caffe/layers/image_data_layer.cpp @@ -102,15 +102,27 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { CPUTimer timer; CHECK(this->prefetch_data_.count()); CHECK(this->transformed_data_.count()); - Dtype* top_data = this->prefetch_data_.mutable_cpu_data(); - Dtype* top_label = this->prefetch_label_.mutable_cpu_data(); ImageDataParameter image_data_param = this->layer_param_.image_data_param(); const int batch_size = image_data_param.batch_size(); const int new_height = image_data_param.new_height(); const int new_width = image_data_param.new_width(); + const int crop_size = this->layer_param_.transform_param().crop_size(); const bool is_color = image_data_param.is_color(); string root_folder = image_data_param.root_folder(); + // Reshape on single input batches for inputs of varying dimension. + if (batch_size == 1 && crop_size == 0 && new_height == 0 && new_width == 0) { + cv::Mat cv_img = ReadImageToCVMat(root_folder + lines_[lines_id_].first, + 0, 0, is_color); + this->prefetch_data_.Reshape(1, cv_img.channels(), + cv_img.rows, cv_img.cols); + this->transformed_data_.Reshape(1, cv_img.channels(), + cv_img.rows, cv_img.cols); + } + + Dtype* prefetch_data = this->prefetch_data_.mutable_cpu_data(); + Dtype* prefetch_label = this->prefetch_label_.mutable_cpu_data(); + // datum scales const int lines_size = lines_.size(); for (int item_id = 0; item_id < batch_size; ++item_id) { @@ -124,11 +136,11 @@ void ImageDataLayer<Dtype>::InternalThreadEntry() { timer.Start(); // Apply transformations (mirror, crop...) to the image int offset = this->prefetch_data_.offset(item_id); - this->transformed_data_.set_cpu_data(top_data + offset); + this->transformed_data_.set_cpu_data(prefetch_data + offset); this->data_transformer_.Transform(cv_img, &(this->transformed_data_)); trans_time += timer.MicroSeconds(); - top_label[item_id] = lines_[lines_id_].second; + prefetch_label[item_id] = lines_[lines_id_].second; // go to the next iter lines_id_++; if (lines_id_ >= lines_size) { From d3b20106c02ea17d198740a6e790d4f7901a3548 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Thu, 5 Feb 2015 16:31:52 -0800 Subject: [PATCH 1123/2053] test reshaping DATA and IMAGE_DATA --- src/caffe/test/test_data_layer.cpp | 72 ++++++++++++++++++++++++ src/caffe/test/test_image_data_layer.cpp | 39 ++++++++++++- 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/src/caffe/test/test_data_layer.cpp b/src/caffe/test/test_data_layer.cpp index 8cc31b24167..adc99dd71c9 100644 --- a/src/caffe/test/test_data_layer.cpp +++ b/src/caffe/test/test_data_layer.cpp @@ -103,6 +103,70 @@ class DataLayerTest : public MultiDeviceTest<TypeParam> { } } + void TestReshape(DataParameter_DB backend) { + const int num_inputs = 5; + // Save data of varying shapes. + LOG(INFO) << "Using temporary dataset " << *filename_; + scoped_ptr<db::DB> db(db::GetDB(backend)); + db->Open(*filename_, db::NEW); + scoped_ptr<db::Transaction> txn(db->NewTransaction()); + for (int i = 0; i < num_inputs; ++i) { + Datum datum; + datum.set_label(i); + datum.set_channels(2); + datum.set_height(i % 2 + 1); + datum.set_width(i % 4 + 1); + std::string* data = datum.mutable_data(); + const int data_size = datum.channels() * datum.height() * datum.width(); + for (int j = 0; j < data_size; ++j) { + data->push_back(static_cast<uint8_t>(j)); + } + stringstream ss; + ss << i; + string out; + CHECK(datum.SerializeToString(&out)); + txn->Put(ss.str(), out); + } + txn->Commit(); + db->Close(); + + // Load and check data of various shapes. + LayerParameter param; + DataParameter* data_param = param.mutable_data_param(); + data_param->set_batch_size(1); + data_param->set_source(filename_->c_str()); + data_param->set_backend(backend); + + DataLayer<Dtype> layer(param); + layer.SetUp(blob_bottom_vec_, blob_top_vec_); + EXPECT_EQ(blob_top_data_->num(), 1); + EXPECT_EQ(blob_top_data_->channels(), 2); + EXPECT_EQ(blob_top_label_->num(), 1); + EXPECT_EQ(blob_top_label_->channels(), 1); + EXPECT_EQ(blob_top_label_->height(), 1); + EXPECT_EQ(blob_top_label_->width(), 1); + + for (int iter = 0; iter < num_inputs; ++iter) { + layer.Forward(blob_bottom_vec_, blob_top_vec_); + EXPECT_EQ(blob_top_data_->height(), iter % 2 + 1); + EXPECT_EQ(blob_top_data_->width(), iter % 4 + 1); + EXPECT_EQ(iter, blob_top_label_->cpu_data()[0]); + const int channels = blob_top_data_->channels(); + const int height = blob_top_data_->height(); + const int width = blob_top_data_->width(); + for (int c = 0; c < channels; ++c) { + for (int h = 0; h < height; ++h) { + for (int w = 0; w < width; ++w) { + const int idx = (c * height + h) * width + w; + EXPECT_EQ(idx, static_cast<int>(blob_top_data_->cpu_data()[idx])) + << "debug: iter " << iter << " c " << c + << " h " << h << " w " << w; + } + } + } + } + } + void TestReadCrop() { const Dtype scale = 3; LayerParameter param; @@ -285,6 +349,10 @@ TYPED_TEST(DataLayerTest, TestReadLevelDB) { this->TestRead(); } +TYPED_TEST(DataLayerTest, TestReshapeLevelDB) { + this->TestReshape(DataParameter_DB_LEVELDB); +} + TYPED_TEST(DataLayerTest, TestReadCropTrainLevelDB) { Caffe::set_phase(Caffe::TRAIN); const bool unique_pixels = true; // all images the same; pixels different @@ -323,6 +391,10 @@ TYPED_TEST(DataLayerTest, TestReadLMDB) { this->TestRead(); } +TYPED_TEST(DataLayerTest, TestReshapeLMDB) { + this->TestReshape(DataParameter_DB_LMDB); +} + TYPED_TEST(DataLayerTest, TestReadCropTrainLMDB) { Caffe::set_phase(Caffe::TRAIN); const bool unique_pixels = true; // all images the same; pixels different diff --git a/src/caffe/test/test_image_data_layer.cpp b/src/caffe/test/test_image_data_layer.cpp index 77523ef8c18..931a5ebf137 100644 --- a/src/caffe/test/test_image_data_layer.cpp +++ b/src/caffe/test/test_image_data_layer.cpp @@ -25,17 +25,24 @@ class ImageDataLayerTest : public MultiDeviceTest<TypeParam> { blob_top_data_(new Blob<Dtype>()), blob_top_label_(new Blob<Dtype>()) {} virtual void SetUp() { - MakeTempFilename(&filename_); blob_top_vec_.push_back(blob_top_data_); blob_top_vec_.push_back(blob_top_label_); Caffe::set_random_seed(seed_); - // Create a Vector of files with labels + // Create test input file. + MakeTempFilename(&filename_); std::ofstream outfile(filename_.c_str(), std::ofstream::out); LOG(INFO) << "Using temporary file " << filename_; for (int i = 0; i < 5; ++i) { outfile << EXAMPLES_SOURCE_DIR "images/cat.jpg " << i; } outfile.close(); + // Create test input file for images of distinct sizes. + MakeTempFilename(&filename_reshape_); + std::ofstream reshapefile(filename_reshape_.c_str(), std::ofstream::out); + LOG(INFO) << "Using temporary file " << filename_reshape_; + reshapefile << EXAMPLES_SOURCE_DIR "images/cat.jpg " << 0; + reshapefile << EXAMPLES_SOURCE_DIR "images/fish-bike.jpg " << 1; + reshapefile.close(); } virtual ~ImageDataLayerTest() { @@ -45,6 +52,7 @@ class ImageDataLayerTest : public MultiDeviceTest<TypeParam> { int seed_; string filename_; + string filename_reshape_; Blob<Dtype>* const blob_top_data_; Blob<Dtype>* const blob_top_label_; vector<Blob<Dtype>*> blob_bottom_vec_; @@ -107,6 +115,33 @@ TYPED_TEST(ImageDataLayerTest, TestResize) { } } +TYPED_TEST(ImageDataLayerTest, TestReshape) { + typedef typename TypeParam::Dtype Dtype; + LayerParameter param; + ImageDataParameter* image_data_param = param.mutable_image_data_param(); + image_data_param->set_batch_size(1); + image_data_param->set_source(this->filename_reshape_.c_str()); + image_data_param->set_shuffle(false); + ImageDataLayer<Dtype> layer(param); + layer.SetUp(this->blob_bottom_vec_, this->blob_top_vec_); + EXPECT_EQ(this->blob_top_label_->num(), 1); + EXPECT_EQ(this->blob_top_label_->channels(), 1); + EXPECT_EQ(this->blob_top_label_->height(), 1); + EXPECT_EQ(this->blob_top_label_->width(), 1); + // cat.jpg + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); + EXPECT_EQ(this->blob_top_data_->num(), 1); + EXPECT_EQ(this->blob_top_data_->channels(), 3); + EXPECT_EQ(this->blob_top_data_->height(), 360); + EXPECT_EQ(this->blob_top_data_->width(), 480); + // fish-bike.jpg + layer.Forward(this->blob_bottom_vec_, this->blob_top_vec_); + EXPECT_EQ(this->blob_top_data_->num(), 1); + EXPECT_EQ(this->blob_top_data_->channels(), 3); + EXPECT_EQ(this->blob_top_data_->height(), 323); + EXPECT_EQ(this->blob_top_data_->width(), 481); +} + TYPED_TEST(ImageDataLayerTest, TestShuffle) { typedef typename TypeParam::Dtype Dtype; LayerParameter param; From 52465873d08cfd58a4c84ee8b239908814de4f39 Mon Sep 17 00:00:00 2001 From: philkr <philkr@users.noreply.github.com> Date: Mon, 16 Feb 2015 11:42:22 -0800 Subject: [PATCH 1124/2053] Cleaning up the encoded flag. Allowing any image (cropped or gray scale) to be encoded. Allowing for a change in encoded (jpg -> png vice versa) and cleaning up some unused functions. --- include/caffe/util/io.hpp | 36 ++++++---------- src/caffe/layers/data_layer.cpp | 4 +- src/caffe/layers/window_data_layer.cpp | 2 +- src/caffe/test/test_io.cpp | 31 +++---------- src/caffe/util/io.cpp | 60 +++++++++++++------------- tools/compute_image_mean.cpp | 4 +- tools/convert_imageset.cpp | 30 +++++++------ 7 files changed, 72 insertions(+), 95 deletions(-) diff --git a/include/caffe/util/io.hpp b/include/caffe/util/io.hpp index a01f917abf5..9d7540d62cc 100644 --- a/include/caffe/util/io.hpp +++ b/include/caffe/util/io.hpp @@ -92,7 +92,14 @@ inline bool ReadFileToDatum(const string& filename, Datum* datum) { } bool ReadImageToDatum(const string& filename, const int label, - const int height, const int width, const bool is_color, Datum* datum); + const int height, const int width, const bool is_color, + const std::string & encoding, Datum* datum); + +inline bool ReadImageToDatum(const string& filename, const int label, + const int height, const int width, const bool is_color, Datum* datum) { + return ReadImageToDatum(filename, label, height, width, is_color, + "", datum); +} inline bool ReadImageToDatum(const string& filename, const int label, const int height, const int width, Datum* datum) { @@ -109,20 +116,12 @@ inline bool ReadImageToDatum(const string& filename, const int label, return ReadImageToDatum(filename, label, 0, 0, true, datum); } -bool DecodeDatum(const int height, const int width, const bool is_color, - Datum* datum); - -inline bool DecodeDatum(const int height, const int width, Datum* datum) { - return DecodeDatum(height, width, true, datum); -} - -inline bool DecodeDatum(const bool is_color, Datum* datum) { - return DecodeDatum(0, 0, is_color, datum); +inline bool ReadImageToDatum(const string& filename, const int label, + const std::string & encoding, Datum* datum) { + return ReadImageToDatum(filename, label, 0, 0, true, encoding, datum); } -inline bool DecodeDatum(Datum* datum) { - return DecodeDatum(0, 0, true, datum); -} +bool DecodeDatumNative(Datum* datum); cv::Mat ReadImageToCVMat(const string& filename, const int height, const int width, const bool is_color); @@ -135,16 +134,7 @@ cv::Mat ReadImageToCVMat(const string& filename, cv::Mat ReadImageToCVMat(const string& filename); -cv::Mat DecodeDatumToCVMat(const Datum& datum, - const int height, const int width, const bool is_color); - -cv::Mat DecodeDatumToCVMat(const Datum& datum, - const int height, const int width); - -cv::Mat DecodeDatumToCVMat(const Datum& datum, - const bool is_color); - -cv::Mat DecodeDatumToCVMat(const Datum& datum); +cv::Mat DecodeDatumToCVMatNative(const Datum& datum); void CVMatToDatum(const cv::Mat& cv_img, Datum* datum); diff --git a/src/caffe/layers/data_layer.cpp b/src/caffe/layers/data_layer.cpp index 227db201759..891d03911c2 100644 --- a/src/caffe/layers/data_layer.cpp +++ b/src/caffe/layers/data_layer.cpp @@ -42,7 +42,7 @@ void DataLayer<Dtype>::DataLayerSetUp(const vector<Blob<Dtype>*>& bottom, Datum datum; datum.ParseFromString(cursor_->value()); - if (DecodeDatum(&datum)) { + if (DecodeDatumNative(&datum)) { LOG(INFO) << "Decoding Datum"; } // image @@ -98,7 +98,7 @@ void DataLayer<Dtype>::InternalThreadEntry() { cv::Mat cv_img; if (datum.encoded()) { - cv_img = DecodeDatumToCVMat(datum); + cv_img = DecodeDatumToCVMatNative(datum); } read_time += timer.MicroSeconds(); timer.Start(); diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 23ec83d166b..cceb4ffb1b5 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -281,7 +281,7 @@ void WindowDataLayer<Dtype>::InternalThreadEntry() { if (this->cache_images_) { pair<std::string, Datum> image_cached = image_database_cache_[window[WindowDataLayer<Dtype>::IMAGE_INDEX]]; - cv_img = DecodeDatumToCVMat(image_cached.second); + cv_img = DecodeDatumToCVMatNative(image_cached.second); } else { cv_img = cv::imread(image.first, CV_LOAD_IMAGE_COLOR); if (!cv_img.data) { diff --git a/src/caffe/test/test_io.cpp b/src/caffe/test/test_io.cpp index 4d941fa8683..6b135efcf6e 100644 --- a/src/caffe/test/test_io.cpp +++ b/src/caffe/test/test_io.cpp @@ -289,8 +289,8 @@ TEST_F(IOTest, TestDecodeDatum) { string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; Datum datum; EXPECT_TRUE(ReadFileToDatum(filename, &datum)); - EXPECT_TRUE(DecodeDatum(&datum)); - EXPECT_FALSE(DecodeDatum(&datum)); + EXPECT_TRUE(DecodeDatumNative(&datum)); + EXPECT_FALSE(DecodeDatumNative(&datum)); Datum datum_ref; ReadImageToDatumReference(filename, 0, 0, 0, true, &datum_ref); EXPECT_EQ(datum.channels(), datum_ref.channels()); @@ -309,38 +309,17 @@ TEST_F(IOTest, TestDecodeDatumToCVMat) { string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; Datum datum; EXPECT_TRUE(ReadFileToDatum(filename, &datum)); - cv::Mat cv_img = DecodeDatumToCVMat(datum); + cv::Mat cv_img = DecodeDatumToCVMatNative(datum); EXPECT_EQ(cv_img.channels(), 3); EXPECT_EQ(cv_img.rows, 360); EXPECT_EQ(cv_img.cols, 480); } -TEST_F(IOTest, TestDecodeDatumToCVMatResized) { - string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; - Datum datum; - EXPECT_TRUE(ReadFileToDatum(filename, &datum)); - cv::Mat cv_img = DecodeDatumToCVMat(datum, 100, 200); - EXPECT_EQ(cv_img.channels(), 3); - EXPECT_EQ(cv_img.rows, 100); - EXPECT_EQ(cv_img.cols, 200); -} - -TEST_F(IOTest, TestDecodeDatumToCVMatResizedGray) { - string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; - Datum datum; - EXPECT_TRUE(ReadFileToDatum(filename, &datum)); - const bool is_color = false; - cv::Mat cv_img = DecodeDatumToCVMat(datum, 200, 100, is_color); - EXPECT_EQ(cv_img.channels(), 1); - EXPECT_EQ(cv_img.rows, 200); - EXPECT_EQ(cv_img.cols, 100); -} - TEST_F(IOTest, TestDecodeDatumToCVMatContent) { string filename = EXAMPLES_SOURCE_DIR "images/cat.jpg"; Datum datum; - EXPECT_TRUE(ReadFileToDatum(filename, &datum)); - cv::Mat cv_img = DecodeDatumToCVMat(datum); + EXPECT_TRUE(ReadImageToDatum(filename, 0, std::string("jpg"), &datum)); + cv::Mat cv_img = DecodeDatumToCVMatNative(datum); cv::Mat cv_img_ref = ReadImageToCVMat(filename); EXPECT_EQ(cv_img_ref.channels(), cv_img.channels()); EXPECT_EQ(cv_img_ref.rows, cv_img.rows); diff --git a/src/caffe/util/io.cpp b/src/caffe/util/io.cpp index f738e053e86..65531687b63 100644 --- a/src/caffe/util/io.cpp +++ b/src/caffe/util/io.cpp @@ -98,11 +98,36 @@ cv::Mat ReadImageToCVMat(const string& filename, cv::Mat ReadImageToCVMat(const string& filename) { return ReadImageToCVMat(filename, 0, 0, true); } - +// Do the file extension and encoding match? +static bool matchExt(const std::string & fn, + std::string en) { + size_t p = fn.rfind('.'); + std::string ext = p != fn.npos ? fn.substr(p) : fn; + std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); + std::transform(en.begin(), en.end(), en.begin(), ::tolower); + if ( ext == en ) + return true; + if ( en == "jpg" && ext == "jpeg" ) + return true; + return false; +} bool ReadImageToDatum(const string& filename, const int label, - const int height, const int width, const bool is_color, Datum* datum) { + const int height, const int width, const bool is_color, + const std::string & encoding, Datum* datum) { cv::Mat cv_img = ReadImageToCVMat(filename, height, width, is_color); if (cv_img.data) { + if (encoding.size()) { + if ( (cv_img.channels() == 3) == is_color && !height && !width && + matchExt(filename, encoding) ) + return ReadFileToDatum(filename, label, datum); + std::vector<uchar> buf; + cv::imencode("."+encoding, cv_img, buf); + datum->set_data(std::string(reinterpret_cast<char*>(&buf[0]), + buf.size())); + datum->set_label(label); + datum->set_encoded(true); + return true; + } CVMatToDatum(cv_img, datum); datum->set_label(label); return true; @@ -131,47 +156,24 @@ bool ReadFileToDatum(const string& filename, const int label, } } -cv::Mat DecodeDatumToCVMat(const Datum& datum, - const int height, const int width, const bool is_color) { +cv::Mat DecodeDatumToCVMatNative(const Datum& datum) { cv::Mat cv_img; CHECK(datum.encoded()) << "Datum not encoded"; - int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR : - CV_LOAD_IMAGE_GRAYSCALE); const string& data = datum.data(); std::vector<char> vec_data(data.c_str(), data.c_str() + data.size()); - if (height > 0 && width > 0) { - cv::Mat cv_img_origin = cv::imdecode(cv::Mat(vec_data), cv_read_flag); - cv::resize(cv_img_origin, cv_img, cv::Size(width, height)); - } else { - cv_img = cv::imdecode(vec_data, cv_read_flag); - } + cv_img = cv::imdecode(vec_data, -1); if (!cv_img.data) { LOG(ERROR) << "Could not decode datum "; } return cv_img; } -cv::Mat DecodeDatumToCVMat(const Datum& datum, - const int height, const int width) { - return DecodeDatumToCVMat(datum, height, width, true); -} - -cv::Mat DecodeDatumToCVMat(const Datum& datum, - const bool is_color) { - return DecodeDatumToCVMat(datum, 0, 0, is_color); -} - -cv::Mat DecodeDatumToCVMat(const Datum& datum) { - return DecodeDatumToCVMat(datum, 0, 0, true); -} - // If Datum is encoded will decoded using DecodeDatumToCVMat and CVMatToDatum // if height and width are set it will resize it // If Datum is not encoded will do nothing -bool DecodeDatum(const int height, const int width, const bool is_color, - Datum* datum) { +bool DecodeDatumNative(Datum* datum) { if (datum->encoded()) { - cv::Mat cv_img = DecodeDatumToCVMat((*datum), height, width, is_color); + cv::Mat cv_img = DecodeDatumToCVMatNative((*datum)); CVMatToDatum(cv_img, datum); return true; } else { diff --git a/tools/compute_image_mean.cpp b/tools/compute_image_mean.cpp index dff63a09dca..b1fc7cae38f 100644 --- a/tools/compute_image_mean.cpp +++ b/tools/compute_image_mean.cpp @@ -50,7 +50,7 @@ int main(int argc, char** argv) { Datum datum; datum.ParseFromString(cursor->value()); - if (DecodeDatum(&datum)) { + if (DecodeDatumNative(&datum)) { LOG(INFO) << "Decoding Datum"; } @@ -68,7 +68,7 @@ int main(int argc, char** argv) { while (cursor->valid()) { Datum datum; datum.ParseFromString(cursor->value()); - DecodeDatum(&datum); + DecodeDatumNative(&datum); const std::string& data = datum.data(); size_in_datum = std::max<int>(datum.data().size(), diff --git a/tools/convert_imageset.cpp b/tools/convert_imageset.cpp index 7fbf5b0514c..816a91f971b 100644 --- a/tools/convert_imageset.cpp +++ b/tools/convert_imageset.cpp @@ -39,6 +39,8 @@ DEFINE_bool(check_size, false, "When this option is on, check that all the datum have the same size"); DEFINE_bool(encoded, false, "When this option is on, the encoded image will be save in datum"); +DEFINE_string(encode_type, "", + "Optional: What type should we encode the image as ('png','jpg',...)."); int main(int argc, char** argv) { ::google::InitGoogleLogging(argv[0]); @@ -63,6 +65,7 @@ int main(int argc, char** argv) { const bool is_color = !FLAGS_gray; const bool check_size = FLAGS_check_size; const bool encoded = FLAGS_encoded; + const string encode_type = FLAGS_encode_type; std::ifstream infile(argv[2]); std::vector<std::pair<std::string, int> > lines; @@ -78,11 +81,8 @@ int main(int argc, char** argv) { } LOG(INFO) << "A total of " << lines.size() << " images."; - if (encoded) { - CHECK_EQ(FLAGS_resize_height, 0) << "With encoded don't resize images"; - CHECK_EQ(FLAGS_resize_width, 0) << "With encoded don't resize images"; - CHECK(!check_size) << "With encoded cannot check_size"; - } + if (encode_type.size() && !encoded) + LOG(INFO) << "encode_type specified, assuming encoded=true."; int resize_height = std::max<int>(0, FLAGS_resize_height); int resize_width = std::max<int>(0, FLAGS_resize_width); @@ -98,18 +98,24 @@ int main(int argc, char** argv) { int count = 0; const int kMaxKeyLength = 256; char key_cstr[kMaxKeyLength]; - int data_size; + int data_size = 0; bool data_size_initialized = false; for (int line_id = 0; line_id < lines.size(); ++line_id) { bool status; - if (encoded) { - status = ReadFileToDatum(root_folder + lines[line_id].first, - lines[line_id].second, &datum); - } else { - status = ReadImageToDatum(root_folder + lines[line_id].first, - lines[line_id].second, resize_height, resize_width, is_color, &datum); + std::string enc = encode_type; + if (encoded && !enc.size()) { + // Guess the encoding type from the file name + string fn = lines[line_id].first; + size_t p = fn.rfind('.'); + if ( p == fn.npos ) + LOG(WARNING) << "Failed to guess the encoding of '" << fn << "'"; + enc = fn.substr(p); + std::transform(enc.begin(), enc.end(), enc.begin(), ::tolower); } + status = ReadImageToDatum(root_folder + lines[line_id].first, + lines[line_id].second, resize_height, resize_width, is_color, + enc, &datum); if (status == false) continue; if (check_size) { if (!data_size_initialized) { From 32bf5c7ad804ad683aa5ea9382209e9284451e5f Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev <no@email> Date: Sat, 20 Dec 2014 18:22:47 +0300 Subject: [PATCH 1125/2053] ignore qtcreator files --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index c27c7a6a5f6..58adc5cb106 100644 --- a/.gitignore +++ b/.gitignore @@ -44,6 +44,9 @@ *.*project .settings +# QtCreator files +*.user + # OSX dir files .DS_Store @@ -71,6 +74,8 @@ distribute/* *.testbin *.bin python/caffe/proto/ +cmake_build +.cmake_build # Generated documentation docs/_site From 9358247014eb8322160c7feaad46091412d75d3f Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev <no@email> Date: Wed, 17 Dec 2014 12:09:14 +0300 Subject: [PATCH 1126/2053] improve CMake build --- .gitignore | 3 - CMakeLists.txt | 199 +++------- CMakeScripts/FindLMDB.cmake | 28 -- CMakeScripts/FindLevelDB.cmake | 37 -- CMakeScripts/FindNumPy.cmake | 103 ----- CMakeScripts/FindProtobuf.cmake | 152 -------- CMakeScripts/FindSnappy.cmake | 33 -- cmake/ConfigGen.cmake | 86 +++++ cmake/Cuda.cmake | 243 ++++++++++++ cmake/Dependencies.cmake | 124 ++++++ cmake/Misc.cmake | 47 +++ .../Modules}/FindAtlas.cmake | 25 +- .../Modules}/FindGFlags.cmake | 6 +- .../Modules}/FindGlog.cmake | 14 +- .../Modules}/FindLAPACK.cmake | 0 cmake/Modules/FindLMDB.cmake | 28 ++ cmake/Modules/FindLevelDB.cmake | 44 +++ {CMakeScripts => cmake/Modules}/FindMKL.cmake | 0 cmake/Modules/FindMatlabMex.cmake | 48 +++ cmake/Modules/FindNumPy.cmake | 58 +++ .../Modules}/FindOpenBLAS.cmake | 0 cmake/Modules/FindSnappy.cmake | 28 ++ cmake/Modules/FindvecLib.cmake | 34 ++ cmake/ProtoBuf.cmake | 90 +++++ cmake/Summary.cmake | 166 ++++++++ cmake/Targets.cmake | 170 ++++++++ cmake/Templates/CaffeConfig.cmake.in | 58 +++ cmake/Templates/CaffeConfigVersion.cmake.in | 11 + cmake/Templates/caffe_config.h.in | 32 ++ cmake/Utils.cmake | 365 ++++++++++++++++++ {CMakeScripts => cmake}/lint.cmake | 0 docs/CMakeLists.txt | 106 +++++ examples/CMakeLists.txt | 41 +- include/caffe/test/test_caffe_main.hpp | 2 +- matlab/CMakeLists.txt | 73 +++- python/CMakeLists.txt | 77 ++-- src/caffe/CMakeLists.txt | 75 ++-- src/caffe/proto/CMakeLists.txt | 46 --- src/caffe/test/CMakeLists.txt | 135 ++----- src/caffe/test/cmake_test_defines.hpp.in | 4 - .../test/test_data/sample_data_list.txt.in | 2 - src/gtest/CMakeLists.txt | 9 +- tools/CMakeLists.txt | 47 ++- 43 files changed, 2017 insertions(+), 832 deletions(-) delete mode 100644 CMakeScripts/FindLMDB.cmake delete mode 100644 CMakeScripts/FindLevelDB.cmake delete mode 100644 CMakeScripts/FindNumPy.cmake delete mode 100644 CMakeScripts/FindProtobuf.cmake delete mode 100644 CMakeScripts/FindSnappy.cmake create mode 100644 cmake/ConfigGen.cmake create mode 100644 cmake/Cuda.cmake create mode 100644 cmake/Dependencies.cmake create mode 100644 cmake/Misc.cmake rename {CMakeScripts => cmake/Modules}/FindAtlas.cmake (63%) rename {CMakeScripts => cmake/Modules}/FindGFlags.cmake (79%) rename {CMakeScripts => cmake/Modules}/FindGlog.cmake (70%) rename {CMakeScripts => cmake/Modules}/FindLAPACK.cmake (100%) create mode 100644 cmake/Modules/FindLMDB.cmake create mode 100644 cmake/Modules/FindLevelDB.cmake rename {CMakeScripts => cmake/Modules}/FindMKL.cmake (100%) create mode 100644 cmake/Modules/FindMatlabMex.cmake create mode 100644 cmake/Modules/FindNumPy.cmake rename {CMakeScripts => cmake/Modules}/FindOpenBLAS.cmake (100%) create mode 100644 cmake/Modules/FindSnappy.cmake create mode 100644 cmake/Modules/FindvecLib.cmake create mode 100644 cmake/ProtoBuf.cmake create mode 100644 cmake/Summary.cmake create mode 100644 cmake/Targets.cmake create mode 100644 cmake/Templates/CaffeConfig.cmake.in create mode 100644 cmake/Templates/CaffeConfigVersion.cmake.in create mode 100644 cmake/Templates/caffe_config.h.in create mode 100644 cmake/Utils.cmake rename {CMakeScripts => cmake}/lint.cmake (100%) create mode 100644 docs/CMakeLists.txt delete mode 100644 src/caffe/proto/CMakeLists.txt delete mode 100644 src/caffe/test/cmake_test_defines.hpp.in delete mode 100644 src/caffe/test/test_data/sample_data_list.txt.in diff --git a/.gitignore b/.gitignore index 58adc5cb106..73bba6cb364 100644 --- a/.gitignore +++ b/.gitignore @@ -29,9 +29,6 @@ # IPython notebook checkpoints .ipynb_checkpoints -# CMake generated files -*.gen.cmake - # Editor temporaries *.swp *~ diff --git a/CMakeLists.txt b/CMakeLists.txt index d6b08470a7f..d3d50da218b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,177 +1,64 @@ cmake_minimum_required(VERSION 2.8.8) -project( Caffe ) -### Build Options ########################################################################## +# ---[ Caffe project +project(Caffe C CXX) -option(CPU_ONLY "Build Caffe without GPU support" OFF) -option(BUILD_PYTHON "Build Python wrapper" OFF) -option(BUILD_MATLAB "Build Matlab wrapper" OFF) -option(BUILD_EXAMPLES "Build examples" ON) -option(BUILD_SHARED_LIBS "Build SHARED libs if ON and STATIC otherwise" OFF) +# ---[ Using cmake scripts and modules +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) -if(NOT BLAS) - set(BLAS atlas) -endif() +include(cmake/Utils.cmake) +include(cmake/Targets.cmake) +include(cmake/Misc.cmake) +include(cmake/Summary.cmake) +include(cmake/ConfigGen.cmake) -if(NOT CUDA_TEST_DEVICE) - set(CUDA_TEST_DEVICE -1) -endif() +# ---[ Options +caffe_option(CPU_ONLY "Build Caffe wihtout CUDA support" OFF) # TODO: rename to USE_CUDA +caffe_option(USE_CUDNN "Build Caffe with cuDNN libary support" ON IF NOT CPU_ONLY) +caffe_option(BUILD_SHARED_LIBS "Build shared libraries" ON) +caffe_option(BUILD_python "Build Python wrapper" ON) +caffe_option(BUILD_matlab "Build Matlab wrapper" OFF IF UNIX OR APPLE) +caffe_option(BUILD_docs "Build documentation" ON IF UNIX OR APPLE) -# Install Prefix -if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Default install path" FORCE ) -endif() +# ---[ Dependencies +include(cmake/Dependencies.cmake) -### Configuration ########################################################################### -# Compiler Flags -set(CMAKE_CXX_COMPILER_FLAGS ${CMAKE_CXX_COMPILER_FLAGS} -Wall) -set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -fPIC) # set global flags -set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}) # set debug flags -set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) # set release flags - -# Link Flags -if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") # clang++ - set(CAFFE_STATIC_LINK -Wl,-force_load $(STATIC_NAME)) -elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") # g++ - set(CAFFE_STATIC_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive) +# ---[ Flags +if(UNIX OR APLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall") endif() -# Global Definitions -if(CPU_ONLY) - add_definitions(-DCPU_ONLY) -endif() - -# Include Directories -set(${PROJECT_NAME}_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/include) -include_directories(${${PROJECT_NAME}_INCLUDE_DIRS}) -include_directories(${CMAKE_SOURCE_DIR}/src) - -# CMake Scripts dir -set(CMAKE_SCRIPT_DIR ${CMAKE_SOURCE_DIR}/CMakeScripts) - -# CMake module path for custom module finding -set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SCRIPT_DIR}) - -### Dependencies ########################################################################## - -# Boost -find_package(Boost 1.46 COMPONENTS system thread REQUIRED) -include_directories(${Boost_INCLUDE_DIR}) -link_directories(${Boost_LIBRARY_DIRS}) - -# CUDA -if(NOT CPU_ONLY) - find_package(CUDA 5.5 REQUIRED) - include_directories(${CUDA_INCLUDE_DIRS}) - - set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} - -gencode arch=compute_20,code=sm_20 - -gencode arch=compute_20,code=sm_21 - -gencode arch=compute_30,code=sm_30 - -gencode arch=compute_35,code=sm_35 - ) - - # https://github.com/ComputationalRadiationPhysics/picongpu/blob/master/src/picongpu/CMakeLists.txt - # work-arounds - if(Boost_VERSION EQUAL 105500) - # see https://svn.boost.org/trac/boost/ticket/9392 - message(STATUS "Boost: Applying noinline work around") - # avoid warning for CMake >= 2.8.12 - set(CUDA_NVCC_FLAGS - "${CUDA_NVCC_FLAGS} \"-DBOOST_NOINLINE=__attribute__((noinline))\" ") - endif(Boost_VERSION EQUAL 105500) +if(APPLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++") endif() -# Threads -find_package(Threads REQUIRED) - -# Google-glog -find_package(Glog REQUIRED) -include_directories(${GLOG_INCLUDE_DIRS}) - -# Google-gflags -find_package(GFlags REQUIRED) -include_directories(${GFLAGS_INCLUDE_DIRS}) - -# BLAS -if(BLAS STREQUAL "atlas") - - find_package(Atlas REQUIRED) - include_directories(${Atlas_INCLUDE_DIR}) - set(BLAS_LIBRARIES ${Atlas_LIBRARIES}) - -elseif(BLAS STREQUAL "open") +add_definitions(-DGTEST_USE_OWN_TR1_TUPLE) - find_package(OpenBLAS REQUIRED) - include_directories(${OpenBLAS_INCLUDE_DIR}) - set(BLAS_LIBRARIES ${OpenBLAS_LIB}) +# ---[ Warnings +caffe_warnings_disable(CMAKE_CXX_FLAGS -Wno-sign-compare -Wno-uninitialized) -elseif(BLAS STREQUAL "mkl") +# ---[ Config generation +configure_file(cmake/Templates/caffe_config.h.in "${CMAKE_BINARY_DIR}/caffe_config.h") - find_package(MKL REQUIRED) - include_directories(${MKL_INCLUDE_DIR}) - set(BLAS_LIBRARIES ${MKL_LIBRARIES}) - -endif() - -# HDF5 -find_package(HDF5 COMPONENTS HL REQUIRED) -include_directories(${HDF5_INCLUDE_DIRS}) - -# LevelDB -find_package(LevelDB REQUIRED) -include_directories(${LEVELDB_INCLUDE}) -if(LEVELDB_FOUND) - find_package(Snappy REQUIRED) - include_directories(${SNAPPY_INCLUDE_DIR}) - set(LEVELDB_LIBS - ${LEVELDB_LIBS} - ${SNAPPY_LIBS} - ) -endif() - -# LMDB -find_package(LMDB REQUIRED) -include_directories(${LMDB_INCLUDE_DIR}) - -# OpenCV -find_package(OpenCV REQUIRED) -include_directories(${OpenCV_INCLUDE_DIRS}) - -### Subdirectories ########################################################################## +# ---[ Includes +set(Caffe_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include) +include_directories(${Caffe_INCLUDE_DIR} ${CMAKE_BINARY_DIR}) +include_directories(BEFORE src) # This is needed for gtest. +# ---[ Subdirectories add_subdirectory(src/gtest) add_subdirectory(src/caffe) add_subdirectory(tools) +add_subdirectory(examples) +add_subdirectory(python) +add_subdirectory(matlab) +add_subdirectory(docs) -if(BUILD_EXAMPLES) - message(STATUS "Examples enabled") - add_subdirectory(examples) -endif() - -if(BUILD_PYTHON) - message(STATUS "Python enabled") - add_subdirectory(python) -endif() - -if(BUILD_MATLAB) - message(STATUS "Matlab enabled") - add_subdirectory(matlab) -endif() - -### Lint Target Setup ########################################################################## - -set(LINT_TARGET lint) -set(LINT_SCRIPT ${CMAKE_SCRIPT_DIR}/lint.cmake) -add_custom_target( - ${LINT_TARGET} - COMMAND ${CMAKE_COMMAND} -P ${LINT_SCRIPT} -) - -### Install ################################################################################# - -# Install Includes -file(GLOB folders ${${PROJECT_NAME}_INCLUDE_DIRS}/*) -install(DIRECTORY ${folders} DESTINATION include) +# ---[ Linter target +add_custom_target(lint COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/lint.cmake) +# ---[ Configuration summary +caffe_print_configuration_summary() +# ---[ Export configs generation +caffe_generate_export_configs() diff --git a/CMakeScripts/FindLMDB.cmake b/CMakeScripts/FindLMDB.cmake deleted file mode 100644 index e615f542335..00000000000 --- a/CMakeScripts/FindLMDB.cmake +++ /dev/null @@ -1,28 +0,0 @@ -# Try to find the LMBD libraries and headers -# LMDB_FOUND - system has LMDB lib -# LMDB_INCLUDE_DIR - the LMDB include directory -# LMDB_LIBRARIES - Libraries needed to use LMDB - -# FindCWD based on FindGMP by: -# Copyright (c) 2006, Laurent Montel, <montel@kde.org> -# -# Redistribution and use is allowed according to the terms of the BSD license. - -# Adapted from FindCWD by: -# Copyright 2013 Conrad Steenberg <conrad.steenberg@gmail.com> -# Aug 31, 2013 - -if (LMDB_INCLUDE_DIR AND LMDB_LIBRARIES) - # Already in cache, be silent - set(LMDB_FIND_QUIETLY TRUE) -endif (LMDB_INCLUDE_DIR AND LMDB_LIBRARIES) - -find_path(LMDB_INCLUDE_DIR NAMES "lmdb.h" HINTS "$ENV{LMDB_DIR}/include") -find_library(LMDB_LIBRARIES NAMES lmdb HINTS $ENV{LMDB_DIR}/lib ) -MESSAGE(STATUS "LMDB lib: " ${LMDB_LIBRARIES} ) -MESSAGE(STATUS "LMDB include: " ${LMDB_INCLUDE} ) - -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(LMDB DEFAULT_MSG LMDB_INCLUDE_DIR LMDB_LIBRARIES) - -mark_as_advanced(LMDB_INCLUDE_DIR LMDB_LIBRARIES) diff --git a/CMakeScripts/FindLevelDB.cmake b/CMakeScripts/FindLevelDB.cmake deleted file mode 100644 index f3386f26dbf..00000000000 --- a/CMakeScripts/FindLevelDB.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# - Find LevelDB -# -# LEVELDB_INCLUDE - Where to find leveldb/db.h -# LEVELDB_LIBS - List of libraries when using LevelDB. -# LEVELDB_FOUND - True if LevelDB found. - -get_filename_component(module_file_path ${CMAKE_CURRENT_LIST_FILE} PATH) - -# Look for the header file. -find_path(LEVELDB_INCLUDE NAMES leveldb/db.h PATHS $ENV{LEVELDB_ROOT}/include /opt/local/include /usr/local/include /usr/include DOC "Path in which the file leveldb/db.h is located." ) -mark_as_advanced(LEVELDB_INCLUDE) - -# Look for the library. -# Does this work on UNIX systems? (LINUX) -find_library(LEVELDB_LIBS NAMES leveldb PATHS /usr/lib $ENV{LEVELDB_ROOT}/lib DOC "Path to leveldb library." ) -mark_as_advanced(LEVELDB_LIBS) - -# Copy the results to the output variables. -if (LEVELDB_INCLUDE AND LEVELDB_LIBS) - message(STATUS "Found leveldb in ${LEVELDB_INCLUDE} ${LEVELDB_LIBS}") - set(LEVELDB_FOUND 1) - include(CheckCXXSourceCompiles) - set(CMAKE_REQUIRED_LIBRARY ${LEVELDB_LIBS} pthread) - set(CMAKE_REQUIRED_INCLUDES ${LEVELDB_INCLUDE}) - else () - set(LEVELDB_FOUND 0) - endif () - - # Report the results. - if (NOT LEVELDB_FOUND) - set(LEVELDB_DIR_MESSAGE "LEVELDB was not found. Make sure LEVELDB_LIBS and LEVELDB_INCLUDE are set.") - if (LEVELDB_FIND_REQUIRED) - message(FATAL_ERROR "${LEVELDB_DIR_MESSAGE}") - elseif (NOT LEVELDB_FIND_QUIETLY) - message(STATUS "${LEVELDB_DIR_MESSAGE}") - endif () - endif () \ No newline at end of file diff --git a/CMakeScripts/FindNumPy.cmake b/CMakeScripts/FindNumPy.cmake deleted file mode 100644 index baf21541e63..00000000000 --- a/CMakeScripts/FindNumPy.cmake +++ /dev/null @@ -1,103 +0,0 @@ -# - Find the NumPy libraries -# This module finds if NumPy is installed, and sets the following variables -# indicating where it is. -# -# TODO: Update to provide the libraries and paths for linking npymath lib. -# -# NUMPY_FOUND - was NumPy found -# NUMPY_VERSION - the version of NumPy found as a string -# NUMPY_VERSION_MAJOR - the major version number of NumPy -# NUMPY_VERSION_MINOR - the minor version number of NumPy -# NUMPY_VERSION_PATCH - the patch version number of NumPy -# NUMPY_VERSION_DECIMAL - e.g. version 1.6.1 is 10601 -# NUMPY_INCLUDE_DIRS - path to the NumPy include files - -#============================================================================ -# Copyright 2012 Continuum Analytics, Inc. -# -# MIT License -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files -# (the "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to permit -# persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -#============================================================================ - -# Finding NumPy involves calling the Python interpreter -if(NumPy_FIND_REQUIRED) - find_package(PythonInterp REQUIRED) -else() - find_package(PythonInterp) -endif() - -if(NOT PYTHONINTERP_FOUND) - set(NUMPY_FOUND FALSE) - return() -endif() - -execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c" - "import numpy as n; print(n.__version__); print(n.get_include());" - RESULT_VARIABLE _NUMPY_SEARCH_SUCCESS - OUTPUT_VARIABLE _NUMPY_VALUES_OUTPUT - ERROR_VARIABLE _NUMPY_ERROR_VALUE - OUTPUT_STRIP_TRAILING_WHITESPACE) - -if(NOT _NUMPY_SEARCH_SUCCESS MATCHES 0) - if(NumPy_FIND_REQUIRED) - message(FATAL_ERROR - "NumPy import failure:\n${_NUMPY_ERROR_VALUE}") - endif() - set(NUMPY_FOUND FALSE) - return() -endif() - -# Convert the process output into a list -string(REGEX REPLACE ";" "\\\\;" _NUMPY_VALUES ${_NUMPY_VALUES_OUTPUT}) -string(REGEX REPLACE "\n" ";" _NUMPY_VALUES ${_NUMPY_VALUES}) -# Just in case there is unexpected output from the Python command. -list(GET _NUMPY_VALUES -2 NUMPY_VERSION) -list(GET _NUMPY_VALUES -1 NUMPY_INCLUDE_DIRS) - -string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" _VER_CHECK "${NUMPY_VERSION}") -if("${_VER_CHECK}" STREQUAL "") - # The output from Python was unexpected. Raise an error always - # here, because we found NumPy, but it appears to be corrupted somehow. - message(FATAL_ERROR - "Requested version and include path from NumPy, got instead:\n${_NUMPY_VALUES_OUTPUT}\n") - return() -endif() - -# Make sure all directory separators are '/' -string(REGEX REPLACE "\\\\" "/" NUMPY_INCLUDE_DIRS ${NUMPY_INCLUDE_DIRS}) - -# Get the major and minor version numbers -string(REGEX REPLACE "\\." ";" _NUMPY_VERSION_LIST ${NUMPY_VERSION}) -list(GET _NUMPY_VERSION_LIST 0 NUMPY_VERSION_MAJOR) -list(GET _NUMPY_VERSION_LIST 1 NUMPY_VERSION_MINOR) -list(GET _NUMPY_VERSION_LIST 2 NUMPY_VERSION_PATCH) -string(REGEX MATCH "[0-9]*" NUMPY_VERSION_PATCH ${NUMPY_VERSION_PATCH}) -math(EXPR NUMPY_VERSION_DECIMAL - "(${NUMPY_VERSION_MAJOR} * 10000) + (${NUMPY_VERSION_MINOR} * 100) + ${NUMPY_VERSION_PATCH}") - -find_package_message(NUMPY - "Found NumPy: version \"${NUMPY_VERSION}\" ${NUMPY_INCLUDE_DIRS}" - "${NUMPY_INCLUDE_DIRS}${NUMPY_VERSION}") - -set(NUMPY_FOUND TRUE) - - diff --git a/CMakeScripts/FindProtobuf.cmake b/CMakeScripts/FindProtobuf.cmake deleted file mode 100644 index 0f94f498197..00000000000 --- a/CMakeScripts/FindProtobuf.cmake +++ /dev/null @@ -1,152 +0,0 @@ -# Locate and configure the Google Protocol Buffers library. -# Defines the following variables: -# -# PROTOBUF_FOUND - Found the Google Protocol Buffers library -# PROTOBUF_INCLUDE_DIRS - Include directories for Google Protocol Buffers -# PROTOBUF_LIBRARIES - The protobuf library -# -# The following cache variables are also defined: -# PROTOBUF_LIBRARY - The protobuf library -# PROTOBUF_PROTOC_LIBRARY - The protoc library -# PROTOBUF_INCLUDE_DIR - The include directory for protocol buffers -# PROTOBUF_PROTOC_EXECUTABLE - The protoc compiler -# -# ==================================================================== -# Example: -# -# find_package(Protobuf REQUIRED) -# include_directories(${PROTOBUF_INCLUDE_DIRS}) -# -# include_directories(${CMAKE_CURRENT_BINARY_DIR}) -# PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS foo.proto) -# add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS}) -# target_link_libraries(bar ${PROTOBUF_LIBRARY}) -# -# NOTE: You may need to link against pthreads, depending -# on the platform. -# ==================================================================== -# -# PROTOBUF_GENERATE_CPP (public function) -# SRCS = Variable to define with autogenerated -# source files -# HDRS = Variable to define with autogenerated -# header files -# ARGN = proto files -# -# ==================================================================== - - -#============================================================================= -# Copyright 2009 Kitware, Inc. -# Copyright 2009 Philip Lowman <philip@yhbt.com> -# Copyright 2008 Esben Mose Hansen, Ange Optimization ApS -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distributed this file outside of CMake, substitute the full -# License text for the above reference.) - -function(PROTOBUF_GENERATE_PYTHON SRCS) - if(NOT ARGN) - message(SEND_ERROR "Error: PROTOBUF_GENERATE_PYTHON() called without any proto files") - return() - endif(NOT ARGN) - - set(${SRCS}) - foreach(FIL ${ARGN}) - get_filename_component(ABS_FIL ${FIL} ABSOLUTE) - get_filename_component(FIL_WE ${FIL} NAME_WE) - - - list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}_pb2.py") - - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}_pb2.py" - COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} - ARGS --python_out ${CMAKE_CURRENT_BINARY_DIR} --proto_path ${CMAKE_CURRENT_SOURCE_DIR} -${ABS_FIL} - DEPENDS ${ABS_FIL} - COMMENT "Running Python protocol buffer compiler on ${FIL}" - VERBATIM ) - endforeach() - - - set_source_files_properties(${${SRCS}} PROPERTIES GENERATED TRUE) - set(${SRCS} ${${SRCS}} PARENT_SCOPE) -endfunction() - - -function(PROTOBUF_GENERATE_CPP SRCS HDRS) - if(NOT ARGN) - message(SEND_ERROR "Error: PROTOBUF_GENERATE_CPP() called without any proto files") - return() - endif(NOT ARGN) - - set(${SRCS}) - set(${HDRS}) - foreach(FIL ${ARGN}) - get_filename_component(ABS_FIL ${FIL} ABSOLUTE) - get_filename_component(FIL_WE ${FIL} NAME_WE) - - list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc") - list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h") - - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc" - "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h" - COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} - ARGS --cpp_out ${CMAKE_CURRENT_BINARY_DIR} --proto_path ${CMAKE_CURRENT_SOURCE_DIR} -${ABS_FIL} - DEPENDS ${ABS_FIL} - COMMENT "Running C++ protocol buffer compiler on ${FIL}" - VERBATIM ) - endforeach() - - set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE) - set(${SRCS} ${${SRCS}} PARENT_SCOPE) - set(${HDRS} ${${HDRS}} PARENT_SCOPE) -endfunction() - - -find_path(PROTOBUF_INCLUDE_DIR google/protobuf/service.h) - -# Google's provided vcproj files generate libraries with a "lib" -# prefix on Windows -if(WIN32) - set(PROTOBUF_ORIG_FIND_LIBRARY_PREFIXES "${CMAKE_FIND_LIBRARY_PREFIXES}") - set(CMAKE_FIND_LIBRARY_PREFIXES "lib" "") -endif() - -find_library(PROTOBUF_LIBRARY NAMES protobuf - DOC "The Google Protocol Buffers Library" -) -find_library(PROTOBUF_PROTOC_LIBRARY NAMES protoc - DOC "The Google Protocol Buffers Compiler Library" -) -find_program(PROTOBUF_PROTOC_EXECUTABLE NAMES protoc - DOC "The Google Protocol Buffers Compiler" -) - -mark_as_advanced(PROTOBUF_INCLUDE_DIR - PROTOBUF_LIBRARY - PROTOBUF_PROTOC_LIBRARY - PROTOBUF_PROTOC_EXECUTABLE) - -# Restore original find library prefixes -if(WIN32) - set(CMAKE_FIND_LIBRARY_PREFIXES "${PROTOBUF_ORIG_FIND_LIBRARY_PREFIXES}") -endif() - -include(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(PROTOBUF DEFAULT_MSG - PROTOBUF_LIBRARY PROTOBUF_INCLUDE_DIR) - -if(PROTOBUF_FOUND) - set(PROTOBUF_INCLUDE_DIRS ${PROTOBUF_INCLUDE_DIR}) - set(PROTOBUF_LIBRARIES ${PROTOBUF_LIBRARY}) -endif() diff --git a/CMakeScripts/FindSnappy.cmake b/CMakeScripts/FindSnappy.cmake deleted file mode 100644 index d769b442812..00000000000 --- a/CMakeScripts/FindSnappy.cmake +++ /dev/null @@ -1,33 +0,0 @@ -# Find the Snappy libraries -# -# The following variables are optionally searched for defaults -# Snappy_ROOT_DIR: Base directory where all Snappy components are found -# -# The following are set after configuration is done: -# Snappy_FOUND -# Snappy_INCLUDE_DIRS -# Snappy_LIBS - -find_path(SNAPPY_INCLUDE_DIR - NAMES snappy.h - HINTS ${SNAPPY_ROOT_DIR} - ${SNAPPY_ROOT_DIR}/include -) - -find_library(SNAPPY_LIBS - NAMES snappy - HINTS ${SNAPPY_ROOT_DIR} - ${SNAPPY_ROOT_DIR}/lib -) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Snappy - DEFAULT_MSG - SNAPPY_LIBS - SNAPPY_INCLUDE_DIR -) - -mark_as_advanced( - SNAPPY_LIBS - SNAPPY_INCLUDE_DIR -) diff --git a/cmake/ConfigGen.cmake b/cmake/ConfigGen.cmake new file mode 100644 index 00000000000..24f23e9c494 --- /dev/null +++ b/cmake/ConfigGen.cmake @@ -0,0 +1,86 @@ + +################################################################################################ +# Helper function to fetch caffe includes which will be passed to dependent projects +# Usage: +# caffe_get_current_includes(<includes_list_variable>) +function(caffe_get_current_includes includes_variable) + get_property(current_includes DIRECTORY PROPERTY INCLUDE_DIRECTORIES) + caffe_convert_absolute_paths(current_includes) + + # remove at most one ${CMAKE_BINARY_DIR} include added for caffe_config.h + list(FIND current_includes ${CMAKE_BINARY_DIR} __index) + list(REMOVE_AT current_includes ${__index}) + + caffe_list_unique(current_includes) + set(${includes_variable} ${current_includes} PARENT_SCOPE) +endfunction() + +################################################################################################ +# Helper function to get all list items that begin with given prefix +# Usage: +# caffe_get_items_with_prefix(<prefix> <list_variable> <output_variable>) +function(caffe_get_items_with_prefix prefix list_variable output_variable) + set(__result "") + foreach(__e ${${list_variable}}) + if(__e MATCHES "^${prefix}.*") + list(APPEND __result ${__e}) + endif() + endforeach() + set(${output_variable} ${__result} PARENT_SCOPE) +endfunction() + +################################################################################################ +# Function for generation Caffe build- and install- tree export config files +# Usage: +# caffe_generate_export_configs() +function(caffe_generate_export_configs) + set(install_cmake_suffix "share/Caffe") + + # ---[ Configure build-tree CaffeConfig.cmake file ]--- + caffe_get_current_includes(Caffe_INCLUDE_DIRS) + if(NOT HAVE_CUDA) + set(HAVE_CUDA FALSE) + set(Caffe_DEFINITIONS -DCPU_ONLY) + endif() + if(NOT HAVE_CUDNN) + set(HAVE_CUDNN FALSE) + else() + set(Caffe_DEFINITIONS -DUSE_CUDNN) + endif() + + configure_file("cmake/Templates/CaffeConfig.cmake.in" "${CMAKE_BINARY_DIR}/CaffeConfig.cmake" @ONLY) + + # Add targets to the build-tree export set + export(TARGETS caffe proto FILE "${CMAKE_BINARY_DIR}/CaffeTargets.cmake") + export(PACKAGE Caffe) + + # ---[ Configure install-tree CaffeConfig.cmake file ]--- + + # remove source and build dir includes + caffe_get_items_with_prefix(${CMAKE_SOURCE_DIR} Caffe_INCLUDE_DIRS __insource) + caffe_get_items_with_prefix(${CMAKE_BINARY_DIR} Caffe_INCLUDE_DIRS __inbinary) + list(REMOVE_ITEM Caffe_INCLUDE_DIRS ${__insource} ${__inbinary}) + + # add `install` include folder + set(lines + "get_filename_component(__caffe_include \"\${Caffe_CMAKE_DIR}/../../include\" ABSOLUTE)\n" + "list(APPEND Caffe_INCLUDE_DIRS \${__caffe_include})\n" + "unset(__caffe_include)\n") + string(REPLACE ";" "" Caffe_INSTALL_INCLUDE_DIR_APPEND_COMMAND ${lines}) + + configure_file("cmake/Templates/CaffeConfig.cmake.in" "${CMAKE_BINARY_DIR}/cmake/CaffeConfig.cmake" @ONLY) + + # Install the CaffeConfig.cmake and export set to use wuth install-tree + install(FILES "${CMAKE_BINARY_DIR}/cmake/CaffeConfig.cmake" DESTINATION ${install_cmake_suffix}) + install(EXPORT CaffeTargets DESTINATION ${install_cmake_suffix}) + + # ---[ Configure and install version file ]--- + + # TODO: Lines below are commented because Caffe does't declare its version in headers. + # When the declarations are added, modify `caffe_extract_caffe_version()` macro and uncomment + + # configure_file(cmake/Templates/CaffeConfigVersion.cmake.in "${CMAKE_BINARY_DIR}/CaffeConfigVersion.cmake" @ONLY) + # install(FILES "${CMAKE_BINARY_DIR}/CaffeConfigVersion.cmake" DESTINATION ${install_cmake_suffix}) +endfunction() + + diff --git a/cmake/Cuda.cmake b/cmake/Cuda.cmake new file mode 100644 index 00000000000..42a94e5a295 --- /dev/null +++ b/cmake/Cuda.cmake @@ -0,0 +1,243 @@ +if(CPU_ONLY) + return() +endif() + +# Known NVIDIA GPU achitectures Caffe can be compiled for. +# This list will be used for CUDA_ARCH_NAME = All option +set(Caffe_known_gpu_archs "20 21(20) 30 35 50") + +################################################################################################ +# A function for automatic detection of GPUs installed (if autodetection is enabled) +# Usage: +# caffe_detect_installed_gpus(out_variable) +function(caffe_detect_installed_gpus out_variable) + if(NOT CUDA_gpu_detect_output) + set(__cufile ${CMAKE_BINARY_DIR}/detect_cuda_archs.cu) + + file(WRITE ${__cufile} "" + "#include <cstdio>\n" + "int main()\n" + "{\n" + " int count = 0;\n" + " if (cudaSuccess != cudaGetDeviceCount(&count)) return -1;\n" + " if (count == 0) return -1;\n" + " for (int device = 0; device < count; ++device)\n" + " {\n" + " cudaDeviceProp prop;\n" + " if (cudaSuccess == cudaGetDeviceProperties(&prop, device))\n" + " std::printf(\"%d.%d \", prop.major, prop.minor);\n" + " }\n" + " return 0;\n" + "}\n") + + execute_process(COMMAND "${CUDA_NVCC_EXECUTABLE}" "--run" "${__cufile}" + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/CMakeFiles/" + RESULT_VARIABLE __nvcc_res OUTPUT_VARIABLE __nvcc_out + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(__nvcc_res EQUAL 0) + string(REPLACE "2.1" "2.1(2.0)" __nvcc_out "${__nvcc_out}") + set(CUDA_gpu_detect_output ${__nvcc_out} CACHE INTERNAL "Returned GPU architetures from caffe_detect_gpus tool" FORCE) + endif() + endif() + + if(NOT CUDA_gpu_detect_output) + message(STATUS "Automatic GPU detection failed. Building for all known architectures.") + set(${out_variable} ${Caffe_known_gpu_archs} PARENT_SCOPE) + else() + set(${out_variable} ${CUDA_gpu_detect_output} PARENT_SCOPE) + endif() +endfunction() + + +################################################################################################ +# Function for selecting GPU arch flags for nvcc based on CUDA_ARCH_NAME +# Usage: +# caffe_select_nvcc_arch_flags(out_variable) +function(caffe_select_nvcc_arch_flags out_variable) + # List of arch names + set(__archs_names "Fermi" "Kepler" "Maxwell" "All" "Manual") + set(__archs_name_default "All") + if(NOT CMAKE_CROSSCOMPILING) + list(APPEND __archs_names "Auto") + set(__archs_name_default "Auto") + endif() + + # set CUDA_ARCH_NAME strings (so it will be seen as dropbox in CMake-Gui) + set(CUDA_ARCH_NAME ${__archs_name_default} CACHE STRING "Select target NVIDIA GPU achitecture.") + set_property( CACHE CUDA_ARCH_NAME PROPERTY STRINGS "" ${__archs_names} ) + mark_as_advanced(CUDA_ARCH_NAME) + + # verify CUDA_ARCH_NAME value + if(NOT ";${__archs_names};" MATCHES ";${CUDA_ARCH_NAME};") + string(REPLACE ";" ", " __archs_names "${__archs_names}") + message(FATAL_ERROR "Only ${__archs_names} architeture names are supported.") + endif() + + if(${CUDA_ARCH_NAME} STREQUAL "Manual") + set(CUDA_ARCH_BIN ${Caffe_known_gpu_archs} CACHE STRING "Specify 'real' GPU architectures to build binaries for, BIN(PTX) format is supported") + set(CUDA_ARCH_PTX "50" CACHE STRING "Specify 'virtual' PTX architectures to build PTX intermediate code for") + mark_as_advanced(CUDA_ARCH_BIN CUDA_ARCH_PTX) + else() + unset(CUDA_ARCH_BIN CACHE) + unset(CUDA_ARCH_PTX CACHE) + endif() + + if(${CUDA_ARCH_NAME} STREQUAL "Fermi") + set(__cuda_arch_bin "20 21(20)") + elseif(${CUDA_ARCH_NAME} STREQUAL "Kepler") + set(__cuda_arch_bin "30 35") + elseif(${CUDA_ARCH_NAME} STREQUAL "Maxwell") + set(__cuda_arch_bin "50") + elseif(${CUDA_ARCH_NAME} STREQUAL "All") + set(__cuda_arch_bin ${Caffe_known_gpu_archs}) + elseif(${CUDA_ARCH_NAME} STREQUAL "Auto") + caffe_detect_installed_gpus(__cuda_arch_bin) + else() # (${CUDA_ARCH_NAME} STREQUAL "Manual") + set(__cuda_arch_bin ${CUDA_ARCH_BIN}) + endif() + + # remove dots and convert to lists + string(REGEX REPLACE "\\." "" __cuda_arch_bin "${__cuda_arch_bin}") + string(REGEX REPLACE "\\." "" __cuda_arch_ptx "${CUDA_ARCH_PTX}") + string(REGEX MATCHALL "[0-9()]+" __cuda_arch_bin "${__cuda_arch_bin}") + string(REGEX MATCHALL "[0-9]+" __cuda_arch_ptx "${__cuda_arch_ptx}") + caffe_list_unique(__cuda_arch_bin __cuda_arch_ptx) + + set(__nvcc_flags "") + set(__nvcc_archs_readable "") + + # Tell NVCC to add binaries for the specified GPUs + foreach(__arch ${__cuda_arch_bin}) + if(__arch MATCHES "([0-9]+)\\(([0-9]+)\\)") + # User explicitly specified PTX for the concrete BIN + list(APPEND __nvcc_flags -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1}) + list(APPEND __nvcc_archs_readable sm_${CMAKE_MATCH_1}) + else() + # User didn't explicitly specify PTX for the concrete BIN, we assume PTX=BIN + list(APPEND __nvcc_flags -gencode arch=compute_${__arch},code=sm_${__arch}) + list(APPEND __nvcc_archs_readable sm_${__arch}) + endif() + endforeach() + + # Tell NVCC to add PTX intermediate code for the specified architectures + foreach(__arch ${__cuda_arch_ptx}) + list(APPEND __nvcc_flags -gencode arch=compute_${__arch},code=compute_${__arch}) + list(APPEND __nvcc_archs_readable compute_${__arch}) + endforeach() + + string(REPLACE ";" " " __nvcc_archs_readable "${__nvcc_archs_readable}") + set(${out_variable} ${__nvcc_flags} PARENT_SCOPE) + set(${out_variable}_readable ${__nvcc_archs_readable} PARENT_SCOPE) +endfunction() + +################################################################################################ +# Short command for cuda comnpilation +# Usage: +# caffe_cuda_compile(<objlist_variable> <cuda_files>) +macro(caffe_cuda_compile objlist_variable) + foreach(var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG) + set(${var}_backup_in_cuda_compile_ "${${var}}") + + # we remove /EHa as it generates warnings under windows + string(REPLACE "/EHa" "" ${var} "${${var}}") + + endforeach() + + if(UNIX OR APPLE) + list(APPEND CUDA_NVCC_FLAGS -Xcompiler -fPIC) + endif() + + if(APPLE) + list(APPEND CUDA_NVCC_FLAGS -Xcompiler -Wno-unused-function) + endif() + + cuda_compile(cuda_objcs ${ARGN}) + + foreach(var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG) + set(${var} "${${var}_backup_in_cuda_compile_}") + unset(${var}_backup_in_cuda_compile_) + endforeach() + + set(${objlist_variable} ${cuda_objcs}) +endmacro() + +################################################################################################ +# Short command for cuDNN detection. Believe it soon will be a part of CUDA toolkit distribution. +# That's why not FindcuDNN.cmake file, but just the macro +# Usage: +# detect_cuDNN() +function(detect_cuDNN) + set(CUDNN_ROOT "" CACHE PATH "CUDNN root folder") + + find_path(CUDNN_INCLUDE cudnn.h + PATHS ${CUDNN_ROOT} $ENV{CUDNN_ROOT} ${CUDA_TOOLKIT_INCLUDE} + DOC "Path to cuDNN include directory." ) + + get_filename_component(__libpath_hist ${CUDA_CUDART_LIBRARY} PATH) + find_library(CUDNN_LIBRARY NAMES libcudnn.so # libcudnn_static.a + PATHS ${CUDNN_ROOT} $ENV{CUDNN_ROOT} ${CUDNN_INCLUDE} ${__libpath_hist} + DOC "Path to cuDNN library.") + + if(CUDNN_INCLUDE AND CUDNN_LIBRARY) + set(HAVE_CUDNN TRUE PARENT_SCOPE) + set(CUDNN_FOUND TRUE PARENT_SCOPE) + + mark_as_advanced(CUDNN_INCLUDE CUDNN_LIBRARY CUDNN_ROOT) + message(STATUS "Found cuDNN (include: ${CUDNN_INCLUDE}, library: ${CUDNN_LIBRARY})") + endif() +endfunction() + + +################################################################################################ +### Non macro section +################################################################################################ + +find_package(CUDA 5.5 QUIET) + +if(NOT CUDA_FOUND) + return() +endif() + +set(HAVE_CUDA TRUE) +message(STATUS "CUDA detected: " ${CUDA_VERSION}) +include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) +list(APPEND Caffe_LINKER_LIBS ${CUDA_CUDART_LIBRARY} + ${CUDA_curand_LIBRARY} ${CUDA_CUBLAS_LIBRARIES}) + +# cudnn detection +if(USE_CUDNN) + detect_cuDNN() + if(HAVE_CUDNN) + add_definitions(-DUSE_CUDNN) + include_directories(SYSTEM ${CUDNN_INCLUDE}) + list(APPEND Caffe_LINKER_LIBS ${CUDNN_LIBRARY}) + endif() +endif() + +# setting nvcc arch flags +caffe_select_nvcc_arch_flags(NVCC_FLAGS_EXTRA) +list(APPEND CUDA_NVCC_FLAGS ${NVCC_FLAGS_EXTRA}) +message(STATUS "Added CUDA NVCC flags for: ${NVCC_FLAGS_EXTRA_readable}") + +# Boost 1.55 workaround, see https://svn.boost.org/trac/boost/ticket/9392 or +# https://github.com/ComputationalRadiationPhysics/picongpu/blob/master/src/picongpu/CMakeLists.txt +if(Boost_VERSION EQUAL 105500) + message(STATUS "Cuda + Boost 1.55: Applying noinline work around") + # avoid warning for CMake >= 2.8.12 + set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} \"-DBOOST_NOINLINE=__attribute__((noinline))\" ") +endif() + +# disable some nvcc diagnostic that apears in boost, glog, glags, opencv, etc. +foreach(diag cc_clobber_ignored integer_sign_change useless_using_declaration set_but_not_used) + list(APPEND CUDA_NVCC_FLAGS -Xcudafe --diag_suppress=${diag}) +endforeach() + +# setting default testing device +if(NOT CUDA_TEST_DEVICE) + set(CUDA_TEST_DEVICE -1) +endif() + +mark_as_advanced(CUDA_BUILD_CUBIN CUDA_BUILD_EMULATION CUDA_VERBOSE_BUILD) +mark_as_advanced(CUDA_SDK_ROOT_DIR CUDA_SEPARABLE_COMPILATION) + diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake new file mode 100644 index 00000000000..5de435c350d --- /dev/null +++ b/cmake/Dependencies.cmake @@ -0,0 +1,124 @@ +# This list is required for static linking and exported to CaffeConfig.cmake +set(Caffe_LINKER_LIBS "") + +# ---[ Boost +find_package(Boost 1.46 REQUIRED COMPONENTS system thread) +include_directories(SYSTEM ${Boost_INCLUDE_DIR}) +list(APPEND Caffe_LINKER_LIBS ${Boost_LIBRARIES}) + +# ---[ Threads +find_package(Threads REQUIRED) +list(APPEND Caffe_LINKER_LIBS ${CMAKE_THREAD_LIBS_INIT}) + +# ---[ Google-glog +find_package(Glog REQUIRED) +include_directories(SYSTEM ${GLOG_INCLUDE_DIRS}) +list(APPEND Caffe_LINKER_LIBS ${GLOG_LIBRARIES}) + +# ---[ Google-gflags +find_package(GFlags REQUIRED) +include_directories(SYSTEM ${GFLAGS_INCLUDE_DIRS}) +list(APPEND Caffe_LINKER_LIBS ${GFLAGS_LIBRARIES}) + +# ---[ Google-protobuf +include(cmake/ProtoBuf.cmake) + +# ---[ HDF5 +find_package(HDF5 COMPONENTS HL REQUIRED) +include_directories(SYSTEM ${HDF5_INCLUDE_DIRS}) +list(APPEND Caffe_LINKER_LIBS ${HDF5_LIBRARIES}) + +# ---[ LMDB +find_package(LMDB REQUIRED) +include_directories(SYSTEM ${LMDB_INCLUDE_DIR}) +list(APPEND Caffe_LINKER_LIBS ${LMDB_LIBRARIES}) + +# ---[ LevelDB +find_package(LevelDB REQUIRED) +include_directories(SYSTEM ${LEVELDB_INCLUDE}) +list(APPEND Caffe_LINKER_LIBS ${LevelDB_LIBRARIES}) + +# ---[ Snappy +find_package(Snappy REQUIRED) +include_directories(SYSTEM ${Snappy_INCLUDE_DIR}) +list(APPEND Caffe_LINKER_LIBS ${Snappy_LIBRARIES}) + +# ---[ CUDA +include(cmake/Cuda.cmake) +if(NOT HAVE_CUDA) + if(CPU_ONLY) + message("-- CUDA is disabled. Building without it...") + else() + message("-- CUDA is not detected by cmake. Building without it...") + endif() + + # TODO: remove this not cross platform define in future. Use caffe_config.h instead. + add_definitions(-DCPU_ONLY) +endif() + +# ---[ OpenCV +find_package(OpenCV QUIET COMPONENTS core highgui imgproc imgcodecs) +if(NOT OpenCV_FOUND) # if not OpenCV 3.x, then imgcodecs are not found + find_package(OpenCV REQUIRED COMPONENTS core highgui imgproc) +endif() +include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS}) +list(APPEND Caffe_LINKER_LIBS ${OpenCV_LIBS}) +message(STATUS "OpenCV found (${OpenCV_CONFIG_PATH})") + +# ---[ BLAS +if(NOT APPLE) + set(BLAS "Atlas" CACHE STRING "Selected BLAS library") + set_property(CACHE BLAS PROPERTY STRINGS "Atlas;Open;MLK") + + if(BLAS STREQUAL "Atlas" OR BLAS STREQUAL "atlas") + find_package(Atlas REQUIRED) + include_directories(SYSTEM ${Atlas_INCLUDE_DIR}) + list(APPEND Caffe_LINKER_LIBS ${Atlas_LIBRARIES}) + elseif(BLAS STREQUAL "Open" OR BLAS STREQUAL "open") + find_package(OpenBLAS REQUIRED) + include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIR}) + list(APPEND Caffe_LINKER_LIBS ${OpenBLAS_LIB}) + elseif(BLAS STREQUAL "MLK" OR BLAS STREQUAL "mkl") + find_package(MKL REQUIRED) + include_directories(SYSTEM ${MKL_INCLUDE_DIR}) + list(APPEND Caffe_LINKER_LIBS ${MKL_LIBRARIES}) + endif() +elseif(APPLE) + find_package(vecLib REQUIRED) + include_directories(SYSTEM ${vecLib_INCLUDE_DIR}) + list(APPEND Caffe_LINKER_LIBS ${vecLib_LINKER_LIBS}) +endif() + +# ---[ Python +if(BUILD_python) + # disable Python 3 search + find_package(PythonInterp 2.7) + find_package(PythonLibs 2.7) + find_package(NumPy 1.7.1) + find_package(Boost 1.46 COMPONENTS python) + + if(PYTHONLIBS_FOUND AND NUMPY_FOUND AND Boost_PYTHON_FOUND) + set(HAVE_PYTHON TRUE) + endif() +endif() + +# ---[ Matlab +if(BUILD_matlab) + find_package(MatlabMex) + if(MATLABMEX_FOUND) + set(HAVE_MATLAB TRUE) + endif() + + # sudo apt-get install liboctave-dev + find_program(Octave_compiler NAMES mkoctfile DOC "Octave C++ compiler") + + if(HAVE_MATLAB AND Octave_compiler) + set(Matlab_build_mex_using "Matlab" CACHE STRING "Select Matlab or Octave if both detected") + set_property(CACHE Matlab_build_mex_using PROPERTY STRINGS "Matlab;Octave") + endif() +endif() + +# ---[ Doxygen +if(BUILD_docs) + find_package(Doxygen) +endif() diff --git a/cmake/Misc.cmake b/cmake/Misc.cmake new file mode 100644 index 00000000000..68e8a662126 --- /dev/null +++ b/cmake/Misc.cmake @@ -0,0 +1,47 @@ +# ---[ Configurations types +set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Possible configurations" FORCE) +mark_as_advanced(CMAKE_CONFIGURATION_TYPES) + +if(DEFINED CMAKE_BUILD_TYPE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS ${CMAKE_CONFIGURATION_TYPES}) +endif() + +# --[ If user doesn't specify build type then assume release +if("${CMAKE_BUILD_TYPE}" STREQUAL "") + set(CMAKE_BUILD_TYPE Release) +endif() + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(CMAKE_COMPILER_IS_CLANGXX TRUE) +endif() + +# ---[ Solution folders +caffe_option(USE_PROJECT_FOLDERS "IDE Solution folders" (MSVC_IDE OR CMAKE_GENERATOR MATCHES Xcode) ) + +if(USE_PROJECT_FOLDERS) + set_property(GLOBAL PROPERTY USE_FOLDERS ON) + set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMakeTargets") +endif() + +# ---[ Install options +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Default install path" FORCE) +endif() + +# ---[ RPATH settings +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE CACHE BOOLEAN "Use link paths for shared library rpath") +set(CMAKE_MACOSX_RPATH TRUE) + +# ---[ Funny target +if(UNIX OR APPLE) + add_custom_target(simlink_to_build COMMAND "ln" "-sf" "${CMAKE_BINARY_DIR}" "${CMAKE_SOURCE_DIR}/build" + COMMENT "Adding simlink: <caffe_root>/build -> ${CMAKE_BINARY_DIR}" ) +endif() + +# ---[ Set debug postfix +set(Caffe_DEBUG_POSTFIX "-d") + +set(CAffe_POSTFIX "") +if(CMAKE_BUILD_TYPE MATCHES "Debug") + set(CAffe_POSTFIX ${Caffe_DEBUG_POSTFIX}) +endif() diff --git a/CMakeScripts/FindAtlas.cmake b/cmake/Modules/FindAtlas.cmake similarity index 63% rename from CMakeScripts/FindAtlas.cmake rename to cmake/Modules/FindAtlas.cmake index 27657a6c7d7..6e1564351c7 100644 --- a/CMakeScripts/FindAtlas.cmake +++ b/cmake/Modules/FindAtlas.cmake @@ -23,14 +23,14 @@ set(Atlas_LIB_SEARCH_PATHS $ENV{Atlas_ROOT_DIR}/lib ) -find_path(Atlas_CBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) +find_path(Atlas_CBLAS_INCLUDE_DIR NAMES cblas.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) find_path(Atlas_CLAPACK_INCLUDE_DIR NAMES clapack.h PATHS ${Atlas_INCLUDE_SEARCH_PATHS}) -find_library(Atlas_CBLAS_LIBRARY NAMES ptcblas_r ptcblas cblas_r cblas PATHS ${Atlas_LIB_SEARCH_PATHS}) -find_library(Atlas_BLAS_LIBRARY NAMES atlas_r atlas PATHS ${Atlas_LIB_SEARCH_PATHS}) -find_library(Atlas_LAPACK_LIBRARY NAMES alapack_r alapack lapack_atlas PATHS ${Atlas_LIB_SEARCH_PATHS}) -set(LOOKED_FOR +find_library(Atlas_CBLAS_LIBRARY NAMES ptcblas_r ptcblas cblas_r cblas PATHS ${Atlas_LIB_SEARCH_PATHS}) +find_library(Atlas_BLAS_LIBRARY NAMES atlas_r atlas PATHS ${Atlas_LIB_SEARCH_PATHS}) +find_library(Atlas_LAPACK_LIBRARY NAMES alapack_r alapack lapack_atlas PATHS ${Atlas_LIB_SEARCH_PATHS}) +set(LOOKED_FOR Atlas_CBLAS_INCLUDE_DIR Atlas_CLAPACK_INCLUDE_DIR @@ -43,19 +43,10 @@ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Atlas DEFAULT_MSG ${LOOKED_FOR}) if(ATLAS_FOUND) - + set(Atlas_INCLUDE_DIR ${Atlas_CBLAS_INCLUDE_DIR} ${Atlas_CLAPACK_INCLUDE_DIR}) + set(Atlas_LIBRARIES ${Atlas_LAPACK_LIBRARY} ${Atlas_CBLAS_LIBRARY} ${Atlas_BLAS_LIBRARY}) mark_as_advanced(${LOOKED_FOR}) - set(Atlas_INCLUDE_DIR - ${Atlas_CBLAS_INCLUDE_DIR} - ${Atlas_CLAPACK_INCLUDE_DIR} - ) - - set(Atlas_LIBRARIES - ${Atlas_LAPACK_LIBRARY} - ${Atlas_CBLAS_LIBRARY} - ${Atlas_BLAS_LIBRARY} - ) - + message(STATUS "Found Atlas (include: ${Atlas_CBLAS_INCLUDE_DIR}, library: ${Atlas_BLAS_LIBRARY})") endif(ATLAS_FOUND) diff --git a/CMakeScripts/FindGFlags.cmake b/cmake/Modules/FindGFlags.cmake similarity index 79% rename from CMakeScripts/FindGFlags.cmake rename to cmake/Modules/FindGFlags.cmake index f93c57136a1..146e8455a50 100644 --- a/CMakeScripts/FindGFlags.cmake +++ b/cmake/Modules/FindGFlags.cmake @@ -38,11 +38,13 @@ else() find_library(GFLAGS_LIBRARY gflags) endif() -find_package_handle_standard_args(GFLAGS DEFAULT_MSG - GFLAGS_INCLUDE_DIR GFLAGS_LIBRARY) +find_package_handle_standard_args(GFLAGS DEFAULT_MSG GFLAGS_INCLUDE_DIR GFLAGS_LIBRARY) if(GFLAGS_FOUND) set(GFLAGS_INCLUDE_DIRS ${GFLAGS_INCLUDE_DIR}) set(GFLAGS_LIBRARIES ${GFLAGS_LIBRARY}) + message(STATUS "Found gflags (include: ${GFLAGS_INCLUDE_DIR}, library: ${GFLAGS_LIBRARY})") + mark_as_advanced(GFLAGS_LIBRARY_DEBUG GFLAGS_LIBRARY_RELEASE + GFLAGS_LIBRARY GFLAGS_INCLUDE_DIR GFLAGS_ROOT_DIR) endif() diff --git a/CMakeScripts/FindGlog.cmake b/cmake/Modules/FindGlog.cmake similarity index 70% rename from CMakeScripts/FindGlog.cmake rename to cmake/Modules/FindGlog.cmake index 0dc30abdbf5..56c76434897 100644 --- a/CMakeScripts/FindGlog.cmake +++ b/cmake/Modules/FindGlog.cmake @@ -34,15 +34,15 @@ if(MSVC) else() find_library(GLOG_LIBRARY glog PATHS ${GLOG_ROOT_DIR} - PATH_SUFFIXES - lib - lib64) + PATH_SUFFIXES lib lib64) endif() -find_package_handle_standard_args(GLOG DEFAULT_MSG - GLOG_INCLUDE_DIR GLOG_LIBRARY) +find_package_handle_standard_args(GLOG DEFAULT_MSG GLOG_INCLUDE_DIR GLOG_LIBRARY) if(GLOG_FOUND) - set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR}) - set(GLOG_LIBRARIES ${GLOG_LIBRARY}) + set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR}) + set(GLOG_LIBRARIES ${GLOG_LIBRARY}) + message(STATUS "Found glog (include: ${GLOG_INCLUDE_DIR}, library: ${GLOG_LIBRARY})") + mark_as_advanced(GLOG_ROOT_DIR GLOG_LIBRARY_RELEASE GLOG_LIBRARY_DEBUG + GLOG_LIBRARY GLOG_INCLUDE_DIR) endif() diff --git a/CMakeScripts/FindLAPACK.cmake b/cmake/Modules/FindLAPACK.cmake similarity index 100% rename from CMakeScripts/FindLAPACK.cmake rename to cmake/Modules/FindLAPACK.cmake diff --git a/cmake/Modules/FindLMDB.cmake b/cmake/Modules/FindLMDB.cmake new file mode 100644 index 00000000000..8a817fd6f10 --- /dev/null +++ b/cmake/Modules/FindLMDB.cmake @@ -0,0 +1,28 @@ +# Try to find the LMBD libraries and headers +# LMDB_FOUND - system has LMDB lib +# LMDB_INCLUDE_DIR - the LMDB include directory +# LMDB_LIBRARIES - Libraries needed to use LMDB + +# FindCWD based on FindGMP by: +# Copyright (c) 2006, Laurent Montel, <montel@kde.org> +# +# Redistribution and use is allowed according to the terms of the BSD license. + +# Adapted from FindCWD by: +# Copyright 2013 Conrad Steenberg <conrad.steenberg@gmail.com> +# Aug 31, 2013 + +find_path(LMDB_INCLUDE_DIR NAMES lmdb.h PATHS "$ENV{LMDB_DIR}/include") +find_library(LMDB_LIBRARIES NAMES lmdb PATHS "$ENV{LMDB_DIR}/lib" ) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LMDB DEFAULT_MSG LMDB_INCLUDE_DIR LMDB_LIBRARIES) + +if(LMDB_FOUND) + message(STATUS "Found lmdb (include: ${LMDB_INCLUDE_DIR}, library: ${LMDB_LIBRARIES})") + mark_as_advanced(LMDB_INCLUDE_DIR LMDB_LIBRARIES) + + caffe_parse_header(${LMDB_INCLUDE_DIR}/lmdb.h + LMDB_VERSION_LINES MDB_VERSION_MAJOR MDB_VERSION_MINOR MDB_VERSION_PATCH) + set(LMDB_VERSION "${MDB_VERSION_MAJOR}.${MDB_VERSION_MINOR}.${MDB_VERSION_PATCH}") +endif() diff --git a/cmake/Modules/FindLevelDB.cmake b/cmake/Modules/FindLevelDB.cmake new file mode 100644 index 00000000000..97f08ac9349 --- /dev/null +++ b/cmake/Modules/FindLevelDB.cmake @@ -0,0 +1,44 @@ +# - Find LevelDB +# +# LevelDB_INCLUDES - List of LevelDB includes +# LevelDB_LIBRARIES - List of libraries when using LevelDB. +# LevelDB_FOUND - True if LevelDB found. + +# Look for the header file. +find_path(LevelDB_INCLUDE NAMES leveldb/db.h + PATHS $ENV{LEVELDB_ROOT}/include /opt/local/include /usr/local/include /usr/include + DOC "Path in which the file leveldb/db.h is located." ) + +# Look for the library. +find_library(LevelDB_LIBRARY NAMES leveldb + PATHS /usr/lib $ENV{LEVELDB_ROOT}/lib + DOC "Path to leveldb library." ) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LevelDB DEFAULT_MSG LevelDB_INCLUDE LevelDB_LIBRARY) + +if(LEVELDB_FOUND) + message(STATUS "Found LevelDB (include: ${LevelDB_INCLUDE}, library: ${LevelDB_LIBRARY})") + set(LevelDB_INCLUDES ${LevelDB_INCLUDE}) + set(LevelDB_LIBRARIES ${LevelDB_LIBRARY}) + mark_as_advanced(LevelDB_INCLUDE LevelDB_LIBRARY) + + if(EXISTS "${LevelDB_INCLUDE}/leveldb/db.h") + file(STRINGS "${LevelDB_INCLUDE}/leveldb/db.h" __version_lines + REGEX "static const int k[^V]+Version[ \t]+=[ \t]+[0-9]+;") + + foreach(__line ${__version_lines}) + if(__line MATCHES "[^k]+kMajorVersion[ \t]+=[ \t]+([0-9]+);") + set(LEVELDB_VERSION_MAJOR ${CMAKE_MATCH_1}) + elseif(__line MATCHES "[^k]+kMinorVersion[ \t]+=[ \t]+([0-9]+);") + set(LEVELDB_VERSION_MINOR ${CMAKE_MATCH_1}) + endif() + endforeach() + + if(LEVELDB_VERSION_MAJOR AND LEVELDB_VERSION_MINOR) + set(LEVELDB_VERSION "${LEVELDB_VERSION_MAJOR}.${LEVELDB_VERSION_MINOR}") + endif() + + caffe_clear_vars(__line __version_lines) + endif() +endif() diff --git a/CMakeScripts/FindMKL.cmake b/cmake/Modules/FindMKL.cmake similarity index 100% rename from CMakeScripts/FindMKL.cmake rename to cmake/Modules/FindMKL.cmake diff --git a/cmake/Modules/FindMatlabMex.cmake b/cmake/Modules/FindMatlabMex.cmake new file mode 100644 index 00000000000..28ae65e7cbb --- /dev/null +++ b/cmake/Modules/FindMatlabMex.cmake @@ -0,0 +1,48 @@ +# This module looks for MatlabMex compiler +# Defines variables: +# Matlab_DIR - Matlab root dir +# Matlab_mex - path to mex compiler +# Matlab_mexext - path to mexext + +if(MSVC) + foreach(__ver "9.30" "7.14" "7.11" "7.10" "7.9" "7.8" "7.7") + get_filename_component(__matlab_root "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MathWorks\\MATLAB\\${__ver};MATLABROOT]" ABSOLUTE) + if(__matlab_root) + break() + endif() + endforeach() +endif() + +if(APPLE) + foreach(__ver "R2014b" "R2014a" "R2013b" "R2013a" "R2012b" "R2012a" "R2011b" "R2011a" "R2010b" "R2010a") + if(EXISTS /Applications/MATLAB_${__ver}.app) + set(__matlab_root /Applications/MATLAB_${__ver}.app) + break() + endif() + endforeach() +endif() + +if(UNIX) + execute_process(COMMAND which matlab OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE __out RESULT_VARIABLE __res) + + if(__res MATCHES 0) # Suppress `readlink` warning if `which` returned nothing + execute_process(COMMAND which matlab COMMAND xargs readlink + COMMAND xargs dirname COMMAND xargs dirname COMMAND xargs echo -n + OUTPUT_VARIABLE __matlab_root OUTPUT_STRIP_TRAILING_WHITESPACE) + endif() +endif() + + +find_path(Matlab_DIR NAMES bin/mex bin/mexext PATHS ${__matlab_root} + DOC "Matlab directory" NO_DEFAULT_PATH) + +find_program(Matlab_mex NAMES mex mex.bat HINTS ${Matlab_DIR} PATH_SUFFIXES bin NO_DEFAULT_PATH) +find_program(Matlab_mexext NAMES mexext mexext.bat HINTS ${Matlab_DIR} PATH_SUFFIXES bin NO_DEFAULT_PATH) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MatlabMex DEFAULT_MSG Matlab_mex Matlab_mexext) + +if(MATLABMEX_FOUND) + mark_as_advanced(Matlab_mex Matlab_mexext) +endif() diff --git a/cmake/Modules/FindNumPy.cmake b/cmake/Modules/FindNumPy.cmake new file mode 100644 index 00000000000..a671494caba --- /dev/null +++ b/cmake/Modules/FindNumPy.cmake @@ -0,0 +1,58 @@ +# - Find the NumPy libraries +# This module finds if NumPy is installed, and sets the following variables +# indicating where it is. +# +# TODO: Update to provide the libraries and paths for linking npymath lib. +# +# NUMPY_FOUND - was NumPy found +# NUMPY_VERSION - the version of NumPy found as a string +# NUMPY_VERSION_MAJOR - the major version number of NumPy +# NUMPY_VERSION_MINOR - the minor version number of NumPy +# NUMPY_VERSION_PATCH - the patch version number of NumPy +# NUMPY_VERSION_DECIMAL - e.g. version 1.6.1 is 10601 +# NUMPY_INCLUDE_DIR - path to the NumPy include files + +unset(NUMPY_VERSION) +unset(NUMPY_INCLUDE_DIR) + +if(PYTHONINTERP_FOUND) + execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c" + "import numpy as n; print(n.__version__); print(n.get_include());" + RESULT_VARIABLE __result + OUTPUT_VARIABLE __output + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(__result MATCHES 0) + string(REGEX REPLACE ";" "\\\\;" __values ${__output}) + string(REGEX REPLACE "\r?\n" ";" __values ${__values}) + list(GET __values 0 NUMPY_VERSION) + list(GET __values 1 NUMPY_INCLUDE_DIR) + + string(REGEX MATCH "^([0-9])+\\.([0-9])+\\.([0-9])+" __ver_check "${NUMPY_VERSION}") + if(NOT "${__ver_check}" STREQUAL "") + set(NUMPY_VERSION_MAJOR ${CMAKE_MATCH_1}) + set(NUMPY_VERSION_MINOR ${CMAKE_MATCH_2}) + set(NUMPY_VERSION_PATCH ${CMAKE_MATCH_3}) + math(EXPR NUMPY_VERSION_DECIMAL + "(${NUMPY_VERSION_MAJOR} * 10000) + (${NUMPY_VERSION_MINOR} * 100) + ${NUMPY_VERSION_PATCH}") + string(REGEX REPLACE "\\\\" "/" NUMPY_INCLUDE_DIR ${NUMPY_INCLUDE_DIR}) + else() + unset(NUMPY_VERSION) + unset(NUMPY_INCLUDE_DIR) + message(STATUS "Requested NumPy version and include path, but got instead:\n${__output}\n") + endif() + endif() +else() + message(STATUS "To find NumPy Python interpretator is required to be found.") +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(NumPy REQUIRED_VARS NUMPY_INCLUDE_DIR NUMPY_VERSION + VERSION_VAR NUMPY_VERSION) + +if(NUMPY_FOUND) + message(STATUS "NumPy ver. ${NUMPY_VERSION} found (include: ${NUMPY_INCLUDE_DIR})") +endif() + +caffe_clear_vars(__result __output __error_value __values __ver_check __error_value) + diff --git a/CMakeScripts/FindOpenBLAS.cmake b/cmake/Modules/FindOpenBLAS.cmake similarity index 100% rename from CMakeScripts/FindOpenBLAS.cmake rename to cmake/Modules/FindOpenBLAS.cmake diff --git a/cmake/Modules/FindSnappy.cmake b/cmake/Modules/FindSnappy.cmake new file mode 100644 index 00000000000..eff2a864a7b --- /dev/null +++ b/cmake/Modules/FindSnappy.cmake @@ -0,0 +1,28 @@ +# Find the Snappy libraries +# +# The following variables are optionally searched for defaults +# Snappy_ROOT_DIR: Base directory where all Snappy components are found +# +# The following are set after configuration is done: +# SNAPPY_FOUND +# Snappy_INCLUDE_DIR +# Snappy_LIBRARIES + +find_path(Snappy_INCLUDE_DIR NAMES snappy.h + PATHS ${SNAPPY_ROOT_DIR} ${SNAPPY_ROOT_DIR}/include) + +find_library(Snappy_LIBRARIES NAMES snappy + PATHS ${SNAPPY_ROOT_DIR} ${SNAPPY_ROOT_DIR}/lib) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Snappy DEFAULT_MSG Snappy_INCLUDE_DIR Snappy_LIBRARIES) + +if(SNAPPY_FOUND) + message(STATUS "Found Snappy (include: ${Snappy_INCLUDE_DIR}, library: ${Snappy_LIBRARIES})") + mark_as_advanced(Snappy_INCLUDE_DIR Snappy_LIBRARIES) + + caffe_parse_header(${Snappy_INCLUDE_DIR}/snappy-stubs-public.h + SNAPPY_VERION_LINES SNAPPY_MAJOR SNAPPY_MINOR SNAPPY_PATCHLEVEL) + set(Snappy_VERSION "${SNAPPY_MAJOR}.${SNAPPY_MINOR}.${SNAPPY_PATCHLEVEL}") +endif() + diff --git a/cmake/Modules/FindvecLib.cmake b/cmake/Modules/FindvecLib.cmake new file mode 100644 index 00000000000..9600da43647 --- /dev/null +++ b/cmake/Modules/FindvecLib.cmake @@ -0,0 +1,34 @@ +# Find the vecLib libraries as part of Accelerate.framework or as standalon framework +# +# The following are set after configuration is done: +# VECLIB_FOUND +# vecLib_INCLUDE_DIR +# vecLib_LINKER_LIBS + + +if(NOT APPLE) + return() +endif() + +set(__veclib_include_suffix "Frameworks/vecLib.framework/Versions/Current/Headers") + +find_path(vecLib_INCLUDE_DIR vecLib.h + DOC "vecLib include directory" + PATHS /System/Library/${__veclib_include_suffix} + /System/Library/Frameworks/Accelerate.framework/Versions/Current/${__veclib_include_suffix} + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(vecLib DEFAULT_MSG vecLib_INCLUDE_DIR) + +if(VECLIB_FOUND) + if(vecLib_INCLUDE_DIR MATCHES "^/System/Library/Frameworks/vecLib.framework.*") + set(vecLib_LINKER_LIBS -lcblas "-framework vecLib") + message(STATUS "Found standalone vecLib.framework") + else() + set(vecLib_LINKER_LIBS -lcblas "-framework Accelerate") + message(STATUS "Found vecLib as part of Accelerate.framework") + endif() + + mark_as_advanced(vecLib_INCLUDE_DIR) +endif() diff --git a/cmake/ProtoBuf.cmake b/cmake/ProtoBuf.cmake new file mode 100644 index 00000000000..bb63c9ed736 --- /dev/null +++ b/cmake/ProtoBuf.cmake @@ -0,0 +1,90 @@ +# Finds Google Protocol Buffers library and compilers and extends +# the standart cmake script with version and python generation support + +find_package( Protobuf REQUIRED ) +include_directories(SYSTEM ${PROTOBUF_INCLUDE_DIR}) +list(APPEND Caffe_LINKER_LIBS ${PROTOBUF_LIBRARIES}) + +# As of Ubuntu 14.04 protoc is no longer a part of libprotobuf-dev package +# and should be installed separately as in: sudo apt-get install protobuf-compiler +if(EXISTS ${PROTOBUF_PROTOC_EXECUTABLE}) + message(STATUS "Found PROTOBUF Compiler: ${PROTOBUF_PROTOC_EXECUTABLE}") +else() + message(FATAL_ERROR "Could not find PROTOBUF Compiler") +endif() + +if(PROTOBUF_FOUND) + # fetches protobuf version + caffe_parse_header(${PROTOBUF_INCLUDE_DIR}/google/protobuf/stubs/common.h VERION_LINE GOOGLE_PROTOBUF_VERSION) + string(REGEX MATCH "([0-9])00([0-9])00([0-9])" PROTOBUF_VERSION ${GOOGLE_PROTOBUF_VERSION}) + set(PROTOBUF_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}") + unset(GOOGLE_PROTOBUF_VERSION) +endif() + +# place where to generate protobuf sources +set(proto_gen_folder "${CMAKE_BINARY_DIR}/include/caffe/proto") +include_directories(SYSTEM "${CMAKE_BINARY_DIR}/include") + +set(PROTOBUF_GENERATE_CPP_APPEND_PATH TRUE) + +################################################################################################ +# Modification of standard 'protobuf_generate_cpp()' with output dir parameter and python support +# Usage: +# caffe_protobuf_generate_cpp_py(<output_dir> <srcs_var> <hdrs_var> <python_var> <proto_files>) +function(caffe_protobuf_generate_cpp_py output_dir srcs_var hdrs_var python_var) + if(NOT ARGN) + message(SEND_ERROR "Error: caffe_protobuf_generate_cpp_py() called without any proto files") + return() + endif() + + if(PROTOBUF_GENERATE_CPP_APPEND_PATH) + # Create an include path for each file specified + foreach(fil ${ARGN}) + get_filename_component(abs_fil ${fil} ABSOLUTE) + get_filename_component(abs_path ${abs_fil} PATH) + list(FIND _protoc_include ${abs_path} _contains_already) + if(${_contains_already} EQUAL -1) + list(APPEND _protoc_include -I ${abs_path}) + endif() + endforeach() + else() + set(_protoc_include -I ${CMAKE_CURRENT_SOURCE_DIR}) + endif() + + if(DEFINED PROTOBUF_IMPORT_DIRS) + foreach(dir ${PROTOBUF_IMPORT_DIRS}) + get_filename_component(abs_path ${dir} ABSOLUTE) + list(FIND _protoc_include ${abs_path} _contains_already) + if(${_contains_already} EQUAL -1) + list(APPEND _protoc_include -I ${abs_path}) + endif() + endforeach() + endif() + + set(${srcs_var}) + set(${hdrs_var}) + set(${python_var}) + foreach(fil ${ARGN}) + get_filename_component(abs_fil ${fil} ABSOLUTE) + get_filename_component(fil_we ${fil} NAME_WE) + + list(APPEND ${srcs_var} "${output_dir}/${fil_we}.pb.cc") + list(APPEND ${hdrs_var} "${output_dir}/${fil_we}.pb.h") + list(APPEND ${python_var} "${output_dir}/${fil_we}_pb2.py") + + add_custom_command( + OUTPUT "${output_dir}/${fil_we}.pb.cc" + "${output_dir}/${fil_we}.pb.h" + "${output_dir}/${fil_we}_pb2.py" + COMMAND ${CMAKE_COMMAND} -E make_directory "${output_dir}" + COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --cpp_out ${output_dir} ${_protoc_include} ${abs_fil} + COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --python_out ${output_dir} ${_protoc_include} ${abs_fil} + DEPENDS ${abs_fil} + COMMENT "Running C++/Python protocol buffer compiler on ${fil}" VERBATIM ) + endforeach() + + set_source_files_properties(${${srcs_var}} ${${hdrs_var}} ${${python_var}} PROPERTIES GENERATED TRUE) + set(${srcs_var} ${${srcs_var}} PARENT_SCOPE) + set(${hdrs_var} ${${hdrs_var}} PARENT_SCOPE) + set(${python_var} ${${python_var}} PARENT_SCOPE) +endfunction() diff --git a/cmake/Summary.cmake b/cmake/Summary.cmake new file mode 100644 index 00000000000..756a738c9ab --- /dev/null +++ b/cmake/Summary.cmake @@ -0,0 +1,166 @@ +################################################################################################ +# Caffe status report function. +# Automatically align right column and selects text based on condition. +# Usage: +# caffe_status(<text>) +# caffe_status(<heading> <value1> [<value2> ...]) +# caffe_status(<heading> <condition> THEN <text for TRUE> ELSE <text for FALSE> ) +function(caffe_status text) + set(status_cond) + set(status_then) + set(status_else) + + set(status_current_name "cond") + foreach(arg ${ARGN}) + if(arg STREQUAL "THEN") + set(status_current_name "then") + elseif(arg STREQUAL "ELSE") + set(status_current_name "else") + else() + list(APPEND status_${status_current_name} ${arg}) + endif() + endforeach() + + if(DEFINED status_cond) + set(status_placeholder_length 23) + string(RANDOM LENGTH ${status_placeholder_length} ALPHABET " " status_placeholder) + string(LENGTH "${text}" status_text_length) + if(status_text_length LESS status_placeholder_length) + string(SUBSTRING "${text}${status_placeholder}" 0 ${status_placeholder_length} status_text) + elseif(DEFINED status_then OR DEFINED status_else) + message(STATUS "${text}") + set(status_text "${status_placeholder}") + else() + set(status_text "${text}") + endif() + + if(DEFINED status_then OR DEFINED status_else) + if(${status_cond}) + string(REPLACE ";" " " status_then "${status_then}") + string(REGEX REPLACE "^[ \t]+" "" status_then "${status_then}") + message(STATUS "${status_text} ${status_then}") + else() + string(REPLACE ";" " " status_else "${status_else}") + string(REGEX REPLACE "^[ \t]+" "" status_else "${status_else}") + message(STATUS "${status_text} ${status_else}") + endif() + else() + string(REPLACE ";" " " status_cond "${status_cond}") + string(REGEX REPLACE "^[ \t]+" "" status_cond "${status_cond}") + message(STATUS "${status_text} ${status_cond}") + endif() + else() + message(STATUS "${text}") + endif() +endfunction() + + +################################################################################################ +# Function for fetching Caffe version from git and headers +# Usage: +# caffe_extract_caffe_version() +function(caffe_extract_caffe_version) + set(Caffe_GIT_VERSION "unknown") + find_package(Git) + if(GIT_FOUND) + execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags --always --dirty + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + OUTPUT_VARIABLE Caffe_GIT_VERSION + RESULT_VARIABLE __git_result) + if(NOT ${__git_result} EQUAL 0) + set(Caffe_GIT_VERSION "unknown") + endif() + endif() + + set(Caffe_GIT_VERSION ${Caffe_GIT_VERSION} PARENT_SCOPE) + set(Caffe_VERSION "<TODO> (Caffe doesn't declare its version in headers)" PARENT_SCOPE) + + # caffe_parse_header(${Caffe_INCLUDE_DIR}/caffe/version.hpp Caffe_VERSION_LINES CAFFE_MAJOR CAFFE_MINOR CAFFE_PATCH) + # set(Caffe_VERSION "${CAFFE_MAJOR}.${CAFFE_MINOR}.${CAFFE_PATCH}" PARENT_SCOPE) + + # or for #define Caffe_VERSION "x.x.x" + # caffe_parse_header_single_define(Caffe ${Caffe_INCLUDE_DIR}/caffe/version.hpp Caffe_VERSION) + # set(Caffe_VERSION ${Caffe_VERSION_STRING} PARENT_SCOPE) + +endfunction() + + +################################################################################################ +# Prints accumulatd caffe configuration summary +# Usage: +# caffe_print_configuration_summary() + +function(caffe_print_configuration_summary) + caffe_extract_caffe_version() + set(Caffe_VERSION ${Caffe_VERSION} PARENT_SCOPE) + + caffe_merge_flag_lists(__flags_rel CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS) + caffe_merge_flag_lists(__flags_deb CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS) + + caffe_status("") + caffe_status("******************* Caffe Configuration Summary *******************") + caffe_status("General:") + caffe_status(" Version : ${Caffe_VERSION}") + caffe_status(" Git : ${Caffe_GIT_VERSION}") + caffe_status(" System : ${CMAKE_SYSTEM_NAME}") + caffe_status(" C++ compiler : ${CMAKE_CXX_COMPILER}") + caffe_status(" Release CXX flags : ${__flags_rel}") + caffe_status(" Debug CXX flags : ${__flags_deb}") + caffe_status(" BUILD_SHARED_LIBS : ${BUILD_SHARED_LIBS}") + caffe_status(" Build type : ${CMAKE_BUILD_TYPE}") + caffe_status(" BUILD_python : ${BUILD_python}") + caffe_status(" BUILD_matlab : ${BUILD_matlab}") + caffe_status(" BUILD_docs : ${BUILD_docs}") + caffe_status(" CPU_ONLY : ${CPU_ONLY}") + caffe_status("") + caffe_status("Dependencies:") + caffe_status(" BLAS : " APPLE THEN "Yes (vecLib)" ELSE "Yes (${BLAS})") + caffe_status(" glog : Yes") + caffe_status(" gflags : Yes") + caffe_status(" protobuf : " PROTOBUF_FOUND THEN "Yes (ver. ${PROTOBUF_VERSION})" ELSE "No" ) + caffe_status(" lmdb : " LMDB_FOUND THEN "Yes (ver. ${LMDB_VERSION})" ELSE "No") + caffe_status(" Snappy : " SNAPPY_FOUND THEN "Yes (ver. ${Snappy_VERSION})" ELSE "No" ) + caffe_status(" LevelDB : " LEVELDB_FOUND THEN "Yes (ver. ${LEVELDB_VERSION})" ELSE "No") + caffe_status(" OpenCV : Yes (ver. ${OpenCV_VERSION})") + caffe_status(" CUDA : " HAVE_CUDA THEN "Yes (ver. ${CUDA_VERSION})" ELSE "No" ) + caffe_status("") + if(HAVE_CUDA) + caffe_status("NVIDIA CUDA:") + caffe_status(" Target GPU(s) : ${CUDA_ARCH_NAME}" ) + caffe_status(" GPU arch(s) : ${NVCC_FLAGS_EXTRA_readable}") + if(USE_CUDNN) + caffe_status(" cuDNN : " HAVE_CUDNN THEN "Yes" ELSE "Not found") + else() + caffe_status(" cuDNN : Disabled") + endif() + caffe_status("") + endif() + if(HAVE_PYTHON) + caffe_status("Python:") + caffe_status(" Interpreter :" PYTHON_EXECUTABLE THEN "${PYTHON_EXECUTABLE} (ver. ${PYTHON_VERSION_STRING})" ELSE "No") + caffe_status(" Libraries :" PYTHONLIBS_FOUND THEN "${PYTHON_LIBRARIES} (ver ${PYTHONLIBS_VERSION_STRING})" ELSE "No") + caffe_status(" NumPy :" NUMPY_FOUND THEN "${NUMPY_INCLUDE_DIR} (ver ${NUMPY_VERSION})" ELSE "No") + caffe_status("") + endif() + if(BUILD_matlab) + caffe_status("Matlab:") + caffe_status(" Matlab :" HAVE_MATLAB THEN "Yes (${Matlab_mex}, ${Matlab_mexext}" ELSE "No") + caffe_status(" Octave :" Octave_compiler THEN "Yes (${Octave_compiler})" ELSE "No") + if(HAVE_MATLAB AND Octave_compiler) + caffe_status(" Build mex using : ${Matlab_build_mex_using}") + endif() + caffe_status("") + endif() + if(BUILD_docs) + caffe_status("Documentaion:") + caffe_status(" Doxygen :" DOXYGEN_FOUND THEN "${DOXYGEN_EXECUTABLE} (${DOXYGEN_VERSION})" ELSE "No") + caffe_status(" config_file : ${DOXYGEN_config_file}") + + caffe_status("") + endif() + caffe_status("Install:") + caffe_status(" Install path : ${CMAKE_INSTALL_PREFIX}") + caffe_status("") +endfunction() + diff --git a/cmake/Targets.cmake b/cmake/Targets.cmake new file mode 100644 index 00000000000..84a2aaf58e9 --- /dev/null +++ b/cmake/Targets.cmake @@ -0,0 +1,170 @@ +################################################################################################ +# Defines global Caffe_LINK flag, This flag is required to prevent linker from excluding +# some objects which are not addressed directly but are registered via static constructors +if(BUILD_SHARED_LIBS) + set(Caffe_LINK caffe) +else() + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(Caffe_LINK -Wl,-force_load caffe) + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + set(Caffe_LINK -Wl,--whole-archive caffe -Wl,--no-whole-archive) + endif() +endif() + +################################################################################################ +# Convenient command to setup source group for IDEs that support this feature (VS, XCode) +# Usage: +# caffe_source_group(<group> GLOB[_RECURSE] <globbing_expression>) +function(caffe_source_group group) + cmake_parse_arguments(CAFFE_SOURCE_GROUP "" "" "GLOB;GLOB_RECURSE" ${ARGN}) + if(CAFFE_SOURCE_GROUP_GLOB) + file(GLOB srcs1 ${CAFFE_SOURCE_GROUP_GLOB}) + source_group(${group} FILES ${srcs1}) + endif() + + if(CAFFE_SOURCE_GROUP_GLOB_RECURSE) + file(GLOB_RECURSE srcs2 ${CAFFE_SOURCE_GROUP_GLOB_RECURSE}) + source_group(${group} FILES ${srcs2}) + endif() +endfunction() + +################################################################################################ +# Collecting sources from globbing and appending to output list variable +# Usage: +# caffe_source_group(<output_variable> GLOB[_RECURSE] <globbing_expression>) +function(caffe_collect_sources variable) + cmake_parse_arguments(CAFFE_COLLECT_SOURCES "" "" "GLOB;GLOB_RECURSE" ${ARGN}) + if(CAFFE_COLLECT_SOURCES_GLOB) + file(GLOB srcs1 ${CAFFE_COLLECT_SOURCES_GLOB}) + set(${variable} ${variable} ${srcs1}) + endif() + + if(CAFFE_COLLECT_SOURCES_GLOB_RECURSE) + file(GLOB_RECURSE srcs2 ${CAFFE_COLLECT_SOURCES_GLOB_RECURSE}) + set(${variable} ${variable} ${srcs2}) + endif() +endfunction() + +################################################################################################ +# Short command getting caffe sources (assuming standard Caffe code tree) +# Usage: +# caffe_pickup_caffe_sources(<root>) +function(caffe_pickup_caffe_sources root) + # put all files in source groups (visible as subfolder in many IDEs) + caffe_source_group("Include" GLOB "${root}/include/caffe/*.h*") + caffe_source_group("Include\\Util" GLOB "${root}/include/caffe/util/*.h*") + caffe_source_group("Include" GLOB "${CMAKE_BINARY_DIR}/caffe_config.h*") + caffe_source_group("Source" GLOB "${root}/src/caffe/*.cpp") + caffe_source_group("Source\\Util" GLOB "${root}/src/caffe/util/*.cpp") + caffe_source_group("Source\\Layers" GLOB "${root}/src/caffe/layers/*.cpp") + caffe_source_group("Source\\Cuda" GLOB "${root}/src/caffe/layers/*.cu") + caffe_source_group("Source\\Cuda" GLOB "${root}/src/caffe/util/*.cu") + caffe_source_group("Source\\Proto" GLOB "${root}/src/caffe/proto/*.proto") + + # source groups for test target + caffe_source_group("Include" GLOB "${root}/include/caffe/test/test_*.h*") + caffe_source_group("Source" GLOB "${root}/src/caffe/test/test_*.cpp") + caffe_source_group("Source\\Cuda" GLOB "${root}/src/caffe/test/test_*.cu") + + # collect files + file(GLOB test_hdrs ${root}/include/caffe/test/test_*.h*) + file(GLOB test_srcs ${root}/src/caffe/test/test_*.cpp) + file(GLOB_RECURSE hdrs ${root}/include/caffe/*.h*) + file(GLOB_RECURSE srcs ${root}/src/caffe/*.cpp) + list(REMOVE_ITEM hdrs ${test_hdrs}) + list(REMOVE_ITEM srcs ${test_srcs}) + + # adding headers to make the visible in some IDEs (Qt, VS, Xcode) + list(APPEND srcs ${hdrs} ${CMAKE_BINARY_DIR}/caffe_config.h) + list(APPEND test_srcs ${test_hdrs}) + + # collect cuda files + file(GLOB test_cuda ${root}/src/caffe/test/test_*.cu) + file(GLOB_RECURSE cuda ${root}/src/caffe/*.cu) + list(REMOVE_ITEM cuda ${test_cuda}) + + # add proto to make them editable in IDEs too + file(GLOB_RECURSE proto_files ${root}/src/caffe/*.proto) + list(APPEND srcs ${proto_files}) + + # convet to absolute paths + caffe_convert_absolute_paths(srcs) + caffe_convert_absolute_paths(cuda) + caffe_convert_absolute_paths(test_srcs) + caffe_convert_absolute_paths(test_cuda) + + # propogate to parent scope + set(srcs ${srcs} PARENT_SCOPE) + set(cuda ${cuda} PARENT_SCOPE) + set(test_srcs ${test_srcs} PARENT_SCOPE) + set(test_cuda ${test_cuda} PARENT_SCOPE) +endfunction() + +################################################################################################ +# Short command for setting defeault target properties +# Usage: +# caffe_default_properties(<target>) +function(caffe_default_properties target) + set_target_properties(${target} PROPERTIES + DEBUG_POSTFIX ${Caffe_DEBUG_POSTFIX} + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") +endfunction() + +################################################################################################ +# Short command for setting runtime directory for build target +# Usage: +# caffe_set_runtime_directory(<target> <dir>) +function(caffe_set_runtime_directory target dir) + set_target_properties(${target} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${dir}") +endfunction() + +################################################################################################ +# Short command for setting solution folder property for target +# Usage: +# caffe_set_solution_folder(<target> <folder>) +function(caffe_set_solution_folder target folder) + if(USE_PROJECT_FOLDERS) + set_target_properties(${target} PROPERTIES FOLDER "${folder}") + endif() +endfunction() + +################################################################################################ +# Reads lines from input file, prepends source directory to each line and writes to output file +# Usage: +# caffe_configure_testdatafile(<testdatafile>) +function(caffe_configure_testdatafile file) + file(STRINGS ${file} __lines) + set(result "") + foreach(line ${__lines}) + set(result "${result}${CMAKE_SOURCE_DIR}/${line}\n") + endforeach() + dmsg(${result}) + file(WRITE ${file}.gen.cmake ${result}) +endfunction() + +################################################################################################ +# Filter outs all files that are not inlcuded in selected list +# Usage: +# caffe_leave_only_selected_tests(<filelist_variable> <selected_list>) +function(caffe_leave_only_selected_tests file_list) + if(NOT ARGN) + return() # blank list means leave all + endif() + string(REPLACE "," ";" __selected ${ARGN}) + list(APPEND __selected caffe_main) + + set(result "") + foreach(f ${${file_list}}) + get_filename_component(name ${f} NAME_WE) + string(REGEX REPLACE "^test_" "" name ${name}) + list(FIND __selected ${name} __index) + if(NOT __index EQUAL -1) + list(APPEND result ${f}) + endif() + endforeach() + set(${file_list} ${result} PARENT_SCOPE) +endfunction() + diff --git a/cmake/Templates/CaffeConfig.cmake.in b/cmake/Templates/CaffeConfig.cmake.in new file mode 100644 index 00000000000..a4b03d961e0 --- /dev/null +++ b/cmake/Templates/CaffeConfig.cmake.in @@ -0,0 +1,58 @@ +# Config file for the Caffe package. +# +# Note: +# Caffe and this config file depends on opencv, +# so put `find_package(OpenCV)` before searching Caffe +# via `find_package(Caffe)`. All other lib/includes +# dependencies are hard coded int the file +# +# After successful configuration the following variables +# will be defined: +# +# Caffe_INCLUDE_DIRS - Caffe include directories +# Caffe_LIBRARIES - libraries to link against +# Caffe_DEFINITIONS - a list of definitions to pass to compiler +# +# Caffe_HAVE_CUDA - signals about CUDA support +# Caffe_HAVE_CUDNN - signals about cuDNN support + + +# OpenCV dependency + +if(NOT OpenCV_FOUND) + set(Caffe_OpenCV_CONFIG_PATH "@OpenCV_CONFIG_PATH@") + if(Caffe_OpenCV_CONFIG_PATH) + get_filename_component(Caffe_OpenCV_CONFIG_PATH ${Caffe_OpenCV_CONFIG_PATH} ABSOLUTE) + + if(EXISTS ${Caffe_OpenCV_CONFIG_PATH} AND NOT TARGET opencv_core) + message(STATUS "Caffe: using OpenCV config from ${Caffe_OpenCV_CONFIG_PATH}") + include(${Caffe_OpenCV_CONFIG_PATH}/OpenCVModules.cmake) + endif() + + else() + find_package(OpenCV REQUIRED) + endif() + unset(Caffe_OpenCV_CONFIG_PATH) +endif() + +# Compute paths +get_filename_component(Caffe_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +set(Caffe_INCLUDE_DIRS "@Caffe_INCLUDE_DIRS@") + +@Caffe_INSTALL_INCLUDE_DIR_APPEND_COMMAND@ + +# Our library dependencies +if(NOT TARGET caffe AND NOT caffe_BINARY_DIR) + include("${Caffe_CMAKE_DIR}/CaffeTargets.cmake") +endif() + +# List of IMPORTED libs created by CaffeTargets.cmake +set(Caffe_LIBRARIES caffe) + +# Definitions +set(Caffe_DEFINITIONS "@Caffe_DEFINITIONS@") + +# Cuda support variables +set(Caffe_CPU_ONLY @CPU_ONLY@) +set(Caffe_HAVE_CUDA @HAVE_CUDA@) +set(Caffe_HAVE_CUDNN @HAVE_CUDNN@) diff --git a/cmake/Templates/CaffeConfigVersion.cmake.in b/cmake/Templates/CaffeConfigVersion.cmake.in new file mode 100644 index 00000000000..cbfa514f1a6 --- /dev/null +++ b/cmake/Templates/CaffeConfigVersion.cmake.in @@ -0,0 +1,11 @@ +set(PACKAGE_VERSION "@Caffe_VERSION@") + +# Check whether the requested PACKAGE_FIND_VERSION is compatible +if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() diff --git a/cmake/Templates/caffe_config.h.in b/cmake/Templates/caffe_config.h.in new file mode 100644 index 00000000000..6aa22ed7b5c --- /dev/null +++ b/cmake/Templates/caffe_config.h.in @@ -0,0 +1,32 @@ +/* Sources directory */ +#define SOURCE_FOLDER "${CMAKE_SOURCE_DIR}" + +/* Binaries directory */ +#define BINARY_FOLDER "${CMAKE_BINARY_DIR}" + +/* NVIDA Cuda */ +#cmakedefine HAVE_CUDA + +/* NVIDA cuDNN */ +#cmakedefine HAVE_CUDNN +#cmakedefine USE_CUDNN + +/* NVIDA cuDNN */ +#cmakedefine CPU_ONLY + +/* Test device */ +#define CUDA_TEST_DEVICE ${CUDA_TEST_DEVICE} + +/* Temporary (TODO: remove) */ +#if 1 + #define CMAKE_SOURCE_DIR SOURCE_FOLDER "/src/" + #define EXAMPLES_SOURCE_DIR BINARY_FOLDER "/examples/" + #define CMAKE_EXT ".gen.cmake" +#else + #define CMAKE_SOURCE_DIR "src/" + #define EXAMPLES_SOURCE_DIR "examples/" + #define CMAKE_EXT "" +#endif + +/* Matlab */ +#cmakedefine HAVE_MATLAB diff --git a/cmake/Utils.cmake b/cmake/Utils.cmake new file mode 100644 index 00000000000..048123dbe10 --- /dev/null +++ b/cmake/Utils.cmake @@ -0,0 +1,365 @@ +################################################################################################ +# Command alias for debugging messages +# Usage: +# dmgs(<message>) +function(dmsg) + message(STATUS ${ARGN}) +endfunction() + +################################################################################################ +# Removes duplicates from list(s) +# Usage: +# caffe_list_unique(<list_variable> [<list_variable>] [...]) +macro(caffe_list_unique) + foreach(__lst ${ARGN}) + if(${__lst}) + list(REMOVE_DUPLICATES ${__lst}) + endif() + endforeach() +endmacro() + +################################################################################################ +# Clears variables from lsit +# Usage: +# caffe_list_unique(<variables_list>) +macro(caffe_clear_vars) + foreach(_var ${ARGN}) + unset(${_var}) + endforeach() +endmacro() + +################################################################################################ +# Removes duplicates from string +# Usage: +# caffe_string_unique(<string_variable>) +function(caffe_string_unique __string) + if(${__string}) + set(__list ${${__string}}) + separate_arguments(__list) + list(REMOVE_DUPLICATES __list) + foreach(__e ${__list}) + set(__str "${__str} ${__e}") + endforeach() + set(${__string} ${__str} PARENT_SCOPE) + endif() +endfunction() + +################################################################################################ +# Prints list element per line +# Usage: +# caffe_print_list(<list>) +function(caffe_print_list) + foreach(e ${ARGN}) + message(STATUS ${e}) + endforeach() +endfunction() + +################################################################################################ +# Function merging lists of compiler flags to single string. +# Usage: +# caffe_merge_flag_lists(out_variable <list1> [<list2>] [<list3>] ...) +function(caffe_merge_flag_lists out_var) + set(__result "") + foreach(__list ${ARGN}) + foreach(__flag ${${__list}}) + string(STRIP ${__flag} __flag) + set(__result "${__result} ${__flag}") + endforeach() + endforeach() + string(STRIP ${__result} __result) + set(${out_var} ${__result} PARENT_SCOPE) +endfunction() + +################################################################################################ +# Converts all paths in list to absolute +# Usage: +# caffe_convert_absolute_paths(<list_variable>) +function(caffe_convert_absolute_paths variable) + set(__dlist "") + foreach(__s ${${variable}}) + get_filename_component(__abspath ${__s} ABSOLUTE) + list(APPEND __list ${__abspath}) + endforeach() + set(${variable} ${__list} PARENT_SCOPE) +endfunction() + +################################################################################################ +# Reads set of version defines from the header file +# Usage: +# caffe_parse_header(<file> <define1> <define2> <define3> ..) +macro(caffe_parse_header FILENAME FILE_VAR) + set(vars_regex "") + set(__parnet_scope OFF) + set(__add_cache OFF) + foreach(name ${ARGN}) + if("${name}" STREQUAL "PARENT_SCOPE") + set(__parnet_scope ON) + elseif("${name}" STREQUAL "CACHE") + set(__add_cache ON) + elseif(vars_regex) + set(vars_regex "${vars_regex}|${name}") + else() + set(vars_regex "${name}") + endif() + endforeach() + if(EXISTS "${FILENAME}") + file(STRINGS "${FILENAME}" ${FILE_VAR} REGEX "#define[ \t]+(${vars_regex})[ \t]+[0-9]+" ) + else() + unset(${FILE_VAR}) + endif() + foreach(name ${ARGN}) + if(NOT "${name}" STREQUAL "PARENT_SCOPE" AND NOT "${name}" STREQUAL "CACHE") + if(${FILE_VAR}) + if(${FILE_VAR} MATCHES ".+[ \t]${name}[ \t]+([0-9]+).*") + string(REGEX REPLACE ".+[ \t]${name}[ \t]+([0-9]+).*" "\\1" ${name} "${${FILE_VAR}}") + else() + set(${name} "") + endif() + if(__add_cache) + set(${name} ${${name}} CACHE INTERNAL "${name} parsed from ${FILENAME}" FORCE) + elseif(__parnet_scope) + set(${name} "${${name}}" PARENT_SCOPE) + endif() + else() + unset(${name} CACHE) + endif() + endif() + endforeach() +endmacro() + +################################################################################################ +# Reads single version define from the header file and parses it +# Usage: +# caffe_parse_header_single_define(<library_name> <file> <define_name>) +function(caffe_parse_header_single_define LIBNAME HDR_PATH VARNAME) + set(${LIBNAME}_H "") + if(EXISTS "${HDR_PATH}") + file(STRINGS "${HDR_PATH}" ${LIBNAME}_H REGEX "^#define[ \t]+${VARNAME}[ \t]+\"[^\"]*\".*$" LIMIT_COUNT 1) + endif() + + if(${LIBNAME}_H) + string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_MAJOR "${${LIBNAME}_H}") + string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_MINOR "${${LIBNAME}_H}") + string(REGEX REPLACE "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.[0-9]+\\.([0-9]+).*$" "\\1" ${LIBNAME}_VERSION_PATCH "${${LIBNAME}_H}") + set(${LIBNAME}_VERSION_MAJOR ${${LIBNAME}_VERSION_MAJOR} ${ARGN} PARENT_SCOPE) + set(${LIBNAME}_VERSION_MINOR ${${LIBNAME}_VERSION_MINOR} ${ARGN} PARENT_SCOPE) + set(${LIBNAME}_VERSION_PATCH ${${LIBNAME}_VERSION_PATCH} ${ARGN} PARENT_SCOPE) + set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_MAJOR}.${${LIBNAME}_VERSION_MINOR}.${${LIBNAME}_VERSION_PATCH}" PARENT_SCOPE) + + # append a TWEAK version if it exists: + set(${LIBNAME}_VERSION_TWEAK "") + if("${${LIBNAME}_H}" MATCHES "^.*[ \t]${VARNAME}[ \t]+\"[0-9]+\\.[0-9]+\\.[0-9]+\\.([0-9]+).*$") + set(${LIBNAME}_VERSION_TWEAK "${CMAKE_MATCH_1}" ${ARGN} PARENT_SCOPE) + endif() + if(${LIBNAME}_VERSION_TWEAK) + set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_STRING}.${${LIBNAME}_VERSION_TWEAK}" ${ARGN} PARENT_SCOPE) + else() + set(${LIBNAME}_VERSION_STRING "${${LIBNAME}_VERSION_STRING}" ${ARGN} PARENT_SCOPE) + endif() + endif() +endfunction() + +######################################################################################################## +# An option that the user can select. Can accept condition to control when option is available for user. +# Usage: +# caffe_option(<option_variable> "doc string" <initial value or boolean expression> [IF <condition>]) +function(caffe_option variable description value) + set(__value ${value}) + set(__condition "") + set(__varname "__value") + foreach(arg ${ARGN}) + if(arg STREQUAL "IF" OR arg STREQUAL "if") + set(__varname "__condition") + else() + list(APPEND ${__varname} ${arg}) + endif() + endforeach() + unset(__varname) + if("${__condition}" STREQUAL "") + set(__condition 2 GREATER 1) + endif() + + if(${__condition}) + if("${__value}" MATCHES ";") + if(${__value}) + option(${variable} "${description}" ON) + else() + option(${variable} "${description}" OFF) + endif() + elseif(DEFINED ${__value}) + if(${__value}) + option(${variable} "${description}" ON) + else() + option(${variable} "${description}" OFF) + endif() + else() + option(${variable} "${description}" ${__value}) + endif() + else() + unset(${variable} CACHE) + endif() +endfunction() + +################################################################################################ +# Utility macro for comparing two lists. Used for CMake debugging purposes +# Usage: +# caffe_compare_lists(<list_variable> <list2_variable> [description]) +function(caffe_compare_lists list1 list2 desc) + set(__list1 ${${list1}}) + set(__list2 ${${list2}}) + list(SORT __list1) + list(SORT __list2) + list(LENGTH __list1 __len1) + list(LENGTH __list2 __len2) + + if(NOT ${__len1} EQUAL ${__len2}) + message(FATAL_ERROR "Lists are not equal. ${__len1} != ${__len2}. ${desc}") + endif() + + foreach(__i RANGE 1 ${__len1}) + math(EXPR __index "${__i}- 1") + list(GET __list1 ${__index} __item1) + list(GET __list2 ${__index} __item2) + if(NOT ${__item1} STREQUAL ${__item2}) + message(FATAL_ERROR "Lists are not equal. Differ at element ${__index}. ${desc}") + endif() + endforeach() +endfunction() + +################################################################################################ +# Command for disabling warnings for different platforms (see below for gcc and VisualStudio) +# Usage: +# caffe_warnings_disable(<CMAKE_[C|CXX]_FLAGS[_CONFIGURATION]> -Wshadow /wd4996 ..,) +macro(caffe_warnings_disable) + set(_flag_vars "") + set(_msvc_warnings "") + set(_gxx_warnings "") + + foreach(arg ${ARGN}) + if(arg MATCHES "^CMAKE_") + list(APPEND _flag_vars ${arg}) + elseif(arg MATCHES "^/wd") + list(APPEND _msvc_warnings ${arg}) + elseif(arg MATCHES "^-W") + list(APPEND _gxx_warnings ${arg}) + endif() + endforeach() + + if(NOT _flag_vars) + set(_flag_vars CMAKE_C_FLAGS CMAKE_CXX_FLAGS) + endif() + + if(MSVC AND _msvc_warnings) + foreach(var ${_flag_vars}) + foreach(warning ${_msvc_warnings}) + set(${var} "${${var}} ${warning}") + endforeach() + endforeach() + elseif((CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANGXX) AND _gxx_warnings) + foreach(var ${_flag_vars}) + foreach(warning ${_gxx_warnings}) + if(NOT warning MATCHES "^-Wno-") + string(REPLACE "${warning}" "" ${var} "${${var}}") + string(REPLACE "-W" "-Wno-" warning "${warning}") + endif() + set(${var} "${${var}} ${warning}") + endforeach() + endforeach() + endif() + caffe_clear_vars(_flag_vars _msvc_warnings _gxx_warnings) +endmacro() + +################################################################################################ +# Helper function get current definitions +# Usage: +# caffe_get_current_definitions(<definitions_variable>) +function(caffe_get_current_definitions definitions_var) + get_property(current_definitions DIRECTORY PROPERTY COMPILE_DEFINITIONS) + set(result "") + + foreach(d ${current_definitions}) + list(APPEND result -D${d}) + endforeach() + + caffe_list_unique(result) + set(${definitions_var} ${result} PARENT_SCOPE) +endfunction() + +################################################################################################ +# Helper function get current includes/definitions +# Usage: +# caffe_get_current_cflags(<cflagslist_variable>) +function(caffe_get_current_cflags cflags_var) + get_property(current_includes DIRECTORY PROPERTY INCLUDE_DIRECTORIES) + caffe_convert_absolute_paths(current_includes) + caffe_get_current_definitions(cflags) + + foreach(i ${current_includes}) + list(APPEND cflags "-I${i}") + endforeach() + + caffe_list_unique(cflags) + set(${cflags_var} ${cflags} PARENT_SCOPE) +endfunction() + +################################################################################################ +# Helper function to parse current linker libs into link directoris, libflags and osx frameworks +# Usage: +# caffe_parse_linker_libs(<Caffe_LINKER_LIBS_var> <directories_var> <libflags_var> <frameworks_var>) +function(caffe_parse_linker_libs Caffe_LINKER_LIBS_variable folders_var flags_var frameworks_var) + + set(__unspec "") + set(__debug "") + set(__optimized "") + set(__framework "") + set(__varname "__unspec") + + # split libs into debug, optimized, unspecified and frameworks + foreach(list_elem ${${Caffe_LINKER_LIBS_variable}}) + if(list_elem STREQUAL "debug") + set(__varname "__debug") + elseif(list_elem STREQUAL "optimized") + set(__varname "__optimized") + elseif(list_elem MATCHES "^-framework[ \t]+([^ \t].*)") + list(APPEND __framework -framework ${CMAKE_MATCH_1}) + else() + list(APPEND ${__varname} ${list_elem}) + set(__varname "__unspec") + endif() + endforeach() + + # attach debug or optimized libs to unspecified according to current configuration + if(CMAKE_BUILD_TYPE MATCHES "Debug") + set(__libs ${__unspec} ${__debug}) + else() + set(__libs ${__unspec} ${__optimized}) + endif() + + set(libflags "") + set(folders "") + + # convert linker libraries list to link flags + foreach(lib ${__libs}) + if(TARGET ${lib}) + list(APPEND folders $<TARGET_LINKER_FILE_DIR:${lib}>) + list(APPEND libflags -l${lib}) + elseif(lib MATCHES "^-l.*") + list(APPEND libflags ${lib}) + elseif(IS_ABSOLUTE ${lib}) + get_filename_component(name_we ${lib} NAME_WE) + get_filename_component(folder ${lib} PATH) + + string(REGEX MATCH "^lib(.*)" __match ${name_we}) + list(APPEND libflags -l${CMAKE_MATCH_1}) + list(APPEND folders ${folder}) + else() + message(FATAL_ERROR "Logic error. Need to update cmake script") + endif() + endforeach() + + caffe_list_unique(libflags folders) + + set(${folders_var} ${folders} PARENT_SCOPE) + set(${flags_var} ${libflags} PARENT_SCOPE) + set(${frameworks_var} ${__framework} PARENT_SCOPE) +endfunction() diff --git a/CMakeScripts/lint.cmake b/cmake/lint.cmake similarity index 100% rename from CMakeScripts/lint.cmake rename to cmake/lint.cmake diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt new file mode 100644 index 00000000000..927bf5bc731 --- /dev/null +++ b/docs/CMakeLists.txt @@ -0,0 +1,106 @@ +# Building docs script +# Requirements: +# sudo apt-get install doxygen texlive ruby-dev +# sudo gem install jekyll execjs therubyracer + +if(NOT BUILD_docs OR NOT DOXYGEN_FOUND) + return() +endif() + +################################################################################################# +# Gather docs from <root>/examples/**/readme.md +function(gather_readmes_as_prebuild_cmd target gathered_dir root) + set(full_gathered_dir ${root}/${gathered_dir}) + + file(GLOB_RECURSE readmes ${root}/examples/readme.md ${root}/examples/README.md) + foreach(file ${readmes}) + # Only use file if it is to be included in docs. + file(STRINGS ${file} file_lines REGEX "include_in_docs: true") + + if(file_lines) + # Since everything is called readme.md, rename it by its dirname. + file(RELATIVE_PATH file ${root} ${file}) + get_filename_component(folder ${file} PATH) + set(new_filename ${full_gathered_dir}/${folder}.md) + + # folder value might be like <subfolder>/readme.md. That's why make directory. + get_filename_component(new_folder ${new_filename} PATH) + add_custom_command(TARGET ${target} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory ${new_folder} + COMMAND ln -sf ${root}/${file} ${new_filename} + COMMENT "Creating simlink ${new_filename} -> ${root}/${file}" + WORKING_DIRECTORY ${root} VERBATIM) + endif() + endforeach() +endfunction() + +################################################################################################ +# Gather docs from examples/*.ipynb and add YAML front-matter. +function(gather_notebooks_as_prebuild_cmd target gathered_dir root) + set(full_gathered_dir ${root}/${gathered_dir}) + + if(NOT PYTHON_EXECUTABLE) + message(STATUS "Python interpeter is not found. Can't include *.ipynb files in docs. Skipping...") + return() + endif() + + file(GLOB_RECURSE notebooks ${root}/examples/*.ipynb) + foreach(file ${notebooks}) + file(RELATIVE_PATH file ${root} ${file}) + set(new_filename ${full_gathered_dir}/${file}) + + get_filename_component(new_folder ${new_filename} PATH) + add_custom_command(TARGET ${target} PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory ${new_folder} + COMMAND ${PYTHON_EXECUTABLE} scripts/copy_notebook.py ${file} ${new_filename} + COMMENT "Copying notebook ${file} to ${new_filename}" + WORKING_DIRECTORY ${root} VERBATIM) + endforeach() + + set(${outputs_var} ${outputs} PARENT_SCOPE) +endfunction() + +################################################################################################ +########################## [ Non macro part ] ################################################## + +# Gathering is done at each 'make doc' +file(REMOVE_RECURSE ${CMAKE_SOURCE_DIR}/docs/gathered) + +# Doxygen config file path +set(DOXYGEN_config_file ${CMAKE_SOURCE_DIR}/.Doxyfile CACHE FILEPATH "Doxygen config file") + +# Adding docs target +add_custom_target(docs COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_config_file} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Launching doxygen..." VERBATIM) + +# Gathering examples into docs subfolder +gather_notebooks_as_prebuild_cmd(docs docs/gathered ${CMAKE_SOURCE_DIR}) +gather_readmes_as_prebuild_cmd(docs docs/gathered ${CMAKE_SOURCE_DIR}) + +# Auto detect output directory +file(STRINGS ${DOXYGEN_config_file} config_line REGEX "OUTPUT_DIRECTORY[ \t]+=[^=].*") +if(config_line) + string(REGEX MATCH "OUTPUT_DIRECTORY[ \t]+=([^=].*)" __ver_check "${config_line}") + string(STRIP ${CMAKE_MATCH_1} output_dir) + message(STATUS "Detected Doxygen OUTPUT_DIRECTORY: ${output_dir}") +else() + set(output_dir ./doxygen/) + message(STATUS "Can't find OUTPUT_DIRECTORY in doxygen config file. Try to use default: ${output_dir}") +endif() + +if(NOT IS_ABSOLUTE ${output_dir}) + set(output_dir ${CMAKE_SOURCE_DIR}/${output_dir}) + get_filename_component(output_dir ${output_dir} ABSOLUTE) +endif() + +# creates simlink in docs subfolder to code documentation built by doxygen +add_custom_command(TARGET docs POST_BUILD VERBATIM + COMMAND ln -sfn "${output_dir}/html" doxygen + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs + COMMENT "Creating simlink ${CMAKE_SOURCE_DIR}/docs/doxygen -> ${output_dir}/html") + +# for quick launch of jekyll +add_custom_target(jekyll COMMAND jekyll serve -w -s . -d _site --port=4000 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs + COMMENT "Launching jekyll..." VERBATIM) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 055f4ef0d35..4df14afbb98 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,16 +1,31 @@ -project( Examples ) +file(GLOB_RECURSE examples_srcs "${CMAKE_SOURCE_DIR}/examples/*.cpp") -file(GLOB_RECURSE EXAMPLES_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) - -foreach(source ${EXAMPLES_SOURCES}) - # get file name - get_filename_component(name ${source} NAME_WE) +foreach(source_file ${examples_srcs}) + # get file name + get_filename_component(name ${source_file} NAME_WE) - #get folder name - get_filename_component(path ${source} PATH) - get_filename_component(folder ${path} NAME_WE) + # get folder name + get_filename_component(path ${source_file} PATH) + get_filename_component(folder ${path} NAME_WE) - add_executable(${name} ${source}) - target_link_libraries(${name} caffe) - set_target_properties(${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${folder}) -endforeach(source) + add_executable(${name} ${source_file}) + target_link_libraries(${name} ${Caffe_LINK}) + caffe_default_properties(${name}) + + # set back RUNTIME_OUTPUT_DIRECTORY + set_target_properties(${name} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/examples/${folder}") + + caffe_set_solution_folder(${name} examples) + + # install + install(TARGETS ${name} DESTINATION bin) + + if(UNIX OR APPLE) + # Funny command to make tutorials work + # TODO: remove in future as soon as naming is standartaized everywhere + set(__outname ${CMAKE_BINARY_DIR}/examples/${folder}/${name}${CAffe_POSTFIX}) + add_custom_command(TARGET ${name} POST_BUILD + COMMAND ln -sf "${__outname}" "${__outname}.bin") + endif() +endforeach() diff --git a/include/caffe/test/test_caffe_main.hpp b/include/caffe/test/test_caffe_main.hpp index 438acf2bf17..bd5f31e063f 100644 --- a/include/caffe/test/test_caffe_main.hpp +++ b/include/caffe/test/test_caffe_main.hpp @@ -15,7 +15,7 @@ using std::cout; using std::endl; #ifdef CMAKE_BUILD - #include <cmake_test_defines.hpp.gen.cmake> + #include "caffe_config.h" #else #define CUDA_TEST_DEVICE -1 #define CMAKE_SOURCE_DIR "src/" diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index f6a03ee4625..40d8729ae76 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -1 +1,72 @@ -project( Matlab ) \ No newline at end of file +# Builds Matlab (or Octave) interface. In case of Matlab caffe must be +# compield as shared library. Octave can link static or shared caffe library +# To install octave run: sudo apt-get install liboctave-dev + +if(NOT BUILD_matlab) + return() +endif() + +if(HAVE_MATLAB AND Octave_compiler) + set(build_using ${Matlab_build_mex_using}) +elseif(HAVE_MATLAB AND NOT Octave_compiler) + set(build_using "Matlab") +elseif(NOT HAVE_MATLAB AND Octave_compiler) + set(build_using "Octave") +else() + return() +endif() + +if(NOT BUILD_SHARED_LIBS AND build_using MATCHES Matlab) + message(FATAL_ERROR "Matlab MEX interface (with default mex options file) can only be built if caffe is compiled as shared library. Please enable 'BUILD_SHARED_LIBS' in CMake. Aternativelly you can switch to Octave compiler.") +endif() + +# helper function to set proper mex file extention +function(caffe_fetch_and_set_proper_mexext mexfile_variable) + execute_process(COMMAND ${Matlab_mexext} OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE res OUTPUT_VARIABLE ext) + if(res MATCHES 0) + get_filename_component(folder ${${mexfile_variable}} PATH) + get_filename_component(name_we ${${mexfile_variable}} NAME_WE) + set(${mexfile_variable} ${folder}/${name_we}.${ext} PARENT_SCOPE) + endif() +endfunction() + +# global settings +file(GLOB Matlab_srcs caffe/matcaffe.cpp) +set(Matlab_caffe_mex ${CMAKE_SOURCE_DIR}/matlab/caffe/caffe.mex) + +caffe_get_current_cflags(cflags) +caffe_parse_linker_libs(Caffe_LINKER_LIBS folders libflags macos_framewoks) +set(folders $<TARGET_LINKER_FILE_DIR:caffe> ${folders}) + +# prepare linker flag lists +string(REPLACE ";" ";-L" link_folders "-L${folders}") +string(REPLACE ";" ":" rpath_folders "${folders}") + +if(build_using MATCHES "Matlab") + set(libflags -lcaffe${CAffe_POSTFIX} ${libflags}) # Matlab R2014a complans for -Wl,--whole-archive + + caffe_fetch_and_set_proper_mexext(Matlab_caffe_mex) + add_custom_command(OUTPUT ${Matlab_caffe_mex} COMMAND ${Matlab_mex} + ARGS -output ${Matlab_caffe_mex} ${Matlab_srcs} ${cflags} ${link_folders} ${libflags} + DEPENDS caffe COMMENT "Building Matlab interface: ${Matlab_caffe_mex}" VERBATIM) + add_custom_target(matlab ALL DEPENDS ${Matlab_caffe_mex} SOURCES ${Matlab_srcs}) + +elseif(build_using MATCHES "Octave") + + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(libflags -Wl,-force_load,$<TARGET_LINKER_FILE:caffe> ${libflags}) + elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + set(libflags -Wl,--whole-archive -lcaffe${CAffe_POSTFIX} -Wl,--no-whole-archive ${libflags}) + endif() + + add_custom_command(OUTPUT ${Matlab_caffe_mex} COMMAND ${Octave_compiler} + ARGS --mex -o ${Matlab_caffe_mex} ${Matlab_srcs} ${cflags} ${link_folders} ${libflags} -Wl,-rpath,${rpath_folders} + DEPENDS caffe COMMENT "Building Octave interface: ${Matlab_caffe_mex}" VERBATIM) + + add_custom_target(octave ALL DEPENDS ${Matlab_caffe_mex} SOURCES ${Matlab_srcs}) +endif() + +# ---[ Install +file(GLOB mfiles caffe/*.m) +install(FILES ${mfiles} ${Matlab_caffe_mex} DESTINATION matlab) + diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 6470517d213..e943f691c49 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -1,58 +1,27 @@ -project( Python ) - -# Python -find_package(PythonLibs 2.7 REQUIRED) - -# Numpy -find_package(NumPy REQUIRED) - -# Boost.Python -find_package(Boost 1.46 COMPONENTS python REQUIRED) - - - -#In case you have both python2 and python3 installed the quickest way to -#compile pycaffe with cmake is to replace the following hardcoded paths. -#Althernativley the Find* scripts could be rewritten to support choice of -#of python version. -#if(${PYTHONLIBS_VERSION_STRING} MATCHES "^[3-9]+\\.[0-9]+(\\.[0-9]+.*)?$") -# -# set( PYTHON_INCLUDE_DIRS "/usr/include/python2.7") -# set( PYTHON_LIBRARIES "/usr/lib64/libpython2.7.so") -# set( NUMPY_INCLUDE_DIRS "/usr/lib64/python2.7/site-packages/numpy/core/include/") -# set( PYTHON_LIBRARIES "/usr/lib64/python2.7/site-packages/numpy/lib/") -# set(Boost_LIBRARIES "/usr/lib64/libboost_python-2.7-mt.so") -# -# message( "Warning: cmake found python3 by default, switching to hardcoded paths") -# -# message( "PYTHON_INCLUDE_DIRS =/usr/include/python2.7") -# message( "PYTHON_LIBRARIES =/usr/lib64/libpython2.7.so") -# message( "NUMPY_INCLUDE_DIRS =/usr/lib64/python2.7/site-packages/numpy/core/include/") -# message( "PYTHON_LIBRARIES =/usr/lib64/python2.7/site-packages/numpy/lib/") -# message( "Boost_LIBRARIES =/usr/lib64/libboost_python-2.7-mt.so") -#endif() - - -include_directories(${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIRS} - ${Boost_INCLUDE_DIRS}) - -file(GLOB_RECURSE Python_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) - -add_library(pycaffe SHARED ${Python_SOURCES}) - -add_dependencies(pycaffe protoPy) - -target_link_libraries(pycaffe ${CAFFE_STATIC_LINK} ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}) - -set_target_properties(pycaffe PROPERTIES PREFIX "") -set_target_properties(pycaffe PROPERTIES OUTPUT_NAME "_caffe") - -### Install ############################################################# - +if(NOT HAVE_PYTHON) + message(STATUS "Python interface is disabled or not all required dependecies found. Building without it...") + return() +endif() + +include_directories(${PYTHON_INCLUDE_DIRS} ${NUMPY_INCLUDE_DIR} ${Boost_INCLUDE_DIRS}) +file(GLOB_RECURSE python_srcs ${CMAKE_SOURCE_DIR}/python/*.cpp) + +add_library(pycaffe SHARED ${python_srcs}) +target_link_libraries(pycaffe ${Caffe_LINK} ${PYTHON_LIBRARIES} ${Boost_LIBRARIES}) +set_target_properties(pycaffe PROPERTIES PREFIX "" OUTPUT_NAME "_caffe") +caffe_default_properties(pycaffe) + +if(UNIX OR APPLE) + set(__linkname "${CMAKE_SOURCE_DIR}/python/_caffe.so") + add_custom_command(TARGET pycaffe POST_BUILD + COMMAND ln -sf $<TARGET_LINKER_FILE:caffe> "${CMAKE_SOURCE_DIR}/python/_caffe.so" + COMMENT "Creating simlink ${__linkname} -> ${CMAKE_BINARY_DIR}/lib/_caffe${CAffe_POSTFIX}.so") +endif() + +# ---[ Install +file(GLOB files *.py requirements.txt) +install(FILES ${files} DESTINATION python) install(DIRECTORY caffe DESTINATION python) -install(FILES requirements.txt DESTINATION python) - -#This installs a library named "libpycaffe.so" install(TARGETS pycaffe DESTINATION python/caffe) diff --git a/src/caffe/CMakeLists.txt b/src/caffe/CMakeLists.txt index dda072688f8..ef74e1f004b 100644 --- a/src/caffe/CMakeLists.txt +++ b/src/caffe/CMakeLists.txt @@ -1,55 +1,36 @@ -project( CaffeSrc ) +# generate protobuf sources +file(GLOB proto_files proto/*.proto) +caffe_protobuf_generate_cpp_py(${proto_gen_folder} proto_srcs proto_hdrs proto_python ${proto_files}) +# include python files either to force generation +add_library(proto STATIC ${proto_hdrs} ${proto_srcs} ${proto_python}) +set(Caffe_LINKER_LIBS proto ${Caffe_LINKER_LIBS}) # note, crucial to prepend! +caffe_default_properties(proto) -add_subdirectory(proto) +# --[ Caffe library -# Recursively find source files -## test sources -file(GLOB_RECURSE TEST_CPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cpp) +# creates 'test_srcs', 'srcs', 'test_cuda', 'cuda' lists +caffe_pickup_caffe_sources(${CMAKE_SOURCE_DIR}) -## all cpp sources -file(GLOB_RECURSE CPP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) +if(HAVE_CUDA) + caffe_cuda_compile(cuda_objs ${cuda}) + list(APPEND srcs ${cuda_objs} ${cuda}) +endif() -## remove test sources from cpp sources -list(REMOVE_ITEM CPP_SOURCES ${TEST_CPP_SOURCES}) +add_library(caffe ${srcs}) +target_link_libraries(caffe proto ${Caffe_LINKER_LIBS}) +caffe_default_properties(caffe) -add_library(caffe ${CPP_SOURCES}) -# both depend on proto -add_dependencies(caffe proto) +# ---[ Tests + add_subdirectory(test) + +# ---[ Install +install(DIRECTORY ${Caffe_INCLUDE_DIR}/caffe DESTINATION include) +install(FILES ${proto_hdrs} DESTINATION include/caffe/proto) +install(TARGETS caffe proto EXPORT CaffeTargets DESTINATION lib) + +file(WRITE ${CMAKE_BINARY_DIR}/__init__.py) +list(APPEND proto_python ${CMAKE_BINARY_DIR}/__init__.py) +install(PROGRAMS ${proto_python} DESTINATION python/caffe/proto) -# cuda sources -if(NOT CPU_ONLY) - file(GLOB_RECURSE CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cu) - file(GLOB_RECURSE TEST_CU_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/test_*.cu) - list(REMOVE_ITEM CU_SOURCES ${TEST_CU_SOURCES}) - cuda_add_library(caffe_cu ${CU_SOURCES}) - add_dependencies(caffe_cu proto) - target_link_libraries(caffe caffe_cu - ${CUDA_CUBLAS_LIBRARIES} - ${CUDA_curand_LIBRARY} - ) -endif() -target_link_libraries(caffe proto - ${BLAS_LIBRARIES} - ${Boost_LIBRARIES} - ${GFLAGS_LIBRARIES} - ${GLOG_LIBRARIES} - ${HDF5_LIBRARIES} - ${LEVELDB_LIBS} - ${LMDB_LIBRARIES} - ${OpenCV_LIBS} - ${CMAKE_THREAD_LIBS_INIT} -) - -#set output directory -set_target_properties(caffe PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib -) - -add_subdirectory(test) - -### Install ################################################################################# - -install(TARGETS caffe DESTINATION lib) diff --git a/src/caffe/proto/CMakeLists.txt b/src/caffe/proto/CMakeLists.txt deleted file mode 100644 index 12e7ce0a326..00000000000 --- a/src/caffe/proto/CMakeLists.txt +++ /dev/null @@ -1,46 +0,0 @@ -project( Proto ) - -# Google Protocol Buffers -find_package( Protobuf REQUIRED ) - -# As of Ubuntu 14.04 protoc is no longer a part of libprotobuf-dev package and should be installed -# separately as in: sudo apt-get install protobuf-compiler -if(PROTOBUF_PROTOC_EXECUTABLE) - message(STATUS "Found PROTOBUF Compiler: ${PROTOBUF_PROTOC_EXECUTABLE}") -else() - message(FATAL_ERROR "Could not find PROTOBUF Compiler") -endif() - -include_directories(${PROTOBUF_INCLUDE_DIR}) -file(GLOB ProtoFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.proto") -PROTOBUF_GENERATE_CPP(ProtoSources ProtoHeaders ${ProtoFiles}) -PROTOBUF_GENERATE_PYTHON(ProtoSourcesPy ${ProtoFiles}) - -add_custom_target(protoPy DEPENDS ${ProtoSourcesPy}) - -add_library(proto - ${ProtoSources} - ${ProtoHeaders} - ) - - -target_link_libraries(proto ${PROTOBUF_LIBRARIES}) - -# Create proto include directory -file(MAKE_DIRECTORY ${CMAKE_SOURCE_DIR}/include/caffe/proto) - -# Copy proto headers to include/caffe/proto/ -foreach(header ${ProtoHeaders}) - - ADD_CUSTOM_COMMAND(TARGET proto - COMMAND cmake -E copy ${header} - ${Caffe_INCLUDE_DIRS}/caffe/proto/ - DEPENDS ${header} -) - -endforeach(header) - -file(WRITE __init__.py) -install(PROGRAMS __init__.py DESTINATION python/caffe/proto) -install(PROGRAMS ${ProtoSourcesPy} DESTINATION python/caffe/proto) - diff --git a/src/caffe/test/CMakeLists.txt b/src/caffe/test/CMakeLists.txt index ce0aa4c5148..ed374e8e110 100644 --- a/src/caffe/test/CMakeLists.txt +++ b/src/caffe/test/CMakeLists.txt @@ -1,105 +1,36 @@ -# -# -# All test files' names must begin with a "test_" prefix -# -# -project( Test ) - -# Configuration -set(TEST_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) # test executables are going to be placed there -set(TEST_EXT .testbin) # test executable extension -set(ALL_TEST test${TEST_EXT}) # name of an executable comprising of all tests -set(RUN_TEST runtest) # dummy target for running tests -set(TEST_MAIN test_caffe_main.cpp) # main test file (with main function) - -# Generate config files -add_definitions(-DCMAKE_BUILD) # definition needed in order to include CMake's generated files -set(IN_EXT .in) # generator input file extension -set(GEN_EXT .gen.cmake) # generated output file extension -set(TEST_DEFINES_FILE ${CMAKE_CURRENT_SOURCE_DIR}/cmake_test_defines.hpp) -set(TEST_DATA_FILE ${CMAKE_CURRENT_SOURCE_DIR}/test_data/sample_data_list.txt) - -# Function prepares name of a test executable -# @output_name - output variable's name -# @filename - test_*.cpp file path -function(test_name output_name filename) - get_filename_component(name ${filename} NAME_WE) - set(${output_name} ${name}${TEST_EXT} PARENT_SCOPE) -endfunction() - -set(IN_FILES # generator input files - ${TEST_DEFINES_FILE} - ${TEST_DATA_FILE} -) - -foreach(in_file ${IN_FILES}) - configure_file( - ${in_file}${IN_EXT} - ${in_file}${GEN_EXT} - ) -endforeach() - -include_directories( - ${Caffe_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR} -) - -# Remove main from test sources and prepare an Object lib with main -file(GLOB TEST_MAIN ${TEST_MAIN}) -list(REMOVE_ITEM TEST_CPP_SOURCES ${TEST_MAIN}) -add_library(main_obj EXCLUDE_FROM_ALL OBJECT ${TEST_MAIN}) - -# Build each test separately from *.cpp files -foreach(source ${TEST_CPP_SOURCES}) - test_name(TEST_NAME ${source}) - - # - add_library(${TEST_NAME}.obj EXCLUDE_FROM_ALL OBJECT ${source}) - set(TEST_OBJ_LIB $<TARGET_OBJECTS:${TEST_NAME}.obj>) - - add_executable(${TEST_NAME} EXCLUDE_FROM_ALL ${TEST_OBJ_LIB} $<TARGET_OBJECTS:main_obj>) - target_link_libraries(${TEST_NAME} gtest ${CAFFE_STATIC_LINK}) - - # output dir - set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) - - # Targets and object libs - set(TEST_TARGETS ${TEST_TARGETS} ${TEST_NAME}) - set(TEST_OBJ_LIBS ${TEST_OBJ_LIBS} ${TEST_OBJ_LIB}) -endforeach() - -# Build each test separately from *.cu files -foreach(source ${TEST_CU_SOURCES}) - test_name(TEST_NAME ${source}) - - cuda_add_library(${TEST_NAME}.lib EXCLUDE_FROM_ALL ${source}) - - add_executable(${TEST_NAME} EXCLUDE_FROM_ALL $<TARGET_OBJECTS:main_obj>) - target_link_libraries(${TEST_NAME} ${TEST_NAME}.lib gtest ${CAFFE_STATIC_LINK}) - - # output dir - set_target_properties(${TEST_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test) - - # Targets and object libs - set(TEST_TARGETS ${TEST_TARGETS} ${TEST_NAME}) - set(TEST_CU_LIBS ${TEST_CU_LIBS} ${TEST_NAME}.lib) -endforeach() - -# Build a compound test excluded from the ALL target -add_executable(${ALL_TEST} EXCLUDE_FROM_ALL ${TEST_OBJ_LIBS} $<TARGET_OBJECTS:main_obj>) -if(NOT CPU_ONLY) - target_link_libraries(${ALL_TEST} ${TEST_CU_LIBS}) +# The option allows to include in build only selected test files and exclude all others +# Usage example: +# cmake -DBUILD_only_tests="common,net,blob,im2col_kernel" +set(BUILD_only_tests "" CACHE STRING "Blank or comma-separated list of test files to build without 'test_' prefix and extention") +caffe_leave_only_selected_tests(test_srcs ${BUILD_only_tests}) +caffe_leave_only_selected_tests(test_cuda ${BUILD_only_tests}) + +# For 'make runtest' target we don't need to embed test data paths to +# source files, because test target is executed in source directory +# That's why the lines below are commented. TODO: remove them + +# definition needed to include CMake generated files +#add_definitions(-DCMAKE_BUILD) + +# generates test_data/sample_data_list.txt.gen.cmake +#caffe_configure_testdatafile(test_data/sample_data_list.txt) + +set(the_target test.testbin) +set(test_args --gtest_shuffle) + +if(HAVE_CUDA) + caffe_cuda_compile(test_cuda_objs ${test_cuda}) + list(APPEND test_srcs ${test_cuda_objs} ${test_cuda}) +else() + list(APPEND test_args --gtest_filter="-*GPU*") endif() -target_link_libraries(${ALL_TEST} gtest ${CAFFE_STATIC_LINK}) -add_dependencies(${ALL_TEST} ${TEST_TARGETS}) -# Output directory -set_target_properties(${ALL_TEST} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TEST_OUTPUT_DIRECTORY}) - -# Test command -set(TEST_ARGS --gtest_shuffle) -if(CPU_ONLY) - set(TEST_ARGS ${TEST_ARGS} --gtest_filter="-*GPU*") -endif() +# ---[ Adding test target +add_executable(${the_target} EXCLUDE_FROM_ALL ${test_srcs}) +target_link_libraries(${the_target} gtest ${Caffe_LINK}) +caffe_default_properties(${the_target}) +caffe_set_runtime_directory(${the_target} "${CMAKE_BINARY_DIR}/test") -add_custom_target(${RUN_TEST} COMMAND ${ALL_TEST} ${TEST_ARGS}) +# ---[ Adding runtest +add_custom_target(runtest COMMAND ${the_target} ${test_args} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) diff --git a/src/caffe/test/cmake_test_defines.hpp.in b/src/caffe/test/cmake_test_defines.hpp.in deleted file mode 100644 index 870eaf5c26e..00000000000 --- a/src/caffe/test/cmake_test_defines.hpp.in +++ /dev/null @@ -1,4 +0,0 @@ -#define CUDA_TEST_DEVICE @CUDA_TEST_DEVICE@ -#define CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@/src/" -#define EXAMPLES_SOURCE_DIR "@CMAKE_SOURCE_DIR@/examples/" -#define CMAKE_EXT ".gen.cmake" diff --git a/src/caffe/test/test_data/sample_data_list.txt.in b/src/caffe/test/test_data/sample_data_list.txt.in deleted file mode 100644 index 9860ef583ab..00000000000 --- a/src/caffe/test/test_data/sample_data_list.txt.in +++ /dev/null @@ -1,2 +0,0 @@ -@CMAKE_SOURCE_DIR@/src/caffe/test/test_data/sample_data.h5 -@CMAKE_SOURCE_DIR@/src/caffe/test/test_data/sample_data_2_gzip.h5 \ No newline at end of file diff --git a/src/gtest/CMakeLists.txt b/src/gtest/CMakeLists.txt index 82a4120ca3f..ef7ff7ed14b 100644 --- a/src/gtest/CMakeLists.txt +++ b/src/gtest/CMakeLists.txt @@ -1,6 +1,5 @@ -project(gtest CXX C) -cmake_minimum_required(VERSION 2.6.2) +add_library(gtest STATIC EXCLUDE_FROM_ALL gtest.h gtest-all.cpp) +caffe_default_properties(gtest) -add_library(gtest gtest-all.cpp) -add_library(gtest_main gtest_main.cc) -target_link_libraries(gtest_main gtest) \ No newline at end of file +#add_library(gtest_main gtest_main.cc) +#target_link_libraries(gtest_main gtest) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 110f368b2c8..4e43ba2cf25 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,20 +1,29 @@ -project( Tools ) - -# Find all source files -file(GLOB_RECURSE TOOLS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) - - -# Build each source file independently -foreach(source ${TOOLS_SOURCES}) - get_filename_component(name ${source} NAME_WE) - add_executable(${name}.bin ${source}) - set_target_properties(${name}.bin PROPERTIES OUTPUT_NAME ${name}) - target_link_libraries(${name}.bin ${CAFFE_STATIC_LINK}) - -### Install ################################################################################# - - install(TARGETS ${name}.bin DESTINATION tools) - - +# Collect source files +file(GLOB_RECURSE srcs ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + +# Build each source file independently +foreach(source ${srcs}) + get_filename_component(name ${source} NAME_WE) + + # caffe target already exits + if(name MATCHES "caffe") + set(name ${name}.bin) + endif() + + # target + add_executable(${name} ${source}) + target_link_libraries(${name} ${Caffe_LINK}) + caffe_default_properties(${name}) + + # set back RUNTIME_OUTPUT_DIRECTORY + caffe_set_runtime_directory(${name} "${CMAKE_BINARY_DIR}/tools") + caffe_set_solution_folder(${name} tools) + + # restore output name without suffix + if(name MATCHES "caffe.bin") + set_target_properties(${name} PROPERTIES OUTPUT_NAME caffe) + endif() + + # Install + install(TARGETS ${name} DESTINATION bin) endforeach(source) - From a12dcba8c9417c5d8f8155e06bdfd6e75fd636ce Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev <no@email> Date: Sun, 18 Jan 2015 22:55:26 +0300 Subject: [PATCH 1127/2053] opencv 3.0 compilation (replace #1714) --- cmake/lint.cmake | 4 +++- src/caffe/layers/window_data_layer.cpp | 5 +---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/cmake/lint.cmake b/cmake/lint.cmake index 04df3409e84..585babb3587 100644 --- a/cmake/lint.cmake +++ b/cmake/lint.cmake @@ -1,10 +1,12 @@ -set(CMAKE_SOURCE_DIR ../) +set(CMAKE_SOURCE_DIR ..) set(LINT_COMMAND ${CMAKE_SOURCE_DIR}/scripts/cpp_lint.py) set(SRC_FILE_EXTENSIONS h hpp hu c cpp cu cc) set(EXCLUDE_FILE_EXTENSTIONS pb.h pb.cc) set(LINT_DIRS include src/caffe examples tools python matlab) +cmake_policy(SET CMP0009 NEW) # supress cmake warning + # find all files of interest foreach(ext ${SRC_FILE_EXTENSIONS}) foreach(dir ${LINT_DIRS}) diff --git a/src/caffe/layers/window_data_layer.cpp b/src/caffe/layers/window_data_layer.cpp index 23ec83d166b..3e9e9765ccf 100644 --- a/src/caffe/layers/window_data_layer.cpp +++ b/src/caffe/layers/window_data_layer.cpp @@ -1,3 +1,4 @@ +#include <opencv2/highgui/highgui_c.h> #include <stdint.h> #include <algorithm> @@ -22,10 +23,6 @@ // 'source' field specifies the window_file // 'crop_size' indicates the desired warped size -#if CV_VERSION_MAJOR == 3 -const int CV_LOAD_IMAGE_COLOR = cv::IMREAD_COLOR; -#endif - namespace caffe { template <typename Dtype> From c0ae656c0e80e721fec89b63e2cdc390e440d625 Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev <no@email> Date: Sun, 18 Jan 2015 23:22:09 +0300 Subject: [PATCH 1128/2053] [travis] proper cmake params --- scripts/travis/travis_build_and_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/travis/travis_build_and_test.sh b/scripts/travis/travis_build_and_test.sh index 53c6c341101..8ff63f31fdd 100755 --- a/scripts/travis/travis_build_and_test.sh +++ b/scripts/travis/travis_build_and_test.sh @@ -7,7 +7,7 @@ MAKE="make --jobs=$NUM_THREADS --keep-going" if $WITH_CMAKE; then mkdir build cd build - cmake -DBUILD_PYTHON=ON -DBUILD_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. + cmake -DBUILD_python=ON -DCMAKE_BUILD_TYPE=Release -DCPU_ONLY=ON .. $MAKE if ! $WITH_CUDA; then $MAKE runtest From aea5dd674adbccf9927869f5e9ba9e2dfc2cbf21 Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev <no@email> Date: Sun, 1 Feb 2015 17:45:31 +0300 Subject: [PATCH 1129/2053] cmake 2.8.7. support --- CMakeLists.txt | 5 +- cmake/ConfigGen.cmake | 11 ++- cmake/Cuda.cmake | 11 +++ cmake/Dependencies.cmake | 5 +- cmake/Misc.cmake | 4 +- cmake/Modules/FindMKL.cmake | 155 ++++++++++++++++++------------------ cmake/Targets.cmake | 3 +- cmake/Utils.cmake | 16 ++++ docs/CMakeLists.txt | 6 +- matlab/CMakeLists.txt | 2 +- python/CMakeLists.txt | 9 ++- 11 files changed, 131 insertions(+), 96 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d3d50da218b..0cace5acfe3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.8) +cmake_minimum_required(VERSION 2.8.7) # ---[ Caffe project project(Caffe C CXX) @@ -28,8 +28,9 @@ if(UNIX OR APLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall") endif() -if(APPLE) +if(USE_libstdcpp) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++") + message("-- Warning: forcing libstdc++ (controlled by USE_libstdcpp option in cmake)") endif() add_definitions(-DGTEST_USE_OWN_TR1_TUPLE) diff --git a/cmake/ConfigGen.cmake b/cmake/ConfigGen.cmake index 24f23e9c494..b7cf9f4cc48 100644 --- a/cmake/ConfigGen.cmake +++ b/cmake/ConfigGen.cmake @@ -38,14 +38,21 @@ function(caffe_generate_export_configs) # ---[ Configure build-tree CaffeConfig.cmake file ]--- caffe_get_current_includes(Caffe_INCLUDE_DIRS) + + set(Caffe_DEFINITIONS "") if(NOT HAVE_CUDA) set(HAVE_CUDA FALSE) - set(Caffe_DEFINITIONS -DCPU_ONLY) + list(APPEND Caffe_DEFINITIONS -DCPU_ONLY) endif() + if(NOT HAVE_CUDNN) set(HAVE_CUDNN FALSE) else() - set(Caffe_DEFINITIONS -DUSE_CUDNN) + list(APPEND DEFINITIONS -DUSE_CUDNN) + endif() + + if(BLAS STREQUAL "MKL" OR BLAS STREQUAL "mkl") + list(APPEND Caffe_DEFINITIONS -DUSE_MKL) endif() configure_file("cmake/Templates/CaffeConfig.cmake.in" "${CMAKE_BINARY_DIR}/CaffeConfig.cmake" @ONLY) diff --git a/cmake/Cuda.cmake b/cmake/Cuda.cmake index 42a94e5a295..07fa13789fa 100644 --- a/cmake/Cuda.cmake +++ b/cmake/Cuda.cmake @@ -194,6 +194,7 @@ endfunction() ################################################################################################ find_package(CUDA 5.5 QUIET) +find_cuda_helper_libs(curand) # cmake 2.8.7 compartibility which doesn't search for curand if(NOT CUDA_FOUND) return() @@ -241,3 +242,13 @@ endif() mark_as_advanced(CUDA_BUILD_CUBIN CUDA_BUILD_EMULATION CUDA_VERBOSE_BUILD) mark_as_advanced(CUDA_SDK_ROOT_DIR CUDA_SEPARABLE_COMPILATION) +# Handle clang/libc++ issue +if(APPLE) + caffe_detect_darwin_version(OSX_VERSION) + + # OSX 10.9 and higher uses clang/libc++ by default which is incompartible with old CUDA toolkits + if(OSX_VERSION VERSION_GREATER 10.8) + # enabled by default if and only if CUDA version is less than 7.0 + caffe_option(USE_libstdcpp "Use libstdc++ instead of libc++" (CUDA_VERSION VERSION_LESS 7.0)) + endif() +endif() diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index 5de435c350d..aa2dcbe1d0d 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -68,7 +68,7 @@ message(STATUS "OpenCV found (${OpenCV_CONFIG_PATH})") # ---[ BLAS if(NOT APPLE) set(BLAS "Atlas" CACHE STRING "Selected BLAS library") - set_property(CACHE BLAS PROPERTY STRINGS "Atlas;Open;MLK") + set_property(CACHE BLAS PROPERTY STRINGS "Atlas;Open;MKL") if(BLAS STREQUAL "Atlas" OR BLAS STREQUAL "atlas") find_package(Atlas REQUIRED) @@ -78,10 +78,11 @@ if(NOT APPLE) find_package(OpenBLAS REQUIRED) include_directories(SYSTEM ${OpenBLAS_INCLUDE_DIR}) list(APPEND Caffe_LINKER_LIBS ${OpenBLAS_LIB}) - elseif(BLAS STREQUAL "MLK" OR BLAS STREQUAL "mkl") + elseif(BLAS STREQUAL "MKL" OR BLAS STREQUAL "mkl") find_package(MKL REQUIRED) include_directories(SYSTEM ${MKL_INCLUDE_DIR}) list(APPEND Caffe_LINKER_LIBS ${MKL_LIBRARIES}) + add_definitions(-DUSE_MKL) endif() elseif(APPLE) find_package(vecLib REQUIRED) diff --git a/cmake/Misc.cmake b/cmake/Misc.cmake index 68e8a662126..14eaeb0ab6e 100644 --- a/cmake/Misc.cmake +++ b/cmake/Misc.cmake @@ -34,8 +34,8 @@ set(CMAKE_MACOSX_RPATH TRUE) # ---[ Funny target if(UNIX OR APPLE) - add_custom_target(simlink_to_build COMMAND "ln" "-sf" "${CMAKE_BINARY_DIR}" "${CMAKE_SOURCE_DIR}/build" - COMMENT "Adding simlink: <caffe_root>/build -> ${CMAKE_BINARY_DIR}" ) + add_custom_target(symlink_to_build COMMAND "ln" "-sf" "${CMAKE_BINARY_DIR}" "${CMAKE_SOURCE_DIR}/build" + COMMENT "Adding symlink: <caffe_root>/build -> ${CMAKE_BINARY_DIR}" ) endif() # ---[ Set debug postfix diff --git a/cmake/Modules/FindMKL.cmake b/cmake/Modules/FindMKL.cmake index eb2d9f8868b..d2012db579a 100644 --- a/cmake/Modules/FindMKL.cmake +++ b/cmake/Modules/FindMKL.cmake @@ -1,113 +1,110 @@ -# - Find Intel MKL # Find the MKL libraries # # Options: # -# MKL_STATAIC : use static linking -# MKL_MULTI_THREADED: use multi-threading -# MKL_SDL : Single Dynamic Library interface +# MKL_USE_SINGLE_DYNAMIC_LIBRARY : use single dynamic library interface +# MKL_USE_STATIC_LIBS : use static libraries +# MKL_MULTI_THREADED : use multi-threading # # This module defines the following variables: # -# MKL_FOUND : True if MKL_INCLUDE_DIR are found -# MKL_INCLUDE_DIR : where to find mkl.h, etc. -# MKL_INCLUDE_DIRS : set when MKL_INCLUDE_DIR found -# MKL_LIBRARIES : the library to link against. +# MKL_FOUND : True mkl is found +# MKL_INCLUDE_DIR : unclude directory +# MKL_LIBRARIES : the libraries to link against. -include(FindPackageHandleStandardArgs) +# ---[ Options +caffe_option(MKL_USE_SINGLE_DYNAMIC_LIBRARY "Use single dynamic library interface" ON) +caffe_option(MKL_USE_STATIC_LIBS "Use static libraries" OFF IF NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) +caffe_option(MKL_MULTI_THREADED "Use multi-threading" ON IF NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) +# ---[ Root folders set(INTEL_ROOT "/opt/intel" CACHE PATH "Folder contains intel libs") -set(MKL_ROOT ${INTEL_ROOT}/mkl CACHE PATH "Folder contains MKL") - -# Find include dir -find_path(MKL_INCLUDE_DIR mkl.h - PATHS ${MKL_ROOT}/include) - -# Find include directory -# There is no include folder under linux -if(WIN32) - find_path(INTEL_INCLUDE_DIR omp.h - PATHS ${INTEL_ROOT}/include) - set(MKL_INCLUDE_DIR ${MKL_INCLUDE_DIR} ${INTEL_INCLUDE_DIR}) -endif() +find_path(MKL_ROOT include/mkl.h PATHS $ENV{MKL_ROOT} ${INTEL_ROOT}/mkl + DOC "Folder contains MKL") -# Find libraries +# ---[ Find include dir +find_path(MKL_INCLUDE_DIR mkl.h PATHS ${MKL_ROOT} PATH_SUFFIXES include) +set(__looked_for MKL_INCLUDE_DIR) -# Handle suffix -set(_MKL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) +# ---[ Find libraries +if(CMAKE_SIZEOF_VOID_P EQUAL 4) + set(__path_suffixes lib lib/ia32) +else() + set(__path_suffixes lib lib/intel64) +endif() -if(WIN32) - if(MKL_STATAIC) - set(CMAKE_FIND_LIBRARY_SUFFIXES .lib) - else() - set(CMAKE_FIND_LIBRARY_SUFFIXES _dll.lib) - endif() +set(__mkl_libs "") +if(MKL_USE_SINGLE_DYNAMIC_LIBRARY) + list(APPEND __mkl_libs rt) else() - if(MKL_STATAIC) - set(CMAKE_FIND_LIBRARY_SUFFIXES .a) + if(CMAKE_SIZEOF_VOID_P EQUAL 4) + if(WIN32) + list(APPEND __mkl_libs intel_c) else() - set(CMAKE_FIND_LIBRARY_SUFFIXES .so) + list(APPEND __mkl_libs intel gf) endif() + else() + list(APPEND __mkl_libs intel_lp64 gf_lp64) + endif() + + if(MKL_MULTI_THREADED) + list(APPEND __mkl_libs intel_thread) + else() + list(APPEND __mkl_libs sequential) + endif() + + list(APPEND __mkl_libs core cdft_core) endif() -# MKL is composed by four layers: Interface, Threading, Computational and RTL +foreach (__lib ${__mkl_libs}) + set(__mkl_lib "mkl_${__lib}") + string(TOUPPER ${__mkl_lib} __mkl_lib_upper) -if(MKL_SDL) - find_library(MKL_LIBRARY mkl_rt - PATHS ${MKL_ROOT}/lib/ia32/) + if(MKL_USE_STATIC_LIBS) + set(__mkl_lib "lib${__mkl_lib}.a") + endif() - set(MKL_MINIMAL_LIBRARY ${MKL_LIBRARY}) -else() - ######################### Interface layer ####################### - if(WIN32) - set(MKL_INTERFACE_LIBNAME mkl_intel_c) - else() - set(MKL_INTERFACE_LIBNAME mkl_intel) - endif() + find_library(${__mkl_lib_upper}_LIBRARY + NAMES ${__mkl_lib} + PATHS ${MKL_ROOT} "${MKL_INCLUDE_DIR}/.." + PATH_SUFFIXES ${__path_suffixes} + DOC "The path to Intel(R) MKL ${__mkl_lib} library") + mark_as_advanced(${__mkl_lib_upper}_LIBRARY) - find_library(MKL_INTERFACE_LIBRARY ${MKL_INTERFACE_LIBNAME} - PATHS ${MKL_ROOT}/lib/ia32/) + list(APPEND __looked_for ${__mkl_lib_upper}_LIBRARY) + list(APPEND MKL_LIBRARIES ${${__mkl_lib_upper}_LIBRARY}) +endforeach() - ######################## Threading layer ######################## - if(MKL_MULTI_THREADED) - set(MKL_THREADING_LIBNAME mkl_intel_thread) - else() - set(MKL_THREADING_LIBNAME mkl_sequential) - endif() - find_library(MKL_THREADING_LIBRARY ${MKL_THREADING_LIBNAME} - PATHS ${MKL_ROOT}/lib/ia32/) +if(NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY) + if (MKL_USE_STATIC_LIBS) + set(__iomp5_libs iomp5 libiomp5mt.lib) + else() + set(__iomp5_libs iomp5 libiomp5md.lib) + endif() - ####################### Computational layer ##################### - find_library(MKL_CORE_LIBRARY mkl_core - PATHS ${MKL_ROOT}/lib/ia32/) - find_library(MKL_FFT_LIBRARY mkl_cdft_core - PATHS ${MKL_ROOT}/lib/ia32/) - find_library(MKL_SCALAPACK_LIBRARY mkl_scalapack_core - PATHS ${MKL_ROOT}/lib/ia32/) + if(WIN32) + find_path(INTEL_INCLUDE_DIR omp.h PATHS ${INTEL_ROOT} PATH_SUFFIXES include) + list(APPEND __looked_for INTEL_INCLUDE_DIR) + endif() - ############################ RTL layer ########################## - if(WIN32) - set(MKL_RTL_LIBNAME libiomp5md) - else() - set(MKL_RTL_LIBNAME libiomp5) - endif() - find_library(MKL_RTL_LIBRARY ${MKL_RTL_LIBNAME} - PATHS ${INTEL_RTL_ROOT}/lib) + find_library(MKL_RTL_LIBRARY ${__iomp5_libs} + PATHS ${INTEL_RTL_ROOT} ${INTEL_ROOT}/compiler ${MKL_ROOT}/.. ${MKL_ROOT}/../compiler + PATH_SUFFIXES ${__path_suffixes} + DOC "Path to Path to OpenMP runtime library") - set(MKL_LIBRARY ${MKL_INTERFACE_LIBRARY} ${MKL_THREADING_LIBRARY} ${MKL_CORE_LIBRARY} ${MKL_FFT_LIBRARY} ${MKL_SCALAPACK_LIBRARY} ${MKL_RTL_LIBRARY}) - set(MKL_MINIMAL_LIBRARY ${MKL_INTERFACE_LIBRARY} ${MKL_THREADING_LIBRARY} ${MKL_CORE_LIBRARY} ${MKL_RTL_LIBRARY}) + list(APPEND __looked_for MKL_RTL_LIBRARY) + list(APPEND MKL_LIBRARIES ${MKL_RTL_LIBRARY}) endif() -set(CMAKE_FIND_LIBRARY_SUFFIXES ${_MKL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) -find_package_handle_standard_args(MKL DEFAULT_MSG - MKL_INCLUDE_DIR MKL_LIBRARY MKL_MINIMAL_LIBRARY) +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(MKL DEFAULT_MSG ${__looked_for}) if(MKL_FOUND) - set(MKL_INCLUDE_DIRS ${MKL_INCLUDE_DIR}) - set(MKL_LIBRARIES ${MKL_LIBRARY}) - set(MKL_MINIMAL_LIBRARIES ${MKL_LIBRARY}) + message(STATUS "Found MKL (include: ${MKL_INCLUDE_DIR}, lib: ${MKL_LIBRARIES}") endif() + +caffe_clear_vars(__looked_for __mkl_libs __path_suffixes __lib_suffix __iomp5_libs) diff --git a/cmake/Targets.cmake b/cmake/Targets.cmake index 84a2aaf58e9..3b254ad37df 100644 --- a/cmake/Targets.cmake +++ b/cmake/Targets.cmake @@ -140,8 +140,7 @@ function(caffe_configure_testdatafile file) set(result "") foreach(line ${__lines}) set(result "${result}${CMAKE_SOURCE_DIR}/${line}\n") - endforeach() - dmsg(${result}) + endforeach() file(WRITE ${file}.gen.cmake ${result}) endfunction() diff --git a/cmake/Utils.cmake b/cmake/Utils.cmake index 048123dbe10..a56c7c300c0 100644 --- a/cmake/Utils.cmake +++ b/cmake/Utils.cmake @@ -363,3 +363,19 @@ function(caffe_parse_linker_libs Caffe_LINKER_LIBS_variable folders_var flags_va set(${flags_var} ${libflags} PARENT_SCOPE) set(${frameworks_var} ${__framework} PARENT_SCOPE) endfunction() + +################################################################################################ +# Helper function to detect Darwin version, i.e. 10.8, 10.9, 10.10, .... +# Usage: +# caffe_detect_darwin_version(<version_variable>) +function(caffe_detect_darwin_version output_var) + if(APPLE) + execute_process(COMMAND /usr/bin/sw_vers -productVersion + RESULT_VARIABLE __sw_vers OUTPUT_VARIABLE __sw_vers_out + ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) + + set(${output_var} ${__sw_vers_out} PARENT_SCOPE) + else() + set(${output_var} "" PARENT_SCOPE) + endif() +endfunction() diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index 927bf5bc731..b1be683f907 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -28,7 +28,7 @@ function(gather_readmes_as_prebuild_cmd target gathered_dir root) add_custom_command(TARGET ${target} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${new_folder} COMMAND ln -sf ${root}/${file} ${new_filename} - COMMENT "Creating simlink ${new_filename} -> ${root}/${file}" + COMMENT "Creating symlink ${new_filename} -> ${root}/${file}" WORKING_DIRECTORY ${root} VERBATIM) endif() endforeach() @@ -94,11 +94,11 @@ if(NOT IS_ABSOLUTE ${output_dir}) get_filename_component(output_dir ${output_dir} ABSOLUTE) endif() -# creates simlink in docs subfolder to code documentation built by doxygen +# creates symlink in docs subfolder to code documentation built by doxygen add_custom_command(TARGET docs POST_BUILD VERBATIM COMMAND ln -sfn "${output_dir}/html" doxygen WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs - COMMENT "Creating simlink ${CMAKE_SOURCE_DIR}/docs/doxygen -> ${output_dir}/html") + COMMENT "Creating symlink ${CMAKE_SOURCE_DIR}/docs/doxygen -> ${output_dir}/html") # for quick launch of jekyll add_custom_target(jekyll COMMAND jekyll serve -w -s . -d _site --port=4000 diff --git a/matlab/CMakeLists.txt b/matlab/CMakeLists.txt index 40d8729ae76..51ab4fe274a 100644 --- a/matlab/CMakeLists.txt +++ b/matlab/CMakeLists.txt @@ -35,7 +35,7 @@ file(GLOB Matlab_srcs caffe/matcaffe.cpp) set(Matlab_caffe_mex ${CMAKE_SOURCE_DIR}/matlab/caffe/caffe.mex) caffe_get_current_cflags(cflags) -caffe_parse_linker_libs(Caffe_LINKER_LIBS folders libflags macos_framewoks) +caffe_parse_linker_libs(Caffe_LINKER_LIBS folders libflags macos_frameworks) set(folders $<TARGET_LINKER_FILE_DIR:caffe> ${folders}) # prepare linker flag lists diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index e943f691c49..ee33a9e5285 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -12,10 +12,13 @@ set_target_properties(pycaffe PROPERTIES PREFIX "" OUTPUT_NAME "_caffe") caffe_default_properties(pycaffe) if(UNIX OR APPLE) - set(__linkname "${CMAKE_SOURCE_DIR}/python/_caffe.so") + set(__linkname "${CMAKE_SOURCE_DIR}/python/caffe/_caffe.so") add_custom_command(TARGET pycaffe POST_BUILD - COMMAND ln -sf $<TARGET_LINKER_FILE:caffe> "${CMAKE_SOURCE_DIR}/python/_caffe.so" - COMMENT "Creating simlink ${__linkname} -> ${CMAKE_BINARY_DIR}/lib/_caffe${CAffe_POSTFIX}.so") + COMMAND ln -sf $<TARGET_LINKER_FILE:pycaffe> "${__linkname}" + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_SOURCE_DIR}/python/caffe/proto + COMMAND touch ${CMAKE_SOURCE_DIR}/python/caffe/proto/__init__.py + COMMAND cp ${proto_gen_folder}/*.py ${CMAKE_SOURCE_DIR}/python/caffe/proto/ + COMMENT "Creating symlink ${__linkname} -> ${CMAKE_BINARY_DIR}/lib/_caffe${CAffe_POSTFIX}.so") endif() # ---[ Install From 4ba3dfbcbd2eea13a4719c197309b67fead12480 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 16 Feb 2015 21:00:04 -0800 Subject: [PATCH 1130/2053] [docs] note new CMake build --- docs/installation.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index c2b16a23244..73f6806c805 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -270,10 +270,10 @@ Be sure to set your MATLAB and Python paths in `Makefile.config` first! Now that you have installed Caffe, check out the [MNIST tutorial](gathered/examples/mnist.html) and the [reference ImageNet model tutorial](gathered/examples/imagenet.html). -### Compilation using CMake (beta) +### CMake Compilation -In lieu of manually editing `Makefile.config` to tell Caffe where dependencies are located, Caffe also provides a CMake-based build system (currently in "beta"). -It requires CMake version >= 2.8.8. +In lieu of manually editing `Makefile.config` to configure the build, Caffe offers an unofficial CMake build thanks to @Nerei, @akosiorek, and other members of the community. +It requires CMake version >= 2.8.7. The basic installation steps are as follows: mkdir build @@ -282,6 +282,8 @@ The basic installation steps are as follows: make all make runtest +See [PR #1667](https://github.com/BVLC/caffe/pull/1667) for details. + #### Ubuntu 12.04 Note that in Ubuntu 12.04, Aptitude will install version CMake 2.8.7 by default, which is not supported by Caffe's CMake build (requires at least 2.8.8). From 79bc8645f9790398e5ddcb706495c6aca395989a Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Mon, 16 Feb 2015 21:41:24 -0800 Subject: [PATCH 1131/2053] [docs] README dispatch --- README.md | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9a9b3ee36eb..0a60095bdf1 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,32 @@ # Caffe -Caffe is a deep learning framework developed with cleanliness, readability, and speed in mind.<br /> -Consult the [project website](http://caffe.berkeleyvision.org) for all documentation. +Caffe is a deep learning framework made with expression, speed, and modularity in mind. +It is developed by the Berkeley Vision and Learning Center ([BVLC](http://bvlc.eecs.berkeley.edu)) and community contributors. +Check out the [project site](http://caffe.berkeleyvision.org) for all the details like -Please ask usage questions and how to model different tasks on the [caffe-users mailing list](https://groups.google.com/forum/#!forum/caffe-users). +- [DIY Deep Learning for Vision with Caffe](https://docs.google.com/presentation/d/1UeKXVgRvvxg9OUdh_UiC5G71UMscNPlvArsWER41PsU/edit#slide=id.p) +- [Tutorial Documentation](http://caffe.berkeleyvision.org/tutorial/) +- [BVLC reference models](http://caffe.berkeleyvision.org/model_zoo.html) and the [community model zoo](https://github.com/BVLC/caffe/wiki/Model-Zoo) +- [Installation instructions](http://caffe.berkeleyvision.org/installation.html) +and step-by-step examples. + +Please join the [caffe-users group](https://groups.google.com/forum/#!forum/caffe-users) to ask questions and talk about methods and models. +Framework development discussions and thorough bug reports are collected on [Issues](https://github.com/BVLC/caffe/issues). + +Happy brewing! + +## License and Citation + +Caffe is released under the [BSD 2-Clause license](https://github.com/BVLC/caffe/blob/master/LICENSE). +The BVLC reference models are released for unrestricted use. + +Please cite Caffe in your publications if it helps your research: + + @article{jia2014caffe, + Author = {Jia, Yangqing and Shelhamer, Evan and Donahue, Jeff and Karayev, Sergey and Long, Jonathan and Girshick, Ross and Guadarrama, Sergio and Darrell, Trevor}, + Journal = {arXiv preprint arXiv:1408.5093}, + Title = {Caffe: Convolutional Architecture for Fast Feature Embedding}, + Year = {2014} + } From 87b63358773902dd5217ec661386f8ef8abcf8b8 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sat, 7 Feb 2015 00:19:54 -0800 Subject: [PATCH 1132/2053] dynamic linking --- Makefile | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index 81c67efeaf4..0fcbb8c64cc 100644 --- a/Makefile +++ b/Makefile @@ -245,6 +245,11 @@ ifeq ($(OSX), 1) COMMON_FLAGS += -DGTEST_USE_OWN_TR1_TUPLE=1 # boost::thread is called boost_thread-mt to mark multithreading on OS X LIBRARIES += boost_thread-mt + # we need to explicitly ask for the rpath to be obeyed + DYNAMIC_FLAGS := -install_name @rpath/libcaffe.so + ORIGIN := @loader_path +else + ORIGIN := \$$ORIGIN endif # Custom compiler @@ -343,7 +348,6 @@ endif LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir)) $(PKG_CONFIG) \ $(foreach library,$(LIBRARIES),-l$(library)) PYTHON_LDFLAGS := $(LDFLAGS) $(foreach library,$(PYTHON_LIBRARIES),-l$(library)) -DYNAMIC_LDFLAGS := -l$(PROJECT) -Wl,-rpath,\$$ORIGIN/../lib # 'superclean' target recursively* deletes all files ending with an extension # in $(SUPERCLEAN_EXTS) below. This may be useful if you've built older @@ -419,10 +423,11 @@ py$(PROJECT): py py: $(PY$(PROJECT)_SO) $(PROTO_GEN_PY) -$(PY$(PROJECT)_SO): $(PY$(PROJECT)_SRC) $(STATIC_NAME) $(PY$(PROJECT)_HXX_SRC) - @ echo CXX $< +$(PY$(PROJECT)_SO): $(PY$(PROJECT)_SRC) $(PY$(PROJECT)_HXX_SRC) | $(DYNAMIC_NAME) + @ echo CXX/LD -o $@ $< $(Q)$(CXX) -shared -o $@ $(PY$(PROJECT)_SRC) \ - $(STATIC_LINK_COMMAND) $(LINKFLAGS) $(PYTHON_LDFLAGS) + -o $@ $(LINKFLAGS) $(PYTHON_LDFLAGS) -l$(PROJECT) \ + -Wl,-rpath,$(ORIGIN)/../../build/lib mat$(PROJECT): mat @@ -479,7 +484,7 @@ $(ALL_BUILD_DIRS): | $(BUILD_DIR_LINK) $(DYNAMIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) @ echo LD -o $@ - $(Q)$(CXX) -shared -o $@ $(OBJS) $(LINKFLAGS) $(LDFLAGS) + $(Q)$(CXX) -shared -o $@ $(OBJS) $(LINKFLAGS) $(LDFLAGS) $(DYNAMIC_FLAGS) $(STATIC_NAME): $(OBJS) | $(LIB_BUILD_DIR) @ echo AR -o $@ @@ -512,32 +517,33 @@ $(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ $(Q)$(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ -o $@ $(LINKFLAGS) $(LDFLAGS) -$(TEST_ALL_DYNLINK_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(DYNAMIC_NAME) \ - | $(TEST_BIN_DIR) +$(TEST_ALL_DYNLINK_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) \ + | $(DYNAMIC_NAME) $(TEST_BIN_DIR) @ echo CXX/LD -o $@ $< $(Q)$(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) \ - -o $@ $(LINKFLAGS) $(LDFLAGS) $(DYNAMIC_LDFLAGS) + -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(PROJECT) -Wl,-rpath,$(ORIGIN)/../lib $(TEST_CU_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_CU_BUILD_DIR)/%.o \ - $(GTEST_OBJ) $(STATIC_NAME) | $(TEST_BIN_DIR) + $(GTEST_OBJ) | $(DYNAMIC_NAME) $(TEST_BIN_DIR) @ echo LD $< - $(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ - -o $@ $(LINKFLAGS) $(LDFLAGS) + $(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) \ + -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(PROJECT) -Wl,-rpath,$(ORIGIN)/../lib $(TEST_CXX_BINS): $(TEST_BIN_DIR)/%.testbin: $(TEST_CXX_BUILD_DIR)/%.o \ - $(GTEST_OBJ) $(STATIC_NAME) | $(TEST_BIN_DIR) + $(GTEST_OBJ) | $(DYNAMIC_NAME) $(TEST_BIN_DIR) @ echo LD $< - $(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ - -o $@ $(LINKFLAGS) $(LDFLAGS) + $(Q)$(CXX) $(TEST_MAIN_SRC) $< $(GTEST_OBJ) \ + -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(PROJECT) -Wl,-rpath,$(ORIGIN)/../lib # Target for extension-less symlinks to tool binaries with extension '*.bin'. $(TOOL_BUILD_DIR)/%: $(TOOL_BUILD_DIR)/%.bin | $(TOOL_BUILD_DIR) @ $(RM) $@ @ ln -s $(abspath $<) $@ -$(TOOL_BINS) $(EXAMPLE_BINS): %.bin : %.o $(STATIC_NAME) - @ echo LD $< - $(Q)$(CXX) $< $(STATIC_LINK_COMMAND) -o $@ $(LINKFLAGS) $(LDFLAGS) +$(TOOL_BINS) $(EXAMPLE_BINS): %.bin : %.o | $(DYNAMIC_NAME) + @ echo CXX/LD -o $@ + $(Q)$(CXX) $< -o $@ $(LINKFLAGS) $(LDFLAGS) -l$(PROJECT) \ + -Wl,-rpath,$(ORIGIN)/../lib proto: $(PROTO_GEN_CC) $(PROTO_GEN_HEADER) From e4b7ceb05ddddbddb8809e22d86ac20a019959fd Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sat, 7 Feb 2015 00:33:15 -0800 Subject: [PATCH 1133/2053] only dynamically link the tests No need to independently test static and dynamic linking. --- Makefile | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 0fcbb8c64cc..f94867bdf31 100644 --- a/Makefile +++ b/Makefile @@ -123,10 +123,8 @@ TEST_CU_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ TEST_CXX_BINS := $(addsuffix .testbin,$(addprefix $(TEST_BIN_DIR)/, \ $(foreach obj,$(TEST_CXX_OBJS),$(basename $(notdir $(obj)))))) TEST_BINS := $(TEST_CXX_BINS) $(TEST_CU_BINS) -# TEST_ALL_BIN is the test binary that links caffe statically. +# TEST_ALL_BIN is the test binary that links caffe dynamically. TEST_ALL_BIN := $(TEST_BIN_DIR)/test_all.testbin -# TEST_ALL_DYNINK_BIN is the test binary that links caffe as a dynamic library. -TEST_ALL_DYNLINK_BIN := $(TEST_BIN_DIR)/test_all_dynamic_link.testbin ############################## # Derive compiler warning dump locations @@ -445,9 +443,8 @@ $(MAT$(PROJECT)_SO): $(MAT$(PROJECT)_SRC) $(STATIC_NAME) CXXFLAGS="\$$CXXFLAGS $(MATLAB_CXXFLAGS)" \ CXXLIBS="\$$CXXLIBS $(STATIC_LINK_COMMAND) $(LDFLAGS)" -output $@ -runtest: $(TEST_ALL_BIN) $(TEST_ALL_DYNLINK_BIN) - $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) && \ - $(TEST_ALL_DYNLINK_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) +runtest: $(TEST_ALL_BIN) + $(TEST_ALL_BIN) $(TEST_GPUID) --gtest_shuffle $(TEST_FILTER) pytest: py cd python; python -m unittest discover -s caffe/test @@ -511,13 +508,7 @@ $(BUILD_DIR)/cuda/%.o: %.cu | $(ALL_BUILD_DIRS) || (cat $@.$(WARNS_EXT); exit 1) @ cat $@.$(WARNS_EXT) -$(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_NAME) \ - | $(TEST_BIN_DIR) - @ echo CXX/LD -o $@ $< - $(Q)$(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) $(STATIC_LINK_COMMAND) \ - -o $@ $(LINKFLAGS) $(LDFLAGS) - -$(TEST_ALL_DYNLINK_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) \ +$(TEST_ALL_BIN): $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) \ | $(DYNAMIC_NAME) $(TEST_BIN_DIR) @ echo CXX/LD -o $@ $< $(Q)$(CXX) $(TEST_MAIN_SRC) $(TEST_OBJS) $(GTEST_OBJ) \ From 3c629b1942ccd5c6ff2f37370767f662cab388c0 Mon Sep 17 00:00:00 2001 From: Evan Shelhamer <shelhamer@imaginarynumber.net> Date: Sat, 20 Sep 2014 00:16:17 -0700 Subject: [PATCH 1134/2053] [docs] include caffeine favicon for site --- docs/_layouts/default.html | 2 ++ docs/images/caffeine-icon.png | Bin 0 -> 954 bytes 2 files changed, 2 insertions(+) create mode 100644 docs/images/caffeine-icon.png diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index 73c6d5873d3..433b0635f43 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -11,6 +11,8 @@ Caffe {% if page contains 'title' %}| {{ page.title }}{% endif %} + + diff --git a/docs/images/caffeine-icon.png b/docs/images/caffeine-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..88b4a002bb000ad56a83d7bfb99a8b450f63fb98 GIT binary patch literal 954 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7|R2ELR|Ol+xO|yr(?&Coj!ef{`~oK=FFKob!vNi`}XbI zA3S*Q{rmT)PoF+}_U!H3x0#ulH*eldNlCeN>(<$`XAc}W@aWN_J$v@ty?b}kq)F$` zpRcd4U$SJ$^XJdQ!ouFae_vNuw`R?njT<+9`0(M+pFcZy?)>}r@3w8*A|oRY9y~aA z?%W?ger(vV;mnyct5>gn_3G8_+qW-VxDXc?H*40c?(Xi6j*h&%yriV0#fukvdU{^F zc1=Y^#m>&|1kC%}qXS%t$>FMeH{{8#hxpP;qUj6#@>+9FAdwYAAEnD{D z#fzYzAb)@V&!0c%=jU5kSmfsBwzjrz-MTd^E9=UYD-$M6$jQmMc=4i+j!sNWOhZFM zUteEyb8}^7<)K4|K7RZ-efso>h=}#;*T=`l@7=ri@ZrPG&d#%E&)&UzcUM zc=)_|^Zx(;|0*?E9vDxxB|(0{K<Sf&HC#Zw=jUWj`fY$578H!pB)s@=xR$0 ze6YOdgXAY^7?ALw-WEwMXoHZ+p zF;5}f*Ad?y__$g}rGO`&^bURhXf2CC!Hg^ih>*_T~`m4 z@@(YVJ*&aFOQ_>y{;PP!V6_tq&$V#0rzGa{Gj5a$Wd7=LZ;jW4pFBm=j%60G9^&*1 zd=OAFwP%_Uvvjbs(DX#c@C9oERJnfiGkCiCxvX Date: Mon, 16 Feb 2015 21:47:20 -0800 Subject: [PATCH 1135/2053] [docs] Caffe is by the BVLC, created by Yangqing, and brewed by Evan --- docs/_layouts/default.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html index 433b0635f43..b8efe60bc3b 100644 --- a/docs/_layouts/default.html +++ b/docs/_layouts/default.html @@ -36,8 +36,16 @@

      Caffe

      - Deep learning framework developed by Yangqing Jia / BVLC + Deep learning framework by the BVLC

      +

      + Created by +
      + Yangqing Jia +
      + Lead Developer +
      + Evan Shelhamer

    s>6tw?L(Z%?;i0LLYhAxFCxi_3$1M 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

    f57mFmQaC>lKh=JYM_hW4c)P>;Fwg`*|3ec5 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

    {{page.title}}
    {{page.description}}